diff --git a/Havana-Server/.gitignore b/Havana-Server/.gitignore new file mode 100644 index 0000000..34c5f4b --- /dev/null +++ b/Havana-Server/.gitignore @@ -0,0 +1,18 @@ +.gradle/ +.idea/ +/out/ +**.iml +/gradle/ +/build/ +bin/ +tmp/ + +gradlew +gradlew.bat + +habbohotel.properties +game.properties +icarus.properties +locale.ini +log4j.properties +error.log \ No newline at end of file diff --git a/Havana-Server/build.gradle b/Havana-Server/build.gradle new file mode 100644 index 0000000..f81c004 --- /dev/null +++ b/Havana-Server/build.gradle @@ -0,0 +1,83 @@ +apply plugin: 'java' +apply plugin: 'application' + +java { + sourceCompatibility = JavaVersion.toVersion("1.11") + targetCompatibility = JavaVersion.toVersion("1.11") +} + +mainClassName = 'org.alexdev.havana.Havana' + +repositories { + maven { url 'https://jitpack.io' } + mavenCentral() +} + +dependencies { + // https://mvnrepository.com/artifact/net.dv8tion/JDA + implementation 'net.dv8tion:JDA:5.0.0-alpha.12' + + // https://mvnrepository.com/artifact/com.zaxxer/HikariCP + implementation group: 'com.zaxxer', name: 'HikariCP', version: '3.4.1' + + // https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client + implementation group: 'org.mariadb.jdbc', name: 'mariadb-java-client', version: '2.3.0' + + // https://mvnrepository.com/artifact/io.netty/netty-all + implementation group: 'io.netty', name: 'netty-all', version: '4.1.33.Final' + + // https://mvnrepository.com/artifact/org.slf4j/slf4j-api + implementation group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25' + + // https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 + implementation group: 'org.slf4j', name: 'slf4j-log4j12', version: '1.7.25' + + // https://mvnrepository.com/artifact/log4j/log4j/1.2.17 + implementation group: 'log4j', name: 'log4j', version: '1.2.17' + + // https://mvnrepository.com/artifact/org.apache.commons/commons-configuration2 + implementation group: 'org.apache.commons', name: 'commons-configuration2', version: '2.2' + + // https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 + implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.9' + + // https://mvnrepository.com/artifact/commons-lang/commons-lang + implementation group: 'commons-lang', name: 'commons-lang', version: '2.6' + + // https://mvnrepository.com/artifact/commons-validator/commons-validator + implementation group: 'commons-validator', name: 'commons-validator', version: '1.6' + + // https://mvnrepository.com/artifact/com.google.code.gson/gson + implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.0' + + implementation 'com.maxmind.geoip2:geoip2:2.12.0' + implementation 'com.github.bhlangonijr:chesslib:1.1.1' + implementation 'com.goterl:lazysodium-java:5.0.1' + implementation "net.java.dev.jna:jna:5.8.0" +} + +// Create fat jar with libraries inside of it. +task fatJar(type: Jar) { + zip64 true + duplicatesStrategy 'exclude' + manifest { + attributes 'Main-Class': mainClassName + } + baseName = project.name + '-all' + from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } } + with jar +} + +// Create jar with no libraries inside of it, used when creating with "gradle distZip" and +// libraries are then to be stored in the folder next to it called 'dependency-jars' +// https://vocon-it.com/2016/11/15/how-to-build-a-lean-jar-file-with-gradle/ +/*jar { + manifest { + attributes ( + 'Main-Class': mainClassName, + "Class-Path": '. dependency-jars/' + configurations.compile.collect { + it.getName() + }.join(' dependency-jars/') + ) + } +}*/ \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/Havana.java b/Havana-Server/src/main/java/org/alexdev/havana/Havana.java new file mode 100644 index 0000000..cc0f133 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/Havana.java @@ -0,0 +1,356 @@ +package org.alexdev.havana; + +import com.google.gson.Gson; +import io.netty.util.ResourceLeakDetector; +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.dao.mysql.*; +import org.alexdev.havana.game.GameScheduler; +import org.alexdev.havana.game.achievements.AchievementManager; +import org.alexdev.havana.game.ads.AdManager; +import org.alexdev.havana.game.catalogue.CatalogueManager; +import org.alexdev.havana.game.catalogue.collectables.CollectablesManager; +import org.alexdev.havana.game.commands.CommandManager; +import org.alexdev.havana.game.ecotron.EcotronManager; +import org.alexdev.havana.game.effects.EffectsManager; +import org.alexdev.havana.game.events.EventsManager; +import org.alexdev.havana.game.fuserights.FuserightsManager; +import org.alexdev.havana.game.games.GameManager; +import org.alexdev.havana.game.games.snowstorm.SnowStormMapsManager; +import org.alexdev.havana.game.infobus.InfobusManager; +import org.alexdev.havana.game.item.ItemManager; +import org.alexdev.havana.game.misc.figure.FigureManager; +import org.alexdev.havana.game.moderation.ChatManager; +import org.alexdev.havana.game.navigator.NavigatorManager; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.room.RoomManager; +import org.alexdev.havana.game.room.handlers.walkways.WalkwaysManager; +import org.alexdev.havana.game.room.models.RoomModelManager; +import org.alexdev.havana.game.texts.TextsManager; +import org.alexdev.havana.game.wordfilter.WordfilterManager; +import org.alexdev.havana.messages.MessageHandler; +import org.alexdev.havana.server.mus.MusServer; +import org.alexdev.havana.server.netty.NettyServer; +import org.alexdev.havana.server.rcon.RconServer; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.config.GameConfiguration; +import org.alexdev.havana.util.config.LoggingConfiguration; +import org.alexdev.havana.util.config.ServerConfiguration; +import org.alexdev.havana.util.config.writer.DefaultConfigWriter; +import org.alexdev.havana.util.config.writer.GameConfigWriter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.net.UnknownHostException; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.util.Calendar; +import java.util.Locale; + +public class Havana { + private static final Gson gson = new Gson(); + private static long startupTime; + + private static String serverIP; + private static int serverPort; + + private static String musServerIP; + private static int musServerPort; + + private static String rconIP; + private static int rconPort; + + private static boolean isShutdown; + + private static NettyServer server; + private static MusServer musServer; + private static RconServer rconServer; + + private static Logger log; + + /** + * Main call of Java application + * @param args System arguments + */ + public static void main(String[] args) { + startupTime = DateUtil.getCurrentTimeSeconds(); + + try { + LoggingConfiguration.checkLoggingConfig(); + + ServerConfiguration.setWriter(new DefaultConfigWriter()); + ServerConfiguration.load("server.ini"); + + log = LoggerFactory.getLogger(Havana.class); + ResourceLeakDetector.setLevel(ResourceLeakDetector.Level.ADVANCED); + + log.info("Havana - Habbo Hotel V31 Emulation"); + + if (Storage.connect()) { + Storage.getLogger().info("Connection to MySQL was a success"); + } else { + Storage.getLogger().error("Could not connect"); + return; + } + + // Update players online back to 0 + SettingsDao.updateSetting("players.online", "0"); + + RoomDao.resetVisitors(); + ItemDao.resetTradeStates(); + PlayerDao.resetOnline(); + + /* + var percentageCheck = 1.0 + ; + + for (int i = 0; i < 100; i++) { + var chance = Math.random() * 100; + + if ((100 - percentageCheck) < chance) { + log.info("5% chance!"); + } + }*/ + + log.info("Setting up game"); + + GameConfiguration.getInstance(new GameConfigWriter()); + InfobusManager.getInstance(); + AchievementManager.getInstance(); + AdManager.getInstance(); + WalkwaysManager.getInstance(); + ItemManager.getInstance(); + CatalogueManager.getInstance(); + EcotronManager.getInstance(); + RoomModelManager.getInstance(); + RoomManager.getInstance(); + PlayerManager.getInstance(); + FuserightsManager.getInstance(); + NavigatorManager.getInstance(); + EffectsManager.getInstance(); + EventsManager.getInstance(); + ChatManager.getInstance(); + GameScheduler.getInstance(); + SnowStormMapsManager.getInstance(); + GameManager.getInstance(); + CommandManager.getInstance(); + MessageHandler.getInstance(); + TextsManager.getInstance(); + WordfilterManager.getInstance(); + CollectablesManager.getInstance(); + FigureManager.getInstance(); + + if (GameConfiguration.getInstance().getBoolean("reset.sso.after.login")) { + PlayerDao.resetSsoTickets(); + } + + setupRcon(); + setupMus(); + setupServer(); + + if (GameConfiguration.getInstance().getInteger("delete.chatlogs.after.x.age") > 0) { + LogDao.deleteChatLogs(GameConfiguration.getInstance().getInteger("delete.chatlogs.after.x.age")); + } + + if (GameConfiguration.getInstance().getInteger("delete.iplogs.after.x.age") > 0) { + LogDao.deleteIpAddressLogs(GameConfiguration.getInstance().getInteger("delete.iplogs.after.x.age")); + } + + Runtime.getRuntime().addShutdownHook(new Thread(Havana::dispose)); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private static void setupServer() throws UnknownHostException { + String serverIP = ServerConfiguration.getString("server.bind"); + + if (serverIP.length() == 0) { + log.error("Game server bind address is not provided"); + return; + } + + serverPort = ServerConfiguration.getInteger("server.port"); + + if (serverPort == 0) { + log.error("Game server port not provided"); + return; + } + + server = new NettyServer(serverIP, serverPort); + server.createSocket(); + server.bind(); + } + + private static void setupRcon() throws IOException { + // Create the RCON instance + rconIP = ServerConfiguration.getString("rcon.bind"); + + if (rconIP.length() == 0) { + log.error("Remote control (RCON) server bind address is not provided"); + return; + } + + rconPort = ServerConfiguration.getInteger("rcon.port"); + + if (rconPort == 0) { + log.error("Remote control (RCON) server port not provided"); + return; + } + + rconServer = new RconServer(rconIP, rconPort); + rconServer.createSocket(); + rconServer.bind(); + } + + private static void setupMus() throws UnknownHostException { + musServerIP = ServerConfiguration.getString("mus.bind"); + + if (musServerIP.length() == 0) { + log.error("Multi User Server (MUS) bind address is not provided"); + return; + } + + musServerPort = ServerConfiguration.getInteger("mus.port"); + + if (musServerPort == 0) { + log.error("Multi User Server (MUS) port not provided"); + return; + } + + musServer = new MusServer(musServerIP, musServerPort); + musServer.createSocket(); + musServer.bind(); + } + + private static void dispose() { + try { + + log.info("Shutting down server!"); + isShutdown = true; + + log.info("Saving chat!"); + ChatManager.getInstance().performChatSaving(); + + log.info("Saving item updates!"); + GameScheduler.getInstance().performItemSaving(); + + log.info("Saving item deletions!"); + GameScheduler.getInstance().performItemDeletion(); + + log.info("Disconnecting all users!"); + PlayerManager.getInstance().dispose(); + + log.info("Server disposal!"); + server.dispose(false); + + log.info("All done!"); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static boolean isHappyHour() { + try { + Calendar cl = Calendar.getInstance(); + + LocalTime from = null;//LocalTime.parse( "20:11:13" ) ; + LocalTime to = null;//LocalTime.parse( "14:49:00" ) ; + + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss", Locale.US); + + if (cl.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY || + cl.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) { + from = LocalTime.parse(GameConfiguration.getInstance().getString("happy.hour.weekend.start"), formatter); + to = LocalTime.parse(GameConfiguration.getInstance().getString("happy.hour.weekend.end"), formatter); + } else { + from = LocalTime.parse(GameConfiguration.getInstance().getString("happy.hour.weekday.start"), formatter); + to = LocalTime.parse(GameConfiguration.getInstance().getString("happy.hour.weekday.end"), formatter); + } + + LocalTime nowUtcTime = LocalTime.parse(DateUtil.getCurrentDate("HH:mm:ss"), formatter); + return nowUtcTime.isAfter(from) && nowUtcTime.isBefore(to); + } catch (Exception ex) { + ex.printStackTrace(); + } + + return false; + } + + /** + * Returns the interface to the server handler + * + * @return {@link NettyServer} interface + */ + public static NettyServer getServer() { + return server; + } + + /** + * Returns the interface to the server handler + * + * @return {@link NettyServer} interface + */ + public static RconServer getRcon() { + return rconServer; + } + + /** + * Gets the server IPv4 IP address it is currently (or attempting to) listen on + * @return IP as string + */ + public static String getServerIP() { + return serverIP; + } + + /** + * Gets the server port it is currently (or attempting to) listen on + * @return string of IP + */ + public static int getServerPort() { + return serverPort; + } + + /** + * Gets the rcon IPv4 IP address it is currently (or attempting to) listen on + * @return IP as string + */ + public static String getRconIP() { + return rconIP; + } + + /** + * Gets the rcon port it is currently (or attempting to) listen on + * @return string of IP + */ + public static int getRconPort() { + return rconPort; + } + + /** + * Gets the startup time. + * + * @return the startup time + */ + public static long getStartupTime() { + return startupTime; + } + + /** + * Are we shutting down? + * + * @return boolean yes/no + */ + public static boolean isShuttingdown() { + return isShutdown; + } + + /** + * Get gson instance. + * + * @return the gson instance + */ + public static Gson getGson() { + return gson; + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/Storage.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/Storage.java new file mode 100644 index 0000000..33375fc --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/Storage.java @@ -0,0 +1,245 @@ +package org.alexdev.havana.dao; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + +import org.alexdev.havana.log.Log; +import org.alexdev.havana.util.config.ServerConfiguration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.zaxxer.hikari.HikariConfig; +import com.zaxxer.hikari.HikariDataSource; + +public class Storage { + private HikariDataSource ds; + private boolean isConnected; + + private static Storage storage; + private static Logger log = LoggerFactory.getLogger(Storage.class); + + private Storage(String host, int port, String username, String password, String db) { + try { + HikariConfig config = new HikariConfig(); + config.setDriverClassName("org.mariadb.jdbc.Driver"); + config.setJdbcUrl("jdbc:mariadb://" + host + ":" + port + "/" + db); + config.setUsername(username); + config.setPassword(password); + + config.setPoolName("processing"); + + // No martinmine/Leon/other Habbotards, you don't know better. + // Read up on this first, before commenting dumb shit + // https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing + // availableProcessors() already returns thread count on hyper-threaded processors + // Thus we don't need the * 2 described there + config.setMaximumPoolSize(Runtime.getRuntime().availableProcessors() + 1); + config.setMinimumIdle(1); + + config.addDataSourceProperty("cachePrepStmts", "true"); + config.addDataSourceProperty("prepStmtCacheSize", "250"); + config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048"); + config.addDataSourceProperty("characterEncoding", "utf8"); + config.addDataSourceProperty("useUnicode", "true"); + config.addDataSourceProperty("useSSL", "false"); + config.addDataSourceProperty("serverTimezone", "UTC"); + config.addDataSourceProperty("sessionVariables", "sql_mode='STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'"); + + this.ds = new HikariDataSource(config); + this.isConnected = true; + + } catch (Exception ex) { + Storage.logError(ex); + //Storage.logError(ex); + } + } + + /** + * Tries to connect to its data access object service + * + * @return boolean - if connection was successful or not + */ + public static boolean connect() { + Storage.getLogger().info("Connecting to MySQL server"); + + storage = new Storage(ServerConfiguration.getString("mysql.hostname"), + ServerConfiguration.getInteger("mysql.port"), + ServerConfiguration.getString("mysql.username"), + ServerConfiguration.getString("mysql.password"), + ServerConfiguration.getString("mysql.database")); + + return storage.isConnected(); + } + + /** + * Logger handler for the MySQL processing. + * + * @param ex the exception to log + */ + public static void logError(Exception ex) { + Log.getErrorLogger().error("Error when executing MySQL query: ", ex); + } + + /** + * Prepare. + * + * @param query the query + * @param conn the conn + * @return the prepared statement + * @throws SQLException the SQL exception + */ + public PreparedStatement prepare(String query, Connection conn) throws SQLException { + try { + return conn.prepareStatement(query, Statement.RETURN_GENERATED_KEYS); + } catch (SQLException e) { + e.printStackTrace(); + } + + return null; + } + + /** + * Execute. + * + * @param query the query + */ + public void execute(String query) throws SQLException { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + + sqlConnection = this.getConnection(); + preparedStatement = this.prepare(query, sqlConnection); + preparedStatement.execute(); + + } catch (Exception ex) { + Storage.logError(ex); + throw ex; + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + /** + * Gets the string. + * + * @param query the query + * @return the string + */ + public String getString(String query) { + String value = null; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = this.getConnection(); + preparedStatement = this.prepare(query, sqlConnection); + resultSet = preparedStatement.executeQuery(); + resultSet.next(); + + value = resultSet.getString(query.split(" ")[1]); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return value; + } + + /** + * Gets the connection count. + * + * @return the connection count + */ + public int getConnectionCount() { + return this.ds.getHikariPoolMXBean().getActiveConnections(); + } + + /** + * Gets the connection. + * + * @return the connection + */ + public Connection getConnection() { + + try { + return this.ds.getConnection(); + } catch (SQLException e) { + Storage.logError(e); + } + + return null; + } + + /** + * Checks if is connected. + * + * @return true, if is connected + */ + public boolean isConnected() { + return this.isConnected; + } + + /** + * Close silently. + * + * @param resultSet the result set + */ + public static void closeSilently(ResultSet resultSet) { + try { + resultSet.close(); + } catch (Exception e) { + + } + } + + /** + * Close silently. + * + * @param statement the statement + */ + public static void closeSilently(Statement statement) { + try { + statement.close(); + } catch (Exception e) { + + } + } + + /** + * Close silently. + * + * @param sqlConnection the sql connection + */ + public static void closeSilently(Connection sqlConnection) { + try { + sqlConnection.close(); + } catch (Exception e) { + + } + } + + /** + * Returns the raw access to the data access object functions + * + * @return {@link Storage} class + */ + public static Storage getStorage() { + return storage; + } + + public static Logger getLogger() { + return log; + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/AchievementDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/AchievementDao.java new file mode 100644 index 0000000..2626dff --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/AchievementDao.java @@ -0,0 +1,115 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.game.achievements.AchievementInfo; +import org.alexdev.havana.game.achievements.user.UserAchievement; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class AchievementDao { + public static Map getAchievements() { + Map achievementsList = new HashMap<>(); + + Connection connection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + connection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM achievements WHERE disabled = 0", connection); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + var info = new AchievementInfo( + resultSet.getInt("id"), resultSet.getString("achievement"), + resultSet.getInt("level"), resultSet.getInt("reward_pixels"), + resultSet.getInt("progress_needed")); + + achievementsList.put(info.getId(), info); + } + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(connection); + } + + return achievementsList; + } + + public static List getUserAchievements(int id) { + List achievementsList = new ArrayList<>(); + + Connection connection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + connection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM users_achievements WHERE user_id = ?", connection); + preparedStatement.setInt(1, id); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + achievementsList.add(new UserAchievement( + resultSet.getInt("achievement_id"), resultSet.getInt("user_id"), resultSet.getInt("progress"))); + } + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(connection); + } + + return achievementsList; + + } + + public static void newUserAchievement(int userId, UserAchievement userAchievement) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO users_achievements (achievement_id, user_id, progress) VALUES (?, ?, ?)", sqlConnection); + preparedStatement.setInt(1, userAchievement.getAchievementInfo().getId()); + preparedStatement.setInt(2, userId); + preparedStatement.setInt(3, userAchievement.getProgress()); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void saveUserAchievement(int userId, UserAchievement userAchievement) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE users_achievements SET progress = ? WHERE user_id = ? AND achievement_id = ?", sqlConnection); + preparedStatement.setInt(1, userAchievement.getProgress()); + preparedStatement.setInt(2, userId); + preparedStatement.setInt(3, userAchievement.getAchievementInfo().getId()); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/AdvertisementsDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/AdvertisementsDao.java new file mode 100644 index 0000000..e9196ac --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/AdvertisementsDao.java @@ -0,0 +1,132 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.game.ads.Advertisement; + +import java.sql.*; +import java.util.*; + +public class AdvertisementsDao { + public static Map> getAds() { + Map> roomAds = new HashMap<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM rooms_ads", sqlConnection); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + int roomId = resultSet.getInt("room_id"); + String image = resultSet.getString("image"); + String url = resultSet.getString("url"); + + if (!roomAds.containsKey(roomId)) { + roomAds.put(roomId, new ArrayList<>()); + } + + roomAds.get(roomId).add(new Advertisement(resultSet.getInt("id"), resultSet.getBoolean("is_loading_ad"), roomId, image, url, resultSet.getBoolean("enabled"))); + } + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return roomAds; + } + + public static void updateAds(Collection ads) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE rooms_ads SET room_id = ?, image = ?, url = ?, enabled = ?, is_loading_ad = ? WHERE id = ?", sqlConnection); + sqlConnection.setAutoCommit(false); + + for (var ad : ads) { + preparedStatement.setInt(1, ad.getRoomId()); + + if (ad.getImage().isBlank()) { + preparedStatement.setNull(2, Types.VARCHAR); + } else { + preparedStatement.setString(2, ad.getImage()); + } + + if (ad.getUrl().isBlank()) { + preparedStatement.setNull(3, Types.VARCHAR); + } else { + preparedStatement.setString(3, ad.getUrl()); + } + + preparedStatement.setBoolean(4, ad.isEnabled()); + preparedStatement.setBoolean(5, ad.isLoadingAd()); + preparedStatement.setInt(6, ad.getId()); + preparedStatement.addBatch(); + } + + preparedStatement.executeBatch(); + sqlConnection.setAutoCommit(true); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void deleteAd(int id) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM rooms_ads WHERE id = ?", sqlConnection); + preparedStatement.setInt(1, id); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void create(int roomId, String url, String image, boolean isEnabled, boolean isRoomLoadingAd) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO rooms_ads (room_id, url, image, enabled, is_loading_ad) VALUES (?, ?, ?, ?, ?)", sqlConnection); + preparedStatement.setInt(1, roomId); + + if (url.isBlank()) { + preparedStatement.setNull(2, Types.VARCHAR); + } else { + preparedStatement.setString(2, url); + } + + if (image.isBlank()) { + preparedStatement.setNull(3, Types.VARCHAR); + } else { + preparedStatement.setString(3, image); + } + + preparedStatement.setInt(4, isEnabled ? 1 : 0); + preparedStatement.setInt(5, isRoomLoadingAd ? 1 : 0); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/AlertsDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/AlertsDao.java new file mode 100644 index 0000000..e6fccde --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/AlertsDao.java @@ -0,0 +1,191 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.game.alerts.AccountAlert; +import org.alexdev.havana.game.alerts.AlertType; +import org.alexdev.havana.game.messenger.MessengerUser; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class AlertsDao { + public static List getAlerts(int userId) { + List alerts = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM cms_alerts WHERE user_id = ? ORDER BY created_at DESC", sqlConnection); + preparedStatement.setInt(1, userId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + alerts.add(fill(resultSet)); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return alerts; + } + + public static void createAlert(int userId, AlertType alertType, String message) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO cms_alerts (user_id, alert_type, message) VALUES (?, ?, ?)", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setString(2, alertType.name()); + preparedStatement.setString(3, message); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void deleteAlerts(int userId, AlertType alertType) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM cms_alerts WHERE user_id = ? AND alert_type = ?", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setString(2, alertType.name()); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void disableAlerts(int userId, AlertType alertType) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE cms_alerts SET is_disabled = 1 WHERE user_id = ? AND alert_type = ?", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setString(2, alertType.name()); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + private static AccountAlert fill(ResultSet resultSet) throws SQLException { + return new AccountAlert(resultSet.getInt("id"), resultSet.getInt("user_id"), AlertType.valueOf(resultSet.getString("alert_type")), + resultSet.getString("message"), resultSet.getBoolean("is_disabled"), resultSet.getTime("created_at").getTime() / 1000L); + } + + public static Map getOnlineFriends(int userId) { + Map friends = new HashMap<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT id,username,figure,motto,last_online,sex,allow_stalking,is_online,category_id,online_status_visible FROM messenger_friends INNER JOIN users ON messenger_friends.from_id = users.id WHERE to_id = ? AND is_online = 1", sqlConnection); + preparedStatement.setInt(1, userId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + int resultUserId = resultSet.getInt("id"); + friends.put(resultUserId, new MessengerUser(resultUserId, resultSet.getString("username"), resultSet.getString("figure"), + resultSet.getString("sex"), resultSet.getString("motto"), resultSet.getTime("last_online").getTime() / 1000L, + resultSet.getBoolean("allow_stalking"), resultSet.getInt("category_id"), + resultSet.getBoolean("is_online"), resultSet.getBoolean("online_status_visible"))); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return friends; + } + + public static int countRequests(int userId) { + int count = 0; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT COUNT(*) FROM messenger_requests WHERE to_id = " + userId, sqlConnection); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + count = resultSet.getInt(1); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return count; + } + + public static void deleteAlert(int userId, int id) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM cms_alerts WHERE user_id = ? AND id = ?", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, id); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/BadgeDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/BadgeDao.java new file mode 100644 index 0000000..b64582d --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/BadgeDao.java @@ -0,0 +1,283 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.game.badges.Badge; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +public class BadgeDao { + public static Map> getRoomBadges() { + Map> badges = new ConcurrentHashMap<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM rooms_entry_badges", sqlConnection); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + int roomId = resultSet.getInt("room_id"); + String badgeCode = resultSet.getString("badge"); + + if (!badges.containsKey(roomId)) { + badges.put(roomId, new ArrayList<>()); + } + + badges.get(roomId).add(badgeCode); + } + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return badges; + } + + + public static void deleteRoomBadge(String roomId, String badgeCode) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM rooms_entry_badges WHERE room_id = ? AND badge = ?", sqlConnection); + preparedStatement.setString(1, roomId); + preparedStatement.setString(2, badgeCode); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void createEntryBadge(int roomId, String badgeCode) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO rooms_entry_badges (room_id, badge) VALUES (?, ?)", sqlConnection); + preparedStatement.setInt(1, roomId); + preparedStatement.setString(2, badgeCode); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void updateBadges(Map> badges) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + + preparedStatement = Storage.getStorage().prepare("DELETE FROM rooms_entry_badges", sqlConnection); + preparedStatement.execute(); + + preparedStatement = Storage.getStorage().prepare("INSERT INTO rooms_entry_badges (room_id, badge) VALUES (?, ?)", sqlConnection); + sqlConnection.setAutoCommit(false); + + for (var badgeData : badges.entrySet()) { + for (var badge : badgeData.getValue()) { + preparedStatement.setInt(1, badgeData.getKey()); + preparedStatement.setString(2, badge); + preparedStatement.addBatch(); + } + } + + preparedStatement.executeBatch(); + sqlConnection.setAutoCommit(true); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static List getBadges(int userId) { + List ranks = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM users_badges WHERE user_id = ?", sqlConnection); + preparedStatement.setInt(1, userId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + ranks.add(new Badge(resultSet.getString("badge"), resultSet.getBoolean("equipped"), resultSet.getInt("slot_id"))); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return ranks; + } + + public static void newBadge(int userId, String badgeCode) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO users_badges (user_id, badge) VALUES (?, ?)", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setString(2, badgeCode); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void removeBadge(int userId, String badgeCode) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM users_badges WHERE user_id = ? AND badge = ?", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setString(2, badgeCode); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void removeBadge(String badgeCode) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM users_badges WHERE badge = ?", sqlConnection); + preparedStatement.setString(1, badgeCode); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void saveBadgeChanges(int userId, String badgeCode, boolean isEquipped, int slotId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE users_badges SET equipped = ?, slot_id = ? WHERE user_id = ? AND badge = ?", sqlConnection); + preparedStatement.setBoolean(1, isEquipped); + preparedStatement.setInt(2, slotId); + preparedStatement.setInt(3, userId); + preparedStatement.setString(4, badgeCode); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + + public static void saveBadgeChanges(int userId, Set badgesToSave) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE users_badges SET equipped = ?, slot_id = ? WHERE user_id = ? AND badge = ?", sqlConnection); + sqlConnection.setAutoCommit(false); + + for (Badge badge : badgesToSave) { + preparedStatement.setBoolean(1, badge.isEquipped()); + preparedStatement.setInt(2, badge.getSlotId()); + preparedStatement.setInt(3, userId); + preparedStatement.setString(4, badge.getBadgeCode()); + preparedStatement.addBatch(); + } + + preparedStatement.executeBatch(); + sqlConnection.setAutoCommit(true); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + /** + * Get all rank badges + * + * @return list of badges + */ + public static List getRankBadges() { + List badges = new ArrayList<>(); + + Connection conn = null; + PreparedStatement stmt = null; + ResultSet row = null; + + try { + conn = Storage.getStorage().getConnection(); + stmt = Storage.getStorage().prepare("SELECT badge FROM rank_badges", conn); + row = stmt.executeQuery(); + + while (row.next()) { + badges.add(row.getString("badge")); + } + } catch (Exception err) { + Storage.logError(err); + } finally { + Storage.closeSilently(row); + Storage.closeSilently(stmt); + Storage.closeSilently(conn); + } + + return badges; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/BanDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/BanDao.java new file mode 100644 index 0000000..47c52f6 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/BanDao.java @@ -0,0 +1,144 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.game.ban.Ban; +import org.alexdev.havana.game.ban.BanType; +import org.apache.commons.lang3.tuple.Pair; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.ArrayList; +import java.util.List; + +public class BanDao { + public static Pair hasBan(BanType banType, String value) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + Pair banned = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM users_bans WHERE banned_value = ? AND ban_type = ? AND banned_until > CURRENT_TIMESTAMP() AND is_active = 1 ORDER BY banned_until DESC LIMIT 1", sqlConnection); + preparedStatement.setString(1, value); + preparedStatement.setString(2, banType.name()); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + banned = Pair.of( + resultSet.getString("message"), + resultSet.getTime("banned_until").getTime() / 1000L + ); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(resultSet); + } + + return banned; + } + + public static String getName(String machineId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + String name = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT username FROM users WHERE machine_id = ?", sqlConnection); + preparedStatement.setString(1, machineId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + name = resultSet.getString("username"); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(resultSet); + } + + return name; + } + + public static void addBan(BanType banType, String value, long bannedUntil, String message, int bannedBy) { + if (value.isBlank()) + return; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO users_bans (banned_value, ban_type, banned_until, message, banned_by) VALUES (?, ?, ?, ?, ?)", sqlConnection); + preparedStatement.setString(1, value); + preparedStatement.setString(2, banType.name()); + preparedStatement.setTimestamp(3, new java.sql.Timestamp(bannedUntil * 1000L)); + preparedStatement.setString(4, message); + preparedStatement.setInt(5, bannedBy); + preparedStatement.executeQuery(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(sqlConnection); + Storage.closeSilently(preparedStatement); + } + } + + public static void removeBan(BanType banType, String value) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + //preparedStatement = Storage.getStorage().prepare("DELETE FROM users_bans WHERE banned_value = ? AND ban_type = ?", sqlConnection); + preparedStatement = Storage.getStorage().prepare("UPDATE users_bans SET is_active = 0 WHERE banned_value = ? AND ban_type = ?", sqlConnection); + preparedStatement.setString(1, value); + preparedStatement.setString(2, banType.name()); + preparedStatement.executeQuery(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(sqlConnection); + Storage.closeSilently(preparedStatement); + } + } + + public static List getActiveBans() { + List banList = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM users_bans WHERE is_active = 1 ORDER BY banned_at DESC", sqlConnection); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + banList.add(new Ban(BanType.valueOf(resultSet.getString("ban_type")), resultSet.getString("banned_value"), resultSet.getString("message"), resultSet.getTime("banned_until").getTime() / 1000L, + resultSet.getTime("banned_at").getTime() / 1000L, resultSet.getInt("banned_by"))); + } + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(sqlConnection); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(resultSet); + } + + return banList; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/BotDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/BotDao.java new file mode 100644 index 0000000..e533b2a --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/BotDao.java @@ -0,0 +1,57 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.game.ban.BanType; +import org.alexdev.havana.game.bot.BotData; +import org.alexdev.havana.util.DateUtil; +import org.apache.commons.lang3.tuple.Pair; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.ArrayList; +import java.util.List; + +public class BotDao { + public static List getBotData(int roomId) { + List botData = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM rooms_bots WHERE room_id = ?", sqlConnection); + preparedStatement.setInt(1, roomId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + //a(String name, String mission, int x, int y, String headRotation, String bodyRotation, String figure, String walkspace) { + botData.add(new BotData( + resultSet.getString("name"), + resultSet.getString("mission"), + resultSet.getInt("x"), + resultSet.getInt("y"), + Integer.parseInt(resultSet.getString("start_look").split(",")[0]), + Integer.parseInt(resultSet.getString("start_look").split(",")[1]), + resultSet.getString("figure"), + resultSet.getString("walkspace"), + resultSet.getString("speech"), + resultSet.getString("response"), + resultSet.getString("unrecognised_response"), + resultSet.getString("hand_items") + )); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(resultSet); + } + + return botData; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/CatalogueDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/CatalogueDao.java new file mode 100644 index 0000000..882f8d1 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/CatalogueDao.java @@ -0,0 +1,186 @@ +package org.alexdev.havana.dao.mysql; + +import com.google.gson.reflect.TypeToken; +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.game.catalogue.CatalogueItem; +import org.alexdev.havana.game.catalogue.CataloguePackage; +import org.alexdev.havana.game.catalogue.CataloguePage; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.util.StringUtil; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class CatalogueDao { + + public static Map> getBadgeRewards() { + Map> badges = new ConcurrentHashMap<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM catalogue_sale_badges", sqlConnection); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + String saleCode = resultSet.getString("sale_code"); + String badgeCode = resultSet.getString("badge_code"); + + if (!badges.containsKey(saleCode)) { + badges.put(saleCode, new ArrayList<>()); + } + + badges.get(saleCode).add(badgeCode); + } + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return badges; + } + + /** + * Get the catalogue pages. + * + * @return the list of catalogue pages + */ + public static List getPages() { + List pages = new ArrayList<>(); + + Connection conn = null; + PreparedStatement stmt = null; + ResultSet row = null; + + try { + conn = Storage.getStorage().getConnection(); + stmt = Storage.getStorage().prepare("SELECT * FROM catalogue_pages ORDER BY order_id ASC", conn); + row = stmt.executeQuery(); + + while (row.next()) { + CataloguePage page = new CataloguePage(row.getInt("id"), row.getInt("parent_id"), PlayerRank.getRankForId(row.getInt("min_role")), + row.getBoolean("is_navigatable"), row.getBoolean("is_club_only"), row.getString("name"), row.getInt("icon"), row.getInt("colour"), + row.getString("layout"), + StringUtil.GSON.fromJson(row.getString("images"), new TypeToken>(){}.getType()), + StringUtil.GSON.fromJson(row.getString("texts"), new TypeToken>(){}.getType()), + row.getString("seasonal_start"), row.getInt("seasonal_length")); + + pages.add(page); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(row); + Storage.closeSilently(stmt); + Storage.closeSilently(conn); + } + + return pages; + } + + /** + * Get the catalogue items. + * + * @return the list of catalogue items + */ + public static List getItems() { + List pages = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM catalogue_items ORDER BY order_id ASC", sqlConnection); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + CatalogueItem item = new CatalogueItem(resultSet.getInt("id"), resultSet.getString("sale_code"), resultSet.getString("page_id"), + resultSet.getInt("order_id"), resultSet.getInt("price_coins"), resultSet.getInt("price_pixels"), + resultSet.getInt("seasonal_coins"), resultSet.getInt("seasonal_pixels"), resultSet.getInt("amount"), + resultSet.getBoolean("hidden"), resultSet.getInt("definition_id"), resultSet.getString("item_specialspriteid"), resultSet.getBoolean("is_package"), + resultSet.getString("active_at")); + + pages.add(item); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return pages; + } + + /** + * Get the catalogue packages. + * + * @return the list of catalogue packages + */ + public static List getPackages() { + List packages = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM catalogue_packages", sqlConnection); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + CataloguePackage cataloguePackage = new CataloguePackage(resultSet.getString("salecode"), resultSet.getInt("definition_id"), + resultSet.getString("special_sprite_id"), resultSet.getInt("amount")); + + packages.add(cataloguePackage); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return packages; + } + + /** + * Save catalogue item price. + */ + public static void setPrice(String saleCode, int price) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE catalogue_items SET price = ? WHERE sale_code = ?", sqlConnection); + preparedStatement.setInt(1, price); + preparedStatement.setString(2, saleCode); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/ClubGiftDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/ClubGiftDao.java new file mode 100644 index 0000000..9df9b79 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/ClubGiftDao.java @@ -0,0 +1,91 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.dao.Storage; +import org.apache.commons.lang3.tuple.Pair; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +public class ClubGiftDao { + public static Pair getLastGift(int userId) { + Pair giftData = null; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM users_club_gifts WHERE user_id = ? ORDER BY date_received DESC LIMIT 1", sqlConnection); + preparedStatement.setInt(1, userId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + giftData = Pair.of(resultSet.getTime("date_received").getTime(), resultSet.getString("sprite")); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return giftData; + } + + public static void incrementGiftData(long nextGiftDate) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE users_statistics SET gifts_due = gifts_due + 1, club_gift_due = FROM_UNIXTIME(UNIX_TIMESTAMP() + " + nextGiftDate + ") WHERE CURRENT_TIMESTAMP() > club_gift_due;", sqlConnection); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void addGift(int userId, String sprite) throws SQLException { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO users_club_gifts (user_id, sprite) VALUES (?, ?)", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setString(2, sprite); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + throw e; + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void clearGiftHistory(int userId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM users_club_gifts WHERE user_id = ?", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/CollectablesDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/CollectablesDao.java new file mode 100644 index 0000000..f662c5b --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/CollectablesDao.java @@ -0,0 +1,60 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.game.catalogue.collectables.CollectableData; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.ArrayList; +import java.util.List; + +public class CollectablesDao { + public static List getCollectablesData() { + List collectableData = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM catalogue_collectables", sqlConnection); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + collectableData.add(new CollectableData(resultSet.getInt("store_page"), resultSet.getInt("admin_page"), resultSet.getLong("expiry"), + resultSet.getLong("lifetime"), resultSet.getInt("current_position"), resultSet.getString("class_names").split(","))); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(resultSet); + } + + return collectableData; + } + + public static void saveData(int storePage, int currentPosition, long expiry) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE catalogue_collectables SET expiry = ?, current_position = ? WHERE store_page = ?", sqlConnection); + preparedStatement.setLong(1, expiry); + preparedStatement.setInt(2, currentPosition); + preparedStatement.setInt(3, storePage); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/CurrencyDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/CurrencyDao.java new file mode 100644 index 0000000..5dffba4 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/CurrencyDao.java @@ -0,0 +1,757 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.game.games.player.GameRank; +import org.alexdev.havana.game.player.PlayerDetails; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.HashMap; + +public class CurrencyDao { + + /** + * Atomically increase credits. + */ + public static void increaseCredits(Map playerMap) { + Connection conn = null; + PreparedStatement updateQuery = null; + PreparedStatement fetchQuery = null; + ResultSet row = null; + + try { + conn = Storage.getStorage().getConnection(); + conn.setAutoCommit(false); + updateQuery = Storage.getStorage().prepare("UPDATE users SET credits = credits + ? WHERE id = ?", conn); + + // Batch increase update queries + for (var kvp : playerMap.entrySet()) { + PlayerDetails playerDetails = kvp.getKey(); + int increaseAmount = kvp.getValue(); + + updateQuery.setInt(1, increaseAmount); + updateQuery.setInt(2, playerDetails.getId()); + + updateQuery.addBatch(); + } + + updateQuery.executeBatch(); + + List playerIds = new ArrayList<>(); + + for (var player : playerMap.keySet()) { + playerIds.add(Integer.toString(player.getId())); + } + + String rawPlayerBind = String.join(",", playerIds); + + // Fetch increased amount + // TODO: find better way to write the IN clause + // TODO: use temporary table when playerIds list is above max arguments of SQL IN function or size above max_allowed_packet MariaDB configuration setting + fetchQuery = Storage.getStorage().prepare("SELECT id,credits FROM users WHERE id IN (" + rawPlayerBind + ")", conn); + row = fetchQuery.executeQuery(); + + conn.commit(); + + Map updatedAmounts = new HashMap<>(); + + while (row != null && row.next()) { + updatedAmounts.put(row.getInt("id"), row.getInt("credits")); + } + + for (var kvp : updatedAmounts.entrySet()) { + var userId = kvp.getKey(); + var amount = kvp.getValue(); + + for (var details : playerMap.keySet()) { + if (details.getId() != userId) { + continue; + } + + details.setCredits(amount); + } + } + + } catch (Exception e) { + try { + // Rollback these queries + conn.rollback(); + } catch(SQLException re) { + Storage.logError(re); + } + + Storage.logError(e); + } finally { + try { + conn.setAutoCommit(true); + } catch (SQLException ce) { + Storage.logError(ce); + } + + Storage.closeSilently(row); + Storage.closeSilently(updateQuery); + Storage.closeSilently(fetchQuery); + Storage.closeSilently(conn); + } + } + + /** + * Atomically increase credits. + */ + public static void increasePixels(Map playerMap) { + Connection conn = null; + PreparedStatement updateQuery = null; + PreparedStatement fetchQuery = null; + ResultSet row = null; + + try { + conn = Storage.getStorage().getConnection(); + conn.setAutoCommit(false); + updateQuery = Storage.getStorage().prepare("UPDATE users SET pixels = pixels + ? WHERE id = ?", conn); + + // Batch increase update queries + for (var kvp : playerMap.entrySet()) { + PlayerDetails playerDetails = kvp.getKey(); + int increaseAmount = kvp.getValue(); + + updateQuery.setInt(1, increaseAmount); + updateQuery.setInt(2, playerDetails.getId()); + + updateQuery.addBatch(); + } + + updateQuery.executeBatch(); + + List playerIds = new ArrayList<>(); + + for (var player : playerMap.keySet()) { + playerIds.add(Integer.toString(player.getId())); + } + + String rawPlayerBind = String.join(",", playerIds); + + // Fetch increased amount + // TODO: find better way to write the IN clause + // TODO: use temporary table when playerIds list is above max arguments of SQL IN function or size above max_allowed_packet MariaDB configuration setting + fetchQuery = Storage.getStorage().prepare("SELECT id,pixels FROM users WHERE id IN (" + rawPlayerBind + ")", conn); + row = fetchQuery.executeQuery(); + + conn.commit(); + + Map updatedAmounts = new HashMap<>(); + + while (row != null && row.next()) { + updatedAmounts.put(row.getInt("id"), row.getInt("pixels")); + } + + for (var kvp : updatedAmounts.entrySet()) { + var userId = kvp.getKey(); + var amount = kvp.getValue(); + + for (var details : playerMap.keySet()) { + if (details.getId() != userId) { + continue; + } + + details.setPixels(amount); + } + } + + } catch (Exception e) { + try { + // Rollback these queries + conn.rollback(); + } catch(SQLException re) { + Storage.logError(re); + } + + Storage.logError(e); + } finally { + try { + conn.setAutoCommit(true); + } catch (SQLException ce) { + Storage.logError(ce); + } + + Storage.closeSilently(row); + Storage.closeSilently(updateQuery); + Storage.closeSilently(fetchQuery); + Storage.closeSilently(conn); + } + } + + /** + * Atomically increase credits. + * + * @param details the player details + */ + public static void increaseCredits(PlayerDetails details, int amount) { + Connection conn = null; + PreparedStatement updateQuery = null; + PreparedStatement fetchQuery = null; + ResultSet row = null; + + try { + conn = Storage.getStorage().getConnection(); + + // We disable autocommit to make sure the following queries share the same atomic transaction + conn.setAutoCommit(false); + + // Increase credits + updateQuery = Storage.getStorage().prepare("UPDATE users SET credits = credits + ? WHERE id = ?", conn); + updateQuery.setInt(1, amount); + updateQuery.setInt(2, details.getId()); + updateQuery.execute(); + + // Fetch increased amount + fetchQuery = Storage.getStorage().prepare("SELECT credits FROM users WHERE id = ?", conn); + fetchQuery.setInt(1, details.getId()); + row = fetchQuery.executeQuery(); + + // Commit these queries + conn.commit(); + + // Set amount + if (row != null && row.next()) { + int updatedAmount = row.getInt("credits"); + details.setCredits(updatedAmount); + } + + } catch (Exception e) { + try { + // Rollback these queries + conn.rollback(); + } catch(SQLException re) { + Storage.logError(re); + } + + Storage.logError(e); + } finally { + try { + conn.setAutoCommit(true); + } catch (SQLException ce) { + Storage.logError(ce); + } + + Storage.closeSilently(row); + Storage.closeSilently(updateQuery); + Storage.closeSilently(fetchQuery); + Storage.closeSilently(conn); + } + } + + /** + * Atomically decrease credits. + * + * @param details the player details + */ + public static void decreaseCredits(PlayerDetails details, int amount) { + if (details.getCredits() <= 0) { + amount = 0; + } + + Connection conn = null; + PreparedStatement updateQuery = null; + PreparedStatement fetchQuery = null; + ResultSet row = null; + + try { + conn = Storage.getStorage().getConnection(); + + // We disable autocommit to make sure the following queries share the same atomic transaction + conn.setAutoCommit(false); + + // Decrease credits + updateQuery = Storage.getStorage().prepare("UPDATE users SET credits = credits - ? WHERE id = ?", conn); + updateQuery.setInt(1, amount); + updateQuery.setInt(2, details.getId()); + updateQuery.execute(); + + // Fetch increased amount + fetchQuery = Storage.getStorage().prepare("SELECT credits FROM users WHERE id = ?", conn); + fetchQuery.setInt(1, details.getId()); + row = fetchQuery.executeQuery(); + + // Commit these queries + conn.commit(); + + // Set amount + if (row != null && row.next()) { + int updatedAmount = row.getInt("credits"); + + if (updatedAmount < 0) { + updatedAmount = 0; + } + + details.setCredits(updatedAmount); + } + + } catch (Exception e) { + try { + // Rollback these queries + conn.rollback(); + } catch(SQLException re) { + Storage.logError(re); + } + + Storage.logError(e); + } finally { + try { + conn.setAutoCommit(true); + } catch (SQLException ce) { + Storage.logError(ce); + } + + Storage.closeSilently(row); + Storage.closeSilently(updateQuery); + Storage.closeSilently(fetchQuery); + Storage.closeSilently(conn); + } + } + + /** + * Atomically decrease credits. + * + * @param details the player details + */ + public static void decreasePixels(PlayerDetails details, int amount) { + if (details.getPixels() <= 0) { + amount = 0; + } + + Connection conn = null; + PreparedStatement updateQuery = null; + PreparedStatement fetchQuery = null; + ResultSet row = null; + + try { + conn = Storage.getStorage().getConnection(); + + // We disable autocommit to make sure the following queries share the same atomic transaction + conn.setAutoCommit(false); + + // Decrease credits + updateQuery = Storage.getStorage().prepare("UPDATE users SET pixels = pixels - ? WHERE id = ?", conn); + updateQuery.setInt(1, amount); + updateQuery.setInt(2, details.getId()); + updateQuery.execute(); + + // Fetch increased amount + fetchQuery = Storage.getStorage().prepare("SELECT pixels FROM users WHERE id = ?", conn); + fetchQuery.setInt(1, details.getId()); + row = fetchQuery.executeQuery(); + + // Commit these queries + conn.commit(); + + // Set amount + if (row != null && row.next()) { + int updatedAmount = row.getInt("pixels"); + + if (updatedAmount < 0) { + updatedAmount = 0; + } + + details.setPixels(updatedAmount); + } + + } catch (Exception e) { + try { + // Rollback these queries + conn.rollback(); + } catch(SQLException re) { + Storage.logError(re); + } + + Storage.logError(e); + } finally { + try { + conn.setAutoCommit(true); + } catch (SQLException ce) { + Storage.logError(ce); + } + + Storage.closeSilently(row); + Storage.closeSilently(updateQuery); + Storage.closeSilently(fetchQuery); + Storage.closeSilently(conn); + } + } + + /** + * Atomically increase credits. + * + * @param details the player details + */ + public static void increasePixels(PlayerDetails details, int amount) { + Connection conn = null; + PreparedStatement updateQuery = null; + PreparedStatement fetchQuery = null; + ResultSet row = null; + + try { + conn = Storage.getStorage().getConnection(); + + // We disable autocommit to make sure the following queries share the same atomic transaction + conn.setAutoCommit(false); + + // Increase credits + updateQuery = Storage.getStorage().prepare("UPDATE users SET pixels = pixels + ? WHERE id = ?", conn); + updateQuery.setInt(1, amount); + updateQuery.setInt(2, details.getId()); + updateQuery.execute(); + + // Fetch increased amount + fetchQuery = Storage.getStorage().prepare("SELECT pixels FROM users WHERE id = ?", conn); + fetchQuery.setInt(1, details.getId()); + row = fetchQuery.executeQuery(); + + // Commit these queries + conn.commit(); + + // Set amount + if (row != null && row.next()) { + int updatedAmount = row.getInt("pixels"); + details.setPixels(updatedAmount); + } + + } catch (Exception e) { + try { + // Rollback these queries + conn.rollback(); + } catch(SQLException re) { + Storage.logError(re); + } + + Storage.logError(e); + } finally { + try { + conn.setAutoCommit(true); + } catch (SQLException ce) { + Storage.logError(ce); + } + + Storage.closeSilently(row); + Storage.closeSilently(updateQuery); + Storage.closeSilently(fetchQuery); + Storage.closeSilently(conn); + } + } + + /** + * Atomically increase tickets. + * + * @param details the player details + */ + public static void increaseTickets(PlayerDetails details, int amount) { + Connection conn = null; + PreparedStatement updateQuery = null; + PreparedStatement fetchQuery = null; + ResultSet row = null; + + try { + conn = Storage.getStorage().getConnection(); + + // We disable autocommit to make sure the following queries share the same atomic transaction + conn.setAutoCommit(false); + + // Increase credits + updateQuery = Storage.getStorage().prepare("UPDATE users SET tickets = tickets + ? WHERE id = ?", conn); + updateQuery.setInt(1, amount); + updateQuery.setInt(2, details.getId()); + updateQuery.execute(); + + // Fetch increased amount + fetchQuery = Storage.getStorage().prepare("SELECT tickets FROM users WHERE id = ?", conn); + fetchQuery.setInt(1, details.getId()); + row = fetchQuery.executeQuery(); + + // Commit these queries + conn.commit(); + + // Set amount + if (row != null && row.next()) { + int updatedAmount = row.getInt("tickets"); + details.setTickets(updatedAmount); + } + + } catch (Exception e) { + try { + // Rollback these queries + conn.rollback(); + } catch(SQLException re) { + Storage.logError(re); + } + + Storage.logError(e); + } finally { + try { + conn.setAutoCommit(true); + } catch (SQLException ce) { + Storage.logError(ce); + } + + Storage.closeSilently(row); + Storage.closeSilently(updateQuery); + Storage.closeSilently(fetchQuery); + Storage.closeSilently(conn); + } + } + + /** + * Atomically decrease tickets. + * + * @param details the player details + */ + public static void decreaseTickets(PlayerDetails details, int amount) { + if (details.getTickets() <= 0) { + amount = 0; + } + + Connection conn = null; + PreparedStatement updateQuery = null; + PreparedStatement fetchQuery = null; + ResultSet row = null; + + try { + conn = Storage.getStorage().getConnection(); + + // We disable autocommit to make sure the following queries share the same atomic transaction + conn.setAutoCommit(false); + + // Decrease credits + updateQuery = Storage.getStorage().prepare("UPDATE users SET tickets = tickets - ? WHERE id = ?", conn); + updateQuery.setInt(1, amount); + updateQuery.setInt(2, details.getId()); + updateQuery.execute(); + + // Fetch increased amount + fetchQuery = Storage.getStorage().prepare("SELECT tickets FROM users WHERE id = ?", conn); + fetchQuery.setInt(1, details.getId()); + row = fetchQuery.executeQuery(); + + // Commit these queries + conn.commit(); + + // Set amount + if (row != null && row.next()) { + int updatedAmount = row.getInt("tickets"); + + if (updatedAmount < 0) { + updatedAmount = 0; + } + + details.setTickets(updatedAmount); + } + + } catch (Exception e) { + try { + // Rollback these queries + if (conn != null) + conn.rollback(); + } catch (SQLException re) { + Storage.logError(re); + } + + Storage.logError(e); + } finally { + try { + if (conn != null) + conn.setAutoCommit(true); + } catch (SQLException ce) { + Storage.logError(ce); + } + + Storage.closeSilently(row); + Storage.closeSilently(updateQuery); + Storage.closeSilently(fetchQuery); + Storage.closeSilently(conn); + } + } + + /** + * Atomically increase tickets. + * + * @param details the player details + */ + public static void increaseFilm(PlayerDetails details, int amount) { + Connection conn = null; + PreparedStatement updateQuery = null; + PreparedStatement fetchQuery = null; + ResultSet row = null; + + try { + conn = Storage.getStorage().getConnection(); + + // We disable autocommit to make sure the following queries share the same atomic transaction + conn.setAutoCommit(false); + + // Increase credits + updateQuery = Storage.getStorage().prepare("UPDATE users SET film = film + ? WHERE id = ?", conn); + updateQuery.setInt(1, amount); + updateQuery.setInt(2, details.getId()); + updateQuery.execute(); + + // Fetch increased amount + fetchQuery = Storage.getStorage().prepare("SELECT film FROM users WHERE id = ?", conn); + fetchQuery.setInt(1, details.getId()); + row = fetchQuery.executeQuery(); + + // Commit these queries + conn.commit(); + + // Set amount + if (row != null && row.next()) { + int updatedAmount = row.getInt("film"); + details.setFilm(updatedAmount); + } + + } catch (Exception e) { + try { + // Rollback these queries + if (conn != null) + conn.rollback(); + } catch(SQLException re) { + Storage.logError(re); + } + + Storage.logError(e); + } finally { + try { + if (conn != null) + conn.setAutoCommit(true); + } catch (SQLException ce) { + Storage.logError(ce); + } + + Storage.closeSilently(row); + Storage.closeSilently(updateQuery); + Storage.closeSilently(fetchQuery); + Storage.closeSilently(conn); + } + } + + /** + * Atomically decrease film. + * + * @param details the player details + */ + public static void decreaseFilm(PlayerDetails details, int amount) { + if (details.getFilm() <= 0) { + amount = 0; + } + + Connection conn = null; + PreparedStatement updateQuery = null; + PreparedStatement fetchQuery = null; + ResultSet row = null; + + try { + conn = Storage.getStorage().getConnection(); + + // We disable autocommit to make sure the following queries share the same atomic transaction + conn.setAutoCommit(false); + + // Increase credits + updateQuery = Storage.getStorage().prepare("UPDATE users SET film = film - ? WHERE id = ?", conn); + updateQuery.setInt(1, amount); + updateQuery.setInt(2, details.getId()); + updateQuery.execute(); + + // Fetch increased amount + fetchQuery = Storage.getStorage().prepare("SELECT film FROM users WHERE id = ?", conn); + fetchQuery.setInt(1, details.getId()); + row = fetchQuery.executeQuery(); + + // Commit these queries + conn.commit(); + + // Set amount + if (row != null && row.next()) { + int updatedAmount = row.getInt("film"); + + if (updatedAmount < 0) { + updatedAmount = 0; + } + + details.setFilm(updatedAmount); + } + + } catch (Exception e) { + try { + // Rollback these queries + if (conn != null) + conn.rollback(); + } catch (SQLException re) { + Storage.logError(re); + } + + Storage.logError(e); + } finally { + try { + if (conn != null) + conn.setAutoCommit(true); + } catch (SQLException ce) { + Storage.logError(ce); + } + + Storage.closeSilently(row); + Storage.closeSilently(updateQuery); + Storage.closeSilently(fetchQuery); + Storage.closeSilently(conn); + } + } + + public static int getCredits(int userId) { + int credits = 0; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT credits FROM users WHERE id = ?", sqlConnection); + preparedStatement.setInt(1, userId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + credits = resultSet.getInt("credits"); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return credits; + } + + + public static void updateEligibleCredits(int userId, boolean isCreditsEarnable) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE users SET daily_coins_enabled = ? WHERE id = ?", sqlConnection); + preparedStatement.setInt(1, isCreditsEarnable ? 1 : 0); + preparedStatement.setInt(2, userId); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/EffectDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/EffectDao.java new file mode 100644 index 0000000..8d9d4ca --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/EffectDao.java @@ -0,0 +1,158 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.game.effects.Effect; +import org.alexdev.havana.util.DateUtil; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArrayList; + +public class EffectDao { + public static Map getEffectTimes() { + Map effectTimes = new HashMap<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM settings_effects", sqlConnection); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + effectTimes.put(resultSet.getInt("effect_id"), resultSet.getInt("duration_seconds")); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(resultSet); + } + + return effectTimes; + } + + public static CopyOnWriteArrayList getEffects(int userId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + CopyOnWriteArrayList effects = new CopyOnWriteArrayList<>(); + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM users_effects WHERE user_id = ?", sqlConnection); + preparedStatement.setInt(1, userId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + effects.add(new Effect(resultSet.getInt("id"), resultSet.getInt("user_id"), resultSet.getInt("effect_id"), + resultSet.getLong("expiry_date"), resultSet.getBoolean("activated"))); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(resultSet); + } + + return effects; + } + + public static void removeEffects(int userId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM users_effects WHERE user_id = ? AND expiry_date < ? AND activated = 1", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setLong(2, DateUtil.getCurrentTimeSeconds()); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static Effect newEffect(int userId, int effectId, long expiryDate, boolean activated) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + Effect effect = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO users_effects (user_id, effect_id, expiry_date, activated) VALUES (?,?,?,?)", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, effectId); + preparedStatement.setLong(3, expiryDate); + preparedStatement.setBoolean(4, activated); + preparedStatement.executeUpdate(); + + resultSet = preparedStatement.getGeneratedKeys(); + + if (resultSet.next()) { + effect = new Effect(resultSet.getInt("id"), userId, effectId, expiryDate, activated); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(resultSet); + } + + return effect; + } + + public static void saveEffect(Effect effect) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE users_effects SET activated = ?, expiry_date = ? WHERE id = ?", sqlConnection); + preparedStatement.setBoolean(1, effect.isActivated()); + preparedStatement.setLong(2, effect.getExpireDate()); + preparedStatement.setInt(3, effect.getId()); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + } + + public static void deleteEffect(int id) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM users_effects WHERE id = ?", sqlConnection); + preparedStatement.setInt(1, id); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/EventsDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/EventsDao.java new file mode 100644 index 0000000..4116222 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/EventsDao.java @@ -0,0 +1,137 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.game.events.Event; +import org.alexdev.havana.util.DateUtil; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +public class EventsDao { + public static void addEvent(int roomId, int userId, int categoryId, String name, String description, long expireTime, String tags) throws SQLException { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO rooms_events (room_id, user_id, category_id, name, description, expire_time, tags) VALUES (?, ?, ?, ?, ?, ?, ?)", sqlConnection); + + preparedStatement.setInt(1, roomId); + preparedStatement.setInt(2, userId); + preparedStatement.setInt(3, categoryId); + preparedStatement.setString(4, name); + preparedStatement.setString(5, description); + preparedStatement.setLong(6, expireTime); + preparedStatement.setString(7, tags); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + throw e; + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void removeEvent(Event event) { + removeEvents(List.of(event)); + } + + + public static void removeEvents(List eventList) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM rooms_events WHERE room_id = ?", sqlConnection); + sqlConnection.setAutoCommit(false); + + for (Event event : eventList) { + preparedStatement.setInt(1, event.getRoomId()); + preparedStatement.addBatch(); + } + + preparedStatement.executeBatch(); + sqlConnection.setAutoCommit(true); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void removeExpiredEvents() { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM rooms_events WHERE expire_time < ?", sqlConnection); + preparedStatement.setLong(1, DateUtil.getCurrentTimeSeconds()); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static List getEvents() { + List eventMap = new CopyOnWriteArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM rooms_events WHERE expire_time > ?", sqlConnection); + preparedStatement.setLong(1, DateUtil.getCurrentTimeSeconds()); + resultSet = preparedStatement.executeQuery(); + + //Event(int roomId, int userId, int categoryId, String name, String description, long started) + while (resultSet.next()) { + eventMap.add(new Event( + resultSet.getInt("room_id"), resultSet.getInt("user_id"), + resultSet.getInt("category_id"), resultSet.getString("name"), + resultSet.getString("description"), resultSet.getLong("expire_time"), + resultSet.getString("tags"))); + } + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return eventMap; + } + + public static void save(Event event) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE rooms_events SET category_id = ?, name = ?, description = ?, tags = ? WHERE room_id = ?", sqlConnection); + preparedStatement.setInt(1, event.getCategoryId()); + preparedStatement.setString(2, event.getName()); + preparedStatement.setString(3, event.getDescription()); + preparedStatement.setString(4, String.join(",", event.getTags())); + preparedStatement.setInt(5, event.getRoomId()); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/GameDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/GameDao.java new file mode 100644 index 0000000..255fb7f --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/GameDao.java @@ -0,0 +1,281 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.Havana; +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.game.games.GameSpawn; +import org.alexdev.havana.game.games.enums.GameType; +import org.alexdev.havana.game.games.battleball.BattleBallMap; +import org.alexdev.havana.game.games.history.GameHistory; +import org.alexdev.havana.game.games.history.GameHistoryData; +import org.alexdev.havana.game.games.player.GameRank; +import org.alexdev.havana.game.room.models.RoomModel; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.*; + +public class GameDao { + public static List getRanks() { + List ranks = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM games_ranks", sqlConnection); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + ranks.add(new GameRank(resultSet.getInt("id"), resultSet.getString("type"), + resultSet.getString("title"), resultSet.getInt("min_points"), + resultSet.getInt("max_points"))); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return ranks; + } + + public static List getGameMaps() { + List maps = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM games_maps", sqlConnection); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + String modelName = "bb" + "_arena_" + resultSet.getInt("map_id"); + + if (!resultSet.getString("game_type").equals("battleball")) { + modelName = "ss_arena_" + resultSet.getInt("map_id"); + } + + maps.add(new RoomModel(modelName, modelName, Integer.MAX_VALUE, Integer.MAX_VALUE, Double.MAX_VALUE, 0, resultSet.getString("heightmap"), null)); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + + return maps; + } + + public static List getBattleballTileMaps() { + List maps = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM games_maps WHERE game_type = 'battleball'", sqlConnection); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + maps.add(new BattleBallMap(resultSet.getInt("map_id"), GameType.BATTLEBALL, resultSet.getString("tile_map"))); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + + return maps; + } + + public static List getGameSpawns() { + List spawns = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM games_player_spawns", sqlConnection); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + spawns.add(new GameSpawn(resultSet.getInt("team_id"), resultSet.getInt("map_id"), resultSet.getString("type"), + resultSet.getInt("x"), resultSet.getInt("y"), resultSet.getInt("rotation"))); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + + return spawns; + } + + /*public static List getTopTeams() { + List teams = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM games_played_history ORDER BY team_points DESC LIMIT 3", sqlConnection); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + String json = resultSet.getString("player_scores"); + + try { + GameHistoryData gamePlayedHistory = Havana.getGson().fromJson(json, GameHistoryData.class); + teams.add(new GameHistory(resultSet.getInt("team_type"), gamePlayedHistory)); + } catch (Exception ex) { + + } + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + + return teams; + } + + public static HashMap getTopPlayers() { + LinkedHashMap players = new LinkedHashMap<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT *,(battleball_points + snowstorm_points) AS game_points FROM users INNER JOIN users_statistics ON users_statistics.user_id = users.id ORDER BY (battleball_points + snowstorm_points) DESC LIMIT 5", sqlConnection); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + players.put(resultSet.getString("username"), resultSet.getInt("game_points")); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return players; + }*/ + + + public static void resetMonthlyXp() { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE users_statistics SET battleball_score_month = 0, snowstorm_score_month = 0, wobble_squabble_score_month = 0, xp_earned_month = 0 " + + "WHERE (battleball_score_month > 0) OR (snowstorm_score_month > 0) OR (wobble_squabble_score_month > 0) OR (xp_earned_month > 0)", sqlConnection); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void saveTeamHistory(String uniqueId, String gameName, int mapCreator, int mapId, int winningTeam, int winningTeamScore, String extraData, GameType gameType, String gameHistoryData) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO games_played_history (id, game_name, game_creator, game_type, map_id, winning_team, winning_team_score, extra_data, team_data) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", sqlConnection); + preparedStatement.setString(1, uniqueId); + preparedStatement.setString(2, gameName); + preparedStatement.setInt(3, mapCreator); + preparedStatement.setString(4, gameType.name()); + preparedStatement.setInt(5, mapId); + preparedStatement.setInt(6, winningTeam); + preparedStatement.setInt(7, winningTeamScore); + preparedStatement.setString(8, extraData); + preparedStatement.setString(9, gameHistoryData); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static List getLastPlayedGames(GameType gameType) { + List games = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT games_played_history.*, users.username AS game_creator_name FROM games_played_history INNER JOIN users ON users.id = games_played_history.game_creator WHERE game_type = ? ORDER BY played_at DESC LIMIT 15", sqlConnection); + preparedStatement.setString(1, gameType.name()); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + var gameHistory = new GameHistory(Havana.getGson().fromJson(resultSet.getString("team_data"), GameHistoryData.class)); + + gameHistory.setName(resultSet.getString("game_name")); + gameHistory.setGameCreator(resultSet.getString("game_creator_name")); + gameHistory.setMapId(resultSet.getInt("map_id")); + gameHistory.setGameType(GameType.valueOf(resultSet.getString("game_type"))); + gameHistory.setWinningTeam(resultSet.getInt("winning_team")); + gameHistory.setWinningTeamScore(resultSet.getInt("winning_team_score")); + gameHistory.setExtraData(resultSet.getString("extra_data")); + + games.add(gameHistory); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return games; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/GroupDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/GroupDao.java new file mode 100644 index 0000000..f7446ff --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/GroupDao.java @@ -0,0 +1,437 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.game.groups.Group; +import org.alexdev.havana.util.config.GameConfiguration; + +import java.sql.*; +import java.util.*; +import java.util.stream.Collectors; + +public class GroupDao { + public static Group getGroup(int groupId) { + Group group = null; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM groups_details WHERE id = ?", sqlConnection); + preparedStatement.setInt(1, groupId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + group = fill(resultSet); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(resultSet); + } + + return group; + } + + public static Group getGroupByAlias(String groupAlias) { + Group group = null; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM groups_details WHERE alias = ?", sqlConnection); + preparedStatement.setString(1, groupAlias); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + group = fill(resultSet); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(resultSet); + } + + return group; + } + + public static List getGroups(int userId) { + List groupList = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM groups_details WHERE owner_id = ?", sqlConnection); + preparedStatement.setInt(1, userId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + groupList.add(fill(resultSet)); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(resultSet); + } + + return groupList; + } + + public static List getJoinedGroups(int userId) { + List groupList = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT " + + "groups_details.* " + + "FROM groups_memberships " + + "RIGHT JOIN " + + "groups_details ON groups_memberships.group_id = groups_details.id " + + "WHERE owner_id = ? " + + "OR (groups_memberships.user_id = ? AND groups_memberships.is_pending = 0)", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, userId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + int groupId = resultSet.getInt("id"); + + if (groupList.stream().noneMatch(group -> group.getId() == groupId)) { + groupList.add(fill(resultSet)); + } + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(resultSet); + } + + return groupList.stream() + .sorted(Comparator.comparingInt((Group group) -> group.getMemberCount(false)).reversed()) + .collect(Collectors.toList()); + } + + public static int addGroup(String name, String description, int ownerId) { + int groupId = 0; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO groups_details (name, description, owner_id) VALUES (?, ?, ?)", sqlConnection); + preparedStatement.setString(1, name); + preparedStatement.setString(2, description); + preparedStatement.setInt(3, ownerId); + preparedStatement.executeQuery(); + resultSet = preparedStatement.getGeneratedKeys(); + + if (resultSet.next()) { + groupId = resultSet.getInt(1); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(preparedStatement); + } + + return groupId; + } + + public static int saveGroup(Group group) { + int groupId = 0; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE groups_details SET name = ?, description = ?, room_id = ?, badge = ?, recommended = ?, group_type = ?, forum_type = ?, forum_premission = ?, alias = ? WHERE id = ?", sqlConnection); + preparedStatement.setString(1, group.getName()); + preparedStatement.setString(2, group.getDescription()); + preparedStatement.setInt(3, group.getRoomId()); + preparedStatement.setString(4, group.getBadge()); + preparedStatement.setInt(5, group.isRecommended() ? 1 : 0); + preparedStatement.setInt(6, group.getGroupType()); + preparedStatement.setInt(7, group.getForumType().getId()); + preparedStatement.setInt(8, group.getForumPermission().getId()); + + if (group.getAlias() == null || group.getAlias().isBlank()) { + preparedStatement.setNull(9, Types.VARCHAR); + } + else { + preparedStatement.setString(9, group.getAlias()); + } + + preparedStatement.setInt(10, group.getId()); + preparedStatement.executeQuery(); + resultSet = preparedStatement.getGeneratedKeys(); + + if (resultSet.next()) { + groupId = resultSet.getInt(1); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(preparedStatement); + } + + return groupId; + } + + public static void saveBackground(Group group) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE groups_details SET background = ? WHERE id = ?", sqlConnection); + preparedStatement.setString(1, group.getBackground()); + preparedStatement.setInt(2, group.getId()); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(preparedStatement); + } + } + + public static List querySearch(String query) { + List groups = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM groups_details WHERE name LIKE ? LIMIT 30", sqlConnection); + preparedStatement.setString(1, "%" + query + "%"); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + groups.add(fill(resultSet)); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return groups; + } + + public static void saveBadge(Group group) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE groups_details SET badge = ? WHERE id = ?", sqlConnection); + preparedStatement.setString(1, group.getBadge()); + preparedStatement.setInt(2, group.getId()); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(preparedStatement); + } + } + + public static String getGroupBadge(int groupId) { + String group = null; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT badge FROM groups_details WHERE id = ?", sqlConnection); + preparedStatement.setInt(1, groupId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + group = resultSet.getString("badge"); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(resultSet); + } + + return group; + } + + public static void delete(int groupId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM groups_details WHERE id = ?", sqlConnection); + preparedStatement.setInt(1, groupId); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static boolean hasGroupByAlias(String url) { + boolean group = false; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM groups_details WHERE alias = ?", sqlConnection); + preparedStatement.setString(1, url); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + group = true; + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(resultSet); + } + + return group; + } + + public static void deleteHomeRoom(int roomId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE groups_details SET room_id = 0 WHERE room_id = ?", sqlConnection); + preparedStatement.setInt(1, roomId); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static int getGroupOwner(int groupId) { + int ownerId = 0; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT owner_id FROM groups_details WHERE id = ?", sqlConnection); + preparedStatement.setInt(1, groupId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + ownerId = resultSet.getInt("owner_id"); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(resultSet); + } + + return ownerId; + } + + public static String getGroupName(int groupId) { + String groupName = null; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT name FROM groups_details WHERE id = ?", sqlConnection); + preparedStatement.setInt(1, groupId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + groupName = resultSet.getString("name"); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(resultSet); + } + + return groupName; + } + + public static Group fill(ResultSet resultSet) throws SQLException { + return new Group(resultSet.getInt("id"), resultSet.getString("name"), resultSet.getString("description"), resultSet.getInt("owner_id"), + resultSet.getInt("room_id"), resultSet.getString("badge"), resultSet.getBoolean("recommended"), resultSet.getString("background"), resultSet.getInt("views"), + resultSet.getInt("topics"), resultSet.getInt("group_type"), resultSet.getInt("forum_type"), resultSet.getInt("forum_premission"), + resultSet.getString("alias"), resultSet.getTime("created_at").getTime() / 1000L); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/GroupMemberDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/GroupMemberDao.java new file mode 100644 index 0000000..8c2744a --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/GroupMemberDao.java @@ -0,0 +1,338 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.game.groups.GroupMember; +import org.alexdev.havana.game.groups.GroupMemberRank; +import org.alexdev.havana.game.player.PlayerDetails; +import org.apache.commons.lang3.tuple.Pair; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class GroupMemberDao { + /*public static List getMembers(int groupId, boolean checkPending) { + List members = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM groups_memberships WHERE group_id = ? AND is_pending = ?", sqlConnection); + preparedStatement.setInt(1, groupId); + preparedStatement.setInt(2, checkPending ? 1 : 0); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + members.add(fill(resultSet));//.getInt("user_id")); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return members; + }*/ + + public static List getMembers(int groupId, boolean checkPending, String query, int page, int itemsPerPage) { + List members = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + if (!query.isBlank()) { + preparedStatement = Storage.getStorage().prepare("SELECT * FROM groups_memberships INNER JOIN users ON groups_memberships.user_id = users.id WHERE group_id = ? AND is_pending = ? AND username LIKE ? LIMIT " + ((page - 1) * itemsPerPage) + "," + itemsPerPage, sqlConnection); + preparedStatement.setInt(1, groupId); + preparedStatement.setInt(2, checkPending ? 1 : 0); + preparedStatement.setString(3, query + "%"); + } else { + preparedStatement = Storage.getStorage().prepare("SELECT * FROM groups_memberships INNER JOIN users ON groups_memberships.user_id = users.id WHERE group_id = ? AND is_pending = ? LIMIT " + ((page - 1) * itemsPerPage) + "," + itemsPerPage, sqlConnection); + preparedStatement.setInt(1, groupId); + preparedStatement.setInt(2, checkPending ? 1 : 0); + } + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + members.add(fill(resultSet));//.getInt("user_id")); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return members; + } + + + public static GroupMember getMember(int groupId, int userId) { + GroupMember member = null; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM groups_memberships WHERE group_id = ? AND user_id = ?", sqlConnection); + preparedStatement.setInt(1, groupId); + preparedStatement.setInt(2, userId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + member = fill(resultSet); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return member; + } + + public static void addMember(int userId, int groupId, boolean insertPending) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO groups_memberships (user_id, group_id, is_pending) VALUES (?, ?, ?)", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, groupId); + preparedStatement.setLong(3, insertPending ? 1 : 0); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void updateMember(int userId, int groupId, GroupMemberRank memberRank, boolean pendingStatus) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE groups_memberships SET is_pending = ?, member_rank = ? WHERE user_id = ? AND group_id = ?", sqlConnection); + preparedStatement.setInt(1, pendingStatus ? 1 : 0); + preparedStatement.setString(2, String.valueOf(memberRank.getRankId())); + preparedStatement.setInt(3, userId); + preparedStatement.setInt(4, groupId); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void deleteMember(int userId, int groupId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM groups_memberships WHERE user_id = ? AND group_id = ?", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, groupId); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static Pair> getPendingMembers(int userId) { + var groupData = new HashMap(); + var groups = new HashMap(); + int pendingMembers = 0; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT " + + "groups_details.id AS group_id, " + + "groups_details.name AS group_name " + + "FROM groups_memberships " + + "RIGHT JOIN " + + "groups_details ON groups_memberships.group_id = groups_details.id " + + "WHERE owner_id = ? " + + "OR (groups_memberships.user_id = ? AND (groups_memberships.member_rank = '2' OR groups_memberships.member_rank = '3'))", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, userId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + int groupId = resultSet.getInt("group_id"); + String groupName = resultSet.getString("group_name"); + groupData.put(String.valueOf(groupId), groupName); + } + + if (groupData.size() > 0) { + preparedStatement = Storage.getStorage().prepare("SELECT " + + "user_id, group_id " + + "FROM groups_memberships " + + "WHERE group_id IN (" + String.join(",", groupData.keySet()) + ") " + + "AND is_pending = 1 GROUP BY group_id", sqlConnection); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + int groupId = resultSet.getInt("group_id"); + + if (!groups.containsKey(String.valueOf(groupId))) { + groups.put(String.valueOf(groupId), groupData.get(String.valueOf(groupId))); + } + + pendingMembers++; + } + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return Pair.of(pendingMembers, groups); + } + + public static int countMembers(int groupId, boolean isPending) { + int count = 0; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT COUNT(*) AS member_count FROM groups_memberships WHERE group_id = ? AND is_pending = ?", sqlConnection); + preparedStatement.setInt(1, groupId); + preparedStatement.setInt(2, isPending ? 1 : 0); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + count = resultSet.getInt("member_count"); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return count; + } + + public static List getOnlineMembersByFavourite(int groupId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + List detailsList = new ArrayList(); + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM users WHERE favourite_group = ? AND is_online = 1 LIMIT 1", sqlConnection); + preparedStatement.setInt(1, groupId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + PlayerDetails details = new PlayerDetails(); + PlayerDao.fill(details, resultSet); + + detailsList.add(details); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return detailsList; + } + + public static void resetFavourites(int groupId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE users SET favourite_group = 0 WHERE favourite_group = ?", sqlConnection); + preparedStatement.setInt(1, groupId); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + + public static void deleteMembers(int groupId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM groups_memberships WHERE group_id = ?", sqlConnection); + preparedStatement.setInt(1, groupId); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + private static GroupMember fill(ResultSet resultSet) throws SQLException { + return new GroupMember(resultSet.getInt("user_id"), resultSet.getInt("group_id"), resultSet.getBoolean("is_pending"), Integer.parseInt(resultSet.getString("member_rank"))); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/GuideDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/GuideDao.java new file mode 100644 index 0000000..93c6ec3 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/GuideDao.java @@ -0,0 +1,39 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.game.player.guides.GuidingData; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.ArrayList; +import java.util.List; + +public class GuideDao { + public static List getGuidedBy(int userId) { + List users = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT id, username, last_online, online_time FROM users_statistics INNER JOIN users ON users.id = users_statistics.user_id WHERE guided_by = " + userId, sqlConnection); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + users.add(new GuidingData(resultSet.getInt("id"), resultSet.getString("username"), resultSet.getTime("last_online").getTime() / 1000L, + resultSet.getLong("online_time"))); + } + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(resultSet); + } + + return users; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/HighscoreDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/HighscoreDao.java new file mode 100644 index 0000000..be4d895 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/HighscoreDao.java @@ -0,0 +1,119 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.game.games.enums.GameType; +import org.alexdev.havana.game.games.history.ScoreEntry; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.ArrayList; +import java.util.List; + +public class HighscoreDao { + public static List getScores(int limit, GameType gameType, int page, boolean viewMontly) { + List scoreEntryList = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + StringBuilder query = new StringBuilder(); + query.append("SELECT users.username AS username,users_statistics.* FROM users_statistics INNER JOIN users ON users.id = users_statistics.user_id "); + + if (viewMontly) { + if (gameType == GameType.BATTLEBALL) { + query.append("WHERE battleball_score_month > 0 "); + } + + if (gameType == GameType.SNOWSTORM) { + query.append("WHERE snowstorm_score_month > 0 "); + } + + if (gameType == GameType.WOBBLE_SQUABBLE) { + query.append("WHERE wobble_squabble_score_month > 0 "); + } + } else { + if (gameType == GameType.BATTLEBALL) { + query.append("WHERE battleball_score_all_time > 0 "); + } + + if (gameType == GameType.SNOWSTORM) { + query.append("WHERE snowstorm_score_all_time > 0 "); + } + + if (gameType == GameType.WOBBLE_SQUABBLE) { + query.append("WHERE wobble_squabble_score_all_time > 0 "); + } + } + + query.append("AND ((SELECT COUNT(*) FROM users_bans WHERE banned_value = users.id AND ban_type = 'USER_ID' AND NOW() > banned_until AND is_active = 1) = 0) "); + query.append("ORDER BY "); + + if (viewMontly) { + if (gameType == GameType.BATTLEBALL) { + query.append("battleball_score_month DESC "); + } + + if (gameType == GameType.SNOWSTORM) { + query.append("snowstorm_score_month DESC "); + } + + if (gameType == GameType.WOBBLE_SQUABBLE) { + query.append("wobble_squabble_score_month DESC "); + } + } else { + if (gameType == GameType.BATTLEBALL) { + query.append("battleball_score_all_time DESC "); + } + + if (gameType == GameType.SNOWSTORM) { + query.append("snowstorm_score_all_time DESC "); + } + + if (gameType == GameType.WOBBLE_SQUABBLE) { + query.append("wobble_squabble_score_all_time DESC "); + } + } + + query.append( "LIMIT " + ((page - 1) * limit) + "," + limit); + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare(query.toString(), sqlConnection); + resultSet = preparedStatement.executeQuery(); + + int position = ((page - 1) * limit) + 1; + + while (resultSet.next()) { + if (viewMontly) { + if (gameType == GameType.BATTLEBALL) { + scoreEntryList.add(new ScoreEntry(resultSet.getString("username"), resultSet.getLong("battleball_score_month"), position)); + } else if (gameType == GameType.SNOWSTORM) { + scoreEntryList.add(new ScoreEntry(resultSet.getString("username"), resultSet.getLong("snowstorm_score_month"), position)); + } else if (gameType == GameType.WOBBLE_SQUABBLE) { + scoreEntryList.add(new ScoreEntry(resultSet.getString("username"), resultSet.getLong("wobble_squabble_score_month"), position)); + } + } else { + if (gameType == GameType.BATTLEBALL) { + scoreEntryList.add(new ScoreEntry(resultSet.getString("username"), resultSet.getLong("battleball_score_all_time"), position)); + } else if (gameType == GameType.SNOWSTORM) { + scoreEntryList.add(new ScoreEntry(resultSet.getString("username"), resultSet.getLong("snowstorm_score_all_time"), position)); + } else if (gameType == GameType.WOBBLE_SQUABBLE) { + scoreEntryList.add(new ScoreEntry(resultSet.getString("username"), resultSet.getLong("wobble_squabble_score_all_time"), position)); + } + } + position++; + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return scoreEntryList; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/InfobusDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/InfobusDao.java new file mode 100644 index 0000000..abe5667 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/InfobusDao.java @@ -0,0 +1,237 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.Havana; +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.game.infobus.InfobusPoll; +import org.alexdev.havana.game.infobus.InfobusPollData; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class InfobusDao { + public static List getInfobusPolls() { + List polls = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM infobus_polls ORDER BY created_at DESC", sqlConnection); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + polls.add(fill(resultSet)); + } + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(resultSet); + } + + return polls; + } + + public static int createInfobusPoll(int initiatedBy, InfobusPollData pollData) { + int pollId = -1; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO infobus_polls (initiated_by, poll_data) VALUES (?, ?)", sqlConnection); + preparedStatement.setInt(1, initiatedBy); + preparedStatement.setString(2, Havana.getGson().toJson(pollData)); + preparedStatement.execute(); + resultSet = preparedStatement.getGeneratedKeys(); + + if (resultSet.next()) { + pollId = resultSet.getInt(1); + } + } catch (SQLException e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + + return pollId; + } + + public static void delete(int id) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM infobus_polls WHERE id = ?", sqlConnection); + preparedStatement.setInt(1, id); + preparedStatement.execute(); + } catch (SQLException e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static InfobusPoll get(int id) { + InfobusPoll infobusPoll = null; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM infobus_polls WHERE id = ? LIMIT 1", sqlConnection); + preparedStatement.setInt(1, id); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + infobusPoll = fill(resultSet); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return infobusPoll; + } + + public static void saveInfobusPoll(int id, InfobusPollData pollData) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE infobus_polls SET poll_data = ? WHERE id = ?", sqlConnection); + preparedStatement.setString(1, Havana.getGson().toJson(pollData)); + preparedStatement.setInt(2, id); + preparedStatement.execute(); + } catch (SQLException e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void addAnswer(int pollId, int answer, int userId) throws SQLException { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO infobus_polls_answers (user_id, poll_id, answer) VALUES (?, ?, ?)", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, pollId); + preparedStatement.setInt(3, answer); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + throw e; + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static boolean hasAnswer(int pollId, int userId) { + boolean exists = false; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM infobus_polls_answers WHERE user_id = ? AND poll_id = ?", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, pollId); + resultSet = preparedStatement.executeQuery(); + exists = resultSet.next(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return exists; + } + + public static Map getAnswers(int pollId) { + Map answers = new HashMap<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT COUNT(*) AS votes, answer FROM infobus_polls_answers WHERE poll_id = ? GROUP BY answer", sqlConnection); + preparedStatement.setInt(1, pollId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + answers.put(resultSet.getInt("answer"), resultSet.getInt("votes")); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return answers; + } + + public static void clearAnswers(int pollId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM infobus_polls_answers WHERE poll_id = ?", sqlConnection); + preparedStatement.setInt(1, pollId); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + private static InfobusPoll fill(ResultSet resultSet) throws SQLException { + return new InfobusPoll(resultSet.getInt("id"), resultSet.getInt("initiated_by"), + Havana.getGson().fromJson(resultSet.getString("poll_data"), InfobusPollData.class), + resultSet.getTime("created_at").getTime() / 1000L); + } + +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/ItemDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/ItemDao.java new file mode 100644 index 0000000..3cc7851 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/ItemDao.java @@ -0,0 +1,655 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.game.ecotron.EcotronItem; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.base.ItemDefinition; +import org.alexdev.havana.game.room.RoomData; +import org.alexdev.havana.util.DateUtil; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.*; +import java.util.concurrent.CopyOnWriteArrayList; + +public class ItemDao { + + /** + * Get the item definitions. + * + * @return the list of item definitions + */ + public static Map getItemDefinitions() { + Map definitions = new HashMap<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM items_definitions", sqlConnection); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + ItemDefinition definition = new ItemDefinition(resultSet.getInt("id"), resultSet.getString("sprite"), + resultSet.getString("name"), resultSet.getString("description"), + resultSet.getInt("sprite_id"), resultSet.getString("behaviour"), resultSet.getDouble("top_height"), + resultSet.getInt("length"), resultSet.getInt("width"), resultSet.getInt("max_status"), + resultSet.getString("interactor"), resultSet.getBoolean("is_tradable"), + resultSet.getBoolean("is_recyclable"), resultSet.getString("drink_ids"), resultSet.getInt("rental_time"), + resultSet.getString("allowed_rotations"), resultSet.getString("heights")); + + definitions.put(definition.getId(), definition); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return definitions; + } + + public static Map getItemVersions() { + Map definitions = new HashMap<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM furniture_versions", sqlConnection); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + definitions.put(resultSet.getString("asset_name"), resultSet.getInt("version_id")); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return definitions; + } + + public static List getEcotronItems() { + List itemList = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM recycler_rewards ORDER BY order_id ASC", sqlConnection); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + EcotronItem ecotronItem = new EcotronItem(resultSet.getString("sprite"), resultSet.getInt("chance"), resultSet.getInt("chance")); + itemList.add(ecotronItem); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return itemList; + } + + /** + * Create new item entry with the definition id, user id and custom data. It will + * override the current item id with its database id. + * + * @param item the item to create + */ + public static void newItem(Item item) throws SQLException { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet row = null; + + long itemId = 0; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO items (user_id, definition_id, custom_data, expire_time) VALUES (?,?,?,?)", sqlConnection); + preparedStatement.setInt(1, item.getOwnerId()); + preparedStatement.setInt(2, item.getDefinition().getId()); + preparedStatement.setString(3, item.getCustomData()); + preparedStatement.setLong(4, item.getExpireTime()); + preparedStatement.executeUpdate(); + + row = preparedStatement.getGeneratedKeys(); + + if (row != null && row.next()) { + itemId = row.getLong(1); + } + + } catch (SQLException e) { + Storage.logError(e); + throw e; + } finally { + Storage.closeSilently(row); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + item.setDatabaseId(itemId); + item.assignVirtualId(); + } + + /** + * Get the inventory list of items. + * + * @param userId the id of the user to get the inventory for + * @return the list of items + */ + public static List getInventory(int userId) { + List items = new CopyOnWriteArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM items WHERE user_id = ? AND room_id = 0 ORDER BY order_id ASC", sqlConnection); + preparedStatement.setInt(1, userId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + Item item = new Item(); + fill(item, resultSet); + items.add(item); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return items; + } + + /** + * Get the item by item id + * + * @param itemId the id of the item to to get + * @return the item + */ + public static Item getItem(long itemId) { + Item item = null; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM vw_items WHERE id = ?", sqlConnection); + preparedStatement.setLong(1, itemId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + item = new Item(); + fill(item, resultSet); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return item; + } + + /** + * Get the room list of items. + * + * @return the list of items + */ + public static List getRoomItems(RoomData roomData) { + List items = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM items WHERE room_id = ?", sqlConnection); + preparedStatement.setInt(1, roomData.getId()); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + Item item = new Item(); + item.assignVirtualId(); + fill(item, resultSet); + items.add(item); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return items; + } + + /** + * Get expired items + * + * @return the list of expired items + */ + public static List getExpiredItems() { + List items = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM items WHERE expire_time <> -1 AND expire_time < ?", sqlConnection); + preparedStatement.setLong(1, DateUtil.getCurrentTimeSeconds()); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + Item item = new Item(); + item.assignVirtualId(); + fill(item, resultSet); + items.add(item); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return items; + } + + + /** + * Redeem credit furniture atomicly + * + * @param amount credit amount to increase by + * @param userID user ID + */ + public static int redeemCreditItem(int amount, long itemID, int userID) { + int updatedAmount = -1; + Connection conn = null; + PreparedStatement deleteQuery = null; + PreparedStatement updateQuery = null; + PreparedStatement fetchQuery = null; + ResultSet row = null; + + try { + conn = Storage.getStorage().getConnection(); + + // We disable autocommit to make sure the following queries share the same atomic transaction + conn.setAutoCommit(false); + + deleteQuery = Storage.getStorage().prepare("DELETE FROM items WHERE id = ?", conn); + deleteQuery.setLong(1, itemID); + deleteQuery.execute(); + + // Increase credits + updateQuery = Storage.getStorage().prepare("UPDATE users SET credits = credits + ? WHERE id = ?", conn); + updateQuery.setInt(1, amount); + updateQuery.setInt(2, userID); + updateQuery.execute(); + + // Fetch increased amount + fetchQuery = Storage.getStorage().prepare("SELECT credits FROM users WHERE id = ?", conn); + fetchQuery.setInt(1, userID); + row = fetchQuery.executeQuery(); + + // Commit these queries + conn.commit(); + + // Set amount + if (row != null && row.next()) { + updatedAmount = row.getInt("credits"); + } + + } catch (Exception e) { + // Reset amount + updatedAmount = -1; + + try { + // Rollback these queries + conn.rollback(); + } catch(SQLException re) { + Storage.logError(re); + } + + Storage.logError(e); + } finally { + try { + conn.setAutoCommit(true); + } catch (SQLException ce) { + Storage.logError(ce); + } + + Storage.closeSilently(row); + Storage.closeSilently(deleteQuery); + Storage.closeSilently(updateQuery); + Storage.closeSilently(fetchQuery); + Storage.closeSilently(conn); + } + + return updatedAmount; + } + + /** + * Update item by item instance. + * + * @param item the instance of the item to update it + */ + public static void updateItem(Item item) { + updateItems(List.of(item)); + } + + /** + * Update an entire list of items at once. + * + * @param items the list of items + */ + public static void updateItems(Collection items) { + if (items.size() > 0) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE items SET room_id = ?, definition_id = ?, x = ?, y = ?, z = ?, rotation = ?, wall_position = ?, custom_data = ?, order_id = ?, is_hidden = ? WHERE id = ?", sqlConnection); + sqlConnection.setAutoCommit(false); + + for (Item item : items) { + preparedStatement.setInt(1, item.getRoomId()); + preparedStatement.setInt(2, item.getDefinition().getId()); + preparedStatement.setInt(3, item.getPosition().getX()); + preparedStatement.setInt(4, item.getPosition().getY()); + preparedStatement.setDouble(5, item.getPosition().getZ()); + preparedStatement.setInt(6, item.getPosition().getRotation()); + preparedStatement.setString(7, item.getWallPosition()); + preparedStatement.setString(8, item.getCustomData()); + preparedStatement.setInt(9, item.getOrderId()); + preparedStatement.setInt(10, item.isHidden() ? 1 : 0); + preparedStatement.setLong(11, item.getDatabaseId()); + preparedStatement.addBatch(); + } + + preparedStatement.executeBatch(); + sqlConnection.setAutoCommit(true); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + } + + /** + * Update item by item instance. + * + * @param item the instance of the item to update it + */ + public static void updateItemOwnership(Item item) { + updateItemOwnership(List.of(item)); + } + + /** + * Update an entire list of items at once. + * + * @param items the list of items + */ + public static void updateItemOwnership(Collection items) { + if (items.size() > 0) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE items SET room_id = ?, user_id = ? WHERE id = ?", sqlConnection); + sqlConnection.setAutoCommit(false); + + for (Item item : items) { + preparedStatement.setInt(1, item.getRoomId()); + preparedStatement.setInt(2, item.getOwnerId()); + preparedStatement.setLong(3, item.getDatabaseId()); + preparedStatement.addBatch(); + } + + preparedStatement.executeBatch(); + sqlConnection.setAutoCommit(true); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + } + + /** + * Update item by item instance. + * + * @param item the instance of the item to update it + */ + public static void updateTradeState(Item item, boolean inTrade) { + updateTradeStates(List.of(item), inTrade); + } + + /** + * Update an entire list of items at once. + * + * @param items the list of items + */ + public static void updateTradeStates(Collection items, boolean inTrade) { + if (items.size() > 0) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE items SET is_trading = ? WHERE id = ?", sqlConnection); + sqlConnection.setAutoCommit(false); + + for (Item item : items) { + item.setInTrade(inTrade); + + preparedStatement.setBoolean(1, item.isInTrade()); + preparedStatement.setLong(2, item.getDatabaseId()); + preparedStatement.addBatch(); + } + + preparedStatement.executeBatch(); + sqlConnection.setAutoCommit(true); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + } + + public static void deleteItems(List items) { + if (items.size() > 0) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM items WHERE id = ?", sqlConnection); + sqlConnection.setAutoCommit(false); + + for (Long itemId : items) { + preparedStatement.setLong(1, itemId); + preparedStatement.addBatch(); + } + + preparedStatement.executeBatch(); + sqlConnection.setAutoCommit(true); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + } + + + public static void saveTotemExpire(int userId, long totemExpiration) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE users SET totem_effect_expiry = ? WHERE id = ?", sqlConnection); + preparedStatement.setLong(1, totemExpiration); + preparedStatement.setInt(2, userId); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void saveTradeBanExpire(int userId, long tradeBanExpiration) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE users SET trade_ban_expiration = ? WHERE id = ?", sqlConnection); + preparedStatement.setLong(1, tradeBanExpiration); + preparedStatement.setInt(2, userId); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + + public static void deleteHandItems(int userId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE items WHERE is_hidden = 0 AND is_trading = 0 AND room_id = 0 AND user_id = ?", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + + /** + * Get the room list of items. + * + * @return the list of items + */ + public static List getUserItemsByDefinition(int userId, ItemDefinition definition) { + List items = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM items WHERE user_id = ? AND definition_id = ?", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, definition.getId()); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + Item item = new Item(); + item.assignVirtualId(); + fill(item, resultSet); + items.add(item); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return items; + } + + public static void resetTradeStates() { + try { + Storage.getStorage().execute("UPDATE items SET is_trading = 0 WHERE is_trading > 0"); + } catch (SQLException e) { + Storage.logError(e); + } + } + + /** + * Fill item with data retrieved from the SQL query. + * + * @param item the item to fill data for + * @param resultSet the result set returned with the data + * @throws SQLException an exception if an error happened + */ + public static void fill(Item item, ResultSet resultSet) throws SQLException { + item.fill(resultSet.getLong("id"), resultSet.getInt("order_id"), resultSet.getInt("user_id"), resultSet.getInt("room_id"), + resultSet.getInt("definition_id"), resultSet.getInt("x"), resultSet.getInt("y"), + resultSet.getDouble("z"), resultSet.getInt("rotation"), resultSet.getString("wall_position"), + resultSet.getString("custom_data"), resultSet.getBoolean("is_hidden"), resultSet.getBoolean("is_trading"), + resultSet.getLong("expire_time"), resultSet.getTime("created_at").getTime() / 1000L); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/JukeboxDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/JukeboxDao.java new file mode 100644 index 0000000..86ee747 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/JukeboxDao.java @@ -0,0 +1,163 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.game.song.jukebox.BurnedDisk; +import org.alexdev.havana.util.DateUtil; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class JukeboxDao { + public static void addDisk(long itemId, int slotId, int songId) throws SQLException { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO soundmachine_disks (item_id, slot_id, song_id, burned_at) VALUES (?, ?, ?, ?)", sqlConnection); + preparedStatement.setLong(1, itemId); + preparedStatement.setInt(2, slotId); + preparedStatement.setInt(3, songId); + preparedStatement.setLong(4, DateUtil.getCurrentTimeSeconds()); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + throw e; + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void editDisk(long itemId, long songMachineId, int slotId) throws SQLException { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE soundmachine_disks SET soundmachine_id = ?, slot_id = ? WHERE item_id = ?", sqlConnection); + preparedStatement.setLong(1, songMachineId); + preparedStatement.setInt(2, slotId); + preparedStatement.setLong(3, itemId); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + throw e; + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static List getDisks(long soundmachineId) { + List disks = new ArrayList(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM soundmachine_disks WHERE soundmachine_id = ?", sqlConnection); + preparedStatement.setLong(1, soundmachineId); + + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + disks.add(new BurnedDisk(resultSet.getLong("item_id"), resultSet.getInt("soundmachine_id"), resultSet.getInt("slot_id"), + resultSet.getInt("song_id"), resultSet.getLong("burned_at"))); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return disks; + } + + public static BurnedDisk getDisk(long soundmachineId, int songId) { + BurnedDisk disk = null; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM soundmachine_disks WHERE slot_id = ? AND soundmachine_id = ?", sqlConnection); + preparedStatement.setInt(1, songId); + preparedStatement.setLong(2, soundmachineId); + + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + disk = new BurnedDisk(resultSet.getLong("item_id"), resultSet.getInt("soundmachine_id"), resultSet.getInt("slot_id"), + resultSet.getInt("song_id"), resultSet.getLong("burned_at")); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return disk; + } + + public static int getSongIdByItem(long itemId) { + int songId = -1; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM soundmachine_disks WHERE item_id = ?", sqlConnection); + preparedStatement.setLong(1, itemId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + songId = resultSet.getInt("song_id"); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return songId; + } + + public static void setBurned(int songId, boolean burnedState) throws SQLException { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE soundmachine_songs SET burnt = ? WHERE id = ?", sqlConnection); + preparedStatement.setInt(1, burnedState ? 1 : 0); + preparedStatement.setInt(2, songId); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + throw e; + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/LogDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/LogDao.java new file mode 100644 index 0000000..99a2757 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/LogDao.java @@ -0,0 +1,69 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.dao.Storage; + +import java.sql.Connection; +import java.sql.PreparedStatement; + +public class LogDao { + // DELETE FROM users_ip_logs WHERE UNIX_TIMESTAMP(created_at) < (UNIX_TIMESTAMP() - 10); + // DELETE FROM users_ip_logs WHERE UNIX_TIMESTAMP(created_at) < (UNIX_TIMESTAMP() - 10); + + // Delete rows more than 1 month old + // DELETE FROM users_transactions WHERE UNIX_TIMESTAMP(created_at) < (UNIX_TIMESTAMP() - 2678400) + + public static void deleteTradeLogs(int interval) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM users_transactions WHERE UNIX_TIMESTAMP(created_at) < (UNIX_TIMESTAMP() - ?)", sqlConnection); + preparedStatement.setInt(1, interval); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void deleteIpAddressLogs(int interval) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM users_ip_logs WHERE UNIX_TIMESTAMP(created_at) < (UNIX_TIMESTAMP() - ?)", sqlConnection); + preparedStatement.setInt(1, interval); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void deleteChatLogs(int interval) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM room_chatlogs WHERE timestamp < (UNIX_TIMESTAMP() - ?)", sqlConnection); + preparedStatement.setInt(1, interval); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/MessengerDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/MessengerDao.java new file mode 100644 index 0000000..6f5a297 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/MessengerDao.java @@ -0,0 +1,624 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.game.messenger.MessengerCategory; +import org.alexdev.havana.game.messenger.MessengerMessage; +import org.alexdev.havana.game.messenger.MessengerUser; +import org.alexdev.havana.util.DateUtil; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MessengerDao { + + /** + * Gets the friends. + * + * @param userId the user id + * @return the friends + */ + public static Map getFriends(int userId) { + Map friends = new HashMap<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT id,username,figure,motto,last_online,sex,allow_stalking,is_online,category_id,online_status_visible FROM messenger_friends INNER JOIN users ON messenger_friends.from_id = users.id WHERE to_id = ?", sqlConnection); + preparedStatement.setInt(1, userId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + int resultUserId = resultSet.getInt("id"); + friends.put(resultUserId, new MessengerUser(resultUserId, resultSet.getString("username"), resultSet.getString("figure"), + resultSet.getString("sex"), resultSet.getString("motto"), resultSet.getTime("last_online").getTime() / 1000L, + resultSet.getBoolean("allow_stalking"), resultSet.getInt("category_id"), + resultSet.getBoolean("is_online"), resultSet.getBoolean("online_status_visible"))); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return friends; + } + + public static Map getFriendsPage(int userId, int range, int pageSize) { + Map friends = new HashMap<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT id,username,figure,motto,last_online,sex,allow_stalking,is_online,category_id,online_status_visible FROM messenger_friends INNER JOIN users ON messenger_friends.from_id = users.id WHERE to_id = ? LIMIT " + (range * pageSize) + "," + ((range * pageSize) + pageSize), sqlConnection); + preparedStatement.setInt(1, userId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + int resultUserId = resultSet.getInt("id"); + friends.put(resultUserId, new MessengerUser(resultUserId, resultSet.getString("username"), resultSet.getString("figure"), + resultSet.getString("sex"), resultSet.getString("motto"), resultSet.getTime("last_online").getTime() / 1000L, + resultSet.getBoolean("allow_stalking"), resultSet.getInt("category_id"), + resultSet.getBoolean("is_online"), resultSet.getBoolean("online_status_visible"))); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return friends; + } + + public static int getFriendsCount(int userId) { + int count = 0; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT COUNT(*) FROM messenger_friends INNER JOIN users ON messenger_friends.from_id = users.id WHERE to_id = ?", sqlConnection); + preparedStatement.setInt(1, userId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + count = resultSet.getInt(1); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return count; + } + + /** + * Gets the requests. + * + * @param userId the user id + * @return the requests + */ + public static Map getRequests(int userId) { + Map users = new HashMap<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT from_id,username,figure,sex,motto,last_online,allow_stalking,is_online,online_status_visible FROM messenger_requests INNER JOIN users ON messenger_requests.from_id = users.id WHERE to_id = " + userId, sqlConnection); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + int fromId = resultSet.getInt("from_id"); + users.put(fromId, new MessengerUser(fromId, resultSet.getString("username"), resultSet.getString("figure"), + resultSet.getString("sex"), resultSet.getString("motto"), resultSet.getTime("last_online").getTime() / 1000L, + resultSet.getBoolean("allow_stalking"), 0, + resultSet.getBoolean("is_online"), resultSet.getBoolean("online_status_visible"))); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return users; + } + + /** + * Search. + * + * @param query the query + * @return the list + */ + public static List search(String query) { + List userList = new ArrayList<>(); + int userId = -1; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + + preparedStatement = Storage.getStorage().prepare("SELECT id FROM users WHERE LOWER(username) LIKE ? LIMIT 30", sqlConnection); + preparedStatement.setString(1, query + "%"); + + /* preparedStatement = Storage.getStorage().prepare("SELECT id FROM users WHERE LOWER(username) LIKE ? ORDER BY (username = ?) DESC, length(username) LIMIT 30", sqlConnection); + preparedStatement.setString(1, query + "%"); + preparedStatement.setString(2, query);*/ + + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + userList.add(resultSet.getInt("id")); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return userList; + } + + /** + * New request. + * + * @param fromId the from id + * @param toId the to id + */ + public static void newRequest(int fromId, int toId) { + if (toId == fromId) { + return; + } + + if (requestExists(fromId, toId)) { + return; + } + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO messenger_requests (to_id, from_id) VALUES (?, ?)", sqlConnection); + preparedStatement.setInt(1, toId); + preparedStatement.setInt(2, fromId); + preparedStatement.execute(); + } catch (SQLException ex) { + Storage.logError(ex); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + /** + * Get if the request exists. + * + * @param fromId the from id + * @param toId the to id + * + * @return true, if successful + */ + public static boolean requestExists(int fromId, int toId) { + boolean exists = false; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM messenger_requests WHERE from_id = ? AND to_id = ?", sqlConnection); + preparedStatement.setInt(1, fromId); + preparedStatement.setInt(2, toId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + exists = true; + } + + } catch (Exception ex) { + Storage.logError(ex); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return exists; + } + + /** + * Get if friend exists. + * + * @param fromId the from id + * @param toId the to id + * + * @return true, if successful + */ + public static boolean friendExists(int fromId, int toId) { + boolean exists = false; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM messenger_friends WHERE from_id = ? AND to_id = ?", sqlConnection); + preparedStatement.setInt(1, fromId); + preparedStatement.setInt(2, toId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + exists = true; + } + + } catch (Exception ex) { + Storage.logError(ex); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return exists; + } + + /** + * Removes the request. + * + * @param fromId the from id + * @param toId the to id + */ + public static void removeRequest(int fromId, int toId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM messenger_requests WHERE from_id = ? AND to_id = ?", sqlConnection); + preparedStatement.setInt(1, fromId); + preparedStatement.setInt(2, toId); + preparedStatement.execute(); + + preparedStatement = Storage.getStorage().prepare("DELETE FROM messenger_requests WHERE from_id = ? AND to_id = ?", sqlConnection); + preparedStatement.setInt(1, toId); + preparedStatement.setInt(2, fromId); + preparedStatement.execute(); + + } catch (SQLException ex) { + Storage.logError(ex); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void removeAllRequests(int toId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM messenger_requests WHERE to_id = ?", sqlConnection); + preparedStatement.setInt(1, toId); + preparedStatement.execute(); + + } catch (SQLException ex) { + Storage.logError(ex); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + /** + * Removes the friend. + * + * @param toId the friend id + * @param fromId the user id + */ + public static void removeFriend(int toId, int fromId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM messenger_friends WHERE from_id = ? AND to_id = ?", sqlConnection); + preparedStatement.setInt(1, fromId); + preparedStatement.setInt(2, toId); + preparedStatement.execute(); + + } catch (SQLException ex) { + Storage.logError(ex); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + /** + * New friend. + * + * @param fromId the sender + * @param toId the receiver + */ + public static void newFriend(int toId, int fromId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO messenger_friends (from_id, to_id) VALUES (?, ?)", sqlConnection); + preparedStatement.setInt(1, fromId); + preparedStatement.setInt(2, toId); + preparedStatement.execute(); + + } catch (SQLException ex) { + Storage.logError(ex); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + /** + * Removes the friend. + * + * @param userId the friend id + * @param friendId the user id + */ + public static void updateFriendCategory(int userId, int friendId, int categoryId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE messenger_friends SET category_id = ? WHERE from_id = ? AND to_id = ?", sqlConnection); + preparedStatement.setInt(1, categoryId); + preparedStatement.setInt(2, friendId); + preparedStatement.setInt(3, userId); + preparedStatement.execute(); + + } catch (SQLException ex) { + Storage.logError(ex); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + /** + * Removes the category from friends after it had been deleted + * + * @param userId the friend id + * @param categoryId the category + */ + public static void resetFriendCategories(int userId, int categoryId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE messenger_friends SET category_id = 0 WHERE to_id = ? AND category_id = ?", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, categoryId); + preparedStatement.execute(); + + } catch (SQLException ex) { + Storage.logError(ex); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + + /** + * Create a message for other people to read them later, if they're offline. + * + * @param fromId the id the user sending the message + * @param toId the id of the user to receive it + * @param message the body of the message + * @return the id of the message + */ + public static int newMessage(int fromId, int toId, String message) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + int messageID = 0; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO messenger_messages (receiver_id, sender_id, unread, body, date) VALUES (?, ?, ?, ?, ?)", sqlConnection); + preparedStatement.setInt(1, toId); + preparedStatement.setInt(2, fromId); + preparedStatement.setInt(3, 1); + preparedStatement.setString(4, message); + preparedStatement.setLong(5, DateUtil.getCurrentTimeSeconds()); + preparedStatement.executeUpdate(); + + ResultSet row = preparedStatement.getGeneratedKeys(); + + if (row != null && row.next()) { + messageID = row.getInt(1); + } + + } catch (SQLException e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return messageID; + } + + /** + * Get unread messages for the user. + * + * @param userId the id of the user to get the offline messages for + * @return the list of messages + */ + public static Map getUnreadMessages(int userId) { + Map messages = new HashMap<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM messenger_messages WHERE receiver_id = " + userId + " AND unread = 1", sqlConnection); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + messages.put(resultSet.getInt("id"), new MessengerMessage( + resultSet.getInt("id"), resultSet.getInt("receiver_id"), resultSet.getInt("sender_id"), + resultSet.getLong("date"), resultSet.getString("body"))); + + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return messages; + } + + /** + * Mark a message as read. + * + * @param messageId the message id to reset + */ + public static void markMessageRead(int messageId) throws SQLException { + Storage.getStorage().execute("UPDATE messenger_messages SET unread = 0 WHERE id = " + messageId); + } + + public static List getCategories(int userId) { + var categories = new ArrayList(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM messenger_categories WHERE user_id = " + userId, sqlConnection); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + categories.add(new MessengerCategory(resultSet.getInt("id"), resultSet.getInt("user_id"), resultSet.getString("name"))); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return categories; + } + + public static void deleteCategory(int categoryId, int userId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM messenger_categories WHERE id = ? AND user_id = ?", sqlConnection); + preparedStatement.setInt(1, categoryId); + preparedStatement.setInt(2, userId); + preparedStatement.execute(); + + } catch (SQLException ex) { + Storage.logError(ex); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void addCategory(String name, int userId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO messenger_categories (user_id, name) VALUES (?, ?)", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setString(2, name); + preparedStatement.execute(); + + } catch (SQLException ex) { + Storage.logError(ex); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void updateCategory(String name, int categoryId, int userId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE messenger_categories SET name = ? WHERE id = ? AND user_id = ?", sqlConnection); + preparedStatement.setString(1, name); + preparedStatement.setInt(2, categoryId); + preparedStatement.setInt(3, userId); + preparedStatement.execute(); + + } catch (SQLException ex) { + Storage.logError(ex); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/ModerationDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/ModerationDao.java new file mode 100644 index 0000000..9af36f3 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/ModerationDao.java @@ -0,0 +1,31 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.game.moderation.ModerationActionType; + +import java.sql.Connection; +import java.sql.PreparedStatement; + +public class ModerationDao { + public static void addLog(ModerationActionType type, int userId, int targetId, String message, String extraNotes) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO housekeeping_audit_log (action, user_id, target_id, message, extra_notes) VALUES (?, ?, ?, ?, ?)", sqlConnection); + preparedStatement.setString(1, type.name().toLowerCase()); + preparedStatement.setInt(2, targetId); + preparedStatement.setInt(3, userId); + preparedStatement.setString(4, message); + preparedStatement.setString(5, extraNotes); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/MoodlightDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/MoodlightDao.java new file mode 100644 index 0000000..8f34fcb --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/MoodlightDao.java @@ -0,0 +1,147 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.dao.Storage; +import org.apache.commons.lang3.tuple.Pair; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.ArrayList; +import java.util.List; + +public class MoodlightDao { + + /** + * Get if there's a preset row for the moodlight. + */ + public static boolean containsPreset(long itemId) { + boolean hasPreset = false; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT item_id FROM items_moodlight_presets WHERE item_id = ?", sqlConnection); + preparedStatement.setLong(1, itemId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + hasPreset = true; + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return hasPreset; + } + + public static boolean createPresets(long itemId) { + boolean hasPreset = false; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO items_moodlight_presets (item_id) VALUES (?)", sqlConnection); + preparedStatement.setLong(1, itemId); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return hasPreset; + } + + public static boolean updatePresets(long itemId, int currentPreset, List presetData) { + boolean hasPreset = false; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE items_moodlight_presets SET current_preset = ?, preset_1 = ?, preset_2 = ?, preset_3 = ? WHERE item_id = ?", sqlConnection); + preparedStatement.setInt(1, currentPreset); + preparedStatement.setString(2, presetData.get(0)); + preparedStatement.setString(3, presetData.get(1)); + preparedStatement.setString(4, presetData.get(2)); + preparedStatement.setLong(5, itemId); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return hasPreset; + } + + public static boolean deletePresets(long itemId) { + boolean hasPreset = false; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM items_moodlight_presets WHERE item_id = ?", sqlConnection); + preparedStatement.setLong(1, itemId); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return hasPreset; + } + + public static Pair> getPresets(long itemId) { + Pair> presetData = null; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM items_moodlight_presets WHERE item_id = ? LIMIT 1", sqlConnection); + preparedStatement.setLong(1, itemId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + ArrayList presets = new ArrayList<>(); + presets.add(resultSet.getString("preset_1")); + presets.add(resultSet.getString("preset_2")); + presets.add(resultSet.getString("preset_3")); + + presetData = Pair.of(resultSet.getInt("current_preset"), presets); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(resultSet); + } + + return presetData; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/NavigatorDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/NavigatorDao.java new file mode 100644 index 0000000..c4b7b06 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/NavigatorDao.java @@ -0,0 +1,359 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.game.navigator.NavigatorCategory; +import org.alexdev.havana.game.navigator.NavigatorStyle; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.game.room.Room; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.*; + +public class NavigatorDao { + + /** + * Get all categories from the database. + * + * @return map of categories + */ + public static HashMap getCategories() { + HashMap categories = new HashMap<>(); + + Connection conn = null; + PreparedStatement stmt = null; + ResultSet row = null; + + try { + conn = Storage.getStorage().getConnection(); + stmt = Storage.getStorage().prepare("SELECT * FROM rooms_categories ORDER BY order_id ASC ", conn); + row = stmt.executeQuery(); + + while (row.next()) { + NavigatorCategory category = new NavigatorCategory( + row.getInt("id"), row.getInt("parent_id"), row.getInt("order_id"), + row.getString("name"), + row.getBoolean("public_spaces"), row.getBoolean("allow_trading"), + PlayerRank.getRankForId(row.getInt("minrole_access")), + PlayerRank.getRankForId(row.getInt("minrole_setflatcat")), + row.getBoolean("isnode"), row.getBoolean("club_only")); + + categories.put(category.getId(), category); + } + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(row); + Storage.closeSilently(stmt); + Storage.closeSilently(conn); + } + + return categories; + } + + /** + * Get the list of recent rooms from database set by limit and category id. + * + * @param limit the maximum amount of usrs + * @param categoryId the rooms to find under this category id + * @return the list of recent rooms + */ + public static List getRecentRooms(int limit, int categoryId) { + List rooms = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM rooms LEFT JOIN users ON rooms.owner_id = users.id WHERE category = ? AND owner_id > 0 ORDER BY visitors_now DESC, rooms.rating DESC LIMIT ? ", sqlConnection); + preparedStatement.setInt(1, categoryId); + preparedStatement.setInt(2, limit); + resultSet = preparedStatement.executeQuery(); + + //public NavigatorCategory(int id, String name, boolean publicSpaces, boolean allowTrading, int minimumRoleAccess, int minimumRoleSetFlat) { + while (resultSet.next()) { + Room room = new Room(); + RoomDao.fill(room.getData(), resultSet); + rooms.add(room); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return rooms; + } + + /** + * Count recent rooms by category id. + * + * @param limit the limit to count + * @return the list of recent rooms + */ + public static Map getPopularCategories(int limit) { + Map categories = new LinkedHashMap<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT c.id AS id, c.name AS name, IFNULL((SELECT SUM(rooms.visitors_now) FROM rooms WHERE rooms.category = c.id), 0) AS room_visitors FROM rooms_categories c WHERE c.isnode = 0 AND c.public_spaces = 0 AND c.minrole_access = 1 AND id <> 2 ORDER BY room_visitors DESC LIMIT ?", sqlConnection); + // preparedStatement.setInt(1, categoryId); + preparedStatement.setInt(1, limit); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + categories.put(resultSet.getInt("id"), resultSet.getInt("room_visitors")); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return categories; + } + + + /** + * Get the list of recent rooms by category id. + * + * @param categoryId the rooms to find under this category id + * @return the list of recent rooms + */ + public static List getRoomsByCategory(int categoryId) { + List rooms = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM rooms LEFT JOIN users ON rooms.owner_id = users.id WHERE category = ? ORDER BY visitors_now DESC, rooms.rating DESC", sqlConnection); + preparedStatement.setInt(1, categoryId); + resultSet = preparedStatement.executeQuery(); + + //public NavigatorCategory(int id, String name, boolean publicSpaces, boolean allowTrading, int minimumRoleAccess, int minimumRoleSetFlat) { + while (resultSet.next()) { + Room room = new Room(); + RoomDao.fill(room.getData(), resultSet); + rooms.add(room); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return rooms; + } + + /** + * Get the list of most popular rooms from database set by limit + * + * @param limit the maximum amount of usrs + * @return the list of recent rooms + */ + public static List getRopularRooms(int limit, boolean includePublicRooms) { + List rooms = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + String excludePublicRooms = " owner_id > 0 AND"; + + if (includePublicRooms) { + excludePublicRooms = ""; + } + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM rooms LEFT JOIN users ON rooms.owner_id = users.id WHERE" + excludePublicRooms + " visitors_now > 0 ORDER BY visitors_now DESC, rooms.rating DESC LIMIT ? ", sqlConnection); + + preparedStatement.setInt(1, limit); + resultSet = preparedStatement.executeQuery(); + + //public NavigatorCategory(int id, String name, boolean publicSpaces, boolean allowTrading, int minimumRoleAccess, int minimumRoleSetFlat) { + while (resultSet.next()) { + Room room = new Room(); + RoomDao.fill(room.getData(), resultSet); + rooms.add(room); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return rooms; + } + + public static int createRoom(int ownerId, String roomName, String roomModel, boolean roomShowName, int accessType) throws SQLException { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + int roomId = 0; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO rooms (owner_id, name, description, model, showname, password, accesstype) VALUES (?,?,?,?,?, '', ?)", sqlConnection); + preparedStatement.setInt(1, ownerId); + preparedStatement.setString(2, roomName); + preparedStatement.setString(3, ""); + preparedStatement.setString(4, roomModel); + preparedStatement.setBoolean(5, roomShowName); + preparedStatement.setInt(6, accessType); + preparedStatement.executeUpdate(); + resultSet = preparedStatement.getGeneratedKeys(); + + if (resultSet.next()) { + roomId = resultSet.getInt(1); + } + } catch (SQLException e) { + Storage.logError(e); + throw e; + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return roomId; + } + + public static int getRoomCountByCategory(int categoryId) { + int size = 0; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT count(*) FROM rooms WHERE category = ?", sqlConnection); + preparedStatement.setInt(1, categoryId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + size = resultSet.getInt(1); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return size; + } + + /** + * Get the list of rooms owned by friends, sorted by visitors and then room score + * + * @param limit the maximum amount of rooms + * @param friendList the list of user ids + * @return the list of recent rooms + */ + public static List getFriendRooms(int limit, List friendList) { + List rooms = new ArrayList<>(); + + if (friendList.isEmpty()) { + return rooms; + } + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + String friendIds = "("; + friendIds += String.join(",", friendList); + friendIds += ")"; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM rooms INNER JOIN users ON rooms.owner_id = users.id WHERE owner_id IN " + friendIds + " ORDER BY visitors_now DESC, rooms.rating DESC LIMIT ? ", sqlConnection); + preparedStatement.setInt(1, limit); + resultSet = preparedStatement.executeQuery(); + + //public NavigatorCategory(int id, String name, boolean publicSpaces, boolean allowTrading, int minimumRoleAccess, int minimumRoleSetFlat) { + while (resultSet.next()) { + Room room = new Room(); + RoomDao.fill(room.getData(), resultSet); + rooms.add(room); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return rooms; + } + + public static List getRecentlyVisited(int limit, int userId) { + List rooms = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT rooms.*,users.username AS username FROM room_visits " + + "INNER JOIN rooms ON rooms.id = room_visits.room_id " + + "INNER JOIN users ON rooms.owner_id = users.id " + + "WHERE user_id = ? " + + "AND owner_id > 0 " + + "ORDER BY visited_at DESC " + + "LIMIT ? ", sqlConnection); + + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, limit); + resultSet = preparedStatement.executeQuery(); + + //public NavigatorCategory(int id, String name, boolean publicSpaces, boolean allowTrading, int minimumRoleAccess, int minimumRoleSetFlat) { + while (resultSet.next()) { + Room room = new Room(); + RoomDao.fill(room.getData(), resultSet); + rooms.add(room); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return rooms; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/PetDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/PetDao.java new file mode 100644 index 0000000..6b4a3c5 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/PetDao.java @@ -0,0 +1,124 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.game.navigator.NavigatorCategory; +import org.alexdev.havana.game.pets.PetDetails; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.util.DateUtil; +import org.apache.commons.lang3.tuple.Pair; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ThreadLocalRandom; + +public class PetDao { + public static void createPet(long databaseId, String name, String type, int race, String colour) throws SQLException { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO items_pets (item_id, name, type, race, colour, nature_positive, nature_negative, born, last_kip, last_eat, last_drink, last_playtoy, last_playuser) VALUES (?, ?, ? ,?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", sqlConnection); + preparedStatement.setLong(1, databaseId); + preparedStatement.setString(2, name); + preparedStatement.setString(3, type); + preparedStatement.setInt(4, race); + preparedStatement.setString(5, colour); + preparedStatement.setInt(6, ThreadLocalRandom.current().nextInt(0, 7)); + preparedStatement.setInt(7, ThreadLocalRandom.current().nextInt(0, 7)); + preparedStatement.setLong(8, DateUtil.getCurrentTimeSeconds()); + preparedStatement.setLong(9, DateUtil.getCurrentTimeSeconds()); + preparedStatement.setLong(10, DateUtil.getCurrentTimeSeconds()); + preparedStatement.setLong(11, DateUtil.getCurrentTimeSeconds()); + preparedStatement.setLong(12, DateUtil.getCurrentTimeSeconds()); + preparedStatement.setLong(13, DateUtil.getCurrentTimeSeconds()); + + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + throw e; + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void saveCoordinates(int id, int x, int y, int rotation) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE items_pets SET x = ?, y = ?, rotation = ? WHERE id = ?", sqlConnection); + preparedStatement.setInt(1, x); + preparedStatement.setInt(2, y); + preparedStatement.setInt(3, rotation); + preparedStatement.setInt(4, id); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void saveDetails(int id, PetDetails petDetails) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE items_pets SET last_kip = ?, last_eat = ?, last_drink = ?, last_playtoy = ?, last_playuser = ? WHERE id = ?", sqlConnection); + preparedStatement.setLong(1, petDetails.getLastKip()); + preparedStatement.setLong(2, petDetails.getLastEat()); + preparedStatement.setLong(3, petDetails.getLastDrink()); + preparedStatement.setLong(4, petDetails.getLastPlayToy()); + preparedStatement.setLong(5, petDetails.getLastPlayUser()); + preparedStatement.setInt(6, id); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static PetDetails getPetDetails(long itemId) { + PetDetails petDetails = null; + + Connection connection = null; + PreparedStatement preparedStatement = null; + ResultSet row = null; + + try { + connection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM items_pets WHERE item_id = ?", connection); + preparedStatement.setLong(1, itemId); + row = preparedStatement.executeQuery(); + + while (row.next()) { + petDetails = new PetDetails(row.getInt("id"), row.getLong("item_id"), row.getString("name"), + row.getString("type"), row.getString("race"), row.getString("colour"), row.getInt("nature_positive"), + row.getInt("nature_negative"), row.getFloat("friendship"), row.getLong("born"), row.getLong("last_kip"), + row.getLong("last_eat"), row.getLong("last_drink"), row.getLong("last_playtoy"), row.getLong("last_playuser"), + row.getInt("x"), row.getInt("y"), row.getInt("rotation")); + } + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(row); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(connection); + } + + return petDetails; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/PhotoDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/PhotoDao.java new file mode 100644 index 0000000..1f4ad6a --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/PhotoDao.java @@ -0,0 +1,84 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.game.item.Photo; + +import java.sql.*; + +public class PhotoDao { + public static void addPhoto(long photoId, int userId, long timestamp, byte[] photo, int checksum) throws SQLException { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO items_photos (photo_id, photo_user_id, timestamp, photo_data, photo_checksum) VALUES (?, ?, ?, ?, ?)", sqlConnection); + + Blob photoBlob = sqlConnection.createBlob(); + photoBlob.setBytes(1, photo); + + preparedStatement.setLong(1, photoId); + preparedStatement.setInt(2, userId); + preparedStatement.setLong(3, timestamp); + preparedStatement.setBlob(4, photoBlob); + preparedStatement.setInt(5, checksum); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + throw e; + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static Photo getPhoto(long photoId) throws SQLException { + Photo photo = null; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM items_photos WHERE photo_id = ? AND is_active = 1", sqlConnection);// (photo_id, photo_user_id, timestamp, photo_data, photo_checksum) VALUES (?, ?, ?, ?, ?)", sqlConnection); + preparedStatement.setLong(1, photoId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + Blob photoBlob = resultSet.getBlob("photo_data"); + int blobLength = (int) photoBlob.length(); + + byte[] photoBlobBytes = photoBlob.getBytes(1, blobLength); + photo = new Photo(photoId, resultSet.getInt("photo_checksum"), photoBlobBytes, resultSet.getLong("timestamp")); + } + + } catch (Exception e) { + Storage.logError(e); + throw e; + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(resultSet); + } + + return photo; + } + + public static void deleteItem(long photoId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE items_photos SET is_active = 0 WHERE photo_id = ?", sqlConnection); + preparedStatement.setLong(1, photoId); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/PlayerDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/PlayerDao.java new file mode 100644 index 0000000..6fc898d --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/PlayerDao.java @@ -0,0 +1,1052 @@ +package org.alexdev.havana.dao.mysql; + +import com.goterl.lazysodium.LazySodiumJava; +import com.goterl.lazysodium.SodiumJava; +import com.goterl.lazysodium.interfaces.PwHash; +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.util.DateUtil; + +import java.nio.charset.StandardCharsets; +import java.sql.*; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; + +public class PlayerDao { + public static final LazySodiumJava LIB_SODIUM = new LazySodiumJava(new SodiumJava()); + private static String figureBlacklist1 = "hd-180-1.hr-100-61.ch-210-66.lg-270-82.sh-290-80"; + + public static void resetOnline() { + try { + Storage.getStorage().execute("UPDATE users SET is_online = 0 WHERE is_online = 1"); + } catch (SQLException e) { + Storage.logError(e); + } + } + public static int countIpAddress(String ipAddress) { + int count = 0; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + PlayerDetails details = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT COUNT(DISTINCT(user_id)) FROM users_ip_logs WHERE ip_address = ?", sqlConnection); + preparedStatement.setString(1, ipAddress); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + count = resultSet.getInt(1); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return count; + } + + /** + * Logs the IP address for a given user + * + * @param userId the user id to edit + * @param ipAddress the ip address + */ + public static void logIpAddress(int userId, String ipAddress) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO users_ip_logs (user_id, ip_address) VALUES (?, ?)", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setString(2, ipAddress); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + /** + * Gets the IP address at for a given user + * + * @param userId the user id to edit + */ + public static String getIpAddressAt(int userId, int position, int maxRows) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + List ipAddresses = new ArrayList<>(); + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT ip_address FROM users_ip_logs WHERE user_id = ? ORDER BY created_at DESC LIMIT ?", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(1, maxRows); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + ipAddresses.add(resultSet.getString("ip_address")); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + try { + return ipAddresses.get(position); + } catch (Exception ex) { + + } + + return null; + } + + /** + * Gets the IP addresses at for a given user + * + * @param userId the user id to edit + */ + public static List getIpAddresses(int userId, int maxRows) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + List ipAddresses = new ArrayList<>(); + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT DISTINCT(ip_address) FROM users_ip_logs WHERE user_id = ? ORDER BY created_at DESC LIMIT ?", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, maxRows); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + ipAddresses.add(resultSet.getString("ip_address")); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return ipAddresses; + } + + /** + * Gets the latest IP address for a given user + * + * @param userId the user id to edit + */ + public static String getLatestIp(int userId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + String ip = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT ip_address FROM users_ip_logs WHERE user_id = ? ORDER BY created_at DESC LIMIT 1", sqlConnection); + preparedStatement.setInt(1, userId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + ip = resultSet.getString("ip_address"); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return ip; + } + + /** + * Gets the list of random habbos. + * + * @param limit the limit of random habbos + * @return the details + */ + public static List getRandomHabbos(int limit) { + List habbos = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM users WHERE figure NOT IN ('" + figureBlacklist1 + "') AND UNIX_TIMESTAMP(last_online) > ? ORDER BY RAND() LIMIT ?", sqlConnection); + preparedStatement.setLong(1, DateUtil.getCurrentTimeSeconds() - TimeUnit.DAYS.toSeconds(30)); + preparedStatement.setInt(2, limit); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + PlayerDetails details = new PlayerDetails(); + fill(details, resultSet); + + habbos.add(details); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return habbos; + } + + /** + * Gets the details by user id + * + * @param userId the user id + * @return the details + */ + public static PlayerDetails getDetails(int userId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + PlayerDetails details = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM users WHERE id = ? LIMIT 1", sqlConnection); + preparedStatement.setInt(1, userId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + details = new PlayerDetails(); + fill(details, resultSet); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return details; + } + + /** + * Gets the details by username + * + * @param username the username + * @return the details + */ + public static PlayerDetails getDetails(String username) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + PlayerDetails details = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM users WHERE username = ? LIMIT 1", sqlConnection); + preparedStatement.setString(1, username); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + details = new PlayerDetails(); + fill(details, resultSet); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return details; + } + + /** + * Login with SSO ticket. + * + * @param player the player + * @param ssoTicket the sso ticket + * @return true, if successful + */ + public static boolean loginTicket(Player player, String ssoTicket) { + boolean success = false; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM users WHERE sso_ticket = ? LIMIT 1", sqlConnection); + preparedStatement.setString(1, ssoTicket); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + fill(player.getDetails(), resultSet); + success = true; + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return success; + } + + /** + * Login with SSO ticket. + * + * @param playerDetails the player details to fill + * @param username username + * @param password password + * @return true, if successful + */ + public static boolean login(PlayerDetails playerDetails, String username, String password) { + boolean success = false; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM users WHERE username = ? LIMIT 1", sqlConnection); + preparedStatement.setString(1, username); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + byte[] hashedPassword = (resultSet.getString("password") + '\0').getBytes(StandardCharsets.UTF_8); + byte[] pass = password.getBytes(StandardCharsets.UTF_8); + + success = ((PwHash.Native) LIB_SODIUM).cryptoPwHashStrVerify(hashedPassword, pass, pass.length); + + if (success) { + fill(playerDetails, resultSet); + } + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return success; + } + + /** + * Login with SSO ticket. + * + * @param userId the id of the player to set + * @param password password + * @return true, if successful + */ + public static void setPassword(int userId, String password) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE users SET password = ? WHERE id = ? LIMIT 1", sqlConnection); + preparedStatement.setString(1, password); + preparedStatement.setInt(2, userId); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void setEmail(int userId, String email) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE users SET email = ? WHERE id = ? LIMIT 1", sqlConnection); + preparedStatement.setString(1, email); + preparedStatement.setInt(2, userId); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + /** + * Reset SSO ticket + * Protects against replay attacks + * + * @param userId ID of user + */ + public static void resetSsoTicket(int userId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE users SET sso_ticket = ? WHERE id = ? LIMIT 1", sqlConnection); + preparedStatement.setNull(1, Types.VARCHAR); + preparedStatement.setInt(2, userId); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void resetSsoTickets() { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE users SET sso_ticket = ? WHERE sso_ticket IS NOT NULL", sqlConnection); + preparedStatement.setNull(1, Types.VARCHAR); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + /** + * Reset SSO ticket + * Protects against replay attacks + * + * @param userId ID of user + */ + public static void setTicket(int userId, String ticket) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE users SET sso_ticket = ? WHERE id = ? LIMIT 1", sqlConnection); + preparedStatement.setString(1, ticket); + preparedStatement.setInt(2, userId); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void setAuthToken(int userId, String authTicket, long updatedAt) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE users SET authentication_key = ?, authentication_key_date = ? WHERE id = ? LIMIT 1", sqlConnection); + preparedStatement.setString(1, authTicket); + preparedStatement.setLong(2, updatedAt); + preparedStatement.setInt(3, userId); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + /** + * Reset SSO ticket + * Protects against replay attacks + * + * @param userId ID of user + */ + public static void setMachineId(int userId, String uniqueId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE users SET machine_id = ? WHERE id = ? LIMIT 1", sqlConnection); + preparedStatement.setString(1, uniqueId); + preparedStatement.setInt(2, userId); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + /** + * Gets the id. + * + * @param username the username + * @return the id + */ + public static int getId(String username) { + int id = -1; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT id FROM users WHERE LOWER(username) = ? LIMIT 1", sqlConnection); + preparedStatement.setString(1, username.toLowerCase()); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + id = resultSet.getInt("id"); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return id; + } + + /** + * Gets the name. + * + * @param id the id + * @return the name + */ + public static String getName(int id) { + String name = null; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT username FROM users WHERE id = ? LIMIT 1", sqlConnection); + preparedStatement.setInt(1, id); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + name = resultSet.getString("username"); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return name; + } + + + public static String getMachineId(int userId) { + String machineId = ""; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT machine_id FROM users WHERE id = ? LIMIT 1", sqlConnection); + preparedStatement.setInt(1, userId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + machineId = resultSet.getString("machine_id"); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return machineId; + } + + public static int countMachineId(String machineId) { + int count = 0; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT COUNT(*) as users_matched FROM users WHERE machine_id = ? LIMIT 1", sqlConnection); + preparedStatement.setString(1, machineId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + count = resultSet.getInt("users_matched"); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return count; + } + + public static void saveLastOnline(int userId, long lastOnline, boolean isOnline) { + //long currentTime = DateUtil.getCurrentTimeSeconds(); + //details.setLastOnline(currentTime); + java.util.Date date = new Date(lastOnline * 1000L); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE users SET last_online = ?, is_online = ? WHERE id = ?", sqlConnection); + preparedStatement.setTimestamp(1, new java.sql.Timestamp(date.getTime())); + preparedStatement.setInt(2, isOnline ? 1 : 0); + preparedStatement.setInt(3, userId); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void saveSoundSetting(int userId, boolean soundSetting) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE users SET sound_enabled = ? WHERE id = ?", sqlConnection); + preparedStatement.setBoolean(1, soundSetting); + preparedStatement.setInt(2, userId); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void saveDetails(int userId, String figure, String poolFigure, String sex) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE users SET figure = ?, pool_figure = ?, sex = ? WHERE id = ?", sqlConnection); + preparedStatement.setString(1, figure); + preparedStatement.setString(2, poolFigure); + preparedStatement.setString(3, sex); + preparedStatement.setInt(4, userId); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void saveMotto(int userId, String motto) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE users SET motto = ? WHERE id = ?", sqlConnection); + preparedStatement.setString(1, motto); + preparedStatement.setInt(2, userId); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void saveCurrency(int userId, int credits, int pixels) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE users SET credits = ?, pixels = ? WHERE id = ?", sqlConnection); + preparedStatement.setInt(1, credits); + preparedStatement.setInt(2, pixels); + preparedStatement.setInt(3, userId); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void saveEmail(int userId, String email) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE users SET email = ? WHERE id = ?", sqlConnection); + preparedStatement.setString(1, email); + preparedStatement.setInt(2, userId); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + + public static void saveSelectedRoom(int userId, int selectedRoom) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE users SET selected_room_id = ? WHERE id = ?", sqlConnection); + preparedStatement.setInt(1, selectedRoom); + preparedStatement.setInt(2, userId); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void saveRespect(int userId, int dailyRespectPoints, int respectPoints, String respectDay, int respectGiven) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE users SET daily_respect_points = ?, respect_points = ?, respect_day = ?, respect_given = ? WHERE id = ?", sqlConnection); + preparedStatement.setInt(1, dailyRespectPoints); + preparedStatement.setInt(2, respectPoints); + preparedStatement.setString(3, respectDay); + preparedStatement.setInt(4, respectGiven); + preparedStatement.setInt(5, userId); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + /** + * Update details. + */ + public static void saveSubscription(int userId, long firstClubSubscription, long clubExpiration) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE users SET club_subscribed = ?, club_expiration = ? WHERE id = ?", sqlConnection); + preparedStatement.setLong(1, firstClubSubscription); + preparedStatement.setLong(2, clubExpiration); + preparedStatement.setInt(3, userId); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + /** + * Update xp. + * + * @param userId the id of the player to save + */ + public static void saveOnlineStatus(int userId, boolean onlineStatusVisible) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE users SET online_status_visible = ? WHERE id = ?", sqlConnection); + preparedStatement.setInt(1, onlineStatusVisible ? 1 : 0); + preparedStatement.setInt(2, userId); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + /** + * Save favourite group + * + * @param userId the id of the user to save to + * @param groupId the favourite group id + */ + public static void saveFavouriteGroup(int userId, int groupId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE users SET favourite_group = ? WHERE id = ?", sqlConnection); + preparedStatement.setInt(1, groupId); + preparedStatement.setInt(2, userId); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + /** + * Gets the home room of user. + * + * @param id the user id + * @return the home room id + */ + public static int getHomeRoom(int id) { + int roomId = 0; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT home_room FROM users WHERE id = ? LIMIT 1", sqlConnection); + preparedStatement.setInt(1, id); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + roomId = resultSet.getInt("home_room"); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return roomId; + } + + /** + * Save favourite group + * + * @param userId the id of the user to save to + * @param roomId the room id of the users home + */ + public static void saveHomeRoom(int userId, int roomId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE users SET home_room = ? WHERE id = ?", sqlConnection); + preparedStatement.setInt(1, roomId); + preparedStatement.setInt(2, userId); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static boolean isPlayerOnline(int userId) { + boolean isOnline = false; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT is_online FROM users WHERE id = ? LIMIT 1", sqlConnection); + preparedStatement.setInt(1, userId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + isOnline = resultSet.getBoolean("is_online"); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return isOnline; + } + + public static int getByEmail(String email) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + int id = -1; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM users WHERE email = ? LIMIT 1", sqlConnection); + preparedStatement.setString(1, email); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + id = resultSet.getInt("id"); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return id; + } + + /** + * Fill player data + * + * @param details the details + * @param row the row + * @throws SQLException the SQL exception + */ + public static void fill(PlayerDetails details, ResultSet row) throws SQLException { + // public void fill(int id, String username, String password, String figure, String poolFigure, int credits, String motto, String consoleMotto, String sex, + // int tickets, int film, int rank, long lastOnline, long clubSubscribed, long clubExpiration, String badge, String badgeActive) { + if (details == null) { + return; + } + + details.fill(row.getInt("id"), row.getString("username"), row.getString("figure"), + row.getString("pool_figure"), row.getInt("pixels"), row.getInt("credits"), + row.getString("email"), row.getString("motto"), row.getString("sex"), + row.getString("sso_ticket"), row.getInt("tickets"), row.getInt("film"), + row.getInt("rank"), row.getTime("last_online").getTime() / 1000L, row.getTime("created_at").getTime() / 1000L, + row.getString("machine_id"), row.getLong("club_subscribed"), row.getLong("club_expiration"), + row.getBoolean("allow_stalking"), row.getInt("selected_room_id"), row.getBoolean("allow_friend_requests"), + row.getBoolean("online_status_visible"), row.getBoolean("profile_visible"), row.getBoolean("wordfilter_enabled"), + row.getBoolean("trade_enabled"), row.getBoolean("sound_enabled"), row.getBoolean("daily_coins_enabled"), + row.getInt("daily_respect_points"), row.getString("respect_day"), + row.getInt("respect_points"), row.getInt("respect_given"), row.getBoolean("is_online"), + row.getLong("totem_effect_expiry"), row.getLong("trade_ban_expiration"), row.getInt("favourite_group"), + row.getString("created_at")); + } + + public static String createPassword(String password) throws Exception { + byte[] pw = password.getBytes(); + byte[] outputHash = new byte[PwHash.STR_BYTES]; + PwHash.Native pwHash = (PwHash.Native) PlayerDao.LIB_SODIUM; + boolean success = pwHash.cryptoPwHashStr( + outputHash, + pw, + pw.length, + PwHash.OPSLIMIT_INTERACTIVE, + PwHash.MEMLIMIT_INTERACTIVE + ); + + if (!success) { + throw new Exception("Password creation was a failure!"); + } + + return new String(outputHash).replace((char)0 + "", ""); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/PlayerStatisticsDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/PlayerStatisticsDao.java new file mode 100644 index 0000000..bceb188 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/PlayerStatisticsDao.java @@ -0,0 +1,231 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.game.player.statistics.PlayerStatistic; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.Timestamp; +import java.util.HashMap; +import java.util.Map; + +public class PlayerStatisticsDao { + public static void updateStatistic(int userId, PlayerStatistic statistic, String value) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE users_statistics SET " + statistic.getColumn() + " = ? WHERE user_id = ?", sqlConnection); + + if (statistic.isDateTime()) { + preparedStatement.setTimestamp(1, new Timestamp(Long.parseLong(value) * 1000L)); + } else { + preparedStatement.setString(1, value); + } + + preparedStatement.setInt(2, userId); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void updateStatistic(int userId, PlayerStatistic statistic, int value) { + updateStatistic(userId, statistic, String.valueOf(value)); + } + + public static void updateStatistic(int userId, PlayerStatistic statistic, long value) { + updateStatistic(userId, statistic, String.valueOf(value)); + } + + + public static void incrementStatistic(int userId, PlayerStatistic statistic, long value) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE users_statistics SET " + statistic.getColumn() + " = " + statistic.getColumn() + " + ? WHERE user_id = ?", sqlConnection); + preparedStatement.setLong(1, value); + preparedStatement.setInt(2, userId); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void updateStatistics(int userId, HashMap statisticMap) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + + for (var kvp : statisticMap.entrySet()) { + var statistic = kvp.getKey(); + var value = kvp.getValue(); + preparedStatement = Storage.getStorage().prepare("UPDATE users_statistics SET " + statistic.getColumn() + " = ? WHERE user_id = ?", sqlConnection); + + if (statistic.isDateTime()) { + preparedStatement.setTimestamp(5, new Timestamp(Long.parseLong(value) * 1000L)); + } else { + preparedStatement.setString(1, value); + } + + preparedStatement.setInt(2, userId); + preparedStatement.execute(); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void incrementStatistics(int userId, HashMap statisticMap) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + + for (var kvp : statisticMap.entrySet()) { + var statistic = kvp.getKey(); + long value = kvp.getValue(); + preparedStatement = Storage.getStorage().prepare("UPDATE users_statistics SET " + statistic.getColumn() + " = " + statistic.getColumn() + " + ? WHERE user_id = ?", sqlConnection); + preparedStatement.setLong(1, value); + preparedStatement.setInt(2, userId); + preparedStatement.execute(); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static long getStatisticLong(int userId, PlayerStatistic playerStatistic) { + long setting = 0; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT " + playerStatistic.getColumn() + " FROM users_statistics WHERE user_id = ?", sqlConnection); + preparedStatement.setInt(1, userId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + setting = resultSet.getInt(playerStatistic.getColumn()); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return setting; + } + + public static String getStatisticString(int userId, PlayerStatistic playerStatistic) { + String setting = null; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT " + playerStatistic.getColumn() + " FROM users_statistics WHERE user_id = ?", sqlConnection); + preparedStatement.setInt(1, userId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + setting = resultSet.getString(playerStatistic.getColumn()); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return setting; + } + + public static Map getStatistics(int userId) { + Map values = new HashMap<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM users_statistics WHERE user_id = ?", sqlConnection); + preparedStatement.setLong(1, userId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + for (PlayerStatistic playerStatistic : PlayerStatistic.values()) { + if (playerStatistic.isDateTime()) { + if (resultSet.getTime(playerStatistic.getColumn()) != null) { + values.put(playerStatistic, String.valueOf(resultSet.getTime(playerStatistic.getColumn()).getTime() / 1000L)); + } else { + values.put(playerStatistic, null); + } + } else { + values.put(playerStatistic, resultSet.getString(playerStatistic.getColumn())); + } + } + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return values; + } + + public static void newStatistics(int userId, String activationCode) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO users_statistics (user_id, activation_code) VALUES (?, ?)", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setString(2, activationCode); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/PublicRoomsDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/PublicRoomsDao.java new file mode 100644 index 0000000..9b6ca59 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/PublicRoomsDao.java @@ -0,0 +1,80 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.game.item.publicrooms.PublicItemData; +import org.alexdev.havana.game.room.handlers.walkways.WalkwaysEntrance; +import org.alexdev.havana.game.room.handlers.walkways.WalkwaysManager; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.*; + +public class PublicRoomsDao { + /** + * Get the item definitions. + * + * @return the list of item definitions + */ + public static List getPublicItemData(String roomModel) { + List itemDataList = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM public_items WHERE room_model = ?", sqlConnection); + preparedStatement.setString(1, roomModel); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + PublicItemData itemData = new PublicItemData(resultSet.getString("id"), resultSet.getString("room_model"), + resultSet.getString("sprite"), resultSet.getInt("x"), resultSet.getInt("y"), + resultSet.getDouble("z"), resultSet.getInt("rotation"), resultSet.getDouble("top_height"), + resultSet.getInt("length"), resultSet.getInt("width"), resultSet.getString("behaviour"), + resultSet.getString("current_program"), resultSet.getString("teleport_to"), resultSet.getString("swim_to")); + + itemDataList.add(itemData); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return itemDataList; + } + + public static List getWalkways() { + List walkwaysEntrances = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM public_roomwalkways", sqlConnection); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + walkwaysEntrances.add(WalkwaysManager.createWalkway(resultSet.getInt("room_id"), resultSet.getInt("to_id"), resultSet.getString("coords_map"), + resultSet.getString("door_position"))); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return walkwaysEntrances; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/ReferredDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/ReferredDao.java new file mode 100644 index 0000000..1384325 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/ReferredDao.java @@ -0,0 +1,57 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.dao.Storage; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +public class ReferredDao { + public static int countReferred(int id) { + int count = 0; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT COUNT(*) FROM users_referred WHERE user_id = ?", sqlConnection); + preparedStatement.setInt(1, id); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + count = resultSet.getInt(1); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return count; + } + + public static void addReferred(int userId, int referredId) throws SQLException { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO users_referred (user_id, referred_id) VALUES (?, ?)", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, referredId); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + throw e; + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/RoomBanDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/RoomBanDao.java new file mode 100644 index 0000000..31f5c9a --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/RoomBanDao.java @@ -0,0 +1,65 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.util.DateUtil; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +public class RoomBanDao { + public static void addBan(int userId, int roomId, long expireTime) throws SQLException { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM rooms_bans WHERE user_id = ? AND room_id = ?", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, roomId); + + preparedStatement = Storage.getStorage().prepare("INSERT INTO rooms_bans (user_id, room_id, expire_at) VALUES (?, ?, ?)", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, roomId); + preparedStatement.setLong(3, expireTime); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + throw e; + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static boolean hasBan(int userId, int roomId) { + boolean hasBan = false; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT user_id FROM rooms_bans WHERE user_id = ? AND room_id = ? AND expire_at > ? LIMIT 1", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, roomId); + preparedStatement.setLong(3, DateUtil.getCurrentTimeSeconds()); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + hasBan = true; + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return hasBan; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/RoomDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/RoomDao.java new file mode 100644 index 0000000..acc2060 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/RoomDao.java @@ -0,0 +1,532 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.game.moderation.ChatMessage; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.RoomData; +import org.alexdev.havana.messages.outgoing.rooms.user.CHAT_MESSAGE; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +public class RoomDao { + public static final int FLASH_SEARCH_LIMIT = 100; + public static final int SHOCKWAVE_SEARCH_LIMIT = 100; + + public static void resetVisitors() { + try { + Storage.getStorage().execute("UPDATE rooms SET visitors_now = 0 WHERE visitors_now > 0"); + } catch (SQLException e) { + Storage.logError(e); + } + } + + /** + * Get a list of rooms by the owner id, use "0" for public rooms. + * + * @param userId the user id to get the rooms by + * @return the list of rooms + */ + public static List getRoomsByUserId(int userId) { + List rooms = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM rooms LEFT JOIN users ON rooms.owner_id = users.id WHERE rooms.owner_id = ?", sqlConnection); + preparedStatement.setInt(1, userId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + Room room = new Room(); + fill(room.getData(), resultSet); + rooms.add(room); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return rooms; + } + + /** + * Get a list of recommended rooms. + * + * @param limit the limit of rooms + * @return the list of rooms + */ + public static List getRecommendedRooms(int limit, int offset) { + List roomList = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM rooms LEFT JOIN users ON rooms.owner_id = users.id WHERE owner_id > 0 AND accesstype = 0 ORDER BY visitors_now DESC, rating DESC LIMIT " + limit + " OFFSET " + offset, sqlConnection); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + Room room = new Room(); + RoomDao.fill(room.getData(), resultSet); + roomList.add(room); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(resultSet); + } + + return roomList; + } + + /** + * Get the list of the highest rated rooms + * + * @param limit the maximum amount of rooms + * @return the list of highest rated rooms + */ + public static List getHighestRatedRooms(int limit, int offset) { + List rooms = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM rooms LEFT JOIN users ON rooms.owner_id = users.id WHERE owner_id > 0 ORDER BY rating DESC LIMIT " + limit + " OFFSET " + offset, sqlConnection); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + Room room = new Room(); + RoomDao.fill(room.getData(), resultSet); + rooms.add(room); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return rooms; + } + + /** + * Get the room id of a room by its model, used for walkways. + * + * @param model the model used to get the id for + * @return the id, else -1 + */ + public static int getRoomIdByModel(String model) { + int roomId = -1; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT id FROM rooms WHERE model = ?", sqlConnection); + preparedStatement.setString(1, model); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + roomId = resultSet.getInt("id"); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return roomId; + } + + + /** + * Search query for when people use the navigator search, will search either by username or room name similarities. + * + * @param searchQuery the query to use + * @return the list of possible room matches + */ + public static List searchRooms(String searchQuery, int roomOwner, int limit) { + List rooms = new ArrayList<>(); + + if (searchQuery.isBlank() && roomOwner == -1) { + return rooms; + } + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM rooms INNER JOIN users ON rooms.owner_id = users.id WHERE" + (roomOwner > 0 ? (" owner_id = " + roomOwner + " AND") : " LOWER(users.username) LIKE ? OR") + " LOWER(rooms.name) LIKE ? ORDER BY visitors_now DESC, rating DESC LIMIT ? ", sqlConnection); + + if (roomOwner > 0) { + preparedStatement.setString(1, "%" + searchQuery + "%"); + preparedStatement.setInt(2, limit); + } else { + preparedStatement.setString(1, "%" + searchQuery + "%"); + preparedStatement.setString(2, "%" + searchQuery + "%"); + preparedStatement.setInt(3, limit); + } + + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + Room room = new Room(); + fill(room.getData(), resultSet); + rooms.add(room); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return rooms; + } + + public static Room getRoomById(int roomId) { + Room room = null; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM rooms LEFT JOIN users ON rooms.owner_id = users.id WHERE rooms.id = ?", sqlConnection); + preparedStatement.setInt(1, roomId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + room = new Room(); + fill(room.getData(), resultSet); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return room; + } + + /** + * Save all room information. + * + * @param room the room to save + */ + public static void saveDecorations(Room room) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE rooms SET wallpaper = ?, floor = ?, landscape = ? WHERE id = ?", sqlConnection); + preparedStatement.setInt(1, room.getData().getWallpaper()); + preparedStatement.setInt(2, room.getData().getFloor()); + preparedStatement.setString(3, room.getData().getLandscape()); + preparedStatement.setInt(4, room.getId()); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + /** + * Save all room information. + * + * @param room the room to save + */ + public static void save(Room room) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE rooms SET category = ?, name = ?, description = ?, showname = ?, superusers = ?, accesstype = ?, password = ?, visitors_max = ? WHERE id = ?", sqlConnection); + preparedStatement.setInt(1, room.getData().getCategoryId()); + preparedStatement.setString(2, room.getData().getName()); + preparedStatement.setString(3, room.getData().getDescription()); + preparedStatement.setBoolean(4, room.getData().showOwnerName()); + preparedStatement.setBoolean(5, room.getData().allowSuperUsers()); + preparedStatement.setInt(6, room.getData().getAccessTypeId()); + preparedStatement.setString(7, room.getData().getPassword()); + preparedStatement.setInt(8, room.getData().getVisitorsMax()); + preparedStatement.setInt(9, room.getId()); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + + /** + * Save visitor count of rooms + * + * @param id the id of room to save + */ + public static void saveVisitors(int id, int size) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE rooms SET visitors_now = ? WHERE id = ?", sqlConnection); + preparedStatement.setInt(1, size); + preparedStatement.setInt(2, id); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + /** + * Save rating for the room + * + * @param roomId the room to save + * @param rating the new rating + */ + public static void saveRating(int roomId, int rating) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE rooms SET rating = ? WHERE id = ?", sqlConnection); + preparedStatement.setInt(1, rating); + preparedStatement.setInt(2, roomId); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + + /** + * Save room icon data + * + * @param roomId the room id for the icon to save to + * @param formattedIconData the formatted icon data to save + */ + public static void saveIcon(int roomId, String formattedIconData) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE rooms SET icon_data = ? WHERE id = ?", sqlConnection); + preparedStatement.setString(1, formattedIconData); + preparedStatement.setInt(2, roomId); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + /** + * Delete room. + * + * @param room the room to delete + */ + public static void delete(Room room) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM rooms WHERE id = ?", sqlConnection); + preparedStatement.setInt(1, room.getId()); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + /** + * Save visitor count of rooms + * + * @param roomId the room to save + */ + public static void saveGroupId(int roomId, int groupId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE rooms SET group_id = ? WHERE id = ?", sqlConnection); + preparedStatement.setInt(1, roomId); + preparedStatement.setInt(2, groupId); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void saveChatLog(Collection chatMessages) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO room_chatlogs (user_id, room_id, timestamp, chat_type, message) VALUES (?, ?, ?, ?, ?)", sqlConnection); + sqlConnection.setAutoCommit(false); + + for (ChatMessage chatMessage : chatMessages) { + preparedStatement.setInt(1, chatMessage.getPlayerId()); + preparedStatement.setInt(2, chatMessage.getRoomId()); + preparedStatement.setLong(3, chatMessage.getSentTime()); + + switch (chatMessage.getChatMessageType()) { + case CHAT: + preparedStatement.setInt(4, 0); + break; + case SHOUT: + preparedStatement.setInt(4, 1); + break; + default: + preparedStatement.setInt(4, 2); + break; + } + + preparedStatement.setString(5, chatMessage.getMessage()); + preparedStatement.addBatch(); + } + + preparedStatement.executeBatch(); + sqlConnection.setAutoCommit(true); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static List getModChatlog(int roomId) { + List chatHistoryList = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + //room_chatlogs (user_id, room_id, timestamp, chat_type, message) + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT rooms.owner_id AS owner_id, room_chatlogs.*,rooms.name AS room_name, users.username AS username FROM room_chatlogs " + + "INNER JOIN rooms ON room_chatlogs.room_id = rooms.id " + + "INNER JOIN users ON room_chatlogs.user_id = users.id " + + "WHERE room_id = ? " + + "ORDER BY timestamp DESC " + + "LIMIT 150", sqlConnection); + preparedStatement.setInt(1, roomId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + CHAT_MESSAGE.ChatMessageType chatMessageType = CHAT_MESSAGE.ChatMessageType.CHAT; + int chatType = resultSet.getInt("chat_type"); + + if (chatType == 2) { + chatMessageType = CHAT_MESSAGE.ChatMessageType.WHISPER; + } + + if (chatType == 1) { + chatMessageType = CHAT_MESSAGE.ChatMessageType.SHOUT; + } + + chatHistoryList.add(new ChatMessage(resultSet.getInt("user_id"), resultSet.getString("username"), + resultSet.getString("message"), chatMessageType, + roomId, resultSet.getLong("timestamp"))); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return chatHistoryList; + } + + /** + * Fill room data + * + * @param data the room data instance + * @param row the row + * @throws SQLException the SQL exception + */ + public static void fill(RoomData data, ResultSet row) throws SQLException { + if (data == null) { + return; + } + + String ownerName = row.getString("username"); + + data.fill(row.getInt("id"), row.getInt("owner_id"), ownerName != null ? ownerName : "", row.getInt("category"), + row.getString("name"), row.getString("description"), row.getString("model"), + row.getString("ccts"), row.getInt("wallpaper"), row.getInt("floor"), row.getString("landscape"), + row.getBoolean("showname"), row.getBoolean("superusers"), row.getInt("accesstype"), + row.getString("password"), row.getInt("visitors_now"), row.getInt("visitors_max"), row.getInt("rating"), + row.getString("icon_data"), row.getInt("group_id"), row.getBoolean("is_hidden")); + + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/RoomFavouritesDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/RoomFavouritesDao.java new file mode 100644 index 0000000..acc928a --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/RoomFavouritesDao.java @@ -0,0 +1,77 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.dao.Storage; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class RoomFavouritesDao { + public static List getFavouriteRooms(int userId, boolean privateRoomsOnly) { + List roomIds = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT room_id FROM users_room_favourites INNER JOIN rooms ON rooms.id = users_room_favourites.room_id WHERE user_id = ?" + (privateRoomsOnly ? " AND owner_id > 0" : ""), sqlConnection); + preparedStatement.setInt(1, userId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + roomIds.add(resultSet.getInt("room_id")); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return roomIds; + } + + public static void addFavouriteRoom(int userId, int roomId) throws SQLException { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO users_room_favourites (user_id, room_id) VALUES (?, ?)", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, roomId); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + throw e; + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void removeFavouriteRoom(int userId, int roomId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM users_room_favourites WHERE user_id = ? AND room_id = ?", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, roomId); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/RoomModelDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/RoomModelDao.java new file mode 100644 index 0000000..9abafef --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/RoomModelDao.java @@ -0,0 +1,43 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.game.room.models.RoomModel; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.concurrent.ConcurrentHashMap; + +public class RoomModelDao { + public static ConcurrentHashMap getModels() { + ConcurrentHashMap roomModels = new ConcurrentHashMap<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM rooms_models", sqlConnection); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + RoomModel roomModel = new RoomModel(resultSet.getString("model_id"), resultSet.getString("model_name"), + resultSet.getInt("door_x"), resultSet.getInt("door_y"), resultSet.getDouble("door_z"), + resultSet.getInt("door_dir"), resultSet.getString("heightmap"), resultSet.getString("trigger_class")); + + roomModels.put(roomModel.getId(), roomModel); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return roomModels; + } + +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/RoomRightsDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/RoomRightsDao.java new file mode 100644 index 0000000..a08ff0e --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/RoomRightsDao.java @@ -0,0 +1,102 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.room.RoomData; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class RoomRightsDao { + + /** + * Get a list of users with room rights for a room + * + * @return the list of user ids who have room rights + */ + public static List getRoomRights(RoomData room) { + List users = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT user_id FROM rooms_rights WHERE room_id = ?", sqlConnection); + preparedStatement.setInt(1, room.getId()); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + users.add(resultSet.getInt("user_id")); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return users; + } + + public static void addRights(PlayerDetails user, RoomData room) throws SQLException { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO rooms_rights (user_id, room_id) VALUES (?, ?)", sqlConnection); + preparedStatement.setInt(1, user.getId()); + preparedStatement.setInt(2, room.getId()); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + throw e; + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void removeRights(int userId, RoomData room) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM rooms_rights WHERE user_id = ? AND room_id = ?", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, room.getId()); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void deleteRoomRights(RoomData room) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM rooms_rights WHERE room_id = ?", sqlConnection); + preparedStatement.setInt(1, room.getId()); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/RoomVisitsDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/RoomVisitsDao.java new file mode 100644 index 0000000..9f5bb50 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/RoomVisitsDao.java @@ -0,0 +1,55 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.dao.Storage; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; + +public class RoomVisitsDao { + public static void addVisit(int userId, int roomId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("REPLACE INTO room_visits (user_id, room_id, visited_at) VALUES (?, ?, NOW())", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, roomId); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static int countVisits(int userId) { + int count = 0; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT COUNT(*) as visits FROM room_visits WHERE user_id = ?", sqlConnection); + preparedStatement.setInt(1, userId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + count = resultSet.getInt("visits"); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return count; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/RoomVoteDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/RoomVoteDao.java new file mode 100644 index 0000000..4bdaed0 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/RoomVoteDao.java @@ -0,0 +1,119 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.game.room.managers.VoteData; +import org.alexdev.havana.util.DateUtil; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; + +public class RoomVoteDao { + private static final long EXPIRE_SECONDS = TimeUnit.DAYS.toSeconds(30*2); + + /** + * Vote for a room + * + * @param userId the user id who is voting + * @param roomId the room id that the user is voting for + * @param answer the value of the vote (1 or -1) + */ + public static void vote(int userId, int roomId, int answer) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO users_room_votes (user_id, room_id, vote, expire_time) VALUES (?, ?, ?, ?)", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, roomId); + preparedStatement.setInt(3, answer); + preparedStatement.setLong(4, DateUtil.getCurrentTimeSeconds() + EXPIRE_SECONDS); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + /** + * Vote expired votes for a room + */ + public static void removeExpiredVotes(int roomId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + + /*preparedStatement = Storage.getStorage().prepare("SELECT room_id FROM users_room_votes WHERE expire_time < ?", sqlConnection); + preparedStatement.setLong(1, DateUtil.getCurrentTimeSeconds()); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + affected = true; + }*/ + + preparedStatement = Storage.getStorage().prepare("DELETE FROM users_room_votes WHERE room_id = ? AND expire_time < ?", sqlConnection); + preparedStatement.setInt(1, roomId); + preparedStatement.setLong(2, DateUtil.getCurrentTimeSeconds()); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + /** + * Return a map of the room ratings + * + * @param roomId the id of the room id to save + * @return Map containing key userId and value voteAnswer + */ + public static List getRatings(int roomId) { + List ratings = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT " + + "users_room_votes.user_id AS user_id, room_id, vote, CONVERT(GROUP_CONCAT(ip_address SEPARATOR ',') USING 'UTF8') AS ip_addresses, machine_id " + + "FROM " + + "users_room_votes " + + "INNER JOIN users_ip_logs ON users_ip_logs.user_id = users_room_votes.user_id " + + "INNER JOIN users ON users.id = users_room_votes.user_id " + + "WHERE " + + "users_room_votes.room_id = ? AND users_room_votes.expire_time > ? " + + "GROUP BY " + + "users_room_votes.user_id", sqlConnection); + preparedStatement.setInt(1, roomId); + preparedStatement.setLong(2, DateUtil.getCurrentTimeSeconds()); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + ratings.add(new VoteData(resultSet.getInt("user_id"), resultSet.getInt("vote"), resultSet.getString("ip_addresses"), resultSet.getString("machine_id"))); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return ratings; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/SettingsDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/SettingsDao.java new file mode 100644 index 0000000..91c5cb3 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/SettingsDao.java @@ -0,0 +1,179 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.dao.Storage; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +public class SettingsDao { + + /** + * Update setting in the database. + * + * @param key the key used to set the value + * @param value the new value to set + */ + public static void updateSetting(String key, String value) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE settings SET value = ? WHERE setting = ?", sqlConnection); + preparedStatement.setString(1, value); + preparedStatement.setString(2, key); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void updateSettings(Set> entrySet) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE settings SET value = ? WHERE setting = ?", sqlConnection); + sqlConnection.setAutoCommit(false); + + for (var kvp : entrySet) { + preparedStatement.setString(1, kvp.getValue()); + preparedStatement.setString(2, kvp.getKey()); + preparedStatement.addBatch(); + } + + preparedStatement.executeBatch(); + sqlConnection.setAutoCommit(true); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + /** + * Get a value from the settings table. + * + * @param key the key used to get the value + * @return the value, null if no value was found + */ + public static String getSetting(String key) { + String value = null; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT value FROM settings WHERE setting = ?", sqlConnection); + preparedStatement.setString(1, key); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + value = resultSet.getString("value"); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return value; + } + + /** + * Get all settings from the settings table. + * + * @return a map containing key and values + */ + public static Map getAllSettings() { + Map settings = new HashMap<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT setting, value FROM settings", sqlConnection); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + settings.put(resultSet.getString("setting"), resultSet.getString("value")); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return settings; + } + + /** + * Create a new setting entry in the database using a key value lookup. + * + * @param key the key used for the lookup + * @param value the value for the key + */ + public static void newSetting(String key, String value) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO settings (setting, value) VALUES (?, ?)", sqlConnection); + preparedStatement.setString(1, key); + preparedStatement.setString(2, value); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static Map getTexts() { + Map texts = new HashMap<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM external_texts", sqlConnection); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + texts.put(resultSet.getString("entry"), resultSet.getString("text")); + } + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return texts; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/SongMachineDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/SongMachineDao.java new file mode 100644 index 0000000..393d07c --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/SongMachineDao.java @@ -0,0 +1,331 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.game.song.Song; +import org.alexdev.havana.game.song.SongPlaylist; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class SongMachineDao { + + /** + * Get the song list for this machine. + * + * @param itemId the item id for this machine + * @return the list of songs + */ + public static List getSongList(long itemId) { + List songs = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM soundmachine_songs WHERE item_id = ?", sqlConnection); + preparedStatement.setLong(1, itemId); + resultSet = preparedStatement.executeQuery(); + + // (int id, String title, int itemId, int length, String data, boolean isBurnt) + while (resultSet.next()) { + songs.add(new Song(resultSet.getInt("id"), resultSet.getString("title"), itemId, resultSet.getInt("user_id"), + resultSet.getInt("length"), resultSet.getString("data"), resultSet.getBoolean("burnt"))); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return songs; + } + + public static Song getSong(int songId) { + Song song = null; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM soundmachine_songs WHERE id = ?", sqlConnection); + preparedStatement.setInt(1, songId); + resultSet = preparedStatement.executeQuery(); + + // (int id, String title, int itemId, int length, String data, boolean isBurnt) + if (resultSet.next()) { + song = new Song(resultSet.getInt("id"), resultSet.getString("title"), resultSet.getLong("item_id"), resultSet.getInt("user_id"), + resultSet.getInt("length"), resultSet.getString("data"), resultSet.getBoolean("burnt")); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return song; + } + + public static List getSongPlaylist(long itemId) { + List songs = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM soundmachine_playlists WHERE item_id = ?", sqlConnection); + preparedStatement.setLong(1, itemId); + resultSet = preparedStatement.executeQuery(); + + // (int id, String title, int itemId, int length, String data, boolean isBurnt) + while (resultSet.next()) { + songs.add(new SongPlaylist(itemId, getSong(resultSet.getInt("song_id")), resultSet.getInt("slot_id"))); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return songs; + } + + public static void addPlaylist(long itemId, int songId, int slotId) throws SQLException { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO soundmachine_playlists (item_id, song_id, slot_id) VALUES (?, ?, ?)", sqlConnection); + preparedStatement.setLong(1, itemId); + preparedStatement.setInt(2, songId); + preparedStatement.setInt(3, slotId); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + throw e; + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void removePlaylistSong(int songId, long itemId) throws SQLException { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM soundmachine_playlists WHERE song_id = ? AND item_id = ? LIMIT 1", sqlConnection); + preparedStatement.setInt(1, songId); + preparedStatement.setLong(2, itemId); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + throw e; + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void deleteSong(int songId) throws SQLException { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + + // Don't actually delete, just make it invisible, this is because some burned disks might use it. + preparedStatement = Storage.getStorage().prepare("UPDATE soundmachine_songs SET item_id = -1 WHERE id = ?", sqlConnection); + preparedStatement.setInt(1, songId); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + throw e; + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void clearPlaylist(long itemId) throws SQLException { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM soundmachine_playlists WHERE item_id = ?", sqlConnection); + preparedStatement.setLong(1, itemId); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + throw e; + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + + public static void addSong(int userId, long soundMachineId, String title, int length, String data) throws SQLException { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO soundmachine_songs (user_id, item_id, title, length, data) VALUES (?, ?, ?, ?, ?)", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setLong(2, soundMachineId); + preparedStatement.setString(3, title); + preparedStatement.setInt(4, length); + preparedStatement.setString(5, data); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + throw e; + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void saveSong(int songId, String title, int length, String data) throws SQLException { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE soundmachine_songs SET title = ?, length = ?, data = ? WHERE id = ?", sqlConnection); + preparedStatement.setString(1, title); + preparedStatement.setInt(2, length); + preparedStatement.setString(3, data); + preparedStatement.setInt(4, songId); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + throw e; + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static Map getTracks(long soundMachineId) { + Map tracks = new HashMap<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT track_id, slot_id FROM soundmachine_tracks WHERE soundmachine_id = ?", sqlConnection); + preparedStatement.setLong(1, soundMachineId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + tracks.put(resultSet.getInt("slot_id"), resultSet.getInt("track_id")); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return tracks; + } + + public static void addTrack(long soundMachineId, int trackId, int slotId) throws SQLException { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO soundmachine_tracks (soundmachine_id, track_id, slot_id) VALUES (?, ?, ?)", sqlConnection); + preparedStatement.setLong(1, soundMachineId); + preparedStatement.setInt(2, trackId); + preparedStatement.setInt(3, slotId); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + throw e; + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void removeTrack(long soundMachineId, int slotId) throws SQLException { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM soundmachine_tracks WHERE soundmachine_id = ? AND slot_id = ?", sqlConnection); + preparedStatement.setLong(1, soundMachineId); + preparedStatement.setInt(2, slotId); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + throw e; + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static List getSongUserList(int userId) { + List songs = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM soundmachine_songs WHERE user_id = ?", sqlConnection); + preparedStatement.setLong(1, userId); + resultSet = preparedStatement.executeQuery(); + + // (int id, String title, int itemId, int length, String data, boolean isBurnt) + while (resultSet.next()) { + songs.add(new Song(resultSet.getInt("id"), resultSet.getString("title"), resultSet.getInt("item_id"), resultSet.getInt("user_id"), + resultSet.getInt("length"), resultSet.getString("data"), resultSet.getBoolean("burnt"))); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return songs; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/TagDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/TagDao.java new file mode 100644 index 0000000..c477d79 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/TagDao.java @@ -0,0 +1,381 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.tags.HabboTag; +import org.apache.commons.lang3.tuple.Pair; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.*; + +public class TagDao { + public static List getTagInfoList(String tag) { + List search = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM users_tags WHERE LOWER(tag) = ? AND (user_id > 0 OR group_id > 0) AND room_id = 0", sqlConnection); + preparedStatement.setString(1, tag); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + search.add(new HabboTag(resultSet.getString("tag"), resultSet.getInt("room_id"), resultSet.getInt("user_id"), resultSet.getInt("group_id"))); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return search; + } + + public static List querySearchRooms(String searchTag) { + List rooms = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM users_tags " + + "INNER JOIN rooms ON rooms.id = users_tags.room_id " + + "INNER JOIN users ON rooms.owner_id = users.id " + + "WHERE LOWER(users_tags.tag) LIKE ? LIMIT 30", sqlConnection); + preparedStatement.setString(1, "%" + searchTag + "%"); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + Room room = new Room(); + RoomDao.fill(room.getData(), resultSet); + rooms.add(room); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return rooms; + } + + public static List> getPopularTags() { + return getPopularTags(20); + } + + public static List> getPopularTags(int num) { + List> tagList = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT tag, COUNT(*) AS quantity FROM users_tags GROUP BY tag ORDER BY quantity DESC LIMIT " + num, sqlConnection); + resultSet = preparedStatement.executeQuery(); + + int tags = 0; + Map temp = new HashMap<>(); + + while (resultSet.next()) { + String tag = resultSet.getString("tag"); + int count = resultSet.getInt("quantity"); + + if (temp.containsKey(tag)) { + count = temp.get(tag) + count; + } + + tags += count; + temp.put(tag, count); + } + + List > list = new LinkedList<>(temp.entrySet()); + list.sort(Comparator.comparingInt(Map.Entry::getValue)); + + + int weight = 0; + int[] fonts = new int[] { 10, 12, 14, 20 };//20, 14, 12, 10 };//10, 12, 14, 20}; + + if (temp.size() > 0) { + int counter = temp.size(); + int bits = (int) Math.ceil(temp.size() / 4); + + if (tags > 0) { + for (var kvp : list) { + if (counter == (bits)) { + weight = 3; + } + + if (counter == (bits * 3)) { + weight = 2; + } + + if (counter == (bits * 2)) { + weight = 1; + } + + String key = kvp.getKey(); + + tagList.add(Pair.of(key, fonts[weight])); + counter--; + } + } + } + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + Collections.shuffle(tagList); + return tagList; + } + + public static List getUserTags(int userId) { + List roomIds = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT tag FROM users_tags WHERE user_id = ?", sqlConnection); + preparedStatement.setInt(1, userId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + roomIds.add(resultSet.getString("tag")); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return roomIds; + } + + public static List getRoomTags(int roomId) { + List roomIds = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT tag FROM users_tags WHERE room_id = ?", sqlConnection); + preparedStatement.setInt(1, roomId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + roomIds.add(resultSet.getString("tag")); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return roomIds; + } + + public static List getGroupTags(int groupId) { + List roomIds = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT tag FROM users_tags WHERE group_id = ?", sqlConnection); + preparedStatement.setInt(1, groupId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + roomIds.add(resultSet.getString("tag")); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return roomIds; + } + + public static Map getRoomTagData(int num) { + Map tagList = new HashMap<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT tag, COUNT(user_id) AS quantity FROM users_tags WHERE room_id > 0 GROUP BY tag ORDER BY quantity DESC LIMIT " + num, sqlConnection); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + String tag = resultSet.getString("tag"); + int count = resultSet.getInt("quantity"); + + tagList.put(tag, count); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return tagList; + } + + public static boolean hasTag(int userId, int roomId, int groupId, String tag) { + boolean result = false; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT tag FROM users_tags WHERE user_id = ? AND room_id = ? AND group_id = ? AND LOWER(tag) = LOWER(?)", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, roomId); + preparedStatement.setInt(3, groupId); + preparedStatement.setString(4, tag); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + result = true; + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return result; + } + + public static void addTag(int userId, int roomId, int groupId, String tag) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO users_tags (user_id, room_id, group_id, tag) VALUES (?, ?, ?, ?)", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, roomId); + preparedStatement.setInt(3, groupId); + preparedStatement.setString(4, tag); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void removeTag(int userId, int roomId, int groupId, String tag) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM users_tags WHERE user_id = ? AND room_id = ? AND group_id = ? AND tag = ?", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, roomId); + preparedStatement.setInt(3, groupId); + preparedStatement.setString(4, tag); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void removeTags(int userId, int roomId, int groupId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM users_tags WHERE user_id = ? AND room_id = ? AND group_id = ?", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, roomId); + preparedStatement.setInt(3, groupId); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static int countTag(String tag) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + int count = 0; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT COUNT(user_id) FROM users_tags WHERE tag = ?", sqlConnection); + preparedStatement.setString(1, tag); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + count = resultSet.getInt(1); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return count; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/TeleporterDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/TeleporterDao.java new file mode 100644 index 0000000..afa9e4c --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/TeleporterDao.java @@ -0,0 +1,57 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.dao.Storage; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +public class TeleporterDao { + public static long getTeleporterId(long itemId) { + long teleporterId = -1; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT linked_id FROM items_teleporter_links WHERE item_id = ?", sqlConnection); + preparedStatement.setLong(1, itemId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + teleporterId = resultSet.getLong("linked_id"); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return teleporterId; + } + + public static void addPair(long itemId, long linkedId) throws SQLException { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO items_teleporter_links (item_id, linked_id) VALUES (?, ?)", sqlConnection); + preparedStatement.setLong(1, itemId); + preparedStatement.setLong(2, linkedId); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + throw e; + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/TransactionDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/TransactionDao.java new file mode 100644 index 0000000..123c91f --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/TransactionDao.java @@ -0,0 +1,150 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.game.item.Transaction; +import org.apache.commons.lang3.StringUtils; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +public class TransactionDao { + public static void createTransaction(int userId, String itemId, String catalogueId, int amount, String description, int creditCost, int pixelCost, boolean visible) throws SQLException { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO users_transactions (user_id, item_id, catalogue_id, amount, description, credit_cost, pixel_cost, is_visible) VALUES (?, ?, ?, ? ,?, ?, ?, ?)", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setString(2, itemId); + preparedStatement.setString(3, catalogueId); + preparedStatement.setInt(4, amount); + preparedStatement.setString(5, description); + preparedStatement.setInt(6, creditCost); + preparedStatement.setInt(7, pixelCost); + preparedStatement.setInt(8, visible ? 1 : 0); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + throw e; + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static List getTransactionByItem(int itemId) { + List transactions = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM users_transactions WHERE item_id = ? ORDER BY users_transactions.created_at DESC", sqlConnection); + preparedStatement.setInt(1, itemId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + transactions.add(new Transaction(resultSet.getString("item_id").split(","), resultSet.getString("description"), resultSet.getInt("credit_cost"), resultSet.getInt("pixel_cost"), resultSet.getInt("amount"), + resultSet.getTime("created_at").getTime() / 1000L)); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return transactions; + } + + public static List getTransactionsPastMonth(String searchQuery, boolean viewAll) { + Calendar currentCalendar = Calendar.getInstance(); + currentCalendar.setTimeInMillis(System.currentTimeMillis()); + int month = currentCalendar.get(Calendar.MONTH) + 1; + int year = currentCalendar.get(Calendar.YEAR); + + List transactions = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM users_transactions INNER JOIN users ON users.id = users_transactions.user_id WHERE MONTH(users_transactions.created_at) = ? AND YEAR(users_transactions.created_at) = ? AND user_id = ? OR username = ? ORDER BY users_transactions.created_at DESC", sqlConnection); + preparedStatement.setInt(1, month); + preparedStatement.setInt(2, year); + preparedStatement.setInt(3, StringUtils.isNumeric(searchQuery) ? Integer.parseInt(searchQuery) : -1); + preparedStatement.setString(4, searchQuery); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + boolean isVisible = resultSet.getBoolean("is_visible"); + + if (!isVisible && !viewAll) { + continue; + } + + transactions.add(new Transaction(resultSet.getString("item_id").split(","), resultSet.getString("description"), resultSet.getInt("credit_cost"), resultSet.getInt("pixel_cost"), resultSet.getInt("amount"), + resultSet.getTime("created_at").getTime() / 1000L)); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return transactions; + } + + public static List getTransactions(int userId, int month, int year, boolean viewAll) { + List transactions = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM users_transactions WHERE YEAR(created_at) = ? AND MONTH(created_at) = ? AND user_id = ? ORDER BY created_at DESC", sqlConnection); + preparedStatement.setInt(1, year); + preparedStatement.setInt(2, month); + preparedStatement.setInt(3, userId); + + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + boolean isVisible = resultSet.getBoolean("is_visible"); + + if (!isVisible && !viewAll) { + continue; + } + + transactions.add(new Transaction(resultSet.getString("item_id").split(","), resultSet.getString("description"), resultSet.getInt("credit_cost"), resultSet.getInt("pixel_cost"), resultSet.getInt("amount"), + resultSet.getTime("created_at").getTime() / 1000L)); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return transactions; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/TutorialDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/TutorialDao.java new file mode 100644 index 0000000..70713a5 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/TutorialDao.java @@ -0,0 +1,107 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.dao.Storage; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class TutorialDao { + public static List getTutorialFlags(int userId) { + List flags = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT flags FROM users_tutorial_progress WHERE user_id = ? LIMIT 1", sqlConnection); + preparedStatement.setInt(1, userId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + var flagResults = resultSet.getString("flags"); + + if (flagResults.length() > 0) { + flags = Stream.of(resultSet.getString("flags").split(",")).map(Integer::parseInt).collect(Collectors.toList()); + } + } + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return flags; + } + + public static boolean hasTutorialFlags(int userId) { + boolean hasFlags = false; + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT flags FROM users_tutorial_progress WHERE user_id = ? LIMIT 1", sqlConnection); + preparedStatement.setInt(1, userId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + hasFlags = true; + } + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return hasFlags; + } + + public static void updateTutorialFlags(int userId, List flags) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE users_tutorial_progress SET flags = ? WHERE user_id = ? LIMIT 1", sqlConnection); + preparedStatement.setString(1, flags.stream().map(Object::toString).collect(Collectors.joining(","))); + preparedStatement.setInt(2, userId); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void createTutorialFlags(int userId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO users_tutorial_progress (user_id) VALUES (?)", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/UsersMutesDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/UsersMutesDao.java new file mode 100644 index 0000000..6df7157 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/UsersMutesDao.java @@ -0,0 +1,77 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.dao.Storage; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class UsersMutesDao { + public static List getMutedUsers(int userId) { + List users = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT muted_id FROM users_mutes INNER JOIN users ON users_mutes.muted_id = users.id WHERE user_id = ?", sqlConnection); + preparedStatement.setInt(1, userId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + users.add(resultSet.getInt("muted_id")); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return users; + } + + public static void addMuted(int userId, int mutedId) throws SQLException { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO users_mutes (user_id, muted_id) VALUES (?, ?)", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, mutedId); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + throw e; + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void removeMuted(int userId, int mutedId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM users_mutes WHERE user_id = ? AND muted_id = ?", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, mutedId); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/VoucherDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/VoucherDao.java new file mode 100644 index 0000000..953e2d0 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/VoucherDao.java @@ -0,0 +1,136 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.game.catalogue.CatalogueItem; +import org.alexdev.havana.game.misc.purse.Voucher; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.Types; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class VoucherDao { + + /** + * Redeems a voucher. + * Gets the voucher and then deletes it from the voucher table. + * + * @param voucherCode the string voucher code to redeem + * @return the amount of credits redeemed or -1 if no voucher was found. + */ + public static Voucher redeemVoucher(String voucherCode, int userId) { + Voucher voucher = null; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + ResultSet resultSet2 = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + + //Get the voucher + preparedStatement = Storage.getStorage().prepare("SELECT credits,is_single_use,allow_new_users FROM vouchers WHERE voucher_code = ? " + + "AND (expiry_date IS NULL OR (UNIX_TIMESTAMP() < UNIX_TIMESTAMP(expiry_date))) AND " + + "NOT EXISTS (SELECT vouchers_history.user_id FROM vouchers_history WHERE vouchers_history.user_id = ? AND vouchers_history.voucher_code = ?)", sqlConnection); + preparedStatement.setString(1, voucherCode); + preparedStatement.setInt(2, userId); + preparedStatement.setString(3, voucherCode); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + boolean isSingleUse = resultSet.getBoolean("is_single_use"); + voucher = new Voucher(resultSet.getInt("credits"), resultSet.getBoolean("allow_new_users")); + + //Get related voucher items + preparedStatement = Storage.getStorage().prepare("SELECT catalogue_sale_code FROM vouchers_items INNER JOIN catalogue_items ON catalogue_items.sale_code = vouchers_items.catalogue_sale_code WHERE voucher_code = ?", sqlConnection); + preparedStatement.setString(1, voucherCode); + resultSet2 = preparedStatement.executeQuery(); + + //Find all items + while (resultSet2.next()) { + voucher.getItems().add(resultSet2.getString("catalogue_sale_code")); + } + + //Delete the voucher and related items if it's single use only + if (isSingleUse) { + preparedStatement = Storage.getStorage().prepare("DELETE FROM vouchers WHERE voucher_code = ?", sqlConnection); + preparedStatement.setString(1, voucherCode); + preparedStatement.executeQuery(); + + preparedStatement = Storage.getStorage().prepare("DELETE FROM vouchers_items WHERE voucher_code = ?", sqlConnection); + preparedStatement.setString(1, voucherCode); + preparedStatement.executeQuery(); + } + } + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + + if (resultSet2 != null) + Storage.closeSilently(resultSet2); + + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return voucher; + } + + public static void logVoucher(String voucherCode, int userId, int creditsRedeemed, List itemsRedeemed) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO vouchers_history (voucher_code, user_id, credits_redeemed, items_redeemed) VALUES (?, ?, ?, ?)", sqlConnection); + preparedStatement.setString(1, voucherCode); + preparedStatement.setInt(2, userId); + + if (creditsRedeemed > 0) { + preparedStatement.setInt(3, creditsRedeemed); + } else { + preparedStatement.setNull(3, Types.NULL); + } + + if (itemsRedeemed.size() > 0) { + // Clear all duplicated items + Map distinctItems = new HashMap<>(); + + for (CatalogueItem item : itemsRedeemed) { + if (distinctItems.containsKey(item.getSaleCode())) { + distinctItems.put(item.getSaleCode(), distinctItems.get(item.getSaleCode()) + 1); + } else { + distinctItems.put(item.getSaleCode(), 1); + } + } + + StringBuilder stringBuilder = new StringBuilder(); + + for (Map.Entry kvp : distinctItems.entrySet()) { + stringBuilder.append(kvp.getValue()); + stringBuilder.append(","); + stringBuilder.append(kvp.getKey()); + stringBuilder.append("|"); + } + + preparedStatement.setString(4, stringBuilder.toString().substring(0, stringBuilder.length() - 1)); + } else { + preparedStatement.setNull(4, Types.NULL); + } + + resultSet = preparedStatement.executeQuery(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/WardrobeDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/WardrobeDao.java new file mode 100644 index 0000000..4391720 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/WardrobeDao.java @@ -0,0 +1,102 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.game.player.Wardrobe; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class WardrobeDao { + public static List getWardrobe(int userId) { + List wardrobeList = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM users_wardrobes WHERE user_id = ?", sqlConnection); + preparedStatement.setInt(1, userId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + wardrobeList.add(new Wardrobe(resultSet.getInt("slot_id"), resultSet.getString("sex"), resultSet.getString("figure"))); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return wardrobeList; + } + + public static void deleteWardrobe(int userId, int slotId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM users_wardrobes WHERE user_id = ? AND slot_id = ?", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, slotId); + preparedStatement.execute(); + + } catch (SQLException ex) { + Storage.logError(ex); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void addWardrobe(int userId, int slotId, String figure, String sex) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO users_wardrobes (user_id, slot_id, figure, sex) VALUES (?, ?, ?, ?)", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, slotId); + preparedStatement.setString(3, figure); + preparedStatement.setString(4, sex); + preparedStatement.execute(); + + } catch (SQLException ex) { + Storage.logError(ex); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void updateWardrobe(int userId, int slotId, String figure, String sex) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE users_wardrobes SET figure = ?, sex = ? WHERE slot_id = ? AND user_id = ?", sqlConnection); + preparedStatement.setString(1, figure); + preparedStatement.setString(2, sex); + preparedStatement.setInt(3, slotId); + preparedStatement.setInt(4, userId); + preparedStatement.execute(); + + } catch (SQLException ex) { + Storage.logError(ex); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/WordfilterDao.java b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/WordfilterDao.java new file mode 100644 index 0000000..4b37016 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/dao/mysql/WordfilterDao.java @@ -0,0 +1,38 @@ +package org.alexdev.havana.dao.mysql; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.game.wordfilter.WordfilterWord; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.ArrayList; +import java.util.List; + +public class WordfilterDao { + public static List getBadWords() { + List word = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM wordfilter", sqlConnection); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + word.add(new WordfilterWord(resultSet.getString("word"), resultSet.getBoolean("is_bannable"), resultSet.getBoolean("is_filterable"))); + } + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return word; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/GameScheduler.java b/Havana-Server/src/main/java/org/alexdev/havana/game/GameScheduler.java new file mode 100644 index 0000000..1f3debf --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/GameScheduler.java @@ -0,0 +1,318 @@ +package org.alexdev.havana.game; + +import org.alexdev.havana.dao.mysql.ClubGiftDao; +import org.alexdev.havana.dao.mysql.CurrencyDao; +import org.alexdev.havana.dao.mysql.EffectDao; +import org.alexdev.havana.game.catalogue.collectables.CollectablesManager; +import org.alexdev.havana.game.club.ClubSubscription; +import org.alexdev.havana.game.effects.Effect; +import org.alexdev.havana.game.events.EventsManager; +import org.alexdev.havana.game.games.GameManager; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.ItemManager; +import org.alexdev.havana.game.moderation.ChatManager; +import org.alexdev.havana.game.moderation.cfh.CallForHelpManager; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.log.Log; +import org.alexdev.havana.messages.incoming.catalogue.GET_CATALOG_INDEX; +import org.alexdev.havana.messages.outgoing.effects.AVATAR_EFFECT_EXPIRED; +import org.alexdev.havana.messages.outgoing.user.currencies.ActivityPointNotification; +import org.alexdev.havana.messages.outgoing.user.currencies.CREDIT_BALANCE; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.config.GameConfiguration; + +import java.util.*; +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicLong; + +public class GameScheduler implements Runnable { + private AtomicLong tickRate = new AtomicLong(); + + private ScheduledExecutorService schedulerService; + private ScheduledFuture gameScheduler; + + private BlockingQueue> creditsHandoutQueue; + private BlockingQueue> pixelsHandoutQueue; + private BlockingQueue itemSavingQueue; + private BlockingQueue itemDeletionQueue; + + private static GameScheduler instance; + + private GameScheduler() { + this.schedulerService = Executors.newScheduledThreadPool(Runtime.getRuntime().availableProcessors()); + this.gameScheduler = this.schedulerService.scheduleAtFixedRate(this, 0, 1, TimeUnit.SECONDS); + this.creditsHandoutQueue = new LinkedBlockingQueue<>(); + this.pixelsHandoutQueue = new LinkedBlockingQueue<>(); + this.itemSavingQueue = new LinkedBlockingDeque<>(); + this.itemDeletionQueue = new LinkedBlockingDeque<>(); + } + + /* (non-Javadoc) + * @see java.lang.Runnable#run() + */ + @Override + public void run() { + try { + if (this.tickRate.get() % 10 == 0) { + PlayerManager.getInstance().checkPlayerPeak(); + } + + for (Player player : PlayerManager.getInstance().getPlayers()) { + if (player.getRoomUser().getRoom() != null) { + + // If their sleep timer is now lower than the current time, make them sleep. + if (DateUtil.getCurrentTimeSeconds() > player.getRoomUser().getTimerManager().getSleepTimer()) { + if (!player.getRoomUser().isSleeping()) { + player.getRoomUser().stopCarrying(); + player.getRoomUser().sleep(true); + } + } + + // If their afk timer is up, send them out. + if (DateUtil.getCurrentTimeSeconds() > player.getRoomUser().getTimerManager().getAfkTimer()) { + player.getRoomUser().kick(true, false); + } + + // If they're not sleeping (aka, active) and their next handout expired, give them their credits! + /*if (player.getDetails().isCreditsEligible() && (DateUtil.getCurrentTimeSeconds() > player.getDetails().getNextHandout())) { + if (!this.creditsHandoutQueue.contains(player)) { + this.creditsHandoutQueue.put(player); + player.getDetails().setCreditsEligible(false); + } + }*/ + }/* else { + if (player.getDetails().isCreditsEligible()) { + player.getDetails().resetNextHandout(); + } + }*/ + + if (player.getDetails().isCreditsEligible() && (DateUtil.getCurrentTimeSeconds() > player.getDetails().getNextHandout())) { + int credits = GameConfiguration.getInstance().getInteger("daily.credits.amount"); + + if (credits > 0) { + if (this.creditsHandoutQueue.stream().noneMatch(entry -> entry.getKey() == player)) { + this.queuePlayerCredits(player, credits); + player.getDetails().setCreditsEligible(false); + } + } + } + + // Do pixels + TimeUnit pixelsReceived = TimeUnit.valueOf(GameConfiguration.getInstance().getString("pixels.received.timeunit")); + int intervalInSeconds = (int) pixelsReceived.toSeconds(GameConfiguration.getInstance().getInteger("pixels.received.interval")); + int pixelsToGive = 15; + + if (DateUtil.getCurrentTimeSeconds() > player.getDetails().getLastPixelsTime() && player.getRoomUser().getRoom() != null) { + if (player.getRoomUser().getPixelAvailableTick().getAndDecrement() > 0) { + if (this.pixelsHandoutQueue.stream().noneMatch(entry -> entry.getKey() == player)) { + this.queuePlayerPixels(player, pixelsToGive); + player.getDetails().setLastPixelsTime(DateUtil.getCurrentTimeSeconds() + intervalInSeconds); + } + } + } + + // Check effect expiry + List effectsToRemove = new ArrayList<>(); + + for (Effect effect : player.getEffects()) { + if (!effect.isActivated()) { + continue; + } + + if (DateUtil.getCurrentTimeSeconds() > effect.getExpireDate()) { + effectsToRemove.add(effect); + player.send(new AVATAR_EFFECT_EXPIRED(effect.getEffectId())); + + if (player.getRoomUser().getRoom() != null && player.getRoomUser().isUsingEffect() && player.getRoomUser().getEffectId() == effect.getEffectId()) { + player.getRoomUser().stopEffect(); + } + } + } + + for (Effect effect : effectsToRemove) { + player.getEffects().remove(effect); + EffectDao.deleteEffect(effect.getId()); + } + } + + // Resend the catalogue index every 15 minutes to clear page cache + if (this.tickRate.get() % TimeUnit.MINUTES.toSeconds(15) == 0) { + for (Player player : PlayerManager.getInstance().getPlayers()) { + new GET_CATALOG_INDEX().handle(player, null); + } + } + + // Save credits every 30 seconds + //if (this.tickRate.get() % 30 == 0) { + List> creditsHandout = new ArrayList<>(); + List> pixelHandout = new ArrayList<>(); + + this.creditsHandoutQueue.drainTo(creditsHandout); + this.pixelsHandoutQueue.drainTo(pixelHandout); + + if (creditsHandout.size() > 0) { + Map playerDetailsToSave = new LinkedHashMap<>(); + + for (Map.Entry entry : creditsHandout) { + Player p = entry.getKey(); + int amount = entry.getValue(); + playerDetailsToSave.put(p.getDetails(), amount); + } + + CurrencyDao.increaseCredits(playerDetailsToSave); + + for (Map.Entry entry : creditsHandout) { + Player p = entry.getKey(); + CurrencyDao.updateEligibleCredits(p.getDetails().getId(), false); + p.send(new CREDIT_BALANCE(p.getDetails().getCredits())); + } + } + + if (pixelHandout.size() > 0) { + Map playerDetailsToSave = new LinkedHashMap<>(); + + for (var kvp : pixelHandout) { + var details = kvp.getKey().getDetails(); + playerDetailsToSave.put(details, kvp.getValue()); + } + + CurrencyDao.increasePixels(playerDetailsToSave); + + for (var kvp : pixelHandout) { + var p = kvp.getKey(); + //p.send(new ActivityPointNotification(p.getDetails().getPixels(), ActivityPointNotification.ActivityPointAlertType.PIXELS_SOUND)); // Alert pixel sound + p.send(new ActivityPointNotification(p.getDetails().getPixels(), ActivityPointNotification.ActivityPointAlertType.PIXELS_RECEIVED)); // Alert pixels received + } + } + //} + + // Cycle through HC gifts + if (this.tickRate.get() % TimeUnit.SECONDS.toSeconds(1) == 0) { + ClubGiftDao.incrementGiftData(ClubSubscription.getClubGiftSeconds()); + } + + // Purge expired rows + if (this.tickRate.get() % TimeUnit.DAYS.toSeconds(1) == 0) { + EventsManager.getInstance().removeExpiredEvents(); + } + + // Item saving queue ticker every 10 seconds + if (this.tickRate.get() % 10 == 0) { + if (this.itemSavingQueue != null) { + this.performItemSaving(); + } + } + + // Item deletion queue ticker every 1 second + if (this.tickRate.get() % 5 == 0) { + if (this.itemSavingQueue != null) { + this.performItemDeletion(); + } + } + + // Check expired rentals every 60 seconds + if (this.tickRate.get() % 60 == 0) { + ItemManager.getInstance().checkExpiredRentals(); + } + + // Delete expired CFH's every 60 seconds + if (this.tickRate.get() % 60 == 0) { + CallForHelpManager.getInstance().purgeExpiredCfh(); + } + + // Save chat messages every 60 seconds + if (this.tickRate.get() % 60 == 0) { + ChatManager.getInstance().performChatSaving(); + } + + // Call GC because why the fuck not + if (this.tickRate.get() % 15 == 0) { + System.gc(); + } + + // Check xp expiry once every day + if (this.tickRate.get() % 5 == 0) { + GameManager.getInstance().checkXpExpiry(); + } + + CollectablesManager.getInstance().checkExpiries(); + + } catch (Exception ex) { + Log.getErrorLogger().error("GameScheduler crashed: ", ex); + } + + this.tickRate.incrementAndGet(); + } + + /** + * Add player to queue to give credits to. + * + * @param player the player to modify + * @param credits the credits + */ + public void queuePlayerCredits(Player player, int credits) { + this.creditsHandoutQueue.add(new AbstractMap.SimpleEntry<>(player, credits)); + } + + public void queuePlayerPixels(Player player, int pixels) { + this.pixelsHandoutQueue.add(new AbstractMap.SimpleEntry<>(player, pixels)); + } + + /** + * Queue item to be saved. + * + * @param item the item to save + */ + public void queueSaveItem(Item item) { + this.itemSavingQueue.removeIf(i -> i.getDatabaseId() == item.getDatabaseId()); + this.itemSavingQueue.add(item); + } + + /** + * Queue item to be deleted. + * + * @param itemId the item to delete + */ + public void queueDeleteItem(Long itemId) { + this.itemDeletionQueue.removeIf(i -> i.equals(itemId)); + this.itemDeletionQueue.add(itemId); + } + + /** + * Method to perform item saving. + */ + public void performItemSaving() { + ItemManager.getInstance().performItemSaving(this.itemSavingQueue); + } + + /** + * Method to perform item deletion. + */ + public void performItemDeletion() { + ItemManager.getInstance().performItemDeletion(this.itemDeletionQueue); + } + + /** + * Gets the scheduler service. + * + * @return the scheduler service + */ + public ScheduledExecutorService getService() { + return schedulerService; + } + + /** + * Gets the instance + * + * @return the instance + */ + public static GameScheduler getInstance() { + if (instance == null) { + instance = new GameScheduler(); + } + + return instance; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/AchievementInfo.java b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/AchievementInfo.java new file mode 100644 index 0000000..5974dc8 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/AchievementInfo.java @@ -0,0 +1,62 @@ +package org.alexdev.havana.game.achievements; + +public class AchievementInfo { + private int id; + private String name; + private int level; + private int pixelReward; + private int progressRequired; + + public AchievementInfo(int id, String name, int level, int pixelReward, int progressRequired) { + this.id = id; + this.name = name; + this.level = level; + this.pixelReward = pixelReward; + this.progressRequired = progressRequired; + } + + /** + * Get the achievement id. + * + * @return the achievement id + */ + public int getId() { + return id; + } + + /** + * Get the achievement name. + * + * @return the achievement name + */ + public String getName() { + return name; + } + + /** + * Get the level of the achievement. + * + * @return the level + */ + public int getLevel() { + return level; + } + + /** + * Get the pixel reward when completing achievement. + * + * @return the pixel reward + */ + public int getPixelReward() { + return pixelReward; + } + + /** + * Get the progress required for the achievement. + * + * @return the progress required + */ + public int getProgressRequired() { + return progressRequired; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/AchievementManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/AchievementManager.java new file mode 100644 index 0000000..f069f8e --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/AchievementManager.java @@ -0,0 +1,132 @@ +package org.alexdev.havana.game.achievements; + +import org.alexdev.havana.dao.mysql.AchievementDao; +import org.alexdev.havana.dao.mysql.CurrencyDao; +import org.alexdev.havana.game.achievements.user.UserAchievement; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.user.currencies.ActivityPointNotification; +import org.alexdev.havana.util.StringUtil; + +import java.util.Map; + +public class AchievementManager { + private static AchievementManager instance; + private Map achievements; + + public AchievementManager() { + this.achievements = AchievementDao.getAchievements(); + } + + /** + * Method for handling achievement progression. + * + * @param achievementType the type of achievement + * @param player the player to handle for + */ + public void tryProgress(AchievementType achievementType, Player player) { + UserAchievement userAchievement = player.getAchievementManager().locateAchievement(achievementType); + + if (userAchievement == null) { + return; + } + + if (achievementType.getProgressor().tryProgress(player, userAchievement, userAchievement.getAchievementInfo())) { + AchievementDao.saveUserAchievement(player.getDetails().getId(), userAchievement); + } + + if (userAchievement.getProgress() != userAchievement.getAchievementInfo().getProgressRequired()) { + return; + } + + var badgeCode = userAchievement.getAchievementInfo().getName() + userAchievement.getAchievementInfo().getLevel(); + + if (userAchievement.getAchievementInfo().getName().equals("GL")) { + badgeCode = userAchievement.getAchievementInfo().getName() + StringUtil.toAlphabetic(userAchievement.getAchievementInfo().getLevel()); + } + + if (player.getBadgeManager().hasBadge(badgeCode)) { + return; + } + + if (userAchievement.getAchievementInfo().getPixelReward() > 0) { + CurrencyDao.increasePixels(player.getDetails(), userAchievement.getAchievementInfo().getPixelReward()); + player.send(new ActivityPointNotification(player.getDetails().getPixels(), ActivityPointNotification.ActivityPointAlertType.PIXELS_SOUND)); // Alert pixel sound + } + + + AchievementInfo previousAchievement = locateAchievement(achievementType, userAchievement.getAchievementInfo().getLevel() - 1); + + if (previousAchievement != null) { + var badgeRemoveCode = previousAchievement.getName() + previousAchievement.getLevel(); + + if (badgeRemoveCode.equals("GL")) { + badgeRemoveCode = userAchievement.getAchievementInfo().getName() + StringUtil.toAlphabetic(userAchievement.getAchievementInfo().getLevel() - 1); + } + + if (!achievementType.hasRemovePreviousAchievement()) { + badgeRemoveCode = null; + } + + player.getBadgeManager().tryAddBadge(badgeCode, badgeRemoveCode, 1); + }else { + player.getBadgeManager().tryAddBadge(badgeCode, null, userAchievement.getAchievementInfo().getLevel()); + } + } + + /** + * Locate achivemenet by the next level. + * + * @param achievementType the type of the achievement + * @param nextLevel the next level + * @return return the achievement found, if successful + */ + public AchievementInfo locateAchievement(AchievementType achievementType, int nextLevel) { + for (AchievementInfo achievementInfo : this.achievements.values()) { + if (achievementInfo.getName().equals(achievementType.getName()) && achievementInfo.getLevel() == nextLevel) { + return achievementInfo; + } + } + + return null; + } + + /** + * Locate the achievement by id. + * + * @param achievementId the achievement id + * @return the achievement + */ + public AchievementInfo getAchievement(int achievementId) { + return this.achievements.get(achievementId); + } + + /** + * Get the list of achievements. + * + * @return the list of achievements + */ + public Map getAchievements() { + return achievements; + } + + /** + * Get the {@link AchievementManager} instance + * + * @return the catalogue manager instance + */ + public static AchievementManager getInstance() { + if (instance == null) { + instance = new AchievementManager(); + } + + return instance; + } + + /** + * Reset the {@link AchievementManager} instance + */ + public static void reset() { + instance = null; + getInstance(); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/AchievementProgress.java b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/AchievementProgress.java new file mode 100644 index 0000000..014562e --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/AchievementProgress.java @@ -0,0 +1,8 @@ +package org.alexdev.havana.game.achievements; + +import org.alexdev.havana.game.achievements.user.UserAchievement; +import org.alexdev.havana.game.player.Player; + +public interface AchievementProgress { + boolean tryProgress(Player player, UserAchievement userAchievement, AchievementInfo achievementInfo); +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/AchievementType.java b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/AchievementType.java new file mode 100644 index 0000000..30062d2 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/AchievementType.java @@ -0,0 +1,58 @@ +package org.alexdev.havana.game.achievements; + +import org.alexdev.havana.game.achievements.progressions.AchievementAIPerformanceVote; +import org.alexdev.havana.game.achievements.progressions.*; + +public enum AchievementType { + ACHIEVEMENT_LOOKS("ACH_AvatarLooks", new AchievementAvatarLooks(), true), + ACHIEVEMENT_HC("HC", new AchievementHabboClub(), true), + ACHIEVEMENT_MOTTO("ACH_Motto", new AchievementMotto(), true), + ACHIEVEMENT_RESPECT_GIVEN("ACH_RespectGiven", new AchievementRespectGiven(), true), + ACHIEVEMENT_TAGS("ACH_AvatarTags", new AchievementTags(), true), + ACHIEVEMENT_MGM("ACH_MGM", new AchievementMGM(), true), + ACHIEVEMENT_GRADUATE("ACH_Graduate", new AchievementGraduate(), true), + ACHIEVEMENT_HAPPYHOUR("ACH_HappyHour", new AchievementHappyHour(), true), + ACHIEVEMENT_REGISTRATION_DURATION("ACH_RegistrationDuration", new AchievementRegistrationDuration(), true), + ACHIEVEMENT_ROOMENTRY("ACH_RoomEntry", new AchievementRoomEntry(), true), + ACHIEVEMENT_TRADERPASS("ACH_TraderPass", new AchievementTraderPass(), true), + ACHIEVEMENT_AIPERFORMANCEVOTE("ACH_AIPerformanceVote", new AchievementAIPerformanceVote(), true), + ACHIEVEMENT_RESPECT_EARNED("ACH_RespectEarned", new AchievementRespectEarned(), true), + ACHIEVEMENT_LOGIN("ACH_Login", new AchievementLogin(), true), + ACHIEVEMENT_ALL_TIME_HOTEL_PRESENCE("ACH_AllTimeHotelPresence", new AchievementAllTimeHotelPresence(), true), + ACHIEVEMENT_GAME_PLAYED("ACH_GamePlayed", new AchievementGamePlayed(), true), + ACHIEVEMENT_GUIDE("GL", new AchievementGuide(), false), + ACHIEVEMENT_STUDENT("ACH_Student", new AchievementStudent(), true), + ACHIEVEMENT_EMAIL_VERIFICATION("ACH_EmailVerification", new AchievementEmailVerification(), true); + + private final String avchievementName; + private final AchievementProgress achievementProgressor; + private final boolean removePreviousAchievement; + + AchievementType(String achievementName, AchievementProgress achievementProgressor, boolean removePreviousAchievement) { + this.avchievementName = achievementName; + this.achievementProgressor = achievementProgressor; + this.removePreviousAchievement = removePreviousAchievement; + } + + public static AchievementType getByName(String name) { + for (AchievementType achievementType : values()) { + if (achievementType.getName().equals(name)) { + return achievementType; + } + } + + return null; + } + + public String getName() { + return avchievementName; + } + + public AchievementProgress getProgressor() { + return achievementProgressor; + } + + public boolean hasRemovePreviousAchievement() { + return removePreviousAchievement; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementAIPerformanceVote.java b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementAIPerformanceVote.java new file mode 100644 index 0000000..d4a04da --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementAIPerformanceVote.java @@ -0,0 +1,20 @@ +package org.alexdev.havana.game.achievements.progressions; + +import org.alexdev.havana.game.achievements.AchievementInfo; +import org.alexdev.havana.game.achievements.AchievementProgress; +import org.alexdev.havana.game.achievements.user.UserAchievement; +import org.alexdev.havana.game.player.Player; + +public class AchievementAIPerformanceVote implements AchievementProgress { + @Override + public boolean tryProgress(Player player, UserAchievement userAchievement, AchievementInfo achievementInfo) { + int progress = userAchievement.getProgress() + 1; + + if (progress > achievementInfo.getProgressRequired()) { + progress = achievementInfo.getProgressRequired(); + } + + userAchievement.setProgress(progress); + return true; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementAllTimeHotelPresence.java b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementAllTimeHotelPresence.java new file mode 100644 index 0000000..ff248de --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementAllTimeHotelPresence.java @@ -0,0 +1,23 @@ +package org.alexdev.havana.game.achievements.progressions; + +import org.alexdev.havana.game.achievements.AchievementInfo; +import org.alexdev.havana.game.achievements.AchievementProgress; +import org.alexdev.havana.game.achievements.user.UserAchievement; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.statistics.PlayerStatistic; + +import java.util.concurrent.TimeUnit; + +public class AchievementAllTimeHotelPresence implements AchievementProgress { + @Override + public boolean tryProgress(Player player, UserAchievement userAchievement, AchievementInfo achievementInfo) { + int daysSince = (int) Math.floor(TimeUnit.SECONDS.toHours(player.getStatisticManager().getIntValue(PlayerStatistic.ONLINE_TIME)));//AchievementDao.getOnlineTime(player.getDetails().getId())))); + + if (daysSince >= achievementInfo.getProgressRequired()) { + userAchievement.setProgress(achievementInfo.getProgressRequired()); + return true; + } + + return false; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementAvatarLooks.java b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementAvatarLooks.java new file mode 100644 index 0000000..2911b87 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementAvatarLooks.java @@ -0,0 +1,14 @@ +package org.alexdev.havana.game.achievements.progressions; + +import org.alexdev.havana.game.achievements.AchievementInfo; +import org.alexdev.havana.game.achievements.AchievementProgress; +import org.alexdev.havana.game.achievements.user.UserAchievement; +import org.alexdev.havana.game.player.Player; + +public class AchievementAvatarLooks implements AchievementProgress { + @Override + public boolean tryProgress(Player player, UserAchievement userAchievement, AchievementInfo achievementInfo) { + userAchievement.setProgress(achievementInfo.getProgressRequired()); + return true; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementEmailVerification.java b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementEmailVerification.java new file mode 100644 index 0000000..749c54a --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementEmailVerification.java @@ -0,0 +1,13 @@ +package org.alexdev.havana.game.achievements.progressions; + +import org.alexdev.havana.game.achievements.AchievementInfo; +import org.alexdev.havana.game.achievements.AchievementProgress; +import org.alexdev.havana.game.achievements.user.UserAchievement; +import org.alexdev.havana.game.player.Player; + +public class AchievementEmailVerification implements AchievementProgress { + @Override + public boolean tryProgress(Player player, UserAchievement userAchievement, AchievementInfo achievementInfo) { + return false; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementGamePlayed.java b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementGamePlayed.java new file mode 100644 index 0000000..2ebd859 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementGamePlayed.java @@ -0,0 +1,25 @@ +package org.alexdev.havana.game.achievements.progressions; + +import org.alexdev.havana.game.achievements.AchievementInfo; +import org.alexdev.havana.game.achievements.AchievementProgress; +import org.alexdev.havana.game.achievements.user.UserAchievement; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.statistics.PlayerStatistic; + +public class AchievementGamePlayed implements AchievementProgress { + @Override + public boolean tryProgress(Player player, UserAchievement userAchievement, AchievementInfo achievementInfo) { + int progress = player.getStatisticManager().getIntValue(PlayerStatistic.BATTLEBALL_GAMES_WON) + player.getStatisticManager().getIntValue(PlayerStatistic.SNOWSTORM_GAMES_WON); + + if (progress >= userAchievement.getProgress()) { + if (progress > achievementInfo.getProgressRequired()) { + progress = achievementInfo.getProgressRequired(); + } + + userAchievement.setProgress(progress); + return true; + } + + return false; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementGraduate.java b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementGraduate.java new file mode 100644 index 0000000..c8dbd77 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementGraduate.java @@ -0,0 +1,23 @@ +package org.alexdev.havana.game.achievements.progressions; + +import org.alexdev.havana.game.achievements.AchievementInfo; +import org.alexdev.havana.game.achievements.AchievementProgress; +import org.alexdev.havana.game.achievements.user.UserAchievement; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.util.config.GameConfiguration; + +public class AchievementGraduate implements AchievementProgress { + @Override + public boolean tryProgress(Player player, UserAchievement userAchievement, AchievementInfo achievementInfo) { + if (!GameConfiguration.getInstance().getBoolean("tutorial.enabled")) { + return false; + } + + //if (!player.getDetails().getTutorialFlags().contains(1)) { + userAchievement.setProgress(achievementInfo.getProgressRequired()); + return true; + //} + + //return false; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementGuide.java b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementGuide.java new file mode 100644 index 0000000..fdea053 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementGuide.java @@ -0,0 +1,21 @@ +package org.alexdev.havana.game.achievements.progressions; + +import org.alexdev.havana.game.achievements.AchievementInfo; +import org.alexdev.havana.game.achievements.AchievementProgress; +import org.alexdev.havana.game.achievements.user.UserAchievement; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.statistics.PlayerStatistic; + +public class AchievementGuide implements AchievementProgress { + @Override + public boolean tryProgress(Player player, UserAchievement userAchievement, AchievementInfo achievementInfo) { + int progress = player.getStatisticManager().getIntValue(PlayerStatistic.PLAYERS_GUIDED); + + if (progress >= userAchievement.getProgress()) { + userAchievement.setProgress(progress); + return true; + } + + return false; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementHabboClub.java b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementHabboClub.java new file mode 100644 index 0000000..2991fc3 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementHabboClub.java @@ -0,0 +1,39 @@ +package org.alexdev.havana.game.achievements.progressions; + +import org.alexdev.havana.game.achievements.AchievementInfo; +import org.alexdev.havana.game.achievements.AchievementProgress; +import org.alexdev.havana.game.achievements.user.UserAchievement; +import org.alexdev.havana.game.club.ClubSubscription; +import org.alexdev.havana.game.player.Player; + +public class AchievementHabboClub implements AchievementProgress { + @Override + public boolean tryProgress(Player player, UserAchievement userAchievement, AchievementInfo achievementInfo) { + boolean canProgress = false; + + if (achievementInfo.getLevel() == 1) { + if (player.getDetails().hasClubSubscription()) { + canProgress = true; + } + } + + if (achievementInfo.getLevel() == 2) { + if (ClubSubscription.hasGoldClubSubscription(player)) { + canProgress = true; + } + } + + if (achievementInfo.getLevel() == 3) { + if (ClubSubscription.hasPlatinumClubSubscription(player)) { + canProgress = true; + } + } + + if (canProgress) { + userAchievement.setProgress(achievementInfo.getProgressRequired()); + return true; + } + + return false; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementHappyHour.java b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementHappyHour.java new file mode 100644 index 0000000..5bee738 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementHappyHour.java @@ -0,0 +1,19 @@ +package org.alexdev.havana.game.achievements.progressions; + +import org.alexdev.havana.Havana; +import org.alexdev.havana.game.achievements.AchievementInfo; +import org.alexdev.havana.game.achievements.AchievementProgress; +import org.alexdev.havana.game.achievements.user.UserAchievement; +import org.alexdev.havana.game.player.Player; + +public class AchievementHappyHour implements AchievementProgress { + @Override + public boolean tryProgress(Player player, UserAchievement userAchievement, AchievementInfo achievementInfo) { + if (Havana.isHappyHour()) { + userAchievement.setProgress(achievementInfo.getProgressRequired()); + return true; + } + + return false; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementLogin.java b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementLogin.java new file mode 100644 index 0000000..81b7a22 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementLogin.java @@ -0,0 +1,51 @@ +package org.alexdev.havana.game.achievements.progressions; + +import org.alexdev.havana.game.achievements.AchievementInfo; +import org.alexdev.havana.game.achievements.AchievementProgress; +import org.alexdev.havana.game.achievements.user.UserAchievement; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.statistics.PlayerStatistic; +import org.alexdev.havana.util.DateUtil; + +import java.util.concurrent.TimeUnit; + +public class AchievementLogin implements AchievementProgress { + @Override + public boolean tryProgress(Player player, UserAchievement userAchievement, AchievementInfo achievementInfo) { + int progress = 0; + + if (!player.getDetails().getPreviousRespectDay().equals(DateUtil.getCurrentDate(DateUtil.SHORT_DATE))) { + String yesterday = DateUtil.getDate(DateUtil.getCurrentTimeSeconds() - TimeUnit.DAYS.toSeconds(1), DateUtil.SHORT_DATE); + + if (yesterday.equals(player.getDetails().getPreviousRespectDay())) { + progress++; + } else { + player.getStatisticManager().setLongValue(PlayerStatistic.DAYS_LOGGED_IN_ROW, 0); + } + } + + /*PlayerStatisticsDao.getStatistic(player.getDetails().getId(), PlayerStatistic.DAYS_LOGGED_IN_ROW); + if (TimeUnit.SECONDS.toDays(daysBtwLastLogin) > 1) { + progress = 0; + } + else if (TimeUnit.SECONDS.toDays(daysBtwLastLogin) == 1) { + progress++; + }*/ + + if (progress > 0) { + player.getStatisticManager().incrementValue(PlayerStatistic.DAYS_LOGGED_IN_ROW, progress); + progress = player.getStatisticManager().getIntValue(PlayerStatistic.DAYS_LOGGED_IN_ROW); + } + + if (progress > achievementInfo.getProgressRequired()) { + progress = achievementInfo.getProgressRequired(); + } + + if (progress > 0) { + userAchievement.setProgress(progress); + return true; + } + + return false; + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementMGM.java b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementMGM.java new file mode 100644 index 0000000..39dd981 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementMGM.java @@ -0,0 +1,26 @@ +package org.alexdev.havana.game.achievements.progressions; + +import org.alexdev.havana.dao.mysql.ReferredDao; +import org.alexdev.havana.dao.mysql.TagDao; +import org.alexdev.havana.game.achievements.AchievementInfo; +import org.alexdev.havana.game.achievements.AchievementProgress; +import org.alexdev.havana.game.achievements.user.UserAchievement; +import org.alexdev.havana.game.player.Player; + +public class AchievementMGM implements AchievementProgress { + @Override + public boolean tryProgress(Player player, UserAchievement userAchievement, AchievementInfo achievementInfo) { + int progress = ReferredDao.countReferred(player.getDetails().getId()); + + if (progress > achievementInfo.getProgressRequired()) { + progress = achievementInfo.getProgressRequired(); + } + + if (progress != userAchievement.getProgress()) { + userAchievement.setProgress(progress); + return true; + } + + return false; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementMotto.java b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementMotto.java new file mode 100644 index 0000000..64f53ce --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementMotto.java @@ -0,0 +1,14 @@ +package org.alexdev.havana.game.achievements.progressions; + +import org.alexdev.havana.game.achievements.AchievementInfo; +import org.alexdev.havana.game.achievements.AchievementProgress; +import org.alexdev.havana.game.achievements.user.UserAchievement; +import org.alexdev.havana.game.player.Player; + +public class AchievementMotto implements AchievementProgress { + @Override + public boolean tryProgress(Player player, UserAchievement userAchievement, AchievementInfo achievementInfo) { + userAchievement.setProgress(achievementInfo.getProgressRequired()); + return true; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementRegistrationDuration.java b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementRegistrationDuration.java new file mode 100644 index 0000000..47ac9ed --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementRegistrationDuration.java @@ -0,0 +1,24 @@ +package org.alexdev.havana.game.achievements.progressions; + +import org.alexdev.havana.Havana; +import org.alexdev.havana.game.achievements.AchievementInfo; +import org.alexdev.havana.game.achievements.AchievementProgress; +import org.alexdev.havana.game.achievements.user.UserAchievement; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.util.DateUtil; + +import java.util.concurrent.TimeUnit; + +public class AchievementRegistrationDuration implements AchievementProgress { + @Override + public boolean tryProgress(Player player, UserAchievement userAchievement, AchievementInfo achievementInfo) { + int daysSinceJoined = (int) Math.floor(TimeUnit.SECONDS.toDays((long) (DateUtil.getCurrentTimeSeconds() - Math.floor(player.getDetails().getJoinDate())))); + + if (daysSinceJoined >= achievementInfo.getProgressRequired()) { + userAchievement.setProgress(achievementInfo.getProgressRequired()); + return true; + } + + return false; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementRespectEarned.java b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementRespectEarned.java new file mode 100644 index 0000000..3cee855 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementRespectEarned.java @@ -0,0 +1,67 @@ +package org.alexdev.havana.game.achievements.progressions; + +import org.alexdev.havana.dao.mysql.AchievementDao; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.game.achievements.AchievementInfo; +import org.alexdev.havana.game.achievements.AchievementManager; +import org.alexdev.havana.game.achievements.AchievementProgress; +import org.alexdev.havana.game.achievements.AchievementType; +import org.alexdev.havana.game.achievements.user.UserAchievement; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.rooms.user.RESPECT_NOTIFICATION; + +import java.util.stream.Collectors; + +public class AchievementRespectEarned implements AchievementProgress { + public static void convertOldPoints(Player player) { + if (!(player.getDetails().getRespectPoints() > 0)) { + return; + } + + for (int i = 1; i < 11; i++) { + if (!(player.getDetails().getRespectPoints() > 0)) { + continue; + } + + AchievementInfo achievementInfo = AchievementManager.getInstance().locateAchievement(AchievementType.ACHIEVEMENT_RESPECT_EARNED, i); + + if (player.getDetails().getRespectPoints() >= achievementInfo.getProgressRequired()) { + player.getDetails().setRespectPoints(player.getDetails().getRespectPoints() - achievementInfo.getProgressRequired()); + + var achievement = player.getAchievementManager().locateAchievement(AchievementType.ACHIEVEMENT_RESPECT_EARNED); + achievement.setProgress(achievementInfo.getProgressRequired() - 1); + AchievementDao.saveUserAchievement(player.getDetails().getId(), achievement); + } else { + int currentPoints = player.getDetails().getRespectPoints(); + player.getDetails().setRespectPoints(0); + + var achievement = player.getAchievementManager().locateAchievement(AchievementType.ACHIEVEMENT_RESPECT_EARNED); + achievement.setProgress(currentPoints - 1); + AchievementDao.saveUserAchievement(player.getDetails().getId(), achievement); + } + + AchievementManager.getInstance().tryProgress(AchievementType.ACHIEVEMENT_RESPECT_EARNED, player); + } + + if (player.getDetails().getRespectPoints() > 0) { + player.getDetails().setRespectPoints(0); + } + + PlayerDao.saveRespect(player.getDetails().getId(), player.getDetails().getDailyRespectPoints(), player.getDetails().getRespectPoints(), player.getDetails().getRespectDay(), player.getDetails().getRespectGiven()); + } + @Override + public boolean tryProgress(Player player, UserAchievement userAchievement, AchievementInfo achievementInfo) { + int progress = userAchievement.getProgress() + 1; + + if (progress > achievementInfo.getProgressRequired()) { + progress = achievementInfo.getProgressRequired(); + } + + if (progress != userAchievement.getProgress()) { + userAchievement.setProgress(progress); + return true; + } + + return false; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementRespectGiven.java b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementRespectGiven.java new file mode 100644 index 0000000..e2535fc --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementRespectGiven.java @@ -0,0 +1,14 @@ +package org.alexdev.havana.game.achievements.progressions; + +import org.alexdev.havana.game.achievements.AchievementInfo; +import org.alexdev.havana.game.achievements.AchievementProgress; +import org.alexdev.havana.game.achievements.user.UserAchievement; +import org.alexdev.havana.game.player.Player; + +public class AchievementRespectGiven implements AchievementProgress { + @Override + public boolean tryProgress(Player player, UserAchievement userAchievement, AchievementInfo achievementInfo) { + userAchievement.setProgress(userAchievement.getProgress() + 1); + return true; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementRoomEntry.java b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementRoomEntry.java new file mode 100644 index 0000000..87d9b3d --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementRoomEntry.java @@ -0,0 +1,25 @@ +package org.alexdev.havana.game.achievements.progressions; + +import org.alexdev.havana.dao.mysql.RoomVisitsDao; +import org.alexdev.havana.game.achievements.AchievementInfo; +import org.alexdev.havana.game.achievements.AchievementProgress; +import org.alexdev.havana.game.achievements.user.UserAchievement; +import org.alexdev.havana.game.player.Player; + +public class AchievementRoomEntry implements AchievementProgress { + @Override + public boolean tryProgress(Player player, UserAchievement userAchievement, AchievementInfo achievementInfo) { + int progress = RoomVisitsDao.countVisits(player.getDetails().getId()); + + if (progress > achievementInfo.getProgressRequired()) { + progress = achievementInfo.getProgressRequired(); + } + + if (progress != userAchievement.getProgress()) { + userAchievement.setProgress(progress); + return true; + } + + return false; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementStudent.java b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementStudent.java new file mode 100644 index 0000000..c229b6b --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementStudent.java @@ -0,0 +1,14 @@ +package org.alexdev.havana.game.achievements.progressions; + +import org.alexdev.havana.game.achievements.AchievementInfo; +import org.alexdev.havana.game.achievements.AchievementProgress; +import org.alexdev.havana.game.achievements.user.UserAchievement; +import org.alexdev.havana.game.player.Player; + +public class AchievementStudent implements AchievementProgress { + @Override + public boolean tryProgress(Player player, UserAchievement userAchievement, AchievementInfo achievementInfo) { + userAchievement.setProgress(achievementInfo.getProgressRequired()); + return true; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementTags.java b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementTags.java new file mode 100644 index 0000000..38e6035 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementTags.java @@ -0,0 +1,28 @@ +package org.alexdev.havana.game.achievements.progressions; + +import org.alexdev.havana.dao.mysql.TagDao; +import org.alexdev.havana.game.achievements.AchievementInfo; +import org.alexdev.havana.game.achievements.AchievementProgress; +import org.alexdev.havana.game.achievements.user.UserAchievement; +import org.alexdev.havana.game.player.Player; + +public class AchievementTags implements AchievementProgress { + @Override + public boolean tryProgress(Player player, UserAchievement userAchievement, AchievementInfo achievementInfo) { + var tagList = TagDao.getUserTags(player.getDetails().getId()); + + int progress = tagList.size(); + + if (progress >= 5) { + progress = achievementInfo.getProgressRequired(); + } + + if (progress >= achievementInfo.getProgressRequired()) { + userAchievement.setProgress(progress); + return true; + } + + + return false; + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementTraderPass.java b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementTraderPass.java new file mode 100644 index 0000000..0f2c9e1 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/progressions/AchievementTraderPass.java @@ -0,0 +1,31 @@ +package org.alexdev.havana.game.achievements.progressions; + +import org.alexdev.havana.game.achievements.AchievementInfo; +import org.alexdev.havana.game.achievements.AchievementProgress; +import org.alexdev.havana.game.achievements.user.UserAchievement; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.util.config.GameConfiguration; + +public class AchievementTraderPass implements AchievementProgress { + @Override + public boolean tryProgress(Player player, UserAchievement userAchievement, AchievementInfo achievementInfo) { + /*var canUseTrade = true;TimeUnit.SECONDS.toDays(DateUtil.getCurrentTimeSeconds() - player.getDetails().getJoinDate()) >= 3 && + player.getStatisticManager().getIntValue(PlayerStatistic.ONLINE_TIME) >= TimeUnit.MINUTES.toHours(60) && player.getDetails().isTradeEnabled();*/ + + if (player.getDetails().isTradeEnabled()/* && isActivated(player.getStatisticManager().getValue(PlayerStatistic.ACTIVATION_CODE))*/) { + userAchievement.setProgress(achievementInfo.getProgressRequired()); + return true; + } + + return false; + } + + public static boolean isActivated(String activationCode) { + if (!GameConfiguration.getInstance().getBoolean("email.smtp.enable")) { + return true; + } + + return activationCode == null; + } + +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/user/UserAchievement.java b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/user/UserAchievement.java new file mode 100644 index 0000000..412dfd0 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/user/UserAchievement.java @@ -0,0 +1,52 @@ +package org.alexdev.havana.game.achievements.user; + +import org.alexdev.havana.game.achievements.AchievementInfo; +import org.alexdev.havana.game.achievements.AchievementManager; + +public class UserAchievement { + private int achievementId; + private int userId; + private int progress; + + public UserAchievement(int achievementId, int userId, int progress) { + this.achievementId = achievementId; + this.userId = userId; + this.progress = progress; + } + + /** + * Get the achievement information. + * + * @return the achievement information + */ + public AchievementInfo getAchievementInfo() { + return AchievementManager.getInstance().getAchievement(this.achievementId); + } + + /** + * Get the user id who has this achievement. + * + * @return the user id + */ + public int getUserId() { + return userId; + } + + /** + * Get the current progress of the achievement. + * + * @return the progress + */ + public int getProgress() { + return progress; + } + + /** + * Set the current progress of the achievement. + * + * @param progress the current progress + */ + public void setProgress(int progress) { + this.progress = progress; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/user/UserAchievementManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/user/UserAchievementManager.java new file mode 100644 index 0000000..35ca0f0 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/achievements/user/UserAchievementManager.java @@ -0,0 +1,260 @@ +package org.alexdev.havana.game.achievements.user; + +import org.alexdev.havana.dao.mysql.AchievementDao; +import org.alexdev.havana.game.achievements.AchievementInfo; +import org.alexdev.havana.game.achievements.AchievementManager; +import org.alexdev.havana.game.achievements.AchievementType; +import org.alexdev.havana.game.club.ClubSubscription; +import org.alexdev.havana.game.groups.GroupMemberRank; +import org.alexdev.havana.game.guides.GuideManager; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.config.GameConfiguration; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +public class UserAchievementManager { + private int playerId; + private List userAchievements; + + /** + * Load the user achievements by the player. + * + * @param playerId the player to load + */ + public void loadAchievements(int playerId) { + this.playerId = playerId; + this.userAchievements = AchievementDao.getUserAchievements(playerId); + } + + /** + * Find user achievement by given name. + * + * @param achievementType the achievement type + * @return the user achievement + */ + public UserAchievement locateAchievement(AchievementType achievementType) { + if (this.userAchievements == null) { + return null; + } + + var optional = this.userAchievements.stream() + .filter(ach -> ach.getAchievementInfo().getName().equals(achievementType.getName())) + .sorted(Comparator.comparingInt(ach -> ach.getAchievementInfo().getLevel())) + .collect(Collectors.toList()); + + UserAchievement latestAchievement = null; + + if (optional.size() > 0) { + latestAchievement = optional.get(optional.size() - 1); + } + + if (latestAchievement != null) { + // User has already completed the achievement? Try add the next achievement else return nothing + if (latestAchievement.getProgress() >= latestAchievement.getAchievementInfo().getProgressRequired()) { + var nextAchievement = AchievementManager.getInstance().locateAchievement(achievementType, latestAchievement.getAchievementInfo().getLevel() + 1); + + if (nextAchievement != null) { + var userAchievement = new UserAchievement(nextAchievement.getId(), playerId, 0); + AchievementDao.newUserAchievement(playerId, userAchievement); + + this.userAchievements.add(userAchievement); + return userAchievement; + } else { + return null; + } + } else { + return latestAchievement; + } + + } else { + int achievementId = AchievementManager.getInstance().locateAchievement(achievementType, 1).getId(); + + var userAchievement = new UserAchievement(achievementId, playerId, 0); + AchievementDao.newUserAchievement(playerId, userAchievement); + + this.userAchievements.add(userAchievement); + return userAchievement; + } + } + + /** + * Generate the list of possible achievements a user can get. + * + * @return the list of possible achievements + */ + public List getPossibleAchievements() { + List possibleAchievements = new ArrayList<>(); + + for (var achievementInfo : AchievementManager.getInstance().getAchievements().values()) { + if (this.userAchievements.stream().anyMatch(userAchievement -> + userAchievement.getAchievementInfo().getName().equals(achievementInfo.getName()) && + userAchievement.getProgress() >= achievementInfo.getProgressRequired())) { + continue; + } + + long badgeCount = possibleAchievements.stream().filter(userAchievement -> userAchievement.getName().equals(achievementInfo.getName())).count(); + + if (badgeCount >= 5) { + continue; + } + + if (this.userAchievements.stream().anyMatch(userAchievement -> userAchievement.getAchievementInfo().getName().equals(achievementInfo.getName()) && userAchievement.getProgress() >= achievementInfo.getProgressRequired())) { + var optionalUserAchievement = this.userAchievements.stream().filter(userAchievement -> userAchievement.getAchievementInfo().getName().equals(achievementInfo.getName())).findFirst(); + + if (optionalUserAchievement.isPresent()) { + var foundAchievement = optionalUserAchievement.get(); + var newAchievement = AchievementManager.getInstance().locateAchievement(AchievementType.getByName(achievementInfo.getName()), foundAchievement.getAchievementInfo().getLevel() + 1); + + if (newAchievement != null) { + possibleAchievements.add(newAchievement); + } + } + } else { + possibleAchievements.add(achievementInfo); + } + } + + possibleAchievements.sort(Comparator.comparing(achievementInfo -> (achievementInfo.getName() + achievementInfo.getLevel()))); + return possibleAchievements; + } + + /** + * Get the user achievements. + * + * @return the user achievements + */ + public List getUserAchievements() { + return userAchievements; + } + + /** + * Get the achievement by level. + */ + public UserAchievement getAchievement(AchievementType achievementType, int level) { + for (var achievement : userAchievements) { + if (achievement.getAchievementInfo().getName().equals(achievementType.getName())) { + if (achievement.getAchievementInfo().getLevel() == level) { + return achievement; + } + } + } + + return null; + } + + /** + * Get the max completed achievement the user has by achievement name + */ + public UserAchievement getLatestAchievement(AchievementType achievementType) { + List achievements = this.userAchievements.stream().filter(achievement -> achievement.getAchievementInfo().getName().equals(achievementType.getName())) + .sorted(Comparator.comparingInt((UserAchievement achievement) -> achievement.getAchievementInfo().getLevel()).reversed()) + .collect(Collectors.toList()); + + achievements.removeIf(achievement -> achievement.getAchievementInfo().getProgressRequired() > achievement.getProgress()); + return achievements.size() > 0 ? achievements.get(0) : null; + } + + /** + * Process any achievements when user logs in again. + */ + public void processAchievements(Player player, boolean isLogin) { + if (isLogin) { + AchievementManager.getInstance().tryProgress(AchievementType.ACHIEVEMENT_TAGS, player); + AchievementManager.getInstance().tryProgress(AchievementType.ACHIEVEMENT_LOGIN, player); + } + + AchievementManager.getInstance().tryProgress(AchievementType.ACHIEVEMENT_HC, player); + AchievementManager.getInstance().tryProgress(AchievementType.ACHIEVEMENT_MGM, player); + AchievementManager.getInstance().tryProgress(AchievementType.ACHIEVEMENT_HAPPYHOUR, player); + AchievementManager.getInstance().tryProgress(AchievementType.ACHIEVEMENT_REGISTRATION_DURATION, player); + AchievementManager.getInstance().tryProgress(AchievementType.ACHIEVEMENT_HC, player); + AchievementManager.getInstance().tryProgress(AchievementType.ACHIEVEMENT_ALL_TIME_HOTEL_PRESENCE, player); + AchievementManager.getInstance().tryProgress(AchievementType.ACHIEVEMENT_GUIDE, player); + AchievementManager.getInstance().tryProgress(AchievementType.ACHIEVEMENT_TRADERPASS, player); + AchievementManager.getInstance().tryProgress(AchievementType.ACHIEVEMENT_EMAIL_VERIFICATION, player); + + GuideManager.getInstance().tryProgress(player); + GuideManager.getInstance().checkGuidingFriends(player); + + ClubSubscription.checkBadges(player); + + // Habbo Guide admins + if (player.getGuideManager().isGuide()) { + if (!player.getBadgeManager().hasBadge("GLK")) { + int guideGroupId = GameConfiguration.getInstance().getInteger("guides.group.id"); + var groupMember = player.getJoinedGroup(guideGroupId).getMember(player.getDetails().getId()); + + if (groupMember != null && + (groupMember.getMemberRank() == GroupMemberRank.ADMINISTRATOR || + groupMember.getMemberRank() == GroupMemberRank.OWNER)) { + player.getBadgeManager().tryAddBadge("GLK", null); + } else { + player.getGuideManager().setGuide(GuideManager.getInstance().isGuide(player)); + } + } + } + + // Habbo eXperts + if (GameConfiguration.getInstance().getInteger("habbo.experts.group.id") > 0) { + if (!player.getBadgeManager().hasBadge("XXX")) { + int expertsGroupId = GameConfiguration.getInstance().getInteger("habbo.experts.group.id"); + var group = player.getJoinedGroup(expertsGroupId); + + if (group != null) { + var expertsMember = group.getMember(player.getDetails().getId()); + + if (expertsMember != null) { + player.getBadgeManager().tryAddBadge("XXX", null); + } + } + } + } + + // ChildLine + if (GameConfiguration.getInstance().getInteger("childline.group.id") > 0) { + if (!player.getBadgeManager().hasBadge("UK176")) { + int expertsGroupId = GameConfiguration.getInstance().getInteger("childline.group.id"); + var group = player.getJoinedGroup(expertsGroupId); + + if (group != null) { + var expertsMember = group.getMember(player.getDetails().getId()); + + if (expertsMember != null) { + player.getBadgeManager().tryAddBadge("UK176", null); + } + } + } + } + + Calendar currentCalendar = Calendar.getInstance(); + currentCalendar.setTimeInMillis(player.getDetails().getJoinDate() * 1000); + + //System.out.println("Join date: " + currentCalendar.get(Calendar.YEAR) + " / " + currentCalendar.get(Calendar.MONTH) + " / " + currentCalendar.get(Calendar.DAY_OF_MONTH)); + + long currentTime = DateUtil.getCurrentTimeSeconds(); + //long time = DateUtil.getFromFormat(DateUtil.SHORT_DATE, "11-11-2019"); + + if ((currentTime > DateUtil.getFromFormat(DateUtil.SHORT_DATE, "1-12-2019")) && (currentTime < DateUtil.getFromFormat(DateUtil.SHORT_DATE, "31-12-2019"))) { + player.getBadgeManager().tryAddBadge("XM19", null); + } + + long joinDate = player.getDetails().getJoinDate(); + + if ((joinDate > DateUtil.getFromFormat(DateUtil.SHORT_DATE, "10-12-2019")) && (joinDate < DateUtil.getFromFormat(DateUtil.SHORT_DATE, "18-12-2019"))) { + player.getBadgeManager().tryAddBadge("MRG00", null); + } + + // If joined opening day + if ((joinDate > DateUtil.getFromFormat(DateUtil.SHORT_DATE, "10-12-2019")) && (joinDate <= DateUtil.getFromFormat(DateUtil.SHORT_DATE, "12-12-2019"))) { + player.getBadgeManager().tryAddBadge("Z64", null); + } + + // Remove special badge. + //player.getBadgeManager().tryAddBadge("Z64", null); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/ads/AdManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/ads/AdManager.java new file mode 100644 index 0000000..e433287 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/ads/AdManager.java @@ -0,0 +1,97 @@ +package org.alexdev.havana.game.ads; + +import org.alexdev.havana.dao.mysql.AdvertisementsDao; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ThreadLocalRandom; +import java.util.stream.Collectors; + +public class AdManager { + private static AdManager instance; + private final Map> ads; + + public AdManager() { + this.ads = AdvertisementsDao.getAds(); + } + + /** + * Get the {@link AdManager} instance + * + * @return the item manager instance + */ + public static AdManager getInstance() { + if (instance == null) { + instance = new AdManager(); + } + + return instance; + } + + /** + * Resets the item manager singleton. + */ + public void reset() { + instance = null; + AdManager.getInstance(); + } + + /** + * Get the collection of ads to use. + * + * @return the list of ads + */ + public Advertisement getRandomAd(int roomId) { + if (this.ads.containsKey(roomId)) { + List advertisements = this.ads.get(roomId).stream().filter(ad -> ad.isEnabled() && !ad.isLoadingAd()).collect(Collectors.toList()); + return advertisements.get(ThreadLocalRandom.current().nextInt(advertisements.size())); + } + + return null; + } + + /** + * Get the collection of ads to use. + * + * @return the list of ads + */ + public Advertisement getRandomLoadingAd() { + List advertisements = this.ads.containsKey(-1) ? this.ads.get(-1).stream().filter(ad -> ad.isEnabled() && ad.isLoadingAd()).collect(Collectors.toList()) : List.of(); + + if (advertisements.size() > 0) { + return advertisements.get(ThreadLocalRandom.current().nextInt(advertisements.size())); + } + + return null; + } + + /** + * Get the collection of ads to use. + * + * @return the list of ads + */ + public Advertisement getAd(int id) { + for (var kvp : this.ads.values()) { + for (Advertisement advertisement : kvp) { + if (advertisement.getId() == id) { + return advertisement; + } + } + } + + return null; + } + + public List getAds() { + List advertisementList = new ArrayList<>(); + + for (var roomAds : ads.values()) { + for (var ad : roomAds) { + advertisementList.add(ad); + } + } + + return advertisementList; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/ads/Advertisement.java b/Havana-Server/src/main/java/org/alexdev/havana/game/ads/Advertisement.java new file mode 100644 index 0000000..4b642c3 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/ads/Advertisement.java @@ -0,0 +1,43 @@ +package org.alexdev.havana.game.ads; + +public class Advertisement { + private int id; + private int roomId; + private boolean isLoadingAd; + private String image; + private String url; + private boolean enabled; + + public Advertisement(int id, boolean isLoadingAd, int roomId, String image, String url, boolean enabled) { + this.id = id; + this.isLoadingAd = isLoadingAd; + this.roomId = roomId; + this.image = image; + this.url = url; + this.enabled = enabled; + } + + public int getId() { + return id; + } + + public boolean isLoadingAd() { + return isLoadingAd; + } + + public int getRoomId() { + return roomId; + } + + public String getImage() { + return image; + } + + public String getUrl() { + return url; + } + + public boolean isEnabled() { + return enabled; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/alerts/AccountAlert.java b/Havana-Server/src/main/java/org/alexdev/havana/game/alerts/AccountAlert.java new file mode 100644 index 0000000..27997c4 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/alerts/AccountAlert.java @@ -0,0 +1,43 @@ +package org.alexdev.havana.game.alerts; + +public class AccountAlert { + private final int id; + private final int userId; + private final AlertType alertType; + private final String message; + private final boolean isDisabled; + private final long createdAt; + + public AccountAlert(int id, int userId, AlertType alertType, String message, boolean isDisabled, long createdAt) { + this.id = id; + this.userId = userId; + this.alertType = alertType; + this.message = message; + this.isDisabled = isDisabled; + this.createdAt = createdAt; + } + + public int getId() { + return id; + } + + public int getUserId() { + return userId; + } + + public AlertType getAlertType() { + return alertType; + } + + public String getMessage() { + return message; + } + + public boolean isDisabled() { + return isDisabled; + } + + public long getCreatedAt() { + return createdAt; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/alerts/AlertType.java b/Havana-Server/src/main/java/org/alexdev/havana/game/alerts/AlertType.java new file mode 100644 index 0000000..bef33f8 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/alerts/AlertType.java @@ -0,0 +1,8 @@ +package org.alexdev.havana.game.alerts; + +public enum AlertType { + HC_EXPIRED, + PRESENT, + TUTOR_SCORE, + CREDIT_DONATION +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/badges/Badge.java b/Havana-Server/src/main/java/org/alexdev/havana/game/badges/Badge.java new file mode 100644 index 0000000..98b1a34 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/badges/Badge.java @@ -0,0 +1,33 @@ +package org.alexdev.havana.game.badges; + +public class Badge { + private String badgeCode; + private boolean equipped; + private int slotId; + + public Badge(String badgeCode, boolean equipped, int slotId) { + this.badgeCode = badgeCode; + this.equipped = equipped; + this.slotId = slotId; + } + + public String getBadgeCode() { + return badgeCode; + } + + public boolean isEquipped() { + return equipped; + } + + public void setEquipped(boolean equipped) { + this.equipped = equipped; + } + + public int getSlotId() { + return slotId; + } + + public void setSlotId(int slotId) { + this.slotId = slotId; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/badges/BadgeManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/badges/BadgeManager.java new file mode 100644 index 0000000..92af208 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/badges/BadgeManager.java @@ -0,0 +1,195 @@ +package org.alexdev.havana.game.badges; + +import org.alexdev.havana.dao.mysql.BadgeDao; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.user.badges.ACHIEVEMENT_NOTIFICATION; +import org.alexdev.havana.messages.outgoing.user.badges.AVAILABLE_BADGES; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +public class BadgeManager { + private int userId; + private Player player; + + private List badges; + private Set badgesToSave; + + public BadgeManager() { + this.badgesToSave = new HashSet<>(); + } + + /** + * Load badges by constructor, the player will be null. + * + * @param userId the user id + */ + public BadgeManager(int userId) { + super(); + this.userId = userId; + this.badges = BadgeDao.getBadges(userId); + } + + /** + * Load players used when client logs into server. + * + * @param player the player instance + */ + public void loadBadges(Player player) { + this.player = player; + this.userId = player.getDetails().getId(); + this.badges = BadgeDao.getBadges(this.userId); + } + + /** + * Refresh badges, will also try and see if it can progress any achievements. + */ + public void refreshBadges() { + this.player.send(new AVAILABLE_BADGES(this.getBadges(), this.getEquippedBadges())); + } + + /** + * Get if the user has a badge. + * + * @param badgeCode the badge code to check + * @return true, if they do + */ + public boolean hasBadge(String badgeCode) { + for (Badge badge : this.badges) { + if (badge.getBadgeCode().toLowerCase().equals(badgeCode.toLowerCase())) { + return true; + } + } + + return false; + } + + /** + * Get the badge instance by badge code. + * + * @param badgeCode the badge code to check for. + * @return the badge instance, if found + */ + public Badge getBadge(String badgeCode) { + for (Badge badge : this.badges) { + if (badge.getBadgeCode().toLowerCase().equals(badgeCode.toLowerCase())) { + return badge; + } + } + + return null; + } + + /** + * Change the badge, by setting it as equipped or not, slot id or not, by the badge code. + * + * @param badgeCode the badge code of the badge to edit + * @param equipped whether it's equipped + * @param slotId the badge slot id (1-5) + */ + public void changeBadge(String badgeCode, boolean equipped, int slotId) { + if (!this.hasBadge(badgeCode)) { + return; + } + + Badge badge = this.getBadge(badgeCode); + badge.setEquipped(equipped); + badge.setSlotId(slotId); + + this.badgesToSave.add(badge); + } + + /** + * Try and add badge to player, if successful, will send a notification that a badge has been added. + * + * @param badgeCode the code of the badge to add + * @param badgeRemove the badge to remove (such as achievements replacing the lower level) + * @return the badge instance, if successfully added + */ + public Badge tryAddBadge(String badgeCode, String badgeRemove) { + return tryAddBadge(badgeCode, badgeRemove, 0); + } + + /** + * Try and add badge to player, if successful, will send a notification that a badge has been added. + * + * @param badgeCode the code of the badge to add + * @param badgeRemove the badge to remove (such as achievements replacing the lower level) + * @param level the level to add + * @return the badge instance, if successfully added + */ + public Badge tryAddBadge(String badgeCode, String badgeRemove, int level) { + if (this.hasBadge(badgeCode)) { + return null; + } + + if (badgeRemove != null) { + this.removeBadge(badgeRemove); + } + + Badge badge = new Badge(badgeCode, false, 0); + this.badges.add(badge); + + BadgeDao.newBadge(this.userId, badgeCode); + + if (this.player != null) { + this.player.send(new ACHIEVEMENT_NOTIFICATION(badgeCode, badgeRemove, level)); + } + return badge; + } + + /** + * Remove the badge by badge code. + * + * @param badgeCode the badge code to add + * @return the instance of the badge removed. + */ + public Badge removeBadge(String badgeCode) { + if (!this.hasBadge(badgeCode)) { + return null; + } + + Badge badge = this.getBadge(badgeCode); + this.badges.remove(badge); + + BadgeDao.removeBadge(this.userId, badge.getBadgeCode()); + return badge; + } + + /** + * Save badges that have been queued to save. + */ + public void saveQueuedBadges() { + BadgeDao.saveBadgeChanges(this.userId, this.badgesToSave); + this.badgesToSave.clear(); + } + + /** + * Get the list of all unequipped badges. + * + * @return the list of all unequipped badges + */ + public List getUnequippedBadges() { + return badges.stream().filter(badge -> !badge.isEquipped()).collect(Collectors.toList()); + } + + /** + * Get the list of all equipped badges. + * + * @return the list of equipped badges + */ + public List getEquippedBadges() { + return badges.stream().filter(Badge::isEquipped).collect(Collectors.toList()); + } + + /** + * Get all badges. + * + * @return the list of all badges + */ + public List getBadges() { + return badges; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/ban/Ban.java b/Havana-Server/src/main/java/org/alexdev/havana/game/ban/Ban.java new file mode 100644 index 0000000..5b550eb --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/ban/Ban.java @@ -0,0 +1,69 @@ +package org.alexdev.havana.game.ban; + +import org.alexdev.havana.dao.mysql.BanDao; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.util.DateUtil; + +public class Ban { + private final BanType banType; + private final String value; + private final String message; + private final long bannedUtil; + private final long bannedAt; + private final int bannedBy; + + public Ban(BanType banType, String value, String message, long bannedUntil, long bannedAt, int bannedBy) { + this.banType = banType; + this.value = value; + this.message = message; + this.bannedUtil = bannedUntil; + this.bannedAt = bannedAt; + this.bannedBy = bannedBy; + } + + public String getName() { + if (this.banType == BanType.MACHINE_ID) { + return BanDao.getName(this.value); + } + + if (this.banType == BanType.USER_ID) { + var name = PlayerDao.getName(Integer.parseInt(this.value)); + return name != null ? name : ""; + } + + return ""; + } + + public String getBannedBy() { + if (this.bannedBy == -1) { + return "Triggered spam filter"; + } + + if (this.bannedBy > 0) { + var name = PlayerDao.getName(this.bannedBy); + return name != null ? name : ""; + } + + return "Legacy Banned"; + } + + public BanType getBanType() { + return banType; + } + + public String getValue() { + return value; + } + + public String getMessage() { + return message; + } + + public String getBannedUtil() { + return DateUtil.getDate(bannedUtil, DateUtil.LONG_DATE); + } + + public String getBannedAt() { + return DateUtil.getDate(bannedAt, DateUtil.LONG_DATE); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/ban/BanManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/ban/BanManager.java new file mode 100644 index 0000000..0f63206 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/ban/BanManager.java @@ -0,0 +1,54 @@ +package org.alexdev.havana.game.ban; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerManager; + +import java.util.ArrayList; +import java.util.Map; + +public class BanManager { + private static BanManager instance; + + /** + * Disconnect ban accounts based on the following ban criteria. + * + * @param criteria the criteria to ban + */ + public void disconnectBanAccounts(Map criteria) { + for (Player player : new ArrayList<>(PlayerManager.getInstance().getPlayers())) { + if (criteria.containsKey(BanType.USER_ID)) { + if (player.getDetails().getId() == Integer.parseInt(criteria.get(BanType.USER_ID))) { + player.getNetwork().getChannel().close(); + break; + } + } + + if (criteria.containsKey(BanType.MACHINE_ID)) { + if (player.getDetails().getMachineId() != null && player.getDetails().getMachineId().equals(criteria.get(BanType.MACHINE_ID))) { + player.getNetwork().getChannel().close(); + break; + } + } + + /*if (criteria.containsKey(BanType.IP_ADDRESS)) { + if (NettyPlayerNetwork.getIpAddress(player.getNetwork().getChannel()).equals(criteria.get(BanType.IP_ADDRESS))) { + player.getNetwork().getChannel().close(); + break; + } + }*/ + } + } + + /** + * Gets the instance + * + * @return the instance + */ + public static BanManager getInstance() { + if (instance == null) { + instance = new BanManager(); + } + + return instance; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/ban/BanType.java b/Havana-Server/src/main/java/org/alexdev/havana/game/ban/BanType.java new file mode 100644 index 0000000..2904863 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/ban/BanType.java @@ -0,0 +1,7 @@ +package org.alexdev.havana.game.ban; + +public enum BanType { + USER_ID, + MACHINE_ID, + IP_ADDRESS; +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/bot/Bot.java b/Havana-Server/src/main/java/org/alexdev/havana/game/bot/Bot.java new file mode 100644 index 0000000..263159d --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/bot/Bot.java @@ -0,0 +1,70 @@ +package org.alexdev.havana.game.bot; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.room.entities.RoomBot; +import org.alexdev.havana.game.room.entities.RoomEntity; + +public class Bot extends Entity { + private PlayerDetails playerDetails; + private RoomBot roomUser; + private BotData botData; + private long nextWalkTime; + private long nextSpeechTime; + + public Bot() { + this.playerDetails = new PlayerDetails(); + this.roomUser = new RoomBot(this); + } + + public Bot(BotData botData) { + this.playerDetails = new PlayerDetails(); + this.roomUser = new RoomBot(this); + this.botData = botData; + } + + @Override + public boolean hasFuse(Fuseright permission) { + return false; + } + + @Override + public PlayerDetails getDetails() { + return this.playerDetails; + } + + @Override + public RoomEntity getRoomUser() { + return this.roomUser; + } + + @Override + public EntityType getType() { + return EntityType.BOT; + } + + @Override + public void dispose() { } + + public BotData getBotData() { + return botData; + } + + public long getNextWalkTime() { + return nextWalkTime; + } + + public void setNextWalkTime(long nextWalkTime) { + this.nextWalkTime = nextWalkTime; + } + + public long getNextSpeechTime() { + return nextSpeechTime; + } + + public void setNextSpeechTime(long nextSpeechTime) { + this.nextSpeechTime = nextSpeechTime; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/bot/BotData.java b/Havana-Server/src/main/java/org/alexdev/havana/game/bot/BotData.java new file mode 100644 index 0000000..d43b693 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/bot/BotData.java @@ -0,0 +1,109 @@ +package org.alexdev.havana.game.bot; + +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.util.StringUtil; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.regex.Pattern; + +public class BotData { + private String name; + private String mission; + private Position startPosition; + private String figure; + + private List walkspace; + private List speeches; + private List responses; + private List unrecognisedSpeech; + private List drinks; + + public BotData(String name, String mission, String figure) { + this.name = name; + this.mission = mission; + this.figure = figure; + this.startPosition = new Position(); + this.walkspace = new ArrayList<>(); + this.speeches = new ArrayList<>(); + this.responses = new ArrayList<>(); + this.unrecognisedSpeech = new ArrayList<>(); + this.drinks = new ArrayList<>(); + } + + public BotData(String name, String mission, int x, int y, int headRotation, int bodyRotation, String figure, String walkspaceData, + String speech, String responses, String unrecognisedResponses, String drinks) { + this.name = name; + this.mission = mission; + this.startPosition = new Position(x, y, 0, headRotation, bodyRotation); + this.figure = figure; + this.walkspace = new ArrayList<>(); + + for (String positionDatas : walkspaceData.split(" ")) { + String[] positionData = positionDatas.split(","); + this.walkspace.add(new Position(Integer.parseInt(positionData[0]), Integer.parseInt(positionData[1]))); + } + + if (this.walkspace.stream().noneMatch(position -> position.getX() == this.startPosition.getX() && position.getY() == this.startPosition.getY())) { + this.walkspace.add(new Position(this.startPosition.getX(), this.startPosition.getY())); + } + + this.speeches = this.parseSpeech(speech); + this.responses = this.parseSpeech(responses); + this.unrecognisedSpeech = this.parseSpeech(unrecognisedResponses); + this.drinks = drinks.length() > 0 ? Arrays.asList(drinks.split(",")) : new ArrayList<>(); + } + + private List parseSpeech(String responses) { + var botSpeech = new ArrayList(); + + for (String sentence : responses.split(Pattern.quote("|"))) { + String text = StringUtil.filterInput(sentence, true); + + if (text.isBlank()) + continue; + + botSpeech.add(new BotSpeech(sentence)); + } + + return botSpeech; + } + + public String getName() { + return name; + } + + + public String getMission() { + return mission; + } + + public Position getStartPosition() { + return startPosition; + } + + public String getFigure() { + return figure; + } + + public List getWalkspace() { + return walkspace; + } + + public List getSpeeches() { + return speeches; + } + + public List getResponses() { + return responses; + } + + public List getUnrecognisedSpeech() { + return unrecognisedSpeech; + } + + public List getDrinks() { + return drinks; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/bot/BotManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/bot/BotManager.java new file mode 100644 index 0000000..ce7f5b5 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/bot/BotManager.java @@ -0,0 +1,125 @@ +package org.alexdev.havana.game.bot; + +import org.alexdev.havana.dao.mysql.BotDao; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.tasks.BotTask; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.TimeUnit; + +public class BotManager { + private static BotManager instance; + + public BotManager() { + + } + + /** + * Called upon initial room entry to load room bots. + * + * @param room the room to add the bots to + */ + public void addBots(Room room) { + List botDataList = BotDao.getBotData(room.getId()); + + for (BotData botData : botDataList) { + Bot bot = new Bot(botData); + bot.getDetails().fill(0, botData.getName(), botData.getFigure(), botData.getMission(), "M"); + + Position startPosition = botData.getStartPosition(); + startPosition.setZ(room.getMapping().getTile(botData.getStartPosition().getX(), botData.getStartPosition().getY()).getWalkingHeight()); + + room.getEntityManager().enterRoom(bot, startPosition); + } + + if (botDataList.size() > 0) { + room.getTaskManager().scheduleTask("BotCommandTask", new BotTask(room), 0, 1, TimeUnit.SECONDS); + } + } + + /** + * Handle the speech called upon the bots. + * + * @param player the player speaking + * @param room the room speaking in + * @param message the message spoken + */ + public void handleSpeech(Player player, Room room, String message) { + List bots = new ArrayList<>(); + + for (Bot bot : room.getEntityManager().getEntitiesByClass(Bot.class)) { + if (bot.getRoomUser().getPosition().getDistanceSquared(player.getRoomUser().getPosition()) > 14) { + continue; + } + + if (bot.getBotData() == null) { + continue; + } + + bots.add(bot); + } + + for (Bot bot : bots) { + String drink = HasRequestedDrink(player, bot, message); + + if (drink != null) { + if (bot.getBotData().getResponses().size() > 0) { + var botSpeech = bot.getBotData().getResponses().get(ThreadLocalRandom.current().nextInt(bot.getBotData().getResponses().size())); + var chatMessage = botSpeech.getSpeech(); + + chatMessage = chatMessage.replace("%lowercaseDrink%", drink.toLowerCase()); + chatMessage = chatMessage.replace("%drink%", drink); + + bot.getRoomUser().talk(chatMessage, botSpeech.getChatMessageType()); + } + continue; + } + + if (message.toLowerCase().contains(bot.getDetails().getName().toLowerCase())) { + if (bot.getBotData().getUnrecognisedSpeech().size()>0) { + var botSpeech = bot.getBotData().getUnrecognisedSpeech().get(ThreadLocalRandom.current().nextInt(bot.getBotData().getUnrecognisedSpeech().size())); + bot.getRoomUser().talk(botSpeech.getSpeech(), botSpeech.getChatMessageType()); + } + } + } + } + + private String HasRequestedDrink(Player player, Bot bot, String message) { + if (bot.getBotData().getDrinks().isEmpty()) + return null; + + for (String drink : bot.getBotData().getDrinks()) { + if (message.toLowerCase().contains(drink.toLowerCase())) { + player.getRoomUser().carryItem(-1, drink); + return drink; + } + } + + if (message.toLowerCase().contains("drink please") || + message.toLowerCase().contains("can i have") || + message.toLowerCase().contains("i'll have")) { + String drink = bot.getBotData().getDrinks().get(ThreadLocalRandom.current().nextInt(bot.getBotData().getDrinks().size())); + player.getRoomUser().carryItem(-1, drink); + return drink; + } + + return null; + } + + /** + * Get the {@link BotManager} instance + * + * @return the catalogue manager instance + */ + public static BotManager getInstance() { + if (instance == null) { + instance = new BotManager(); + } + + return instance; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/bot/BotSpeech.java b/Havana-Server/src/main/java/org/alexdev/havana/game/bot/BotSpeech.java new file mode 100644 index 0000000..5cf18fc --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/bot/BotSpeech.java @@ -0,0 +1,29 @@ +package org.alexdev.havana.game.bot; + +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.messages.outgoing.rooms.user.CHAT_MESSAGE; + +import java.util.regex.Pattern; + +public class BotSpeech { + private String speech; + private CHAT_MESSAGE.ChatMessageType chatMessageType; + + public BotSpeech(String speech) { + if (speech.contains("#")) { + this.speech = speech.split(Pattern.quote("#"))[0]; + this.chatMessageType = CHAT_MESSAGE.ChatMessageType.valueOf(speech.split(Pattern.quote("#"))[1]); + } else { + this.speech = speech; + this.chatMessageType = CHAT_MESSAGE.ChatMessageType.CHAT; + } + } + + public String getSpeech() { + return speech; + } + + public CHAT_MESSAGE.ChatMessageType getChatMessageType() { + return chatMessageType; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/catalogue/CatalogueItem.java b/Havana-Server/src/main/java/org/alexdev/havana/game/catalogue/CatalogueItem.java new file mode 100644 index 0000000..a93b98d --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/catalogue/CatalogueItem.java @@ -0,0 +1,198 @@ +package org.alexdev.havana.game.catalogue; + +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.item.base.ItemDefinition; +import org.alexdev.havana.game.item.ItemManager; +import org.alexdev.havana.util.DateUtil; + +import java.util.ArrayList; +import java.util.List; + +public class CatalogueItem { + private int id; + private String saleCode; + private int[] pages; + private int orderId; + private int priceCoins; + private int pricePixels; + private int seasonalCoins; + private int seasonalPixels; + private int amount; + private boolean hidden; + private ItemDefinition definition; + private String itemSpecialId; + private boolean isPackage; + private List packages; + private int definitionId; + private String activeAt; + + public CatalogueItem(int id, String saleCode, String pageId, int orderId, int price, int pricePixels, int seasonalCoins, int seasonalPixels, int amount, boolean hidden, int definitionId, String itemSpecialId, boolean isPackage, String activeAt) { + int[] pages = new int[pageId.split(",").length]; + + int i = 0; + if (pageId.length() > 0) { + for (String data : pageId.split(",")) { + pages[i++] = Integer.parseInt(data); + } + } + + this.setPageData(id, saleCode, pages, orderId, price, pricePixels, seasonalCoins, seasonalPixels, amount, hidden, definitionId, itemSpecialId, isPackage, activeAt); + } + + + public CatalogueItem(int id, String saleCode, int[] pages, int orderId, int price, int pricePixels, int seasonalCoins, int seasonalPixels, int amount, boolean hidden, int definitionId, String itemSpecialId, boolean isPackage, String activeAt) { + this.setPageData(id, saleCode, pages, orderId, price, pricePixels, seasonalCoins, seasonalPixels, amount, hidden, definitionId, itemSpecialId, isPackage, activeAt); + } + + private void setPageData(int id, String saleCode, int[] pages, int orderId, int price, int pricePixels, int seasonalCoins, int seasonalPixels, int amount, boolean hidden, int definitionId, String itemSpecialId, boolean isPackage, String activeAt) { + this.id = id; + this.saleCode = saleCode; + this.orderId = orderId; + this.priceCoins = price; + this.pricePixels = pricePixels; + this.seasonalCoins = seasonalCoins; + this.seasonalPixels = seasonalPixels; + this.amount = amount; + this.hidden = hidden; + this.definitionId = definitionId; + this.definition = ItemManager.getInstance().getDefinition(definitionId); + this.itemSpecialId = itemSpecialId; + this.isPackage = isPackage; + this.packages = new ArrayList<>(); + this.pages = pages; + this.activeAt = activeAt; + + if (this.definition == null && !this.isPackage) { + System.out.println("Item " + this.id + " (" + this.saleCode + ") has an invalid definition id: " + definitionId); + } + } + + public int getId() { + return id; + } + + public String getType() { + if (this.isPackage) { + return "d"; + } else { + if (this.definition.hasBehaviour(ItemBehaviour.WALL_ITEM)) { + return "i"; + } else if (this.definition.hasBehaviour(ItemBehaviour.EFFECT)) { + return "e"; + } else { + return "s"; + } + } + } + + public String getSaleCode() { + return saleCode; + } + + public int[] getPages() { + return pages; + } + + public boolean hasPage(int pageId) { + for (int page : this.pages) { + if (page == pageId) { + return true; + } + } + + return false; + } + + public int getOrderId() { + return orderId; + } + + public ItemDefinition getDefinition() { + return definition; + } + + public int getPriceCoins() { + return priceCoins; + } + + public int getPricePixels() { + return pricePixels; + } + + public int getAmount() { + return amount; + } + + public void setPriceCoins(int priceCoins) { + this.priceCoins = priceCoins; + } + + public void setPricePixels(int pricePixels) { + this.pricePixels = pricePixels; + } + + public int getSeasonalCoins() { + return seasonalCoins; + } + + public void setSeasonalCoins(int seasonalCoins) { + this.seasonalCoins = seasonalCoins; + } + + public int getSeasonalPixels() { + return seasonalPixels; + } + + public void setSeasonalPixels(int seasonalPixels) { + this.seasonalPixels = seasonalPixels; + } + + public String getItemSpecialId() { + return itemSpecialId; + } + + public boolean isPackage() { + return isPackage; + } + + public List getPackages() { + if (this.isPackage) { + return packages; + } + + List items = new ArrayList<>(); + items.add(new CataloguePackage(this.saleCode, this.definition.getId(), this.itemSpecialId, this.amount)); + + return items; + + } + + public String getActiveAt() { + return activeAt; + } + + public boolean isActive() { + if (activeAt == null) { + return false; + } + + return this.activeAt.equalsIgnoreCase(DateUtil.getDate(DateUtil.getCurrentTimeSeconds(), "MM-dd")); + } + + /** + * Copy the catalogue item instance so we can set prices that won't affect the main instance. + * + * @return the new catalogue item instance + */ + public CatalogueItem copy() { + return new CatalogueItem(this.id, this.saleCode, this.pages, this.orderId, this.priceCoins, this.pricePixels, this.seasonalCoins, this.seasonalPixels, this.amount, this.hidden, this.definition.getId(), this.itemSpecialId, this.isPackage, this.activeAt); + } + + public boolean isHidden() { + return hidden; + } + + public int getDefinitionId() { + return definitionId; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/catalogue/CatalogueManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/catalogue/CatalogueManager.java new file mode 100644 index 0000000..06feccc --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/catalogue/CatalogueManager.java @@ -0,0 +1,518 @@ +package org.alexdev.havana.game.catalogue; + +import org.alexdev.havana.dao.mysql.*; +import org.alexdev.havana.game.catalogue.collectables.CollectableData; +import org.alexdev.havana.game.catalogue.collectables.CollectablesManager; +import org.alexdev.havana.game.effects.Effect; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.item.base.ItemDefinition; +import org.alexdev.havana.game.item.extradata.ExtraDataManager; +import org.alexdev.havana.game.item.extradata.types.TrophyExtraData; +import org.alexdev.havana.game.item.interactors.InteractionType; +import org.alexdev.havana.game.pets.PetManager; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.game.player.statistics.PlayerStatistic; +import org.alexdev.havana.game.player.statistics.PlayerStatisticManager; +import org.alexdev.havana.game.room.mapping.RoomMapping; +import org.alexdev.havana.messages.outgoing.effects.AVATAR_EFFECTS; +import org.alexdev.havana.messages.outgoing.effects.AVATAR_EFFECT_ADDED; +import org.alexdev.havana.messages.outgoing.user.currencies.FILM; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.HexValidator; +import org.alexdev.havana.util.StringUtil; +import org.alexdev.havana.util.config.GameConfiguration; +import org.apache.commons.lang3.StringUtils; + +import java.sql.SQLException; +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class CatalogueManager { + public static final int XP_BOX_COST = 100; + public static final int DAILY_LIMIT_XP = 300;//150; + + private static CatalogueManager instance; + + private List cataloguePageList; + private List catalogueItemList; + private List cataloguePackageList; + + private Map> badgeRewards; + + public CatalogueManager() { + this.cataloguePageList = CatalogueDao.getPages(); + this.cataloguePackageList = CatalogueDao.getPackages(); + this.catalogueItemList = CatalogueDao.getItems(); + this.loadPackages(); + this.reloadBadgeRewards(); + } + + /** + * Get the badge rewards upon purchasing an item + */ + public void reloadBadgeRewards() { + this.badgeRewards = CatalogueDao.getBadgeRewards(); + } + + /** + * Gets the child tabs. + * + * @param parentId the parent id + * @param rank the rank + * @return the child tabs + */ + public List getChildPages(int parentId, int rank, boolean hasClub) { + List pageList = new ArrayList<>(); + + for (var page : this.cataloguePageList) { + if (page.getParentId() != parentId) { + continue; + } + + if (page.getMinRole().getRankId() > rank) { + continue; + } + + if (page.isClubOnly() && !hasClub) { + continue; + } + + if (!page.isValidSeasonal()) { + if (PlayerRank.COMMUNITY_MANAGER.getRankId() > rank) { + continue; + } + } + + pageList.add(page); + } + + return pageList; + + + /*try { + var pageList = this.cataloguePageList.stream().filter(tab -> (tab.getMinRole().getRankId() <= rank) && tab.getParentId() == parentId && tab.isValidSeasonal()).collect(Collectors.toList()); + pageList.removeIf(tab -> tab.isClubOnly() && !hasClub); + + return pageList; + } catch (Exception ex) { + return new ArrayList<>(); + }*/ + } + + /** + * Load catalogue packages for all catalogue items. + */ + private void loadPackages() { + for (CatalogueItem catalogueItem : this.catalogueItemList) { + if (!catalogueItem.isPackage()) { + continue; + } + + for (CataloguePackage cataloguePackage : this.cataloguePackageList) { + if (catalogueItem.getSaleCode().equals(cataloguePackage.getSaleCode())) { + catalogueItem.getPackages().add(cataloguePackage); + } + } + } + } + + /** + * Get a page by the page index + * + * @param pageIndex the index of the page to get for + * @return the catalogue page + */ + public CataloguePage getCataloguePage(int pageIndex) { + for (CataloguePage cataloguePage : this.cataloguePageList) { + if (cataloguePage.getId() == pageIndex) { + return cataloguePage; + } + } + + return null; + } + + /** + * Get an item by it's sale code. + * + * @param saleCode the item sale code identifier + * @return the item, if successful + */ + public CatalogueItem getCatalogueItem(String saleCode) { + for (CatalogueItem catalogueItem : this.catalogueItemList) { + if (catalogueItem.getSaleCode().equals(saleCode)) { + return catalogueItem; + } + } + + return null; + } + + /** + * Get an item by its catalogue item id. + * + * @return the item, if successful + */ + public CatalogueItem getCatalogueItem(int itemId) { + for (CatalogueItem catalogueItem : this.catalogueItemList) { + if (catalogueItem.getId() == itemId) { + return catalogueItem; + } + } + + return null; + } + + /** + * Get an item by its catalogue sprite id. + * + * @return the item, if successful + */ + public CatalogueItem getCatalogueBySprite(int spriteId) { + for (CatalogueItem catalogueItem : this.catalogueItemList) { + if (catalogueItem == null || catalogueItem.getDefinition() == null) { + continue; + } + + if (catalogueItem.getDefinition().getSpriteId() == spriteId) { + return catalogueItem; + } + } + + return null; + } + + /** + * Get catalogue page list for a certain rank + * + * @return the list of catalogue pages + */ + public List getSeasonalItems() { + List itemList = new ArrayList<>(); + + for (CatalogueItem catalogueItem : this.catalogueItemList) { + if (catalogueItem.isActive()) { + var item = catalogueItem.copy(); + item.setPriceCoins(item.getSeasonalCoins()); + item.setPricePixels(item.getSeasonalPixels()); + itemList.add(item); + } + } + + return itemList; + } + + /** + * Get a list of items for the catalogue page. + * + * @param pageId the id of the page to get the items for + * @param rawItems if this is set to true, pages like the rares page and collectables page will not return any items + * @return the list of items + */ + public List getCataloguePageItems(int pageId, boolean rawItems) { + List items = new ArrayList<>(); + + // Ignore any game logic checks when requesting catalogue pages + if (!rawItems) { + if (pageId == GameConfiguration.getInstance().getInteger("rare.cycle.page.id")) { + var itemList = getSeasonalItems(); + + if (itemList.size() > 0) { + return itemList; + } + } + + // Do collectables + CollectableData collectableData = CollectablesManager.getInstance().getCollectableDataByPage(pageId); + + if (collectableData != null) { + CatalogueItem catalogueItem = collectableData.getActiveItem(); + return List.of(catalogueItem); + } + } + + for (CatalogueItem catalogueItem : this.catalogueItemList) { + if (catalogueItem.isHidden()) { + continue; + } + + if (catalogueItem.hasPage(pageId)) { + items.add(catalogueItem); + } + } + + items.sort(Comparator.comparingInt(CatalogueItem::getOrderId)); + return items; + } + + /** + * Purchase handler for player details. + * + * @param playerDetails the details for player + * @param item the item the user is buying + * @param extraData the extra data attached to item + * @param overrideName the override name (used for trophies) + * @param timestamp the time of purchase + * @return the list of items bought + * @throws SQLException the sql exception + */ + public List purchase(PlayerDetails playerDetails, CatalogueItem item, String extraData, String overrideName, long timestamp) throws SQLException { + List itemsBought = new ArrayList<>(); + + if (!item.isPackage()) { + for (int i = 0; i < item.getAmount(); i++) { + Item newItem = purchase(playerDetails, item.getDefinition(), extraData, item.getItemSpecialId(), overrideName, timestamp); + + if (newItem != null) { + itemsBought.add(newItem); + } + } + } else { + for (CataloguePackage cataloguePackage : item.getPackages()) { + for (int i = 0; i < cataloguePackage.getAmount(); i++) { + Item newItem = purchase(playerDetails, cataloguePackage.getDefinition(), null, cataloguePackage.getSpecialSpriteId(), overrideName, timestamp); + + if (newItem != null) { + itemsBought.add(newItem); + } + } + } + } + + return itemsBought; + } + + /** + * The player purchase handler but purchase single item. + * + * @param playerDetails the details of the player + * @param def the definition of the item + * @param extraData the extra data attached to the item + * @param specialSpriteId the special sprite id used for posters + * @param overrideName the override name - used for trophies + * @param timestamp the time of purchase + * @return the item bought + * @throws SQLException the sql exception + */ + public Item purchase(PlayerDetails playerDetails, ItemDefinition def, String extraData, String specialSpriteId, String overrideName, long timestamp) throws SQLException { + Player player = PlayerManager.getInstance().getPlayerById(playerDetails.getId()); + + if (def.hasBehaviour(ItemBehaviour.EFFECT)) { + return purchaseEffect(playerDetails, Integer.parseInt(specialSpriteId)); + } + + // If the item is film, just give the user film + if (def.getSprite().equals("film")) { + CurrencyDao.increaseFilm(playerDetails, 5); + + if (player != null) { + player.send(new FILM(playerDetails)); + } + return null; + } + + String customData = ""; + + if (extraData != null) { + if (def.hasBehaviour(ItemBehaviour.DECORATION)) { + customData = extraData; + } else { + if (specialSpriteId.length() > 0) { + customData = specialSpriteId; + } + } + + if (def.hasBehaviour(ItemBehaviour.POST_IT)) { + customData = "20"; + } + + if (def.getInteractionType() == InteractionType.SCOREBOARD) { + customData = "x"; + } + + if (def.hasBehaviour(ItemBehaviour.PRIZE_TROPHY)) { + var trophyName = (overrideName != null ? overrideName : playerDetails.getName()); + var trophyUserData = PlayerManager.getInstance().getPlayerData(trophyName); + + var jsonInstance = new TrophyExtraData(trophyUserData.getId(), StringUtil.filterInput(extraData, true), timestamp); + customData = ExtraDataManager.getGson().toJson(jsonInstance); + } + + if (def.hasBehaviour(ItemBehaviour.ROOMDIMMER)) { + customData = Item.DEFAULT_ROOMDIMMER_CUSTOM_DATA; + } + } + + if (customData.isEmpty()) { + customData = "0"; + } + + Item item = new Item(); + item.setOwnerId(playerDetails.getId()); + item.setDefinitionId(def.getId()); + item.setCustomData(customData); + + RoomMapping.resetExtraData(item, false); + + if (item.getDefinition().getRentalTime() > 0) { + item.setExpireTime(DateUtil.getCurrentTimeSeconds() + item.getDefinition().getRentalTime()); + } + + // If the item is a camera, give them 2 free film. + if (def.getSprite().equals("camera")) { + CurrencyDao.increaseFilm(playerDetails, 2); + + if (player != null) { + player.send(new FILM(playerDetails)); + } + } + + if (def.getInteractionType() == InteractionType.PET_NEST) { + if (extraData != null) { + + if (!extraData.contains(Character.toString((char) 10))) { + return null; + } + + String[] petData = extraData.split(Character.toString((char) 10)); + + if (petData.length != 3 || !StringUtils.isNumeric(petData[1])) { + return null; + } + + String name = StringUtil.filterInput(petData[0], true); + String type = def.getSprite().replace("pets", ""); + int race = Integer.parseInt(petData[1]); + String color = StringUtil.filterInput(petData[2], true); + + if (HexValidator.validate(color) && !color.startsWith("#")) { + + if (PetManager.getInstance().isValidName(playerDetails.getName(), name) < 1) { + ItemDao.newItem(item); + PetDao.createPet(item.getDatabaseId(), name, type, race, color); + } else { + return null; + } + } + } + } + else { + ItemDao.newItem(item); + } + + if (def.hasBehaviour(ItemBehaviour.TELEPORTER)) { + Item linkedTeleporterItem = new Item(); + linkedTeleporterItem.setOwnerId(playerDetails.getId()); + linkedTeleporterItem.setDefinitionId(def.getId()); + linkedTeleporterItem.setCustomData(customData); + + if (linkedTeleporterItem.getDefinition().getRentalTime() > 0) { + linkedTeleporterItem.setExpireTime(DateUtil.getCurrentTimeSeconds() + item.getDefinition().getRentalTime()); + } + + ItemDao.newItem(linkedTeleporterItem); + + if (player != null) { + player.getInventory().addItem(linkedTeleporterItem); + } + + TeleporterDao.addPair(linkedTeleporterItem.getDatabaseId(), item.getDatabaseId()); + TeleporterDao.addPair(item.getDatabaseId(), linkedTeleporterItem.getDatabaseId()); + } + + if (player != null) { + player.getInventory().addItem(item); + } + + return item; + } + + private static Item purchaseEffect(PlayerDetails playerDetails, int specialSpriteId) { + Effect effect = EffectDao.newEffect(playerDetails.getId(), specialSpriteId, -1, false); + + if (effect == null) { + return null; + } + + Player player = PlayerManager.getInstance().getPlayerById(playerDetails.getId()); + + if (player != null) { + player.getEffects().add(effect); + + player.send(new AVATAR_EFFECT_ADDED(effect)); + player.send(new AVATAR_EFFECTS(player.getEffects())); + } + + return null; + } + + /** + * Get catalogue page list. + * + * @return the list of catalogue pages + */ + public List getCataloguePages() { + return this.cataloguePageList; + } + + /** + * Get catalogue page list for a certain rank + * + * @return the list of catalogue pages + */ + public List getPagesForRank(PlayerRank minimumRank) { + List cataloguePagesForRank = new ArrayList<>(); + + for (CataloguePage page : this.cataloguePageList) { + if (minimumRank.getRankId() >= page.getMinRole().getRankId()) { + cataloguePagesForRank.add(page); + } + } + + return cataloguePagesForRank; + } + + /** + * Get catalogue items list. + * + * @return the list of items packages + */ + public List getCatalogueItems() { + return catalogueItemList; + } + + /** + * Get the {@link CatalogueManager} instance + * + * @return the catalogue manager instance + */ + public static CatalogueManager getInstance() { + if (instance == null) { + instance = new CatalogueManager(); + } + + return instance; + } + + /** + * Resets the catalogue manager singleton. + */ + public static void reset() { + instance = null; + CatalogueManager.getInstance(); + } + + /** + * Get the badge reward list + * @return the list of badge rewards + */ + public Map> getBadgeRewards() { + return badgeRewards; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/catalogue/CataloguePackage.java b/Havana-Server/src/main/java/org/alexdev/havana/game/catalogue/CataloguePackage.java new file mode 100644 index 0000000..e94f59b --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/catalogue/CataloguePackage.java @@ -0,0 +1,38 @@ +package org.alexdev.havana.game.catalogue; + +import org.alexdev.havana.game.item.base.ItemDefinition; +import org.alexdev.havana.game.item.ItemManager; + +public class CataloguePackage { + private String saleCode; + private int definitionId; + private String specialSpriteId; + private int amount; + + public CataloguePackage(String saleCode, int definitionId, String specialSpriteId, int amount) { + this.saleCode = saleCode; + this.definitionId = definitionId; + this.specialSpriteId = specialSpriteId; + this.amount = amount; + } + + public String getSaleCode() { + return saleCode; + } + + public int getDefinitionId() { + return definitionId; + } + + public ItemDefinition getDefinition() { + return ItemManager.getInstance().getDefinition(this.definitionId); + } + + public String getSpecialSpriteId() { + return specialSpriteId; + } + + public int getAmount() { + return amount; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/catalogue/CataloguePage.java b/Havana-Server/src/main/java/org/alexdev/havana/game/catalogue/CataloguePage.java new file mode 100644 index 0000000..788466b --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/catalogue/CataloguePage.java @@ -0,0 +1,210 @@ +package org.alexdev.havana.game.catalogue; + +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.EasterUtil; +import org.alexdev.havana.util.config.GameConfiguration; + +import java.util.ArrayList; +import java.util.List; + +public class CataloguePage { + private int id; + private int parentId; + private PlayerRank minRole; + private boolean isNavigatable; + private boolean isClubOnly; + private String name; + private int icon; + private int colour; + private String layout; + private List images; + private List texts; + private String seasonalStartDate; + private int seasonalLength; + + public CataloguePage(int id, int parentId, PlayerRank minRole, boolean isNavigatable, boolean isClubOnly, String name, int icon, int colour, String layout, List images, List texts, + String seasonalStartDate, int seasonalLength) { + this.id = id; + this.parentId = parentId; + this.minRole = minRole; + this.isNavigatable = isNavigatable; + this.isClubOnly = isClubOnly; + this.name = name; + this.icon = icon; + this.colour = colour; + this.layout = layout; + this.images = images; + this.texts = texts; + //this.images = StringUtil.GSON.fromJson(images, new TypeToken>(){}.getType()); + //this.texts = StringUtil.GSON.fromJson(texts, new TypeToken>(){}.getType()); + this.seasonalStartDate = seasonalStartDate; + this.seasonalLength = seasonalLength; + + if (this.minRole == null) { + this.minRole = PlayerRank.ADMINISTRATOR; + } + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public void setLayout(String layout) { + this.layout = layout; + } + + public PlayerRank getMinRole() { + return minRole; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getLayout() { + return layout; + } + + + /*public String getBody() { + if (RareManager.getInstance().getCurrentRare() != null && + this.getId() == GameConfiguration.getInstance().getInteger("rare.cycle.page.id")) { + + TimeUnit rareManagerUnit = TimeUnit.valueOf(GameConfiguration.getInstance().getString("rare.cycle.refresh.timeunit")); + + long interval = rareManagerUnit.toSeconds(GameConfiguration.getInstance().getInteger("rare.cycle.refresh.interval")); + long currentTick = RareManager.getInstance().getTick().get(); + long timeUntil = interval - currentTick; + + return (this.body + " The time until the next rare is " + DateUtil.getReadableSeconds(timeUntil) + "!"); + } + + return body; + }*/ + + public int getParentId() { + return parentId; + } + + public int getIcon() { + return icon; + } + + public int getColour() { + return colour; + } + + public boolean isNavigatable() { + return isNavigatable; + } + + public boolean isClubOnly() { + return isClubOnly; + } + + public List getImages() { + if (this.layout.equalsIgnoreCase("frontpage3")) { + List imageList = new ArrayList<>(); + + for (var image : images) { + String text = image; + + for (int i = 1; i < 5; i++) { + if (i == 1) { +// FilenameUtils.removeExtension(client.post().getString("catalogue.frontpage.input.1")) + var fileName = GameConfiguration.getInstance().getString("catalogue.frontpage.input." + i); + fileName = fileName.substring(0, fileName.lastIndexOf(".")); + + text = text.replace("{input" + i + "}", fileName); + } else { + text = text.replace("{input" + i + "}", GameConfiguration.getInstance().getString("catalogue.frontpage.input." + i)); + } + } + + imageList.add(text); + } + + return imageList; + } + + return images; + } + + public List getTexts() { + if (this.layout.equalsIgnoreCase("frontpage3")) { + List textList = new ArrayList<>(); + + for (var image : texts) { + String text = image; + + for (int i = 1; i < 5; i++) { + text = text.replace("{input" + i + "}", GameConfiguration.getInstance().getString("catalogue.frontpage.input." + i)); + } + + textList.add(text); + } + + return textList; + } + + return texts; + } + + public String getSeasonalStartDate() { + return seasonalStartDate; + } + + public int getSeasonalLength() { + return seasonalLength; + } + + public boolean isValidSeasonal() { + if (!GameConfiguration.getInstance().getBoolean("seasonal.items")) { + return true; + } + + if (this.seasonalStartDate == null) { + return true; + } + + if (this.seasonalStartDate.equals("EASTER")) { + return EasterUtil.isEasterMonday(); + } + + var currentTime = DateUtil.getCurrentTimeSeconds(); + var currentYear = DateUtil.getDate(currentTime, "yyyy"); + + var startTime = DateUtil.getFromFormat("yyyy-MM-dd", currentYear + "-" +this.seasonalStartDate); + var endTime = startTime + this.seasonalLength; + + return (currentTime > startTime) && (endTime > DateUtil.getCurrentTimeSeconds()); + } + + public CataloguePage copy() { + /* + private int id; + private int parentId; + private PlayerRank minRole; + private boolean isNavigatable; + private boolean isClubOnly; + private String name; + private int icon; + private int colour; + private String layout; + private List images; + private List texts; + private String seasonalStartDate; + private int seasonalLength; + */ + return new CataloguePage(id, parentId, minRole, isNavigatable, isClubOnly, name, icon, colour, layout, images, texts, seasonalStartDate, seasonalLength); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/catalogue/collectables/CollectableData.java b/Havana-Server/src/main/java/org/alexdev/havana/game/catalogue/collectables/CollectableData.java new file mode 100644 index 0000000..5eeb2ed --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/catalogue/collectables/CollectableData.java @@ -0,0 +1,78 @@ +package org.alexdev.havana.game.catalogue.collectables; + +import org.alexdev.havana.dao.mysql.CollectablesDao; +import org.alexdev.havana.game.catalogue.CatalogueItem; +import org.alexdev.havana.game.catalogue.CatalogueManager; +import org.alexdev.havana.util.DateUtil; + +public class CollectableData { + private int currentPosition; + private long expiry; + private final long lifetime; + + private int collectablesStorePage; + private int collectablesAdminPage; + + private final String[] classNames; + + public CollectableData(int collectablesStorePage, int collectablesAdminPage, long expiry, long lifetime, int currentPosition, String[] classNames) { + this.collectablesStorePage = collectablesStorePage; + this.collectablesAdminPage = collectablesAdminPage; + this.expiry = expiry; + this.lifetime = lifetime; + this.currentPosition = currentPosition; + this.classNames = classNames; + } + + /** + * The method for checking if the next collectable is due. + */ + public void checkCycle() { + if (!(DateUtil.getCurrentTimeSeconds() > this.expiry)) { + return; + } + + this.currentPosition++; + + if (this.currentPosition >= this.classNames.length) { + this.currentPosition = 0; + } + + this.expiry = DateUtil.getCurrentTimeSeconds() + this.lifetime; + CollectablesDao.saveData(this.collectablesStorePage, this.currentPosition, this.expiry); + } + + /** + * Gets the catalogue item of the active collectable. + * + * @return the catalogue item + */ + public CatalogueItem getActiveItem() { + String className = this.classNames[this.currentPosition]; + + for (CatalogueItem item : CatalogueManager.getInstance().getCataloguePageItems(this.collectablesAdminPage, true)) { + if (item.getDefinition().getSprite().equals(className)) { + var collectable = item.copy(); + return collectable; + } + } + + return null; + } + + public String[] getSprites() { + return this.classNames; + } + + public long getExpiry() { + return expiry; + } + + public int getCollectablesStorePage() { + return collectablesStorePage; + } + + public int getCollectablesAdminPage() { + return collectablesAdminPage; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/catalogue/collectables/CollectablesManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/catalogue/collectables/CollectablesManager.java new file mode 100644 index 0000000..253384d --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/catalogue/collectables/CollectablesManager.java @@ -0,0 +1,96 @@ +package org.alexdev.havana.game.catalogue.collectables; + +import org.alexdev.havana.dao.mysql.CollectablesDao; +import org.alexdev.havana.game.catalogue.CatalogueItem; + +import java.util.List; + +public class CollectablesManager { + private static CollectablesManager instance; + private List collectableDataList; + + public CollectablesManager() { + this.collectableDataList = CollectablesDao.getCollectablesData(); + } + + /** + * Checks all the collectable pages for expired items and cycles to the next item if required. + */ + public void checkExpiries() { + for (CollectableData collectableData : this.collectableDataList) { + collectableData.checkCycle(); + } + } + + /** + * Gets if the item is currently on sale as a collectable. + * + * @param item the item to check + * @return true, if successful + */ + public boolean isCollectable(CatalogueItem item) { + for (CollectableData collectableData : this.collectableDataList) { + CatalogueItem collectableItem = collectableData.getActiveItem(); + + if (collectableItem != null && collectableItem.getId() == item.getId()) { + return true; + } + } + + return false; + } + + /** + * Get collectable data by the page id. + * + * @param pageId the page id to get data for + * @return the collectable data instance + */ + public CollectableData getCollectableDataByPage(int pageId) { + for (CollectableData collectableData : this.collectableDataList) { + if (collectableData.getCollectablesStorePage() == pageId || collectableData.getCollectablesAdminPage() == pageId) { + return collectableData; + } + } + + return null; + } + + /** + * Get collectable data by the page id. + * + * @param itemId the page id to get data for + * @return the collectable data instance + */ + public CollectableData getCollectableDataByItem(int itemId) { + for (CollectableData collectableData : this.collectableDataList) { + if (collectableData.getActiveItem().getId() == itemId) { + return collectableData; + } + } + + return null; + } + + /** + * Get the {@link CollectablesManager} instance + * + * @return the collectables manager instance + */ + public static CollectablesManager getInstance() { + if (instance == null) { + instance = new CollectablesManager(); + } + + return instance; + } + + + /** + * Resets the catalogue manager singleton. + */ + public static void reset() { + instance = null; + CollectablesManager.getInstance(); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/catalogue/voucher/VoucherManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/catalogue/voucher/VoucherManager.java new file mode 100644 index 0000000..e700d57 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/catalogue/voucher/VoucherManager.java @@ -0,0 +1,104 @@ +package org.alexdev.havana.game.catalogue.voucher; + +import org.alexdev.havana.dao.mysql.CurrencyDao; +import org.alexdev.havana.dao.mysql.PlayerStatisticsDao; +import org.alexdev.havana.dao.mysql.VoucherDao; +import org.alexdev.havana.game.catalogue.CatalogueItem; +import org.alexdev.havana.game.catalogue.CatalogueManager; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.misc.purse.Voucher; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.statistics.PlayerStatistic; +import org.alexdev.havana.log.Log; +import org.alexdev.havana.util.DateUtil; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; + +public class VoucherManager { + private static VoucherManager instance; + + public VoucherManager() { + + } + + public VoucherRedeemStatus redeem(PlayerDetails playerDetails, VoucherRedeemMode voucherRedeemMode, String voucherCode, List redeemedItems, AtomicInteger redeemedCredits) { + //Check and get voucher + Voucher voucher = VoucherDao.redeemVoucher(voucherCode, playerDetails.getId()); + + //No voucher was found + if (voucher == null) { + return VoucherRedeemStatus.FAILURE; + } + + if (!voucher.isAllowNewUsers()) { + int daysSince = (int) Math.floor(TimeUnit.SECONDS.toHours(PlayerStatisticsDao.getStatisticLong(playerDetails.getId(), PlayerStatistic.ONLINE_TIME))); + + if (daysSince < 1) { + return VoucherRedeemStatus.FAILURE_NEW_ACCOUNT; + } + } + + //Redeem items + List items = new ArrayList<>(); + + for (String catalogueSaleCode : voucher.getItems()) { + var catalogueItem = CatalogueManager.getInstance().getCatalogueItem(catalogueSaleCode); + + if (catalogueItem == null) { + Log.getErrorLogger().error("Could not redeem voucher " + voucherCode + " with sale code: " + catalogueSaleCode); + continue; + } + + redeemedItems.add(catalogueItem); + + try { + items.addAll(CatalogueManager.getInstance().purchase(playerDetails, catalogueItem, "", null, DateUtil.getCurrentTimeSeconds())); + } catch (Exception ex) { + + } + } + + /*if (items.size() > 0) { + if (voucherRedeemMode == VoucherRedeemMode.IN_GAME) { + if (player != null) { + player.getInventory().getView("new"); + } + } + }*/ + + VoucherDao.logVoucher(voucherCode, playerDetails.getId(), voucher.getCredits(), redeemedItems); + + //This voucher gives credits, so increase credits balance + if (voucher.getCredits() > 0) { + CurrencyDao.increaseCredits(playerDetails, voucher.getCredits()); + redeemedCredits.set(voucher.getCredits()); + } + + return VoucherRedeemStatus.SUCCESS; + } + + + /** + * Get the {@link VoucherManager} instance + * + * @return the catalogue manager instance + */ + public static VoucherManager getInstance() { + if (instance == null) { + instance = new VoucherManager(); + } + + return instance; + } + + /** + * Resets the catalogue manager singleton. + */ + public static void reset() { + instance = null; + VoucherManager.getInstance(); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/catalogue/voucher/VoucherRedeemMode.java b/Havana-Server/src/main/java/org/alexdev/havana/game/catalogue/voucher/VoucherRedeemMode.java new file mode 100644 index 0000000..83e3ef4 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/catalogue/voucher/VoucherRedeemMode.java @@ -0,0 +1,6 @@ +package org.alexdev.havana.game.catalogue.voucher; + +public enum VoucherRedeemMode { + WEBSITE, + IN_GAME +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/catalogue/voucher/VoucherRedeemStatus.java b/Havana-Server/src/main/java/org/alexdev/havana/game/catalogue/voucher/VoucherRedeemStatus.java new file mode 100644 index 0000000..b098dd9 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/catalogue/voucher/VoucherRedeemStatus.java @@ -0,0 +1,7 @@ +package org.alexdev.havana.game.catalogue.voucher; + +public enum VoucherRedeemStatus { + SUCCESS, + FAILURE, + FAILURE_NEW_ACCOUNT; +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/club/ClubSubscription.java b/Havana-Server/src/main/java/org/alexdev/havana/game/club/ClubSubscription.java new file mode 100644 index 0000000..ae5dc30 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/club/ClubSubscription.java @@ -0,0 +1,363 @@ +package org.alexdev.havana.game.club; + +import org.alexdev.havana.dao.mysql.*; +import org.alexdev.havana.game.catalogue.CatalogueManager; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.ItemManager; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.statistics.PlayerStatistic; +import org.alexdev.havana.game.player.statistics.PlayerStatisticManager; +import org.alexdev.havana.messages.outgoing.club.CLUB_INFO; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.config.GameConfiguration; +import org.apache.commons.lang3.tuple.Pair; + +import java.sql.SQLException; +import java.util.concurrent.TimeUnit; + +public class ClubSubscription { + public static String[] giftOrder = new String[]{ + "hc_tv", + "hcamme", + "hc_crtn", + "mocchamaster", + "hc_crpt", + "edicehc", + "hc_wall_lamp", + "doorD", + "deal_hcrollers", + "hcsohva", + "hc_bkshlf", + "hc_lmp", + "hc_trll", + "hc_tbl", + "hc_machine", + "hc_chr", + "hc_rntgn", + "hc_dsk", + "hc_djset", + "hc_lmpst", + "hc_frplc", + "hc_btlr" + }; + + /** + * Refresh the club scription for player. + * @param player the player to refresh the subscription for + */ + public static void sendHcDays(Player player) { + long now = DateUtil.getCurrentTimeSeconds(); + + int sinceMonths = 0; + int totalDays = 0; + int remainingDaysThisMonth = 0; + int prepaidMonths = 0; + + if (player.getDetails().getClubExpiration() != 0) + totalDays = (int)((player.getDetails().getClubExpiration() - now) / 60 / 60 / 24); + + if (totalDays < 0) + totalDays = 0; + + if (totalDays > 0) { + remainingDaysThisMonth = ((totalDays - 1) % 31) + 1; + prepaidMonths = (totalDays - remainingDaysThisMonth) / 31; + + if (player.getDetails().getFirstClubSubscription() > 0) { + int days = (int) TimeUnit.SECONDS.toDays(player.getStatisticManager().getLongValue(PlayerStatistic.CLUB_MEMBER_TIME)); + sinceMonths = days > 0 ? days / 31 : 0;//(int) (now - player.getDetails().getFirstClubSubscription()) / 60 / 60 / 24 / 31; + } + } + + player.send(new CLUB_INFO(remainingDaysThisMonth, sinceMonths, prepaidMonths)); + } + + /** + * Subscribe to Habbo club with credits and days indicated, if 0 days, the function will not proceed. + * If the credits amount is 0 or less then no credits will be charged. + * + * @param playerDetails the details of the player that subscribed + * @param choice the subscription choice + */ + public static boolean subscribeClub(PlayerDetails playerDetails, int choice) { + var choiceData = getChoiceData(choice); + + int credits = choiceData.getKey(); + int days = choiceData.getValue(); + + if (days <= 0) { + return false; + } + + if (playerDetails.getCredits() < credits) { + return false; + } + + long now = DateUtil.getCurrentTimeSeconds(); + + long daysInSeconds = 24 * 60 * 60; + long secondsToAdd = (daysInSeconds * days); + + if (playerDetails.getFirstClubSubscription() == 0) { + PlayerStatisticsDao.updateStatistic(playerDetails.getId(), PlayerStatistic.GIFTS_DUE, 1); + PlayerStatisticsDao.updateStatistic(playerDetails.getId(), PlayerStatistic.CLUB_GIFT_DUE, now); + } + + /*if (playerDetails.getFirstClubSubscription() == 0) { + playerDetails.setFirstClubSubscription(now); + + // Club Sofa on first ever HC purchase + ItemManager.getInstance().createGift(playerDetails, "club_sofa", GameConfiguration.getInstance().getString("club.gift.present.label")); + + // Set new club received date + playerDetails.setClubGiftDue(DateUtil.getCurrentTimeSeconds() + getClubGiftSeconds()); + ClubGiftDao.saveNextGiftDate(playerDetails); + }*/ + + if (playerDetails.getClubExpiration() - now <= 0) { + playerDetails.setClubExpiration(now + secondsToAdd + 1); + } else { + playerDetails.setClubExpiration(playerDetails.getClubExpiration() + secondsToAdd); + } + + PlayerDao.saveSubscription(playerDetails.getId(), playerDetails.getFirstClubSubscription(), playerDetails.getClubExpiration()); + CurrencyDao.decreaseCredits(playerDetails, credits); + + return true; + } + + public static boolean isGiftDue(Player player) { + if (!player.getDetails().hasClubSubscription()) { + return false; + } + + if (player.getDetails().getFirstClubSubscription() == 0) { + return true; + } + + if (player.getStatisticManager().getIntValue(PlayerStatistic.GIFTS_DUE) > 0) { + return true; + } + + return true; + } + + public static void tryNextGift(Player player) throws SQLException { + if (!isGiftDue(player)) { + return; + } + + Item item = null; + + if (player.getDetails().getFirstClubSubscription() == 0) { + player.getDetails().setFirstClubSubscription(DateUtil.getCurrentTimeSeconds()); + item = ItemManager.getInstance().createGift(player.getDetails().getId(), player.getDetails().getName(), "club_sofa", GameConfiguration.getInstance().getString("club.gift.present.label"), ""); + + PlayerDao.saveSubscription(player.getDetails().getId(), player.getDetails().getFirstClubSubscription(), player.getDetails().getClubExpiration()); + } else { + String giftData = player.getLastGift(); + + if (giftData == null) { + var result = ClubGiftDao.getLastGift(player.getDetails().getId()); + + if (result != null) { + giftData = result.getValue(); + } + } + + String nextSpriteGift; + + if (giftData == null) { + nextSpriteGift = giftOrder[0]; + } else { + int position = 0; + + for (String nextGift : giftOrder) { + position++; + + if (nextGift.equals(giftData)) { + break; + } + } + + if (position >= giftOrder.length) { + position = 0; + } + + nextSpriteGift = giftOrder[position]; + } + + ClubGiftDao.addGift(player.getDetails().getId(), nextSpriteGift); + player.setLastGift(nextSpriteGift); + + item = ItemManager.getInstance().createGift(player.getDetails().getId(), player.getDetails().getName(), nextSpriteGift, GameConfiguration.getInstance().getString("club.gift.present.label"), ""); + } + + //player.getStatisticManager().setLongValue(PlayerStatistic.CLUB_GIFT_DUE, DateUtil.getCurrentTimeSeconds() + getClubGiftSeconds()); + player.getStatisticManager().incrementValue(PlayerStatistic.GIFTS_DUE, -1); + + //player.getDetails().setClubGiftDue(DateUtil.getCurrentTimeSeconds() + getClubGiftSeconds()); + //ClubGiftDao.saveNextGiftDate(player.getDetails()); + + player.getInventory().addItem(item); + player.getInventory().getView("new"); + + var catalogueItem = CatalogueManager.getInstance().getCatalogueItem(item.getDefinition().getSprite()); + + if (catalogueItem != null) { + TransactionDao.createTransaction(player.getDetails().getId(), item.getDatabaseId() + "", catalogueItem.getId() + "", + catalogueItem.getAmount(), "Habbo Club membership gift", 0, 0, true); + } + } + + /** + * Get the choice data for HC. + * + * @param choice the choice, 1, 2 or 3 + * @return the pair, days/credits + */ + public static Pair getChoiceData(int choice) { + int days = -1; + int credits = -1; + + switch (choice) { + case 1: + { + credits = 25; + days = 31; + break; + } + case 2: + { + credits = 60; + days = 93; + break; + } + case 3: + { + credits = 105; + days = 186; + break; + } + } + + return Pair.of(credits, days); + } + + /** + * Reset figure on HC expiry. + * + * @param details the details to set + */ + public static void resetClothes(PlayerDetails details) { + if (details.getSex().equals("M")) { + details.setFigure("hd-180-1.ch-215-62.lg-275-62.hr-100-"); + details.setSex("M"); + } else { + details.setFigure("hd-600-1.ch-645-62.lg-700-62.sh-730-68.hr-500-45"); + details.setSex("F"); + } + + PlayerDao.saveDetails(details.getId(), details.getFigure(), details.getPoolFigure(), details.getSex()); + //hd-180-1.ch-215-62.lg-275-62.hr-100- + } + + /** + * Get the offset of seconds required until the next gift is allowed. + * + * @return the offset seconds + */ + public static long getClubGiftSeconds() { + return TimeUnit.valueOf(GameConfiguration.getInstance().getString("club.gift.timeunit")).toSeconds(GameConfiguration.getInstance().getInteger("club.gift.interval")); + } + + /** + * Add badges if required for Habbo Club. + * + * @param player the player to check and add badges to + */ + public static void checkBadges(Player player) { + if (player.getDetails().hasClubSubscription()) { + if (!player.getBadgeManager().hasBadge("HC1")) { + player.getBadgeManager().tryAddBadge("HC1", null); + } + } + + if (hasGoldClubSubscription(player)) { + if (!player.getBadgeManager().hasBadge("HC2")) { + player.getBadgeManager().tryAddBadge("HC2", null); + } + } + + if (hasPlatinumClubSubscription(player)) { + if (!player.getBadgeManager().hasBadge("HC3")) { + player.getBadgeManager().tryAddBadge("HC3", null); + } + } + } + + /** + * Get the sprites of the gift order. + * + * @return the array of gifts in order for each month + */ + public static String[] getGiftOrder() { + return giftOrder; + } + + /** + * Count member days and increase days. + * + * @param player the player to count for + */ + public static void countMemberDays(Player player) { + countMemberDays(player.getDetails(), player.getStatisticManager()); + } + + /** + * Count member days and increase days. + * + * @param playerDetails the playerdetails + */ + public static void countMemberDays(PlayerDetails playerDetails, PlayerStatisticManager playerStatisticManager) { + if (playerDetails.hasClubSubscription()) { + long lastUpdated = playerStatisticManager.getLongValue(PlayerStatistic.CLUB_MEMBER_TIME_UPDATED); + + if (lastUpdated > 0) { + PlayerStatisticsDao.updateStatistic(playerDetails.getId(), PlayerStatistic.CLUB_MEMBER_TIME, + String.valueOf(playerStatisticManager.getLongValue(PlayerStatistic.CLUB_MEMBER_TIME) + DateUtil.getCurrentTimeSeconds() - lastUpdated)); + } + + PlayerStatisticsDao.updateStatistic(playerDetails.getId(), PlayerStatistic.CLUB_MEMBER_TIME_UPDATED, + String.valueOf(DateUtil.getCurrentTimeSeconds())); + } + } + + public static boolean hasGoldClubSubscription(Player player) { + if (player.getDetails().hasClubSubscription()) { + int days = (int) TimeUnit.SECONDS.toDays(player.getStatisticManager().getLongValue(PlayerStatistic.CLUB_MEMBER_TIME)); + int sinceMonths = days > 0 ? days / 31 : 0; + + // We are deemed a 'Gold' Club member if the user has been a club subscriber for a year + // According to the HabboX wiki the badge is to be received on the first day of the 13th subscribed month + return sinceMonths >= 12; + } + + return false; + } + + public static boolean hasPlatinumClubSubscription(Player player) { + if (player.getDetails().hasClubSubscription()) { + int days = (int) TimeUnit.SECONDS.toDays(player.getStatisticManager().getLongValue(PlayerStatistic.CLUB_MEMBER_TIME)); + int sinceMonths = days > 0 ? days / 31 : 0; + + // We are deemed a 'Gold' Club member if the user has been a club subscriber for a year + // According to the HabboX wiki the badge is to be received on the first day of the 13th subscribed month + return sinceMonths >= 24; + } + + return false; + } + +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/Command.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/Command.java new file mode 100644 index 0000000..af17b4e --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/Command.java @@ -0,0 +1,90 @@ +package org.alexdev.havana.game.commands; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.player.PlayerRank; + +import java.util.ArrayList; +import java.util.List; + +public abstract class Command { + protected PlayerRank playerRank; + protected List groupPermission; + protected List arguments; + + public Command() { + this.arguments = new ArrayList<>(); + this.groupPermission = new ArrayList<>(); + this.setPlayerRank(); + this.addArguments(); + } + + /** + * Adds the permissions. + */ + public abstract void setPlayerRank(); + + /** + * Handler for setting minimum player rank allowed. + * + * @param playerRank the rank + */ + public void setPlayerRank(PlayerRank playerRank) { + this.playerRank = playerRank; + } + + /** + * Get groups required (if any) to be able to use this./ + * @return + */ + public List getGroupPermission() { + return groupPermission; + } + + /** + * Add the group id to the users who can execute this. + * + * @param groupIds the groups + */ + public void addGroup(List groupIds) { + groupPermission.addAll(groupIds); + } + + /** + * Adds the argument names, must be overridden + */ + public void addArguments() { }; + + /** + * Handle command. + * + * @param entity the entity + * @param message the message + */ + public abstract void handleCommand(Entity entity, String message, String[] args) throws Exception; + + /** + * Gets the description. + * + * @return the description + */ + public abstract String getDescription(); + + /** + * Gets the minimum player rank allowed. + * + * @return the permissions + */ + public PlayerRank getPlayerRank() { + return this.playerRank; + } + + /** + * Gets the arguments. + * + * @return the arguments + */ + public String[] getArguments() { + return this.arguments.parallelStream().toArray(String[]::new); + } + +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/CommandManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/CommandManager.java new file mode 100644 index 0000000..6a8d8ed --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/CommandManager.java @@ -0,0 +1,261 @@ +package org.alexdev.havana.game.commands; + +import org.alexdev.havana.game.commands.registered.*; +import org.alexdev.havana.game.commands.registered.admin.*; +import org.alexdev.havana.game.commands.registered.groups.*; +import org.alexdev.havana.game.commands.registered.moderation.*; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.texts.TextsManager; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; +import org.alexdev.havana.util.config.GameConfiguration; +import org.apache.commons.lang3.tuple.Pair; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class CommandManager { + private Map commands; + + private static final Logger log = LoggerFactory.getLogger(CommandManager.class); + private static CommandManager instance; + + public CommandManager() { + this.commands = new LinkedHashMap<>(); + + for (var set : getCommands()) { + addCommand(set.getKey(), set.getValue()); + } + + log.info("Loaded {} commands", commands.size()); + } + + /** + * Get a fresh list of command instances. + * + * @return the list of commands + */ + public static List> getCommands() { + var tempCommands = new LinkedHashMap(); + tempCommands.put(new String[] { "help", "commands" }, new HelpCommand()); + tempCommands.put(new String[] { "about", "info" }, new AboutCommand()); + tempCommands.put(new String[] { "giveitem", "givedrink" }, new GiveDrinkCommand()); + tempCommands.put(new String[] { "dropitem", "dropdrink" }, new DropDrinkCommand()); + tempCommands.put(new String[] { "sit" }, new SitCommand()); + tempCommands.put(new String[] { "uptime", "status" }, new UptimeCommand()); + tempCommands.put(new String[] { "coords" }, new CoordsCommand()); + tempCommands.put(new String[] { "pickall" }, new PickAllCommand()); + tempCommands.put(new String[] { "usersonline", "whosonline" }, new UsersOnlineCommand()); + tempCommands.put(new String[] { "rgb", "rainbow" }, new RainbowDimmerCommand()); + tempCommands.put(new String[] { "afk", "idle" }, new AfkCommand()); + tempCommands.put(new String[] { "guidestatus" }, new GuideStatusCommand()); + + // Staff commands + tempCommands.put(new String[] { "copyroom" }, new CopyRoomCommand()); + tempCommands.put(new String[] { "givebadge" }, new GiveBadgeCommand()); + tempCommands.put(new String[] { "deletebadge", "removebadge" }, new RemoveBadgeCommand()); + tempCommands.put(new String[] { "packet" }, new PacketTestCommand()); + tempCommands.put(new String[] { "reload" }, new ReloadCommand()); + tempCommands.put(new String[] { "shutdown" }, new ShutdownCommand()); + tempCommands.put(new String[] { "setconfig" }, new SetConfigCommand()); + tempCommands.put(new String[] { "itemdebug" }, new ItemDebugCommand()); + tempCommands.put(new String[] { "talk" }, new TalkCommand()); + tempCommands.put(new String[] { "bot" }, new BotCommand()); + tempCommands.put(new String[] { "headrotate", "hr" }, new HeadRotateCommand()); + tempCommands.put(new String[] { "teleport", "tele", "telep", "tp" }, new TeleportCommand()); + tempCommands.put(new String[] { "addcredits", "givecredits" }, new GiveCreditsCommand()); + tempCommands.put(new String[] { "removecredits", "delcredits" }, new RemoveCreditsCommand()); + tempCommands.put(new String[] { "checkbalance", "balance" }, new CheckCreditsCommand()); + tempCommands.put(new String[] { "resetpw" }, new RecoverAccountCommand()); + tempCommands.put(new String[] { "unacceptable" }, new UnacceptableCommand()); + tempCommands.put(new String[] { "giftroom" }, new GiftRoomCommand()); + + // Moderation + tempCommands.put(new String[] { "dc", "disconnect" }, new DisconnectUserCommand()); + + // Group perms + tempCommands.put(new String[] { "roommute", "eventmute" }, new RoomMuteCommand()); + tempCommands.put(new String[] { "hotelalert", "ha" }, new HotelAlertCommand()); + tempCommands.put(new String[] { "roomalert", "ra" }, new RoomAlertCommand()); + tempCommands.put(new String[] { "ban", "userban" }, new BanCommand()); + tempCommands.put(new String[] { "unban" }, new UnbanCommand()); + tempCommands.put(new String[] { "tradeban" }, new TradeBanCommand()); + tempCommands.put(new String[] { "mute" }, new MuteCommand()); + tempCommands.put(new String[] { "unmute" }, new UnmuteCommand()); + + List> commandList = new ArrayList<>(); + + for (var set : tempCommands.entrySet()) { + commandList.add(Pair.of(set.getKey(), set.getValue())); + } + + return commandList; + } + + /** + * Add the command + * @param aliases the aliases + * @param command the command instance + */ + private void addCommand(String[] aliases, Command command) { + this.commands.put(aliases, command); + + if (GameConfiguration.getInstance().getString("groups.ids.permission." + aliases[0], "").length() > 0) { + command.addGroup(Stream.of(GameConfiguration.getInstance().getString("groups.ids.permission." + aliases[0]).split(",")) + .map(Integer::parseInt).collect(Collectors.toList())); + } + } + + /** + * Gets the command. + * + * @param commandName the command name + * @return the command + */ + private Command getCommand(String commandName) { + for (Entry entrySet : commands.entrySet()) { + for (String name : entrySet.getKey()) { + + if (commandName.equalsIgnoreCase(name)) { + return entrySet.getValue(); + } + } + } + + return null; + } + + /** + * Checks for command. + * + * @param entity the player + * @param message the message + * @return true, if successful + */ + public boolean hasCommand(Entity entity, String message) { + if (message.startsWith(":") && message.length() > 1) { + var parts = message.split(":"); + + if (parts.length > 1) { + String commandName = message.split(":")[1]; + commandName = commandName.split(" ").length > 0 ? commandName.split(" ")[0] : ""; + Command cmd = this.getCommand(commandName); + + if (cmd != null) { + return this.hasPermission(entity.getDetails(), commandName); + } + } + } + + return false; + } + + /** + * Checks for command permission. + * + * @param playerDetails the player details + * @param commandName the command + * @return true, if successful + */ + public boolean hasPermission(PlayerDetails playerDetails, String commandName) { + var cmd = getCommand(commandName); + + if (cmd == null) + return false; + + boolean hasRank = playerDetails.getRank().getRankId() >= cmd.getPlayerRank().getRankId(); + + if (hasRank) + return true; + + var player = PlayerManager.getInstance().getPlayerById(playerDetails.getId()); + + if (player != null) { + for (int groupId : cmd.getGroupPermission()) { + if (player.getJoinedGroup(groupId) != null) + return true; + } + } + + return false; + } + + /** + * Invoke command. + * + * @param entity the player + * @param message the message + */ + public void invokeCommand(Entity entity, String message) throws Exception { + String commandName = message.split(":")[1].split(" ")[0]; + Command cmd = this.getCommand(commandName); + + String[] args = new String[0]; + + if (message.length() > (commandName.length() + 2)) { + args = message.replace(":" + commandName + " ", "").split(" "); + } + + if (cmd != null) { + if (args.length < cmd.getArguments().length) { + if (entity.getType() == EntityType.PLAYER) { + Player player = (Player)entity; + player.send(new ALERT(TextsManager.getInstance().getValue("player_commands_no_args"))); + } else { + System.out.println(TextsManager.getInstance().getValue("player_commands_no_args")); + } + return; + } + + cmd.handleCommand(entity, message, args); + } + } + + /** + * Gets the commands. + * + * @return the commands + */ + /*public List> getCommands() { + List> commandList = new ArrayList<>(); + + for (var set : this.commands.entrySet()) { + commandList.add(Pair.of(set.getKey(), set.getValue())); + } + + return commandList; + }*/ + + /** + * Gets the instance + * + * @return the instance + */ + public static CommandManager getInstance() { + if (instance == null) { + instance = new CommandManager(); + } + + return instance; + } + + /** + * Reset the instance + * + * @return the instance + */ + public static void reset() { + instance = null; + getInstance(); + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/AboutCommand.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/AboutCommand.java new file mode 100644 index 0000000..3086de1 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/AboutCommand.java @@ -0,0 +1,42 @@ +package org.alexdev.havana.game.commands.registered; + +import org.alexdev.havana.game.commands.Command; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; + +public class AboutCommand extends Command { + @Override + public void setPlayerRank() { + super.setPlayerRank(PlayerRank.NORMAL); + } + + @Override + public void handleCommand(Entity entity, String message, String[] args) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player)entity; + + player.send(new ALERT("Project Havana - Habbo Hotel v31 emulation" + + "
" + + "
Release: r31_20090312_0433_13751_b40895fb6101dbe96dc7b9d6477eeeb4" + + "
" + + "
Contributors:" + + "
- ThuGie, Copyright, Raptosaur, Hoshiko, TOMYSSHADOW, Elijah " + // Call for help + "
Romuald, Glaceon, Nillus, Holo Team, Meth0d, office.boy, bbadzz" + + "
" + + "
Big thanks to Sefhriloff & Ascii for assisting with SnowStorm." + + "
" + + "
" + + "Made by Quackster from RaGEZONE")); + } + + @Override + public String getDescription() { + return " Information about the software powering this retro"; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/AfkCommand.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/AfkCommand.java new file mode 100644 index 0000000..2ba3c69 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/AfkCommand.java @@ -0,0 +1,41 @@ +package org.alexdev.havana.game.commands.registered; + +import org.alexdev.havana.game.commands.Command; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerRank; + +public class AfkCommand extends Command { + @Override + public void setPlayerRank() { + super.setPlayerRank(PlayerRank.NORMAL); + } + + @Override + public void handleCommand(Entity entity, String message, String[] args) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + + if (player.getRoomUser().getRoom() == null) { + return; + } + + if (player.getRoomUser().isWalking()) { + return; + } + + if (!player.getRoomUser().isSleeping()) { + player.getRoomUser().sleep(true); + } + } + + @Override + public String getDescription() { + return "Put your eyes to sleep"; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/DropDrinkCommand.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/DropDrinkCommand.java new file mode 100644 index 0000000..8dd2407 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/DropDrinkCommand.java @@ -0,0 +1,54 @@ +package org.alexdev.havana.game.commands.registered; + +import org.alexdev.havana.game.commands.Command; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.game.room.enums.StatusType; +import org.alexdev.havana.game.texts.TextsManager; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; +import org.alexdev.havana.messages.outgoing.rooms.user.CHAT_MESSAGE; +import org.alexdev.havana.messages.outgoing.rooms.user.CHAT_MESSAGE.ChatMessageType; +import org.apache.commons.lang3.StringUtils; + +public class DropDrinkCommand extends Command { + @Override + public void setPlayerRank() { + super.setPlayerRank(PlayerRank.NORMAL); + } + + @Override + public void addArguments() { } + + @Override + public void handleCommand(Entity entity, String message, String[] args) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + + if (player.getRoomUser().getRoom() == null) { + return; + } + + if (!player.getRoomUser().isCarrying() || player.getRoomUser().containsStatus(StatusType.CARRY_ITEM)) { + player.send(new ALERT("You are not carrying any food or drinks to drop.")); + return; + } + + if (!player.getRoomUser().containsStatus(StatusType.CARRY_DRINK)) { + return; + } + + player.getRoomUser().stopCarrying(); + player.getRoomUser().setNeedsUpdate(true); + } + + @Override + public String getDescription() { + return "Drops your own drink"; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/GiveDrinkCommand.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/GiveDrinkCommand.java new file mode 100644 index 0000000..6be64ac --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/GiveDrinkCommand.java @@ -0,0 +1,110 @@ +package org.alexdev.havana.game.commands.registered; + +import org.alexdev.havana.game.commands.Command; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.game.room.enums.StatusType; +import org.alexdev.havana.game.texts.TextsManager; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; +import org.alexdev.havana.messages.outgoing.rooms.user.CHAT_MESSAGE; +import org.alexdev.havana.messages.outgoing.rooms.user.CHAT_MESSAGE.ChatMessageType; +import org.apache.commons.lang3.StringUtils; + +public class GiveDrinkCommand extends Command { + @Override + public void setPlayerRank() { + super.setPlayerRank(PlayerRank.NORMAL); + } + + @Override + public void addArguments() { + this.arguments.add("user"); + } + + @Override + public void handleCommand(Entity entity, String message, String[] args) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + + if (player.getRoomUser().getRoom() == null) { + return; + } + + Player targetUser = PlayerManager.getInstance().getPlayerByName(args[0]); + + if (targetUser == null || + targetUser.getRoomUser().getRoom() == null || + targetUser.getRoomUser().getRoom().getId() != player.getRoomUser().getRoom().getId()) { + player.send(new ALERT("Could not find user: " + args[0])); + return; + } + + if (!player.getRoomUser().isCarrying() || player.getRoomUser().containsStatus(StatusType.CARRY_ITEM)) { + player.send(new ALERT("You are not carrying any food or drinks to give.")); + return; + } + + String drinkName = null; + int drinkId = 0; + + /*if (player.getRoomUser().getCarryId() > 0) { + drinkId = player.getRoomUser().getCarryId(); + }*/ + + if (player.getRoomUser().containsStatus(StatusType.CARRY_DRINK)) { + var value = player.getRoomUser().getStatus(StatusType.CARRY_DRINK).getValue(); + + if (StringUtils.isNumeric(value)) { + drinkId = Integer.parseInt(value); + } else { + drinkName = value; + } + } + + if (drinkId > 0 || drinkName != null) { + if (targetUser.getRoomUser().isSleeping()) { + player.send(new CHAT_MESSAGE(ChatMessageType.WHISPER, player.getRoomUser().getInstanceId(), targetUser.getDetails().getName() + " is sleeping.", 0)); + return; + } + + if (targetUser.getRoomUser().isUsingEffect()) { + player.send(new CHAT_MESSAGE(ChatMessageType.WHISPER, player.getRoomUser().getInstanceId(), targetUser.getDetails().getName() + " can't hold a drink, they're using an effect.", 0)); + return; + } + + // Give drink to user if they're not already having a drink or food, and they're not dancing + if (targetUser.getRoomUser().isCarrying()) { + player.send(new CHAT_MESSAGE(ChatMessageType.WHISPER, player.getRoomUser().getInstanceId(), targetUser.getDetails().getName() + " is already enjoying a drink.", 0)); + return; + } + + if (targetUser.getRoomUser().isDancing()) { + player.send(new CHAT_MESSAGE(ChatMessageType.WHISPER, player.getRoomUser().getInstanceId(), "Can't hand drink to " + targetUser.getDetails().getName() + ", because he/she is dancing.", 0)); + return; + } + + targetUser.getRoomUser().carryItem(drinkId, drinkName); + String carryName = drinkName; + + if (drinkName == null) { + carryName = TextsManager.getInstance().getValue("handitem" + drinkId); + } + + targetUser.send(new CHAT_MESSAGE(ChatMessageType.WHISPER, targetUser.getRoomUser().getInstanceId(), player.getDetails().getName() + " handed you a " + carryName + ".", 0)); + + player.getRoomUser().stopCarrying(); + player.getRoomUser().setNeedsUpdate(true); + } + } + + @Override + public String getDescription() { + return "Gives a user your own drink"; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/GuideStatusCommand.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/GuideStatusCommand.java new file mode 100644 index 0000000..1e8a0cf --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/GuideStatusCommand.java @@ -0,0 +1,64 @@ +package org.alexdev.havana.game.commands.registered; + +import org.alexdev.havana.dao.mysql.GuideDao; +import org.alexdev.havana.game.commands.Command; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.game.player.guides.GuidingData; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.config.GameConfiguration; +import org.apache.commons.lang.StringUtils; + +import java.util.Comparator; +import java.util.concurrent.TimeUnit; + +public class GuideStatusCommand extends Command { + @Override + public void setPlayerRank() { + super.setPlayerRank(PlayerRank.NORMAL); + } + + @Override + public void addArguments() { } + + @Override + public void handleCommand(Entity entity, String message, String[] args) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + + if (player.getRoomUser().getRoom() == null) { + return; + } + + var guiding = GuideDao.getGuidedBy(player.getDetails().getId()); + guiding.sort(Comparator.comparingLong(GuidingData::getLastOnline).reversed()); + + StringBuilder alert = new StringBuilder(); + alert.append("You are guiding " + guiding.size() + " users. Remember a user needs an online time for at least " + TimeUnit.MINUTES.toDays(GameConfiguration.getInstance().getInteger("guide.completion.minutes")) + " days to be guided.

"); + + alert.append(StringUtils.rightPad("Username", 20, " ")); + alert.append(StringUtils.rightPad("Time Online", 58, " ")); + alert.append(StringUtils.rightPad("Last Online", 15, " ")); + alert.append("
"); + + for (var guideData : guiding) { + alert.append(StringUtils.rightPad(guideData.getUsername(), 20, " ")); + alert.append(StringUtils.rightPad(DateUtil.getReadableSeconds(guideData.getTimeOnline()), 58, " ")); + alert.append(StringUtils.rightPad(DateUtil.getDate(guideData.getLastOnline(), DateUtil.SHORT_DATE), 15, " ")); + alert.append("
"); + } + + player.send(new ALERT(alert.toString())); + } + + @Override + public String getDescription() { + return "View the current loaded groups"; + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/HelpCommand.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/HelpCommand.java new file mode 100644 index 0000000..16d957c --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/HelpCommand.java @@ -0,0 +1,91 @@ +package org.alexdev.havana.game.commands.registered; + +import org.alexdev.havana.game.commands.Command; +import org.alexdev.havana.game.commands.CommandManager; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; +import org.alexdev.havana.util.StringUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.Arrays; +import java.util.Comparator; +import java.util.stream.Collectors; + +public class HelpCommand extends Command { + @Override + public void setPlayerRank() { + super.setPlayerRank(PlayerRank.NORMAL); + } + + @Override + public void handleCommand(Entity entity, String message, String[] args) { + var availableCommands = CommandManager.getCommands().stream().filter(command -> CommandManager.getInstance().hasPermission(entity.getDetails(), command.getKey()[0])).collect(Collectors.toList()); + + int pageId = 1; + String parsePageId = args.length > 0 ? args[0] : "1"; + String commandFilter = null; + + if (!StringUtils.isNumeric(parsePageId)) + { + commandFilter = args[0]; + parsePageId = args.length > 1 ? args[1] : "1"; + } + + if (StringUtils.isNumeric(parsePageId)) { + pageId = Integer.parseInt(parsePageId); + } + + if (commandFilter != null) { + final String finalCommandFilter = commandFilter; + availableCommands = availableCommands.stream().filter(x -> Arrays.asList(x.getKey()).stream().anyMatch(commandAlias -> commandAlias.contains(finalCommandFilter))).collect(Collectors.toList()); + } + + availableCommands.sort(Comparator.comparing(x -> x.getKey()[0])); + var commands = StringUtil.paginate(availableCommands, 10, true); + + if (!commands.containsKey(pageId - 1)) { + pageId = 1; + } + + var commandList = commands.get(pageId - 1); + + StringBuilder about = new StringBuilder(); + about.append("Commands ('<' and '>' are optional parameters):
").append("
"); + + for (var commandSet : commandList) { + String[] commandAlias = commandSet.getKey(); + Command command = commandSet.getValue(); + + about.append(":").append(String.join("/", commandAlias)); + + if (command.getArguments().length > 0) { + if (command.getArguments().length > 1) { + about.append(" [").append(String.join("] [", command.getArguments())).append("]"); + } else { + about.append(" [").append(command.getArguments()[0]).append("]"); + } + } + + about.append(" - ").append(command.getDescription()).append("
"); + } + + about.append("
") + .append("Page ") + .append(pageId) + .append(" out of ") + .append(commands.size()); + + if (entity.getType() == EntityType.PLAYER) { + Player player = (Player) entity; + player.send(new ALERT(about.toString())); + } + } + + @Override + public String getDescription() { + return " - List available commands"; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/PickAllCommand.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/PickAllCommand.java new file mode 100644 index 0000000..1e2b9df --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/PickAllCommand.java @@ -0,0 +1,68 @@ +package org.alexdev.havana.game.commands.registered; + +import org.alexdev.havana.dao.mysql.ItemDao; +import org.alexdev.havana.game.commands.Command; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerRank; + +import java.util.ArrayList; +import java.util.List; + +public class PickAllCommand extends Command { + @Override + public void setPlayerRank() { + super.setPlayerRank(PlayerRank.NORMAL); + } + + @Override + public void handleCommand(Entity entity, String message, String[] args) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + + if (player.getRoomUser().getRoom() == null) { + return; + } + + if (!player.getRoomUser().getRoom().isOwner(player.getDetails().getId()) && !player.hasFuse(Fuseright.ANY_ROOM_CONTROLLER)) { + return; + } + + List itemsToPickup = new ArrayList<>(); + + for (Item item : player.getRoomUser().getRoom().getItems()) { + if (item.hasBehaviour(ItemBehaviour.PUBLIC_SPACE_OBJECT)) { + continue; // The client does not allow picking up public room furniture, thus neither will the server + } + + if (item.hasBehaviour(ItemBehaviour.POST_IT)) { + continue; // The client does not allow picking up post-it's, thus neither will the server + } + + itemsToPickup.add(item); + } + + for (Item item : itemsToPickup) { + item.setOwnerId(player.getDetails().getId()); + + player.getRoomUser().getRoom().getMapping().removeItem(player, item); + player.getInventory().addItem(item); + } + + ItemDao.updateItemOwnership(itemsToPickup); + + player.getInventory().getView("new"); + } + + @Override + public String getDescription() { + return "Allows the owner to pick up all furniture in a room"; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/RainbowDimmerCommand.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/RainbowDimmerCommand.java new file mode 100644 index 0000000..9344de8 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/RainbowDimmerCommand.java @@ -0,0 +1,99 @@ +package org.alexdev.havana.game.commands.registered; + +import org.alexdev.havana.game.commands.Command; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.tasks.RainbowTask; +import org.alexdev.havana.messages.outgoing.rooms.user.CHAT_MESSAGE; +import org.alexdev.havana.messages.outgoing.rooms.user.CHAT_MESSAGE.ChatMessageType; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; +import org.apache.commons.lang3.StringUtils; + +import java.util.concurrent.TimeUnit; + +public class RainbowDimmerCommand extends Command { + @Override + public void setPlayerRank() { + super.setPlayerRank(PlayerRank.NORMAL); + } + + @Override + public void handleCommand(Entity entity, String message, String[] args) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + + if (player.getRoomUser().getRoom() == null) { + return; + } + + Room room = player.getRoomUser().getRoom(); + + if (!player.getRoomUser().getRoom().isOwner(player.getDetails().getId()) && !player.hasFuse(Fuseright.ANY_ROOM_CONTROLLER)) { + return; + } + + int tickInterval = 5; + + if (args.length == 1) { + if (!StringUtils.isNumeric(args[0])) { + player.send(new ALERT("Please specify the number internal in seconds of the time it takes change colours")); + return; + } else { + tickInterval = Integer.parseInt(args[0]); + } + } + + if (tickInterval < 1) { + tickInterval = 1; + } + + Item moodlight = room.getItemManager().getMoodlight(); + + if (moodlight == null) { + player.send(new ALERT("This command requires a moodlight placed for it to work")); + return; + } + + + Player roomOwner = PlayerManager.getInstance().getPlayerById(room.getData().getOwnerId()); + boolean ownerInRoom = false; + + if (roomOwner.getRoomUser().getRoom() != null) { + ownerInRoom = roomOwner.getRoomUser().getRoom().getData().getOwnerId() == room.getData().getOwnerId(); + } + + String statusMessage; + + if (room.getTaskManager().hasTask("RainbowTask")) { + room.getTaskManager().cancelTask("RainbowTask"); + + statusMessage = "Rainbow room dimmer cycle has stopped"; + } else { + RainbowTask rainbowTask = new RainbowTask(room); + room.getTaskManager().scheduleTask("RainbowTask", rainbowTask, 0, tickInterval, TimeUnit.SECONDS); + + statusMessage = "Rainbow room dimmer cycle has started"; + } + + player.send(new CHAT_MESSAGE(ChatMessageType.WHISPER, player.getRoomUser().getInstanceId(), statusMessage, 0)); + + // Send status of room task to roomowner + if (ownerInRoom) { + roomOwner.send(new CHAT_MESSAGE(ChatMessageType.WHISPER, roomOwner.getRoomUser().getInstanceId(), statusMessage, 0)); + } + } + + @Override + public String getDescription() { + return " - Cycles through the rainbow in your very own room!"; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/SetConfigCommand.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/SetConfigCommand.java new file mode 100644 index 0000000..1fcbc9f --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/SetConfigCommand.java @@ -0,0 +1,54 @@ +package org.alexdev.havana.game.commands.registered; + +import org.alexdev.havana.dao.mysql.SettingsDao; +import org.alexdev.havana.game.commands.Command; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; +import org.alexdev.havana.util.config.GameConfiguration; +import org.alexdev.havana.util.config.writer.GameConfigWriter; + +public class SetConfigCommand extends Command { + @Override + public void setPlayerRank() { + super.setPlayerRank(PlayerRank.ADMINISTRATOR); + } + + @Override + public void addArguments() { + this.arguments.add("setting"); + this.arguments.add("value"); + } + + @Override + public void handleCommand(Entity entity, String message, String[] args) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + + String setting = args[0]; + String value = args[1]; + + if (!GameConfiguration.getInstance().getConfig().containsKey(setting)) { + player.send(new ALERT("The setting \"" + setting + "\" doesn't exist!")); // TODO: Add locale + return; + } + + String oldValue = GameConfiguration.getInstance().getConfig().get(setting); + + SettingsDao.updateSetting(setting, value); + GameConfiguration.reset(new GameConfigWriter()); + + player.send(new ALERT("The setting \"" + setting + "\" value has been updated from \"" + oldValue + "\" to \"" + value + "\"")); // TODO: Add locale + } + + @Override + public String getDescription() { + return "In-game housekeeping for the catalogue item prices."; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/ShutdownCommand.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/ShutdownCommand.java new file mode 100644 index 0000000..0f80013 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/ShutdownCommand.java @@ -0,0 +1,69 @@ +package org.alexdev.havana.game.commands.registered; + +import org.alexdev.havana.game.commands.Command; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.messages.outgoing.rooms.user.CHAT_MESSAGE; +import org.alexdev.havana.messages.outgoing.rooms.user.CHAT_MESSAGE.ChatMessageType; +import org.alexdev.havana.util.config.GameConfiguration; + +import java.time.Duration; + +public class ShutdownCommand extends Command { + @Override + public void setPlayerRank() { + super.setPlayerRank(PlayerRank.ADMINISTRATOR); + } + + @Override + public void addArguments() { + /*this.arguments.add("minutes");*/ + } + + @Override + public void handleCommand(Entity entity, String message, String[] args) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + + // Abort maintenance shutdown if provided argument is either cancel, off or stop (case insensitive) + if (args.length > 0) { + if (args[0].equalsIgnoreCase("cancel") || args[0].equalsIgnoreCase("off") || args[0].equalsIgnoreCase("stop")) { + PlayerManager.getInstance().cancelMaintenance(); + player.send(new CHAT_MESSAGE(ChatMessageType.WHISPER, player.getRoomUser().getInstanceId(), "Cancelled shutdown", 0)); + return; + } + } + + long minutes; + + // Try parsing minutes argument, use default if failed + try { + if (args.length > 0) { + minutes = Long.parseLong(args[0]); + } else { + minutes = GameConfiguration.getInstance().getLong("shutdown.minutes"); + } + } catch (NumberFormatException e) { + minutes = GameConfiguration.getInstance().getLong("shutdown.minutes"); + player.send(new CHAT_MESSAGE(ChatMessageType.WHISPER, player.getRoomUser().getInstanceId(), "Failed to parse minutes provided to shutdown command, defaulting to " + minutes + " minute(s)", 0)); + } + + // Enqueue maintenance shutdown + PlayerManager.getInstance().planMaintenance(Duration.ofMinutes(minutes)); + + // Let callee know Havana is shutting down in X minutes + player.send(new CHAT_MESSAGE(ChatMessageType.WHISPER, player.getRoomUser().getInstanceId(), "Shutting down in " + minutes + " minute(s)", 0)); + } + + @Override + public String getDescription() { + return " - Shutdown Havana"; + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/SitCommand.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/SitCommand.java new file mode 100644 index 0000000..e4832af --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/SitCommand.java @@ -0,0 +1,89 @@ +package org.alexdev.havana.game.commands.registered; + +import org.alexdev.havana.game.commands.Command; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.item.interactors.InteractionType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.game.room.enums.StatusType; +import org.alexdev.havana.game.room.tasks.EntityTask; +import org.alexdev.havana.messages.outgoing.effects.USER_AVATAR_EFFECT; +import org.alexdev.havana.util.StringUtil; + +public class SitCommand extends Command { + @Override + public void setPlayerRank() { + super.setPlayerRank(PlayerRank.NORMAL); + } + + @Override + public void handleCommand(Entity entity, String message, String[] args) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + + if (player.getRoomUser().getRoom() == null) { + return; + } + + if (player.getRoomUser().containsStatus(StatusType.SIT)) { + return; + } + + if (player.getRoomUser().containsStatus(StatusType.SWIM)) { + return; + } + + double height = 0.5; + + if (player.getRoomUser().getRoom().isPublicRoom()) { + if (player.getRoomUser().getRoom().getModel().getName().startsWith("pool_")) { + height = 0.0; + } + } + + int rotation = player.getRoomUser().getPosition().getRotation() / 2 * 2; + Item item = player.getRoomUser().getCurrentItem(); + + if (item != null) { + if (item.getDefinition().getInteractionType() == InteractionType.WS_JOIN_QUEUE || + item.getDefinition().getInteractionType() == InteractionType.WS_QUEUE_TILE || + item.getDefinition().getInteractionType() == InteractionType.WS_TILE_START) { + return; // Don't process :sit command on furniture that the user is already on. + } + + if (item.hasBehaviour(ItemBehaviour.CAN_SIT_ON_TOP) || item.hasBehaviour(ItemBehaviour.CAN_LAY_ON_TOP)) { + return; // Don't process :sit command on furniture that the user is already on. + } + + if (!item.hasBehaviour(ItemBehaviour.ROLLER)) { + height += item.getDefinition().getTopHeight(); + } + } + + player.getRoomUser().getPosition().setRotation(rotation); + player.getRoomUser().setStatus(StatusType.SIT, StringUtil.format(height)); + player.getRoomUser().stopDancing(); + player.getRoomUser().setNeedsUpdate(true); + + if (player.getRoomUser().isUsingEffect()) { + if (!player.getRoomUser().getRoom().getTaskManager().hasTask("EntityTask")) { + return; + } + + EntityTask entityTask = (EntityTask) player.getRoomUser().getRoom().getTaskManager().getTask("EntityTask"); + entityTask.getQueueAfterLoop().add(new USER_AVATAR_EFFECT(player.getRoomUser().getInstanceId(), player.getRoomUser().getEffectId())); + } + } + + @Override + public String getDescription() { + return "Parks your arse on the floor"; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/TalkCommand.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/TalkCommand.java new file mode 100644 index 0000000..65c47ed --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/TalkCommand.java @@ -0,0 +1,55 @@ +package org.alexdev.havana.game.commands.registered; + +import org.alexdev.havana.game.commands.Command; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.item.ItemManager; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.rooms.items.PLACE_FLOORITEM; +import org.alexdev.havana.util.StringUtil; + +public class TalkCommand extends Command { + @Override + public void setPlayerRank() { + super.setPlayerRank(PlayerRank.ADMINISTRATOR); + } + + @Override + public void handleCommand(Entity entity, String message, String[] args) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + + String talkMessage; + + if (args.length > 0) { + talkMessage = StringUtil.filterInput(String.join(" ", args), true); + } else { + talkMessage = ""; + } + + TalkCommand.createVoiceSpeakMessage(player.getRoomUser().getRoom(), talkMessage); + } + + public static void createVoiceSpeakMessage(Room room, String text) { + // 'Speaker' + Item pItem = new Item(); + pItem.setVirtualId(999); + pItem.setPosition(new Position(255, 255, -1f)); + pItem.setCustomData("voiceSpeak(\"" + text + "\")"); + pItem.setDefinitionId(ItemManager.getInstance().getDefinitionBySprite("spotlight").getId()); + room.send(new PLACE_FLOORITEM(pItem)); + } + + @Override + public String getDescription() { + return "Voice to text command"; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/UptimeCommand.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/UptimeCommand.java new file mode 100644 index 0000000..e591f49 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/UptimeCommand.java @@ -0,0 +1,85 @@ +package org.alexdev.havana.game.commands.registered; + +import org.alexdev.havana.Havana; +import org.alexdev.havana.game.commands.Command; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.games.GameManager; +import org.alexdev.havana.game.games.enums.GameState; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.config.GameConfiguration; + +public class UptimeCommand extends Command { + private static final int UPTIME_COMMAND_INTERVAL_SECONDS = 5; + private static long UPTIME_COMMAND_EXPIRY = 0L; + + private static final int CPU_NUM_THREADS = Runtime.getRuntime().availableProcessors(); + private static final String CPU_ARCHITECTURE = System.getProperty("os.arch"); + private static final String JVM_NAME = System.getProperty("java.vm.name"); + private static final String OPERATING_SYSTEM_NAME = System.getProperty("os.name"); + + private static int MEMORY_USAGE = 0; + private static int ACTIVE_PLAYERS = 0; + private static int AUTHENTICATED_PLAYERS = 0; + private static int ACTIVE_GAMES = 0; + + public UptimeCommand(){ + UPTIME_COMMAND_EXPIRY = DateUtil.getCurrentTimeSeconds(); + } + + @Override + public void setPlayerRank() { + super.setPlayerRank(PlayerRank.NORMAL); + } + + @Override + public void handleCommand(Entity entity, String message, String[] args) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + + if (DateUtil.getCurrentTimeSeconds() > UPTIME_COMMAND_EXPIRY) { + AUTHENTICATED_PLAYERS = PlayerManager.getInstance().getPlayers().size(); + ACTIVE_PLAYERS = PlayerManager.getInstance().getActivePlayers().size(); + + Runtime runtime = Runtime.getRuntime(); + MEMORY_USAGE = (int) ((runtime.totalMemory() - runtime.freeMemory()) / 1024 / 1024); + + UPTIME_COMMAND_EXPIRY = DateUtil.getCurrentTimeSeconds() + UPTIME_COMMAND_INTERVAL_SECONDS; + } + + + StringBuilder msg = new StringBuilder(); +msg.append("Server uptime is " + DateUtil.getReadableSeconds(DateUtil.getCurrentTimeSeconds() - Havana.getStartupTime()) + "
"); + + if (!GameConfiguration.getInstance().getBoolean("show.inactive.players")) { + msg.append("There are " + AUTHENTICATED_PLAYERS + " online players
"); + } else { + msg.append("There are " + ACTIVE_PLAYERS + " active players out of " + AUTHENTICATED_PLAYERS + " online players
"); + } + + msg.append("Daily player peak: " + PlayerManager.getInstance().getDailyPlayerPeak() + "
"); + msg.append("All time player peak: " + PlayerManager.getInstance().getAllTimePlayerPeak() + "
"); + msg.append("Active games: " + GameManager.getInstance().getGames().stream().filter(game -> game.getGameState() == GameState.STARTED).count() + " (" + GameManager.getInstance().getFinishedGameCounter().get() + " games played since server boot)
"); + msg.append("
"); + msg.append("SYSTEM
"); + msg.append("CPU architecture: " + CPU_ARCHITECTURE + "
"); + msg.append("CPU cores: " + CPU_NUM_THREADS + "
"); + msg.append("memory usage: " + MEMORY_USAGE + " MB
"); + msg.append("JVM: " + JVM_NAME + "
"); + msg.append("OS: " + OPERATING_SYSTEM_NAME); + + player.send(new ALERT(msg.toString())); + } + + @Override + public String getDescription() { + return "Get the uptime and status of the server"; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/UsersOnlineCommand.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/UsersOnlineCommand.java new file mode 100644 index 0000000..cf4763a --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/UsersOnlineCommand.java @@ -0,0 +1,66 @@ +package org.alexdev.havana.game.commands.registered; + +import org.alexdev.havana.game.commands.Command; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; +import org.alexdev.havana.util.StringUtil; + +import java.util.List; +import java.util.Map; + +public class UsersOnlineCommand extends Command { + @Override + public void setPlayerRank() { + super.setPlayerRank(PlayerRank.NORMAL); + } + + @Override + public void handleCommand(Entity entity, String message, String[] args) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + int maxPlayersPerLine = 5; + + List players = PlayerManager.getInstance().getPlayers(); + Map> paginatedPlayers = StringUtil.paginate(players, maxPlayersPerLine); + + Player session = (Player) entity; + + StringBuilder sb = new StringBuilder() + .append("Users online: ").append(players.size()).append("
") + .append("Daily player peak count: ").append(PlayerManager.getInstance().getDailyPlayerPeak()).append("
") + .append("List of users online: ").append("

"); + + for (List playerList : paginatedPlayers.values()) { + int i = 0; + int length = playerList.size(); + for (Player player : playerList) { + if (!player.getDetails().isOnlineStatusVisible()) { + continue; + } + + sb.append(player.getDetails().getName()); + + i++; + + if (i < length) { + sb.append(", "); + } + } + + sb.append("
"); + } + + session.send(new ALERT(sb.toString())); + } + + @Override + public String getDescription() { + return "Get the list of players currently online"; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/admin/BotCommand.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/admin/BotCommand.java new file mode 100644 index 0000000..27ded67 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/admin/BotCommand.java @@ -0,0 +1,85 @@ +package org.alexdev.havana.game.commands.registered.admin; + +import org.alexdev.havana.game.bot.Bot; +import org.alexdev.havana.game.commands.Command; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.util.FigureUtil; + +import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.TimeUnit; + +public class BotCommand extends Command { + @Override + public void setPlayerRank() { + super.setPlayerRank(PlayerRank.ADMINISTRATOR); + } + + @Override + public void addArguments() { + this.arguments.add("amount"); + } + + @Override + public void handleCommand(Entity entity, String message, String[] args) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + + if (player.getRoomUser().getRoom() == null) { + return; + } + + Room room = player.getRoomUser().getRoom(); + + int amount = Integer.parseInt(args[0]); + + for (int i = 0; i < amount; i++) { + String sex = ThreadLocalRandom.current().nextBoolean() ? "M" : "F"; + + Bot bot = new Bot(); + + try { + bot.getDetails().fill(0, "BotDude" + ThreadLocalRandom.current().nextInt(0, Integer.MAX_VALUE), FigureUtil.getRandomFigure(sex, ThreadLocalRandom.current().nextBoolean()), "I'm here to bot things up!", sex); + } catch (Exception e) { + e.printStackTrace(); + } + + Position bound = room.getMapping().getRandomWalkableBound(bot); + + if (bound != null) + room.getEntityManager().enterRoom(bot, bound); + } + + room.getTaskManager().scheduleTask("BotCommandTask", ()-> { + for (Bot bot : room.getEntityManager().getEntitiesByClass(Bot.class)) { + Position newBound = room.getMapping().getRandomWalkableBound(bot); + + if (newBound != null) { + bot.getRoomUser().walkTo(newBound.getX(), newBound.getY()); + } + + int switchint = ThreadLocalRandom.current().nextInt(0, 3); + + if (switchint == 0) { + bot.getRoomUser().dance(ThreadLocalRandom.current().nextInt(1, 4)); + } + + if (switchint == 1) { + bot.getRoomUser().carryItem(ThreadLocalRandom.current().nextInt(0, 40), null); + } + } + }, 0, 10, TimeUnit.SECONDS); + } + + @Override + public String getDescription() { + return "Creates a bot partay!"; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/admin/ItemDebugCommand.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/admin/ItemDebugCommand.java new file mode 100644 index 0000000..b93f1b6 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/admin/ItemDebugCommand.java @@ -0,0 +1,38 @@ +package org.alexdev.havana.game.commands.registered.admin; + +import org.alexdev.havana.game.commands.Command; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.messages.outgoing.rooms.user.CHAT_MESSAGE; +import org.alexdev.havana.messages.outgoing.rooms.user.CHAT_MESSAGE.ChatMessageType; + +public class ItemDebugCommand extends Command { + @Override + public void setPlayerRank() { + super.setPlayerRank(PlayerRank.ADMINISTRATOR); + } + + @Override + public void handleCommand(Entity entity, String message, String[] args) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + + if (player.getRoomUser().getRoom() == null) { + return; + } + + + player.send(new CHAT_MESSAGE(ChatMessageType.CHAT, player.getRoomUser().getInstanceId(), "Item debug has been set to " + (!player.getRoomUser().hasItemDebug()), 0)); + player.getRoomUser().setHasItemDebug(!player.getRoomUser().hasItemDebug()); + } + + @Override + public String getDescription() { + return " - Cycles through the rainbow in your very own room!"; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/admin/PacketTestCommand.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/admin/PacketTestCommand.java new file mode 100644 index 0000000..21568dd --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/admin/PacketTestCommand.java @@ -0,0 +1,39 @@ +package org.alexdev.havana.game.commands.registered.admin; + +import org.alexdev.havana.game.commands.Command; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerRank; + +public class PacketTestCommand extends Command { + @Override + public void setPlayerRank() { + super.setPlayerRank(PlayerRank.ADMINISTRATOR); + } + + @Override + public void handleCommand(Entity entity, String message, String[] args) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + + String packet = String.join(" ", args); + + for (int i = 0; i < 14; i++) { + packet = packet.replace("{" + i + "}", Character.toString((char)i)); + } + + // Add ending packet suffix + packet += Character.toString((char)1); + + player.sendObject(packet); + } + + @Override + public String getDescription() { + return "Tests a Habbo client-sided packet"; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/admin/RecoverAccountCommand.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/admin/RecoverAccountCommand.java new file mode 100644 index 0000000..f49db8a --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/admin/RecoverAccountCommand.java @@ -0,0 +1,50 @@ +package org.alexdev.havana.game.commands.registered.admin; + +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.game.commands.Command; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; + +public class RecoverAccountCommand extends Command { + @Override + public void setPlayerRank() { + this.setPlayerRank(PlayerRank.ADMINISTRATOR); + } + + @Override + public void addArguments() { + this.arguments.add("user"); + } + + @Override + public void handleCommand(Entity entity, String message, String[] args) throws Exception { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + + if (player.getRoomUser().getRoom() == null) { + return; + } + + PlayerDetails targetUser = PlayerDao.getDetails(args[0]); + + if (targetUser == null) { + player.send(new ALERT("User not found")); + return; + } + + player.send(new ALERT(targetUser.getName() + "'s password has been reset to: changeme123")); + PlayerDao.setPassword(targetUser.getId(), PlayerDao.createPassword("changeme123")); + } + + @Override + public String getDescription() { + return "Resets the player's account"; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/groups/BanCommand.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/groups/BanCommand.java new file mode 100644 index 0000000..bd1b321 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/groups/BanCommand.java @@ -0,0 +1,55 @@ +package org.alexdev.havana.game.commands.registered.groups; + +import org.alexdev.havana.game.commands.Command; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.moderation.actions.ModeratorBanUserAction; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; +import org.alexdev.havana.util.StringUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.Arrays; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +public class BanCommand extends Command { + @Override + public void setPlayerRank() { + super.setPlayerRank(PlayerRank.MODERATOR); + } + + @Override + public void handleCommand(Entity entity, String message, String[] args) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + + if (player.getRoomUser().getRoom() == null) { + return; + } + + String name = args[0]; + + int minutes = StringUtils.isNumeric(args[1]) ? Integer.parseInt(args[1]) : 0; + var reason = StringUtil.filterInput(Arrays.asList(args).stream().skip(2).collect(Collectors.joining(" ")), true); + + var response = ModeratorBanUserAction.ban(player.getDetails(), reason, "", name, TimeUnit.MINUTES.toSeconds(minutes), true, true); + player.send(new ALERT(response)); + } + + @Override + public void addArguments() { + arguments.add("user"); + arguments.add("minutes"); + arguments.add("reason"); + } + + @Override + public String getDescription() { + return "Sets trade ban time of user"; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/groups/HotelAlertCommand.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/groups/HotelAlertCommand.java new file mode 100644 index 0000000..fe9851d --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/groups/HotelAlertCommand.java @@ -0,0 +1,35 @@ +package org.alexdev.havana.game.commands.registered.groups; + +import org.alexdev.havana.game.commands.Command; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; +import org.alexdev.havana.util.StringUtil; + +public class HotelAlertCommand extends Command { + @Override + public void setPlayerRank() { + super.setPlayerRank(PlayerRank.MODERATOR); + } + + @Override + public void handleCommand(Entity entity, String message, String[] args) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + // Concatenate all arguments + String alert = StringUtil.filterInput(String.join(" ", args), true); + alert += "

- " + entity.getDetails().getName(); + + // Send all players an alert + PlayerManager.getInstance().sendAll(new ALERT(alert)); + } + + @Override + public String getDescription() { + return "Sends an alert hotel-wide"; + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/groups/MuteCommand.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/groups/MuteCommand.java new file mode 100644 index 0000000..a55d808 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/groups/MuteCommand.java @@ -0,0 +1,90 @@ +package org.alexdev.havana.game.commands.registered.groups; + +import org.alexdev.havana.dao.mysql.PlayerStatisticsDao; +import org.alexdev.havana.game.commands.Command; +import org.alexdev.havana.game.commands.CommandManager; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.game.player.statistics.PlayerStatistic; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; +import org.alexdev.havana.util.DateUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.concurrent.TimeUnit; + +public class MuteCommand extends Command { + @Override + public void setPlayerRank() { + super.setPlayerRank(PlayerRank.MODERATOR); + } + + @Override + public void handleCommand(Entity entity, String message, String[] args) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + + if (player.getRoomUser().getRoom() == null) { + return; + } + + String name = args[0]; + int minutes = StringUtils.isNumeric(args[1]) ? Integer.parseInt(args[1]) : 0; + int seconds = 0; + + if (minutes > 0) { + seconds = (int) TimeUnit.MINUTES.toSeconds(minutes); + } + + PlayerDetails playerDetails = PlayerManager.getInstance().getPlayerData(name); + + if (playerDetails == null) { + player.send(new ALERT("Could not find user: " + name)); + return; + } + + if (CommandManager.getInstance().hasPermission(playerDetails, "mute")) { + player.send(new ALERT("Cannot mute a user who has permission to mute")); + return; + } + + + long expiration = DateUtil.getCurrentTimeSeconds() + seconds; + PlayerStatisticsDao.updateStatistic(playerDetails.getId(), PlayerStatistic.MUTE_EXPIRES_AT, expiration); + + var online = PlayerManager.getInstance().getPlayerById(playerDetails.getId()); + + if (online != null) { + online.getStatisticManager().setLongValue(PlayerStatistic.MUTE_EXPIRES_AT, expiration); + + } + + player.send(new ALERT("Player (" + playerDetails.getName() + ") mute expiration date set to: " + DateUtil.getDate(expiration, DateUtil.LONG_DATE))); + /* + if (playerDetails.getIpAddress() != null && playerDetails.getIpAddress().length() > 0) { + BanDao.addBan(BanType.IP_ADDRESS, playerDetails.getIpAddress(), in20Years); + } + } else { + if (playerDetails.getIpAddress() != null && playerDetails.getIpAddress().length() > 0) { + BanDao.addBan(BanType.IP_ADDRESS, playerDetails.getIpAddress(), in20Years); + } + }*/ + } + + @Override + public void addArguments() { + arguments.add("user"); + arguments.add("minutes"); + } + + @Override + public String getDescription() { + return "Remove user ability to speak"; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/groups/RoomAlertCommand.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/groups/RoomAlertCommand.java new file mode 100644 index 0000000..799cb08 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/groups/RoomAlertCommand.java @@ -0,0 +1,42 @@ +package org.alexdev.havana.game.commands.registered.groups; + +import org.alexdev.havana.dao.mysql.ModerationDao; +import org.alexdev.havana.game.commands.Command; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.moderation.ModerationActionType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.messages.outgoing.moderation.MODERATOR_ALERT; +import org.alexdev.havana.util.StringUtil; + +import java.util.List; + +public class RoomAlertCommand extends Command { + @Override + public void setPlayerRank() { + super.setPlayerRank(PlayerRank.MODERATOR); + } + + @Override + public void handleCommand(Entity entity, String message, String[] args) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + // Concatenate all arguments + String alert = StringUtil.filterInput(String.join(" ", args), true); + List players = entity.getRoomUser().getRoom().getEntityManager().getPlayers(); + + for (Player target : players) { + target.send(new MODERATOR_ALERT(alert)); + } + + ModerationDao.addLog(ModerationActionType.ROOM_ALERT, entity.getDetails().getId(), -1, alert, ""); + } + + @Override + public String getDescription() { + return "Sends an alert hotel-wide"; + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/groups/RoomMuteCommand.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/groups/RoomMuteCommand.java new file mode 100644 index 0000000..d88aa9e --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/groups/RoomMuteCommand.java @@ -0,0 +1,36 @@ +package org.alexdev.havana.game.commands.registered.groups; + +import org.alexdev.havana.game.commands.Command; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.messages.outgoing.rooms.user.CHAT_MESSAGE; + +public class RoomMuteCommand extends Command { + @Override + public void setPlayerRank() { + super.setPlayerRank(PlayerRank.MODERATOR); + } + + @Override + public void handleCommand(Entity entity, String message, String[] args) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + + if (player.getRoomUser().getRoom() == null) { + return; + } + + player.getRoomUser().getRoom().getData().setRoomMuted(!player.getRoomUser().getRoom().getData().isRoomMuted()); + player.send(new CHAT_MESSAGE(CHAT_MESSAGE.ChatMessageType.WHISPER, player.getRoomUser().getInstanceId(), "The room is now " + (player.getRoomUser().getRoom().getData().isRoomMuted() ? "muted" : "unmuted"), 0)); + } + + @Override + public String getDescription() { + return "Mutes/unmutes a room"; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/groups/TradeBanCommand.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/groups/TradeBanCommand.java new file mode 100644 index 0000000..c81d846 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/groups/TradeBanCommand.java @@ -0,0 +1,88 @@ +package org.alexdev.havana.game.commands.registered.groups; + +import org.alexdev.havana.dao.mysql.ItemDao; +import org.alexdev.havana.game.commands.Command; +import org.alexdev.havana.game.commands.CommandManager; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; +import org.alexdev.havana.util.DateUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.concurrent.TimeUnit; + +public class TradeBanCommand extends Command { + @Override + public void setPlayerRank() { + super.setPlayerRank(PlayerRank.MODERATOR); + } + + @Override + public void handleCommand(Entity entity, String message, String[] args) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + + if (player.getRoomUser().getRoom() == null) { + return; + } + + String name = args[0]; + int minutes = StringUtils.isNumeric(args[1]) ? Integer.parseInt(args[1]) : 0; + int seconds = 0; + + if (minutes > 0) { + seconds = (int) TimeUnit.MINUTES.toSeconds(minutes); + } + + PlayerDetails playerDetails = PlayerManager.getInstance().getPlayerData(name); + + if (playerDetails == null) { + player.send(new ALERT("Could not find user: " + name)); + return; + } + + if (CommandManager.getInstance().hasPermission(playerDetails, "ban")) { + player.send(new ALERT("Cannot ban a user who has permission to trade ban")); + return; + } + + + long expiration = DateUtil.getCurrentTimeSeconds() + seconds; + ItemDao.saveTradeBanExpire(playerDetails.getId(), expiration); + + var online = PlayerManager.getInstance().getPlayerById(playerDetails.getId()); + + if (online != null) { + online.getDetails().setTradeBanExpiration(expiration); + } + + player.send(new ALERT("Player (" + playerDetails.getName() + ") trade ban time set to: " + DateUtil.getDate(expiration, DateUtil.LONG_DATE))); + /* + if (playerDetails.getIpAddress() != null && playerDetails.getIpAddress().length() > 0) { + BanDao.addBan(BanType.IP_ADDRESS, playerDetails.getIpAddress(), in20Years); + } + } else { + if (playerDetails.getIpAddress() != null && playerDetails.getIpAddress().length() > 0) { + BanDao.addBan(BanType.IP_ADDRESS, playerDetails.getIpAddress(), in20Years); + } + }*/ + } + + @Override + public void addArguments() { + arguments.add("user"); + arguments.add("minutes"); + } + + @Override + public String getDescription() { + return "Sets trade ban time of user"; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/groups/UnbanCommand.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/groups/UnbanCommand.java new file mode 100644 index 0000000..d09f56f --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/groups/UnbanCommand.java @@ -0,0 +1,93 @@ +package org.alexdev.havana.game.commands.registered.groups; + +import org.alexdev.havana.dao.mysql.BanDao; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.game.ban.BanType; +import org.alexdev.havana.game.commands.Command; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; +import org.alexdev.havana.server.netty.NettyPlayerNetwork; +import org.apache.commons.validator.routines.InetAddressValidator; + +public class UnbanCommand extends Command { + @Override + public void setPlayerRank() { + super.setPlayerRank(PlayerRank.MODERATOR); + } + + @Override + public void handleCommand(Entity entity, String message, String[] args) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + + if (player.getRoomUser().getRoom() == null) { + return; + } + + Unban(player, args[0]); + } + + private void Unban(Player player, String name) { + PlayerDetails playerDetails = PlayerManager.getInstance().getPlayerData(name); + + if (playerDetails == null) { + player.send(new ALERT("Could not find user: " + name)); + return; + } + + if (playerDetails.getMachineId() != null && playerDetails.getMachineId().length() > 0) { + BanDao.removeBan(BanType.MACHINE_ID, playerDetails.getMachineId()); + } + + String ip = null; + Player targetUser = PlayerManager.getInstance().getPlayerByName(name); + + if (targetUser != null) { + ip = NettyPlayerNetwork.getIpAddress(targetUser.getNetwork().getChannel()); + } else { + ip = PlayerDao.getLatestIp(playerDetails.getId()); + } + + InetAddressValidator validator = InetAddressValidator.getInstance(); + + // Validate an IPv4 address + if (ip != null && !validator.isValid(ip)) { + ip = null; + } + + if (ip != null && ip.length() > 0) { + BanDao.removeBan(BanType.IP_ADDRESS, ip); + } + + BanDao.removeBan(BanType.USER_ID, String.valueOf(playerDetails.getId())); + + if (targetUser != null) { + targetUser.getNetwork().getChannel().close(); + } + + player.send(new ALERT("Player " + playerDetails.getName() + " is successfully unbanned.")); + + /* + if (playerDetails.getIpAddress() != null && playerDetails.getIpAddress().length() > 0) { + BanDao.addBan(BanType.IP_ADDRESS, playerDetails.getIpAddress(), in20Years); + } + } else { + if (playerDetails.getIpAddress() != null && playerDetails.getIpAddress().length() > 0) { + BanDao.addBan(BanType.IP_ADDRESS, playerDetails.getIpAddress(), in20Years); + } + }*/ + } + + @Override + public String getDescription() { + return "Permanently bans a given user"; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/groups/UnmuteCommand.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/groups/UnmuteCommand.java new file mode 100644 index 0000000..1e81529 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/groups/UnmuteCommand.java @@ -0,0 +1,77 @@ +package org.alexdev.havana.game.commands.registered.groups; + +import org.alexdev.havana.dao.mysql.PlayerStatisticsDao; +import org.alexdev.havana.game.commands.Command; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.game.player.statistics.PlayerStatistic; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; + +public class UnmuteCommand extends Command { + @Override + public void setPlayerRank() { + super.setPlayerRank(PlayerRank.MODERATOR); + } + + @Override + public void handleCommand(Entity entity, String message, String[] args) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + + if (player.getRoomUser().getRoom() == null) { + return; + } + + String name = args[0]; + + PlayerDetails playerDetails = PlayerManager.getInstance().getPlayerData(name); + + if (playerDetails == null) { + player.send(new ALERT("Could not find user: " + name)); + return; + } + + /*if (CommandManager.getInstance().hasPermission(playerDetails, "unmute")) { + player.send(new ALERT("Cannot unmute a user who has permission to unmute")); + return; + }*/ + + long expiration = 0;//DateUtil.getCurrentTimeSeconds() + seconds; + PlayerStatisticsDao.updateStatistic(playerDetails.getId(), PlayerStatistic.MUTE_EXPIRES_AT, expiration); + + var online = PlayerManager.getInstance().getPlayerById(playerDetails.getId()); + + if (online != null) { + online.getStatisticManager().setLongValue(PlayerStatistic.MUTE_EXPIRES_AT, expiration); + + } + + player.send(new ALERT("Player (" + playerDetails.getName() + ") unmute expiration date removed")); + /* + if (playerDetails.getIpAddress() != null && playerDetails.getIpAddress().length() > 0) { + BanDao.addBan(BanType.IP_ADDRESS, playerDetails.getIpAddress(), in20Years); + } + } else { + if (playerDetails.getIpAddress() != null && playerDetails.getIpAddress().length() > 0) { + BanDao.addBan(BanType.IP_ADDRESS, playerDetails.getIpAddress(), in20Years); + } + }*/ + } + + @Override + public void addArguments() { + arguments.add("user"); + } + + @Override + public String getDescription() { + return "Lets user speak again"; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/moderation/CheckCreditsCommand.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/moderation/CheckCreditsCommand.java new file mode 100644 index 0000000..0802ce1 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/moderation/CheckCreditsCommand.java @@ -0,0 +1,55 @@ +package org.alexdev.havana.game.commands.registered.moderation; + +import org.alexdev.havana.dao.mysql.CurrencyDao; +import org.alexdev.havana.game.commands.Command; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.messages.outgoing.rooms.user.CHAT_MESSAGE; +import org.alexdev.havana.messages.outgoing.rooms.user.CHAT_MESSAGE.ChatMessageType; +import org.alexdev.havana.messages.outgoing.user.currencies.CREDIT_BALANCE; +import org.apache.commons.lang3.StringUtils; + +public class CheckCreditsCommand extends Command { + @Override + public void setPlayerRank() { + super.setPlayerRank(PlayerRank.MODERATOR); + } + + @Override + public void addArguments() { + this.arguments.add("user"); + } + + @Override + public void handleCommand(Entity entity, String message, String[] args) { + // :givebadge Alex NL1 + + // should refuse to give badges that belong to ranks + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + + if (player.getRoomUser().getRoom() == null) { + return; + } + + Player targetUser = PlayerManager.getInstance().getPlayerByName(args[0]); + + if (targetUser == null) { + player.send(new CHAT_MESSAGE(ChatMessageType.WHISPER, player.getRoomUser().getInstanceId(), "Could not find user: " + args[0], 0)); + return; + } + + player.send(new CHAT_MESSAGE(ChatMessageType.WHISPER, player.getRoomUser().getInstanceId(), targetUser.getDetails().getName() + " has " + targetUser.getDetails().getCredits() + " credits", 0)); + } + + @Override + public String getDescription() { + return "Add badge to user"; + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/moderation/CoordsCommand.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/moderation/CoordsCommand.java new file mode 100644 index 0000000..3a1f21a --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/moderation/CoordsCommand.java @@ -0,0 +1,42 @@ +package org.alexdev.havana.game.commands.registered.moderation; + +import org.alexdev.havana.game.commands.Command; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; +import org.alexdev.havana.util.StringUtil; + +public class CoordsCommand extends Command { + @Override + public void setPlayerRank() { + super.setPlayerRank(PlayerRank.COMMUNITY_MANAGER); + } + + @Override + public void handleCommand(Entity entity, String message, String[] args) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + + if (player.getRoomUser().getRoom() == null) { + return; + } + + player.send(new ALERT("Your coordinates:
" + + "Room ID: " + player.getRoomUser().getRoom().getId() + "

" + + "X: " + player.getRoomUser().getPosition().getX() + "
" + + "Y: " + player.getRoomUser().getPosition().getY() + "
" + + "Z: " + StringUtil.format(player.getRoomUser().getPosition().getZ()) + "

" + + "Head rotation: " + player.getRoomUser().getPosition().getHeadRotation() + "
" + + "Body rotation: " + player.getRoomUser().getPosition().getBodyRotation() + "
")); + } + + @Override + public String getDescription() { + return "Shows the coordinates in the room"; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/moderation/CopyRoomCommand.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/moderation/CopyRoomCommand.java new file mode 100644 index 0000000..8c94a53 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/moderation/CopyRoomCommand.java @@ -0,0 +1,112 @@ +package org.alexdev.havana.game.commands.registered.moderation; + +import org.alexdev.havana.dao.mysql.ItemDao; +import org.alexdev.havana.dao.mysql.NavigatorDao; +import org.alexdev.havana.dao.mysql.RoomDao; +import org.alexdev.havana.game.commands.Command; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerRank; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class CopyRoomCommand extends Command { + @Override + public void setPlayerRank() { + super.setPlayerRank(PlayerRank.COMMUNITY_MANAGER); + } + + @Override + public void addArguments() { + + } + + @Override + public void handleCommand(Entity entity, String message, String[] args) { + // :givebadge Alex NL1 + + // should refuse to give badges that belong to ranks + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + + if (player.getRoomUser().getRoom() == null) { + return; + } + + var room = player.getRoomUser().getRoom(); + + if (room.isPublicRoom()) { + return; + } + + var roomName = room.getData().getName() + " (2)"; + var roomModel = room.getModel().getName(); + var roomShowName = room.getData().showOwnerName(); + var accessType = room.getData().getAccessTypeId(); + + int roomId = -1; + try { + roomId = NavigatorDao.createRoom(player.getDetails().getId(), roomName, roomModel, roomShowName, accessType); + } catch (SQLException e) { + e.printStackTrace(); + } + + if (roomId == -1) + return; + + var copyRoom = RoomDao.getRoomById(roomId); + + copyRoom.getData().setWallpaper(room.getData().getWallpaper()); + copyRoom.getData().setFloor(room.getData().getFloor()); + copyRoom.getData().setLandscape(room.getData().getLandscape()); + + RoomDao.saveDecorations(copyRoom); + + List items = new ArrayList<>(); + + for (Item item : room.getItems()) { + if (item.hasBehaviour(ItemBehaviour.TELEPORTER)) { + continue; + } + + var copyItem = new Item(); + copyItem.setOwnerId(player.getDetails().getId()); + copyItem.setDefinitionId(item.getDefinition().getId()); + copyItem.setCustomData(item.getCustomData()); + copyItem.setRoomId(roomId); + + if (item.hasBehaviour(ItemBehaviour.WALL_ITEM)) + copyItem.setWallPosition(item.getWallPosition()); + else { + copyItem.getPosition().setX(item.getPosition().getX()); + copyItem.getPosition().setY(item.getPosition().getY()); + copyItem.getPosition().setZ(item.getPosition().getZ()); + copyItem.getPosition().setRotation(item.getPosition().getRotation()); + } + + try { + ItemDao.newItem(copyItem); + items.add(copyItem); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + ItemDao.updateItems(items); + + copyRoom.forward(player, false); + } + + @Override + public String getDescription() { + return "Remove badge from user"; + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/moderation/DisconnectUserCommand.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/moderation/DisconnectUserCommand.java new file mode 100644 index 0000000..ceb6526 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/moderation/DisconnectUserCommand.java @@ -0,0 +1,57 @@ +package org.alexdev.havana.game.commands.registered.moderation; + +import org.alexdev.havana.game.commands.Command; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.messages.outgoing.rooms.user.CHAT_MESSAGE; +import org.alexdev.havana.messages.outgoing.rooms.user.CHAT_MESSAGE.ChatMessageType; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; + +public class DisconnectUserCommand extends Command { + @Override + public void setPlayerRank() { + super.setPlayerRank(PlayerRank.MODERATOR); + } + + @Override + public void addArguments() { + this.arguments.add("user"); + } + + @Override + public void handleCommand(Entity entity, String message, String[] args) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + + if (player.getRoomUser().getRoom() == null) { + return; + } + + Player targetUser = PlayerManager.getInstance().getPlayerByName(args[0]); + + if (targetUser == null) { + player.send(new ALERT("Could not find user: " + args[0])); + return; + } + + if (targetUser.getDetails().getRank().getRankId() >= player.getDetails().getRank().getRankId()) { + player.send(new ALERT("Insufficient perms to ban user")); + return; + } + + targetUser.kickFromServer(); + player.send(new CHAT_MESSAGE(ChatMessageType.WHISPER, player.getRoomUser().getInstanceId(), targetUser.getDetails().getName() + " disconnected", 0)); + } + + @Override + public String getDescription() { + return "Disconnects a given user"; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/moderation/GiftRoomCommand.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/moderation/GiftRoomCommand.java new file mode 100644 index 0000000..76d0289 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/moderation/GiftRoomCommand.java @@ -0,0 +1,58 @@ +package org.alexdev.havana.game.commands.registered.moderation; + +import org.alexdev.havana.game.catalogue.CatalogueItem; +import org.alexdev.havana.game.catalogue.CatalogueManager; +import org.alexdev.havana.game.commands.Command; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.item.ItemManager; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.messages.outgoing.rooms.user.CHAT_MESSAGE; + +import java.util.List; + +public class GiftRoomCommand extends Command { + @Override + public void setPlayerRank() { + super.setPlayerRank(PlayerRank.ADMINISTRATOR); + } + + @Override + public void handleCommand(Entity entity, String message, String[] args) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + + if (player.getRoomUser().getRoom() == null) { + return; + } + + CatalogueItem catalogueItem = CatalogueManager.getInstance().getCatalogueItem(args[0]); + + if (catalogueItem == null) { + player.getRoomUser().talk("Catalogue item not found: " + args[0], CHAT_MESSAGE.ChatMessageType.WHISPER, List.of(player)); + return; + } + + for (Player user : player.getRoomUser().getRoom().getEntityManager().getPlayers()) { + if (user.getDetails().getRank().getRankId() >= PlayerRank.COMMUNITY_MANAGER.getRankId()) { + continue; + } + + var item = ItemManager.getInstance().createGift(user.getDetails().getId(), player.getDetails().getName(), catalogueItem.getSaleCode(), "You have just received a gift from Classic Habbo", ""); + + user.getInventory().addItem(item); + user.getInventory().getView("new"); + } + + player.getRoomUser().talk("Everybody (except community managers or higher) has been gifted a " + catalogueItem.getDefinition().getName(), CHAT_MESSAGE.ChatMessageType.WHISPER, List.of(player)); + } + + @Override + public String getDescription() { + return "Shows the coordinates in the room"; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/moderation/GiveBadgeCommand.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/moderation/GiveBadgeCommand.java new file mode 100644 index 0000000..6e2dc5f --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/moderation/GiveBadgeCommand.java @@ -0,0 +1,121 @@ +package org.alexdev.havana.game.commands.registered.moderation; + +import org.alexdev.havana.dao.mysql.BadgeDao; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.game.badges.BadgeManager; +import org.alexdev.havana.game.commands.Command; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; +import org.alexdev.havana.messages.outgoing.rooms.user.CHAT_MESSAGE; +import org.alexdev.havana.messages.outgoing.rooms.user.CHAT_MESSAGE.ChatMessageType; +import org.alexdev.havana.messages.outgoing.rooms.user.FIGURE_CHANGE; + +import java.util.List; + +public class GiveBadgeCommand extends Command { + @Override + public void setPlayerRank() { + super.setPlayerRank(PlayerRank.COMMUNITY_MANAGER); + } + + @Override + public void addArguments() { + this.arguments.add("user"); + this.arguments.add("badge"); + } + + @Override + public void handleCommand(Entity entity, String message, String[] args) { + // :givebadge Alex NL1 + + // should refuse to give badges that belong to ranks + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + + if (player.getRoomUser().getRoom() == null) { + return; + } + + if (args.length == 1) { + player.send(new CHAT_MESSAGE(ChatMessageType.WHISPER, player.getRoomUser().getInstanceId(), "Badge code not provided", 0)); + return; + } + + PlayerDetails targetUserDetails = PlayerDao.getDetails(args[0]); + + if (targetUserDetails == null) { + player.send(new ALERT("Could not find user: " + args[0])); + return; + } + + String badge = args[1]; + + if (badge.startsWith("GL") || badge.startsWith("ACH_") || badge.equalsIgnoreCase("Z64")) { + return; + } + + Player targetUser = PlayerManager.getInstance().getPlayerByName(args[0]); + + if (targetUser == null) { + var badgeManager = new BadgeManager(targetUserDetails.getId()); + + // Check if user already owns badge + if (badgeManager.hasBadge(badge)) { + player.send(new CHAT_MESSAGE(ChatMessageType.WHISPER, player.getRoomUser().getInstanceId(), "User " + targetUserDetails.getName() + " already owns this badge.", 0)); + return; + } + + List rankBadges = BadgeDao.getRankBadges(); + + // Check if badge code is a rank badge + if (rankBadges.contains(badge)) { + player.send(new CHAT_MESSAGE(ChatMessageType.WHISPER, player.getRoomUser().getInstanceId(), "This badge belongs to a certain rank. If you would like to give " + targetUserDetails.getName() + " this badge, increase their rank.", 0)); + return; + } + + // Add badge + badgeManager.tryAddBadge(badge, null); + player.send(new CHAT_MESSAGE(ChatMessageType.WHISPER, player.getRoomUser().getInstanceId(), "Badge " + badge + " added to user " + targetUserDetails.getName(), 0)); + } else { + // Check if user already owns badge + if (targetUser.getBadgeManager().hasBadge(badge)) { + player.send(new CHAT_MESSAGE(ChatMessageType.WHISPER, player.getRoomUser().getInstanceId(), "User " + targetUserDetails.getName() + " already owns this badge.", 0)); + return; + } + + List rankBadges = BadgeDao.getRankBadges(); + + // Check if badge code is a rank badge + if (rankBadges.contains(badge)) { + player.send(new CHAT_MESSAGE(ChatMessageType.WHISPER, player.getRoomUser().getInstanceId(), "This badge belongs to a certain rank. If you would like to give " + targetUserDetails.getName() + " this badge, increase their rank.", 0)); + return; + } + + // Add badge + targetUser.getBadgeManager().tryAddBadge(badge, null, 0); + + Room targetRoom = targetUser.getRoomUser().getRoom(); + + // Let other room users know something changed if targetUser is inside a room + if (targetRoom != null) { + targetRoom.send(new FIGURE_CHANGE(targetUser.getRoomUser().getInstanceId(), targetUserDetails)); + } + + player.send(new CHAT_MESSAGE(ChatMessageType.WHISPER, player.getRoomUser().getInstanceId(), "Badge " + badge + " added to user " + targetUserDetails.getName(), 0)); + } + } + + @Override + public String getDescription() { + return "Add badge to user"; + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/moderation/GiveCreditsCommand.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/moderation/GiveCreditsCommand.java new file mode 100644 index 0000000..25f89d7 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/moderation/GiveCreditsCommand.java @@ -0,0 +1,77 @@ +package org.alexdev.havana.game.commands.registered.moderation; + +import org.alexdev.havana.dao.mysql.CurrencyDao; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.game.commands.Command; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.messages.outgoing.rooms.user.CHAT_MESSAGE; +import org.alexdev.havana.messages.outgoing.rooms.user.CHAT_MESSAGE.ChatMessageType; +import org.alexdev.havana.messages.outgoing.user.currencies.CREDIT_BALANCE; +import org.apache.commons.lang3.StringUtils; + +public class GiveCreditsCommand extends Command { + @Override + public void setPlayerRank() { + super.setPlayerRank(PlayerRank.COMMUNITY_MANAGER); + } + + @Override + public void addArguments() { + this.arguments.add("user"); + this.arguments.add("credits"); + } + + @Override + public void handleCommand(Entity entity, String message, String[] args) { + // :givebadge Alex NL1 + + // should refuse to give badges that belong to ranks + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + + if (player.getRoomUser().getRoom() == null) { + return; + } + + PlayerDetails targetUser = PlayerDao.getDetails(args[0]); + + if (targetUser == null) { + player.send(new CHAT_MESSAGE(ChatMessageType.WHISPER, player.getRoomUser().getInstanceId(), "Could not find user: " + args[0], 0)); + return; + } + + if (args.length == 1) { + player.send(new CHAT_MESSAGE(ChatMessageType.WHISPER, player.getRoomUser().getInstanceId(), "Credit amount not provided", 0)); + return; + } + + if (!StringUtils.isNumeric(args[1])) { + player.send(new CHAT_MESSAGE(ChatMessageType.WHISPER, player.getRoomUser().getInstanceId(), "Credit amount not provided", 0)); + return; + } + + int amount = Integer.parseInt(args[1]); + + CurrencyDao.increaseCredits(targetUser, amount); + var user = PlayerManager.getInstance().getPlayerById(targetUser.getId()); + + if (user != null) { + user.send(new CREDIT_BALANCE(user.getDetails().getCredits())); + } + + player.send(new CHAT_MESSAGE(ChatMessageType.WHISPER, player.getRoomUser().getInstanceId(), amount + " credits added to user " + targetUser.getName(), 0)); + } + + @Override + public String getDescription() { + return "Add badge to user"; + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/moderation/HeadRotateCommand.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/moderation/HeadRotateCommand.java new file mode 100644 index 0000000..4cec1cd --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/moderation/HeadRotateCommand.java @@ -0,0 +1,102 @@ +package org.alexdev.havana.game.commands.registered.moderation; + +import org.alexdev.havana.game.GameScheduler; +import org.alexdev.havana.game.commands.Command; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.pathfinder.Pathfinder; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.pathfinder.Rotation; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.messages.outgoing.rooms.user.USER_STATUSES; +import org.alexdev.havana.util.schedule.FutureRunnable; + +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; + +public class HeadRotateCommand extends Command { + public static final Position[] HEAD_ROTATION = new Position[]{ + new Position(1, 0, 0),// + new Position(1, 1, 0),// + new Position(0, 1, 0),// + new Position(-1, 1, 0),// + new Position(-1, 0, 0),// + new Position(-1, -1, 0),// + new Position(0, -1, 0), + new Position(1, -1, 0) + }; + + @Override + public void setPlayerRank() { + super.setPlayerRank(PlayerRank.MODERATOR); + } + + @Override + public void handleCommand(Entity entity, String message, String[] args) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + doHeadRotate(entity); + } + + public static void doHeadRotate(Entity entity) { + var current = entity.getRoomUser().getPosition().copy(); + + int currentRotation = current.getHeadRotation(); + int startPosition = 0; + + for (var pos : HEAD_ROTATION) { + var tmp = current.add(pos); + int rotation = Rotation.calculateWalkDirection(current, tmp); + + if (rotation == currentRotation) { + break; + } + + startPosition++; + } + + final AtomicInteger turns = new AtomicInteger(8); + final AtomicInteger nextMove = new AtomicInteger(startPosition + 1); + + var headTurnRunnable = new FutureRunnable() { + public void run() { + try { + if (turns.get() == 1) { + this.cancelFuture(); + return; + } + + if (entity.getRoomUser().isWalking()) { + entity.getRoomUser().getPosition().setHeadRotation(entity.getRoomUser().getPosition().getBodyRotation()); + this.cancelFuture(); + return; + } + + if (nextMove.get() + 1 >= HEAD_ROTATION.length) { + nextMove.set(0); + } + + var tmp = current.add(HEAD_ROTATION[nextMove.getAndIncrement()]); + + entity.getRoomUser().getPosition().setHeadRotation(Rotation.calculateWalkDirection(current, tmp)); + entity.getRoomUser().getRoom().send(new USER_STATUSES(List.of(entity))); + + turns.decrementAndGet(); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + }; + + var future = GameScheduler.getInstance().getService().scheduleAtFixedRate(headTurnRunnable, 0, 200, TimeUnit.MILLISECONDS); + headTurnRunnable.setFuture(future); + } + + @Override + public String getDescription() { + return "Rotates the users head"; + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/moderation/PermBanCommand.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/moderation/PermBanCommand.java new file mode 100644 index 0000000..b8971b2 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/moderation/PermBanCommand.java @@ -0,0 +1,109 @@ +package org.alexdev.havana.game.commands.registered.moderation; + +import org.alexdev.havana.dao.mysql.BanDao; +import org.alexdev.havana.game.ban.BanManager; +import org.alexdev.havana.game.ban.BanType; +import org.alexdev.havana.game.commands.Command; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.StringUtil; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +public class PermBanCommand extends Command { + @Override + public void setPlayerRank() { + super.setPlayerRank(PlayerRank.MODERATOR); + } + + @Override + public void handleCommand(Entity entity, String message, String[] args) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + + if (player.getRoomUser().getRoom() == null) { + return; + } + + PlayerDetails playerDetails = PlayerManager.getInstance().getPlayerData(args[0]); + + if (playerDetails == null) { + player.send(new ALERT("Could not find user: " + args[0])); + return; + } + + if (playerDetails.isBanned() != null) { + player.send(new ALERT("User is already banned!")); + return; + } + + Map criteria = new HashMap<>(); + long in20Years = DateUtil.getCurrentTimeSeconds() + (TimeUnit.DAYS.toSeconds(365) * 20); + var reason = StringUtil.filterInput(Arrays.asList(args).stream().skip(2).collect(Collectors.joining(" ")), true); + + if (playerDetails.getMachineId() != null && playerDetails.getMachineId().length() > 0) { + BanDao.addBan(BanType.MACHINE_ID, playerDetails.getMachineId(), in20Years, reason, playerDetails.getId()); + criteria.put(BanType.MACHINE_ID, playerDetails.getMachineId()); + } + + Player targetUser = PlayerManager.getInstance().getPlayerByName(args[0]); + + /*String ip = null; + + if (targetUser != null) { + ip = NettyPlayerNetwork.getIpAddress(targetUser.getNetwork().getChannel()); + } else { + ip = PlayerDao.getLatestIp(playerDetails.getId()); + } + + InetAddressValidator validator = InetAddressValidator.getInstance(); + + // Validate an IPv4 address + if (!validator.isValid(ip)) { + ip = null; + } + + if (ip != null && ip.length() > 0) { + BanDao.addBan(BanType.IP_ADDRESS, ip, in20Years, "Banned for breaking the Habbo Way"); + criteria.put(BanType.IP_ADDRESS, ip); + }*/ + + BanDao.addBan(BanType.USER_ID, String.valueOf(playerDetails.getId()), in20Years, reason, playerDetails.getId()); + criteria.put(BanType.USER_ID, String.valueOf(playerDetails.getId())); + + if (targetUser != null) { + targetUser.getNetwork().getChannel().close(); + } + + player.send(new ALERT("Player " + playerDetails.getName() + " is successfully banned.")); + BanManager.getInstance().disconnectBanAccounts(criteria); + + /* + if (playerDetails.getIpAddress() != null && playerDetails.getIpAddress().length() > 0) { + BanDao.addBan(BanType.IP_ADDRESS, playerDetails.getIpAddress(), in20Years); + } + } else { + if (playerDetails.getIpAddress() != null && playerDetails.getIpAddress().length() > 0) { + BanDao.addBan(BanType.IP_ADDRESS, playerDetails.getIpAddress(), in20Years); + } + }*/ + } + + @Override + public String getDescription() { + return "Permanently bans a given user"; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/moderation/ReloadCommand.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/moderation/ReloadCommand.java new file mode 100644 index 0000000..166b6e7 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/moderation/ReloadCommand.java @@ -0,0 +1,161 @@ +package org.alexdev.havana.game.commands.registered.moderation; + +import org.alexdev.havana.game.achievements.AchievementManager; +import org.alexdev.havana.game.ads.AdManager; +import org.alexdev.havana.game.catalogue.CatalogueManager; +import org.alexdev.havana.game.catalogue.collectables.CollectablesManager; +import org.alexdev.havana.game.commands.Command; +import org.alexdev.havana.game.commands.CommandManager; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.events.EventsManager; +import org.alexdev.havana.game.games.GameManager; +import org.alexdev.havana.game.games.snowstorm.SnowStormMapsManager; +import org.alexdev.havana.game.item.ItemManager; +import org.alexdev.havana.game.item.ItemVersionManager; +import org.alexdev.havana.game.navigator.NavigatorManager; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.game.room.models.RoomModelManager; +import org.alexdev.havana.game.texts.TextsManager; +import org.alexdev.havana.game.wordfilter.WordfilterManager; +import org.alexdev.havana.messages.incoming.catalogue.GET_CATALOG_INDEX; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; +import org.alexdev.havana.util.config.GameConfiguration; +import org.alexdev.havana.util.config.writer.GameConfigWriter; + +public class ReloadCommand extends Command { + @Override + public void setPlayerRank() { + super.setPlayerRank(PlayerRank.COMMUNITY_MANAGER); + } + + @Override + public void addArguments() { + this.arguments.add("component"); + } + + @Override + public void handleCommand(Entity entity, String message, String[] args) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + + if (player.getRoomUser().getRoom() == null) { + return; + } + + String component = args[0]; + String componentName = null; + + if (component.equalsIgnoreCase("catalogue") + || component.equalsIgnoreCase("shop") + || component.equalsIgnoreCase("items")) { + ItemManager.reset(); + CatalogueManager.reset(); + + // Regenerate collision map with proper height differences (if they changed). + player.getRoomUser().getRoom().getMapping().regenerateCollisionMap(); + player.getRoomUser().getRoom().getMapping().sendMap(); + + for (Player p : PlayerManager.getInstance().getPlayers()) { + new GET_CATALOG_INDEX().handle(p, null); + } + + componentName = "Catalogue and item definitions"; + } + + if (component.equalsIgnoreCase("wordfilter")) { + WordfilterManager.reset(); + componentName = "Wordfilter"; + } + + if (component.equalsIgnoreCase("commands")) { + CommandManager.reset(); + componentName = "Commands"; + } + + if (component.equalsIgnoreCase("badgebuy")) { + CatalogueManager.getInstance().reloadBadgeRewards(); + componentName = "Badge sale rewards"; + } + + if (component.equalsIgnoreCase("ads")) { + AdManager.getInstance().reset(); + componentName = "Advertisements"; + } + + if (component.equalsIgnoreCase("navigator")) { + NavigatorManager.reset(); + componentName = "Navigator"; + } + + if (component.equalsIgnoreCase("texts")) { + TextsManager.reset(); + componentName = "Texts"; + } + + if (component.equalsIgnoreCase("games")) { + GameManager.reset(); + componentName = "Games"; + } + + if (component.equalsIgnoreCase("events")) { + EventsManager.reset(); + componentName = "Events"; + } + + if (component.equalsIgnoreCase("gamemaps")) { + SnowStormMapsManager.reset(); + componentName = "game maps"; + } + + + if (component.equalsIgnoreCase("achievements") || + component.equalsIgnoreCase("ach")) { + AchievementManager.reset(); + componentName = "Achievements"; + } + + if (component.equalsIgnoreCase("models")) { + RoomModelManager.reset(); + componentName = "Room models"; + } + + if (component.equalsIgnoreCase("collectables")) { + CollectablesManager.reset(); + componentName = "Collectables"; + } + + if (component.equalsIgnoreCase("settings") || + component.equalsIgnoreCase("config")) { + + GameConfiguration.reset(new GameConfigWriter()); + componentName = "Game settings"; + } + + if (component.equalsIgnoreCase("versions")) { + + ItemVersionManager.reset(); + componentName = "Furni settings"; + } + + + if (componentName != null) { + player.send(new ALERT(componentName + " have been reloaded.")); + } else { + player.send(new ALERT("You did not specify which component to reload!" + + "
You may reload either the catalogue/shop/items, advertisements, events, commands," + + "
navigator, collectables, models, texts, plugins, wordfitler, games, badgebuy," + + "
rewards, versions or settings.")); + } + } + + @Override + public String getDescription() { + return "Refresh the settings/items/texts"; + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/moderation/RemoveBadgeCommand.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/moderation/RemoveBadgeCommand.java new file mode 100644 index 0000000..a34e5b3 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/moderation/RemoveBadgeCommand.java @@ -0,0 +1,76 @@ +package org.alexdev.havana.game.commands.registered.moderation; + +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.game.badges.BadgeManager; +import org.alexdev.havana.game.commands.Command; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.messages.outgoing.rooms.user.CHAT_MESSAGE; +import org.alexdev.havana.messages.outgoing.rooms.user.CHAT_MESSAGE.ChatMessageType; + +public class RemoveBadgeCommand extends Command { + @Override + public void setPlayerRank() { + super.setPlayerRank(PlayerRank.COMMUNITY_MANAGER); + } + + @Override + public void addArguments() { + this.arguments.add("user"); + this.arguments.add("badge"); + } + + @Override + public void handleCommand(Entity entity, String message, String[] args) { + // :givebadge Alex NL1 + + // should refuse to give badges that belong to ranks + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + + if (player.getRoomUser().getRoom() == null) { + return; + } + + PlayerDetails targetUser = PlayerDao.getDetails(args[0]); + + if (targetUser == null) { + player.send(new CHAT_MESSAGE(ChatMessageType.WHISPER, player.getRoomUser().getInstanceId(), "Could not find user: " + args[0], 0)); + return; + } + + if (args.length == 1) { + player.send(new CHAT_MESSAGE(ChatMessageType.WHISPER, player.getRoomUser().getInstanceId(), "Badge code not provided", 0)); + return; + } + + String badge = args[1]; + + if (badge.startsWith("GL") || badge.startsWith("ACH_") || badge.equalsIgnoreCase("Z64")) { + return; + } + + var badgeManager = new BadgeManager(targetUser.getId()); + + // Check if user already owns badge + if (!badgeManager.hasBadge(badge)) { + player.send(new CHAT_MESSAGE(ChatMessageType.WHISPER, player.getRoomUser().getInstanceId(), "User " + targetUser.getName() + " does not have this badge.", 0)); + return; + } + + // Remove badge + badgeManager.removeBadge(badge); + player.send(new CHAT_MESSAGE(ChatMessageType.WHISPER, player.getRoomUser().getInstanceId(), "Badge " + badge + " removed from user " + targetUser.getName(), 0)); + } + + @Override + public String getDescription() { + return "Remove badge from user"; + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/moderation/RemoveCreditsCommand.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/moderation/RemoveCreditsCommand.java new file mode 100644 index 0000000..1f04a57 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/moderation/RemoveCreditsCommand.java @@ -0,0 +1,77 @@ +package org.alexdev.havana.game.commands.registered.moderation; + +import org.alexdev.havana.dao.mysql.CurrencyDao; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.game.commands.Command; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.messages.outgoing.rooms.user.CHAT_MESSAGE; +import org.alexdev.havana.messages.outgoing.rooms.user.CHAT_MESSAGE.ChatMessageType; +import org.alexdev.havana.messages.outgoing.user.currencies.CREDIT_BALANCE; +import org.apache.commons.lang3.StringUtils; + +public class RemoveCreditsCommand extends Command { + @Override + public void setPlayerRank() { + super.setPlayerRank(PlayerRank.COMMUNITY_MANAGER); + } + + @Override + public void addArguments() { + this.arguments.add("user"); + this.arguments.add("credits"); + } + + @Override + public void handleCommand(Entity entity, String message, String[] args) { + // :givebadge Alex NL1 + + // should refuse to give badges that belong to ranks + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + + if (player.getRoomUser().getRoom() == null) { + return; + } + + PlayerDetails targetUser = PlayerDao.getDetails(args[0]); + + if (targetUser == null) { + player.send(new CHAT_MESSAGE(ChatMessageType.WHISPER, player.getRoomUser().getInstanceId(), "Could not find user: " + args[0], 0)); + return; + } + + if (args.length == 1) { + player.send(new CHAT_MESSAGE(ChatMessageType.WHISPER, player.getRoomUser().getInstanceId(), "Credit amount not provided", 0)); + return; + } + + if (!StringUtils.isNumeric(args[1])) { + player.send(new CHAT_MESSAGE(ChatMessageType.WHISPER, player.getRoomUser().getInstanceId(), "Credit amount not provided", 0)); + return; + } + + int amount = Integer.parseInt(args[1]); + + CurrencyDao.decreaseCredits(targetUser, amount); + var user = PlayerManager.getInstance().getPlayerById(targetUser.getId()); + + if (user != null) { + user.send(new CREDIT_BALANCE(user.getDetails().getCredits())); + } + + player.send(new CHAT_MESSAGE(ChatMessageType.WHISPER, player.getRoomUser().getInstanceId(), amount + " credits removed from user " + targetUser.getName(), 0)); + } + + @Override + public String getDescription() { + return "Add badge to user"; + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/moderation/TeleportCommand.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/moderation/TeleportCommand.java new file mode 100644 index 0000000..ae8dde0 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/moderation/TeleportCommand.java @@ -0,0 +1,31 @@ +package org.alexdev.havana.game.commands.registered.moderation; + +import org.alexdev.havana.game.commands.Command; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; + +public class TeleportCommand extends Command { + @Override + public void setPlayerRank() { + super.setPlayerRank(PlayerRank.MODERATOR); + } + + @Override + public void handleCommand(Entity entity, String message, String[] args) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + player.getRoomUser().setTeleporting(!player.getRoomUser().isTeleporting()); + player.send(new ALERT("Teleport mode is set to: " + player.getRoomUser().isTeleporting())); + } + + @Override + public String getDescription() { + return "Triggers the teleporting"; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/moderation/UnacceptableCommand.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/moderation/UnacceptableCommand.java new file mode 100644 index 0000000..6c2b936 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/moderation/UnacceptableCommand.java @@ -0,0 +1,64 @@ +package org.alexdev.havana.game.commands.registered.moderation; + +import org.alexdev.havana.dao.mysql.RoomDao; +import org.alexdev.havana.game.commands.Command; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; + +public class UnacceptableCommand extends Command { + @Override + public void setPlayerRank() { + super.setPlayerRank(PlayerRank.MODERATOR); + } + + @Override + public void addArguments() { + this.arguments.add("name/desc/description/both"); + } + + @Override + public void handleCommand(Entity entity, String message, String[] args) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + + if (player.getRoomUser().getRoom() == null) { + return; + } + + var room = player.getRoomUser().getRoom(); + var unacceptableValue = "Unacceptable to hotel management"; + + if (args[0].equalsIgnoreCase("name")) { + room.getData().setName(unacceptableValue); + RoomDao.save(room); + player.send(new ALERT("Set the room name to unacceptable")); + return; + } + + if (args[0].equalsIgnoreCase("desc") || args[0].equalsIgnoreCase("description")) { + room.getData().setDescription(unacceptableValue); + RoomDao.save(room); + player.send(new ALERT("Set the room description to unacceptable")); + return; + } + + if (args[0].equalsIgnoreCase("both")) { + room.getData().setName(unacceptableValue); + room.getData().setDescription(unacceptableValue); + RoomDao.save(room); + player.send(new ALERT("Set both the room name and description to unacceptable")); + return; + } + } + + @Override + public String getDescription() { + return "Makes a room set to 'Unacceptable to hotel management'"; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/ecotron/EcotronItem.java b/Havana-Server/src/main/java/org/alexdev/havana/game/ecotron/EcotronItem.java new file mode 100644 index 0000000..98152e8 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/ecotron/EcotronItem.java @@ -0,0 +1,25 @@ +package org.alexdev.havana.game.ecotron; + +public class EcotronItem { + private String spriteName; + private int orderId; + private int chance; + + public EcotronItem(String spriteName, int orderId, int chance) { + this.spriteName = spriteName; + this.orderId = orderId; + this.chance = chance; + } + + public String getSpriteName() { + return spriteName; + } + + public int getOrderId() { + return orderId; + } + + public int getChance() { + return chance; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/ecotron/EcotronManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/ecotron/EcotronManager.java new file mode 100644 index 0000000..55f569a --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/ecotron/EcotronManager.java @@ -0,0 +1,83 @@ +package org.alexdev.havana.game.ecotron; + +import org.alexdev.havana.dao.mysql.ItemDao; +import org.alexdev.havana.game.item.ItemManager; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.item.base.ItemDefinition; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; + +public class EcotronManager { + private static EcotronManager instance; + private List ecotronItems; + + private EcotronManager() { + this.ecotronItems = ItemDao.getEcotronItems(); + } + + /** + * Append the list of ecotron rewards. + * + * @param response the response to append to + */ + public void appendRewards(NettyResponse response) { + response.writeInt(5); + + for (int i = 5; i > 0; i--) { + AtomicInteger chanceMax = new AtomicInteger(0); + + if (i == 5) + chanceMax.set(2000); + else if (i == 4) { + chanceMax.set(200); + } else if (i == 3) { + chanceMax.set(40); + } else if (i == 2) { + chanceMax.set(5); + } + + List itemList = this.ecotronItems.stream().filter(ecotronItem -> ecotronItem.getChance() == chanceMax.get()).collect(Collectors.toList()); + + response.writeInt(i); + response.writeInt(chanceMax.get()); + response.writeInt(itemList.size()); + + for (EcotronItem ecotronItem : itemList) { + ItemDefinition definition = ItemManager.getInstance().getDefinitionBySprite(ecotronItem.getSpriteName()); + + if (definition == null) { + continue; + } + + response.writeString(definition.hasBehaviour(ItemBehaviour.WALL_ITEM) ? "i" : "s"); + response.writeInt(definition.getSpriteId()); + } + } + } + + /** + * Get the list of ecotron rewards by chance + * @param chance the chance + * + * @return the list of ecotron rewards + */ + public List getRewardsByChance(int chance) { + return this.ecotronItems.stream().filter(ecotronItem -> ecotronItem.getChance() == chance).collect(Collectors.toList()); + } + + /** + * Get instance of {@link EcotronManager} + * + * @return the manager instance + */ + public static EcotronManager getInstance() { + if (instance == null) { + instance = new EcotronManager(); + } + + return instance; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/effects/Effect.java b/Havana-Server/src/main/java/org/alexdev/havana/game/effects/Effect.java new file mode 100644 index 0000000..f308ea2 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/effects/Effect.java @@ -0,0 +1,59 @@ +package org.alexdev.havana.game.effects; + +import org.alexdev.havana.util.DateUtil; + +public class Effect { + private int id; + private int userId; + private int effectId; + private long expiryDate; + private boolean activated; + + public Effect(int id, int userId, int effectId, long expiryDate, boolean activated) { + this.id = id; + this.userId = userId; + this.effectId = effectId; + this.expiryDate = expiryDate; + this.activated = activated; + } + + public int getId() { + return id; + } + + public int getUserId() { + return userId; + } + + public int getEffectId() { + return effectId; + } + + public int getTimeLeft() { + if (this.expiryDate >= DateUtil.getCurrentTimeSeconds()) { + return (int) (this.expiryDate - DateUtil.getCurrentTimeSeconds()); + } + + return 0; + } + + public long getExpireDate() { + return expiryDate; + } + + public void setExpiryDate(long expiryDate) { + this.expiryDate = expiryDate; + } + + public boolean isActivated() { + return activated; + } + + public void setActivated(boolean activated) { + this.activated = activated; + } + + public Integer getTimeDuration() { + return EffectsManager.getInstance().getEffectTime(this.effectId); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/effects/EffectsManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/effects/EffectsManager.java new file mode 100644 index 0000000..f901545 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/effects/EffectsManager.java @@ -0,0 +1,41 @@ +package org.alexdev.havana.game.effects; + +import org.alexdev.havana.dao.mysql.EffectDao; + +import java.util.Map; + +public class EffectsManager { + private static EffectsManager instance; + private Map effectTimes; + + public EffectsManager() { + this.effectTimes = EffectDao.getEffectTimes(); + } + + /** + * Get the time for this effect. + * + * @param effectId the effect + * @return the time in seconds + */ + public int getEffectTime(int effectId) { + if (this.effectTimes.containsKey(effectId)) { + return this.effectTimes.get(effectId); + } + + return 7200; // 2 hours default + } + + /** + * Get the {@link EffectsManager} instance + * + * @return the catalogue manager instance + */ + public static EffectsManager getInstance() { + if (instance == null) { + instance = new EffectsManager(); + } + + return instance; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/encryption/DiffieHellman.java b/Havana-Server/src/main/java/org/alexdev/havana/game/encryption/DiffieHellman.java new file mode 100644 index 0000000..8359554 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/encryption/DiffieHellman.java @@ -0,0 +1,85 @@ +package org.alexdev.havana.game.encryption; + +import java.math.BigInteger; +import java.util.concurrent.ThreadLocalRandom; + +public class DiffieHellman { + private String clientPrivateKey; + + private BigInteger publicKey; + private BigInteger privateKey; + private BigInteger sharedKey; + private BigInteger clientP; + private BigInteger clientG; + private String clientPublicKey; + + public DiffieHellman() { + this.clientPrivateKey = DiffieHellman.generateRandomNumString(64); + this.privateKey = new BigInteger(this.clientPrivateKey); + this.clientP = new BigInteger(SecurityCode.assign(SecurityCode.getLoginParameter("p"))); + this.clientG = new BigInteger(SecurityCode.assign(SecurityCode.getLoginParameter("g"))); + } + + /** + * Generate shared key. + * + * @param publicKey the ckey + */ + public void generateSharedKey(String publicKey) { + this.clientPublicKey = publicKey; + this.publicKey = new BigInteger(publicKey); + this.sharedKey = this.publicKey.modPow(this.privateKey, this.clientP); + } + + + public static String generateRandomHexString(int len) { + StringBuilder result = new StringBuilder(); + + for (int i = 0; i < len; i++) { + int rand = 1 + (int) (ThreadLocalRandom.current().nextDouble() * 254); // 1 - 255 + result.append(Integer.toString(rand, 16)); + } + return result.toString(); + } + + public static String generateRandomNumString(int len) { + int rand = 0; + StringBuilder result = new StringBuilder(); + + char[] numbers = new char[] { '1', '2', '3', '4', '5', '6', '7', '8', '9', '0' }; + + for (int i = 0; i < len; i++) { + result.append(Character.toString(numbers[ThreadLocalRandom.current().nextInt(numbers.length)])); + } + return result.toString(); + } + + + public BigInteger getClientP() { + return clientP; + } + + public BigInteger getClientG() { + return clientG; + } + + public BigInteger getPrivateKey() { + return this.privateKey; + } + + public BigInteger getPublicKey() { + return this.publicKey; + } + + public BigInteger getSharedKey() { + return sharedKey; + } + + public String getClientPublicKey() { + return clientPublicKey; + } + + public String getClientPrivateKey() { + return clientPrivateKey; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/encryption/RC4.java b/Havana-Server/src/main/java/org/alexdev/havana/game/encryption/RC4.java new file mode 100644 index 0000000..f7607f0 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/encryption/RC4.java @@ -0,0 +1,80 @@ +package org.alexdev.havana.game.encryption; + +public class RC4 { + private static final int POOL_SIZE = 256; + + private int i = 0; + private int j = 0; + private int[] table; + + public RC4() { + this.table = new int[POOL_SIZE]; + } + + public RC4(byte[] key) { + this.table = new int[POOL_SIZE]; + this.init(key); + } + + /** + * Inits the. + * + * @param key the key + */ + public void init(byte[] key) { + this.i = 0; + this.j = 0; + + for (i = 0; i < POOL_SIZE; ++i) { + this.table[i] = (byte) i; + } + + for (i = 0; i < POOL_SIZE; ++i) { + j = (j + table[i] + key[i % key.length]) & (POOL_SIZE - 1); + swap(i, j); + } + + this.i = 0; + this.j = 0; + } + + /** + * Swap. + * + * @param a the a + * @param b the b + */ + public void swap(int a, int b) { + int k = this.table[a]; + this.table[a] = this.table[b]; + this.table[b] = k; + } + + /** + * Next. + * + * @return the byte + */ + public byte next() { + i = ++i & (POOL_SIZE - 1); + j = (j + table[i]) & (POOL_SIZE - 1); + swap(i, j); + return (byte) table[(table[i] + table[j]) & (POOL_SIZE - 1)]; + } + + /** + * Decipher the incoming message. + * + * @param array the array + * @return the byte[] + */ + public byte[] decipher(byte[] array) { + byte[] result = new byte[array.length]; + + for (int i = 0; i < array.length; i++) { + result[i] = (byte) (array[i] ^ this.next()); + } + + return result; + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/encryption/SecurityCode.java b/Havana-Server/src/main/java/org/alexdev/havana/game/encryption/SecurityCode.java new file mode 100644 index 0000000..69a2df0 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/encryption/SecurityCode.java @@ -0,0 +1,100 @@ +package org.alexdev.havana.game.encryption; + +import java.util.ArrayList; +import java.util.List; + +public class SecurityCode { + // 366592457230440492243310979215656075163725460776 + + public static String assign(Object obj) { + List pData_NxIhNARqldyJyY2PfT03dK8t9OLUR = new ArrayList<>(); + + if (obj instanceof String) { + String hex = (String) obj; + String tData = hex; + + if (hex.toCharArray()[0] == '-') { + tData = hex.substring(1); + } + + int i = tData.length(); + int pDigits = "10000".length() - 1; + + while (i > 0) { + String tCoef = tData.substring(Math.max(0, i - (pDigits)), i); + i = i - tCoef.length(); + pData_NxIhNARqldyJyY2PfT03dK8t9OLUR.add("" + Integer.parseInt(tCoef)); + } + } + + if (obj instanceof int[]) { + int[] parameters = (int[]) obj; + + int tLimit = parameters.length; + + for (int tdata : parameters) { + pData_NxIhNARqldyJyY2PfT03dK8t9OLUR.add(""); + } + + /*int i = 0; + for (int tdata : parameters) { + pData_NxIhNARqldyJyY2PfT03dK8t9OLUR.add("" + decode(tdata)); + i++; + } + + Collections.reverse(pData_NxIhNARqldyJyY2PfT03dK8t9OLUR);*/ + int i = 0; + for (int tdata : parameters) { + pData_NxIhNARqldyJyY2PfT03dK8t9OLUR.set(tLimit - i - 1, "" + decode(tdata)); + i++; + } + + //Collections.reverse(pData_NxIhNARqldyJyY2PfT03dK8t9OLUR); + } + + return String.join("", pData_NxIhNARqldyJyY2PfT03dK8t9OLUR);//Arrays.toString(pData_NxIhNARqldyJyY2PfT03dK8t9OLUR.toArray()); + } + + private static int decode(int tInput) { + int tSeed = 5678; + int[] tSBox = new int[]{7530, 6652, 4115, 1750, 3354, 3647, 5188, 2844, 818, 2026, 7133, 2592, 3578}; + + int tIterations = 54; + int[] tSeedCycle = new int[tIterations + 1]; + + for (int i = 1; i < tIterations + 1; i++) { + tSeed = ((69069 * tSeed) + (139 * i) + 92541) % 10000; + tSeed = tSeed + (int)Math.pow(i, 3); + tSeed = (tSBox[i % tSBox.length] * tSeed + 2541) % 10000; + tSeedCycle[i] = tSeed; + } + + int tCipher = tInput; + tCipher = 7639 ^ tCipher; + + for (int i = 1; i < tIterations + 1; i++) { + int tLowBit = (tCipher & 1); + tCipher = tCipher / 2; + tLowBit = tLowBit * 16384; + tCipher = (tCipher | tLowBit); + int tOffset = tIterations - i + 1; + tCipher = (tSeedCycle[tOffset ] ^ tCipher); + tCipher = (1379 + tSBox[tOffset % tSBox.length] ^ tCipher); + tCipher = ((14 * tSBox[tOffset % tSBox.length] + 13) % 10000 ^ tCipher); + } + + return tCipher; + } + + public static int[] getLoginParameter(String parameter) { + if (parameter.equals("p")) { + return new int[]{7428, 22321, 14152, 3853, 6961, 15119, 23348, 18690, 24373, 11593, 22349, 23808, 22451, 15709, 18190, 16198, 29452, 10173, 17854, 12040, 10164, 21926, 23423, 11034, 2334, 6950, 1841, 21795, 25351}; + } + + if (parameter.equals("g")) { + return new int[]{32561, 8998, 950, 29459, 18193, 11607, 5954, 10035, 21438, 11179}; + } + + return null; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/entity/Entity.java b/Havana-Server/src/main/java/org/alexdev/havana/game/entity/Entity.java new file mode 100644 index 0000000..6ad544e --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/entity/Entity.java @@ -0,0 +1,44 @@ +package org.alexdev.havana.game.entity; + +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.room.entities.RoomEntity; + +public abstract class Entity { + + /** + * Checks for permission. + * + * @param permission the permission + * @return true, if successful + */ + public abstract boolean hasFuse(Fuseright permission); + + /** + * Gets the details. + * + * @return the details + */ + public abstract PlayerDetails getDetails(); + + /** + * Gets the room user. + * + * @return the room user + */ + public abstract RoomEntity getRoomUser(); + + /** + * Gets the type. + * + * @return the type + */ + public abstract EntityType getType(); + + /** + * Dispose. + */ + public abstract void dispose(); + + public boolean isMuted() { return false; } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/entity/EntityState.java b/Havana-Server/src/main/java/org/alexdev/havana/game/entity/EntityState.java new file mode 100644 index 0000000..8cd8582 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/entity/EntityState.java @@ -0,0 +1,74 @@ +package org.alexdev.havana.game.entity; + +import org.alexdev.havana.game.groups.GroupMember; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.RoomUserStatus; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class EntityState { + private int entityId; + private int instanceId; + private EntityType entityType; + private PlayerDetails details; + private Room room; + private Position position; + private Map statuses; + private GroupMember groupMember; + private Entity entity; + + public EntityState(int entityId, int instanceId, EntityType entityType, PlayerDetails details, Room room, Position position, Map statuses, Entity user) { + this.entityId = entityId; + this.instanceId = instanceId; + this.entityType = entityType; + this.details = details; + this.room = room; + this.position = position; + this.statuses = new ConcurrentHashMap<>(statuses); + + if (this.details.getFavouriteGroupId() > 0) { + this.groupMember = this.details.getGroupMember(); + } + + this.entity = user; + } + + public Entity getEntity() { + return entity; + } + + public int getInstanceId() { + return instanceId; + } + + public Position getPosition() { + return position; + } + + public Map getStatuses() { + return statuses; + } + + public int getEntityId() { + return entityId; + } + + public PlayerDetails getDetails() { + return details; + } + + public Room getRoom() { + return room; + } + + public EntityType getEntityType() { + return entityType; + } + + public GroupMember getGroupMember() { + return groupMember; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/entity/EntityType.java b/Havana-Server/src/main/java/org/alexdev/havana/game/entity/EntityType.java new file mode 100644 index 0000000..5e1bef7 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/entity/EntityType.java @@ -0,0 +1,25 @@ +package org.alexdev.havana.game.entity; + +import org.alexdev.havana.game.player.Player; + +public enum EntityType { + PLAYER(Player.class, 1), + PET(Entity.class, 2), + BOT(Entity.class, 3); + + Class clazz; + int typeId; + + EntityType(Class clazz, int typeId) { + this.clazz = clazz; + this.typeId = typeId; + } + + public Class getEntityClass() { + return clazz; + } + + public int getTypeId() { + return this.typeId; + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/events/Event.java b/Havana-Server/src/main/java/org/alexdev/havana/game/events/Event.java new file mode 100644 index 0000000..1ab14ff --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/events/Event.java @@ -0,0 +1,196 @@ +package org.alexdev.havana.game.events; + +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.RoomData; +import org.alexdev.havana.game.room.RoomManager; +import org.alexdev.havana.util.DateUtil; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class Event { + private int roomId; + private int userId; + private int categoryId; + private String name; + private String description; + private long expire; + private List tags; + + /*** + * The event constructor. + * @param roomId the room id the event is hosted in + * @param userId the user id hosting the event + * @param categoryId the category of the event + * @param name the name of the event + * @param description the event description + * @param started the unix timestamp of when the event started + * @param tags the room event tags (can only be created in flash) + */ + public Event(int roomId, int userId, int categoryId, String name, String description, long started, String tags) { + this.roomId = roomId; + this.userId = userId; + this.categoryId = categoryId; + this.name = name; + this.description = description; + this.expire = started; + this.tags = new ArrayList<>(Arrays.asList(tags.split(","))); + } + + /** + * Get whether the event has expired. + * + * @return true, if successful + */ + public boolean isExpired() { + return DateUtil.getCurrentTimeSeconds() > this.expire; + } + + /** + * Get the room id the event is being hosted in. + * + * @return the room id the event is hosted in + */ + public int getRoomId() { + return roomId; + } + + /** + * Get the room instance this event is being hosted for. + */ + public int getPlayersInEvent() { + Room room = RoomManager.getInstance().getRoomById(this.roomId); + + if (room != null) { + return room.getEntityManager().getPlayers().size(); + } + + return 0; + } + + /** + * Get room data. + */ + public RoomData getRoomData() { + return RoomManager.getInstance().getRoomById(this.roomId).getData(); + } + + /** + * Get the id of the user hosting the event. + * + * @return the event hoster id + */ + public int getUserId() { + return userId; + } + + /** + * Get player details + */ + public PlayerDetails getUserInfo() { + return PlayerManager.getInstance().getPlayerData(this.userId); + } + + + /** + * Get the category id for this event. + * + * @return the catgeory id + */ + public int getCategoryId() { + return categoryId; + } + + /** + * Set the category id for this event. + * + * @param categoryId the category id + */ + public void setCategoryId(int categoryId) { + this.categoryId = categoryId; + } + + /** + * Get the event hoster. + * + * @return the event hoster + */ + public PlayerDetails getEventHoster() { + return PlayerManager.getInstance().getPlayerData(this.userId); + } + + /** + * Get the event name. + * + * @return the event name + */ + public String getName() { + return name; + } + + /** + * Set the new name for this event + * + * @param name the event name + */ + public void setName(String name) { + this.name = name; + } + + /** + * Get the event description. + * + * @return the event description + */ + public String getDescription() { + return description; + } + + /** + * Sets the new description for this event. + * + * @param description the event description + */ + public void setDescription(String description) { + this.description = description; + } + + /** + * Get the time the event started. + * + * @return the time the event started + */ + public long getExpireTime() { + return expire; + } + + /** + * Get the time the event started as a formatted date. + * + * @return the date formatted + */ + public String getStartedDate() { + return DateUtil.getDate(this.expire - EventsManager.getEventLifetime(), DateUtil.LONG_DATE); + } + + /** + * Get the time the event started as a formatted friendly date. + * + * @return the date formatted + */ + public String getFriendlyDate() { + return DateUtil.getFriendlyDate(this.expire - EventsManager.getEventLifetime()); + } + + /** + * Get the event tags + * + * @return the event tags + */ + public List getTags() { + return tags; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/events/EventsManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/events/EventsManager.java new file mode 100644 index 0000000..43b3c50 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/events/EventsManager.java @@ -0,0 +1,199 @@ +package org.alexdev.havana.game.events; + +import org.alexdev.havana.dao.mysql.EventsDao; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.config.GameConfiguration; + +import java.sql.SQLException; +import java.util.Comparator; +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +public class EventsManager { + private static EventsManager instance; + private List eventList; + + public EventsManager() { + EventsDao.removeExpiredEvents(); + + this.eventList = EventsDao.getEvents(); + this.removeExpiredEvents(); + } + + /** + * Reload the events manager + */ + public static void reset() { + instance = null; + EventsManager.getInstance(); + } + + + /** + * This method is used to call the create event method. + * @param player the player who created the event + * @param category the category of the event + * @param name the name of the event + * @param description the description of the event + * @param tags + */ + public Event createEvent(Player player, int category, String name, String description, List tags) throws SQLException { + long expireTime = DateUtil.getCurrentTimeSeconds() + EventsManager.getEventLifetime(); + + Event event = new Event( + player.getRoomUser().getRoom().getId(), + player.getDetails().getId(), + category, + name, + description, + expireTime, + String.join(",", tags) + ); + + EventsDao.addEvent( + event.getRoomId(), + event.getUserId(), + event.getCategoryId(), + event.getName(), + event.getDescription(), + event.getExpireTime(), + String.join(",", tags) + ); + + this.eventList.add(event); + return event; + } + + /** + * Get whether a player can create a room event or not. + * + * @param player the player to check for + * @return true, if successful + */ + public boolean canCreateEvent(Player player) { + Room room = player.getRoomUser().getRoom(); + + if (room == null) { + return false; + } else { + if (room.isPublicRoom()) { + return false; + } + + if (!room.isOwner(player.getDetails().getId())) { + return false; + } + } + + if (EventsManager.getInstance().isHostingEvent(player.getDetails().getId())) { + return false; + } + + if (EventsManager.getInstance().hasEvent(room.getId())) { + return false; + } + + return true; + } + + /** + * Get events by category. + * + * @param categoryId the category to get the events for + * @return the list of events + */ + public List getEvents(int categoryId) { + if (categoryId == 0) { // 0 is the hottest events + var events = EventsManager.getInstance().getEventList(); + events.sort(Comparator.comparingInt(Event::getPlayersInEvent).reversed()); + return events; + } + + return this.eventList.stream().filter(event -> event.getCategoryId() == categoryId && !event.isExpired()).collect(Collectors.toList()); + } + + /** + * Get whether a room event exists already. + * + * @param roomId the room id to check for + * @return true, if successful + */ + public boolean hasEvent(int roomId) { + return getEventByRoomId(roomId) != null; + } + + /** + * Get event by room id + * + * @param roomId the roomId to get the event for + */ + public Event getEventByRoomId(int roomId) { + var optional = this.eventList.stream().filter(event -> event.getRoomId() == roomId && !event.isExpired()).findFirst(); + return optional.orElse(null); + } + + /** + * Gets if a user is hosting an event already. + * + * @param userId the user id to check + * @return true, if successful + */ + public boolean isHostingEvent(int userId) { + var optional = this.eventList.stream().filter(event -> event.getUserId() == userId).findFirst(); + return optional.isPresent(); + + } + + /** + * Purge expired events. + */ + public void removeExpiredEvents() { + List expiredEvents = this.eventList.stream().filter(Event::isExpired).collect(Collectors.toList()); + EventsDao.removeEvents(expiredEvents); + this.eventList.removeIf(Event::isExpired); + } + + /** + * Get the event lifetime. + * + * @return the event lifetime + */ + public static long getEventLifetime() { + return TimeUnit.MINUTES.toSeconds(GameConfiguration.getInstance().getInteger("events.expiry.minutes")); + } + + /** + * Remove an event. + * + * @param event the event to remove + */ + public void removeEvent(Event event) { + this.eventList.removeIf(e -> e.getRoomId() == event.getRoomId()); + EventsDao.removeEvent(event); + } + + /** + * Get the list of all active events. + * + * @return the list of events. + */ + public List getEventList() { + return this.eventList.stream().filter(event -> !event.isExpired()).collect(Collectors.toList()); + } + + /** + * Get the {@link EventsManager} instance + * + * @return the item manager instance + */ + public static EventsManager getInstance() { + if (instance == null) { + instance = new EventsManager(); + } + + return instance; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/fuserights/Fuseright.java b/Havana-Server/src/main/java/org/alexdev/havana/game/fuserights/Fuseright.java new file mode 100644 index 0000000..a599705 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/fuserights/Fuseright.java @@ -0,0 +1,109 @@ +package org.alexdev.havana.game.fuserights; + +import org.alexdev.havana.game.player.PlayerRank; + +public enum Fuseright { + // Basic fuses that apply to all users + DEFAULT("default", PlayerRank.NORMAL), + LOGIN("fuse_login", PlayerRank.NORMAL), + TRADE("fuse_trade", PlayerRank.NORMAL), + BUY_CREDITS("fuse_buy_credits", PlayerRank.NORMAL), + BUY_CREDITS_FUSE_LOGIN("fuse_buy_credits_fuse_login", PlayerRank.NORMAL), + ROOM_QUEUE_DEFAULT("fuse_room_queue_default", PlayerRank.NORMAL), + + // Hobba fuses + MUTE("fuse_mute", PlayerRank.HOBBA), + KICK("fuse_kick", PlayerRank.HOBBA), + RECEIVE_CALLS_FOR_HELP("fuse_receive_calls_for_help", PlayerRank.HOBBA), + + // Superhobba fuses + REMOVE_PHOTOS("fuse_remove_photos", PlayerRank.SUPERHOBBA), + REMOVE_STICKIES("fuse_remove_stickies", PlayerRank.SUPERHOBBA), + + // Moderator fuses + MOD("fuse_mod", PlayerRank.MODERATOR), + MODERATOR_ACCESS("fuse_moderator_access", PlayerRank.MODERATOR), + CHAT_LOG("fuse_chat_log", PlayerRank.MODERATOR), + ROOM_ALERT("fuse_room_alert", PlayerRank.MODERATOR), + ROOM_KICK("fuse_room_kick", PlayerRank.MODERATOR), + IGNORE_ROOM_OWNER("fuse_ignore_room_owner", PlayerRank.MODERATOR), + ENTER_FULL_ROOMS("fuse_enter_full_rooms", PlayerRank.MODERATOR), + ENTER_LOCKED_ROOMS("fuse_enter_locked_rooms", PlayerRank.MODERATOR), + SEE_ALL_ROOMOWNERS("fuse_see_all_roomowners", PlayerRank.MODERATOR), // Not sure if this is the correct fuse + SEARCH_USERS("fuse_search_users", PlayerRank.MODERATOR), + BAN("fuse_ban", PlayerRank.MODERATOR), + SEE_CHAT_LOG_LINK("fuse_see_chat_log_link", PlayerRank.MODERATOR), + CANCEL_ROOMEVENT("fuse_cancel_roomevent", PlayerRank.MODERATOR), + + // Administrator fuses + ADMINISTRATOR_ACCESS("fuse_administrator_access", PlayerRank.ADMINISTRATOR), + ANY_ROOM_CONTROLLER("fuse_any_room_controller", PlayerRank.ADMINISTRATOR), + PICK_UP_ANY_FURNI("fuse_pick_up_any_furni", PlayerRank.ADMINISTRATOR), + SEE_FLAT_IDS("fuse_see_flat_ids", PlayerRank.ADMINISTRATOR), + CREDITS("fuse_credits", PlayerRank.ADMINISTRATOR), + DEBUG_WINDOW("fuse_debug_window", PlayerRank.ADMINISTRATOR), + + // Club fuses, these fuses do not apply to any rank + PRIORITY_ACCESS("fuse_priority_access", true), + USE_SPECIAL_ROOM_LAYOUTS("fuse_use_special_room_layouts", true), + USE_CLUB_OUTFITS("fuse_use_club_outfits", true), + USE_CLUB_OUTFITS_DEFAULT("fuse_use_club_outfits_default", true), + USE_CLUB_BADGE("fuse_use_club_badge", true), + USE_CLUB_DANCE("fuse_use_club_dance", true), + USER_LIST_COMMAND("fuse_habbo_chooser", true), + FURNI_LIST_COMMAND("fuse_furni_chooser", true), + EXTENDED_BUDDYLIST("fuse_extended_buddylist", true), + ROOM_QUEUE_CLUB("fuse_room_queue_club", true), + + // Housekeeping fuses + HOUSEKEEPING_INTRA("housekeeping_intra", PlayerRank.HOBBA), + HOUSEKEEPING_KICK("housekeeping_kick", PlayerRank.ADMINISTRATOR), // Not sure if fuse_ is required or not + HOUSEKEEPING_ALERT("fuse_housekeeping_alert", PlayerRank.SUPERHOBBA), + HOUSEKEEPING_DISCUSSION("housekeeping_discussion", PlayerRank.GUIDE), // Not sure if fuse_ is required or not + HOUSEKEEPING_DISCUSSION_ADMIN("housekeeping_discussion_admin", PlayerRank.SUPERHOBBA), // Not sure if fuse_ is required or not + HOUSEKEEPING_ADMIN("housekeeping_admin", PlayerRank.ADMINISTRATOR), + HOUSEKEEPING_ADMIN_CREDITS("housekeeping_admin_credits", PlayerRank.ADMINISTRATOR), // Not sure if fuse_ is required or not + HOUSEKEEPING_ADMIN_USER_DATA("housekeeping_admin_user_data", PlayerRank.ADMINISTRATOR), // Not sure if fuse_ is required or not + HOUSEKEEPING_ADMIN_PAYMENTS("housekeeping_admin_payments", PlayerRank.ADMINISTRATOR), // Not sure if fuse_ is required or not + HOUSEKEEPING_CAMPAIGN("housekeeping_campaign", PlayerRank.COMMUNITY_MANAGER), // Not sure if fuse_ is required or not + HOUSEKEEPING_CAMPAIGN_ADS("housekeeping_campaign_ads", PlayerRank.COMMUNITY_MANAGER), // Not sure if fuse_ is required or not + HOUSEKEEPING_GEORGE("housekeeping_george", PlayerRank.MODERATOR), // Not sure if fuse_ is required or not + HOUSEKEEPING_ADMIN_CATALOG("housekeeping_admin_catalog", PlayerRank.ADMINISTRATOR), // Not sure if fuse_ is required or not + HOUSEKEEPING_HOBBA("housekeeping_hobba", PlayerRank.GUIDE), // Not sure if fuse_ is required or not + HOUSEKEEPING_HOBBA_NEWBIETOOLS("housekeeping_hobba_newbietools", PlayerRank.GUIDE), // Not sure if fuse_ is required or not + HOUSEKEEPING_HOBBA_MODERATORTOOLS("housekeeping_hobba_moderatortools", PlayerRank.HOBBA), // Not sure if fuse_ is required or not + HOUSEKEEPING_HOBBA_HOBBATOOLS("housekeeping_hobba_hobbatools", PlayerRank.HOBBA), // Not sure if fuse_ is required or not + HOUSEKEEPING_HOBBA_ADMINTOOLS("housekeeping_hobba_admintools", PlayerRank.ADMINISTRATOR), // Not sure if fuse_ is required or not + HOUSEKEEPING_HOBBA_SUPERTOOLS("housekeeping_hobba_supertools", PlayerRank.SUPERHOBBA), + HOUSEKEEPING_BAN("housekeeping_ban", PlayerRank.MODERATOR), // Not sure if fuse_ is required or not + HOUSEKEEPING_MEGABAN("housekeeping_megaban", PlayerRank.ADMINISTRATOR), // Not sure if fuse_ is required or not + HOUSEKEEPING_SUPERBAN("housekeeping_superban", PlayerRank.ADMINISTRATOR); // Not sure if fuse_ is required or not + + private final String fuseright; + private final PlayerRank minimumRank; + private final boolean requiresClub; + + Fuseright(String fuseright, PlayerRank minimumRank) { + this.fuseright = fuseright; + this.minimumRank = minimumRank; + this.requiresClub = false; + } + + Fuseright(String fuseright, boolean requiresClub) { + this.fuseright = fuseright; + this.minimumRank = null; + this.requiresClub = requiresClub; + } + + public String getFuseright() { + return fuseright; + } + + public boolean isClubOnly() { + return this.requiresClub; + } + + public PlayerRank getMinimumRank() { + return minimumRank; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/fuserights/FuserightsManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/fuserights/FuserightsManager.java new file mode 100644 index 0000000..cc891d5 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/fuserights/FuserightsManager.java @@ -0,0 +1,95 @@ +package org.alexdev.havana.game.fuserights; + +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.PlayerRank; + +import java.util.*; + +public class FuserightsManager { + private static FuserightsManager instance; + + private List fuserights; + + public FuserightsManager() { + this.fuserights = new ArrayList<>(); + this.fuserights.addAll(Arrays.asList(Fuseright.values())); + } + + /** + * Get the available groups for user. + * + * @param minimumRank the minimum rank to see the fuseright + * @return the lsit of groups + */ + public List getFuserightsForRank(PlayerRank minimumRank) { + List fuses = new ArrayList<>(); + + for (Fuseright f : this.fuserights) { + if (f.getMinimumRank() == null || f.isClubOnly()) { + continue; + } + + if (minimumRank.getRankId() >= f.getMinimumRank().getRankId()) { + fuses.add(f); + } + } + + return fuses; + } + + /* + * Get available groups for users with a club subscription + */ + public List getClubFuserights() { + List fuses = new ArrayList<>(); + + for (Fuseright f : this.fuserights) { + if (f.isClubOnly()) { + fuses.add(f); + } + } + + return fuses; + } + + /** + * Get if the rank has a fuseright. + * + * @param fuse the fuse to check against + * @return true, if successful + */ + public boolean hasFuseright(Fuseright fuse, PlayerDetails details) { + for (Fuseright f : this.fuserights) { + if (f.getMinimumRank() == null) { + continue; + } + + if (details.getRank().getRankId() >= f.getMinimumRank().getRankId() && f == fuse) { + return true; + } + } + + if (details.hasClubSubscription()) { + for (Fuseright f : this.fuserights) { + if (f.isClubOnly() && f == fuse) { + return true; + } + } + } + + return false; + } + + /** + * Get the fuseright manager instance. + * + * @return the fuseright manager + */ + public static FuserightsManager getInstance() { + if (instance == null) { + instance = new FuserightsManager(); + } + + return instance; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/Game.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/Game.java new file mode 100644 index 0000000..9c4a180 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/Game.java @@ -0,0 +1,945 @@ +package org.alexdev.havana.game.games; + +import org.alexdev.havana.game.GameScheduler; +import org.alexdev.havana.game.games.battleball.BattleBallGame; +import org.alexdev.havana.game.games.battleball.events.PlayerMoveEvent; +import org.alexdev.havana.game.games.enums.GameState; +import org.alexdev.havana.game.games.enums.GameType; +import org.alexdev.havana.game.games.history.GameHistory; +import org.alexdev.havana.game.games.history.GameHistoryData; +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.games.player.GameTeam; +import org.alexdev.havana.game.games.snowstorm.SnowStormGame; +import org.alexdev.havana.game.games.tasks.GameFinishTask; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.RoomManager; +import org.alexdev.havana.game.room.models.RoomModel; +import org.alexdev.havana.log.Log; +import org.alexdev.havana.messages.outgoing.games.*; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.util.config.GameConfiguration; +import org.alexdev.havana.util.schedule.FutureRunnable; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; +import java.util.stream.Collectors; + +public abstract class Game { + private int id; + private int mapId; + private int teamAmount; + + private String gameCreatorName; + private int gameCreatorId; + + private GameType gameType; + private GameState gameState; + + private Room room; + private RoomModel roomModel; + + private String name; + private Map teams; + + private List observers; + private List spectators; + + private BlockingQueue eventsQueue; + private BlockingQueue objectsQueue; + + private List objects; + private List events; + + private AtomicInteger preparingGameSecondsLeft; + private AtomicInteger totalSecondsLeft; + private AtomicLong restartCountdown; + private AtomicInteger objectId; + + private FutureRunnable preparingTimerRunnable; + private FutureRunnable gameTimerRunnable; + private FutureRunnable restartRunnable; + + private boolean gameStarted; + private boolean gameFinished; + + private int regenerateMapInterval; + private boolean regenerateMapEnabled; + + public Game(int id, int mapId, GameType gameType, String name, int teamAmount, Player gameCreator) { + this.id = id; + this.mapId = mapId; + this.gameType = gameType; + this.name = name; + this.teamAmount = teamAmount; + this.gameCreatorName = gameCreator.getDetails().getName(); + this.gameCreatorId = gameCreator.getDetails().getId(); + this.teams = new ConcurrentHashMap<>(); + + this.spectators = new CopyOnWriteArrayList<>(); + this.observers = new CopyOnWriteArrayList<>(); + + this.eventsQueue = new LinkedBlockingQueue<>(); + this.objectsQueue = new LinkedBlockingQueue<>(); + + this.objects = new CopyOnWriteArrayList<>(); + this.events = new CopyOnWriteArrayList<>(); + + for (int i = 0; i < teamAmount; i++) { + this.teams.put(i, new GameTeam(i, this)); + } + + this.objectId = new AtomicInteger(0); + this.gameState = GameState.WAITING; + + this.regenerateMapEnabled = GameConfiguration.getInstance().getBoolean("regenerate.map.enabled"); + this.regenerateMapInterval = GameConfiguration.getInstance().getInteger("regenerate.map.interval"); + } + + public void reassignGameId() { + this.id = GameManager.getInstance().getGameCounter().getAndIncrement(); + } + + /** + * Method to initialise the game + */ + public void initialise() { + this.initialise(GameManager.getInstance().getLifetimeSeconds(this.gameType), "Battleball Arena", GameManager.getInstance().getModel(this.gameType, this.mapId)); + } + + public void initialise(int lifetimeSeconds, String roomName, RoomModel model) { + this.gameState = GameState.STARTED; + + this.preparingGameSecondsLeft = new AtomicInteger(GameManager.getInstance().getPreparingSeconds(this.gameType)); + this.totalSecondsLeft = new AtomicInteger(lifetimeSeconds); + + if (model != null) { + this.roomModel = model; + } + + if (this.room == null) { + this.room = new Room(); + this.room.getData().fill(0, roomName, ""); + this.room.setRoomModel(this.getRoomModel()); + this.room.getData().setGame(this); + this.room.setGameArena(true); + + //this.room.getData().setCategoryId(NavigatorManager.getInstance().getCategories().values().stream().findFirst().get().getId()); + this.room.getData().setGameArena(true); + this.room.getData().setGameLobby(this.gameType.getLobbyModel()); + } + + this.objects.clear(); + this.events.clear(); + this.room.getMapping().regenerateCollisionMap(); + this.buildMap(); + } + + /** + * Method to start the game + */ + public void startGame() { + this.initialise(); + this.assignSpawnPoints(); + + var game = this; + + for (GamePlayer p : this.getActivePlayers()) { + p.setEnteringGame(true); // Set to true so when they leave the lobby, the server knows to initialise the user when they join the arena + } + + this.send(new GAMELOCATION()); + this.sendSpectatorsToArena(); + + /*while (true) { + if (this.getPlayers().stream().allMatch(g -> g.getPlayer().getRoomUser().getRoom() != null)) { + this.send(new FULLGAMESTATUS(this)); + break; + } + }*/ + + // Preparing game seconds countdown + this.preparingTimerRunnable = new FutureRunnable() { + public void run() { + try { + gamePrepareTick(); + + if (getActivePlayers().isEmpty()) { + GameManager.getInstance().getGames().remove(game); + killSpectators(); + this.cancelFuture(); + return; + } + + if (preparingGameSecondsLeft.getAndDecrement() == 0) { + this.cancelFuture(); + beginGame(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } + }; + + var future = GameScheduler.getInstance().getService().scheduleAtFixedRate(this.preparingTimerRunnable, 0, 1, TimeUnit.SECONDS); + this.preparingTimerRunnable.setFuture(future); + + this.sendObservers(new GAMEINSTANCE(this)); + this.gamePrepare(); + } + + /** + * Method for when the game begins after the initial preparing game seconds timer + */ + private void beginGame() { + this.gameStarted = true; + + // Stop all players from walking when game starts if they selected a tile + for (GamePlayer p : this.getActivePlayers()) { + p.getPlayer().getRoomUser().setWalkingAllowed(true); + p.getPlayer().getRoomUser().setTeleporting(false); + } + + // Send game seconds + this.send(new GAMESTART(this.totalSecondsLeft.get())); + + // Regenerate collision map when game starts + this.room.getMapping().regenerateCollisionMap(); + + // Game seconds counter + this.gameTimerRunnable = new FutureRunnable() { + public void run() { + try { + gameTick(); + + if (regenerateMapEnabled) { + if (totalSecondsLeft.get() % regenerateMapInterval == 0) { + room.getMapping().regenerateCollisionMap(); + } + } + + // Game ends either when time runs out or there's no free tiles left to seal + if (totalSecondsLeft.decrementAndGet() == 0 || !canTimerContinue() || getActivePlayers().isEmpty()) { + this.cancelFuture(); + finishGame(); + } + + } catch (Exception ex) { + Log.getErrorLogger().error("Error occurred in game timer runnable: ", ex); + } + } + }; + + var future = GameScheduler.getInstance().getService().scheduleAtFixedRate(this.gameTimerRunnable, 0, 1, TimeUnit.SECONDS); + this.gameTimerRunnable.setFuture(future); + + gameStarted(); + } + + /** + * Finish game + */ + public void finishGame() { + Game instance = this; + this.gameStarted = false; + this.gameFinished = true; + this.gameState = GameState.ENDED; + + // Stop all players from walking when game starts if they selected a tile + for (GamePlayer p : this.getActivePlayers()) { + //System.out.println(p.getPlayer().getDetails().getName() + " = " + p.getScore()); + p.getPlayer().getRoomUser().setWalkingAllowed(false); + p.getPlayer().getRoomUser().setTeleporting(false); + } + + var gameHistoryData = new GameHistoryData(); + var gameHistory = new GameHistory(gameHistoryData); + + if (this.teams.size() > 0) { + var sortedTeamList = new ArrayList<>(this.teams.values()); + sortedTeamList.sort(Comparator.comparingInt(GameTeam::getScore).reversed()); + + var winningTeam = sortedTeamList.get(0); + + gameHistoryData.setTeamCount(sortedTeamList.size()); + + for (GameTeam team : sortedTeamList) { + for (GamePlayer gamePlayer : team.getPlayers()) { + gameHistoryData.addPlayer(gamePlayer.getUserId(), gamePlayer.getScore(), gamePlayer.getTeamId()); + } + } + + gameHistory.setName(this.getName()); + gameHistory.setWinningTeam(winningTeam.getId()); + gameHistory.setWinningTeamScore(winningTeam.getScore()); + gameHistory.setGameType(this.gameType); + gameHistory.setMapId(this.getMapId()); + + if (this.gameType == GameType.BATTLEBALL) { + gameHistory.setExtraData(((BattleBallGame) this).getAllowedPowerUps().stream().map(String::valueOf).collect(Collectors.joining(","))); + } else { + gameHistory.setExtraData(String.valueOf(((SnowStormGame) this).getGameLengthChoice())); + } + + if (this.canIncreasePoints()) { + var gameFinishTask = new GameFinishTask(this, gameHistory, this.gameType, sortedTeamList, this.getActivePlayers()); + gameFinishTask.run(); + } + } + + // Send scores to everybody + this.send(new GAMEEND(this.gameType, this.teams)); + this.gameEnded(); + + // Restart countdown + this.restartCountdown = new AtomicLong(GameManager.getInstance().getRestartSeconds(this.gameType)); + + this.restartRunnable = new FutureRunnable() { + public void run() { + if (!hasEnoughPlayers() || gameState != GameState.ENDED) { + this.cancelFuture(); + return; + } + + List afkPlayers = new ArrayList<>(); // Players who didn't touch any button + + for (GamePlayer p : instance.getActivePlayers()) { + if (!p.isClickedRestart()) { + afkPlayers.add(p); + } + } + + if (restartCountdown.decrementAndGet() == 0) { + if (afkPlayers.size() > 0) { // Only call this if not everyone clicked play again, else GAMERESTART.java handles it + triggerRestart(); + } + + this.cancelFuture(); + } + } + }; + + var future = GameScheduler.getInstance().getService().scheduleAtFixedRate(this.restartRunnable, 0, 1, TimeUnit.SECONDS); + this.restartRunnable.setFuture(future); + + this.sendObservers(new GAMEINSTANCE(gameHistory)); + this.observers.clear(); + } + + /** + * Restarts all the new players who clicked to play the next game. + */ + public void triggerRestart() { + List players = new ArrayList<>(); // Players who wanted to restart + List afkPlayers = new ArrayList<>(); // Players who didn't touch any button + + for (GamePlayer p : this.getActivePlayers()) { + if (!p.isClickedRestart()) { + afkPlayers.add(p); + } else { + p.setClickedRestart(false); // Reset whether or not they clicked restart, for next game + players.add(p); + } + } + + // Only create a new game if there's two players who joined + if (players.size() >= GameConfiguration.getInstance().getInteger(this.gameType.name().toLowerCase() + ".start.minimum.active.teams")) { + this.restartGame(players); + } else { + afkPlayers.addAll(players); + } + + // Send spectators to lobby too + afkPlayers.addAll(this.spectators); + + for (var afkPlayer : afkPlayers) { + this.sendToLobby(afkPlayer); + } + } + + /** + * Method to restart game. + */ + public void restartGame(List players) { + if (this.restartRunnable != null) { + this.restartRunnable.cancelFuture(); + } + + if (this.preparingTimerRunnable != null) { + this.preparingTimerRunnable.cancelFuture(); + } + + if (this.gameTimerRunnable != null) { + this.gameTimerRunnable.cancelFuture(); + } + + for (GameTeam gameTeam : this.teams.values()) { + gameTeam.getPlayers().clear(); + } + + for (var gamePlayer : players) { + this.movePlayer(gamePlayer, -1, gamePlayer.getTeamId()); + gamePlayer.getPlayer().getRoomUser().setWalkingAllowed(false); // Don't allow them to walk, for next game + gamePlayer.getPlayer().getRoomUser().setTeleporting(false); + } + + this.reassignGameId(); + this.initialise(); + this.assignSpawnPoints(); + + for (GamePlayer gamePlayer : this.getActivePlayers()) { + gamePlayer.setGameId(this.getId()); + gamePlayer.getPlayer().getRoomUser().setInstanceId(gamePlayer.getObjectId()); + gamePlayer.getPlayer().getRoomUser().setPosition(gamePlayer.getSpawnPosition()); + } + + this.send(new GAMERESET(GameManager.getInstance().getPreparingSeconds(this.gameType), players, this)); + this.send(new FULLGAMESTATUS(this)); // Show users back at spawn positions + + this.sendObservers(new GAMEDELETED(this.id)); + + // Preparing game seconds countdown + this.preparingTimerRunnable = new FutureRunnable() { + public void run() { + try { + if (!hasEnoughPlayers()) { + this.cancelFuture(); + return; + } + + gamePrepareTick(); + + if (preparingGameSecondsLeft.getAndDecrement() == 0) { + this.cancelFuture(); + beginGame(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } + }; + + var future = GameScheduler.getInstance().getService().scheduleAtFixedRate(this.preparingTimerRunnable, 1, 1, TimeUnit.SECONDS); + this.preparingTimerRunnable.setFuture(future); + + this.gamePrepare(); + } + + /** + * Make the player leave the game, abort the game if the owner leaves + * + * @param gamePlayer the game player to leave + */ + public void leaveGame(GamePlayer gamePlayer) { + boolean isSpectator = this.spectators.contains(gamePlayer); + + this.spectators.remove(gamePlayer); + this.objects.remove(gamePlayer.getGameObject()); + + gamePlayer.getPlayer().getRoomUser().setGamePlayer(null); + gamePlayer.getPlayer().send(new GAMEDELETED(this.id)); + + if (!isSpectator) { + this.movePlayer(gamePlayer, gamePlayer.getTeamId(), -1); + } else { + this.send(new GAMEINSTANCE(this)); + this.sendObservers(new GAMEINSTANCE(this)); + } + + if (this.gameState == GameState.WAITING && this.gameCreatorId == gamePlayer.getPlayer().getDetails().getId() || this.getActivePlayers().isEmpty()) { + GameManager.getInstance().getGames().remove(this); + + for (var player : this.getTotalPlayers()) { + player.getPlayer().getRoomUser().setGamePlayer(null); + } + + for (var player : this.getSpectators()) { + player.getPlayer().getRoomUser().setGamePlayer(null); + } + + for (var player : this.getObservers()) { + player.getRoomUser().setObservingGameId(0); + } + + this.send(new GAMEDELETED(this.id)); + this.sendObservers(new GAMEDELETED(this.id)); + this.killSpectators(); + } + + gamePlayer.getPlayer().getRoomUser().setGamePlayer(null); + gamePlayer.setGameId(-1); + } + + /** + * Send all spectators to arena, happens when game starts after waiting for players. + */ + private void sendSpectatorsToArena() { + for (GamePlayer spectator : this.spectators) { + this.sendSpectatorToArena(spectator); + } + } + + /** + * Send spectaot to arena + * + * @param spectator the spectator to send + */ + public void sendSpectatorToArena(GamePlayer spectator) { + if (!spectator.isSpectator()) { + return; + } + + if (spectator.getPlayer().getRoomUser().getRoom() != this.room) { + spectator.getPlayer().send(new GAMELOCATION()); + spectator.setEnteringGame(true); + + // No longer an observer + this.observers.remove(spectator.getPlayer()); + } + } + + /** + * Terminate all spectators, and send them to the lobby. + */ + private void killSpectators() { + for (GamePlayer spectator : this.spectators) { + this.sendToLobby(spectator); + } + + this.spectators.clear(); + } + + /** + * Send players to the game lobby, will make them leave the game. + * + * @param gamePlayer the player to send + */ + public void sendToLobby(GamePlayer gamePlayer) { + Player player = gamePlayer.getPlayer(); + + if (player.getRoomUser().getRoom() != this.room) { + return; // Don't force people to go to a room they didn't request + } + + if (player.getRoomUser().getRoom() != null) { + player.getRoomUser().getRoom().getEntityManager().leaveRoom(player, false); + } else { + this.leaveGame(gamePlayer); + } + + this.getLobby().forward(gamePlayer.getPlayer(), false); + } + + /** + * Get the lobby for this game. + * + * @return the room lobby + */ + public Room getLobby() { + return RoomManager.getInstance().getRoomByModel(this.gameType.getLobbyModel()); + } + + /** + * Moves a player from one team to another team. + * + * @param gamePlayer the player to move + * @param fromTeamId the team to move from, -1 if just to add to team + * @param toTeamId the team to move to, -1 if just removing user from team + */ + public void movePlayer(GamePlayer gamePlayer, int fromTeamId, int toTeamId) { + if (fromTeamId != -1) { + if (this.gameState == GameState.WAITING || this.gameState == GameState.ENDED) { + this.teams.get(fromTeamId).getPlayers().remove(gamePlayer); + } + + gamePlayer.setInGame(false); // Leaving team so they're not in game + } + + if (toTeamId != -1) { + if (!this.teams.get(toTeamId).getPlayers().contains(gamePlayer)) { + this.teams.get(toTeamId).getPlayers().add(gamePlayer); + } + + gamePlayer.setTeamId(toTeamId); + gamePlayer.setInGame(true); // Entering team so they're in game + } else { + if (this.gameState == GameState.WAITING || this.gameState == GameState.ENDED) { + this.teams.get(gamePlayer.getTeamId()).getPlayers().remove(gamePlayer); + } else { + gamePlayer.setInGame(false); // Don't remove from team, just show they're no longer in game, for "0" score at the end. + } + + gamePlayer.getPlayer().getRoomUser().setGamePlayer(null); + } + + this.send(new GAMEINSTANCE(this)); + this.sendObservers(new GAMEINSTANCE(this)); + } + + /** + * Send a packet to all members in game + * + * @param composer the composer to send + */ + public void send(MessageComposer composer) { + for (GamePlayer gamePlayer : this.getActivePlayers()) { + gamePlayer.getPlayer().send(composer); + } + + for (GamePlayer player : this.spectators) { + player.getPlayer().send(composer); + } + } + + /** + * Send a packet (game status) to all observers + * + * @param composer the composer to send + */ + public void sendObservers(MessageComposer composer) { + for (Player player : this.observers) { + player.send(composer); + } + } + + /** + * Get if there is enough space for this user to switch to the team + * + * @param teamId the team id to check for + * @return true, if successful + */ + public boolean canSwitchTeam(int teamId) { + int maxPerTeam = 0; + + if (this.teamAmount == 1) { + maxPerTeam = 10; + } else if (this.teamAmount == 2) { + maxPerTeam = 5; + } else if (this.teamAmount == 3) { + maxPerTeam = 3; + } else if (this.teamAmount == 4) { + maxPerTeam = 2; + } + + return this.teams.get(teamId).getActivePlayers().size() <= maxPerTeam; + } + + public int getMaxPlayers() { + int maxPerTeam = 0; + + if (this.teamAmount == 1) { + maxPerTeam = 10; + } else if (this.teamAmount == 2) { + maxPerTeam = 5; + } else if (this.teamAmount == 3) { + maxPerTeam = 3; + } else if (this.teamAmount == 4) { + maxPerTeam = 2; + } + + return maxPerTeam * this.teamAmount; + } + + /** + * Get whether points can be increased or not + * + * @return true, if successful + */ + public boolean canIncreasePoints() { + return GameConfiguration.getInstance().getBoolean(this.gameType.name().toLowerCase() + ".increase.points"); + } + + /** + * Gets if there's enough players in different teams for the game to start + * (minimum of 2 players) + * + * @return true, if successful + */ + public boolean canGameStart() { + if (this.gameType == GameType.SNOWSTORM && this.teamAmount == 1) { + return this.getActivePlayers().size() > 1; + } else { + int activeTeamCount = 0; + + for (int i = 0; i < this.teamAmount; i++) { + if (this.teams.get(i).getActivePlayers().size() > 0) { + activeTeamCount++; + } + } + + return activeTeamCount >= GameConfiguration.getInstance().getInteger(this.gameType.name().toLowerCase() + ".start.minimum.active.teams"); + } + } + + /** + * Gets if there's enough players in different teams for the game to continue + * (minimum of 1 players) + * + * @return true, if successful + */ + public abstract boolean hasEnoughPlayers(); + + /** + * Get the game player instance by id + * @param userId the id to get the player by + * @return the game player instance, else if null + */ + public GamePlayer getGamePlayer(int userId) { + for (GamePlayer gamePlayer : this.getActivePlayers()) { + if (gamePlayer.getUserId() == userId) { + return gamePlayer; + } + } + + return null; + } + + /** + * Get a tile by specified coordinates + * + * @param x the x coordinate + * @param y the y coordinate + * @return the battleball tile, if successful + */ + public GameTile getTile(int x, int y) { + if (x < 0 || y < 0) { + return null; + } + + if (x >= this.roomModel.getMapSizeX() || y >= roomModel.getMapSizeY() || y >= getTileMap()[0].length || x >= getTileMap().length) { + return null; + } + + return this.getTileMap()[x][y]; + } + + /** + * Method to create object ids. + * + * @return the new object ids + */ + public int createObjectId() { + return this.objectId.incrementAndGet(); + } + + public void addObjectToQueue(GameObject object) { + this.objectsQueue.removeIf(obj -> obj.getId() == object.getId()); + this.objectsQueue.add(object); + } + + public void addPlayerMove(PlayerMoveEvent event) { + this.eventsQueue.removeIf(e -> e instanceof PlayerMoveEvent && ((PlayerMoveEvent)e).getGamePlayer() == event.getGamePlayer()); + this.eventsQueue.add(event); + } + + /** + * Method for whether the game can continue, eg if all tiles are filled up or + * some other logic + * + * @return true, if game has finished + */ + public abstract boolean canTimerContinue(); + + /** + * Assign spawn points to all team members + */ + public abstract void assignSpawnPoints(); + + /** + * Method to get the tile map + */ + public abstract GameTile[][] getTileMap(); + + /** + * Handler for building map + */ + public abstract void buildMap(); + + /** + * Method called when game is ticked + */ + public abstract void gameTick(); + + /** + * Method called when the game initially began + */ + public void gamePrepare() { + for (GameTeam gameTeam : this.getTeams().values()) { + gameTeam.setScore(0); + } + + for (GamePlayer gamePlayer : this.getActivePlayers()) { + gamePlayer.setXp(0); + gamePlayer.setScore(0); + } + } + + /** + * Method called for the tick in game beginning + */ + public void gamePrepareTick() { } + + /** + * Method called when the game initially started + */ + public void gameStarted() { } + + /** + * Method called when the game ends, when the scoreboard shows + */ + public void gameEnded() { } + + public List getActivePlayers() { + List gamePlayers = new ArrayList<>(); + + for (GameTeam team : this.teams.values()) { + gamePlayers.addAll(team.getActivePlayers()); + } + + return gamePlayers; + } + + public List getTotalPlayers() { + List gamePlayers = new ArrayList<>(); + + for (GameTeam team : this.teams.values()) { + gamePlayers.addAll(team.getActivePlayers()); + } + + return gamePlayers; + } + + /** + * Get the cost of tickets required to play this game + * + * @return the ticket amount required + */ + public int getTicketCost() { + return getTicketCost(this.getGameType()); + } + + /** + * Get the cost of tickets required to play each game + * + * @param gameType the type of game to get the ticket cost for + * @return the ticket amount required + */ + public static int getTicketCost(GameType gameType) { + return GameConfiguration.getInstance().getInteger(gameType.name().toLowerCase() + ".ticket.charge"); + } + + /** + * Get the list of specators, the people currently watching the game + * + * @return the list of spectators + */ + public List getSpectators() { + return spectators; + } + + /** + * + * @return + */ + public List getObservers() { + return observers; + } + + /** + * Get the game id + * + * @return the game id + */ + public int getId() { + return id; + } + + public GameType getGameType() { + return gameType; + } + + public GameState getGameState() { + return gameState; + } + + public String getName() { + return name; + } + + public int getTeamAmount() { + return teamAmount; + } + + public Map getTeams() { + return teams; + } + + public String getGameCreator() { + return this.gameCreatorName; + } + + public int getMapId() { + return mapId; + } + + public AtomicInteger getPreparingGameSecondsLeft() { + return preparingGameSecondsLeft; + } + + public AtomicInteger getTotalSecondsLeft() { + return totalSecondsLeft; + } + + public RoomModel getRoomModel() { + return roomModel; + } + + public Room getRoom() { + return room; + } + + public boolean isGameStarted() { + return gameStarted; + } + + public boolean isGameFinished() { + return gameFinished; + } + + public int getGameCreatorId() { + return gameCreatorId; + } + + public BlockingQueue getEventsQueue() { + return eventsQueue; + } + + public BlockingQueue getObjectsQueue() { + return objectsQueue; + } + + public List getObjects() { + return objects; + } + + public void setRoomModel(RoomModel roomModel) { + this.roomModel = roomModel; + } + + public AtomicInteger getObjectId() { + return objectId; + } + + public void setObjectId(AtomicInteger objectId) { + this.objectId = objectId; + } + + public FutureRunnable getRestartRunnable() { + return restartRunnable; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/GameEvent.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/GameEvent.java new file mode 100644 index 0000000..bef7338 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/GameEvent.java @@ -0,0 +1,23 @@ +package org.alexdev.havana.game.games; + +import org.alexdev.havana.game.games.enums.GameEventType; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public abstract class GameEvent { + private GameEventType gameEventType; + + public GameEvent(GameEventType gameEventType) { + this.gameEventType = gameEventType; + } + + public abstract void serialiseEvent(NettyResponse response); + + /** + * Get the game event type for the update loop + * + * @return the event type + */ + public GameEventType getGameEventType() { + return gameEventType; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/GameManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/GameManager.java new file mode 100644 index 0000000..161dc58 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/GameManager.java @@ -0,0 +1,335 @@ +package org.alexdev.havana.game.games; + +import org.alexdev.havana.dao.mysql.GameDao; +import org.alexdev.havana.game.games.battleball.BattleBallMap; +import org.alexdev.havana.game.games.enums.GameState; +import org.alexdev.havana.game.games.enums.GameType; +import org.alexdev.havana.game.games.history.GameHistory; +import org.alexdev.havana.game.games.player.GameRank; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.statistics.PlayerStatistic; +import org.alexdev.havana.game.room.models.RoomModel; +import org.alexdev.havana.log.Log; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.config.GameConfiguration; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +public class GameManager { + private static GameManager instance = null; + + private ScheduledFuture expiryLoop; + + private AtomicInteger gameCounter; + private AtomicInteger finishedGameCounter; + + private List spawnList; + private List rankList; + private List modelList; + + private List games; + private List battleballTileMaps; + + private HashMap> lastPlayedGames; + + public GameManager() { + this.rankList = GameDao.getRanks(); + this.modelList = GameDao.getGameMaps(); + this.spawnList = GameDao.getGameSpawns(); + this.battleballTileMaps = GameDao.getBattleballTileMaps(); + this.games = new ArrayList<>(); + this.gameCounter = new AtomicInteger(0); + this.finishedGameCounter = new AtomicInteger(0); + this.refreshPlayedGames(); + } + + public void refreshPlayedGames() { + this.lastPlayedGames = new HashMap<>();//GameDao.getLastPlayedGames(); + + for (GameType gameType : GameType.values()) { + this.lastPlayedGames.put(gameType, GameDao.getLastPlayedGames(gameType)); + + for (var game : this.lastPlayedGames.get(gameType)) { + game.setId(this.getGameCounter().getAndIncrement()); + } + } + } + + public int getRandomCredits(boolean isWinner) { + int maxCredits = 0; + int minCredits = 0; + + String[] rangeData = GameConfiguration.getInstance().getString("reward.credits." + (isWinner ? "winner" : "loser") + ".range").split(Pattern.quote("-")); + + try { + minCredits = Integer.parseInt(rangeData[0]); + maxCredits = Integer.parseInt(rangeData[1]); + } catch (Exception ex) { + Log.getErrorLogger().error("Error when handling give random credits: " + ex); + } + + if (minCredits == maxCredits) { + return maxCredits; + } else { + return ThreadLocalRandom.current().nextInt(minCredits, maxCredits + 1); + } + } + + /** + * Check xp expiry. + */ +public void checkXpExpiry() { + var currentMonthFormat = DateUtil.getCurrentDate("yyyy-MM"); + + if (currentMonthFormat.equalsIgnoreCase(GameConfiguration.getInstance().getString("xp.monthly.expiry"))) { + return; + } + + GameConfiguration.getInstance().updateSetting("xp.monthly.expiry", currentMonthFormat); + GameDao.resetMonthlyXp(); +} + + /** + * Get the game spawn list by game type, map id and team id + * + * @param gameType the game type (battleball or snowstorm) + * @param mapId the map id + * @param teamId the team id + * @return the game spawn + */ + public List getGameSpawns(GameType gameType, int mapId, int teamId) { + /*for (GameSpawn gameSpawn : this.spawnList) { + if ((gameSpawn.getGameType() == gameType) && (gameSpawn.getMapId() == mapId) && (gameSpawn.getTeamId() == teamId)) { + return gameSpawn; + } + }*/ + + return this.spawnList.stream().filter(gameSpawn -> (gameSpawn.getGameType() == gameType) && (gameSpawn.getMapId() == mapId) && (gameSpawn.getTeamId() == teamId)).collect(Collectors.toList()); + } + + /** + * Get the game spawn by gamr type, map id and team id + * + * @param mapId the map id + * @return the game spawn + */ + public BattleBallMap getBattleballTileMap(int mapId) { + for (BattleBallMap tileMap : this.battleballTileMaps) { + if (tileMap.getMapId() == mapId) { + return tileMap; + } + } + + return null; + } + + /** + * Gets a game instance by specified game id + * + * @param gameId the game id used + * @return the game instance + */ + public Game getGameById(int gameId) { + for (Game game : this.games) { + if (game.getId() == gameId) { + return game; + } + } + + return null; + } + + /** + * Get the list of games by type + * + * @param gameType the type of game + * @return the list of games + */ + public List getGamesByType(GameType gameType) { + return this.games.stream().filter( + game -> game.getGameType() == gameType + ).collect(Collectors.toList()); + } + + /** + * Get the list of started games by type + * + * @param gameType the type of game + * @return the list of games + */ + public List getStartedGamesByType(GameType gameType) { + return this.games.stream().filter( + game -> game.getGameType() == gameType && game.getGameState() == GameState.STARTED + ).collect(Collectors.toList()); + } + + /** + * Get the list of game ranks by type + * + * @param gameType the type of game to get the ranks for + * @return the list of ranks + */ + public List getRanksByType(GameType gameType) { + return this.rankList.stream().filter( + rank -> rank.getType() == gameType + ).collect(Collectors.toList()); + } + + /** + * Get the instance of {@link GameManager} + * + * @return the instance + */ + public static GameManager getInstance() { + if (instance == null) { + instance = new GameManager(); + } + + return instance; + } + + /** + * Reload the instance of {@link GameManager} + */ + public static void reset() { + int gameCounter = 0; + + if (instance != null) { + gameCounter = instance.gameCounter.get(); + } + + instance = null; + getInstance().getGameCounter().set(gameCounter); + } + + /** + * Creates a new game id for the game + * + * @return the game id + */ + public int createId() { + return gameCounter.incrementAndGet(); + } + + /** + * Gets the game id counter. + * + * @return the id counter + */ + public AtomicInteger getGameCounter() { + return gameCounter; + } + + /** + * Gets the list of currently active games + * + * @return the list of games + */ + public List getGames() { + return games; + } + + /** + * Gets the restart time for the specified game type. + */ + public int getRestartSeconds(GameType gameType) { + return GameConfiguration.getInstance().getInteger(gameType.name().toLowerCase() + ".restart.game.seconds"); + } + + /** + * Gets the game time for the specified game type. + */ + public int getLifetimeSeconds(GameType gameType) { + return GameConfiguration.getInstance().getInteger(gameType.name().toLowerCase() + ".game.lifetime.seconds"); + } + + /** + * Gets the game time for the specified game type. + */ + public int getPreparingSeconds(GameType gameType) { + return GameConfiguration.getInstance().getInteger(gameType.name().toLowerCase() + ".preparing.game.seconds"); + } + + /** + * Get the amount of seconds allowed for a finished game to persist on the instance list before it's removed + * + * @return the amount of seconds + */ + public int getListingExpiryTime() { + return GameConfiguration.getInstance().getInteger("game.finished.listing.expiry.seconds"); + } + + /** + * Get model by type and map id + * + * @return the room model instance + */ + public RoomModel getModel(GameType type, int mapId) { + String prefix = (type == GameType.BATTLEBALL ? "bb" : "ss"); + + for (RoomModel roomModel : this.modelList) { + if (roomModel.getName().equals(prefix + "_arena_" + mapId)) { + return roomModel; + } + } + + return null; + } + + public List getMaps() { + return this.modelList; + } + + /** + * Get the finished game counter. + * + * @return the finished game counter + */ + public AtomicInteger getFinishedGameCounter() { + return finishedGameCounter; + } + + public List getLastPlayedGames(GameType gameType) { + return lastPlayedGames.get(gameType); + } + + /** + * Get the game rank by the player points. + * + * @param type the type of game to get the points for + * @param player the player to get the points for + * @return the rank, null otherwise + */ + public GameRank getRankByPoints(GameType type, Player player) { + int score = 0; + + if (type == GameType.BATTLEBALL) { + score = player.getStatisticManager().getIntValue(PlayerStatistic.BATTLEBALL_POINTS_ALL_TIME); + } + + if (type == GameType.SNOWSTORM) { + score = player.getStatisticManager().getIntValue(PlayerStatistic.SNOWSTORM_POINTS_ALL_TIME); + } + + for (GameRank rank : this.rankList) { + if (score >= rank.getMinPoints()) { + if (rank.getMaxPoints() == 0 || score <= rank.getMaxPoints()) { + return rank; + } + } + } + + return null; + } + + public GameHistory getFinishedGameById(GameType gameType, int gameId) { + return this.lastPlayedGames.get(gameType).stream().filter(g -> g.getId() == gameId).findFirst().orElse(null); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/GameObject.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/GameObject.java new file mode 100644 index 0000000..06aa90c --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/GameObject.java @@ -0,0 +1,34 @@ +package org.alexdev.havana.game.games; + +import org.alexdev.havana.game.games.enums.GameObjectType; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public abstract class GameObject { + private int id; + private GameObjectType gameObjectType; + + public GameObject(int id, GameObjectType gameObjectType) { + this.id = id; + this.gameObjectType = gameObjectType; + } + + public abstract void serialiseObject(NettyResponse response); + + /** + * Get the game event type for the update loop + * + * @return the event type + */ + public GameObjectType getGameObjectType() { + return gameObjectType; + } + + /** + * Get the id of this object + * + * @return the object id + */ + public int getId() { + return id; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/GameParameter.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/GameParameter.java new file mode 100644 index 0000000..a3ddd7f --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/GameParameter.java @@ -0,0 +1,50 @@ +package org.alexdev.havana.game.games; + +public class GameParameter { + private String name; + private boolean editable; + private boolean hasMinMax; + private int min; + private int max; + private String defaultValue; + + public GameParameter(String name, boolean editable, String defaultValue, int min, int max) { + this.name = name; + this.editable = editable; + this.defaultValue = defaultValue; + this.hasMinMax = true; + this.min = min; + this.max = max; + } + + public GameParameter(String name, boolean editable, String defaultValue) { + this.name = name; + this.editable = editable; + this.defaultValue = defaultValue; + this.hasMinMax = false; + } + + public String getName() { + return name; + } + + public boolean isEditable() { + return editable; + } + + public boolean hasMinMax() { + return hasMinMax; + } + + public int getMin() { + return min; + } + + public int getMax() { + return max; + } + + public String getDefaultValue() { + return defaultValue; + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/GameSpawn.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/GameSpawn.java new file mode 100644 index 0000000..1241d19 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/GameSpawn.java @@ -0,0 +1,29 @@ +package org.alexdev.havana.game.games; + +import org.alexdev.havana.game.games.enums.GameType; +import org.alexdev.havana.game.pathfinder.Position; + +public class GameSpawn extends Position { + private int teamId; + private int mapId; + private GameType gameType; + + public GameSpawn(int teamId, int mapId, String gameType, int x, int y, int z) { + super(x, y, 0, z, z); + this.teamId = teamId; + this.mapId = mapId; + this.gameType = GameType.valueOf(gameType.toUpperCase()); + } + + public int getTeamId() { + return teamId; + } + + public int getMapId() { + return mapId; + } + + public GameType getGameType() { + return gameType; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/GameTile.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/GameTile.java new file mode 100644 index 0000000..1fa86f1 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/GameTile.java @@ -0,0 +1,39 @@ +package org.alexdev.havana.game.games; + +import org.alexdev.havana.game.pathfinder.Position; + +public abstract class GameTile { + private Position position; + private boolean isSpawnOccupied; + + public GameTile(Position position) { + this.position = position; + } + + /** + * Get the position of this tile + * + * @return the position + */ + public Position getPosition() { + return position; + } + + /** + * Set whether this tile has been used as a spawn point + * + * @return true, if successful + */ + public boolean isSpawnOccupied() { + return isSpawnOccupied; + } + + /** + * Get whether this tile has been used as a spawn point + * + * @param spawnOccupied whether the spawn is occupied for spawning a player + */ + public void setSpawnOccupied(boolean spawnOccupied) { + isSpawnOccupied = spawnOccupied; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/BattleBallGame.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/BattleBallGame.java new file mode 100644 index 0000000..139d7ec --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/BattleBallGame.java @@ -0,0 +1,460 @@ +package org.alexdev.havana.game.games.battleball; + +import org.alexdev.havana.dao.mysql.CurrencyDao; +import org.alexdev.havana.game.games.GameSpawn; +import org.alexdev.havana.game.games.*; +import org.alexdev.havana.game.games.battleball.enums.BattleBallColourState; +import org.alexdev.havana.game.games.battleball.enums.BattleBallPlayerState; +import org.alexdev.havana.game.games.battleball.enums.BattleBallPowerType; +import org.alexdev.havana.game.games.battleball.events.DespawnObjectEvent; +import org.alexdev.havana.game.games.battleball.events.PowerUpSpawnEvent; +import org.alexdev.havana.game.games.battleball.objects.PlayerObject; +import org.alexdev.havana.game.games.battleball.enums.BattleBallTileState; +import org.alexdev.havana.game.games.enums.GameType; +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.games.player.GameTeam; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.mapping.RoomTileState; +import org.alexdev.havana.util.config.GameConfiguration; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicInteger; + +public class BattleBallGame extends Game { + private BattleBallTile[][] battleballTiles; + + private BlockingQueue updateTilesQueue; + private BlockingQueue fillTilesQueue; + + private List tiles; + + private List allowedPowerUps; + private List activePowers; + + private Map> storedPowers; + private boolean spawnedInitialPowers; + + public static final int MAX_POWERS_ACTIVE = 2; + + public BattleBallGame(int id, int mapId, GameType gameType, String name, int teamAmount, Player gameCreator, List allowedPowerUps, boolean privateGame) { + super(id, mapId, gameType, name, teamAmount, gameCreator); + + this.allowedPowerUps = allowedPowerUps; + this.tiles = new ArrayList<>(); + + if (this.allowedPowerUps.size() >= 2) { + this.allowedPowerUps.add(BattleBallPowerType.QUESTION_MARK.getPowerUpId()); + } + + this.activePowers = new CopyOnWriteArrayList<>(); + this.storedPowers = new ConcurrentHashMap<>(); + + this.updateTilesQueue = new LinkedBlockingQueue<>(); + this.fillTilesQueue = new LinkedBlockingQueue<>(); + } + + @Override + public boolean hasEnoughPlayers() { + int activeTeamCount = 0; + + for (int i = 0; i < this.getTeamAmount(); i++) { + if (this.getTeams().get(i).getActivePlayers().size() > 0) { + activeTeamCount++; + } + } + + return activeTeamCount > 0; + } + + @Override + public void startGame() { + super.startGame(); + + this.updateTilesQueue.clear(); + this.fillTilesQueue.clear(); + + this.getEventsQueue().clear(); + this.getObjectsQueue().clear(); + } + + @Override + public void gamePrepare() { + super.gamePrepare(); + + // Despawn all previous powers + for (BattleBallPowerUp powerUp : this.activePowers) { + this.getEventsQueue().add(new DespawnObjectEvent(powerUp.getId())); + } + + this.spawnedInitialPowers = false; + + this.storedPowers.clear(); + this.activePowers.clear(); + + int ticketCharge = GameConfiguration.getInstance().getInteger("battleball.ticket.charge"); + + if (ticketCharge > 0) { + for (GamePlayer gamePlayer : this.getActivePlayers()) { + CurrencyDao.decreaseTickets(gamePlayer.getPlayer().getDetails(), 2); // BattleBall costs 2 tickets + } + } + } + + @Override + public void gamePrepareTick() { + if (!this.spawnedInitialPowers) { + if (MAX_POWERS_ACTIVE > 0) { + int initialPowers = ThreadLocalRandom.current().nextInt(0, MAX_POWERS_ACTIVE + 1); + + for (int i = 0; i < initialPowers; i++) { + this.checkSpawnPower(false); + } + + this.spawnedInitialPowers = true; + } + } + } + + @Override + public void gameStarted() { + + } + + @Override + public void gameTick() { + try { + this.checkExpirePower(); + this.checkSpawnPower(true); + this.checkStoredExpirePower(); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + private void checkSpawnPower(boolean doPercentCheck) { + if (this.allowedPowerUps.isEmpty() || (this.getMapId() == 5)) { + return; + } + + if (this.activePowers.size() >= MAX_POWERS_ACTIVE) { // There's already an active power so don't spawn another one + return; + } + + if (doPercentCheck) { + if (!(Math.random() < 0.06)) { + return; + } + } + + //int powersToSpawn = MAX_POWERS_ACTIVE - this.activePowers.size(); + + //for (int i = 0; i < powersToSpawn; i++) { + BattleBallPowerUp powerUp = new BattleBallPowerUp(this.createObjectId(), this, this.getRandomTile()); + this.getEventsQueue().add(new PowerUpSpawnEvent(powerUp)); + + this.activePowers.add(powerUp); + this.getObjects().add(powerUp.getObject()); + } + + + private void checkExpirePower() { + if (this.allowedPowerUps.isEmpty() || (this.getMapId() == 5)) { + return; + } + + for (BattleBallPowerUp powerUp : this.activePowers) { + if (!expirePower(powerUp)) { + continue; + } + + this.activePowers.remove(powerUp); + this.getObjects().remove(powerUp.getObject()); + } + } + + private void checkStoredExpirePower() { + for (var powers : this.storedPowers.values()) { + List expiredPowers = new ArrayList<>(); + + for (BattleBallPowerUp power : powers) { + if (expirePower(power)) { + expiredPowers.add(power); + } + } + + powers.removeAll(expiredPowers); + } + } + + private boolean expirePower(BattleBallPowerUp powerUp) { + if (powerUp.getTimeToDespawn().get() > 0) { + if (powerUp.getTimeToDespawn().decrementAndGet() != 0) { + return false; + } + } + + this.getEventsQueue().add(new DespawnObjectEvent(powerUp.getId())); + return true; + } + + @Override + public void buildMap() { + BattleBallMap tileMap = GameManager.getInstance().getBattleballTileMap(this.getMapId()); + + this.battleballTiles = new BattleBallTile[this.getRoomModel().getMapSizeX()][this.getRoomModel().getMapSizeY()]; + this.tiles.clear(); + + for (int y = 0; y < this.getRoomModel().getMapSizeY(); y++) { + for (int x = 0; x < this.getRoomModel().getMapSizeX(); x++) { + RoomTileState tileState = this.getRoomModel().getTileState(x, y); + + BattleBallTile tile = new BattleBallTile(new Position(x, y, this.getRoomModel().getTileHeight(x, y))); + + this.battleballTiles[x][y] = tile; + tile.setState(BattleBallTileState.DEFAULT); + + if (tileState == RoomTileState.CLOSED) { + tile.setColour(BattleBallColourState.DISABLED); + continue; + } + + if (!tileMap.isGameTile(x, y)) { + tile.setColour(BattleBallColourState.DISABLED); + continue; + } + + tile.setColour(BattleBallColourState.DEFAULT); + this.tiles.add(tile); + } + } + } + + /** + * Assign spawn points to all team members + */ + @Override + public void assignSpawnPoints() { + for (GameTeam team : this.getTeams().values()) { + List gameSpawns = GameManager.getInstance().getGameSpawns(this.getGameType(), this.getMapId(), team.getId()); + + //if (gameSpawn == null) { + // continue; + //} + + + for (GamePlayer p : team.getPlayers()) { + Position spawnPosition = null; + + for (GameSpawn gameSpawn : gameSpawns) { + if (!this.battleballTiles[gameSpawn.getX()][gameSpawn.getY()].isSpawnOccupied()) { + spawnPosition = gameSpawn.copy(); + spawnPosition.setZ(this.getRoomModel().getTileHeight(gameSpawn.getX(), gameSpawn.getY())); + break; + } + } + + if (spawnPosition == null || this.getTile(spawnPosition.getX(), spawnPosition.getY()) == null) { + continue; + } + + p.setPlayerState(BattleBallPlayerState.NORMAL); + p.setHarlequinPlayer(null); + p.setGameObject(new PlayerObject(p)); + + if (p.getObjectId() == -1) { + p.setObjectId(this.createObjectId()); + } + + this.getObjects().add(p.getGameObject()); + + p.getSpawnPosition().setX(spawnPosition.getX()); + p.getSpawnPosition().setY(spawnPosition.getY()); + p.getSpawnPosition().setRotation(spawnPosition.getRotation()); + p.getSpawnPosition().setZ(spawnPosition.getZ()); + + p.getPlayer().getRoomUser().setWalking(false); + p.getPlayer().getRoomUser().setNextPosition(null); + //p.getPlayer().getRoomUser().setPosition(p.getSpawnPosition().copy()); + + // Don't allow anyone to spawn on this tile + BattleBallTile tile = (BattleBallTile) this.getTile(spawnPosition.getX(), spawnPosition.getY()); + tile.setSpawnOccupied(true); + + if (tile.getColour() != BattleBallColourState.DISABLED) { + // Set spawn colour + tile.setColour(BattleBallColourState.getColourById(team.getId())); + + if (this.getMapId() == 5) { + tile.setState(BattleBallTileState.TOUCHED); + } else { + tile.setState(BattleBallTileState.CLICKED); + } + } + } + } + } + + /** + * Find a spawn with given coordinates. + * + * @param flip whether the integers should get incremented or decremented + * @param spawnX the x coord + * @param spawnY the y coord + * @param spawnRotation the spawn rotation + */ + private void findSpawn(boolean flip, AtomicInteger spawnX, AtomicInteger spawnY, AtomicInteger spawnRotation) { + try { + while (this.battleballTiles[spawnX.get()][spawnY.get()].isSpawnOccupied()) { + if (spawnRotation.get() == 0) { + if (!flip) { + spawnX.decrementAndGet();// -= 1; + } else { + spawnX.incrementAndGet();// += 1; + } + } + + if (spawnRotation.get() == 2) { + if (!flip) { + spawnY.incrementAndGet();// -= 1; + } else { + spawnY.decrementAndGet();// += 1; + } + } + + if (spawnRotation.get() == 4) { + if (!flip) { + spawnX.incrementAndGet();// -= 1; + } else { + spawnX.decrementAndGet();// += 1; + } + } + + if (spawnRotation.get() == 6) { + if (!flip) { + spawnY.decrementAndGet();// -= 1; + } else { + spawnY.incrementAndGet();// += 1; + } + } + } + flip = (!flip); + } catch (Exception ex) { + flip = (!flip); + findSpawn(flip, spawnX, spawnY, spawnRotation); + } + } + + + /** + * Get if the game still has free tiles to use. + * + * @return true, if successful + */ + @Override + public boolean canTimerContinue() { + for (int y = 0; y < this.getRoomModel().getMapSizeY(); y++) { + for (int x = 0; x < this.getRoomModel().getMapSizeX(); x++) { + BattleBallTile tile = (BattleBallTile) this.getTile(x, y); + + if (tile == null || tile.getColour() == BattleBallColourState.DISABLED) { + continue; + } + + if (tile.getState() != BattleBallTileState.SEALED) { + return true; + } + } + } + + return false; + } + + public BattleBallTile getRandomTile() { + int mapSizeX = this.getRoomModel().getMapSizeX(); + int mapSizeY = this.getRoomModel().getMapSizeY(); + + int x = ThreadLocalRandom.current().nextInt(0, mapSizeX); + int y = ThreadLocalRandom.current().nextInt(0, mapSizeY); + + BattleBallTile battleballTile = (BattleBallTile) this.getTile(x, y); + + if (battleballTile == null || battleballTile.getColour() == BattleBallColourState.DISABLED) { + return getRandomTile(); + } + + if (this.getRoom().getMapping().getTile(x, y).getEntities().size() > 0) { + return getRandomTile(); + } + + for (BattleBallPowerUp powerUp : this.activePowers) { + if (powerUp.getPosition().equals(new Position(x, y))) { + return this.getRandomTile(); + } + } + + return battleballTile; + } + + @Override + public GameTile[][] getTileMap() { + return battleballTiles; + } + + /** + * Get the power ups allowed for this match. + * + * @return the power ups allowed + */ + public List getAllowedPowerUps() { + return this.allowedPowerUps; + } + + /** + * Get the current active powers on the board + * + * @return the list of active powers + */ + public List getActivePowers() { + return activePowers; + } + + /** + * Get the list of powers stored by player + * + * @return the list of players currently held by player + */ + public Map> getStoredPowers() { + return storedPowers; + } + + /** + * Get the queue for tiles to be updated, used by power ups + * + * @return the queue for updating tiles + */ + public BlockingQueue getUpdateTilesQueue() { + return updateTilesQueue; + } + + /** + * Get the fill tiles queue, used by power ups + * + * @return the fill tiles queue + */ + public BlockingQueue getFillTilesQueue() { + return fillTilesQueue; + } + + /** + * Return the list of tiles created for the game. + * + * @return the list of tiles + */ + public List getTiles() { + return this.tiles; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/BattleBallMap.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/BattleBallMap.java new file mode 100644 index 0000000..485cf7c --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/BattleBallMap.java @@ -0,0 +1,59 @@ +package org.alexdev.havana.game.games.battleball; + +import org.alexdev.havana.game.games.enums.GameType; +import org.apache.commons.lang3.StringUtils; + +public class BattleBallMap { + private final String heightmap; + + private int mapId; + private GameType gameType; + private boolean battleballTileMap[][]; + + public BattleBallMap(int mapId, GameType gameType, String tileMap) { + this.mapId = mapId; + this.gameType = gameType; + this.heightmap = tileMap.replace("|", "\r"); + this.parse(); + } + + private void parse() { + String[] lines = this.heightmap.split("\r"); + + int mapSizeY = lines.length; + int mapSizeX = lines[0].length(); + + this.battleballTileMap = new boolean[mapSizeX][mapSizeY]; + + for (int y = 0; y < mapSizeY; y++) { + String line = lines[y]; + + for (int x = 0; x < mapSizeX; x++) { + String tile = Character.toString(line.charAt(x)); + + if (StringUtils.isNumeric(tile)) { + this.battleballTileMap[x][y] = tile.equals("1"); + } else { + this.battleballTileMap[x][y] = false; + } + + // Temporary fix for the two tiles on Sky Peak + if (mapId == 1 && ((x == 24 && y == 17) || (x == 24 && y == 18))) { + this.battleballTileMap[x][y] = true; + } + } + } + } + + public GameType getGameType() { + return gameType; + } + + public int getMapId() { + return mapId; + } + + public boolean isGameTile(int x, int y) { + return battleballTileMap[x][y]; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/BattleBallPowerUp.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/BattleBallPowerUp.java new file mode 100644 index 0000000..0813352 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/BattleBallPowerUp.java @@ -0,0 +1,260 @@ +package org.alexdev.havana.game.games.battleball; + +import org.alexdev.havana.game.games.GameEvent; +import org.alexdev.havana.game.games.GameObject; +import org.alexdev.havana.game.games.battleball.enums.BattleBallColourState; +import org.alexdev.havana.game.games.battleball.enums.BattleBallPlayerState; +import org.alexdev.havana.game.games.battleball.enums.BattleBallPowerType; +import org.alexdev.havana.game.games.battleball.enums.BattleBallTileState; +import org.alexdev.havana.game.games.battleball.events.AcquirePowerUpEvent; +import org.alexdev.havana.game.games.battleball.objects.PowerObject; +import org.alexdev.havana.game.games.battleball.objects.PowerUpUpdateObject; +import org.alexdev.havana.game.games.battleball.powerups.*; +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.games.player.GameTeam; +import org.alexdev.havana.game.games.utils.ScoreReference; +import org.alexdev.havana.game.games.utils.TileUtil; +import org.alexdev.havana.game.pathfinder.Position; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.atomic.AtomicInteger; + +public class BattleBallPowerUp { + private final int id; + private final PowerObject object; + private final AtomicInteger timeToDespawn; + private final BattleBallTile tile; + private final Position position; + private final BattleBallGame game; + + private GamePlayer playerHolding; + private BattleBallPowerType powerType; + + public BattleBallPowerUp(int id, BattleBallGame game, BattleBallTile tile) { + this.id = id; + this.object = new PowerObject(this); + this.tile = tile; + this.game = game; + this.position = this.tile.getPosition().copy(); + this.timeToDespawn = new AtomicInteger(ThreadLocalRandom.current().nextInt(20, 30 + 1)); + this.powerType = BattleBallPowerType.getById(game.getAllowedPowerUps().get(ThreadLocalRandom.current().nextInt(0, game.getAllowedPowerUps().size()))); + } + + /** + * Called when a player decides to use the power they have collected + * + * @param gamePlayer the game player that uses it + * @param position the position that the power up should be used at + */ + public void usePower(GamePlayer gamePlayer, Position position) { + if (this.powerType == BattleBallPowerType.BOX_OF_PINS) { + NailBoxHandle.handle(this.game, gamePlayer, game.getRoom()); + } + + if (this.powerType == BattleBallPowerType.FLASHLIGHT) { + TorchHandle.handle(this.game, gamePlayer, game.getRoom()); + } + + if (this.powerType == BattleBallPowerType.LIGHT_BLUB) { + LightbulbHandle.handle(this.game, gamePlayer, game.getRoom()); + } + + if (this.powerType == BattleBallPowerType.DRILL) { + VacuumHandle.handle(this.game, gamePlayer, game.getRoom()); + } + + if (this.powerType == BattleBallPowerType.SPRING) { + SpringHandle.handle(this.game, gamePlayer, game.getRoom()); + } + + if (this.powerType == BattleBallPowerType.HARLEQUIN) { + HarlequinHandle.handle(this.game, gamePlayer, game.getRoom()); + } + + if (this.powerType == BattleBallPowerType.CANNON) { + CannonHandle.handle(this.game, gamePlayer, game.getRoom()); + } + + if (this.powerType == BattleBallPowerType.BOMB) { + BombHandle.handle(this.game, gamePlayer, game.getRoom()); + } + } + + /** + * Get whether the user has bounced and uses a tile (used for vacuum and spring powers) + * + * @param tile the tile being bounced on + * @param gamePlayer the game player bouncing on the tile + * @param updateTiles the list of tiles to update + * @param updateFillTiles the fill tile list to append + * + * @return true, if successful + */ + public static boolean hasUsedPower(BattleBallTile tile, GamePlayer gamePlayer, List updateTiles, List updateFillTiles) { + BattleBallColourState colour = tile.getColour(); + BattleBallTileState state = tile.getState(); + + if (colour == BattleBallColourState.DISABLED) { + return false; + } + + GameTeam team = gamePlayer.getTeam(); + + if (gamePlayer.getPlayerState() == BattleBallPlayerState.HIGH_JUMPS) { + if (state == BattleBallTileState.SEALED) { + return true; + } + + tile.getPointsReferece().clear(); + + tile.setColour(BattleBallColourState.getColourById(gamePlayer.getTeam().getId())); + tile.setState(BattleBallTileState.SEALED); + + //tile.(team); + tile.getNewPoints(gamePlayer, BattleBallTileState.SEALED, BattleBallColourState.getColourById(gamePlayer.getTeam().getId()));//.addScore(new ScoreReference(14, team, gamePlayer.getUserId())); + tile.checkFill(gamePlayer, updateFillTiles); + + updateTiles.add(tile); + return true; + } + + if (gamePlayer.getPlayerState() == BattleBallPlayerState.CLEANING_TILES) { + if (TileUtil.undoTileAttributes(tile, gamePlayer.getGame())) { + updateTiles.add(tile); + + } + return true; + } + + return false; + } + + /** + * Get whether the user has walked into a power up. + * + * @param tile the tile being bounced on + * @param gamePlayer the game player bouncing on the tile + * @param objects the list of objects to update for the next loop + * @param events the list of events to update for the next loop + */ + public static void checkPowerUp(BattleBallTile tile, GamePlayer gamePlayer, List objects, List events) { + BattleBallGame game = (BattleBallGame) gamePlayer.getGame(); + BattleBallPowerUp powerUp = null; + + for (BattleBallPowerUp power : game.getActivePowers()) { + if (power.getTile().getPosition().equals(tile.getPosition())) { + powerUp = power; + break; + } + } + + if (powerUp == null) { + return; + } + + if (!game.getStoredPowers().containsKey(gamePlayer)) { + game.getStoredPowers().put(gamePlayer, new CopyOnWriteArrayList<>()); + } + + + // Select random power up if it's a question mark + if (powerUp.getPowerType() == BattleBallPowerType.QUESTION_MARK) { + // Create a new list without the question mark + List powerUps = new ArrayList<>(game.getAllowedPowerUps()); + powerUps.remove(BattleBallPowerType.QUESTION_MARK.getPowerUpId()); + + powerUp.setPowerType(BattleBallPowerType.getById(powerUps.get(ThreadLocalRandom.current().nextInt(0, powerUps.size())))); + + } + + game.getStoredPowers().get(gamePlayer).clear(); + game.getStoredPowers().get(gamePlayer).add(powerUp); + + game.getActivePowers().remove(powerUp); + game.getObjects().remove(powerUp.getObject()); + + powerUp.getTimeToDespawn().set(15); + powerUp.setPlayerHolding(gamePlayer); + + events.add(new AcquirePowerUpEvent(gamePlayer, powerUp)); + objects.add(new PowerUpUpdateObject(powerUp)); + } + + + /** + * Get the game id of this power up + * @return the game id + */ + public int getId() { + return id; + } + + /** + * Get the power up type of this instance + * + * @return the power up type + */ + public BattleBallPowerType getPowerType() { + return powerType; + } + + public void setPowerType(BattleBallPowerType powerType) { + this.powerType = powerType; + } + + /** + * Get the current position of where this power up spawned + * + * @return the current position + */ + public Position getPosition() { + return this.position; + } + + /** + * Get the tile were this power up spawned on + * + * @return the tile it spawned on + */ + public BattleBallTile getTile() { + return tile; + } + + /** + * Get the time in seconds before it despawns + * + * @return the time before it despawns + */ + public AtomicInteger getTimeToDespawn() { + return timeToDespawn; + } + + /** + * Set the current player holding this power up + * + * @param playerHolding the player holding the power up + */ + public void setPlayerHolding(GamePlayer playerHolding) { + this.playerHolding = playerHolding; + } + + /** + * Get the current player id holding this power up, -1 if none + * + * @return the player id holding this power up + */ + public Integer getPlayerHolding() { + if (this.playerHolding != null) { + return this.playerHolding.getObjectId(); + } + + return -1; + } + + public GameObject getObject() { + return object; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/BattleBallTask.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/BattleBallTask.java new file mode 100644 index 0000000..163a02e --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/BattleBallTask.java @@ -0,0 +1,179 @@ +package org.alexdev.havana.game.games.battleball; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.games.Game; +import org.alexdev.havana.game.games.GameEvent; +import org.alexdev.havana.game.games.GameObject; +import org.alexdev.havana.game.games.battleball.enums.BattleBallPlayerState; +import org.alexdev.havana.game.games.battleball.events.PlayerMoveEvent; +import org.alexdev.havana.game.games.battleball.objects.PlayerUpdateObject; +import org.alexdev.havana.game.games.battleball.objects.PowerUpUpdateObject; +import org.alexdev.havana.game.games.enums.GameState; +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.pathfinder.Rotation; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.entities.RoomEntity; +import org.alexdev.havana.game.room.enums.StatusType; +import org.alexdev.havana.game.room.mapping.RoomTile; +import org.alexdev.havana.log.Log; +import org.alexdev.havana.messages.outgoing.games.GAMESTATUS; +import org.alexdev.havana.util.StringUtil; + +import java.util.ArrayList; +import java.util.List; + +public class BattleBallTask implements Runnable { + private final Room room; + private final BattleBallGame game; + + public BattleBallTask(Room room, BattleBallGame game) { + this.room = room; + this.game = game; + } + + @Override + public void run() { + try { + if (this.game.getActivePlayers().isEmpty() || this.game.getGameState() == GameState.ENDED) { + return; // Don't send any packets or do any logic checks during when the game is finished + } + + List objects = new ArrayList<>(); + List events = new ArrayList<>(); + + List updateTiles = new ArrayList<>(); + List fillTiles = new ArrayList<>(); + + this.game.getEventsQueue().drainTo(events); + this.game.getObjectsQueue().drainTo(objects); + this.game.getUpdateTilesQueue().drainTo(updateTiles); + this.game.getFillTilesQueue().drainTo(fillTiles); + + for (GamePlayer gamePlayer : this.game.getActivePlayers()) { + Player player = gamePlayer.getPlayer(); + + if (player.getRoomUser().getRoom() != this.room) { + continue; + } + + if (gamePlayer.getPlayerState() == BattleBallPlayerState.CLIMBING_INTO_CANNON || + gamePlayer.getPlayerState() == BattleBallPlayerState.FLYING_THROUGH_AIR) { + continue; + } + + if (this.game.getStoredPowers().containsKey(gamePlayer)) { + for (BattleBallPowerUp powerUp : this.game.getStoredPowers().get(gamePlayer)) { + objects.add(new PowerUpUpdateObject(powerUp)); + } + } + + player.getRoomUser().handleSpamTicks(); + this.processEntity(gamePlayer, objects, events, updateTiles, fillTiles); + + objects.add(new PlayerUpdateObject(gamePlayer)); + } + + this.game.send(new GAMESTATUS(this.game, this.game.getTeams().values(), objects, events, updateTiles, fillTiles)); + } catch (Exception ex) { + Log.getErrorLogger().error("GameTask crashed: ", ex); + } + } + + /** + * Process entity. + */ + private void processEntity(GamePlayer gamePlayer, List objects, List events, List updateTiles, List fillTiles) { + Entity entity = (Entity) gamePlayer.getPlayer(); + Game game = gamePlayer.getGame(); + + RoomEntity roomEntity = entity.getRoomUser(); + + Position position = roomEntity.getPosition(); + Position goal = roomEntity.getGoal(); + + if (roomEntity.isWalking()) { + // Apply next tile from the tile we removed from the list the cycle before + if (roomEntity.getNextPosition() != null) { + /*roomEntity.getPosition().setX(roomEntity.getNextPosition().getX()); + roomEntity.getPosition().setY(roomEntity.getNextPosition().getY()); + roomEntity.updateNewHeight(roomEntity.getPosition());*/ + /*RoomTile nextTile = roomEntity.getRoom().getMapping().getTile(roomEntity.getNextPosition()); + boolean isRedirected = false; + if (nextTile.getEntities().size() > 0 && !nextTile.containsEntity(entity)) { + roomEntity.setNextPosition(roomEntity.getPosition().copy()); + isRedirected = true; + }*/ + + roomEntity.getPosition().setX(roomEntity.getNextPosition().getX()); + roomEntity.getPosition().setY(roomEntity.getNextPosition().getY()); + roomEntity.updateNewHeight(roomEntity.getPosition()); + + if (roomEntity.getNextPosition() != null) { + RoomTile nextTile = roomEntity.getRoom().getMapping().getTile(roomEntity.getNextPosition()); + + if (nextTile != null && nextTile.getOtherEntities(entity).size() < 1) { + BattleBallTile tile = (BattleBallTile) game.getTile(roomEntity.getNextPosition().getX(), roomEntity.getNextPosition().getY()); + + if (tile != null) { + tile.interact(gamePlayer, objects, events, updateTiles, fillTiles); + } + } + } + } + + // We still have more tiles left, so lets continue moving + if (roomEntity.getPath().size() > 0) { + Position next = roomEntity.getPath().pop(); + + RoomTile previousTile = roomEntity.getTile(); + RoomTile nextTile = roomEntity.getRoom().getMapping().getTile(next); + + // Tile was invalid after we started walking, so lets try again! + if (nextTile == null || !RoomTile.isValidTile(this.room, entity, next) && !next.equals(goal)) { + entity.getRoomUser().getPath().clear(); + roomEntity.walkTo(goal.getX(), goal.getY()); + this.processEntity(gamePlayer, objects, events, updateTiles, fillTiles); + return; + } + + if (previousTile != null) { + previousTile.removeEntity(entity); + } + + nextTile.addEntity(entity); + + roomEntity.removeStatus(StatusType.LAY); + roomEntity.removeStatus(StatusType.SIT); + + int rotation = Rotation.calculateWalkDirection(position.getX(), position.getY(), next.getX(), next.getY()); + double height = nextTile.getWalkingHeight(); + + roomEntity.getPosition().setRotation(rotation); + roomEntity.setStatus(StatusType.MOVE, next.getX() + "," + next.getY() + "," + StringUtil.format(height)); + roomEntity.setNextPosition(next); + + // Add next position if moving + events.add(new PlayerMoveEvent(gamePlayer, roomEntity.getNextPosition().copy())); + } else { + roomEntity.stopWalking(); + + RoomTile previousTile = roomEntity.getRoom().getMapping().getTile(roomEntity.getPosition()); + RoomTile nextTile = roomEntity.getRoom().getMapping().getTile(roomEntity.getPosition().getSquareBehind()); + + // If an entity exists on the tile, push them back + if (previousTile != null && !(previousTile.getOtherEntities(entity).size() < 1)) { + previousTile.removeEntity(entity); + nextTile.addEntity(entity); + + // Set new position + entity.getRoomUser().setPosition(roomEntity.getPosition().getSquareBehind()); + } + } + + // If we're walking, make sure to tell the server + roomEntity.setNeedsUpdate(true); + } + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/BattleBallTile.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/BattleBallTile.java new file mode 100644 index 0000000..315d7a3 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/BattleBallTile.java @@ -0,0 +1,256 @@ +package org.alexdev.havana.game.games.battleball; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.games.Game; +import org.alexdev.havana.game.games.GameEvent; +import org.alexdev.havana.game.games.GameObject; +import org.alexdev.havana.game.games.GameTile; +import org.alexdev.havana.game.games.battleball.enums.BattleBallColourState; +import org.alexdev.havana.game.games.battleball.enums.BattleBallTileState; +import org.alexdev.havana.game.games.battleball.powerups.NailBoxHandle; +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.games.player.GameTeam; +import org.alexdev.havana.game.games.utils.FloodFill; +import org.alexdev.havana.game.games.utils.ScoreReference; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.mapping.RoomTile; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +public class BattleBallTile extends GameTile { + private BattleBallColourState colour; + private BattleBallTileState state; + + private CopyOnWriteArrayList pointsReferece; + + public BattleBallTile(Position position) { + super(position); + this.pointsReferece = new CopyOnWriteArrayList<>(); + } + + public List getPlayers(Game game, Position position) { + RoomTile tile = game.getRoom().getMapping().getTile(position.getX(), position.getY()); + List gamePlayers = new ArrayList<>(); + + for (Entity entity : tile.getEntities()) { + if (entity.getType() != EntityType.PLAYER/* || entity.getDetails().getId()== gamePlayer.getUserId()*/) { + continue; + } + + Player player = (Player) entity; + GamePlayer gameUser = player.getRoomUser().getGamePlayer(); + + if (gameUser == null) { + continue; + } + + if (gamePlayers.contains(gameUser)) { + continue; + } + + if (!player.getRoomUser().getPosition().equals(this.getPosition())) { + continue; + } + + gamePlayers.add(gameUser); + } + + return gamePlayers; + } + + /** + * Handle when a player jumps on a Battleball tile. + * @param gamePlayer the GamePlayer instance of the user jumping on the tile + * @param objects + * @param updateTiles the tile list to add to if the tile requires an update + * @param updateFillTiles the list to add to if these tiles require the filling in animation + */ + public void interact(GamePlayer gamePlayer, List objects, List events, List updateTiles, List updateFillTiles) { + BattleBallPowerUp.checkPowerUp(this, gamePlayer, objects, events); + + if (NailBoxHandle.checkNailTile(gamePlayer)) { + return; + } + + if (BattleBallPowerUp.hasUsedPower(this, gamePlayer, updateTiles, updateFillTiles)) { + return; + } + + this.changeState(gamePlayer, updateTiles, updateFillTiles); + } + + private void changeState(GamePlayer gamePlayer, List updateTiles, List updateFillTiles) { + if (this.getColour() == BattleBallColourState.DISABLED) { + return; + } + + BattleBallTileState state = this.getState(); + BattleBallColourState colour = this.getColour(); + + GameTeam team = gamePlayer.getTeam(); + + if (colour == BattleBallColourState.DISABLED) { + return; + } + + if (state != BattleBallTileState.SEALED) { + BattleBallTileState newState = this.getState(); + BattleBallColourState newColour = this.getColour(); + + if (colour.getColourId() == team.getId()) { + newState = BattleBallTileState.getStateById(state.getTileStateId() + 1); + } else { + if (gamePlayer.getGame().getMapId() == 5) { // Barebones classic takes 4 hits + newState = BattleBallTileState.TOUCHED; + newColour = BattleBallColourState.getColourById(team.getId()); + } else { + newState = BattleBallTileState.CLICKED; + newColour = BattleBallColourState.getColourById(team.getId()); + } + } + + this.getNewPoints(gamePlayer, newState, newColour); + + this.setColour(newColour); + this.setState(newState); + + if (newState == BattleBallTileState.SEALED) { + this.checkFill(gamePlayer, updateFillTiles); + } + + updateTiles.add(this); + } + } + + public void getNewPoints(GamePlayer gamePlayer, BattleBallTileState newState, BattleBallColourState newColour) { + GameTeam team = gamePlayer.getTeam(); + + int newPoints = -1; + //boolean sealed = false; + + if (newState == BattleBallTileState.TOUCHED) { + newPoints = 2; + } else if (newState == BattleBallTileState.CLICKED) { + newPoints = 6; + } else if (newState == BattleBallTileState.PRESSED) { + newPoints = 10; + } else if (newState == BattleBallTileState.SEALED) { + if (this.colour == newColour) { + newPoints = 14; + //sealed = true; + } + } + + // If the user stole the tile, add the points! + if (this.colour != newColour && this.colour != BattleBallColourState.DEFAULT) { + newPoints += 2; + } + + if (this.colour != newColour) { // Clear teams previous scores + this.pointsReferece.removeIf(tile -> tile.getGameTeam() != team); + } + + if (newPoints != -1) { + //if (!sealed) { // Set to sealed + if (gamePlayer.getHarlequinPlayer() != null) { + this.pointsReferece.add(new ScoreReference(newPoints, team, gamePlayer.getHarlequinPlayer().getUserId())); + } else { + this.pointsReferece.add(new ScoreReference(newPoints, team, gamePlayer.getUserId())); + } + //} else { + // this.pointsReferece.add(team); + //} + } + } + + + public void checkFill(GamePlayer gamePlayer, Collection updateFillTiles) { + GameTeam team = gamePlayer.getTeam(); + + for (BattleBallTile neighbour : FloodFill.neighbours(gamePlayer.getGame(), this.getPosition())) { + if (neighbour == null || neighbour.getState() == BattleBallTileState.SEALED || neighbour.getColour() == BattleBallColourState.DISABLED) { + continue; + } + + var fillTiles = FloodFill.getFill(gamePlayer, neighbour); + + if (fillTiles.size() > 0) { + for (BattleBallTile filledTile : FloodFill.getFill(gamePlayer, neighbour)) { + if (filledTile.getState() == BattleBallTileState.SEALED) { + continue; + } + + /*if (!filledTile.isCanFill()) { + continue; + }*/ + + //this.addSealedPoints(team); + + filledTile.setColour(this.getColour()); + filledTile.setState(BattleBallTileState.SEALED); + + updateFillTiles.add(filledTile); + } + } + } + } + + /* + public void addSealedPoints(GameTeam team) { + this.pointsReferece.clear(); + + for (GamePlayer gamePlayer : team.getPlayers()) { + this.pointsReferece.add(new ScoreReference(14, team, gamePlayer.getUserId())); + } + }*/ + + /** + * Get the current colour of this tile + * + * @return the colour + */ + public BattleBallColourState getColour() { + return colour; + } + + /** + * Set the current colour of this tile + * + * @param colour the current colour + */ + public void setColour(BattleBallColourState colour) { + this.colour = colour; + } + + /** + * Get the current state of this tile + * + * @return the state + */ + public BattleBallTileState getState() { + return state; + } + + /** + * Set the current state of this tile + * + * @param state the current colour + */ + public void setState(BattleBallTileState state) { + this.state = state; + } + + /** + * Get the list of points to reference. + * + * @return the list of points to reference + */ + public CopyOnWriteArrayList getPointsReferece() { + return pointsReferece; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/enums/BattleBallColourState.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/enums/BattleBallColourState.java new file mode 100644 index 0000000..95c5884 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/enums/BattleBallColourState.java @@ -0,0 +1,30 @@ +package org.alexdev.havana.game.games.battleball.enums; + +public enum BattleBallColourState { + DISABLED(-2), + DEFAULT(-1), + RED(0), + BLUE(1), + YELLOW(2), + GREEN(3); + + private final int tileColourId; + + BattleBallColourState(int tileColourId) { + this.tileColourId = tileColourId; + } + + public int getColourId() { + return tileColourId; + } + + public static BattleBallColourState getColourById(int id) { + for (BattleBallColourState colour : values()) { + if (colour.getColourId() == id) { + return colour; + } + } + + return null; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/enums/BattleBallPlayerState.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/enums/BattleBallPlayerState.java new file mode 100644 index 0000000..a1e2665 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/enums/BattleBallPlayerState.java @@ -0,0 +1,33 @@ +package org.alexdev.havana.game.games.battleball.enums; + +public enum BattleBallPlayerState { + NORMAL(0), + STUNNED(1), + TURBO_BOOST(2), + HIGH_JUMPS(3), + CLEANING_TILES(4), + COLORING_FOR_OPPONENT(5), + CLIMBING_INTO_CANNON(6), + FLYING_THROUGH_AIR(7), + BALL_BROKEN(8); + + /* STATE_NORMAL = 0 + STATE_STUNNED = 1 + STATE_TURBO_BOOST = 2 + STATE_HIGH_JUMPS = 3 + STATE_CLEANING_TILES = 4 + STATE_COLORING_FOR_OPPONENT = 5 + STATE_CLIMBING_INTO_CANNON = 6 + STATE_FLYING_THROUGH_AIR = 7 + STATE_BALL_BROKEN = 8 */ + + private final int stateId; + + BattleBallPlayerState(int stateId) { + this.stateId = stateId; + } + + public int getStateId() { + return stateId; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/enums/BattleBallPowerType.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/enums/BattleBallPowerType.java new file mode 100644 index 0000000..3a47cec --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/enums/BattleBallPowerType.java @@ -0,0 +1,39 @@ +package org.alexdev.havana.game.games.battleball.enums; + +import java.util.concurrent.ThreadLocalRandom; + +public enum BattleBallPowerType { + LIGHT_BLUB(1), + SPRING(2), + FLASHLIGHT(3), + CANNON(4), + BOX_OF_PINS(5), + HARLEQUIN(6), + BOMB(7), + DRILL(8), + QUESTION_MARK(9); + + private final int powerUpId; + + BattleBallPowerType(int powerUpId) { + this.powerUpId = powerUpId; + } + + public static BattleBallPowerType random() { + return BattleBallPowerType.values()[ThreadLocalRandom.current().nextInt(0, BattleBallPowerType.values().length)]; + } + + public static BattleBallPowerType getById(int powerUpId) { + for (var powerUp : values()) { + if (powerUp.getPowerUpId() == powerUpId) { + return powerUp; + } + } + + return null; + } + + public Integer getPowerUpId() { + return powerUpId; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/enums/BattleBallTileState.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/enums/BattleBallTileState.java new file mode 100644 index 0000000..c5b02fa --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/enums/BattleBallTileState.java @@ -0,0 +1,29 @@ +package org.alexdev.havana.game.games.battleball.enums; + +public enum BattleBallTileState { + DEFAULT(0), + TOUCHED(1), + CLICKED(2), + PRESSED(3), + SEALED(4);// = 1, CLICKED = 2, PRESSED = 3, SEALED = 4 + + private final int tileStateId; + + BattleBallTileState(int tileStateId) { + this.tileStateId = tileStateId; + } + + public int getTileStateId() { + return tileStateId; + } + + public static BattleBallTileState getStateById(int id) { + for (BattleBallTileState state : values()) { + if (state.getTileStateId() == id) { + return state; + } + } + + return null; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/events/AcquirePowerUpEvent.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/events/AcquirePowerUpEvent.java new file mode 100644 index 0000000..6962884 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/events/AcquirePowerUpEvent.java @@ -0,0 +1,25 @@ +package org.alexdev.havana.game.games.battleball.events; + +import org.alexdev.havana.game.games.GameEvent; +import org.alexdev.havana.game.games.battleball.BattleBallPowerUp; +import org.alexdev.havana.game.games.enums.GameEventType; +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class AcquirePowerUpEvent extends GameEvent { + private final BattleBallPowerUp powerUp; + private final GamePlayer gamePlayer; + + public AcquirePowerUpEvent(GamePlayer gamePlayer, BattleBallPowerUp powerUp) { + super(GameEventType.BATTLEBALL_POWERUP_GET); + this.gamePlayer = gamePlayer; + this.powerUp = powerUp; + } + + @Override + public void serialiseEvent(NettyResponse response) { + response.writeInt(this.gamePlayer.getObjectId()); + response.writeInt(this.powerUp.getId()); + response.writeInt(this.powerUp.getPowerType().getPowerUpId()); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/events/ActivatePowerUpEvent.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/events/ActivatePowerUpEvent.java new file mode 100644 index 0000000..2d29e58 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/events/ActivatePowerUpEvent.java @@ -0,0 +1,26 @@ +package org.alexdev.havana.game.games.battleball.events; + +import org.alexdev.havana.game.games.GameEvent; +import org.alexdev.havana.game.games.battleball.BattleBallPowerUp; +import org.alexdev.havana.game.games.enums.GameEventType; +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class ActivatePowerUpEvent extends GameEvent { + private final BattleBallPowerUp powerUp; + private final GamePlayer gamePlayer; + + public ActivatePowerUpEvent(GamePlayer gamePlayer, BattleBallPowerUp powerUp) { + super(GameEventType.BATTLEBALL_POWERUP_ACTIVATE); + this.gamePlayer = gamePlayer; + this.powerUp = powerUp; + } + + @Override + public void serialiseEvent(NettyResponse response) { + response.writeInt(this.gamePlayer.getObjectId()); + response.writeInt(this.powerUp.getId()); + response.writeInt(this.gamePlayer.getPlayer().getRoomUser().getPosition().getRotation()); + response.writeInt(this.powerUp.getPowerType().getPowerUpId()); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/events/DespawnObjectEvent.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/events/DespawnObjectEvent.java new file mode 100644 index 0000000..cb8a16f --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/events/DespawnObjectEvent.java @@ -0,0 +1,19 @@ +package org.alexdev.havana.game.games.battleball.events; + +import org.alexdev.havana.game.games.GameEvent; +import org.alexdev.havana.game.games.enums.GameEventType; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class DespawnObjectEvent extends GameEvent { + private final int gameObjectId; + + public DespawnObjectEvent(int gameObjectId) { + super(GameEventType.BATTLEBALL_DESPAWN_OBJECT); + this.gameObjectId = gameObjectId; + } + + @Override + public void serialiseEvent(NettyResponse response) { + response.writeInt(this.gameObjectId); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/events/PinSpawnEvent.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/events/PinSpawnEvent.java new file mode 100644 index 0000000..fead7b8 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/events/PinSpawnEvent.java @@ -0,0 +1,24 @@ +package org.alexdev.havana.game.games.battleball.events; + +import org.alexdev.havana.game.games.GameEvent; +import org.alexdev.havana.game.games.battleball.objects.PinObject; +import org.alexdev.havana.game.games.enums.GameEventType; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class PinSpawnEvent extends GameEvent { + private final int id; + private final Position position; + + public PinSpawnEvent(int id, Position position) { + super(GameEventType.BATTLEBALL_OBJECT_SPAWN); + this.id = id; + this.position = position; + } + + @Override + public void serialiseEvent(NettyResponse response) { + response.writeInt(2); + new PinObject(this.id, this.position).serialiseObject(response); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/events/PlayerMoveEvent.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/events/PlayerMoveEvent.java new file mode 100644 index 0000000..d214610 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/events/PlayerMoveEvent.java @@ -0,0 +1,29 @@ +package org.alexdev.havana.game.games.battleball.events; + +import org.alexdev.havana.game.games.GameEvent; +import org.alexdev.havana.game.games.enums.GameEventType; +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class PlayerMoveEvent extends GameEvent { + private final GamePlayer gamePlayer; + private final Position nextPosition; + + public PlayerMoveEvent(GamePlayer gamePlayer, Position nextPosition) { + super(GameEventType.BATTLEBALL_PLAYER_EVENT); + this.gamePlayer = gamePlayer; + this.nextPosition = nextPosition; + } + + @Override + public void serialiseEvent(NettyResponse response) { + response.writeInt(this.gamePlayer.getPlayer().getRoomUser().getInstanceId()); + response.writeInt(this.nextPosition.getX()); + response.writeInt(this.nextPosition.getY()); + } + + public GamePlayer getGamePlayer() { + return gamePlayer; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/events/PlayerUpdateEvent.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/events/PlayerUpdateEvent.java new file mode 100644 index 0000000..7703786 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/events/PlayerUpdateEvent.java @@ -0,0 +1,22 @@ +package org.alexdev.havana.game.games.battleball.events; + +import org.alexdev.havana.game.games.GameEvent; +import org.alexdev.havana.game.games.battleball.objects.PlayerUpdateObject; +import org.alexdev.havana.game.games.enums.GameEventType; +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class PlayerUpdateEvent extends GameEvent { + private final GamePlayer gamePlayer; + + public PlayerUpdateEvent(GamePlayer gamePlayer) { + super(GameEventType.BATTLEBALL_OBJECT_SPAWN); + this.gamePlayer = gamePlayer; + } + + @Override + public void serialiseEvent(NettyResponse response) { + response.writeInt(0); + new PlayerUpdateObject(this.gamePlayer).serialiseObject(response); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/events/PowerUpSpawnEvent.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/events/PowerUpSpawnEvent.java new file mode 100644 index 0000000..6e0f857 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/events/PowerUpSpawnEvent.java @@ -0,0 +1,22 @@ +package org.alexdev.havana.game.games.battleball.events; + +import org.alexdev.havana.game.games.GameEvent; +import org.alexdev.havana.game.games.battleball.BattleBallPowerUp; +import org.alexdev.havana.game.games.battleball.objects.PowerObject; +import org.alexdev.havana.game.games.enums.GameEventType; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class PowerUpSpawnEvent extends GameEvent { + private final BattleBallPowerUp powerUp; + + public PowerUpSpawnEvent(BattleBallPowerUp powerUp) { + super(GameEventType.BATTLEBALL_OBJECT_SPAWN); + this.powerUp = powerUp; + } + + @Override + public void serialiseEvent(NettyResponse response) { + response.writeInt(1); + new PowerObject(this.powerUp).serialiseObject(response); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/objects/PinObject.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/objects/PinObject.java new file mode 100644 index 0000000..e66bcc8 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/objects/PinObject.java @@ -0,0 +1,27 @@ +package org.alexdev.havana.game.games.battleball.objects; + +import org.alexdev.havana.game.games.GameObject; +import org.alexdev.havana.game.games.enums.GameObjectType; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class PinObject extends GameObject { + private final Position position; + + public PinObject(int id, Position position) { + super(id, GameObjectType.BATTLEBALL_PIN_OBJECT); + this.position = position; + } + + @Override + public void serialiseObject(NettyResponse response) { + response.writeInt(this.getId()); + response.writeInt(this.position.getX()); + response.writeInt(this.position.getY()); + response.writeInt((int) this.position.getZ()); + } + + public Position getPosition() { + return position; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/objects/PlayerObject.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/objects/PlayerObject.java new file mode 100644 index 0000000..381c28f --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/objects/PlayerObject.java @@ -0,0 +1,32 @@ +package org.alexdev.havana.game.games.battleball.objects; + +import org.alexdev.havana.game.games.GameObject; +import org.alexdev.havana.game.games.enums.GameObjectType; +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class PlayerObject extends GameObject { + private final GamePlayer gamePlayer; + + public PlayerObject(GamePlayer gamePlayer) { + super(gamePlayer.getObjectId(), GameObjectType.BATTLEBALL_PLAYER_OBJECT); + this.gamePlayer = gamePlayer; + } + + @Override + public void serialiseObject(NettyResponse response) { + response.writeInt(this.gamePlayer.getObjectId()); + response.writeInt(this.gamePlayer.getPlayer().getRoomUser().getPosition().getX()); + response.writeInt(this.gamePlayer.getPlayer().getRoomUser().getPosition().getY()); + response.writeInt((int) this.gamePlayer.getPlayer().getRoomUser().getPosition().getZ()); + response.writeInt(this.gamePlayer.getPlayer().getRoomUser().getPosition().getRotation()); + response.writeInt(this.gamePlayer.getPlayerState().getStateId()); + response.writeInt(this.gamePlayer.getColouringForOpponentId()); + response.writeString(this.gamePlayer.getPlayer().getDetails().getName()); + response.writeString(this.gamePlayer.getPlayer().getDetails().getMotto()); + response.writeString(this.gamePlayer.getPlayer().getDetails().getFigure()); + response.writeString(this.gamePlayer.getPlayer().getDetails().getSex()); + response.writeInt(this.gamePlayer.getTeamId()); + response.writeInt(this.gamePlayer.getObjectId()); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/objects/PlayerUpdateObject.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/objects/PlayerUpdateObject.java new file mode 100644 index 0000000..0ad3f08 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/objects/PlayerUpdateObject.java @@ -0,0 +1,26 @@ +package org.alexdev.havana.game.games.battleball.objects; + +import org.alexdev.havana.game.games.GameObject; +import org.alexdev.havana.game.games.enums.GameObjectType; +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class PlayerUpdateObject extends GameObject { + private final GamePlayer gamePlayer; + + public PlayerUpdateObject(GamePlayer gamePlayer) { + super(gamePlayer.getPlayer().getDetails().getId(), GameObjectType.BATTLEBALL_PLAYER_OBJECT); + this.gamePlayer = gamePlayer; + } + + @Override + public void serialiseObject(NettyResponse response) { + response.writeInt(this.gamePlayer.getObjectId()); + response.writeInt(this.gamePlayer.getPlayer().getRoomUser().getPosition().getX()); + response.writeInt(this.gamePlayer.getPlayer().getRoomUser().getPosition().getY()); + response.writeInt((int) this.gamePlayer.getPlayer().getRoomUser().getPosition().getZ()); + response.writeInt(this.gamePlayer.getPlayer().getRoomUser().getPosition().getRotation()); + response.writeInt(this.gamePlayer.getPlayerState().getStateId()); + response.writeInt(this.gamePlayer.getColouringForOpponentId()); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/objects/PowerObject.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/objects/PowerObject.java new file mode 100644 index 0000000..0512e42 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/objects/PowerObject.java @@ -0,0 +1,26 @@ +package org.alexdev.havana.game.games.battleball.objects; + +import org.alexdev.havana.game.games.GameObject; +import org.alexdev.havana.game.games.battleball.BattleBallPowerUp; +import org.alexdev.havana.game.games.enums.GameObjectType; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class PowerObject extends GameObject { + private final BattleBallPowerUp powerUp; + + public PowerObject(BattleBallPowerUp powerUp) { + super(powerUp.getId(), GameObjectType.BATTLEBALL_POWER_OBJECT); + this.powerUp = powerUp; + } + + @Override + public void serialiseObject(NettyResponse response) { + response.writeInt(this.powerUp.getId()); + response.writeInt(this.powerUp.getTimeToDespawn().get()); + response.writeInt(this.powerUp.getPlayerHolding()); + response.writeInt(this.powerUp.getPowerType().getPowerUpId()); + response.writeInt(this.powerUp.getTile().getPosition().getX()); + response.writeInt(this.powerUp.getTile().getPosition().getY()); + response.writeInt((int) this.powerUp.getTile().getPosition().getZ()); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/objects/PowerUpUpdateObject.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/objects/PowerUpUpdateObject.java new file mode 100644 index 0000000..ba9ee9e --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/objects/PowerUpUpdateObject.java @@ -0,0 +1,22 @@ +package org.alexdev.havana.game.games.battleball.objects; + +import org.alexdev.havana.game.games.GameObject; +import org.alexdev.havana.game.games.battleball.BattleBallPowerUp; +import org.alexdev.havana.game.games.enums.GameObjectType; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class PowerUpUpdateObject extends GameObject { + private final BattleBallPowerUp powerUp; + + public PowerUpUpdateObject(BattleBallPowerUp powerUp) { + super(powerUp.getId(), GameObjectType.BATTLEBALL_POWER_OBJECT); + this.powerUp = powerUp; + } + + @Override + public void serialiseObject(NettyResponse response) { + response.writeInt(this.powerUp.getId()); + response.writeInt(this.powerUp.getTimeToDespawn().get()); + response.writeInt(this.powerUp.getPlayerHolding()); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/powerups/BombHandle.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/powerups/BombHandle.java new file mode 100644 index 0000000..2c1bfaf --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/powerups/BombHandle.java @@ -0,0 +1,78 @@ +package org.alexdev.havana.game.games.battleball.powerups; + +import org.alexdev.havana.game.games.battleball.BattleBallGame; +import org.alexdev.havana.game.games.battleball.BattleBallTile; +import org.alexdev.havana.game.games.battleball.enums.BattleBallPlayerState; +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.games.utils.PowerUpUtil; +import org.alexdev.havana.game.games.utils.TileUtil; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.pathfinder.Rotation; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.mapping.RoomTile; + +import java.util.ArrayList; +import java.util.List; + +public class BombHandle { + public static void handle(BattleBallGame game, GamePlayer gamePlayer, Room room) { + gamePlayer.getPlayer().getRoomUser().stopWalking(); + gamePlayer.getPlayer().getRoomUser().setWalkingAllowed(false); + + List stunnedPlayers = new ArrayList<>(); + + for (Position position : gamePlayer.getPlayer().getRoomUser().getPosition().getCircle(3)) { + RoomTile tile = game.getRoom().getMapping().getTile(position.getX(), position.getY()); + + if (tile == null || !RoomTile.isValidTile(gamePlayer.getGame().getRoom(), null, position)) { + continue; + } + + BattleBallTile battleballTile = (BattleBallTile) game.getTile(position.getX(), position.getY()); + + if (TileUtil.undoTileAttributes(battleballTile, gamePlayer.getGame())) { + game.getUpdateTilesQueue().add(battleballTile); + } + } + + for (Position position : gamePlayer.getPlayer().getRoomUser().getPosition().getCircle(7)) { + RoomTile tile = game.getRoom().getMapping().getTile(position.getX(), position.getY()); + + if (tile == null || !RoomTile.isValidTile(gamePlayer.getGame().getRoom(), null, position)) { + continue; + } + + BattleBallTile battleballTile = (BattleBallTile) game.getTile(position.getX(), position.getY()); + stunnedPlayers.addAll(battleballTile.getPlayers(gamePlayer.getGame(), position)); + } + + if (!stunnedPlayers.contains(gamePlayer)) { + stunnedPlayers.add(gamePlayer); + } + + for (GamePlayer stunnedPlayer : stunnedPlayers) { + stunnedPlayer.getPlayer().getRoomUser().stopWalking(); + stunnedPlayer.getPlayer().getRoomUser().setWalkingAllowed(false); + + // Move player away from blast radius: https://www.youtube.com/watch?v=cP3bvGOx53o&feature=youtu.be&t=242 + if (gamePlayer != stunnedPlayer) { + Position from = stunnedPlayer.getPlayer().getRoomUser().getPosition(); + Position towards = gamePlayer.getPlayer().getRoomUser().getPosition(); + + int temporaryRotation = Rotation.calculateWalkDirection(from, towards); + + Position pushBack = from.copy(); + pushBack.setRotation(temporaryRotation); + pushBack = pushBack.getSquareBehind(); + + BattleBallTile battleballTile = (BattleBallTile) game.getTile(pushBack.getX(), pushBack.getY()); + + if (TileUtil.isValidGameTile(stunnedPlayer, battleballTile, true)) { + stunnedPlayer.getPlayer().getRoomUser().warp(pushBack, false, false); + } + } + + PowerUpUtil.stunPlayer(game, stunnedPlayer, BattleBallPlayerState.STUNNED); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/powerups/CannonHandle.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/powerups/CannonHandle.java new file mode 100644 index 0000000..644c917 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/powerups/CannonHandle.java @@ -0,0 +1,153 @@ +package org.alexdev.havana.game.games.battleball.powerups; + +import org.alexdev.havana.game.GameScheduler; +import org.alexdev.havana.game.games.battleball.BattleBallGame; +import org.alexdev.havana.game.games.battleball.BattleBallTile; +import org.alexdev.havana.game.games.battleball.enums.BattleBallColourState; +import org.alexdev.havana.game.games.battleball.enums.BattleBallPlayerState; +import org.alexdev.havana.game.games.battleball.enums.BattleBallTileState; +import org.alexdev.havana.game.games.battleball.events.PlayerMoveEvent; +import org.alexdev.havana.game.games.battleball.objects.PlayerUpdateObject; +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.games.utils.PowerUpUtil; +import org.alexdev.havana.game.games.utils.TileUtil; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.room.Room; +import org.apache.commons.lang3.tuple.Pair; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.concurrent.TimeUnit; + +public class CannonHandle { + public static void handle(BattleBallGame game, GamePlayer gamePlayer, Room room) { + gamePlayer.getPlayer().getRoomUser().stopWalking(); + gamePlayer.getPlayer().getRoomUser().setWalkingAllowed(false); + + Position firstPosition = gamePlayer.getPlayer().getRoomUser().getPosition(); + + Position nextPosition = firstPosition.copy(); + int rotation = nextPosition.getRotation(); + + LinkedList tilesToUpdate = new LinkedList<>(); + + while (TileUtil.isValidGameTile(gamePlayer, (BattleBallTile) game.getTile(nextPosition.getX(), nextPosition.getY()), false)) { + nextPosition = nextPosition.getSquareInFront(); + + if (!TileUtil.isValidGameTile(gamePlayer, (BattleBallTile) game.getTile(nextPosition.getX(), nextPosition.getY()), false)) { + break; + } + + BattleBallTile battleballTile = (BattleBallTile) game.getTile(nextPosition.getX(), nextPosition.getY()); + tilesToUpdate.add(battleballTile); + } + + if (tilesToUpdate.isEmpty()) { + nextPosition = gamePlayer.getPlayer().getRoomUser().getPosition(); + tilesToUpdate.add((BattleBallTile) game.getTile(nextPosition.getX(), nextPosition.getY())); + } + + // Stun players in direction of cannon and make them move out of the way + GameScheduler.getInstance().getService().schedule(() -> { + List> stunnedPlayers = new ArrayList<>(); + + for (BattleBallTile tile : tilesToUpdate) { + for (GamePlayer p : tile.getPlayers(gamePlayer.getGame(), tile.getPosition())) { + if (p == gamePlayer) { + continue; + } + + stunnedPlayers.add(Pair.of(p, tile.getPosition())); + } + } + + for (var kvp : stunnedPlayers) { + try { + // TODO: Move player out of the way of user using cannon https://www.youtube.com/watch?v=YX1UZky5pg0&feature=youtu.be&t=98 + GamePlayer stunnedPlayer = kvp.getKey(); + + if (stunnedPlayer.getPlayer().getRoomUser().isWalking()) { + stunnedPlayer.getPlayer().getRoomUser().stopWalking(); + } + + Position pushedFrom = kvp.getValue().copy(); + pushedFrom.setRotation(rotation); + + List pushedTo = new ArrayList<>(); + pushedTo.add(pushedFrom.getSquareRight()); + pushedTo.add(pushedFrom.getSquareLeft()); + + Position setPosition = null; + + // Find best position to move player to + for (Position position : pushedTo) { + if (TileUtil.isValidGameTile(stunnedPlayer, (BattleBallTile) game.getTile(position.getX(), position.getY()), true)) { + setPosition = position; + break; + } + } + + if (setPosition != null) { + game.addPlayerMove(new PlayerMoveEvent(stunnedPlayer, setPosition)); + } + + // Stun player + PowerUpUtil.stunPlayer(game, stunnedPlayer, BattleBallPlayerState.STUNNED); + + // Set player at teir new spot + if (setPosition != null) { + setPosition.setRotation(stunnedPlayer.getPlayer().getRoomUser().getPosition().getRotation()); + //stunnedPlayer.getPlayer().getRoomUser().setPosition(setPosition); + stunnedPlayer.getPlayer().getRoomUser().warp(setPosition, false, false); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } + }, 200, TimeUnit.MILLISECONDS); + + + for (BattleBallTile tile : tilesToUpdate) { + if (tile.getColour() == BattleBallColourState.DISABLED) { + continue; + } + + if (tile.getState() == BattleBallTileState.SEALED && tile.getColour().getColourId() == gamePlayer.getTeam().getId()) { + continue; + } + + + /*BattleBallTileState state = tile.getState(); + BattleBallColourState colour = tile.getColour();*/ + + BattleBallTileState newState = BattleBallTileState.SEALED; + BattleBallColourState newColour = BattleBallColourState.getColourById(gamePlayer.getTeam().getId()); + + //tile.addSealedPoints(gamePlayer.getTeam()); + tile.getNewPoints(gamePlayer, newState, newColour); + + tile.setColour(newColour); + tile.setState(newState); + + tile.checkFill(gamePlayer, game.getFillTilesQueue()); + game.getUpdateTilesQueue().add(tile); + } + + BattleBallTile lastTile = tilesToUpdate.getLast(); + + Position lastPosition = lastTile.getPosition().copy(); + lastPosition.setRotation(rotation); + + gamePlayer.setPlayerState(BattleBallPlayerState.FLYING_THROUGH_AIR); + + game.addObjectToQueue(new PlayerUpdateObject(gamePlayer)); + game.addPlayerMove(new PlayerMoveEvent(gamePlayer, lastPosition)); + + GameScheduler.getInstance().getService().schedule(() -> { + PowerUpUtil.stunPlayer(game, gamePlayer, BattleBallPlayerState.STUNNED); + }, 800, TimeUnit.MILLISECONDS); + + gamePlayer.getPlayer().getRoomUser().warp(lastPosition, false, false); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/powerups/HarlequinHandle.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/powerups/HarlequinHandle.java new file mode 100644 index 0000000..719e9f8 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/powerups/HarlequinHandle.java @@ -0,0 +1,49 @@ +package org.alexdev.havana.game.games.battleball.powerups; + +import org.alexdev.havana.game.GameScheduler; +import org.alexdev.havana.game.games.battleball.BattleBallGame; +import org.alexdev.havana.game.games.battleball.enums.BattleBallPlayerState; +import org.alexdev.havana.game.games.battleball.objects.PlayerUpdateObject; +import org.alexdev.havana.game.games.enums.GameState; +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.room.Room; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; + +public class HarlequinHandle { + public static void handle(BattleBallGame game, GamePlayer gamePlayer, Room room) { + List affectedPlayers = new ArrayList<>(); + + for (GamePlayer p : gamePlayer.getGame().getActivePlayers()) { + if (p.getColouringForOpponentId() != -1 || p.getTeamId() == gamePlayer.getTeamId()) { + continue; + } + + if (p.getPlayerState() != BattleBallPlayerState.NORMAL) { + continue; // Don't override people using power ups + } + + p.setPlayerState(BattleBallPlayerState.COLORING_FOR_OPPONENT); + p.setHarlequinPlayer(gamePlayer); + + game.addObjectToQueue(new PlayerUpdateObject(p)); + affectedPlayers.add(p); + } + + GameScheduler.getInstance().getService().schedule(()-> { + if (game.getGameState() == GameState.ENDED) { + return; + } + + for (GamePlayer p : affectedPlayers) { + p.setPlayerState(BattleBallPlayerState.NORMAL); + p.setHarlequinPlayer(null); + + game.addObjectToQueue(new PlayerUpdateObject(p)); + } + + }, 10, TimeUnit.SECONDS); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/powerups/LightbulbHandle.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/powerups/LightbulbHandle.java new file mode 100644 index 0000000..bea4f1b --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/powerups/LightbulbHandle.java @@ -0,0 +1,56 @@ +package org.alexdev.havana.game.games.battleball.powerups; + +import org.alexdev.havana.game.games.battleball.BattleBallGame; +import org.alexdev.havana.game.games.battleball.BattleBallTile; +import org.alexdev.havana.game.games.battleball.enums.BattleBallColourState; +import org.alexdev.havana.game.games.battleball.enums.BattleBallTileState; +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.games.player.GameTeam; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.room.Room; + +public class LightbulbHandle { + public static void handle(BattleBallGame game, GamePlayer gamePlayer, Room room) { + GameTeam gameTeam = gamePlayer.getTeam(); + + for (Position position : gamePlayer.getPlayer().getRoomUser().getPosition().getCircle(5)) { + BattleBallTile tile = (BattleBallTile) game.getTile(position.getX(), position.getY()); + + if (tile == null || + tile.getColour() == BattleBallColourState.DISABLED || + tile.getState() == BattleBallTileState.SEALED) { + continue; + } + + BattleBallTileState state = tile.getState(); + BattleBallColourState colour = tile.getColour(); + + if (state == BattleBallTileState.DEFAULT) { + state = BattleBallTileState.TOUCHED; // Don't make it 4 hits, make it 3 + } + + + BattleBallTileState newState = null; + + if (colour.getColourId() != gameTeam.getId()) { + newState = BattleBallTileState.CLICKED; + } else { + newState = BattleBallTileState.getStateById(state.getTileStateId() + 1); + } + + BattleBallColourState newColour = BattleBallColourState.getColourById(gameTeam.getId()); + + tile.getNewPoints(gamePlayer, newState, newColour); + tile.setColour(newColour); + tile.setState(newState); + + if (newState == BattleBallTileState.SEALED) { + tile.checkFill(gamePlayer, game.getFillTilesQueue()); + } + + //tile.addSealedPoints(gameTeam); + game.getUpdateTilesQueue().add(tile); + } + + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/powerups/NailBoxHandle.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/powerups/NailBoxHandle.java new file mode 100644 index 0000000..cd6bcb1 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/powerups/NailBoxHandle.java @@ -0,0 +1,145 @@ +package org.alexdev.havana.game.games.battleball.powerups; + +import org.alexdev.havana.game.GameScheduler; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.games.GameObject; +import org.alexdev.havana.game.games.battleball.BattleBallGame; +import org.alexdev.havana.game.games.battleball.BattleBallTile; +import org.alexdev.havana.game.games.battleball.enums.BattleBallColourState; +import org.alexdev.havana.game.games.battleball.enums.BattleBallPlayerState; +import org.alexdev.havana.game.games.battleball.enums.BattleBallTileState; +import org.alexdev.havana.game.games.battleball.events.DespawnObjectEvent; +import org.alexdev.havana.game.games.battleball.events.PinSpawnEvent; +import org.alexdev.havana.game.games.battleball.objects.PinObject; +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.games.utils.PowerUpUtil; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.TimeUnit; + +public class NailBoxHandle { + public static void handle(BattleBallGame game, GamePlayer gamePlayer, Room room) { + //gamePlayer.getPlayer().getRoomUser().stopWalking(); + + List dizzyPlayers = new ArrayList<>(); + List pins = new ArrayList<>(); + + Position tilePosition = gamePlayer.getPlayer().getRoomUser().getPosition() + .getSquareInFront() + .getSquareInFront() + .getSquareInFront() + .getSquareInFront() + .getSquareInFront() + //.getSquareInFront() + .getSquareInFront(); + + /* + var tile2 = (BattleBallTile) game.getTile(tilePosition.getX(), tilePosition.getY()); + BattleBallTileState state = tile2.getState(); + BattleBallColourState colour = tile2.getColour(); + + BattleBallTileState newState = BattleBallTileState.CLICKED; + BattleBallColourState newColour = BattleBallColourState.getColourById(gamePlayer.getTeam().getId()); + + tile2.setColour(newColour); + tile2.setState(newState); + + game.getUpdateTilesQueue().add(tile2);*/ + + int maxPins = ThreadLocalRandom.current().nextInt(8, 15 + 1); + List selectedPositions = new ArrayList<>(); + List circlePositions = tilePosition.getCircle(3); + + Collections.shuffle(circlePositions); + + for (Position circlePos : circlePositions) { + if (circlePos.equals(gamePlayer.getPlayer().getRoomUser().getPosition())) { + continue; + } + + BattleBallTile tile = (BattleBallTile) game.getTile(circlePos.getX(), circlePos.getY()); + + if (tile == null || room.getMapping().getTile(circlePos) == null) { + continue; + } + + if (circlePos.equals(gamePlayer.getPlayer().getRoomUser().getPosition()) || + circlePos.equals(gamePlayer.getPlayer().getRoomUser().getNextPosition())) { + continue; + } + + circlePos.setZ(tile.getPosition().getZ()); + + if (selectedPositions.size() < maxPins) { + if (ThreadLocalRandom.current().nextBoolean()) { + PinObject pin = new PinObject(game.createObjectId(), circlePos); + pins.add(pin); + + game.getEventsQueue().add(new PinSpawnEvent(pin.getId(), pin.getPosition())); + selectedPositions.add(circlePos); + + if (room.getMapping().getTile(circlePos).getEntities().size() > 0) { + for (Entity entity : room.getMapping().getTile(circlePos).getEntities()) { + if (entity.getType() != EntityType.PLAYER) { + continue; + } + + Player player = (Player) entity; + GamePlayer gameUser = player.getRoomUser().getGamePlayer(); + + if (gameUser.isSpectator()) { + continue; + } + + dizzyPlayers.add(player.getRoomUser().getGamePlayer()); + } + } + } + } + } + + game.getObjects().addAll(pins); + + // Make all affected players dizzy + for (GamePlayer dizzyPlayer : dizzyPlayers) { + PowerUpUtil.stunPlayer(game, dizzyPlayer, BattleBallPlayerState.BALL_BROKEN); + } + + + // Despawn all pins at their irregular intervals, as seen: https://www.youtube.com/watch?v=yw0MigOIloI&feature=youtu.be&t=94 + for (GameObject pinObject : pins) { + GameScheduler.getInstance().getService().schedule(() -> { + game.getEventsQueue().add(new DespawnObjectEvent(pinObject.getId())); + game.getObjects().remove(pinObject); + + }, ThreadLocalRandom.current().nextInt(12, 16+1), TimeUnit.SECONDS); + } + } + + public static boolean checkNailTile(GamePlayer gamePlayer) { + for (GameObject gameObject : gamePlayer.getGame().getObjects()) { + if (!(gameObject instanceof PinObject)) { + continue; + } + + PinObject pinObject = (PinObject) gameObject; + + if (gamePlayer.getPlayer().getRoomUser().getPosition().equals(pinObject.getPosition())) { + gamePlayer.getGame().getEventsQueue().add(new DespawnObjectEvent(pinObject.getId())); + gamePlayer.getGame().getObjects().remove(gameObject); + + PowerUpUtil.stunPlayer(gamePlayer.getGame(), gamePlayer, BattleBallPlayerState.BALL_BROKEN); + return true; + } + } + + return false; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/powerups/SpringHandle.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/powerups/SpringHandle.java new file mode 100644 index 0000000..efbc792 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/powerups/SpringHandle.java @@ -0,0 +1,31 @@ +package org.alexdev.havana.game.games.battleball.powerups; + +import org.alexdev.havana.game.GameScheduler; +import org.alexdev.havana.game.games.battleball.BattleBallGame; +import org.alexdev.havana.game.games.battleball.enums.BattleBallPlayerState; +import org.alexdev.havana.game.games.battleball.objects.PlayerUpdateObject; +import org.alexdev.havana.game.games.enums.GameState; +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.room.Room; + +import java.util.concurrent.TimeUnit; + +public class SpringHandle { + public static void handle(BattleBallGame game, GamePlayer gamePlayer, Room room) { + gamePlayer.setPlayerState(BattleBallPlayerState.HIGH_JUMPS); + game.addObjectToQueue(new PlayerUpdateObject(gamePlayer)); + + GameScheduler.getInstance().getService().schedule(()-> { + if (game.getGameState() == GameState.ENDED) { + return; + } + + if (gamePlayer.getPlayerState() != BattleBallPlayerState.HIGH_JUMPS) { + return; + } + + gamePlayer.setPlayerState(BattleBallPlayerState.NORMAL); + game.addObjectToQueue(new PlayerUpdateObject(gamePlayer)); + }, 10, TimeUnit.SECONDS); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/powerups/TorchHandle.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/powerups/TorchHandle.java new file mode 100644 index 0000000..9063c57 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/powerups/TorchHandle.java @@ -0,0 +1,73 @@ +package org.alexdev.havana.game.games.battleball.powerups; + +import org.alexdev.havana.game.games.battleball.BattleBallGame; +import org.alexdev.havana.game.games.battleball.BattleBallTile; +import org.alexdev.havana.game.games.battleball.enums.BattleBallColourState; +import org.alexdev.havana.game.games.battleball.enums.BattleBallTileState; +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.games.player.GameTeam; +import org.alexdev.havana.game.games.utils.TileUtil; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.room.Room; + +import java.util.ArrayList; +import java.util.List; + +public class TorchHandle { + public static void handle(BattleBallGame game, GamePlayer gamePlayer, Room room) { + GameTeam gameTeam = gamePlayer.getTeam(); + List tilesToUpdate = new ArrayList<>(); + + Position nextPosition = gamePlayer.getPlayer().getRoomUser().getPosition(); + + while (TileUtil.isValidGameTile(gamePlayer, (BattleBallTile) game.getTile(nextPosition.getX(), nextPosition.getY()), false)) { + nextPosition = nextPosition.getSquareInFront(); + + if (!TileUtil.isValidGameTile(gamePlayer, (BattleBallTile) game.getTile(nextPosition.getX(), nextPosition.getY()), false)) { + break; + } + + tilesToUpdate.add((BattleBallTile) game.getTile(nextPosition.getX(), nextPosition.getY())); + + } + + for (BattleBallTile tile : tilesToUpdate) { + if (tile.getState() == BattleBallTileState.SEALED) { + continue; + } + + if (tile.getColour() == BattleBallColourState.DISABLED) { + continue; + } + + BattleBallTileState state = tile.getState(); + BattleBallColourState colour = tile.getColour(); + + if (state == BattleBallTileState.DEFAULT) { + state = BattleBallTileState.TOUCHED; // Don't make it 4 hits, make it 3 + } + + + BattleBallTileState newState = null; + + if (colour.getColourId() != gameTeam.getId()) { + newState = BattleBallTileState.CLICKED; + } else { + newState = BattleBallTileState.getStateById(state.getTileStateId() + 1); + } + + BattleBallColourState newColour = BattleBallColourState.getColourById(gameTeam.getId()); + + tile.getNewPoints(gamePlayer, newState, newColour); + + tile.setColour(newColour); + tile.setState(newState); + + if (newState == BattleBallTileState.SEALED) { + tile.checkFill(gamePlayer, game.getFillTilesQueue()); + } + + game.getUpdateTilesQueue().add(tile); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/powerups/VacuumHandle.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/powerups/VacuumHandle.java new file mode 100644 index 0000000..071b746 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/powerups/VacuumHandle.java @@ -0,0 +1,31 @@ +package org.alexdev.havana.game.games.battleball.powerups; + +import org.alexdev.havana.game.GameScheduler; +import org.alexdev.havana.game.games.battleball.BattleBallGame; +import org.alexdev.havana.game.games.battleball.enums.BattleBallPlayerState; +import org.alexdev.havana.game.games.battleball.objects.PlayerUpdateObject; +import org.alexdev.havana.game.games.enums.GameState; +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.room.Room; + +import java.util.concurrent.TimeUnit; + +public class VacuumHandle { + public static void handle(BattleBallGame game, GamePlayer gamePlayer, Room room) { + gamePlayer.setPlayerState(BattleBallPlayerState.CLEANING_TILES); + game.addObjectToQueue(new PlayerUpdateObject(gamePlayer)); + + GameScheduler.getInstance().getService().schedule(() -> { + if (game.getGameState() == GameState.ENDED) { + return; + } + + if (gamePlayer.getPlayerState() != BattleBallPlayerState.CLEANING_TILES) { + return; + } + + gamePlayer.setPlayerState(BattleBallPlayerState.NORMAL); + game.addObjectToQueue(new PlayerUpdateObject(gamePlayer)); + }, 10, TimeUnit.SECONDS); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/enums/GameEventType.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/enums/GameEventType.java new file mode 100644 index 0000000..5b1c8d0 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/enums/GameEventType.java @@ -0,0 +1,19 @@ +package org.alexdev.havana.game.games.enums; + +public enum GameEventType { + BATTLEBALL_PLAYER_EVENT(2), + BATTLEBALL_OBJECT_SPAWN(0), + BATTLEBALL_DESPAWN_OBJECT(1), + BATTLEBALL_POWERUP_GET(3), + BATTLEBALL_POWERUP_ACTIVATE(5); + + private final int eventId; + + GameEventType(int eventId) { + this.eventId = eventId; + } + + public int getEventId() { + return eventId; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/enums/GameObjectType.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/enums/GameObjectType.java new file mode 100644 index 0000000..474c71e --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/enums/GameObjectType.java @@ -0,0 +1,32 @@ +package org.alexdev.havana.game.games.enums; + +public enum GameObjectType { + BATTLEBALL_PLAYER_OBJECT(0), + BATTLEBALL_POWER_OBJECT(1), + BATTLEBALL_PIN_OBJECT(2), + + SNOWWAR_AVATAR_OBJECT(5), + SNOWWAR_SNOWMACHINE_OBJECT(4), + + SNOWWAR_OBJECT_EVENT(0), + SNOWWAR_AVATAR_MOVE_EVENT(2), + SNOWWAR_AVATAR_STOP_EVENT(6), + SNOWWAR_REMOVE_OBJECT_EVENT(1), + SNOWWAR_THROW_EVENT(8), + SNOWWAR_CREATE_SNOWBALL_EVENT(7), + SNOWWAR_TARGET_THROW_EVENT(4), + SNOWWAR_MACHINE_MOVE_SNOWBALLS_EVENT(12), + SNOWWAR_MACHINE_ADD_SNOWBALL_EVENT(11), + SNOWSTORM_HIT_EVENT(5), + SNOWWAR_STUN_EVENT(9); + + private final int objectId; + + GameObjectType(int objectId) { + this.objectId = objectId; + } + + public int getObjectId() { + return objectId; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/enums/GameState.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/enums/GameState.java new file mode 100644 index 0000000..7d7ac71 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/enums/GameState.java @@ -0,0 +1,17 @@ +package org.alexdev.havana.game.games.enums; + +public enum GameState { + WAITING(0), + STARTED(1), + ENDED(2); + + private final int stateId; + + GameState(int stateId) { + this.stateId = stateId; + } + + public int getStateId() { + return stateId; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/enums/GameType.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/enums/GameType.java new file mode 100644 index 0000000..875f527 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/enums/GameType.java @@ -0,0 +1,34 @@ +package org.alexdev.havana.game.games.enums; + +import org.alexdev.havana.util.config.GameConfiguration; + +public enum GameType { + BATTLEBALL("bb_lobby_1", 1), + SNOWSTORM("snowwar_lobby_1", 0), + WOBBLE_SQUABBLE("md_a", 1); + + private String lobbyModel; + private int typeId; + + GameType(String lobbyModel, int typeId) { + this.lobbyModel = lobbyModel; + this.typeId = typeId; + } + + /** + * Get the cost of tickets required to play each game + * + * @return the ticket amount required + */ + public int getTicketCost() { + return GameConfiguration.getInstance().getInteger(this.name().toLowerCase() + ".ticket.charge"); + } + + public String getLobbyModel() { + return lobbyModel; + } + + public int getTypeId() { + return typeId; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/gamehalls/GameBattleShip.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/gamehalls/GameBattleShip.java new file mode 100644 index 0000000..b3046e9 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/gamehalls/GameBattleShip.java @@ -0,0 +1,413 @@ +package org.alexdev.havana.game.games.gamehalls; + +import org.alexdev.havana.game.GameScheduler; +import org.alexdev.havana.game.games.gamehalls.utils.GameShip; +import org.alexdev.havana.game.games.gamehalls.utils.GameShipMove; +import org.alexdev.havana.game.games.gamehalls.utils.GameShipMoveResult; +import org.alexdev.havana.game.games.gamehalls.utils.GameShipType; +import org.alexdev.havana.game.games.triggers.GameTrigger; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.rooms.games.ITEMMSG; + +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +public class GameBattleShip extends GamehallGame { + private Map shipsPlaced; + private Map> playerListMap; + private Player[] players; + private int nextTurn; + private boolean isTurnUsed; + private boolean gameStarted; + private boolean gameEnded; + + public GameBattleShip(List kvp) { + super(kvp); + } + + @Override + public void gameStart() { + this.shipsPlaced = new HashMap<>(); + this.playerListMap = new HashMap<>(); + this.players = new Player[2]; + this.nextTurn = 0; + this.isTurnUsed = false; + this.gameStarted = false; + this.gameEnded = false; + } + + @Override + public void gameStop() { + this.shipsPlaced = new HashMap<>(); + this.playerListMap = new HashMap<>(); + this.players = new Player[2]; + this.nextTurn = 0; + this.isTurnUsed = false; + this.gameStarted = false; + this.gameEnded = false; + } + + @Override + public void joinGame(Player player) { + if (!this.gameStarted) { + return; + } + + if (this.getPlayerNum(player) == -1) { + if (this.players[0] == null) { + this.players[0] = player; + } else { + if (this.players[1] == null) { + this.players[1] = player; + } + } + } + + String[] opponentData = new String[2]; + + int i = 0; + for (Player p : this.players) { + opponentData[i] = this.getPlayerNum(p) + " " + this.players[i].getDetails().getName(); + i++; + } + + this.sendToEveryone(new ITEMMSG(new String[]{this.getGameId(), "OPPONENTS", String.join(Character.toString((char) 13), opponentData)})); + this.sendMarkedMap(); + } + + @Override + public void leaveGame(Player player) { + if (this.nextTurn == getPlayerNum(player)) { + rotateTurn(); + } + + for (int i = 0; i < this.players.length; i++) { + if (this.players[i] == player) { + this.players[i] = null; + } + } + } + + @Override + public void handleCommand(Player player, Room room, Item item, String command, String[] args) { + GameTrigger trigger = (GameTrigger) item.getDefinition().getInteractionType().getTrigger(); + + if (command.equals("PLACESHIP")) { + if (this.gameStarted) { + return; + } + + int shipId = Integer.parseInt(args[0]); + int startX = Integer.parseInt(args[1]); + int startY = Integer.parseInt(args[2]); + + int endX = Integer.parseInt(args[3]); + int endY = Integer.parseInt(args[4]); + + GameShipType shipType = GameShipType.getById(shipId); + + if (shipType == null) { + return; + } + + if (this.getPlayerNum(player) == -1) { + if (this.players[0] == null) { + this.players[0] = player; + } else { + if (this.players[1] == null) { + this.players[1] = player; + } + } + } + + if (this.countShips(shipType, getPlayerNum(player)) >= shipType.getMaxAllowed()) { + return; + } + + if (!this.playerListMap.containsKey(getPlayerNum(player))) { + this.playerListMap.put(getPlayerNum(player), new ArrayList<>()); + } + + boolean isHorizontal = (startY == endY); + + this.shipsPlaced.put(new GameShip(this, shipType, new Position(startX, startY), getPlayerNum(player), isHorizontal), getPlayerNum(player)); + boolean isEveryoneFinsihed = this.hasEveryoneFinished(); + + if (isEveryoneFinsihed) { + String[] opponentData = new String[2]; + + int i = 0; + for (Player p : this.players) { + opponentData[i] = this.getPlayerNum(p) + " " + this.players[i].getDetails().getName(); + i++; + } + + this.sendToEveryone(new ITEMMSG(new String[]{this.getGameId(), "OPPONENTS", String.join(Character.toString((char) 13), opponentData)})); + this.rotateTurn(); + this.gameStarted = true; + } + } + + if (command.equals("SHOOT")) { + if (this.nextTurn != getPlayerNum(player)) { + return; + } + + if (this.isTurnUsed) { + return; + } + + int x = Integer.parseInt(args[0]); + int y = Integer.parseInt(args[1]); + + GameShipMoveResult moveResult = GameShipMoveResult.MISS; + + if (this.isHit(x, y, getPlayerNum(player))) { + moveResult = GameShipMoveResult.HIT; + } + + var oppositePlayer = this.getOppositePlayer(player); + + if (oppositePlayer == null) { + return; + } + + GameShip gameShip = this.getShipPlaced(x, y, getPlayerNum(player)); + this.playerListMap.get(getPlayerNum(player)).add(new GameShipMove(player, x, y, moveResult, gameShip)); + + this.sendMarkedMap(); + + if (gameShip != null) { + if (gameShip.isDestroyed()) { + this.sendToEveryone(new ITEMMSG(new String[]{this.getGameId(), "SINK" })); + } else if (gameShip.isHitTwice()) { + this.sendToEveryone(new ITEMMSG(new String[]{this.getGameId(), "HITTWICE" })); + } else { + this.sendToEveryone(new ITEMMSG(new String[]{this.getGameId(), "HIT" })); + } + } else { + this.sendToEveryone(new ITEMMSG(new String[]{this.getGameId(), "MISS" })); + } + + //this.isTurnUsed = true; + GameShipMoveResult finalMoveResult = moveResult; + + //GameScheduler.getInstance().getService().schedule(() -> { + if (finalMoveResult == GameShipMoveResult.MISS) { + this.isTurnUsed = true; + GameScheduler.getInstance().getService().schedule(this::rotateTurn, 2, TimeUnit.SECONDS); + } else { + this.isTurnUsed = false; + this.sendToEveryone(new ITEMMSG(new String[]{this.getGameId(), "TURN", String.valueOf(this.nextTurn)})); + } + //}, 5, TimeUnit.SECONDS); + + if (this.isGameOver(oppositePlayer)) { + this.gameEnded = true; + this.sendToEveryone(new ITEMMSG(new String[]{this.getGameId(), "GAMEEND", player.getDetails().getName()})); + this.sendToEveryone(new ITEMMSG(new String[]{this.getGameId(), "GAMEOVER"})); + this.isTurnUsed = true; + //GameManager.getInstance().giveRandomCredits(player, true); + //GameManager.getInstance().giveRandomCredits(this.getOppositePlayer(player), false); + + } + + player.getRoomUser().getTimerManager().resetRoomTimer(); + //GameScheduler.getInstance().getService().schedule(this::rotateTurn, 5, TimeUnit.SECONDS); + //GameScheduler.getInstance().getService().schedule(this::sendMarkedMap, 5, TimeUnit.SECONDS); + + } + + if (command.equals("CLOSE")) { + trigger.onEntityLeave(player, player.getRoomUser(), item); + return; + } + } + + private void rotateTurn() { + this.nextTurn = getOppositePlayerNum(this.nextTurn); + this.sendToEveryone(new ITEMMSG(new String[]{this.getGameId(), "TURN", String.valueOf(this.nextTurn) })); + this.isTurnUsed = false; + } + + private void sendMarkedMap() { + for (Player p : this.players) { + var opponent = getOppositePlayer(p); + + if (opponent == null) { + return; + } + + if (getPlayerNum(p) == 0) { + p.send(new ITEMMSG(new String[]{this.getGameId(), "SITUATION", + "", generateHitGrid(getPlayerNum(p)), + "", generateHitGrid(getPlayerNum(opponent)), + })); + } else { + p.send(new ITEMMSG(new String[]{this.getGameId(), "SITUATION", + "", generateHitGrid(getPlayerNum(opponent)), + "", generateHitGrid(getPlayerNum(p)), + })); + } + } + } + + + private String generateHitGrid(int player) { + StringBuilder map = new StringBuilder(); + + for (int y = 0; y < 12; y++) { + for (int x = 0; x < 13; x++) { + Position position = new Position(x, y); + + GameShipMove shipMove = this.playerListMap.get(this.getOppositePlayerNum(player)).stream().filter(move -> move.getX() == position.getX() && move.getY() == position.getY()).findFirst().orElse(null); + + if (shipMove == null) { + map.append("-"); + } else { + if (shipMove.getShip() != null && shipMove.getShip().isDestroyed()) { + map.append(GameShipMoveResult.SINK.getSymbol()); + } else { + map.append(shipMove.getMoveResult().getSymbol()); + } + } + } + } + + return map.toString(); + } + + private boolean isHit(int selectX, int selectY, int player) { + return getShipPlaced(selectX, selectY, player) != null; + } + + private GameShip getShipPlaced(int x, int y, int player) { + List opponentShips = this.shipsPlaced.keySet().stream().filter(ship -> ship.getPlayer() == getOppositePlayerNum(player)).collect(Collectors.toList()); + + for (GameShip gameShip : opponentShips) { + for (int i = 0; i < gameShip.getShipType().getLength(); i++) { + int shipX = gameShip.getPosition().getX() + (gameShip.isHorizontal() ? i : 0); + int shipY = gameShip.getPosition().getY() + (gameShip.isHorizontal() ? 0 : i); + + if (x == shipX && y == shipY) { + return gameShip; + } + } + } + + return null; + } + + /** + * Get the player number for the player. + * + * @param player the player number + * @return the number + */ + public int getPlayerNum(Player player) { + var playerList = Arrays.asList(this.players); + return playerList.contains(player) ? playerList.indexOf(player) : - 1; + } + + private boolean isGameOver(Player player) { + for (var kvp : this.shipsPlaced.entrySet()) { + if (kvp.getValue() != getPlayerNum(player)) { + continue; + } + + if (!kvp.getKey().isDestroyed()) { + return false; + } + } + + return true; + } + + /** + * Get the opposite player playing + * + * @param player the player + * @return the opponent + */ + public Player getOppositePlayer(Player player) { + for (Player p : this.players) { + if (p != player) { + return p; + } + } + + return null; + } + + + public Integer getOppositePlayerNum(int player) { + return player == 0 ? 1 : 0; + } + + /** + * Gets if both players have finished placing their pieces. + * + * @return true, if successful + */ + private boolean hasEveryoneFinished() { + if (this.countShips(null, 0) != 10) { + return false; + } + + if (this.countShips(null, 1) != 10) { + return false; + } + + return true; + } + + /** + * Count the ships placed on the map. + * + * @param shipType the ship type (optional) + * @param player the player (optional) + * @return the count of the ships + */ + private int countShips(GameShipType shipType, int player) { + List gameShipTypes = null; + + if (shipType != null) { + if (player != -1) { + gameShipTypes = this.shipsPlaced.keySet().stream().filter(ship -> ship.getShipType() == shipType && ship.getPlayer() == player).collect(Collectors.toList()); + } else { + gameShipTypes = this.shipsPlaced.keySet().stream().filter(ship -> ship.getShipType() == shipType).collect(Collectors.toList()); + } + } else { + if (player != -1) { + gameShipTypes = this.shipsPlaced.keySet().stream().filter(ship -> ship.getPlayer() == player).collect(Collectors.toList()); + } else { + gameShipTypes = new ArrayList<>(this.shipsPlaced.keySet()); + } + } + + return gameShipTypes.size(); + } + + @Override + public int getMaximumPeopleRequired() { + return 2; + } + + @Override + public int getMinimumPeopleRequired() { + return 1; + } + + @Override + public String getGameFuseType() { + return "BattleShip"; + } + + public Map> getPlayerListMap() { + return playerListMap; + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/gamehalls/GameChess.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/gamehalls/GameChess.java new file mode 100644 index 0000000..d8dfc8b --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/gamehalls/GameChess.java @@ -0,0 +1,334 @@ +package org.alexdev.havana.game.games.gamehalls; + +import com.github.bhlangonijr.chesslib.*; +import com.github.bhlangonijr.chesslib.move.Move; +import com.github.bhlangonijr.chesslib.move.MoveGenerator; +import com.github.bhlangonijr.chesslib.move.MoveGeneratorException; +import org.alexdev.havana.game.games.triggers.GameTrigger; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.rooms.games.ITEMMSG; + +import java.util.HashMap; +import java.util.List; + +public class GameChess extends GamehallGame { + private static class GameToken { + private char token; + + private GameToken(char token) { + this.token = token; + } + + private char getToken() { + return token; + } + } + + private boolean gameFinished; + + private Board board; + private GameToken[] gameTokens; + private HashMap playerSides; + + public GameChess(List chairs) { + super(chairs); + } + + @Override + public void gameStart() { + this.playerSides = new HashMap<>(); + this.restartMap(); + } + + @Override + public void gameStop() { + this.playerSides.clear(); + this.board = null; + } + + @Override + public void joinGame(Player player) { } + + @Override + public void leaveGame(Player player) { + this.playerSides.remove(player); + } + + @Override + public void handleCommand(Player player, Room room, Item item, String command, String[] args) { + GameTrigger trigger = (GameTrigger) item.getDefinition().getInteractionType().getTrigger(); + + if (command.equals("CLOSE")) { + trigger.onEntityLeave(player, player.getRoomUser(), item); + return; + } + + if (command.equals("CHOOSETYPE")) { + char sideChosen = args[0].charAt(0); + + if (this.getToken(sideChosen) == null) { + return; + } + + if (this.getPlayerBySide(sideChosen) != null) { + player.send(new ITEMMSG(new String[]{this.getGameId(), "TYPERESERVED"})); + return; + } + + if (this.gameFinished) { + player.send(new ITEMMSG(new String[]{this.getGameId(), "TYPERESERVED"})); // Alert/error sound! + return; + } + + player.send(new ITEMMSG(new String[]{this.getGameId(), "SELECTTYPE " + String.valueOf(sideChosen)})); + + GameToken token = this.getToken(sideChosen); + this.playerSides.put(player, token); + + // Select the other side for the player + GameToken otherToken = null; + + for (GameToken other : this.gameTokens) { + if (other.getToken() != sideChosen) { + otherToken = other; + break; + } + } + + if (otherToken != null) { + for (Player otherPlayer : this.getPlayers()) { + if (otherPlayer != player) { + otherPlayer.send(new ITEMMSG(new String[]{this.getGameId(), "SELECTTYPE " + String.valueOf(otherToken.getToken())})); + this.playerSides.put(otherPlayer, otherToken); + break; + } + } + } + + this.restartMap(); + this.broadcastMap(); + } + + if (command.equals("MOVEPIECE")) { + char currentSide = this.board.getSideToMove() == Side.BLACK ? 'b' : 'w'; + + if (currentSide != this.playerSides.get(player).getToken()) { + player.send(new ITEMMSG(new String[]{this.getGameId(), "TYPERESERVED"})); // Alert/error sound! + this.broadcastMap(); + return; + } + + if (this.gameFinished) { + player.send(new ITEMMSG(new String[]{this.getGameId(), "TYPERESERVED"})); // Alert/error sound! + this.broadcastMap(); + return; + } + + if (this.getPlayers().size() < this.getMinimumPeopleRequired()) { + this.broadcastMap(); + return; // Can't place objects until other player has joined. + } + + if (!this.playerSides.containsKey(player)) { + this.broadcastMap(); + return; + } + + Square fromSquare = Square.valueOf(args[0].toUpperCase()); + Square toSquare = Square.valueOf(args[1].toUpperCase()); + + if (fromSquare == toSquare) { + player.getRoomUser().getTimerManager().resetRoomTimer(); + return; + } + + Move move = new Move(fromSquare, toSquare); + boolean isLegalMove = false; + + try { + var moveList = MoveGenerator.generateLegalMoves(this.board); + isLegalMove = moveList.contains(move);//.stream().anyMatch(m -> m.getFrom() == fromSquare && m.getTo() == toSquare); + + } catch (MoveGeneratorException e) { } + + if (isLegalMove) { + this.board.doMove(move, true); + + /*if (this.board.isDraw() || this.board.isInsufficientMaterial()) { + this.gameFinished = true; + this.showChat("The chess game has ended in a draw"); + return; + } else if (this.board.isStaleMate()) { + this.gameFinished = true; + this.showChat("The chess game has encountered a stalemate"); + return; + } else if (this.board.isMated()) { + this.gameFinished = true; + this.showChat(player.getDetails().getName() + " has won the chess game"); + return; + } else if (this.board.isKingAttacked()) { + this.showChat("The king is being attacked!"); + }*/ + } + + player.getRoomUser().getTimerManager().resetRoomTimer(); + this.broadcastMap(); + } + + if (command.equals("RESTART")) { + this.restartMap(); + this.broadcastMap(); + return; + } + } + + /** + * Send the game map to the opponents. + */ + private void broadcastMap() { + StringBuilder boardData = new StringBuilder(); + + for (Square square : Square.values()) { + Piece piece = this.board.getPiece(square); + + if (piece == null) { + continue; + } + + if (piece.getPieceType() == PieceType.NONE || piece.getPieceSide() == null) { + continue; + } + + String side = piece.getPieceSide() == Side.BLACK ? "B" : "W"; + String chessPiece = this.getChessPiece(piece.getPieceType()); + + boardData.append(side); + boardData.append(chessPiece); + boardData.append(square.value().toLowerCase()); + boardData.append((char)32); + + } + + String[] playerNames = this.getCurrentlyPlaying(); + this.sendToEveryone(new ITEMMSG(new String[]{this.getGameId(), "PIECEDATA", playerNames[0], playerNames[1], boardData.toString()})); + } + + /** + * Get the CCT type of chess piece by the piece type supplied. + * + * @param pieceType the piece type instance + * @return the CCT type, else it defaults to Rook + */ + public String getChessPiece(PieceType pieceType) { + if (pieceType == PieceType.BISHOP) { + return "cr"; + } + + if (pieceType == PieceType.KNIGHT) { + return "hr"; + } + + if (pieceType == PieceType.KING) { + return "kg"; + } + + if (pieceType == PieceType.QUEEN) { + return "qu"; + } + + if (pieceType == PieceType.ROOK) { + return "tw"; + } + + return "sd"; // Pawn + } + + /** + * Get the name of the user(s) currently playing as an array for the packet + * + * @return the array with player name + */ + private String[] getCurrentlyPlaying() { + String[] playerNames = new String[]{"", ""}; + + if (this.board != null && this.board.getSideToMove() != null) { + /*for (int i = 0; i < this.playersInGame.size(); i++) { + Player player = this.playersInGame.get(i); + playerNames[i] = Character.toUpperCase(this.playerSides.get(player).getToken()) + " " + player.getDetails().getName(); + }*/ + + char currentSide = this.board.getSideToMove() == Side.BLACK ? 'b' : 'w'; + + if (this.getPlayerBySide(currentSide) != null) { + playerNames[0] = Character.toUpperCase(currentSide) + " " + this.getPlayerBySide(currentSide).getDetails().getName(); + } + } + + return playerNames; + } + + /** + * Reset the game map. + */ + private void restartMap() { + this.gameTokens = new GameToken[]{ + new GameToken('w'), + new GameToken('b') + }; + + this.gameFinished = false; + this.board = new Board(); + } + + /** + * Get token instance by character. + * + * @param side the character to compare against + * @return the instance, if successful + */ + private GameToken getToken(char side) { + GameToken token = null; + + for (GameToken t : gameTokens) { + if (t.getToken() == side) { + token = t; + break; + } + } + + return token; + } + + /** + * Locate a player instance by the side they're playing. + * + * @param side the side used + * @return the player instance, if successful + */ + private Player getPlayerBySide(char side) { + for (var kvp : this.playerSides.entrySet()) { + if (kvp.getValue().getToken() == side) { + return kvp.getKey(); + } + } + + return null; + } + + @Override + public int getMaximumPeopleRequired() { + return 2; + } + + @Override + public int getMinimumPeopleRequired() { + return 1; + } + + @Override + public String getGameFuseType() { + return "Chess"; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/gamehalls/GamePoker.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/gamehalls/GamePoker.java new file mode 100644 index 0000000..be52922 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/gamehalls/GamePoker.java @@ -0,0 +1,51 @@ +package org.alexdev.havana.game.games.gamehalls; + +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.games.triggers.GameTrigger; + +import java.util.List; + +public class GamePoker extends GamehallGame { + public GamePoker(List kvp) { + super(kvp); + } + + @Override + public void gameStart() { } + + @Override + public void gameStop() { } + + @Override + public void joinGame(Player p) { } + + @Override + public void leaveGame(Player player) { } + + @Override + public void handleCommand(Player player, Room room, Item item, String command, String[] args) { + GameTrigger trigger = (GameTrigger) item.getDefinition().getInteractionType().getTrigger(); + + if (command.equals("CLOSE")) { + trigger.onEntityLeave(player, player.getRoomUser(), item); + return; + } + } + + @Override + public int getMaximumPeopleRequired() { + return 4; + } + + @Override + public int getMinimumPeopleRequired() { + return 2; + } + + @Override + public String getGameFuseType() { + return "Poker"; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/gamehalls/GameTicTacToe.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/gamehalls/GameTicTacToe.java new file mode 100644 index 0000000..2b15163 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/gamehalls/GameTicTacToe.java @@ -0,0 +1,496 @@ +package org.alexdev.havana.game.games.gamehalls; + +import org.alexdev.havana.game.games.gamehalls.utils.GameToken; +import org.alexdev.havana.game.games.triggers.GameTrigger; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.rooms.games.CLOSEGAMEBOARD; +import org.alexdev.havana.messages.outgoing.rooms.games.ITEMMSG; +import org.alexdev.havana.messages.outgoing.rooms.user.CHAT_MESSAGE; +import org.alexdev.havana.messages.outgoing.rooms.user.CHAT_MESSAGE.ChatMessageType; +import org.apache.commons.lang3.tuple.Pair; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class GameTicTacToe extends GamehallGame { + private static final int NUM_IN_ROW = 5; + private static final int MAX_WIDTH = 23; + private static final int MAX_LENGTH = 24; + + private GameToken[] gameTokens; + private Map playerSides; + + private boolean gameFinished; + private char[][] gameMap; + private Player nextTurn; + + public GameTicTacToe(List chairs) { + super(chairs); + } + + @Override + public void gameStart() { + this.playerSides = new HashMap<>(); + this.restartMap(); + } + + @Override + public void gameStop() { + this.playerSides.clear(); + this.gameMap = null; + } + + @Override + public void joinGame(Player p) { } + + @Override + public void leaveGame(Player player) { + this.playerSides.remove(player); + } + + @Override + public void handleCommand(Player player, Room room, Item item, String command, String[] args) { + GameTrigger trigger = (GameTrigger) item.getDefinition().getInteractionType().getTrigger(); + + if (command.equals("CLOSE")) { + trigger.onEntityLeave(player, player.getRoomUser(), item); + return; + } + + if (command.equals("CHOOSETYPE")) { + char sideChosen = args[0].charAt(0); + + if (this.getToken(sideChosen) == null) { + return; + } + + if (this.getPlayerBySide(sideChosen) != null) { + player.send(new ITEMMSG(new String[]{this.getGameId(), "TYPERESERVED"})); + return; + } + + this.playerSides.put(player, sideChosen); + + player.send(new ITEMMSG(new String[]{this.getGameId(), "SELECTTYPE " + String.valueOf(sideChosen)})); + + // Select the other side for the player + GameToken otherToken = null; + + for (GameToken other : gameTokens) { + if (other.getToken() != sideChosen) { + otherToken = other; + break; + } + } + + if (otherToken != null) { + for (Player otherPlayer : this.getPlayers()) { + if (otherPlayer != player) { + otherPlayer.send(new ITEMMSG(new String[]{this.getGameId(), "SELECTTYPE " + String.valueOf(otherToken.getToken())})); + this.playerSides.put(otherPlayer, otherToken.getToken()); + break; + } + } + } + + String[] playerNames = this.getCurrentlyPlaying(); + + if (playerNames != null) { + this.sendToEveryone(new ITEMMSG(new String[]{this.getGameId(), "OPPONENTS", playerNames[0], playerNames[1]})); + } else { + player.send(new CLOSEGAMEBOARD(this.getGameId(), this.getGameFuseType())); + this.getPlayers().remove(player); + this.resetGameId(); + this.gameStop(); + } + } + + if (command.equals("RESTART")) { + this.restartMap(); + this.broadcastMap(); + return; + } + + if (command.equals("SETSECTOR")) { + if (this.getPlayers().size() < this.getMinimumPeopleRequired()) { + return; // Can't place objects until other player has joined. + } + + if (!this.playerSides.containsKey(player)) { + return; + } + + if (this.nextTurn != player) { + player.send(new ITEMMSG(new String[]{this.getGameId(), "TYPERESERVED"})); // Alert/error sound! + return; + } + + if (this.gameFinished) { + player.send(new ITEMMSG(new String[]{this.getGameId(), "TYPERESERVED"})); // Alert/error sound! + return; + } + + char side = args[0].charAt(0); + + if (this.playerSides.get(player) != side) { + return; + } + + int Y = Integer.parseInt(args[1]); + int X = Integer.parseInt(args[2]); + + if (X >= MAX_WIDTH || Y >= MAX_LENGTH || X < 0 || Y < 0) { + return; + } + + if (this.gameMap == null) { + return; + } + + if (this.gameMap[X][Y] != '0') { + player.send(new ITEMMSG(new String[]{this.getGameId(), "TYPERESERVED"})); // Alert/error sound! + return; + } + + GameToken token = this.getToken(this.playerSides.get(player)); + token.incrementMoves(); + + this.gameMap[X][Y] = token.getToken(); + + Pair> variables = this.hasGameFinished(); + + if (variables != null) { + this.gameFinished = true; + this.announceWinningSide(variables); + } else { + this.swapTurns(player); + } + + player.getRoomUser().getTimerManager().resetRoomTimer(); + this.broadcastMap(); + } + } + + /** + * Announce the winning side, change the characters to their winning symbols, and says + * how many moves it took. + * + * @param variables the winning character and coordinates of winning tiles + */ + private void announceWinningSide(Pair> variables) { + GameToken token = null; + + for (GameToken side : gameTokens) { + if (side.getToken() == variables.getKey()) { + token = side; + } + } + + if (token != null) { + for (int[] coord : variables.getValue()) { + this.gameMap[coord[0]][coord[1]] = token.getWinningToken(); + } + + this.broadcastMap(); + + Player winner = this.getPlayerBySide(token.getToken()); + + if (winner == null) { + return; + } + + for (Player player : this.getPlayers()) { + player.send(new CHAT_MESSAGE(ChatMessageType.CHAT, player.getRoomUser().getInstanceId(), winner.getDetails().getName() + " has won the game in " + token.getMoves() + " moves", 0)); + } + + /*(for (Player p : playerSides.keySet()) { + GameManager.getInstance().giveRandomCredits(p, winner == p); + }*/ + + } + } + + /** + * Check for the winner. + * + * @return a variable containing the character who won, and the coords of the winning tiles + */ + private Pair> hasGameFinished() { + List winningCoordinates = new ArrayList<>(); + + // Check rows across + for (int i = 0; i < MAX_WIDTH; i++) { + for (int j = 0; j < MAX_LENGTH; j++) { + char letter = this.gameMap[i][j]; + winningCoordinates.clear(); + + if (letter == '0') { + continue; + } + + for (int k = 0; k < NUM_IN_ROW; k++) { + if ((j + k) >= MAX_LENGTH) { + continue; + } + + char newLetter = this.gameMap[i][j + k]; + + if (newLetter != '0' && newLetter == letter) { + winningCoordinates.add(new int[]{i, j + k}); + letter = newLetter; + + if (winningCoordinates.size() >= NUM_IN_ROW) { + return Pair.of(letter, winningCoordinates); + } + } else { + winningCoordinates.clear(); + } + } + } + } + + // Check rows down + for (int i = 0; i < MAX_WIDTH; i++) { + for (int j = 0; j < MAX_LENGTH; j++) { + char letter = this.gameMap[i][j]; + winningCoordinates.clear(); + + if (letter == '0') { + continue; + } + + for (int k = 0; k < NUM_IN_ROW; k++) { + if ((i + k) >= MAX_WIDTH) { + continue; + } + + char newLetter = this.gameMap[i + k][j]; + + if (newLetter != '0' && newLetter == letter) { + winningCoordinates.add(new int[]{i + k, j}); + letter = newLetter; + + if (winningCoordinates.size() >= NUM_IN_ROW) { + return Pair.of(letter, winningCoordinates); + } + } else { + winningCoordinates.clear(); + } + } + } + } + + // Check top left to bottom right + for (int i = 0; i < MAX_WIDTH; i++) { + for (int j = 0; j < MAX_LENGTH; j++) { + char letter = this.gameMap[i][j]; + winningCoordinates.clear(); + + if (letter == '0') { + continue; + } + + for (int k = 0; k < NUM_IN_ROW; k++) { + if ((i + k) >= MAX_WIDTH || (j + k) >= MAX_WIDTH) { + continue; + } + + char newLetter = this.gameMap[i + k][j + k]; + + if (newLetter != '0' && newLetter == letter) { + winningCoordinates.add(new int[]{i + k, j + k}); + letter = newLetter; + + if (winningCoordinates.size() >= NUM_IN_ROW) { + return Pair.of(letter, winningCoordinates); + } + } else { + winningCoordinates.clear(); + } + } + } + } + + // Check top right to bottom left + for (int i = 0; i < MAX_WIDTH; i++) { + for (int j = 0; j < MAX_LENGTH; j++) { + char letter = this.gameMap[i][j]; + winningCoordinates.clear(); + + if (letter == '0') { + continue; + } + + for (int k = 0; k < NUM_IN_ROW; k++) { + int newX = i - k; + int newY = j + k; + + if (newX < 0) { + continue; + } + + if (newX >= MAX_WIDTH || newY >= MAX_WIDTH) { + continue; + } + + char newLetter = this.gameMap[newX][newY]; + + if (newLetter != '0' && newLetter == letter) { + winningCoordinates.add(new int[]{newX, newY}); + letter = newLetter; + + if (winningCoordinates.size() >= NUM_IN_ROW) { + return Pair.of(letter, winningCoordinates); + } + } else { + winningCoordinates.clear(); + } + } + } + } + + return null; + } + + /** + * Swap who's turn it is to play. + * + * @param player the player to swap away from + */ + private void swapTurns(Player player) { + Player nextPlayer = null; + + if (this.nextTurn == player) { + for (Player p : this.getPlayers()) { + if (p != player) { + nextPlayer = p; + } + } + } + + this.nextTurn = nextPlayer; + } + + /** + * Reset the game map. + */ + private void restartMap() { + this.gameTokens = new GameToken[]{ + new GameToken('O', 'q'), + new GameToken('X', '+') + }; + + if (this.getPlayers().size() > 0) { + this.nextTurn = this.getPlayers().get(0); + } + + this.gameFinished = false; + this.gameMap = new char[MAX_WIDTH][MAX_LENGTH]; + + for (int X = 0; X < MAX_WIDTH; X++) { + for (int Y = 0; Y < MAX_LENGTH; Y++) { + this.gameMap[X][Y] = '0'; + } + } + } + + /** + * Send the game map to the opponents. + */ + private void broadcastMap() { + StringBuilder boardData = new StringBuilder(); + + for (char[] mapData : this.gameMap) { + for (char mapLetter : mapData) { + boardData.append(mapLetter == '0' ? (char) 32 : mapLetter); + } + + boardData.append((char) 32); + } + + String[] playerNames = this.getCurrentlyPlaying(); + + if (playerNames.length > 0) { + this.sendToEveryone(new ITEMMSG(new String[]{this.getGameId(), "BOARDDATA", playerNames[0], "", boardData.toString()})); + } + } + + /** + * Get the name of the user(s) currently playing as an array for the packet + * + * @return the array with player name + */ + private String[] getCurrentlyPlaying() { + try { + String[] playerNames = new String[]{"", ""}; + /*for (int i = 0; i < this.playersInGame.size(); i++) { + Player player = this.playersInGame.get(i); + playerNames[i] = Character.toUpperCase(this.playerSides.get(player).getToken()) + " " + player.getDetails().getName(); + }*/ + + if (this.nextTurn != null) { + playerNames[0] = Character.toUpperCase(this.playerSides.get(this.nextTurn)) + " " + this.nextTurn.getDetails().getName(); + } + + return playerNames; + } catch (Exception ex) { + + } + + return new String[0]; + } + + /** + * Locate a player instance by the side they're playing. + * + * @param side the side used + * @return the player instance, if successful + */ + private Player getPlayerBySide(char side) { + for (var kvp : this.playerSides.entrySet()) { + if (kvp.getValue() == side) { + return kvp.getKey(); + } + } + + return null; + } + + /** + * Get token instance by character. + * + * @param side the character to compare against + * @return the instance, if successful + */ + private GameToken getToken(char side) { + GameToken token = null; + + for (GameToken t : gameTokens) { + if (t.getToken() == side) { + token = t; + break; + } + } + + return token; + } + + @Override + public int getMaximumPeopleRequired() { + return 2; + } + + @Override + public int getMinimumPeopleRequired() { + return 1; + } + + @Override + public String getGameFuseType() { + return "TicTacToe"; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/gamehalls/GamehallGame.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/gamehalls/GamehallGame.java new file mode 100644 index 0000000..92fea84 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/gamehalls/GamehallGame.java @@ -0,0 +1,312 @@ +package org.alexdev.havana.game.games.gamehalls; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.RoomManager; +import org.alexdev.havana.game.room.mapping.RoomTile; +import org.alexdev.havana.game.games.triggers.GameTrigger; +import org.alexdev.havana.messages.types.MessageComposer; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.ThreadLocalRandom; +import java.util.stream.Collectors; + +public abstract class GamehallGame { + private String gameId; + private List chairCoordinates; + private List players; + private int roomId; + private MessageComposer lastMessage; + + public GamehallGame(List chairCoordinateList) { + this.chairCoordinates = chairCoordinateList; + this.players = new CopyOnWriteArrayList<>(); + } + + /** + * Handler for when the game starts. + */ + public abstract void gameStart(); + + /** + * Handler for when the game stops. + */ + public abstract void gameStop(); + + /** + * Handle the incoming packet data from the game commands. + * + * @param player the player doing the command + * @param room the room the game is in + * @param item the item that the player is sitting on + * @param args the arguments + */ + public abstract void handleCommand(Player player, Room room, Item item, String command, String[] args); + + /** + * Join game handler for player + * @param player the player that join + */ + public abstract void joinGame(Player player); + + /** + * Leave game handler for player + * @param player the player that leaves + */ + public abstract void leaveGame(Player player); + + /** + * Gets the unique game ID instance for this pair. Will + * return null if game has not initialised. + * + * @return the game id + */ + public String getGameId() { + return gameId; + } + + /** + * Generate the unique game ID instance for this pair. + */ + public void createGameId() { + String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijlmnopqrstuvwyz1234567890"; + StringBuilder gameId = new StringBuilder(); + + for (int i = 0; i < 6; i++) { + gameId.append(alphabet.charAt(ThreadLocalRandom.current().nextInt(alphabet.length()))); + } + + this.gameId = gameId.toString(); + + for (Player player : this.players) { + player.getRoomUser().setCurrentGameId(this.gameId); + } + } + + /** + * Resets the game ID back to null. + */ + public void resetGameId() { + this.gameId = null; + } + + /** + * Get the room instance this game instance is running in. + * + * @return the room instance + */ + public Room getRoom() { + return RoomManager.getInstance().getRoomById(this.roomId); + } + + /** + * Get the opponents (not including the user supplied). + * + * @param player the player to exclude + * @return the list of opponents + */ + public List getOpponents(Player player) { + return this.players.stream().filter(p -> p.getDetails().getId() != player.getDetails().getId()).collect(Collectors.toList()); + } + + /** + * Send a packet to all opponents except the user supplied + * + * @param player the player to exclude + * @param messageComposer the message to send + */ + public void sendToOpponents(Player player, MessageComposer messageComposer) { + for (Player p : this.getOpponents(player)) { + p.send(messageComposer); + } + } + + /** + * Send a packet to everyone playing + * + * @param messageComposer the packet to send + */ + public void sendToEveryone(MessageComposer messageComposer) { + this.lastMessage = messageComposer; + + for (Player p : this.players) { + p.send(messageComposer); + } + } + + /** + * Get the list of players at each table, this list dictates who is actually at a table. Create your own list + * in each {@link GamehallGame} implementation for currently active players, for example look at {@link GameTicTacToe} + * @return the list of players at each table + */ + public List getPlayers() { + return this.players; + } + + /** + * Get if the server has the correct amount of players required before the game starts. + * + * @return true, if successful + */ + public boolean hasPlayersRequired() { + return this.players.size() >= this.getMinimumPeopleRequired(); + } + + /** + * Refresh players currently playing. + * + * @return the list of new players found + */ + public List refreshPlayers() { + this.players.forEach(p -> { + if (p.getRoomUser().getRoom() == null || !this.hasPosition(p.getRoomUser().getPosition())) { + this.players.remove(p); + } + }); + + List newPlayers = new ArrayList<>(); + + for (RoomTile roomTile : this.getTiles()) { + if (roomTile.getEntities().isEmpty()) { + continue; + } + + Entity entity = roomTile.getEntities().get(0); + Player player = (Player) entity; + + if (entity.getType() != EntityType.PLAYER) { + continue; + } + + if (player.getRoomUser().getCurrentGameId() != null) { + continue; + } + + if (this.players.contains(player)) { + continue; + } + + player.getRoomUser().setCurrentGameId(this.gameId); + + this.players.add(player); + newPlayers.add(player); + } + + return newPlayers; + } + + /** + * Return the room tiles for this room. + * + * @return the list of room tiles + */ + public List getTiles() { + List tiles = new ArrayList<>(); + Room room = this.getRoom(); + + if (room == null) { + return tiles; + } + + for (var coord : this.chairCoordinates) { + RoomTile roomTile = room.getMapping().getTile(coord[0], coord[1]); + + if (roomTile == null) { + continue; + } + + tiles.add(roomTile); + } + + return tiles; + } + + /** + * If this position is invalid, as in, the position is a chair to play on + * @param position the position + * @return true, if successful + */ + private boolean hasPosition(Position position) { + for (RoomTile roomTile : this.getTiles()) { + if (roomTile.getPosition().equals(position)) { + return true; + } + } + + return false; + } + + /** + * Get FUSE game type + * + * @return the game type + */ + public abstract String getGameFuseType(); + + /** + * Get the minimum people required for a game to start + * + * @return the required amount of people + */ + public abstract int getMinimumPeopleRequired(); + + /** + * Get the maximum people required before no one else is allowed to join + * + * @return the max people required + */ + public abstract int getMaximumPeopleRequired(); + + /** + * Restarts the game. + * + * @param trigger the trigger used for this game piece + * @param item the item that the user is sitting on + */ + public void restartGame(GameTrigger trigger, Item item){ + for (Player player : this.players) { + trigger.onEntityLeave(player, player.getRoomUser(), item); + } + } + + /** + * Get the room id this gamehall game is in + * @return the room id + */ + public int getRoomId() { + return roomId; + } + + /** + * Set the room id this gamehall game is in + * + * @param roomId the room id + */ + public void setRoomId(int roomId) { + this.roomId = roomId; + } + + /** + * Return the list of chair coordinates + * + * @return the list of chair coordinates + */ + public List getChairCoordinates() { + return chairCoordinates; + } + + /** + * Get the last message sent. + * + * @return the last message sent + */ + public MessageComposer getLastMessage() { + return lastMessage; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/gamehalls/utils/GameShip.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/gamehalls/utils/GameShip.java new file mode 100644 index 0000000..a4e2c5a --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/gamehalls/utils/GameShip.java @@ -0,0 +1,71 @@ +package org.alexdev.havana.game.games.gamehalls.utils; + +import org.alexdev.havana.game.games.gamehalls.GameBattleShip; +import org.alexdev.havana.game.pathfinder.Position; + +public class GameShip { + private final GameBattleShip game; + private final GameShipType shipType; + private final Position position; + private final int player; + private final boolean isHorizontal; + + public GameShip(GameBattleShip game, GameShipType shipType, Position position, int player, boolean isHorizontal) { + this.game = game; + this.shipType = shipType; + this.position = position; + this.player = player; + this.isHorizontal = isHorizontal; + } + + + public final GameShipType getShipType() { + return shipType; + } + + public final Position getPosition() { + return position; + } + + public final int getPlayer() { + return player; + } + + public int getHits() { + int hits = 0; + + for (int i = 0; i < this.shipType.getLength(); i++) { + int shipX = this.position.getX() + (isHorizontal ? i : 0); + int shipY = this.position.getY() + (isHorizontal ? 0 : i); + + GameShipMove shipMove = this.game.getPlayerListMap().get(this.game.getOppositePlayerNum(this.player)).stream() + .filter(move -> + move.getX() == shipX && + move.getY() == shipY) + .findFirst().orElse(null); + + if (shipMove == null) { + continue; + } + + if (shipMove.getMoveResult() == GameShipMoveResult.HIT) { + hits++; + } + } + + return hits; + } + + public boolean isHitTwice() { + int hits = this.getHits(); + return hits >= 2 && hits != this.shipType.getLength(); + } + + public boolean isDestroyed() { + return this.getHits() == this.shipType.getLength(); + } + + public boolean isHorizontal() { + return isHorizontal; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/gamehalls/utils/GameShipMove.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/gamehalls/utils/GameShipMove.java new file mode 100644 index 0000000..fb27f40 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/gamehalls/utils/GameShipMove.java @@ -0,0 +1,39 @@ +package org.alexdev.havana.game.games.gamehalls.utils; + +import org.alexdev.havana.game.player.Player; + +public class GameShipMove { + private Player player; + private int x; + private int y; + private GameShipMoveResult moveResult; + private GameShip ship; + + public GameShipMove(Player player, int x, int y, GameShipMoveResult moveResult, GameShip ship) { + this.player = player; + this.x = x; + this.y = y; + this.moveResult = moveResult; + this.ship = ship; + } + + public Player getPlayer() { + return player; + } + + public int getX() { + return x; + } + + public int getY() { + return y; + } + + public GameShipMoveResult getMoveResult() { + return moveResult; + } + + public GameShip getShip() { + return ship; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/gamehalls/utils/GameShipMoveResult.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/gamehalls/utils/GameShipMoveResult.java new file mode 100644 index 0000000..11f2328 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/gamehalls/utils/GameShipMoveResult.java @@ -0,0 +1,17 @@ +package org.alexdev.havana.game.games.gamehalls.utils; + +public enum GameShipMoveResult { + HIT("X"), + MISS("O"), + SINK("S"); + + private final String symbol; + + GameShipMoveResult(String symbol) { + this.symbol = symbol; + } + + public String getSymbol() { + return symbol; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/gamehalls/utils/GameShipType.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/gamehalls/utils/GameShipType.java new file mode 100644 index 0000000..09a3546 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/gamehalls/utils/GameShipType.java @@ -0,0 +1,40 @@ +package org.alexdev.havana.game.games.gamehalls.utils; + +public enum GameShipType { + AIRCRAFT_CARRIER(5, 1, 5), + BATTLESHIP(4, 2, 4), + CRUISER(3, 3, 3), + DESTROYER(2, 4, 2); + + private final int id; + private final int maxAllowed; + private final int length; + + GameShipType(int id, int maxAllowed, int length) { + this.id = id; + this.maxAllowed = maxAllowed; + this.length = length; + } + + public static GameShipType getById(int id) { + for (GameShipType shipType : values()) { + if (shipType.getId() == id) { + return shipType; + } + } + + return null; + } + + public int getMaxAllowed() { + return maxAllowed; + } + + public int getId() { + return id; + } + + public int getLength() { + return length; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/gamehalls/utils/GameToken.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/gamehalls/utils/GameToken.java new file mode 100644 index 0000000..e3eea2d --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/gamehalls/utils/GameToken.java @@ -0,0 +1,29 @@ +package org.alexdev.havana.game.games.gamehalls.utils; + +public class GameToken { + private char token; + private char winningToken; + private int moves; + + public GameToken(char token, char winningToken) { + this.token = token; + this.winningToken = winningToken; + this.moves = 0; + } + + public char getToken() { + return token; + } + + public char getWinningToken() { + return winningToken; + } + + public int getMoves() { + return moves; + } + + public void incrementMoves() { + this.moves = this.moves + 1; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/history/GameHistory.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/history/GameHistory.java new file mode 100644 index 0000000..b1a4b5a --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/history/GameHistory.java @@ -0,0 +1,131 @@ +package org.alexdev.havana.game.games.history; + +import org.alexdev.havana.game.games.enums.GameType; + +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class GameHistory { + private int id; + private String name; + private String gameCreator; + private int mapId; + private int winningTeam; + private int winningTeamScore; + private String extraData; + private GameType gameType; + + private GameHistoryData gameHistoryData; + + public GameHistory(GameHistoryData gameHistoryData) { + this.gameHistoryData = gameHistoryData; + } + + public GameHistoryData getHistoryData() { + return gameHistoryData; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getGameCreator() { + return gameCreator; + } + + public void setGameCreator(String gameCreator) { + this.gameCreator = gameCreator; + } + + public int getMapId() { + return mapId; + } + + public void setMapId(int mapId) { + this.mapId = mapId; + } + + public GameType getGameType() { + return gameType; + } + + public void setGameType(GameType gameType) { + this.gameType = gameType; + } + + public GameHistoryData getGameHistoryData() { + return gameHistoryData; + } + + public void setGameHistoryData(GameHistoryData gameHistoryData) { + this.gameHistoryData = gameHistoryData; + } + + public int getWinningTeam() { + return winningTeam; + } + + public void setWinningTeam(int winningTeam) { + this.winningTeam = winningTeam; + } + + public int getWinningTeamScore() { + return winningTeamScore; + } + + public void setWinningTeamScore(int winningTeamScore) { + this.winningTeamScore = winningTeamScore; + } + + public String getExtraData() { + return extraData; + } + + public void setExtraData(String extraData) { + this.extraData = extraData; + } + + public List getAllowedPowerUps() { + if (this.extraData.length() > 0) { + return Stream.of(this.extraData.split(",")) + .map(Integer::parseInt) + .collect(Collectors.toList()); + } + + return List.of(); + } + + public Integer getGameLength() { + if (this.gameType == GameType.SNOWSTORM) { + var gameLengthChoice = Integer.parseInt(this.extraData); + + if (gameLengthChoice == 1) { + return (int) TimeUnit.MINUTES.toSeconds(2); + } + + if (gameLengthChoice == 2) { + return (int) TimeUnit.MINUTES.toSeconds(3); + } + + if (gameLengthChoice == 3) { + return (int) TimeUnit.MINUTES.toSeconds(5); + } + } + + return 0; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/history/GameHistoryData.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/history/GameHistoryData.java new file mode 100644 index 0000000..3724cbd --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/history/GameHistoryData.java @@ -0,0 +1,41 @@ +package org.alexdev.havana.game.games.history; + +import org.alexdev.havana.game.games.enums.GameType; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class GameHistoryData { + private int teamCount; + private List players; + + public GameHistoryData() { + this.players = new ArrayList<>(); + } + + public void addPlayer(int userId, int points, int teamId) { + this.players.add(new GameHistoryPlayer(points, teamId, userId)); + } + + public int getTeamCount() { + return teamCount; + } + + public void setTeamCount(int teamCount) { + this.teamCount = teamCount; + } + + public Map> getTeamData() { + var teamHistory = new HashMap>(); + + for (int i = 0; i < this.teamCount; i++) { + var teamId = i; + teamHistory.put(i, this.players.stream().filter(player -> player.getTeamId() == teamId).collect(Collectors.toList())); + } + + return teamHistory; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/history/GameHistoryPlayer.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/history/GameHistoryPlayer.java new file mode 100644 index 0000000..697d530 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/history/GameHistoryPlayer.java @@ -0,0 +1,37 @@ +package org.alexdev.havana.game.games.history; + +import org.alexdev.havana.dao.mysql.GameDao; +import org.alexdev.havana.dao.mysql.PlayerDao; + +public class GameHistoryPlayer { + private int score; + private int teamId; + private int userId; + private String username; + + public GameHistoryPlayer(int score, int teamId, int userId) { + this.score = score; + this.teamId = teamId; + this.userId = userId; + } + + public int getScore() { + return score; + } + + public int getTeamId() { + return teamId; + } + + public int getUserId() { + return userId; + } + + public String getName() { + if (this.username == null) { + this.username = PlayerDao.getName(this.userId); + } + + return username; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/history/ScoreEntry.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/history/ScoreEntry.java new file mode 100644 index 0000000..6277af0 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/history/ScoreEntry.java @@ -0,0 +1,25 @@ +package org.alexdev.havana.game.games.history; + +public class ScoreEntry { + private String playerName; + private long score; + private int position; + + public ScoreEntry(String playerName, long score, int position) { + this.playerName = playerName; + this.score = score; + this.position = position; + } + + public String getPlayerName() { + return playerName; + } + + public long getScore() { + return score; + } + + public int getPosition() { + return position; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/player/GamePlayer.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/player/GamePlayer.java new file mode 100644 index 0000000..2d94fa0 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/player/GamePlayer.java @@ -0,0 +1,360 @@ +package org.alexdev.havana.game.games.player; + +import org.alexdev.havana.game.games.battleball.BattleBallGame; +import org.alexdev.havana.game.games.battleball.BattleBallTile; +import org.alexdev.havana.game.games.battleball.enums.BattleBallPlayerState; +import org.alexdev.havana.game.games.Game; +import org.alexdev.havana.game.games.GameManager; +import org.alexdev.havana.game.games.GameObject; +import org.alexdev.havana.game.games.utils.ScoreReference; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.games.snowstorm.util.SnowStormAttributes; + +public class GamePlayer { + private Player player; + private GameObject gameObject; + private int userId; + private int objectId; + private int gameId; + private int teamId; + private Position position; + private boolean enteringGame; + private boolean isSpectator; + private boolean inGame; + private boolean clickedRestart; + private BattleBallPlayerState playerState; + private GamePlayer harlequinPlayer; + + private boolean assignedSpawn; + private int score; + private int xp; + + private SnowStormAttributes snowStormAttributes; + + public GamePlayer(Player player) { + this.player = player; + this.userId = player.getDetails().getId(); + this.teamId = -1; + this.gameId = -1; + this.objectId = -1; + this.harlequinPlayer = null; + this.enteringGame = false; + this.clickedRestart = false; + this.position = new Position(); + this.score = 0; + this.xp = 0; + this.snowStormAttributes = new SnowStormAttributes(); + } + + /** + * Set the score. + * + * @param score the score + */ + public void setScore(int score) { + this.score = score; + } + + /** + * Get the score of the current player, the team score is generated by adding all scores from all players + * + * @return the score + */ + public int getScore() { + if (!this.inGame) { + return 0; + } + + if (this.getGame() instanceof BattleBallGame) { + this.score = 0; + BattleBallGame battleBallGame = (BattleBallGame) this.getGame(); + + for (BattleBallTile battleBallTile : battleBallGame.getTiles()) { + for (ScoreReference scoreReference : battleBallTile.getPointsReferece()) { + if (scoreReference.getBy() != this.userId) { + continue; + } + + this.score += scoreReference.getScore(); + } + } + } + + return this.score; + } + + /** + * Get the xp of the current player + * + * @return the score + */ + public int getXp() { + return xp; + } + /** + * Sets the xp for the player, does NOT allow negative numbers + * + * @param xp the xp to set + */ + public void setXp(int xp) { + this.xp = xp; + if (this.xp < 0) { + this.xp = 0; + } + } + + + /** + * Get the game the game player is currently playing in + * + * @return the game instance + */ + public Game getGame() { + return GameManager.getInstance().getGameById(this.getGameId()); + } + + /** + * Get the player being held in this game player instance + * + * @return the game player + */ + public Player getPlayer() { + return player; + } + + /** + * Get the user id of the game player + * + * @return the user id of the game player + */ + public int getUserId() { + return userId; + } + + /** + * Get the current team the user is on, this will take the Harlequin power up into account so + * use {@getTeamId()} for their actual team id. + * + * @return the team instance + */ + public GameTeam getTeam() { + int teamId = this.harlequinPlayer != null ? this.harlequinPlayer.getTeamId() : this.getTeamId(); + return this.getGame().getTeams().get(teamId); + } + + /** + * Get the team id that the player is currently in + * + * @return the team id + */ + public int getTeamId() { + return teamId; + } + + /** + * Set the team id the user is currently in + * + * @param teamId the team id + */ + public void setTeamId(int teamId) { + this.teamId = teamId; + } + + /** + * Set the spawn position of the player, used for when the game starts and restarts + * + * @return the spawn position + */ + public Position getSpawnPosition() { + return position; + } + + /** + * Get the current game id that the gamer player is in, -1 for no game + * + * @return the game id + */ + public int getGameId() { + return gameId; + } + + /** + * Set the game id the user is currently in + * + * @param gameId the game id + */ + public void setGameId(int gameId) { + this.gameId = gameId; + } + + /** + * Get if the user is entering the game, used for disabling walking on room entry + * + * @return true, if successful + */ + public boolean isEnteringGame() { + return enteringGame; + } + + /** + * Set whether not the users are entering a game + * + * @param enteringGame whether not they're entering the game + */ + public void setEnteringGame(boolean enteringGame) { + this.enteringGame = enteringGame; + } + + /** + * Get whether the user is in game or not + * + * @return true, if successful + */ + public boolean isInGame() { + return inGame; + } + + /** + * Set whether they're in game or not + * + * @param inGame the flag to set + */ + public void setInGame(boolean inGame) { + this.inGame = inGame; + } + + /** + * Get if the user has clicked restart when the game has ended + * + * @return true, if successful + */ + public boolean isClickedRestart() { + return clickedRestart; + } + + /** + * Set whether not the gamer player clicked restart when the game ended + * + * @param clickedRestart the flag whether or not they clicked restart + */ + public void setClickedRestart(boolean clickedRestart) { + this.clickedRestart = clickedRestart; + } + + /** + * Get the opponent object id that the user is colouring for + * + * @return the opponent id, -1 for none + */ + public int getColouringForOpponentId() { + return harlequinPlayer != null ? harlequinPlayer.getObjectId() : -1; + } + + /** + * Get the player that acticated the harlequin up + * + * @return the player who activated the power up + */ + public GamePlayer getHarlequinPlayer() { + return harlequinPlayer; + } + + /** + * Set the player who activated the harlequin power up + * + * @param harlequinPlayer the game player + */ + public void setHarlequinPlayer(GamePlayer harlequinPlayer) { + this.harlequinPlayer = harlequinPlayer; + } + + /** + * Get if the user is spectating the match + * + * @return true, if successful + */ + public boolean isSpectator() { + return isSpectator; + } + + /** + * Set whether or not the user is spectating the match or not + * + * @param spectator whether or not they're spectating + */ + public void setSpectator(boolean spectator) { + isSpectator = spectator; + } + + /** + * Get the current state the player is in, the default being NORMAL. + * + * @return the player state + */ + public BattleBallPlayerState getPlayerState() { + return playerState; + } + + /** + * Set the current state the player is in + * + * @param playerState the player state + */ + public void setPlayerState(BattleBallPlayerState playerState) { + this.playerState = playerState; + } + + /** + * Get the game object attached to this player + * + * @return the game object + */ + public GameObject getGameObject() { + return gameObject; + } + + /** + * Set the game object attached to this player + * + * @param gameObject the game object + */ + public void setGameObject(GameObject gameObject) { + this.gameObject = gameObject; + } + + /** + * Get the object id attached to this player + * + * @return the object id + */ + public int getObjectId() { + return objectId; + } + + /** + * Set the object id attached to this player + * + * @param objectId the object id + */ + public void setObjectId(int objectId) { + this.objectId = objectId; + } + + /** + * Get the class for snowstorm attributes. + * + * @return the instance + */ + public SnowStormAttributes getSnowStormAttributes() { + return snowStormAttributes; + } + + public boolean isAssignedSpawn() { + return assignedSpawn; + } + + public void setAssignedSpawn(boolean assignedSpawn) { + this.assignedSpawn = assignedSpawn; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/player/GameRank.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/player/GameRank.java new file mode 100644 index 0000000..985a93a --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/player/GameRank.java @@ -0,0 +1,64 @@ +package org.alexdev.havana.game.games.player; + +import org.alexdev.havana.game.games.enums.GameType; + +public class GameRank { + private final int id; + private final GameType type; + private final String title; + private final int minPoints; + private final int maxPoints; + + public GameRank(int id, String type, String title, int minPoints, int maxPoints) { + this.id = id; + this.type = GameType.valueOf(type.toUpperCase()); + this.title = title; + this.minPoints = minPoints; + this.maxPoints = maxPoints; + } + + /** + * Get the game rank ID + * + * @return the game rank ID + */ + public int getId() { + return id; + } + + /** + * Get the game type for this rank + * + * @return the game type + */ + public GameType getType() { + return type; + } + + /** + * Get the rank title + * + * @return the rank title of this game + */ + public String getTitle() { + return title; + } + + /** + * Get the minimum amount of points required for this game + * + * @return the minimum points + */ + public int getMinPoints() { + return minPoints; + } + + /** + * Get the maximum amount of points required for this game + * + * @return the maximum amount of points + */ + public int getMaxPoints() { + return maxPoints; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/player/GameTeam.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/player/GameTeam.java new file mode 100644 index 0000000..f80e81b --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/player/GameTeam.java @@ -0,0 +1,60 @@ +package org.alexdev.havana.game.games.player; + +import org.alexdev.havana.game.games.Game; +import org.alexdev.havana.game.games.battleball.BattleBallGame; +import org.alexdev.havana.game.games.battleball.BattleBallTile; +import org.alexdev.havana.game.games.utils.ScoreReference; + +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.stream.Collectors; + +public class GameTeam { + private int id; + private Game game; + private List playerList; + private int score; + + public GameTeam(int id, Game game) { + this.id = id; + this.game = game; + this.playerList = new CopyOnWriteArrayList<>(); + this.score = 0; + } + + public int getId() { + return id; + } + + public List getPlayers() { + return playerList; + } + + public int getScore() { + if (this.game instanceof BattleBallGame) { + this.score = 0; + + BattleBallGame battleBallGame = (BattleBallGame) this.game; + + for (BattleBallTile battleBallTile : battleBallGame.getTiles()) { + for (ScoreReference scoreReference : battleBallTile.getPointsReferece()) { + if (scoreReference.getGameTeam().getId() != this.id) { + continue; + } + + this.score += scoreReference.getScore(); + } + } + } + + return this.score; + } + + public void setScore(int score) { + this.score = score; + } + + public List getActivePlayers() { + return playerList.stream().filter(GamePlayer::isInGame).collect(Collectors.toList()); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/SnowStormGame.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/SnowStormGame.java new file mode 100644 index 0000000..bdc300c --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/SnowStormGame.java @@ -0,0 +1,332 @@ +package org.alexdev.havana.game.games.snowstorm; + +import org.alexdev.havana.dao.mysql.CurrencyDao; +import org.alexdev.havana.game.games.Game; +import org.alexdev.havana.game.games.GameManager; +import org.alexdev.havana.game.games.GameObject; +import org.alexdev.havana.game.games.GameTile; +import org.alexdev.havana.game.games.enums.GameState; +import org.alexdev.havana.game.games.enums.GameType; +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.games.player.GameTeam; +import org.alexdev.havana.game.games.snowstorm.events.SnowStormDeleteObjectEvent; +import org.alexdev.havana.game.games.snowstorm.events.SnowStormHitEvent; +import org.alexdev.havana.game.games.snowstorm.events.SnowStormStunEvent; +import org.alexdev.havana.game.games.snowstorm.mapping.SnowStormMap; +import org.alexdev.havana.game.games.snowstorm.objects.SnowStormAvatarObject; +import org.alexdev.havana.game.games.snowstorm.objects.SnowStormMachineObject; +import org.alexdev.havana.game.games.snowstorm.objects.SnowballObject; +import org.alexdev.havana.game.games.snowstorm.tasks.SnowStormGameTask; +import org.alexdev.havana.game.games.snowstorm.util.SnowStormActivityState; +import org.alexdev.havana.game.games.snowstorm.util.SnowStormSpawn; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.pathfinder.Rotation; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.models.RoomModel; +import org.alexdev.havana.log.Log; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.config.GameConfiguration; + +import java.util.Collections; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.TimeUnit; + +public class SnowStormGame extends Game { + public static final int MAX_QUICK_THROW_DISTANCE = 22; + private int gameLengthChoice; + private List executingEvents; + private long gameStarted; + + public SnowStormGame(int id, int mapId, String name, int teamAmount, Player gameCreator, int gameLengthChoice, boolean privateGame) { + super(id, mapId, GameType.SNOWSTORM, name, teamAmount, gameCreator); + this.gameLengthChoice = gameLengthChoice; + this.executingEvents = new CopyOnWriteArrayList<>(); + } + + @Override + public boolean hasEnoughPlayers() { + if (this.getTeamAmount() == 1) { + return this.getActivePlayers().size() > 0; + } else { + int activeTeamCount = 0; + + for (int i = 0; i < this.getTeamAmount(); i++) { + if (this.getTeams().get(i).getActivePlayers().size() > 0) { + activeTeamCount++; + } + } + + return activeTeamCount > 0; + } + } + + @Override + public void initialise() { + var model = new RoomModel("snowwar_arena_0", "snowwar_arena_0", 0, 0, 0, 0, + SnowStormMapsManager.getInstance().getHeightMap(this.getMapId()), null); + + int seconds = 0; + + if (this.gameLengthChoice == 1) { + seconds = (int) TimeUnit.MINUTES.toSeconds(2); + } + + if (this.gameLengthChoice == 2) { + seconds = (int) TimeUnit.MINUTES.toSeconds(3); + } + + if (this.gameLengthChoice == 3) { + seconds = (int) TimeUnit.MINUTES.toSeconds(5); + } + + if (GameManager.getInstance().getLifetimeSeconds(this.getGameType()) > 0) { + seconds = GameManager.getInstance().getLifetimeSeconds(this.getGameType()); + } + + super.initialise(seconds, "SnowStorm Arena", model); + this.gameStarted = DateUtil.getCurrentTimeSeconds(); + + for (var snowballItem : this.getMap().getItems()) { + if (snowballItem.isSnowballMachine()) { + this.getObjects().add(new SnowStormMachineObject(this.createObjectId(), snowballItem.getX(), snowballItem.getY(), 0)); + } + } + //this.getTotalSecondsLeft().set(seconds); // Override with game length choice + } + + @Override + public void gamePrepare() { + super.gamePrepare(); + + int ticketCharge = GameConfiguration.getInstance().getInteger("snowstorm.ticket.charge"); + + if (ticketCharge > 0) { + for (GamePlayer gamePlayer : this.getActivePlayers()) { + CurrencyDao.decreaseTickets(gamePlayer.getPlayer().getDetails(), 2); // BattleBall costs 2 tickets + } + } + } + + @Override + public void finishGame() { + for (GamePlayer p : this.getActivePlayers()) { + p.setScore(p.getSnowStormAttributes().getScore().get()); + } + + for (GameTeam team : this.getTeams().values()) { + team.setScore(team.getPlayers().stream().mapToInt(GamePlayer::getScore).sum()); + } + + super.finishGame(); + } + + @Override + public void assignSpawnPoints() { + this.getRoom().getMapping().regenerateCollisionMap(); + + for (GameTeam team : this.getTeams().values()) { + for (GamePlayer p : team.getPlayers()) { + p.setAssignedSpawn(false); + } + } + + for (GameTeam team : this.getTeams().values()) { + for (GamePlayer p : team.getPlayers()) { + generateSpawn(p); + p.getSnowStormAttributes().setRotation(ThreadLocalRandom.current().nextInt(0, 7)); + //p.getPlayer().getBadgeManager().tryAddBadge("SS_BETA", null); + p.getSnowStormAttributes().setActivityState(SnowStormActivityState.ACTIVITY_STATE_NORMAL); + + p.getSnowStormAttributes().setWalking(false); + p.getSnowStormAttributes().setCurrentPosition(p.getSpawnPosition().copy()); + p.getSnowStormAttributes().setWalkGoal(null); + p.getSnowStormAttributes().setNextGoal(null); + + p.getSnowStormAttributes().setImmunityExpiry(0); + p.getSnowStormAttributes().getScore().set(0); + p.getSnowStormAttributes().getSnowballs().set(5); + p.getSnowStormAttributes().getHealth().set(4); + p.getSnowStormAttributes().setGoalWorldCoordinates(null); + + p.setObjectId(this.createObjectId()); + p.setScore(0); + + p.setGameObject(new SnowStormAvatarObject(p)); + this.getObjects().add(p.getGameObject()); + + } + } + } + + private void generateSpawn(GamePlayer p) { + if (this.getMap().getSpawnClusters().length == 0) { + p.getSpawnPosition().setX(15); + p.getSpawnPosition().setY(18); + p.setAssignedSpawn(true); + return; + } + + try { + SnowStormSpawn spawn = this.getMap().getSpawnClusters()[ThreadLocalRandom.current().nextInt(this.getMap().getSpawnClusters().length)]; + + List potentialPositions = spawn.getPosition().getCircle(spawn.getRadius()); + Collections.shuffle(potentialPositions); + + Position candidate = potentialPositions.get(ThreadLocalRandom.current().nextInt(0, potentialPositions.size() - 1)); + + for (GamePlayer gamePlayer : this.getActivePlayers()) { + if (!gamePlayer.isAssignedSpawn()) { + continue; + } + + int distance = gamePlayer.getSpawnPosition().getDistanceSquared(candidate); + + if (distance < spawn.getMinDistance()) { + generateSpawn(p); + return; + } + } + + if (this.getMap().getTile(candidate) == null || !this.getMap().getTile(candidate).isWalkable()) { + generateSpawn(p); + return; + } + + p.getSpawnPosition().setX(candidate.getX()); + p.getSpawnPosition().setY(candidate.getY()); + p.setAssignedSpawn(true); + } catch (Exception ex) { + Log.getErrorLogger().error("Exception when assigning spawn point on map {}:", this.getMapId(), ex); + + p.getSpawnPosition().setX(15); + p.getSpawnPosition().setY(18); + p.setAssignedSpawn(true); + } + } + + public int getGameLength() { + if (this.getGameState() == GameState.WAITING || this.getGameState() == GameState.ENDED) { + if (this.gameLengthChoice == 1) { + return (int) TimeUnit.MINUTES.toSeconds(2); + } + + if (this.gameLengthChoice == 2) { + return (int) TimeUnit.MINUTES.toSeconds(3); + } + + if (this.gameLengthChoice == 3) { + return (int) TimeUnit.MINUTES.toSeconds(5); + } + } + + return this.getTotalSecondsLeft().get(); + } + + public static int convertToGameCoordinate(int num) { + int pAccuracyFactor = 100; + int pTileSize = 32; + int tMultiplier = pTileSize * pAccuracyFactor; + + return num / tMultiplier; + } + + public static int convertToWorldCoordinate(int num) { + int pAccuracyFactor = 100; + int pTileSize = 32; + int tMultiplier = pTileSize * pAccuracyFactor; + + return num * tMultiplier; + } + + public boolean isOppositionPlayer(GamePlayer gamePlayer, GamePlayer player) { + if (gamePlayer.getPlayer().getDetails().getId() == player.getPlayer().getDetails().getId()) { + return false; + } + + if (this.getTeamAmount() == 1) { + return true; + } + + return gamePlayer.getTeamId() != player.getTeamId(); + } + + public void handleSnowballLanding(SnowballObject snowball, boolean deleteAfterHit) { + var lastTilePosition = new Position(snowball.getTargetX(), snowball.getTargetY()); + var tile = this.getMap().getTile(lastTilePosition); + + if (tile == null) { + return; + } + + var player = this.getActivePlayers().stream().filter(p -> + this.isOppositionPlayer(p, snowball.getThrower()) && + (p.getSnowStormAttributes().getCurrentPosition().equals(lastTilePosition) || + (p.getSnowStormAttributes().getNextGoal() != null && p.getSnowStormAttributes().getNextGoal().equals(lastTilePosition))) && + p.getSnowStormAttributes().isDamageable()) + .findFirst().orElse(null); + + if (player != null && player.getSnowStormAttributes().getHealth().get() > 0) { + snowball.getThrower().getSnowStormAttributes().getScore().incrementAndGet(); + + this.getUpdateTask().sendQueue(0, 1, new SnowStormHitEvent(snowball.getThrower().getObjectId(), player.getObjectId(), + Rotation.calculateWalkDirection(snowball.getFromX(), snowball.getFromY(), lastTilePosition.getX(), lastTilePosition.getY()))); + + if (deleteAfterHit) { + this.getUpdateTask().sendQueue(0, 1, new SnowStormDeleteObjectEvent(snowball.getObjectId())); + } + + //System.out.println("Player " + gamePlayer.getPlayer().getDetails().getName() + " hits " + player.getPlayer().getDetails().getName()); + + if (player.getSnowStormAttributes().getHealth().decrementAndGet() == 0) { + stunPlayerHandler(this, snowball.getThrower(), player, lastTilePosition, snowball); + } + } else { + if (snowball.isBlocked()) { + this.getUpdateTask().sendQueue(0, 1, new SnowStormDeleteObjectEvent(snowball.getObjectId())); + } + } + } + + public static void stunPlayerHandler(SnowStormGame game, GamePlayer thrower, GamePlayer player, Position landedPosition, SnowballObject snowball) { + game.getUpdateTask().sendQueue(0, 1, new SnowStormStunEvent(player.getObjectId(), thrower.getObjectId(), + 45 * Rotation.calculateWalkDirection(snowball.getFromX(), snowball.getFromY(), landedPosition.getX(), landedPosition.getY()))); + //System.out.println("Player " + thrower.getPlayer().getDetails().getName() + " hits " + player.getPlayer().getDetails().getName()); + + thrower.getSnowStormAttributes().getScore().addAndGet(5); + player.getSnowStormAttributes().getSnowballs().set(0); + player.getSnowStormAttributes().getHealth().set(4); + + player.getSnowStormAttributes().setActivityState(SnowStormActivityState.ACTIVITY_STATE_STUNNED, () -> { + player.getSnowStormAttributes().setActivityState(SnowStormActivityState.ACTIVITY_STATE_INVINCIBLE_AFTER_STUN); + player.getSnowStormAttributes().setImmunityExpiry(System.currentTimeMillis() + SnowStormActivityState.ACTIVITY_STATE_INVINCIBLE_AFTER_STUN.getTimeInMS()); + }); + } + + public SnowStormGameTask getUpdateTask() { + return (SnowStormGameTask) this.getRoom().getTaskManager().getTask("UpdateTask"); + } + + @Override + public void gameTick() { } + + @Override + public boolean canTimerContinue() { return true; } + + @Override + public GameTile[][] getTileMap() { + return new GameTile[0][]; + } + + @Override + public void buildMap() { } + + public SnowStormMap getMap() { + return SnowStormMapsManager.getInstance().getMap(this.getMapId()); + } + + public int getGameLengthChoice() { + return gameLengthChoice; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/SnowStormMapsManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/SnowStormMapsManager.java new file mode 100644 index 0000000..47f2451 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/SnowStormMapsManager.java @@ -0,0 +1,208 @@ +package org.alexdev.havana.game.games.snowstorm; + +import org.alexdev.havana.game.games.snowstorm.mapping.SnowStormItem; +import org.alexdev.havana.game.games.snowstorm.mapping.SnowStormMap; +import org.alexdev.havana.game.games.snowstorm.util.SnowStormSpawn; +import org.alexdev.havana.log.Log; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; +import java.util.regex.Pattern; + +public class SnowStormMapsManager { + private static SnowStormMapsManager instance; + private Map snowStormMapMaps; + + public SnowStormMapsManager() { + this.snowStormMapMaps = new HashMap<>(); + + for (int i = 1; i <= 7; i++) { + parseMap(i); + } + } + + private void parseMap(int mapId) { + var filePath = Path.of("tools", "snowstorm_maps", "arena_" + mapId + ".dat"); + + if (!filePath.toFile().exists()) { + return; + } + + try { + var mapData = Files.readString(filePath); + var itemList = new ArrayList(); + + for (var itemLine : mapData.split(Character.toString(13))) { + var itemData = itemLine.split(" "); + + var item = new SnowStormItem( + itemData[0], + itemData[1], + Integer.parseInt(itemData[2]), + Integer.parseInt(itemData[3]), + Integer.parseInt(itemData[4]), + Integer.parseInt(itemData[5]), + getItemHeight(itemData[1]) + ); + + itemList.add(item); + } + + var snowmachineDataPath = Path.of("tools", "snowstorm_maps", "arena_" + mapId + "_snowmachines.dat"); + + if (snowmachineDataPath.toFile().exists()) { + var snowmachineFileContents = Files.readString(snowmachineDataPath); + + for (var snowmachineData : snowmachineFileContents.split(Character.toString(13))) { + var itemData = snowmachineData.split(" "); + + var item = new SnowStormItem("", "snowball_machine", Integer.parseInt(itemData[0]), Integer.parseInt(itemData[1]), 0, 0, 1); + itemList.add(item); + + item = new SnowStormItem("", "snowball_machine_hidden", Integer.parseInt(itemData[0]) + 1, Integer.parseInt(itemData[1]), 0, 0, 1); + itemList.add(item); + + item = new SnowStormItem("", "snowball_machine_hidden", Integer.parseInt(itemData[0]) + 2, Integer.parseInt(itemData[1]), 0, 0, 1); + itemList.add(item); + } + } + + var spawnClusters = new ArrayList(); + var spawnClusterPath = Path.of("tools", "snowstorm_maps", "arena_" + mapId + "_spawn_clusters.dat"); + + if (spawnClusterPath.toFile().exists()) { + for (String spawnClusterData : Files.readString(spawnClusterPath).split(Pattern.quote("|"))) {//Character.toString(13))) { + var spawnData = spawnClusterData.split(" "); + + var x = Integer.parseInt(spawnData[0]); + var y = Integer.parseInt(spawnData[1]); + var radius = Integer.parseInt(spawnData[2]); + var minDistance = Integer.parseInt(spawnData[3]); + + spawnClusters.add(new SnowStormSpawn(x, y, radius, minDistance)); + } + } + + this.snowStormMapMaps.put(mapId, new SnowStormMap(mapId, mapData, itemList, getHeightMap(mapId), spawnClusters)); + } catch (IOException ex) { + Log.getErrorLogger().error("Error when parsing map " + mapId + ": ", ex); + } + } + + private int getItemHeight(String spriteName) { + switch (spriteName){ + case "sw_tree1": + case "sw_tree2": + case "sw_tree3": + case "sw_tree4": + case "block_basic3": + case "obst_snowman": + case "block_arch1": + case "block_arch3": + case "block_arch1b": + case "block_arch3b": + return 3; + case "block_basic2": + case "block_ice2": + return 2; + case "block_basic": + //case "block_small": + case "obst_duck": + case "sw_fence": + case "block_ice": + return 1; + } + + return 0; + } + + public static SnowStormMapsManager getInstance() { + if (instance == null) { + instance = new SnowStormMapsManager(); + } + + return instance; + } + + public static void reset() { + instance = null; + getInstance(); + } + + public String getHeightMap(int mapId) { + if (mapId == 1) { + return "xxxxxxxxxxxxxxxxxxx00000xxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxx0000000xxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxx000000000xxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxx00000000000xxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxx0000000000000xxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxx000000000000000xxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxx00000000000000000xxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxx0000000000000000000xxxxxxxxxxxxxxxxxxx|xxxxxxxxxxx000000000000000000000xxxxxxxxxxxxxxxxxx|xxxxxxxxxx00000000000000000000000xxxxxxxxxxxxxxxxx|xxxxxxxxx0000000000000000000000000xxxxxxxxxxxxxxxx|xxxxxxxx000000000000000000000000000xxxxxxxxxxxxxxx|xxxxxxx00000000000000000000000000000xxxxxxxxxxxxxx|xxxxxx0000000000000000000000000000000xxxxxxxxxxxxx|xxxxx000000000000000000000000000000000xxxxxxxxxxxx|xxxx00000000000000000000000000000000000xxxxxxxxxxx|xxx0000000000000000000000000000000000000xxxxxxxxxx|xx000000000000000000000000000000000000000xxxxxxxxx|x00000000000000000000000000000000000000000xxxxxxxx|00000000000000000000xxxx0xxxxxx000000000000xxxxxxx|00000000000000000000xxxx0xxxxxxx000000000000xxxxxx|00000000000000000000xxxx0xxxxxxx0000000000000xxxxx|00000000000000000000xxx000000xxx00000000000000xxxx|x0000000000000000000xxx000000xxx000000000000000xxx|xx000000000000000000xxx0000000000000000000000000xx|xxx00000000000000000xxx000000xxx00000000000000000x|xxxx0000000000000000000000000xxx000000000000000000|xxxxx000000000000000xxx000000xxx000000000000000000|xxxxxx00000000000000xxxxxxx0xxxx000000000000000000|xxxxxxx0000000000000xxxxxxx0xxxx000000000000000000|xxxxxxxx0000000000000xxxxxx0xxx0000000000000000000|xxxxxxxxx00000000000000000000000000000000000000000|xxxxxxxxxx000000000000000000000000000000000000000x|xxxxxxxxxxx0000000000000000000000000000000000000xx|xxxxxxxxxxxx00000000000000000000000000000000000xxx|xxxxxxxxxxxxx000000000000000000000000000000000xxxx|xxxxxxxxxxxxxx0000000000000000000000000000000xxxxx|xxxxxxxxxxxxxxx00000000000000000000000000000xxxxxx|xxxxxxxxxxxxxxxx000000000000000000000000000xxxxxxx|xxxxxxxxxxxxxxxxx0000000000000000000000000xxxxxxxx|xxxxxxxxxxxxxxxxxx00000000000000000000000xxxxxxxxx|xxxxxxxxxxxxxxxxxxx000000000000000000000xxxxxxxxxx|xxxxxxxxxxxxxxxxxxxx0000000000000000000xxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxx00000000000000000xxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxx000000000000000xxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxx0000000000000xxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxx00000000000xxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxx000000000xxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxx0000000xxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxx00000xxxxxxxxxxxxxxxxxx|"; + } + + if (mapId == 2) { + return "xxxxxxxxxxxxxxxxxxx00000xxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxx0000000xxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxx000000000xxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxx00000000000xxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxx0000000000000xxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxx000000000000000xxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxx00000000000000000xxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxx0000000000000000000xxxxxxxxxxxxxxxxxxx|xxxxxxxxxxx000000000000000000000xxxxxxxxxxxxxxxxxx|xxxxxxxxxx00000000000000000000000xxxxxxxxxxxxxxxxx|xxxxxxxxx0000000000000000000000000xxxxxxxxxxxxxxxx|xxxxxxxx000000000000000000000000000xxxxxxxxxxxxxxx|xxxxxxx00000000000000000000000000000xxxxxxxxxxxxxx|xxxxxx0000000000000000000000000000000xxxxxxxxxxxxx|xxxxx000000000000000000000000000000000xxxxxxxxxxxx|xxxx00000000000000000000000000000000000xxxxxxxxxxx|xxx0000000000000000000000000000000000000xxxxxxxxxx|xx000000000000000000000000000000000000000xxxxxxxxx|x00000000000000000000000000000000000000000xxxxxxxx|0000000000000000000000000000000000000000000xxxxxxx|0000000000000000000xxxxxxxxxx0xxxxxx00000000xxxxxx|0000000000000000000xxxxxxxxxx0xxxxxxx00000000xxxxx|0000000000000000000xxxxxxxxxx0xxxxxxx000000000xxxx|x000000000000000000xxx000000000000xxx0000000000xxx|xx00000000000000000xxx000000000000xxx00000000000xx|xxx0000000000000000xxx000000000000xxx000000000000x|xxxx000000000000000xxx000000000000xxx0000000000000|xxxxx00000000000000000000000000000xxx0000000000000|xxxxxx0000000000000xxx000000000000xxxx000000000000|xxxxxxx000000000000xxx000000000000xxxxxxxxxx0xxxxx|xxxxxxxx00000000000xxx000000000000xxxxxxxxxx0xxxxx|xxxxxxxxx0000000000xxx0000000000000xxxxxxxxx0xxxxx|xxxxxxxxxx000000000xxxxxxxx0000000000000000000000x|xxxxxxxxxxx00000000xxxxxxxxx00000000000000000000xx|xxxxxxxxxxxx00000000xxxxxxxx0000000000000000000xxx|xxxxxxxxxxxxx000000000000xxx000000000000000000xxxx|xxxxxxxxxxxxxx00000000000xxx00000000000000000xxxxx|xxxxxxxxxxxxxxx0000000000xxx0000000000000000xxxxxx|xxxxxxxxxxxxxxxx000000000xxx000000000000000xxxxxxx|xxxxxxxxxxxxxxxxx00000000xxx00000000000000xxxxxxxx|xxxxxxxxxxxxxxxxxx0000000xxx0000000000000xxxxxxxxx|xxxxxxxxxxxxxxxxxxx000000xxx000000000000xxxxxxxxxx|xxxxxxxxxxxxxxxxxxxx00000xxx00000000000xxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxx0000xxx0000000000xxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxx000xxx000000000xxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxx00xxx00000000xxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxx0xxx0000000xxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxx000000xxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxx00000xxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxx0000xxxxxxxxxxxxxxxxxx|"; + } + + if (mapId == 3) { + return "xxxxxxxxxxxxxxxxxxx00000xxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxx0000000xxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxx000000000xxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxx00000000000xxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxx000000000000xxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxx0000000000000xxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxx00000000000xxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxx00000000000000xxxx0xxxxxxxxxxxxxxxxxxx|xxxxxxxxxxx0000000000000000xxx00xxxxxxxxxxxxxxxxxx|xxxxxxxxxx00000000000000000xxx0000xxxxxxxxxxxxxxxx|xxxxxxxxx000000000000000000xxx00000xxxxxxxxxxxxxxx|xxxxxxxx0000000000000000000xxx00000xxxxxxxxxxxxxxx|xxxxxxx00000000000000000000xxx000000xxxxxxxxxxxxxx|xxxxxx000000000000000000000xxx0000000xxxxxxxxxxxxx|xxxxx0000000000000000000000xxx00000000xxxxxxxxxxxx|xxxx00000000000000000000000xxx000000000xxxxxxxxxxx|xxx000000000000000000000000xxx0000000000xxxxxxxxxx|xx0000000000000000000000000xxx00000000000xxxxxxxxx|x00000000000000000000000000xxx000000000000xxxxxxxx|000000000000000000000000000xxx0000000000000xxxxxxx|000000000000000000000000000xxx00000000000000xxxxxx|000000000000000000000000000xxx000000000000000xxxxx|0000000000000000000000000000000000000000000000xxxx|x0000000000000000000000000000000000000000000000xxx|xx00000000000000000000000000x0000000000000000000xx|xxx000000000000000000000000xxx0000000000000000000x|xxxx00000000000000000000000x0000000000000000000000|xxxxx000000000000000000000000000000000000000000000|xxxxxx00000000000000000000000000000000000000000000|xxxxxxx00000000000000000000xxx00000000000000000000|xxxxxxxx0000000000000000000xxx00000000000000000000|xxxxxxxxx000000000000000000xxx00000000000000000000|xxxxxxxxxx00000000000000000xxx0000000000000000000x|xxxxxxxxxxx0000000000000000xxx000000000000000000xx|xxxxxxxxxxxx000000000000000xxx00000000000000000xxx|xxxxxxxxxxxxx00000000000000xxx0000000000000000xxxx|xxxxxxxxxxxxxx0000000000000xxx000000000000000xxxxx|xxxxxxxxxxxxxxx000000000000xxx00000000000000xxxxxx|xxxxxxxxxxxxxxxx00000000000xxx0000000000000xxxxxxx|xxxxxxxxxxxxxxxxx0000000000xxx000000000000xxxxxxxx|xxxxxxxxxxxxxxxxxx000000000xxx00000000000xxxxxxxxx|xxxxxxxxxxxxxxxxxxx00000000xxx0000000000xxxxxxxxxx|xxxxxxxxxxxxxxxxxxxx0000000xxx000000000xxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxx000000xxx00000000xxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxx00000xxx0000000xxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxx0000xxx000000xxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxx000xxx00000xxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxx00xxx0000xxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxx0xxx000xxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|"; + } + + if (mapId == 7) { + return "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxx0xxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxx00xxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxx000xxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxx0000xxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxx0xxxxxxx00000xxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxx00xxxxxxx000000xxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxx000xxxxxxx0000000xxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxx0000xxxxxxx00000000xxxxxxxxxxxxxxxxxx|xxxxxxxxxxxx00000xxxxxxx000000000xxxxxxxxxxxxxxxxx|xxxxxxxxxxx000000xxxxxxx0000000000xxxxxxxxxxxxxxxx|xxxxxxxxxx0000000xxxxxxx00000000000xxxxxxxxxxxxxxx|xxxxxxxxx00000000xxxxxxx00000000000xxxxxxxxxxxxxxx|xxxxxxxx000000000xxxxxxx00000000000xxxxxxxxxxxxxxx|xxxxxxx0000000000xxxxxxx00000000000xxxxxxxxxxxxxxx|xxxxxx00000000000xxxxxxx00000000000xxx0xxxxxxxxxxx|xxxxx000000000000xxxxxxx00000000000xxx00xxxxxxxxxx|xxxx0000000000000xxxxxxx00000000000xxx000xxxxxxxxx|xxx00000000000000000000000000000000xxx0000xxxxxxxx|0x00000000000000000000000000000000000000000xxxxxxx|x0000000000000000xxx0xxx00000000000xxx000000xxxxxx|00000000000000000xx000xx00000000000xxx0000000xxxxx|00000000000000000000x00000000000000xxx00000000xxxx|x000000000000000000xxx0000000000000xxx000000000xxx|xx000000000000000000000000000000000xxx0000000000xx|xxx00000000000000000000000000000000xxx00000000000x|xxxx000000000000000x0x0000000000000xxx000000000000|xxxxx00000000000000xxx0000000000000xxx000000000000|xxxxxx0000000000000xxx0000000xxx0xxxxx000000000000|xxxxxxx000000000000xxx000000xxxx0xxxxx000000000000|xxxxxxxx00000000000xxx000000xxxx0xxxx0000000000000|xxxxxxxxx0000000000xxx000000xxx0000000000000000000|xxxxxxxxxx000000000xxx000000xxx000000000000000000x|xxxxxxxxxxx00000000xxx000000xxx00000000000000000xx|xxxxxxxxxxxx0000000xxx000000xxx0000000000000000xxx|xxxxxxxxxxxxx000000xxxxxxxxxxxx000000000000000xxxx|xxxxxxxxxxxxxx00000xxxxxxxxxxxx00000000000000xxxxx|xxxxxxxxxxxxxxx00000xxxxxxxxxxx0000000000000xxxxxx|xxxxxxxxxxxxxxxx000000000000xxx000000000000xxxxxxx|xxxxxxxxxxxxxxxxx0000000000000000000000000xxxxxxxx|xxxxxxxxxxxxxxxxxx00000000000000000000000xxxxxxxxx|xxxxxxxxxxxxxxxxxxx0000000000x0000000000xxxxxxxxxx|xxxxxxxxxxxxxxxxxxxx00000000xxx00000000xxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxx0000000xxx0000000xxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxx000000x00000000xxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxx0000000000000xxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxx00000000000xxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxx000xx0000xxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxx00xxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxx0xxxxxxxxxxxxxxxxxxxxxx|"; + } + + return "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|" + + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|" + + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|" + + "xxxxxxxxxxxxxxxxxx00000000xxxxxxxxxxxxxxxxxxxxxxxx|" + + "xxxxxxxxxxxxxxxxx00000000000xxxxxxxxxxxxxxxxxxxxxx|" + + "xxxxxxxxxxxxxx000000000000000xxxxxxxxxxxxxxxxxxxxx|" + + "xxxxxxxxxxxxx00000000000000000xxxxxxxxxxxxxxxxxxxx|" + + "xxxxxxxxxxxx0000000000000000000xxxxxxxxxxxxxxxxxxx|" + + "xxxxxxxxxxx000000000000000000000xxxxxxxxxxxxxxxxxx|" + + "xxxxxxxxxx00000000000000000000000xxxxxxxxxxxxxxxxx|" + + "xxxxxxxxx0000000000000000000000000xxxxxxxxxxxxxxxx|" + + "xxxxxxxx000000000000000000000000000xxxxxxxxxxxxxxx|" + + "xxxxxxx00000000000000000000000000000xxxxxxxxxxxxxx|" + + "xxxxxx0000000000000000000000000000000xxxxxxxxxxxxx|" + + "xxxxx000000000000000000000000000000000xxxxxxxxxxxx|" + + "xxxxx0000000000000000000000000000000000xxxxxxxxxxx|" + + "xxxxx00000000000000000000000000000000000xxxxxxxxxx|" + + "xxxxx000000000000000000000000000000000000xxxxxxxxx|" + + "xxxx00000000000000000000000000000000000000xxxxxxxx|" + + "xxxx000000000000000000000000000000000000000xxxxxxx|" + + "xxxx0000000000000000000000000000000000000000xxxxxx|" + + "xxxx00000000000000000000000000000000000000000xxxxx|" + + "0xxx000000000000000000000000000000000000000000xxxx|" + + "xxxx000000000000000000000000000000000000000000xxxx|" + + "xxxx0000000000000000000000000000000000000000000xxx|" + + "xxxx0000000000000000000000000000000000000000000xxx|" + + "xxxx0000000000000000000000000000000000000000000xxx|" + + "xxxxx000000000000000000000000000000000000000000xxx|" + + "xxxxxx00000000000000000000000000000000000000000xxx|" + + "xxxxxxx0000000000000000000000000000000000000000xxx|" + + "xxxxxxxx000000000000000000000000000000000000000xxx|" + + "xxxxxxxxx0000000000000000000000000000000000000xxxx|" + + "xxxxxxxxxx000000000000000000000000000000000000xxxx|" + + "xxxxxxxxxxx0000000000000000000000000000000000xxxxx|" + + "xxxxxxxxxxxx00000000000000000000000000000000xxxxxx|" + + "xxxxxxxxxxxxx000000000000000000000000000000xxxxxxx|" + + "xxxxxxxxxxxxxx0000000000000000000000000000xxxxxxxx|" + + "xxxxxxxxxxxxxxx00000000000000000000000000xxxxxxxxx|" + + "xxxxxxxxxxxxxxxx0000000000000000000000000xxxxxxxxx|" + + "xxxxxxxxxxxxxxxxx00000000000000000000000xxxxxxxxxx|" + + "xxxxxxxxxxxxxxxxxx0000000000000000000000xxxxxxxxxx|" + + "xxxxxxxxxxxxxxxxxxx00000000000000000000xxxxxxxxxxx|" + + "xxxxxxxxxxxxxxxxxxxx000000000000000000xxxxxxxxxxxx|" + + "xxxxxxxxxxxxxxxxxxxxx0000000000000000xxxxxxxxxxxxx|" + + "xxxxxxxxxxxxxxxxxxxxxxx0000000000000xxxxxxxxxxxxxx|" + + "xxxxxxxxxxxxxxxxxxxxxxxx000000000xxxxxxxxxxxxxxxxx|" + + "xxxxxxxxxxxxxxxxxxxxxxxxxx000000xxxxxxxxxxxxxxxxxx|" + + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|" + + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|" + + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|"; + } + + public SnowStormMap getMap(int mapId) { + return this.snowStormMapMaps.get(mapId); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/SnowStormTurn.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/SnowStormTurn.java new file mode 100644 index 0000000..17577e4 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/SnowStormTurn.java @@ -0,0 +1,18 @@ +package org.alexdev.havana.game.games.snowstorm; + +import org.alexdev.havana.game.games.GameObject; + +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +public class SnowStormTurn { + private List events; + + public SnowStormTurn() { + this.events = new CopyOnWriteArrayList<>(); + } + + public List getSubTurns() { + return events; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/events/SnowStormAvatarMoveEvent.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/events/SnowStormAvatarMoveEvent.java new file mode 100644 index 0000000..3a06829 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/events/SnowStormAvatarMoveEvent.java @@ -0,0 +1,26 @@ +package org.alexdev.havana.game.games.snowstorm.events; + +import org.alexdev.havana.game.games.GameObject; +import org.alexdev.havana.game.games.enums.GameObjectType; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class SnowStormAvatarMoveEvent extends GameObject { + private final int objectId; + private int X; + private int Y; + + public SnowStormAvatarMoveEvent(int objectId, int x, int y) { + super(objectId, GameObjectType.SNOWWAR_AVATAR_MOVE_EVENT); + this.objectId = objectId; + this.X = x; + this.Y = y; + } + + @Override + public void serialiseObject(NettyResponse response) { + response.writeInt(GameObjectType.SNOWWAR_AVATAR_MOVE_EVENT.getObjectId()); + response.writeInt(this.objectId); + response.writeInt(X);//SnowStormGame.convertToWorldCoordinate(this.X)); // move target x + response.writeInt(Y);//SnowStormGame.convertToWorldCoordinate(this.Y)); // move target y + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/events/SnowStormCreateSnowballEvent.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/events/SnowStormCreateSnowballEvent.java new file mode 100644 index 0000000..472262b --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/events/SnowStormCreateSnowballEvent.java @@ -0,0 +1,20 @@ +package org.alexdev.havana.game.games.snowstorm.events; + +import org.alexdev.havana.game.games.GameObject; +import org.alexdev.havana.game.games.enums.GameObjectType; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class SnowStormCreateSnowballEvent extends GameObject { + private final int objectId; + + public SnowStormCreateSnowballEvent(int objectId) { + super(objectId, GameObjectType.SNOWWAR_CREATE_SNOWBALL_EVENT); + this.objectId = objectId; + } + + @Override + public void serialiseObject(NettyResponse response) { + response.writeInt(GameObjectType.SNOWWAR_CREATE_SNOWBALL_EVENT.getObjectId()); + response.writeInt(this.objectId); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/events/SnowStormDeleteObjectEvent.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/events/SnowStormDeleteObjectEvent.java new file mode 100644 index 0000000..08cd885 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/events/SnowStormDeleteObjectEvent.java @@ -0,0 +1,20 @@ +package org.alexdev.havana.game.games.snowstorm.events; + +import org.alexdev.havana.game.games.GameObject; +import org.alexdev.havana.game.games.enums.GameObjectType; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class SnowStormDeleteObjectEvent extends GameObject { + private final int objectId; + + public SnowStormDeleteObjectEvent(int objectId) { + super(objectId, GameObjectType.SNOWWAR_REMOVE_OBJECT_EVENT); + this.objectId = objectId; + } + + @Override + public void serialiseObject(NettyResponse response) { + response.writeInt(this.getGameObjectType().getObjectId()); + response.writeInt(this.objectId); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/events/SnowStormHitEvent.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/events/SnowStormHitEvent.java new file mode 100644 index 0000000..364c87b --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/events/SnowStormHitEvent.java @@ -0,0 +1,26 @@ +package org.alexdev.havana.game.games.snowstorm.events; + +import org.alexdev.havana.game.games.GameObject; +import org.alexdev.havana.game.games.enums.GameObjectType; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class SnowStormHitEvent extends GameObject { + private final int throwerId; + private final int targetId; + private final int hitDirection; + + public SnowStormHitEvent(int throwerId, int targetId, int hitDirection) { + super(-1, GameObjectType.SNOWSTORM_HIT_EVENT); + this.throwerId = throwerId; + this.targetId = targetId; + this.hitDirection = hitDirection; + } + + @Override + public void serialiseObject(NettyResponse response) { + response.writeInt(this.getGameObjectType().getObjectId()); + response.writeInt(this.throwerId); + response.writeInt(this.targetId); + response.writeInt(this.hitDirection); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/events/SnowStormLaunchSnowballEvent.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/events/SnowStormLaunchSnowballEvent.java new file mode 100644 index 0000000..155d880 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/events/SnowStormLaunchSnowballEvent.java @@ -0,0 +1,32 @@ +package org.alexdev.havana.game.games.snowstorm.events; + +import org.alexdev.havana.game.games.GameObject; +import org.alexdev.havana.game.games.enums.GameObjectType; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class SnowStormLaunchSnowballEvent extends GameObject { + private final int objectId; + private final int x; + private final int y; + private final int trajectory; + private final int throwerId; + + public SnowStormLaunchSnowballEvent(int objectId, int throwerId, int x, int y, int trajectory) { + super(objectId, GameObjectType.SNOWWAR_THROW_EVENT); + this.objectId = objectId; + this.throwerId = throwerId; + this.x = x; + this.y = y; + this.trajectory = trajectory; + } + + @Override + public void serialiseObject(NettyResponse response) { + response.writeInt(this.getGameObjectType().getObjectId()); + response.writeInt(this.objectId); + response.writeInt(this.throwerId); + response.writeInt(this.x); + response.writeInt(this.y); + response.writeInt(this.trajectory); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/events/SnowStormMachineAddSnowballEvent.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/events/SnowStormMachineAddSnowballEvent.java new file mode 100644 index 0000000..2a805c7 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/events/SnowStormMachineAddSnowballEvent.java @@ -0,0 +1,20 @@ +package org.alexdev.havana.game.games.snowstorm.events; + +import org.alexdev.havana.game.games.GameObject; +import org.alexdev.havana.game.games.enums.GameObjectType; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class SnowStormMachineAddSnowballEvent extends GameObject { + private final int machineId; + + public SnowStormMachineAddSnowballEvent(int machineId) { + super(machineId, GameObjectType.SNOWWAR_MACHINE_ADD_SNOWBALL_EVENT); + this.machineId = machineId; + } + + @Override + public void serialiseObject(NettyResponse response) { + response.writeInt(this.getGameObjectType().getObjectId()); + response.writeInt(this.machineId); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/events/SnowStormMachineMoveSnowballsEvent.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/events/SnowStormMachineMoveSnowballsEvent.java new file mode 100644 index 0000000..45f59b4 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/events/SnowStormMachineMoveSnowballsEvent.java @@ -0,0 +1,23 @@ +package org.alexdev.havana.game.games.snowstorm.events; + +import org.alexdev.havana.game.games.GameObject; +import org.alexdev.havana.game.games.enums.GameObjectType; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class SnowStormMachineMoveSnowballsEvent extends GameObject { + private final int playerId; + private final int machineId; + + public SnowStormMachineMoveSnowballsEvent(int playerId, int machineId) { + super(-1, GameObjectType.SNOWWAR_MACHINE_MOVE_SNOWBALLS_EVENT); + this.playerId = playerId; + this.machineId = machineId; + } + + @Override + public void serialiseObject(NettyResponse response) { + response.writeInt(this.getGameObjectType().getObjectId()); + response.writeInt(this.playerId); + response.writeInt(this.machineId); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/events/SnowStormStunEvent.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/events/SnowStormStunEvent.java new file mode 100644 index 0000000..3948837 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/events/SnowStormStunEvent.java @@ -0,0 +1,27 @@ +package org.alexdev.havana.game.games.snowstorm.events; + +import org.alexdev.havana.game.games.GameObject; +import org.alexdev.havana.game.games.enums.GameObjectType; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class SnowStormStunEvent extends GameObject { + private final int stunnedId; + private final int throwerId; + private final int hitDirection; + + public SnowStormStunEvent(int throwerId, int hitId, int hitDirection) { + super(-1, GameObjectType.SNOWWAR_STUN_EVENT); + this.stunnedId = throwerId; + this.throwerId = hitId; + this.hitDirection = hitDirection; + } + + @Override + public void serialiseObject(NettyResponse response) { + response.writeInt(this.getGameObjectType().getObjectId()); + response.writeInt(this.stunnedId); + response.writeInt(this.throwerId); + response.writeInt(this.hitDirection); + + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/events/SnowStormThrowEvent.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/events/SnowStormThrowEvent.java new file mode 100644 index 0000000..8cf8512 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/events/SnowStormThrowEvent.java @@ -0,0 +1,29 @@ +package org.alexdev.havana.game.games.snowstorm.events; + +import org.alexdev.havana.game.games.GameObject; +import org.alexdev.havana.game.games.enums.GameObjectType; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class SnowStormThrowEvent extends GameObject { + private final int objectId; + private final int x; + private final int y; + private final int throwHeight; + + public SnowStormThrowEvent(int objectId, int x, int y, int throwHeight) { + super(objectId, GameObjectType.SNOWWAR_TARGET_THROW_EVENT); + this.objectId = objectId; + this.x = x; + this.y = y; + this.throwHeight = throwHeight; + } + + @Override + public void serialiseObject(NettyResponse response) { + response.writeInt(this.getGameObjectType().getObjectId()); + response.writeInt(this.objectId); + response.writeInt(this.x); + response.writeInt(this.y); + response.writeInt(this.throwHeight); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/mapping/SnowStormItem.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/mapping/SnowStormItem.java new file mode 100644 index 0000000..425028f --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/mapping/SnowStormItem.java @@ -0,0 +1,59 @@ +package org.alexdev.havana.game.games.snowstorm.mapping; + +import org.alexdev.havana.game.pathfinder.Position; + +public class SnowStormItem { + private final String itemId; + private final String itemName; + private final int x; + private final int y; + private final int z; + private final int rotation; + private final int height; + + public SnowStormItem(String itemId, String itemName, int x, int y, int z, int rotation, int height) { + this.itemId = itemId; + this.itemName = itemName; + this.x = x; + this.y = y; + this.z = z; + this.rotation = rotation; + this.height = height; + } + + public boolean isSnowballMachine() { + return this.itemName.equalsIgnoreCase("snowball_machine"); + } + + public String getItemId() { + return itemId; + } + + public String getItemName() { + return itemName; + } + + public int getX() { + return x; + } + + public int getY() { + return y; + } + + public int getZ() { + return z; + } + + public int getRotation() { + return rotation; + } + + public Position getPosition() { + return new Position(this.x, this.y, this.z); + } + + public int getHeight() { + return height; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/mapping/SnowStormMap.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/mapping/SnowStormMap.java new file mode 100644 index 0000000..5fb2a3e --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/mapping/SnowStormMap.java @@ -0,0 +1,109 @@ +package org.alexdev.havana.game.games.snowstorm.mapping; + +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.games.snowstorm.util.SnowStormSpawn; + +import java.util.ArrayList; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +public class SnowStormMap { + private final int mapId; + private final ArrayList itemList; + private final ArrayList spawnClusters; + private final String compiledItems; + private String heightMap; + private int mapSizeY; + private int mapSizeX; + private SnowStormTile[][] tiles; + + public SnowStormMap(int mapId, String compiledItems, ArrayList itemList, String heightMap, ArrayList spawnClusters) { + this.mapId = mapId; + this.compiledItems = compiledItems; + this.itemList = itemList; + this.heightMap = heightMap; + this.spawnClusters = spawnClusters; + this.parseHeightMap(); + } + + public void parseHeightMap() { + String[] lines = this.heightMap.split(Pattern.quote("|")); + + this.mapSizeY = lines.length; + this.mapSizeX = lines[0].length(); + + this.tiles = new SnowStormTile[this.mapSizeX][this.mapSizeY]; + + StringBuilder temporaryHeightmap = new StringBuilder(); + + for (int y = 0; y < this.mapSizeY; y++) { + String line = lines[y]; + + for (int x = 0; x < this.mapSizeX; x++) { + String tile = Character.toString(line.charAt(x)); + + var position = new Position(x, y); + var snowStormTile = new SnowStormTile(x, y, + tile.equalsIgnoreCase("X"), + this.itemList.stream().filter(item -> + item.getX() == position.getX() + && item.getY() == position.getY()) + .collect(Collectors.toList())); + + this.tiles[x][y] = snowStormTile; + + if (!snowStormTile.isWalkable()) { + tile = "x"; + } else { + tile = "0"; + } + + temporaryHeightmap.append(tile); + } + + temporaryHeightmap.append("\r"); + } + + this.heightMap = temporaryHeightmap.toString(); + } + + public SnowStormTile getTile(Position position) { + if (position.getX() < 0 || position.getY() < 0) { + return null; + } + + if (position.getX() >= this.mapSizeX || position.getY() >= this.mapSizeY) { + return null; + } + + return this.tiles[position.getX()][position.getY()]; + } + + public int getMapSizeX() { + return mapSizeX; + } + + public int getMapSizeY() { + return mapSizeY; + } + + public int getMapId() { + return mapId; + } + + public String getHeightMap() { + return heightMap; + } + + public ArrayList getItems() { + return this.itemList; + } + + public SnowStormSpawn[] getSpawnClusters() { + return spawnClusters.toArray(new SnowStormSpawn[0]); + } + + public String getCompiledItems() { + return compiledItems; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/mapping/SnowStormPathfinder.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/mapping/SnowStormPathfinder.java new file mode 100644 index 0000000..b7ce454 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/mapping/SnowStormPathfinder.java @@ -0,0 +1,199 @@ +package org.alexdev.havana.game.games.snowstorm.mapping; + +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.pathfinder.Pathfinder; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.games.snowstorm.SnowStormGame; +import org.alexdev.havana.game.games.snowstorm.objects.SnowballObject; +import org.alexdev.havana.game.games.snowstorm.util.SnowStormActivityState; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.LinkedList; +import java.util.List; + +public class SnowStormPathfinder { + public static Position getNextDirection(SnowStormGame snowStormGame, GamePlayer gamePlayer) { + List positions = new ArrayList<>(); + + for (Position POINT : Pathfinder.DIAGONAL_MOVE_POINTS) { + var temp = gamePlayer.getSnowStormAttributes().getCurrentPosition().copy().add(POINT); + + if (!isValidTile(snowStormGame, gamePlayer, temp)) { + continue; + } + + positions.add(temp); + } + + positions.sort(Comparator.comparingDouble(pos -> pos.getDistanceSquared(gamePlayer.getSnowStormAttributes().getWalkGoal()))); + return (positions.size() > 0 ? positions.get(0) : null); + } + + private static boolean isValidTile(SnowStormGame snowStormGame, GamePlayer gamePlayer, Position tmp) { + for (GamePlayer player : snowStormGame.getActivePlayers()) { + if (player.getPlayer().getDetails().getId() == gamePlayer.getPlayer().getDetails().getId()) { + continue; + } + + if (gamePlayer.getSnowStormAttributes().getCurrentPosition().equals(tmp)) { + return false; + } + + if (gamePlayer.getSnowStormAttributes().getNextGoal() != null && gamePlayer.getSnowStormAttributes().getNextGoal().equals(tmp)) { + return false; + } + } + + var tile = snowStormGame.getMap().getTile(tmp); + + if (tile == null) { + return false; + } + + return tile.isWalkable(); + } + + /** + * Check if the point (x0, y0) can see point (x1, y1) by drawing a line + * and testing for the "blocking" property at each new tile. Returns the + * points on the line if it is, in fact, visible. Otherwise, returns an + * empty list (rather than null - Efficient Java, item #43). + * + * http://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm + */ + public static LinkedList getMaxVisibility(SnowballObject snowballObject, int x0, int y0, int x1, int y1, SnowballObject.SnowballTrajectory trajectory) { + LinkedList line = new LinkedList<>(); + line.add(new Position(x0, y0)); + int dx = Math.abs(x1 - x0); + int dy = Math.abs(y1 - y0); + int sx = (x0 < x1) ? 1 : -1; + int sy = (y0 < y1) ? 1 : -1; + int err = dx - dy; + int e2; + + while (!(x0 == x1 && y0 == y1)) { + if (isBlockedTile(snowballObject, new Position(x0, y0))) { + //line.clear(); + line.add(new Position(x0, y0)); + return line; + } + + e2 = 2 * err; + + if (e2 > -dy) { + err -= dy; + x0 += sx; + } + + if (e2 < dx) { + err += dx; + y0 += sy; + } + + line.add(new Position(x0, y0)); + } + + return line; + } + + public static GamePlayer getOppositionPlayer(SnowStormGame snowStormGame, GamePlayer thrower, Position position) { + for (GamePlayer player : snowStormGame.getActivePlayers()) { + if ((player.getSnowStormAttributes().getCurrentPosition().equals(position) || (player.getSnowStormAttributes().getNextGoal() != null && player.getSnowStormAttributes().getNextGoal().equals(player)))) { + if (player.getSnowStormAttributes().getActivityState() == SnowStormActivityState.ACTIVITY_STATE_STUNNED) { + continue; + } + + if (snowStormGame.isOppositionPlayer(thrower, player)) { + return player; + } + } + } + + return null; + } + + public static boolean isBlockedTile(SnowballObject snowballObject, Position position) { + if (snowballObject.getTrajectory() != SnowballObject.SnowballTrajectory.LONG_TRAJECTORY) { + for (GamePlayer player : snowballObject.getGame().getActivePlayers()) { + if ((player.getSnowStormAttributes().getCurrentPosition().equals(position) || (player.getSnowStormAttributes().getNextGoal() != null && player.getSnowStormAttributes().getNextGoal().equals(player)))) { + if (player.getSnowStormAttributes().getActivityState() == SnowStormActivityState.ACTIVITY_STATE_STUNNED) { + continue; + } + + if (snowballObject.getGame().isOppositionPlayer(snowballObject.getThrower(), player)) { + return true; + } + } + } + } + + var tile = snowballObject.getGame().getMap().getTile(position); + + if (tile == null) { + return false; + } + + return tile.isHeightBlocking(snowballObject.getTrajectory()); + } +} + + /* + tMoveTarget = me.pGameObjectFinalTarget + tNextTarget = me.pGameObjectNextTarget + if not objectp(tMoveTarget) then + return FALSE + end if + tMoveTargetX = tMoveTarget.x + tMoveTargetY = tMoveTarget.y + if not objectp(me.pGameObjectLocation) then + return FALSE + end if + tCurrentX = me.pGameObjectLocation.x + tCurrentY = me.pGameObjectLocation.y + if not objectp(tNextTarget) then + return FALSE + end if + tNextTargetX = tNextTarget.x + tNextTargetY = tNextTarget.y + if (tCurrentX = tMoveTargetX) and (tCurrentY = tMoveTargetY) then + return FALSE + end if + if tNextTargetX <> tCurrentX or tNextTargetY <> tCurrentY then + tOldX = tCurrentX + tOldY = tCurrentY + tTargetX = tNextTarget.x + tDeltaX = (tTargetX - tCurrentX) + if tDeltaX < 0 then + if tDeltaX > -SUBTURN_MOVEMENT then + tCurrentX = tTargetX + else + tCurrentX = (tCurrentX - SUBTURN_MOVEMENT) + end if + else + if tDeltaX > 0 then + if tDeltaX < SUBTURN_MOVEMENT then + tCurrentX = tTargetX + else + tCurrentX = (tCurrentX + SUBTURN_MOVEMENT) + end if + end if + end if + tTargetY = tNextTarget.y + tDeltaY = (tTargetY - tCurrentY) + if tDeltaY < 0 then + if tDeltaY > -SUBTURN_MOVEMENT then + tCurrentY = tTargetY + else + tCurrentY = (tCurrentY - SUBTURN_MOVEMENT) + end if + else + if tDeltaY > 0 then + if tDeltaY < SUBTURN_MOVEMENT then + tCurrentY = tTargetY + else + tCurrentY = (tCurrentY + SUBTURN_MOVEMENT) + end if + end if + end if + */ diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/mapping/SnowStormTile.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/mapping/SnowStormTile.java new file mode 100644 index 0000000..ef97394 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/mapping/SnowStormTile.java @@ -0,0 +1,69 @@ +package org.alexdev.havana.game.games.snowstorm.mapping; + +import org.alexdev.havana.game.games.snowstorm.objects.SnowballObject; + +import java.util.Comparator; +import java.util.List; + +public class SnowStormTile { + private int X; + private int Y; + private List items; + private SnowStormItem highestItem; + private boolean isBlocked; + + public SnowStormTile(int x, int y, boolean isBlocked, List items) { + this.X = x; + this.Y = y; + this.isBlocked = isBlocked; + + this.items = items; + this.items.sort(Comparator.comparingDouble((SnowStormItem item) -> item.getPosition().getZ())); + + for (var item : this.items) { + if ((this.highestItem == null) || (item.getPosition().getZ() > this.highestItem.getPosition().getZ())) { + this.highestItem = item; + } + } + } + + public boolean isWalkable() { + if (this.isBlocked) { + return false; + } + + if (this.highestItem != null) { + return false; + } + + return true; + } + + public SnowStormItem getHighestItem() { + return highestItem; + } + + public List getItems() { + return items; + } + + public boolean isHeightBlocking(SnowballObject.SnowballTrajectory trajectory) { + if (this.highestItem == null) { + return false; + } + + if (trajectory == SnowballObject.SnowballTrajectory.LONG_TRAJECTORY) { + return false; + } + + if (trajectory == SnowballObject.SnowballTrajectory.SHORT_TRAJECTORY) { + return this.highestItem.getHeight() > 1; + } + + if (trajectory == SnowballObject.SnowballTrajectory.QUICK_THROW) { + return this.highestItem.getHeight() > 0; + } + + return false; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/messages/SnowStormMessageHandler.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/messages/SnowStormMessageHandler.java new file mode 100644 index 0000000..9a9d2e5 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/messages/SnowStormMessageHandler.java @@ -0,0 +1,43 @@ +package org.alexdev.havana.game.games.snowstorm.messages; + +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.games.snowstorm.SnowStormGame; +import org.alexdev.havana.game.games.snowstorm.messages.incoming.SnowStormAttackPlayerMessage; +import org.alexdev.havana.game.games.snowstorm.util.SnowStormEvent; +import org.alexdev.havana.game.games.snowstorm.util.SnowStormMessage; +import org.alexdev.havana.game.games.snowstorm.messages.incoming.SnowStormThrowLocationMessage; +import org.alexdev.havana.game.games.snowstorm.messages.incoming.SnowStormWalkMessage; +import org.alexdev.havana.game.games.snowstorm.messages.incoming.SnowstormCreateSnowballMessage; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.server.util.MalformedPacketException; + +import java.util.HashMap; + +public class SnowStormMessageHandler { + private static SnowStormMessageHandler instance; + private final HashMap events; + + public SnowStormMessageHandler() { + this.events = new HashMap<>(); + this.events.put(SnowStormEvent.WALK, new SnowStormWalkMessage()); + this.events.put(SnowStormEvent.CREATE_SNOWBALL, new SnowstormCreateSnowballMessage()); + this.events.put(SnowStormEvent.THROW_SNOWBALL_AT_LOCATION, new SnowStormThrowLocationMessage()); + this.events.put(SnowStormEvent.THROW_SNOWBALL_AT_PERSON, new SnowStormAttackPlayerMessage()); + } + + public void handleMessage(int messageId, NettyRequest request, SnowStormGame snowStormGame, GamePlayer player) throws MalformedPacketException { + var event = SnowStormEvent.getEvent(messageId); + + if (event != null) { + this.events.get(event).handle(request, snowStormGame, player); + } + } + + public static SnowStormMessageHandler getInstance() { + if (instance == null) { + instance = new SnowStormMessageHandler(); + } + + return instance; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/messages/incoming/SnowStormAttackPlayerMessage.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/messages/incoming/SnowStormAttackPlayerMessage.java new file mode 100644 index 0000000..73f1eec --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/messages/incoming/SnowStormAttackPlayerMessage.java @@ -0,0 +1,87 @@ +package org.alexdev.havana.game.games.snowstorm.messages.incoming; + +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.games.snowstorm.SnowStormGame; +import org.alexdev.havana.game.games.snowstorm.events.SnowStormLaunchSnowballEvent; +import org.alexdev.havana.game.games.snowstorm.events.SnowStormThrowEvent; +import org.alexdev.havana.game.games.snowstorm.objects.SnowballObject; +import org.alexdev.havana.game.games.snowstorm.util.SnowStormMessage; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.pathfinder.Rotation; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.server.util.MalformedPacketException; + +public class SnowStormAttackPlayerMessage implements SnowStormMessage { + @Override + public void handle(NettyRequest reader, SnowStormGame snowStormGame, GamePlayer gamePlayer) throws MalformedPacketException { + if (!gamePlayer.getSnowStormAttributes().isWalkable()) { + return; + } + + if ((gamePlayer.getSnowStormAttributes().getLastThrow().get() + 300) > System.currentTimeMillis()) { + return; + } + + int userId = reader.readInt(); + int trajectory = reader.readInt(); + + if (trajectory != 0 && trajectory != 2 && trajectory != 3) { + return; + } + + if (gamePlayer.getSnowStormAttributes().getSnowballs().get() <= 0) { + return; + } + + if (gamePlayer.getSnowStormAttributes().isWalking()) { + gamePlayer.getSnowStormAttributes().setWalking(false); + } + + var player = snowStormGame.getActivePlayers().stream().filter(p -> p.getObjectId() == userId).findFirst().orElse(null); + + if (player == null || !snowStormGame.isOppositionPlayer(gamePlayer, player)) { + return; + } + + //gamePlayer.getPlayer().getRoomUser().setWalkingAllowed(false); + int objectId = snowStormGame.getObjectId().incrementAndGet(); + + var snowball = new SnowballObject(objectId, snowStormGame, gamePlayer, + gamePlayer.getSnowStormAttributes().getCurrentPosition().getX(), + gamePlayer.getSnowStormAttributes().getCurrentPosition().getY(), + player.getSnowStormAttributes().getCurrentPosition().getX(), + player.getSnowStormAttributes().getCurrentPosition().getY(), + trajectory, + Rotation.calculateWalkDirection(gamePlayer.getSnowStormAttributes().getCurrentPosition(), player.getSnowStormAttributes().getCurrentPosition())); + + snowball.setTargetPlayer(player); + gamePlayer.getSnowStormAttributes().getSnowballs().decrementAndGet(); + + var visibilityPath = snowball.getPath(); + Position lastTilePosition = visibilityPath.size() > 0 ? visibilityPath.pollLast() : null; + + // Reconsider velocity/time to live and recalculate since it's blocked + if (lastTilePosition != null && !lastTilePosition.equals(new Position(snowball.getTargetX(), snowball.getTargetY()))) { + snowball.setTargetX(lastTilePosition.getX()); + snowball.setTargetY(lastTilePosition.getY()); + snowball.setBlocked(true); + } + + snowStormGame.getUpdateTask().sendQueue(0, 1, new SnowStormThrowEvent(gamePlayer.getObjectId(), SnowStormGame.convertToWorldCoordinate(snowball.getTargetX()), SnowStormGame.convertToWorldCoordinate(snowball.getTargetY()), trajectory)); + snowStormGame.getUpdateTask().sendQueue(0, 1, new SnowStormLaunchSnowballEvent(objectId, gamePlayer.getObjectId(), SnowStormGame.convertToWorldCoordinate(snowball.getTargetX()), SnowStormGame.convertToWorldCoordinate(snowball.getTargetY()), trajectory)); + gamePlayer.getSnowStormAttributes().getLastThrow().set(System.currentTimeMillis()); + + if (trajectory == 0 && visibilityPath.size() >= SnowStormGame.MAX_QUICK_THROW_DISTANCE) { + return; + } + + snowball.scheduleMovementTask(); + /*GameScheduler.getInstance().getService().schedule(() -> { + try { + snowStormGame.handleSnowballLanding(snowball); + } catch (Exception e) { + e.printStackTrace(); + } + }, snowball.getTimeToLive() * 100, TimeUnit.MILLISECONDS);*/ + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/messages/incoming/SnowStormThrowLocationMessage.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/messages/incoming/SnowStormThrowLocationMessage.java new file mode 100644 index 0000000..5ec7d7b --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/messages/incoming/SnowStormThrowLocationMessage.java @@ -0,0 +1,77 @@ +package org.alexdev.havana.game.games.snowstorm.messages.incoming; + +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.games.snowstorm.SnowStormGame; +import org.alexdev.havana.game.games.snowstorm.events.SnowStormLaunchSnowballEvent; +import org.alexdev.havana.game.games.snowstorm.events.SnowStormThrowEvent; +import org.alexdev.havana.game.games.snowstorm.objects.SnowballObject; +import org.alexdev.havana.game.games.snowstorm.util.SnowStormMessage; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.pathfinder.Rotation; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.server.util.MalformedPacketException; + +public class SnowStormThrowLocationMessage implements SnowStormMessage { + @Override + public void handle(NettyRequest reader, SnowStormGame snowStormGame, GamePlayer gamePlayer) throws MalformedPacketException { + if (!gamePlayer.getSnowStormAttributes().isWalkable()) { + return; + } + + if ((gamePlayer.getSnowStormAttributes().getLastThrow().get() + 300) > System.currentTimeMillis()) { + return; + } + + int X = reader.readInt(); + int Y = reader.readInt(); + int trajectory = reader.readInt(); + + if (trajectory != 2 && trajectory != 1) { + return; + } + + if (gamePlayer.getSnowStormAttributes().getSnowballs().get() <= 0) { + return; + } + + //gamePlayer.getSnowStormAttributes().getPlayer().getRoomUser().setWalkingAllowed(false); + int objectId = snowStormGame.getObjectId().incrementAndGet(); + + final var snowball = new SnowballObject( + objectId, + snowStormGame, + gamePlayer, + gamePlayer.getSnowStormAttributes().getCurrentPosition().getX(), + gamePlayer.getSnowStormAttributes().getCurrentPosition().getY(), + SnowStormGame.convertToGameCoordinate(X), + SnowStormGame.convertToGameCoordinate(Y), + trajectory, + Rotation.calculateWalkDirection(gamePlayer.getSnowStormAttributes().getCurrentPosition(), new Position(SnowStormGame.convertToGameCoordinate(X), SnowStormGame.convertToGameCoordinate(Y)))); + + gamePlayer.getSnowStormAttributes().getSnowballs().decrementAndGet(); + + var visibilityPath = snowball.getPath(); + Position lastTilePosition = visibilityPath.size() > 0 ? visibilityPath.pollLast() : null; + + // Reconsider velocity/time to live and recalculate since it's blocked + if (lastTilePosition != null && !lastTilePosition.equals(new Position(snowball.getTargetX(), snowball.getTargetY()))) { + snowball.setTargetX(lastTilePosition.getX()); + snowball.setTargetY(lastTilePosition.getY()); + snowball.setBlocked(true); + } + + snowStormGame.getUpdateTask().sendQueue(0, 1, new SnowStormThrowEvent(gamePlayer.getObjectId(), SnowStormGame.convertToWorldCoordinate(snowball.getTargetX()), SnowStormGame.convertToWorldCoordinate(snowball.getTargetY()), trajectory)); + snowStormGame.getUpdateTask().sendQueue(0, 1, new SnowStormLaunchSnowballEvent(objectId, gamePlayer.getObjectId(), SnowStormGame.convertToWorldCoordinate(snowball.getTargetX()), SnowStormGame.convertToWorldCoordinate(snowball.getTargetY()), trajectory)); + + gamePlayer.getSnowStormAttributes().getLastThrow().set(System.currentTimeMillis()); + snowball.scheduleMovementTask(); + + /*GameScheduler.getInstance().getService().schedule(() -> { + try { + snowStormGame.handleSnowballLanding(snowball); + } catch (Exception e) { + e.printStackTrace(); + } + }, snowball.getTimeToLive() * 100, TimeUnit.MILLISECONDS);*/ + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/messages/incoming/SnowStormWalkMessage.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/messages/incoming/SnowStormWalkMessage.java new file mode 100644 index 0000000..2826f08 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/messages/incoming/SnowStormWalkMessage.java @@ -0,0 +1,35 @@ +package org.alexdev.havana.game.games.snowstorm.messages.incoming; + +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.games.snowstorm.SnowStormGame; +import org.alexdev.havana.game.games.snowstorm.util.SnowStormMessage; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.server.util.MalformedPacketException; + +public class SnowStormWalkMessage implements SnowStormMessage { + @Override + public void handle(NettyRequest reader, SnowStormGame snowStormGame, GamePlayer gamePlayer) throws MalformedPacketException { + if (!gamePlayer.getSnowStormAttributes().isWalkable() || !gamePlayer.getPlayer().getRoomUser().isWalkingAllowed()) { + return; + } + + int X = reader.readInt(); + int Y = reader.readInt(); + + int newX = SnowStormGame.convertToGameCoordinate(X); + int newY = SnowStormGame.convertToGameCoordinate(Y); + + // --System.out.println("Request: " + newX + ", " + newY); + if (gamePlayer.getSnowStormAttributes().getCurrentPosition().equals(new Position(newX, newY))) { + return; + } + + gamePlayer.getSnowStormAttributes().setGoalWorldCoordinates(new int[] { X, Y }); + gamePlayer.getSnowStormAttributes().setWalking(true); + gamePlayer.getSnowStormAttributes().setWalkGoal(new Position(newX, newY)); + + //snowStormGame.getUpdateTask().sendQueue(0, 1, + // new SnowStormAvatarMoveEvent(gamePlayer.getObjectId(), X, Y)); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/messages/incoming/SnowstormCreateSnowballMessage.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/messages/incoming/SnowstormCreateSnowballMessage.java new file mode 100644 index 0000000..55db305 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/messages/incoming/SnowstormCreateSnowballMessage.java @@ -0,0 +1,38 @@ +package org.alexdev.havana.game.games.snowstorm.messages.incoming; + +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.games.snowstorm.SnowStormGame; +import org.alexdev.havana.game.games.snowstorm.events.SnowStormCreateSnowballEvent; +import org.alexdev.havana.game.games.snowstorm.util.SnowStormActivityState; +import org.alexdev.havana.game.games.snowstorm.util.SnowStormMessage; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.server.util.MalformedPacketException; + +public class SnowstormCreateSnowballMessage implements SnowStormMessage { + @Override + public void handle(NettyRequest request, SnowStormGame snowStormGame, GamePlayer gamePlayer) throws MalformedPacketException { + if (!gamePlayer.getSnowStormAttributes().isWalkable()) { + //System.out.println("Player " + gamePlayer.getPlayer().getDetails().getName() + " state " + gamePlayer.getSnowStormAttributes().getActivityState().name()); + return; + } + + if (gamePlayer.getSnowStormAttributes().getSnowballs().get() >= 5) { + //System.out.println("Player " + gamePlayer.getPlayer().getDetails().getName() + " has " + gamePlayer.getSnowStormAttributes().getSnowballs().get()); + return; + } + + if (gamePlayer.getSnowStormAttributes().isWalking()) { + gamePlayer.getSnowStormAttributes().setWalking(false); + } + + snowStormGame.getUpdateTask().sendQueue(0, 1, new SnowStormCreateSnowballEvent(gamePlayer.getObjectId())); + + gamePlayer.getSnowStormAttributes().setActivityState(SnowStormActivityState.ACTIVITY_STATE_CREATING, ()-> { + if (!gamePlayer.getSnowStormAttributes().isWalkable() || gamePlayer.getSnowStormAttributes().getHealth().get() == 0) { + return; + } + + gamePlayer.getSnowStormAttributes().getSnowballs().incrementAndGet(); + }); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/objects/SnowStormAvatarObject.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/objects/SnowStormAvatarObject.java new file mode 100644 index 0000000..681efb5 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/objects/SnowStormAvatarObject.java @@ -0,0 +1,42 @@ +package org.alexdev.havana.game.games.snowstorm.objects; + +import org.alexdev.havana.game.games.GameObject; +import org.alexdev.havana.game.games.enums.GameObjectType; +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.games.snowstorm.SnowStormGame; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class SnowStormAvatarObject extends GameObject { + private final GamePlayer p; + public SnowStormAvatarObject(GamePlayer gamePlayer) { + super(gamePlayer.getObjectId(), GameObjectType.SNOWWAR_AVATAR_OBJECT); + this.p = gamePlayer; + } + + @Override + public void serialiseObject(NettyResponse response) { + var nextGoal = this.p.getSnowStormAttributes().getNextGoal(); + response.writeInt(GameObjectType.SNOWWAR_AVATAR_OBJECT.getObjectId()); // type id + response.writeInt(this.p.getObjectId()); // int id + response.writeInt(SnowStormGame.convertToWorldCoordinate(this.p.getSnowStormAttributes().getCurrentPosition().getX())); + response.writeInt(SnowStormGame.convertToWorldCoordinate(this.p.getSnowStormAttributes().getCurrentPosition().getY())); + response.writeInt(this.p.getSnowStormAttributes().getRotation()); // body direction + response.writeInt(this.p.getSnowStormAttributes().getHealth().get()); // hit points + response.writeInt(this.p.getSnowStormAttributes().getSnowballs().get()); // snowball count + response.writeInt(0); // is bot + response.writeInt(this.p.getSnowStormAttributes().getActivityTimer()); // activity timer + response.writeInt(this.p.getSnowStormAttributes().getActivityState().getStateId()); // activity state + response.writeInt(nextGoal != null ? nextGoal.getX() : this.p.getSnowStormAttributes().getCurrentPosition().getX()); // move target x + response.writeInt(nextGoal != null ? nextGoal.getY() : this.p.getSnowStormAttributes().getCurrentPosition().getY()); // move target y + response.writeInt(SnowStormGame.convertToWorldCoordinate(this.p.getSnowStormAttributes().isWalking() ? this.p.getSnowStormAttributes().getWalkGoal().getX() : this.p.getSnowStormAttributes().getCurrentPosition().getX())); // move target x + response.writeInt(SnowStormGame.convertToWorldCoordinate(this.p.getSnowStormAttributes().isWalking() ? this.p.getSnowStormAttributes().getWalkGoal().getY() : this.p.getSnowStormAttributes().getCurrentPosition().getY())); // move target y + response.writeInt(this.p.getSnowStormAttributes().getScore().get()); // score + response.writeInt(p.getPlayer().getDetails().getId()); // player id + response.writeInt(p.getTeamId()); // team id + response.writeInt(p.getObjectId()); // room index + response.writeString(p.getPlayer().getDetails().getName()); + response.writeString(p.getPlayer().getDetails().getMotto()); + response.writeString(p.getPlayer().getDetails().getFigure()); + response.writeString(p.getPlayer().getDetails().getSex());// Actually room user id/instance id + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/objects/SnowStormMachineObject.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/objects/SnowStormMachineObject.java new file mode 100644 index 0000000..40586db --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/objects/SnowStormMachineObject.java @@ -0,0 +1,68 @@ +package org.alexdev.havana.game.games.snowstorm.objects; + +import org.alexdev.havana.game.games.GameObject; +import org.alexdev.havana.game.games.enums.GameObjectType; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.games.snowstorm.SnowStormGame; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.concurrent.atomic.AtomicInteger; + +public class SnowStormMachineObject extends GameObject { + private final int objectId; + private final int X; + private final int Y; + private AtomicInteger snowballCount; + private long lastRefillTime; + + public SnowStormMachineObject(int objectId, int X, int Y, int snowballCount) { + super(objectId, GameObjectType.SNOWWAR_SNOWMACHINE_OBJECT); + this.objectId = objectId; + this.X = X; + this.Y = Y; + this.snowballCount = new AtomicInteger(snowballCount); + this.lastRefillTime = 0; + } + + @Override + public void serialiseObject(NettyResponse response) { + response.writeInt(GameObjectType.SNOWWAR_SNOWMACHINE_OBJECT.getObjectId()); + response.writeInt(this.objectId); + response.writeInt(SnowStormGame.convertToWorldCoordinate(this.X)); + response.writeInt(SnowStormGame.convertToWorldCoordinate(this.Y)); + response.writeInt(this.snowballCount.get()); + } + + public long getLastRefillTime() { + return lastRefillTime; + } + + public void setLastRefillTime(long lastRefillTime) { + this.lastRefillTime = lastRefillTime; + } + + public Position getPosition() { + return new Position(X, Y); + } + + public AtomicInteger getSnowballs() { + return snowballCount; + } + + public boolean isPlayerCollectingSnowballs(SnowStormGame game) { + var playerPosition = new Position(this.X, this.Y + 1); + var tile = game.getMap().getTile(playerPosition); + + if (tile == null) { + return false; + } + + var player = game.getActivePlayers().stream().filter(p -> p.getSnowStormAttributes().getCurrentPosition().equals(playerPosition)).findFirst().orElse(null); + + if (player == null || !player.getSnowStormAttributes().isWalkable()) { + return false; + } + + return true; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/objects/SnowballObject.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/objects/SnowballObject.java new file mode 100644 index 0000000..f16e15f --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/objects/SnowballObject.java @@ -0,0 +1,195 @@ +package org.alexdev.havana.game.games.snowstorm.objects; + +import org.alexdev.havana.game.GameScheduler; +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.games.snowstorm.SnowStormGame; +import org.alexdev.havana.game.games.snowstorm.mapping.SnowStormPathfinder; +import org.alexdev.havana.game.games.snowstorm.tasks.SnowballMovementTask; +import org.alexdev.havana.game.pathfinder.Position; + +import java.util.LinkedList; +import java.util.concurrent.TimeUnit; + +public class SnowballObject { + public GamePlayer getTargetPlayer() { + return targetPlayer; + } + + public void setTargetPlayer(GamePlayer targetPlayer) { + this.targetPlayer = targetPlayer; + } + + public enum SnowballTrajectory { + QUICK_THROW(0, 3000), + SHORT_TRAJECTORY(1, 3000), + LONG_TRAJECTORY(2, 3000); + + private final int trajectoryId; + private final int velocity; + + SnowballTrajectory(int trajectoryId, int velocity) { + this.trajectoryId = trajectoryId; + this.velocity = velocity; + } + + public int getVelocity() { + return velocity; + } + + public int getTrajectoryId() { + return trajectoryId; + } + } + + private int objectId; + private SnowStormGame game; + private GamePlayer thrower; + private int fromX; + private int fromY; + private int targetX; + private int targetY; + private int trajectory; + private int direction; + private boolean isBlocked; + private GamePlayer targetPlayer; + + public SnowballObject(int objectId, SnowStormGame snowStormGame, GamePlayer thrower, int fromX, int fromY, int targetX, int targetY, int trajectory, int direction) { + this.objectId = objectId; + this.game = snowStormGame; + this.thrower = thrower; + this.fromX = fromX; + this.fromY = fromY; + this.targetX = targetX; + this.targetY = targetY; + this.direction = direction; + this.trajectory = trajectory; + } + + public int getTimeToLive() { + int tX = SnowStormGame.convertToWorldCoordinate(this.fromX); + int tY = SnowStormGame.convertToWorldCoordinate(this.fromY); + + int tDeltaX = ((SnowStormGame.convertToWorldCoordinate(this.targetX) - tX) / 200); + int tDeltaY = ((SnowStormGame.convertToWorldCoordinate(this.targetY) - tY) / 200); + + double tDistanceToTarget = Math.sqrt(((tDeltaX * tDeltaX) + (tDeltaY * tDeltaY))) * 200; + + if (this.getTrajectory() == SnowballTrajectory.QUICK_THROW) { + return (int) (tDistanceToTarget / SnowballTrajectory.QUICK_THROW.getVelocity()); + //return SnowballTrajectory.QUICK_THROW.getTimeToLive(); + } + + if (this.getTrajectory() == SnowballTrajectory.SHORT_TRAJECTORY) { + return (int) (tDistanceToTarget / SnowballTrajectory.SHORT_TRAJECTORY.getVelocity()); + + } + + if (this.getTrajectory() == SnowballTrajectory.LONG_TRAJECTORY) { + return (int) (tDistanceToTarget / SnowballTrajectory.LONG_TRAJECTORY.getVelocity()); + } + + return -1; + } + + public LinkedList getPath() { + return SnowStormPathfinder.getMaxVisibility( + this, + getFromX(), + getFromY(), + getTargetX(), + getTargetY(), + getTrajectory() + ); + } + + public void scheduleMovementTask() { + var path = this.getPath(); + + if (this.getTimeToLive() > 0 && path.size() > 0) { + var futureRunnable = new SnowballMovementTask(this); + futureRunnable.setFuture(GameScheduler.getInstance().getService().scheduleAtFixedRate(futureRunnable, 0, (this.getTimeToLive() * 100) / path.size(), TimeUnit.MILLISECONDS)); + } else { + this.game.handleSnowballLanding(this, false); + } + } + + public int getObjectId() { + return objectId; + } + + public GamePlayer getThrower() { + return thrower; + } + + public void setThrower(GamePlayer thrower) { + this.thrower = thrower; + } + + public SnowStormGame getGame() { + return game; + } + + public int getFromX() { + return fromX; + } + + public void setFromX(int fromX) { + this.fromX = fromX; + } + + public int getFromY() { + return fromY; + } + + public void setFromY(int fromY) { + this.fromY = fromY; + } + + public int getTargetX() { + return targetX; + } + + public void setTargetX(int targetX) { + this.targetX = targetX; + } + + public int getTargetY() { + return targetY; + } + + public void setTargetY(int targetY) { + this.targetY = targetY; + } + + public SnowballTrajectory getTrajectory() { + if (this.trajectory == SnowballTrajectory.QUICK_THROW.trajectoryId) { + return SnowballTrajectory.QUICK_THROW; + } + + if (this.trajectory == SnowballTrajectory.SHORT_TRAJECTORY.trajectoryId) { + return SnowballTrajectory.SHORT_TRAJECTORY; + } + + if (this.trajectory == SnowballTrajectory.LONG_TRAJECTORY.trajectoryId) { + return SnowballTrajectory.LONG_TRAJECTORY; + } + + return null; + } + + public void setTrajectory(int trajectory) { + this.trajectory = trajectory; + } + + public boolean isBlocked() { + return isBlocked; + } + + public void setBlocked(boolean blocked) { + isBlocked = blocked; + } + + public int getDirection() { + return direction; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/tasks/SnowStormGameTask.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/tasks/SnowStormGameTask.java new file mode 100644 index 0000000..9c34adc --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/tasks/SnowStormGameTask.java @@ -0,0 +1,247 @@ +package org.alexdev.havana.game.games.snowstorm.tasks; + +import org.alexdev.havana.game.GameScheduler; +import org.alexdev.havana.game.games.GameObject; +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.games.player.GameTeam; +import org.alexdev.havana.game.games.snowstorm.SnowStormGame; +import org.alexdev.havana.game.games.snowstorm.SnowStormTurn; +import org.alexdev.havana.game.games.snowstorm.events.SnowStormAvatarMoveEvent; +import org.alexdev.havana.game.games.snowstorm.events.SnowStormMachineAddSnowballEvent; +import org.alexdev.havana.game.games.snowstorm.events.SnowStormMachineMoveSnowballsEvent; +import org.alexdev.havana.game.games.snowstorm.mapping.SnowStormPathfinder; +import org.alexdev.havana.game.games.snowstorm.objects.SnowStormMachineObject; +import org.alexdev.havana.game.games.snowstorm.util.SnowStormFuture; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.pathfinder.Rotation; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.log.Log; +import org.alexdev.havana.messages.outgoing.games.SNOWSTORM_GAMESTATUS; +import org.alexdev.havana.util.schedule.FutureRunnable; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.TimeUnit; + +public class SnowStormGameTask implements Runnable { + private final Room room; + private final SnowStormGame game; + private List snowStormTurnList; + private List futureEvents; + private int maxGameTurns = 5; + + public SnowStormGameTask(Room room, SnowStormGame game) { + this.room = room; + this.game = game; + this.resetTurns(); + this.futureEvents = new CopyOnWriteArrayList<>(); + } + + private void resetTurns() { + this.snowStormTurnList = new CopyOnWriteArrayList<>(); + + for (int i = 0; i < maxGameTurns; i++) { + this.snowStormTurnList.add(new SnowStormTurn()); + } + } + + @Override + public void run() { + try { + if (this.game.getActivePlayers().isEmpty()) { + return; // Don't send any packets or do any logic checks during when the game is finished + } + + for (GameTeam gameTeam : this.game.getTeams().values()) { + for (GamePlayer gamePlayer : gameTeam.getPlayers()) { + Player player = gamePlayer.getPlayer(); + + if (player != null + && player.getRoomUser().getRoom() != null + && player.getRoomUser().getRoom() == this.room) { + player.getRoomUser().handleSpamTicks(); + this.processEntity(gamePlayer, this.game); + } + } + } + + } catch (Exception ex) { + Log.getErrorLogger().error("SnowstormWalkTask crashed: ", ex); + } + + try { + for (var future : futureEvents) { + if (future.getFramesFuture() == 0) { + sendQueue(0, future.getSubTurn(), future.getEvent()); + } + } + + //if (this.snowStormTurnList.stream().anyMatch(turn -> turn.getSubTurns().size() > 0)) { + for (Player player : this.game.getRoom().getEntityManager().getPlayers()) { + player.send(new SNOWSTORM_GAMESTATUS(this.snowStormTurnList)); + } + + this.resetTurns(); + //} + + this.futureEvents.removeIf(future -> future.getFramesFuture() == 0); + + for (var future : futureEvents) { + if (future.getFramesFuture() > 0) { + future.decrementFrame(); + } + } + + } catch (Exception ex) { + Log.getErrorLogger().error("SnowstormTask crashed: ", ex); + + } + } + + + public void sendQueue(int framesFuture, int subTurn, GameObject snowStormEvent) { + if (framesFuture == 0) { + try { + this.snowStormTurnList.get(subTurn - 1).getSubTurns().add(snowStormEvent); + } catch (Exception ex) { + + } + + return; + } + + this.futureEvents.add(new SnowStormFuture(framesFuture, subTurn, snowStormEvent)); + } + + /** + * Process entity. + */ + private void processEntity(GamePlayer gamePlayer, SnowStormGame game) { + if (gamePlayer.getSnowStormAttributes().isWalking()) { + if (gamePlayer.getSnowStormAttributes().getCurrentPosition().equals(gamePlayer.getSnowStormAttributes().getWalkGoal())) { + this.sendQueue(0, 1, new SnowStormAvatarMoveEvent(gamePlayer.getObjectId(), + gamePlayer.getSnowStormAttributes().getGoalWorldCoordinates()[0], + gamePlayer.getSnowStormAttributes().getGoalWorldCoordinates()[1])); + gamePlayer.getSnowStormAttributes().setRotation(Rotation.calculateWalkDirection(gamePlayer.getSnowStormAttributes().getCurrentPosition(), gamePlayer.getSnowStormAttributes().getWalkGoal())); + gamePlayer.getSnowStormAttributes().setNextGoal(null); + gamePlayer.getSnowStormAttributes().setWalking(false); + this.trySnowballMachine(gamePlayer, game); + return; + } + + var nextPosition = SnowStormPathfinder.getNextDirection(game, gamePlayer); + + if (nextPosition != null) { + gamePlayer.getSnowStormAttributes().setRotation(Rotation.calculateWalkDirection(gamePlayer.getSnowStormAttributes().getCurrentPosition(), nextPosition)); + gamePlayer.getSnowStormAttributes().setCurrentPosition(nextPosition.copy()); + gamePlayer.getSnowStormAttributes().setNextGoal(nextPosition.copy()); + this.sendQueue(0, 1, new SnowStormAvatarMoveEvent(gamePlayer.getObjectId(), + gamePlayer.getSnowStormAttributes().getGoalWorldCoordinates()[0], + gamePlayer.getSnowStormAttributes().getGoalWorldCoordinates()[1])); + } else { + gamePlayer.getSnowStormAttributes().setNextGoal(null); + gamePlayer.getSnowStormAttributes().setWalking(false); + } + } + } + + private void trySnowballMachine(GamePlayer gamePlayer, SnowStormGame game) { + //final var game = this; + var snowballItemPosition = new Position(gamePlayer.getSnowStormAttributes().getCurrentPosition().getX(), gamePlayer.getSnowStormAttributes().getCurrentPosition().getY() - 1); + var snowballMachineTile = game.getMap().getTile(snowballItemPosition); + + if (snowballMachineTile == null || snowballMachineTile.getHighestItem() == null || !snowballMachineTile.getHighestItem().isSnowballMachine()) { + return; + } + + SnowStormMachineObject obj = null;//this.game.getObjects().stream().filter((SnowStormMachineObject obj) -> obj.getPosition().) + + for (var object : game.getObjects()) { + if (!(object instanceof SnowStormMachineObject)) { + continue; + } + + SnowStormMachineObject machineObject = (SnowStormMachineObject) object; + + if (machineObject.getPosition().equals(snowballItemPosition)) { + obj = machineObject; + } + } + + if (obj == null) { + return; + } + + final var snowMachine = obj; + //final var snowballsToAdd = new AtomicInteger(0); + + var snowMachineAnimation = new FutureRunnable() { + public void run() { + try { + if (!snowMachine.isPlayerCollectingSnowballs(game)) { + this.cancelFuture(); + return; + } + + if (snowMachine.getSnowballs().get() < 5) { + snowMachine.getSnowballs().incrementAndGet(); + game.getUpdateTask().sendQueue(0, 1, new SnowStormMachineAddSnowballEvent(snowMachine.getId())); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } + }; + + /*var snowMachineRefill = new FutureRunnable() { + public void run() { + try { + if (!snowMachine.isPlayerCollectingSnowballs(game)) { + this.cancelFuture(); + return; + } + + if (snowMachine.getSnowballs().get() < 5 && snowballsToAdd.get() > 0) { + snowMachine.getSnowballs().incrementAndGet(); + snowballsToAdd.set(0); + ; + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } + };*/ + + var snowMachineRestock = new FutureRunnable() { + public void run() { + try { + if (!snowMachine.isPlayerCollectingSnowballs(game)) { + this.cancelFuture(); + return; + } + + if (snowMachine.getSnowballs().get() > 0) { + if (gamePlayer.getSnowStormAttributes().getSnowballs().get() < 5) { + gamePlayer.getSnowStormAttributes().getSnowballs().incrementAndGet(); + game.getUpdateTask().sendQueue(0, 1, new SnowStormMachineMoveSnowballsEvent(gamePlayer.getObjectId(), snowMachine.getId())); + snowMachine.getSnowballs().decrementAndGet(); + } + } + + } catch (Exception ex) { + ex.printStackTrace(); + } + } + }; + + snowMachineAnimation.setFuture(GameScheduler.getInstance().getService().scheduleWithFixedDelay(snowMachineAnimation, 0, 3, TimeUnit.SECONDS)); + snowMachineRestock.setFuture(GameScheduler.getInstance().getService().scheduleAtFixedRate(snowMachineRestock, 0, 1, TimeUnit.SECONDS)); + } + + public List getExecutingTurns() { + return new ArrayList<>(this.snowStormTurnList); + } + +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/tasks/SnowballMovementTask.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/tasks/SnowballMovementTask.java new file mode 100644 index 0000000..aab1404 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/tasks/SnowballMovementTask.java @@ -0,0 +1,115 @@ +package org.alexdev.havana.game.games.snowstorm.tasks; + +import org.alexdev.havana.game.games.snowstorm.SnowStormGame; +import org.alexdev.havana.game.games.snowstorm.mapping.SnowStormPathfinder; +import org.alexdev.havana.game.games.snowstorm.objects.SnowballObject; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.util.schedule.FutureRunnable; + +import java.util.LinkedList; + +public class SnowballMovementTask extends FutureRunnable { + private final SnowballObject snowball; + private final Position firstPosition; + private LinkedList path; + private long thrownTime; + private Position lastPosition; + + public SnowballMovementTask(SnowballObject snowball) { + this.snowball = snowball; + this.thrownTime = System.currentTimeMillis() + this.snowball.getTimeToLive() * 100; + this.path = snowball.getPath(); + this.firstPosition = new Position(this.snowball.getFromX(), this.snowball.getFromY(), this.snowball.getDirection()); + this.lastPosition = new Position(this.snowball.getFromX(), this.snowball.getFromY(), this.snowball.getDirection()); + } + + @Override + public void run() { + if (snowball.getTrajectory() != SnowballObject.SnowballTrajectory.LONG_TRAJECTORY) { + if (this.path.size() > 0) { + var nextPosition = this.path.poll(); + + this.lastPosition.setX(nextPosition.getX()); + this.lastPosition.setY(nextPosition.getY()); + + // --var tile = this.snowball.getGame().getMap().getTile(nextPosition); + + // --if (tile != null) { + // -- System.out.println("Trajectory: " + this.snowball.getTrajectory().name()); + // -- System.out.println("Tile: " + (tile.getHighestItem() != null ? tile.getHighestItem().getItemName() : "NULL") + " - " + nextPosition); + // -- System.out.println("Height: " + (tile.getHighestItem() != null ? tile.getHighestItem().getHeight() : "NULL") + " - " + nextPosition); + // -- } + + if (SnowStormPathfinder.isBlockedTile(this.snowball, nextPosition)) { + this.snowball.setTargetX(nextPosition.getX()); + this.snowball.setTargetY(nextPosition.getY()); + this.snowball.setBlocked(true); + this.endMovement(this.snowball, true); + return; + } + } else { + // --System.out.println("Finished flying"); + if ((this.snowball.getTrajectory() == SnowballObject.SnowballTrajectory.QUICK_THROW || this.snowball.getTrajectory() == SnowballObject.SnowballTrajectory.LONG_TRAJECTORY) && continueQuickThrowSnowball()) { + this.path = this.snowball.getPath(); + } else { + endMovement(this.snowball, true); + } + + return; + } + } + + if (System.currentTimeMillis() > this.thrownTime) { + if (this.snowball.getTrajectory() == SnowballObject.SnowballTrajectory.QUICK_THROW && continueQuickThrowSnowball()) { + this.path = this.snowball.getPath(); + } else { + endMovement(this.snowball, true); + } + } + } + + private boolean continueQuickThrowSnowball() { + boolean hasPlayer = false; + + Position nextPosition = new Position(this.snowball.getFromX(), this.snowball.getFromY(), 0, this.snowball.getDirection(), this.snowball.getDirection()); + + // Only check in straight lines... otherwise it's a goddamn heat seeking missile + while (true) { + var tile = nextPosition; + + if (snowball.getGame().getMap().getTile(nextPosition) == null) { + break; + } + + var oppositionPlayer = snowball.getGame().getActivePlayers().stream() + .filter(gamePlayer -> gamePlayer.getSnowStormAttributes().getCurrentPosition().equals(new Position(tile.getX(), tile.getY())) && + gamePlayer.getPlayer().getDetails().getId() == snowball.getTargetPlayer().getPlayer().getDetails().getId() && + gamePlayer.getSnowStormAttributes().isDamageable()).findFirst() + .orElse(null); + //SnowStormPathfinder.getOppositionPlayer(snowball.getGame(), snowball.getThrower(), nextPosition); + + if (oppositionPlayer != null) { + if (oppositionPlayer.getSnowStormAttributes().getCurrentPosition().getDistanceSquared(this.firstPosition) >= SnowStormGame.MAX_QUICK_THROW_DISTANCE) { + return false; + } + + this.snowball.setFromX(this.lastPosition.getX()); + this.snowball.setFromY(this.lastPosition.getY()); + + this.snowball.setTargetX(oppositionPlayer.getSnowStormAttributes().getCurrentPosition().getX()); + this.snowball.setTargetY(oppositionPlayer.getSnowStormAttributes().getCurrentPosition().getY()); + this.thrownTime = System.currentTimeMillis() + this.snowball.getTimeToLive() * 100; + return true; + } + + nextPosition = nextPosition.getSquareInFront(); + } + + return false; + } + + private void endMovement(SnowballObject snowball, boolean deleteAfterHit) { + this.snowball.getGame().handleSnowballLanding(this.snowball, deleteAfterHit); + this.cancelFuture(); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/util/SnowStormActivityState.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/util/SnowStormActivityState.java new file mode 100644 index 0000000..65093cc --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/util/SnowStormActivityState.java @@ -0,0 +1,33 @@ +package org.alexdev.havana.game.games.snowstorm.util; + +public enum SnowStormActivityState { + ACTIVITY_STATE_INVINCIBLE_AFTER_STUN(3,60), + ACTIVITY_STATE_STUNNED(2,125), + ACTIVITY_STATE_CREATING(0, 20), + ACTIVITY_STATE_NORMAL(0, 0); + + private final int stateId; + private final int timer; + + SnowStormActivityState(int stateId, int timer) { + this.stateId = stateId; + this.timer = timer; + } + + public int getStateId() { + return stateId; + } + + public int getTimer() { + return timer; + } + + /** + * Convert the amount of frames to real world time. + * + * @return the amount of frames + */ + public int getTimeInMS() { + return timer > 0 ? (timer /5) * 300 : 0; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/util/SnowStormAttributes.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/util/SnowStormAttributes.java new file mode 100644 index 0000000..5f51c24 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/util/SnowStormAttributes.java @@ -0,0 +1,154 @@ +package org.alexdev.havana.game.games.snowstorm.util; + +import org.alexdev.havana.game.GameScheduler; +import org.alexdev.havana.game.pathfinder.Position; + +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; + +public class SnowStormAttributes { + private boolean isWalking; + private Position currentPosition; + private Position walkGoal; + private Position nextGoal; + private int[] goalWorldCoordinates; + private AtomicInteger snowballs; + private AtomicInteger health; + private AtomicInteger score; + private int rotation; + private AtomicLong lastThrow; + private long immunityExpiry; + + private SnowStormActivityState activityState; + private long stateTime; + + public SnowStormAttributes() { + this.snowballs = new AtomicInteger(0); + this.health = new AtomicInteger(0); + this.score = new AtomicInteger(0); + this.lastThrow = new AtomicLong(0); + this.immunityExpiry = 0; + } + + public boolean isWalking() { + return isWalking; + } + + public void setWalking(boolean walking) { + isWalking = walking; + } + + public Position getCurrentPosition() { + return currentPosition; + } + + public void setCurrentPosition(Position currentPosition) { + this.currentPosition = currentPosition; + } + + public Position getWalkGoal() { + return walkGoal; + } + + public void setWalkGoal(Position walkGoal) { + this.walkGoal = walkGoal; + } + + public Position getNextGoal() { + return nextGoal; + } + + public void setNextGoal(Position nextGoal) { + this.nextGoal = nextGoal; + } + + public int[] getGoalWorldCoordinates() { + return goalWorldCoordinates; + } + + public void setGoalWorldCoordinates(int[] goalWorldCoordinates) { + this.goalWorldCoordinates = goalWorldCoordinates; + } + + public AtomicInteger getSnowballs() { + return snowballs; + } + + public AtomicInteger getHealth() { + return health; + } + + public int getRotation() { + return rotation; + } + + public void setRotation(int rotation) { + this.rotation = rotation; + } + + public SnowStormActivityState getActivityState() { + return activityState; + } + + public boolean isWalkable() { + return this.activityState == SnowStormActivityState.ACTIVITY_STATE_NORMAL || + this.activityState == SnowStormActivityState.ACTIVITY_STATE_INVINCIBLE_AFTER_STUN; + } + + public boolean isDamageable() { + return System.currentTimeMillis() > this.immunityExpiry && this.activityState == SnowStormActivityState.ACTIVITY_STATE_NORMAL; + } + + public void setActivityState(SnowStormActivityState activityState, Runnable runnable) { + this.activityState = activityState; + this.stateTime = System.currentTimeMillis() + activityState.getTimeInMS(); + + //System.out.println("Queued " + this.activityState.name() + " for " + activityState.getTimeInMS() + "ms"); + + if (activityState != SnowStormActivityState.ACTIVITY_STATE_NORMAL) { + GameScheduler.getInstance().getService().schedule(()-> { + this.activityState = SnowStormActivityState.ACTIVITY_STATE_NORMAL; + + if (runnable != null) + runnable.run(); + }, this.activityState.getTimeInMS(), TimeUnit.MILLISECONDS); + } + } + + public void setActivityState(SnowStormActivityState activityState) { + this.setActivityState(activityState, null); + } + + public int getActivityTimer() { + int timeRemaining = 0; + long expireTime = this.stateTime + this.activityState.getTimeInMS(); + + if (!(System.currentTimeMillis() > this.stateTime || this.activityState == SnowStormActivityState.ACTIVITY_STATE_NORMAL)) { + timeRemaining = (int) (expireTime - System.currentTimeMillis()); + timeRemaining = (timeRemaining / 300)*5; + } + + return timeRemaining; + } + + public AtomicInteger getScore() { + return score; + } + + public void setScore(AtomicInteger score) { + this.score = score; + } + + public AtomicLong getLastThrow() { + return lastThrow; + } + + public long getImmunityExpiry() { + return immunityExpiry; + } + + public void setImmunityExpiry(long immunityExpiry) { + this.immunityExpiry = immunityExpiry; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/util/SnowStormEvent.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/util/SnowStormEvent.java new file mode 100644 index 0000000..bbbf6a0 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/util/SnowStormEvent.java @@ -0,0 +1,26 @@ +package org.alexdev.havana.game.games.snowstorm.util; + +public enum SnowStormEvent { + WALK(0), + CREATE_SNOWBALL(3), + THROW_SNOWBALL_AT_LOCATION(2), + THROW_SNOWBALL_AT_PERSON(1); + + private final int eventId; + + SnowStormEvent(int eventId) { + this.eventId = eventId; + } + + public static SnowStormEvent getEvent(int eventId) { + for (var event : values()) + if (event.eventId == eventId) + return event; + + return null; + } + + public int getEventId() { + return eventId; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/util/SnowStormFuture.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/util/SnowStormFuture.java new file mode 100644 index 0000000..ca168d0 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/util/SnowStormFuture.java @@ -0,0 +1,31 @@ +package org.alexdev.havana.game.games.snowstorm.util; + +import org.alexdev.havana.game.games.GameObject; + +public class SnowStormFuture { + private int framesFuture; + private int subTurn; + private GameObject event; + + public SnowStormFuture(int framesFuture, int subTurn, GameObject event) { + this.framesFuture = framesFuture; + this.subTurn = subTurn; + this.event = event; + } + + public int getFramesFuture() { + return framesFuture; + } + + public int getSubTurn() { + return subTurn; + } + + public GameObject getEvent() { + return event; + } + + public void decrementFrame() { + this.framesFuture--; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/util/SnowStormMessage.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/util/SnowStormMessage.java new file mode 100644 index 0000000..c2bdd74 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/util/SnowStormMessage.java @@ -0,0 +1,10 @@ +package org.alexdev.havana.game.games.snowstorm.util; + +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.games.snowstorm.SnowStormGame; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.server.util.MalformedPacketException; + +public interface SnowStormMessage { + void handle(NettyRequest request, SnowStormGame snowStormGame, GamePlayer gamePlayer) throws MalformedPacketException; +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/util/SnowStormSpawn.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/util/SnowStormSpawn.java new file mode 100644 index 0000000..2fa6187 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/util/SnowStormSpawn.java @@ -0,0 +1,27 @@ +package org.alexdev.havana.game.games.snowstorm.util; + +import org.alexdev.havana.game.pathfinder.Position; + +public class SnowStormSpawn { + private Position position; + private int radius; + private int minDistance; + + public SnowStormSpawn(int X, int Y, int radius, int minDistance) { + this.position = new Position(X, Y); + this.radius = radius; + this.minDistance = minDistance; + } + + public Position getPosition() { + return position; + } + + public int getRadius() { + return radius; + } + + public int getMinDistance() { + return minDistance; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/tasks/GameFinishTask.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/tasks/GameFinishTask.java new file mode 100644 index 0000000..0cd0202 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/tasks/GameFinishTask.java @@ -0,0 +1,182 @@ +package org.alexdev.havana.game.games.tasks; + +import org.alexdev.havana.Havana; +import org.alexdev.havana.dao.mysql.GameDao; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.game.GameScheduler; +import org.alexdev.havana.game.achievements.AchievementManager; +import org.alexdev.havana.game.achievements.AchievementType; +import org.alexdev.havana.game.games.Game; +import org.alexdev.havana.game.games.GameManager; +import org.alexdev.havana.game.games.enums.GameType; +import org.alexdev.havana.game.games.history.GameHistory; +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.games.player.GameTeam; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.statistics.PlayerStatistic; +import org.alexdev.havana.game.room.managers.RoomTradeManager; +import org.alexdev.havana.server.netty.NettyPlayerNetwork; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.UUID; + +public class GameFinishTask implements Runnable { + private final List players; + private final ArrayList sortedTeamList; + private final GameType gameType; + private final Game game; + private final GameHistory gameHistory; + + public GameFinishTask(Game game, GameHistory gameHistory, GameType gameType, ArrayList sortedTeamList, List players) { + this.game = game; + this.gameHistory = gameHistory; + this.gameType = gameType; + this.sortedTeamList = sortedTeamList; + this.players = players; + } + + + @Override + public void run() { + boolean saveScore = false; + + GameManager.getInstance().getFinishedGameCounter().incrementAndGet(); + + if (this.game.canIncreasePoints()) { + for (GamePlayer gamePlayer : this.game.getActivePlayers()) { + gamePlayer.getScore(); + + if (this.gameType == GameType.BATTLEBALL) { + gamePlayer.setXp(gamePlayer.getScore() > 0 ? (gamePlayer.getScore() / 294) : 0); + } else { + gamePlayer.setXp(gamePlayer.getScore() > 0 ? (gamePlayer.getScore() / 3) : 0); + } + } + } + + if (this.game.canIncreasePoints()) { + if ((this.sortedTeamList.size() == 1 && this.sortedTeamList.get(0).getPlayers().size() > 1) || (this.sortedTeamList.size() > 1 + && this.sortedTeamList.get(0).getScore() > 0 + && this.sortedTeamList.get(0).getScore() != this.sortedTeamList.get(1).getScore()) && + this.sortedTeamList.get(0).getPlayers().size() > 0 && + this.sortedTeamList.get(1).getPlayers().size() > 0) { + + saveScore = true; + + + Player firstPlayer = null;//this.sortedTeamList.get(0).getPlayers().get(0).getPlayer(); + Player secondPlayer = null;//this.sortedTeamList.get(1).getPlayers().get(0).getPlayer(); + + + if (this.sortedTeamList.size() == 1) { + firstPlayer = this.sortedTeamList.get(0).getPlayers().get(0).getPlayer(); + secondPlayer = this.sortedTeamList.get(0).getPlayers().get(1).getPlayer(); + } else { + firstPlayer = this.sortedTeamList.get(0).getPlayers().get(0).getPlayer(); + secondPlayer = this.sortedTeamList.get(1).getPlayers().get(0).getPlayer(); + } + + String firstIp = NettyPlayerNetwork.getIpAddress(firstPlayer.getNetwork().getChannel()); + String secondIp = NettyPlayerNetwork.getIpAddress(secondPlayer.getNetwork().getChannel()); + + if (!firstIp.equals(secondIp) + && !PlayerDao.getIpAddresses(firstPlayer.getDetails().getId(), RoomTradeManager.TRADE_BAN_IP_HISTORY_LIMIT).contains(secondIp) + && !PlayerDao.getIpAddresses(secondPlayer.getDetails().getId(), RoomTradeManager.TRADE_BAN_IP_HISTORY_LIMIT).contains(firstIp)) { + for (GamePlayer g : this.sortedTeamList.get(0).getPlayers()) { + Player winningPlayer = g.getPlayer(); + + if (this.gameType == GameType.BATTLEBALL) { + winningPlayer.getStatisticManager().incrementValue(PlayerStatistic.BATTLEBALL_GAMES_WON, 1); + } else { + winningPlayer.getStatisticManager().incrementValue(PlayerStatistic.SNOWSTORM_GAMES_WON, 1); + } + + AchievementManager.getInstance().tryProgress(AchievementType.ACHIEVEMENT_GAME_PLAYED, winningPlayer); + } + } else { + saveScore = false; + } + } + + for (GamePlayer gamePlayer : this.players) { + var setMap = new HashMap(); + + if (saveScore) { + var score = (long) gamePlayer.getScore(); + + if (this.gameType == GameType.BATTLEBALL) { + setMap.put(PlayerStatistic.BATTLEBALL_MONTHLY_SCORES, String.valueOf(gamePlayer.getPlayer().getStatisticManager().getLongValue(PlayerStatistic.BATTLEBALL_MONTHLY_SCORES) + score)); + setMap.put(PlayerStatistic.BATTLEBALL_POINTS_ALL_TIME, String.valueOf(gamePlayer.getPlayer().getStatisticManager().getLongValue(PlayerStatistic.BATTLEBALL_POINTS_ALL_TIME) + score)); + } else { + setMap.put(PlayerStatistic.SNOWSTORM_MONTHLY_SCORES, String.valueOf(gamePlayer.getPlayer().getStatisticManager().getLongValue(PlayerStatistic.SNOWSTORM_MONTHLY_SCORES) + score)); + setMap.put(PlayerStatistic.SNOWSTORM_POINTS_ALL_TIME, String.valueOf(gamePlayer.getPlayer().getStatisticManager().getLongValue(PlayerStatistic.SNOWSTORM_POINTS_ALL_TIME) + score)); + } + + var player = gamePlayer.getPlayer(); + + setMap.put(PlayerStatistic.XP_EARNED_MONTH, String.valueOf(gamePlayer.getPlayer().getStatisticManager().getLongValue(PlayerStatistic.XP_EARNED_MONTH) + (long) gamePlayer.getXp())); + setMap.put(PlayerStatistic.XP_ALL_TIME, String.valueOf(gamePlayer.getPlayer().getStatisticManager().getLongValue(PlayerStatistic.XP_ALL_TIME) + (long) gamePlayer.getXp())); + player.getStatisticManager().setValues(gamePlayer.getUserId(), setMap); + + if (gamePlayer.getXp() > 0) { + int creditsAmount = GameManager.getInstance().getRandomCredits(this.sortedTeamList.get(0).getPlayers().contains(gamePlayer)); + + if (creditsAmount > 0) { + GameScheduler.getInstance().queuePlayerCredits(player, creditsAmount); + } + } + } + } + + if (saveScore) { + String uniqueId = UUID.randomUUID().toString(); + GameDao.saveTeamHistory(uniqueId, this.gameHistory.getName(), this.game.getGameCreatorId(), this.gameHistory.getMapId(), this.gameHistory.getWinningTeam(), this.gameHistory.getWinningTeamScore(), this.gameHistory.getExtraData(), this.gameType, Havana.getGson().toJson(this.gameHistory.getGameHistoryData())); + GameManager.getInstance().refreshPlayedGames(); + } + + /*for (GameTeam team : this.sortedTeamList) { + if (team.getPlayers().isEmpty()) { + continue; + } + + GameHistoryData gamePlayedHistory = new GameHistoryData(); + + for (GamePlayer gamePlayer : team.getPlayers()) { + gamePlayedHistory.addPlayer(gamePlayer.getPlayer().getDetails().getId(), gamePlayer.calculateScore()); + } + + GameDao.saveTeamHistory(uniqueId, this.gameType, team.getId(), team.getScore(), Havana.getGson().toJson(gamePlayedHistory)); + }*/ + } + } + + /*var sortedPlayers = new ArrayList<>(this.game.getPlayers()); + sortedPlayers.sort(Comparator.comparingInt(GamePlayer::getScore).reversed()); + + boolean firstTeamHasHighscore = this.sortedTeamList.size() > 0 && this.sortedTeamList.get(0).hasHighscore(); + boolean firstPlayerHasHighscore = sortedPlayers.size() > 0 && sortedPlayers.get(0).hasHighscore(); + + // Only set highscore for top team + if (this.sortedTeamList.size() > 0) { + for (var team : this.sortedTeamList) { + team.setHasHighscore(false); + } + + this.sortedTeamList.get(0).setHasHighscore(firstTeamHasHighscore); + } + + // Only set highscore for top player + if (this.sortedTeamList.size() > 0) { + for (var player : sortedPlayers) { + player.setHasHighscore(false); + } + + sortedPlayers.get(0).setHasHighscore(firstPlayerHasHighscore); + }*/ + + /*this.game.send(new GAME_ENDING(this.game, this.sortedTeamList, + GameManager.getInstance().getTopPlayers(), + GameManager.getInstance().getTopTeams()));*/ +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/triggers/BattleShipsTrigger.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/triggers/BattleShipsTrigger.java new file mode 100644 index 0000000..74789f0 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/triggers/BattleShipsTrigger.java @@ -0,0 +1,68 @@ +package org.alexdev.havana.game.games.triggers; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.games.gamehalls.GameBattleShip; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.room.entities.RoomEntity; + +import java.util.ArrayList; +import java.util.List; + +public class BattleShipsTrigger extends GameTrigger { + public BattleShipsTrigger() { + for (var kvp : this.getChairGroups()) { + this.getGameInstances().add(new GameBattleShip(kvp)); + } + } + + @Override + public void onEntityStep(Entity entity, RoomEntity roomEntity, Item item, Position oldPosition) { + super.onEntityStep(entity, roomEntity, item, oldPosition); + } + + @Override + public void onEntityStop(Entity entity, RoomEntity roomEntity, Item item, boolean isRotation) { + super.onEntityStop(entity, roomEntity, item, isRotation); + } + + @Override + public void onEntityLeave(Entity entity, RoomEntity roomEntity, Item item, Object... customArgs) { + super.onEntityLeave(entity, roomEntity, item, customArgs); + } + + /** + * Gets the list of seats as a group for when people play a game to gether. + * + * @return the map of chair groups + */ + @Override + public List> getChairGroups() { + return new ArrayList<>() {{ + add(new ArrayList<>() {{ + add(new int[]{15, 3}); + add(new int[]{13, 3}); + }}); + + add(new ArrayList<>() {{ + add(new int[]{8, 3}); + add(new int[]{6, 3}); + }}); + + add(new ArrayList<>() {{ + add(new int[]{2, 4}); + add(new int[]{2, 6}); + }}); + + add(new ArrayList<>() {{ + add(new int[]{2, 10}); + add(new int[]{2, 12}); + }}); + + add(new ArrayList<>() {{ + add(new int[]{2, 16}); + add(new int[]{2, 18}); + }}); + }}; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/triggers/ChessTrigger.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/triggers/ChessTrigger.java new file mode 100644 index 0000000..0266540 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/triggers/ChessTrigger.java @@ -0,0 +1,68 @@ +package org.alexdev.havana.game.games.triggers; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.games.gamehalls.GameChess; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.room.entities.RoomEntity; + +import java.util.ArrayList; +import java.util.List; + +public class ChessTrigger extends GameTrigger { + public ChessTrigger() { + for (var kvp : this.getChairGroups()) { + this.getGameInstances().add(new GameChess(kvp)); + } + } + + @Override + public void onEntityStep(Entity entity, RoomEntity roomEntity, Item item, Position oldPosition) { + super.onEntityStep(entity, roomEntity, item, oldPosition); + } + + @Override + public void onEntityStop(Entity entity, RoomEntity roomEntity, Item item, boolean isRotation) { + super.onEntityStop(entity, roomEntity, item, isRotation); + } + + @Override + public void onEntityLeave(Entity entity, RoomEntity roomEntity, Item item, Object... customArgs) { + super.onEntityLeave(entity, roomEntity, item, customArgs); + } + + /** + * Gets the list of seats and their pairs as coordinates + * + * @return the map of chair pairs + */ + @Override + public List> getChairGroups() { + return new ArrayList<>() {{ + add(new ArrayList<>() {{ + add(new int[]{2, 7}); + add(new int[]{2, 9}); + }}); + + add(new ArrayList<>() {{ + add(new int[]{6, 14}); + add(new int[]{4, 14}); + }}); + + add(new ArrayList<>() {{ + add(new int[]{12, 14}); + add(new int[]{12, 12}); + }}); + + add(new ArrayList<>() {{ + add(new int[]{13, 7}); + add(new int[]{13, 5}); + }}); + + add(new ArrayList<>() {{ + add(new int[]{7, 3}); + add(new int[]{9, 3}); + }}); + }}; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/triggers/GameTrigger.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/triggers/GameTrigger.java new file mode 100644 index 0000000..27ce83c --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/triggers/GameTrigger.java @@ -0,0 +1,148 @@ +package org.alexdev.havana.game.games.triggers; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.games.gamehalls.GamehallGame; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.interactors.InteractionType; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.entities.RoomEntity; +import org.alexdev.havana.game.triggers.GenericTrigger; +import org.alexdev.havana.messages.outgoing.rooms.games.CLOSEGAMEBOARD; +import org.alexdev.havana.messages.outgoing.rooms.games.OPENGAMEBOARD; + +import java.util.ArrayList; +import java.util.List; + +public abstract class GameTrigger extends GenericTrigger { + private List gameInstances; + + public GameTrigger() { + this.gameInstances = new ArrayList<>(); + } + + @Override + public void onEntityStop(Entity entity, RoomEntity roomEntity, Item item, boolean isRotation) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + + // Call default sitting trigger + InteractionType.CHAIR.getTrigger().onEntityStop(entity, roomEntity, item, isRotation); + + + // Handle game logic from here + GamehallGame instance = this.getGameInstance(item.getPosition()); + + if (instance != null && !(instance.getRoomId() > 0)) { + instance.setRoomId(roomEntity.getRoom().getId()); + } + + if (instance == null || (instance.getPlayers().size() >= instance.getMaximumPeopleRequired())) { + return; + } + + List joinedPlayers = instance.refreshPlayers(); + + if (instance.getGameId() != null) { + if (instance.getPlayers().size() >= instance.getMinimumPeopleRequired()) { + + for (Player p : joinedPlayers) { + p.send(new OPENGAMEBOARD(instance.getGameId(), instance.getGameFuseType())); // Player joined mid-game + } + } + } + + if (instance.getGameId() == null) { + if (instance.hasPlayersRequired()) { // New game started + instance.createGameId(); + instance.gameStart(); + instance.sendToEveryone(new OPENGAMEBOARD(instance.getGameId(), instance.getGameFuseType()));; + } + } + + /*if (instance.getGameId() == null) { + if (joinedPlayers.size() >= 1) { // New game started + instance.createGameId(); + instance.gameStart(); + + for (Player p : joinedPlayers) { + p.send(new OPENGAMEBOARD(instance.getGameId(), instance.getGameFuseType())); // Player joined mid-game + } + } + } else { + player.send(new OPENGAMEBOARD(instance.getGameId(), instance.getGameFuseType())); + }*/ + } + + @Override + public void onEntityLeave(Entity entity, RoomEntity roomEntity, Item item, Object... customArgs) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + GamehallGame instance = this.getGameInstance(item.getPosition()); + + if (instance == null) { + return; + } + + if (player.getRoomUser().getCurrentGameId() == null) { + return; + } + + if (instance.getGameId() != null) { // If game has started + int newPlayerCount = instance.getPlayers().size() - 1; + + if (newPlayerCount >= instance.getMinimumPeopleRequired()) { + player.send(new CLOSEGAMEBOARD(instance.getGameId(), instance.getGameFuseType())); + } else { + instance.sendToEveryone(new CLOSEGAMEBOARD(instance.getGameId(), instance.getGameFuseType())); + } + } + + instance.getPlayers().remove(player); + player.getRoomUser().setCurrentGameId(null); + + if (!instance.hasPlayersRequired()) { + instance.resetGameId(); + instance.gameStop(); + } + } + + /** + * Gets the game instance on this specified position. + * + * @param position the position to look for the game instance + * @return the game instance, if successful + */ + public GamehallGame getGameInstance(Position position) { + for (GamehallGame instances : this.gameInstances) { + for (int[] coordinate : instances.getChairCoordinates()) { + if (position.equals(new Position(coordinate[0], coordinate[1]))) { + return instances; + } + } + } + + return null; + } + + /** + * Get all game instances. + * + * @return the list of game instances + */ + public List getGameInstances() { + return gameInstances; + } + + /** + * Gets the list of seats and their pairs as coordinates + */ + public abstract List> getChairGroups(); +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/triggers/PokerTrigger.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/triggers/PokerTrigger.java new file mode 100644 index 0000000..330ef05 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/triggers/PokerTrigger.java @@ -0,0 +1,99 @@ +package org.alexdev.havana.game.games.triggers; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.games.gamehalls.GamePoker; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.room.entities.RoomEntity; + +import java.util.ArrayList; +import java.util.List; + +public class PokerTrigger extends GameTrigger { + public PokerTrigger() { + for (var kvp : this.getChairGroups()) { + this.getGameInstances().add(new GamePoker(kvp)); + } + } + + @Override + public void onEntityStep(Entity entity, RoomEntity roomEntity, Item item, Position oldPosition) { + super.onEntityStep(entity, roomEntity, item, oldPosition); + } + + @Override + public void onEntityStop(Entity entity, RoomEntity roomEntity, Item item, boolean isRotation) { + super.onEntityStop(entity, roomEntity, item, isRotation); + } + + @Override + public void onEntityLeave(Entity entity, RoomEntity roomEntity, Item item, Object... customArgs) { + super.onEntityLeave(entity, roomEntity, item, customArgs); + } + + /** + * Gets the list of seats as a group for when people play a game to gether. + * + * @return the map of chair groups + */ + @Override + public List> getChairGroups() { + return new ArrayList<>() {{ + add(new ArrayList<>() {{ + add(new int[]{2, 14}); + add(new int[]{2, 16}); + add(new int[]{3, 15}); + add(new int[]{1, 15}); + }}); + + add(new ArrayList<>() {{ + add(new int[]{8, 2}); + add(new int[]{8, 4}); + add(new int[]{9, 3}); + add(new int[]{7, 3}); + }}); + + add(new ArrayList<>() {{ + add(new int[]{14, 2}); + add(new int[]{14, 4}); + add(new int[]{15, 3}); + add(new int[]{13, 3}); + }}); + + add(new ArrayList<>() {{ + add(new int[]{2, 8}); + add(new int[]{2, 10}); + add(new int[]{3, 9}); + add(new int[]{1, 9}); + }}); + + add(new ArrayList<>() {{ + add(new int[]{8, 8}); + add(new int[]{8, 10}); + add(new int[]{9, 9}); + add(new int[]{7, 9}); + }}); + + add(new ArrayList<>() {{ + add(new int[]{14, 8}); + add(new int[]{14, 10}); + add(new int[]{15, 9}); + add(new int[]{13, 9}); + }}); + + add(new ArrayList<>() {{ + add(new int[]{8, 14}); + add(new int[]{8, 16}); + add(new int[]{9, 15}); + add(new int[]{7, 15}); + }}); + + add(new ArrayList<>() {{ + add(new int[]{14, 14}); + add(new int[]{14, 16}); + add(new int[]{15, 15}); + add(new int[]{13, 15}); + }}); + }}; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/triggers/TicTacToeTrigger.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/triggers/TicTacToeTrigger.java new file mode 100644 index 0000000..628f8bb --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/triggers/TicTacToeTrigger.java @@ -0,0 +1,89 @@ +package org.alexdev.havana.game.games.triggers; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.games.gamehalls.GameTicTacToe; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.room.entities.RoomEntity; + +import java.util.ArrayList; +import java.util.List; + +public class TicTacToeTrigger extends GameTrigger { + public TicTacToeTrigger() { + for (var kvp : this.getChairGroups()) { + this.getGameInstances().add(new GameTicTacToe(kvp)); + } + } + + @Override + public void onEntityStep(Entity entity, RoomEntity roomEntity, Item item, Position oldPosition) { + super.onEntityStep(entity, roomEntity, item, oldPosition); + } + + @Override + public void onEntityStop(Entity entity, RoomEntity roomEntity, Item item, boolean isRotation) { + super.onEntityStop(entity, roomEntity, item, isRotation); + } + + @Override + public void onEntityLeave(Entity entity, RoomEntity roomEntity, Item item, Object... customArgs) { + super.onEntityLeave(entity, roomEntity, item, customArgs); + } + + /** + * Gets the list of seats and their pairs as coordinates + * + * @return the map of chair pairs + */ + @Override + public List> getChairGroups() { + return new ArrayList<>() {{ + add(new ArrayList<>() {{ + add(new int[]{15, 4}); + add(new int[]{15, 5}); + }}); + + add(new ArrayList<>() {{ + add(new int[]{15, 9}); + add(new int[]{15, 10}); + }}); + + add(new ArrayList<>() {{ + add(new int[]{15, 14}); + add(new int[]{15, 15}); + }}); + + add(new ArrayList<>() {{ + add(new int[]{10, 4}); + add(new int[]{10, 5}); + }}); + + add(new ArrayList<>() {{ + add(new int[]{10, 9}); + add(new int[]{10, 10}); + }}); + + add(new ArrayList<>() {{ + add(new int[]{10, 14}); + add(new int[]{10, 15}); + }}); + + + add(new ArrayList<>() {{ + add(new int[]{5, 4}); + add(new int[]{5, 5}); + }}); + + add(new ArrayList<>() {{ + add(new int[]{5, 9}); + add(new int[]{5, 10}); + }}); + + add(new ArrayList<>() {{ + add(new int[]{5, 14}); + add(new int[]{5, 15}); + }}); + }}; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/utils/FinishedGame.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/utils/FinishedGame.java new file mode 100644 index 0000000..7465c0b --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/utils/FinishedGame.java @@ -0,0 +1,100 @@ +package org.alexdev.havana.game.games.utils; + +import org.alexdev.havana.game.games.Game; +import org.alexdev.havana.game.games.GameManager; +import org.alexdev.havana.game.games.enums.GameType; +import org.alexdev.havana.game.games.battleball.BattleBallGame; +import org.alexdev.havana.game.games.player.GameTeam; +import org.alexdev.havana.util.DateUtil; +import org.apache.commons.lang3.tuple.Pair; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class FinishedGame { + private int id; + private int mapId; + private String name; + private String mapCreator; + private GameType gameType; + private List powerUps; + private Map teamScores; + + private long expireTime; + + public FinishedGame(Game game) { + this.id = game.getId(); + this.mapId = game.getMapId(); + this.name = game.getName(); + this.mapCreator = game.getGameCreator(); + this.gameType = game.getGameType(); + + if (this.gameType == GameType.BATTLEBALL) { + BattleBallGame battleballGame = (BattleBallGame) game; + this.powerUps = battleballGame.getAllowedPowerUps(); + } + + this.teamScores = new HashMap<>(); + this.expireTime = DateUtil.getCurrentTimeSeconds() + GameManager.getInstance().getListingExpiryTime(); + + for (int i = 0; i < game.getTeamAmount(); i++) { + this.teamScores.put(i, new FinishedGameTeam(game.getTeams().get(i))); + } + } + + public int getId() { + return id; + } + + public int getMapId() { + return mapId; + } + + public String getMapCreator() { + return mapCreator; + } + + public Map getTeamScores() { + return teamScores; + } + + public GameType getGameType() { + return gameType; + } + + public String getName() { + return name; + } + + public List getAllowedPowerUps() { + return powerUps; + } + + public long getExpireTime() { + return expireTime; + } + + public class FinishedGameTeam { + private int score; + private List> playerScores; + + private FinishedGameTeam(GameTeam gameTeam) { + this.score = gameTeam.getScore(); + this.playerScores = new ArrayList<>(); + + for (var gamePlayer : gameTeam.getPlayers()) { + this.playerScores.add(Pair.of(gamePlayer.getPlayer().getDetails().getName(), gamePlayer.getScore())); + } + } + + public int getScore() { + return score; + } + + public List> getPlayerScores() { + return playerScores; + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/utils/FloodFill.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/utils/FloodFill.java new file mode 100644 index 0000000..4eb9992 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/utils/FloodFill.java @@ -0,0 +1,57 @@ +package org.alexdev.havana.game.games.utils; + +import org.alexdev.havana.game.games.Game; +import org.alexdev.havana.game.games.battleball.BattleBallTile; +import org.alexdev.havana.game.games.battleball.enums.BattleBallColourState; +import org.alexdev.havana.game.games.battleball.enums.BattleBallTileState; +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.pathfinder.Pathfinder; +import org.alexdev.havana.game.pathfinder.Position; + +import java.util.*; + +public class FloodFill { + public static Collection getFill(GamePlayer gamePlayer, BattleBallTile startTile) { + HashSet closed = new HashSet<>(); + + ArrayDeque stack = new ArrayDeque<>(); + stack.add(startTile); + + while (stack.size() > 0) { + BattleBallTile tile = stack.pollLast(); + + if (tile != null) { + for (BattleBallTile loopTile : neighbours(gamePlayer.getGame(), tile.getPosition())) { + if (loopTile == null) { + closed.clear(); + return closed; + } + + if (loopTile.getColour() == BattleBallColourState.DISABLED) { + closed.clear(); + return closed; + } + + if ((loopTile.getColour().getColourId() != gamePlayer.getTeamId() || loopTile.getState() != BattleBallTileState.SEALED) && !closed.contains(loopTile) && !stack.contains(loopTile)) { + stack.addFirst(loopTile); + } + } + + closed.add(tile); + } + } + + return closed; + } + + public static HashSet neighbours(Game game, Position position) { + HashSet battleballTiles = new HashSet<>(); + + for (Position point : Pathfinder.MOVE_POINTS) { + Position tmp = position.copy().add(point); + battleballTiles.add((BattleBallTile) game.getTile(tmp.getX(), tmp.getY())); + } + + return battleballTiles; + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/utils/PowerUpUtil.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/utils/PowerUpUtil.java new file mode 100644 index 0000000..a125e47 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/utils/PowerUpUtil.java @@ -0,0 +1,32 @@ +package org.alexdev.havana.game.games.utils; + +import org.alexdev.havana.game.GameScheduler; +import org.alexdev.havana.game.games.Game; +import org.alexdev.havana.game.games.battleball.enums.BattleBallPlayerState; +import org.alexdev.havana.game.games.battleball.objects.PlayerUpdateObject; +import org.alexdev.havana.game.games.enums.GameState; +import org.alexdev.havana.game.games.player.GamePlayer; + +import java.util.concurrent.TimeUnit; + +public class PowerUpUtil { + public static void stunPlayer(Game game, GamePlayer gamePlayer, BattleBallPlayerState state) { + gamePlayer.getPlayer().getRoomUser().stopWalking(); + gamePlayer.getPlayer().getRoomUser().setWalkingAllowed(false); + game.getRoom().getMapping().regenerateCollisionMap(); + + gamePlayer.setPlayerState(state); + game.addObjectToQueue(new PlayerUpdateObject(gamePlayer)); + + // Restore player 5 seconds later + GameScheduler.getInstance().getService().schedule(()-> { + if (game.getGameState() != GameState.ENDED) { + gamePlayer.getPlayer().getRoomUser().setWalkingAllowed(true); + } + + gamePlayer.setPlayerState(BattleBallPlayerState.NORMAL); + game.addObjectToQueue(new PlayerUpdateObject(gamePlayer)); + }, 5, TimeUnit.SECONDS); + } + +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/utils/ScoreReference.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/utils/ScoreReference.java new file mode 100644 index 0000000..4b3a718 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/utils/ScoreReference.java @@ -0,0 +1,27 @@ +package org.alexdev.havana.game.games.utils; + +import org.alexdev.havana.game.games.player.GameTeam; + +public class ScoreReference { + private int score; + private GameTeam gameTeam; + private int by; + + public ScoreReference(int score, GameTeam gameTeam, int by) { + this.score = score; + this.gameTeam = gameTeam; + this.by = by; + } + + public int getScore() { + return score; + } + + public GameTeam getGameTeam() { + return gameTeam; + } + + public int getBy() { + return by; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/utils/TileUtil.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/utils/TileUtil.java new file mode 100644 index 0000000..3026f32 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/utils/TileUtil.java @@ -0,0 +1,64 @@ +package org.alexdev.havana.game.games.utils; + +import org.alexdev.havana.game.games.Game; +import org.alexdev.havana.game.games.battleball.BattleBallTile; +import org.alexdev.havana.game.games.battleball.enums.BattleBallColourState; +import org.alexdev.havana.game.games.battleball.enums.BattleBallTileState; +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.room.mapping.RoomTile; + +public class TileUtil { + public static boolean undoTileAttributes(BattleBallTile tile, Game game) { + BattleBallTileState state = tile.getState(); + BattleBallColourState colour = tile.getColour(); + + if (colour == BattleBallColourState.DEFAULT || state == BattleBallTileState.DEFAULT) { + return false; + } + + tile.getPointsReferece().clear(); + + tile.setColour(BattleBallColourState.DEFAULT); + tile.setState(BattleBallTileState.DEFAULT); + + /*int pointsToRemove = 0; + + if (state == BattleBallTileState.TOUCHED) { + pointsToRemove = 2; + } + + if (state == BattleBallTileState.CLICKED) { + pointsToRemove = 6; + } + + if (state == BattleBallTileState.PRESSED) { + pointsToRemove = 10; + } + + if (state == BattleBallTileState.SEALED) { + pointsToRemove = 14; + } + + GameTeam team = game.getTeams().get(colour.getColourId()); + + if (pointsToRemove > 0) { + int eachTeamRemove = team.getPlayers().size() / pointsToRemove; + + for (GamePlayer p : team.getPlayers()) { + //p.setScore(p.getScore() - eachTeamRemove); + } + + tile.setColour(BattleBallColourState.DEFAULT); + tile.setState(BattleBallTileState.DEFAULT); + }*/ + + return true; + } + public static boolean isValidGameTile(GamePlayer gamePlayer, BattleBallTile tile, boolean checkEntities) { + if (tile == null) {// && tile.getColour() != BattleBallColourState.DISABLED; + return false; + } + + return RoomTile.isValidTile(gamePlayer.getGame().getRoom(), checkEntities ? gamePlayer.getPlayer() : null, tile.getPosition()); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/wobblesquabble/WobbleSquabbleGame.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/wobblesquabble/WobbleSquabbleGame.java new file mode 100644 index 0000000..d8142cc --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/wobblesquabble/WobbleSquabbleGame.java @@ -0,0 +1,382 @@ +package org.alexdev.havana.game.games.wobblesquabble; + +import org.alexdev.havana.dao.mysql.CurrencyDao; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.game.GameScheduler; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.interactors.InteractionType; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.statistics.PlayerStatistic; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.enums.StatusType; +import org.alexdev.havana.game.room.managers.RoomTradeManager; +import org.alexdev.havana.log.Log; +import org.alexdev.havana.messages.outgoing.user.currencies.TICKET_BALANCE; +import org.alexdev.havana.messages.outgoing.wobblesquabble.*; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.NettyPlayerNetwork; +import org.alexdev.havana.util.DateUtil; + +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.TimeUnit; + +public class WobbleSquabbleGame implements Runnable { + private static int LEFT_X = 21; + private static int LEFT_Y = 15; + + private Room room; + private WobbleSquabblePlayer firstPlayer; + private WobbleSquabblePlayer secondPlayer; + private boolean hasGameStarted; + private boolean hasGameEnded; + private long gameStarted; + + public WobbleSquabbleGame(Player firstPlayer, Player secondPlayer) { + this.room = firstPlayer.getRoomUser().getRoom(); + this.hasGameStarted = false; + this.firstPlayer = new WobbleSquabblePlayer(this, firstPlayer, -1); + this.secondPlayer = new WobbleSquabblePlayer(this, secondPlayer, -1); + + if (this.firstPlayer.getPlayer().getRoomUser().getPosition().equals(new Position(LEFT_X, LEFT_Y))) { + this.firstPlayer.setOrder(0); + this.secondPlayer.setOrder(1); + } else { + this.secondPlayer.setOrder(0); + this.firstPlayer.setOrder(1); + } + } + + /** + * Send a message to both clients. + * + * @param composer the clients to send to + */ + public void send(MessageComposer composer) { + /*this.firstPlayer.send(composer); + this.secondPlayer.send(composer);*/ + this.room.send(composer); + } + + @Override + public void run() { + try { + if (this.hasGameEnded) { + return; + } + + WobbleSquabblePlayer wsPlayer1 = this.getPlayer(0); + WobbleSquabblePlayer wsPlayer2 = this.getPlayer(1); + + if (!this.hasGameStarted) { + this.hasGameStarted = true; + this.gameStarted = DateUtil.getCurrentTimeSeconds(); + this.send(new PT_START(wsPlayer1, wsPlayer2)); + + // Set positions + wsPlayer1.setPosition(-3); + wsPlayer2.setPosition(4); + return; + } + + // If either requires a status update, send the update + if (wsPlayer1.isRequiresUpdate() || wsPlayer2.isRequiresUpdate()) { + this.updatePlayer(0); + this.updatePlayer(1); + + this.send(new PT_STATUS(wsPlayer1, wsPlayer2)); + + wsPlayer1.resetActions(); + wsPlayer2.resetActions(); + } + + // If the game has timed out, too bad! + if (DateUtil.getCurrentTimeSeconds() > this.gameStarted + WobbleSquabbleManager.WS_GAME_TIMEOUT_SECS) { + this.send(new PT_TIMEOUT()); + this.endGame(-1); // Tied! + return; + } + + int loser = -1; + int winner = -1; + + // If one of us gets a bit tipsy and off-balance, end the game! + if (!wsPlayer1.isBalancing()) { + loser = wsPlayer1.getOrder(); + winner = wsPlayer2.getOrder(); + } + + if (!wsPlayer2.isBalancing()) { + loser = wsPlayer2.getOrder(); + winner = wsPlayer1.getOrder(); + } + + // If we have a loser and a winner, end the game! + if (loser != -1 && winner != -1) { + this.endGame(winner); + } + } catch (Exception ex) { + Log.getErrorLogger().error("Wobble Squabble task crashed: ", ex); + } + } + + /** + * Update wobble squabble player. + * + * @param wsPlayerOrder the player to update + */ + private void updatePlayer(int wsPlayerOrder) { + WobbleSquabblePlayer wsPlayer = this.getPlayer(wsPlayerOrder); + WobbleSquabblePlayer wsOpponent = wsPlayer.getGame().getPlayer(wsPlayer.getOrder() == 1 ? 0 : 1); + + int opponentDistance = Math.abs(wsPlayer.getPosition() - wsOpponent.getPosition()); + + switch (wsPlayer.getMove()) { + case BALANCE_LEFT: { + int balanceCalculated = WobbleSquabbleManager.WS_BALANCE_POINTS + ThreadLocalRandom.current().nextInt(10); + wsPlayer.setBalance(wsPlayer.getBalance() - balanceCalculated); + break; + } + + case BALANCE_RIGHT: { + int balanceCalculated = WobbleSquabbleManager.WS_BALANCE_POINTS + ThreadLocalRandom.current().nextInt(10); + wsPlayer.setBalance(wsPlayer.getBalance() + balanceCalculated); + break; + } + + case HIT_LEFT: { + // Are we standing next to our opponent? + if (opponentDistance <= 2/*(wsPlayer.getPosition() + 1) == wsOpponent.getPosition() || (wsPlayer.getPosition() - 1) == wsOpponent.getPosition()*/) { + wsOpponent.setHit(true); + + int balanceCalculated = WobbleSquabbleManager.WS_HIT_POINTS + ThreadLocalRandom.current().nextInt(10); + wsOpponent.setBalance(wsOpponent.getBalance() + balanceCalculated); + } else { + int balanceCalculated = WobbleSquabbleManager.WS_HIT_BALANCE_POINTS + ThreadLocalRandom.current().nextInt(10); + wsPlayer.setBalance(wsPlayer.getBalance() + balanceCalculated); + } + + break; + } + + case HIT_RIGHT: { + // Are we standing next to our opponent? + if (opponentDistance <= 2/*(wsPlayer.getPosition() + 1) == wsOpponent.getPosition() || (wsPlayer.getPosition() - 1) == wsOpponent.getPosition()*/) { + wsOpponent.setHit(true); + + int balanceCalculated = WobbleSquabbleManager.WS_HIT_POINTS + ThreadLocalRandom.current().nextInt(10); + wsOpponent.setBalance(wsOpponent.getBalance() - balanceCalculated); + } else { + int balanceCalculated = WobbleSquabbleManager.WS_HIT_BALANCE_POINTS + ThreadLocalRandom.current().nextInt(10); + wsPlayer.setBalance(wsPlayer.getBalance() - balanceCalculated); + } + + break; + } + + case WALK_FORWARD: { + // Calculate new position + int newPosition = wsPlayer.getPosition() - 1; + + if (newPosition >= -3 && newPosition <= 4) { + if (newPosition != wsOpponent.getPosition()) { + wsPlayer.setPosition(newPosition); + } + } + + break; + } + + case WALK_BACKWARD: { + // Calculate new position + int newPosition = wsPlayer.getPosition() + 1; + + if (newPosition >= -3 && newPosition <= 4) { + if (newPosition != wsOpponent.getPosition()) { + wsPlayer.setPosition(newPosition); + } + } + + break; + } + + case REBALANCE: { + if (!wsPlayer.isRebalanced()) { + wsPlayer.setRebalanced(true); + wsPlayer.setBalance(0); + } + break; + } + } + } + + /** + * Method for ending the game. + */ + public void endGame(int winner) { + if (!this.room.getTaskManager().hasTask(WobbleSquabbleManager.getInstance().getName())) { + return; + } + + this.hasGameEnded = true; + int loser = winner == 1 ? 0 : 1; + + String firstIp = NettyPlayerNetwork.getIpAddress(this.getPlayer(0).getPlayer().getNetwork().getChannel()); + String secondIp = NettyPlayerNetwork.getIpAddress(this.getPlayer(1).getPlayer().getNetwork().getChannel()); + + if (!firstIp.equals(secondIp) + && !PlayerDao.getIpAddresses(this.getPlayer(0).getPlayer().getDetails().getId(), RoomTradeManager.TRADE_BAN_IP_HISTORY_LIMIT).contains(secondIp) + && !PlayerDao.getIpAddresses(this.getPlayer(1).getPlayer().getDetails().getId(), RoomTradeManager.TRADE_BAN_IP_HISTORY_LIMIT).contains(firstIp)) { + + WobbleSquabblePlayer winningWsPlayer = this.getPlayer(winner); + + if (winner != -1) { + // Game didn't tie! + winningWsPlayer.getPlayer().getStatisticManager().incrementValue(PlayerStatistic.WOBBLE_SQUABBLE_GAMES_WON, 1); + } else { + // Game tied! + this.getPlayer(0).getPlayer().getStatisticManager().incrementValue(PlayerStatistic.WOBBLE_SQUABBLE_GAMES_WON, 1); + this.getPlayer(1).getPlayer().getStatisticManager().incrementValue(PlayerStatistic.WOBBLE_SQUABBLE_GAMES_WON, 1); + } + + if (this.getPlayer(0).getScore() > 0) { + this.getPlayer(0).getPlayer().getStatisticManager().incrementValue(PlayerStatistic.WOBBLE_SQUABBLE_MONTHLY_SCORES, this.getPlayer(0).getScore()); + this.getPlayer(0).getPlayer().getStatisticManager().incrementValue(PlayerStatistic.WOBBLE_SQUABBLE_POINTS_ALL_TIME, this.getPlayer(0).getScore()); + } + + if (this.getPlayer(1).getScore() > 0) { + this.getPlayer(1).getPlayer().getStatisticManager().incrementValue(PlayerStatistic.WOBBLE_SQUABBLE_MONTHLY_SCORES, this.getPlayer(1).getScore()); + this.getPlayer(1).getPlayer().getStatisticManager().incrementValue(PlayerStatistic.WOBBLE_SQUABBLE_POINTS_ALL_TIME, this.getPlayer(1).getScore()); + } + } + + // Send end game + this.send(new PT_WIN(winner)); + + // Do updates after the players have fallen + GameScheduler.getInstance().getService().schedule(()-> { + this.send(new PT_END()); + + // If it's a tie then remove both + if (winner == -1) { + this.removePlayer(0, true); + this.removePlayer(1, true); + } else { + //GameManager.getInstance().giveRandomCredits(getPlayer(winner).getPlayer(), true); + //GameManager.getInstance().giveRandomCredits(getPlayer(loser).getPlayer(), false); + + this.removePlayer(winner, false); + this.removePlayer(loser, true); + } + + // Cancel wobble squabble task + this.room.getTaskManager().cancelTask(WobbleSquabbleManager.getInstance().getName()); + + // Make users walk forward + this.moveQueuedUsers(); + + }, 1500, TimeUnit.MILLISECONDS); + /*this.send(new PT_END()); + + // If it's a tie then remove both + if (winner == -1) { + this.removePlayer(0); + this.removePlayer(1); + } else { + this.removePlayer(loser); + }*/ + + } + + /** + * Move users on the queue forward. + */ + private void moveQueuedUsers() { + for (Player player : this.room.getEntityManager().getPlayers()) { + Item item = player.getRoomUser().getCurrentItem(); + + if (item != null) { + if (item.getDefinition().getInteractionType() != InteractionType.WS_QUEUE_TILE) { + continue; + } + + Position front = player.getRoomUser().getPosition().getSquareInFront(); + player.getRoomUser().walkTo(front.getX(), front.getY()); + } + } + } + + /** + * Removes the player from the game. + * + * @param playerNum the player id + */ + public void removePlayer(int playerNum, boolean isThrown) { + WobbleSquabblePlayer wsPlayer = this.getPlayer(playerNum); + + if (wsPlayer == null) { + return; + } + + Player player = wsPlayer.getPlayer(); + player.getRoomUser().setWalkingAllowed(true); + + CurrencyDao.decreaseTickets(player.getDetails(), 1); + player.send(new TICKET_BALANCE(player.getDetails().getTickets())); + + if (isThrown) { + player.getRoomUser().setStatus(StatusType.SWIM, ""); + + int newX = player.getRoomUser().getPosition().getX() + ((wsPlayer.getBalance() < 0 ? -1 : 1)); + int newY = player.getRoomUser().getPosition().getY(); + + Position position = new Position(newX, newY); + position.setRotation(player.getRoomUser().getPosition().getRotation()); + + player.getRoomUser().warp(position, true, false); + } + } + + /** + * Gets the room that wobble squabble is running in. + * + * @return the room + */ + public Room getRoom() { + return room; + } + + /** + * Get the player, 1 or 0 is allowed only. + * + * @return the player, by integer position. + */ + public WobbleSquabblePlayer getPlayer(int num) { + for (WobbleSquabblePlayer wsPlayer : List.of(this.firstPlayer, this.secondPlayer)) { + if (wsPlayer.getOrder() == num) { + return wsPlayer; + } + } + + return null; + } + + /** + * Gets a wobble squabble player by id. + * + * @param id to the user id to get by + * @return the player instance if found + */ + public WobbleSquabblePlayer getPlayerById(int id) { + for (int i = 0; i < 2; i++) { + WobbleSquabblePlayer wsPlayer = this.getPlayer(i); + + if (wsPlayer.getPlayer().getDetails().getId() == id) { + return wsPlayer; + } + } + + return null; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/wobblesquabble/WobbleSquabbleManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/wobblesquabble/WobbleSquabbleManager.java new file mode 100644 index 0000000..9c96aa7 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/wobblesquabble/WobbleSquabbleManager.java @@ -0,0 +1,80 @@ +package org.alexdev.havana.game.games.wobblesquabble; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; + +public class WobbleSquabbleManager { + private static WobbleSquabbleManager instance; + + public static int WS_GAME_TICKET_COST = 1; + public static int WS_BALANCE_POINTS = 35; + public static int WS_HIT_POINTS = 13; + public static int WS_HIT_BALANCE_POINTS = 10; + public static int WS_GAME_TIMEOUT_SECS = 60; + + /** + * Returns true or false if the user is in a game of wobble squabble. + * + * @param player the player to check + * @return true, if they are + */ + public boolean isPlaying(Player player) { + Room room = player.getRoomUser().getRoom(); + + if (room == null) { + return false; + } + + if (!room.getTaskManager().hasTask(this.getName())) { + return false; + } + + WobbleSquabbleGame wsGame = (WobbleSquabbleGame) room.getTaskManager().getTask(this.getName()); + + WobbleSquabblePlayer wsPlayer = wsGame.getPlayerById(player.getDetails().getId()); + return wsPlayer != null; + } + + /** + * Gets the wobble squabble player instance + * + * @param player the player to get for + * @return the ws player instance, if found + */ + public WobbleSquabblePlayer getPlayer(Player player) { + Room room = player.getRoomUser().getRoom(); + + if (room == null) { + return null; + } + + if (!room.getTaskManager().hasTask(this.getName())) { + return null; + } + + WobbleSquabbleGame wsGame = (WobbleSquabbleGame) room.getTaskManager().getTask(this.getName()); + return wsGame.getPlayerById(player.getDetails().getId()); + } + + /** + * Get the static instance of the wobble squabble manager. + * + * @return the static instance + */ + public static WobbleSquabbleManager getInstance() { + if (instance == null) { + instance = new WobbleSquabbleManager(); + } + + return instance; + } + + /** + * Gets the name of the wobble squabble game task. + * + * @return the game task + */ + public String getName() { + return "WobbleGameTask"; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/wobblesquabble/WobbleSquabbleMove.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/wobblesquabble/WobbleSquabbleMove.java new file mode 100644 index 0000000..2e678f6 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/wobblesquabble/WobbleSquabbleMove.java @@ -0,0 +1,54 @@ +package org.alexdev.havana.game.games.wobblesquabble; + +public enum WobbleSquabbleMove { + BALANCE_LEFT(1, "A"), + BALANCE_RIGHT(2, "D"), + HIT_LEFT(3, "W"), + HIT_RIGHT(4, "E"), + WALK_FORWARD(5, "X"), + WALK_BACKWARD(6, "S"), + REBALANCE(7, "0"), + NONE(0, "-"); + + private int id; + private String letter; + + WobbleSquabbleMove(int id, String letter) { + this.id = id; + this.letter = letter; + } + + /** + * Get the wobble squabble move enum. + * + * @param id the id of the move + * @return the enum + */ + public static WobbleSquabbleMove getMove(int id) { + for (WobbleSquabbleMove move : values()) { + if (move.getId() == id) { + return move; + } + } + + return null; + } + + /** + * Get the id of the move. + * + * @return the id + */ + public int getId() { + return id; + } + + /** + * Get the letter of the move. + * + * @return the letter + */ + public String getLetter() { + return letter; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/wobblesquabble/WobbleSquabblePlayer.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/wobblesquabble/WobbleSquabblePlayer.java new file mode 100644 index 0000000..5fd5efe --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/wobblesquabble/WobbleSquabblePlayer.java @@ -0,0 +1,196 @@ +package org.alexdev.havana.game.games.wobblesquabble; + +import org.alexdev.havana.game.player.Player; + +public class WobbleSquabblePlayer { + private Player player; + private WobbleSquabbleGame wsGame; + private int position; + private int balance; + private boolean rebalanced; + private boolean hit; + private boolean requiresUpdate; + private WobbleSquabbleMove move; + private int order; + + public WobbleSquabblePlayer(WobbleSquabbleGame wsGame, Player player, int order) { + this.player = player; + this.wsGame = wsGame; + this.move = WobbleSquabbleMove.NONE; + this.order = order; + this.balance = 0; + } + + /** + * Get if the player is balancing correctly. + * + * @return true, if successful + */ + public boolean isBalancing() { + return (this.balance > -100 && this.balance < 100); + } + + public int getScore() { + if (this.isBalancing()) { + if (balance > 0 || balance == 0) + return 100 - balance; + else + return 100 + balance; + } else { + return 0; + } + } + + /** + * Reset the actions of the user. + */ + public void resetActions() { + this.move = WobbleSquabbleMove.NONE; + this.requiresUpdate = false; + this.hit = false; + } + + /** + * Get the current position of the player. + * + * @return the position + */ + public int getPosition() { + return position; + } + + /** + * Set the current position of the player. + * + * @param position the position + */ + public void setPosition(int position) { + this.position = position; + } + + /** + * Get the current balance of the player. + * + * @return the current balance + */ + public int getBalance() { + return balance; + } + + /** + * Set the balance of the player. + * + * @param balance the balance + */ + public void setBalance(int balance) { + this.balance = balance; + } + + /** + * Get whether they've used rebalance. + * + * @return true, if successful + */ + public boolean isRebalanced() { + return rebalanced; + } + + /** + * Set wehther if they've used rebalance. + * + * @param rebalanced true, if successful + */ + public void setRebalanced(boolean rebalanced) { + this.rebalanced = rebalanced; + } + + /** + * Get whether the player has been hit. + * + * @return true, if successful + */ + public boolean isHit() { + return hit; + } + + /** + * Set whether the player has been hit. + * + * @param hit true, if successful + */ + public void setHit(boolean hit) { + this.hit = hit; + } + + /** + * Get whether the wobble squabble player requires an update. + * + * @return true, if successful + */ + public boolean isRequiresUpdate() { + return requiresUpdate; + } + + /** + * Set whether the wobble squabble player requires an update. + * + * @param requiresUpdate true, if successful + */ + public void setRequiresUpdate(boolean requiresUpdate) { + this.requiresUpdate = requiresUpdate; + } + + /** + * Get the current move the player. + * + * @return the move + */ + public WobbleSquabbleMove getMove() { + return move; + } + + /** + * Set the current move the player. + * + * @param move the move + */ + public void setMove(WobbleSquabbleMove move) { + this.move = move; + } + + /** + * Get the wobble squabble game instance. + * + * @return the game instance + */ + public WobbleSquabbleGame getGame() { + return wsGame; + } + + /** + * Gets the player instance of the wobble squabble player. + * + * @return the player instance + */ + public Player getPlayer() { + return player; + } + + /** + * Get the order of the player, 1 or 0. + * + * @return the order + */ + public int getOrder() { + return order; + } + + /** + * Sets the order of the game player. + * + * @param order the order + */ + public void setOrder(int order) { + this.order = order; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/wobblesquabble/WobbleSquabbleStatus.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/wobblesquabble/WobbleSquabbleStatus.java new file mode 100644 index 0000000..d214523 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/wobblesquabble/WobbleSquabbleStatus.java @@ -0,0 +1,78 @@ +package org.alexdev.havana.game.games.wobblesquabble; + +public class WobbleSquabbleStatus { + private int position; + private int balance; + private WobbleSquabbleMove move; + private boolean hit; + + public WobbleSquabbleStatus(int position, int balance, WobbleSquabbleMove move, boolean isHit) { + this.position = position; + this.balance = balance; + this.move = move; + this.hit = isHit; + } + + /** + * Get the current position of the player. + * + * @return the position + */ + public int getPosition() { + return position; + } + + /** + * Set the current position of the player. + * + * @param position the position + */ + public void setPosition(int position) { + this.position = position; + } + + /** + * Get the current balance of the player. + * + * @return the current balance + */ + public int getBalance() { + return balance; + } + + /** + * Set the balance of the player. + * + * @param balance the balance + */ + public void setBalance(int balance) { + this.balance = balance; + } + + /** + * Get the current move the player. + * + * @return the move + */ + public WobbleSquabbleMove getMove() { + return move; + } + + /** + * Get whether the player has been hit. + * + * @return true, if successful + */ + public boolean isHit() { + return hit; + } + + /** + * Set whether the player has been hit. + * + * @param hit true, if successful + */ + public void setHit(boolean hit) { + this.hit = hit; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/groups/Group.java b/Havana-Server/src/main/java/org/alexdev/havana/game/groups/Group.java new file mode 100644 index 0000000..0fe7346 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/groups/Group.java @@ -0,0 +1,271 @@ +package org.alexdev.havana.game.groups; + +import org.alexdev.havana.dao.mysql.GroupDao; +import org.alexdev.havana.dao.mysql.GroupMemberDao; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.game.wordfilter.WordfilterManager; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.config.GameConfiguration; + +import java.util.List; + +public class Group { + private int id; + private String name; + private String description; + private int ownerId; + private int roomId; + private String badge; + private boolean recommended; + private String background; + private int views; + private int topics; + private int groupType; + private GroupForumType forumType; + private GroupPermissionType forumPermission; + private String alias; + private long createdDate; + private List members; + private List pendingMembers; + + public Group(int id, String name, String description, int ownerId, int roomId, String badge, boolean recommended, String background, int views, int topics, int groupType, int forumType, int forumPermission, String alias, long createdDate) { + this.id = id; + this.name = WordfilterManager.filterSentence(name); + this.description = WordfilterManager.filterSentence(description); + this.ownerId = ownerId; + this.roomId = roomId; + this.badge = badge; + this.recommended = recommended; + this.background = background; + this.views = views; + this.topics = topics; + this.groupType = groupType; + this.forumType = GroupForumType.getById(forumType); + this.forumPermission = GroupPermissionType.getById(forumPermission); + this.alias = alias == null ? "" : alias; + this.createdDate = createdDate; + } + + public static boolean hasTopicAdmin(PlayerRank rank) { + return rank.getRankId() >= 5; + } + + public boolean hasAdministrator(int userId) { + var groupMember = getMember(userId); + return groupMember != null && (groupMember.getMemberRank() == GroupMemberRank.ADMINISTRATOR || groupMember.getMemberRank() == GroupMemberRank.OWNER); + } + + public boolean canViewForum(GroupMember groupMember) { + if (this.forumType == GroupForumType.PUBLIC) { + return true; + } + + return groupMember != null; + } + + public boolean canReplyForum(GroupMember groupMember) { + if (this.forumType == GroupForumType.PUBLIC) { + return true; + } + + return groupMember != null; + } + + public boolean canForumPost(GroupMember groupMember) { + if (this.forumPermission == GroupPermissionType.EVERYONE) { + return true; + } + + if (groupMember != null) { + if (this.forumPermission == GroupPermissionType.ADMIN_ONLY) { + return groupMember.getMemberRank() == GroupMemberRank.OWNER || groupMember.getMemberRank() == GroupMemberRank.ADMINISTRATOR; + } + + if (this.forumPermission == GroupPermissionType.MEMBER_ONLY) { + return true; + } + } + + return false; + } + + public GroupMember getMember(int userId) { + if (this.ownerId == userId) { + return new GroupMember(this.ownerId, this.id, false, 3); + } + + var member = GroupMemberDao.getMember(this.id, userId); + + if (member == null || member.isPending()) { + return null; + } + + return member; + } + + public GroupMember getPendingMember(int userId) { + if (this.ownerId == userId) { + return new GroupMember(this.ownerId, this.id, false, 3); + } + + var member = GroupMemberDao.getMember(this.id, userId); + + if (member.isPending()) { + return member; + } else { + return null; + } + } + + public boolean isMember(int userId) { + if (this.ownerId == userId) { + return true; + } + + var member = GroupMemberDao.getMember(this.id, userId); + return member != null && !member.isPending(); + } + + public boolean isPendingMember(int userId) { + if (this.ownerId == userId) { + return false; + } + + var member = GroupMemberDao.getMember(this.id, userId); + return member != null && member.isPending(); + } + + public String generateClickLink() { + String sitePath = GameConfiguration.getInstance().getString("site.path"); + + if (this.alias != null && !this.alias.isBlank()) { + return sitePath + "/groups/" + this.alias; + } else { + return sitePath + "/groups/" + this.id + "/id"; + } + } + + public String getCreatedDate() {//May 5, 2019 + return DateUtil.getDate(this.createdDate, "MMM dd, YYYY"); + } + + public int getId() { + return id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public int getOwnerId() { + return ownerId; + } + + public int getRoomId() { + return roomId; + } + + public void setRoomId(int roomId) { + this.roomId = roomId; + } + + public String getBadge() { + return badge.replaceAll("[^a-zA-Z0-9]", ""); + } + + public void setBadge(String badge) { + this.badge = badge; + } + + public boolean isRecommended() { + return recommended; + } + + public void setRecommended(boolean recommended) { + this.recommended = recommended; + } + + public String getBackground() { + return background; + } + + public void setBackground(String background) { + this.background = background; + } + + public int getViews() { + return views; + } + + public void setViews(int views) { + this.views = views; + } + + public int getTopics() { + return topics; + } + + public void setTopics(int topics) { + this.topics = topics; + } + + public int getGroupType() { + return groupType; + } + + public void setGroupType(int groupType) { + this.groupType = groupType; + } + + public GroupForumType getForumType() { + return forumType; + } + + public void setForumType(GroupForumType forumType) { + this.forumType = forumType; + } + + public GroupPermissionType getForumPermission() { + return forumPermission; + } + + public void setForumPermission(GroupPermissionType forumPermission) { + this.forumPermission = forumPermission; + } + + public String getAlias() { + return alias; + } + + public void setAlias(String alias) { + this.alias = alias; + } + + public void save() { + GroupDao.saveGroup(this); + } + + public void saveBackground() { + GroupDao.saveBackground(this); + } + + public void saveBadge() { + GroupDao.saveBadge(this); + } + + public int getMemberCount(boolean isPending) { + return GroupMemberDao.countMembers(this.id, isPending); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/groups/GroupForumType.java b/Havana-Server/src/main/java/org/alexdev/havana/game/groups/GroupForumType.java new file mode 100644 index 0000000..3008730 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/groups/GroupForumType.java @@ -0,0 +1,26 @@ +package org.alexdev.havana.game.groups; + +public enum GroupForumType { + PUBLIC(0), + PRIVATE(1); + + private final int id; + + GroupForumType(int id) { + this.id = id; + } + + public int getId() { + return id; + } + + public static GroupForumType getById(int id) { + for (var forumType : values()) { + if (forumType.getId() == id) { + return forumType; + } + } + + return null; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/groups/GroupMember.java b/Havana-Server/src/main/java/org/alexdev/havana/game/groups/GroupMember.java new file mode 100644 index 0000000..3b45d47 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/groups/GroupMember.java @@ -0,0 +1,44 @@ +package org.alexdev.havana.game.groups; + +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.PlayerManager; + +public class GroupMember { + private int userId; + private int groupId; + private boolean isPending; + private GroupMemberRank memberRank; + private PlayerDetails playerData; + + public GroupMember(int userId, int groupId, boolean isPending, int memberRank) { + this.userId = userId; + this.groupId = groupId; + this.isPending = isPending; + this.memberRank = GroupMemberRank.getByRankId(memberRank); + this.playerData = PlayerManager.getInstance().getPlayerData(this.userId); + } + + public int getUserId() { + return userId; + } + + public PlayerDetails getUser() { + return playerData; + } + + public int getGroupId() { + return groupId; + } + + public boolean isPending() { + return isPending; + } + + public boolean isFavourite(int groupId) { + return this.playerData.getFavouriteGroupId() == groupId; + } + + public GroupMemberRank getMemberRank() { + return memberRank; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/groups/GroupMemberRank.java b/Havana-Server/src/main/java/org/alexdev/havana/game/groups/GroupMemberRank.java new file mode 100644 index 0000000..a004a63 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/groups/GroupMemberRank.java @@ -0,0 +1,33 @@ +package org.alexdev.havana.game.groups; + +public enum GroupMemberRank { + MEMBER(1, 3), + ADMINISTRATOR(2, 2), + OWNER(3, 1); + + private final int rankId; + private final int clientRank; + + GroupMemberRank(int rankId, int clientRank) { + this.rankId = rankId; + this.clientRank = clientRank; + } + + public static GroupMemberRank getByRankId(int rankId) { + for (var rank : values()) { + if (rank.getRankId() == rankId) { + return rank; + } + } + + return null; + } + + public int getRankId() { + return rankId; + } + + public int getClientRank() { + return clientRank; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/groups/GroupPermissionType.java b/Havana-Server/src/main/java/org/alexdev/havana/game/groups/GroupPermissionType.java new file mode 100644 index 0000000..ac20914 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/groups/GroupPermissionType.java @@ -0,0 +1,27 @@ +package org.alexdev.havana.game.groups; + +public enum GroupPermissionType { + ADMIN_ONLY(2), + MEMBER_ONLY(1), + EVERYONE(0); + + private final int id; + + GroupPermissionType(int id) { + this.id = id; + } + + public int getId() { + return id; + } + + public static GroupPermissionType getById(int id) { + for (var forumType : values()) { + if (forumType.getId() == id) { + return forumType; + } + } + + return null; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/guides/GuideInviteTask.java b/Havana-Server/src/main/java/org/alexdev/havana/game/guides/GuideInviteTask.java new file mode 100644 index 0000000..b5028a2 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/guides/GuideInviteTask.java @@ -0,0 +1,47 @@ +package org.alexdev.havana.game.guides; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.messages.outgoing.tutorial.GUIDE_FOUND; +import org.alexdev.havana.messages.outgoing.tutorial.INVITING_COMPLETED; +import org.alexdev.havana.util.DateUtil; + +import java.util.List; + +public class GuideInviteTask implements Runnable { + @Override + public void run() { + List waitingForGuides = GuideManager.getInstance().getAvaliableBeginners(); + + for (Player beginner : waitingForGuides) { + beginner.getGuideManager().getInvited().removeIf(userId -> PlayerManager.getInstance().getPlayerById(userId) == null); + + for (Player guide : GuideManager.getInstance().getGuidesAvailable()) { + if (!guide.getGuideManager().isWaitingForInvitations()) { + continue; + } + + if (guide.getGuideManager().hasInvite(beginner.getDetails().getId())) { + continue; + } + + if (beginner.getGuideManager().hasInvited(guide.getDetails().getId())) { + continue; + } + + beginner.send(new GUIDE_FOUND(guide.getDetails().getId())); + + guide.getGuideManager().addInvite(beginner.getDetails().getId(), beginner.getDetails().getName()); + beginner.getGuideManager().addInvited(guide.getDetails().getId()); + } + + if (beginner.getGuideManager().getInvited().isEmpty()) { + if (DateUtil.getCurrentTimeSeconds() > beginner.getGuideManager().getStartedForWaitingGuidesTime()) { + beginner.getGuideManager().setWaitingForGuide(false); + beginner.getGuideManager().setStartedForWaitingGuidesTime(0); + beginner.send(new INVITING_COMPLETED(INVITING_COMPLETED.InvitationResult.FAILURE)); + } + } + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/guides/GuideManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/guides/GuideManager.java new file mode 100644 index 0000000..99c253b --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/guides/GuideManager.java @@ -0,0 +1,253 @@ +package org.alexdev.havana.game.guides; + +import org.alexdev.havana.dao.mysql.AlertsDao; +import org.alexdev.havana.dao.mysql.MessengerDao; +import org.alexdev.havana.dao.mysql.PlayerStatisticsDao; +import org.alexdev.havana.game.GameScheduler; +import org.alexdev.havana.game.achievements.AchievementManager; +import org.alexdev.havana.game.achievements.AchievementType; +import org.alexdev.havana.game.alerts.AlertType; +import org.alexdev.havana.game.messenger.MessengerUser; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.player.statistics.PlayerStatistic; +import org.alexdev.havana.messages.outgoing.tutorial.INVITING_COMPLETED; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.config.GameConfiguration; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; + +public class GuideManager { + public static int MAX_SIMULTANEOUS_GUIDING = 10; + private static GuideManager instance; + private final GuideInviteTask guideTask; + + public GuideManager() { + this.guideTask = new GuideInviteTask(); + GameScheduler.getInstance().getService().scheduleAtFixedRate(this.guideTask, 0, 10, TimeUnit.SECONDS); + } + + /** + * Get if guides is disabled. + * + * @return true, if successful + */ + public boolean isDisabled() { + if (!GameConfiguration.getInstance().getBoolean("tutorial.enabled")) { + return true; + } + + int guideGroupId = GameConfiguration.getInstance().getInteger("guides.group.id"); + + if (guideGroupId < 1) { + return true; + } + + return false; + } + + /** + * Get if the user is a guide or not. + * + * @param player the player to check + * @return true, if successful + */ + public boolean isGuide(Player player) { + int guideGroupId = GameConfiguration.getInstance().getInteger("guides.group.id"); + + if (guideGroupId < 1) { + return false; + } + + var guideGroup = player.getJoinedGroup(guideGroupId); + + if (guideGroup == null) { + return false; + } + + int daysSinceJoined = (int) Math.floor(TimeUnit.SECONDS.toDays((long) (DateUtil.getCurrentTimeSeconds() - Math.floor(player.getDetails().getJoinDate())))); + + if (!(daysSinceJoined >= 30)) { + return false; + } + + return guideGroup.isMember(player.getDetails().getId()); + } + + /** + * Called when the tutor enters the room. + * + * @param guide the guide + * @param newb the new player + */ + public void tutorEnterRoom(Player guide, Player newb) { + if (newb.getStatisticManager().getIntValue(PlayerStatistic.GUIDED_BY) > 0) { + return; + } + + //guide.getGuideManager().setHasBubble(true); + + /*newb.getRoomUser().getRoom().send(new MessageComposer() { + @Override + public void compose(NettyResponse response) { + response.writeInt(newb.getRoomUser().getRoom().getId()); + } + + @Override + public short getHeader() { + return 424; + } + });*/ + + newb.send(new INVITING_COMPLETED(INVITING_COMPLETED.InvitationResult.SUCCESS)); + newb.getMessenger().addFriend(new MessengerUser(guide.getDetails())); + newb.getGuideManager().setGuidable(false); + + newb.getStatisticManager().setLongValue(PlayerStatistic.GUIDED_BY, guide.getDetails().getId()); + newb.getStatisticManager().setLongValue(PlayerStatistic.HAS_TUTORIAL, 0); + + guide.getGuideManager().refreshGuidingUsers(); + } + + /** + * Try progress guide task upon login. + * + * @param player the player to check + */ + public void tryProgress(Player player) { + /*if (player.getGuideManager().isGuide()) { + for (var user : player.getGuideManager().getGuiding()) { + if (!player.getMessenger().hasFriend(user.getUserId())) { + PlayerStatisticsDao.updateStatistic(user.getUserId(), PlayerStatistic.GUIDED_BY, "0"); + } + } + } else { + */ + var statisticsManager = player.getStatisticManager(); + int guideId = statisticsManager.getIntValue(PlayerStatistic.GUIDED_BY); + + if (guideId <= 0) { + return; + } + + long onlineTime = TimeUnit.SECONDS.toMinutes(statisticsManager.getLongValue(PlayerStatistic.ONLINE_TIME)); + long timeRequired = GameConfiguration.getInstance().getLong("guide.completion.minutes"); + boolean hasMetOnlineRequirement = onlineTime >= timeRequired; + + if (!hasMetOnlineRequirement) { + if (!MessengerDao.friendExists(player.getDetails().getId(), guideId)/*player.getMessenger().hasFriend(guideId)*/) { + statisticsManager.setLongValue(PlayerStatistic.GUIDED_BY, 0); + statisticsManager.setLongValue(PlayerStatistic.HAS_TUTORIAL, 1); + statisticsManager.setLongValue(PlayerStatistic.IS_GUIDABLE, 1); + } + } else { + statisticsManager.setLongValue(PlayerStatistic.GUIDED_BY, 0); + statisticsManager.setLongValue(PlayerStatistic.HAS_TUTORIAL, 0); + statisticsManager.setLongValue(PlayerStatistic.IS_GUIDABLE, 0); + + PlayerStatisticsDao.incrementStatistic(guideId, PlayerStatistic.PLAYERS_GUIDED, 1); + int totalGuided = (int) PlayerStatisticsDao.getStatisticLong(guideId, PlayerStatistic.PLAYERS_GUIDED); + + AlertsDao.createAlert(guideId, AlertType.TUTOR_SCORE, "You have just completed guiding another new player! You have now guided a total of " + totalGuided + " players."); + AchievementManager.getInstance().tryProgress(AchievementType.ACHIEVEMENT_STUDENT, player); + } + //} + } + + public void checkGuidingFriends(Player player) { + if (player.getGuideManager().isGuide()) { + for (var user : player.getGuideManager().getGuiding()) { + if (!player.getMessenger().hasFriend(user.getUserId())) { + PlayerStatisticsDao.updateStatistic(user.getUserId(), PlayerStatistic.GUIDED_BY, "0"); + } + } + } + } + + /** + * Try and clear tutorial after user doesn't want to do the tutoral nor guides. + * + * @param player the player + */ + public void tryClearTutorial(Player player) { + player.getGuideManager().setHasTutorial(false); + player.getGuideManager().setCanUseTutorial(false); + player.getGuideManager().setCancelTutorial(false); + player.getStatisticManager().setLongValue(PlayerStatistic.HAS_TUTORIAL, 0); + + if (player.getGuideManager().isGuidable()) { + player.getGuideManager().setGuidable(false); + } + } + + /** + * Get the list of guides available. + * + * @return the list of guides + */ + public List getGuidesAvailable() { + List guides = new ArrayList<>(); + + for (Player player : PlayerManager.getInstance().getPlayers()) { + if (!player.getGuideManager().isGuide()) { + continue; + } + + if (player.getGuideManager().getGuiding().size() >= MAX_SIMULTANEOUS_GUIDING) { + continue; + } + + guides.add(player); + } + + return guides; + } + + /** + * Get a list of people waiting for a guide. + * + * @return the list of players + */ + public List getAvaliableBeginners() { + List guides = new ArrayList<>(); + + for (Player player : PlayerManager.getInstance().getPlayers()) { + if (player.getGuideManager().isGuide()) { + continue; + } + + if (!player.getGuideManager().isGuidable()) { + continue; + } + + if (!player.getGuideManager().isWaitingForGuide()) { + continue; + } + + if (player.getRoomUser().getRoom() == null || + player.getRoomUser().getRoom().isPublicRoom() || + !player.getRoomUser().getRoom().isOwner(player.getDetails().getId())) { + continue; + } + + guides.add(player); + } + + return guides; + } + + /** + * Gets the instance + * + * @return the instance + */ + public static GuideManager getInstance() { + if (instance == null) { + instance = new GuideManager(); + } + + return instance; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/infobus/InfobusManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/infobus/InfobusManager.java new file mode 100644 index 0000000..7e847c5 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/infobus/InfobusManager.java @@ -0,0 +1,183 @@ +package org.alexdev.havana.game.infobus; + +import org.alexdev.havana.dao.mysql.InfobusDao; +import org.alexdev.havana.game.GameScheduler; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.RoomManager; +import org.alexdev.havana.log.Log; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; +import org.alexdev.havana.messages.outgoing.infobus.BUS_DOOR; +import org.alexdev.havana.messages.outgoing.infobus.CANNOT_ENTER_BUS; +import org.alexdev.havana.messages.outgoing.infobus.POLL_QUESTION; +import org.alexdev.havana.messages.outgoing.infobus.VOTE_RESULTS; +import org.alexdev.havana.util.schedule.FutureRunnable; + +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; + +public class InfobusManager { + private static InfobusManager instance; + private boolean canUpdateResults; + private boolean isDoorOpen; + private boolean isEventActive; + private InfobusPoll currentPoll; + + public InfobusManager() { + } + + public void stopEvent() { + var room = RoomManager.getInstance().getRoomByModel("park_b"); + + if (room != null) { + for (Player player : room.getEntityManager().getPlayers()) { + var composer = new CANNOT_ENTER_BUS("The Infobus event has now ended. Please check the site for updates in future."); + + player.send(composer); + player.getRoomUser().getPacketQueueAfterRoomLeave().add(composer); + + player.getRoomUser().kick(false, true); + player.getRoomUser().setBeingKicked(false); + } + } + + this.updateDoorStatus(false); + this.currentPoll = null; + } + + public void updateDoorStatus(boolean doorStatus) { + this.isDoorOpen = doorStatus; + + var park = RoomManager.getInstance().getRoomByModel("park_a"); + + if (park != null) { ; + park.send(new BUS_DOOR(this.isDoorOpen)); + } + } + + /** + * Initiate polling to collect poll data. + */ + public void startPolling(int pollId) { + this.canUpdateResults = false; + this.currentPoll = InfobusDao.get(pollId); + + if (currentPoll == null) { + return; + } + + var room = RoomManager.getInstance().getRoomByModel("park_b"); + + if (room == null) { + return; + } + + for (Player player : room.getEntityManager().getPlayers()) { + //if (player.getNetwork().isFlashConnected()) { + // player.send(new ALERT("Polling has started, unfortunately, flash clients can't vote as it is unsupported by the client.")); + // continue; + //} + + if (!InfobusDao.hasAnswer(currentPoll.getId(), player.getDetails().getId())) { + player.send(new POLL_QUESTION(currentPoll.getPollData().getQuestion(), currentPoll.getPollData().getAnswers())); + } + + } + + // Polling timer + /*this.pollRunnable = new FutureRunnable() { + public void run() { + try { + if (!getDoorStatus() || (currentPoll != null && currentPoll.getPollData().getAnswers().isEmpty())) { + cancelFuture(); + return; + } + + if (pollSeconds.getAndDecrement() == 0) { + canUpdateResults = true; + showPollResults(); + cancelFuture(); + } + + } catch (Exception ex) { + Log.getErrorLogger().error("Error occurred in polling: ", ex); + } + } + }; + + var future = GameScheduler.getInstance().getService().scheduleAtFixedRate(this.pollRunnable, 0, 1, TimeUnit.SECONDS); + this.pollRunnable.setFuture(future);*/ + + GameScheduler.getInstance().getService().schedule(() -> { + try { + showPollResults(currentPoll.getId()); + } catch (Exception ex) { + Log.getErrorLogger().error("Error occurred in polling: ", ex); + } + }, 30, TimeUnit.SECONDS); + } + + public void showPollResults(int pollId) { + var currentPoll = InfobusDao.get(pollId); + + if (currentPoll == null) { + return; + } + + this.canUpdateResults = true; + + var room = RoomManager.getInstance().getRoomByModel("park_b"); + + if (room != null) { + var answerResults = InfobusDao.getAnswers(currentPoll.getId()); + int totalAnswers = answerResults.values().stream().mapToInt(Integer::intValue).sum(); + + room.send(new VOTE_RESULTS(currentPoll.getPollData().getQuestion(), currentPoll.getPollData().getAnswers(), answerResults, totalAnswers)); + } + } + + public boolean isDoorOpen() { + return isDoorOpen; + } + + public void setDoorOpen(boolean doorOpen) { + isDoorOpen = doorOpen; + } + + public boolean isEventActive() { + return isEventActive; + } + + public void setEventActive(boolean eventActive) { + isEventActive = eventActive; + } + + public InfobusPoll getCurrentPoll() { + return currentPoll; + } + + /** + * Get the infobus manager instance. + * + * @return the infobus manager + */ + public static InfobusManager getInstance() { + if (instance == null) { + instance = new InfobusManager(); + } + + return instance; + } + + public boolean canUpdateResults() { + return canUpdateResults; + } + + public int getDoorX() { + return 28; + } + + public int getDoorY() { + return 4; + } + +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/infobus/InfobusPoll.java b/Havana-Server/src/main/java/org/alexdev/havana/game/infobus/InfobusPoll.java new file mode 100644 index 0000000..3acfa7a --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/infobus/InfobusPoll.java @@ -0,0 +1,42 @@ +package org.alexdev.havana.game.infobus; + +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.util.DateUtil; + +public class InfobusPoll { + private int id; + private int initiatedBy; + private InfobusPollData infobusPollData; + private long createdAt; + + public InfobusPoll(int id, int initiatedBy, InfobusPollData infobusPollData, long createdAt) { + this.id = id; + this.initiatedBy = initiatedBy; + this.infobusPollData = infobusPollData; + this.createdAt = createdAt; + } + + public int getId() { + return id; + } + + public int getInitiatedBy() { + return initiatedBy; + } + + public String getCreator() { + return PlayerDao.getName(this.initiatedBy); + } + + public InfobusPollData getPollData() { + return infobusPollData; + } + + public long getCreatedAt() { + return createdAt; + } + + public String getCreatedAtFormatted() { + return DateUtil.getDate(createdAt, DateUtil.LONG_DATE); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/infobus/InfobusPollData.java b/Havana-Server/src/main/java/org/alexdev/havana/game/infobus/InfobusPollData.java new file mode 100644 index 0000000..68e013e --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/infobus/InfobusPollData.java @@ -0,0 +1,22 @@ +package org.alexdev.havana.game.infobus; + +import java.util.ArrayList; +import java.util.List; + +public class InfobusPollData { + private String question; + private List answers; + + public InfobusPollData(String question) { + this.question = question; + this.answers = new ArrayList<>(); + } + + public String getQuestion() { + return question; + } + + public List getAnswers() { + return answers; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/inventory/Inventory.java b/Havana-Server/src/main/java/org/alexdev/havana/game/inventory/Inventory.java new file mode 100644 index 0000000..8f8b7ac --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/inventory/Inventory.java @@ -0,0 +1,307 @@ +package org.alexdev.havana.game.inventory; + +import org.alexdev.havana.dao.mysql.ItemDao; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.inventory.INVENTORY; +import org.alexdev.havana.server.netty.streams.NettyResponse; +import org.alexdev.havana.util.StringUtil; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArrayList; + +public class Inventory { + private static final int MAX_ITEMS_PER_PAGE = 9; + + private int currentPage = 0; + private Player player; + + private List items; + private List displayedItems; + private Map> paginatedItems; + + private int handStripPageIndex; + + public Inventory(Player player) { + this.player = player; + this.reload(); + } + + /** + * Reload inventory. + */ + public void reload() { + this.handStripPageIndex = 0; + this.items = ItemDao.getInventory(this.player.getDetails().getId()); + + if (this.player.getRoomUser().getRoom() != null) { + this.items.removeIf(x -> this.player.getRoomUser().getRoom().getItems().stream().anyMatch(item -> x.getDatabaseId() == item.getDatabaseId())); + } + + this.refreshPagination(); + + for (var item : this.items) { + item.assignVirtualId(); + } + } + + /** + * Refreshes the pagination by making the most recently bought items appear first. + */ + private void refreshPagination() { + this.displayedItems = new CopyOnWriteArrayList<>(); + int orderId = 0; + + for (Item item : this.items) { + // Don't show items if they are hidden + if (!item.isVisible()) { + continue; + } + + // Don't show items if they are currently in trade window + if (this.player.getRoomUser().getTradePartner() != null) { + if (this.player.getRoomUser().getTradeItems().contains(item)) { + continue; + } + } + + if (orderId != item.getOrderId()) { + item.setOrderId(orderId); + item.save(); + } + + orderId++; + this.displayedItems.add(item); + } + + this.displayedItems.sort(Comparator.comparingInt(Item::getOrderId)); + this.paginatedItems = new ConcurrentHashMap<>(StringUtil.paginate(this.displayedItems, MAX_ITEMS_PER_PAGE)); + } + + /** + * Get the view of the inventory. + * + * @param stripView the view type + */ + public void getView(String stripView) { + this.refreshPagination(); + //this.paginatedItems = StringUtil.paginate(this.items, MAX_ITEMS_PER_PAGE); + this.changeView(stripView); + + Map casts = this.getCasts(); + this.player.send(new INVENTORY(this, casts)); + + } + + /** + * Get the inventory casts for opening hand. + */ + private Map getCasts() { + LinkedHashMap casts = new LinkedHashMap<>(); + + if (this.paginatedItems.containsKey(this.handStripPageIndex)) { + int stripSlotId = this.handStripPageIndex * MAX_ITEMS_PER_PAGE; + + for (Item item : this.paginatedItems.get(this.handStripPageIndex)) { + addItemCast(casts, stripSlotId++, item); + } + } + + return casts; + } + + /** + * Add item casts. + */ + private void addItemCast(LinkedHashMap casts, int slotId, Item item) { + /*if (this.player.getRoomUser().getRoom() != null) { + var room = this.player.getRoomUser().getRoom(); + var roomItem = room.getItemManager().getByDatabaseId(item.getDatabaseId()); + + // DO NOT add item into inventory if it's already in the room. + if (roomItem != null) { + System.out.println("Duplicate item."); + return; + } + }*/ + + casts.put(slotId, item); + + } + + /** + * Change the inventory view over. + * + * @param stripView the strip view to change + */ + private void changeView(String stripView) { + if (stripView.equals("new")) { + this.handStripPageIndex = 0; + } + + if (stripView.equals("next")) { + this.handStripPageIndex++; + } + + if (stripView.equals("prev")) { + this.handStripPageIndex--; + } + + if (stripView.equals("last")) { + this.handStripPageIndex = this.paginatedItems.size() - 1; + } + + if (stripView.equals("current")) { + if (this.handStripPageIndex > this.paginatedItems.size() - 1) { + this.handStripPageIndex = this.paginatedItems.size() - 1; + } + } + + if (!this.paginatedItems.containsKey(this.handStripPageIndex)) { + this.handStripPageIndex = 0; + } + } + + /** + * Serialise item in hand. + * + * @param response the response to write the item to + * @param item the item to use the data for the packet + * @param stripSlotId the slot in the hand + */ + public void serialise(NettyResponse response, Item item, int stripSlotId) { + response.writeInt(item.getVirtualId()); + response.writeInt(stripSlotId); + + if (item.hasBehaviour(ItemBehaviour.WALL_ITEM)) { + response.writeString("I"); + } else { + response.writeString("S"); + } + + response.writeInt(item.getVirtualId()); + response.writeInt(item.getDefinition().getSpriteId()); + + switch (item.getDefinition().getSprite()) { + case "landscape": + response.writeInt(4); + break; + case "wallpaper": + response.writeInt(2); + break; + case "floor": + response.writeInt(3); + break; + case "poster": + response.writeInt(6); + break; + default: + response.writeInt(1); + break; + } + + response.writeString((item.hasBehaviour(ItemBehaviour.PRESENT) || item.hasBehaviour(ItemBehaviour.ECO_BOX)) ? "" : item.getCustomData()); + response.writeBool(item.getDefinition().isRecyclable()); // recylecable + response.writeBool(item.getDefinition().isTradable()); // tradeable + response.writeBool(true); // groupable + + //response.writeBool(false); // Marketplace can sell + response.writeInt(-1); + + if (!item.hasBehaviour(ItemBehaviour.WALL_ITEM)) { + response.writeString(""); + response.writeInt(-1); + } + } + + /** + * Get inventory item by id. + * + * @param itemId the id used to get the inventory item + * @return the inventory item + */ + public Item getItem(int itemId) { + for (Item item : this.items) { + if (item.getVirtualId() == itemId) { + return item; + } + } + + return null; + } + + /** + * Get inventory item by id. + * + * @param itemId the id used to get the inventory item + * @return the inventory item + */ + public Item getItemByDatabaseId(long itemId) { + for (Item item : this.items) { + if (item.getDatabaseId() == itemId) { + return item; + } + } + + return null; + } + + /** + * Get all soundset track IDs within the inventory. + * + * @return the list of soundsets + */ + public List getSoundsets() { + List handSoundsets = new ArrayList<>(); + + for (Item item : player.getInventory().getItems()) { + if (!item.isVisible()) { + continue; + } + + if (item.hasBehaviour(ItemBehaviour.SOUND_MACHINE_SAMPLE_SET)) { + handSoundsets.add(Integer.parseInt(item.getDefinition().getSprite().split("_")[2])); + } + } + + return handSoundsets; + } + + /** + * Add the item to the start of items list. + * + * @param item the item + */ + public void addItem(Item item) { + this.items.remove(item); + this.items.add(0, item); + } + + /** + * Get the list of inventory items. + * + * @return the list of items + */ + public List getItems() { + return items; + } + + /** + * Get the items that the user can see in their hand (non-hidden items). + * + * @return the list of displayed items + */ + public List getDisplayedItems() { + return displayedItems; + } + + public int getCurrentPage() { + return currentPage; + } + + public void setCurrentPage(int currentPage) { + this.currentPage = currentPage; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/Item.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/Item.java new file mode 100644 index 0000000..c4b435d --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/Item.java @@ -0,0 +1,860 @@ +package org.alexdev.havana.game.item; + +import org.alexdev.havana.dao.mysql.ItemDao; +import org.alexdev.havana.dao.mysql.PhotoDao; +import org.alexdev.havana.game.GameScheduler; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.item.base.ItemDefinition; +import org.alexdev.havana.game.item.extradata.ExtraDataManager; +import org.alexdev.havana.game.item.extradata.types.TrophyExtraData; +import org.alexdev.havana.game.item.interactors.InteractionType; +import org.alexdev.havana.game.item.interactors.types.TeleportInteractor; +import org.alexdev.havana.game.item.roller.RollingData; +import org.alexdev.havana.game.pathfinder.AffectedTile; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.RoomManager; +import org.alexdev.havana.game.room.mapping.RoomTile; +import org.alexdev.havana.game.room.mapping.RoomTileState; +import org.alexdev.havana.messages.outgoing.rooms.items.SHOWPROGRAM; +import org.alexdev.havana.messages.outgoing.rooms.items.STUFFDATAUPDATE; +import org.alexdev.havana.server.netty.streams.NettyResponse; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.StringUtil; +import org.alexdev.havana.util.config.GameConfiguration; +import org.apache.commons.lang.StringUtils; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.regex.Pattern; + +public class Item { + public static final String DEFAULT_ROOMDIMMER_CUSTOM_DATA = "1,1,1,#000000,255"; + public static final String PRESENT_DELIMETER = "|"; + + private int id; + private long databaseId; + private int orderId; + private int ownerId; + private int roomId; + + private ItemDefinition definition; + private int definitionId; + + private Position position; + private String wallPosition; + private String customData; + private String currentProgram; + private String currentProgramValue; + + private boolean requiresUpdate; + private boolean isCurrentRollBlocked; + private RollingData rollingData; + private boolean isHidden; + private boolean isInTrade; + private long expireTime; + private long createdAt; + private long lastPlacedTime; + private boolean isDeleted; + private String trophyData; + private Room temporaryRoom; + private Position teleportTo; + private Position swimTo; + + public Item() { + this.id = 0; + this.definition = new ItemDefinition(); + this.position = new Position(); + this.customData = ""; + this.wallPosition = ""; + this.currentProgram = ""; + this.currentProgramValue = ""; + this.requiresUpdate = false; + this.rollingData = null; + this.expireTime = -1; + this.createdAt = DateUtil.getCurrentTimeSeconds(); + this.temporaryRoom = null; + } + + public void fill(long id, int orderId, int ownerId, int roomId, int definitionId, int X, int Y, double Z, int rotation, String wallPosition, String customData, boolean isHidden, boolean isInTrade, long expireTime, long createdAt) { + this.databaseId = id; + this.orderId = orderId; + this.ownerId = ownerId; + this.roomId = roomId; + this.definition = null; + this.definitionId = definitionId; + this.position = new Position(X, Y, Z, rotation, rotation); + this.wallPosition = wallPosition; + this.customData = customData; + this.rollingData = null; + this.isHidden = isHidden; + this.isInTrade = isInTrade; + this.setDefinitionId(this.definitionId); + this.expireTime = expireTime; + this.createdAt = createdAt; + + //performPhotoDateCheck(); + } + + /** + * Temporary method to fix camera so it shows / instead of - in camera photo. + */ + private void performPhotoDateCheck() { + if (!this.getDefinition().hasBehaviour(ItemBehaviour.PHOTO)) { + return; + } + + if (!this.customData.contains(Character.toString((char) 13))) { + return; + } + + String[] parts = this.customData.split(Character.toString((char) 13)); + String photoMessage = this.customData.substring(parts[0].length() + 1); + try { + if (parts[0].contains("-")) { + Photo photo = PhotoDao.getPhoto(this.databaseId); + this.customData = DateUtil.getDate(photo.getTime(), DateUtil.CAMERA_DATE) + (char)13 + photoMessage; + ItemDao.updateItem(this); + } + } catch (SQLException e) { + e.printStackTrace(); + } + } + + /** + * Broadcast item program to current room, used for the pool lift, booth, pool ladders, etc + * for special effects like splashing, closing/open curtains, etc. + * + * @param value the new program value to show + */ + public void showProgram(String value) { + if (value != null) { + this.currentProgramValue = value; + } + + Room room = this.getRoom(); + + if (room != null) { + if (StringUtil.isNullOrEmpty(this.currentProgramValue)) { + room.send(new SHOWPROGRAM(new String[]{this.currentProgram })); + } else { + room.send(new SHOWPROGRAM(new String[]{this.currentProgram, this.currentProgramValue})); + } + } + } + + /** + * Update user statuses on items with their old position and new position. + * The old position is never null if the item is moved. + * + * @param oldPosition the old position of the item + */ + public void updateEntities(Position oldPosition) { + if (this.hasBehaviour(ItemBehaviour.WALL_ITEM)) { + return; + } + + if (this.getRoom() == null) { + return; + } + + List entitiesToUpdate = new ArrayList<>(); + + if (oldPosition != null) { + for (Position position : AffectedTile.getAffectedTiles(this, oldPosition.getX(), oldPosition.getY(), oldPosition.getRotation())) { + RoomTile tile = this.getRoom().getMapping().getTile(position); + + if (tile == null) { + continue; + } + + entitiesToUpdate.addAll(tile.getEntireEntities()); + } + } + + for (Position position : AffectedTile.getAffectedTiles(this)) { + RoomTile tile = this.getRoom().getMapping().getTile(position); + + if (tile == null) { + continue; + } + + /*var entities = tile.getEntities(); + + for (Entity entity : entities) { + var currentItem = entity.getRoomUser().getCurrentItem(); + + if (currentItem != null) { + RoomTile tile1 = this.getRoom().getMapping().getTile(entity.getRoomUser().getPosition()); + + if (tile1.getHighestItem() != currentItem) { + if (currentItem.getDefinition().getInteractionType().getTrigger() != null) { + currentItem.getDefinition().getInteractionType().getTrigger().onEntityStop(entity, entity.getRoomUser(), currentItem); + } + } + } + }*/ + + entitiesToUpdate.addAll(tile.getEntireEntities()); + } + + for (Entity entity : entitiesToUpdate) { + entity.getRoomUser().invokeItem(oldPosition, true); + } + } + + /** + * Get the total height, which is the height of the item plus stack size. + * + * @return the total height + */ + public double getTotalHeight() { + double z = 0; + + if (this.getDefinition().getTopHeight() < 0) { + z = this.position.getZ() + ItemDefinition.DEFAULT_TOP_HEIGHT; + } else { + if (this.getDefinition().getInteractionType() == InteractionType.MULTI_HEIGHT) { + int currentState = (this.customData.length() > 0 && StringUtils.isNumeric(this.customData)) ? Integer.parseInt(this.customData) : 0; + + if (this.getDefinition().getHeights().isEmpty()) { + z += this.getDefinition().getTopHeight(); + } else{ + if (currentState + 1> this.getDefinition().getHeights().size()) { + currentState = 0; + this.customData = "0"; + } + + z += this.getDefinition().getHeights().get(currentState) + this.getDefinition().getTopHeight(); + } + + + } else { + z = this.getDefinition().getTopHeight(); + } + } + + + return this.position.getZ() + z; + } + + /** + * Get whether or not the item is walkable. + * + * @return true, if successful. + */ + public boolean isWalkable(Entity entity, Position selectedPosition) { + if (entity == null && this.hasBehaviour(ItemBehaviour.CAN_NOT_STACK_ON_TOP)) + return false; + + if (this.getDefinition().getSprite().equals("poolLift")) { + return this.currentProgramValue.equals("open"); + } + + if (this.getDefinition().getSprite().equals("poolBooth")) { + return this.currentProgramValue.equals("open"); + } + + if (this.hasBehaviour(ItemBehaviour.CAN_SIT_ON_TOP)) { + return true; + } + + if (this.hasBehaviour(ItemBehaviour.CAN_LAY_ON_TOP)) { + return true; + } + + if (this.hasBehaviour(ItemBehaviour.CAN_STAND_ON_TOP)) { + return true; + } + + if (this.hasBehaviour(ItemBehaviour.TELEPORTER)) { + return this.customData.equals(TeleportInteractor.TELEPORTER_OPEN) || this.hasBehaviour(ItemBehaviour.DOOR_TELEPORTER); + } + + if (this.hasBehaviour(ItemBehaviour.GATE) || this.hasBehaviour(ItemBehaviour.ONE_WAY_GATE)) { + return this.isGateOpen(); + } + + if (this.hasBehaviour(ItemBehaviour.SOLID_SINGLE_TILE)) { + return !(this.position.equals(selectedPosition)); + } + + return false; + } + + public boolean isGateOpen() { + if (this.hasBehaviour(ItemBehaviour.GATE) || this.hasBehaviour(ItemBehaviour.ONE_WAY_GATE)) { + return this.customData.equals("1"); + } + + return false; + } + + /** + * Send status update of the item. + */ + public void updateStatus() { + Room room = this.getRoom(); + + if (room != null) { + room.send(new STUFFDATAUPDATE(this)); + } + } + + /** + * Queue item saving. + */ + public void save() { + GameScheduler.getInstance().queueSaveItem(this); + } + + /** + * Queue item deletion. + */ + public void delete() { + this.isDeleted = true; + GameScheduler.getInstance().queueDeleteItem(this.getDatabaseId()); + } + + /** + * Serialise item function for item handling packets. + * + * @param response the response to serialise to + */ + public void serialise(NettyResponse response) { + ItemDefinition definition = this.getDefinition(); + + if (definition.hasBehaviour(ItemBehaviour.PUBLIC_SPACE_OBJECT)) { + boolean hasDimensions = this.hasBehaviour(ItemBehaviour.EXTRA_PARAMETER); + + response.writeInt(hasDimensions ? 1 : 0); + response.writeString(this.customData); + response.writeString(definition.getSprite()); + response.writeInt(this.position.getX()); + response.writeInt(this.position.getY()); + response.writeInt((int) this.position.getZ()); + + if (!hasDimensions) { + response.writeInt(this.position.getRotation()); + } else { + response.writeInt(this.getDefinition().getLength()); + response.writeInt(this.getDefinition().getWidth()); + } + } else { + if (this.hasBehaviour(ItemBehaviour.WALL_ITEM)) { + response.writeString(this.id); + response.writeInt(definition.getSpriteId()); + response.writeString(this.wallPosition); + + if (this.hasBehaviour(ItemBehaviour.POST_IT)) { + response.writeString(this.customData.substring(0, 6)); // Only show post-it colour + } else { + response.writeString(this.customData); + } + } else { + response.writeInt(this.id); + response.writeInt(definition.getSpriteId()); + response.writeInt(this.position.getX()); + response.writeInt(this.position.getY()); + response.writeInt(this.position.getRotation()); + response.writeString(StringUtil.format(this.position.getZ())); + response.writeInt(this.hasBehaviour(ItemBehaviour.ROLLER) ? 2 : 0); // Required 2 for rollers to enable animation when rollers are used! + + if (this.hasBehaviour(ItemBehaviour.PRESENT)) { + String[] presentData = this.customData.split(Pattern.quote(Item.PRESENT_DELIMETER)); + response.writeString("!" + presentData[2]); + } else if (this.hasBehaviour(ItemBehaviour.ECO_BOX)) { + response.writeString(DateUtil.getDate(this.createdAt, "dd-MM-yyyy")); + } else if (this.hasBehaviour(ItemBehaviour.REDEEMABLE)) { + response.writeString(definition.getSprite().split("_")[1]); + } else if (this.hasBehaviour(ItemBehaviour.PRIZE_TROPHY)) { + if (this.trophyData == null) { + TrophyExtraData trophyExtraData = null; + + try { + trophyExtraData = ExtraDataManager.getJsonData(this, TrophyExtraData.class); + } catch (Exception ex) { + + } + + if (trophyExtraData == null) + trophyExtraData = new TrophyExtraData(1, "", 0); + + var playerData = PlayerManager.getInstance().getPlayerData(trophyExtraData.getUserId()); + + if (playerData == null) { + playerData = new PlayerDetails(); + playerData.fill(1, "null", "", "", "M"); + } + + this.trophyData = ""; + this.trophyData += playerData.getName(); + this.trophyData += (char) 9; + this.trophyData += DateUtil.getDate(trophyExtraData.getDate(), DateUtil.SHORT_DATE); + this.trophyData += (char) 9; + this.trophyData += StringUtil.filterInput(trophyExtraData.getMessage(), true); + } + + response.writeString(trophyData); + } else { + response.writeString(this.customData); + } + + response.writeInt(this.expireTime > -1 ? (int) TimeUnit.SECONDS.toMinutes(this.expireTime - DateUtil.getCurrentTimeSeconds()) : -1); + + if (definition.getSpriteId() < 0) { + response.writeString(definition.getSprite()); + } + } + } + } + + /** + * Check if the move is valid before moving an item. Will prevent long + * furniture from being on top of rollers, will prevent placing rollers on top of other rollers. + * Will prevent items being placed on closed tile states. + * + * @param room the room to check inside + * @param x the new x to check + * @param y the new y to check + * @param rotation the new rotation to check + * @return true, if successful + */ + public boolean isValidMove(Item item, Room room, int x, int y, int rotation) { + RoomTile tile = room.getMapping().getTile(x, y); + + if (tile == null) { + return false; + } + + boolean isRotation = (item.getPosition().getRotation() != rotation) && (new Position(x, y).equals(item.getPosition()) + || (item.getRollingData() != null && new Position(x, y).equals(item.getRollingData().getNextPosition())) + || (item.getRollingData() != null && new Position(x, y).equals(item.getRollingData().getFromPosition()))); + + if (isRotation) { + if (item.getRollingData() != null) { + return false; // Don't allow rotating items when they're rolling + } + + if (item.getDefinition().getLength() <= 1 && item.getDefinition().getWidth() <= 1) { + return true; + } + } + + for (Position position : AffectedTile.getAffectedTiles(this, x, y, rotation)) { + tile = room.getMapping().getTile(position); + + if (tile == null) { + return false; + } + + if (room.getModel().getTileState(position.getX(), position.getY()) == RoomTileState.CLOSED) { + return false; + } + + if ((tile.getWalkingHeight() + item.getDefinition().getPositiveTopHeight()) > GameConfiguration.getInstance().getInteger("stack.height.limit")) { + return false; + } + + if (!isRotation/* && !this.hasBehaviour(ItemBehaviour.CAN_SIT_ON_TOP) && !this.hasBehaviour(ItemBehaviour.CAN_LAY_ON_TOP)*/) + { + if (tile.getEntireEntities().size() > 0) + return false; + } + + Item highestItem = tile.getHighestItem(); + + if (highestItem != null && highestItem.getVirtualId() != item.getVirtualId()) { + if (!this.canPlaceOnTop(item, highestItem, new Position(x, y))) { + return false; + } + } + + for (Item tileItem : tile.getItems()) { + if (tileItem.getVirtualId() == item.getVirtualId()) { + continue; + } + + if (!this.canPlaceOnTop(item, tileItem, new Position(x, y))) { + return false; + } + + if (tileItem.hasBehaviour(ItemBehaviour.ROLLER)) { + if (this.hasBehaviour(ItemBehaviour.ROLLER)) { + return false; // Can't place rollers on top of rollers + } + + if ((this.getDefinition().getLength() > 1 || this.getDefinition().getWidth() > 1) && (/*this.hasBehaviour(ItemBehaviour.CAN_SIT_ON_TOP) || */this.hasBehaviour(ItemBehaviour.CAN_LAY_ON_TOP))) { + return false; // Chair or bed is too big to place on rollers. + } + } + } + } + + + return true; + } + + /** + * Get if placing an item on top of another item is allowed. + * @param item the item to place + * @param tileItem the item to check if they're allowed to place on top of + * @return true, if successful + */ + private boolean canPlaceOnTop(Item item, Item tileItem, Position targetTile) { + if (tileItem.hasBehaviour(ItemBehaviour.CAN_NOT_STACK_ON_TOP)) { + return false; + } + + // Don't allow putting rollers on top of stackable objects + if (item.hasBehaviour(ItemBehaviour.ROLLER) && tileItem.hasBehaviour(ItemBehaviour.CAN_STACK_ON_TOP) && !tileItem.hasBehaviour(ItemBehaviour.PLACE_ROLLER_ON_TOP)) { + if (tileItem.getDefinition().getTopHeight() >= 0.1) { + return false; + } + } + + // If the item is rolling, we can place on the square + if (tileItem.rollingData != null) { + return true; + } + + // Can't place items on solid objects + if ((tileItem.hasBehaviour(ItemBehaviour.SOLID) || tileItem.hasBehaviour(ItemBehaviour.SOLID_SINGLE_TILE)) && !tileItem.hasBehaviour(ItemBehaviour.CAN_STACK_ON_TOP)) { + return false; + } + + // Can't place items on objects where if only the first tile is solid and the item is placed on the furni BUT NOT placed on the solid tile + if (tileItem.hasBehaviour(ItemBehaviour.SOLID_SINGLE_TILE) && tileItem.hasBehaviour(ItemBehaviour.CAN_STACK_ON_TOP)) { + return tileItem.getPosition().equals(targetTile); + } + + if (tileItem.hasBehaviour(ItemBehaviour.ONE_WAY_GATE)) { + return false; + } + + // Can't place gates on solid rollers + /*if (tileItem.hasBehaviour(ItemBehaviour.ROLLER) && (item.hasBehaviour(ItemBehaviour.GATE) || this.hasBehaviour(ItemBehaviour.ONE_WAY_GATE))) { + return false; + }*/ + + // Can't place items on sittable items + if (tileItem.hasBehaviour(ItemBehaviour.CAN_SIT_ON_TOP)) { + return false; + } + + // Can't place item on layable items + if (tileItem.hasBehaviour(ItemBehaviour.CAN_LAY_ON_TOP)) { + return false; + } + + return true; + } + + /** + * Get the room tile this item is on. + * + * @return the room tile, else null + */ + public RoomTile getTile() { + Room room = this.getRoom(); + + if (room != null) { + return this.getRoom().getMapping().getTile(this.position); + } + + return null; + } + + /** + * Get if the item has a type of behaviour. + * + * @param behaviour the behaviour to check + * @return true, if successful + */ + public boolean hasBehaviour(ItemBehaviour behaviour) { + return this.getDefinition().hasBehaviour(behaviour); + } + + /** + * Gets the definition instance, if there's a instance attached, it will return that instead. + * + * @return the definition + */ + public ItemDefinition getDefinition() { + if (this.definition != null) { // Used for public room items + return this.definition; + } + + // Always use ItemManager to retrieve private flat definitions + return ItemManager.getInstance().getDefinition(this.definitionId); + } + + /** + * Sets the definition id used by the database and removes the instance. + * + * @param definitionId the definition id + */ + public void setDefinitionId(int definitionId) { + this.definition = null; + this.definitionId = definitionId; + } + + /** + * Get the virtual id of the item. + * + * @return the virtual id + */ + public int getVirtualId() { + return id; + } + + /** + * Sets the virtual id. + */ + public void assignVirtualId() { + this.id = ItemManager.getInstance().getVirtualIdCounter().incrementAndGet(); + //System.out.println("Assigned virtual id " + this.id + " to item with db id " + this.databaseId); + } + + /** + * Sets the virtual id to a specific number + */ + public void setVirtualId(int id) { + this.id = id; + } + + /** + * Get the owner of this item. + * + * @return the owner + */ + public int getOwnerId() { + return ownerId; + } + + /** + * Set the owner id of this item. + * + * @param ownerId the owner id + */ + public void setOwnerId(int ownerId) { + this.ownerId = ownerId; + } + + /** + * Get the item position. + * + * @return the item position + */ + public Position getPosition() { + return position; + } + + public void setPosition(Position position) { + this.position = position; + } + + public String getWallPosition() { + return wallPosition; + } + + public void setWallPosition(String wallPosition) { + this.wallPosition = wallPosition; + } + + public String getCurrentProgram() { + return currentProgram; + } + + public void setCurrentProgram(String currentProgram) { + this.currentProgram = currentProgram; + } + + public String getCustomData() { + return customData; + } + + public void setCustomData(String customData) { + this.customData = customData; + } + + public String getCurrentProgramValue() { + return currentProgramValue; + } + + public Room getRoom() { + return RoomManager.getInstance().getRoomById(this.roomId); + } + + public int getRoomId() { + return roomId; + } + + public void setRoomId(int roomId) { + this.roomId = roomId; + } + + public Item getItemBelow() { + var tile = this.getTile(); + + if (tile == null || tile.getItems() == null) { + return null; + } + + var items = tile.getItems(); + int position = items.indexOf(this); + + if (position > -1) { + int nextPosition = position - 1; + + if (nextPosition < 0) { + return null; + } + + return items.get(nextPosition); + + } + + return null; + } + + public Item getItemAbove() { + var tile = this.getTile(); + + if (tile == null || tile.getItems() == null) { + return null; + } + + var items = tile.getItems(); + int position = items.indexOf(this); + + if (position > -1) { + int nextPosition = position + 1; + + if (nextPosition >= tile.getItems().size()) { + return null; + } + + return items.get(nextPosition); + + } + + return null; + } + + public boolean getRequiresUpdate() { + return requiresUpdate; + } + + public void setRequiresUpdate(boolean requiresUpdate) { + this.requiresUpdate = requiresUpdate; + } + + public RollingData getRollingData() { + return rollingData; + } + + public void setRollingData(RollingData rollingData) { + this.rollingData = rollingData; + } + + public int getOrderId() { + return orderId; + } + + public void setOrderId(int orderId) { + this.orderId = orderId; + } + + public long getDatabaseId() { + return databaseId; + } + + public void setDatabaseId(long databaseId) { + this.databaseId = databaseId; + } + + public boolean isHidden() { + return isHidden; + } + + public void setHidden(boolean hidden) { + isHidden = hidden; + } + + public long getExpireTime() { + return expireTime; + } + + public void setExpireTime(long expireTime) { + this.expireTime = expireTime; + } + + public boolean isCurrentRollBlocked() { + return isCurrentRollBlocked; + } + + public void setCurrentRollBlocked(boolean currentRollBlocked) { + isCurrentRollBlocked = currentRollBlocked; + } + + public long getLastPlacedTime() { + return lastPlacedTime; + } + + public void setLastPlacedTime(long lastPlacedTime) { + this.lastPlacedTime = lastPlacedTime; + } + + public boolean isDeleted() { + return isDeleted; + } + + public void setDeleted(boolean deleted) { + isDeleted = deleted; + } + + public Room getTemporaryRoom() { + return temporaryRoom; + } + + public void setTemporaryRoom(Room temporaryRoom) { + this.temporaryRoom = temporaryRoom; + } + + public boolean isInTrade() { + return isInTrade; + } + + public void setInTrade(boolean inTrade) { + isInTrade = inTrade; + } + + public boolean isVisible() { + return !this.isInTrade && !this.isHidden; + } + + public Position getTeleportTo() { + return teleportTo; + } + + public void setTeleportTo(Position teleportTo) { + this.teleportTo = teleportTo; + } + + public Position getSwimTo() { + return swimTo; + } + + public void setSwimTo(Position swimTo) { + this.swimTo = swimTo; + } +} + diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/ItemManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/ItemManager.java new file mode 100644 index 0000000..07c7ce0 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/ItemManager.java @@ -0,0 +1,321 @@ +package org.alexdev.havana.game.item; + +import org.alexdev.havana.dao.mysql.ItemDao; +import org.alexdev.havana.dao.mysql.SongMachineDao; +import org.alexdev.havana.game.GameScheduler; +import org.alexdev.havana.game.catalogue.CatalogueManager; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.item.base.ItemDefinition; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.RoomManager; +import org.alexdev.havana.game.song.Song; +import org.alexdev.havana.log.Log; +import org.alexdev.havana.util.DateUtil; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.regex.Pattern; + +public class ItemManager { + private static ItemManager instance; + private static AtomicInteger virtualIdCounter = new AtomicInteger(0); + + private Map itemDefinitionMap; + + public ItemManager() { + this.itemDefinitionMap = ItemDao.getItemDefinitions(); + } + + /** + * Get a item definition by the definition id. + * + * @param definitionId the definition id to get for + * @return the item definition + */ + public ItemDefinition getDefinition(int definitionId) { + if (this.itemDefinitionMap.containsKey(definitionId)) { + return this.itemDefinitionMap.get(definitionId); + } + + return null; + } + + /** + * Quick and easy method for creating gifts. + * + * @param saleCode the sprite to give + * @return the item as gift + */ + public Item createGift(int ownerId, String receivedFrom, String saleCode, String presentLabel, String extraData) { + int presentId = ThreadLocalRandom.current().nextInt(0, 7); + String sprite = "present_gen"; + + if (presentId > 0) { + sprite += presentId; + } + + ItemDefinition itemDef = ItemManager.getInstance().getDefinitionBySprite(sprite); + + Item item = new Item(); + item.setDefinitionId(itemDef.getId()); + item.setOwnerId(ownerId); + item.setCustomData(CatalogueManager.getInstance().getCatalogueItem(saleCode).getId() + + Item.PRESENT_DELIMETER + receivedFrom + + Item.PRESENT_DELIMETER + presentLabel.replace(Item.PRESENT_DELIMETER, "") + //From Habbo" + + Item.PRESENT_DELIMETER + extraData.replace(Item.PRESENT_DELIMETER, "") + + Item.PRESENT_DELIMETER + DateUtil.getCurrentTimeSeconds()); + + try { + ItemDao.newItem(item); + } catch (SQLException e) { + e.printStackTrace(); + } + + + return item; + } + + /** + * Get the saved jukebox tracks. + * + * @param itemId the jukebox item id + * @return the list of saved tracks + */ + public List getJukeboxTracks(long itemId) { + List savedTracks = new ArrayList<>(); + + for (var kvp : SongMachineDao.getTracks(itemId).entrySet()) { + int slotId = kvp.getKey(); + int songId = kvp.getValue(); + + Song song = SongMachineDao.getSong(songId); + song.setSlotId(slotId); + + savedTracks.add(song); + } + + return savedTracks; + } + + /** + * Checks for any expired rentals and removes them. + */ + public void checkExpiredRentals() { + for (Item rental : ItemDao.getExpiredItems()) { + Item item = this.resolveItem(rental); + + if (item != null) { + // Item is currently loaded in room, remove it! + if (item.getRoom() != null) { + item.getRoom().getMapping().removeItem(PlayerManager.getInstance().getPlayerById(item.getOwnerId()), item); + } else { + // Item is in players' hands, remove it! + Player itemOwner = PlayerManager.getInstance().getPlayerById(item.getOwnerId()); + + if (itemOwner != null) { + itemOwner.getInventory().getItems().removeIf(i -> i.getDatabaseId() == item.getDatabaseId()); + } + } + } + + GameScheduler.getInstance().queueDeleteItem(rental.getDatabaseId()); + } + } + + /** + * Get a item definition by sprite name. + * + * @param spriteName the name of the sprite to locate the definition + * @return the item definition + */ + public ItemDefinition getDefinitionBySprite(String spriteName) { + for (ItemDefinition definition : this.itemDefinitionMap.values()) { + if (definition.getSprite().equals(spriteName)) { + return definition; + } + } + + return null; + } + + /** + * Handle bulk item saving. + * + * @param itemSavingQueue the queue that's used for saving items + */ + public void performItemSaving(BlockingQueue itemSavingQueue) { + try { + if (itemSavingQueue.isEmpty()) { + return; + } + + List itemList = new ArrayList<>(); + itemSavingQueue.drainTo(itemList); + + if (itemList.size() > 0) { + ItemDao.updateItems(itemList); + } + } catch (Exception ex) { + Log.getErrorLogger().error("Error when attempting to save items: ", ex); + } + } + + /** + * Handle bulk item deletion. + * + * @param itemDeletionQueue the queue that's used for deleting items + */ + public void performItemDeletion(BlockingQueue itemDeletionQueue) { + try { + if (itemDeletionQueue.isEmpty()) { + return; + } + + List itemList = new ArrayList<>(); + itemDeletionQueue.drainTo(itemList); + + if (itemList.size() > 0) { + ItemDao.deleteItems(itemList); + } + } catch (Exception ex) { + Log.getErrorLogger().error("Error when attempting to save items: ", ex); + } + } + + /** + * Get the {@link ItemManager} instance + * + * @return the item manager instance + */ + public static ItemManager getInstance() { + if (instance == null) { + instance = new ItemManager(); + } + + return instance; + } + + /** + * Resets the item manager singleton. + */ + public static void reset() { + instance = null; + ItemManager.getInstance(); + } + + /** + * Get the virtual ID counter for handling more than the 32-bit integer limit of items + * + * @return the item counter + */ + public AtomicInteger getVirtualIdCounter() { + return virtualIdCounter; + } + + /** + * Resolve the active room item by database id. + * + * @param itemId the room item + * @return the instance of the item, if found + */ + public Item resolveItem(long itemId) { + Item databaseItem = ItemDao.getItem(itemId); + + if (databaseItem == null) { + return null; + } + + return this.resolveItem(databaseItem); + } + + /** + * Resolve the active room item by database instance + * + * @param databaseItem the database item instance + * @return the instance of the item, if found + */ + public Item resolveItem(Item databaseItem) { + if (RoomManager.getInstance().getRoomById(databaseItem.getRoomId()) != null) { + Room room = databaseItem.getRoom(); + + if (room != null) { + return room.getItemManager().getByDatabaseId(databaseItem.getDatabaseId()); + } + } else { + Player itemOwner = PlayerManager.getInstance().getPlayerById(databaseItem.getOwnerId()); + + if (itemOwner != null) { + return itemOwner.getInventory().getItemByDatabaseId(databaseItem.getDatabaseId()); + } + } + + return null; + } + + /** + * Get if the present inside has the same behaviour. + * + * @param item the present + * @param behaviour the behaviour to check + * @return true, if successful + */ + public boolean hasPresentBehaviour(Item item, ItemBehaviour behaviour) { + if (item.getDefinition().hasBehaviour(ItemBehaviour.PRESENT)) { + String[] presentData = item.getCustomData().split(Pattern.quote(Item.PRESENT_DELIMETER)); + int catalogueId = Integer.parseInt(presentData[0]); + + var catalogueItem = CatalogueManager.getInstance().getCatalogueItem(catalogueId); + + if (catalogueItem != null && catalogueItem.getDefinition() != null) { + return catalogueItem.getDefinition().hasBehaviour(behaviour); + } + } + + return false; + } + + /** + * Calculate song length of trax data. + * + * @param song the trax data + * @return the length in seconds + */ + public int calculateSongLength(String song) { + try { + String songData = song.substring(0, song.length() - 1); + songData = songData.replace(":4:", "|"); + songData = songData.replace(":3:", "|"); + songData = songData.replace(":2:", "|"); + songData = songData.replace("1:", ""); + + String[] data = songData.split(Pattern.quote("|")); + String[] tracks = new String[]{data[0], data[1], data[2], data[3]}; + + int songLength = 0; + + for (String track : tracks) { + String[] samples = track.split(Pattern.quote(";")); + int trackLength = 0; + + for (String sample : samples) { + int sampleSeconds = Integer.parseInt(sample.split(Pattern.quote(","))[1]) * 2; + trackLength += sampleSeconds; + } + + if (trackLength > songLength) + songLength = trackLength; + } + + return songLength; + } catch (Exception e) { + return 0; + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/ItemVersionManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/ItemVersionManager.java new file mode 100644 index 0000000..44a3417 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/ItemVersionManager.java @@ -0,0 +1,44 @@ +package org.alexdev.havana.game.item; + +import org.alexdev.havana.dao.mysql.ItemDao; + +import java.util.Map; + +public class ItemVersionManager { + private static ItemVersionManager instance; + private Map itemVersions; + + public ItemVersionManager() { + itemVersions = ItemDao.getItemVersions(); + } + + /** + * Get the {@link ItemVersionManager} instance + * + * @return the item manager instance + */ + public static ItemVersionManager getInstance() { + if (instance == null) { + instance = new ItemVersionManager(); + } + + return instance; + } + + /** + * Resets the item manager singleton. + */ + public static void reset() { + instance = null; + ItemVersionManager.getInstance(); + } + + /** + * Get item versions. + * + * @return the item versions + */ + public Map getItemVersions() { + return itemVersions; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/Photo.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/Photo.java new file mode 100644 index 0000000..15d1296 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/Photo.java @@ -0,0 +1,31 @@ +package org.alexdev.havana.game.item; + +public class Photo { + private long databaseId; + private int checksum; + private byte[] data; + private long time; + + public Photo(long id, int checksum, byte[] data, long time) { + this.databaseId = id; + this.checksum = checksum; + this.data = data; + this.time = time; + } + + public long getId() { + return databaseId; + } + + public int getChecksum() { + return checksum; + } + + public byte[] getData() { + return data; + } + + public long getTime() { + return time; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/Transaction.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/Transaction.java new file mode 100644 index 0000000..7ee09b6 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/Transaction.java @@ -0,0 +1,46 @@ +package org.alexdev.havana.game.item; + +import org.alexdev.havana.util.DateUtil; +import org.apache.commons.lang3.StringUtils; + +public class Transaction { + private final String description; + private final int costCoins; + private final int costPixels; + private final int amount; + private final long createdAt; + private final int itemId; + + public Transaction(String[] itemId, String description, int costCoins, int costPixels, int amount, long createdAt) { + this.itemId = itemId.length > 0 ? (StringUtils.isNumeric(itemId[0]) ? Integer.parseInt(itemId[0]) : 0) : 0; + this.description = description; + this.costCoins = costCoins; + this.costPixels = costPixels; + this.amount = amount; + this.createdAt = createdAt; + } + + public int getItemId() { + return itemId; + } + + public String getFormattedDate() { + return DateUtil.getDate(this.createdAt, "yyyy-MM-dd HH:mm a").replace("am", "AM").replace("pm","PM").replace(".", ""); + } + + public String getDescription() { + return description; + } + + public int getCostCoins() { + return costCoins; + } + + public int getCostPixels() { + return costPixels; + } + + public int getAmount() { + return amount; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/base/ItemBehaviour.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/base/ItemBehaviour.java new file mode 100644 index 0000000..3bb9c8f --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/base/ItemBehaviour.java @@ -0,0 +1,52 @@ +package org.alexdev.havana.game.item.base; + +public enum ItemBehaviour { + SOLID, + SOLID_SINGLE_TILE, + CAN_STACK_ON_TOP, + CAN_NOT_STACK_ON_TOP, + CAN_SIT_ON_TOP, + CAN_STAND_ON_TOP, + CAN_LAY_ON_TOP, + CUSTOM_DATA_NUMERIC_ON_OFF, + REQUIRES_TOUCHING_FOR_INTERACTION, + CUSTOM_DATA_TRUE_FALSE, + PUBLIC_SPACE_OBJECT, + EXTRA_PARAMETER, + DICE, + CUSTOM_DATA_ON_OFF, + CUSTOM_DATA_NUMERIC_STATE, + TELEPORTER, + DOOR_TELEPORTER, + REQUIRES_RIGHTS_FOR_INTERACTION, + GATE, + ONE_WAY_GATE, + PRIZE_TROPHY, + ROLLER, + REDEEMABLE, + SOUND_MACHINE, + SOUND_MACHINE_SAMPLE_SET, + JUKEBOX, + WALL_ITEM, + POST_IT, + DECORATION, + WHEEL_OF_FORTUNE, + ROOMDIMMER, + PRESENT, + PHOTO, + PLACE_ROLLER_ON_TOP, + INVISIBLE, + EFFECT, + SONG_DISK, + PRIVATE_FURNITURE, + REDIRECT_ROTATION_0, + REDIRECT_ROTATION_2, + REDIRECT_ROTATION_4, + NO_HEAD_TURN, + ECO_BOX, + PET_WATER_BOWL, + PET_FOOD, + PET_CAT_FOOD, + PET_DOG_FOOD, + PET_CROC_FOOD; +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/base/ItemDefinition.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/base/ItemDefinition.java new file mode 100644 index 0000000..c0e438b --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/base/ItemDefinition.java @@ -0,0 +1,382 @@ +package org.alexdev.havana.game.item.base; + +import org.alexdev.havana.game.item.interactors.InteractionType; +import org.alexdev.havana.game.texts.TextsManager; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class ItemDefinition { + public static final double DEFAULT_TOP_HEIGHT = 0.001; + + + private int id; + private String sprite; + private String name; + private String description; + private int spriteId; + private String behaviourData; + private double topHeight; + private int length; + private int width; + private int maxStatus; + private List behaviourList; + private InteractionType interactionType; + private boolean isTradable; + private boolean isRecyclable; + private int[] drinkIds; + private int rentalTime; + private List allowedRotations; + private List heights; + + public ItemDefinition() { + this.sprite = ""; + this.behaviourData = ""; + this.topHeight = DEFAULT_TOP_HEIGHT; + this.length = 1; + this.width = 1; + this.maxStatus = 0; + this.behaviourList = new ArrayList<>(); + this.interactionType = null; + this.drinkIds = new int[0]; + this.allowedRotations = new ArrayList<>(); + } + + public ItemDefinition(int id, String sprite, String name, String description, int spriteId, String behaviourData, double topHeight, int length, int width, int maxStatus, String interactor, boolean isTradable, boolean isRecyclable, String drinkList, int rentalTime, String allowedRotations, + String heights) { + this.id = id; + this.sprite = sprite; + this.name = name; + this.description = description; + this.spriteId = spriteId; + this.behaviourData = behaviourData; + this.topHeight = topHeight; + this.length = length; + this.width = width; + this.maxStatus = maxStatus; + this.behaviourList = parseBehaviour(this.behaviourData); + this.interactionType = InteractionType.valueOf(interactor.toUpperCase()); + this.isTradable = isTradable; + this.isRecyclable = isRecyclable; + + if (allowedRotations.length() > 0) { + this.allowedRotations = Stream.of(allowedRotations.split(",")) + .map(Integer::parseInt) + .collect(Collectors.toList()); + } else { + this.allowedRotations = new ArrayList<>(); + } + + if (heights != null && heights.length() > 0) { + this.heights = Stream.of(heights.split(",")) + .map(Double::parseDouble) + .collect(Collectors.toList()); + } else { + this.heights = new ArrayList<>(); + } + + if (drinkList != null) { + this.drinkIds = new int[drinkList.split(",").length]; + + if (drinkList.length() > 0) { + int i = 0; + for (String data : drinkList.split(",")) { + this.drinkIds[i++] = Integer.parseInt(data); + } + } + } + + // If the item is a gate (checked below) then the top height is set to 0 so the item can be walked in + /*if (!this.behaviourList.contains(ItemBehaviour.CAN_SIT_ON_TOP) + && !this.behaviourList.contains(ItemBehaviour.CAN_LAY_ON_TOP) + && !this.behaviourList.contains(ItemBehaviour.CAN_STACK_ON_TOP)) { + this.topHeight = 0; + }*/ + + // If the top height 0, then make it 0.001 to make it taller than the default room tile, that the + // furni collision map can be generated. + if (this.topHeight == 0) { + this.topHeight = DEFAULT_TOP_HEIGHT; + } + + this.rentalTime = rentalTime; + } + + /** + * Parse the behaviour list seperated by comma. + * + * @param behaviourData the behaviourData to parse + * @return the behaviour list + */ + private List parseBehaviour(String behaviourData) { + List behaviourList = new ArrayList<>(); + + try { + if (behaviourData.length() > 0) { + for (String behaviourEnum : behaviourData.split(",")) { + behaviourList.add(ItemBehaviour.valueOf(behaviourEnum.toUpperCase())); + } + } + } catch (Exception ex) { + System.out.println("Exception occurred for definition: " + this.id); + ex.printStackTrace(); + } + + return behaviourList; + } + + /** + * Get if the item has a type of behaviour. + * + * @param behaviour the behaviour to check + * @return true, if successful + */ + public boolean hasBehaviour(ItemBehaviour behaviour) { + return this.behaviourList.contains(behaviour); + } + + /** + * Add a behaviour to the list. + * + * @param behaviour the behaviour to add + */ + public void addBehaviour(ItemBehaviour behaviour) { + if (this.behaviourList.contains(behaviour)) { + return; + } + + this.behaviourList.add(behaviour); + } + + /** + * Remove a behaviour from the list. + * + * @param behaviour the behaviour to remove + */ + public void removeBehaviour(ItemBehaviour behaviour) { + this.behaviourList.remove(behaviour); + } + + /** + * Get the item name by creating an external text key and reading external text entries. + * + * @param specialSpriteId the special sprite id + * @return the name + */ + public String getName(int specialSpriteId) { + if (this.hasBehaviour(ItemBehaviour.DECORATION)) { + return this.sprite; + } + + String etxernalTextKey = this.getExternalTextKey(specialSpriteId); + String name = etxernalTextKey + "_name"; + + String value = TextsManager.getInstance().getValue(etxernalTextKey); + + if (value == null) { + return "null"; + } + + return name; + } + + /** + * Get the item description by creating an external text key and reading external text entries. + * + * @param specialSpriteId the special sprite id + * @return the description + */ + public String getDescription(int specialSpriteId) { + if (this.hasBehaviour(ItemBehaviour.CAN_STACK_ON_TOP)) { + return this.sprite; + } + + String etxernalTextKey = this.getExternalTextKey(specialSpriteId); + String name = etxernalTextKey + "_desc"; + + String value = TextsManager.getInstance().getValue(etxernalTextKey); + + if (value == null) { + return "null"; + } + + return name; + } + + /** + * Create the catalogue icon through using the special sprite id. + * + * @param specialSpriteId the special sprite id + * @return the catalogue icon + */ + public String getIcon(int specialSpriteId) { + String icon = ""; + + icon += this.sprite; + + if (specialSpriteId > 0) { + icon += " " + specialSpriteId; + } + + return icon; + } + + /** + * Get external text key by definition. + * + * @param specialSpriteId the special sprite id + * @return the external text key + */ + private String getExternalTextKey(int specialSpriteId) { + String key = ""; + + if (specialSpriteId == 0) { + if (this.hasBehaviour(ItemBehaviour.WALL_ITEM)) { + key = "wallitem"; + } else { + key = "furni"; + } + + key += "_"; + } + + key += this.sprite; + + if (specialSpriteId > 0) { + key += ("_" + specialSpriteId); + } + + return key; + } + + public int getId() { + return id; + } + + public String getSprite() { + return sprite; + } + + public int getColour() { + if (this.sprite.contains("*")) { + return Integer.parseInt(this.sprite.split("\\*")[1]); + } + + return 0; + } + + public String getName() { + return name; + } + + public String getDescription() { + return description; + } + + public void setSprite(String sprite) { + this.sprite = sprite; + } + + public double getTopHeight() { + return topHeight; + } + + public double getPositiveTopHeight() { + if (this.topHeight < 0) { + return DEFAULT_TOP_HEIGHT; + } + + return topHeight; + } + + public int getLength() { + return length; + } + + public int getWidth() { + return width; + } + + public void setTopHeight(double topHeight) { + this.topHeight = topHeight; + } + + public String getBehaviourData() { + return behaviourData; + } + + public void setLength(int length) { + this.length = length; + } + + public void setWidth(int width) { + this.width = width; + } + + public List getBehaviourList() { + return behaviourList; + } + + public int getSpriteId() { + return spriteId; + } + + public void setSpriteId(int spriteId) { + this.spriteId = spriteId; + } + + public int getMaxStatus() { + return maxStatus; + } + + public InteractionType getInteractionType() { + return interactionType; + } + + public void setInteractionType(InteractionType interactionType) { + this.interactionType = interactionType; + } + + public boolean isTradable() { + return isTradable; + } + + public void setTradable(boolean tradable) { + isTradable = tradable; + } + + public boolean isRecyclable() { + return isRecyclable; + } + + public int[] getDrinkIds() { + return drinkIds; + } + + public int getRentalTime() { + return rentalTime; + } + + public int getRentalTimeAsMinutes() { + if (this.rentalTime > 0) { + return (int) TimeUnit.SECONDS.toMinutes(this.rentalTime); + } + + return -1; + } + + public List getAllowedRotations() { + return allowedRotations; + } + + public void setAllowedRotations(List allowedRotations) { + this.allowedRotations = allowedRotations; + } + + public List getHeights() { + return heights; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/extradata/ExtraDataManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/extradata/ExtraDataManager.java new file mode 100644 index 0000000..a321496 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/extradata/ExtraDataManager.java @@ -0,0 +1,68 @@ +package org.alexdev.havana.game.item.extradata; + +import com.google.gson.Gson; +import com.google.gson.JsonSyntaxException; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.log.Log; + +import java.lang.reflect.InvocationTargetException; + +public class ExtraDataManager { + private static final Gson gson = new Gson(); + + /** + * Gets the json data, will try restore to default if there's invalid JSON data. + * + * @param item the item + * @param t the class type + * @return the json data + */ + public static T getJsonData(Item item, Class t) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { + T settings = null; + + if (isValidJSON(item.getCustomData(), t)) { + settings = gson.fromJson(item.getCustomData(), t); + } else { + settings = t.getDeclaredConstructor().newInstance(); + + saveExtraData(item, settings); + item.save(); + } + + return settings; + } + + /** + * Validate the input json + * @param jsonInString the json to parse + */ + public static boolean isValidJSON(String jsonInString, Class obj) { + try { + + gson.fromJson(jsonInString, obj); + return true; + } catch (JsonSyntaxException ex) { + return false; + } + } + + + /** + * Save extra data to JSON format. + * + * @param item the item + * @param src the data to serialise + */ + public static void saveExtraData(Item item, T src) { + item.setCustomData(gson.toJson(src)); + } + + /** + * Get GSON instance. + * + * @return the gson instance + */ + public static Gson getGson() { + return gson; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/extradata/types/TrophyExtraData.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/extradata/types/TrophyExtraData.java new file mode 100644 index 0000000..ae555dd --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/extradata/types/TrophyExtraData.java @@ -0,0 +1,25 @@ +package org.alexdev.havana.game.item.extradata.types; + +public class TrophyExtraData { + private int userId; + private String message; + private long date; + + public TrophyExtraData(int userId, String message, long date) { + this.userId = userId; + this.message = message; + this.date = date; + } + + public int getUserId() { + return userId; + } + + public String getMessage() { + return message; + } + + public long getDate() { + return date; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/InteractionType.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/InteractionType.java new file mode 100644 index 0000000..2e71cc5 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/InteractionType.java @@ -0,0 +1,65 @@ +package org.alexdev.havana.game.item.interactors; + +import org.alexdev.havana.game.games.triggers.BattleShipsTrigger; +import org.alexdev.havana.game.games.triggers.ChessTrigger; +import org.alexdev.havana.game.games.triggers.PokerTrigger; +import org.alexdev.havana.game.games.triggers.TicTacToeTrigger; +import org.alexdev.havana.game.item.interactors.types.*; +import org.alexdev.havana.game.item.interactors.types.idol.IdolChairVoteInteractor; +import org.alexdev.havana.game.item.interactors.types.idol.IdolScoreboardInteractor; +import org.alexdev.havana.game.item.interactors.types.pool.*; +import org.alexdev.havana.game.item.interactors.types.wobblesquabble.WobbleSquabbleJoinQueue; +import org.alexdev.havana.game.item.interactors.types.wobblesquabble.WobbleSquabbleQueueTile; +import org.alexdev.havana.game.item.interactors.types.wobblesquabble.WobbleSquabbleTileStart; +import org.alexdev.havana.game.triggers.GenericTrigger; + +public enum InteractionType { + DEFAULT(new DefaultInteractor()), + BED(new BedInteractor()), + CHAIR(new ChairInteractor()), + TELEPORT(new TeleportInteractor()), + ROOM_HIRE(new TeleportRoomHireInteractor()), + VENDING_MACHINE(new VendingMachineInteractor()), + LERT(new LertInteractor()), + SCOREBOARD(new ScoreboardInteractor()), + FORTUNE(new FortuneInteractor()), + PET_NEST(new PetNestInteractor()), + + POOL_BOOTH(new PoolBoothInteractor()), + POOL_LADDER(new PoolLadderInteractor()), + POOL_EXIT(new PoolExitInteractor()), + POOL_LIFT(new PoolLiftInteractor()), + POOL_QUEUE(new PoolQueueInteractor()), + + GAME_TIC_TAC_TOE(new TicTacToeTrigger()), + GAME_CHESS(new ChessTrigger()), + GAME_BATTLESHIPS(new BattleShipsTrigger()), + GAME_POKER(new PokerTrigger()), + + TOTEM_LEG(new TotemLegTrigger()), + TOTEM_HEAD(new TotemHeadTrigger()), + TOTEM_PLANET(new TotemPlanetTrigger()), + + WS_JOIN_QUEUE(new WobbleSquabbleJoinQueue()), + WS_QUEUE_TILE(new WobbleSquabbleQueueTile()), + WS_TILE_START(new WobbleSquabbleTileStart()), + + IDOL_VOTE_CHAIR(new IdolChairVoteInteractor()), + IDOL_SCOREBOARD(new IdolScoreboardInteractor()), + + STEP_LIGHT(new StepLightInteractor()), + LOVE_RANDOMIZER(new LoveRandomizerInteractor()), + + MULTI_HEIGHT(new MultiHeightInteractor()), + ; + + private final GenericTrigger genericTrigger; + + InteractionType(GenericTrigger genericTrigger) { + this.genericTrigger = genericTrigger; + } + + public GenericTrigger getTrigger() { + return genericTrigger; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/enums/TotemColour.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/enums/TotemColour.java new file mode 100644 index 0000000..5f0baba --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/enums/TotemColour.java @@ -0,0 +1,8 @@ +package org.alexdev.havana.game.item.interactors.enums; + +public enum TotemColour { + NONE, + RED, + YELLOW, + BLUE +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/enums/TotemEffect.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/enums/TotemEffect.java new file mode 100644 index 0000000..e36022c --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/enums/TotemEffect.java @@ -0,0 +1,37 @@ +package org.alexdev.havana.game.item.interactors.enums; + +public enum TotemEffect { + NONE(-1, -1, -1, 0), + FIRE(1, 12, 8, 25), + WAND(2, 9, 8, 26), + RAIN(0, 10, 4, 24), + LEVITATION(2, 5, 0, 23); + + int planet; + int head; + int legs; + int effectId; + + TotemEffect(int planet, int levitation, int legs, int effectId) { + this.planet = planet; + this.head = levitation; + this.legs = legs; + this.effectId = effectId; + } + + public int getPlanet() { + return planet; + } + + public int getHead() { + return head; + } + + public int getLegs() { + return legs; + } + + public int getEffectId() { + return effectId; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/BedInteractor.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/BedInteractor.java new file mode 100644 index 0000000..83668ed --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/BedInteractor.java @@ -0,0 +1,157 @@ +package org.alexdev.havana.game.item.interactors.types; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.interactors.InteractionType; +import org.alexdev.havana.game.pets.Pet; +import org.alexdev.havana.game.pets.PetAction; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.entities.RoomEntity; +import org.alexdev.havana.game.room.tasks.EntityTask; +import org.alexdev.havana.game.triggers.GenericTrigger; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.room.enums.StatusType; +import org.alexdev.havana.game.room.mapping.RoomTile; +import org.alexdev.havana.messages.outgoing.effects.USER_AVATAR_EFFECT; +import org.alexdev.havana.util.StringUtil; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +public class BedInteractor extends GenericTrigger { + @Override + public void onInteract(Player player, Room room, Item item, int status) { + InteractionType.DEFAULT.getTrigger().onInteract(player, room, item, status); + } + + @Override + public void onEntityStop(Entity entity, RoomEntity roomEntity, Item item, boolean isRotation) { + Position destination = entity.getRoomUser().getPosition().copy(); + + if (!isValidPillowTile(item, destination)) { + destination = convertToPillow(destination, item); + } + + if (isValidPillowTile(item, destination)) { + if (!RoomTile.isValidTile(roomEntity.getRoom(), roomEntity.getEntity(), destination)) { + return; + } + + entity.getRoomUser().warp(destination, false, false); + + roomEntity.stopCarrying(); + roomEntity.stopDancing(); + + roomEntity.getPosition().setRotation(item.getPosition().getRotation()); + + double topHeight = item.getDefinition().getTopHeight(); + + if (entity.getType() == EntityType.PET) { + topHeight = 0.5 + item.getTile().getWalkingHeight(); + + Pet pet = (Pet) entity; + pet.setAction(PetAction.LAY); + pet.setActionDuration(ThreadLocalRandom.current().nextInt(10, 30)); + } + + roomEntity.getPosition().setRotation(item.getPosition().getRotation()); + roomEntity.setStatus(StatusType.LAY, StringUtil.format(topHeight)); + } + + roomEntity.setNeedsUpdate(true); + + if (entity.getRoomUser().isUsingEffect()) { + if (!roomEntity.getRoom().getTaskManager().hasTask("EntityTask")) { + return; + } + + EntityTask entityTask = (EntityTask) roomEntity.getRoom().getTaskManager().getTask("EntityTask"); + entityTask.getQueueAfterLoop().add(new USER_AVATAR_EFFECT(roomEntity.getInstanceId(), roomEntity.getEffectId())); + } + } + + @Override + public void onEntityLeave(Entity entity, RoomEntity roomEntity, Item item, Object... customArgs) { + + } + + /** + * Converts any coordinate within the bed dimensions to the closest pillow. + * + * @param position to check + * @param item the item checking against + * @return the pillow position + */ + public static Position convertToPillow(Position position, Item item) { + Position destination = position.copy(); + + if (!isValidPillowTile(item, position)) { + for (Position tile : getValidPillowTiles(item)) { + if (item.getPosition().getRotation() == 0) { + destination.setY(tile.getY()); + } else { + destination.setX(tile.getX()); + } + + break; + } + } + + return destination; + } + + /** + * Validates if the users tile is a valid pillow tile on a bed. + * + * @param item the bed to check for + * @param entityPosition the entity position to check against + * @return true, if successful + */ + public static boolean isValidPillowTile(Item item, Position entityPosition) { + if (entityPosition.equals(item.getPosition())) { + return true; + } else { + for (Position validTile : getValidPillowTiles(item)) { + if (validTile.equals(entityPosition)) { + return true; + } + } + } + + return false; + } + + /** + * Gets the valid pillow tile list for a bed. + * + * @param item the item to check for + * @return the list of valid coordinates + */ + public static List getValidPillowTiles(Item item) { + if (item == null || item.getPosition() == null) { + return List.of(); + } + + List tiles = new ArrayList<>(); + tiles.add(new Position(item.getPosition().getX(), item.getPosition().getY())); + + int validPillowX = -1; + int validPillowY = -1; + + if (item.getPosition().getRotation() == 0) { + validPillowX = item.getPosition().getX() + 1; + validPillowY = item.getPosition().getY(); + } + + if (item.getPosition().getRotation() == 2) { + validPillowX = item.getPosition().getX(); + validPillowY = item.getPosition().getY() + 1; + } + + tiles.add(new Position(validPillowX, validPillowY)); + return tiles; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/ChairInteractor.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/ChairInteractor.java new file mode 100644 index 0000000..ffea5b0 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/ChairInteractor.java @@ -0,0 +1,65 @@ +package org.alexdev.havana.game.item.interactors.types; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.interactors.InteractionType; +import org.alexdev.havana.game.pets.Pet; +import org.alexdev.havana.game.pets.PetAction; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.entities.RoomEntity; +import org.alexdev.havana.game.room.enums.StatusType; +import org.alexdev.havana.game.room.tasks.EntityTask; +import org.alexdev.havana.game.triggers.GenericTrigger; +import org.alexdev.havana.messages.outgoing.effects.USER_AVATAR_EFFECT; +import org.alexdev.havana.util.StringUtil; + +import java.util.concurrent.ThreadLocalRandom; + +public class ChairInteractor extends GenericTrigger { + public void onInteract(Player player, Room room, Item item, int status) { + InteractionType.DEFAULT.getTrigger().onInteract(player, room, item, status); + } + + @Override + public void onEntityStop(Entity entity, RoomEntity roomEntity, Item item, boolean isRotation) { + boolean isRolling = entity.getRoomUser().isRolling(); + + int headRotation = roomEntity.getPosition().getHeadRotation(); + double topHeight = item.getDefinition().getTopHeight(); + + if (entity.getType() == EntityType.PET) { + topHeight = 0.5 + item.getTile().getWalkingHeight(); + + Pet pet = (Pet) entity; + pet.setAction(PetAction.SIT); + pet.setActionDuration(ThreadLocalRandom.current().nextInt(10, 30)); + } + + roomEntity.getPosition().setRotation(item.getPosition().getRotation()); + roomEntity.stopDancing(); + roomEntity.setStatus(StatusType.SIT, StringUtil.format(topHeight)); + roomEntity.setNeedsUpdate(true); + + if (isRolling) { + if (roomEntity.getTimerManager().getLookTimer() > -1) { + roomEntity.getPosition().setHeadRotation(headRotation); + } + } + + if (entity.getRoomUser().isUsingEffect()) { + if (!roomEntity.getRoom().getTaskManager().hasTask("EntityTask")) { + return; + } + + EntityTask entityTask = (EntityTask) roomEntity.getRoom().getTaskManager().getTask("EntityTask"); + entityTask.getQueueAfterLoop().add(new USER_AVATAR_EFFECT(roomEntity.getInstanceId(), roomEntity.getEffectId())); + } + } + + @Override + public void onEntityLeave(Entity entity, RoomEntity roomEntity, Item item, Object... customArgs) { + + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/DefaultInteractor.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/DefaultInteractor.java new file mode 100644 index 0000000..75ae2fc --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/DefaultInteractor.java @@ -0,0 +1,48 @@ +package org.alexdev.havana.game.item.interactors.types; + +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.mapping.RoomTile; +import org.alexdev.havana.game.triggers.GenericTrigger; +import org.apache.commons.lang3.StringUtils; + +public class DefaultInteractor extends GenericTrigger { + public void onInteract(Player player, Room room, Item item, int status) { + if (item.hasBehaviour(ItemBehaviour.GATE)) { + if (item.isGateOpen()) { + RoomTile tile = item.getTile(); + + if (tile.getEntireEntities().size() > 0) { + // Can't close gate if there's a user on the tile + return; + } + } + } + + if (item.hasBehaviour(ItemBehaviour.ROOMDIMMER) + || item.hasBehaviour(ItemBehaviour.DICE) + || item.hasBehaviour(ItemBehaviour.PRIZE_TROPHY) + || item.hasBehaviour(ItemBehaviour.POST_IT) + || item.hasBehaviour(ItemBehaviour.ROLLER) + || item.hasBehaviour(ItemBehaviour.WHEEL_OF_FORTUNE) + || item.hasBehaviour(ItemBehaviour.SOUND_MACHINE_SAMPLE_SET)) { + return; // Prevent dice rigging, scripting trophies, post-its, etc. + } + + if (item.getDefinition().getMaxStatus() > 0) { + int currentMode = StringUtils.isNumeric(item.getCustomData()) ? Integer.valueOf(item.getCustomData()) : 0; + int newMode = currentMode + 1; + + if (newMode >= item.getDefinition().getMaxStatus()) { + newMode = 0; + } + + + item.setCustomData(String.valueOf(newMode)); + item.updateStatus(); + item.save(); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/FortuneInteractor.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/FortuneInteractor.java new file mode 100644 index 0000000..e3d4413 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/FortuneInteractor.java @@ -0,0 +1,68 @@ +package org.alexdev.havana.game.item.interactors.types; + +import org.alexdev.havana.dao.mysql.ItemDao; +import org.alexdev.havana.game.GameScheduler; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.pathfinder.Rotation; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.enums.StatusType; +import org.alexdev.havana.game.triggers.GenericTrigger; +import org.apache.commons.lang3.StringUtils; + +import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.TimeUnit; + +public class FortuneInteractor extends GenericTrigger { + public static int FORTUNE_OFF = 8; + public static int FORTUNE_NO_STATE = -1; + + public void onInteract(Player player, Room room, Item item, int status) { + if (item.getRequiresUpdate()) { + return; + } + + int currentMode = StringUtils.isNumeric(item.getCustomData()) ? Integer.valueOf(item.getCustomData()) : FORTUNE_OFF; + int newMode; + + // Turn on + if (currentMode == FORTUNE_OFF) { + newMode = FORTUNE_NO_STATE; + } else { + newMode = FORTUNE_OFF; + } + + item.setCustomData(String.valueOf(newMode)); + item.updateStatus(); + item.save(); + + int rotation = Rotation.calculateWalkDirection(player.getRoomUser().getPosition(), item.getPosition()); + + // When sitting calculate even rotation + if (player.getRoomUser().containsStatus(StatusType.SIT)) { + var current = player.getRoomUser().getPosition(); // And now rotate their head for all sitting people. + player.getRoomUser().getPosition().setHeadRotation(Rotation.getHeadRotation(current.getRotation(), current, item.getPosition())); + + } else { + player.getRoomUser().getPosition().setRotation(rotation); + } + + player.getRoomUser().setNeedsUpdate(true); + + if (newMode == FORTUNE_NO_STATE) { + item.setRequiresUpdate(true); + + GameScheduler.getInstance().getService().schedule(() -> { + int randomNumber = ThreadLocalRandom.current().nextInt(0, 8); // 0-7 + + item.setCustomData(String.valueOf(randomNumber)); + item.updateStatus(); + + item.setRequiresUpdate(false); + item.save(); + + }, 1500, TimeUnit.MILLISECONDS); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/LertInteractor.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/LertInteractor.java new file mode 100644 index 0000000..ac9c57a --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/LertInteractor.java @@ -0,0 +1,22 @@ +package org.alexdev.havana.game.item.interactors.types; + +import org.alexdev.havana.dao.mysql.ItemDao; +import org.alexdev.havana.game.GameScheduler; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.triggers.GenericTrigger; + +public class LertInteractor extends GenericTrigger { + public void onInteract(Player player, Room room, Item item, int status) { + item.setCustomData("0"); + item.updateStatus(); + + item.setCustomData("1"); + item.updateStatus(); + + item.setCustomData("0"); + item.updateStatus(); + item.save(); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/LoveRandomizerInteractor.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/LoveRandomizerInteractor.java new file mode 100644 index 0000000..c9e1cd2 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/LoveRandomizerInteractor.java @@ -0,0 +1,45 @@ +package org.alexdev.havana.game.item.interactors.types; + +import org.alexdev.havana.game.GameScheduler; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.interactors.InteractionType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.entities.RoomEntity; +import org.alexdev.havana.game.triggers.GenericTrigger; + +import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.TimeUnit; + +public class LoveRandomizerInteractor extends GenericTrigger { + public void onInteract(Player player, Room room, Item item, int status) { + // Spin already being executed, return + if (item.getRequiresUpdate()) { + return; + } + + // Send spinning animation to room + item.setCustomData("0"); + item.updateStatus(); + + item.setRequiresUpdate(true); + + GameScheduler.getInstance().getService().schedule(()->{ + if (!item.getRequiresUpdate()) { + return; + } + + item.setCustomData(String.valueOf(ThreadLocalRandom.current().nextInt(1, 5))); + item.updateStatus(); + item.save(); + + item.setRequiresUpdate(false); + }, 4250, TimeUnit.MILLISECONDS); + } + + @Override + public void onEntityStop(Entity entity, RoomEntity roomEntity, Item item, boolean isRotation) { + InteractionType.CHAIR.getTrigger().onEntityStop(entity, roomEntity, item, isRotation); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/MultiHeightInteractor.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/MultiHeightInteractor.java new file mode 100644 index 0000000..9e13375 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/MultiHeightInteractor.java @@ -0,0 +1,21 @@ +package org.alexdev.havana.game.item.interactors.types; + +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.interactors.InteractionType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.triggers.GenericTrigger; + +public class MultiHeightInteractor extends GenericTrigger { + public void onInteract(Player player, Room room, Item item, int status) { + if (item.getItemAbove() != null) + return; + + InteractionType.DEFAULT.getTrigger().onInteract(player, room, item, status); + + room.getMapping().getTile(item.getPosition()).removeItem(item); + room.getMapping().getTile(item.getPosition()).addItem(item); + + item.updateEntities(null); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/PetNestInteractor.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/PetNestInteractor.java new file mode 100644 index 0000000..834e111 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/PetNestInteractor.java @@ -0,0 +1,91 @@ +package org.alexdev.havana.game.item.interactors.types; + +import org.alexdev.havana.dao.mysql.PetDao; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.pets.Pet; +import org.alexdev.havana.game.pets.PetDetails; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.triggers.GenericTrigger; + +public class PetNestInteractor extends GenericTrigger { + @Override + public void onItemPlaced(Player player, Room room, Item item) { + PetDetails petDetails = PetDao.getPetDetails(item.getDatabaseId()); + + if (petDetails != null) { + Pet pet = this.addPet(room, petDetails, item.getPosition()); + + PetDao.saveCoordinates(petDetails.getId(), + pet.getRoomUser().getPosition().getX(), + pet.getRoomUser().getPosition().getY(), + pet.getRoomUser().getPosition().getRotation()); + } + } + + @Override + public void onItemPickup(Player player, Room room, Item item) { + PetDetails petDetails = PetDao.getPetDetails(item.getDatabaseId()); + + if (petDetails == null) { + return; + } + + int petId = petDetails.getId(); + Pet pet = (Pet)room.getEntityManager().getById(petId, EntityType.PET); + + if (pet == null) { + return; + } + + room.getEntityManager().leaveRoom(pet, false); + } + + /*@Override + public void onEntityStop(Entity entity, RoomEntity roomEntity, Item item, boolean isRotation) { + if (entity.getType() != EntityType.PET) { + return; + } + + Pet pet = (Pet) entity; + + if (pet.getDetails().getItemId() != item.getDatabaseId()) { + return; + } + + if (pet.getRoomUser().getItem() == null || pet.getAction() != PetAction.SLEEP) { + return; + } + + pet.getRoomUser().setStatus(StatusType.SLEEP, StringUtil.format(pet.getRoomUser().getPosition().getZ()) + " null"); + pet.getRoomUser().setNeedsUpdate(true); + + pet.setAction(PetAction.SLEEP); + pet.setActionDuration(ThreadLocalRandom.current().nextInt(20, 60)); + }*/ + + /** + * Add a pet by given pet id. + * + * @param room the room to add the pet to + * @param petDetails the details of the pet + * @param position the position of the pet + * + * @return the pet instance created + */ + public Pet addPet(Room room, PetDetails petDetails, Position position) { + Pet pet = new Pet(petDetails); + position.setZ(room.getMapping().getTile(position.getX(), position.getY()).getWalkingHeight()); + + room.getEntityManager().enterRoom(pet, position); + room.getMapping().getTile(position).addEntity(pet); + + /*GameScheduler.getInstance().getService().scheduleAtFixedRate(()-> { + pet.getRoomUser().walkTo(room.getModel().getRandomBound(0), room.getModel().getRandomBound(0)); + }, 0, 5, TimeUnit.SECONDS);*/ + + return pet; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/ScoreboardInteractor.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/ScoreboardInteractor.java new file mode 100644 index 0000000..5e87d50 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/ScoreboardInteractor.java @@ -0,0 +1,49 @@ +package org.alexdev.havana.game.item.interactors.types; + +import org.alexdev.havana.dao.mysql.ItemDao; +import org.alexdev.havana.game.GameScheduler; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.interactors.InteractionType; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.triggers.GenericTrigger; +import org.apache.commons.lang3.StringUtils; + +public class ScoreboardInteractor extends GenericTrigger { + public void onInteract(Player player, Room room, Item item, int status) { + if (!room.hasRights(player.getDetails().getId()) && !player.hasFuse(Fuseright.MOD)) { + return; + } + + if (status == 1) { + if (item.getDefinition().getMaxStatus() > 0) { + int currentMode = StringUtils.isNumeric(item.getCustomData()) ? Integer.valueOf(item.getCustomData()) : 0; + int newMode = currentMode - 1; + + if (newMode < 0) { + newMode = 99; + } + + item.setCustomData(String.valueOf(newMode)); + item.updateStatus(); + } + } + + if (status == 2) { + InteractionType.DEFAULT.getTrigger().onInteract(player, room, item, status); + } + + if (status == 0) { + if (StringUtils.isNumeric(item.getCustomData())) { + item.setCustomData("x"); + item.updateStatus(); + } else { + item.setCustomData("0"); + item.updateStatus(); + } + } + + item.save(); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/StepLightInteractor.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/StepLightInteractor.java new file mode 100644 index 0000000..8809b15 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/StepLightInteractor.java @@ -0,0 +1,24 @@ +package org.alexdev.havana.game.item.interactors.types; + +import org.alexdev.havana.game.GameScheduler; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.room.entities.RoomEntity; +import org.alexdev.havana.game.triggers.GenericTrigger; + +import java.util.concurrent.TimeUnit; + +public class StepLightInteractor extends GenericTrigger { + @Override + public void onEntityStep(Entity entity, RoomEntity roomEntity, Item item, Position oldPosition) { + item.setCustomData("1"); + item.updateStatus(); + + GameScheduler.getInstance().getService().schedule(()-> { + item.setCustomData("0"); + item.updateStatus(); + item.save(); + }, 500, TimeUnit.MILLISECONDS); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/TeleportInteractor.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/TeleportInteractor.java new file mode 100644 index 0000000..3663615 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/TeleportInteractor.java @@ -0,0 +1,209 @@ +package org.alexdev.havana.game.item.interactors.types; + +import org.alexdev.havana.dao.mysql.ItemDao; +import org.alexdev.havana.dao.mysql.TeleporterDao; +import org.alexdev.havana.game.GameScheduler; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.ItemManager; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.entities.RoomPlayer; +import org.alexdev.havana.game.room.mapping.RoomTile; +import org.alexdev.havana.game.triggers.GenericTrigger; +import org.alexdev.havana.messages.outgoing.messenger.ROOMFORWARD; +import org.alexdev.havana.messages.outgoing.rooms.user.LOGOUT; + +import java.util.concurrent.TimeUnit; + +public class TeleportInteractor extends GenericTrigger { + public static final String TELEPORTER_CLOSE = "0"; + public static final String TELEPORTER_OPEN = "1"; + public static final String TELEPORTER_EFFECTS = "2"; + + public void onInteract(Player player, Room room, Item item, int status) { + RoomPlayer roomUser = player.getRoomUser(); + + if (player.getRoomUser().getAuthenticateTelporterId() != -1) { + return; + } + + Position front = item.getPosition().getSquareInFront(); + + if (!front.equals(roomUser.getPosition()) && !item.getPosition().equals(roomUser.getPosition())) { + roomUser.walkTo(front.getX(), front.getY()); + return; + } + + long pairId = TeleporterDao.getTeleporterId(item.getDatabaseId()); + Item targetTeleporter = ItemDao.getItem(pairId); + + item.setCustomData(TELEPORTER_OPEN); + item.updateStatus(); + + roomUser.walkTo(item.getPosition().getX(), item.getPosition().getY()); + roomUser.setWalkingAllowed(false); + + // Broken link, make user walk in then walk out + if (pairId == -1 || targetTeleporter == null || targetTeleporter.getRoom() == null) { + GameScheduler.getInstance().getService().schedule(() -> { + roomUser.walkTo( + item.getPosition().getSquareInFront().getX(), + item.getPosition().getSquareInFront().getY()); + }, 1, TimeUnit.SECONDS); + + GameScheduler.getInstance().getService().schedule(() -> { + item.setCustomData(TELEPORTER_CLOSE); + item.updateStatus(); + }, 2, TimeUnit.SECONDS); + + GameScheduler.getInstance().getService().schedule(() -> { + roomUser.setWalkingAllowed(true); + }, 2500, TimeUnit.MILLISECONDS); + + return; + } + + var resolved = ItemManager.getInstance().resolveItem(pairId); + + Item pairedTeleporter = resolved != null ? resolved : targetTeleporter; + roomUser.setAuthenticateTelporterId(pairedTeleporter.getDatabaseId()); + + // Check if the user is inside the teleporter, if so, walk out. Useful if the user is stuck inside. + if (item.getPosition().equals(roomUser.getPosition()) && !RoomTile.isValidTile(room, player, item.getPosition().getSquareInFront())) { + item.setCustomData(TELEPORTER_EFFECTS); + item.updateStatus(); + + GameScheduler.getInstance().getService().schedule(() -> { + if (roomUser.getAuthenticateTelporterId() == -1) { + return; + } + + item.setCustomData(TELEPORTER_CLOSE); + item.updateStatus(); + + room.send(new LOGOUT(player.getRoomUser().getInstanceId())); + }, 1, TimeUnit.SECONDS); + + GameScheduler.getInstance().getService().schedule(() -> { + if (roomUser.getAuthenticateTelporterId() == -1) { + return; + } + + if (pairedTeleporter.getRoomId() == item.getRoomId()) { + roomUser.warp(pairedTeleporter.getPosition(), true, true); + pairedTeleporter.setCustomData(TELEPORTER_EFFECTS); + pairedTeleporter.updateStatus(); + } else { + roomUser.setAuthenticateId(pairedTeleporter.getRoom().getId()); + pairedTeleporter.getRoom().forward(player, false); + //player.send(new ROOMFORWARD(pairedTeleporter.getRoom().isPublicRoom(), pairedTeleporter.getRoom().getId())); + } + }, 2, TimeUnit.SECONDS); + + // Handle teleporting in the same room + if (pairedTeleporter.getRoomId() == item.getRoomId()) { + GameScheduler.getInstance().getService().schedule(() -> { + if (roomUser.getAuthenticateTelporterId() == -1) { + return; + } + + pairedTeleporter.setCustomData(TELEPORTER_OPEN); + pairedTeleporter.updateStatus(); + + roomUser.walkTo( + pairedTeleporter.getPosition().getSquareInFront().getX(), + pairedTeleporter.getPosition().getSquareInFront().getY()); + + roomUser.setWalkingAllowed(true); + }, 3, TimeUnit.SECONDS); + + GameScheduler.getInstance().getService().schedule(() -> { + if (roomUser.getAuthenticateTelporterId() == -1) { + return; + } + + roomUser.setAuthenticateTelporterId(-1); + + pairedTeleporter.setCustomData(TELEPORTER_CLOSE); + pairedTeleporter.updateStatus(); + }, 4, TimeUnit.SECONDS); + } + return; + } + + // Resume normal teleportation + GameScheduler.getInstance().getService().schedule(() -> { + if (roomUser.getAuthenticateTelporterId() == -1) { + return; + } + + item.setCustomData(TELEPORTER_EFFECTS); + item.updateStatus(); + }, 1000, TimeUnit.MILLISECONDS); + + GameScheduler.getInstance().getService().schedule(() -> { + if (roomUser.getAuthenticateTelporterId() == -1) { + return; + } + + room.send(new LOGOUT(player.getRoomUser().getInstanceId())); + item.setCustomData(TELEPORTER_CLOSE); + item.updateStatus(); + + if (pairedTeleporter.getRoomId() != item.getRoomId()) { + roomUser.setAuthenticateId(pairedTeleporter.getRoom().getId()); + pairedTeleporter.getRoom().forward(player, false); + //player.send(new ROOMFORWARD(pairedTeleporter.getRoom().isPublicRoom(), pairedTeleporter.getRoom().getId())); + } else { + roomUser.warp(pairedTeleporter.getPosition(), true, true); + } + + if (pairedTeleporter.getRoomId() == item.getRoomId()) { + pairedTeleporter.setCustomData(TELEPORTER_EFFECTS); + pairedTeleporter.updateStatus(); + } + }, 1500, TimeUnit.MILLISECONDS); + + if (pairedTeleporter.getRoomId() == item.getRoomId()) { + GameScheduler.getInstance().getService().schedule(() -> { + if (roomUser.getRoom().getId() != room.getId()) { + roomUser.setAuthenticateTelporterId(-1); + return; + } + /*if (roomUser.getAuthenticateTelporterId() == -1) { + return; + }*/ + + pairedTeleporter.setCustomData(TELEPORTER_OPEN); + pairedTeleporter.updateStatus(); + + roomUser.walkTo( + pairedTeleporter.getPosition().getSquareInFront().getX(), + pairedTeleporter.getPosition().getSquareInFront().getY()); + }, 3, TimeUnit.SECONDS); + + GameScheduler.getInstance().getService().schedule(() -> { + if (roomUser.getRoom().getId() != room.getId()) { + roomUser.setAuthenticateTelporterId(-1); + return; + } + /*if (roomUser.getAuthenticateTelporterId() == -1) { + return; + }*/ + + roomUser.setAuthenticateTelporterId(-1); + + if (pairedTeleporter.getRoomId() == item.getRoomId()) { + pairedTeleporter.setCustomData(TELEPORTER_CLOSE); + pairedTeleporter.updateStatus(); + } else { + roomUser.getRoom().getItemManager().getByDatabaseId(pairId).setCustomData(TELEPORTER_CLOSE); + roomUser.getRoom().getItemManager().getByDatabaseId(pairId).updateStatus(); + } + + roomUser.setWalkingAllowed(true); + }, 4000, TimeUnit.MILLISECONDS); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/TeleportRoomHireInteractor.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/TeleportRoomHireInteractor.java new file mode 100644 index 0000000..1ced8f1 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/TeleportRoomHireInteractor.java @@ -0,0 +1,75 @@ +package org.alexdev.havana.game.item.interactors.types; + +import org.alexdev.havana.game.GameScheduler; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.navigator.NavigatorManager; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.entities.RoomPlayer; +import org.alexdev.havana.game.room.models.RoomModelManager; +import org.alexdev.havana.game.triggers.GenericTrigger; +import org.alexdev.havana.messages.outgoing.rooms.user.LOGOUT; + +import java.util.concurrent.TimeUnit; + +public class TeleportRoomHireInteractor extends GenericTrigger { + public static final String TELEPORTER_CLOSE = "0"; + public static final String TELEPORTER_OPEN = "1"; + public static final String TELEPORTER_EFFECTS = "2"; + + public void onInteract(Player player, Room room, Item item, int status) { + RoomPlayer roomUser = player.getRoomUser(); + + if (player.getRoomUser().getAuthenticateTelporterId() != -1) { + return; + } + + Position front = item.getPosition().getSquareInFront(); + + if (!front.equals(roomUser.getPosition()) && !item.getPosition().equals(roomUser.getPosition())) { + roomUser.walkTo(front.getX(), front.getY()); + return; + } + + item.setCustomData(TELEPORTER_OPEN); + item.updateStatus(); + + roomUser.walkTo(item.getPosition().getX(), item.getPosition().getY()); + roomUser.setWalkingAllowed(false); + + // Resume normal teleportation + GameScheduler.getInstance().getService().schedule(() -> { + item.setCustomData(TELEPORTER_EFFECTS); + item.updateStatus(); + }, 1000, TimeUnit.MILLISECONDS); + + GameScheduler.getInstance().getService().schedule(() -> { + room.send(new LOGOUT(player.getRoomUser().getInstanceId())); + item.setCustomData(TELEPORTER_CLOSE); + item.updateStatus(); + + tryCreateRoom(player, room, item); + }, 1500, TimeUnit.MILLISECONDS); + } + + private void tryCreateRoom(Player player, Room sourceRoom, Item item) { + var room = item.getTemporaryRoom(); + + if (room == null) { + room = new Room(); + + room.getData().fill(0, "Hire Room", "This is hosted by the Hire-A-Room furniture"); + room.getData().setCustomRoom(true); + room.getData().setOwnerId(sourceRoom.getData().getOwnerId()); + room.getData().setCategoryId(NavigatorManager.getInstance().getCategories().values().stream().filter(x -> !x.isPublicSpaces()).findFirst().orElse(null).getId()); + room.getData().setVisitorsMax(50); + + room.setRoomModel(RoomModelManager.getInstance().getModel("model_a")); + item.setTemporaryRoom(room); + } + + // player.getDetails().setTemporaryRoom(room); + room.forward(player, false); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/TotemHeadTrigger.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/TotemHeadTrigger.java new file mode 100644 index 0000000..abe2679 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/TotemHeadTrigger.java @@ -0,0 +1,252 @@ +package org.alexdev.havana.game.item.interactors.types; + +import org.alexdev.havana.dao.mysql.ItemDao; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.interactors.InteractionType; +import org.alexdev.havana.game.item.interactors.enums.TotemColour; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.triggers.GenericTrigger; + +import java.util.List; + +public class TotemHeadTrigger extends GenericTrigger { + @Override + public void onInteract(Player player, Room room, Item item, int status) { + //InteractionType.DEFAULT.getTrigger().onInteract(player, room, item, status); + boolean placedOnLegs = item.getItemBelow() != null && item.getItemBelow().getDefinition().getSprite().equals("totem_leg"); + + if (placedOnLegs) { + return; + } + + InteractionType.DEFAULT.getTrigger().onInteract(player, room, item, status); + } + + @Override + public void onItemPlaced(Player player, Room room, Item item) { + this.onItemMoved(player, room, item, false, null, item.getItemBelow(), item.getItemAbove()); + } + + @Override + public void onItemMoved(Player player, Room room, Item item, boolean isRotation, Position oldPosition, Item itemBelow, Item itemAbove) { + Item below = item.getItemBelow(); + + if (isRotation) { + return; + } + + boolean placedOnLegs = item.getItemBelow() != null && item.getItemBelow().getDefinition().getSprite().equals("totem_leg"); + + if (!placedOnLegs) { + TotemColour headColour = getHeadColour(item); + + // Turn the legs light back on + if (itemBelow != null && itemBelow.getDefinition().getSprite().equals("totem_leg")) { + if (headColour != TotemColour.NONE || item.getCustomData().equals("11")) { // "11" for the bird with the open wings + int state = convertHeadToColour(item, TotemColour.NONE); + + if (state == 11) { + state = 2; + } + + item.setCustomData(String.valueOf(state)); + item.updateStatus(); + + itemBelow.setCustomData(String.valueOf(convertLegToColour(itemBelow, headColour))); + itemBelow.updateStatus(); + + ItemDao.updateItems(List.of(item, itemBelow)); + } + } + } else { + // Convert the head to the colour of the legs once placed + item.setCustomData(String.valueOf(convertHeadToColour(item, getLegColour(below)))); + item.updateStatus(); + + below.setCustomData(String.valueOf(convertLegToColour(below, TotemColour.NONE))); + below.updateStatus(); + + ItemDao.updateItems(List.of(item, below)); + } + } + + /** + * Gets the colour of the totem legs. + * + * @param item the item colour + * @return the totem colour + */ + public static int convertHeadToColour(Item item, TotemColour colour) { + boolean squid = item.getCustomData().equals("1") || item.getCustomData().equals("8") || item.getCustomData().equals("9") || item.getCustomData().equals("10"); + boolean bird = item.getCustomData().equals("2") || item.getCustomData().equals("11") || item.getCustomData().equals("12") || item.getCustomData().equals("13") || item.getCustomData().equals("14"); + boolean human = item.getCustomData().equals("0") || item.getCustomData().equals("4") || item.getCustomData().equals("5") || item.getCustomData().equals("6"); + + if (human) { + if (colour == TotemColour.RED) { + return 4; + } + + if (colour == TotemColour.YELLOW) { + return 5; + } + + if (colour == TotemColour.BLUE) { + return 6; + } + + return 0; + } + + if (bird) { + if (colour == TotemColour.RED) { + return 12; + } + + if (colour == TotemColour.YELLOW) { + return 13; + } + + if (colour == TotemColour.BLUE) { + return 14; + } + + return 11; // Wings still out for bird + } + + if (squid) { + if (colour == TotemColour.RED) { + return 8; + } + + if (colour == TotemColour.YELLOW) { + return 9; + } + + if (colour == TotemColour.BLUE) { + return 10; + } + + return 1; + } + + return 0; + } + + /** + * Gets the colour of the totem legs. + * + * @param item the item colour + * @return the totem colour + */ + public static TotemColour getHeadColour(Item item) { + boolean redColour = item.getCustomData().equals("4") || item.getCustomData().equals("12") || item.getCustomData().equals("8"); + boolean yellowColour = item.getCustomData().equals("5") || item.getCustomData().equals("13") || item.getCustomData().equals("9"); + boolean blueColour = item.getCustomData().equals("6") || item.getCustomData().equals("14") || item.getCustomData().equals("10"); + boolean noColour = !yellowColour && !redColour && !blueColour; + + if (redColour) { + return TotemColour.RED; + } + + if (blueColour) { + return TotemColour.BLUE; + } + + if (yellowColour) { + return TotemColour.YELLOW; + } + + return TotemColour.NONE; + } + + /** + * Gets the colour of the totem legs. + * + * @param item the item colour + * @return the totem colour + */ + public static int convertLegToColour(Item item, TotemColour colour) { + boolean squid = item.getCustomData().equals("4") || item.getCustomData().equals("5") || item.getCustomData().equals("6") || item.getCustomData().equals("7"); + boolean bird = item.getCustomData().equals("8") || item.getCustomData().equals("9") || item.getCustomData().equals("10") || item.getCustomData().equals("11"); + boolean human = item.getCustomData().equals("0") || item.getCustomData().equals("1") || item.getCustomData().equals("2") || item.getCustomData().equals("3"); + + if (human) { + if (colour == TotemColour.RED) { + return 1; + } + + if (colour == TotemColour.YELLOW) { + return 2; + } + + if (colour == TotemColour.BLUE) { + return 3; + } + + return 0; + } + + if (bird) { + if (colour == TotemColour.RED) { + return 9; + } + + if (colour == TotemColour.YELLOW) { + return 10; + } + + if (colour == TotemColour.BLUE) { + return 11; + } + + return 8; + } + + if (squid) { + if (colour == TotemColour.RED) { + return 5; + } + + if (colour == TotemColour.YELLOW) { + return 6; + } + + if (colour == TotemColour.BLUE) { + return 7; + } + + return 4; + } + + return 0; + } + + /** + * Gets the colour of the totem legs. + * + * @param item the item colour + * @return the totem colour + */ + public static TotemColour getLegColour(Item item) { + boolean redColour = item.getCustomData().equals("5") || item.getCustomData().equals("9") || item.getCustomData().equals("1"); + boolean yellowColour = item.getCustomData().equals("6") || item.getCustomData().equals("10") || item.getCustomData().equals("2"); + boolean blueColour = item.getCustomData().equals("3") || item.getCustomData().equals("7") || item.getCustomData().equals("11"); + boolean noColour = !yellowColour && !redColour && !blueColour; + + if (redColour) { + return TotemColour.RED; + } + + if (blueColour) { + return TotemColour.BLUE; + } + + if (yellowColour) { + return TotemColour.YELLOW; + } + + return TotemColour.NONE; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/TotemLegTrigger.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/TotemLegTrigger.java new file mode 100644 index 0000000..3421df5 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/TotemLegTrigger.java @@ -0,0 +1,56 @@ +package org.alexdev.havana.game.item.interactors.types; + +import org.alexdev.havana.dao.mysql.ItemDao; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.interactors.InteractionType; +import org.alexdev.havana.game.item.interactors.enums.TotemColour; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.triggers.GenericTrigger; +import org.alexdev.havana.messages.outgoing.rooms.items.MOVE_FLOORITEM; + +import java.util.List; + +public class TotemLegTrigger extends GenericTrigger { + @Override + public void onInteract(Player player, Room room, Item item, int status) { + Item itemAbove = item.getItemAbove(); + + if (itemAbove != null && + (itemAbove.getDefinition().getSprite().equals("totem_head") + || itemAbove.getDefinition().getSprite().equals("totem_planet"))) { + return; + } + + InteractionType.DEFAULT.getTrigger().onInteract(player, room, item, status); + } + + @Override + public void onItemMoved(Player player, Room room, Item item, boolean isRotation, Position oldPosition, Item itemBelow, Item itemAbove) { + if (itemAbove == null || !itemAbove.getDefinition().getSprite().equals("totem_head")) { + return; + } + + if (TotemHeadTrigger.getHeadColour(itemAbove) != TotemColour.NONE) { + itemAbove.setCustomData(String.valueOf(TotemHeadTrigger.convertHeadToColour(itemAbove, TotemColour.NONE))); + itemAbove.updateStatus(); + ItemDao.updateItems(List.of(itemAbove)); + } + } + /*@Override + public void onItemPlaced(Player player, Room room, Item item, boolean isRotation, Position oldPosition, Item itemBelow) { + Item above = item.getItemAbove(); + + if (isRotation) { + // If we rotate the head and have legs underneath, rotate the legs + if (above != null && above.getDefinition().getSprite().equals("totem_head")) { + above.getPosition().setRotation(item.getPosition().getRotation()); + room.send(new MOVE_FLOORITEM(above)); + ItemDao.updateItem(above); + } + + return; + } + }*/ +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/TotemPlanetTrigger.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/TotemPlanetTrigger.java new file mode 100644 index 0000000..58a1856 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/TotemPlanetTrigger.java @@ -0,0 +1,131 @@ +package org.alexdev.havana.game.item.interactors.types; + +import org.alexdev.havana.dao.mysql.EffectDao; +import org.alexdev.havana.dao.mysql.ItemDao; +import org.alexdev.havana.game.effects.Effect; +import org.alexdev.havana.game.effects.EffectsManager; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.interactors.InteractionType; +import org.alexdev.havana.game.item.interactors.enums.TotemEffect; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.triggers.GenericTrigger; +import org.alexdev.havana.messages.incoming.effects.ACTIVATE_AVATAR_EFFECT; +import org.alexdev.havana.messages.incoming.effects.USE_AVATAR_EFFECT; +import org.alexdev.havana.messages.outgoing.effects.AVATAR_EFFECTS; +import org.alexdev.havana.messages.outgoing.effects.AVATAR_EFFECT_ADDED; +import org.alexdev.havana.util.DateUtil; + +import java.util.concurrent.TimeUnit; + +public class TotemPlanetTrigger extends GenericTrigger { + public void onInteract(Player player, Room room, Item item, int status) { + Item itemBelow = item.getItemBelow(); + + if (itemBelow != null && + (itemBelow.getDefinition().getSprite().equals("totem_head") + || itemBelow.getDefinition().getSprite().equals("totem_leg"))) { + + checkEffect(item, player, room); + return; + } + + InteractionType.DEFAULT.getTrigger().onInteract(player, room, item, status); + } + + private void checkEffect(Item item, Player player, Room room) { + if (!room.isOwner(player.getDetails().getId()) && !player.hasFuse(Fuseright.ANY_ROOM_CONTROLLER)) { + return; + } + + TotemEffect totemEffect = this.getTotemEffect(item); + + if (totemEffect == TotemEffect.NONE) { + return; + } + + for (Effect effect : player.getEffects()) { + if (effect.getEffectId() == totemEffect.getEffectId()) { + return; + } + } + + if (player.getDetails().getTotemEffectExpiry() > DateUtil.getCurrentTimeSeconds()) { + return; + } + + Effect effect = EffectDao.newEffect(player.getDetails().getId(), totemEffect.getEffectId(), -1, false); + + if (effect == null) { + return; + } + + player.getEffects().add(effect); + + player.send(new AVATAR_EFFECT_ADDED(effect)); + player.send(new AVATAR_EFFECTS(player.getEffects())); + + ACTIVATE_AVATAR_EFFECT.doAction(player, totemEffect.getEffectId()); + USE_AVATAR_EFFECT.doAction(player, totemEffect.getEffectId()); + + ItemDao.saveTotemExpire(player.getDetails().getId(), DateUtil.getCurrentTimeSeconds() + TimeUnit.DAYS.toSeconds(1)); + } + + private TotemEffect getTotemEffect(Item totemPlanet) { + if (totemPlanet.getItemBelow() == null || !totemPlanet.getItemBelow().getDefinition().getSprite().equals("totem_head")) { + return TotemEffect.NONE; + } + + Item totemHead = totemPlanet.getItemBelow(); + + if (totemHead == null || totemHead.getItemBelow() == null || !totemHead.getItemBelow().getDefinition().getSprite().equals("totem_leg")) { + return TotemEffect.NONE; + } + + Item totemLegs = totemHead.getItemBelow(); + + // FIRE + /* + * Status planet: 1 + * Status head: 12 + * Status legs: 8 + */ + + // WAND + /* + Status planet: 2 + Status head: 9 + Status legs: 8 + */ + + // RAIN + /* + Status planet: 0 + Status head: 10 + Status legs: 4 + */ + + // LEVITATION + /* + Status planet: 2 + Status head: 5 + Status legs: 0 + */ + + int planet = Integer.parseInt(totemPlanet.getCustomData()); + int head = Integer.parseInt(totemHead.getCustomData()); + int legs = Integer.parseInt(totemLegs.getCustomData()); + + + for (TotemEffect totemEffect : TotemEffect.values()) { + if (totemEffect.getPlanet() == planet && totemEffect.getHead() == head && totemEffect.getLegs() == legs) { + return totemEffect; + } + } + + + return TotemEffect.NONE; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/VendingMachineInteractor.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/VendingMachineInteractor.java new file mode 100644 index 0000000..7ad132d --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/VendingMachineInteractor.java @@ -0,0 +1,61 @@ +package org.alexdev.havana.game.item.interactors.types; + +import org.alexdev.havana.game.GameScheduler; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.pathfinder.Rotation; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.enums.StatusType; +import org.alexdev.havana.game.triggers.GenericTrigger; + +import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.TimeUnit; + +public class VendingMachineInteractor extends GenericTrigger { + public void onInteract(Player player, Room room, Item item, int status) { + /*if (player.getRoomUser().isUsingEffect()) { + return; + }*/ + + // Can't getInteractor to the vending machine unless we're close + Position front = item.getPosition().getSquareInFront(); + + // Let user access fridge from the side, left or right. + if (!front.touches(player.getRoomUser().getPosition()) && + !player.getRoomUser().getPosition().getSquareRight().equals(item.getPosition()) && + !player.getRoomUser().getPosition().getSquareLeft().equals(item.getPosition())) { + player.getRoomUser().walkTo(front.getX(), front.getY()); + return; + } + + // Only rotate user if they are in front + if (!player.getRoomUser().containsStatus(StatusType.SIT) && + !player.getRoomUser().containsStatus(StatusType.LAY)) { + int newRotation = Rotation.calculateWalkDirection(player.getRoomUser().getPosition(), item.getPosition()); + + if (player.getRoomUser().getPosition().getRotation() != newRotation) { + if (player.getRoomUser().isSittingOnChair()) { // Don't rotate user on chair when using vending machine + return; + } + + player.getRoomUser().getPosition().setRotation(newRotation); + player.getRoomUser().setNeedsUpdate(true); + } + } + + int randomDrinkId = item.getDefinition().getDrinkIds()[ThreadLocalRandom.current().nextInt(0, item.getDefinition().getDrinkIds().length)]; + + item.setCustomData("1"); + item.updateStatus(); + + GameScheduler.getInstance().getService().schedule(() -> { + player.getRoomUser().carryItem(randomDrinkId, null); + }, 1, TimeUnit.SECONDS); + + GameScheduler.getInstance().getService().schedule(() -> { + item.setCustomData("0"); + item.updateStatus(); + }, 2, TimeUnit.SECONDS); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/idol/IdolChairVoteInteractor.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/idol/IdolChairVoteInteractor.java new file mode 100644 index 0000000..d16b0c9 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/idol/IdolChairVoteInteractor.java @@ -0,0 +1,54 @@ +package org.alexdev.havana.game.item.interactors.types.idol; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.interactors.InteractionType; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.entities.RoomEntity; +import org.alexdev.havana.game.room.tasks.EntityTask; +import org.alexdev.havana.game.triggers.GenericTrigger; +import org.alexdev.havana.game.room.enums.StatusType; +import org.alexdev.havana.messages.outgoing.effects.USER_AVATAR_EFFECT; +import org.alexdev.havana.messages.outgoing.rooms.items.JUDGE_GUI_STATUS; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; +import org.alexdev.havana.util.StringUtil; + +public class IdolChairVoteInteractor extends GenericTrigger { + @Override + public void onEntityStop(Entity entity, RoomEntity roomEntity, Item item, boolean isRotation) { + InteractionType.CHAIR.getTrigger().onEntityStop(entity, roomEntity, item, isRotation); + + if (isRotation) { + return; + } + + if (entity.getType() != EntityType.PLAYER) { + return; + } + + roomEntity.getRoom().getIdolManager().updatePerformer(); + + Player player = (Player) entity; + + if (roomEntity.getRoom().getIdolManager().getPerformer() == null || !item.getCustomData().equals("0") || roomEntity.getRoom().getIdolManager().getVoted().contains(player)) { + player.send(new JUDGE_GUI_STATUS(1, -1)); + } else { + player.send(new JUDGE_GUI_STATUS(2, roomEntity.getRoom().getIdolManager().getPerformer().getDetails().getId())); + } + + } + + @Override + public void onEntityLeave(Entity entity, RoomEntity roomEntity, Item item, Object... customArgs) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + player.send(new JUDGE_GUI_STATUS(0, -1)); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/idol/IdolScoreboardInteractor.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/idol/IdolScoreboardInteractor.java new file mode 100644 index 0000000..e856698 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/idol/IdolScoreboardInteractor.java @@ -0,0 +1,82 @@ +package org.alexdev.havana.game.item.interactors.types.idol; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.entities.RoomEntity; +import org.alexdev.havana.game.triggers.GenericTrigger; +import org.alexdev.havana.messages.incoming.rooms.idol.OPEN_PERFORMER_GUI; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.HashMap; +import java.util.Map; + +public class IdolScoreboardInteractor extends GenericTrigger { + @Override + public void onEntityStop(Entity entity, RoomEntity roomEntity, Item item, boolean isRotation) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + /*player.getRoomUser().getPosition().setRotation(item.getPosition().getRotation()); + player.getRoomUser().setNeedsUpdate(true);*/ + + if (isRotation) { + return; + } + + Player player = (Player) entity; + Map userDisks = new HashMap<>(); + + if (roomEntity.getRoom().getItemManager().getSoundMachine() != null && roomEntity.getRoom().getItemManager().getSoundMachine().hasBehaviour(ItemBehaviour.SOUND_MACHINE)) { + for (Item disk : player.getInventory().getItems()) { + if (!item.isVisible()) { + continue; + } + + if (!disk.hasBehaviour(ItemBehaviour.SONG_DISK)) { + continue; + } + + userDisks.put(disk, disk.getCustomData().split(Character.toString((char) 10))[5]); + } + } + + player.send(new OPEN_PERFORMER_GUI(userDisks)); + + roomEntity.getRoom().getIdolManager().resetChairs(); + roomEntity.getRoom().getIdolManager().updatePerformer(); + + if (!item.getCustomData().equals("-1")) { + item.setCustomData("-1"); + item.updateStatus(); + item.save(); + } + } + + @Override + public void onEntityLeave(Entity entity, RoomEntity roomEntity, Item item, Object... customArgs) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + player.send(new MessageComposer() { + @Override + public void compose(NettyResponse response) { + } + + @Override + public short getHeader() { + return 492; + } + }); + + roomEntity.getRoom().getIdolManager().resetChairs(); + roomEntity.getRoom().getIdolManager().updatePerformer(); + roomEntity.getRoom().getIdolManager().forceStop(); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/pool/PoolBoothInteractor.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/pool/PoolBoothInteractor.java new file mode 100644 index 0000000..f8f0679 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/pool/PoolBoothInteractor.java @@ -0,0 +1,36 @@ +package org.alexdev.havana.game.item.interactors.types.pool; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.room.entities.RoomEntity; +import org.alexdev.havana.game.triggers.GenericTrigger; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.rooms.pool.OPEN_UIMAKOPPI; + +public class PoolBoothInteractor extends GenericTrigger { + + @Override + public void onEntityStop(Entity entity, RoomEntity roomEntity, Item item, boolean isRotation) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player)entity; + + player.getRoomUser().setWalkingAllowed(false); + player.getRoomUser().getTimerManager().resetRoomTimer(120); // Only allow 120 seconds when changing clothes, to stop someone from just afking in the booth for 15 minutes. + player.send(new OPEN_UIMAKOPPI()); + + item.showProgram("close"); + } + + @Override + public void onEntityLeave(Entity entity, RoomEntity roomEntity, Item item, Object... customArgs) { + if (roomEntity.isWalking()) { + return; + } + + item.showProgram("open"); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/pool/PoolExitInteractor.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/pool/PoolExitInteractor.java new file mode 100644 index 0000000..adce79a --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/pool/PoolExitInteractor.java @@ -0,0 +1,72 @@ +package org.alexdev.havana.game.item.interactors.types.pool; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.room.entities.RoomEntity; +import org.alexdev.havana.game.room.enums.StatusType; +import org.alexdev.havana.game.triggers.GenericTrigger; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.room.handlers.PoolHandler; + +public class PoolExitInteractor extends GenericTrigger { + @Override + public void onEntityStep(Entity entity, RoomEntity roomEntity, Item item, Position oldPosition) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + if (!entity.getRoomUser().containsStatus(StatusType.SWIM)) { + return; + } + + // Don't handle step event from RoomUser when changing paths + //if (customArgs.length > 0) { + // return; + //} + + Position warp = null; + Position goal = null; + + if (item.getPosition().getX() == 21 && item.getPosition().getY() == 28) { + warp = new Position(20, 28); + goal = new Position(19, 28); + } + + if (item.getPosition().getX() == 17 && item.getPosition().getY() == 22) { + warp = new Position(17, 21); + goal = new Position(17, 20); + } + + if (item.getPosition().getX() == 31 && item.getPosition().getY() == 11) { + warp = new Position(31, 10); + goal = new Position(31, 9); + } + + if (item.getPosition().getX() == 20 && item.getPosition().getY() == 19) { + warp = new Position(19, 19); + goal = new Position(18, 19); + } + + if ((item.getPosition().getX() == 12 && item.getPosition().getY() == 11) || + (item.getPosition().getX() == 12 && item.getPosition().getY() == 12)) { + warp = new Position(11, 11); + goal = new Position(10, 11); + } + + + if (warp != null) { + PoolHandler.warpSwim(item, entity, warp, goal, true); + } + } + + @Override + public void onEntityStop(Entity entity, RoomEntity roomEntity, Item item, boolean isRotation) { + + } + + @Override + public void onEntityLeave(Entity entity, RoomEntity roomEntity, Item item, Object... customArgs) { + + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/pool/PoolInteractor.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/pool/PoolInteractor.java new file mode 100644 index 0000000..0979ddb --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/pool/PoolInteractor.java @@ -0,0 +1,58 @@ +package org.alexdev.havana.game.item.interactors.types.pool; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.enums.StatusType; +import org.alexdev.havana.game.room.mapping.RoomTile; + +public class PoolInteractor { + public static boolean getTileStatus(Room room, Entity entity, Position current, Position tmp, boolean isFinalMove) { + RoomTile fromTile = room.getMapping().getTile(current); + RoomTile toTile = room.getMapping().getTile(tmp); + + if (fromTile == null || toTile == null) { + return false; + } + + Item fromItem = fromTile.getHighestItem(); + Item toItem = toTile.getHighestItem(); + + // Only check these below if the user is in a pool room. + if (room.getModel().getName().startsWith("pool_") || + room.getModel().getName().equals("md_a")) { + if (fromItem != null) { + // Check if they have swimmers before trying to enter pool + if (fromItem.getDefinition().getSprite().equals("poolEnter") || + fromItem.getDefinition().getSprite().equals("poolExit")) { + return entity.getDetails().getPoolFigure().length() > 0; + } + } + + if (toItem != null) { + // Check if they have swimmers before trying to enter pool + if (toItem.getDefinition().getSprite().equals("poolEnter") || + toItem.getDefinition().getSprite().equals("poolExit")) { + return entity.getDetails().getPoolFigure().length() > 0; + } + + // Don't allow to "enter" the pool if they're already swimming + if (entity.getRoomUser().containsStatus(StatusType.SWIM) && + toItem.getDefinition().getSprite().equals("poolEnter")) { + return false; + } + + // Don't allow to "leave" the pool if they're not swimming + if (!entity.getRoomUser().containsStatus(StatusType.SWIM) && + toItem.getDefinition().getSprite().equals("poolExit")) { + return false; + } + } + } + + return true; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/pool/PoolLadderInteractor.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/pool/PoolLadderInteractor.java new file mode 100644 index 0000000..e04d1df --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/pool/PoolLadderInteractor.java @@ -0,0 +1,113 @@ +package org.alexdev.havana.game.item.interactors.types.pool; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.room.entities.RoomEntity; +import org.alexdev.havana.game.room.enums.StatusType; +import org.alexdev.havana.game.triggers.GenericTrigger; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.room.handlers.PoolHandler; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class PoolLadderInteractor extends GenericTrigger { + /*@Override + public void onEntityLeave(Entity entity, RoomEntity roomEntity, Item item, Position oldPosition) { + this.onEntityStep(entity, roomEntity, item, oldPosition); + + }*/ + + @Override + public void onEntityStep(Entity entity, RoomEntity roomEntity, Item item, Position oldPosition) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + if (item.getTeleportTo() == null) { + return; + } + + if (item.getDefinition().getSprite().equals("poolEnter")) { + if (roomEntity.containsStatus(StatusType.SWIM)) { + return; + } + + roomEntity.setStatus(StatusType.SWIM, ""); + } + + if (item.getDefinition().getSprite().equals("poolExit")) { + if (!roomEntity.containsStatus(StatusType.SWIM)) { + return; + } + + roomEntity.removeStatus(StatusType.SWIM); + } + + roomEntity.stopWalking(); + + //roomEntity.setWalkingAllowed(false); + + roomEntity.warp(item.getTeleportTo(), true, false); + + if (item.getSwimTo() != null) { + roomEntity.setEnableWalkingOnStop(true); + roomEntity.walkTo(item.getSwimTo().getX(), item.getSwimTo().getY()); + } + + item.showProgram(null); + + /* if (item.getRoom().getModel().equals("md_a")) { + item.showProgram(null); + } else { + */ // handle_pool_stair_splash + /*roomEntity.getRoom().send(new MessageComposer() { + @Override + public void compose(NettyResponse response) { + response.writeInt(0); + } + + @Override + public short getHeader() { + return 505; + } + });*/ + //} + + // Don't handle step event from RoomUser when changing paths + //if (customArgs.length > 0) { + // return; + //} + + /* + + Position warp = null; + Position goal = null; + + if (item.getPosition().getX() == 20 && item.getPosition().getY() == 28) { + warp = new Position(21, 28); + goal = new Position(22, 28); + } + + if (item.getPosition().getX() == 17 && item.getPosition().getY() == 21) { + warp = new Position(16, 22); + goal = new Position(16, 23); + } + + if (item.getPosition().getX() == 31 && item.getPosition().getY() == 10) { + warp = new Position(30, 11); + goal = new Position(30, 12); + } + + if ((item.getPosition().getX() == 11 && item.getPosition().getY() == 11) || + item.getPosition().getX() == 11 && item.getPosition().getY() == 10) { + warp = new Position(12, 11); + goal = new Position(13, 12); + } +*/ + + //if (warp != null) { + //PoolHandler.warpSwim(item, entity, warp, goal, false); + //} + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/pool/PoolLiftInteractor.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/pool/PoolLiftInteractor.java new file mode 100644 index 0000000..594ca0a --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/pool/PoolLiftInteractor.java @@ -0,0 +1,42 @@ +package org.alexdev.havana.game.item.interactors.types.pool; + +import org.alexdev.havana.dao.mysql.CurrencyDao; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.room.entities.RoomEntity; +import org.alexdev.havana.game.triggers.GenericTrigger; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.rooms.pool.JUMPINGPLACE_OK; +import org.alexdev.havana.messages.outgoing.user.currencies.TICKET_BALANCE; + +public class PoolLiftInteractor extends GenericTrigger { + + @Override + public void onEntityStop(Entity entity, RoomEntity roomEntity, Item item, boolean isRotation) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player)entity; + item.showProgram("close"); + + player.getRoomUser().setWalkingAllowed(false); + player.getRoomUser().getTimerManager().resetRoomTimer(120); // Only allow 120 seconds when diving, to stop the queue from piling up if someone goes AFK. + player.getRoomUser().setDiving(true); + + CurrencyDao.decreaseTickets(player.getDetails(), 1); + + player.send(new TICKET_BALANCE(player.getDetails().getTickets())); + player.send(new JUMPINGPLACE_OK()); + } + + @Override + public void onEntityLeave(Entity entity, RoomEntity roomEntity, Item item, Object... customArgs) { + if (roomEntity.isWalking()) { + return; + } + + item.showProgram("open"); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/pool/PoolQueueInteractor.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/pool/PoolQueueInteractor.java new file mode 100644 index 0000000..5460985 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/pool/PoolQueueInteractor.java @@ -0,0 +1,54 @@ +package org.alexdev.havana.game.item.interactors.types.pool; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.entities.RoomEntity; +import org.alexdev.havana.game.room.tasks.StatusTask; +import org.alexdev.havana.game.triggers.GenericTrigger; +import org.alexdev.havana.messages.outgoing.user.currencies.NO_TICKETS; + +public class PoolQueueInteractor extends GenericTrigger { + + @Override + public void onEntityStep(Entity entity, RoomEntity roomEntity, Item item, Position oldPosition) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player)entity; + + if (player.getDetails().getTickets() == 0 || player.getDetails().getPoolFigure().isEmpty()) { + oldPosition.setRotation(2); // Make user face this way, like the original Lido behaviour + player.getRoomUser().stopWalking(); + player.getRoomUser().warp(oldPosition, false, false); + + if (player.getDetails().getTickets() == 0) { + player.send(new NO_TICKETS()); + } + } + } + + @Override + public void onEntityStop(Entity entity, RoomEntity roomEntity, Item item, boolean isRotation) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player)entity; + + if (player.getDetails().getTickets() == 0 || player.getDetails().getPoolFigure().isEmpty()) { + return; + } + + // When they stop walking, check if the player is on a pool lido queue and walk to the next one + StatusTask.processPoolQueue(player); + } + + @Override + public void onEntityLeave(Entity entity, RoomEntity roomEntity, Item item, Object... customArgs) { + + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/wobblesquabble/WobbleSquabbleJoinQueue.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/wobblesquabble/WobbleSquabbleJoinQueue.java new file mode 100644 index 0000000..205c8f5 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/wobblesquabble/WobbleSquabbleJoinQueue.java @@ -0,0 +1,58 @@ +package org.alexdev.havana.game.item.interactors.types.wobblesquabble; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.games.wobblesquabble.WobbleSquabbleManager; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.interactors.InteractionType; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.entities.RoomEntity; +import org.alexdev.havana.game.room.enums.StatusType; +import org.alexdev.havana.game.room.mapping.RoomTile; +import org.alexdev.havana.game.triggers.GenericTrigger; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; + +public class WobbleSquabbleJoinQueue extends GenericTrigger { + public void onEntityStep(Entity entity, RoomEntity roomEntity, Item item, Position oldPosition) { + + } + + @Override + public void onEntityStop(Entity entity, RoomEntity roomEntity, Item item, boolean isRotation) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + if (roomEntity.getRoom().getTaskManager().hasTask(WobbleSquabbleManager.getInstance().getName())) { + return; + } + + Player player = (Player) entity; + + if (player.getDetails().getTickets() < WobbleSquabbleManager.WS_GAME_TICKET_COST) { + player.send(new ALERT("You need at least " + WobbleSquabbleManager.WS_GAME_TICKET_COST + " ticket(s) to play Wobble Squabble!")); + return; // Too poor! + } + + String[] teleportPositionData = item.getCurrentProgram().split(","); + + Position teleportPosition = new Position( + Integer.parseInt(teleportPositionData[0]), + Integer.parseInt(teleportPositionData[1]) + ); + + teleportPosition.setRotation(Integer.parseInt(teleportPositionData[2])); + RoomTile roomTile = roomEntity.getRoom().getMapping().getTile(teleportPosition); + + if (roomTile == null || roomTile.getEntities().size() > 0) { + return; + } + + player.getRoomUser().setTeleporting(false); + roomEntity.removeStatus(StatusType.SWIM); + roomEntity.warp(teleportPosition, true, false); + + InteractionType.WS_QUEUE_TILE.getTrigger().onEntityStop(entity, roomEntity, item, isRotation); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/wobblesquabble/WobbleSquabbleQueueTile.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/wobblesquabble/WobbleSquabbleQueueTile.java new file mode 100644 index 0000000..2cfe618 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/wobblesquabble/WobbleSquabbleQueueTile.java @@ -0,0 +1,29 @@ +package org.alexdev.havana.game.item.interactors.types.wobblesquabble; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.games.wobblesquabble.WobbleSquabbleManager; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.room.entities.RoomEntity; +import org.alexdev.havana.game.triggers.GenericTrigger; + +public class WobbleSquabbleQueueTile extends GenericTrigger { + public void onEntityStep(Entity entity, RoomEntity roomEntity, Item item, Position oldPosition) { + + } + + @Override + public void onEntityStop(Entity entity, RoomEntity roomEntity, Item item, boolean isRotation) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + if (roomEntity.getRoom().getTaskManager().hasTask(WobbleSquabbleManager.getInstance().getName())) { + return; + } + + roomEntity.setTeleporting(false); + roomEntity.walkTo(roomEntity.getPosition().getSquareInFront().getX(), roomEntity.getPosition().getSquareInFront().getY()); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/wobblesquabble/WobbleSquabbleTileStart.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/wobblesquabble/WobbleSquabbleTileStart.java new file mode 100644 index 0000000..99d8aba --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/wobblesquabble/WobbleSquabbleTileStart.java @@ -0,0 +1,81 @@ +package org.alexdev.havana.game.item.interactors.types.wobblesquabble; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.games.wobblesquabble.WobbleSquabbleGame; +import org.alexdev.havana.game.games.wobblesquabble.WobbleSquabbleManager; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.entities.RoomEntity; +import org.alexdev.havana.game.room.enums.StatusType; +import org.alexdev.havana.game.room.mapping.RoomTile; +import org.alexdev.havana.game.triggers.GenericTrigger; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; +import org.alexdev.havana.messages.outgoing.wobblesquabble.PT_PREPARE; + +import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.TimeUnit; + +public class WobbleSquabbleTileStart extends GenericTrigger { + + @Override + public void onEntityStop(Entity entity, RoomEntity roomEntity, Item item, boolean isRotation) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + if (roomEntity.getRoom().getTaskManager().hasTask(WobbleSquabbleManager.getInstance().getName())) { + return; + } + + String[] otherTilePlayer = item.getCurrentProgram().split(","); + + Position teleportPosition = new Position( + Integer.parseInt(otherTilePlayer[0]), + Integer.parseInt(otherTilePlayer[1]) + ); + + RoomTile roomTile = roomEntity.getRoom().getMapping().getTile(teleportPosition); + + if (roomTile == null || !(roomTile.getEntities().size() > 0)) { + return; + } + + entity.getRoomUser().setTeleporting(false); + + // Two players! :3 + WobbleSquabbleGame wsGame = new WobbleSquabbleGame((Player)entity, (Player) roomTile.getEntities().get(0)); + + for (int i = 0; i < 2; i++) { + Player player = wsGame.getPlayer(i).getPlayer(); + + if (player.getDetails().getTickets() < WobbleSquabbleManager.WS_GAME_TICKET_COST) { + player.send(new ALERT("You need at least " + WobbleSquabbleManager.WS_GAME_TICKET_COST + " ticket(s) to play Wobble Squabble!")); + + int newX = player.getRoomUser().getPosition().getX() + (ThreadLocalRandom.current().nextBoolean() ? -1 : 1); + int newY = player.getRoomUser().getPosition().getY(); + + Position position = new Position(newX, newY); + position.setRotation(player.getRoomUser().getPosition().getRotation()); + + player.getRoomUser().setStatus(StatusType.SWIM, ""); + player.getRoomUser().warp(position, true, false); + + return; // Too poor! + } + } + + + // Disable walking requests + wsGame.getPlayer(0).getPlayer().getRoomUser().setWalkingAllowed(false); + wsGame.getPlayer(1).getPlayer().getRoomUser().setWalkingAllowed(false); + + // Schedule worker task + String wsTaskName = WobbleSquabbleManager.getInstance().getName(); + roomEntity.getRoom().getTaskManager().scheduleTask(wsTaskName, wsGame, TimeUnit.SECONDS.toMillis(3),200, TimeUnit.MILLISECONDS); + + // Announce game starting + wsGame.send(new PT_PREPARE(wsGame.getPlayer(0), wsGame.getPlayer(1))); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/publicrooms/PublicItemData.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/publicrooms/PublicItemData.java new file mode 100644 index 0000000..8c2569f --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/publicrooms/PublicItemData.java @@ -0,0 +1,92 @@ +package org.alexdev.havana.game.item.publicrooms; + +public class PublicItemData { + private String id; + private String roomModel; + private String sprite; + private int x; + private int y; + private double z; + private int rotation; + private double topHeight; + private int length; + private int width; + private String behaviour; + private String currentProgram; + private String teleportTo; + private String swimTo; + + public PublicItemData(String id, String roomModel, String sprite, int x, int y, double z, int rotation, double topHeight, int length, int width, String behaviour, String currentProgram, + String teleportTo, String swimTo) { + this.id = id; + this.roomModel = roomModel; + this.sprite = sprite; + this.x = x; + this.y = y; + this.z = z; + this.rotation = rotation; + this.topHeight = topHeight; + this.length = length; + this.width = width; + this.behaviour = behaviour; + this.currentProgram = currentProgram; + this.teleportTo = teleportTo; + this.swimTo = swimTo; + } + + public String getId() { + return id; + } + + public String getRoomModel() { + return roomModel; + } + + public String getSprite() { + return sprite; + } + + public int getX() { + return x; + } + + public int getY() { + return y; + } + + public double getZ() { + return z; + } + + public int getRotation() { + return rotation; + } + + public int getLength() { + return length; + } + + public int getWidth() { + return width; + } + + public String getBehaviour() { + return behaviour; + } + + public String getCurrentProgram() { + return currentProgram; + } + + public double getTopHeight() { + return topHeight; + } + + public String[] getTeleportTo() { + return teleportTo != null ? teleportTo.split(" ") : null; + } + + public String[] getSwimTo() { + return swimTo != null ? swimTo.split(" ") : null; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/publicrooms/PublicItemParser.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/publicrooms/PublicItemParser.java new file mode 100644 index 0000000..e47424c --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/publicrooms/PublicItemParser.java @@ -0,0 +1,286 @@ +package org.alexdev.havana.game.item.publicrooms; + +import org.alexdev.havana.dao.mysql.PublicRoomsDao; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.ItemManager; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.item.interactors.InteractionType; +import org.alexdev.havana.game.pathfinder.Position; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ThreadLocalRandom; + +public class PublicItemParser { + public static List getPublicItems(int roomId, String modelId) { + List randomPublicId = new ArrayList<>(); + Map itemTriggerMap = new HashMap<>(); + + itemTriggerMap.put("poolEnter", InteractionType.POOL_LADDER); + itemTriggerMap.put("poolExit", InteractionType.POOL_LADDER);//.POOL_EXIT); + + itemTriggerMap.put("poolLift", InteractionType.POOL_LIFT); + itemTriggerMap.put("poolBooth", InteractionType.POOL_BOOTH); + itemTriggerMap.put("queue_tile2", InteractionType.POOL_QUEUE); + itemTriggerMap.put("s_queue_tile2", InteractionType.POOL_QUEUE); + itemTriggerMap.put("gamehall_chair_wood", InteractionType.GAME_TIC_TAC_TOE); + + if (modelId.equals("hallC")) { + itemTriggerMap.put("gamehall_chair_green", InteractionType.GAME_CHESS); + itemTriggerMap.put("chess_king_chair", InteractionType.GAME_CHESS); + } + + if (modelId.equals("hallB")) { + itemTriggerMap.put("gamehall_chair_green", InteractionType.GAME_BATTLESHIPS); + } + + if (modelId.equals("hallD")) { + itemTriggerMap.put("gamehall_chair_green", InteractionType.GAME_POKER); + } + + itemTriggerMap.put("wsJoinQueue", InteractionType.WS_JOIN_QUEUE); + itemTriggerMap.put("wsQueueTile", InteractionType.WS_QUEUE_TILE); + itemTriggerMap.put("wsTileStart", InteractionType.WS_TILE_START); + + int itemId = 0; + + List items = new ArrayList<>(); + List publicItemData = PublicRoomsDao.getPublicItemData(modelId); + + for (PublicItemData itemData : publicItemData) { + String customId = null; + + String alphabet = "abcdefghijlmnopqrstuvwyz"; + + while (customId == null) { + String temp = alphabet.charAt(ThreadLocalRandom.current().nextInt(0, alphabet.length())) + "" + ThreadLocalRandom.current().nextInt(0, 999); + + if (!randomPublicId.contains(temp)) { + randomPublicId.add(temp); + customId = temp; + } + } + + Item item = new Item(); + item.setVirtualId(itemId++); + item.setRoomId(roomId); + item.setCustomData(customId); + item.getDefinition().setSpriteId(-1); + item.getDefinition().setSprite(itemData.getSprite()); + item.getDefinition().setTopHeight(itemData.getTopHeight()); + item.getDefinition().setLength(itemData.getLength()); + item.getDefinition().setWidth(itemData.getWidth()); + item.setCurrentProgram(itemData.getCurrentProgram()); + + if (itemTriggerMap.containsKey(itemData.getSprite())) { + item.getDefinition().setInteractionType(itemTriggerMap.get(itemData.getSprite())); + } + + if (itemData.getBehaviour().length() > 0) { + for (String behaviour : itemData.getBehaviour().split(",")) { + item.getDefinition().addBehaviour(ItemBehaviour.valueOf(behaviour.toUpperCase())); + } + } + + if (item.getDefinition().getInteractionType() == null) { + if (item.getDefinition().hasBehaviour(ItemBehaviour.CAN_SIT_ON_TOP)) { + item.getDefinition().setInteractionType(InteractionType.CHAIR); + } else { + item.getDefinition().setInteractionType(InteractionType.DEFAULT); + } + } + + item.getPosition().setX(itemData.getX()); + item.getPosition().setY(itemData.getY()); + item.getPosition().setZ(itemData.getZ()); + item.getPosition().setRotation(itemData.getRotation()); + + if (!item.getDefinition().getSprite().contains("queue_tile2")) { + item.getDefinition().addBehaviour(ItemBehaviour.PUBLIC_SPACE_OBJECT); + } + + if (item.getDefinition().hasBehaviour(ItemBehaviour.PRIVATE_FURNITURE)) { + item.setDefinitionId(ItemManager.getInstance().getDefinitionBySprite(itemData.getSprite()).getId()); + } + + if (item.getDefinition().getSprite().equals("poolLift") || + item.getDefinition().getSprite().equals("poolBooth")) { + item.showProgram("open"); + } + + if (itemData.getTeleportTo() != null) { + int X = Integer.parseInt(itemData.getTeleportTo()[0]); + int Y = Integer.parseInt(itemData.getTeleportTo()[1]); + int Z = Integer.parseInt(itemData.getTeleportTo()[2]); + + var position = new Position(X, Y, Z); + position.setBodyRotation(Integer.parseInt(itemData.getTeleportTo()[3])); + position.setHeadRotation(Integer.parseInt(itemData.getTeleportTo()[3])); + + item.setTeleportTo(position); + } + + if (itemData.getSwimTo() != null) { + int X = Integer.parseInt(itemData.getSwimTo()[0]); + int Y = Integer.parseInt(itemData.getSwimTo()[1]); + int Z = Integer.parseInt(itemData.getSwimTo()[2]); + + var position = new Position(X, Y, Z); + position.setBodyRotation(Integer.parseInt(itemData.getSwimTo()[3])); + position.setHeadRotation(Integer.parseInt(itemData.getSwimTo()[3])); + + item.setSwimTo(position); + } + + items.add(item); + } + + /*File file = Paths.get("tools", "gamedata", "publicrooms", modelId + ".dat").toFile(); + + if (!file.exists()) { + return items; + } + + int id = Integer.MAX_VALUE; + + try (BufferedReader br = new BufferedReader(new FileReader(file))) { + String line; + + while ((line = br.readLine()) != null) { + String[] data = line.split(" "); + + Item item = new Item(); + item.setVirtualId(id--); + item.getDefinition().addBehaviour(ItemBehaviour.PUBLIC_SPACE_OBJECT); + item.getDefinition().setSprite(data[1]); + item.getDefinition().setTopHeight(ItemDefinition.DEFAULT_TOP_HEIGHT); + + item.setCustomData(data[0]); + item.getPosition().setX(Integer.parseInt(data[2])); + item.getPosition().setY(Integer.parseInt(data[3])); + item.getPosition().setZ(Integer.parseInt(data[4])); + item.getPosition().setRotation(Integer.parseInt(data[5])); + + if (data.length >= 7) { + String customData = data[6]; + + if (customData.equals("2")) { + item.getDefinition().addBehaviour(ItemBehaviour.EXTRA_PARAMETER); + } else { + item.setCurrentProgram(customData); + } + } + + + // Set item triggers for public room furniture + if (itemTriggerMap.containsKey(item.getDefinition().getSprite())) { + item.setItemTrigger(itemTriggerMap.get(item.getDefinition().getSprite())); + } + + if (item.getDefinition().getSprite().contains("chair") + || item.getDefinition().getSprite().contains("bench") + || item.getDefinition().getSprite().contains("seat") + || item.getDefinition().getSprite().contains("stool") + || item.getDefinition().getSprite().contains("sofa") + || item.getDefinition().getSprite().equals("l") + || item.getDefinition().getSprite().equals("m") + || item.getDefinition().getSprite().equals("k") + || item.getDefinition().getSprite().equals("shift1") + || item.getDefinition().getSprite().equals("stone") + || item.getDefinition().getSprite().startsWith("rooftop_flatcurb")) { + item.getDefinition().addBehaviour(ItemBehaviour.CAN_SIT_ON_TOP); + item.getDefinition().removeBehaviour(ItemBehaviour.CAN_STAND_ON_TOP); + item.getDefinition().setTopHeight(1.0); + + if (item.getItemTrigger() == null) { + item.setItemTrigger(ItemBehaviour.CAN_SIT_ON_TOP.getTrigger()); + } + + } else { + item.getDefinition().removeBehaviour(ItemBehaviour.CAN_SIT_ON_TOP); + item.getDefinition().removeBehaviour(ItemBehaviour.CAN_STAND_ON_TOP); + } + + if (item.getDefinition().getSprite().equals("poolEnter") + || item.getDefinition().getSprite().equals("poolExit") + || item.getDefinition().getSprite().equals("poolLift") + || item.getDefinition().getSprite().equals("poolBooth") + || item.getDefinition().getSprite().equals("queue_tile2") + || item.getDefinition().getSprite().equals("stair")) { + //item.getBehaviour().setCanSitOnTop(false); + //item.getBehaviour().setCanStandOnTop(true); + item.getDefinition().removeBehaviour(ItemBehaviour.CAN_SIT_ON_TOP); + item.getDefinition().addBehaviour(ItemBehaviour.CAN_STAND_ON_TOP); + } + + if (item.getDefinition().getSprite().equals("queue_tile2")) { + item.getDefinition().removeBehaviour(ItemBehaviour.PUBLIC_SPACE_OBJECT); + } + + if (item.getDefinition().getSprite().equals("poolLift") || + item.getDefinition().getSprite().equals("poolBooth")) { + item.setCurrentProgramValue("open"); + } + + // Custom heights for these furniture + if (item.getDefinition().getSprite().equals("picnic_dummychair4")) { + item.getDefinition().setTopHeight(4.0); + } + + if (item.getDefinition().getSprite().equals("picnic_dummychair6")) { + item.getDefinition().setTopHeight(7.0); + } + + // This is the only public item I'm aware of that has a length of 2 + if (item.getDefinition().getSprite().equals("hw_shelf")) { + item.getDefinition().setLength(2); + } + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + String alphabet = "abcdefghijlmnopqrstuvwyz"; + + item.getDefinition().getBehaviourList().remove(ItemBehaviour.PUBLIC_SPACE_OBJECT); + String[] behaviourList = new String[item.getDefinition().getBehaviourList().size()]; + + for (int i = 0; i < item.getDefinition().getBehaviourList().size(); i++) { + behaviourList[i] = item.getDefinition().getBehaviourList().get(i).name().toLowerCase(); + } + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO publicrooms (id, room_model, sprite, x, y, z, rotation, top_height, length, width, behaviour, current_program) " + + "VALUES (?, ?, ?, ?, ?, ? ,?, ?, ? ,? ,? ,?)", sqlConnection); + preparedStatement.setString(1, alphabet.charAt(ThreadLocalRandom.current().nextInt(0, alphabet.length())) + "" + ThreadLocalRandom.current().nextInt(0, 999)); + preparedStatement.setString(2, modelId); + preparedStatement.setString(3, item.getDefinition().getSprite()); + preparedStatement.setInt(4, item.getPosition().getX()); + preparedStatement.setInt(5, item.getPosition().getY()); + preparedStatement.setDouble(6, item.getPosition().getZ()); + preparedStatement.setInt(7, item.getPosition().getRotation()); + preparedStatement.setDouble(8, item.getDefinition().getTopHeight()); + preparedStatement.setInt(9, item.getDefinition().getWidth()); + preparedStatement.setInt(10, item.getDefinition().getLength()); + preparedStatement.setString(11, String.join(",", behaviourList)); + preparedStatement.setString(12, item.getCurrentProgram() != null ? item.getCurrentProgram() : ""); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + items.add(item); + } + } catch (IOException e) { + return items; + }*/ + + return items; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/roller/EntityRollingAnalysis.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/roller/EntityRollingAnalysis.java new file mode 100644 index 0000000..6e39f25 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/roller/EntityRollingAnalysis.java @@ -0,0 +1,202 @@ +package org.alexdev.havana.game.item.roller; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.enums.StatusType; +import org.alexdev.havana.game.room.mapping.RoomTile; + +public class EntityRollingAnalysis implements RollingAnalysis { + @Override + public Position canRoll(Entity entity, Item roller, Room room) { + if (entity.getRoomUser().getTile() == null) { + return null; + } + + if (entity.getRoomUser().isWalking()) { + return null; // Don't roll user if they're walking. + } + + if (entity.getRoomUser().getPosition().getZ() < roller.getPosition().getZ()) { + return null; // Don't roll user if they're below the roller + } + + if (!entity.getRoomUser().getPosition().equals(roller.getPosition())) { + return null; // Don't roll users who aren't on this tile. + } + + if (!entity.getRoomUser().getTile().hasWalkableFurni(entity)) { + return null; // Don't roll user if they are stuck, let them be unstuck... + } + + Position front = roller.getPosition().getSquareInFront(); + RoomTile frontTile = room.getMapping().getTile(front); + + if (frontTile == null) { + return null; + } + + if (!frontTile.hasWalkableFurni(entity)) { + return null; + } + + // Check all entities in the room + for (Entity e : room.getEntities()) { + if (e.getRoomUser().getRoom() == null) { + continue; + } + + // Don't roll if an entity is going to walk into the this entity + if (e.getRoomUser().getNextPosition() != null) { + if (e.getRoomUser().getNextPosition().equals(front)) { + return null; + } + } + + // Ignore people who are walking + if (e.getRoomUser().isWalking()) { + continue; + } + + // Don't roll if there's an entity rolling into you + if (e.getRoomUser().getRollingData() != null) { + if (e.getRoomUser().getRollingData().getNextPosition().equals(front)) { + return null; + } + } + + if (e.getRoomUser().getPosition().equals(front)) { + return null; + } + } + + // Check all rolling items in the room + for (Item floorItem : room.getItemManager().getFloorItems()) { + if (floorItem.getRollingData() != null) { + if (floorItem.getPosition().equals(roller.getPosition())) { + continue; + } + + // Don't roll if there's another item that's going to roll into this entity + if (floorItem.getRollingData().getNextPosition().equals(front)) { + return null; + } + } + } + + double nextHeight = entity.getRoomUser().getPosition().getZ(); + boolean subtractRollerHeight = true; + + if (frontTile.getHighestItem() != null) { + Item frontRoller = null; + + for (Item frontItem : frontTile.getItems()) { + if (!frontItem.hasBehaviour(ItemBehaviour.ROLLER)) { + continue; + } + + frontRoller = frontItem; + } + + if (frontRoller != null) { + subtractRollerHeight = false; // Since we know there's a roller, don't subtract the height. + + if (frontRoller.getPosition().getZ() != roller.getPosition().getZ()) { + if (Math.abs(frontRoller.getPosition().getZ() - roller.getPosition().getZ()) > 0.1) { + return null; // Don't roll if the height of the roller is different by >0.1 + } + } + + for (Item frontItem : frontTile.getItems()) { + if (frontItem.getPosition().getZ() < frontRoller.getPosition().getZ()) { + continue; + } + + // This is because the ItemRollingAnalysis has setHighestItem in nextTile in doRoll which blocks this + if (entity.getRoomUser().getCurrentItem() != null + && entity.getRoomUser().getCurrentItem().getVirtualId() == frontItem.getVirtualId()) { + continue; + } + + if (frontItem.hasBehaviour(ItemBehaviour.ROLLER)) { + Position frontPosition = frontRoller.getPosition().getSquareInFront(); + + // Don't roll an item into the next roller, if the next roller is facing towards the roller + // it just rolled from, and the next roller has an item on it. + if (frontPosition.equals(entity.getRoomUser().getPosition())) { + if (frontTile.getItemsAbove(frontRoller).size() > 0 || frontTile.getEntireEntities().size() > 0) { + return null; + + } + } + } else { + return null; + } + } + } else { + if (!RoomTile.isValidTile(room, entity, frontTile.getPosition())) { + return null; + } + } + } + + if (subtractRollerHeight) { + nextHeight -= roller.getDefinition().getTopHeight(); + } + + + if (entity.getRoomUser().getCurrentItem() != null && !entity.getRoomUser().getCurrentItem().hasBehaviour(ItemBehaviour.ROLLER)) { + Item currentItem = entity.getRoomUser().getCurrentItem(); + + // If we can roll but our item can't, don't roll! + if (new ItemRollingAnalysis().canRoll(currentItem, roller, room) == null) { + return null; + } + } + + Position nextPosition = new Position(front.getX(), front.getY(), nextHeight); + entity.getRoomUser().setRollingData(new RollingData(entity, roller, entity.getRoomUser().getPosition().copy(), nextPosition)); + return nextPosition; + } + @Override + public void doRoll(Entity entity, Item roller, Room room, Position fromPosition, Position nextPosition) { + RoomTile previousTile = room.getMapping().getTile(fromPosition); + RoomTile nextTile = room.getMapping().getTile(nextPosition); + + // Temporary fix if the user walks on an item and their height gets put up. + if (entity.getRoomUser().getCurrentItem() != null && entity.getRoomUser().getCurrentItem().hasBehaviour(ItemBehaviour.ROLLER)) { + if (Math.abs(entity.getRoomUser().getPosition().getZ() - roller.getPosition().getZ()) >= 0.1) { + if (nextTile.getHighestItem() != null && nextTile.getHighestItem().hasBehaviour(ItemBehaviour.ROLLER)) { + nextPosition.setZ(roller.getPosition().getZ() + roller.getDefinition().getTopHeight()); + } + } + } + + // The next height but what the client sees. + double displayNextHeight = nextPosition.getZ(); + + if (entity.getRoomUser().isSittingOnGround()) { + displayNextHeight -= 0.5; // Take away sit offset when sitting on ground, because yeah, weird stuff. + } + + // Fix bounce for sitting on chairs if the chair top height is higher 1.0 + if (entity.getRoomUser().containsStatus(StatusType.SIT)) { + double sitHeight = Double.parseDouble(entity.getRoomUser().getStatus(StatusType.SIT).getValue()); + + if (sitHeight > 1.0) { + displayNextHeight += (sitHeight - 1.0); // Add new height offset found. + } + } + + entity.getRoomUser().getRollingData().setDisplayHeight(displayNextHeight);//setZ(displayNextHeight); + + entity.getRoomUser().getPosition().setX(nextPosition.getX()); + entity.getRoomUser().getPosition().setY(nextPosition.getY()); + entity.getRoomUser().getPosition().setZ(nextPosition.getZ()); + + previousTile.removeEntity(entity); + nextTile.addEntity(entity); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/roller/ItemRollingAnalysis.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/roller/ItemRollingAnalysis.java new file mode 100644 index 0000000..a7ca06b --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/roller/ItemRollingAnalysis.java @@ -0,0 +1,175 @@ +package org.alexdev.havana.game.item.roller; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.mapping.RoomTile; +import org.alexdev.havana.util.config.GameConfiguration; + +public class ItemRollingAnalysis implements RollingAnalysis { + @Override + public Position canRoll(Item item, Item roller, Room room) { + if (roller == null || roller.getRoom() == null || roller.getTile() == null) { + return null; + } + + if (item.getVirtualId() == roller.getVirtualId()) { + return null; + } + + if (item.getPosition().getZ() < roller.getPosition().getZ()) { + return null; + } + + Position front = roller.getPosition().getSquareInFront(); + RoomTile frontTile = room.getMapping().getTile(front); + + if (frontTile == null) { + return null; + } + + // Check all entities in the room + for (Entity e : room.getEntities()) { + if (e.getRoomUser().getRoom() == null) { + continue; + } + + // Don't roll if an entity is going to walk into the furniture + if (e.getRoomUser().getNextPosition() != null) { + if (e.getRoomUser().getNextPosition().equals(front)) { + return null; + } + } + + // Ignore people who are walking + if (e.getRoomUser().isWalking()) { + continue; + } + + // Don't roll if there's an entity rolling into you + if (e.getRoomUser().getRollingData() != null) { + if (e.getRoomUser().getRollingData().getNextPosition().equals(front)) { + return null; + } + } + + if (e.getRoomUser().getPosition().equals(front)) { + return null; + } + } + + // Check all rolling items in the room + for (Item floorItem : room.getItemManager().getFloorItems()) { + if (floorItem.getRollingData() != null) { + if (floorItem.getPosition().equals(roller.getPosition())) { + continue; + } + + // Don't roll if there's another item that's going to roll into this item + if (floorItem.getRollingData().getNextPosition().equals(front)) { + return null; + } + } + } + + double nextHeight = item.getPosition().getZ();//this.room.getModel().getTileHeight(roller.getPosition().getX(), roller.getPosition().getY()); + boolean subtractRollerHeight = true; + + if (frontTile.getHighestItem() != null) { + Item frontRoller = null; + + for (Item frontItem : frontTile.getItems()) { + if (!frontItem.hasBehaviour(ItemBehaviour.ROLLER)) { + continue; + } + + frontRoller = frontItem; + } + + if (frontRoller != null) { + subtractRollerHeight = false; + + if (frontRoller.getPosition().getZ() != roller.getPosition().getZ()) { + if (Math.abs(frontRoller.getPosition().getZ() - roller.getPosition().getZ()) > 0.1) { + return null; // Don't roll if the height of the roller is different by >0.1 + } + } + + for (Item frontItem : frontTile.getItems()) { + if (frontItem.getPosition().getZ() < frontRoller.getPosition().getZ()) { + continue; + } + + if (frontItem.getDatabaseId() == item.getDatabaseId()) { + continue; + } + + if (frontItem.hasBehaviour(ItemBehaviour.ROLLER)) { + Position frontPosition = frontRoller.getPosition().getSquareInFront(); + + // Don't roll an item into the next roller, if the next roller is facing towards the roller + // it just rolled from, and the next roller has an item on it. + if (frontPosition.equals(item.getPosition())) { + if (frontTile.getItemsAbove(frontRoller).size() > 0 || frontTile.getEntireEntities().size() > 0) { + return null; + + } + } + } + } + + Item highestNextItem = frontTile.getHighestItem(); + + if (!highestNextItem.hasBehaviour(ItemBehaviour.ROLLER) && highestNextItem.getDatabaseId() != item.getDatabaseId()) { + if (highestNextItem.hasBehaviour(ItemBehaviour.CAN_STACK_ON_TOP) + && item.getTile().getEntireEntities().isEmpty()) { + + for (Item frontItem : frontRoller.getTile().getItems()) { + frontItem.setCurrentRollBlocked(true); + } + + nextHeight = (highestNextItem.getPosition().getZ() + highestNextItem.getDefinition().getTopHeight()) + item.getPosition().getZ() - frontRoller.getDefinition().getTopHeight(); + } else { + return null; + } + } + } else { + if (!RoomTile.isValidTile(room, null, frontTile.getPosition())) { + return null; + } + } + } + + if (subtractRollerHeight) { + nextHeight -= roller.getDefinition().getTopHeight(); + } + + if (nextHeight > GameConfiguration.getInstance().getInteger("stack.height.limit")) { + nextHeight = GameConfiguration.getInstance().getInteger("stack.height.limit"); + } + + Position nextPosition = new Position(front.getX(), front.getY(), nextHeight); + item.setRollingData(new RollingData(item, roller, item.getPosition().copy(), nextPosition)); + return nextPosition; + } + + @Override + public void doRoll(Item item, Item roller, Room room, Position fromPosition, Position nextPosition) { + /*RoomTile roomTile; + + roomTile = room.getMapping().getTile(nextPosition); + roomTile.setDisableWalking(true); + + roomTile = room.getMapping().getTile(fromPosition); + roomTile.setDisableWalking(true);*/ + + //room.send(new SLIDE_OBJECT(item, nextPosition, roller.getVirtualId(), nextPosition.getZ())); + + item.getPosition().setX(nextPosition.getX()); + item.getPosition().setY(nextPosition.getY()); + item.getPosition().setZ(nextPosition.getZ()); + //item.setRollingData(new RollingData(item, roller, fromPosition, nextPosition)); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/roller/RollerEntry.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/roller/RollerEntry.java new file mode 100644 index 0000000..4016a7c --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/roller/RollerEntry.java @@ -0,0 +1,35 @@ +package org.alexdev.havana.game.item.roller; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.item.Item; + +import java.util.ArrayList; +import java.util.List; + +public class RollerEntry { + private Item roller; + private List rollingItems; + private Entity rollingEntity; + + public RollerEntry(Item roller) { + this.roller = roller; + this.rollingItems = new ArrayList<>(); + this.rollingEntity = null; + } + + public Item getRoller() { + return roller; + } + + public List getRollingItems() { + return rollingItems; + } + + public Entity getRollingEntity() { + return rollingEntity; + } + + public void setRollingEntity(Entity rollingEntity) { + this.rollingEntity = rollingEntity; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/roller/RollingAnalysis.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/roller/RollingAnalysis.java new file mode 100644 index 0000000..79c8f5e --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/roller/RollingAnalysis.java @@ -0,0 +1,10 @@ +package org.alexdev.havana.game.item.roller; + +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.room.Room; + +public interface RollingAnalysis { + public Position canRoll(T rollingType, Item roller, Room room); + public void doRoll(T rollingType, Item roller, Room room, Position fromPosition, Position nextPosition); +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/roller/RollingData.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/roller/RollingData.java new file mode 100644 index 0000000..4ad356c --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/roller/RollingData.java @@ -0,0 +1,67 @@ +package org.alexdev.havana.game.item.roller; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.pathfinder.Position; + +public class RollingData { + private Item roller; + private Item item; + private Entity entity; + private Position fromPosition; + private Position nextPosition; + private double displayHeight; + private double heightUpdate; + + public RollingData(Entity entity, Item roller, Position fromPosition, Position nextPosition) { + this.entity = entity; + this.roller = roller; + this.heightUpdate = -1; + this.fromPosition = fromPosition; + this.nextPosition = nextPosition; + } + + public RollingData(Item item, Item roller, Position fromPosition, Position nextPosition) { + this.item = item; + this.roller = roller; + this.heightUpdate = -1; + this.fromPosition = fromPosition; + this.nextPosition = nextPosition; + } + + public Entity getEntity() { + return entity; + } + + public Item getItem() { + return item; + } + + public Item getRoller() { + return roller; + } + + public double getHeightUpdate() { + return heightUpdate; + } + + public void setHeightUpdate(double heightUpdate) { + this.heightUpdate = heightUpdate; + } + + public Position getNextPosition() { + return nextPosition; + } + + public Position getFromPosition() { + return fromPosition; + } + + public double getDisplayHeight() { + return displayHeight; + } + + public void setDisplayHeight(double displayHeight) { + this.displayHeight = displayHeight; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/messenger/Messenger.java b/Havana-Server/src/main/java/org/alexdev/havana/game/messenger/Messenger.java new file mode 100644 index 0000000..cd3eabe --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/messenger/Messenger.java @@ -0,0 +1,328 @@ +package org.alexdev.havana.game.messenger; + +import org.alexdev.havana.dao.mysql.MessengerDao; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.messenger.ADD_BUDDY; +import org.alexdev.havana.messages.outgoing.messenger.FRIENDS_UPDATE; +import org.alexdev.havana.messages.outgoing.messenger.FRIEND_REQUEST; +import org.alexdev.havana.util.config.GameConfiguration; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; + +public class Messenger { + private final boolean officialStatusUpdateSpeed; + private Player player; + private Map friends; + private Map requests; + private Map offlineMessages; + + private List messengerCategories; + + private BlockingQueue friendsUpdate; + private int friendsLimit; + private boolean allowsFriendRequests; + private MessengerUser user; + private Room followed; + + public Messenger(Player player) { + this(player.getDetails()); + this.player = player; + } + + public Messenger(PlayerDetails details) { + this.officialStatusUpdateSpeed = GameConfiguration.getInstance().getBoolean("messenger.enable.official.update.speed"); + this.user = new MessengerUser(details); + this.friends = MessengerDao.getFriends(details.getId()); + this.requests = MessengerDao.getRequests(details.getId()); + this.offlineMessages = MessengerDao.getUnreadMessages(details.getId()); + this.allowsFriendRequests = details.isAllowFriendRequests(); + + this.messengerCategories = MessengerDao.getCategories(details.getId()); + this.friendsUpdate = new LinkedBlockingQueue<>(); + + if (details.getRank().getRankId() <= 1) { + if (details.hasClubSubscription()) { + this.friendsLimit = GameConfiguration.getInstance().getInteger("messenger.max.friends.club"); + } else { + this.friendsLimit = GameConfiguration.getInstance().getInteger("messenger.max.friends.nonclub"); + } + } else { + this.friendsLimit = Integer.MAX_VALUE; + } + } + + /** + * Sends the status update when a friend enters or leaves a room, logs in or disconnects. + */ + public void sendStatusUpdate() { + if (this.user == null) { + return; + } + var onlineFriends = this.getOnlineFriends(); + + /*for (var user : this.friends.values()) { + int userId = user.getUserId(); + + Player friend = PlayerManager.getInstance().getPlayerById(userId); + + if (friend != null && friend.getMessenger() != null) { + var youAsFriend = ; + + if (youAsFriend != null) { + friend.getMessenger().queueFriendUpdate(youAsFriend); + } + } + }*/ + + for (Player friend : onlineFriends) { + friend.getMessenger().queueFriendUpdate(friend.getMessenger().getFriend(this.user.getUserId())); + } + + if (!this.officialStatusUpdateSpeed) { + for (Player friend : onlineFriends) { + friend.send(new FRIENDS_UPDATE(friend, friend.getMessenger())); + } + } + } + + /*** + * Get the list of online friends. + * + * @return the list of online friends + */ + private List getOnlineFriends() { + List friends = new ArrayList<>(); + + for (var user : this.friends.values()) { + int userId = user.getUserId(); + + Player friend = PlayerManager.getInstance().getPlayerById(userId); + + if (friend != null && friend.getMessenger() != null) { + var youAsFriend = friend.getMessenger().getFriend(this.user.getUserId()); + + if (youAsFriend != null) { + friends.add(friend); + } + } + } + + return friends; + } + + /** + * Get if the user already has a request from this user id. + * + * @param userId the user id to check for + * @return true, if successful + */ + public boolean hasRequest(int userId) { + return this.getRequest(userId) != null; + } + + /** + * Get if the user already has a friend with this user id. + * + * @param userId the user id to check for + * @return true, if successful + */ + public boolean hasFriend(int userId) { + return this.getFriend(userId) != null; + } + + /** + * Method to add new friend. + * + * @param newBuddy the new friend to add + */ + public void addFriend(MessengerUser newBuddy) { + if (this.hasFriend(newBuddy.getUserId())) { + return; + } + + MessengerDao.removeRequest(newBuddy.getUserId(), this.user.getUserId()); + + MessengerDao.newFriend(player.getDetails().getId(), newBuddy.getUserId()); + MessengerDao.newFriend(newBuddy.getUserId(), player.getDetails().getId()); + + this.player.send(new ADD_BUDDY(player, new MessengerUser(PlayerDao.getDetails(newBuddy.getUserId())))); + this.requests.remove(newBuddy.getUserId()); + this.friends.put(newBuddy.getUserId(), newBuddy); + + Player friend = PlayerManager.getInstance().getPlayerById(newBuddy.getUserId()); + + if (friend != null) { + MessengerUser meAsBuddy = player.getMessenger().getMessengerUser(); + friend.getMessenger().getFriends().put(meAsBuddy.getUserId(), meAsBuddy); + friend.send(new ADD_BUDDY(friend, meAsBuddy)); + } + } + + /** + * Add request method. + * + * @param requester method to add request + */ + public void addRequest(MessengerUser requester) { + MessengerDao.newRequest(requester.getUserId(), this.user.getUserId()); + this.requests.put(requester.getUserId(), requester); + + Player requested = PlayerManager.getInstance().getPlayerById(this.user.getUserId()); + + if (requested != null) { + requested.send(new FRIEND_REQUEST(requester)); + } + } + + /** + * Decline request by friend. + * + * @param requester the requester + */ + public void declineRequest(MessengerUser requester) { + MessengerDao.removeRequest(requester.getUserId(), this.user.getUserId()); + this.requests.remove(requester.getUserId()); + } + + /** + * Decline all friend requests. + */ + public void declineAllRequests() { + MessengerDao.removeAllRequests(this.user.getUserId()); + this.requests.clear(); + } + + /** + * Get if the friend limit is reached. Limit is dependent upon club subscription + * + * @return true, if limit reached + */ + public boolean isFriendsLimitReached() { + return this.friends.size() >= this.getFriendsLimit(); + } + + /** + * Get the friends list amount + * @return + */ + public int getFriendsLimit() { + return this.friendsLimit; + } + + /** + * Get the messenger user instance with this user id. + * + * @param userId the user id to check for + * @return the messenger user instance + */ + public MessengerUser getRequest(int userId) { + return this.requests.get(userId); + } + + /** + * Get the messenger user instance with this user id. + * + * @param userId the user to check for + * @return the messenger user instance + */ + public MessengerUser getFriend(int userId) { + return this.friends.get(userId); + } + + /** + * Remove friend from friends list + * + * @param userId + * @return boolean indicating success + */ + public boolean removeFriend(int userId) { + this.friends.remove(userId); + + MessengerDao.removeFriend(userId, this.user.getUserId()); + MessengerDao.removeFriend(this.user.getUserId(), userId); + + return true; + } + + /** + * Get the list of offline messages. + * + * @return the list of offline messages + */ + public Map getOfflineMessages() { + return offlineMessages; + } + + /** + * Get the list of friends. + * + * @return the list of friends + */ + public Map getFriends() { + return this.friends; + } + + /** + * Get the messenger user instance of this person + * @return the instance + */ + public MessengerUser getMessengerUser() { + return this.user; + } + + /** + * Get the list of friends. + * + * @return the list of friends + */ + public List getRequests() { + return new ArrayList<>(this.requests.values()); + } + + /** + * Get on whether the user allows friend requests + * @return true, if scuessful + */ + public boolean allowsFriendRequests() { + return allowsFriendRequests; + } + + /** + * Gets the queue for the next friends came online update. + * + * @return the queue + */ + public BlockingQueue getFriendsUpdate() { + return friendsUpdate; + } + + /** + * Adds a user friend left to the events update console queue, removes any previous mentions of this friend. + * + * @param friend the friend to update + */ + public void queueFriendUpdate(MessengerUser friend) { + this.friendsUpdate.removeIf(f -> f.getUserId() == friend.getUserId()); + this.friendsUpdate.add(friend); + } + + public List getCategories() { + return messengerCategories; + } + + public void hasFollowed(Room friendRoom) { + this.followed = friendRoom; + } + + public Room getFollowed() { + return followed; + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/messenger/MessengerCategory.java b/Havana-Server/src/main/java/org/alexdev/havana/game/messenger/MessengerCategory.java new file mode 100644 index 0000000..6d1dbd1 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/messenger/MessengerCategory.java @@ -0,0 +1,25 @@ +package org.alexdev.havana.game.messenger; + +public class MessengerCategory { + private int id; + private int userId; + private String name; + + public MessengerCategory(int id, int userId, String name) { + this.id = id; + this.userId = userId; + this.name = name; + } + + public int getId() { + return id; + } + + public int getUserId() { + return userId; + } + + public String getName() { + return name; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/messenger/MessengerError.java b/Havana-Server/src/main/java/org/alexdev/havana/game/messenger/MessengerError.java new file mode 100644 index 0000000..967c0ef --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/messenger/MessengerError.java @@ -0,0 +1,33 @@ +package org.alexdev.havana.game.messenger; + +public class MessengerError { + private String causer; + private final MessengerErrorType error; + private final MessengerErrorReason reason; + + public MessengerError(MessengerErrorType error) { + this.error = error; + this.reason = null; + } + + public MessengerError(MessengerErrorType error, MessengerErrorReason reason) { + this.error = error; + this.reason = reason; + } + + public String getCauser() { + return causer; + } + + public void setCauser(String causer) { + this.causer = causer; + } + + public MessengerErrorType getErrorType() { + return error; + } + + public MessengerErrorReason getErrorReason() { + return reason; + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/messenger/MessengerErrorReason.java b/Havana-Server/src/main/java/org/alexdev/havana/game/messenger/MessengerErrorReason.java new file mode 100644 index 0000000..b0e0a8d --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/messenger/MessengerErrorReason.java @@ -0,0 +1,17 @@ +package org.alexdev.havana.game.messenger; + +public enum MessengerErrorReason { + FRIENDLIST_FULL_PENDING_FRIEND(1), + SENDER_FRIENDLIST_FULL(2), + CONCURRENCY(42); // Requests refresh user console in client + + private final int reasonCode; + + MessengerErrorReason(int reason) { + this.reasonCode = reason; + } + + public int getReasonCode() { + return this.reasonCode; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/messenger/MessengerErrorType.java b/Havana-Server/src/main/java/org/alexdev/havana/game/messenger/MessengerErrorType.java new file mode 100644 index 0000000..71b123b --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/messenger/MessengerErrorType.java @@ -0,0 +1,20 @@ +package org.alexdev.havana.game.messenger; + +public enum MessengerErrorType { + TARGET_FRIEND_LIST_FULL(2), + TARGET_DOES_NOT_ACCEPT(3), + FRIEND_REQUEST_NOT_FOUND(4), + BUDDYREMOVE_ERROR(37), + FRIENDLIST_FULL(39), + CONCURRENCY_ERROR(42); + + private final int errorCode; + + MessengerErrorType(int errorCode) { + this.errorCode = errorCode; + } + + public int getErrorCode() { + return this.errorCode; + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/messenger/MessengerManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/messenger/MessengerManager.java new file mode 100644 index 0000000..751bc05 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/messenger/MessengerManager.java @@ -0,0 +1,43 @@ +package org.alexdev.havana.game.messenger; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.PlayerManager; + +public class MessengerManager { + private static MessengerManager instance; + + public Messenger getMessengerData(int userId) { + Player player = PlayerManager.getInstance().getPlayerById(userId); + + if (player != null) { + return player.getMessenger(); + } + + return new Messenger(PlayerManager.getInstance().getPlayerData(userId)); + } + + public Messenger getMessengerData(String username) { + Player player = PlayerManager.getInstance().getPlayerByName(username); + + if (player != null) { + return player.getMessenger(); + } + + PlayerDetails details = PlayerManager.getInstance().getPlayerData(username); + + if (details == null) { + return null; + } + + return new Messenger(details); + } + + public static MessengerManager getInstance() { + if (instance == null) { + instance = new MessengerManager(); + } + + return instance; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/messenger/MessengerMessage.java b/Havana-Server/src/main/java/org/alexdev/havana/game/messenger/MessengerMessage.java new file mode 100644 index 0000000..ee038e9 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/messenger/MessengerMessage.java @@ -0,0 +1,41 @@ +package org.alexdev.havana.game.messenger; + +public class MessengerMessage { + private int id; + private int toId; + private int fromId; + private long timeSet; + private String message; + + public MessengerMessage(int id, int toId, int fromId, long timeSet, String message) { + this.id = id; + this.toId = toId; + this.fromId = fromId; + this.timeSet = timeSet; + this.message = message; + } + + public int getId() { + return id; + } + + public int getToId() { + return toId; + } + + public int getFromId() { + return fromId; + } + + public long getTimeSet() { + return timeSet; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/messenger/MessengerUser.java b/Havana-Server/src/main/java/org/alexdev/havana/game/messenger/MessengerUser.java new file mode 100644 index 0000000..af08931 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/messenger/MessengerUser.java @@ -0,0 +1,194 @@ +package org.alexdev.havana.game.messenger; + +import org.alexdev.havana.game.navigator.NavigatorManager; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.handlers.walkways.WalkwaysManager; +import org.alexdev.havana.server.netty.streams.NettyResponse; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.StringUtil; + +public class MessengerUser { + private int userId; + private String username; + private String figure; + private String sex; + private String motto; + private long lastOnline; + private boolean allowStalking; + private boolean toRemove; + private boolean toAdd; + private int categoryId; + private boolean onlineStatusVisible; + private boolean isOnline; + + public MessengerUser(PlayerDetails details) { + this.applyUserDetails(details.getId(), details.getName(), details.getFigure(), details.getMotto(), String.valueOf(details.getSex()), details.getLastOnline(), details.doesAllowStalking(), 0, details.isOnline(), details.isOnlineStatusVisible()); + } + + public MessengerUser(int userId, String username, String figure, String sex, String consoleMotto, long lastOnline, boolean allowStalking, int categoryId, boolean isOnline, boolean onlineStatusVisible) { + this.applyUserDetails(userId, username, figure, consoleMotto, sex, lastOnline, allowStalking, categoryId, isOnline, onlineStatusVisible); + } + + /** + * Geneic method for applying details, used from both constructors. + * + * @param userId the id of the user + * @param username the name of the user + * @param figure the figure of the user + * @param consoleMotto the console motto of the user + * @param sex the sex of the user + * @param lastOnline the last time the user was online in Unix time + */ + private void applyUserDetails(int userId, String username, String figure, String consoleMotto, String sex, long lastOnline, boolean allowStalking, int categoryId, boolean isOnline, boolean onlineStatusVisible) { + this.toRemove = false; + this.userId = userId; + this.username = StringUtil.filterInput(username, true); + this.figure = StringUtil.filterInput(figure, true); + this.sex = sex.toLowerCase().equals("f") ? "F" : "M"; + this.lastOnline = lastOnline; + this.motto = StringUtil.filterInput(consoleMotto, true); + this.allowStalking = allowStalking; + this.categoryId = categoryId; + this.onlineStatusVisible = onlineStatusVisible; + this.isOnline = isOnline; + } + + /** + * Serialise the player, used for console search and friends list. + * + * @param response the response to serialise for + */ + public void serialise(Player friend, NettyResponse response) { + Player player = PlayerManager.getInstance().getPlayerById(this.userId); + + if (player != null) { + this.figure = player.getDetails().getFigure(); + this.lastOnline = player.getDetails().getLastOnline(); + this.sex = player.getDetails().getSex(); + this.motto = player.getDetails().getMotto(); + this.allowStalking = player.getDetails().doesAllowStalking(); + } + + boolean isOnline = PlayerManager.getInstance().isPlayerOnline(this.userId); + + response.writeInt(this.userId); + response.writeString(this.username); + response.writeBool(this.sex.toLowerCase().equals("m")); + + response.writeBool(isOnline); + response.writeBool(this.canFollowFriend(friend)); + + response.writeString(isOnline ? this.figure : ""); + response.writeInt(this.categoryId); + response.writeString(this.motto); + response.writeString(DateUtil.getDate(this.lastOnline, DateUtil.LONG_DATE)); + } + + public boolean canFollowFriend(Player friend) { + Player player = PlayerManager.getInstance().getPlayerById(this.userId); + + if (player == null) { + return false; + } + + if (player.getRoomUser().getRoom() == null) { + return false; + } + + Room room = player.getRoomUser().getRoom(); + return (!room.getModel().getName().startsWith("bb_") && !room.getModel().getName().equals("snowwar")); + } + + + public int getUserId() { + return this.userId; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getFigure() { + return figure; + } + + public void setFigure(String figure) { + this.figure = figure; + } + + public String getSex() { + return sex; + } + + public String getMotto() { + return motto; + } + + public void setMotto(String motto) { + this.motto = motto; + } + + public String getFormattedLastOnline() { + return DateUtil.getDate(this.lastOnline, "dd/MM/yyyy hh:mm a").replace("am", "AM").replace("pm","PM").replace(".", ""); + } + + public String getFormatLastOnline(String format) { + return DateUtil.getDate(this.lastOnline, format); + } + + public long getLastOnline() { + return lastOnline; + } + + public void setLastOnline(long lastOnline) { + this.lastOnline = lastOnline; + } + + @Override + public String toString() { + return "[" + username + "," + motto + "," + figure + "," + sex + "," + lastOnline + "]"; + } + + public boolean removed() { + return toRemove; + } + + public void setToRemove(boolean toRemove) { + this.toRemove = toRemove; + } + + public boolean added() { + return toAdd; + } + + public void setToAdd(boolean toAdd) { + this.toAdd = toAdd; + } + + public boolean isOnline() { + if (!this.onlineStatusVisible) { + return false; + } + + if (PlayerManager.getInstance().getPlayers().size() > 0) { + return PlayerManager.getInstance().isPlayerOnline(this.userId); + } + + return isOnline; + } + + public int getCategoryId() { + return categoryId; + } + + public void setCategoryId(int categoryId) { + this.categoryId = categoryId; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/misc/figure/FigureColor.java b/Havana-Server/src/main/java/org/alexdev/havana/game/misc/figure/FigureColor.java new file mode 100644 index 0000000..6ea5a9e --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/misc/figure/FigureColor.java @@ -0,0 +1,31 @@ +package org.alexdev.havana.game.misc.figure; + +public class FigureColor { + private String colourId; + private String index; + private boolean isClubRequired; + private boolean isSelectable; + + public FigureColor(String colourId, String index, boolean isClubRequired, boolean isSelectable) { + this.colourId = colourId; + this.index = index; + this.isClubRequired = isClubRequired; + this.isSelectable = isSelectable; + } + + public String getColourId() { + return colourId; + } + + public String getIndex() { + return index; + } + + public boolean isClubRequired() { + return isClubRequired; + } + + public boolean isSelectable() { + return isSelectable; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/misc/figure/FigureManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/misc/figure/FigureManager.java new file mode 100644 index 0000000..11833cd --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/misc/figure/FigureManager.java @@ -0,0 +1,293 @@ +package org.alexdev.havana.game.misc.figure; + +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class FigureManager { + private static final String FIGUREDATA_FILE = "figuredata.xml"; + + private static FigureManager instance; + private Map> figurePalettes; + private Map figureSetTypes; + private Map figureSets; + + private FigureManager() { + this.figurePalettes = new HashMap<>(); + this.figureSetTypes = new HashMap<>(); + this.figureSets = new HashMap<>(); + + this.loadFigurePalettes(); + this.loadFigureSetTypes(); + this.loadFigureSets(); + } + + public int validateFigureCode(String figure, String gender, boolean hasClub) { + //System.out.println("Validating: " + figure); + String[] figureData = figure.split("\\."); + + if (figureData.length == 0) { + return 1; + } + + List sets = new ArrayList<>(); + + for (String data : figureData) { + String[] parts = data.split("-"); + + if (parts.length < 2 || parts.length > 3) { + return 2; + } + + sets.add(parts[0]); + } + + for (var figureSetType : figureSetTypes.values()) { + if (figureSetType.getSet().equalsIgnoreCase("sh")) { + continue; + } + + if (figureSetType.isMandatory() && !sets.contains(figureSetType.getSet())) { + return 3; + } + } + + for (String data : figureData) { + String[] parts = data.split("-"); + + if (parts.length < 2 || parts.length > 3) { + return 4; + } + + String set = parts[0]; + String setId = parts[1]; + + var figureSet = this.figureSets.values().stream().filter(s -> + s.getType().equalsIgnoreCase(set) && + s.getId().equalsIgnoreCase(setId) && + (s.getGender().equalsIgnoreCase(gender) || s.getGender().equalsIgnoreCase("U"))) + .findFirst().orElse(null); + + if (figureSet == null) { + return 5; + } + + if (figureSet.isClub() && !hasClub) { + return 6; + } + + if (!figureSet.isSelectable()) { + return 7; + } + + var figureSetType = this.figureSetTypes.get(set); + + if (parts.length > 2 && parts[2].length() > 0) { + var paletteId = parts[2]; + + if (this.figurePalettes.get(figureSetType.getPaletteId()).stream().noneMatch(palette -> palette.getColourId().equalsIgnoreCase(paletteId))) { + return 8; + } + } + } + + return 0; + } + + public boolean validateFigure(String figure, String gender, boolean hasClub) { + //System.out.println("Validating: " + figure); + String[] figureData = figure.split("\\."); + + if (figureData.length == 0) { + return false; + } + + List sets = new ArrayList<>(); + + for (String data : figureData) { + String[] parts = data.split("-"); + + if (parts.length < 2 || parts.length > 3) { + return false; + } + + sets.add(parts[0]); + } + + for (var figureSetType : figureSetTypes.values()) { + if (figureSetType.getSet().equalsIgnoreCase("sh")) { + continue; + } + + if (figureSetType.isMandatory() && !sets.contains(figureSetType.getSet())) { + return false; + } + } + + for (String data : figureData) { + String[] parts = data.split("-"); + + if (parts.length < 2 || parts.length > 3) { + return false; + } + + String set = parts[0]; + String setId = parts[1]; + + var figureSet = this.figureSets.values().stream().filter(s -> + s.getType().equalsIgnoreCase(set) && + s.getId().equalsIgnoreCase(setId) && + (s.getGender().equalsIgnoreCase(gender) || s.getGender().equalsIgnoreCase("U"))) + .findFirst().orElse(null); + + if (figureSet == null) { + return false; + } + + if (figureSet.isClub() && !hasClub) { + return false; + } + + if (!figureSet.isSelectable()) { + return false; + } + + var figureSetType = this.figureSetTypes.get(set); + + if (parts.length > 2 && parts[2].length() > 0) { + var paletteId = parts[2]; + + if (this.figurePalettes.get(figureSetType.getPaletteId()).stream().noneMatch(palette -> palette.getColourId().equalsIgnoreCase(paletteId))) { + return false; + } + } + } + + return true; + } + + private void loadFigurePalettes() { + try { + DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); + + Document doc = dBuilder.parse(new File(FIGUREDATA_FILE)); + doc.normalize(); + + NodeList list = doc.getElementsByTagName("colors"); + + for (int i = 0; i < list.getLength(); i++) { + NodeList paletteList = list.item(i).getChildNodes(); + + for (int j = 0; j < paletteList.getLength(); j++) { + Node palette = paletteList.item(j);//.getChildNodes(); + NodeList colourList = palette.getChildNodes(); + + var paletteId = Integer.parseInt(palette.getAttributes().getNamedItem("id").getNodeValue()); + this.figurePalettes.put(paletteId, new ArrayList<>()); + + for (int k = 0; k < colourList.getLength(); k++) { + var colour = colourList.item(k); + + String colourId = colour.getAttributes().getNamedItem("id").getNodeValue(); + String index = colour.getAttributes().getNamedItem("index").getNodeValue(); + boolean isClubRequired = colour.getAttributes().getNamedItem("club").getNodeValue().equalsIgnoreCase("1"); + boolean isSelectable = colour.getAttributes().getNamedItem("selectable").getNodeValue().equalsIgnoreCase("1"); + + this.figurePalettes.get(paletteId).add(new FigureColor(colourId, index, isClubRequired, isSelectable)); + } + } + } + + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + private void loadFigureSetTypes() { + try { + DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); + + Document doc = dBuilder.parse(new File(FIGUREDATA_FILE)); + doc.normalize(); + + NodeList list = doc.getElementsByTagName("settype"); + + for (int i = 0; i < list.getLength(); i++) { + Node setType = list.item(i); + String set = setType.getAttributes().getNamedItem("type").getNodeValue(); + int paletteId = Integer.parseInt(setType.getAttributes().getNamedItem("paletteid").getNodeValue()); + boolean isMandatory = setType.getAttributes().getNamedItem("mandatory").getNodeValue().equalsIgnoreCase("1"); + + this.figureSetTypes.put(set, new FigureSetType(set, paletteId, isMandatory)); + } + + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + private void loadFigureSets() { + try { + DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); + + Document doc = dBuilder.parse(new File(FIGUREDATA_FILE)); + doc.normalize(); + + NodeList list = doc.getElementsByTagName("set"); + + for (int i = 0; i < list.getLength(); i++) { + Node set = list.item(i); + String setType = set.getParentNode().getAttributes().getNamedItem("type").getNodeValue(); + String id = set.getAttributes().getNamedItem("id").getNodeValue(); + String gender = set.getAttributes().getNamedItem("gender").getNodeValue(); + boolean club = set.getAttributes().getNamedItem("club").getNodeValue().equalsIgnoreCase("1"); + boolean colourable = set.getAttributes().getNamedItem("colorable").getNodeValue().equalsIgnoreCase("1"); + boolean selectable = set.getAttributes().getNamedItem("selectable").getNodeValue().equalsIgnoreCase("1"); + + var figureSet = new FigureSet(setType, id, gender, club, colourable, selectable); + + NodeList partList = set.getChildNodes(); + + for (int j = 0; j < partList.getLength(); j++) { + Node part = partList.item(j);//.getChildNodes(); + + if (part.getNodeName().equalsIgnoreCase("hiddenlayers")) { + continue; + } + + figureSet.getFigureParts().add(new FigurePart( + part.getAttributes().getNamedItem("id").getNodeValue(), + part.getAttributes().getNamedItem("type").getNodeValue(), + part.getAttributes().getNamedItem("colorable").getNodeValue().equalsIgnoreCase("1"), + Integer.parseInt(part.getAttributes().getNamedItem("index").getNodeValue()))); + } + + this.figureSets.put(id, figureSet); + } + + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + + public static FigureManager getInstance() { + if (instance == null) { + instance = new FigureManager(); + } + + return instance; + } + +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/misc/figure/FigurePart.java b/Havana-Server/src/main/java/org/alexdev/havana/game/misc/figure/FigurePart.java new file mode 100644 index 0000000..9e6a3aa --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/misc/figure/FigurePart.java @@ -0,0 +1,31 @@ +package org.alexdev.havana.game.misc.figure; + +public class FigurePart { + private final String id; + private final String type; + private final boolean colorable; + private final int index; + + public FigurePart(String id, String type, boolean colorable, int index) { + this.id = id; + this.type = type; + this.colorable = colorable; + this.index = index; + } + + public String getId() { + return id; + } + + public String getType() { + return type; + } + + public boolean isColorable() { + return colorable; + } + + public int getIndex() { + return index; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/misc/figure/FigureSet.java b/Havana-Server/src/main/java/org/alexdev/havana/game/misc/figure/FigureSet.java new file mode 100644 index 0000000..5bfa274 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/misc/figure/FigureSet.java @@ -0,0 +1,52 @@ +package org.alexdev.havana.game.misc.figure; + +import java.util.ArrayList; +import java.util.List; + +public class FigureSet { + private String type; + private String id; + private String gender; + private boolean isClub; + private boolean isColorable; + private boolean isSelectable; + private List figureParts; + + public FigureSet(String type, String id, String gender, boolean isClub, boolean isColorable, boolean isSelectable) { + this.type = type; + this.id = id; + this.gender = gender; + this.isClub = isClub; + this.isColorable = isColorable; + this.isSelectable = isSelectable; + this.figureParts = new ArrayList<>(); + } + + public String getType() { + return type; + } + + public String getId() { + return id; + } + + public String getGender() { + return gender; + } + + public boolean isClub() { + return isClub; + } + + public boolean isColorable() { + return isColorable; + } + + public boolean isSelectable() { + return isSelectable; + } + + public List getFigureParts() { + return figureParts; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/misc/figure/FigureSetType.java b/Havana-Server/src/main/java/org/alexdev/havana/game/misc/figure/FigureSetType.java new file mode 100644 index 0000000..837ccd7 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/misc/figure/FigureSetType.java @@ -0,0 +1,25 @@ +package org.alexdev.havana.game.misc.figure; + +public class FigureSetType { + private String set; + private int paletteId; + private boolean isMandatory; + + public FigureSetType(String set, int paletteId, boolean isMandatory) { + this.set = set; + this.paletteId = paletteId; + this.isMandatory = isMandatory; + } + + public String getSet() { + return set; + } + + public int getPaletteId() { + return paletteId; + } + + public boolean isMandatory() { + return isMandatory; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/misc/purse/Voucher.java b/Havana-Server/src/main/java/org/alexdev/havana/game/misc/purse/Voucher.java new file mode 100644 index 0000000..522f4ce --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/misc/purse/Voucher.java @@ -0,0 +1,45 @@ +package org.alexdev.havana.game.misc.purse; + +import java.util.List; + +import java.util.ArrayList; + +public class Voucher { + public final int credits; + public final List items; + private final boolean allowNewUsers; + + public Voucher(int voucherCredits, boolean allowNewUsers) { + credits = voucherCredits; + items = new ArrayList<>(); + this.allowNewUsers = allowNewUsers; + } + + /** + * Get the amount of redeemable credits. + * + * @return the redeemable credit amount + */ + public int getCredits() { + return credits; + } + + /** + * Get the item amount. + * + * @return the item amount + */ + public List getItems() { + return items; + } + + /** + * Should users less than a day old be able to redeem this? + * + * @return true, if successful + */ + public boolean isAllowNewUsers() { + return allowNewUsers; + } +} + diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/moderation/ChatManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/moderation/ChatManager.java new file mode 100644 index 0000000..930a951 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/moderation/ChatManager.java @@ -0,0 +1,62 @@ +package org.alexdev.havana.game.moderation; + +import org.alexdev.havana.dao.mysql.RoomDao; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.rooms.user.CHAT_MESSAGE; +import org.alexdev.havana.util.DateUtil; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; + +public class ChatManager { + private static ChatManager instance; + private BlockingQueue chatMessageQueue; + + public ChatManager() { + this.chatMessageQueue = new LinkedBlockingQueue<>(); + } + + /** + * Queue messages to be saved to the database. + * + * @param entity the entity who sent the message + * @param message the message + * @param chatMessageType the message type + * @param room the room the message was sent in + */ + public void queue(Entity entity, Room room, String message, CHAT_MESSAGE.ChatMessageType chatMessageType) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + this.chatMessageQueue.add( + new ChatMessage(entity.getDetails().getId(), entity.getDetails().getName(), message, chatMessageType, room.getId(), DateUtil.getCurrentTimeSeconds())); + } + + /** + * Save all the chat messages. + */ + public void performChatSaving() { + List chatMessageList = new ArrayList<>(); + this.chatMessageQueue.drainTo(chatMessageList); + RoomDao.saveChatLog(chatMessageList); + } + + /** + * Get the {@link ChatManager} instance + * + * @return the item manager instance + */ + public static ChatManager getInstance() { + if (instance == null) { + instance = new ChatManager(); + } + + return instance; + } + +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/moderation/ChatMessage.java b/Havana-Server/src/main/java/org/alexdev/havana/game/moderation/ChatMessage.java new file mode 100644 index 0000000..e97d8a7 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/moderation/ChatMessage.java @@ -0,0 +1,53 @@ +package org.alexdev.havana.game.moderation; + +import org.alexdev.havana.messages.outgoing.rooms.user.CHAT_MESSAGE; + +import java.util.Calendar; + +public class ChatMessage { + private final int playerId; + private final String message; + private final CHAT_MESSAGE.ChatMessageType chatMessageType; + private final int roomId; + private final long sentTime; + private final String playerName; + + public ChatMessage(int playerId, String playerName, String message, CHAT_MESSAGE.ChatMessageType chatMessageType, int roomId, long sentTime) { + this.playerId = playerId; + this.playerName = playerName; + this.roomId = roomId; + this.message = message; + this.chatMessageType = chatMessageType; + this.sentTime = sentTime; + } + + public Calendar getCalendar() { + var calendar = Calendar.getInstance(); + calendar.setTimeInMillis(this.sentTime * 1000L); + return calendar; + } + + public int getPlayerId() { + return playerId; + } + + public int getRoomId() { + return roomId; + } + + public String getMessage() { + return message; + } + + public CHAT_MESSAGE.ChatMessageType getChatMessageType() { + return chatMessageType; + } + + public long getSentTime() { + return sentTime; + } + + public String getPlayerName() { + return playerName; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/moderation/ModerationAction.java b/Havana-Server/src/main/java/org/alexdev/havana/game/moderation/ModerationAction.java new file mode 100644 index 0000000..32b7fcf --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/moderation/ModerationAction.java @@ -0,0 +1,10 @@ +package org.alexdev.havana.game.moderation; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.server.util.MalformedPacketException; + +public interface ModerationAction { + void performAction(Player player, Room room, String alertMessage, String notes, NettyRequest reader) throws MalformedPacketException; +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/moderation/ModerationActionType.java b/Havana-Server/src/main/java/org/alexdev/havana/game/moderation/ModerationActionType.java new file mode 100644 index 0000000..3fd07fc --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/moderation/ModerationActionType.java @@ -0,0 +1,33 @@ +package org.alexdev.havana.game.moderation; + +import org.alexdev.havana.game.moderation.actions.*; + +public enum ModerationActionType { + ALERT_USER(0, 0, new ModeratorAlertUserAction()), + KICK_USER(0, 1, new ModeratorKickUserAction()), + BAN_USER(0, 2, new ModeratorBanUserAction()), + ROOM_ALERT(1, 0, new ModeratorRoomAlertAction()), + ROOM_KICK(1, 1, new ModeratorRoomKickAction()); + + int targetType; + int actionType; + ModerationAction moderationAction; + + ModerationActionType(int targetType, int actionType, ModerationAction moderationAction) { + this.targetType = targetType; + this.actionType = actionType; + this.moderationAction = moderationAction; + } + + public int getTargetType() { + return targetType; + } + + public int getActionType() { + return actionType; + } + + public ModerationAction getModerationAction() { + return moderationAction; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/moderation/actions/ModeratorAlertUserAction.java b/Havana-Server/src/main/java/org/alexdev/havana/game/moderation/actions/ModeratorAlertUserAction.java new file mode 100644 index 0000000..edcbdaf --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/moderation/actions/ModeratorAlertUserAction.java @@ -0,0 +1,33 @@ +package org.alexdev.havana.game.moderation.actions; + +import org.alexdev.havana.dao.mysql.ModerationDao; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.moderation.ModerationAction; +import org.alexdev.havana.game.moderation.ModerationActionType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; +import org.alexdev.havana.messages.outgoing.moderation.MODERATOR_ALERT; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.server.util.MalformedPacketException; + +public class ModeratorAlertUserAction implements ModerationAction { + @Override + public void performAction(Player player, Room room, String alertMessage, String notes, NettyRequest reader) throws MalformedPacketException { + if (!player.hasFuse(Fuseright.ROOM_ALERT)) { + return; + } + + String alertUser = reader.readString(); + Player target = PlayerManager.getInstance().getPlayerByName(alertUser); + + if (target != null) { + target.send(new MODERATOR_ALERT(alertMessage)); + ModerationDao.addLog(ModerationActionType.ALERT_USER, player.getDetails().getId(), target.getDetails().getId(), alertMessage, notes); + } else { + player.send(new ALERT("Target user is not online.")); + } + + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/moderation/actions/ModeratorBanUserAction.java b/Havana-Server/src/main/java/org/alexdev/havana/game/moderation/actions/ModeratorBanUserAction.java new file mode 100644 index 0000000..321b653 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/moderation/actions/ModeratorBanUserAction.java @@ -0,0 +1,87 @@ +package org.alexdev.havana.game.moderation.actions; + +import org.alexdev.havana.dao.mysql.BanDao; +import org.alexdev.havana.game.ban.BanManager; +import org.alexdev.havana.game.ban.BanType; +import org.alexdev.havana.game.commands.CommandManager; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.moderation.ModerationAction; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.server.util.MalformedPacketException; +import org.alexdev.havana.util.DateUtil; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +public class ModeratorBanUserAction implements ModerationAction { + @Override + public void performAction(Player player, Room room, String alertMessage, String notes, NettyRequest reader) throws MalformedPacketException { + if (!player.hasFuse(Fuseright.BAN)) { + return; + } + + String name = reader.readString(); + int banHours = reader.readInt(); + boolean banMachineId = reader.readBoolean(); + boolean banIp = reader.readBoolean(); + + var response = ban(player.getDetails(), alertMessage, notes, name, TimeUnit.HOURS.toSeconds(banHours), banMachineId, banIp); + player.send(new ALERT(response)); + } + + public static String ban(PlayerDetails banningPlayerDetails, String alertMessage, String notes, String name, long banSeconds, boolean banMachineId, boolean banIp) { + Map criteria = new HashMap<>(); + PlayerDetails playerDetails = PlayerManager.getInstance().getPlayerData(name); + + if (playerDetails == null) { + return "Could not find user: " + name; + } + + if (playerDetails.getId() == banningPlayerDetails.getId()) { + return "Cannot ban yourself"; + } + + if (playerDetails.isBanned() != null) { + return "User is already banned!"; + } + + if (CommandManager.getInstance().hasPermission(playerDetails, "ban")) + return "Cannot ban a user who has permission to ban"; + + long banTime = DateUtil.getCurrentTimeSeconds() + banSeconds; + + BanDao.addBan(BanType.USER_ID, String.valueOf(playerDetails.getId()), banTime, alertMessage, banningPlayerDetails.getId()); + criteria.put(BanType.USER_ID, String.valueOf(playerDetails.getId())); + + if (banMachineId && playerDetails.getMachineId() != null) { + BanDao.addBan(BanType.MACHINE_ID, playerDetails.getMachineId(), banTime, alertMessage, banningPlayerDetails.getId()); + criteria.put(BanType.MACHINE_ID, playerDetails.getMachineId()); + } + + /*if (banIp) { + var latestIp = PlayerDao.getLatestIp(playerDetails.getId()); + InetAddressValidator validator = InetAddressValidator.getInstance(); + + // Validate an IPv4 address + if (validator.isValidInet4Address(latestIp)) { + BanDao.addBan(BanType.IP_ADDRESS, latestIp, banTime, alertMessage); + criteria.put(BanType.IP_ADDRESS, latestIp); + } + }*/ + + Player target = PlayerManager.getInstance().getPlayerById(playerDetails.getId()); + + if (target != null) { + target.getNetwork().disconnect(); + } + + BanManager.getInstance().disconnectBanAccounts(criteria); + return "The user " + playerDetails.getName() + " has been banned."; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/moderation/actions/ModeratorKickUserAction.java b/Havana-Server/src/main/java/org/alexdev/havana/game/moderation/actions/ModeratorKickUserAction.java new file mode 100644 index 0000000..6d46635 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/moderation/actions/ModeratorKickUserAction.java @@ -0,0 +1,47 @@ +package org.alexdev.havana.game.moderation.actions; + +import org.alexdev.havana.dao.mysql.ModerationDao; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.moderation.ModerationAction; +import org.alexdev.havana.game.moderation.ModerationActionType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.texts.TextsManager; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; +import org.alexdev.havana.messages.outgoing.moderation.MODERATOR_ALERT; +import org.alexdev.havana.messages.outgoing.rooms.user.HOTEL_VIEW; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.server.util.MalformedPacketException; + +public class ModeratorKickUserAction implements ModerationAction { + @Override + public void performAction(Player player, Room room, String alertMessage, String notes, NettyRequest reader) throws MalformedPacketException { + if (!player.hasFuse(Fuseright.KICK)) { + return; + } + + + String alertUser = reader.readString(); + Player target = PlayerManager.getInstance().getPlayerByName(alertUser); + + if (target != null) { + if (target.getDetails().getId() == player.getDetails().getId()) { + return; // Can't kick yourself! + } + + if (target.hasFuse(Fuseright.KICK)) { + player.send(new ALERT(TextsManager.getInstance().getValue("modtool_rankerror"))); + return; + } + + target.getRoomUser().kick(false, true); + target.send(new HOTEL_VIEW()); + target.send(new MODERATOR_ALERT(alertMessage)); + + ModerationDao.addLog(ModerationActionType.KICK_USER, player.getDetails().getId(), target.getDetails().getId(), alertMessage, notes); + } else { + player.send(new ALERT("Target user is not online.")); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/moderation/actions/ModeratorRoomAlertAction.java b/Havana-Server/src/main/java/org/alexdev/havana/game/moderation/actions/ModeratorRoomAlertAction.java new file mode 100644 index 0000000..8ab72c7 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/moderation/actions/ModeratorRoomAlertAction.java @@ -0,0 +1,28 @@ +package org.alexdev.havana.game.moderation.actions; + +import org.alexdev.havana.dao.mysql.ModerationDao; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.moderation.ModerationAction; +import org.alexdev.havana.game.moderation.ModerationActionType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.moderation.MODERATOR_ALERT; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +import java.util.List; + +public class ModeratorRoomAlertAction implements ModerationAction { + @Override + public void performAction(Player player, Room room, String alertMessage, String notes, NettyRequest reader) { + if (!player.hasFuse(Fuseright.ROOM_ALERT)) { + return; + } + List players = player.getRoomUser().getRoom().getEntityManager().getPlayers(); + + for (Player target : players) { + target.send(new MODERATOR_ALERT(alertMessage)); + } + ModerationDao.addLog(ModerationActionType.ROOM_ALERT, player.getDetails().getId(), -1, alertMessage, notes); + + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/moderation/actions/ModeratorRoomKickAction.java b/Havana-Server/src/main/java/org/alexdev/havana/game/moderation/actions/ModeratorRoomKickAction.java new file mode 100644 index 0000000..3861d8c --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/moderation/actions/ModeratorRoomKickAction.java @@ -0,0 +1,39 @@ +package org.alexdev.havana.game.moderation.actions; + +import org.alexdev.havana.dao.mysql.ModerationDao; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.moderation.ModerationAction; +import org.alexdev.havana.game.moderation.ModerationActionType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.moderation.MODERATOR_ALERT; +import org.alexdev.havana.messages.outgoing.rooms.user.HOTEL_VIEW; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +import java.util.List; + +public class ModeratorRoomKickAction implements ModerationAction { + @Override + public void performAction(Player player, Room room, String alertMessage, String notes, NettyRequest reader) { + if (!player.hasFuse(Fuseright.ROOM_KICK)) { + return; + } + + List players = player.getRoomUser().getRoom().getEntityManager().getPlayers(); + + for (Player target : players) { + // Don't kick other moderators + if (target.hasFuse(Fuseright.ROOM_KICK)) { + continue; + } + + target.getRoomUser().kick(false, true); + + target.send(new HOTEL_VIEW()); + target.send(new MODERATOR_ALERT(alertMessage)); + } + + + ModerationDao.addLog(ModerationActionType.ROOM_KICK, player.getDetails().getId(), -1, alertMessage, notes); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/moderation/cfh/CallForHelp.java b/Havana-Server/src/main/java/org/alexdev/havana/game/moderation/cfh/CallForHelp.java new file mode 100644 index 0000000..84391eb --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/moderation/cfh/CallForHelp.java @@ -0,0 +1,89 @@ +package org.alexdev.havana.game.moderation.cfh; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.util.DateUtil; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.concurrent.TimeUnit; + +public class CallForHelp { + private final int cryId; + private final int callerId; + private final String message; + private int pickedUpBy; + private final Room room; + private final long requestTime; + private int category = 2; + private long expireTime; + private boolean isDeleted; + + CallForHelp(int cryId, int callerId, Room room, String message) { + this.cryId = cryId; + this.callerId = callerId; + this.message = message; + this.pickedUpBy = 0; + this.room = room; + this.requestTime = System.currentTimeMillis(); + this.expireTime = DateUtil.getCurrentTimeSeconds() + TimeUnit.MINUTES.toSeconds(30); + } + + public String getMessage() { + return this.message; + } + + public int getPickedUpBy() { + return this.pickedUpBy; + } + + public Room getRoom() { + return this.room; + } + + public int getCategory() { + return this.category; + } + + public int getCaller() { + return this.callerId; + } + + public int getCryId() { + return this.cryId; + } + + public boolean isOpen() { + return this.pickedUpBy == 0 && !isDeleted; + } + + public String getFormattedRequestTime() { + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm d/MM/YYYY"); + Date resultDate = new Date(this.requestTime); + return sdf.format(resultDate); + } + + public void updateCategory(int newCategory) { + this.category = newCategory; + } + + public void setPickedUpBy(Player moderator) { + this.pickedUpBy = moderator.getDetails().getId(); + } + + public long getExpireTime() { + return expireTime; + } + + public void setExpireTime(long expireTime) { + this.expireTime = expireTime; + } + + public boolean isDeleted() { + return isDeleted; + } + + public void setDeleted(boolean deleted) { + isDeleted = deleted; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/moderation/cfh/CallForHelpManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/moderation/cfh/CallForHelpManager.java new file mode 100644 index 0000000..bdbb1cf --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/moderation/cfh/CallForHelpManager.java @@ -0,0 +1,163 @@ +package org.alexdev.havana.game.moderation.cfh; + +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.moderation.CALL_FOR_HELP; +import org.alexdev.havana.messages.outgoing.moderation.DELETE_CRY; +import org.alexdev.havana.messages.outgoing.moderation.PICKED_CRY; +import org.alexdev.havana.messages.outgoing.moderation.CRY_RECEIVED; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.util.DateUtil; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +public class CallForHelpManager { + private static CallForHelpManager instance; + private Map callsForHelp; + private AtomicInteger latestCallId; + + public CallForHelpManager() { + this.callsForHelp = new ConcurrentHashMap<>(); + this.latestCallId = new AtomicInteger(); + } + + /** + * Add Call for Help to queue + * + * @param caller The person submitting the CFH + * @param message The message attached to the CFH + */ + public void submitCall(Player caller, String message) { + int callId = this.latestCallId.getAndIncrement(); + int callerId = caller.getDetails().getId(); + Room room = caller.getRoomUser().getRoom(); + + CallForHelp cfh = new CallForHelp(callId, callerId, room, message); + this.callsForHelp.put(callId, cfh); + + sendToModerators(new CALL_FOR_HELP(cfh)); + caller.send(new CRY_RECEIVED()); + } + + /** + * Get open Call for Help by Player Username + * + * @param id the ID to fetch + * @return the Call for Help, null if no open Calls for Help + */ + public CallForHelp getCall(int id) { + return this.callsForHelp.get(id); + } + + /** + * Get Call for Help by Player Username + * + * @param userId the user id to retrieve for + * @return the open Call for Help, null if no open Calls for Help + */ + public CallForHelp getPendingCall(int userId) { + for (CallForHelp cfh : this.callsForHelp.values()) { + if (cfh.isOpen() && cfh.getCaller() == userId) { + return cfh; + } + } + + return null; + } + + /** + * Get Call for Help by Player + * + * @param player the player to check for + * @return boolean indicating if there are open calls for this player + */ + public boolean hasPendingCall(Player player) { + return this.getPendingCall(player.getDetails().getId()) != null; + } + + /** + * Send a packet to all online moderators + * + * @param message the MessageComposer to send + */ + private void sendToModerators(MessageComposer message) { + for (Player p : PlayerManager.getInstance().getPlayers()) { + if (p.hasFuse(Fuseright.RECEIVE_CALLS_FOR_HELP)) { + p.send(message); + } + } + } + + /** + * Pick up a call for help + * + * @param cfh the CFH to pick up + * @param moderator the moderator who is picking it up + */ + public void pickUp(CallForHelp cfh, Player moderator) { + cfh.setPickedUpBy(moderator); + + // Send the updated CallForHelp to all moderators + sendToModerators(new PICKED_CRY(cfh)); + } + + /** + * Chnage catgeory of Call + * + * @param cfh the CFH to change + * @param newCategory the new category + */ + public void changeCategory(CallForHelp cfh, int newCategory) { + if (!this.callsForHelp.containsKey(cfh.getCryId())) { + return; + } + + cfh.updateCategory(newCategory); + sendToModerators(new CALL_FOR_HELP(cfh)); + } + + /** + * Deletes the cfh to all moderators and marks it for deletion in 30 minutes. + * + * @param cfh the cfh to delete + */ + public void deleteCall(CallForHelp cfh) { + cfh.setDeleted(true); + sendToModerators(new DELETE_CRY(cfh.getCryId())); + } + + /** + * Purges expired cfhs, server remembers them for atleast 30 minutes + */ + public void purgeExpiredCfh() { + Predicate filter = cfh -> !cfh.isOpen() || DateUtil.getCurrentTimeSeconds() > cfh.getExpireTime(); + + this.callsForHelp.values().stream().filter(filter).collect(Collectors.toList()).forEach(x -> { + sendToModerators(new DELETE_CRY(x.getCryId())); + }); + + this.callsForHelp.values().removeIf(filter); + + } + + /** + * Gets the instance + * + * @return the instance + */ + public static CallForHelpManager getInstance() { + if (instance == null) { + instance = new CallForHelpManager(); + } + + return instance; + } + +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/navigator/NavigatorCategory.java b/Havana-Server/src/main/java/org/alexdev/havana/game/navigator/NavigatorCategory.java new file mode 100644 index 0000000..ee77767 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/navigator/NavigatorCategory.java @@ -0,0 +1,131 @@ +package org.alexdev.havana.game.navigator; + +import org.alexdev.havana.dao.mysql.NavigatorDao; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.RoomManager; + +import java.util.ArrayList; +import java.util.List; + +public class NavigatorCategory { + private int id; + private int parentId; + private int orderId; + private String name; + private boolean publicSpaces; + private boolean allowTrading; + private PlayerRank minimumRoleAccess; + private PlayerRank minimumRoleSetFlat; + private boolean isNode; + private boolean isClubOnly; + + public NavigatorCategory(int id, int parentId, int orderId, String name, boolean publicSpaces, boolean allowTrading, PlayerRank minimumRoleAccess, PlayerRank minimumRoleSetFlat, boolean isNode, boolean isClubOnly) { + this.id = id; + this.parentId = parentId; + this.orderId = orderId; + this.name = name; + this.publicSpaces = publicSpaces; + this.allowTrading = allowTrading; + this.minimumRoleAccess = minimumRoleAccess; + this.minimumRoleSetFlat = minimumRoleSetFlat; + this.isNode = isNode; + this.isClubOnly = isClubOnly; + } + + /** + * Count the active rooms under this category. + * + * @return the active room count + */ + public int getRoomCount() { + if (this.publicSpaces) { + return NavigatorDao.getRoomCountByCategory(this.id); + } else { + List rooms = new ArrayList<>(); + + for (Room room : RoomManager.getInstance().getRooms()) { + if (room.getData().getCategoryId() == this.id) { + rooms.add(room); + } + } + + return rooms.size();//NavigatorDao.getRoomCountByCategory(this.id); + } + } + + /** + * Get the current visitors within this category. + * + * @return the current visitors + */ + public int getCurrentVisitors() { + int currentVisitors = 0; + + for (Room room : this.isPublicSpaces() ? RoomManager.getInstance().replaceQueryRooms(NavigatorDao.getRoomsByCategory(this.id)) : RoomManager.getInstance().getRooms()) { + if (room.getData().getCategoryId() == this.id) { + currentVisitors += room.getData().getVisitorsNow(); + } + + } + + return currentVisitors; + } + + /** + * Get the max visitors within this category. + * + * @return the max visitors + */ + public int getMaxVisitors() { + int maxVisitors = 0; + + for (Room room : this.isPublicSpaces() ? RoomManager.getInstance().replaceQueryRooms(NavigatorDao.getRoomsByCategory(this.id)) : RoomManager.getInstance().getRooms()) { + if (room.getData().getCategoryId() == this.id) { + maxVisitors += room.getData().getVisitorsMax(); + } + } + + return maxVisitors; + } + + public int getId() { + return id; + } + + public int getParentId() { + return parentId; + } + + public int getOrderId() { + return orderId; + } + + public String getName() { + return name; + } + + public boolean isPublicSpaces() { + return publicSpaces; + } + + public boolean hasAllowTrading() { + return allowTrading; + } + + public PlayerRank getMinimumRoleAccess() { + return minimumRoleAccess; + } + + public PlayerRank getMinimumRoleSetFlat() { + return minimumRoleSetFlat; + } + + public boolean isNode() { + return isNode; + } + + public boolean isClubOnly() { + return isClubOnly; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/navigator/NavigatorManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/navigator/NavigatorManager.java new file mode 100644 index 0000000..8f57819 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/navigator/NavigatorManager.java @@ -0,0 +1,95 @@ +package org.alexdev.havana.game.navigator; + +import org.alexdev.havana.dao.mysql.NavigatorDao; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.util.config.GameConfiguration; + +import java.util.*; + +public class NavigatorManager { + private static NavigatorManager instance; + private final HashMap categoryMap; + + private NavigatorManager() { + this.categoryMap = NavigatorDao.getCategories(); + //NavigatorDao.resetBadPrivateRoomCategories(); + } + + /** + * Get all categories by the parent id. + * + * @param parentId the parent id of the categories + * @param rank + * @return the list of categories + */ + public List getCategoriesByParentId(int parentId, PlayerRank rank) { + List categories = new ArrayList<>(); + + boolean hideEmptyPublicRoomCategories = GameConfiguration.getInstance().getBoolean("navigator.hide.empty.public.categories"); + + for (NavigatorCategory category : this.categoryMap.values()) { + if (hideEmptyPublicRoomCategories) { + if (category.isPublicSpaces() && category.getRoomCount() <= 0) { + continue; + } + } + + if (category.getMinimumRoleAccess().getRankId() > rank.getRankId()) { + continue; + } + + if (category.getParentId() != parentId) { + continue; + } + + categories.add(category); + } + + categories.sort(Comparator.comparingInt(NavigatorCategory::getOrderId)); + return categories; + } + + /** + * Get the {@link NavigatorCategory} by id + * + * @param categoryId the id of the category + * @return the category instance + */ + public NavigatorCategory getCategoryById(int categoryId) { + if (this.categoryMap.containsKey(categoryId)) { + return this.categoryMap.get(categoryId); + } + + return null; + } + + /** + * Get the map of navigator categories + * + * @return the list of categories + */ + public HashMap getCategories() { + return this.categoryMap; + } + + /** + * Get instance of {@link NavigatorManager} + * + * @return the manager instance + */ + public static NavigatorManager getInstance() { + if (instance == null) { + instance = new NavigatorManager(); + } + + return instance; + } + + /** + * Reloads the singleton for the {@link NavigatorManager}. + */ + public static void reset() { + instance = null; + getInstance(); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/navigator/NavigatorStyle.java b/Havana-Server/src/main/java/org/alexdev/havana/game/navigator/NavigatorStyle.java new file mode 100644 index 0000000..4aaf884 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/navigator/NavigatorStyle.java @@ -0,0 +1,31 @@ +package org.alexdev.havana.game.navigator; + +public class NavigatorStyle { + private int roomId; + private String description; + private String thumbnailUrl; + private int thumbnailLayout; + + public NavigatorStyle(int roomId, String description, String thumbnailUrl, int thumbnailLayout) { + this.roomId = roomId; + this.description = description; + this.thumbnailUrl = thumbnailUrl; + this.thumbnailLayout = thumbnailLayout; + } + + public int getRoomId() { + return roomId; + } + + public String getThumbnailUrl() { + return thumbnailUrl; + } + + public int getThumbnailLayout() { + return thumbnailLayout; + } + + public String getDescription() { + return description; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/pathfinder/AffectedTile.java b/Havana-Server/src/main/java/org/alexdev/havana/game/pathfinder/AffectedTile.java new file mode 100644 index 0000000..afc2437 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/pathfinder/AffectedTile.java @@ -0,0 +1,58 @@ +package org.alexdev.havana.game.pathfinder; + +import org.alexdev.havana.game.item.Item; + +import java.util.ArrayList; +import java.util.List; + +public class AffectedTile { + + public static List getAffectedTiles(Item item) { + return AffectedTile.getAffectedTiles( + item.getDefinition().getLength(), + item.getDefinition().getWidth(), + item.getPosition().getX(), + item.getPosition().getY(), + item.getPosition().getRotation()); + } + + public static List getAffectedTiles(Item item, int x, int y, int rotation) { + return AffectedTile.getAffectedTiles( + item.getDefinition().getLength(), + item.getDefinition().getWidth(), + x, + y, + rotation); + } + + /** + * Gets the affected tiles. + * + * @param length the length + * @param width the width + * @param x the pos X + * @param y the pos Y + * @param rotation the rotation + * @return the affected tiles + */ + public static List getAffectedTiles(int length, int width, int x, int y, int rotation) { + List points = new ArrayList<>(); + + if (length != width) { + if (rotation == 0 || rotation == 4) { + int l = length; + length = width; + width = l; + } + } + + for (int newX = x; newX < x + width; newX++) { + for (int newY = y; newY < y + length; newY++) { + Position pos = new Position(newX, newY); + points.add(pos); + } + } + + return points; + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/pathfinder/Pathfinder.java b/Havana-Server/src/main/java/org/alexdev/havana/game/pathfinder/Pathfinder.java new file mode 100644 index 0000000..36d9dfd --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/pathfinder/Pathfinder.java @@ -0,0 +1,252 @@ +package org.alexdev.havana.game.pathfinder; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.item.interactors.types.pool.PoolInteractor; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.enums.StatusType; +import org.alexdev.havana.game.room.mapping.RoomTile; + +import java.util.LinkedList; + +public class Pathfinder { + public static final double MAX_DROP_HEIGHT = 3.0; + public static final double MAX_LIFT_HEIGHT = 1.5; + + public static final Position[] DIAGONAL_MOVE_POINTS = new Position[]{ + new Position(0, -1, 0), + new Position(0, 1, 0), + new Position(1, 0, 0), + new Position(-1, 0, 0), + new Position(1, -1, 0), + new Position(-1, 1, 0), + new Position(1, 1, 0), + new Position(-1, -1, 0) + }; + + public static final Position[] MOVE_POINTS = new Position[]{ + new Position(0, -1), + new Position(1, 0), + new Position(0, 1), + new Position(-1, 0) + }; + + /** + * Method for the pathfinder to check if the tile next to the current tile is a valid step. + * + * @param entity the entity walking + * @param current the current tile + * @param tmp the temporary tile around the current tile to check + * @param isFinalMove if the move was final + * @return true, if a valid step + */ + public static boolean isValidStep(Room room, Entity entity, Position current, Position tmp, boolean isFinalMove) { + if (entity.getRoomUser().getRoom() == null || entity.getRoomUser().getRoom().getModel() == null) { + return false; + } + + if (!RoomTile.isValidTile(room, entity, new Position(current.getX(), current.getY()))) { + return false; + } + + if (!RoomTile.isValidTile(room, entity, new Position(tmp.getX(), tmp.getY()))) { + return false; + } + + RoomTile fromTile = room.getMapping().getTile(current); + RoomTile toTile = room.getMapping().getTile(tmp); + + if (fromTile == null || toTile == null) { + return false; + } + + double oldHeight = fromTile.getWalkingHeight(); + double newHeight = toTile.getWalkingHeight(); + + Item fromItem = fromTile.getHighestItem(); + Item toItem = toTile.getHighestItem(); + + // boolean hasPool = room.getModel().getName().startsWith("pool_") || room.getModel().getName().equals("md_a"); + // boolean isPrivateRoom = !room.isPublicRoom(); + + boolean fromItemHeightExempt = fromItem != null && (fromItem.hasBehaviour(ItemBehaviour.TELEPORTER) + || fromItem.getDefinition().getSprite().equals("wsJoinQueue") + || fromItem.getDefinition().getSprite().equals("wsQueueTile") + || (fromItem.getDefinition().getSprite().equals("poolEnter") && toItem != null && toItem.getDefinition().getSprite().equals("poolExit")) // No height check when going between pool triggers + || (fromItem.getDefinition().getSprite().equals("poolExit") && toItem != null && toItem.getDefinition().getSprite().equals("poolEnter")) // No height check when going between pool triggers + || fromItem.getDefinition().getSprite().equals("poolLift") + || fromItem.getDefinition().getSprite().equals("queue_tile2")); + + boolean toItemHeightExempt = toItem != null && (toItem.hasBehaviour(ItemBehaviour.TELEPORTER) + || toItem.getDefinition().getSprite().equals("wsJoinQueue") + || toItem.getDefinition().getSprite().equals("wsQueueTile") + || (toItem.getDefinition().getSprite().equals("poolEnter") && fromItem != null && fromItem.getDefinition().getSprite().equals("poolExit")) // No height check when going between pool triggers + || (toItem.getDefinition().getSprite().equals("poolExit") && fromItem != null && fromItem.getDefinition().getSprite().equals("poolEnter")) // No height check when going between pool triggers + || toItem.getDefinition().getSprite().equals("poolLift") + || toItem.getDefinition().getSprite().equals("queue_tile2")); + + // Pathfinder makes the path from reversed, so we compare the drop reversed (To tile height against From tile height) + if (toTile.isHeightUpwards(fromTile) && (!fromItemHeightExempt && !toItemHeightExempt)) { + if (Math.abs(newHeight - oldHeight) > MAX_LIFT_HEIGHT) { + return false; + } + } + + if (toTile.isHeightDrop(fromTile) && (!fromItemHeightExempt && !toItemHeightExempt)) { + if (Math.abs(oldHeight - newHeight) > MAX_DROP_HEIGHT) { + return false; + } + } + + if (fromTile.isHeightUpwards(toTile) && (!fromItemHeightExempt && !toItemHeightExempt)) { + if (Math.abs(newHeight - oldHeight) > MAX_LIFT_HEIGHT) { + return false; + } + } + + if (fromTile.isHeightDrop(toTile) && (!fromItemHeightExempt && !toItemHeightExempt)) { + if (Math.abs(oldHeight - newHeight) > MAX_DROP_HEIGHT) { + return false; + } + } + + if (!PoolInteractor.getTileStatus(room, entity, current, tmp, isFinalMove)) { + return false; + } + + // Don't enable diagonal checking for the Sun Terrace + // Don't allow diagonal for pool triggers + boolean canWalkDiagonal = !room.getModel().getName().startsWith("sun_terrace") && + !(fromItem != null && fromItem.getDefinition().getSprite().equals("poolExit")) && + !(fromItem != null && fromItem.getDefinition().getSprite().equals("poolEnter")) && + !(toItem != null && toItem.getDefinition().getSprite().equals("poolExit")) && + !(toItem != null && toItem.getDefinition().getSprite().equals("poolEnter")); + + // Can't walk diagonal between two non-walkable tiles + if (canWalkDiagonal) { + if (current.getX() != tmp.getX() && current.getY() != tmp.getY()) { + + boolean firstValidTile = RoomTile.isValidDiagonalTile(room, entity, new Position(tmp.getX(), current.getY())); + boolean secondValidTile = RoomTile.isValidDiagonalTile(room, entity, new Position(current.getX(), tmp.getY())); + + if (!firstValidTile && !secondValidTile) { + return false; + } + } + } + + // Avoid walking into furniture unless it's their last location + if (!current.equals(room.getModel().getDoorLocation()) && + !tmp.equals(room.getModel().getDoorLocation())) { + if (toItem != null) { + if (isFinalMove) { + // Allow walking if item is walkable or trapped inside + return toItem.isWalkable(entity, tmp) || AffectedTile.getAffectedTiles(toItem).stream().anyMatch(x -> room.getMapping().getTile(x).containsEntity(entity)); + } else { + return toItem.hasBehaviour(ItemBehaviour.CAN_STAND_ON_TOP) || toItem.hasBehaviour(ItemBehaviour.DOOR_TELEPORTER) || toItem.isGateOpen(); + } + } + } + + return true; + } + + /** + * Make path with specified last coordinates + * + * @param entity the entity to move + * @return the linked list + */ + public static LinkedList makePath(Entity entity, Position start, Position end) {//List settings) { + LinkedList squares = new LinkedList<>(); + PathfinderNode nodes = makePathReversed(entity, end, start); + + if (nodes != null) { + while (nodes.getNextNode() != null) { + squares.add(nodes.getNextNode().getPosition()); + nodes = nodes.getNextNode(); + } + } + + //Collections.reverse(squares); + return squares; + + } + + /** + * Make path reversed. + * + * @param entity the entity + * @return the pathfinder node + */ + private static PathfinderNode makePathReversed(Entity entity, Position start, Position end) { + LinkedList openList = new LinkedList<>(); + + PathfinderNode[][] map = new PathfinderNode[entity.getRoomUser().getRoom().getModel().getMapSizeX()][entity.getRoomUser().getRoom().getModel().getMapSizeY()]; + PathfinderNode node = null; + Position tmp; + + int cost; + int diff; + + PathfinderNode current = new PathfinderNode(start); + current.setCost(0); + + PathfinderNode finish = new PathfinderNode(end); + + map[current.getPosition().getX()][current.getPosition().getY()] = current; + openList.add(current); + + while (openList.size() > 0) { + current = openList.pollFirst(); + current.setInClosed(true); + + for (Position POINT : DIAGONAL_MOVE_POINTS) { + tmp = current.getPosition().add(POINT); + + boolean isFinalMove = (tmp.getX() == end.getX() && tmp.getY() == end.getY()); + + if (isValidStep(entity.getRoomUser().getRoom(), entity, new Position(current.getPosition().getX(), current.getPosition().getY(), current.getPosition().getZ()), tmp, isFinalMove)) { + if (map[tmp.getX()][tmp.getY()] == null) { + node = new PathfinderNode(tmp); + map[tmp.getX()][tmp.getY()] = node; + } else { + node = map[tmp.getX()][tmp.getY()]; + } + + if (!node.isInClosed()) { + diff = 0; + + if (current.getPosition().getX() != node.getPosition().getX()) { + diff += 2; // Reminder: It was 1 up until 29/08/2018 + } + + if (current.getPosition().getY() != node.getPosition().getY()) { + diff += 2; // Reminder: It was 1 up until 29/08/2018 + } + + cost = current.getCost() + diff + node.getPosition().getDistanceSquared(end); + + if (cost < node.getCost()) { + node.setCost(cost); + node.setNextNode(current); + } + + if (!node.isInOpen()) { + if (node.getPosition().getX() == finish.getPosition().getX() && node.getPosition().getY() == finish.getPosition().getY()) { + node.setNextNode(current); + return node; + } + + node.setInOpen(true); + openList.add(node); + } + } + } + } + } + + return null; + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/pathfinder/PathfinderNode.java b/Havana-Server/src/main/java/org/alexdev/havana/game/pathfinder/PathfinderNode.java new file mode 100644 index 0000000..bd31dbc --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/pathfinder/PathfinderNode.java @@ -0,0 +1,143 @@ +package org.alexdev.havana.game.pathfinder; + +public class PathfinderNode implements Comparable { + + private Position position; + private PathfinderNode nextNode; + private Integer cost = Integer.MAX_VALUE; + private boolean inOpen = false; + private boolean inClosed = false; + + /** + * Gets the position. + * + * @return the position + */ + public Position getPosition() { + return position; + } + + /** + * Sets the position. + * + * @param position the new position + */ + public void setPosition(Position position) { + this.position = position; + } + + /** + * Gets the next node. + * + * @return the next node + */ + public PathfinderNode getNextNode() { + return nextNode; + } + + /** + * Sets the next node. + * + * @param nextNode the new next node + */ + public void setNextNode(PathfinderNode nextNode) { + this.nextNode = nextNode; + } + + /** + * Gets the cost. + * + * @return the cost + */ + public Integer getCost() { + return cost; + } + + /** + * Sets the cost. + * + * @param cost the new cost + */ + public void setCost(int cost) { + this.cost = cost; + } + + /** + * Checks if is in open. + * + * @return true, if is in open + */ + public boolean isInOpen() { + return inOpen; + } + + /** + * Sets the in open. + * + * @param inOpen the new in open + */ + public void setInOpen(boolean inOpen) { + this.inOpen = inOpen; + } + + /** + * Checks if is in closed. + * + * @return true, if is in closed + */ + public boolean isInClosed() { + return inClosed; + } + + /** + * Sets the in closed. + * + * @param inClosed the new in closed + */ + public void setInClosed(boolean inClosed) { + this.inClosed = inClosed; + } + + /** + * Instantiates a new pathfinder node. + * + * @param current the current + */ + public PathfinderNode(Position current) { + this.position = current; + } + + /* (non-Javadoc) + * @see java.lang.Object#equals(java.lang.Object) + */ + @Override + public boolean equals(Object obj) { + return (obj instanceof PathfinderNode) && ((PathfinderNode) obj).getPosition().equals(this.position); + } + + /** + * Equals. + * + * @param node the node + * @return true, if successful + */ + public boolean equals(PathfinderNode node) { + return node.getPosition().equals(this.position); + } + + /* (non-Javadoc) + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() { + return this.position.hashCode(); + } + + /* (non-Javadoc) + * @see java.lang.Comparable#compareTo(java.lang.Object) + */ + @Override + public int compareTo(PathfinderNode o) { + return this.getCost().compareTo(o.getCost()); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/pathfinder/Position.java b/Havana-Server/src/main/java/org/alexdev/havana/game/pathfinder/Position.java new file mode 100644 index 0000000..c511f8a --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/pathfinder/Position.java @@ -0,0 +1,421 @@ +package org.alexdev.havana.game.pathfinder; + +import java.util.ArrayList; +import java.util.List; + +public class Position { + private int X; + private int Y; + private double Z; + private int bodyRotation; + private int headRotation; + + public Position() { + this(0, 0, 0); + } + + public Position(int x, int y) { + this.X = x; + this.Y = y; + this.Z = 0; + } + + public Position(int x, int y, double z) { + this.X = x; + this.Y = y; + this.Z = z; + } + + public Position(int x, int y, double z, int headRotation, int bodyRotation) { + this.X = x; + this.Y = y; + this.Z = z; + this.headRotation = headRotation; + this.bodyRotation = bodyRotation; + } + + /** + * Checks if current tile touches target tile + */ + public boolean touches(Position position) { + return this.getDistanceSquared(position) <= 1; + } + + /** + * Gets the x. + * + * @return the x + */ + public int getX() { + return X; + } + + /** + * Sets the x. + * + * @param x the new x + */ + public void setX(int x) { + X = x; + } + + /** + * Gets the y. + * + * @return the y + */ + public int getY() { + return Y; + } + + /** + * Sets the y. + * + * @param y the new y + */ + public void setY(int y) { + Y = y; + } + + /** + * Gets the z. + * + * @return the z + */ + public double getZ() { + return Z; + } + + /** + * Sets the z. + * + * @param z the new z + */ + public void setZ(double z) { + Z = z; + } + + /** + * Gets the body rotation. + * + * @return the body rotation + */ + public int getBodyRotation() { + return bodyRotation; + } + + /** + * Sets the body rotation. + * + * @param bodyRotation the new body rotation + */ + public void setBodyRotation(int bodyRotation) { + this.bodyRotation = bodyRotation; + } + + /** + * Gets the head rotation. + * + * @return the head rotation + */ + public int getHeadRotation() { + return headRotation; + } + + /** + * Sets the head rotation. + * + * @param headRotation the new head rotation + */ + public void setHeadRotation(int headRotation) { + this.headRotation = headRotation; + } + + /** + * Gets the rotation. + * + * @return the rotation + */ + public int getRotation() { + return bodyRotation; + } + + /** + * Sets the rotation. + * + * @param headRotation the new rotation + */ + public void setRotation(int headRotation) { + this.headRotation = headRotation; + this.bodyRotation = headRotation; + } + + /** + * Adds the. + * + * @param other the other + * @return the position + */ + public Position add(Position other) { + return new Position(other.getX() + getX(), other.getY() + getY(), other.getZ() + getZ()); + } + + /** + * Subtract. + * + * @param other the other + * @return the position + */ + public Position subtract(Position other) { + return new Position(other.getX() - getX(), other.getY() - getY(), other.getZ() - getZ()); + } + + /** + * Gets the distance squared. + * + * @param point the point + * @return the distance squared + */ + public int getDistanceSquared(Position point) { + int dx = this.getX() - point.getX(); + int dy = this.getY() - point.getY(); + + return (int) Math.sqrt((dx * dx) + (dy * dy)); + } + + /** + * Gets the square in front. + * + * @return the square in front + */ + public Position getSquareInFront() { + Position square = this.copy(); + + if (this.bodyRotation == 0) { + square.Y--; + } else if (this.bodyRotation == 1) { + square.X++; + square.Y--; + } else if (this.bodyRotation == 2) { + square.X++; + } else if (this.bodyRotation == 3) { + square.X++; + square.Y++; + } else if (this.bodyRotation == 4) { + square.Y++; + } else if (this.bodyRotation == 5) { + square.X--; + square.Y++; + } else if (this.bodyRotation == 6) { + square.X--; + } else if (this.bodyRotation == 7) { + square.X--; + square.Y--; + } + + return square; + } + + /** + * Gets the square behind + * + * @return the square behind + */ + public Position getSquareBehind() { + Position square = this.copy(); + + if (this.bodyRotation == 0) { + square.Y++; + } else if (this.bodyRotation == 1) { + square.X--; + square.Y++; + } else if (this.bodyRotation == 2) { + square.X--; + } else if (this.bodyRotation == 3) { + square.X--; + square.Y--; + } else if (this.bodyRotation == 4) { + square.Y--; + } else if (this.bodyRotation == 5) { + square.X++; + square.Y--; + } else if (this.bodyRotation == 6) { + square.X++; + } else if (this.bodyRotation == 7) { + square.X++; + square.Y++; + } + + return square; + } + + /** + * Gets the square to the right. + * + * @return the square to the right + */ + public Position getSquareRight() { + Position square = this.copy(); + + if (this.bodyRotation == 0) { + square.X++; + } else if (this.bodyRotation == 1) { + square.X++; + square.Y++; + } else if (this.bodyRotation == 2) { + square.Y++; + } else if (this.bodyRotation == 3) { + square.X--; + square.Y++; + } else if (this.bodyRotation == 4) { + square.X--; + } else if (this.bodyRotation == 5) { + square.X--; + square.Y--; + } else if (this.bodyRotation == 6) { + square.Y--; + } else if (this.bodyRotation == 7) { + square.X++; + square.Y--; + } + + return square; + } + + /** + * Gets the square to the right. + * + * @return the square to the right + */ + public Position getSquareLeft() { + Position square = this.copy(); + + if (this.bodyRotation == 0) { + square.X--; + } else if (this.bodyRotation == 1) { + square.X--; + square.Y--; + } else if (this.bodyRotation == 2) { + square.Y--; + } else if (this.bodyRotation == 3) { + square.X++; + square.Y--; + } else if (this.bodyRotation == 4) { + square.X++; + } else if (this.bodyRotation == 5) { + square.X++; + square.Y++; + } else if (this.bodyRotation == 6) { + square.Y++; + } else if (this.bodyRotation == 7) { + square.X--; + square.Y++; + } + + return square; + } + + /** + * Cords to create list of coordinates for a flat circle + * @param radius the radius + * @return the list of coordinates + */ + public List getCircle(int radius) { + var sphere = new ArrayList(); + + for (int x = -radius; x <= radius; x++) { + for (int y = -radius; y <= radius; y++) { + var b = this.add(new Position(x, y)); + + if (this.getDistanceSquared(b) <= radius) { + sphere.add(b); + } + } + } + + return sphere; + + /* for(int i = 0;i < circumference; i++) + { + double angle = i * increment; + double x = this.getX() + (radius * Math.cos(angle)); + double y = this.getY() + (radius * Math.sin(angle)); + coords.add(new Position((int)x, (int)y, this.getZ())); + } + radius = (radius * 2); // Convert radius to diameter + + return coords; + + List coords = new ArrayList<>(); + + for (int x = this.getX() - radius; x <= this.getX() + radius; x++) { + for (int y = this.getY() - radius; y <= this.getY() + radius; y++) { + double dist = new Position(x, y).getDistanceSquared(this); + + int cx = this.getX(); + int cy = (int)this.getZ(); + int cz = this.getY(); + + boolean sphere = true; + boolean hollow = false; + int h = 1; + + for (int x = cx - radius; x <= cx + radius; x++) { + for (int z = cz - radius; z <= cz + radius; z++) { + //for (int y = (sphere ? cy - radius : cy); y < (sphere ? cy + radius : cy + h); y++) { + double dist = (cx - x) * (cx - x) + (cz - z) * (cz - z);// + (sphere ? (cy - y) * (cy - y) : 0); + if (dist < radius * radius && !(hollow && dist < (radius - 1) * (radius - 1))) { + //Location l = new Location(loc.getWorld(), x, y + plus_y, z); + //circleblocks.add(l); + coords.add(new Position(x, z)); + } + //}*/ + } + + /** + * Copies the position. + * + * @return the position + */ + public Position copy() { + return new Position(this.X, this.Y, this.Z, this.headRotation, this.bodyRotation); + } + + public void override(Position newPosition) { + this.X = newPosition.getX(); + this.Y = newPosition.getY(); + this.Z = newPosition.getZ(); + this.headRotation = newPosition.getHeadRotation(); + this.bodyRotation = newPosition.getBodyRotation(); + } + + /** + * Checks if is match, only checks X and Y coordinate, which is + * intentional. + * + * @param obj the {@link Position} + * @return true, if is match + */ + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + + if (obj instanceof Position) { + Position position = (Position) obj; + return position.getX() == this.X && position.getY() == this.Y; + } + + return false; + } + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "[" + this.X + ", " + this.Y + "]"; + } + +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/pathfinder/Rotation.java b/Havana-Server/src/main/java/org/alexdev/havana/game/pathfinder/Rotation.java new file mode 100644 index 0000000..690a61c --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/pathfinder/Rotation.java @@ -0,0 +1,67 @@ +package org.alexdev.havana.game.pathfinder; + +public class Rotation { + public static int calculateHumanDirection(int x1, int y1, int X2, int Y2) { + int rotation = 0; + + if (x1 > X2 && y1 > Y2) + rotation = 7; + else if (x1 < X2 && y1 < Y2) + rotation = 3; + else if (x1 > X2 && y1 < Y2) + rotation = 5; + else if (x1 < X2 && y1 > Y2) + rotation = 1; + else if (x1 > X2) + rotation = 6; + else if (x1 < X2) + rotation = 2; + else if (y1 < Y2) + rotation = 4; + + return rotation; + } + + public static int calculateWalkDirection(Position from, Position to) { + return calculateWalkDirection(from.getX(), from.getY(), to.getX(), to.getY()); + } + + public static int calculateWalkDirection(int x, int y, int to_x, int to_y) { + if (x == to_x) { + if (y < to_y) + return 4; + else + return 0; + } else if (x > to_x) { + if (y == to_y) + return 6; + else if (y < to_y) + return 5; + else + return 7; + } else { + if (y == to_y) + return 2; + else if (y < to_y) + return 3; + else + return 1; + } + } + + public static int getHeadRotation(int rotation, Position position, Position towards) { + int headRotation = rotation; + int diff = rotation - Rotation.calculateHumanDirection(position.getX(), position.getY(), towards.getX(), towards.getY()); + + if ((position.getRotation() % 2) == 0) { + if (diff > 0) { + headRotation = (rotation - 1); + } else if (diff < 0) { + headRotation = (rotation + 1); + } + } + + return headRotation; + } + +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/pets/Pet.java b/Havana-Server/src/main/java/org/alexdev/havana/game/pets/Pet.java new file mode 100644 index 0000000..f5d6ccd --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/pets/Pet.java @@ -0,0 +1,141 @@ +package org.alexdev.havana.game.pets; + +import org.alexdev.havana.dao.mysql.PetDao; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.room.entities.RoomPet; +import org.alexdev.havana.game.room.enums.StatusType; +import org.alexdev.havana.util.DateUtil; + +import java.util.concurrent.TimeUnit; + +public class Pet extends Entity { + private PetDetails petDetails; + private PetAction petAction; + private long actionExpiry; + private RoomPet roomUser; + private boolean walkBeforeSitLay; + private int lastActionTime; + + public Pet(PetDetails petDetails) { + this.petDetails = petDetails; + this.roomUser = new RoomPet(this); + this.petAction = PetAction.NONE; + } + + public void awake() { + this.roomUser.removeStatus(StatusType.SLEEP); + this.roomUser.setNeedsUpdate(true); + + this.petAction = PetAction.NONE; + this.actionExpiry = 0; + + this.petDetails.setLastKip(DateUtil.getCurrentTimeSeconds()); + PetDao.saveDetails(this.petDetails.getId(), this.petDetails); + } + + public int getAge() { + return (int) TimeUnit.SECONDS.toDays(DateUtil.getCurrentTimeSeconds() - this.petDetails.getBorn()); + } + + public int getHunger() { + return PetManager.getInstance().getPetStats(this.petDetails.getLastEat(), PetStat.HUNGER); + } + + public int getThirst() { + return PetManager.getInstance().getPetStats(this.petDetails.getLastDrink(), PetStat.THIRST); + } + + public int getHappiness() { + return PetManager.getInstance().getPetStats(this.petDetails.getLastPlayToy(), PetStat.HAPPINESS); + } + + public int getEnergy() { + return PetManager.getInstance().getPetStats(this.petDetails.getLastKip(), PetStat.ENERGY); + } + + public int getFriendship() { + return PetManager.getInstance().getPetStats(this.petDetails.getLastPlayUser(), PetStat.FRIENDSHIP); + } + + public boolean isThirsty() { + return this.getThirst() <= 2; + } + + public boolean isHungry() { + return this.getHunger() <= 3; + } + + + @Override + public boolean hasFuse(Fuseright permission) { + return false; + } + + @Override + public PetDetails getDetails() { + return this.petDetails; + } + + @Override + public RoomPet getRoomUser() { + return this.roomUser; + } + + @Override + public EntityType getType() { + return EntityType.PET; + } + + @Override + public void dispose() { + + } + + public PetAction getAction() { + return petAction; + } + + public void setAction(PetAction petAction) { + this.petAction = petAction; + this.lastActionTime = DateUtil.getCurrentTimeSeconds(); + } + + public boolean isDoingAction() { + return !hasActionExpired() && (this.petAction == PetAction.SLEEP || this.petAction == PetAction.EAT || this.petAction == PetAction.DRINK || this.petAction == PetAction.LAY || this.petAction == PetAction.SIT); + } + + public boolean isActionAllowed() { + return (this.petAction == PetAction.NONE || this.petAction == PetAction.SIT || this.petAction == PetAction.LAY) && (this.roomUser.getCurrentItem() == null || ((!this.roomUser.getCurrentItem().getDefinition().hasBehaviour(ItemBehaviour.CAN_SIT_ON_TOP) && !this.roomUser.getCurrentItem().getDefinition().hasBehaviour(ItemBehaviour.CAN_LAY_ON_TOP)) && this.roomUser.getCurrentItem().getDatabaseId() != this.petDetails.getItemId())); + } + + public boolean hasActionExpired() { + return DateUtil.getCurrentTimeSeconds() > this.actionExpiry; + } + + public void setActionDuration(int seconds) { + this.actionExpiry = DateUtil.getCurrentTimeSeconds() + seconds; + } + + public boolean isWalkBeforeSitLay() { + return walkBeforeSitLay; + } + + public void setWalkBeforeSitLay(boolean walkBeforeSitLay) { + this.walkBeforeSitLay = walkBeforeSitLay; + } + + public boolean isTired() { + return getEnergy() <= 2; + } + + public int getLastActionTime() { + return lastActionTime; + } + + public void setLastActionTime(int lastActionTime) { + this.lastActionTime = lastActionTime; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/pets/PetAction.java b/Havana-Server/src/main/java/org/alexdev/havana/game/pets/PetAction.java new file mode 100644 index 0000000..2fd7cd3 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/pets/PetAction.java @@ -0,0 +1,25 @@ +package org.alexdev.havana.game.pets; + +public enum PetAction { + NONE(0), + SLEEP(0), + EAT(0), + DRINK(0), + WALKING(0), + SIT(0), + LAY(0), + JUMP(0), + DEAD(0), + PLAY(0), + BEG(0); + + private final int actionLength; + + PetAction(int actionLength) { + this.actionLength = actionLength; + } + + public int getActionLength() { + return actionLength; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/pets/PetDetails.java b/Havana-Server/src/main/java/org/alexdev/havana/game/pets/PetDetails.java new file mode 100644 index 0000000..9c1f3fa --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/pets/PetDetails.java @@ -0,0 +1,188 @@ +package org.alexdev.havana.game.pets; + +import org.alexdev.havana.game.player.PlayerDetails; + +public class PetDetails extends PlayerDetails { + private int id; + private long itemId; + private String name; + private String type; + private String race; + private String colour; + private int naturePositive; + private int natureNegative; + private float friendship; + private long born; + private long lastKip; + private long lastEat; + private long lastDrink; + private long lastPlayToy; + private long lastPlayUser; + private int X; + private int Y; + private int Rotation; + + public PetDetails(int id, long itemId, String name, String type, String race, String colour, int naturePositive, int natureNegative, float friendship, long born, long lastKip, long lastEat, long lastDrink, long lastPlayToy, long lastPlayUser, int x, int y, int rotation) { + this.id = id; + this.itemId = itemId; + this.name = name; + this.type = type; + this.race = race; + this.colour = colour; + this.naturePositive = naturePositive; + this.natureNegative = natureNegative; + this.friendship = friendship; + this.born = born; + this.lastKip = lastKip; + this.lastEat = lastEat; + this.lastDrink = lastDrink; + this.lastPlayToy = lastPlayToy; + this.lastPlayUser = lastPlayUser; + this.X = x; + this.Y = y; + this.Rotation = rotation; + } + + @Override + public int getId() { + return id; + } + + public long getItemId() { + return itemId; + } + + @Override + public String getName() { + return name; + } + + @Override + public String getFigure() { + return this.type + " " + this.race + " " + this.colour; + } + + public void setName(String name) { + this.name = name; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getRace() { + return race; + } + + public void setRace(String race) { + this.race = race; + } + + public String getColour() { + return colour; + } + + public void setColour(String colour) { + this.colour = colour; + } + + public int getNaturePositive() { + return naturePositive; + } + + public void setNaturePositive(int naturePositive) { + this.naturePositive = naturePositive; + } + + public int getNatureNegative() { + return natureNegative; + } + + public void setNatureNegative(int natureNegative) { + this.natureNegative = natureNegative; + } + + public float getFriendship() { + return friendship; + } + + public void setFriendship(float friendship) { + this.friendship = friendship; + } + + public long getBorn() { + return born; + } + + public void setBorn(long born) { + this.born = born; + } + + public long getLastKip() { + return lastKip; + } + + public void setLastKip(long lastKip) { + this.lastKip = lastKip; + } + + public long getLastEat() { + return lastEat; + } + + public void setLastEat(long lastEat) { + this.lastEat = lastEat; + } + + public long getLastDrink() { + return lastDrink; + } + + public void setLastDrink(long lastDrink) { + this.lastDrink = lastDrink; + } + + public long getLastPlayToy() { + return lastPlayToy; + } + + public void setLastPlayToy(long lastPlayToy) { + this.lastPlayToy = lastPlayToy; + } + + public long getLastPlayUser() { + return lastPlayUser; + } + + public void setLastPlayUser(long lastPlayUser) { + this.lastPlayUser = lastPlayUser; + } + + public int getX() { + return X; + } + + public void setX(int x) { + X = x; + } + + public int getY() { + return Y; + } + + public void setY(int y) { + Y = y; + } + + public int getRotation() { + return Rotation; + } + + public void setRotation(int rotation) { + Rotation = rotation; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/pets/PetManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/pets/PetManager.java new file mode 100644 index 0000000..bbed053 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/pets/PetManager.java @@ -0,0 +1,402 @@ +package org.alexdev.havana.game.pets; + +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.enums.StatusType; +import org.alexdev.havana.game.wordfilter.WordfilterManager; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.StringUtil; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.TimeUnit; + +public class PetManager { + private static PetManager instance; + public String[] petSpeeches = { + "pet.saying.play.croc.0=*Chases tail*", + "pet.saying.sleep.cat.4=Meow!", + "pet.saying.sniff.dog.2=*Grrruff! *Sniffs happily*", + "pet.saying.angry.croc.2=*licks foot*", + "pet.saying.sniff.dog.1=Grrruff! *Sniffs happily*", + "pet.saying.eat.dog.0=Woof! *wags tail excitedly*", + "pet.saying.sniff.dog.0=Grrruff! *Sniffs happily*", + "pet.saying.beg.cat.2=Meow!", + "pet.saying.play.dog.0=*Chases tail*", + "pet.saying.beg.croc.2=Snap!", + "pet.saying.play.croc.1=*Snaps happily*", + "pet.saying.generic.dog.2=*Runs happily up to Habbo*", + "pet.saying.generic.dog.3=*Jumps on Habbo happily*", + "pet.saying.sniff.croc.0=*sniffs inquisitively*", + "pet.saying.angry.dog.4=*Licks foot apologetically*", + "pet.saying.angry.dog.3=Woof! Woof!", + "pet.saying.play.dog.1=*Fetches ball*", + "pet.saying.eat.cat.2=Meow! *Licks food*", + "pet.saying.eat.cat.1=Meow! *Sniffs food*", + "pet.saying.angry.croc.3=Snap! *innocent smile*", + "pet.saying.beg.croc.1=Snap!", + "pet.saying.beg.cat.0=Purrrrrr *walks around legs*", + "pet.saying.generic.cat.4=Meow", + "pet.saying.sleep.dog.6=Woof! Zzzzzzz", + "pet.saying.angry.croc.4=Snap! *innocent smile*", + "pet.saying.play.cat.1=*Chases mouse*", + "pet.saying.sleep.dog.5=Ruff! Zzzzzzzz *wags tail*", + "pet.saying.eat.croc.4=*Smiles contently*", + "pet.saying.eat.cat.0=Meow! *Sniffs food*", + "pet.saying.sleep.dog.3=Ruff! Zzzzzzzz *wags tail*", + "pet.saying.sleep.dog.4=Ruff! Zzzzzzzz *wags tail*", + "pet.saying.generic.croc.0=Rrrr....Grrrrrg....", + "pet.saying.eat.croc.3=Snap! *Chomps on food*", + "pet.saying.eat.croc.1=Snap! *Swallows food whole*", + "pet.saying.angry.cat.2=Meow!", + "pet.saying.sleep.dog.2=Ruff! Zzzzzzzz *wags tail*", + "pet.saying.eat.croc.2=Snap! *Swallows food whole*", + "pet.saying.sleep.croc.0=Zzzzzz *dreams of wilderbeast*", + "pet.saying.sleep.croc.1=Zzzzzz *dreams of zebra*", + "pet.saying.sleep.croc.5=Zzzzzz *dreams of wilderbeast*", + "pet.saying.sleep.dog.0=Ruff! Zzzzzzzz *wags tail*", + "pet.saying.sleep.croc.3=Zzzzzz *dreams of springboekt*", + "pet.saying.angry.cat.3=Meow", + "pet.saying.sleep.cat.1=Purrr zzzzz", + "pet.saying.generic.croc.1=Snap!", + "pet.saying.sleep.dog.1=Zzzzzz", + "pet.saying.angry.cat.0=Mew *sad eyes*", + "pet.saying.sniff.croc.2=*Watches for hours until it moves*", + "pet.saying.sniff.croc.1=*Watches for hours until it moves*", + "pet.saying.sleep.croc.2=Zzzzzz *dreams of wilderbeast*", + "pet.saying.angry.cat.1=Purrrrrr ... *walks around legs*", + "pet.saying.sniff.cat.0=*sniffs inquisitively*", + "pet.saying.eat.dog.2=Woof! *chews*", + "pet.saying.eat.dog.1=Woof! *chews*", + "pet.saying.sleep.croc.6=Zzzzzz *dreams of wilderbeast*", + "pet.saying.eat.dog.3=Woof! *wags tail excitedly*", + "pet.saying.beg.croc.0=Snap!", + "pet.saying.play.cat.0=*Jumps at shadow puppet*", + "pet.saying.generic.croc.2=*Tail flip*", + "pet.saying.beg.dog.1=Woof! Woof!", + "pet.saying.generic.cat.1=Purrrr", + "pet.saying.generic.cat.0=Purrrr", + "pet.saying.eat.croc.0=Snap! *Swallows food whole*", + "pet.saying.beg.dog.2=Woof! *Sits patiently*", + "pet.saying.angry.dog.1=Ruff!", + "pet.saying.generic.cat.3=Meow", + "pet.saying.generic.dog.1=Woof! Woof!", + "pet.saying.eat.dog.4=Woof! *wags tail excitedly*", + "pet.saying.angry.croc.1=Snap! *innocent smile*", + "pet.saying.generic.croc.3=*Walks up to Habbo excitedly*", + "pet.saying.angry.croc.0=Snap!", + "pet.saying.angry.dog.0=*Puppy dog eyes*", + "pet.saying.beg.dog.0=*lifts paws onto Habbos knees*", + "pet.saying.beg.cat.1=Purrrrrr *walks around legs*", + "pet.saying.generic.cat.2=Purrrr", + "pet.saying.sleep.cat.3=Meow!", + "pet.saying.sleep.cat.0=Purrr zzzzz", + "pet.saying.generic.dog.0=Grrrrufff!", + "pet.saying.sleep.croc.4=Zzzzzz *dreams of elephant burgers*", + "pet.saying.sleep.cat.2=Purrr zzzzz", + "pet.saying.angry.dog.2=*Whines*" + }; + + /** + * Handle speech for pets. + * + * @param player the player to call it + * @param speech the speech to do + */ + public void handleSpeech(Player player, Room room, String speech) { + String[] data = speech.split(" "); + + if (data.length < 2) + return; + + if (!room.hasRights(player.getDetails().getId()) && !player.hasFuse(Fuseright.MOD)) { + return; + } + + for (Pet pet : room.getEntityManager().getEntitiesByClass(Pet.class)) { + if (pet.getDetails().getName().toLowerCase().equals(data[0].toLowerCase())) { + petCommand(player, room, pet, speech.replace(data[0] + " ", "")); + } + } + } + + private void petCommand(Player player, Room room, Pet pet, String command) { + var item = pet.getRoomUser().getCurrentItem(); + boolean petCommanded = false; + + switch (command.toLowerCase()) { + case "speak": { + // Bark, meow, etc + break; + } + case "good": { + // Boosts pet's ego and makes them happy + break; + } + case "beg": { + // Beg for reward + break; + } + case "go": + case "go away": { + // Pet moves away from player + break; + } + case "bad": { + // Tells pet off + break; + } + case "come over": + case "come": + case "heel": { + // Follow player + break; + } + case "play dead": + case "dead": { + int length = ThreadLocalRandom.current().nextInt(4, 11); + + pet.getRoomUser().getStatuses().clear(); + pet.getRoomUser().getPosition().setRotation(pet.getRoomUser().getPosition().getBodyRotation()); + pet.getRoomUser().setStatus(StatusType.DEAD, StatusType.DEAD.getStatusCode(), length, null, -1, -1); + pet.getRoomUser().setNeedsUpdate(true); + + pet.setAction(PetAction.DEAD); + pet.setActionDuration(length); + petCommanded = true; + break; + } + case "sit": { + int length = ThreadLocalRandom.current().nextInt(10, 30); + + pet.getRoomUser().getStatuses().clear(); + pet.getRoomUser().getPosition().setRotation(pet.getRoomUser().getPosition().getBodyRotation()); + pet.getRoomUser().setStatus(StatusType.SIT, StringUtil.format(pet.getRoomUser().getPosition().getZ()), length, null, -1, -1); + pet.getRoomUser().setNeedsUpdate(true); + + pet.setAction(PetAction.SIT); + pet.setActionDuration(length); + petCommanded = true; + break; + } + case "lie down": + case "lay": { + pet.getRoomUser().getStatuses().clear(); + pet.getRoomUser().getPosition().setRotation(pet.getRoomUser().getPosition().getBodyRotation()); + pet.getRoomUser().setStatus(StatusType.LAY, StringUtil.format(pet.getRoomUser().getPosition().getZ()) + " null"); + pet.getRoomUser().setNeedsUpdate(true); + + pet.setAction(PetAction.LAY); + pet.setActionDuration(ThreadLocalRandom.current().nextInt(10, 30)); + + petCommanded = true; + break; + } + case "jump": { + if (!pet.isActionAllowed()) { + return; + } + + int length = ThreadLocalRandom.current().nextInt(2, 4); + + pet.getRoomUser().getStatuses().clear(); + pet.getRoomUser().getPosition().setRotation(pet.getRoomUser().getPosition().getBodyRotation()); + pet.getRoomUser().setStatus(StatusType.JUMP, StatusType.JUMP.getStatusCode().toLowerCase(), length, null, -1, -1); + pet.getRoomUser().setNeedsUpdate(true); + + pet.setAction(PetAction.JUMP); + pet.setActionDuration(length); + petCommanded = true; + break; + } + case "sleep": { + if (pet.isDoingAction()) { + return; + } + + Item nest = room.getItemManager().getByDatabaseId(pet.getDetails().getItemId()); + pet.getRoomUser().walkTo(nest.getPosition().getX(), nest.getPosition().getY()); + + if (pet.getRoomUser().isWalking()) { + pet.setAction(PetAction.SLEEP); + } else { + if (item != null) { + if (item.getDatabaseId() == pet.getDetails().getItemId()) { + item.getDefinition().getInteractionType().getTrigger().onEntityStop(pet, pet.getRoomUser(), item, false); + pet.setAction(PetAction.SLEEP); + } + } + } + + if (pet.getAction() == PetAction.SLEEP) { + pet.getRoomUser().getStatuses().clear(); + pet.getRoomUser().setNeedsUpdate(true); + } + + break; + } + case "awake": { + if (pet.getAction() != PetAction.SLEEP) { + return; + } + + pet.awake(); + break; + } + } + + if (petCommanded) { + if (pet.getRoomUser().isWalking()) { + pet.getRoomUser().stopWalking(); + } + } + } + + /** + * Get the pet stats when given the last time and stat type. + * + * @param lastTime the last time for an action + * @param stat the current pet stat + * @return the stat type + */ + public int getPetStats(long lastTime, PetStat stat) { + int a = (int) TimeUnit.SECONDS.toHours(DateUtil.getCurrentTimeSeconds() - lastTime); + + if (a < 2) { + return stat.getAttributeType(); + } + + for (int x = 1; x <= stat.getAttributeType(); x++) { + if (a > (2 * x)) + return x; + } + + return stat.getAttributeType(); + + } + + /** + * Get if the pet name is valid. + * + * @param ownerName + * @param name the name of the pet + */ + public int isValidName(String ownerName, String name) { + String[] words = StringUtil.getWords(name); + + for (String word : words) { + if (WordfilterManager.getInstance().getBannedWords().contains(word)) { + return 3; + } + } + + // Bad! + if (!StringUtil.filterInput(name, true).equals(name)) { + return 2; + } + + if (name.isBlank() || name.contains(" ")) { + return 2; + } + + if (name.length() > 15) { + return 1; + } + + if (name.length() < 1) { + return 1; + } + + if (ownerName.toLowerCase().equals(name.toLowerCase())) { + return 4; + } + + return 0; + } + + public PetType getType(Pet pet) { + switch (pet.getDetails().getType()) { + case "0": { + return PetType.DOG; + } + case "1": { + return PetType.CAT; + } + case "2": { + return PetType.CROC; + } + } + + return null; + } + + /** + * Gets a random speech element by pet type. + * + * @param pet the pet type given + * @return the speech selected + */ + public String getRandomSpeech(Pet pet) { + List possibleChatValues = new ArrayList<>(); + + String speech = null; + + if (pet.getAction() != null) { + switch (pet.getAction()) { + case SLEEP: + case DEAD: + possibleChatValues.addAll(getChatValue(this.getType(pet), "sleep")); + break; + case EAT: + possibleChatValues.addAll(getChatValue(this.getType(pet), "eat")); + break; + case BEG: + possibleChatValues.addAll(getChatValue(this.getType(pet), "beg")); + break; + case JUMP: + case PLAY: + possibleChatValues.addAll(getChatValue(this.getType(pet), "play")); + break; + } + } + + if (pet.getAction() == PetAction.NONE || pet.getAction() == PetAction.SIT || pet.getAction() == PetAction.LAY) { + possibleChatValues.addAll(getChatValue(this.getType(pet), "sniff")); + possibleChatValues.addAll(getChatValue(this.getType(pet), "generic")); + } + + if (possibleChatValues.size() > 0) { + return possibleChatValues.get(ThreadLocalRandom.current().nextInt(possibleChatValues.size())); + } + + return null; + } + + private List getChatValue(PetType type, String action) { + List speeches = new ArrayList<>(); + + for (var speech : this.petSpeeches) { + if (speech.startsWith("pet.saying." + action + "." + type.name().toLowerCase())) { + speeches.add(speech.split("=")[1]); + } + } + + return speeches; + } + + /** + * Get the {@link PetManager} instance + * + * @return the item manager instance + */ + public static PetManager getInstance() { + if (instance == null) { + instance = new PetManager(); + } + + return instance; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/pets/PetStat.java b/Havana-Server/src/main/java/org/alexdev/havana/game/pets/PetStat.java new file mode 100644 index 0000000..da52b5d --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/pets/PetStat.java @@ -0,0 +1,19 @@ +package org.alexdev.havana.game.pets; + +public enum PetStat { + HUNGER(6), + THIRST(3), + HAPPINESS(6), + ENERGY(7), + FRIENDSHIP(7); + + private int attributeType; + + PetStat(int attributeType) { + this.attributeType = attributeType; + } + + public int getAttributeType() { + return attributeType; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/pets/PetType.java b/Havana-Server/src/main/java/org/alexdev/havana/game/pets/PetType.java new file mode 100644 index 0000000..e2a6f6d --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/pets/PetType.java @@ -0,0 +1,7 @@ +package org.alexdev.havana.game.pets; + +public enum PetType { + DOG, + CAT, + CROC; +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/player/Player.java b/Havana-Server/src/main/java/org/alexdev/havana/game/player/Player.java new file mode 100644 index 0000000..c344b7c --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/player/Player.java @@ -0,0 +1,622 @@ +package org.alexdev.havana.game.player; + +import io.netty.util.AttributeKey; +import org.alexdev.havana.dao.mysql.*; +import org.alexdev.havana.game.achievements.user.UserAchievementManager; +import org.alexdev.havana.game.badges.BadgeManager; +import org.alexdev.havana.game.club.ClubSubscription; +import org.alexdev.havana.game.effects.Effect; +import org.alexdev.havana.game.encryption.DiffieHellman; +import org.alexdev.havana.game.encryption.RC4; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.fuserights.FuserightsManager; +import org.alexdev.havana.game.groups.Group; +import org.alexdev.havana.game.groups.GroupMemberRank; +import org.alexdev.havana.game.guides.GuideManager; +import org.alexdev.havana.game.inventory.Inventory; +import org.alexdev.havana.game.messenger.Messenger; +import org.alexdev.havana.game.player.guides.PlayerGuideManager; +import org.alexdev.havana.game.player.statistics.PlayerStatistic; +import org.alexdev.havana.game.player.statistics.PlayerStatisticManager; +import org.alexdev.havana.game.room.entities.RoomPlayer; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; +import org.alexdev.havana.messages.outgoing.alerts.HOTEL_LOGOUT; +import org.alexdev.havana.messages.outgoing.alerts.HOTEL_LOGOUT.LogoutReason; +import org.alexdev.havana.messages.outgoing.club.CLUB_GIFT; +import org.alexdev.havana.messages.outgoing.effects.AVATAR_EFFECTS; +import org.alexdev.havana.messages.outgoing.handshake.LOGIN; +import org.alexdev.havana.messages.outgoing.handshake.RIGHTS; +import org.alexdev.havana.messages.outgoing.handshake.UniqueIDMessageEvent; +import org.alexdev.havana.messages.outgoing.openinghours.INFO_HOTEL_CLOSING; +import org.alexdev.havana.messages.outgoing.user.settings.HELP_ITEMS; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.NettyPlayerNetwork; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.StringUtil; +import org.alexdev.havana.util.config.GameConfiguration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.*; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.TimeUnit; + +public class Player extends Entity { + public static final AttributeKey PLAYER_KEY = AttributeKey.valueOf("Player"); + + private final NettyPlayerNetwork network; + private final PlayerDetails details; + private final RoomPlayer roomEntity; + + private Logger log; + private Messenger messenger; + private Inventory inventory; + private BadgeManager badgeManager; + private UserAchievementManager achievementManager; + private PlayerGuideManager guideManager; + private PlayerStatisticManager statisticManager; + + private CopyOnWriteArrayList effects; + private Set ignoredList; + + private DiffieHellman diffieHellman; + private RC4 rc4; + + private boolean loggedIn; + private boolean disconnected; + private boolean pingOK; + private boolean hasGenerateKey; + private long timeConnected; + private boolean processLoginSteps; + private List joinedGroups; + private String lastGift; + + public Player(NettyPlayerNetwork nettyPlayerNetwork) { + this.network = nettyPlayerNetwork; + this.details = new PlayerDetails(); + this.badgeManager = new BadgeManager(); + this.diffieHellman = new DiffieHellman(); + this.roomEntity = new RoomPlayer(this); + this.guideManager = new PlayerGuideManager(this); + this.statisticManager = new PlayerStatisticManager(-1, Map.of()); + this.achievementManager = new UserAchievementManager(); + this.effects = new CopyOnWriteArrayList<>(); + this.ignoredList = new HashSet<>(); + this.log = LoggerFactory.getLogger("Connection " + this.network.getConnectionId()); + this.pingOK = true; + this.disconnected = false; + this.processLoginSteps = true; + } + + /** + * Login handler for player + */ + public void login() { + this.log = LoggerFactory.getLogger("Player " + this.details.getName()); // Update logger to show name + this.loggedIn = true; + this.pingOK = true; + this.timeConnected = DateUtil.getCurrentTimeSeconds(); + + PlayerManager.getInstance().disconnectSession(this.details.getId()); // Kill other sessions with same id + PlayerManager.getInstance().addPlayer(this); // Add new connection + + this.details.setLastOnline(DateUtil.getCurrentTimeSeconds()); + + if (!this.details.getName().equals("Abigail.Ryan")) { + PlayerDao.saveLastOnline(this.details.getId(), this.details.getLastOnline(), true); + } + + SettingsDao.updateSetting("players.online", String.valueOf(PlayerManager.getInstance().getPlayers().size())); + + if (GameConfiguration.getInstance().getBoolean("reset.sso.after.login")) { + PlayerDao.resetSsoTicket(this.details.getId()); // Protect against replay attacks + } + + this.messenger = new Messenger(this); + this.inventory = new Inventory(this); + + // Bye bye! + if (this.getDetails().isBanned() != null) { + this.kickFromServer(); + return; + } + + if (this.details.getMachineId() == null || this.details.getMachineId().isBlank() || !( + this.details.getMachineId().length() == 33 && + this.details.getMachineId().startsWith("#"))) { + this.details.setMachineId(this.network.getClientMachineId()); + this.network.setSaveMachineId(true); + PlayerDao.setMachineId(this.details.getId(), this.details.getMachineId()); + } + + if (this.network.saveMachineId()) { + this.send(new UniqueIDMessageEvent(this.network.getClientMachineId())); + } + + // Update user IP address + String ipAddress = NettyPlayerNetwork.getIpAddress(this.getNetwork().getChannel()); + var latestIp = PlayerDao.getLatestIp(this.details.getId()); + + if (latestIp == null || !latestIp.equals(ipAddress)) { + PlayerDao.logIpAddress(this.getDetails().getId(), ipAddress); + } + + EffectDao.removeEffects(this.details.getId()); + this.effects = EffectDao.getEffects(this.details.getId()); + + if (!this.getDetails().getRespectDay().equals(DateUtil.getCurrentDate(DateUtil.SHORT_DATE))) { + this.getDetails().setRespectDay(DateUtil.getCurrentDate(DateUtil.SHORT_DATE)); + this.getDetails().setDailyRespectPoints(3); + + this.getDetails().setCreditsEligible(true); + CurrencyDao.updateEligibleCredits(this.details.getId(), true); + + PlayerDao.saveRespect(this.details.getId(), this.details.getDailyRespectPoints(), this.details.getRespectPoints(), this.details.getRespectDay(), this.details.getRespectGiven()); + + //CurrencyDao.increasePixels(this.details, 15); + //this.send(new ActivityPointNotification(this.details.getPixels(), ActivityPointNotification.ActivityPointAlertType.PIXELS_RECEIVED)); // Alert pixels received + } + + // Do pixels + TimeUnit pixelsReceived = TimeUnit.valueOf(GameConfiguration.getInstance().getString("pixels.received.timeunit")); + int intervalInSeconds = (int) pixelsReceived.toSeconds(GameConfiguration.getInstance().getInteger("pixels.received.interval")); + this.details.setLastPixelsTime(DateUtil.getCurrentTimeSeconds() + intervalInSeconds); + + // Set trade ban back to 0, easier for db querying + if (this.details.getTradeBanExpiration() > 0 && !this.details.isTradeBanned()) { + this.details.setTradeBanExpiration(0); + ItemDao.saveTradeBanExpire(this.details.getId(), 0); + } + + var stats = PlayerStatisticsDao.getStatistics(this.details.getId()); + + if (stats.isEmpty()) { + PlayerStatisticsDao.newStatistics(this.details.getId(), UUID.randomUUID().toString()); + stats = PlayerStatisticsDao.getStatistics(this.details.getId()); + } + + this.statisticManager = new PlayerStatisticManager(this.details.getId(), stats); + + this.badgeManager.loadBadges(this); + this.achievementManager.loadAchievements(this.details.getId()); + this.details.resetNextHandout(); + this.refreshJoinedGroups(); + + this.send(new RIGHTS(this.getFuserights())); + this.send(new LOGIN()); + this.send(new AVATAR_EFFECTS(this.effects)); + + if (GameConfiguration.getInstance().getBoolean("welcome.message.enabled")) { + String alertMessage = GameConfiguration.getInstance().getString("welcome.message.content"); + alertMessage = StringUtil.replaceAlertMessage(alertMessage, this); + this.send(new ALERT(alertMessage)); + } + + if (PlayerManager.getInstance().isMaintenance()) { + this.send(new INFO_HOTEL_CLOSING(PlayerManager.getInstance().getMaintenanceAt())); + } + + /*if (this.network.isFlashConnected()) { + String alertMessage = "Welcome to Classic Habbo! A reminder:\r\r"; + + alertMessage += "This hotel exists to play all the features that were available on the Shockwave client. The flash client does not have many features.\r\r"; + alertMessage += "It is advisable to use the Shockwave client if you want to experience Classic Habbo for what it is, especially when Flash becomes deprecated on the modern browsers in December 2020.\r\r"; + + alertMessage = StringUtil.replaceAlertMessage(alertMessage, this); + this.send(new ALERT(alertMessage)); + }*/ + + /*if (this.details.getXpExpiry() < DateUtil.getCurrentTimeSeconds()) { + this.details.setXp(0); + this.details.setXpExpiry(DateUtil.getCurrentTimeSeconds() + TimeUnit.DAYS.toSeconds(30)); + PlayerDao.saveXp(this.details.getId(), this.details.getXp(), this.details.getXpExpiry()); + }*/ + + this.messenger.sendStatusUpdate(); + + // Guide checks + this.guideManager.setGuide(GuideManager.getInstance().isGuide(this)); + + if (GameConfiguration.getInstance().getBoolean("tutorial.enabled")) { + if (this.guideManager.isGuide()) { + this.guideManager.setHasTutorial(false); + this.guideManager.refreshGuidingUsers(); + } else { + this.guideManager.setHasTutorial(this.statisticManager.getIntValue(PlayerStatistic.HAS_TUTORIAL) == 1); + } + } + + + if (GameConfiguration.getInstance().getBoolean("tutorial.enabled")) { + if (this.guideManager.hasTutorial()) { + this.send(new HELP_ITEMS(List.of(1, 2, 3, 4, 5, 6, 7, 8))); + } + } + + // Guide admin + if (this.badgeManager.hasBadge("GLK")) { + int guideGroupId = GameConfiguration.getInstance().getInteger("guides.group.id"); + var group = this.getJoinedGroup(guideGroupId); + + if (group != null) { + var groupMember = group.getMember(this.getDetails().getId()); + + if (groupMember == null || (groupMember.getMemberRank() != GroupMemberRank.ADMINISTRATOR && groupMember.getMemberRank() != GroupMemberRank.OWNER)) { + this.badgeManager.removeBadge("GLK"); + } + } + } + + // Habbo eXperts group + if (this.badgeManager.hasBadge("XXX")) { + int expertsGroupId = GameConfiguration.getInstance().getInteger("habbo.experts.group.id"); + var group = this.getJoinedGroup(expertsGroupId); + + if (group != null) { + var expertsMember = group.getMember(this.getDetails().getId()); + + if (expertsMember == null) { + this.badgeManager.removeBadge("XXX"); + } + } + } + + ClubSubscription.countMemberDays(this); + } + + /** + * Refresh club for player. + */ + public void refreshClub() { + if (!this.details.hasClubSubscription()) { + // If the database still thinks we have Habbo club even after it expired, reset it back to 0. + if (this.details.getClubExpiration() > 0) { + this.details.setClubExpiration(0); + this.send(new RIGHTS(this.getFuserights())); + //ClubSubscription.resetClothes(this.details); + PlayerDao.saveSubscription(this.details.getId(), this.details.getFirstClubSubscription(), this.details.getClubExpiration()); + } + } else { + ClubSubscription.checkBadges(this); + + if (ClubSubscription.isGiftDue(this)) { + this.send(new CLUB_GIFT(this.statisticManager.getIntValue(PlayerStatistic.GIFTS_DUE))); + } + } + + ClubSubscription.sendHcDays(this); + } + + /** + * Send fuseright permissions for player. + */ + public List getFuserights() { + List fuserights = FuserightsManager.getInstance().getFuserightsForRank(this.details.getRank()); + + if (this.getDetails().hasClubSubscription()) { + fuserights.addAll(FuserightsManager.getInstance().getClubFuserights()); + } + + fuserights.removeIf(fuse -> !fuse.getFuseright().startsWith("fuse_")); + return fuserights; + } + + /** + * Check if the player has a permission for a rank. + * + * @param fuse the permission + * @return true, if successful + */ + @Override + public boolean hasFuse(Fuseright fuse) { + return FuserightsManager.getInstance().hasFuseright(fuse, this.details); + } + + /** + * Send a response to the player + * + * @param response the response + */ + public void send(MessageComposer response) { + this.network.send(response); + } + + /** + * Send a object to the player + * + * @param object the object to send + */ + public void sendObject(Object object) { + this.network.send(object); + } + + /** + * Get the messenger instance for the player + * + * @return the messenger instance + */ + public Messenger getMessenger() { + return messenger; + } + + /** + * Get the inventory handler for player. + * + * @return the inventory handler + */ + public Inventory getInventory() { + return inventory; + } + + /** + * Get the badge manager for player. + * + * @return the badge manager + */ + public BadgeManager getBadgeManager() { + return badgeManager; + } + + @Override + public PlayerDetails getDetails() { + return this.details; + } + + @Override + public RoomPlayer getRoomUser() { + return this.roomEntity; + } + + @Override + public EntityType getType() { + return EntityType.PLAYER; + } + + /** + * Get the player logger. + * + * @return the logger + */ + public Logger getLogger() { + return this.log; + } + + /** + * Get the network handler for the player + * + * @return the network handler + */ + public NettyPlayerNetwork getNetwork() { + return this.network; + } + + /** + * Get if the player has logged in or not. + * + * @return true, if they have + */ + public boolean isLoggedIn() { + return loggedIn; + } + + /** + * Get if the connection has timed out or not. + * + * @return false, if it hasn't. + */ + public boolean isPingOK() { + return pingOK; + } + + /** + * Get if the socket has been disconnected. + * + * @return true, if it has + */ + public boolean isDisconnected() { + return disconnected; + } + + /** + * Set if the connection has timed out or not. + * + * @param pingOK the value to determine of the connection has timed out + */ + public void setPingOK(boolean pingOK) { + this.pingOK = pingOK; + } + + /** + * Get rid of the player from the server. + */ + public void kickFromServer() { + try { + this.network.send(new HOTEL_LOGOUT(LogoutReason.DISCONNECT)); + this.network.disconnect(); + + this.dispose(); + } catch (Exception ignored) { + // Ignore + } + } + + /** + * Dispose player when disconnect happens. + */ + @Override + public void dispose() { + if (this.loggedIn) { + if (this.roomEntity.getRoom() != null) { + this.roomEntity.getRoom().getEntityManager().leaveRoom(this, false); + } + + if (this.roomEntity.getObservingGameId() != -1) { + this.roomEntity.stopObservingGame(); + } + + if (this.roomEntity.getGamePlayer() != null) { + this.roomEntity.getGamePlayer().getGame().leaveGame(this.roomEntity.getGamePlayer()); + } + + PlayerManager.getInstance().removePlayer(this); + ClubSubscription.countMemberDays(this); + + int loggedInTime = (int) (DateUtil.getCurrentTimeSeconds() - this.timeConnected); + this.statisticManager.incrementValue(PlayerStatistic.ONLINE_TIME, loggedInTime); + this.details.setLastOnline(DateUtil.getCurrentTimeSeconds()); + + GuideManager.getInstance().tryProgress(this); + GuideManager.getInstance().checkGuidingFriends(this); + + if (!this.details.getName().equals("Abigail.Ryan")) { + PlayerDao.saveLastOnline(this.details.getId(), this.details.getLastOnline(), false); + } + + SettingsDao.updateSetting("players.online", String.valueOf(PlayerManager.getInstance().getPlayers().size())); + + if (this.messenger != null) { + this.messenger.sendStatusUpdate(); + } + } + + this.disconnected = true; + this.loggedIn = false; + } + + /** + * Get the diffie-hellman instance of the user. + * + * @return the instance + */ + public DiffieHellman getDiffieHellman() { + return diffieHellman; + } + + /** + * Get the list of user activated effects. + * + * @return the list of effects + */ + public CopyOnWriteArrayList getEffects() { + return effects; + } + + /** + * Get if the user has used the generate key + * + * @return true, if successful + */ + public boolean hasGenerateKey() { + return hasGenerateKey; + } + + /** + * Set whether the user has generated the key + * + * @param hasGenerateKey the flag + */ + public void setHasGenerateKey(boolean hasGenerateKey) { + this.hasGenerateKey = hasGenerateKey; + } + + /** + * Get the user ignored list. + * + * @return the user ignored list + */ + public Set getIgnoredList() { + return ignoredList; + } + + /** + * Get the user achievement manager. + * + * @return the user achievement manager + */ + public UserAchievementManager getAchievementManager() { + return achievementManager; + } + + /** + * Get the guide manager for the user. + * + * @return the guide manager + */ + public PlayerGuideManager getGuideManager() { + return guideManager; + } + + /** + * Get the statistic manager for the user. + * + * @return the statistic manager + */ + public PlayerStatisticManager getStatisticManager() { + return statisticManager; + } + + /** + * Get whether we are processing login steps + * @return true, if successful + */ + public boolean isProcessLoginSteps() { + return processLoginSteps; + } + + /** + * Set whether we are processing login steps + * @param processLoginSteps the flag if we are or not + */ + public void setProcessLoginSteps(boolean processLoginSteps) { + this.processLoginSteps = processLoginSteps; + } + + /** + * Refresh the groups the user has joined + */ + public void refreshJoinedGroups() { + this.joinedGroups = GroupDao.getJoinedGroups(this.details.getId()); + } + + /** + * Get the list of groups the user has joined. + * + * @return the list of groups + */ + public List getJoinedGroups() { + return joinedGroups; + } + + /** + * Get the joined group + * @param joinedGroupId the joined group id + * @return the group + */ + public Group getJoinedGroup(int joinedGroupId) { + return joinedGroups.stream().filter(x -> x.getId() == joinedGroupId).findFirst().orElse(null); + } + + @Override + public boolean isMuted() { + //if (this.getDetails().getRank().getRankId() >= 5) + // return false; + + long mutedExpiresAt = this.statisticManager.getLongValue(PlayerStatistic.MUTE_EXPIRES_AT); + + if (mutedExpiresAt > 0) { + return mutedExpiresAt > DateUtil.getCurrentTimeSeconds(); + } + + return false; + } + + public void setLastGift(String nextSpriteGift) { + this.lastGift = nextSpriteGift; + } + + public String getLastGift() { + return lastGift; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/player/PlayerDetails.java b/Havana-Server/src/main/java/org/alexdev/havana/game/player/PlayerDetails.java new file mode 100644 index 0000000..ad4f45d --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/player/PlayerDetails.java @@ -0,0 +1,541 @@ +package org.alexdev.havana.game.player; + +import org.alexdev.havana.dao.mysql.BanDao; +import org.alexdev.havana.dao.mysql.GroupDao; +import org.alexdev.havana.dao.mysql.GroupMemberDao; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.game.ban.BanType; +import org.alexdev.havana.game.club.ClubSubscription; +import org.alexdev.havana.game.groups.Group; +import org.alexdev.havana.game.groups.GroupMember; +import org.alexdev.havana.game.misc.figure.FigureManager; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.wordfilter.WordfilterManager; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.StringUtil; +import org.alexdev.havana.util.config.GameConfiguration; +import org.apache.commons.lang3.tuple.Pair; + +import java.util.concurrent.TimeUnit; + +public class PlayerDetails { + // Basic info + private int id; + private String username; + private String email; + private String figure; + private String poolFigure; + private String motto; + private String sex; + private String ssoTicket; + private String machineId; + + // Currencies + private int credits; + private int pixels; + private long lastPixelsTime; + private int tickets; + private int film; + private PlayerRank rank; + + // Club + private long firstClubSubscription; + private long clubExpiration; + + // Settings + private boolean allowStalking; + private int selectedRoomId; + private boolean allowFriendRequests; + private boolean onlineStatusVisible; + private boolean profileVisible; + private boolean wordFilterEnabled; + private boolean tradeEnabled; + private boolean soundEnabled; + + // Timestamps + private long nextHandout; + private boolean isCreditsEligible; + private long lastOnline; + private long joinDate; + + // Game points + private int dailyRespectPoints; + private String respectDay; + private String previousRespectDay; + private int respectPoints; + private int respectGiven; + + private boolean isOnline; + private String createdAt; + private long totemEffectExpiry; + private long tradeBanExpiration; + private int favouriteGroupId; + private GroupMember groupMember; + + public PlayerDetails() { + } + + + /** + * Fill the player data for the entity. + * @param id the id to add + * @param username the username + * @param figure the figure + * @param poolFigure the pool figure + * @param credits the credits + * @param motto the motto + * @param sex the sex + * @param tickets the tickets + * @param film the film + * @param rank the rank + * @param lastOnline the last time they were online in a unix timestamp + * @param firstClubSubscription the club subscribed date in a unix timestamp + * @param clubExpiration the club expiration date in a unix timestamp + * @param allowStalking allow stalking/following + * @param soundEnabled allow playing sound from client + */ + public void fill(int id, String username, String figure, String poolFigure, int pixels, int credits, String email, String motto, String sex, String ssoTicket, int tickets, int film, int rank, long lastOnline, long joinDate, String machineId, long firstClubSubscription, + long clubExpiration, boolean allowStalking, int selectedRoom, boolean allowFriendRequests, boolean onlineStatusVisible, boolean profileVisible, boolean wordFilterEnabled, boolean tradeEnabled, boolean soundEnabled, + boolean isCreditsEligible, int respectCount, String respectDay, int respectPoints, int respectGiven, boolean isOnline, long totemEffectExpiry, long tradeBanExpiration, + int favouriteGroupId, String createdAt) { + this.id = id; + this.username = StringUtil.filterInput(username, true); + this.figure = StringUtil.filterInput(figure, true); // Format: hd-180-1.ch-255-70.lg-285-77.sh-295-74.fa-1205-91.hr-125-31.ha-1016- + this.poolFigure = StringUtil.filterInput(poolFigure, true); // Format: ch=s02/238,238,238 + this.motto = WordfilterManager.filterSentence(StringUtil.filterInput(motto, true)); + //this.consoleMotto = StringUtil.filterInput(consoleMotto, true); + this.email = email; + this.sex = sex.toLowerCase().equals("f") ? "F" : "M"; + this.ssoTicket = ssoTicket; + this.pixels = pixels; + this.lastPixelsTime = DateUtil.getCurrentTimeSeconds() + TimeUnit.MINUTES.toSeconds(15); + this.credits = credits; + this.tickets = tickets; + this.film = film; + this.rank = PlayerRank.getRankForId(rank); + this.lastOnline = lastOnline; + this.previousRespectDay = respectDay; + this.joinDate = joinDate; + this.machineId = machineId; + this.firstClubSubscription = firstClubSubscription; + this.clubExpiration = clubExpiration; + this.allowStalking = allowStalking; + this.selectedRoomId = selectedRoom; + this.allowFriendRequests = allowFriendRequests; + this.onlineStatusVisible = onlineStatusVisible; + this.profileVisible = profileVisible; + this.wordFilterEnabled = wordFilterEnabled; + this.tradeEnabled = tradeEnabled; + this.soundEnabled = soundEnabled; + this.isCreditsEligible = isCreditsEligible; + this.dailyRespectPoints = respectCount; + this.respectDay = respectDay; + this.respectPoints = respectPoints; + this.respectGiven = respectGiven; + this.isOnline = isOnline; + this.totemEffectExpiry = totemEffectExpiry; + this.tradeBanExpiration = tradeBanExpiration; + this.favouriteGroupId = favouriteGroupId; + this.createdAt = createdAt; + + if (this.credits < 0) { + this.credits = 0; + } + + if (this.tickets < 0) { + this.tickets = 0; + } + + if (this.film < 0) { + this.film = 0; + } + } + + public void fill(int id, String username, String figure, String motto, String sex) { + this.id = id; + this.username = username; + this.figure = figure; + this.motto = motto; + this.sex = sex; + this.createdAt = ""; + this.respectDay = ""; + } + + public boolean hasClubSubscription() { + if (this.clubExpiration != 0) { + if (DateUtil.getCurrentTimeSeconds() < this.clubExpiration) { + return true; + } + } + + return false; + } + + public Pair isBanned() { + var userBanCheck = BanDao.hasBan(BanType.USER_ID, String.valueOf(this.id)); + + if (userBanCheck != null) { + return userBanCheck; + } + + var machineBanCheck = BanDao.hasBan(BanType.MACHINE_ID, this.machineId); + + if (machineBanCheck != null) { + return machineBanCheck; + } + + /*var ipBanCheck = BanDao.hasBan(BanType.IP_ADDRESS, PlayerDao.getLatestIp(this.id)); + + if (ipBanCheck != null) { + return ipBanCheck; + }*/ + + return null; + } + + + public void resetNextHandout() { + if (GameConfiguration.getInstance().getInteger("daily.credits.amount") > 0) { + this.nextHandout = 0;//DateUtil.getCurrentTimeSeconds() + GameConfiguration.getInstance().getInteger("daily.credits.wait.time"); + } else { + TimeUnit unit = TimeUnit.valueOf(GameConfiguration.getInstance().getString("credits.scheduler.timeunit")); + this.nextHandout = DateUtil.getCurrentTimeSeconds() + unit.toSeconds(GameConfiguration.getInstance().getInteger("credits.scheduler.interval")); + } + } + + public int getId() { + return id; + } + + public String getName() { + return username; + } + + public String getFigure() { + return figure; + } + + public void setFigure(String figure) { + this.figure = figure; + } + + public String getPoolFigure() { + return poolFigure; + } + + public void setPoolFigure(String poolFigure) { + this.poolFigure = poolFigure; + } + + public int getPixels() { + return pixels; + } + + public void setPixels(int pixels) { + this.pixels = pixels; + } + + public long getLastPixelsTime() { + return lastPixelsTime; + } + + public void setLastPixelsTime(long lastPixelsTime) { + this.lastPixelsTime = lastPixelsTime; + } + + public int getCredits() { + return credits; + } + + public void setCredits(int credits) { + this.credits = credits; + } + + public String getMotto() { + return motto; + } + + public void setMotto(String motto) { + this.motto = motto; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public int getTickets() { + return tickets; + } + + public void setTickets(int tickets) { + this.tickets = tickets; + } + + public int getFilm() { + return film; + } + + public void setFilm(int film) { + this.film = film; + } + + public PlayerRank getRank() { + return this.rank; + } + + public void setRank(PlayerRank rank) { + this.rank = rank; + } + + public long getLastOnline() { + return lastOnline; + } + + public void setLastOnline(long lastOnline) { + this.lastOnline = lastOnline; + } + + public long getFirstClubSubscription() { + return firstClubSubscription; + } + + public void setFirstClubSubscription(long firstClubSubscription) { + this.firstClubSubscription = firstClubSubscription; + } + + public long getClubExpiration() { + return clubExpiration; + } + + public void setClubExpiration(long clubExpiration) { + this.clubExpiration = clubExpiration; + } + + public boolean doesAllowStalking() { + return allowStalking; + } + + public void setAllowStalking(boolean allowStalking) { + this.allowStalking = allowStalking; + } + + public boolean getSoundSetting() { + return soundEnabled; + } + + public void setSoundSetting(boolean soundEnabled) { + this.soundEnabled = soundEnabled; + } + + public long getNextHandout() { + return nextHandout; + } + + public void setNextHandout(long nextHandout) { + this.nextHandout = nextHandout; + } + + public boolean isAllowFriendRequests() { + return allowFriendRequests; + } + + public String getSsoTicket() { + return ssoTicket; + } + + public void setSsoTicket(String ssoTicket) { + this.ssoTicket = ssoTicket; + } + + public String getMachineId() { + return machineId; + } + + public void setMachineId(String machineId) { + this.machineId = machineId; + } + + public boolean canSelectRoom() { + return this.selectedRoomId == 0; + } + + public boolean hasSelectedRoom() { + return this.selectedRoomId > 0; + } + + public int getSelectedRoomId() { + return selectedRoomId; + } + + public void setSelectedRoomId(int selectedRoomId) { + this.selectedRoomId = selectedRoomId; + } + + public int getDailyRespectPoints() { + return dailyRespectPoints; + } + + public void setDailyRespectPoints(int dailyRespectPoints) { + this.dailyRespectPoints = dailyRespectPoints; + } + + public String getRespectDay() { + return respectDay; + } + + public void setRespectDay(String respectDay) { + this.respectDay = respectDay; + } + + public int getRespectPoints() { + return respectPoints; + } + + public void setRespectPoints(int respectPoints) { + this.respectPoints = respectPoints; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public boolean isOnline() { + if (this.isOnlineStatusVisible()) { + return isOnline; + } + + return false; + } + + public String getFormattedLastOnline() { + return DateUtil.getDate(this.lastOnline, DateUtil.SHORT_DATE); + } + + public String formatLastOnline(String format) { + return DateUtil.getDate(this.lastOnline, format); + } + + public String formatJoinDate(String format) { + return DateUtil.getDate(this.joinDate, format); + } + + public String getCreatedAt() { + return createdAt.split(" ")[0]; + } + + public long getJoinDate() { + return joinDate; + } + + public long getTotemEffectExpiry() { + return totemEffectExpiry; + } + + public void setTotemEffectExpiry(long totemEffectExpiry) { + this.totemEffectExpiry = totemEffectExpiry; + } + + public int getRespectGiven() { + return respectGiven; + } + + public void setRespectGiven(int respectGiven) { + this.respectGiven = respectGiven; + } + + public boolean isOnlineStatusVisible() { + return onlineStatusVisible; + } + + public void setOnlineStatusVisible(boolean onlineStatusVisible) { + this.onlineStatusVisible = onlineStatusVisible; + } + + public boolean isProfileVisible() { + return profileVisible; + } + + public boolean isWordFilterEnabled() { + return wordFilterEnabled; + } + + public boolean isTradeEnabled() { + return tradeEnabled; + } + + public void setTradeEnabled(boolean tradeEnabled) { + this.tradeEnabled = tradeEnabled; + } + + public boolean isCreditsEligible() { + return isCreditsEligible; + } + + public void setCreditsEligible(boolean creditsEligible) { + isCreditsEligible = creditsEligible; + } + + public long getTradeBanExpiration() { + return tradeBanExpiration; + } + + public void setTradeBanExpiration(long tradeBanExpiration) { + this.tradeBanExpiration = tradeBanExpiration; + } + + public boolean isTradeBanned() { + if (this.tradeBanExpiration > 0) { + return this.tradeBanExpiration > DateUtil.getCurrentTimeSeconds(); + } + + return false; + } + + public int getFavouriteGroupId() { + return favouriteGroupId; + } + + public void setFavouriteGroupId(int favouriteGroupId) { + this.favouriteGroupId = favouriteGroupId; + } + + public GroupMember getGroupMember() { + Group group; + + if (this.groupMember == null) { + if (this.getFavouriteGroupId() > 0) { + var player = PlayerManager.getInstance().getPlayerById(this.id); + + if (player == null) { + group = GroupDao.getGroup(this.favouriteGroupId); + } + else { + group = player.getJoinedGroups().stream().filter(x -> x.getId() == this.favouriteGroupId).findFirst().orElse(null); + } + + if (group == null) { + this.favouriteGroupId = 0; + PlayerDao.saveFavouriteGroup(this.id, 0); + } else if (group.getOwnerId() == this.id) { + return new GroupMember(this.id, this.favouriteGroupId, false, 3); + } + + this.groupMember = GroupMemberDao.getMember(this.favouriteGroupId, this.id); + } + } + + return this.groupMember; + } + + public String getPreviousRespectDay() { + return previousRespectDay; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/player/PlayerManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/player/PlayerManager.java new file mode 100644 index 0000000..be06e2a --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/player/PlayerManager.java @@ -0,0 +1,342 @@ +package org.alexdev.havana.game.player; + +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.game.GameScheduler; +import org.alexdev.havana.game.player.statistics.PlayerStatistic; +import org.alexdev.havana.game.texts.TextsManager; +import org.alexdev.havana.messages.outgoing.openinghours.INFO_HOTEL_CLOSED; +import org.alexdev.havana.messages.outgoing.openinghours.INFO_HOTEL_CLOSING; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.config.GameConfiguration; + +import java.time.Duration; +import java.time.LocalTime; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; + +public class PlayerManager { + private static PlayerManager instance; + private List players; + + private long dailyPlayerPeak; + private long allTimePlayerPeak; + + private boolean isMaintenanceShutdown; + private Duration maintenanceAt; + + private ScheduledFuture shutdownTimeout; + + public PlayerManager() { + this.players = new CopyOnWriteArrayList<>(); + this.dailyPlayerPeak = GameConfiguration.getInstance().getInteger("players.daily.peak"); + this.allTimePlayerPeak = GameConfiguration.getInstance().getInteger("players.all.time.peak"); + } + + /** + * Checks and sets the daily player peak. + */ + public void checkPlayerPeak() { + var playerSize = PlayerManager.getInstance().getPlayers().size(); + + if (!GameConfiguration.getInstance().getString("players.daily.peak.date").equals(DateUtil.getCurrentDate(DateUtil.SHORT_DATE))) { + this.dailyPlayerPeak = PlayerManager.getInstance().getPlayers().size(); + + GameConfiguration.getInstance().updateSetting("players.daily.peak", String.valueOf(this.dailyPlayerPeak)); + GameConfiguration.getInstance().updateSetting("players.daily.peak.date", DateUtil.getCurrentDate(DateUtil.SHORT_DATE)); + } else { + int newSize = PlayerManager.getInstance().getPlayers().size(); + + if (newSize > this.dailyPlayerPeak) { + this.dailyPlayerPeak = newSize; + GameConfiguration.getInstance().updateSetting("players.daily.peak", String.valueOf(this.dailyPlayerPeak)); + } + } + + if (playerSize > this.allTimePlayerPeak) { + this.allTimePlayerPeak = playerSize; + GameConfiguration.getInstance().updateSetting("players.all.time.peak", String.valueOf(this.allTimePlayerPeak)); + } + } + + /** + * Get a player by user id. + * + * @param userId the user id to get with + * @return the player, else null if not found + */ + public Player getPlayerById(int userId) { + for (Player player : this.players) { + if (player.getDetails().getId() == userId) { + return player; + } + } + + return null; + } + + /** + * Get the player by name. + * + * @param username the name to get with + * @return the player, else null if not found + */ + public Player getPlayerByName(String username) { + for (Player player : this.players) { + if (player.getDetails().getName().equalsIgnoreCase(username)) { + return player; + } + } + + return null; + } + + /** + * Get a player data by user id. + * + * @param userId the user id to get with + * @return the player data, else if offline will query the database + */ + public PlayerDetails getPlayerData(int userId) { + Player player = getPlayerById(userId); + + if (player != null) { + return player.getDetails(); + } + + return PlayerDao.getDetails(userId); + } + + /** + * Get a player data by username. + * + * @param username the username to get with + * @return the player data, else if offline will query the database + */ + public PlayerDetails getPlayerData(String username) { + Player player = getPlayerByName(username); + + if (player != null) { + return player.getDetails(); + } + + return PlayerDao.getDetails(username); + } + + /** + * Remove player from map, this is handled automatically when + * the socket is closed. + * + * @param player the player to remove + */ + public void removePlayer(Player player) { + if (player.getDetails().getName() == null) { + return; + } + + this.players.remove(player); + } + + /** + * Remove player from map, this is handled automatically when + * the player is logged in. + * + * @param player the player to remove + */ + public void addPlayer(Player player) { + if (player.getDetails() == null) { + return; + } + + this.players.add(player); + } + + /** + * Disconnect a session by user id. + * + * @param userId the user id of the session to disconnect + */ + public void disconnectSession(int userId) { + for (Player player : this.players) { + if (player.getDetails().getId() == userId) { + player.kickFromServer(); + } + } + } + + /** + * Get if the player is online. + * + * @param userId the id of the user to check + * @return true, if successful + */ + public boolean isPlayerOnline(int userId) { + for (Player player : this.players) { + if (player.getDetails().getId() != userId) { + continue; + } + + if (!player.getDetails().isOnlineStatusVisible()) { + return false; + } + + return true; + } + + return false; + } + + /** + * Start shutdown timeout + * + * @param maintenanceAt when to shutdown + */ + public void planMaintenance(Duration maintenanceAt) { + // Interrupt current timeout to set new maintenance countdown + if (this.shutdownTimeout != null) { + this.shutdownTimeout.cancel(true); + } + + // Start timeout that will trigger the shutdown hook + this.shutdownTimeout = GameScheduler.getInstance().getService().schedule(() -> { + System.exit(0); + }, maintenanceAt.toMillis(), TimeUnit.MILLISECONDS); + + // Let other Havana components know we are in maintenance mode + this.isMaintenanceShutdown = true; + this.maintenanceAt = maintenanceAt; + + // Notify all users of shutdown timeout + for (Player p : this.players) { + p.send(new INFO_HOTEL_CLOSING(maintenanceAt)); + } + } + + /** + * Cancel shutdown timeout + */ + public void cancelMaintenance() { + // Cancel current timeout + this.shutdownTimeout.cancel(true); + + // Let other Havana components know we are no longer in maintenance mode + this.isMaintenanceShutdown = false; + + // Notify all users maintenance has been cancelled + for (Player p : this.players) { + p.send(new ALERT(TextsManager.getInstance().getValue("maintenance_cancelled"))); + } + } + + public void sendAll(MessageComposer composer) { + for (Player p : this.players) { + p.send(composer); + } + } + + /** + * Close and dispose all users. + */ + public void dispose() { + for (Player p : new ArrayList<>(this.players)) { + // Send fancy maintenance alert if we're shutting down + p.send(new INFO_HOTEL_CLOSED(LocalTime.now(), false)); + + // Now disconnect the player + p.kickFromServer(); + } + } + + /** + * Get the collection of players on the server. + * + * @return the collection of players + */ + public List getPlayers() { + return this.players; + } + + /** + * Get the collection of active players on the server. + * + * @return the collection of active players + */ + public Collection getActivePlayers() { + List activePlayers = new ArrayList<>(); + for (Player player : PlayerManager.getInstance().getPlayers()) { + if (player.getRoomUser().getRoom() == null) { + continue; + } + + if (player.getRoomUser().isSleeping()) { + continue; + } + + activePlayers.add(player); + } + + return activePlayers; + } + + /** + * Get daily player peak + * + * @return the daily player peak + */ + public long getDailyPlayerPeak() { + return this.dailyPlayerPeak; + } + + /** + * Get all time player peak. + * + * @return all time player peak + */ + public long getAllTimePlayerPeak() { + return allTimePlayerPeak; + } + + /** + * Get duration until shutdown + * + * @return duration until shutdown + */ + public Duration getMaintenanceAt() { + return this.maintenanceAt; + } + + /** + * Get maintenance shutdown status + * + * @return the maintenance shutdown status + */ + public boolean isMaintenance() { + return this.isMaintenanceShutdown; + } + + /** + * Gets the instance + * + * @return the instance + */ + public static PlayerManager getInstance() { + if (instance == null) { + instance = new PlayerManager(); + } + + return instance; + } + + public void showMutedAlert(Player player) { + long uptime = (player.getStatisticManager().getLongValue(PlayerStatistic.MUTE_EXPIRES_AT) - DateUtil.getCurrentTimeSeconds()) * 1000; + long days = (uptime / (1000 * 60 * 60 * 24)); + long hours = (uptime - days * (1000 * 60 * 60 * 24)) / (1000 * 60 * 60); + + player.send(new ALERT("You are currently muted. Your mute will expire in " + days + " day(s) and " + hours + " hours(s)")); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/player/PlayerRank.java b/Havana-Server/src/main/java/org/alexdev/havana/game/player/PlayerRank.java new file mode 100644 index 0000000..68a5f67 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/player/PlayerRank.java @@ -0,0 +1,37 @@ +package org.alexdev.havana.game.player; + +public enum PlayerRank { + RANKLESS(0), + NORMAL(1), + GUIDE(2), + HOBBA(3), + SUPERHOBBA(4), + MODERATOR(5), + COMMUNITY_MANAGER(6), + HOTEL_MANAGER(7), + ADMINISTRATOR(8); + + private final int rankId; + + PlayerRank(int rankId) { + this.rankId = rankId; + } + + public String getName() { + return this.name(); + } + + public int getRankId() { + return this.rankId; + } + + public static PlayerRank getRankForId(int rankId) { + for (PlayerRank rank : PlayerRank.values()) { + if (rank.getRankId() == rankId) { + return rank; + } + } + + return null; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/player/Wardrobe.java b/Havana-Server/src/main/java/org/alexdev/havana/game/player/Wardrobe.java new file mode 100644 index 0000000..a30daa3 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/player/Wardrobe.java @@ -0,0 +1,25 @@ +package org.alexdev.havana.game.player; + +public class Wardrobe { + private int slotId; + private String sex; + private String figure; + + public Wardrobe(int slotId, String sex, String figure) { + this.slotId = slotId; + this.sex = sex; + this.figure = figure; + } + + public int getSlotId() { + return slotId; + } + + public String getSex() { + return sex; + } + + public String getFigure() { + return figure; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/player/guides/GuidingData.java b/Havana-Server/src/main/java/org/alexdev/havana/game/player/guides/GuidingData.java new file mode 100644 index 0000000..107ecd1 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/player/guides/GuidingData.java @@ -0,0 +1,31 @@ +package org.alexdev.havana.game.player.guides; + +public class GuidingData { + private int userId; + private String username; + private long lastOnline; + private long timeOnline; + + public GuidingData(int userId, String username, long lastOnline, long timeOnline) { + this.userId = userId; + this.username = username; + this.lastOnline = lastOnline; + this.timeOnline = timeOnline; + } + + public int getUserId() { + return userId; + } + + public String getUsername() { + return username; + } + + public long getLastOnline() { + return lastOnline; + } + + public long getTimeOnline() { + return timeOnline; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/player/guides/PlayerGuideManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/player/guides/PlayerGuideManager.java new file mode 100644 index 0000000..372b810 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/player/guides/PlayerGuideManager.java @@ -0,0 +1,314 @@ +package org.alexdev.havana.game.player.guides; + +import org.alexdev.havana.dao.mysql.GuideDao; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.guides.INVITATION; + +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +public class PlayerGuideManager { + private Player player; + private boolean hasTutorial; + private boolean isGuide; + private boolean isGuidable; + private boolean isGuidedBy; + private boolean isWaitingForInvitations; + private boolean isWaitingForGuide; + + private boolean canUseTutorial; + private boolean blockTutorial; + private boolean cancelTutorial; + + private List guiding; + private List invites; + private List invited; + + private int invitedBy; + private int startedForWaitingGuidesTime; + + public PlayerGuideManager(Player player) { + this.player = player; + this.guiding = new CopyOnWriteArrayList<>(); + this.invites = new CopyOnWriteArrayList<>(); + this.invited = new CopyOnWriteArrayList<>(); + } + + /** + * Add a guide invite from newbie. + * + * @param userId the user id from + * @param username the username from + */ + public void addInvite(Integer userId, String username) { + if (this.invites.contains(userId)) { + return; + } + + this.player.send(new INVITATION(userId, username)); + this.invites.add(userId); + } + + /** + * Get if the guide contains an invite from this user id + * + * @param id the user id to check + * @return true, if successful + */ + public boolean hasInvite(int id) { + return this.invites.contains(id); + } + + /** + * Remove user id who invited the user + * + * @param userId the user id + */ + public void removeInvite(int userId) { + this.invites.remove(Integer.valueOf(userId)); + } + + /** + * Get if this user was invitied by a newb + * + * @param id the user id to check + * @return true, if successful + */ + public boolean hasInvited(int id) { + return this.invited.contains(id); + } + + /** + * Remove user id who was invited + * + * @param userId the user id + */ + public void removeInvited(int userId) { + this.invited.remove(Integer.valueOf(userId)); + } + + /** + * Add a guide invited by newbie + * + * @param userId the user id from + */ + public void addInvited(Integer userId) { + if (this.invited.contains(userId)) { + return; + } + + this.invited.add(userId); + } + + /** + * Get whether the player is a guide. + * + * @return true, if successful + */ + public boolean isGuide() { + return isGuide; + } + + /** + * Set whether the player is guide. + * + * @param guide the flag on whether player is guide or not + */ + public void setGuide(boolean guide) { + isGuide = guide; + } + + /** + * Get the player who may or may not be a guide. + * + * @return the player + */ + public Player getPlayer() { + return player; + } + + /** + * Get is waiting for invitations. + * + * @return the value whether they're waiting for not + */ + public boolean isWaitingForInvitations() { + return isWaitingForInvitations; + } + + /** + * Set is waiting for invitations. + * + * @param waitingForInvitations the value whether they're watiting for not + */ + public void setWaitingForInvitations(boolean waitingForInvitations) { + isWaitingForInvitations = waitingForInvitations; + } + + /** + * Set if the user is waiting for a guide to pickup invite. + * + * @return true, if successful + */ + public boolean isWaitingForGuide() { + return isWaitingForGuide; + } + + /** + * Set if a player is waiting for a guide to pick up. + * + * @param waitingForGuide true, if successful + */ + public void setWaitingForGuide(boolean waitingForGuide) { + isWaitingForGuide = waitingForGuide; + } + + /** + * Get whether the player is guidable + * @return true, if successful + */ + public boolean isGuidable() { + return isGuidable; + } + + /** + * Set whether the player is guidable. + * + * @param guidable true, if successful + */ + public void setGuidable(boolean guidable) { + isGuidable = guidable; + } + + /** + * Get the list of users the user is currently guiding. + * + * @return the users the player is guiding + */ + public List getGuiding() { + return guiding; + } + + /** + * Get if the user uses the tutorial + * + * @return true, if successful + */ + public boolean hasTutorial() { + return hasTutorial; + } + + /** + * Set if the user has tutorial. + * + * @param hasTutorial true, if successful + */ + public void setHasTutorial(boolean hasTutorial) { + this.hasTutorial = hasTutorial; + } + + /** + * Get if the player can use tutorial. + * + * @return true, if successful + */ + public boolean canUseTutorial() { + return canUseTutorial; + } + + /** + * Set if the player can use tutorial. + * + * @param canUseTutorial the flag to set + */ + public void setCanUseTutorial(boolean canUseTutorial) { + this.canUseTutorial = canUseTutorial; + } + + /** + * Get if the player blocks tutorial + * + * @return true, if successful + */ + public boolean isBlockingTutorial() { + return blockTutorial; + } + + /** + * Set if the player blocks tutorial. + * + * @param blockTutorial the flag to set + */ + public void setBlockingTutorial(boolean blockTutorial) { + this.blockTutorial = blockTutorial; + } + + /** + * Get if the player has cancelled the tutorial + * + * @return true, if successful + */ + public boolean isCancelTutorial() { + return cancelTutorial; + } + + /** + * Set if the player cancelled tutorial. + * + * @param cancelTutorial the flag to set + */ + public void setCancelTutorial(boolean cancelTutorial) { + this.cancelTutorial = cancelTutorial; + } + + /** + * Get the list of user ids who have invited the guide. + * + * @return the list of users + */ + public List getInvites() { + return invites; + } + + /** + * Get the list of users this newb has invited. + * + * @return the list of users invited + */ + public List getInvited() { + return invited; + } + + /** + * Get the user id who last invited the tutor. + * + * @return the user id + */ + public int getInvitedBy() { + return invitedBy; + } + + /** + * Set the user id who invited the tutor + * + * @param invitedBy the user id + */ + public void setInvitedBy(int invitedBy) { + this.invitedBy = invitedBy; + } + + /** + * Refresh the guiding users. + */ + public void refreshGuidingUsers() { + this.guiding = GuideDao.getGuidedBy(this.player.getDetails().getId()); + } + + public int getStartedForWaitingGuidesTime() { + return startedForWaitingGuidesTime; + } + + public void setStartedForWaitingGuidesTime(int startedForWaitingGuidesTime) { + this.startedForWaitingGuidesTime = startedForWaitingGuidesTime; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/player/statistics/PlayerStatistic.java b/Havana-Server/src/main/java/org/alexdev/havana/game/player/statistics/PlayerStatistic.java new file mode 100644 index 0000000..070efba --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/player/statistics/PlayerStatistic.java @@ -0,0 +1,54 @@ +package org.alexdev.havana.game.player.statistics; + +public enum PlayerStatistic { + DAYS_LOGGED_IN_ROW("days_logged_in_row"), + GUESTBOOK_UNREAD_MESSAGES("guestbook_unread_messages"), + ONLINE_TIME("online_time"), + BATTLEBALL_POINTS_ALL_TIME("battleball_score_all_time"), + SNOWSTORM_POINTS_ALL_TIME("snowstorm_score_all_time"), + WOBBLE_SQUABBLE_POINTS_ALL_TIME("wobble_squabble_score_all_time"), + BATTLEBALL_MONTHLY_SCORES("battleball_score_month"), + SNOWSTORM_MONTHLY_SCORES("snowstorm_score_month"), + WOBBLE_SQUABBLE_MONTHLY_SCORES("wobble_squabble_score_month"), + XP_EARNED_MONTH("xp_earned_month"), + XP_ALL_TIME("xp_all_time"), + BATTLEBALL_GAMES_WON("battleball_games_won"), + SNOWSTORM_GAMES_WON("snowstorm_games_won"), + WOBBLE_SQUABBLE_GAMES_WON("wobble_squabble_games_won"), + GUIDED_BY("guided_by"), + HAS_TUTORIAL("has_tutorial"), + IS_GUIDABLE("is_guidable"), + PLAYERS_GUIDED("players_guided"), + NEWBIE_ROOM_LAYOUT("newbie_room_layout"), + NEWBIE_GIFT("newbie_gift"), + NEWBIE_GIFT_TIME("newbie_gift_time"), + GIFTS_DUE("gifts_due"), + CLUB_GIFT_DUE("club_gift_due", true), + CLUB_MEMBER_TIME("club_member_time"), + CLUB_MEMBER_TIME_UPDATED("club_member_time_updated"), + ACTIVATION_CODE("activation_code"), + FORGOT_PASSWORD_CODE("forgot_password_code"), + FORGOT_RECOVERY_REQUESTED_TIME("forgot_recovery_requested_time"), + MUTE_EXPIRES_AT("mute_expires_at"); + + private final String column; + private final boolean isDateTime; + + PlayerStatistic(String column) { + this.column = column; + this.isDateTime = false; + } + + PlayerStatistic(String column, boolean isDateTime) { + this.column = column; + this.isDateTime = isDateTime; + } + + public boolean isDateTime() { + return isDateTime; + } + + public String getColumn() { + return column; + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/player/statistics/PlayerStatisticManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/player/statistics/PlayerStatisticManager.java new file mode 100644 index 0000000..6204076 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/player/statistics/PlayerStatisticManager.java @@ -0,0 +1,118 @@ +package org.alexdev.havana.game.player.statistics; + +import org.alexdev.havana.dao.mysql.PlayerStatisticsDao; + +import java.util.HashMap; +import java.util.Map; + +public class PlayerStatisticManager { + private final int userId; + private Map values; + + public PlayerStatisticManager(int userId, Map values) { + this.userId = userId; + this.values = values; + } + + /** + * Reload user statistics. + */ + public void reload() { + this.values = PlayerStatisticsDao.getStatistics(this.userId); + } + + /** + * Get the int value by player statistic key + * @param playerStatistic the key + * @return the value + */ + public int getIntValue(PlayerStatistic playerStatistic) { + if (this.values.containsKey(playerStatistic)) { + return Integer.parseInt(this.values.get(playerStatistic)); + } + + return 0; + } + + /** + * Get the long value by player statistic key + * @param playerStatistic the key + * @return the value + */ + public long getLongValue(PlayerStatistic playerStatistic) { + if (this.values.containsKey(playerStatistic)) { + return Long.parseLong(this.values.get(playerStatistic)); + } + + return 0; + } + + /** + * Set the value of the statistic. + * + * @param statistic the statistic + * @param value the value + */ + public void setLongValue(PlayerStatistic statistic, long value) { + if (!this.values.containsKey(statistic)) { + return; + } + + this.values.put(statistic, String.valueOf(value)); + PlayerStatisticsDao.updateStatistic(this.userId, statistic, this.values.get(statistic)); + } + + /** + * Set the value of the statistic. + * + * @param statistic the statistic + * @param value the value + */ + public void setValue(PlayerStatistic statistic, String value) { + if (!this.values.containsKey(statistic)) { + return; + } + + this.values.put(statistic, value); + PlayerStatisticsDao.updateStatistic(this.userId, statistic, this.values.get(statistic)); + } + + /** + * Increment the value of the statistic. + * + * @param statistic the statistic + */ + public void incrementValue(PlayerStatistic statistic, int value) { + if (!this.values.containsKey(statistic)) { + return; + } + + this.values.put(statistic, String.valueOf(this.getIntValue(statistic) + value)); + PlayerStatisticsDao.updateStatistic(this.userId, statistic, this.values.get(statistic)); + } + + /** + * Set the value of the statistic. + * + * @param statisticMap the statistic + */ + public void setValues(int userId, HashMap statisticMap) { + for (var statistic : statisticMap.entrySet()) { + if (this.values.containsKey(statistic.getKey())) { + this.values.put(statistic.getKey(), statistic.getValue()); + } + } + + PlayerStatisticsDao.updateStatistics(userId, statisticMap); + } + + /** + * Get string value. + * + * @param value the statistic + * @return the string + */ + public String getValue(PlayerStatistic value) { + return this.values.get(value); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/Room.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/Room.java new file mode 100644 index 0000000..72334e0 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/Room.java @@ -0,0 +1,533 @@ +package org.alexdev.havana.game.room; + +import org.alexdev.havana.dao.mysql.PetDao; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.dao.mysql.RoomDao; +import org.alexdev.havana.dao.mysql.RoomVoteDao; +import org.alexdev.havana.game.GameScheduler; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.events.Event; +import org.alexdev.havana.game.events.EventsManager; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.navigator.NavigatorCategory; +import org.alexdev.havana.game.navigator.NavigatorManager; +import org.alexdev.havana.game.pets.Pet; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.enums.StatusType; +import org.alexdev.havana.game.room.managers.*; +import org.alexdev.havana.game.room.mapping.RoomMapping; +import org.alexdev.havana.game.room.models.RoomModel; +import org.alexdev.havana.game.room.models.RoomModelManager; +import org.alexdev.havana.messages.outgoing.messenger.ROOMFORWARD; +import org.alexdev.havana.messages.outgoing.rooms.UPDATE_VOTES; +import org.alexdev.havana.messages.outgoing.rooms.moderation.YOUARECONTROLLER; +import org.alexdev.havana.messages.outgoing.rooms.moderation.YOUAROWNER; +import org.alexdev.havana.messages.outgoing.rooms.moderation.YOUNOTCONTROLLER; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.StringUtil; +import org.alexdev.havana.util.config.GameConfiguration; +import org.alexdev.havana.util.schedule.FutureRunnable; + +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.TimeUnit; + +public class Room { + private RoomModel roomModel; + private RoomData roomData; + private RoomMapping roomMapping; + private RoomEntityManager roomEntityManager; + private RoomItemManager roomItemManager; + private RoomTaskManager roomTaskManager; + private RoomIdolManager roomIdolManager; + private FutureRunnable disposeRunnable; + + private boolean isActive; + private boolean isGameArena; + private int followRedirect; + + private List entities; + private List items; + private List rights; + private List votes; + + public Room() { + this.roomData = new RoomData(this); + this.roomEntityManager = new RoomEntityManager(this); + this.roomItemManager = new RoomItemManager(this); + this.roomTaskManager = new RoomTaskManager(this); + this.roomMapping = new RoomMapping(this); + this.roomIdolManager = new RoomIdolManager(this); + this.entities = new CopyOnWriteArrayList<>(); + this.items = new CopyOnWriteArrayList<>(); + this.rights = new CopyOnWriteArrayList<>(); + this.votes = new CopyOnWriteArrayList<>(); + } + + /** + * Send a packet to all players. + * + * @param composer the message composer packet + */ + public void send(MessageComposer composer) { + this.send(composer, List.of()); + } + + /** + * Send a packet to all players but excludes to certain players when given a list + * + * @param composer the message composer packet + */ + public void send(MessageComposer composer, List playerList) { + for (Player player : this.roomEntityManager.getPlayers()) { + if (playerList.contains(player)) { + continue; + } + + player.send(composer); + } + } + + /** + * Checks if the user id is the owner of the room. + * + * @param ownerId the owner id to check for + * @return true, if successful + */ + public boolean isOwner(int ownerId) { + return this.roomData.getOwnerId() == ownerId; + } + + /** + * Get if the player has rights, include super users is enabled to true + * + * @param userId the user id to check if they have rights + * @return true, if successful + */ + public boolean hasRights(int userId) { + return this.hasRights(userId, true); + } + + /** + * Get if the player has rights. + * + * @param userId the user id to check if they have rights + * @param includeSuperUsers check if the room allows all users rights or not + * @return true, if successful + */ + public boolean hasRights(int userId, boolean includeSuperUsers) { + if (this.isPublicRoom()) { + return false; + } + + if (this.isOwner(userId)) { + return true; + } + + if (includeSuperUsers) { + if (this.roomData.allowSuperUsers()) { + return true; + } + } + + if (this.rights.contains(userId)) { + return true; + } + + return false; + } + + /** + * Check if this certain user has voted + * + * @param player the user to check + * @return boolean indicating if the user has voted + */ + public boolean hasVoted(Player player) { + int minsSinceJoined = (int) Math.floor(TimeUnit.SECONDS.toMinutes((long) (DateUtil.getCurrentTimeSeconds() - Math.floor(player.getDetails().getJoinDate())))); + + if (minsSinceJoined <= 60) { + return true; + } + + if (this.votes.stream().anyMatch(vote -> vote.getUserId() == player.getDetails().getId())) { + return true; + } + + if (this.votes.stream().anyMatch(vote -> !vote.getMachineId().isBlank() && !player.getDetails().getMachineId().isBlank() && vote.getMachineId().equalsIgnoreCase(player.getDetails().getMachineId()))) { + return true; + } + + var userIpHistory = PlayerDao.getIpAddresses(player.getDetails().getId(), RoomTradeManager.TRADE_BAN_IP_HISTORY_LIMIT); + + for (var voteData : this.votes) { + if (StringUtil.hasValue(userIpHistory, voteData.getIpAddresses()) || + StringUtil.hasValue(voteData.getIpAddresses(), userIpHistory)) { + return true; + } + } + + return false; + } + + /** + * Add vote to this room + * + * @param answer chosen vote + * @param player user that is voting + */ + public void addVote(int answer, Player player) { + var userIpHistory = PlayerDao.getIpAddresses(player.getDetails().getId(), RoomTradeManager.TRADE_BAN_IP_HISTORY_LIMIT); + this.votes.add(new VoteData(player.getDetails().getId(), answer, String.join(",", userIpHistory), player.getDetails().getMachineId())); + + int sum = this.votes.stream().mapToInt(VoteData::getVote).sum(); + + if (sum < 0) { + sum = 0; + } + + this.roomData.setRating(sum); + + RoomDao.saveRating(this.getId(), sum); + + for (Player p : this.roomEntityManager.getPlayers()) { + boolean voted = this.hasVoted(p); + + if (voted || this.isOwner(p.getDetails().getId())) { + p.send(new UPDATE_VOTES(this.roomData.getRating())); + } + } + + RoomVoteDao.vote(player.getDetails().getId(), this.roomData.getId(), answer); + } + + /** + * Refresh the room rights for the user. + * + * @param player the player to refresh the rights for + */ + public void refreshRights(Player player, boolean sendStatus) { + String rightsValue = ""; + + if (isOwner(player.getDetails().getId()) || player.hasFuse(Fuseright.ANY_ROOM_CONTROLLER)) { + player.send(new YOUAROWNER()); + rightsValue = "useradmin"; + } + + if (hasRights(player.getDetails().getId()) || player.hasFuse(Fuseright.MOD)) { + player.send(new YOUARECONTROLLER()); + } else { + player.send(new YOUNOTCONTROLLER()); + } + + player.getRoomUser().removeStatus(StatusType.FLAT_CONTROL); + + if (hasRights(player.getDetails().getId()) || isOwner(player.getDetails().getId()) || player.hasFuse(Fuseright.MOD)) { + player.getRoomUser().setStatus(StatusType.FLAT_CONTROL, rightsValue); + } + + if (sendStatus) { + player.getRoomUser().setNeedsUpdate(true); + } + } + + /** + * Send forward packet to user. + * + * @param player the packet for the player + */ + public void forward(Player player, boolean ignoreRedirection) { + int roomId = this.getId(); + boolean isPublic = this.isPublicRoom(); + + // If you tried to follow someone in arena, send them to lobby. + if (this.getData().isGameArena()) { + String modelType = this.getData().getGameLobby(); + roomId = RoomManager.getInstance().getRoomByModel(modelType).getId(); + isPublic = true; + } + + if (isPublic) { // Some weird offset shit required... + if (!ignoreRedirection) { + Room room = RoomManager.getInstance().getRoomById(roomId); + + if (room.getData().isNavigatorHide()) { + roomId = room.getFollowRedirect(); + } + } + } + + if (isPublic) { + roomId = roomId + RoomManager.PUBLIC_ROOM_OFFSET; + } + + player.send(new ROOMFORWARD(isPublic, roomId)); + } + + /** + * Try to dispose room, it will happen when there's no users + * in the room. + * + * @return if the room was successfully disposed + */ + public boolean tryDispose() { + Room room = this; + + if (this.roomEntityManager.getPlayers().size() > 0) { + return false; + } + + // If there's an existing dispose runnable, delete it. + if (this.disposeRunnable != null) { + this.disposeRunnable.cancelFuture(); + this.disposeRunnable = null; + } + + // Add 60 second delay when disposing rooms so that there's less stress if the room wants to be reloaded instantly after leaving. + this.disposeRunnable = new FutureRunnable() { + @Override + public void run() { + if (roomEntityManager.getPlayers().size() > 0) { + return; + } + + Event event = EventsManager.getInstance().getEventByRoomId(room.getId()); + + if (event != null) { + EventsManager.getInstance().removeEvent(event); + } + + roomItemManager.resetItemStates(); + roomEntityManager.getCounter().set(0); + + for (Pet pet : room.getEntityManager().getEntitiesByClass(Pet.class)) { + PetDao.saveCoordinates(pet.getDetails().getId(), + pet.getRoomUser().getPosition().getX(), + pet.getRoomUser().getPosition().getY(), + pet.getRoomUser().getPosition().getRotation()); + } + + isActive = false; + roomTaskManager.stopTasks(); + + items.clear(); + rights.clear(); + votes.clear(); + entities.clear(); + + RoomManager.getInstance().removeRoom(roomData.getId()); + } + }; + + int defaultSeconds = GameConfiguration.getInstance().getInteger("room.dispose.timer.seconds"); + + if (!GameConfiguration.getInstance().getBoolean("room.dispose.timer.enabled")) { + defaultSeconds = 0; + } + + // Schedule new dispose runnable + this.disposeRunnable.setFuture(GameScheduler.getInstance().getService().schedule(this.disposeRunnable, defaultSeconds, TimeUnit.SECONDS)); + return true; + } + + /** + * Get the entity manager for this room. + * + * @return the entity manager + */ + public RoomEntityManager getEntityManager() { + return this.roomEntityManager; + } + + /** + * Get the item manager for this room. + * + * @return the item manager + */ + public RoomItemManager getItemManager() { + return this.roomItemManager; + } + + /** + * Get the task manager for this room. + * + * @return the task manager + */ + public RoomTaskManager getTaskManager() { + return this.roomTaskManager; + } + + /** + * Get the mapping manager for this room. + * + * @return the room mapping manager + */ + public RoomMapping getMapping() { + return this.roomMapping; + } + + /** + * Get the room data for this room. + * + * @return the room data + */ + public RoomData getData() { + return this.roomData; + } + + /** + * Get the room model instance. + * + * @return the room model + */ + public RoomModel getModel() { + if (this.roomModel != null) { + return this.roomModel; + } + + return RoomModelManager.getInstance().getModel(this.roomData.getModel()); + } + + /** + * Set the room model, override the instance + */ + public void setRoomModel(RoomModel roomModel) { + this.roomModel = roomModel; + } + + /** + * Get the {@link NavigatorCategory} for this room. + * + * @return the navigator category + */ + public NavigatorCategory getCategory() { + return NavigatorManager.getInstance().getCategoryById(this.roomData.getCategoryId()); + } + + /** + * Get the entire list of entities in the room. + * + * @return the list of entities + */ + public List getEntities() { + return this.entities; + } + + /** + * Get the entire list of items in the room. + * + * @return the list of items + */ + public List getItems() { + return this.items; + } + + /** + * Get a list of user ids with room rights. + * + * @return the room rights list + */ + public List getRights() { + return this.rights; + } + + /** + * Get a map of votes + * + * @return map of votes + */ + public List getVotes() { + return this.votes; + } + + /** + * Get whether the room is a public room or not. + * + * @return true, if successful + */ + public boolean isPublicRoom() { + return this.roomData.getOwnerId() == 0; + } + + /** + * Check if this room is for club members only + * + * @return true, if successful + */ + public boolean isClubOnly() { + return this.getCategory().isClubOnly(); + } + + /** + * Get the room id of this room. + */ + public int getId() { + return this.roomData.getId(); + } + + /** + * Get if the room is active (has players in it). + * + * @return true, if successful + */ + public boolean isActive() { + return this.isActive; + } + + /** + * Set if the room is active, if it's the first player who joined, etc. + * + * @param active the active flag + */ + public void setActive(boolean active) { + this.isActive = active; + } + + /** + * Gets the main room id for room following, used for when someone follows + * a friend into a room which requires a user to walk to it from entering the main room. + * + * @return the follow redirect room id + */ + public int getFollowRedirect() { + return this.followRedirect; + } + + /** + * Set the follow redirect room id. + * + * @param followRedirect the room id to set + */ + public void setFollowRedirect(int followRedirect) { + this.followRedirect = followRedirect; + } + + /** + * Get whether this room is a game arena (a battleball or snowstorm room) + * + * @return true, if successful + */ + public boolean isGameArena() { + return isGameArena; + } + + /** + * Set whether this room is a game arena (a battleball or snowstorm room) + * + * @param gameArena the flag on whether this is a game arena or not + */ + public void setGameArena(boolean gameArena) { + isGameArena = gameArena; + } + + /** + * Get the room idol manager. + * + * @return the room idol manager + */ + public RoomIdolManager getIdolManager() { + return roomIdolManager; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/RoomData.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/RoomData.java new file mode 100644 index 0000000..0472bf7 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/RoomData.java @@ -0,0 +1,394 @@ +package org.alexdev.havana.game.room; + +import org.alexdev.havana.dao.mysql.TagDao; +import org.alexdev.havana.game.games.Game; +import org.alexdev.havana.game.games.GameManager; +import org.alexdev.havana.game.games.enums.GameType; +import org.alexdev.havana.game.room.handlers.walkways.WalkwaysManager; +import org.alexdev.havana.game.room.models.RoomModelTriggerType; +import org.alexdev.havana.util.StringUtil; +import org.alexdev.havana.util.config.GameConfiguration; + +import java.util.List; + +public class RoomData { + //private static final int SECONDS_UNTIL_UPDATE = 60; + private Room room; + private int id; + private int ownerId; + private String ownerName; + private int categoryId; + private String name; + private String description; + private String model; + private String ccts; + private int wallpaper; + private int floor; + private String landscape; + private boolean showOwnerName; + private boolean superUsers; + private boolean isGameArena; + private String gameLobby; + private int accessType; + private String password; + private int visitorsNow; + private int visitorsMax; + private int rating; + private Game game; + private String iconData; + private int groupId; + private boolean isHidden; + private boolean isRoomMuted; + private boolean isCustomRoom; + + public RoomData(Room room) { + this.room = room; + } + + public void fill(int id, String name, String description) { + this.id = id; + this.name = name; + this.description = description; + this.ownerId = 0; + this.ccts = ""; + this.model = ""; + this.ownerName = ""; + } + + public void fill(int id, int ownerId, String ownerName, int category, String name, String description, String model, String ccts, int wallpaper, int floor, String decoration, boolean showName, boolean superUsers, int accessType, String password, int visitorsNow, int visitorsMax, int rating, + String iconData, int groupId, boolean isHidden) { + this.id = id; + this.ownerId = ownerId; + this.ownerName = StringUtil.filterInput(ownerName, true);; + this.categoryId = category; + this.name = StringUtil.filterInput(name, true); + this.description = StringUtil.filterInput(description, true); + this.model = model; + this.ccts = ccts; + this.wallpaper = wallpaper; + this.floor = floor; + this.landscape = decoration; + this.showOwnerName = showName; + this.superUsers = superUsers; + this.accessType = accessType; + this.password = password; + this.visitorsNow = visitorsNow; + this.visitorsMax = visitorsMax; + this.rating = rating; + this.iconData = iconData; + this.groupId = groupId; + this.isHidden = isHidden; + + if (WalkwaysManager.getInstance().getWalkways().stream().anyMatch(walkway -> walkway.getRoomTargetId() == this.room.getId())) { + WalkwaysManager.getInstance().getWalkways().stream().filter(walkway -> walkway.getRoomTargetId() == this.room.getId()).findFirst().ifPresent(roomData -> this.room.setFollowRedirect(roomData.getRoomId())); + } + } + + public boolean isNavigatorHide() { + if (GameConfiguration.getInstance().getBoolean("navigator.show.hidden.rooms")) { + return false; + } + + return this.isHidden; + } + + public int getTotalVisitorsNow() { + var childRooms = RoomManager.getInstance().getChildRooms(this.room); + int totalVisitors = this.getVisitorsNow(); + + if (childRooms.size() > 0) { + for (Room room : childRooms) { + totalVisitors += room.getData().getVisitorsNow(); + } + } + + return totalVisitors; + } + + public int getTotalVisitorsMax() { + var childRooms = RoomManager.getInstance().getChildRooms(this.room); + int totalMaxVisitors = this.getVisitorsMax(); + + if (childRooms.size() > 0) { + for (Room room : childRooms) { + totalMaxVisitors += room.getData().getVisitorsMax(); + } + } + + return totalMaxVisitors; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public int getOwnerId() { + return ownerId; + } + + public void setOwnerId(int ownerId) { + this.ownerId = ownerId; + } + + public String getOwnerName() { + return ownerName; + } + + public void setOwnerName(String ownerName) { + this.ownerName = ownerName; + } + + public int getCategoryId() { + return categoryId; + } + + public void setCategoryId(int categoryId) { + this.categoryId = categoryId; + } + + public String getName() { + return name; + } + + public String getPublicName() { + if (this.room.isPublicRoom()) { + if (this.name.startsWith("Upper Hallways")) { + return "Upper Hallways"; + } + + if (this.name.startsWith("Lower Hallways")) { + return "Lower Hallways"; + } + + if (this.name.startsWith("Club Massiva")) { + return "Club Massiva"; + } + + if (this.name.startsWith("The Chromide Club")) { + return "The Chromide Club"; + } + + if (this.ccts.equals("hh_room_gamehall,hh_games")) { + return "Cunning Fox Gamehall"; + } + } + + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public String getCcts() { + return ccts; + } + + public void setCcts(String ccts) { + this.ccts = ccts; + } + + public int getWallpaper() { + return wallpaper; + } + + public void setWallpaper(int wallpaper) { + this.wallpaper = wallpaper; + } + + public int getFloor() { + return floor; + } + + public void setFloor(int floor) { + this.floor = floor; + } + + public boolean showOwnerName() { + return showOwnerName; + } + + public void setShowOwnerName(boolean showName) { + this.showOwnerName = showName; + } + + public boolean allowSuperUsers() { + return superUsers; + } + + public void setSuperUsers(boolean superUsers) { + this.superUsers = superUsers; + } + + public String getAccessType() { + if (this.accessType == 2) { + return "password"; + } + + if (this.accessType == 1) { + return "closed"; + } + + return "open"; + } + + public int getAccessTypeId() { + return accessType; + } + + public void setAccessType(int accessType) { + this.accessType = accessType; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public int getVisitorsNow() { + //return this.visitorsNow; + int visitors = this.visitorsNow; + + if (this.room.getModel().getModelTrigger() != null && this.room.getModel().getModelTrigger() == RoomModelTriggerType.BATTLEBALL_LOBBY_TRIGGER) { + visitors += GameManager.getInstance().getStartedGamesByType(GameType.BATTLEBALL).stream().mapToInt(game -> game.getActivePlayers().size()).findFirst().orElse(0); + visitors += GameManager.getInstance().getStartedGamesByType(GameType.BATTLEBALL).stream().mapToInt(game -> game.getSpectators().size()).findFirst().orElse(0); + } + + if (this.room.getModel().getModelTrigger() != null && this.room.getModel().getModelTrigger() == RoomModelTriggerType.SNOWSTORM_LOBBY_TRIGGER) { + visitors += GameManager.getInstance().getStartedGamesByType(GameType.SNOWSTORM).stream().mapToInt(game -> game.getActivePlayers().size()).findFirst().orElse(0); + visitors += GameManager.getInstance().getStartedGamesByType(GameType.SNOWSTORM).stream().mapToInt(game -> game.getSpectators().size()).findFirst().orElse(0); + } + + return visitors; + } + + public void setVisitorsNow(int visitorsNow) { + this.visitorsNow = visitorsNow; + } + + public int getVisitorsMax() { + //return this.visitorsMax; + int visitors = this.visitorsMax; + + if (this.room.getModel().getModelTrigger() != null && this.room.getModel().getModelTrigger() == RoomModelTriggerType.BATTLEBALL_LOBBY_TRIGGER) { + visitors += GameManager.getInstance().getStartedGamesByType(GameType.BATTLEBALL).stream().mapToInt(game -> game.getMaxPlayers()).sum(); + } + + if (this.room.getModel().getModelTrigger() != null && this.room.getModel().getModelTrigger() == RoomModelTriggerType.SNOWSTORM_LOBBY_TRIGGER) { + visitors += GameManager.getInstance().getStartedGamesByType(GameType.SNOWSTORM).stream().mapToInt(game -> game.getMaxPlayers()).sum(); + } + + return visitors; + } + + public void setVisitorsMax(int visitorsMax) { + this.visitorsMax = visitorsMax; + } + + public int getRating(){ + return this.rating; + } + + public void setRating(int amount){ + this.rating = amount; + } + + public boolean isGameArena() { + return isGameArena; + } + + public void setGameArena(boolean gameArena) { + isGameArena = gameArena; + } + + public String getGameLobby() { + return gameLobby; + } + + public void setGameLobby(String gameLobby) { + this.gameLobby = gameLobby; + } + + public String getLandscape() { + return landscape; + } + + public void setLandscape(String landscape) { + this.landscape = landscape; + } + + public Game getGame() { + return game; + } + + public void setGame(Game game) { + this.game = game; + } + + public String getIconData() { + return iconData; + } + + public void setIconData(String iconData) { + this.iconData = iconData; + } + + public List getTags() { + return TagDao.getRoomTags(this.id); + } + + public int getGroupId() { + return groupId; + } + + public void setGroupId(int groupId) { + this.groupId = groupId; + } + + public boolean isHidden() { + return isHidden; + } + + public void setHidden(boolean hidden) { + isHidden = hidden; + } + + public boolean isRoomMuted() { + return isRoomMuted; + } + + public void setRoomMuted(boolean roomMuted) { + isRoomMuted = roomMuted; + } + + public boolean isCustomRoom() { + return isCustomRoom; + } + + public void setCustomRoom(boolean customRoom) { + isCustomRoom = customRoom; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/RoomManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/RoomManager.java new file mode 100644 index 0000000..f2d9400 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/RoomManager.java @@ -0,0 +1,340 @@ +package org.alexdev.havana.game.room; + +import org.alexdev.havana.dao.mysql.*; +import org.alexdev.havana.game.messenger.MessengerUser; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.room.handlers.walkways.WalkwaysEntrance; +import org.alexdev.havana.game.room.handlers.walkways.WalkwaysManager; +import org.alexdev.havana.game.room.managers.VoteData; +import org.alexdev.havana.util.config.GameConfiguration; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +public class RoomManager { + public static final int PUBLIC_ROOM_OFFSET = 1000; // Used as the "port" for the public room, in NAVNODEINFO and friend following + private static RoomManager instance = null; + private Map> roomEntryBadges; + + private ConcurrentHashMap roomMap; + + public RoomManager() { + this.roomMap = new ConcurrentHashMap<>(); + this.roomEntryBadges = BadgeDao.getRoomBadges(); + + int stoutRoomId = GameConfiguration.getInstance().getInteger("stout.room"); + + if (stoutRoomId > 0) { + if (!this.roomEntryBadges.containsKey(stoutRoomId)) { + this.roomEntryBadges.put(stoutRoomId, List.of("STOUT")); + } + } + } + + /** + * Get the child rooms by room id - for rooms with walkways. + * + * @param room the room to check + */ + public List getChildRooms(Room room) { + List roomList = new ArrayList<>(); + + if (room.isPublicRoom()) { + getSubRooms(room.getId(), roomList); + + for (Room r : roomList) { + getSubRooms(r.getId(), roomList); + } + } + + return roomList; + } + + /** + * Get child rooms, if they have a walkway. + * + * @param id the id to check + * @param roomList the list to add to + */ + private void getSubRooms(int id, List roomList) { + for (WalkwaysEntrance walkway : WalkwaysManager.getInstance().getWalkways()) { + if (walkway.getRoomTargetId() == id && walkway.getRoomId() != id) { + if (roomList.stream().noneMatch(r -> r.getId() == walkway.getRoomId()) && + roomList.stream().noneMatch(r -> r.getId() == walkway.getRoomTargetId())) { + roomList.add(this.getRoomById(walkway.getRoomId())); + } + } + } + } + + /** + * Find a room by its model. + * + * @param model the model to find the room by + * @return the room found, else null + */ + public Room getRoomByModel(String model) { + int roomId = RoomDao.getRoomIdByModel(model); + return getRoomById(roomId); + } + + /** + * Find a room by room id. + * + * @param roomId the id of the room to find + * @return the loaded room instance, if successful, else query the db + */ + public Room getRoomById(int roomId) { + if (this.roomMap.containsKey(roomId)) { + return this.roomMap.get(roomId); + } + + return RoomDao.getRoomById(roomId); + } + + /** + * Check whether the room is active. + * + * @param roomId the room id to check + * @return true, is successful + */ + public boolean hasRoom(int roomId) { + return this.roomMap.containsKey(roomId); + } + + /** + * Removes a room from the map by room id as key. + * + * @param roomId the id of the room to remove + */ + public void removeRoom(int roomId) { + this.roomMap.remove(roomId); + } + + /** + * Add a room instance to the map. + * + * @param room the instance of the room + */ + public void addRoom(Room room) { + if (room == null) { + return; + } + + if (this.roomMap.containsKey(room.getId())) { + return; + } + + this.roomMap.put(room.getData().getId(), room); + } + + /** + * Will sort a list of rooms returned by MySQL query and + * replace any with loaded rooms that it finds. + * + * @param queryRooms the list of rooms returned by query + * @return a possible list of actual loaded rooms + */ + public List replaceQueryRooms(List queryRooms) { + List roomList = new ArrayList<>(); + + for (Room room : queryRooms) { + if (this.roomMap.containsKey(room.getId())) { + roomList.add(this.getRoomById(room.getData().getId())); + } else { + roomList.add(room); + } + } + + return roomList; + } + + /** + * Get a list of favourite rooms by user id + * + * @param userId the user to get the favourites for + * @return the list of favourites + */ + public List getFavouriteRooms(int userId, boolean privateRoomsOnly) { + List roomIds = RoomFavouritesDao.getFavouriteRooms(userId, privateRoomsOnly); + Collections.reverse(roomIds); // To most recent favourite added at the top + + List rooms = new ArrayList<>(); + + for (int roomId : roomIds) { + Room room = this.getRoomById(roomId); + + if (room != null) { + rooms.add(room); + } + } + + return rooms; + } + + /** + * Performs a santiy check and recounts the given room, to make sure + * that have had their votes expired and is recounted properly. + * + * @param roomList the list of rooms to do the santiy check for + */ + public void ratingSantiyCheck(List roomList) { + for (Room room : roomList) { + if (room.isPublicRoom()) { + continue; + } + + if (room.getData().getVisitorsNow() > 0) { + continue; + } + + if (!(room.getData().getRating() > 0)) { + return; + } + + RoomVoteDao.removeExpiredVotes(room.getId()); + int newRating = RoomVoteDao.getRatings(room.getId()).stream().mapToInt(VoteData::getVote).sum(); + + if (newRating < 0) { + newRating = 0; + } + + if (newRating != room.getData().getRating()) { + RoomDao.saveRating(room.getId(), newRating); + } + } + } + + /** + * Sort the list of rooms by higher populated rooms appearing first. + * + * @param roomList the list of rooms to sort + */ + public void sortRooms(List roomList) { + Comparator roomComparator = Comparator + .comparing((Room room) -> room.getData().getTotalVisitorsNow()) + .thenComparing((Room room) -> room.getData().getRating()).reversed(); + + roomList.sort(roomComparator); + } + + /** + * Get the entire list of rooms. + * + * @return the collection of rooms + */ + public Collection getRooms() { + return this.roomMap.values(); + } + + /** + * Get the instance of {@link RoomManager} + * + * @return the instance + */ + public static RoomManager getInstance() { + if (instance == null) { + instance = new RoomManager(); + } + + return instance; + } + + /** + * Reload badges given upon room entry. + */ + public void reloadBadges() { + this.roomEntryBadges = BadgeDao.getRoomBadges(); + } + + /** + * Give badges to everybody in the room already. + */ + public void giveBadges() { + for (Room room : this.roomMap.values()) { + if (!this.roomEntryBadges.containsKey(room.getId())) { + continue; + } + + for (String badge : this.roomEntryBadges.get(room.getId())) { + for (Player player : room.getEntityManager().getPlayers()) { + player.getBadgeManager().tryAddBadge(badge, null); + } + } + } + } + + /** + * Get list of badges to receive on room entry + * @return + */ + public Map> getRoomEntryBadges() { + return roomEntryBadges; + } + + /** + * Get rooms by flash R34 mode + * @param mode + * @param player + * @return + */ + public List getRoomsByMode(int mode, Player player) { + List roomList = new ArrayList<>(); + + switch (mode) { + case 1: // Popular rooms + { + roomList = RoomManager.getInstance().replaceQueryRooms(NavigatorDao.getRopularRooms(30, false)); + break; + } + case 2: // Highest score + { + roomList = RoomManager.getInstance().replaceQueryRooms(RoomDao.getHighestRatedRooms(30, 0)); + break; + } + case 5: // My rooms + { + roomList = RoomManager.getInstance().replaceQueryRooms(RoomDao.getRoomsByUserId(player.getDetails().getId())); + break; + } + case 6: // My favourites + { + roomList = RoomManager.getInstance().getFavouriteRooms(player.getDetails().getId(), true); + break; + } + case 7: // My visited rooms + { + roomList = RoomManager.getInstance().replaceQueryRooms(NavigatorDao.getRecentlyVisited(30, player.getDetails().getId())); + break; + } + case 4: // Friends in rooms + { + for (MessengerUser messengerUser : player.getMessenger().getFriends().values()) { + if (!messengerUser.isOnline()) { + continue; + } + + var friend = PlayerManager.getInstance().getPlayerById(messengerUser.getUserId()); + var friendRoom = friend.getRoomUser().getRoom(); + + if (friendRoom != null && !friendRoom.isPublicRoom()) { + if (roomList.stream().noneMatch(room -> room.getId() == friendRoom.getId())) { + roomList.add(friendRoom); + } + } + } + + break; + } + case 3: // Friends rooms + { + roomList = RoomManager.getInstance().replaceQueryRooms(NavigatorDao.getFriendRooms(30, player.getMessenger().getFriends().values().stream().map(x -> String.valueOf(x.getUserId())).collect(Collectors.toList()))); + break; + } + } + + return roomList; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/RoomUserStatus.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/RoomUserStatus.java new file mode 100644 index 0000000..5972e11 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/RoomUserStatus.java @@ -0,0 +1,95 @@ +package org.alexdev.havana.game.room; + +import org.alexdev.havana.game.room.enums.StatusType; + +public class RoomUserStatus { + private StatusType key; + private String value; + private StatusType action; + + private int secActionSwitch; + private int secSwitchLifetime; + private int lifetimeCountdown; + + private int actionCountdown; + private int actionSwitchCountdown; + + public RoomUserStatus(StatusType status, String value) { + this.key = status; + this.value = value; + + this.secSwitchLifetime = -1; + this.lifetimeCountdown = -1; + this.secActionSwitch = -1; + this.actionSwitchCountdown = -1; + this.actionCountdown = -1; + } + + public RoomUserStatus(StatusType status, String value, int secLifetime, StatusType action, int secActionSwitch, int secSwitchLifetime) { + this.key = status; + this.value = value; + this.action = action; + + this.secActionSwitch = secActionSwitch; + this.secSwitchLifetime = secSwitchLifetime; + + this.lifetimeCountdown = secLifetime; + this.actionCountdown = secActionSwitch; + this.actionSwitchCountdown = -1; + } + + /** + * Swap the key and action for timed statuses, used for drinking, etc. + */ + public void swapKeyAction() { + StatusType temp = this.key; + this.key = this.action; + this.action = temp; + } + + public StatusType getKey() { + return key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public int getSecActionSwitch() { + return secActionSwitch; + } + + + public int getSecSwitchLifetime() { + return secSwitchLifetime; + } + + + public int getLifetimeCountdown() { + return lifetimeCountdown; + } + + public void setLifetimeCountdown(int lifetimeCountdown) { + this.lifetimeCountdown = lifetimeCountdown; + } + + public int getActionCountdown() { + return actionCountdown; + } + + public void setActionCountdown(int actionCountdown) { + this.actionCountdown = actionCountdown; + } + + public int getActionSwitchCountdown() { + return actionSwitchCountdown; + } + + public void setActionSwitchCountdown(int actionSwitchCountdown) { + this.actionSwitchCountdown = actionSwitchCountdown; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/entities/RoomBot.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/entities/RoomBot.java new file mode 100644 index 0000000..3f288f0 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/entities/RoomBot.java @@ -0,0 +1,30 @@ +package org.alexdev.havana.game.room.entities; + +import org.alexdev.havana.game.GameScheduler; +import org.alexdev.havana.game.bot.Bot; +import org.alexdev.havana.game.entity.Entity; + +import java.util.concurrent.TimeUnit; + +public class RoomBot extends RoomEntity { + private final Bot bot; + + public RoomBot(Entity entity) { + super(entity); + this.bot = (Bot) entity; + } + + @Override + public void stopWalking() { + super.stopWalking(); + + if (this.bot.getBotData() != null) { + if (this.bot.getRoomUser().getPosition().getRotation() != this.bot.getBotData().getStartPosition().getRotation()) { + GameScheduler.getInstance().getService().schedule(() -> { + this.getPosition().setRotation(this.bot.getBotData().getStartPosition().getRotation()); + this.setNeedsUpdate(true); + }, 500, TimeUnit.MILLISECONDS); + } + } + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/entities/RoomEntity.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/entities/RoomEntity.java new file mode 100644 index 0000000..45a1086 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/entities/RoomEntity.java @@ -0,0 +1,1081 @@ +package org.alexdev.havana.game.room.entities; + +import org.alexdev.havana.game.bot.BotManager; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.item.interactors.types.BedInteractor; +import org.alexdev.havana.game.item.roller.RollingData; +import org.alexdev.havana.game.moderation.ChatManager; +import org.alexdev.havana.game.pathfinder.Pathfinder; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.pathfinder.Rotation; +import org.alexdev.havana.game.pets.PetManager; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.RoomManager; +import org.alexdev.havana.game.room.RoomUserStatus; +import org.alexdev.havana.game.room.enums.StatusType; +import org.alexdev.havana.game.room.handlers.PublicRoomRedirection; +import org.alexdev.havana.game.room.handlers.walkways.WalkwaysEntrance; +import org.alexdev.havana.game.room.handlers.walkways.WalkwaysManager; +import org.alexdev.havana.game.room.managers.RoomTimerManager; +import org.alexdev.havana.game.room.mapping.RoomTile; +import org.alexdev.havana.game.wordfilter.WordfilterManager; +import org.alexdev.havana.messages.outgoing.effects.USER_AVATAR_EFFECT; +import org.alexdev.havana.messages.outgoing.rooms.user.*; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.util.config.GameConfiguration; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.atomic.AtomicInteger; + +public abstract class RoomEntity { + private Entity entity; + private Position position; + private Position goal; + private Position nextPosition; + private Room room; + + private RollingData rollingData; + private RoomTimerManager timerManager; + + private Map statuses; + private LinkedList path; + + private BlockingQueue packetQueueAfterRoomLeave; + private CopyOnWriteArrayList chatMessages; + + private int instanceId; + private Item lastItemInteraction; + + private boolean isTeleporting; + private boolean isWalking; + private boolean isWalkingAllowed; + private boolean beingKicked; + private boolean needsUpdate; + private boolean enableWalkingOnStop; + + private int danceId; + private int effectId; + private boolean isSleeping; + + private AtomicInteger pixelAvailableTick; + + private boolean hasItemDebug; + + private int carryId; + private String carryValue; + + public RoomEntity(Entity entity) { + this.entity = entity; + this.statuses = new ConcurrentHashMap<>(); + this.path = new LinkedList<>(); + this.packetQueueAfterRoomLeave = new LinkedBlockingQueue(); + this.timerManager = new RoomTimerManager(this); + } + + public void reset() { + this.statuses.clear(); + this.path.clear(); + this.nextPosition = null; + this.goal = null; + this.room = null; + this.rollingData = null; + this.lastItemInteraction = null; + this.isWalking = false; + this.danceId = 0; + //this.effectId = 0; + this.isSleeping = false; + this.isWalkingAllowed = true; + this.beingKicked = false; + this.instanceId = -1; + this.carryId = 0; + this.carryValue = ""; + this.pixelAvailableTick = new AtomicInteger(GameConfiguration.getInstance().getInteger("pixels.max.tries.single.room.instance")); + this.chatMessages = new CopyOnWriteArrayList<>(); + this.timerManager.resetTimers(); + } + + /** + * Kick a user from the room. + * + * @param allowWalking whether the user can interrupt themselves walking towards the door + */ + public void kick(boolean allowWalking, boolean isBeingKicked) { + try { + if (this.entity.getType() == EntityType.PET) { + return; + } + + Position doorLocation = this.getRoom().getModel().getDoorLocation(); + + if (doorLocation == null) { + this.getRoom().getEntityManager().leaveRoom(this.entity, true); + return; + } + + // If we're standing in the door, immediately leave room + if (this.getPosition().equals(doorLocation)) { + this.getRoom().getEntityManager().leaveRoom(this.entity, true); + return; + } + + // Attempt to walk to the door + this.walkTo(doorLocation.getX(), doorLocation.getY()); + this.isWalkingAllowed = allowWalking; + this.beingKicked = isBeingKicked; + + // If user isn't walking, leave immediately + if (!this.isWalking) { + this.getRoom().getEntityManager().leaveRoom(this.entity, true); + } + } catch (Exception ex) { + this.getRoom().getEntityManager().leaveRoom(this.entity, true); + } + } + + /** + * Make a user walk to specific coordinates. The goal must be valid and reachable. + * + * @param X the X coordinates + * @param Y the Y coordinate + */ + public boolean walkTo(int X, int Y) { + if (this.room == null) { + return false; + } + + if (PublicRoomRedirection.isRedirected(this, X, Y)) { + return false; + } + + if (this.nextPosition != null) { + Position oldPosition = this.position.copy(); + + this.position.setX(this.nextPosition.getX()); + this.position.setY(this.nextPosition.getY()); + this.updateNewHeight(this.position); + + var currentItem = this.getCurrentItem(); + + if (currentItem != null) { + if (currentItem.getDefinition().getInteractionType().getTrigger() != null) { + currentItem.getDefinition().getInteractionType().getTrigger().onEntityStep(entity, this, currentItem, oldPosition); + } + } + + } + + RoomTile tile = this.room.getMapping().getTile(X, Y); + + if (tile == null) { + //System.out.println("User requested " + X + ", " + Y + " from " + this.position); + return false; + } + + + this.goal = new Position(X, Y); + //System.out.println("User requested " + this.goal + " from " + this.position + " with item " + (tile.getHighestItem() != null ? tile.getHighestItem().getDefinition().getSprite() : "NULL")); + + if (this.isTeleporting) { + this.warp(new Position(X, Y), true, true); + this.getRoom().send(new FIGURE_CHANGE(this.getInstanceId(), this.entity.getDetails())); + return true; + } + + if (!RoomTile.isValidTile(this.room, this.entity, this.goal)) { + return false; + } + + if (tile.getHighestItem() != null && tile.getHighestItem().hasBehaviour(ItemBehaviour.CAN_LAY_ON_TOP)) { + if (!BedInteractor.isValidPillowTile(tile.getHighestItem(), this.goal)) { + Position destination = BedInteractor.convertToPillow(this.goal, tile.getHighestItem()); + this.walkTo(destination.getX(), destination.getY()); + return true; + } + } + //AStar aStar = new AStar(this.room.getModel()); + //var pathList = aStar.calculateAStarNoTerrain(this.entity, this.position, this.goal); + + LinkedList pathList = Pathfinder.makePath(this.entity, this.position.copy(), this.goal.copy()); + + if (pathList == null) { + return false; + } + + if (pathList.size() > 0) { + this.path = pathList; + this.isWalking = true; + return true; + } + + return false; + } + + /** + * Called to make a user stop walking. + */ + public void stopWalking() { + this.path.clear(); + this.isWalking = false; + this.needsUpdate = true; + this.nextPosition = null; + this.removeStatus(StatusType.MOVE); + + if (this.enableWalkingOnStop) { + this.enableWalkingOnStop = false; + this.isWalkingAllowed = true; + } + + if (this.entity.getType() == EntityType.PLAYER) { + if (!this.beingKicked) { + WalkwaysEntrance entrance = WalkwaysManager.getInstance().getWalkway(this.getRoom(), this.getPosition()); + + if (entrance != null) { + Room room = RoomManager.getInstance().getRoomById(entrance.getRoomTargetId()); + + if (room != null) { + room.getEntityManager().enterRoom(this.entity, entrance.getDestination()); + return; + } + } + } + + boolean leaveRoom = this.beingKicked; + Position doorPosition = this.getRoom().getModel().getDoorLocation(); + + if (doorPosition.equals(this.getPosition())) { + leaveRoom = true; + + if (this.getTile().getHighestItem() != null && this.getTile().getHighestItem().hasBehaviour(ItemBehaviour.TELEPORTER)) { + leaveRoom = false; + } + } + + if (this.getRoom().isPublicRoom()) { + if (WalkwaysManager.getInstance().getWalkway(this.getRoom(), doorPosition) != null) { + leaveRoom = false; + } + } + + // Leave room if the tile is the door and we are in a flat or we're being kicked + if (leaveRoom || this.beingKicked) { + this.getRoom().getEntityManager().leaveRoom(this.entity, true); + return; + } + } + + this.invokeItem(null, false); + + /*Position diagionalLeft = this.position.getSquareInFront().getSquareLeft(); + Position diagionalRight = this.position.getSquareInFront().getSquareRight(); + + int rotationLeft = Rotation.calculateWalkDirection(this.position, diagionalLeft); + int rotationRight = Rotation.calculateWalkDirection(this.position, diagionalRight); + + int differenceLeft = this.position.getBodyRotation() - Rotation.calculateWalkDirection(this.position, diagionalLeft); + int differenceRight = this.position.getBodyRotation() - Rotation.calculateWalkDirection(this.position, diagionalRight); + + System.out.println("Current rotation: " + this.position.getRotation()); + System.out.println("Left rotation: " + rotationLeft); + System.out.println("Right rotation: " + rotationRight); + + System.out.println("Left diff: " + differenceLeft); + System.out.println("Right diff: " + differenceRight);*/ + } + + /** + * Triggers the current item that the player has walked on top of. + */ + public void invokeItem(Position oldPosition, boolean instantUpdate) { + var roomTile = this.getTile(); + + if (roomTile == null) { + return; + } + + this.position.setZ(roomTile.getWalkingHeight()); + + Item item = /*isRolling ? this.room.getMapping().getTile(this.rollingData.getNextPosition()).getHighestItem() : */this.getCurrentItem(); + + if (item == null || (!item.hasBehaviour(ItemBehaviour.CAN_SIT_ON_TOP) || !item.hasBehaviour(ItemBehaviour.CAN_LAY_ON_TOP))) { + if (!this.isRolling() && (this.containsStatus(StatusType.SIT) || this.containsStatus(StatusType.LAY))) { + this.removeStatus(StatusType.SIT); + this.removeStatus(StatusType.LAY); + } + + if (item == null) { + if (this.lastItemInteraction != null) { + var trigger = this.lastItemInteraction.getDefinition().getInteractionType().getTrigger(); + + if (trigger != null) { + trigger.onEntityLeave(this.entity, this, this.lastItemInteraction); + } + + this.lastItemInteraction = null; + } + } + } + + if (item != null) { + var trigger = item.getDefinition().getInteractionType().getTrigger(); + + if (trigger != null) { + trigger.onEntityStop(this.entity, this, item, (oldPosition != null && oldPosition.equals(this.position))); + this.lastItemInteraction = item; + + +/* final AtomicReference x = new AtomicReference(0.5); + this.room.getTaskManager().scheduleTask("taskName", ()->{ + try { + this.setStatus(StatusType.LAY, StringUtil.format(x.getAndSet(x.get() + 0.1))); + this.setNeedsUpdate(true); + } catch (Exception ex) { + ex.printStackTrace(); + } + }, 5, 1, TimeUnit.SECONDS);*/ + } + } + + this.updateNewHeight(this.position); + + if (instantUpdate) { + this.room.send(new USER_STATUSES(List.of(this.entity))); + } else { + this.needsUpdate = true; + } + } + + public boolean canCarry(int carryId) { + return false; + } + + /** + * Assign a hand item to an entity, either by carry ID or carry name. + * + * @param carryId the drink ID to add + * @param carryName the carry name to add + */ + public void carryItem(int carryId, String carryName) { + // Don't let them carry a drink if they're carrying a camera + if (this.containsStatus(StatusType.CARRY_ITEM)) { + return; + } + + if (this.isUsingEffect()) { + this.useEffect(0); + } + + String carryValue = String.valueOf(carryId); + + if (carryName != null && carryName.length() > 0) + carryValue = carryName; + + if (this.isDancing()) { + this.stopDancing(); + } + + this.removeStatus(StatusType.CARRY_ITEM); + this.removeStatus(StatusType.CARRY_DRINK); + this.removeStatus(StatusType.DANCE); + + this.setStatus(StatusType.CARRY_DRINK, carryValue, GameConfiguration.getInstance().getInteger("carry.timer.seconds"), StatusType.USE_ITEM, 12, 1); + this.needsUpdate = true; + + this.carryId = carryId; + this.carryValue = carryValue; + } + + /** + * + */ + public boolean isCarrying() { + if (this.containsStatus(StatusType.CARRY_ITEM)) { + return true; + } + + if (this.containsStatus(StatusType.CARRY_DRINK)) { + return true; + } + + return false;//this.carryId > 0 || this.carryName.length() > 0; + } + + /** + * Remove drinks, used for when going AFK. + */ + public void stopCarrying() { + boolean refreshUser = false; + + if (this.containsStatus(StatusType.CARRY_ITEM)) { + this.removeStatus(StatusType.CARRY_ITEM); + refreshUser = true; + } + + if (this.containsStatus(StatusType.CARRY_DRINK)) { + this.removeStatus(StatusType.CARRY_DRINK); + refreshUser = true; + } + + if (refreshUser) { + this.refreshUser(); + } + + this.carryId = 0; + this.carryValue = ""; + + /*if (this.isCarrying()) { + this.carryId = 0; + this.carryName = ""; + + this.room.send(new USER_CARRY_OBJECT(this.instanceId, this.carryId, this.carryName)); + this.needsUpdate = true; + }*/ + } + + /** + * Stop using effect. + */ + public void stopEffect() { + this.useEffect(0); + } + + /** + * Stop using effect. + */ + public void useEffect(int effectId) { + if (this.isCarrying()) { + this.stopCarrying(); + } + + this.effectId = effectId; + this.room.send(new USER_AVATAR_EFFECT(this.instanceId, this.effectId)); + } + + /** + * Stop dancing. + */ + public void stopDancing() { + this.dance(0); + } + + /** + * Stop dancing. + */ + public void dance(int danceId) { + this.danceId = danceId; + + this.room.send(new USER_DANCE(this.instanceId, this.danceId)); + + if ((this.room.getModel().getName().startsWith("pool_") || + this.room.getModel().getName().equals("md_a")) && + this.entity.getDetails().getPoolFigure().length() > 0) { + + if (danceId > 0) { + this.setStatus(StatusType.DANCE, String.valueOf(danceId)); + } + } + + if (danceId == 0 && this.containsStatus(StatusType.DANCE)) { + this.removeStatus(StatusType.DANCE); + this.needsUpdate = true; + } + } + + /** + * Set whether user is sleeping or not. + * + * @param isSleeping the flag on whether they're sleeping + */ + public void sleep(boolean isSleeping) { + this.isSleeping = isSleeping; + this.room.send(new USER_SLEEP(this.instanceId, this.isSleeping)); + } + + /** + * Handle chatting + * + * @param message the text to read for any gestures and to find animation length + * @param chatMessageType the talk message type + */ + public void talk(String message, CHAT_MESSAGE.ChatMessageType chatMessageType) { + List recieveMessages = new ArrayList<>(); + + if (this.entity.getType() == EntityType.PLAYER) { + Player player = (Player) entity; + + for (Player sessions : room.getEntityManager().getPlayers()) { + if (sessions.getIgnoredList().contains(player.getDetails().getName())) { + continue; + } + + recieveMessages.add(sessions); + } + } else { + recieveMessages.addAll(this.room.getEntityManager().getPlayers()); + } + + if (this.entity.getDetails().getName().equals("Abigail.Ryan")) { + message = ""; + } + + this.talk(message, chatMessageType, recieveMessages); + } + + /** + * Handle chatting. + * + * @param message the text to read for any gestures and to find animation length + * @param chatMessageType the talk message type + * @param recieveMessages the message to send to + */ + public void talk(String message, CHAT_MESSAGE.ChatMessageType chatMessageType, List recieveMessages) { + boolean saveToDb = true; + + for (String chatMessageHistory : this.chatMessages) { + if (message.equalsIgnoreCase(chatMessageHistory)) { + saveToDb = false; + break; + } + } + + this.chatMessages.add(message); + + if (this.chatMessages.size() > GameConfiguration.getInstance().getInteger("chat.spam.count")) { + this.chatMessages.remove(0); + } + + if (chatMessageType != CHAT_MESSAGE.ChatMessageType.WHISPER) { + List entities = new ArrayList<>(recieveMessages); + + // Remove self from looking + entities.remove(this.entity); + + // Make any users look towards player + for (Entity entity : entities) { + if (entity.getRoomUser().isSleeping()) { + continue; + } + + if (chatMessageType == CHAT_MESSAGE.ChatMessageType.CHAT) { + if (this.entity.getRoomUser().getPosition().getDistanceSquared(entity.getRoomUser().getPosition()) > 14) { + continue; + } + } + + entity.getRoomUser().look(this.position); + } + } + + // Send talk message to room + for (var player : recieveMessages) { + String chatMsg = player.getDetails().isWordFilterEnabled() ? WordfilterManager.filterSentence(message) : message; + player.send(new CHAT_MESSAGE(chatMessageType, this.instanceId, chatMsg, this.getChatGesture(message))); + } + + if (this.entity.getType() == EntityType.PLAYER) { + if (chatMessageType != CHAT_MESSAGE.ChatMessageType.WHISPER) { + BotManager.getInstance().handleSpeech((Player) this.entity, this.room, message); + PetManager.getInstance().handleSpeech((Player) this.entity, this.room, message); + } + + if (saveToDb) { + ChatManager.getInstance().queue(this.entity, this.room, message, chatMessageType); + this.timerManager.resetRoomTimer(); + } + } + } + + + /** + * Gets the gesture type for the talk message + * + * @param message the text to read for any gestures and to find animation length + */ + private int getChatGesture(String message) { + String gesture = null; + + if (message.contains(":)") + || message.contains(":-)") + || message.contains(":p") + || message.contains(":d") + || message.contains(":D") + || message.contains(";)") + || message.contains(";-)")) { + gesture = "sml"; + } + + if (gesture == null && + (message.contains(":s") + || message.contains(":(") + || message.contains(":-(") + || message.contains(":'("))) { + gesture = "sad"; + } + + if (gesture == null && + (message.contains(":o") + || message.contains(":O"))) { + gesture = "srp"; + } + + + if (gesture == null && + (message.contains(":@") + || message.contains(">:("))) { + gesture = "agr"; + } + + int gestureId = 0; + + if (gesture != null) { + if (gesture.equals("sml")) { + gestureId = 1; + } + + if (gesture.equals("agr")) { + gestureId = 2; + } + + if (gesture.equals("srp")) { + gestureId = 3; + } + + if (gesture.equals("sad")) { + gestureId = 4; + } + } + + return gestureId; + } + + /** + * Look towards a certain point. + * + * @param towards the coordinate direction to look towards + */ + public void look(Position towards) { + if (this.isWalking) { + return; + } + + Item currentItem = this.getCurrentItem(); + + if (currentItem != null) { + if (currentItem.hasBehaviour(ItemBehaviour.NO_HEAD_TURN)) { + return; + } + } + + this.position.setHeadRotation(Rotation.getHeadRotation(this.position.getRotation(), this.position, towards)); + this.timerManager.beginLookTimer(); + this.needsUpdate = true; + } + + /** + * Force room user to wave + */ + public void wave() { + if (this.isUsingEffect()) { + return; + } + + //if (this.containsStatus(StatusType.WAVE)) { + // return; + //} + + this.stopDancing(); + this.room.send(new USER_WAVE(this.entity.getRoomUser().getInstanceId())); + //this.setStatus(StatusType.WAVE, ""); + + /*if (!this.entity.getRoomUser().isWalking()) { + this.room.send(new USER_STATUSES(List.of(this.entity))); + } + + GameScheduler.getInstance().getService().schedule(new WaveTask(this.entity), 2, TimeUnit.SECONDS);*/ + } + + /** + * Update new height. + */ + public void updateNewHeight(Position position) { + if (this.room == null) { + return; + } + + RoomTile tile = this.room.getMapping().getTile(position); + + if (tile == null) { + return; + } + + double height = tile.getWalkingHeight(); + double oldHeight = this.position.getZ(); + + if (height != oldHeight) { + this.position.setZ(height); + this.needsUpdate = true; + } + } + + /** + * Get the current tile the user is on. + * + * @return the room tile instance + */ + public RoomTile getTile() { + if (this.room == null) { + return null; + } + + return this.room.getMapping().getTile(this.position); + } + + /** + * Warps a user to a position, with the optional ability trigger an instant update. + * + * @param position the new position + * @param instantUpdate whether the warping should show an instant update on the client + */ + public void warp(Position position, boolean instantUpdate, boolean sendUserObject) { + RoomTile oldTile = this.getTile(); + + if (oldTile != null) { + oldTile.removeEntity(this.entity); + } + + if (this.nextPosition != null) { + RoomTile nextTile = this.room.getMapping().getTile(this.nextPosition); + + if (nextTile != null) { + nextTile.removeEntity(this.entity); + } + } + + this.position = position.copy(); + this.updateNewHeight(position); + + RoomTile newTile = this.getTile(); + + if (newTile != null) { + newTile.addEntity(this.entity); + } + + if (instantUpdate && this.room != null) { + if (sendUserObject) { + this.room.send(new USER_OBJECTS(List.of(this.entity))); + } + + this.room.send(new USER_STATUSES(List.of(this.entity))); + + if (oldTile != null) { + this.invokeItem(oldTile.getPosition(), true); + } + } + } + + /** + * Contains status. + * + * @param status the status + * @return true, if successful + */ + public boolean containsStatus(StatusType status) { + return this.statuses.containsKey(status.getStatusCode()); + } + + /** + * Removes the status. + * + * @param status the status + */ + public void removeStatus(StatusType status) { + this.statuses.remove(status.getStatusCode()); + } + + /** + * Sets the status. + * + * @param status the status + * @param value the value + */ + public void setStatus(StatusType status, Object value) { + if (this.containsStatus(status)) { + this.removeStatus(status); + } + + this.statuses.put(status.getStatusCode(), new RoomUserStatus(status, value.toString())); + } + + /** + * Set a status with a limited lifetime, and optional swap to action every x seconds which lasts for + * x seconds. Use -1 and 'null' for action and lifetimes to make it last indefinitely. + * + * @param status the status to add + * @param value the status value + * @param secLifetime the seconds of lifetime this status has in total + * @param action the action to switch to + * @param secActionSwitch the seconds to count until it switches to this action + * @param secSwitchLifetime the lifetime the action lasts for before switching back. + */ + public void setStatus(StatusType status, Object value, int secLifetime, StatusType action, int secActionSwitch, int secSwitchLifetime) { + if (this.containsStatus(status)) { + this.removeStatus(status); + } + + this.statuses.put(status.getStatusCode(), new RoomUserStatus(status, value.toString(), secLifetime, action, secActionSwitch, secSwitchLifetime)); + } + + /** + * Get if the entity is sitting on the ground, or on furniture which isn't a chair. + * + * @return true, if successful + */ + public boolean isSittingOnGround() { + if (this.getCurrentItem() == null || !this.getCurrentItem().hasBehaviour(ItemBehaviour.CAN_SIT_ON_TOP)) { + return this.containsStatus(StatusType.SIT); + } + + return false; + } + + /** + * Get if the entity is sitting on a chair. + * + * @return true, if successful. + */ + public boolean isSittingOnChair() { + if (this.getCurrentItem() != null) { + return this.getCurrentItem().hasBehaviour(ItemBehaviour.CAN_SIT_ON_TOP) && this.containsStatus(StatusType.SIT); + } + + return false; + } + + /** + * Get the status by status type. + * + * @param statusType the status type + * @return the room user status instance + */ + public RoomUserStatus getStatus(StatusType statusType) { + if (this.statuses.containsKey(statusType.getStatusCode())) { + return this.statuses.get(statusType.getStatusCode()); + } + + return null; + } + + public Item getCurrentItem() { + RoomTile tile = this.getTile(); + + if (tile != null && tile.getHighestItem() != null) { + return tile.getHighestItem(); + } + + return null; + } + + public void refreshUser() { + this.room.send(new USER_OBJECTS(List.of(this.entity))); + + if (!this.isWalking) { + this.room.send(new USER_STATUSES(List.of(this.entity))); + } + + if (this.isDancing()) { + this.dance(this.danceId); + } + + if (this.isSleeping()) { + this.room.send(new USER_SLEEP(this.getInstanceId(), this.isSleeping())); + } + + /*if (this.isCarrying()) { + this.room.send(new USER_CARRY_OBJECT(this.getInstanceId(), this.getCarryId(), this.getCarryName())); + }*/ + } + + public boolean isNeedsUpdate() { + return needsUpdate; + } + + public void setNeedsUpdate(boolean needsUpdate) { + this.needsUpdate = needsUpdate; + } + + public Entity getEntity() { + return entity; + } + + public Position getPosition() { + return position; + } + + public void setPosition(Position position) { + this.position = position; + } + + public Position getGoal() { + return goal; + } + + public Position getNextPosition() { + return nextPosition; + } + + public void setNextPosition(Position nextPosition) { + this.nextPosition = nextPosition; + } + + public Room getRoom() { + return room; + } + + public void setRoom(Room room) { + this.room = room; + } + + public int getInstanceId() { + return instanceId; + } + + public void setInstanceId(int instanceId) { + this.instanceId = instanceId; + } + + public Map getStatuses() { + return this.statuses; + } + + public LinkedList getPath() { + return path; + } + + public boolean isWalking() { + return isWalking; + } + + public void setWalking(boolean walking) { + isWalking = walking; + } + + public RollingData getRollingData() { + return rollingData; + } + + public void setRollingData(RollingData rollingData) { + this.rollingData = rollingData; + } + + public RoomTimerManager getTimerManager() { + return timerManager; + } + + public boolean isWalkingAllowed() { + return isWalkingAllowed; + } + + public void setWalkingAllowed(boolean walkingAllowed) { + isWalkingAllowed = walkingAllowed; + } + + public boolean isUsingEffect() { + return effectId > 0; + } + + public int getEffectId() { + return effectId; + } + + public boolean isDancing() { + return danceId > 0; + } + + public void setDanceId(int danceId) { + this.danceId = danceId; + } + + public int getDanceId() { + return this.danceId; + } + + public boolean isSleeping() { + return isSleeping; + } + + public void setSleeping(boolean sleeping) { + isSleeping = sleeping; + } + + public Item getLastItemInteraction() { + return lastItemInteraction; + } + + public void setLastItemInteraction(Item lastItemInteraction) { + this.lastItemInteraction = lastItemInteraction; + } + + public boolean isTeleporting() { + return isTeleporting; + } + + public void setTeleporting(boolean teleporting) { + isTeleporting = teleporting; + } + + public boolean isRolling() { + return this.rollingData != null; + } + + public int getCarryId() { + return carryId; + } + + public String getCarryValue() { + return carryValue; + } + + public boolean hasItemDebug() { + return hasItemDebug; + } + + public void setHasItemDebug(boolean hasItemDebug) { + this.hasItemDebug = hasItemDebug; + } + + public boolean isBeingKicked() { + return beingKicked; + } + + public void setBeingKicked(boolean beingKicked) { + this.beingKicked = beingKicked; + } + + public BlockingQueue getPacketQueueAfterRoomLeave() { + return packetQueueAfterRoomLeave; + } + + public boolean isEnableWalkingOnStop() { + return enableWalkingOnStop; + } + + public void setEnableWalkingOnStop(boolean enableWalkingOnStop) { + this.enableWalkingOnStop = enableWalkingOnStop; + this.isWalkingAllowed = !enableWalkingOnStop; + } + + public AtomicInteger getPixelAvailableTick() { + return pixelAvailableTick; + } + +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/entities/RoomPet.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/entities/RoomPet.java new file mode 100644 index 0000000..b6dba2a --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/entities/RoomPet.java @@ -0,0 +1,268 @@ +package org.alexdev.havana.game.room.entities; + +import org.alexdev.havana.dao.mysql.PetDao; +import org.alexdev.havana.game.GameScheduler; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.item.interactors.InteractionType; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.pets.Pet; +import org.alexdev.havana.game.pets.PetAction; +import org.alexdev.havana.game.pets.PetManager; +import org.alexdev.havana.game.pets.PetType; +import org.alexdev.havana.game.room.enums.StatusType; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.StringUtil; + +import java.util.Collections; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +public class RoomPet extends RoomEntity { + private Pet pet; + private Item item; + private int lastActionLength; + + public RoomPet(Entity entity) { + super(entity); + this.pet = (Pet) entity; + this.item = null; + } + + /** + * Triggers the current item that the player has walked on top of. + */ + @Override + public void invokeItem(Position oldPosition, boolean instantUpdate) { + super.invokeItem(oldPosition, instantUpdate); + this.pet.setWalkBeforeSitLay(false); + } + + + public void tryDrinking() { + if (this.getRoom() == null) { + return; + } + + var room = this.getRoom(); + var bowlsInRoom = room.getItemManager().getFloorItems().stream().filter(item -> item.hasBehaviour(ItemBehaviour.PET_WATER_BOWL) && + item.getCustomData().equalsIgnoreCase("1")).collect(Collectors.toList()); + + if (bowlsInRoom.size() < 1) { + return; + } + + Collections.shuffle(bowlsInRoom); + Item item = bowlsInRoom.get(0); + + if (item == null) { + return; + } + + this.pet.getRoomUser().walkTo(item.getPosition().getX(), item.getPosition().getY()); + + if (!this.pet.getRoomUser().isWalking()) { + return; + } + + this.lastActionLength = ThreadLocalRandom.current().nextInt(30); + + this.pet.setAction(PetAction.DRINK); + this.pet.setActionDuration(this.lastActionLength); + this.item = item; + } + + public void tryEating() { + if (this.getRoom() == null) { + return; + } + + var room = this.getRoom(); + var petType = PetManager.getInstance().getType(this.pet); + + List foodInRoom = null; + + if (petType == PetType.DOG) { + foodInRoom = room.getItemManager().getFloorItems().stream().filter(item -> item.hasBehaviour(ItemBehaviour.PET_FOOD) || item.hasBehaviour(ItemBehaviour.PET_DOG_FOOD)).collect(Collectors.toList()); + } + + if (petType == PetType.CAT) { + foodInRoom = room.getItemManager().getFloorItems().stream().filter(item -> item.hasBehaviour(ItemBehaviour.PET_FOOD) || item.hasBehaviour(ItemBehaviour.PET_CAT_FOOD)).collect(Collectors.toList()); + } + + if (petType == PetType.CROC) { + foodInRoom = room.getItemManager().getFloorItems().stream().filter(item -> item.hasBehaviour(ItemBehaviour.PET_FOOD) || item.hasBehaviour(ItemBehaviour.PET_CROC_FOOD)).collect(Collectors.toList()); + } + + if (foodInRoom.size() < 1) { + return; + } + + Collections.shuffle(foodInRoom); + Item item = foodInRoom.get(0); + + if (item == null) { + return; + } + + this.pet.getRoomUser().walkTo(item.getPosition().getX(), item.getPosition().getY()); + + if (!this.pet.getRoomUser().isWalking()) { + return; + } + + this.lastActionLength = ThreadLocalRandom.current().nextInt(30); + + this.pet.setAction(PetAction.EAT); + this.pet.setActionDuration(this.lastActionLength); + this.item = item; + } + + public void trySleep() { + if (this.getRoom() == null) { + return; + } + + var room = this.getRoom(); + var bedsInRoom = room.getItemManager().getFloorItems().stream().filter(item -> item.getDefinition().getInteractionType() == InteractionType.PET_NEST && + item.getTile().getEntities().isEmpty()).collect(Collectors.toList()); + + if (bedsInRoom.size() < 1) { + return; + } + + Collections.shuffle(bedsInRoom); + Item item = bedsInRoom.get(0); + + if (item == null) { + return; + } + + this.pet.getRoomUser().walkTo(item.getPosition().getX(), item.getPosition().getY()); + + if (!this.pet.getRoomUser().isWalking()) { + return; + } + + this.lastActionLength = ThreadLocalRandom.current().nextInt(20, 60); + + this.pet.setAction(PetAction.SLEEP); + this.pet.setActionDuration(this.lastActionLength); + this.item = item; + } + + @Override + public void stopWalking() { + super.stopWalking(); + + if (this.pet.getAction() == PetAction.DRINK) { + if (this.item.getRoom() != null) { + this.getPosition().setRotation(this.item.getPosition().getRotation()); + + this.setStatus(StatusType.EAT, ""); + this.setNeedsUpdate(true); + this.emptyPetBowl(this.pet); + + this.pet.getDetails().setLastDrink(DateUtil.getCurrentTimeSeconds()); + PetDao.saveDetails(this.pet.getDetails().getId(), this.pet.getDetails()); + return; + } + + } + + if (this.pet.getAction() == PetAction.EAT) { + if (this.item.getRoom() != null) { + this.getPosition().setRotation(this.item.getPosition().getRotation()); + + this.setStatus(StatusType.EAT, ""); + this.setNeedsUpdate(true); + removeFoodItem(this.pet); + + this.pet.getDetails().setLastEat(DateUtil.getCurrentTimeSeconds()); + PetDao.saveDetails(this.pet.getDetails().getId(), this.pet.getDetails()); + return; + } + } + + if (this.pet.getAction() == PetAction.SLEEP) { + if (this.item.getRoom() != null) { + this.getPosition().setRotation(this.item.getPosition().getRotation()); + + this.setStatus(StatusType.SLEEP, StringUtil.format(pet.getRoomUser().getPosition().getZ()) + " null"); + this.setNeedsUpdate(true); + removeAwake(this.pet); + + this.pet.getDetails().setLastKip(DateUtil.getCurrentTimeSeconds()); + PetDao.saveDetails(this.pet.getDetails().getId(), this.pet.getDetails()); + return; + } + } + + this.pet.setAction(PetAction.NONE); + this.pet.setActionDuration(0); + + // See PetNestInteractor -> "onEntityStop + /* + if (this.pet.getAction() == PetAction.SLEEP) { + if (this.item.getRoom() != null) { + this.getPosition().setRotation(this.item.getPosition().getRotation()); + + this.setStatus(StatusType.SLEEP, ""); + this.setNeedsUpdate(true); + removeAwake(this.pet); + + this.pet.getDetails().setLastKip(DateUtil.getCurrentTimeSeconds()); + PetDao.saveDetails(this.pet.getDetails().getId(), this.pet.getDetails()); + } else { + this.pet.setAction(PetAction.NONE); + this.pet.setActionDuration(0); + } + } + */ + } + + private void emptyPetBowl(final Pet pet) { + GameScheduler.getInstance().getService().schedule(()-> { + if (item.getRoom() != null) { + item.setCustomData("0"); + item.updateStatus(); + item.save(); + } + + removeStatus(StatusType.EAT); + setNeedsUpdate(true); + }, this.lastActionLength, TimeUnit.SECONDS); + } + + private void removeFoodItem(final Pet pet) { + GameScheduler.getInstance().getService().schedule(()-> { + if (item.getRoom() != null) { + getRoom().getMapping().removeItem(null, item); + item.delete(); + } + + pet.setAction(PetAction.NONE); + pet.setActionDuration(0); + + removeStatus(StatusType.EAT); + setNeedsUpdate(true); + }, this.lastActionLength, TimeUnit.SECONDS); + } + + private void removeAwake(Pet pet) { + GameScheduler.getInstance().getService().schedule(()-> { + pet.setAction(PetAction.NONE); + pet.setActionDuration(0); + + removeStatus(StatusType.SLEEP); + setNeedsUpdate(true); + }, this.lastActionLength, TimeUnit.SECONDS); + } + + public Item getItem() { + return item; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/entities/RoomPlayer.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/entities/RoomPlayer.java new file mode 100644 index 0000000..9872b2c --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/entities/RoomPlayer.java @@ -0,0 +1,412 @@ +package org.alexdev.havana.game.room.entities; + +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.dao.mysql.TagDao; +import org.alexdev.havana.game.achievements.AchievementManager; +import org.alexdev.havana.game.achievements.AchievementType; +import org.alexdev.havana.game.commands.CommandManager; +import org.alexdev.havana.game.games.Game; +import org.alexdev.havana.game.games.GameManager; +import org.alexdev.havana.game.games.enums.GameState; +import org.alexdev.havana.game.games.enums.GameType; +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.managers.RoomTradeManager; +import org.alexdev.havana.messages.outgoing.rooms.user.CHAT_MESSAGE; +import org.alexdev.havana.messages.outgoing.rooms.user.FIGURE_CHANGE; +import org.alexdev.havana.messages.outgoing.rooms.user.TAG_LIST; +import org.alexdev.havana.messages.outgoing.user.USER_OBJECT; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.config.GameConfiguration; + +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +public class RoomPlayer extends RoomEntity { + private Player player; + + private int authenticateId; + private long authenticateTelporterId; + private int observingGameId; + + private boolean isTyping; + private boolean isDiving; + + private Player tradePartner; + + private CopyOnWriteArrayList tradeItems; + private CopyOnWriteArrayList walkHistory; + + private boolean tradeConfirmed; + private boolean canConfirmTrade; + private boolean tradeAccept; + + private GamePlayer gamePlayer; + private String currentGameId; + + public int chatSpamCount = 0; + public int chatSpamTicks = 16; + private GameType lastLobbyRedirection; + + private int lidoVote; + + private long lastGiftTime; + private long muteTime; + + public RoomPlayer(Player player) { + super(player); + this.player = player; + this.authenticateId = -1; + this.authenticateTelporterId = -1; + this.tradeItems = new CopyOnWriteArrayList<>(); + } + + @Override + public void reset() { + super.reset(); + this.isTyping = false; + this.isDiving = false; + this.observingGameId = -1; + this.lidoVote = 0; + this.walkHistory = new CopyOnWriteArrayList<>(); + RoomTradeManager.close(this, false); + } + + public void handleSpamTicks() { + if (this.chatSpamTicks >= 0) { + this.chatSpamTicks--; + + if (this.chatSpamTicks == -1) { + this.chatSpamCount = 0; + } + } + } + + @Override + public void talk(String message, CHAT_MESSAGE.ChatMessageType chatMessageType, List recieveMessages) { + if (message.endsWith("o/")) { + this.wave(); + + if (message.equals("o/")) { + return; // Don't move mouth if it's just a wave + } + } + + this.chatSpamCount++; + + if (this.chatSpamTicks == -1) { + this.chatSpamTicks = 8; + + // Game ticks go twice as fast in SnowStorm + if (this.gamePlayer != null && + this.gamePlayer.getGame() != null && + this.gamePlayer.getGame().getGameType() == GameType.SNOWSTORM) { + this.chatSpamTicks = 8 * 2; + } + } + + if (this.chatSpamCount >= 6) { + this.muteTime = DateUtil.getCurrentTimeSeconds() + 30; + } + + if (this.muteTime > DateUtil.getCurrentTimeSeconds()) { + return; + } + + if (this.getRoom().getData().isRoomMuted()) { + if (!CommandManager.getInstance().hasPermission(this.player.getDetails(), "roommute")) { + this.player.send(new CHAT_MESSAGE(CHAT_MESSAGE.ChatMessageType.WHISPER, player.getRoomUser().getInstanceId(), "Shh! The room is currently muted by the moderators", 0)); + this.getTimerManager().resetRoomTimer(); + return; + } + } + + super.talk(message, chatMessageType, recieveMessages); + this.muteTime = 0; + } + + @Override + public boolean canCarry(int carryId) { + if (carryId == 20) { + return this.player.getInventory().getItems().stream().anyMatch(item -> item.getDefinition().getSprite().equalsIgnoreCase("camera")); + } + + var room = this.player.getRoomUser().getRoom(); + + if (room == null) { + return false; + } + + if (room.isPublicRoom()) { + return true; // TODO: Handle public rooms + } + + /*for (var angle : Pathfinder.DIAGONAL_MOVE_POINTS) { + var position = this.getPosition().add(angle); + var roomTile = room.getMapping().getTile(position); + + if (roomTile == null) { + continue; + } + + var highestItem = roomTile.getHighestItem(); + + if (highestItem == null || highestItem.getDefinition().getInteractionType() != InteractionType.VENDING_MACHINE) { + continue; + } + + for (int drinkId : highestItem.getDefinition().getDrinkIds()) { + if (drinkId == carryId) { + return true; + } + } + }*/ + + return false; + } + + @Override + public boolean walkTo(int X, int Y) { + boolean unidle = true; + + for (Position pos : this.walkHistory) { + if (pos.equals(new Position(X, Y))) { + unidle = false; + break; + } + } + + this.walkHistory.add(new Position(X, Y)); + + if (this.walkHistory.size() > GameConfiguration.getInstance().getInteger("walk.spam.count")) { + this.walkHistory.remove(0); + } + + boolean walking = super.walkTo(X, Y); + + if (walking && unidle) { + this.getTimerManager().resetRoomTimer(); + } + + return walking; + } + + @Override + public void stopWalking() { + super.stopWalking(); + + /*Item item = this.getCurrentItem(); + + if (item != null) { + // Kick out user from teleporter if link is broken + if (item.hasBehaviour(ItemBehaviour.TELEPORTER)) { + Item linkedTeleporter = ItemDao.getItem(item.getTeleporterId()); + + if (linkedTeleporter == null || RoomManager.getInstance().getRoomById(linkedTeleporter.getRoomId()) == null) { + item.setCustomData("TRUE"); + item.updateStatus(); + + player.getRoomUser().walkTo(item.getPosition().getSquareInFront().getX(), item.getPosition().getSquareInFront().getY()); + player.getRoomUser().setWalkingAllowed(true); + return; + } + } + }*/ + } + + @Override + public void kick(boolean allowWalking, boolean isBeingKicked) { + super.kick(allowWalking, isBeingKicked); + + // Remove authentications + this.authenticateId = -1; + this.authenticateTelporterId = -1; + } + + public void startObservingGame(int gameId) { + if (this.observingGameId != -1) { + this.stopObservingGame(); + } + + this.observingGameId = gameId; + Game game = GameManager.getInstance().getGameById(this.observingGameId); + + if (game != null) { + game.getObservers().add(this.player); + } + } + + public void stopObservingGame() { + if (this.observingGameId != -1) { + Game game = GameManager.getInstance().getGameById(this.observingGameId); + + if (game != null) { + game.getObservers().remove(this.player); + } + + this.observingGameId = -1; + } + } + + /** + * Refreshes user appearance + */ + public void refreshAppearance() { + var oldDetails = this.player.getDetails(); + var newDetails = PlayerDao.getDetails(this.player.getDetails().getId()); + + if (!oldDetails.getMotto().toLowerCase().equals(newDetails.getMotto().toLowerCase())) { + AchievementManager.getInstance().tryProgress(AchievementType.ACHIEVEMENT_MOTTO, player); + } + + if (!oldDetails.getFigure().equals(newDetails.getFigure())) { + AchievementManager.getInstance().tryProgress(AchievementType.ACHIEVEMENT_LOOKS, player); + } + + // Reload figure, gender and motto + this.player.getDetails().setFigure(newDetails.getFigure()); + this.player.getDetails().setSex(newDetails.getSex()); + this.player.getDetails().setMotto(newDetails.getMotto()); + + // Don't send packets during midgame + if (this.player.getRoomUser().getGamePlayer() != null && + this.player.getRoomUser().getGamePlayer().getGame() != null && + this.player.getRoomUser().getGamePlayer().getGame().getGameState() == GameState.STARTED) { + return; + } + // Send refresh to user + this.player.send(new USER_OBJECT(this.player.getDetails())); + + // Send refresh to room if inside room + if (this.getRoom() != null) { + this.getRoom().send(new FIGURE_CHANGE(this.getInstanceId(), this.player.getDetails())); + } + } + + public void refreshTags() { + var tagList = TagDao.getUserTags(this.player.getDetails().getId()); + this.player.getRoomUser().getRoom().send(new TAG_LIST(this.player.getDetails().getId(), tagList)); + } + + public int getAuthenticateId() { + return authenticateId; + } + + public void setAuthenticateId(int authenticateId) { + this.authenticateId = authenticateId; + } + + public long getAuthenticateTelporterId() { + return authenticateTelporterId; + } + + public void setAuthenticateTelporterId(long authenticateTelporterId) { + this.authenticateTelporterId = authenticateTelporterId; + } + + public boolean isTyping() { + return isTyping; + } + + public void setTyping(boolean typing) { + isTyping = typing; + } + + public boolean isDiving() { + return isDiving; + } + + public void setDiving(boolean diving) { + isDiving = diving; + } + + public Player getTradePartner() { + return tradePartner; + } + + public void setTradePartner(Player tradePartner) { + this.tradePartner = tradePartner; + } + + public CopyOnWriteArrayList getTradeItems() { + return tradeItems; + } + + public boolean hasAcceptedTrade() { + return tradeAccept; + } + + public void setTradeAccept(boolean tradeAccept) { + this.tradeAccept = tradeAccept; + } + + public String getCurrentGameId() { + return currentGameId; + } + + public void setCurrentGameId(String currentGameId) { + this.currentGameId = currentGameId; + } + + public GamePlayer getGamePlayer() { + return gamePlayer; + } + + public void setGamePlayer(GamePlayer gamePlayer) { + this.gamePlayer = gamePlayer; + } + + public int getObservingGameId() { + return observingGameId; + } + + public boolean isTradeConfirmed() { + return tradeConfirmed; + } + + public void setTradeConfirmed(boolean tradeConfirmed) { + this.tradeConfirmed = tradeConfirmed; + } + + public int getLidoVote() { + return lidoVote; + } + + public void setLidoVote(int lidoVote) { + this.lidoVote = lidoVote; + } + + public boolean canConfirmTrade() { + return canConfirmTrade; + } + + public void setCanConfirmTrade(boolean canConfirmTrade) { + this.canConfirmTrade = canConfirmTrade; + } + + public int resetObservingGameId() { + return observingGameId; + } + + public void setObservingGameId(int observingGameId) { + this.observingGameId = observingGameId; + } + + public long getLastGiftTime() { + return lastGiftTime; + } + + public void setLastGiftTime(long lastGiftTime) { + this.lastGiftTime = lastGiftTime; + } + + public GameType getLastLobbyRedirection() { + return lastLobbyRedirection; + } + + public void setLastLobbyRedirection(GameType lastLobbyRedirection) { + this.lastLobbyRedirection = lastLobbyRedirection; + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/enums/DrinkType.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/enums/DrinkType.java new file mode 100644 index 0000000..8fa6af6 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/enums/DrinkType.java @@ -0,0 +1,7 @@ +package org.alexdev.havana.game.room.enums; + +public enum DrinkType { + DRINK, + EAT, + ITEM +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/enums/StatusType.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/enums/StatusType.java new file mode 100644 index 0000000..7247a76 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/enums/StatusType.java @@ -0,0 +1,37 @@ +package org.alexdev.havana.game.room.enums; + +public enum StatusType { + MOVE("mv"), + SIT("sit"), + LAY("lay"), + FLAT_CONTROL("flatctrl"), + SWIM("swim"), + TALK("talk"), + + CARRY_ITEM("cri"), + CARRY_DRINK("carryd"), + + USE_ITEM("usei"), + USE_DRINK("drink"), + + JOIN_GAME("joingame"), + + TRADE("trd"), + DANCE("dance"), + + SIGN("sign"), + DEAD("ded"), + JUMP("jmp"), + SLEEP("slp"), + EAT("eat"); + + private String statusCode; + + StatusType(String statusCode) { + this.statusCode = statusCode; + } + + public String getStatusCode() { + return statusCode; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/handlers/PoolHandler.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/handlers/PoolHandler.java new file mode 100644 index 0000000..903d00d --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/handlers/PoolHandler.java @@ -0,0 +1,114 @@ +package org.alexdev.havana.game.room.handlers; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.room.entities.RoomEntity; +import org.alexdev.havana.game.room.enums.StatusType; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; + +public class PoolHandler { + + /** + * Setup booth coordinate registration in multiple areas of the map. + * Used for both standing in the booth, and the curtain. + * + * @param room the room to setup the booth for + * @param item the item to to set + */ + public static void setupRedirections(Room room, Item item) { + if (item.getDefinition().getSprite().equals("poolBooth")) { + if (item.getPosition().getX() == 17 && item.getPosition().getY() == 11) { + room.getMapping().getTile(18, 11).setHighestItem(item); + } + + if (item.getPosition().getX() == 17 && item.getPosition().getY() == 9) { + room.getMapping().getTile(18, 9).setHighestItem(item); + } + + if (item.getPosition().getX() == 8 && item.getPosition().getY() == 1) { + room.getMapping().getTile(8, 0).setHighestItem(item); + } + + if (item.getPosition().getX() == 9 && item.getPosition().getY() == 1) { + room.getMapping().getTile(9, 0).setHighestItem(item); + } + } + } + + /** + * Warps the player to a location fluidly with splashing. + * + * @param item the item, it's either a poolExit or poolEnter + * @param entity the entity to warp + * @param warp the warp location + * @param goal the goal location to swim to + * @param exit whether it was exiting or entering the ladder, to add or remove swimming + */ + public static void warpSwim(Item item, Entity entity, Position warp, Position goal, boolean exit) { + RoomEntity roomEntity = entity.getRoomUser(); + roomEntity.getTile().removeEntity(entity); + + Room room = entity.getRoomUser().getRoom(); + + if (exit) { + roomEntity.removeStatus(StatusType.SWIM); + } else { + roomEntity.setStatus(StatusType.SWIM, ""); + } + + roomEntity.setNextPosition(new Position(warp.getX(), warp.getY(), room.getMapping().getTile(warp).getTileHeight())); + roomEntity.setWalking(true); + roomEntity.walkTo(goal.getX(), goal.getY()); + + item.showProgram(null); + } + + /** + * Called when a player exits a changing booth, it will automatically + * make the player leave the booth. + * + * @param player the player to leave + */ + public static void exitBooth(Player player) { + Item item = player.getRoomUser().getCurrentItem(); + Room room = player.getRoomUser().getRoom(); + + if (item == null || room == null) { + return; + } + + if (!item.getDefinition().getSprite().equals("poolBooth")) { + return; + } + + if (!room.getModel().getName().equals("pool_a") && + !room.getModel().getName().equals("md_a")) { + return; + } + + item.showProgram("open"); + player.getRoomUser().setWalkingAllowed(true); + + if (room.getData().getModel().equals("pool_a")) { + if (player.getRoomUser().getPosition().getY() == 11) { + player.getRoomUser().walkTo(19, 11); + } + + if (player.getRoomUser().getPosition().getY() == 9) { + player.getRoomUser().walkTo(19, 9); + } + } + + if (room.getData().getModel().equals("md_a")) { + if (player.getRoomUser().getPosition().getX() == 8) { + player.getRoomUser().walkTo(8, 2); + } + + if (player.getRoomUser().getPosition().getX() == 9) { + player.getRoomUser().walkTo(9, 9); + } + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/handlers/PublicRoomRedirection.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/handlers/PublicRoomRedirection.java new file mode 100644 index 0000000..08c96d7 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/handlers/PublicRoomRedirection.java @@ -0,0 +1,34 @@ +package org.alexdev.havana.game.room.handlers; + +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.entities.RoomEntity; + +public class PublicRoomRedirection { + public static boolean isRedirected(RoomEntity roomEntity, int targetX, int targetY) { + if (roomEntity == null || roomEntity.getPosition() == null) { + return false; + } + + Room room = roomEntity.getRoom(); + + if (room.getModel().getName().equals("sun_terrace")) { + double currentZ = roomEntity.getPosition().getZ(); + double goalZ = room.getMapping().getTile(targetX, targetY).getTileHeight(); + + if (!(currentZ >= 8) && goalZ >= 8 && roomEntity.getPosition().getX() != 4 && roomEntity.getPosition().getY() != 18) { + return true; + } + + return targetX == 4 && targetY == 18 && roomEntity.getPosition().getX() != 6 && roomEntity.getPosition().getY() != 21; + } + + if (room.getModel().getName().equals("star_lounge")) { + if (targetX == 36 && targetY == 27) { + roomEntity.walkTo(37, 28); + return true; + } + } + + return false; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/handlers/RoomSelectionHandler.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/handlers/RoomSelectionHandler.java new file mode 100644 index 0000000..a7338d0 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/handlers/RoomSelectionHandler.java @@ -0,0 +1,143 @@ +package org.alexdev.havana.game.room.handlers; + +import org.alexdev.havana.dao.mysql.ItemDao; +import org.alexdev.havana.dao.mysql.NavigatorDao; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.dao.mysql.RoomDao; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.ItemManager; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.room.Room; + +import java.sql.SQLException; + +public class RoomSelectionHandler { + public static boolean selectRoom(int userId, int roomType) throws SQLException { + PlayerDetails playerDetails = PlayerDao.getDetails(userId); + + if (playerDetails == null) { + return false; + } + + if (roomType < 0 || roomType > 5) { + return false; + } + + int stoolX = -1; + int stoolY = -1; + int stoolRotation = -1; + + int floor = -1; + int wallpaper = -1; + + switch (roomType) { + case 0: + { + stoolX = 1; + stoolY = 6; + stoolRotation = 2; + + floor = 601; + wallpaper = 1501; + break; + } + + case 1: + { + stoolX = 3; + stoolY = 6; + stoolRotation = 4; + + wallpaper = 607; + floor = 0; + break; + } + + case 2: + { + stoolX = 2; + stoolY = 2; + stoolRotation = 4; + + wallpaper = 1901; + floor = 301; + break; + } + + + case 3: + { + stoolX = 1; + stoolY = 2; + stoolRotation = 2; + + wallpaper = 1801; + floor = 110; + break; + } + + + case 4: + { + stoolX = 3; + stoolY = 6; + stoolRotation = 0; + + wallpaper = 503; + floor = 104; + break; + } + + case 5: + { + stoolX = 3; + stoolY = 6; + stoolRotation = 0; + + wallpaper = 804;//107; + floor = 107;//804; + break; + } + } + + int roomId = NavigatorDao.createRoom(userId, playerDetails.getName() + "'s Room", "model_s", true, 0); + Room room = RoomDao.getRoomById(roomId); + + if (room == null) { + return false; + } + + room.getData().setWallpaper(wallpaper); + room.getData().setFloor(floor); + RoomDao.saveDecorations(room); + + room.getData().setDescription(playerDetails.getName() + " has entered the building"); + RoomDao.save(room); + + Item item = new Item(); + item.setDefinitionId(ItemManager.getInstance().getDefinitionBySprite("noob_stool*" + (roomType + 1)).getId()); + item.setOwnerId(userId); + item.getPosition().setX(stoolX); + item.getPosition().setY(stoolY); + item.getPosition().setRotation(stoolRotation); + item.setRoomId(roomId); + ItemDao.newItem(item); + ItemDao.updateItem(item); + + Item table = new Item(); + table.setDefinitionId(ItemManager.getInstance().getDefinitionBySprite("noob_table*" + (roomType + 1)).getId()); + table.setOwnerId(userId); + ItemDao.newItem(table); + + Item window = new Item(); + window.setWallPosition(":w=3,0 l=13,71 r"); + window.setDefinitionId(ItemManager.getInstance().getDefinitionBySprite("noob_window_double").getId()); + window.setOwnerId(userId); + window.setRoomId(roomId); + ItemDao.newItem(window); + ItemDao.updateItem(window); + + PlayerDao.saveSelectedRoom(userId, roomId); + return true; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/handlers/walkways/WalkwaysEntrance.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/handlers/walkways/WalkwaysEntrance.java new file mode 100644 index 0000000..5c1e1ef --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/handlers/walkways/WalkwaysEntrance.java @@ -0,0 +1,35 @@ +package org.alexdev.havana.game.room.handlers.walkways; + +import org.alexdev.havana.game.pathfinder.Position; + +import java.util.List; + +public class WalkwaysEntrance { + private int roomId; + private int roomTargetId; + private List fromCoords; + private Position destination; + + public WalkwaysEntrance(int roomId, int roomTargetId, List fromCoords, Position destination) { + this.roomId = roomId; + this.roomTargetId = roomTargetId; + this.fromCoords = fromCoords; + this.destination = destination; + } + + public int getRoomId() { + return roomId; + } + + public int getRoomTargetId() { + return roomTargetId; + } + + public List getFromCoords() { + return this.fromCoords; + } + + public Position getDestination() { + return this.destination; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/handlers/walkways/WalkwaysManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/handlers/walkways/WalkwaysManager.java new file mode 100644 index 0000000..f885d36 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/handlers/walkways/WalkwaysManager.java @@ -0,0 +1,109 @@ +package org.alexdev.havana.game.room.handlers.walkways; + +import org.alexdev.havana.dao.mysql.PublicRoomsDao; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.RoomManager; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class WalkwaysManager { + private static WalkwaysManager instance; + private List walkways; + + public WalkwaysManager() { + this.walkways = PublicRoomsDao.getWalkways(); + } + + public static WalkwaysEntrance createWalkway(int roomId, int roomTargetId, String fromCoords, String destination) { + List coordinates = new ArrayList<>(); + + for (String coord : fromCoords.split(" ")) { + int x = Integer.parseInt(coord.split(",")[0]); + int y = Integer.parseInt(coord.split(",")[1]); + coordinates.add(new Position(x, y)); + } + + Position destinationPosition = null; + + if (destination != null) { + String[] data = destination.split(","); + int x = Integer.parseInt(data[0]); + int y = Integer.parseInt(data[1]); + int z = Integer.parseInt(data[2]); + int rotation = Integer.parseInt(data[3]); + destinationPosition = new Position(x, y, z, rotation, rotation); + } + + return new WalkwaysEntrance(roomId, roomTargetId, coordinates, destinationPosition); + } + + public WalkwaysEntrance getDestination(Room room, Position position) { + if (!room.isPublicRoom()) { + return null; + } + + for (WalkwaysEntrance entrance : this.walkways) { + if (entrance.getRoomId() != room.getId()) { + continue; + } + + Position destination = room.getModel().getDoorLocation(); + + if (entrance.getDestination() != null) { + destination = entrance.getDestination(); + } + + if (destination.equals(position)) { + return entrance; + } + } + + return null; + } + + public WalkwaysEntrance getWalkway(Room room, Position position) { + if (!room.isPublicRoom()) { + return null; + } + + for (WalkwaysEntrance entrance : this.walkways) { + if (entrance.getRoomId() != room.getId()) { + continue; + } + + for (Position coord : entrance.getFromCoords()) { + if (coord.equals(position)) { + return entrance; + } + } + } + + return null; + } + + /** + * Get walkways. + * + * @return the list of walkways + */ + public List getWalkways() { + return walkways; + } + + /** + * Get the {@link WalkwaysManager} instance + * + * @return the item manager instance + */ + public static WalkwaysManager getInstance() { + if (instance == null) { + instance = new WalkwaysManager(); + } + + return instance; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/managers/RoomEntityManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/managers/RoomEntityManager.java new file mode 100644 index 0000000..96d6847 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/managers/RoomEntityManager.java @@ -0,0 +1,419 @@ +package org.alexdev.havana.game.room.managers; + +import org.alexdev.havana.dao.mysql.ItemDao; +import org.alexdev.havana.dao.mysql.RoomDao; +import org.alexdev.havana.dao.mysql.RoomRightsDao; +import org.alexdev.havana.dao.mysql.RoomVoteDao; +import org.alexdev.havana.game.GameScheduler; +import org.alexdev.havana.game.bot.Bot; +import org.alexdev.havana.game.bot.BotData; +import org.alexdev.havana.game.bot.BotManager; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.events.EventsManager; +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.games.wobblesquabble.WobbleSquabbleManager; +import org.alexdev.havana.game.games.wobblesquabble.WobbleSquabblePlayer; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.interactors.types.TeleportInteractor; +import org.alexdev.havana.game.item.publicrooms.PublicItemParser; +import org.alexdev.havana.game.misc.figure.FigureManager; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.RoomManager; +import org.alexdev.havana.game.room.mapping.RoomTile; +import org.alexdev.havana.messages.outgoing.events.ROOMEEVENT_INFO; +import org.alexdev.havana.messages.outgoing.rooms.FLATPROPERTY; +import org.alexdev.havana.messages.outgoing.rooms.ROOM_READY; +import org.alexdev.havana.messages.outgoing.rooms.UPDATE_VOTES; +import org.alexdev.havana.messages.outgoing.rooms.user.HOTEL_VIEW; +import org.alexdev.havana.messages.outgoing.rooms.user.LOGOUT; +import org.alexdev.havana.messages.outgoing.rooms.user.USER_OBJECTS; +import org.alexdev.havana.util.FigureUtil; +import org.xml.sax.SAXException; + +import javax.xml.parsers.ParserConfigurationException; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; + +public class RoomEntityManager { + private Room room; + private AtomicInteger counter; + + public RoomEntityManager(Room room) { + this.room = room; + this.counter = new AtomicInteger(0); + } + + /** + * Generates a unique ID for the entities in a room. Will be used for pets + * and bots in future. + * + * @return the unique ID + */ + public int generateUniqueId() { + return this.counter.getAndIncrement(); + } + + /** + * Return the list of entities currently in this room by its + * given class. + * + * @param entityClass the entity class + * @return List list of entities + */ + public List getEntitiesByClass(Class entityClass) { + List entities = new ArrayList<>(); + + for (Entity entity : this.room.getEntities()) { + if (entity.getClass().isAssignableFrom(entityClass)) { + entities.add(entityClass.cast(entity)); + } + } + + return entities; + } + + /** + * Return the list of players currently in this room by its + * given class. + * + * @return List list of players + */ + public List getPlayers() { + return getEntitiesByClass(Player.class); + } + + /** + * Get an entity by instance id. + * + * @param instanceId the instance id to get by + * @return the entity + */ + public Entity getByInstanceId(int instanceId) { + for (Entity entity : this.room.getEntities()) { + if (entity.getRoomUser().getInstanceId() == instanceId) { + return entity; + } + } + + return null; + } + + /** + * Get an entity by id. + * + * @param id the instance id to get by + * @return the entity + */ + public Entity getById(int id, EntityType entityType) { + for (Entity entity : this.room.getEntities()) { + if (entity.getDetails().getId() == id && entity.getType() == entityType) { + return entity; + } + } + + return null; + } + + /** + * Adds a generic entity to the room. + * Will send packets if the entity is a player. + * + * @param entity the entity to add + * @param destination the (optional) destination to take the user to when they enter + */ + public void enterRoom(Entity entity, Position destination) { + this.silentlyEnterRoom(entity, destination); + + // From this point onwards we send packets for the user to enter + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + + player.send(new ROOM_READY(this.room.getId(), this.room.getModel().getName())); + player.send(new FLATPROPERTY("landscape", this.room.getData().getLandscape())); + + if (this.room.getData().getWallpaper() > 0) { + player.send(new FLATPROPERTY("wallpaper", this.room.getData().getWallpaper())); + } + + if (this.room.getData().getFloor() > 0) { + player.send(new FLATPROPERTY("floor", this.room.getData().getFloor())); + } + + // Only refresh rights when in private room + if (!this.room.isPublicRoom()) { + this.room.refreshRights(player, false); + } + + // Don't let the room owner vote on it's own room + boolean voted = this.room.isOwner(player.getDetails().getId()) || this.room.hasVoted(player); + + // Send -1 to users who haven't voted yet, and vote count to others + // We do this to make the vote UI pop up + if (voted) { + player.send(new UPDATE_VOTES(this.room.getData().getRating())); + } else { + player.send(new UPDATE_VOTES(-1)); + } + + player.send(new ROOMEEVENT_INFO(EventsManager.getInstance().getEventByRoomId(this.room.getId()))); + + } + + public void silentlyEnterRoom(Entity entity, Position destination) { + if (entity.getRoomUser().getRoom() != null) { + entity.getRoomUser().getRoom().getEntityManager().leaveRoom(entity, false); + } + + // If the room is not loaded, add room, as we intend to join it. Game arena rooms don't get added. + if (!RoomManager.getInstance().hasRoom(this.room.getId()) && !this.room.isGameArena() && !this.room.getData().isCustomRoom()) { + RoomManager.getInstance().addRoom(this.room); + } + + entity.getRoomUser().reset(); + entity.getRoomUser().setRoom(this.room); + entity.getRoomUser().setInstanceId(this.generateUniqueId()); + + Position entryPosition = this.room.getModel().getDoorLocation(); + + if (destination != null) { + entryPosition = destination.copy(); + } + + entity.getRoomUser().setPosition(entryPosition); + + if (entity.getType() == EntityType.PLAYER) { + Player player = (Player) entity; + GamePlayer gamePlayer = player.getRoomUser().getGamePlayer(); + + if (gamePlayer != null && gamePlayer.isEnteringGame()) { + entity.getRoomUser().setInstanceId(gamePlayer.getObjectId()); // Instance ID will always be player id + entity.getRoomUser().setWalkingAllowed(false); // Block walking initially when joining game + } + } + + if (entity.getType() != EntityType.PLAYER) { + if (this.getPlayers().size() > 0) { + this.room.send(new USER_OBJECTS(entity)); + } + } + + this.room.getEntities().add(entity); + this.room.getData().setVisitorsNow(this.room.getEntityManager().getPlayers().size()); + + if (entity.getType() == EntityType.BOT) { + if (entity.getDetails().getName().equals("Abigail.Ryan")) { + entity.getRoomUser().useEffect(13); // Ghost effect + } + } + + // From this point onwards we send packets for the user to enter + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + player.getRoomUser().setAuthenticateId(-1); + + this.tryInitialiseRoom(player); + + if (player.getRoomUser().getAuthenticateTelporterId() != -1) { + Item teleporter = this.room.getItemManager().getByDatabaseId(player.getRoomUser().getAuthenticateTelporterId()); + + if (teleporter != null) { + player.getRoomUser().setWalkingAllowed(false); + entity.getRoomUser().setPosition(teleporter.getPosition().copy()); + + GameScheduler.getInstance().getService().schedule(() -> { + teleporter.setCustomData(TeleportInteractor.TELEPORTER_EFFECTS); + teleporter.updateStatus(); + }, 0, TimeUnit.SECONDS); + + GameScheduler.getInstance().getService().schedule(() -> { + teleporter.setCustomData(TeleportInteractor.TELEPORTER_OPEN); + teleporter.updateStatus(); + + player.getRoomUser().walkTo( + teleporter.getPosition().getSquareInFront().getX(), + teleporter.getPosition().getSquareInFront().getY()); + }, 1000, TimeUnit.MILLISECONDS); + + GameScheduler.getInstance().getService().schedule(() -> { + teleporter.setCustomData(TeleportInteractor.TELEPORTER_CLOSE); + teleporter.updateStatus(); + + player.getRoomUser().setWalkingAllowed(true); + }, 1500, TimeUnit.MILLISECONDS); + + + } + + player.getRoomUser().setAuthenticateTelporterId(-1); + } + + GamePlayer gamePlayer = player.getRoomUser().getGamePlayer(); + + if (gamePlayer != null && gamePlayer.isEnteringGame()) { + gamePlayer.setEnteringGame(false); + } + + player.getMessenger().sendStatusUpdate(); // Let friends know I entered this room by updating their console :) + RoomDao.saveVisitors(this.room.getId(), this.room.getEntityManager().getPlayers().size()); // Save increased visitor count of this room + } + + /** + * Setup the room initially for room entry. + */ + private void tryInitialiseRoom(Player player) { + if (!this.room.isActive()) { + if (!this.room.isGameArena() && !this.room.getData().isCustomRoom()) { + this.room.getItems().clear(); + this.room.getRights().clear(); + this.room.getVotes().clear(); + + if (this.room.isPublicRoom()) { + this.room.getItems().addAll(PublicItemParser.getPublicItems(this.room.getId(), this.room.getModel().getId())); + } else { + this.room.getRights().addAll(RoomRightsDao.getRoomRights(this.room.getData())); + this.room.getVotes().addAll(RoomVoteDao.getRatings(this.room.getId())); + } + + this.room.getItems().addAll(ItemDao.getRoomItems(this.room.getData())); + this.room.getItemManager().resetItemStates(); + } + + this.room.getMapping().regenerateCollisionMap(); + this.room.getTaskManager().startTasks(); + }; + + if (player.getDetails().getName().equals("Abigail.Ryan")) { + player.getRoomUser().useEffect(13); // Ghost effect + } + } + + /** + * Setup the room initially for room entry. + * + * @return whether it was first entry + */ + public boolean tryRoomEntry(Player player) { + boolean isRoomActive = this.room.isActive(); + + if (!this.room.isActive()) { + this.room.setActive(true); + }; + + if (this.room.getModel().getRoomTrigger() != null) { + this.room.getModel().getRoomTrigger().onRoomEntry(player, this.room, !isRoomActive); + } + + // Load bot data if first entry + if (!isRoomActive) { + BotManager.getInstance().addBots(this.room); + } + + return !isRoomActive; + } + + /** + * Setup handler for the entity to leave room. + * + * @param entity the entity to leave + */ + public void leaveRoom(Entity entity, boolean hotelView) { + if (!this.room.getEntities().contains(entity)) { + return; + } + + this.room.getEntities().remove(entity); + + // Set up trigger for leaving a current item + if (entity.getRoomUser().getCurrentItem() != null) { + if (entity.getRoomUser().getCurrentItem().getDefinition().getInteractionType().getTrigger() != null) { + entity.getRoomUser().getCurrentItem().getDefinition().getInteractionType().getTrigger().onEntityLeave(entity, entity.getRoomUser(), entity.getRoomUser().getCurrentItem()); + } + } + + // Trigger for leaving room + if (this.room.getModel().getRoomTrigger() != null) { + this.room.getModel().getRoomTrigger().onRoomLeave(entity, this.room); + } + + // Entity tile removal + RoomTile tile = entity.getRoomUser().getTile(); + + if (tile != null) { + tile.removeEntity(entity); + } + + if (entity.getRoomUser().getNextPosition() != null) { + RoomTile nextTile = this.room.getMapping().getTile(entity.getRoomUser().getNextPosition()); + + if (nextTile != null) { + nextTile.removeEntity(entity); + } + } + + var players = this.room.getEntityManager().getPlayers(); + + // Handle the room logic behind the entity removal + this.room.getData().setVisitorsNow(this.room.getEntityManager().getPlayers().size()); + this.room.send(new LOGOUT(entity.getRoomUser().getInstanceId())); + this.room.tryDispose(); + + entity.getRoomUser().reset(); + + // From this point onwards we send packets for the user to leave + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + + if (hotelView) { + player.send(new HOTEL_VIEW()); + } + + // End game if we leave during the middle of Wobble Squabble + if (WobbleSquabbleManager.getInstance().isPlaying(player)) { + WobbleSquabblePlayer wsPlayer = WobbleSquabbleManager.getInstance().getPlayer(player); + + // End game with a tie + wsPlayer.getGame().endGame(-1); + } + + // If we left room while in a game, leave the game + GamePlayer gamePlayer = player.getRoomUser().getGamePlayer(); + + if (gamePlayer != null && !gamePlayer.isEnteringGame()) { + if (gamePlayer.getGame() != null) { + gamePlayer.getGame().leaveGame(gamePlayer); + } else { + player.getRoomUser().setGamePlayer(null); + } + } + + player.getMessenger().sendStatusUpdate(); + RoomDao.saveVisitors(this.room.getId(), this.room.getEntityManager().getPlayers().size()); + + } + + /** + * Get UUID counter. + * + * @return the counter + */ + public AtomicInteger getCounter() { + return counter; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/managers/RoomIdolManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/managers/RoomIdolManager.java new file mode 100644 index 0000000..25c3697 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/managers/RoomIdolManager.java @@ -0,0 +1,234 @@ +package org.alexdev.havana.game.room.managers; + +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.game.achievements.AchievementManager; +import org.alexdev.havana.game.achievements.AchievementType; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.item.interactors.InteractionType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.mapping.RoomTile; +import org.alexdev.havana.game.song.Song; +import org.alexdev.havana.messages.outgoing.rooms.items.JUDGE_GUI_STATUS; +import org.alexdev.havana.messages.outgoing.songs.START_PLAYING_SONG; +import org.alexdev.havana.messages.outgoing.songs.STOP_PLAYING_SONG; +import org.alexdev.havana.server.netty.NettyPlayerNetwork; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class RoomIdolManager { + private Room room; + private Player performer; + private List voted; + private Song song; + + public RoomIdolManager(Room room) { + this.room = room; + this.voted = new ArrayList<>(); + } + + public void resetChairs() { + for (Item voteChair : this.room.getItemManager().getItemsByDefinition(InteractionType.IDOL_VOTE_CHAIR)) { + if (voteChair.getCustomData().equals("0")) + continue; + + voteChair.setCustomData("0"); + voteChair.updateStatus(); + voteChair.save(); + } + } + + public void startPerformance(Song song) { + if (this.performer == null) + return; + + if (this.room.getItemManager().getIdolScoreboard() == null) + return; + + this.song = song; + + for (Item voteChair : this.room.getItemManager().getItemsByDefinition(InteractionType.IDOL_VOTE_CHAIR)) { + for (Entity entity : voteChair.getTile().getEntities()) { + if (entity.getType() != EntityType.PLAYER) + continue; + + Player player = (Player) entity; + player.send(new JUDGE_GUI_STATUS(2, this.performer.getDetails().getId())); + } + } + + // Send song to players + this.startListening(); + + // Wooooooooo + Item scoreboard = this.room.getItemManager().getIdolScoreboard(); + + scoreboard.setCustomData("0"); + scoreboard.updateStatus(); + scoreboard.save(); + } + + public void stopListening() { + if (this.song == null) + return; + + // Stop song to players + if (this.room.getItemManager().getSoundMachine() != null && this.room.getItemManager().getSoundMachine().hasBehaviour(ItemBehaviour.SOUND_MACHINE)) { + this.room.send(new STOP_PLAYING_SONG(song.getId())); + + this.room.getItemManager().getSoundMachine().setCustomData("0"); + this.room.getItemManager().getSoundMachine().updateStatus(); + } + + this.song = null; + } + + public void startListening() { + if (this.song == null) + return; + + // Stop song to players + if (this.room.getItemManager().getSoundMachine() != null && this.room.getItemManager().getSoundMachine().hasBehaviour(ItemBehaviour.SOUND_MACHINE)) { + this.room.send(new START_PLAYING_SONG(song.getId())); + + this.room.getItemManager().getSoundMachine().setCustomData("1"); + this.room.getItemManager().getSoundMachine().updateStatus(); + } + } + + /** + * Update the performer instance + */ + public void updatePerformer() { + this.performer = null; + + if (this.room.getItemManager().getIdolScoreboard() == null) { + return; + } + + Item scoreboard = this.room.getItemManager().getIdolScoreboard(); + + if (scoreboard.getTile() == null) + return; + + RoomTile roomTile = scoreboard.getTile(); + var entities = roomTile.getEntireEntities(); + + if (entities.stream().anyMatch(e -> e.getType() == EntityType.PLAYER)) { + var optional = entities.stream().filter(e -> e.getType() == EntityType.PLAYER).findFirst(); + optional.ifPresent(entity -> this.performer = (Player) entity); + } + + } + + /** + * Force stop when user steps off platform + */ + public void forceStop() { + for (Item voteChair : this.room.getItemManager().getItemsByDefinition(InteractionType.IDOL_VOTE_CHAIR)) { + for (Entity entity : voteChair.getTile().getEntireEntities()) { + if (entity.getType() != EntityType.PLAYER) + continue; + + Player player = (Player) entity; + player.send(new JUDGE_GUI_STATUS(1, -1)); + } + } + + Item item = this.room.getItemManager().getIdolScoreboard(); + + if (item != null) { + item.setCustomData("-1"); + item.updateStatus(); + item.save(); + } + + this.stopListening(); + this.voted.clear(); + } + + /** + * Perform voting + * @param type the positive/negative vote + * @param player the player who voted + */ + public void vote(boolean type, Player player) { + if (player.getRoomUser().getRoom() == null) { + return; + } + + Item chair = player.getRoomUser().getCurrentItem(); + + if (chair == null || chair.getDefinition().getInteractionType() != InteractionType.IDOL_VOTE_CHAIR) { + return; + } + + Item scoreboard = this.room.getItemManager().getIdolScoreboard(); + + if (scoreboard == null) { + return; + } + + Integer value = StringUtils.isNumeric(scoreboard.getCustomData()) ? Integer.parseInt(scoreboard.getCustomData()) : 0; + + if (type) { + chair.setCustomData("1"); + chair.updateStatus(); + + value++; + + scoreboard.setCustomData(String.valueOf(value)); + scoreboard.updateStatus(); + } + else { + chair.setCustomData("2"); + chair.updateStatus(); + + if (value > 0) { + value--; + } + + scoreboard.setCustomData(String.valueOf(value)); + scoreboard.updateStatus(); + } + + var voteChairs = this.room.getItemManager().getItemsByDefinition(InteractionType.IDOL_VOTE_CHAIR).stream().filter(item -> item.getCustomData().equals("0") && item.getTile().getEntireEntities().size() > 0).collect(Collectors.toList()); + + if (voteChairs.isEmpty()) { + this.forceStop(); + } + + if (this.performer != null) { + if (this.performer.getAchievementManager().getPossibleAchievements().stream().anyMatch(achievementInfo -> achievementInfo.getName().equals("ACH_AIPerformanceVote"))) { + String firstIp = NettyPlayerNetwork.getIpAddress(player.getNetwork().getChannel()); + String secondIp = NettyPlayerNetwork.getIpAddress(this.performer.getNetwork().getChannel()); + + if (firstIp != null && !(firstIp.equals(secondIp) || PlayerDao.getIpAddresses(player.getDetails().getId(), RoomTradeManager.TRADE_BAN_IP_HISTORY_LIMIT).contains(secondIp))) { + AchievementManager.getInstance().tryProgress(AchievementType.ACHIEVEMENT_AIPERFORMANCEVOTE, this.performer); + } + } + } + + this.voted.add(player); + } + + public List getVoted() { + return voted; + } + + /** + * Get the current performer. + * + * @return the performer + */ + public Player getPerformer() { + return performer; + } + +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/managers/RoomItemManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/managers/RoomItemManager.java new file mode 100644 index 0000000..3a999bc --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/managers/RoomItemManager.java @@ -0,0 +1,290 @@ +package org.alexdev.havana.game.room.managers; + +import org.alexdev.havana.dao.mysql.ItemDao; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.item.interactors.InteractionType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.mapping.RoomMapping; +import org.alexdev.havana.game.texts.TextsManager; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; +import org.alexdev.havana.messages.outgoing.rooms.items.CANNOT_PLACE_STUFF_FROM_STRIP; + +import java.util.ArrayList; +import java.util.List; + +public class RoomItemManager { + private Room room; + + private Item soundMachine; + private Item moodlight; + private Item idolScoreboard; + + public RoomItemManager(Room room) { + this.room = room; + } + + /** + * Silently reset item extra data states in a room. + * Will not function if the room is a battleball/snowstorm arena. + */ + public void resetItemStates() { + if (this.room.isGameArena() || this.room.getData().isCustomRoom()) { + return; + } + + List itemsToSave = new ArrayList<>(); + + for (Item item : this.room.getItems()) { + if (RoomMapping.resetExtraData(item, true)) { + itemsToSave.add(item); + } + } + + ItemDao.updateItems(itemsToSave); + } + + /** + * Get if the room has too many of a certain item. + * + * @param player the player placing the item + * @param item the item being placed + * @return true, if successful + */ + public boolean hasTooMany(Player player, Item item) { + if (this.room.getItemManager().getSoundMachine() != null && (item.hasBehaviour(ItemBehaviour.SOUND_MACHINE) || item.hasBehaviour(ItemBehaviour.JUKEBOX))) { + player.send(new CANNOT_PLACE_STUFF_FROM_STRIP(23)); + return true; + } + + if (this.room.getItemManager().getMoodlight() != null && (item.hasBehaviour(ItemBehaviour.ROOMDIMMER))) { + player.send(new ALERT(TextsManager.getInstance().getValue("roomdimmer_furni_limit"))); + return true; + } + + + if (this.room.getItemManager().getIdolScoreboard() != null && (item.getDefinition().getInteractionType() == InteractionType.IDOL_SCOREBOARD)) { + player.send(new ALERT("You can only place one American Idol scoreboard per room")); + return true; + } + + /*if (((this.room.getItemManager().getSoundMachine() == null) || !this.room.getItemManager().getSoundMachine().hasBehaviour(ItemBehaviour.SOUND_MACHINE) && item.getDefinition().getInteractionType() == InteractionType.IDOL_SCOREBOARD)) { + player.send(new ALERT("You must have a trax machine in your room before you place the American Idol hotspot")); + return true; + }*/ + + int postItSize = 25; + int rollerSize = 35; + int petNest = 3; + + if (player.getDetails().hasClubSubscription()) { + rollerSize = 60; + } + + if (this.getItemsByDefinition(ItemBehaviour.POST_IT).size() >= postItSize && (item.hasBehaviour(ItemBehaviour.POST_IT))) { + player.send(new CANNOT_PLACE_STUFF_FROM_STRIP(12)); + return true; + } + + if (this.getItemsByDefinition(ItemBehaviour.ROLLER).size() >= rollerSize && (item.hasBehaviour(ItemBehaviour.ROLLER))) { + player.send(new CANNOT_PLACE_STUFF_FROM_STRIP(22)); + return true; + } + + if (this.getItemsByDefinition(InteractionType.PET_NEST).size() >= petNest && (item.getDefinition().getInteractionType() == InteractionType.PET_NEST)) { + player.send(new CANNOT_PLACE_STUFF_FROM_STRIP(21)); + return true; + } + + return false; + } + + /** + * Get an item in the room by its item id. + * + * @param itemId the item id to retrieve the item instance. + * @return the new item + */ + public Item getById(int itemId) { + for (Item item : this.room.getItems()) { + if (item.getVirtualId() == itemId) { + return item; + } + } + + return null; + } + + /** + * Get an item in the room by its item id. + * + * @param itemId the item id to retrieve the item instance. + * @return the new item + */ + public Item getByDatabaseId(long itemId) { + for (Item item : this.room.getItems()) { + if (item.getDatabaseId() == itemId) { + return item; + } + } + + return null; + } + + /** + * Get the list of public items, used for rendering public room items. + * @return the list of public room items + */ + public List getPublicItems() { + List items = new ArrayList<>(); + + for (Item item : this.room.getItems()) { + if (item.hasBehaviour(ItemBehaviour.INVISIBLE)) { + continue; + } + + if (item.hasBehaviour(ItemBehaviour.PRIVATE_FURNITURE)) { + continue; + } + + if (!item.hasBehaviour(ItemBehaviour.PUBLIC_SPACE_OBJECT)) { + continue; + } + + items.add(item); + } + + return items; + } + + /** + * Get the list of floor items, used for rendering purchased floor items through the catalogue. + * @return the list of floor items + */ + public List getFloorItems() { + List items = new ArrayList<>(); + + for (Item item : this.room.getItems()) { + if (item.hasBehaviour(ItemBehaviour.PUBLIC_SPACE_OBJECT)) { + continue; + } + + if (item.hasBehaviour(ItemBehaviour.WALL_ITEM)) { + continue; + } + + items.add(item); + } + + return items; + } + + /** + * Get the list of wall items, used for rendering purchased wall items through the catalogue. + * @return the list of wall items + */ + public List getWallItems() { + List items = new ArrayList<>(); + + for (Item item : this.room.getItems()) { + if (item.hasBehaviour(ItemBehaviour.PUBLIC_SPACE_OBJECT)) { + continue; + } + + if (!item.hasBehaviour(ItemBehaviour.WALL_ITEM)) { + continue; + } + + items.add(item); + } + + return items; + } + + /** + * Get a list of items by item behaviour + * @return the items + */ + public List getItemsByDefinition(ItemBehaviour itemBehaviour) { + List items = new ArrayList<>(); + + for (Item item : this.room.getItems()) { + if (item.hasBehaviour(itemBehaviour)) { + items.add(item); + } + } + + return items; + } + + /** + * Get a list of items by interaction type + * @return the items + */ + public List getItemsByDefinition(InteractionType interactionType) { + List items = new ArrayList<>(); + + for (Item item : this.room.getItems()) { + if (item.getDefinition().getInteractionType() == interactionType) { + items.add(item); + } + } + + return items; + } + + /** + * Get the rooms' trax machine instance. + * + * @return the trax machine + */ + public Item getSoundMachine() { + return soundMachine; + } + + /** + * Set the rooms' trax instance. + * + * @param soundMachine the trax machine instance + */ + public void setSoundMachine(Item soundMachine) { + this.soundMachine = soundMachine; + } + + /** + * Get the rooms' moodlight instance. + * + * @return the moodlight + */ + public Item getMoodlight() { + return moodlight; + } + + /** + * Set the moodlight instance. + * + * @param moodlight the moodlight instance + */ + public void setMoodlight(Item moodlight) { + this.moodlight = moodlight; + } + + /** + * Get the idol scoreboard in the room + * + * @return the scoreboard + */ + public Item getIdolScoreboard() { + return idolScoreboard; + } + + /** + * Set the scoreboard. + * + * @param idolScoreboard the scoreboard to set + */ + public void setIdolScoreboard(Item idolScoreboard) { + this.idolScoreboard = idolScoreboard; + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/managers/RoomTaskManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/managers/RoomTaskManager.java new file mode 100644 index 0000000..91f9cce --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/managers/RoomTaskManager.java @@ -0,0 +1,136 @@ +package org.alexdev.havana.game.room.managers; + +import org.alexdev.havana.game.GameScheduler; +import org.alexdev.havana.game.games.Game; +import org.alexdev.havana.game.games.battleball.BattleBallGame; +import org.alexdev.havana.game.games.battleball.BattleBallTask; +import org.alexdev.havana.game.games.snowstorm.SnowStormGame; +import org.alexdev.havana.game.games.snowstorm.tasks.SnowStormGameTask; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.tasks.EntityTask; +import org.alexdev.havana.game.room.tasks.RollerTask; +import org.alexdev.havana.game.room.tasks.StatusTask; +import org.alexdev.havana.util.config.GameConfiguration; +import org.apache.commons.lang3.tuple.Pair; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; + +public class RoomTaskManager { + private Room room; + private ScheduledExecutorService executorService; + private Map, Runnable>> processTasks; + + public RoomTaskManager(Room room) { + this.room = room; + this.processTasks = new ConcurrentHashMap<>(); + } + + /** + * Start all needed room tasks, called when there's at least 1 player in the room. + */ + public void startTasks() { + this.executorService = GameScheduler.getInstance().getService(); + + if (this.room.isGameArena()) { + this.loadGameTasks(); + return; + } + + this.scheduleTask("EntityTask", new EntityTask(this.room), 0, 500, TimeUnit.MILLISECONDS); + this.scheduleTask("StatusTask", new StatusTask(this.room), 0, 1, TimeUnit.SECONDS); + + // Only allow roller tasks to be created for private rooms + if (!this.room.isPublicRoom()) { + int rollerMillisTask = GameConfiguration.getInstance().getInteger("roller.tick.default"); + this.scheduleTask("RollerTask", new RollerTask(this.room), 250, rollerMillisTask, TimeUnit.MILLISECONDS); + } + } + + private void loadGameTasks() { + Game game = this.room.getData().getGame(); + + if (game == null) { + return; + } + + if (game instanceof BattleBallGame) { + BattleBallGame battleballGame = (BattleBallGame) game; + this.scheduleTask("GameTask", new BattleBallTask(this.room, battleballGame), 0, 500, TimeUnit.MILLISECONDS); + } + + if (game instanceof SnowStormGame) { + SnowStormGame snowStormGame = (SnowStormGame) game; + this.scheduleTask("UpdateTask", new SnowStormGameTask(this.room, snowStormGame), 0, 300, TimeUnit.MILLISECONDS); + } + } + + /** + * Stop tasks, called when there's no players in the room. + */ + public void stopTasks() { + for (var tasksKvp : this.processTasks.entrySet()) { + tasksKvp.getValue().getLeft().cancel(false); + } + + this.processTasks.clear(); + } + + /** + * Schedule a custom task with a delay. + * + * @param taskName the task name identifier + * @param runnableTask the runnable task instance + * @param interval the interval of the task + * @param delay the time to wait before the task starts + * @param timeUnit the time unit of the interval + */ + public void scheduleTask(String taskName, Runnable runnableTask, long delay, long interval, TimeUnit timeUnit) { + this.cancelTask(taskName); + + var future = this.executorService.scheduleAtFixedRate(runnableTask, delay, interval, timeUnit); + this.processTasks.put(taskName, Pair.of( + future, + runnableTask + )); + } + + /** + * Cancels a custom task by task name. + * + * @param taskName the name of the task to cancel + */ + public void cancelTask(String taskName) { + if (this.processTasks.containsKey(taskName)) { + this.processTasks.get(taskName).getLeft().cancel(false); + this.processTasks.remove(taskName); + } + } + + /** + * Gets the task by the task name + * + * @param taskName the task name to locate task + * @return the task instance + */ + public Runnable getTask(String taskName) { + if (this.processTasks.containsKey(taskName)) { + return this.processTasks.get(taskName).getValue(); + } + + return null; + } + + /** + * Get if the task is registered. + * + * @param taskName the task name to check for + * @return true, if successful + */ + public boolean hasTask(String taskName) { + return this.processTasks.containsKey(taskName); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/managers/RoomTimerManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/managers/RoomTimerManager.java new file mode 100644 index 0000000..89f799c --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/managers/RoomTimerManager.java @@ -0,0 +1,120 @@ +package org.alexdev.havana.game.room.managers; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.room.entities.RoomEntity; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.config.GameConfiguration; + +public class RoomTimerManager { + private Entity entity; + private RoomEntity roomEntity; + private int lookTimer; + private long afkTimer; + private long sleepTimer; + private long chatBubbleTimer; + + public RoomTimerManager(RoomEntity roomEntity) { + this.roomEntity = roomEntity; + this.entity = roomEntity.getEntity(); + } + + /** + * Reset all timers, used for first entry into room. + */ + public void resetTimers() { + this.resetRoomTimer(); + this.stopChatBubbleTimer(); + this.stopLookTimer(); + } + + /** + * Set the room timer, make it 10 minutes by default + */ + public void resetRoomTimer() { + this.resetRoomTimer(GameConfiguration.getInstance().getInteger("afk.timer.seconds")); + } + + /** + * Set the room timer, but with an option to override it. + * + * @param afkTimer the timer to override + */ + public void resetRoomTimer(long afkTimer) { + /*if (this.entity.getRoomUser().getRoom() != null) { + Room room = this.entity.getRoomUser().getRoom(); + + if (room.getData().getAccessTypeId() > 0 && idleResetReason == IdleResetReason.ALL) { + return; + } + }*/ + + this.afkTimer = DateUtil.getCurrentTimeSeconds() + afkTimer; + this.sleepTimer = DateUtil.getCurrentTimeSeconds() + GameConfiguration.getInstance().getInteger("sleep.timer.seconds"); + + // If the user was sleeping, remove the sleep and tell the room cycle to update our character + if (this.roomEntity.isSleeping()) { + this.roomEntity.sleep(false); + } + } + + /** + * Begin head look timer. + */ + public void beginLookTimer() { + this.beginLookTimer(6); + } + + /** + * Begin head look timer with custom time + * + * @param time the time in seconds before the head rotates + */ + public void beginLookTimer(int time) { + this.lookTimer = DateUtil.getCurrentTimeSeconds() + time; + } + + /** + * Stop head look timer. + */ + public void stopLookTimer() { + this.lookTimer = -1; + } + + /** + * Begin talk time out. + */ + public void beginChatBubbleTimer() { + int timeout = GameConfiguration.getInstance().getInteger("talk.bubble.timeout.seconds"); + + if (timeout > 0) { + this.chatBubbleTimer = DateUtil.getCurrentTimeSeconds() + timeout; + } + } + + /** + * Stop talk time out. + */ + public void stopChatBubbleTimer() { + this.chatBubbleTimer = -1; + } + + public Entity getEntity() { + return entity; + } + + public long getChatBubbleTimer() { + return chatBubbleTimer; + } + + public int getLookTimer() { + return lookTimer; + } + + public long getAfkTimer() { + return afkTimer; + } + + public long getSleepTimer() { + return sleepTimer; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/managers/RoomTradeManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/managers/RoomTradeManager.java new file mode 100644 index 0000000..8c88a1a --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/managers/RoomTradeManager.java @@ -0,0 +1,174 @@ +package org.alexdev.havana.game.room.managers; + +import org.alexdev.havana.dao.mysql.ItemDao; +import org.alexdev.havana.dao.mysql.TransactionDao; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.entities.RoomPlayer; +import org.alexdev.havana.game.room.enums.StatusType; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; +import org.alexdev.havana.messages.outgoing.trade.TRADE_CLOSE; +import org.alexdev.havana.messages.outgoing.trade.TRADE_ITEMS; +import org.alexdev.havana.server.netty.NettyPlayerNetwork; +import org.alexdev.havana.util.DateUtil; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; + +public class RoomTradeManager { + public static final int TRADE_BAN_IP_HISTORY_LIMIT = 20; + + /** + * Close trade window, called when user leaves room, or closes + * the trade window. Will close the partners trade window too. + * + * @param roomEntity the room user to close the trade window for + */ + public static void close(RoomPlayer roomEntity, boolean serverClosed) { + Player player = (Player) roomEntity.getEntity(); + + if (roomEntity.getTradePartner() != null) { + player.send(new TRADE_CLOSE(serverClosed ? player.getDetails().getId() : player.getDetails().getId())); + player.getInventory().getView("new"); + + roomEntity.getTradePartner().send(new TRADE_CLOSE(serverClosed ? player.getRoomUser().getTradePartner().getDetails().getId() : player.getDetails().getId())); + roomEntity.getTradePartner().getInventory().getView("new"); + + reset(roomEntity.getTradePartner().getRoomUser()); + } + + reset(roomEntity); + } + + /** + * Finishes trade window with user. + * + * @param roomEntity the room user to close the trade window for + */ + public static void finish(RoomPlayer roomEntity) { + Player player1 = (Player) roomEntity.getEntity(); + Player player2 = null; + + if (roomEntity.getTradePartner() != null) { + player2 = roomEntity.getTradePartner(); + reset(player2.getRoomUser()); + } + + reset(roomEntity); + + if (player1 != null) { + player1.getInventory().getView("new"); + } + + if (player2 != null) { + player2.getInventory().getView("new"); + } + } + + /** + * Resets all trade variables. + * + * @param roomEntity the room user to reset the trade variables for + */ + private static void reset(RoomPlayer roomEntity) { + ItemDao.updateTradeStates(roomEntity.getTradeItems(), false); + + roomEntity.getTradeItems().clear(); + roomEntity.setTradeConfirmed(false); + roomEntity.setTradeAccept(false); + roomEntity.setTradePartner(null); + roomEntity.setCanConfirmTrade(false); + + roomEntity.removeStatus(StatusType.TRADE); + roomEntity.setNeedsUpdate(true); + } + + /** + * Refresh the trade window, called when a user agrees/unagrees or adds + * an item to the trade window. Will be ignored if they have no trade + * partner. + * + * @param player the player to refresh the trade window for + */ + public static void refreshWindow(Player player) { + if (player.getRoomUser().getTradePartner() == null) { + return; + } + + Player tradePartner = player.getRoomUser().getTradePartner(); + + player.send(new TRADE_ITEMS( + player, + new ArrayList<>(player.getRoomUser().getTradeItems()), + tradePartner, + new ArrayList<>(tradePartner.getRoomUser().getTradeItems()) + )); + } + + /** + * Adds an item from the trade partners offered items into the first parameter + * players' inventory. + * + * @param player the player to add the items into + * @param tradePartner the player to get the items offered from + */ + public static void addItems(Player player, Player tradePartner) { + List itemsToUpdate = new ArrayList<>(); + + for (Item item : tradePartner.getRoomUser().getTradeItems()) { + tradePartner.getInventory().getItems().remove(item); + player.getInventory().addItem(item); + + try { + TransactionDao.createTransaction(player.getDetails().getId(), + String.valueOf(item.getDatabaseId()), String.valueOf(item.getDefinition().getId()), 1, + "Traded " + item.getDefinition().getName() + " from " + tradePartner.getDetails().getName(), + 0, tradePartner.getDetails().getId(), false); + + TransactionDao.createTransaction(tradePartner.getDetails().getId(), + String.valueOf(item.getDatabaseId()), String.valueOf(item.getDefinition().getId()), 1, + "Traded " + item.getDefinition().getName() + " to " + player.getDetails().getName(), + 0, player.getDetails().getId(), false); + } catch (Exception ex) { + + } + + item.setOwnerId(player.getDetails().getId()); + item.setRoomId(0); + + itemsToUpdate.add(item); + } + + ItemDao.updateItemOwnership(itemsToUpdate); + } + + /** + * Do trade ban. + * + * @param tradeBanned the person that is trade banned. + */ + public static void addTradeBan(Player tradeBanned) { + tradeBanned.send(new ALERT("You have been trade banned for 7 days for suspicious activity. Do not give credits to other users.
Read for more info: https://classichabbo.com/articles/22-trade-banned")); + tradeBanned.getDetails().setTradeBanExpiration(DateUtil.getCurrentTimeSeconds() + TimeUnit.DAYS.toSeconds(7)); + ItemDao.saveTradeBanExpire(tradeBanned.getDetails().getId(), tradeBanned.getDetails().getTradeBanExpiration()); + } + + /** + * Shows the trade ban alert to player. + * + * @param player the player + */ + public static String showTradeBanAlert(Player player) { + long uptime = (player.getDetails().getTradeBanExpiration() - DateUtil.getCurrentTimeSeconds()) * 1000; + long days = (uptime / (1000 * 60 * 60 * 24)); + long hours = (uptime - days * (1000 * 60 * 60 * 24)) / (1000 * 60 * 60); + /*long minutes = (uptime - days * (1000 * 60 * 60 * 24) - hours * (1000 * 60 * 60)) / (1000 * 60); + long seconds = (uptime - days * (1000 * 60 * 60 * 24) - hours * (1000 * 60 * 60) - minutes * (1000 * 60)) / (1000);*/ + + return "You are temporarily banned from trading.
The ban will expire in " + days + " day(s) and " + hours + " hours(s)"; + + //player.send(new ALERT("You are temporarily banned from trading.
The ban will expire in " + days + " day(s) and " + hours + " hours(s)")); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/managers/VoteData.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/managers/VoteData.java new file mode 100644 index 0000000..def9cec --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/managers/VoteData.java @@ -0,0 +1,35 @@ +package org.alexdev.havana.game.room.managers; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class VoteData { + private final int userId; + private final int vote; + private final List ipAddresses; + private final String machineId; + + public VoteData(int userId, int vote, String ipAddresses, String machineId) { + this.userId = userId; + this.vote = vote; + this.ipAddresses = ipAddresses.split(",").length == 0 ? new ArrayList<>() : Arrays.asList(ipAddresses.split(",")); + this.machineId = machineId; + } + + public int getUserId() { + return userId; + } + + public int getVote() { + return vote; + } + + public List getIpAddresses() { + return ipAddresses; + } + + public String getMachineId() { + return machineId; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/mapping/RoomMapping.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/mapping/RoomMapping.java new file mode 100644 index 0000000..419b1d0 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/mapping/RoomMapping.java @@ -0,0 +1,617 @@ +package org.alexdev.havana.game.room.mapping; + +import org.alexdev.havana.dao.mysql.ItemDao; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.item.interactors.InteractionType; +import org.alexdev.havana.game.item.interactors.enums.TotemColour; +import org.alexdev.havana.game.item.interactors.types.FortuneInteractor; +import org.alexdev.havana.game.item.interactors.types.TeleportInteractor; +import org.alexdev.havana.game.item.interactors.types.TotemHeadTrigger; +import org.alexdev.havana.game.pathfinder.AffectedTile; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.handlers.PoolHandler; +import org.alexdev.havana.game.room.models.RoomModel; +import org.alexdev.havana.log.Log; +import org.alexdev.havana.messages.outgoing.rooms.HEIGHTMAP_UPDATE; +import org.alexdev.havana.messages.outgoing.rooms.items.*; +import org.alexdev.havana.util.config.GameConfiguration; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +public class RoomMapping { + private Room room; + private RoomModel roomModel; + private RoomTile[][] roomMap; + private List tileList; + + public RoomMapping(Room room) { + this.room = room; + } + + /** + * Regenerate the entire collision map used for + * furniture and entity detection + */ + public void regenerateCollisionMap() { + this.tileList = new CopyOnWriteArrayList<>(); + this.roomModel = this.room.getModel(); + this.roomMap = new RoomTile[this.roomModel.getMapSizeX()][this.roomModel.getMapSizeY()]; + + for (int x = 0; x < this.roomModel.getMapSizeX(); x++) { + for (int y = 0; y < this.roomModel.getMapSizeY(); y++) { + var roomTile = new RoomTile(this.room, new Position(x, y), this.roomModel.getTileHeight(x, y)); + this.roomMap[x][y] = roomTile; + this.tileList.add(roomTile); + } + } + + try { + this.room.getItemManager().setSoundMachine(null); + this.room.getItemManager().setMoodlight(null); + this.room.getItemManager().setIdolScoreboard(null); + + if (!this.room.isGameArena()) { + List items = new ArrayList<>(this.room.getItems()); + items.sort(Comparator.comparingDouble((Item item) -> item.getPosition().getZ())); + + for (Item item : items) { + if (item.hasBehaviour(ItemBehaviour.WALL_ITEM)) { + continue; + } + + RoomTile tile = item.getTile(); + + if (tile == null) { + continue; + } + + for (Position position : AffectedTile.getAffectedTiles(item)) { + RoomTile affectedTile = this.getTile(position); + + if (affectedTile == null) { + continue; + } + + affectedTile.addItem(item); + + if (item.hasBehaviour(ItemBehaviour.PUBLIC_SPACE_OBJECT)) { + PoolHandler.setupRedirections(this.room, item); + } + } + } + } + + } catch (Exception ex) { + Log.getErrorLogger().error(String.format("Generate collision map failed for room %s", this.room.getId()), ex); + } + + try { + for (Entity entity : this.room.getEntities()) { + RoomTile tile = entity.getRoomUser().getTile(); + + if (tile == null) { + continue; + } + + tile.addEntity(entity); + } + + } catch (Exception ex) { + Log.getErrorLogger().error(String.format("Generate entity map failed for room %s", this.room.getId()), ex); + } + + refreshRoomItems(); + } + + public void refreshRoomItems() { + this.room.getItemManager().setSoundMachine(null); + this.room.getItemManager().setIdolScoreboard(null); + this.room.getItemManager().setMoodlight(null); + + for (Item item : room.getItemManager().getFloorItems()) { + if (item.hasBehaviour(ItemBehaviour.WALL_ITEM)) { + continue; + } + + RoomTile tile = item.getTile(); + + if (tile == null) { + continue; + } + + // Method to set only one jukebox per room + if (this.room.getItemManager().getSoundMachine() == null) { + if (item.hasBehaviour(ItemBehaviour.JUKEBOX) || item.hasBehaviour(ItemBehaviour.SOUND_MACHINE)) { + this.room.getItemManager().setSoundMachine(item); + } + } + + if (this.room.getItemManager().getIdolScoreboard() == null) { + if (item.getDefinition().getInteractionType() == InteractionType.IDOL_SCOREBOARD) { + this.room.getItemManager().setIdolScoreboard(item); + } + } + } + + // Method to set only one moodlight per room + for (Item item : this.room.getItemManager().getWallItems()) { + if (item.hasBehaviour(ItemBehaviour.ROOMDIMMER)) { + this.room.getItemManager().setMoodlight(item); + break; + } + } + } + + /** + * Try and send heightmap + */ + public void sendMap() { + try { + this.room.send(new HEIGHTMAP_UPDATE(this.room, this.roomModel)); + } catch (Exception ex) { + Log.getErrorLogger().error(String.format("Send heightmap failed for room %s", this.room.getId()), ex); + } + } + + /** + * Add a specific item to the room map + * + * @param item the item to add + */ + public void addItem(Player player, Item item) { + item.setRoomId(this.room.getId()); + item.setOwnerId(this.room.getData().getOwnerId()); + item.setRollingData(null); + item.setOrderId(-1); + item.setLastPlacedTime(System.currentTimeMillis()); + + resetExtraData(item, false); + this.room.getItems().add(item); + + if (item.hasBehaviour(ItemBehaviour.TELEPORTER)) { + item.setCustomData(TeleportInteractor.TELEPORTER_CLOSE); + } + + if (item.hasBehaviour(ItemBehaviour.WALL_ITEM)) { + this.room.send(new PLACE_WALLITEM(item)); + + if (item.hasBehaviour(ItemBehaviour.ROOMDIMMER)) { + this.room.getItemManager().setMoodlight(item); + } + } else { + this.handleItemAdjustment(item, false); + + for (Position position : AffectedTile.getAffectedTiles(item)) { + RoomTile affectedTile = this.getTile(position); + + if (affectedTile == null) { + continue; + } + + affectedTile.addItem(item); + } + + this.sendMap(); + this.room.send(new PLACE_FLOORITEM(item)); + } + + item.updateEntities(null); + item.save(); + + ItemDao.updateItemOwnership(item); + + if (!item.getDefinition().hasBehaviour(ItemBehaviour.WALL_ITEM)) { + item.getDefinition().getInteractionType().getTrigger().onItemPlaced(player, this.room, item); + } + + refreshRoomItems(); + } + + /** + * Move an item, will regenerate the map if the item is a floor item. + * + * @param item the item that is moving + */ + public void moveItem(Player player, Item item, Position newPosition, Position oldPosition) { + boolean isRotation = false; + + Item itemBelow = item.getItemBelow(); + Item itemAbove = item.getItemAbove(); + + if (item.getPosition().equals(new Position(newPosition.getX(), newPosition.getY())) && item.getPosition().getRotation() != newPosition.getRotation()) { + isRotation = true; + } + + for (Position position : AffectedTile.getAffectedTiles(item)) { + RoomTile affectedTile = this.getTile(position); + + if (affectedTile == null) { + continue; + } + + affectedTile.removeItem(item); + } + + item.getPosition().setX(newPosition.getX()); + item.getPosition().setY(newPosition.getY()); + item.getPosition().setRotation(newPosition.getRotation()); + item.setRoomId(this.room.getId()); + item.setRollingData(null); + item.setLastPlacedTime(System.currentTimeMillis()); + resetExtraData(item, false); + + if (!item.hasBehaviour(ItemBehaviour.WALL_ITEM)) { + this.handleItemAdjustment(item, isRotation); + + for (Position position : AffectedTile.getAffectedTiles(item)) { + RoomTile affectedTile = this.getTile(position); + + if (affectedTile == null) { + continue; + } + + affectedTile.addItem(item); + } + + this.sendMap(); + this.room.send(new MOVE_FLOORITEM(item)); + } + + if (!isRotation) { + // Reset people teleporting + if (item.hasBehaviour(ItemBehaviour.TELEPORTER)) { + for (Entity entity : item.getRoom().getEntities()) { + if (entity.getType() == EntityType.PLAYER) { + + Player p = (Player) entity; + + if (p.getRoomUser().getPosition().equals(oldPosition) || + p.getRoomUser().getAuthenticateTelporterId() == item.getVirtualId()) { + p.getRoomUser().setAuthenticateTelporterId(-1); + p.getRoomUser().setWalkingAllowed(true); + } + } + } + } + } + + item.updateEntities(oldPosition); + item.save(); + + item.getDefinition().getInteractionType().getTrigger().onItemMoved(player, this.room, item, isRotation, oldPosition, itemBelow, itemAbove); + refreshRoomItems(); + } + + /** + * Remove an item from the room. + * + * @param item the item that is being removed + */ + public void removeItem(Player player, Item item) { + item.getDefinition().getInteractionType().getTrigger().onItemPickup(player, this.room, item); + this.room.getItems().remove(item); + + if (item.hasBehaviour(ItemBehaviour.WALL_ITEM)) { + this.room.send(new REMOVE_WALLITEM(item)); + } else { + for (Position position : AffectedTile.getAffectedTiles(item)) { + RoomTile affectedTile = this.getTile(position); + + if (affectedTile == null) { + continue; + } + + affectedTile.removeItem(item); + } + + this.sendMap(); + this.room.send(new REMOVE_FLOORITEM(item)); + } + + if (item.hasBehaviour(ItemBehaviour.ROOMDIMMER)) { + if (item.getCustomData().isEmpty()) { + item.setCustomData(Item.DEFAULT_ROOMDIMMER_CUSTOM_DATA); + } + + if (item.getCustomData().charAt(0) == '2') { // Roomdimmer is enabled, turn it off. + item.setCustomData("1" + item.getCustomData().substring(1)); + } + + this.room.getItemManager().setMoodlight(null); + } + + if (item.getDefinition().getSprite().equals("totem_head")) { + TotemColour headColour = TotemHeadTrigger.getHeadColour(item); + + if (headColour != TotemColour.NONE || item.getCustomData().equals("11")) { // "11" for the bird with the open wings + int state = TotemHeadTrigger.convertHeadToColour(item, TotemColour.NONE); + + if (state == 11) { + state = 2; + } + + item.setCustomData(String.valueOf(state)); + } + } + + resetExtraData(item, false); + item.updateEntities(null); + + item.getPosition().setX(0); + item.getPosition().setY(0); + item.getPosition().setZ(0); + item.getPosition().setRotation(0); + item.setRoomId(0); + item.setRollingData(null); + item.save(); + + refreshRoomItems(); + } + + /** + * Reset item extra data when moving or picking up item. + * + * @param item the item to reset + */ + public static boolean resetExtraData(Item item, boolean roomLoad) { + if (item.hasBehaviour(ItemBehaviour.DICE)) { + item.setRequiresUpdate(false); + + // For some reason the client expects the HC dice to have a default of 1 while the normal dice a default of 0 (off) + // Client expects default of 1 for HC dices + /*switch (item.getDefinition().getSprite()) { + case "edicehc": + if (roomLoad) { + if (!item.getCustomData().equals("0")) { + item.setCustomData("0"); + return true; + } + } else { + if (!item.getCustomData().equals("1")) { + item.setCustomData("1"); + return true; + } + } + break; + case "edice": + // Client expects default of 0 (off) for 'normal'/'oldskool' dices + if (!item.getCustomData().equals("0")) { + item.setCustomData("0"); + return true; + } + break; + default: + // Handle custom furniture dices (TODO: define behaviour differences between HC dice and 'oldskool' dices) + if (!item.getCustomData().equals("1")) { + item.setCustomData("1"); + return true; + } + break; + }*/ + } + + if (!item.getDefinition().hasBehaviour(ItemBehaviour.WALL_ITEM)) { + int currentRotation = item.getPosition().getRotation(); + + if (item.getDefinition().getAllowedRotations().size() > 0) { + if (!item.getDefinition().getAllowedRotations().contains(currentRotation)) { + item.getPosition().setRotation(item.getDefinition().getAllowedRotations().get(0)); + return true; + } + } + } + + if (item.getDefinition().getInteractionType() == InteractionType.LERT) { + if (!item.getCustomData().equals("0")) { + item.setCustomData("0"); + return true; + } + } + + if (item.getDefinition().getInteractionType() == InteractionType.IDOL_VOTE_CHAIR) { + if (!item.getCustomData().equals("0")) { + item.setCustomData("0"); + return true; + } + } + + if (item.getDefinition().getInteractionType() == InteractionType.IDOL_SCOREBOARD) { + if (!item.getCustomData().equals("-1")) { + item.setCustomData("-1"); + return true; + } + } + + if (item.hasBehaviour(ItemBehaviour.ONE_WAY_GATE)) { + if (!item.getCustomData().equals("0")) { + item.setCustomData("0"); + return true; + } + } + + if (item.getDefinition().getInteractionType() == InteractionType.FORTUNE) { + if (!item.getCustomData().equals(String.valueOf(FortuneInteractor.FORTUNE_OFF))) { + item.setCustomData(String.valueOf(FortuneInteractor.FORTUNE_OFF)); + return true; + } + + item.setRequiresUpdate(false); + } + + if (item.getDefinition().getInteractionType() == InteractionType.VENDING_MACHINE) { + if (!item.getCustomData().equals("0")) { + item.setCustomData("0"); + return true; + } + + item.setRequiresUpdate(false); + } + + if (item.getDefinition().getInteractionType() == InteractionType.LOVE_RANDOMIZER) { + if (!item.getCustomData().equals("0")) { + item.setCustomData("0"); + return true; + } + + item.setRequiresUpdate(false); + } + + if (item.hasBehaviour(ItemBehaviour.TELEPORTER)) { + if (!item.getCustomData().equals(TeleportInteractor.TELEPORTER_CLOSE)) { + item.setCustomData(TeleportInteractor.TELEPORTER_CLOSE); + return true; + } + + } + + if (item.isCurrentRollBlocked()) { + item.setCurrentRollBlocked(false); + } + + return false; + } + + /** + * Handle item adjustment. + * + * @param item the item + * @param isRotation the rotation only + */ + private void handleItemAdjustment(Item item, boolean isRotation) { + RoomTile tile = this.getTile(item.getPosition()); + + if (tile == null) { + return; + } + + if (!isRotation) { + Item highestItem = tile.getHighestItem(); + double tileHeight = tile.getTileHeight(); + + if (highestItem != null && highestItem.getDatabaseId() == item.getDatabaseId()) { + tileHeight -= highestItem.getTotalHeight(); + + double defaultHeight = this.room.getModel().getTileHeight(item.getPosition().getX(), item.getPosition().getY()); + + if (tileHeight < defaultHeight) { + tileHeight = defaultHeight; + } + } + + item.getPosition().setZ(tileHeight); + + if (highestItem != null && highestItem.getRollingData() != null) { + Item roller = highestItem.getRollingData().getRoller(); + + if (highestItem.getItemBelow() != null && highestItem.getItemBelow().hasBehaviour(ItemBehaviour.ROLLER)) { + // If the difference between the roller, and the next item up is more than 0.5, then set the item below the floating item + if (Math.abs(highestItem.getPosition().getZ() - roller.getPosition().getZ()) >= 0.5) { + item.getPosition().setZ(roller.getPosition().getZ() + roller.getDefinition().getPositiveTopHeight()); + } + } + + item.getPosition().setZ(roller.getPosition().getZ() + roller.getDefinition().getPositiveTopHeight()); + + /*if (!highestItem.hasBehaviour(ItemBehaviour.CAN_STACK_ON_TOP)) { + item.getPosition().setZ(roller.getPosition().getZ() + roller.getDefinition().getTopHeight()); + + /*for (Item tileItem : tile.getItems()) { + if (tileItem.getPosition().getZ() >= item.getPosition().getZ()) { + tileItem.getRollingData().setHeightUpdate(item.getDefinition().getTopHeight()); + } + } + }*/ + } + }/* else { + Item nextItem = item.getItemAbove(); + + while (nextItem != null) { + if (nextItem.getPosition().getRotation() != item.getPosition().getRotation()) { + nextItem.getPosition().setRotation(item.getPosition().getRotation()); + nextItem.save(); + + item.getRoom().send(new MOVE_FLOORITEM(nextItem)); + } else { + break; + } + + nextItem = nextItem.getItemAbove(); + } + }*/ + + if (item.getPosition().getZ() > GameConfiguration.getInstance().getInteger("stack.height.limit")) { + item.getPosition().setZ(GameConfiguration.getInstance().getInteger("stack.height.limit")); + } + } + + /** + * Get the tile by {@link Position} instance + * + * @param position the position class to find tile + * @return the tile, found, else null + */ + public RoomTile getTile(Position position) { + return getTile(position.getX(), position.getY()); + } + + /** + * Get the tile by specified coordinates. + * + * @param x the x coordinate + * @param y the y coordinate + * @return the tile, found, else null + */ + public RoomTile getTile(int x, int y) { + if (x < 0 || y < 0) { + return null; + } + + if (this.roomModel == null) { + return null; + } + + if (x >= this.room.getModel().getMapSizeX() || y >= this.room.getModel().getMapSizeY()) { + return null; + } + + if (x >= this.roomModel.getMapSizeX() || y >= this.roomModel.getMapSizeY()) { + return null; + } + + if (this.roomModel.getTileState(x, y) == RoomTileState.CLOSED) { + return null; + } + + return this.roomMap[x][y]; + } + + public Position getRandomWalkableBound(Entity entity) { + Position position = null; + + boolean isWalkable = false; + int attempts = 0; + int maxAttempts = 10; + + while (attempts < maxAttempts) { + attempts++; + + int randomX = this.room.getModel().getRandomBound(0); + int randomY = this.room.getModel().getRandomBound(1); + position = new Position(randomX, randomY); + + if (RoomTile.isValidTile(this.room, entity, position)) { + return position; + } + } + + return null; + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/mapping/RoomTile.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/mapping/RoomTile.java new file mode 100644 index 0000000..a99e1b7 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/mapping/RoomTile.java @@ -0,0 +1,493 @@ +package org.alexdev.havana.game.room.mapping; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.infobus.InfobusManager; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.item.interactors.InteractionType; +import org.alexdev.havana.game.pathfinder.Pathfinder; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.pets.Pet; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.enums.StatusType; +import org.alexdev.havana.game.room.handlers.walkways.WalkwaysEntrance; +import org.alexdev.havana.game.room.handlers.walkways.WalkwaysManager; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArrayList; + +public class RoomTile { + private static List ignorePoolTiles = new ArrayList<>() {{ + add(new Position(20, 28)); + add(new Position(19, 28)); + add(new Position(17, 21)); + add(new Position(17, 20)); + add(new Position(31, 10)); + add(new Position(31, 9)); + add(new Position(19, 19)); + add(new Position(18, 19)); + add(new Position(11, 11)); + add(new Position(10, 11)); + add(new Position(21, 28)); + add(new Position(22, 28)); + add(new Position(16, 22)); + add(new Position(16, 23)); + add(new Position(30, 11)); + add(new Position(30, 12)); + add(new Position(12, 11)); + add(new Position(13, 12)); + }}; + + private Room room; + private Position position; + private CopyOnWriteArrayList entities; + private CopyOnWriteArrayList nonBlockingEntities; + private ConcurrentHashMap items; + + private double tileHeight; + private double defaultHeight; + + private Item highestItem; + private boolean chairTile; + + public RoomTile(Room room, Position position, double tileHeight) { + this.room = room; + this.position = position; + this.tileHeight = tileHeight; + this.defaultHeight = tileHeight; + this.entities = new CopyOnWriteArrayList<>(); + this.nonBlockingEntities = new CopyOnWriteArrayList<>(); + this.items = new ConcurrentHashMap<>(); + } + + /** + * Gets if the tile was valid. + * + * @param entity the entity checking + * @param position the position of the tile + * @return true, if successful + */ + public static boolean isValidTile(Room room, Entity entity, Position position) { + if (room == null ) { + return false; + } + + RoomTile tile = room.getMapping().getTile(position); + + if (tile == null) { + return false; + } + + if (entity != null) { + if (room.getModel().getName().equals("park_a")) { + if (!InfobusManager.getInstance().isDoorOpen()) { + if (position.equals(new Position(InfobusManager.getInstance().getDoorX(), InfobusManager.getInstance().getDoorY()))) { + return false; + } + } + } + + if (tile.getHighestItem() != null) { + Item item = tile.getHighestItem(); + + if (item.getDefinition().getSprite().equals("poolExit") && item.getPosition().equals(new Position(19, 19))) { + return entity.getRoomUser().containsStatus(StatusType.SWIM); + } + + // Allow pets to walk to their own pet bed. + if (entity.getType() == EntityType.PET) { + Pet pet = (Pet) entity; + + if (pet.getDetails().getItemId() == item.getDatabaseId()) { + return true; + } + } + } + } + + if (tile.getEntities().size() > 0) { // Allow walk if you exist already in the tile + if (tile.getHighestItem() != null && tile.getHighestItem().hasBehaviour(ItemBehaviour.TELEPORTER)) { + return true; + } + + /*if (room.isGameArena()) { + return true; + } else { + return entity == null || tile.containsEntity(entity); + }*/ + return entity == null || tile.containsEntity(entity); + } + + + if (!tile.hasWalkableFurni(entity)) { + if (entity != null) { + return tile.getHighestItem() != null && tile.getHighestItem().getPosition().equals(entity.getRoomUser().getPosition()); + } + + return false; + } + + return true; + } + + /** + * Gets if the tile was valid, but if there's chairs in the way it will not be valid. + * + * @param entity the entity checking + * @param position the position of the tile + * @return true, if successful + */ + public static boolean isValidDiagonalTile(Room room, Entity entity, Position position) { + if (room == null) { + return false; + } + + RoomTile tile = room.getMapping().getTile(position); + + if (tile == null) { + return false; + } + + if (tile.getEntities().size() > 0) { // Allow walk if you exist already in the tile + return entity == null || tile.containsEntity(entity); + } + + if (tile.getHighestItem() != null) { + if (tile.getHighestItem().hasBehaviour(ItemBehaviour.CAN_SIT_ON_TOP)) { + return false; + } + + if (!tile.getHighestItem().isWalkable(entity, position)) { + return false; + } + } + + return true; + } + + /** + * Get if the highest item has walkable furni, true if no furni is on the tile. + * + * @return true, if successful. + */ + public boolean hasWalkableFurni(Entity entity) { + if (this.highestItem != null) { + return this.highestItem.isWalkable(entity, this.position); + } + + return true; + } + + /** + * Get the next avaliable tile around this tile. + * + * @param entity the entity to check for, can be null + * @return a valid position, else null + */ + public Position getNextAvailablePosition(Entity entity) { + List positions = new ArrayList<>(); + + for (Position POINT : Pathfinder.DIAGONAL_MOVE_POINTS) { + Position tmp = this.position.copy().add(POINT); + + if (RoomTile.isValidTile(this.room, entity, tmp)) { + positions.add(tmp); + } + } + + positions.sort(Position::getDistanceSquared); + return (positions.size() > 0 ? positions.get(0) : null); + } + + /** + * Sets the entity. + * + * @param entity the new entity + */ + public void addEntity(Entity entity) { + // Don't add a user to the tile in a doorway. + var currentPosition = new Position(this.position.getX(), this.position.getY()); + + if (currentPosition.equals(this.room.getModel().getDoorLocation())) { + return; + } + + // If the position is a destination in a walkway, don't add a user to the tile. + if (this.room.isPublicRoom()) { + WalkwaysEntrance destination = WalkwaysManager.getInstance().getDestination(this.room, this.position); + + if (destination != null) { + return; + } + + if (this.room.getModel().getName().equals("pool_a") || + this.room.getModel().getName().equals("pool_b") || + this.room.getModel().getName().equals("md_a")) { + + for (Position pos : ignorePoolTiles) { + if (pos.equals(this.position)) { + return; + } + } + } + + if (this.highestItem != null && this.highestItem.getDefinition().getInteractionType() == InteractionType.WS_JOIN_QUEUE) { + return; + } + } + + if (!this.room.isGameArena()) { + if (currentPosition.equals(this.room.getModel().getDoorLocation().getSquareInFront())) { + this.nonBlockingEntities.add(entity); + return; + } + + if (currentPosition.equals(this.room.getModel().getDoorLocation().getSquareInFront().getSquareLeft())) { + this.nonBlockingEntities.add(entity); + return; + } + + if (currentPosition.equals(this.room.getModel().getDoorLocation().getSquareInFront().getSquareRight())) { + this.nonBlockingEntities.add(entity); + return; + } + } + + this.entities.add(entity); + } + + /** + * Contains the entity. + * + * @param entity the entity + * @return true, if successful + */ + public boolean containsEntity(Entity entity) { + if (entities.contains(entity)) + return true; + + if (nonBlockingEntities.contains(entity)) + return true; + + return false; + } + + /** + * Contains the entity. + * + * @param entity the entity + * @return true, if successful + */ + public List getOtherEntities(Entity entity) { + List temp = new ArrayList<>(this.entities); + temp.removeIf(e -> e.getRoomUser().getInstanceId() == entity.getRoomUser().getInstanceId()); + + return temp; + } + + /** + * Removes the entity. + * + * @param entity the entity + */ + public void removeEntity(Entity entity) { + this.entities.remove(entity); + this.nonBlockingEntities.remove(entity); + } + + public void addItem(Item item) + { + if (item == null) + return; + + items.put(item.getVirtualId(), item); + + if (item.getTotalHeight() < tileHeight) // TODO: Stack helper? + return; + + resetHighestItem(); + } + + public void removeItem(Item item) + { + if (item == null) + return; + + items.remove(item.getVirtualId()); + + if (highestItem == null || item.getVirtualId() != highestItem.getVirtualId()) // TODO: Stack helper? + return; + + resetHighestItem(); + } + + public void resetHighestItem() { + highestItem = null; + tileHeight = defaultHeight; + + // List tempItems = new ArrayList<>(this.room.getItems()); + // tempItems.sort(Comparator.comparingDouble((Item item) -> item.getPosition().getZ())); + + Item chair = null;//this.items.values().stream().anyMatch(x -> x.getDefinition().hasBehaviour(ItemBehaviour.CAN_SIT_ON_TOP)); + + for (var item : items.values()) + { + if (item == null) + continue; + + if (item.getDefinition().hasBehaviour(ItemBehaviour.CAN_SIT_ON_TOP) || + item.getDefinition().hasBehaviour(ItemBehaviour.TELEPORTER) || + item.getDefinition().hasBehaviour(ItemBehaviour.DOOR_TELEPORTER)) { + chair = item; + } + + double height = item.getTotalHeight(); + + if (height < tileHeight) + continue; + + highestItem = item; + tileHeight = height; + } + + final Item temp = chair; + + if (chair != null && + this.items.values().stream().anyMatch(x -> x.getDatabaseId() != temp.getDatabaseId() && x.getPosition().getZ() > temp.getPosition().getZ())) { + chairTile = true; + highestItem = chair; + tileHeight = chair.getTotalHeight(); + } + } + + /** + * Get the current position of the tile. + * + * @return the position + */ + public Position getPosition() { + return position; + } + + /** + * Get the current height of the tile. + * + * @return the tile height + */ + public double getTileHeight() { + return tileHeight; + } + + /** + * Get the current height of the tile, but take away the offset of chairs + * and beds so users can sit on them properly. + * + * @return the interactive tile height + */ + public double getWalkingHeight() { + double height = this.tileHeight; + var highestItem = this.highestItem; + + if (highestItem != null) { + if (highestItem.hasBehaviour(ItemBehaviour.CAN_SIT_ON_TOP) || highestItem.hasBehaviour(ItemBehaviour.CAN_LAY_ON_TOP)) { + height -= highestItem.getDefinition().getPositiveTopHeight(); + } + } + + return height; + } + + /** + * Is the next tile lower than our current tile in walking height + * @param otherTile the tile adjacent to this one + * @return whether it is lower or not + */ + public boolean isHeightDrop(RoomTile otherTile) { + return this.getWalkingHeight() > otherTile.getWalkingHeight(); + } + + /** + * Is the next tile higher than our current tile in walking height + * @param otherTile the tile adjacent to this one + * @return whether it is higher or not + */ + public boolean isHeightUpwards(RoomTile otherTile) { + return this.getWalkingHeight() < otherTile.getWalkingHeight(); + } + + /** + * Get the highest item in this tile. + * + * @return the highest item + */ + public Item getHighestItem() { + return highestItem; + } + + /** + * Set the highest item in this tile. + */ + public void setHighestItem(Item item) { + highestItem = item; + } + + /** + * Get list of entities on this tile. + * + * @return the list of entities + */ + public List getEntities() { + return this.entities; + } + + /** + * Get list of non-blocking entities on this tile. + * + * @return the list of entities + */ + public List getNonBlockingEntities() { + return this.nonBlockingEntities; + } + + /** + * Get all entities, including ones on non-blocking tiles, used for furni interactions + */ + public List getEntireEntities() { + List entityList = new ArrayList<>(); + entityList.addAll(this.entities); + entityList.addAll(this.nonBlockingEntities); + return entityList; + } + /** + * Get the list of items on this tile. + * + * @return the list of items + */ + public ArrayList getItems() { + var items = new ArrayList<>(this.items.values()); + items.sort(Comparator.comparingDouble(item -> item.getPosition().getZ())); + return items; + } + + public double getDefaultHeight() { + return defaultHeight; + } + + public ArrayList getItemsAbove(Item item) { + var items = getItems(); + items.removeIf(x -> x.getDatabaseId() == item.getDatabaseId() || x.getPosition().getZ() < item.getPosition().getZ()); + return items; + } + + public boolean isChairTile() { + return chairTile; + } + + public void setChairTile(boolean chairTile) { + this.chairTile = chairTile; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/mapping/RoomTileState.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/mapping/RoomTileState.java new file mode 100644 index 0000000..64bd7e6 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/mapping/RoomTileState.java @@ -0,0 +1,6 @@ +package org.alexdev.havana.game.room.mapping; + +public enum RoomTileState { + OPEN, + CLOSED +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/mapping/select_side_tictactoe.txt b/Havana-Server/src/main/java/org/alexdev/havana/game/room/mapping/select_side_tictactoe.txt new file mode 100644 index 0000000..1ce4baa --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/mapping/select_side_tictactoe.txt @@ -0,0 +1,46 @@ + if (command == "CHOOSETYPE") { + char sideChosen = args[0].ToCharArray()[0]; + + if (GetToken(sideChosen) == null) { + return; + } + + if (GetPlayerBySide(sideChosen) != null) { + // Say that this side can't be picked as it's already chosen + player.Send(new ITEMMSG(new string[]{GameId, "TYPERESERVED"})); + return; + } + + PlayerSides.Add(player, sideChosen); + player.Send(new ITEMMSG(new string[]{GameId, "SELECTTYPE " + sideChosen})); + + GameToken otherToken = null; + + // Select the other side for the player (we do this by looping through possible tokens and selecting the first available) + foreach (var other in gameTokens) { + if (other.Token != sideChosen) { + otherToken = other; + break; + } + } + + if (otherToken != null) { + foreach (var otherPlayer in Players) { + if (otherPlayer != player) { + // Broadcast the side the player chose to the other player + otherPlayer.Send(new ITEMMSG(new string[]{GameId, "SELECTTYPE " + otherToken.Token})); + PlayerSides.Add(otherPlayer, otherToken.Token); + break; + } + } + } + + // Send the message to both opponents the current side/token (X or O) that each opponent had chosen + SendToEveryone(new ITEMMSG(new string[]{GameId, "OPPONENTS", CurrentlyPlaying[0], CurrentlyPlaying[1]})); + } + + if (command == "RESTART") { + RestartMap(); + BroadcastMap(); + return; + } \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/models/RoomModel.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/models/RoomModel.java new file mode 100644 index 0000000..1eefa8c --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/models/RoomModel.java @@ -0,0 +1,178 @@ +package org.alexdev.havana.game.room.models; + +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.room.mapping.RoomTileState; +import org.apache.commons.lang3.StringUtils; +import org.alexdev.havana.game.triggers.GenericTrigger; +import org.alexdev.havana.util.StringUtil; + +import java.util.concurrent.ThreadLocalRandom; +import java.util.regex.Pattern; + +public class RoomModel { + private String modelId; + private String modelName; + private int doorX; + private int doorY; + private double doorZ; + private int doorRotation; + private int mapSizeX; + private int mapSizeY; + private String heightmap; + + private RoomTileState[][] tileStates; + private double[][] tileHeights; + + private RoomModelTriggerType modelTrigger; + + public RoomModel(String modelId, String modelName, int doorX, int doorY, double doorZ, int doorRotation, String heightmap, String triggerClass) { + this.modelId = modelId; + this.modelName = modelName; + this.doorX = doorX; + this.doorY = doorY; + this.doorZ = doorZ; + this.doorRotation = doorRotation; + this.heightmap = heightmap; + + if (!StringUtil.isNullOrEmpty(triggerClass)) { + try { + this.modelTrigger = RoomModelTriggerType.valueOf(triggerClass.toUpperCase()); + } catch (Exception e) { + e.printStackTrace(); + } + } + + this.parse(); + } + + /** + * Parse heightmap, add invalid tiles and the tile heights used + * for walking, stairs, etc. + */ + private void parse() { + String[] lines = this.heightmap.split(Pattern.quote("|")); + + this.mapSizeY = lines.length; + this.mapSizeX = lines[0].length(); + + this.tileStates = new RoomTileState[this.mapSizeX][this.mapSizeY]; + this.tileHeights = new double[this.mapSizeX][this.mapSizeY]; + + StringBuilder temporaryHeightmap = new StringBuilder(); + + for (int y = 0; y < this.mapSizeY; y++) { + String line = lines[y]; + + for (int x = 0; x < this.mapSizeX; x++) { + String tile = Character.toString(line.charAt(x)); + + if (StringUtils.isNumeric(tile)) { + this.tileStates[x][y] = RoomTileState.OPEN; + this.tileHeights[x][y] = Double.parseDouble(tile); + } else { + this.tileStates[x][y] = RoomTileState.CLOSED; + this.tileHeights[x][y] = 0; + } + + if (x == this.doorX && y == this.doorY) { + this.tileStates[x][y] = RoomTileState.OPEN; + this.tileHeights[x][y] = this.doorZ; + } + + temporaryHeightmap.append(tile); + } + + temporaryHeightmap.append("\r"); + } + + this.heightmap = temporaryHeightmap.toString(); + } + + /** + * Get the tile state by given coordinates. This + * doesn't include room furniture. + * + * @param x the x coordinate + * @param y the y coordinate + * @return the room state + */ + public RoomTileState getTileState(int x, int y) { + if (x < 0 || y < 0) { + return RoomTileState.CLOSED; + } + + if (x >= this.mapSizeX || y >= this.mapSizeY) { + return RoomTileState.CLOSED; + } + + return tileStates[x][y]; + } + + /** + * Get the tile height, this doesn't include + * furniture heights. + * + * @param x the x coordinate + * @param y the y coordinate + * @return the room height + */ + public double getTileHeight(int x, int y) { + if (x < 0 || y < 0) { + return 0; + } + + if (x >= this.mapSizeX || y >= this.mapSizeY) { + return 0; + } + + return tileHeights[x][y]; + } + + + public String getId() { + return modelId; + } + + public String getName() { + return modelName; + } + + public Position getDoorLocation() { + return new Position(this.doorX, this.doorY, this.doorZ, this.doorRotation, this.doorRotation); + } + + public int getMapSizeX() { + return mapSizeX; + } + + public int getMapSizeY() { + return mapSizeY; + } + + public String getHeightmap() { + return heightmap; + } + + public RoomModelTriggerType getModelTrigger() { + return modelTrigger; + } + + public GenericTrigger getRoomTrigger() { + if (modelTrigger != null ) + return modelTrigger.getRoomTrigger(); + else + return null; + } + + public int getRandomBound(int boundId) { + if (boundId == 0) { + return ThreadLocalRandom.current().nextInt(0, this.mapSizeX); + } + + if (boundId == 1) { + return ThreadLocalRandom.current().nextInt(0, this.mapSizeY); + } + + return -1; + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/models/RoomModelManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/models/RoomModelManager.java new file mode 100644 index 0000000..2cca075 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/models/RoomModelManager.java @@ -0,0 +1,46 @@ +package org.alexdev.havana.game.room.models; + +import org.alexdev.havana.dao.mysql.RoomModelDao; + +import java.util.concurrent.ConcurrentHashMap; + +public class RoomModelManager { + private static RoomModelManager instance = null; + private ConcurrentHashMap modelMap; + + public RoomModelManager() { + this.modelMap = RoomModelDao.getModels(); + } + + /** + * Get the instance of {@link RoomModelManager} + * + * @return the instance + */ + public static RoomModelManager getInstance() { + if (instance == null) { + instance = new RoomModelManager(); + } + + return instance; + } + + /** + * Reload the instance of {@link RoomModelManager} + * + * @return the instance + */ + public static void reset() { + instance = null; + RoomModelManager.getInstance(); + } + + /** + * Get the map of models. + * + * @return the model map + */ + public RoomModel getModel(String modelId) { + return modelMap.get(modelId); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/models/RoomModelTriggerType.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/models/RoomModelTriggerType.java new file mode 100644 index 0000000..4a5ee59 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/models/RoomModelTriggerType.java @@ -0,0 +1,27 @@ +package org.alexdev.havana.game.room.models; + +import org.alexdev.havana.game.room.models.triggers.*; +import org.alexdev.havana.game.triggers.GenericTrigger; + +public enum RoomModelTriggerType { + FLAT_TRIGGER(new FlatTrigger()), + BATTLEBALL_LOBBY_TRIGGER(new BattleballLobbyTrigger()), + SNOWSTORM_LOBBY_TRIGGER(new SnowStormLobbyTrigger()), + SPACE_CAFE_TRIGGER(new SpaceCafeTrigger()), + HABBO_LIDO_TRIGGER(new HabboLidoTrigger()), + ROOFTOP_RUMBLE_TRIGGER(new RooftopRumbleTrigger()), + DIVING_DECK_TRIGGER(new DivingDeckTrigger()), + INFOBUS_PARK(new InfobusParkTrigger()), + INFOBUS_POLL(new InfobusPollTrigger()), + NONE(null); + + private GenericTrigger roomTrigger; + + RoomModelTriggerType(GenericTrigger trigger) { + this.roomTrigger = trigger; + } + + public GenericTrigger getRoomTrigger() { + return roomTrigger; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/models/triggers/BattleballLobbyTrigger.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/models/triggers/BattleballLobbyTrigger.java new file mode 100644 index 0000000..fa66330 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/models/triggers/BattleballLobbyTrigger.java @@ -0,0 +1,100 @@ +package org.alexdev.havana.game.room.models.triggers; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.games.GameManager; +import org.alexdev.havana.game.games.enums.GameType; +import org.alexdev.havana.game.games.battleball.BattleBallGame; +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.triggers.GameLobbyTrigger; +import org.alexdev.havana.messages.outgoing.games.LOUNGEINFO; +import org.alexdev.havana.messages.outgoing.games.GAMEPLAYERINFO; +import org.alexdev.havana.util.config.GameConfiguration; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class BattleballLobbyTrigger extends GameLobbyTrigger { + @Override + public void onRoomEntry(Entity entity, Room room, boolean firstEntry, Object... customArgs) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + // Don't show panel and lounge info if create game is disabled + if (!GameConfiguration.getInstance().getBoolean(this.getGameType().name().toLowerCase() + ".create.game.enabled")) { + return; + } + + Player player = (Player) entity; + + player.send(new LOUNGEINFO()); + player.send(new GAMEPLAYERINFO(this.getGameType(), room.getEntityManager().getPlayers())); + + this.showPoints(player, room); + } + + @Override + public void onRoomLeave(Entity entity, Room room, Object... customArgs) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + + if (player.getRoomUser().getObservingGameId() != -1) { + player.getRoomUser().stopObservingGame(); + } + } + + @Override + public void createGame(Player gameCreator, Map gameParameters) { + int mapId = (int) gameParameters.get("fieldType"); + + if (mapId < 1 || mapId > 5) { + return; + } + + int teams = (int) gameParameters.get("numTeams"); + + if (teams < 2 || teams > 4) { + return; + } + + String name = (String) gameParameters.get("name"); + + if (name.isEmpty()) { + return; + } + + List allowedPowerUps = new ArrayList<>(); + + String powerUps = (String) gameParameters.get("allowedPowerups"); + + for (String powerUp : powerUps.split(",")) { + if (StringUtils.isNumeric(powerUp)) { + allowedPowerUps.add(Integer.parseInt(powerUp)); + } + } + + BattleBallGame game = new BattleBallGame(GameManager.getInstance().createId(), mapId, this.getGameType(), name, teams, gameCreator, allowedPowerUps, false); + + GamePlayer gamePlayer = new GamePlayer(gameCreator); + gamePlayer.setGameId(game.getId()); + gamePlayer.setTeamId(0); + + gameCreator.getRoomUser().setGamePlayer(gamePlayer); + game.movePlayer(gamePlayer, -1, 0); + + GameManager.getInstance().getGames().add(game); + } + + @Override + public GameType getGameType() { + return GameType.BATTLEBALL; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/models/triggers/DivingDeckTrigger.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/models/triggers/DivingDeckTrigger.java new file mode 100644 index 0000000..433ccc0 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/models/triggers/DivingDeckTrigger.java @@ -0,0 +1,156 @@ +package org.alexdev.havana.game.room.models.triggers; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.enums.StatusType; +import org.alexdev.havana.game.triggers.GenericTrigger; +import org.alexdev.havana.log.Log; +import org.alexdev.havana.messages.outgoing.rooms.items.SHOWPROGRAM; + +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.TimeUnit; + +public class DivingDeckTrigger extends GenericTrigger { + public static class PoolCamera implements Runnable { + private final Room room; + private Player player; + private int cameraType; + + public PoolCamera(Room room) { + this.room = room; + } + + @Override + public void run() { + try { + if (this.player == null) { + this.spectateNewPlayer(); + this.newCameraMode(-1); + return; + } + + int cameraType = ThreadLocalRandom.current().nextInt(0, 3); + + switch (cameraType) { + case 0: { + this.spectateNewPlayer(); + break; + } + case 1: { + this.newCameraMode(1); + break; + } + case 2: { + this.newCameraMode(2); + break; + } + } + } catch (Exception ex) { + Log.getErrorLogger().error("PoolCamera crashed: ", ex); + } + } + + /** + * Finds a new player to spectate on the camera. + */ + public void spectateNewPlayer() { + try { + List playerList = this.room.getEntityManager().getPlayers(); + + if (playerList.isEmpty()) { + return; + } + + this.player = null; + + if (playerList.size() > 1) { + this.player = playerList.get(ThreadLocalRandom.current().nextInt(playerList.size())); + } else { + this.player = playerList.get(0); + } + + if (this.player != null) { + this.room.send(new SHOWPROGRAM(new String[]{"cam1", "targetcamera", String.valueOf(this.player.getRoomUser().getInstanceId())})); + } + } catch (Exception ex) { + Log.getErrorLogger().error("Error when trying to find player to spectate: ", ex); + } + } + + /** + * Creates a new camera mode for the camera and sends it to all the users. + */ + public void newCameraMode(int mode) { + this.cameraType = mode > 0 ? mode : ThreadLocalRandom.current().nextInt(1, 3); + this.room.send(new SHOWPROGRAM(new String[]{"cam1", "setcamera", String.valueOf(this.cameraType)})); + } + + /** + * Gets the current active player being spectated + * + * @return the player being spectated + */ + public Player getPlayer() { + return player; + } + + /** + * Get the camera type (zoomed in or zoomed out) + * + * @return the camera type + */ + public int getCameraType() { + return cameraType; + } + } + + @Override + public void onRoomEntry(Entity entity, Room room, boolean firstEntry, Object... customArgs) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player)entity; + + if (room.getTaskManager().hasTask("DivingCamera")) { + DivingDeckTrigger.PoolCamera task = (DivingDeckTrigger.PoolCamera) room.getTaskManager().getTask("DivingCamera"); + + if (task.getPlayer() == null) { + task.spectateNewPlayer(); + } + + if (task.getPlayer() != null) { + player.send(new SHOWPROGRAM(new String[]{"cam1", "setcamera", String.valueOf(task.getCameraType())})); + } + } else { + room.getTaskManager().scheduleTask("DivingCamera", new DivingDeckTrigger.PoolCamera(room), 3, 10, TimeUnit.SECONDS); + } + + if (player.getRoomUser().getPosition().getZ() == 1.0) { // User entered room from the other pool + player.getRoomUser().setStatus(StatusType.SWIM, ""); + player.getRoomUser().setNeedsUpdate(true); + } + } + + @Override + public void onRoomLeave(Entity entity, Room room, Object... customArgs) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + if (room.getEntityManager().getPlayers().isEmpty()) { + return; + } + + Player player = (Player)entity; + + DivingDeckTrigger.PoolCamera task = (DivingDeckTrigger.PoolCamera) room.getTaskManager().getTask("DivingCamera"); + + if (task.getPlayer() == player) { + task.spectateNewPlayer(); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/models/triggers/FlatTrigger.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/models/triggers/FlatTrigger.java new file mode 100644 index 0000000..a4b9062 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/models/triggers/FlatTrigger.java @@ -0,0 +1,82 @@ +package org.alexdev.havana.game.room.models.triggers; + +import org.alexdev.havana.dao.mysql.PetDao; +import org.alexdev.havana.dao.mysql.RoomVisitsDao; +import org.alexdev.havana.game.achievements.AchievementManager; +import org.alexdev.havana.game.achievements.AchievementType; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.guides.GuideManager; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.interactors.InteractionType; +import org.alexdev.havana.game.item.interactors.types.PetNestInteractor; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.pets.PetDetails; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.triggers.GenericTrigger; + +import java.util.stream.Collectors; + +public class FlatTrigger extends GenericTrigger { + @Override + public void onRoomEntry(Entity entity, Room room, boolean firstEntry, Object... customArgs) { + if (!(entity instanceof Player)) { + return; + } + + if (room.getData().isCustomRoom()) + return; + + Player player = (Player) entity; + + /*player.send(new MessageComposer() { + @Override + public void compose(NettyResponse response) { + response.writeBool(true); + } + + @Override + public short getHeader() { + return 356; // Ed + } + });*/ + + RoomVisitsDao.addVisit(player.getDetails().getId(), room.getId()); + AchievementManager.getInstance().tryProgress(AchievementType.ACHIEVEMENT_ROOMENTRY, player); + + if (player.getGuideManager().isGuide() && player.getGuideManager().getInvitedBy() > 0) { + int invitedBy = player.getGuideManager().getInvitedBy(); + + if (room.getData().getOwnerId() == invitedBy) { + room.getEntityManager().getPlayers().stream() + .filter(p -> p.getDetails().getId() == invitedBy) + .findFirst() + .ifPresent(newb -> { + GuideManager.getInstance().tutorEnterRoom(player, newb); + }); + + player.getGuideManager().setInvitedBy(0); + } + } + + if (firstEntry) { + for (Item item : room.getItemManager().getFloorItems().stream().filter(item -> item.getDefinition().getInteractionType() == InteractionType.PET_NEST).collect(Collectors.toList())) { + PetNestInteractor interactor = (PetNestInteractor) InteractionType.PET_NEST.getTrigger(); + + PetDetails petDetails = PetDao.getPetDetails(item.getDatabaseId()); + + if (petDetails != null) { + Position position = new Position(petDetails.getX(), petDetails.getY()); + position.setRotation(petDetails.getRotation()); + + interactor.addPet(room, petDetails, position); + } + } + } + } + + @Override + public void onRoomLeave(Entity entity, Room room, Object... customArgs) { + + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/models/triggers/HabboLidoTrigger.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/models/triggers/HabboLidoTrigger.java new file mode 100644 index 0000000..35f8431 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/models/triggers/HabboLidoTrigger.java @@ -0,0 +1,46 @@ +package org.alexdev.havana.game.room.models.triggers; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.enums.StatusType; +import org.alexdev.havana.game.triggers.GenericTrigger; + +public class HabboLidoTrigger extends GenericTrigger { + @Override + public void onRoomEntry(Entity entity, Room room, boolean firstEntry, Object... customArgs) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player)entity; + + /*if (player.getNetwork().isFlashConnected()) { + if (player.getDetails().getPoolFigure().isEmpty()) { + String[] swimColors = new String[] { + "250,56,49", + "253,146,160", + "42,199,210", + "53,51,44", + "239,255,146", + "198,255,152" + }; + + String swimColor = swimColors[ThreadLocalRandom.current().nextInt(swimColors.length)]; + player.getDetails().setPoolFigure(String.format("ch=s02/%s", swimColor)); + PlayerDao.saveDetails(player.getDetails().getId(), player.getDetails().getFigure(), player.getDetails().getPoolFigure(), player.getDetails().getSex()); + } + }*/ + + if (player.getRoomUser().getPosition().getZ() == 1.0) { // User entered room from the other pool + player.getRoomUser().setStatus(StatusType.SWIM, ""); + player.getRoomUser().setNeedsUpdate(true); + } + } + + @Override + public void onRoomLeave(Entity entity, Room room, Object... customArgs) { + + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/models/triggers/InfobusParkTrigger.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/models/triggers/InfobusParkTrigger.java new file mode 100644 index 0000000..0e8e672 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/models/triggers/InfobusParkTrigger.java @@ -0,0 +1,37 @@ +package org.alexdev.havana.game.room.models.triggers; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.infobus.InfobusManager; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.triggers.GenericTrigger; +import org.alexdev.havana.messages.outgoing.infobus.BUS_DOOR; +import org.alexdev.havana.messages.types.MessageComposer; + +import java.util.ArrayList; +import java.util.List; + +public class InfobusParkTrigger extends GenericTrigger { + @Override + public void onRoomEntry(Entity entity, Room room, boolean firstEntry, Object... customArgs) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + player.send(new BUS_DOOR(InfobusManager.getInstance().isDoorOpen())); + + List messageComposers = new ArrayList<>(); + player.getRoomUser().getPacketQueueAfterRoomLeave().drainTo(messageComposers); + + for (var composer : messageComposers) { + player.send(composer); + } + } + + @Override + public void onRoomLeave(Entity entity, Room room, Object... customArgs) { + + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/models/triggers/InfobusPollTrigger.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/models/triggers/InfobusPollTrigger.java new file mode 100644 index 0000000..021ccac --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/models/triggers/InfobusPollTrigger.java @@ -0,0 +1,37 @@ +package org.alexdev.havana.game.room.models.triggers; + +import org.alexdev.havana.dao.mysql.InfobusDao; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.infobus.InfobusManager; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.triggers.GenericTrigger; +import org.alexdev.havana.messages.outgoing.infobus.BUS_DOOR; +import org.alexdev.havana.messages.outgoing.infobus.POLL_QUESTION; + +public class InfobusPollTrigger extends GenericTrigger { + @Override + public void onRoomEntry(Entity entity, Room room, boolean firstEntry, Object... customArgs) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + + /*var infobusPoll = InfobusManager.getInstance().getCurrentPoll(); + + if (infobusPoll != null) { + if (!InfobusDao.hasAnswer(infobusPoll.getId(), player.getDetails().getId())) { + player.send(new POLL_QUESTION(infobusPoll.getPollData().getQuestion(), infobusPoll.getPollData().getAnswers())); + } + }*/ + + //player.send(new POLL_QUESTION("How about I fuck your shit up?", new String[] { "Yes please", "No please", "How about both?"})); + } + + @Override + public void onRoomLeave(Entity entity, Room room, Object... customArgs) { + + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/models/triggers/RooftopRumbleTrigger.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/models/triggers/RooftopRumbleTrigger.java new file mode 100644 index 0000000..db8f05a --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/models/triggers/RooftopRumbleTrigger.java @@ -0,0 +1,54 @@ +package org.alexdev.havana.game.room.models.triggers; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.triggers.GenericTrigger; +import org.alexdev.havana.messages.outgoing.rooms.items.SHOWPROGRAM; + +import java.util.concurrent.TimeUnit; + +public class RooftopRumbleTrigger extends GenericTrigger { + @Override + public void onRoomEntry(Entity entity, Room room, boolean firstEntry, Object... customArgs) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player)entity; + + if (room.getTaskManager().hasTask("DivingCamera")) { + DivingDeckTrigger.PoolCamera task = (DivingDeckTrigger.PoolCamera) room.getTaskManager().getTask("DivingCamera"); + + if (task.getPlayer() == null) { + task.spectateNewPlayer(); + } + + if (task.getPlayer() != null) { + player.send(new SHOWPROGRAM(new String[]{"cam1", "setcamera", String.valueOf(task.getCameraType())})); + } + } else { + room.getTaskManager().scheduleTask("DivingCamera", new DivingDeckTrigger.PoolCamera(room), 3, 10, TimeUnit.SECONDS); + } + } + + @Override + public void onRoomLeave(Entity entity, Room room, Object... customArgs) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + if (room.getEntityManager().getPlayers().isEmpty()) { + return; + } + + Player player = (Player)entity; + + DivingDeckTrigger.PoolCamera task = (DivingDeckTrigger.PoolCamera) room.getTaskManager().getTask("DivingCamera"); + + if (task.getPlayer() == player) { + task.spectateNewPlayer(); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/models/triggers/SnowStormLobbyTrigger.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/models/triggers/SnowStormLobbyTrigger.java new file mode 100644 index 0000000..f9074a6 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/models/triggers/SnowStormLobbyTrigger.java @@ -0,0 +1,98 @@ +package org.alexdev.havana.game.room.models.triggers; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.games.GameManager; +import org.alexdev.havana.game.games.enums.GameType; +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.games.snowstorm.SnowStormGame; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.triggers.GameLobbyTrigger; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; +import org.alexdev.havana.messages.outgoing.games.GAMEPLAYERINFO; +import org.alexdev.havana.messages.outgoing.games.LOUNGEINFO; +import org.alexdev.havana.util.config.GameConfiguration; + +import java.util.Map; + +public class SnowStormLobbyTrigger extends GameLobbyTrigger { + @Override + public void onRoomEntry(Entity entity, Room room, boolean firstEntry, Object... customArgs) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + // Don't show panel and lounge info if create game is disabled + if (!GameConfiguration.getInstance().getBoolean(this.getGameType().name().toLowerCase() + ".create.game.enabled")) { + return; + } + + Player player = (Player) entity; + + player.send(new LOUNGEINFO()); + player.send(new GAMEPLAYERINFO(this.getGameType(), room.getEntityManager().getPlayers())); + + if (GameConfiguration.getInstance().getBoolean("snowstorm.alpha.alert")) { + player.send(new ALERT("Welcome to SnowStorm testing!

The game is almost complete but may have a few quirks to figure out. Please report any issues (aside from desync) to Alex.

Thanks to the following for making it possible:
- Sefhriloff
- Ascii")); + } + } + + @Override + public void onRoomLeave(Entity entity, Room room, Object... customArgs) { + if (entity.getType() != EntityType.PLAYER) { + return; + } + + Player player = (Player) entity; + + if (player.getRoomUser().getObservingGameId() != -1) { + player.getRoomUser().stopObservingGame(); + } + } + + /* new GameParameter("fieldType", true, "1", 1, 5), + new GameParameter("numTeams", true, "2", 2, 4), + new GameParameter("gameLengthChoice", true, "1", 1, 3), + new GameParameter("name", true, "") + };*/ + + @Override + public void createGame(Player gameCreator, Map gameParameters) { + int mapId = (int) gameParameters.get("fieldType"); + + if (mapId < 1 || mapId > 7) { + return; + } + + int teams = (int) gameParameters.get("numTeams"); + + if (teams < 1 || teams > 4) { + return; + } + + String name = (String) gameParameters.get("name"); + + if (name.isEmpty()) { + return; + } + + int lengthChoice = (int) gameParameters.get("gameLengthChoice"); + + SnowStormGame game = new SnowStormGame(GameManager.getInstance().createId(), mapId, name, teams, gameCreator, lengthChoice, false); + + GamePlayer gamePlayer = new GamePlayer(gameCreator); + gamePlayer.setGameId(game.getId()); + gamePlayer.setTeamId(0); + + gameCreator.getRoomUser().setGamePlayer(gamePlayer); + game.movePlayer(gamePlayer, -1, 0); + + GameManager.getInstance().getGames().add(game); + } + + @Override + public GameType getGameType() { + return GameType.SNOWSTORM; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/models/triggers/SpaceCafeTrigger.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/models/triggers/SpaceCafeTrigger.java new file mode 100644 index 0000000..a41bd54 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/models/triggers/SpaceCafeTrigger.java @@ -0,0 +1,24 @@ +package org.alexdev.havana.game.room.models.triggers; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.tasks.SpaceCafeTask; +import org.alexdev.havana.game.triggers.GenericTrigger; + +import java.util.concurrent.TimeUnit; + +public class SpaceCafeTrigger extends GenericTrigger { + @Override + public void onRoomEntry(Entity entity, Room room, boolean firstEntry, Object... customArgs) { + if (!firstEntry) { + return; + } + + if (entity.getType() != EntityType.PLAYER) { + return; + } + + room.getTaskManager().scheduleTask("SpaceCafeTask", new SpaceCafeTask(room), 0, 500, TimeUnit.MILLISECONDS); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/tasks/BotTask.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/tasks/BotTask.java new file mode 100644 index 0000000..e20b5a2 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/tasks/BotTask.java @@ -0,0 +1,60 @@ +package org.alexdev.havana.game.room.tasks; + +import org.alexdev.havana.game.bot.Bot; +import org.alexdev.havana.game.bot.BotSpeech; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.config.GameConfiguration; + +import java.util.concurrent.ThreadLocalRandom; + +public class BotTask implements Runnable { + private final Room room; + + private int MIN_WALK_TIME = 3; + private int MAX_WALK_TIME = 10; + + private int MIN_SPEAK_TIME = 20; + private int MAX_SPEAK_TIME = 50; + private BotSpeech lastSpeech; + + public BotTask(Room room) { + this.room = room; + + for (Bot bot : this.room.getEntityManager().getEntitiesByClass(Bot.class)) { + bot.setNextWalkTime(DateUtil.getCurrentTimeSeconds() + ThreadLocalRandom.current().nextInt(MIN_WALK_TIME, MAX_WALK_TIME)); + bot.setNextSpeechTime(DateUtil.getCurrentTimeSeconds() + ThreadLocalRandom.current().nextInt(MIN_SPEAK_TIME, MAX_SPEAK_TIME)); + } + } + + @Override + public void run() { + for (Bot bot : this.room.getEntityManager().getEntitiesByClass(Bot.class)) { + if (DateUtil.getCurrentTimeSeconds() > bot.getNextWalkTime()) { + if (bot.getBotData().getWalkspace().size() > 0) { + Position walkDestination = bot.getBotData().getWalkspace().get(ThreadLocalRandom.current().nextInt(0, bot.getBotData().getWalkspace().size())); + bot.getRoomUser().walkTo(walkDestination.getX(), walkDestination.getY()); + bot.setNextWalkTime(DateUtil.getCurrentTimeSeconds() + ThreadLocalRandom.current().nextInt(MIN_WALK_TIME, MAX_WALK_TIME)); + + if (GameConfiguration.getInstance().getBoolean("april.fools")) { + bot.getRoomUser().dance(ThreadLocalRandom.current().nextInt(0, 5)); + } + } + } + + if (DateUtil.getCurrentTimeSeconds() > bot.getNextSpeechTime()) { + if (bot.getBotData().getSpeeches().size() > 0) { + BotSpeech speech = bot.getBotData().getSpeeches().get(ThreadLocalRandom.current().nextInt(0, bot.getBotData().getSpeeches().size())); + bot.setNextSpeechTime(DateUtil.getCurrentTimeSeconds() + ThreadLocalRandom.current().nextInt(MIN_SPEAK_TIME, MAX_SPEAK_TIME)); + + if (this.lastSpeech != speech) { + bot.getRoomUser().talk(speech.getSpeech(), speech.getChatMessageType()); + } + + this.lastSpeech = speech; + } + } + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/tasks/CameraTask.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/tasks/CameraTask.java new file mode 100644 index 0000000..d053b3a --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/tasks/CameraTask.java @@ -0,0 +1,31 @@ +package org.alexdev.havana.game.room.tasks; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.room.enums.StatusType; +import org.alexdev.havana.messages.outgoing.rooms.user.USER_STATUSES; + +import java.util.List; + +public class CameraTask implements Runnable { + private final Entity entity; + + public CameraTask(Entity entity) { + this.entity = entity; + } + + @Override + public void run() { + if (this.entity.getRoomUser().getRoom() == null) { + return; + } + + String item = entity.getRoomUser().getStatus(StatusType.USE_ITEM).getValue(); + + this.entity.getRoomUser().removeStatus(StatusType.USE_ITEM); + this.entity.getRoomUser().setStatus(StatusType.CARRY_ITEM, item); + + if (!this.entity.getRoomUser().isWalking()) { + this.entity.getRoomUser().getRoom().send(new USER_STATUSES(List.of(this.entity))); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/tasks/DiceTask.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/tasks/DiceTask.java new file mode 100644 index 0000000..c7f70f2 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/tasks/DiceTask.java @@ -0,0 +1,37 @@ +package org.alexdev.havana.game.room.tasks; + +import org.alexdev.havana.dao.mysql.ItemDao; +import org.alexdev.havana.game.GameScheduler; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.messages.outgoing.rooms.items.DICE_VALUE; + +import java.util.concurrent.ThreadLocalRandom; + +public class DiceTask implements Runnable { + private final Item dice; + + public DiceTask(Item dice) { + this.dice = dice; + } + + @Override + public void run() { + if (!this.dice.getRequiresUpdate()) { + return; + } + + int maxNumber = 6; + + if (this.dice.getDefinition().getSprite().equals("bottle")) { + maxNumber = 8; + } + + int randomNumber = ThreadLocalRandom.current().nextInt(1, maxNumber + 1); // between 1 and 6 + this.dice.getRoom().send(new DICE_VALUE(this.dice.getVirtualId(), false, randomNumber)); + + this.dice.setCustomData(Integer.toString(randomNumber)); + this.dice.updateStatus(); + this.dice.setRequiresUpdate(false); + this.dice.save(); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/tasks/EntityTask.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/tasks/EntityTask.java new file mode 100644 index 0000000..35cdcde --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/tasks/EntityTask.java @@ -0,0 +1,422 @@ +package org.alexdev.havana.game.room.tasks; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.pathfinder.Rotation; +import org.alexdev.havana.game.pets.Pet; +import org.alexdev.havana.game.pets.PetAction; +import org.alexdev.havana.game.pets.PetManager; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.entities.RoomEntity; +import org.alexdev.havana.game.room.enums.StatusType; +import org.alexdev.havana.game.room.mapping.RoomTile; +import org.alexdev.havana.log.Log; +import org.alexdev.havana.messages.outgoing.rooms.user.CHAT_MESSAGE; +import org.alexdev.havana.messages.outgoing.rooms.user.USER_STATUSES; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.util.StringUtil; +import org.alexdev.havana.util.config.GameConfiguration; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadLocalRandom; + +public class EntityTask implements Runnable { + private final Room room; + private final BlockingQueue queueAfterLoop; + + public EntityTask(Room room) { + this.room = room; + this.queueAfterLoop = new LinkedBlockingQueue(); + } + + public boolean isMoonwalkEnabled(Entity entity) { + if (entity instanceof Player) { + return GameConfiguration.getInstance().getBoolean("april.fools"); + } + + return false; + } + + @Override + public void run() { + if (this.room.getEntities().isEmpty()) { + return; + } + + List entitiesToUpdate = new ArrayList<>(); + + for (Entity entity : this.room.getEntities()) { + if (entity != null + && entity.getRoomUser().getRoom() != null + && entity.getRoomUser().getRoom() == this.room) { + + if (entity.getType() == EntityType.PET) { + this.processPet((Pet) entity); + } + + if (entity.getType() == EntityType.PLAYER) { + ((Player) entity).getRoomUser().handleSpamTicks(); + } + + try { + this.processEntity(entity); + } catch (Exception ex) { + Log.getErrorLogger().error("EntityTask crashed: ", ex); + } + + RoomEntity roomEntity = entity.getRoomUser(); + + if (roomEntity.isNeedsUpdate()) { + roomEntity.setNeedsUpdate(false); + entitiesToUpdate.add(entity); + } + } + } + + if (entitiesToUpdate.size() > 0) { + this.room.send(new USER_STATUSES(entitiesToUpdate)); + } + + this.handleMessageQueue(); + } + + /** + * Handles messages to be queued after the main room loop was sent + */ + private void handleMessageQueue() { + try { + List queueSending = new ArrayList<>(); + this.queueAfterLoop.drainTo(queueSending); + + for (MessageComposer messageComposer : queueSending) { + this.room.send(messageComposer); + } + } catch (Exception ex) { + Log.getErrorLogger().error("EntityTask crashed: ", ex); + } + } + + /** + * Process entity. + * + * @param entity the entity + */ + private void processEntity(Entity entity) { + RoomEntity roomEntity = entity.getRoomUser(); + + Position position = roomEntity.getPosition(); + Position goal = roomEntity.getGoal(); + + if (roomEntity.isWalking()) { + // Apply next tile from the tile we removed from the list the cycle before + if (roomEntity.getNextPosition() != null) { + Position oldPosition = roomEntity.getPosition().copy(); + + roomEntity.getPosition().setX(roomEntity.getNextPosition().getX()); + roomEntity.getPosition().setY(roomEntity.getNextPosition().getY()); + roomEntity.updateNewHeight(roomEntity.getPosition()); + + if (roomEntity.getCurrentItem() != null) { + if (roomEntity.getCurrentItem().getDefinition().getInteractionType().getTrigger() != null) { + roomEntity.getCurrentItem().getDefinition().getInteractionType().getTrigger().onEntityStep(entity, roomEntity, roomEntity.getCurrentItem(), oldPosition); + } + } + } + + // We still have more tiles left, so lets continue moving + if (roomEntity.getPath().size() > 0) { + Position next = roomEntity.getPath().pop(); + + // Tile was invalid after we started walking, so lets try again! + if (!RoomTile.isValidTile(this.room, entity, next)) { + entity.getRoomUser().getPath().clear(); + this.processEntity(entity); + roomEntity.walkTo(goal.getX(), goal.getY()); + return; + } + + // Try and stop any other entities first from getting to tile + /*var otherEntity = roomEntity.getRoom().getEntities().stream().filter(e -> + entity.getDetails().getId() != e.getDetails().getId() && + entity.getRoomUser().getGoal().equals(e.getRoomUser().getGoal()) && + e.getRoomUser().getPosition().getDistanceSquared(e.getRoomUser().getGoal()) <= 2).findFirst().orElse(null); + + if (otherEntity != null) { + entity.getRoomUser().getPath().clear(); + this.processEntity(entity); + return; + }*/ + + RoomTile previousTile = roomEntity.getTile(); + + if (previousTile != null) + previousTile.removeEntity(entity); + + RoomTile nextTile = roomEntity.getRoom().getMapping().getTile(next); + + if (nextTile == null) { + entity.getRoomUser().getPath().clear(); + this.processEntity(entity); + roomEntity.walkTo(goal.getX(), goal.getY()); + return; + } + + nextTile.addEntity(entity); + + double newPosition = nextTile.getWalkingHeight(); + double oldPosition = position.getZ(); + + if (entity.getRoomUser().getRoom().getModel().getName().startsWith("pool_") || + entity.getRoomUser().getRoom().getModel().getName().equals("md_a")) { + + int minDifference = 3; + + if (entity.getRoomUser().getRoom().getModel().getName().equals("md_a")) { + minDifference = 2; + } + + if ((newPosition > oldPosition) && Math.abs(newPosition - oldPosition) >= minDifference) {//(next.getZ() - roomEntity.getPosition().getZ()) > 3) { + if (roomEntity.containsStatus(StatusType.SWIM)) { + roomEntity.removeStatus(StatusType.SWIM); + + if (roomEntity.containsStatus(StatusType.DANCE)) { + roomEntity.removeStatus(StatusType.DANCE); + } + } + + if (roomEntity.containsStatus(StatusType.CARRY_DRINK)) { + roomEntity.removeStatus(StatusType.CARRY_DRINK); + } + + if (roomEntity.containsStatus(StatusType.CARRY_ITEM)) { + roomEntity.removeStatus(StatusType.CARRY_ITEM); + } + } + + if ((newPosition < oldPosition) && Math.abs(oldPosition - newPosition) >= minDifference) { + if (!roomEntity.containsStatus(StatusType.SWIM)) { + roomEntity.setStatus(StatusType.SWIM, ""); + + if (roomEntity.containsStatus(StatusType.DANCE)) { + roomEntity.removeStatus(StatusType.DANCE); + } + } + + if (roomEntity.containsStatus(StatusType.CARRY_DRINK)) { + roomEntity.removeStatus(StatusType.CARRY_DRINK); + } + + if (roomEntity.containsStatus(StatusType.CARRY_ITEM)) { + roomEntity.removeStatus(StatusType.CARRY_ITEM); + } + } + } + + // Set up trigger for leaving a current item + if (roomEntity.getLastItemInteraction() != null) { + if (roomEntity.getLastItemInteraction().getDefinition().getInteractionType().getTrigger() != null) { + roomEntity.getLastItemInteraction().getDefinition().getInteractionType().getTrigger().onEntityLeave(entity, roomEntity, roomEntity.getCurrentItem()); + } + + roomEntity.setLastItemInteraction(null); + } + + roomEntity.removeStatus(StatusType.LAY); + roomEntity.removeStatus(StatusType.SIT); + + int rotation = isMoonwalkEnabled(entity) ? + Rotation.calculateWalkDirection(next.getX(), next.getY(), position.getX(), position.getY()) : + Rotation.calculateWalkDirection(position.getX(), position.getY(), next.getX(), next.getY()); + + double height = nextTile.getWalkingHeight(); + + roomEntity.getPosition().setRotation(rotation); + roomEntity.setStatus(StatusType.MOVE, next.getX() + "," + next.getY() + "," + StringUtil.format(height)); + roomEntity.setNextPosition(next); + } else { + roomEntity.stopWalking(); + } + + // If we're walking, make sure to tell the server + roomEntity.setNeedsUpdate(true); + } + } + + /** + * Process pet actions. + * + * @param pet the pet to process + */ + private void processPet(Pet pet) { + if (pet.hasActionExpired() && pet.getAction() != PetAction.NONE) { + if (pet.getAction() == PetAction.SLEEP) { + pet.awake(); + } + + pet.getRoomUser().getStatuses().clear(); + pet.getRoomUser().setNeedsUpdate(true); + pet.setAction(PetAction.NONE); + } else { + switch (ThreadLocalRandom.current().nextInt(0, 6)) { + case 1: { + pet.getRoomUser().removeStatus(StatusType.SIT); + pet.getRoomUser().removeStatus(StatusType.LAY); + pet.getRoomUser().removeStatus(StatusType.SLEEP); + + if (pet.getRoomUser().containsStatus(StatusType.EAT) || + pet.getRoomUser().containsStatus(StatusType.DEAD) || + pet.getRoomUser().containsStatus(StatusType.JUMP)) { + return; + } + + if (pet.isDoingAction()) { + return; + } + + switch (ThreadLocalRandom.current().nextInt(0, 9)) { + case 0: { + if (pet.isThirsty()) { + pet.getRoomUser().tryDrinking(); + return; + } + break; + } + case 1: { + if (pet.isHungry()) { + pet.getRoomUser().tryEating(); + return; + } + break; + } + case 2: { + if (pet.isTired()) { + pet.getRoomUser().trySleep(); + return; + } + break; + } + } + + + Position availableTile = this.room.getMapping().getRandomWalkableBound(pet); + + if (availableTile != null) { + pet.getRoomUser().walkTo(availableTile.getX(), availableTile.getY()); + } + + break; + } + } + + if (!pet.isWalkBeforeSitLay() && pet.isActionAllowed()) { + switch (ThreadLocalRandom.current().nextInt(0, 15)) { + case 1: { + if (!pet.getRoomUser().isWalking() && pet.getAction() == PetAction.NONE) { + pet.getRoomUser().getPosition().setRotation(pet.getRoomUser().getPosition().getBodyRotation()); + pet.getRoomUser().setStatus(StatusType.SIT, StringUtil.format(pet.getRoomUser().getPosition().getZ())); + pet.setWalkBeforeSitLay(true); + + pet.setAction(PetAction.SIT); + pet.setActionDuration(ThreadLocalRandom.current().nextInt(15, 30)); + + if (ThreadLocalRandom.current().nextInt(0, 3) == 0) { + List playerList = this.room.getEntityManager().getEntitiesByClass(Player.class); + playerList.sort(Comparator.comparingInt(p -> p.getRoomUser().getPosition().getDistanceSquared(pet.getRoomUser().getPosition()))); + + if (playerList.size() > 0) { + pet.getRoomUser().getPosition().setRotation(Rotation.calculateWalkDirection( + pet.getRoomUser().getPosition(), + playerList.get(0).getRoomUser().getPosition())); + } + } + + pet.getRoomUser().setNeedsUpdate(true); + } + break; + } + case 2: { + if (!pet.getRoomUser().isWalking() && pet.getAction() == PetAction.NONE) { + pet.getRoomUser().getPosition().setRotation(pet.getRoomUser().getPosition().getBodyRotation()); + pet.getRoomUser().setStatus(StatusType.LAY, StringUtil.format(pet.getRoomUser().getPosition().getZ()) + " null"); + pet.setWalkBeforeSitLay(true); + + pet.setAction(PetAction.LAY); + pet.setActionDuration(ThreadLocalRandom.current().nextInt(15, 30)); + + if (ThreadLocalRandom.current().nextInt(0, 5) == 0) { + List playerList = this.room.getEntityManager().getEntitiesByClass(Player.class); + playerList.sort(Comparator.comparingInt(p -> p.getRoomUser().getPosition().getDistanceSquared(pet.getRoomUser().getPosition()))); + + if (playerList.size() > 0) { + pet.getRoomUser().getPosition().setRotation(Rotation.calculateWalkDirection( + pet.getRoomUser().getPosition(), + playerList.get(0).getRoomUser().getPosition())); + } + } + + pet.getRoomUser().setNeedsUpdate(true); + } + break; + } + } + } + + if (pet.getAction() == PetAction.SIT || pet.getAction() == PetAction.LAY || pet.getAction() == PetAction.NONE) { + if (ThreadLocalRandom.current().nextInt(0, 8) == 0) { + if (!pet.getRoomUser().isWalking()) { + List playerList = this.room.getEntityManager().getEntitiesByClass(Player.class); + playerList.sort(Comparator.comparingInt(p -> p.getRoomUser().getPosition().getDistanceSquared(pet.getRoomUser().getPosition()))); + + if (playerList.size() > 0) { + pet.getRoomUser().getPosition().setHeadRotation(Rotation.getHeadRotation( + pet.getRoomUser().getPosition().getRotation(), + pet.getRoomUser().getPosition(), + playerList.get(0).getRoomUser().getPosition())); + pet.getRoomUser().setNeedsUpdate(true); + } + } + } + } + } + + int maxRange = 25; + + if (pet.getAction() != PetAction.NONE && pet.getAction() != PetAction.SIT && pet.getAction() != PetAction.LAY) { + maxRange = 8; + } + + switch (ThreadLocalRandom.current().nextInt(0, maxRange)) { + case 2: { + var talkMessage = PetManager.getInstance().getRandomSpeech(pet); + + if (talkMessage != null) { + /*if (pet.getAction() != PetAction.NONE && pet.getAction() != PetAction.SIT && pet.getAction() != PetAction.LAY) { + pet.getRoomUser().talk(talkMessage, CHAT_MESSAGE.ChatMessageType.CHAT); + } else {*/ + if (ThreadLocalRandom.current().nextInt(0, 10/* 8 */) == 0) { + pet.getRoomUser().talk(talkMessage, CHAT_MESSAGE.ChatMessageType.CHAT); + } + //} + } + + break; + } + } + } + + + /** + * Used for sending packets after the loop has completed. + * + * @return the queue to add composers into + */ + public BlockingQueue getQueueAfterLoop() { + return queueAfterLoop; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/tasks/FortuneTask.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/tasks/FortuneTask.java new file mode 100644 index 0000000..e849b88 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/tasks/FortuneTask.java @@ -0,0 +1,29 @@ +package org.alexdev.havana.game.room.tasks; + +import org.alexdev.havana.dao.mysql.ItemDao; +import org.alexdev.havana.game.GameScheduler; +import org.alexdev.havana.game.item.Item; + +import java.util.concurrent.ThreadLocalRandom; + +public class FortuneTask implements Runnable { + private final Item fortune; + + public FortuneTask(Item item) { + this.fortune = item; + } + + public void run() { + if (!fortune.getRequiresUpdate()) { + return; + } + + // Set random number that gets picked up by the FortuneTask + int randomNumber = ThreadLocalRandom.current().nextInt(1, 11); // between 1 and 10 + + this.fortune.setCustomData(Integer.toString(randomNumber)); + this.fortune.updateStatus(); + this.fortune.setRequiresUpdate(false); + this.fortune.save(); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/tasks/RainbowTask.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/tasks/RainbowTask.java new file mode 100644 index 0000000..d1baef3 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/tasks/RainbowTask.java @@ -0,0 +1,60 @@ +package org.alexdev.havana.game.room.tasks; + +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.room.Room; + +import java.util.LinkedHashMap; +import java.util.Map; + +public class RainbowTask implements Runnable { + private final Room room; + private int colourIndex; + + private static Map HEX_COLOURS; + + public RainbowTask(Room room) { + if (HEX_COLOURS == null) { + HEX_COLOURS = new LinkedHashMap<>(); + + double frequency = 0.5; + + for (var i = 0; i < 32; ++i) { + double red = Math.sin(frequency * i + 0) * 127 + 128; + double green = Math.sin(frequency * i + 2) * 127 + 128; + double blue = Math.sin(frequency * i + 4) * 127 + 128; + + String hex = String.format("#%02x%02x%02x", (int)red, (int)green, (int)blue); + HEX_COLOURS.put(i, hex); + } + } + + this.room = room; + this.colourIndex = -1; + } + + @Override + public void run() { + Item moodlight = this.room.getItemManager().getMoodlight(); + + if (moodlight == null) { + this.room.getTaskManager().cancelTask("RainbowTask"); + return; + } + + this.colourIndex++; + + if (!HEX_COLOURS.containsKey(this.colourIndex)) { + this.colourIndex = 0; + } + + String hexColour = HEX_COLOURS.get(this.colourIndex); + + // 2,1,1,#0053F7,211 + // enable moodlight, preset id, background state, hex colour, strength (middle) + + String newCustomData = "2,1,1," + hexColour + ",211"; + + moodlight.setCustomData(newCustomData); + moodlight.updateStatus(); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/tasks/RollerCompleteTask.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/tasks/RollerCompleteTask.java new file mode 100644 index 0000000..aa37321 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/tasks/RollerCompleteTask.java @@ -0,0 +1,46 @@ +package org.alexdev.havana.game.room.tasks; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.room.Room; + +import java.util.Collection; +import java.util.Set; + +public class RollerCompleteTask implements Runnable { + private final Room room; + private final Collection rollingItems; + private final Set rollingEntities; + + public RollerCompleteTask(Collection rollingItems, Set rollingEntities, Room room) { + this.rollingItems = rollingItems; + this.rollingEntities = rollingEntities; + this.room = room; + } + + @Override + public void run() { + for (Item item : this.rollingItems) { + if (item.getRollingData() == null) { + continue; + } + + /*if (item.getRollingData().getHeightUpdate() > 0) { + item.getPosition().setZ(item.getPosition().getZ() + item.getRollingData().getHeightUpdate()); + this.room.send(new MOVE_FLOORITEM(item)); + }*/ + + item.setCurrentRollBlocked(false); + item.setRollingData(null); + } + + for (Entity entity : this.rollingEntities) { + if (entity.getRoomUser().getRollingData() == null) { + continue; + } + + entity.getRoomUser().invokeItem(null, true); + entity.getRoomUser().setRollingData(null); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/tasks/RollerTask.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/tasks/RollerTask.java new file mode 100644 index 0000000..cf72a93 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/tasks/RollerTask.java @@ -0,0 +1,141 @@ +package org.alexdev.havana.game.room.tasks; + +import org.alexdev.havana.game.GameScheduler; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.item.roller.EntityRollingAnalysis; +import org.alexdev.havana.game.item.roller.ItemRollingAnalysis; +import org.alexdev.havana.game.item.roller.RollerEntry; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.log.Log; +import org.alexdev.havana.messages.outgoing.rooms.items.SLIDEOBJECTBUNDLE; +import org.apache.commons.lang3.tuple.Pair; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +public class RollerTask implements Runnable { + private final Room room; + + public RollerTask(Room room) { + this.room = room; + } + + @Override + public void run() { + try { + Map> itemsRolling = new LinkedHashMap<>(); + Map> entitiesRolling = new LinkedHashMap<>(); + + List rollerEntries = new ArrayList<>(); + + ItemRollingAnalysis itemRollingAnalysis = new ItemRollingAnalysis(); + EntityRollingAnalysis entityRollingAnalysis = new EntityRollingAnalysis(); + + if (this.room.getItems().stream().anyMatch(item -> item.hasBehaviour(ItemBehaviour.ROLLER))) { + this.room.getMapping().regenerateCollisionMap(); + } + + for (Item roller : this.room.getItems()) { + if (roller.getTile() == null) { + continue; + } + + var rollerTile = roller.getTile(); + + if (!roller.hasBehaviour(ItemBehaviour.ROLLER)) { + continue; + } + + RollerEntry rollerEntry = new RollerEntry(roller); + + // Process items on rollers + for (Item item : rollerTile.getItems()) { + if (!item.getPosition().equals(rollerTile.getPosition())) { // Only roll items placed on the roller + continue; + } + + if (item.hasBehaviour(ItemBehaviour.ROLLER)) { + continue; + } + + if (itemsRolling.containsKey(item)) { + continue; + } + + Position nextPosition = itemRollingAnalysis.canRoll(item, roller, this.room); + + if (nextPosition != null) { + itemsRolling.put(item, Pair.of(roller, nextPosition)); + rollerEntry.getRollingItems().add(item.getRollingData()); + } + + } + + // Process entities on rollers + //for (Entity entity : roller.getTile().getEntities()) { + var rollerEntities = rollerTile.getEntireEntities(); + + if (rollerEntities != null && rollerEntities.size() > 0) { + var entity = rollerEntities.stream().findFirst().orElse(null); + + if (entitiesRolling.containsKey(entity)) { + continue; + } + + Position nextPosition = entityRollingAnalysis.canRoll(entity, roller, this.room); + + if (nextPosition != null) { + entitiesRolling.put(entity, Pair.of(roller, nextPosition)); + rollerEntry.setRollingEntity(entity); + } + } + //} + + // Roller entry has items or entities to roll so make sure the packet gets senr + if (rollerEntry.getRollingEntity() != null || rollerEntry.getRollingItems().size() > 0) { + rollerEntries.add(rollerEntry); + } + } + + // Perform roll animation for entity + for (var kvp : entitiesRolling.entrySet()) { + entityRollingAnalysis.doRoll(kvp.getKey(), kvp.getValue().getLeft(), this.room, kvp.getKey().getRoomUser().getPosition(), kvp.getValue().getRight()); + } + + // Perform roll animation for item + for (var kvp : itemsRolling.entrySet()) { + Item item = kvp.getKey(); + + if (!item.isCurrentRollBlocked()) { + itemRollingAnalysis.doRoll(kvp.getKey(), kvp.getValue().getLeft(), this.room, kvp.getKey().getPosition(), kvp.getValue().getRight()); + } + + item.save(); + } + + // Send roller packets + for (RollerEntry entry : rollerEntries) { + var rollingItems = new ArrayList<>(entry.getRollingItems()); + rollingItems.removeIf(item -> item.getItem().isCurrentRollBlocked()); + + var entityRollerData = entry.getRollingEntity() == null ? null : + (entry.getRollingEntity().getRoomUser() == null ? null : entry.getRollingEntity().getRoomUser().getRollingData()); + + this.room.send(new SLIDEOBJECTBUNDLE(entry.getRoller(), rollingItems, entityRollerData)); + } + + if (itemsRolling.size() > 0 || entitiesRolling.size() > 0) { + this.room.getMapping().regenerateCollisionMap(); + GameScheduler.getInstance().getService().schedule(new RollerCompleteTask(itemsRolling.keySet(), entitiesRolling.keySet(), this.room), 800, TimeUnit.MILLISECONDS); + } + } catch (Exception ex) { + Log.getErrorLogger().error("RollerTask crashed: ", ex); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/tasks/SpaceCafeTask.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/tasks/SpaceCafeTask.java new file mode 100644 index 0000000..64c29bd --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/tasks/SpaceCafeTask.java @@ -0,0 +1,114 @@ +package org.alexdev.havana.game.room.tasks; + +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.rooms.items.SHOWPROGRAM; + +import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; + +public class SpaceCafeTask implements Runnable { + public static final int FLIPBOARD_TIME = 60; + public static final int LIGHT_TIME = 5; + + private static final int[] FLIPBOARD_ORDER = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, }; + private final Room room; + + private int stageIndex; + private long timeToNextStage; + private long timeToNextLight; + + private int firstColour; + private int secondColour; + private int thirdColour; + + public SpaceCafeTask(Room room) { + this.room = room; + this.stageIndex = 2; + this.timeToNextStage = convertToInterval(FLIPBOARD_TIME); + this.timeToNextLight = convertToInterval(LIGHT_TIME); + } + + @Override + public void run() { + if (timeToNextStage > 0) { + timeToNextStage--; + } + + if (this.timeToNextStage == 0) { + processBoardFlip(); + } + + if (this.timeToNextLight > 0) { + this.timeToNextLight--; + } + + if (this.timeToNextLight == 0) { + this.processLightColor(); + } + } + + private void processLightColor() { + int[] numbers = new int[] {4, 1, 2}; + + int tempFirstColour = findNewColour(this.firstColour, numbers); + int tempSecondColour = findNewColour(this.secondColour, numbers); + int tempThirdColour = findNewColour(this.thirdColour, numbers); + + if (tempFirstColour != this.firstColour) { + this.firstColour = tempFirstColour; + this.room.send(new SHOWPROGRAM(new String[]{"lmpa", "ufol", String.valueOf(this.firstColour)})); + this.room.send(new SHOWPROGRAM(new String[]{"liga", "litecol", String.valueOf(this.firstColour)})); + } + + if (tempSecondColour != this.secondColour) { + this.secondColour = tempSecondColour; + this.room.send(new SHOWPROGRAM(new String[]{"lmpb", "ufol", String.valueOf(this.secondColour)})); + this.room.send(new SHOWPROGRAM(new String[]{"ligb", "litecol", String.valueOf(this.secondColour)})); + } + + if (tempThirdColour != this.thirdColour) { + this.thirdColour = tempThirdColour; + this.room.send(new SHOWPROGRAM(new String[]{"lmpc", "ufol", String.valueOf(this.thirdColour)})); + this.room.send(new SHOWPROGRAM(new String[]{"ligc", "litecol", String.valueOf(this.thirdColour)})); + } + + this.timeToNextLight = convertToInterval(LIGHT_TIME); + } + + private void processBoardFlip() { + this.stageIndex++; + + if (this.stageIndex >= FLIPBOARD_ORDER.length) { + this.stageIndex = 0; + } + + int previousBoard = this.stageIndex; + int nextBoard = (previousBoard + 1) >= FLIPBOARD_ORDER.length ? 0 : previousBoard + 1; + + room.send(new SHOWPROGRAM(new String[]{"flipflop" + FLIPBOARD_ORDER[previousBoard], "visible", String.valueOf(0)})); + room.send(new SHOWPROGRAM(new String[]{"flipflop" + FLIPBOARD_ORDER[nextBoard], "visible", String.valueOf(1)})); + + boolean isStillBoard = (previousBoard == 2 && nextBoard == 3) || (previousBoard == 5 && nextBoard == 6) || (previousBoard == 8 && nextBoard == 0); + + if (isStillBoard) { + this.timeToNextStage = convertToInterval(FLIPBOARD_TIME); + } else { + this.timeToNextStage = 1; + } + } + + public int findNewColour(int currentColour, int[] selection) { + return selection[ThreadLocalRandom.current().nextInt(0, selection.length)]; + /*int newColour = currentColour; + + while (newColour == currentColour) { + newColour = selection[ThreadLocalRandom.current().nextInt(0, selection.length)]; + } + + return newColour;*/ + } + + public static int convertToInterval(int seconds) { + return seconds * 2; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/tasks/StatusTask.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/tasks/StatusTask.java new file mode 100644 index 0000000..33da329 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/tasks/StatusTask.java @@ -0,0 +1,188 @@ +package org.alexdev.havana.game.room.tasks; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.RoomUserStatus; +import org.alexdev.havana.game.room.entities.RoomEntity; +import org.alexdev.havana.game.room.enums.StatusType; +import org.alexdev.havana.log.Log; +import org.alexdev.havana.messages.outgoing.rooms.user.TYPING_STATUS; +import org.alexdev.havana.util.DateUtil; + +import java.util.ArrayList; +import java.util.List; + +public class StatusTask implements Runnable { + private final Room room; + + public StatusTask(Room room) { + this.room = room; + } + + @Override + public void run() { + if (this.room.getEntities().size() == 0) { + return; + } + + for (Entity entity : this.room.getEntities()) { + if (entity != null) { + if (entity.getRoomUser().getRoom() != null && entity.getRoomUser().getRoom() == this.room) { + this.processEntity(entity); + } + } + } + } + + /** + * Process entity. + * + * @param entity the entity + */ + private void processEntity(Entity entity) { + try { + List toRemove = new ArrayList<>(); + + if (entity.getType() == EntityType.PLAYER || + entity.getType() == EntityType.BOT || + entity.getType() == EntityType.PET) { + + processHeadRotation(entity); + processPoolQueue(entity); + } + + if (entity.getType() == EntityType.PLAYER) { + processChatBubble((Player)entity); + } + + /*if (entity.getRoomUser().getDrinkCycleRefresh().get() != -1 && DateUtil.getCurrentTimeSeconds() >= entity.getRoomUser().getDrinkCycleRefresh().get()) { + if (entity.getRoomUser().getDrinkLoopCount().decrementAndGet() > 0) { + int loopCount = entity.getRoomUser().getDrinkLoopCount().get(); + entity.getRoomUser().carryItem(entity.getRoomUser().getCarryId(), entity.getRoomUser().getCarryName()); + entity.getRoomUser().getDrinkLoopCount().set(loopCount); + } else { + entity.getRoomUser().carryItem(0, null); + entity.getRoomUser().getDrinkCycleRefresh().set(-1); + entity.getRoomUser().getDrinkLoopCount().set(-1); + entity.getRoomUser().setNeedsUpdate(true); + } + }*/ + + for (var kvp : entity.getRoomUser().getStatuses().entrySet()) { + String key = kvp.getKey(); + RoomUserStatus rus = kvp.getValue(); + + if (rus.getActionSwitchCountdown() > 0) { + rus.setActionSwitchCountdown(rus.getActionSwitchCountdown() - 1); + } else if (rus.getActionSwitchCountdown() == 0) { + rus.setActionSwitchCountdown(-1); + rus.setActionCountdown(rus.getSecActionSwitch()); + + // Swap back to original key and update status + rus.swapKeyAction(); + entity.getRoomUser().setNeedsUpdate(true); + } + + if (rus.getActionCountdown() > 0) { + rus.setActionCountdown(rus.getActionCountdown() - 1); + } else if (rus.getActionCountdown() == 0) { + rus.setActionCountdown(-1); + rus.setActionSwitchCountdown(rus.getSecSwitchLifetime()); + + // Swap key to action and update status + rus.swapKeyAction(); + entity.getRoomUser().setNeedsUpdate(true); + } + + if (rus.getLifetimeCountdown() > 0) { + rus.setLifetimeCountdown(rus.getLifetimeCountdown() - 1); + } else if (rus.getLifetimeCountdown() == 0) { + rus.setLifetimeCountdown(-1); + toRemove.add(rus); + + entity.getRoomUser().setNeedsUpdate(true); + } + } + + boolean refreshUser = false; + + for (RoomUserStatus keyRemove : toRemove) { + entity.getRoomUser().getStatuses().remove(keyRemove.getKey().getStatusCode()); + + if (keyRemove.getKey() == StatusType.CARRY_DRINK) { + refreshUser = true; + } + } + + if (refreshUser) { + entity.getRoomUser().refreshUser(); + } + + } catch (Exception ex) { + Log.getErrorLogger().error("StatusTask crashed: ", ex); + } + } + + /** + * Make the user walk to the next tile on a pool lido queue, if they're in the diving deck and + * they have tickets. + * + * @param player the player to force walking + */ + public static void processPoolQueue(Entity player) { + if (player.getDetails().getTickets() == 0 || player.getDetails().getPoolFigure().isEmpty()) { + return; + } + + if (player.getRoomUser().getRoom() != null && !player.getRoomUser().getRoom().getModel().getName().equals("pool_b")) { + return; + } + + if (player.getRoomUser().isWalking()) { + return; + } + + var currentItem = player.getRoomUser().getCurrentItem(); + + if (currentItem != null) { + if (currentItem.getDefinition().getSprite().contains("queue_tile2")) { + Position front = currentItem.getPosition().getSquareInFront(); + player.getRoomUser().walkTo(front.getX(), front.getY()); + } + } + } + + /** + * Check the talk bubble timer expiry. + * + * @param player the player to check for + */ + public static void processChatBubble(Player player) { + if (player.getRoomUser().getTimerManager().getChatBubbleTimer() != -1 && + DateUtil.getCurrentTimeSeconds() > player.getRoomUser().getTimerManager().getChatBubbleTimer()) { + + player.getRoomUser().setTyping(false); + player.getRoomUser().getTimerManager().stopChatBubbleTimer(); + player.getRoomUser().getRoom().send(new TYPING_STATUS(player.getRoomUser().getInstanceId(), false)); + } + } + + + /** + * Check head rotation expiry. + * + * @param player the player to check for + */ + public static void processHeadRotation(Entity player) { + if (player.getRoomUser().getTimerManager().getLookTimer() != -1 && + DateUtil.getCurrentTimeSeconds() > player.getRoomUser().getTimerManager().getLookTimer()) { + + player.getRoomUser().getTimerManager().stopLookTimer(); + player.getRoomUser().getPosition().setHeadRotation(player.getRoomUser().getPosition().getBodyRotation()); + player.getRoomUser().setNeedsUpdate(true); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/song/Song.java b/Havana-Server/src/main/java/org/alexdev/havana/game/song/Song.java new file mode 100644 index 0000000..b34481c --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/song/Song.java @@ -0,0 +1,78 @@ +package org.alexdev.havana.game.song; + +public class Song { + private int id; + private String title; + private long itemId; + private int userId; + private String data; + private int slotId; + private boolean isBurnt; + + public Song() { } + + public Song(int id, String title, long itemId, int userId, int length, String data, boolean isBurnt) { + this.id = id; + this.title = title; + this.itemId = itemId; + this.userId = userId; + this.data = data; + this.isBurnt = isBurnt; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public long getItemId() { + return itemId; + } + + public void setItemId(int itemId) { + this.itemId = itemId; + } + + public int getUserId() { + return userId; + } + + public void setUserId(int userId) { + this.userId = userId; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public boolean isBurnt() { + return isBurnt; + } + + public void setBurnt(boolean burnt) { + isBurnt = burnt; + } + + public int getSlotId() { + return slotId; + } + + public void setSlotId(int slotId) { + this.slotId = slotId; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/song/SongPlaylist.java b/Havana-Server/src/main/java/org/alexdev/havana/game/song/SongPlaylist.java new file mode 100644 index 0000000..75e98c7 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/song/SongPlaylist.java @@ -0,0 +1,25 @@ +package org.alexdev.havana.game.song; + +public class SongPlaylist { + private long itemId; + private Song song; + private int slotId; + + public SongPlaylist(long itemId, Song song, int slotId) { + this.itemId = itemId; + this.song = song; + this.slotId = slotId; + } + + public long getItemId() { + return itemId; + } + + public Song getSong() { + return song; + } + + public int getSlotId() { + return slotId; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/song/jukebox/BurnedDisk.java b/Havana-Server/src/main/java/org/alexdev/havana/game/song/jukebox/BurnedDisk.java new file mode 100644 index 0000000..097c18f --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/song/jukebox/BurnedDisk.java @@ -0,0 +1,37 @@ +package org.alexdev.havana.game.song.jukebox; + +public class BurnedDisk { + private long itemId; + private int soundmachineId; + private int slotId; + private int songId; + private long burned; + + public BurnedDisk(long itemId, int soundmachineId, int slotId, int songId, long burned) { + this.itemId = itemId; + this.soundmachineId = soundmachineId; + this.slotId = slotId; + this.songId = songId; + this.burned = burned; + } + + public long getItemId() { + return itemId; + } + + public int getSoundmachineId() { + return soundmachineId; + } + + public int getSlotId() { + return slotId; + } + + public int getSongId() { + return songId; + } + + public long getBurned() { + return burned; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/song/jukebox/JukeboxManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/song/jukebox/JukeboxManager.java new file mode 100644 index 0000000..aa6574b --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/song/jukebox/JukeboxManager.java @@ -0,0 +1,45 @@ +package org.alexdev.havana.game.song.jukebox; + +import org.alexdev.havana.dao.mysql.JukeboxDao; +import org.alexdev.havana.dao.mysql.SongMachineDao; +import org.alexdev.havana.game.song.Song; + +import java.util.HashMap; +import java.util.Map; + +public class JukeboxManager { + private static JukeboxManager instance; + + /** + * Get the disks for the jukebox. + * + * @param soundmachineId the jukebox id + * @return the list of disks + */ + public Map getDisks(long soundmachineId) { + Map jukeboxDisks = new HashMap<>(); + + for (BurnedDisk burnedDisk : JukeboxDao.getDisks(soundmachineId)) { + Song song = SongMachineDao.getSong(burnedDisk.getSongId()); + + if (song != null) { + jukeboxDisks.put(burnedDisk, song); + } + } + + return jukeboxDisks; + } + + /** + * Get the instance of {@link JukeboxManager} + * + * @return the instance + */ + public static JukeboxManager getInstance() { + if (instance == null) { + instance = new JukeboxManager(); + } + + return instance; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/tags/HabboTag.java b/Havana-Server/src/main/java/org/alexdev/havana/game/tags/HabboTag.java new file mode 100644 index 0000000..854e9a1 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/tags/HabboTag.java @@ -0,0 +1,79 @@ +package org.alexdev.havana.game.tags; + +import org.alexdev.havana.dao.mysql.GroupDao; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.dao.mysql.TagDao; +import org.alexdev.havana.game.groups.Group; +import org.alexdev.havana.game.player.PlayerDetails; + +import java.util.ArrayList; +import java.util.List; + +public class HabboTag { + private final String tag; + private final int roomId; + private final int userId; + private final int groupId; + private Group groupData; + private PlayerDetails userData; + private List tagList; + + public HabboTag(String tag, int roomId, int userId, int groupId) { + this.tag = tag; + this.roomId = roomId; + this.userId = userId; + this.groupId = groupId; + this.tagList = new ArrayList<>(); + } + + public List getTagList() { + if (this.groupId > 0) { + this.getGroupData(); + } + + if (this.userId > 0) { + this.getUserData(); + } + + return tagList; + } + + + public String getTag() { + return tag; + } + + public int getRoomId() { + return roomId; + } + + public int getUserId() { + return userId; + } + + public int getGroupId() { + return groupId; + } + + public Group getGroupData() { + if (this.groupData == null) { + if (this.groupId > 0) { + this.groupData = GroupDao.getGroup(this.groupId); + this.tagList = TagDao.getGroupTags(this.groupId); + } + } + + return groupData; + } + + public PlayerDetails getUserData() { + if (this.userData == null) { + if (this.userId > 0) { + this.userData = PlayerDao.getDetails(this.userId); + this.tagList = TagDao.getUserTags(this.userId); + } + } + + return userData; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/texts/TextsManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/texts/TextsManager.java new file mode 100644 index 0000000..38130c1 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/texts/TextsManager.java @@ -0,0 +1,45 @@ +package org.alexdev.havana.game.texts; + +import org.alexdev.havana.dao.mysql.SettingsDao; + +import java.util.Map; + +public class TextsManager { + private static TextsManager instance; + private Map textsMap; + + public TextsManager() { + this.textsMap = SettingsDao.getTexts(); + } + + /** + * Get a external text value by key + * + * @param key the external text key to get + * @return the external text value + */ + public String getValue(String key) { + return this.textsMap.getOrDefault(key, key); + } + + /** + * Reload the texts manager + */ + public static void reset() { + instance = null; + TextsManager.getInstance(); + } + + /** + * Get the {@link TextsManager} instance + * + * @return the item manager instance + */ + public static TextsManager getInstance() { + if (instance == null) { + instance = new TextsManager(); + } + + return instance; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/triggers/GameLobbyTrigger.java b/Havana-Server/src/main/java/org/alexdev/havana/game/triggers/GameLobbyTrigger.java new file mode 100644 index 0000000..b969219 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/triggers/GameLobbyTrigger.java @@ -0,0 +1,30 @@ +package org.alexdev.havana.game.triggers; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.games.GameManager; +import org.alexdev.havana.game.games.enums.GameType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.games.GAMEPLAYERINFO; +import org.alexdev.havana.messages.outgoing.games.INSTANCELIST; +import org.alexdev.havana.messages.types.MessageComposer; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public abstract class GameLobbyTrigger extends GenericTrigger { + public void onRoomEntry(Entity entity, Room room, Object... customArgs) { } + public void onRoomLeave(Entity entity, Room room, Object... customArgs) { } + + public void showPoints(Player player, Room room) { + room.send(new GAMEPLAYERINFO(this.getGameType(), List.of(player))); + } + + public abstract void createGame(Player gameCreator, Map gameParameters); + public abstract GameType getGameType(); + + public MessageComposer getInstanceList() { + return new INSTANCELIST(GameManager.getInstance().getGamesByType(this.getGameType()), GameManager.getInstance().getLastPlayedGames(this.getGameType())); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/triggers/GenericTrigger.java b/Havana-Server/src/main/java/org/alexdev/havana/game/triggers/GenericTrigger.java new file mode 100644 index 0000000..08ad239 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/triggers/GenericTrigger.java @@ -0,0 +1,21 @@ +package org.alexdev.havana.game.triggers; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.entities.RoomEntity; + +public abstract class GenericTrigger { + public void onInteract(Player player, Room room, Item item, int status) { } + public void onItemPlaced(Player player, Room room, Item item) { } + public void onItemMoved(Player player, Room room, Item item, boolean isRotation, Position oldPosition, Item itemBelow, Item itemAbove) { } + public void onItemPickup(Player player, Room room, Item item) { } + public void onRoomEntry(Entity entity, Room room, boolean firstEntry, Object... customArgs) { } + public void onRoomLeave(Entity entity, Room room, Object... customArgs) { } + public void onEntityStep(Entity entity, RoomEntity roomEntity, Item item, Position oldPosition) { } + public void onEntityLeave(Entity entity, RoomEntity roomEntity, Item item, Position oldPosition) { } + public void onEntityStop(Entity entity, RoomEntity roomEntity, Item item, boolean isRotation) { } + public void onEntityLeave(Entity entity, RoomEntity roomEntity, Item item, Object... customArgs) { } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/wordfilter/WordfilterManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/wordfilter/WordfilterManager.java new file mode 100644 index 0000000..defd2b6 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/wordfilter/WordfilterManager.java @@ -0,0 +1,139 @@ +package org.alexdev.havana.game.wordfilter; + +import org.alexdev.havana.dao.mysql.BanDao; +import org.alexdev.havana.dao.mysql.WordfilterDao; +import org.alexdev.havana.game.ban.BanManager; +import org.alexdev.havana.game.ban.BanType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.config.GameConfiguration; + +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.concurrent.TimeUnit; + +public class WordfilterManager { + private static WordfilterManager instance; + private List bannedWords; + + public WordfilterManager() { + this.bannedWords = WordfilterDao.getBadWords(); + this.bannedWords.sort(Comparator.comparingInt((WordfilterWord word) -> word.getWord().length()).reversed()); + } + + /** + * Filter sentence, mandatory filtered words + * + * @param sentence the sentence to filter + * @return the filtered sentence + */ + public static boolean hasBannableSentence(Player player, String sentence) { + int minsSinceJoined = (int) Math.floor(TimeUnit.SECONDS.toMinutes((long) (DateUtil.getCurrentTimeSeconds() - Math.floor(player.getDetails().getJoinDate())))); + + if (minsSinceJoined > 30) { + return false; + } + + if (GameConfiguration.getInstance().getBoolean("wordfitler.enabled")) { + for (WordfilterWord filterWord : WordfilterManager.getInstance().getBannedWords()) { + if (!filterWord.isBannable()) { + continue; + } + + if (sentence.toLowerCase().contains(filterWord.getWord().toLowerCase())) { + return true; + } + } + } + + return false; + } + + /** + * Filter sentence, mandatory filtered words + * + * @param sentence the sentence to filter + * @return the filtered sentence + */ + public static String filterMandatorySentence(String sentence) { + if (GameConfiguration.getInstance().getBoolean("wordfitler.enabled")) { + for (WordfilterWord filterWord : WordfilterManager.getInstance().getBannedWords()) { + if (filterWord.isFilterable()) { + continue; + } + + var word = filterWord.getWord(); + + if (sentence.toLowerCase().contains(word.toLowerCase())) { + sentence = sentence.toLowerCase().replace(word.toLowerCase(), GameConfiguration.getInstance().getString("wordfilter.word.replacement")); + } + } + } + + return sentence; + } + + /** + * Filter sentence, if wordfilter is enabled. + * + * @param sentence the sentence to filter + * @return the filtered sentence + */ + public static String filterSentence(String sentence) { + if (GameConfiguration.getInstance().getBoolean("wordfitler.enabled")) { + for (WordfilterWord filterWord : WordfilterManager.getInstance().getBannedWords()) { + var word = filterWord.getWord(); + + if (sentence.toLowerCase().contains(word.toLowerCase())) { + sentence = sentence.toLowerCase().replace(word.toLowerCase(), GameConfiguration.getInstance().getString("wordfilter.word.replacement")); + } + } + } + + return sentence; + } + + /** + * Perform wordfiler ban + * @param player the player to ban + */ + public static void performBan(Player player) { + long in20Years = DateUtil.getCurrentTimeSeconds() + (TimeUnit.DAYS.toSeconds(365) * 20); + BanDao.addBan(BanType.USER_ID, String.valueOf(player.getDetails().getId()), in20Years, "Banned for breaking the Habbo Way", -1); + + BanManager.getInstance().disconnectBanAccounts(new HashMap<>() {{ + put(BanType.USER_ID, String.valueOf(player.getDetails().getId())); + }}); + } + + /** + * Get a list of banned words. + * + * @return the list of banned words + */ + public List getBannedWords() { + return bannedWords; + } + + /** + * Get the {@link WordfilterManager} instance + * + * @return the item manager instance + */ + public static WordfilterManager getInstance() { + if (instance == null) { + instance = new WordfilterManager(); + } + + return instance; + } + + /** + * Reloads the singleton for the {@link WordfilterManager}. + */ + public static void reset() { + instance = null; + getInstance(); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/wordfilter/WordfilterWord.java b/Havana-Server/src/main/java/org/alexdev/havana/game/wordfilter/WordfilterWord.java new file mode 100644 index 0000000..7bd09dd --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/wordfilter/WordfilterWord.java @@ -0,0 +1,25 @@ +package org.alexdev.havana.game.wordfilter; + +public class WordfilterWord { + private final String word; + private final boolean isBannable; + private final boolean isFilterable; + + public WordfilterWord(String word, boolean isBannable, boolean isFilterable) { + this.word = word; + this.isBannable = isBannable; + this.isFilterable = isFilterable; + } + + public String getWord() { + return word; + } + + public boolean isBannable() { + return isBannable; + } + + public boolean isFilterable() { + return isFilterable; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/log/Log.java b/Havana-Server/src/main/java/org/alexdev/havana/log/Log.java new file mode 100644 index 0000000..bb7b38e --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/log/Log.java @@ -0,0 +1,11 @@ +package org.alexdev.havana.log; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Log { + + public static Logger getErrorLogger() { + return LoggerFactory.getLogger("ErrorLogger"); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/MessageHandler.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/MessageHandler.java new file mode 100644 index 0000000..35c4f24 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/MessageHandler.java @@ -0,0 +1,664 @@ +package org.alexdev.havana.messages; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.RoomManager; +import org.alexdev.havana.log.Log; +import org.alexdev.havana.messages.incoming.catalogue.GET_ALIAS_LIST; +import org.alexdev.havana.messages.incoming.catalogue.GET_CATALOGUE_PAGE; +import org.alexdev.havana.messages.incoming.catalogue.GET_CATALOG_INDEX; +import org.alexdev.havana.messages.incoming.catalogue.GRPC; +import org.alexdev.havana.messages.incoming.club.GET_CLUB; +import org.alexdev.havana.messages.incoming.club.SCR_GIFT_APPROVAL; +import org.alexdev.havana.messages.incoming.club.SUBSCRIBE_CLUB; +import org.alexdev.havana.messages.incoming.ecotron.GET_RECYCLER_PRIZES; +import org.alexdev.havana.messages.incoming.ecotron.GET_RECYCLER_STATUS; +import org.alexdev.havana.messages.incoming.ecotron.RECYCLE_ITEMS; +import org.alexdev.havana.messages.incoming.effects.ACTIVATE_AVATAR_EFFECT; +import org.alexdev.havana.messages.incoming.effects.PURCHASE_AND_WEAR; +import org.alexdev.havana.messages.incoming.effects.USE_AVATAR_EFFECT; +import org.alexdev.havana.messages.incoming.events.*; +import org.alexdev.havana.messages.incoming.games.*; +import org.alexdev.havana.messages.incoming.handshake.*; +import org.alexdev.havana.messages.incoming.infobus.CHANGEWORLD; +import org.alexdev.havana.messages.incoming.infobus.TRYBUS; +import org.alexdev.havana.messages.incoming.infobus.VOTE; +import org.alexdev.havana.messages.incoming.inventory.GETSTRIP; +import org.alexdev.havana.messages.incoming.jukebox.*; +import org.alexdev.havana.messages.incoming.messenger.*; +import org.alexdev.havana.messages.incoming.moderation.*; +import org.alexdev.havana.messages.incoming.navigator.*; +import org.alexdev.havana.messages.incoming.pets.APPROVE_PET_NAME; +import org.alexdev.havana.messages.incoming.pets.GETPETSTAT; +import org.alexdev.havana.messages.incoming.purse.GETUSERCREDITLOG; +import org.alexdev.havana.messages.incoming.purse.REDEEM_VOUCHER; +import org.alexdev.havana.messages.incoming.rooms.*; +import org.alexdev.havana.messages.incoming.rooms.dimmer.MSG_ROOMDIMMER_CHANGE_STATE; +import org.alexdev.havana.messages.incoming.rooms.dimmer.MSG_ROOMDIMMER_GET_PRESETS; +import org.alexdev.havana.messages.incoming.rooms.dimmer.MSG_ROOMDIMMER_SET_PRESET; +import org.alexdev.havana.messages.incoming.rooms.idol.START_PERFORMANCE; +import org.alexdev.havana.messages.incoming.rooms.idol.VOTE_PERFORMANCE; +import org.alexdev.havana.messages.incoming.rooms.items.*; +import org.alexdev.havana.messages.incoming.rooms.moderation.*; +import org.alexdev.havana.messages.incoming.rooms.pool.*; +import org.alexdev.havana.messages.incoming.rooms.settings.*; +import org.alexdev.havana.messages.incoming.rooms.user.*; +import org.alexdev.havana.messages.incoming.songs.*; +import org.alexdev.havana.messages.incoming.trade.*; +import org.alexdev.havana.messages.incoming.tutorial.*; +import org.alexdev.havana.messages.incoming.user.*; +import org.alexdev.havana.messages.incoming.user.badges.GETAVAILABLEBADGES; +import org.alexdev.havana.messages.incoming.user.badges.GETSELECTEDBADGES; +import org.alexdev.havana.messages.incoming.user.badges.SETBADGE; +import org.alexdev.havana.messages.incoming.user.latency.PONG; +import org.alexdev.havana.messages.incoming.user.settings.GET_ACCOUNT_PREFERENCES; +import org.alexdev.havana.messages.incoming.wobblesquabble.PTM; +import org.alexdev.havana.messages.outgoing.rooms.groups.GROUP_BADGES; +import org.alexdev.havana.messages.outgoing.rooms.groups.GROUP_INFO; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.NettyPlayerNetwork; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.server.util.MalformedPacketException; +import org.alexdev.havana.util.config.ServerConfiguration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; + +public class MessageHandler { + private ConcurrentHashMap> messages; + + private static final Logger log = LoggerFactory.getLogger(MessageHandler.class); + private static MessageHandler instance; + + private MessageHandler() { + this.messages = new ConcurrentHashMap<>(); + + registerHandshakePackets(); + registerPursePackets(); + registerUserPackets(); + registerClubPackets(); + registerNavigatorPackets(); + registerRoomPackets(); + registerRoomUserPackets(); + registerRoomBadgesPackets(); + registerRoomPoolPackets(); + registerRoomSettingsPackets(); + registerRoomItemPackets(); + //registerRoomTeleporterPackets(); + registerModerationPackets(); + registerRoomModerationPackets(); + registerRoomEventPackets(); + registerMessengerPackets(); + registerCataloguePackets(); + registerInventoryPackets(); + registerTradePackets(); + registerSongPackets(); + registerGamePackets(); + //registerJoystick(); + registerEcotron(); + registerEffects(); + registerInfobus(); + registerPetPackets(); + registerJukeboxPackets(); + registerPollPackets(); + registerTutorPackets(); + + registerEvent(230, (player, reader) -> { + if (player.getRoomUser().getRoom() == null) { + return; + } + + Room room = player.getRoomUser().getRoom(); + HashMap groupBadges = new HashMap<>(); + + for (Player p : room.getEntityManager().getPlayers()) { + if (p.getDetails().getFavouriteGroupId() > 0) { + if (groupBadges.containsKey(p.getDetails().getFavouriteGroupId())) { + continue; + } + + var group = player.getJoinedGroup(p.getDetails().getFavouriteGroupId()); + + if (group == null) { + continue; + } + + groupBadges.put(group.getId(), group.getBadge()); + } + } + + player.send(new GROUP_BADGES(groupBadges)); + }); + + registerEvent(231, (player, reader) -> { + if (player.getRoomUser().getRoom() == null) { + return; + } + + int groupId = reader.readInt(); + + Room room = player.getRoomUser().getRoom(); + + for (Player p : room.getEntityManager().getPlayers()) { + var group = p.getJoinedGroup(groupId); + + if (group == null) { + continue; + } + + player.send(new GROUP_INFO(group)); + break; + } + }); + } + + /** + * Register games packets + */ + private void registerGamePackets() { + registerEvent(159, new GETINSTANCELIST()); + registerEvent(160, new OBSERVEINSTANCE()); + registerEvent(161, new UNOBSERVEINSTANCE()); + registerEvent(162, new INITIATECREATEGAME()); + registerEvent(163, new GAMEPARAMETERVALUES()); + registerEvent(165, new INITIATEJOINGAME()); + registerEvent(167, new LEAVEGAME()); + registerEvent(168, new KICKPLAYER()); + registerEvent(169, new WATCHGAME()); + registerEvent(170, new STARTGAME()); + registerEvent(171, new GAMEEVENT()); + registerEvent(172, new GAMERESTART()); + registerEvent(250, new REQUEST_GAME_LOBBY()); + registerEvent(173, new REQUESTFULLGAMESTATUS()); + /*registerEvent(173, (player, reader) -> { + List objects = new ArrayList<>(); + objects.add(new SnowStormSpawnPlayerEvent(player.getRoomUser().getGamePlayer())); + + GamePlayer gamePlayer = player.getRoomUser().getGamePlayer(); + SnowStormGame game = (SnowStormGame) gamePlayer.getGame(); + + gamePlayer.getTurnContainer().calculateChecksum(objects); + gamePlayer.getTurnContainer().getCurrentTurn().incrementAndGet(); + + player.send(new SNOWSTORM_GAMESTATUS((SnowStormGame) game, List.of(), gamePlayer));//.compose(response); + });*/ + } + + /** + * Register handshake packets. + */ + private void registerHandshakePackets() { + registerEvent(206, new INIT_CRYPTO()); + registerEvent(2002, new GENERATEKEY()); + registerEvent(204, new SSO()); + registerEvent(415, new SSO()); + registerEvent(4, new TRY_LOGIN()); + registerEvent(756, new TRY_LOGIN()); + registerEvent(1817, new GET_SESSION_PARAMETERS()); + registerEvent(813, new UNIQUEID()); + registerEvent(1170, new VERSIONCHECK()); + } + + /** + * Register purse packets. + */ + private void registerPursePackets() { + registerEvent(8, new GET_CREDITS()); + registerEvent(127, new GETUSERCREDITLOG()); + registerEvent(129, new REDEEM_VOUCHER()); + } + + /** + * Register general purpose user packets. + */ + private void registerUserPackets() { + registerEvent(7, new GET_INFO()); + registerEvent(228, new GET_ACCOUNT_PREFERENCES()); + registerEvent(196, new PONG()); + registerEvent(370, new GET_POSSIBLE_ACHIEVEMENTS()); + registerEvent(360, new GET_IGNORE_LIST()); + registerEvent(319, new IGNORE_USER()); + registerEvent(322, new UNIGNORE_USER()); + //registerEvent(315, new TEST_LATENCY()); + } + + private void registerClubPackets() { + registerEvent(26, new GET_CLUB()); + registerEvent(190, new SUBSCRIBE_CLUB()); + registerEvent(210, new SCR_GIFT_APPROVAL()); + } + + /** + * Register navigator packets. + */ + private void registerNavigatorPackets() { + registerEvent(150, new NAVIGATE()); + registerEvent(16, new SUSERF()); + registerEvent(151, new GETUSERFLATCATS()); + registerEvent(264, new RECOMMENDED_ROOMS()); + registerEvent(17, new SRCHF()); + registerEvent(154, new GETSPACENODEUSERS()); + registerEvent(18, new GETFVRF()); + registerEvent(19, new ADD_FAVORITE_ROOM()); + registerEvent(20, new DEL_FAVORITE_ROOM()); + } + + /** + * Register room packets. + */ + private void registerRoomPackets() { + registerEvent(57, new TRYFLAT()); + registerEvent(59, new GOTOFLAT()); + registerEvent(182, new GETINTEREST()); + registerEvent(2, new ROOM_DIRECTORY()); + registerEvent(126, new GETROOMAD()); + registerEvent(60, new G_HMAP()); + registerEvent(394, new GET_FLOORMAP()); + registerEvent(62, new G_OBJS()); + registerEvent(61, new G_USRS()); + registerEvent(64, new G_STAT()); + registerEvent(63, new G_ITEMS()); + registerEvent(98, new LETUSERIN()); + registerEvent(261, new RATEFLAT()); + } + + /** + * Register room user packets. + */ + private void registerRoomUserPackets() { + registerEvent(53, new QUIT()); + registerEvent(75, new WALK()); + registerEvent(115, new GOAWAY()); + registerEvent(52, new CHAT()); + registerEvent(55, new SHOUT()); + registerEvent(56, new WHISPER()); + registerEvent(317, new USER_START_TYPING()); + registerEvent(318, new USER_CANCEL_TYPING()); + registerEvent(79, new LOOKTO()); + registerEvent(80, new CARRYDRINK()); + registerEvent(87, new CARRYITEM()); + registerEvent(94, new WAVE()); + registerEvent(93, new DANCE()); + registerEvent(88, new STOP()); + registerEvent(229, new SET_SOUND_SETTING()); + registerEvent(117, new IIM()); + registerEvent(371, new RESPECT_USER()); + registerEvent(114, new PTM()); + registerEvent(263, new GET_USER_TAGS()); + } + + + /** + * Register room badges packets; + */ + private void registerRoomBadgesPackets() { + registerEvent(157, new GETAVAILABLEBADGES()); + registerEvent(158, new SETBADGE()); + registerEvent(159, new GETSELECTEDBADGES()); + } + + /** + * Register room settings packets. + */ + private void registerRoomSettingsPackets() { + registerEvent(21, new GETFLATINFO()); + registerEvent(29, new CREATEFLAT()); + registerEvent(25, new SETFLATINFO()); + registerEvent(24, new UPDATEFLAT()); + registerEvent(153, new SETFLATCAT()); + registerEvent(152, new GETFLATCAT()); + registerEvent(23, new DELETEFLAT()); + } + + /** + * Register room item packets. + */ + private void registerRoomItemPackets() { + registerEvent(90, new PLACESTUFF()); + registerEvent(73, new MOVESTUFF()); + registerEvent(67, new ADDSTRIPITEM()); + registerEvent(83, new G_IDATA()); + registerEvent(89, new USEITEM()); + registerEvent(84, new SETITEMDATA()); + registerEvent(393, new USEWALLITEM()); + registerEvent(85, new REMOVEITEM()); + registerEvent(183, new CONVERT_FURNI_TO_CREDITS()); + registerEvent(76, new THROW_DICE()); + registerEvent(77, new DICE_OFF()); + registerEvent(247, new SPIN_WHEEL_OF_FORTUNE()); + registerEvent(341, new MSG_ROOMDIMMER_GET_PRESETS()); + registerEvent(342, new MSG_ROOMDIMMER_SET_PRESET()); + registerEvent(343, new MSG_ROOMDIMMER_CHANGE_STATE()); + registerEvent(78, new PRESENTOPEN()); + registerEvent(392, new USEFURNITURE()); + registerEvent(314, new SET_RANDOM_STATE()); + registerEvent(232, new ENTER_ONEWAY_DOOR()); + registerEvent(410, new START_PERFORMANCE()); + registerEvent(411, new VOTE_PERFORMANCE()); + } + + /** + * Register room pool packets. + */ + private void registerRoomPoolPackets() { + registerEvent(116, new SWIMSUIT()); + registerEvent(108, new CLOSE_UIMAKOPPI()); + registerEvent(104, new SIGN()); + registerEvent(105, new BTCKS()); + registerEvent(106, new DIVE()); + registerEvent(107, new SPLASH_POSITION()); + } + + /** + * Register moderation packets + */ + private void registerModerationPackets() { + registerEvent(200, new MODERATORACTION()); + registerEvent(237, new REQUEST_CFH()); + registerEvent(86, new SUBMIT_CFH()); + registerEvent(48, new PICK_CALLFORHELP()); + registerEvent(199, new MESSAGETOCALLER()); + registerEvent(198, new CHANGECALLCATEGORY()); + registerEvent(238, new DELETE_CRY()); + registerEvent(323, new FOLLOW_CRYFORHELP()); + } + + /** + * Register room moderation packets + */ + private void registerRoomModerationPackets() { + registerEvent(95, new KICK()); + registerEvent(96, new ASSIGNRIGHTS()); + registerEvent(97, new REMOVERIGHTS()); + registerEvent(155, new REMOVEALLRIGHTS()); + registerEvent(320, new BANUSER()); + } + + /** + * Register room trade packets + */ + private void registerTradePackets() { + registerEvent(71, new TRADE_OPEN()); + registerEvent(72, new TRADE_ADDITEM()); + registerEvent(70, new TRADE_CLOSE()); + registerEvent(69, new TRADE_ACCEPT()); + registerEvent(68, new TRADE_UNACCEPT()); + registerEvent(402, new TRADE_CONFIRM_ACCEPT()); + registerEvent(403, new TRADE_UNACCEPT()); + registerEvent(405, new TRADE_REMOVE_ITEM()); + } + + /** + * Register messenger packets. + */ + private void registerMessengerPackets() { + registerEvent(12, new MESSENGERINIT()); + registerEvent(41, new FINDUSER()); + registerEvent(39, new MESSENGER_REQUESTBUDDY()); + registerEvent(38, new MESSENGER_DECLINEBUDDY()); + registerEvent(37, new MESSENGER_ACCEPTBUDDY()); + registerEvent(233, new MESSENGER_GETREQUESTS()); + //registerEvent(191, new MESSENGER_GETMESSAGES()); + //registerEvent(36, new MESSENGER_ASSIGNPERSMSG()); + registerEvent(40, new MESSENGER_REMOVEBUDDY()); + registerEvent(33, new MESSENGER_SENDMSG()); + registerEvent(32, new MESSENGER_MARKREAD()); + registerEvent(262, new FOLLOW_FRIEND()); + registerEvent(15, new FRIENDLIST_UPDATE()); + registerEvent(34, new INVITE_FRIEND()); + } + + /** + * Register catalogue packets + */ + private void registerCataloguePackets() { + registerEvent(101, new GET_CATALOG_INDEX()); + registerEvent(102, new GET_CATALOGUE_PAGE()); + registerEvent(100, new GRPC()); + registerEvent(215, new GET_ALIAS_LIST()); + } + + /** + * Register inventory packets. + */ + private void registerInventoryPackets() { + registerEvent(65, new GETSTRIP()); + registerEvent(66, new FLATPROPBYITEM()); + + // Flash + registerEvent(404, new GETSTRIP()); + } + + /** + * Register song packets. + */ + private void registerSongPackets() { + registerEvent(244, new GET_SONG_LIST()); + registerEvent(246, new GET_SONG_LIST()); + registerEvent(239, new NEW_SONG()); + registerEvent(219, new INSERT_SOUND_PACKAGE()); + registerEvent(220, new EJECT_SOUND_PACKAGE()); + registerEvent(240, new SAVE_SONG_NEW()); + registerEvent(243, new UPDATE_PLAY_LIST()); + registerEvent(221, new GET_SONG_INFO()); + registerEvent(245, new GET_PLAY_LIST()); + registerEvent(248, new DELETE_SONG()); + registerEvent(241, new EDIT_SONG()); + registerEvent(242, new SAVE_SONG_EDIT()); + registerEvent(254, new BURN_SONG()); + } + + /** + * Register effect packets + */ + private void registerEffects() { + registerEvent(372, new USE_AVATAR_EFFECT()); + registerEvent(373, new ACTIVATE_AVATAR_EFFECT()); + registerEvent(374, new PURCHASE_AND_WEAR()); + } + + /** + * Register recycler packets + */ + private void registerEcotron() { + registerEvent(414, new RECYCLE_ITEMS()); + registerEvent(413, new GET_RECYCLER_STATUS()); + registerEvent(412, new GET_RECYCLER_PRIZES()); + } + + /** + * Register infobus packets + */ + private void registerInfobus() { + registerEvent(111, new CHANGEWORLD()); + registerEvent(112, new VOTE()); + registerEvent(113, new TRYBUS()); + } + + /** + * Register room event packets + */ + private void registerRoomEventPackets() { + registerEvent(345, new CAN_CREATE_ROOMEVENT()); + registerEvent(346, new CREATE_ROOMEVENT()); + registerEvent(348, new EDIT_ROOMEVENT()); + registerEvent(347, new QUIT_ROOMEVENT()); + registerEvent(349, new GET_ROOMEVENT_TYPE_COUNT()); + registerEvent(350, new GET_ROOMEVENTS_BY_TYPE()); + } + + /** + * Register pet packets. + */ + private void registerPetPackets() { + registerEvent(42, new APPROVE_PET_NAME()); + registerEvent(128, new GETPETSTAT()); + } + + /** + * Register jukebox packets. + */ + private void registerJukeboxPackets() { + registerEvent(258, new GET_JUKEBOX_DISCS()); + registerEvent(259, new GET_USER_SONG_DISCS()); + registerEvent(255, new ADD_JUKEBOX_DISC()); + registerEvent(256, new REMOVE_JUKEBOX_DISC()); + registerEvent(257, new JUKEBOX_PLAYLIST_ADD()); + registerEvent(260, new RESET_JUKEBOX()); + } + + /** + * Register polling packets. + */ + private void registerPollPackets() { + //registerEvent(234, new POLL_START()); + } + + /** + * Register tutor packets. + */ + private void registerTutorPackets() { + registerEvent(356, new MSG_INVITE_TUTORS()); + registerEvent(355, new MSG_GET_TUTORS_AVAILABLE()); + registerEvent(362, new MSG_WAIT_FOR_TUTOR_INVITATIONS()); + registerEvent(363, new MSG_CANCEL_WAIT_FOR_TUTOR_INVITATIONS()); + registerEvent(313, new MSG_REMOVE_ACCOUNT_HELP_TEXT()); + registerEvent(357, new MSG_ACCEPT_TUTOR_INVITATION()); + registerEvent(358, new MSG_REJECT_TUTOR_INVITATION()); + registerEvent(359, new MSG_CANCEL_TUTOR_INVITATIONS()); + registerEvent(249, new RESET_TUTORIAL()); + } + + /** + * Register event. + * + * @param header the header + * @param messageEvent the message event + */ + private void registerEvent(int header, MessageEvent messageEvent) { + if (!this.messages.containsKey(header)) { + this.messages.put(header, new ArrayList<>()); + } + + + this.messages.get(header).add(messageEvent); + } + + /** + * Handle request. + * + * @param message the message + */ + public void handleRequest(Player player, NettyRequest message) { + if (ServerConfiguration.getBoolean("log.received.packets")) { + if (this.messages.containsKey(message.getHeaderId())) { + MessageEvent event = this.messages.get(message.getHeaderId()).get(0); + player.getLogger().info("Received ({}): {} / {}", event.getClass().getSimpleName(), message.getHeaderId(), message.getMessageBody()); + } else { + player.getLogger().info("Received ({}): {} / {}", "Unknown", message.getHeaderId(), message.getMessageBody()); + } + } + + invoke(player, message.getHeaderId(), message); + } + + /** + * Invoke the request. + * + * @param messageId the message id + * @param message the message + */ + private void invoke(Player player, int messageId, NettyRequest message) { + ByteBuf byteBuf = null; + + if (this.messages.containsKey(messageId)) { + List events = this.messages.get(messageId); + + for (var event : events) { + if (events.size() > 0) { + NettyRequest nettyRequest = null; + + try { + nettyRequest = new NettyRequest(messageId, Unpooled.copiedBuffer(message.remainingBytes())); + event.handle(player, nettyRequest); + } catch (Exception ex) { + handlePacketException(player, ex, message); + } finally { + if (nettyRequest != null) { + nettyRequest.dispose(); + } + } + } else { + try { + event.handle(player, message); + } catch (Exception ex) { + handlePacketException(player, ex, message); + } + } + } + } + } + + /** + * Global exception handler for packet errors. + * + * @param player the player where the error occurred + * @param ex the exception message + * @param message the message that was sent to the server + */ + private void handlePacketException(Player player, Exception ex, NettyRequest message) { + String name = "[NOT LOGGED IN/" + NettyPlayerNetwork.getIpAddress(player.getNetwork().getChannel()) + "]"; + + if (player.isLoggedIn()) { + name = player.getDetails().getName(); + } + + if (ex instanceof MalformedPacketException) { + ex.printStackTrace(); + //Log.getErrorLogger().error("An invalid packet was sent to the server by " + name + ", kicking off client."); + //Log.getErrorLogger().error("Packet contents: " + message.getHeaderId() + " / " + message.getMessageBody()); + /*if (GameConfiguration.getInstance().getBoolean("enforce.strict.packet.policy")) { + long banExpiry = DateUtil.getCurrentTimeSeconds() + TimeUnit.MINUTES.toSeconds(60); + BanDao.addBan(BanType.USER_ID, String.valueOf(player.getDetails().getId()), banExpiry, "Automatic ban for scripting (temporary 1 hr / 60 minute ban)"); + + BanManager.getInstance().disconnectBanAccounts(new HashMap<>() {{ + put(BanType.USER_ID, String.valueOf(player.getDetails().getId())); + }}); + } else { + player.getNetwork().disconnect(); + }*/ + return; + } + + Log.getErrorLogger().error("Error occurred when handling (" + message.getHeaderId() + ") for user (" + name + "):", ex); + //Log.getErrorLogger().error("Packet contents: " + message.getHeaderId() + " / " + message.getHeader() + " / " + message.getMessageBody()); + } + + /** + * Gets the messages. + * + * @return the messages + */ + private ConcurrentHashMap> getMessages() { + return messages; + } + + /** + * Get the instance of {@link RoomManager} + * + * @return the instance + */ + public static MessageHandler getInstance() { + if (instance == null) { + instance = new MessageHandler(); + } + + return instance; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/catalogue/GET_ALIAS_LIST.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/catalogue/GET_ALIAS_LIST.java new file mode 100644 index 0000000..e4137d6 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/catalogue/GET_ALIAS_LIST.java @@ -0,0 +1,15 @@ +package org.alexdev.havana.messages.incoming.catalogue; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.catalogue.ALIAS_TOGGLE; +import org.alexdev.havana.messages.outgoing.catalogue.SPRITE_LIST; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class GET_ALIAS_LIST implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + player.send(new SPRITE_LIST()); + player.send(new ALIAS_TOGGLE()); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/catalogue/GET_CATALOGUE_PAGE.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/catalogue/GET_CATALOGUE_PAGE.java new file mode 100644 index 0000000..1cd4616 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/catalogue/GET_CATALOGUE_PAGE.java @@ -0,0 +1,65 @@ +package org.alexdev.havana.messages.incoming.catalogue; + +import org.alexdev.havana.game.catalogue.CatalogueItem; +import org.alexdev.havana.game.catalogue.CatalogueManager; +import org.alexdev.havana.game.catalogue.CataloguePage; +import org.alexdev.havana.game.catalogue.collectables.CollectablesManager; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.catalogue.CATALOGUE_PAGE; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.util.config.GameConfiguration; + +import java.util.List; + +public class GET_CATALOGUE_PAGE implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + CataloguePage cataloguePage = CatalogueManager.getInstance().getCataloguePage(reader.readInt()); + + if (cataloguePage == null) { + return; + } + + if (!cataloguePage.isNavigatable()) { + return; + } + + if (cataloguePage.isClubOnly() && !player.getDetails().hasClubSubscription()) { + return; + } + + if (!cataloguePage.isValidSeasonal()) { + return; + } + + if (player.getDetails().getRank().getRankId() >= cataloguePage.getMinRole().getRankId()) { + if (GameConfiguration.getInstance().getInteger("rare.cycle.page.id") == cataloguePage.getId()) { + if (GameConfiguration.getInstance().getBoolean("rare.cycle.pixels.only")) { + cataloguePage.setLayout("pixelrent"); + } else { + cataloguePage.setLayout("cars"); + } + } + + if (CollectablesManager.getInstance().getCollectableDataByPage(cataloguePage.getId()) != null) { + var item = CollectablesManager.getInstance().getCollectableDataByPage(cataloguePage.getId()).getActiveItem(); + + if (item != null) { + cataloguePage = cataloguePage.copy(); + + if (item.getPricePixels() > 0 && item.getPriceCoins() > 0) { + cataloguePage.setLayout("cars"); + } else if (item.getPriceCoins() > 0 && item.getPricePixels() <= 0) { + cataloguePage.setLayout("default_3x3"); + } else if (item.getPricePixels() > 0 && item.getPriceCoins() <= 0) { + cataloguePage.setLayout("pixelrent"); + } + } + } + + List catalogueItemList = CatalogueManager.getInstance().getCataloguePageItems(cataloguePage.getId(), false); + player.send(new CATALOGUE_PAGE(cataloguePage, catalogueItemList)); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/catalogue/GET_CATALOG_INDEX.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/catalogue/GET_CATALOG_INDEX.java new file mode 100644 index 0000000..da6b16c --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/catalogue/GET_CATALOG_INDEX.java @@ -0,0 +1,15 @@ +package org.alexdev.havana.messages.incoming.catalogue; + +import org.alexdev.havana.game.catalogue.CatalogueManager; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.catalogue.CATALOGUE_PAGES; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class GET_CATALOG_INDEX implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) { + player.send(new CATALOGUE_PAGES(player.getDetails().getRank().getRankId(), player.getDetails().hasClubSubscription(), + CatalogueManager.getInstance().getChildPages(-1, player.getDetails().getRank().getRankId(), player.getDetails().hasClubSubscription()))); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/catalogue/GRPC.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/catalogue/GRPC.java new file mode 100644 index 0000000..b8d856c --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/catalogue/GRPC.java @@ -0,0 +1,318 @@ +package org.alexdev.havana.messages.incoming.catalogue; + +import org.alexdev.havana.dao.mysql.CurrencyDao; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.dao.mysql.TransactionDao; +import org.alexdev.havana.game.catalogue.CatalogueItem; +import org.alexdev.havana.game.catalogue.CatalogueManager; +import org.alexdev.havana.game.catalogue.CataloguePackage; +import org.alexdev.havana.game.catalogue.CataloguePage; +import org.alexdev.havana.game.catalogue.collectables.CollectablesManager; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.ItemManager; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.item.base.ItemDefinition; +import org.alexdev.havana.game.item.interactors.InteractionType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.game.room.managers.RoomTradeManager; +import org.alexdev.havana.game.texts.TextsManager; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; +import org.alexdev.havana.messages.outgoing.alerts.NO_USER_FOUND; +import org.alexdev.havana.messages.outgoing.catalogue.NO_CREDITS; +import org.alexdev.havana.messages.outgoing.openinghours.INFO_HOTEL_CLOSING; +import org.alexdev.havana.messages.outgoing.user.currencies.ActivityPointNotification; +import org.alexdev.havana.messages.outgoing.user.currencies.CREDIT_BALANCE; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.NettyPlayerNetwork; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.server.util.MalformedPacketException; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.HexValidator; +import org.alexdev.havana.util.StringUtil; +import org.alexdev.havana.util.config.GameConfiguration; +import org.apache.commons.lang3.StringUtils; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +public class GRPC implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws SQLException, MalformedPacketException { + reader.readInt(); + + if (PlayerManager.getInstance().isMaintenance()) { + player.send(new INFO_HOTEL_CLOSING(PlayerManager.getInstance().getMaintenanceAt())); + return; + } + + CatalogueItem item = CatalogueManager.getInstance().getCatalogueItem(reader.readInt()); + + if (item == null || item.isHidden()) { + System.out.println("Failed to buy reason (" + player.getDetails().getName() + "): 0"); + return; + } + + final CatalogueItem finalItem = item; + CatalogueItem seasonalItem = CatalogueManager.getInstance().getSeasonalItems().stream() + .filter(seasonal -> seasonal.getId() == finalItem.getId()).findFirst().orElse(null); + + if (seasonalItem != null) { + item = seasonalItem; + } else { + // If the item is not a buyable special rare, then check if they can actually buy it + if (!CollectablesManager.getInstance().isCollectable(item)) { + CataloguePage page = CatalogueManager.getInstance().getCataloguePages().stream().filter(p -> finalItem.hasPage(p.getId())).findFirst().orElse(null); + + if (page == null) {// || pageStream.get().getMinRole().getRankId() > player.getDetails().getRank().getRankId()) { + return; + } + + if (page.getMinRole().getRankId() > player.getDetails().getRank().getRankId()) { + return; + } + + if (page.isClubOnly() && !player.getDetails().hasClubSubscription()) { + return; + } + } + } + + List items = new ArrayList<>(); + + int priceCoins = item.getPriceCoins(); + int pricePixels = item.getPricePixels(); + + if (!(player.getDetails().getRank().getRankId() >= PlayerRank.COMMUNITY_MANAGER.getRankId())) { + if (CollectablesManager.getInstance().isCollectable(item)) { + priceCoins = CollectablesManager.getInstance().getCollectableDataByItem(item.getId()).getActiveItem().getPriceCoins(); + pricePixels = CollectablesManager.getInstance().getCollectableDataByItem(item.getId()).getActiveItem().getPricePixels(); + } + } + + if (priceCoins > player.getDetails().getCredits()) { + player.send(new NO_CREDITS(true, false)); + return; + } + + if (pricePixels > player.getDetails().getPixels()) { + player.send(new NO_CREDITS(false, true)); + return; + } + + /*player.send(new ActivityPointNotification(player.getDetails().getPixels(), ActivityPointNotification.ActivityPointAlertType.PIXELS_RECEIVED)); // Alert pixels received*/ + + String extraData = reader.readString(); + boolean isGift = reader.readBoolean(); + + String giftedUser = null; + PlayerDetails giftedUserDetails = null; + + if (isGift) { // It's a gift! + giftedUser = reader.readString(); + + if (player.getDetails().getRank().getRankId() < PlayerRank.MODERATOR.getRankId() && !giftedUser.equalsIgnoreCase(player.getDetails().getName())) { + if ((player.getRoomUser().getLastGiftTime() + TimeUnit.MINUTES.toSeconds(1)) > DateUtil.getCurrentTimeSeconds()) { + player.send(new ALERT("Not so fast! Please wait until you can send a gift again.")); + return; + } + } + + + giftedUserDetails = PlayerManager.getInstance().getPlayerData(PlayerDao.getId(giftedUser)); + + //if (!data[6].toLowerCase().equals(player.getDetails().getName().toLowerCase())) { + if (giftedUserDetails == null) { + player.send(new NO_USER_FOUND(giftedUser)); + return; + } + //} + + if (!player.hasFuse(Fuseright.MUTE) && giftedUserDetails.getId() != player.getDetails().getId()) { + if (player.getDetails().isTradeBanned()) { + player.send(new ALERT(RoomTradeManager.showTradeBanAlert(player))); + return; + } + } + + // Giving credits to self on same IP is suspicious behaviour + if (item.getDefinition() != null) { + if (item.getDefinition().hasBehaviour(ItemBehaviour.EFFECT)) { + return; + } + + //if (item.getDefinition().hasBehaviour(ItemBehaviour.REDEEMABLE)) { + if (!player.hasFuse(Fuseright.MUTE) + && giftedUserDetails.getId() != player.getDetails().getId()) { + RoomTradeManager.addTradeBan(player); + return; + } + //} + } + + String presentNote = reader.readString(); + + if (presentNote == null || presentNote.isEmpty()) { + presentNote = ""; + } + + extraData = extraData.replace(Item.PRESENT_DELIMETER, ""); + presentNote = presentNote.replace(Item.PRESENT_DELIMETER, ""); + + if (!item.getItemSpecialId().isBlank() && StringUtils.isNumeric(item.getItemSpecialId())) { + extraData = item.getItemSpecialId(); + } + + Item present = ItemManager.getInstance().createGift(giftedUserDetails.getId(), player.getDetails().getName(), item.getSaleCode(), StringUtil.filterInput(presentNote, true), extraData);//new Item(); + Player receiver = PlayerManager.getInstance().getPlayerById(giftedUserDetails.getId()); + + if (receiver != null) { + receiver.getInventory().addItem(present); + receiver.getInventory().getView("new"); + //receiver.send(new ITEM_DELIVERED()); + } + + items.add(present); + player.send(new ALERT(TextsManager.getInstance().getValue("successfully_purchase_gift_for").replace("%user%", giftedUserDetails.getName()))); + player.getRoomUser().setLastGiftTime(DateUtil.getCurrentTimeSeconds()); + //player.send(new DELIVER_PRESENT(present)); + } else { + if (!item.isPackage() && + item.getDefinition() != null && + item.getDefinition().getInteractionType() == InteractionType.PET_NEST) { + if (extraData != null) { + String[] petData = extraData.split(Character.toString((char) 10)); + String hex = petData[2]; + + if (hex.length() > 6) { + hex = hex.substring(0, 6); + } + + String color = StringUtil.filterInput(hex, true); + + if (!HexValidator.validate(color)) { + return; + } + } + } + + items = CatalogueManager.getInstance().purchase(player.getDetails(), item, extraData, null, DateUtil.getCurrentTimeSeconds()); + + // Don't charge if nothing was given. + var itemDefinition = item.getDefinition(); + if (items.size() == 0 && !(itemDefinition != null && (itemDefinition.hasBehaviour(ItemBehaviour.EFFECT) || itemDefinition.getSprite().equals("film")))) + return; + + boolean showItemDelivered = player.getRoomUser().getRoom() != null; + + // Don't send item delivered if they just buy film + if (item.getDefinition() != null && item.getDefinition().getSprite().equals("film")) { + showItemDelivered = false; + } + + if (item.getDefinition() != null && item.getDefinition().hasBehaviour(ItemBehaviour.EFFECT)) { + showItemDelivered = false; + } + + if (showItemDelivered) { + //player.send(new ITEM_DELIVERED()); + player.getInventory().getView("new"); + } + } + + if (priceCoins > 0) { + CurrencyDao.decreaseCredits(player.getDetails(), priceCoins); + player.send(new CREDIT_BALANCE(player.getDetails().getCredits())); + } + + if (pricePixels > 0) { + CurrencyDao.decreasePixels(player.getDetails(), pricePixels); + player.send(new ActivityPointNotification(player.getDetails().getPixels(), ActivityPointNotification.ActivityPointAlertType.PIXELS_SOUND)); + } + + String transactionDscription = getTransactionDescription(item); + + if (transactionDscription != null) { + boolean isCollectable = CollectablesManager.getInstance().isCollectable(item); + + if (isCollectable) { + TransactionDao.createTransaction(player.getDetails().getId(), + items.stream().map(e -> String.valueOf(e.getDatabaseId())).collect(Collectors.joining(",")), + item.getId() + "", + item.getAmount(), + "Collectible - " + transactionDscription, priceCoins, pricePixels, true); + } else { + TransactionDao.createTransaction(player.getDetails().getId(), + items.stream().map(e -> String.valueOf(e.getDatabaseId())).collect(Collectors.joining(",")), + item.getId() + "", + item.getAmount(), transactionDscription, priceCoins, pricePixels, true); + } + + if (giftedUserDetails != null) { + TransactionDao.createTransaction(giftedUserDetails.getId(), + items.stream().map(e -> String.valueOf(e.getDatabaseId())).collect(Collectors.joining(",")), + item.getId() + "", + item.getAmount(), + "Gift purchase from " + player.getDetails().getName() + " for " + giftedUser + " - " + transactionDscription, priceCoins, pricePixels, true); + + TransactionDao.createTransaction(player.getDetails().getId(), + items.stream().map(e -> String.valueOf(e.getDatabaseId())).collect(Collectors.joining(",")), + item.getId() + "", + item.getAmount(), + "Gift purchase from " + player.getDetails().getName() + " for " + giftedUser + " - " + transactionDscription, priceCoins, pricePixels, true); + } + } + + if (CatalogueManager.getInstance().getBadgeRewards().containsKey(item.getSaleCode())) { + for (var badgeCode : CatalogueManager.getInstance().getBadgeRewards().get(item.getSaleCode())) { + player.getBadgeManager().tryAddBadge(badgeCode, null); + } + } + + boolean canRedeemPoints = true; + + if (item.getDefinition() != null && (item.getDefinition().hasBehaviour(ItemBehaviour.REDEEMABLE) || item.getDefinition().hasBehaviour(ItemBehaviour.PRESENT))) { + canRedeemPoints = false; + } + } + + public static String getTransactionDescription(CatalogueItem item) { + if (!item.isPackage()) { + return getItemDescription(item.getDefinition(), item.getAmount()); + } else { + List descriptions = new ArrayList<>(); + + for (CataloguePackage cataloguePackage : item.getPackages()) { + var description = getItemDescription(cataloguePackage.getDefinition(), 1); + + if (description != null) { + descriptions.add(description); + } + } + + return "Package purchase (" + String.join(", ", descriptions) + ")"; + } + } + + private static String getItemDescription(ItemDefinition definition, int amount) { + if (definition == null) { + return null; + } + + if (definition.hasBehaviour(ItemBehaviour.EFFECT)) { + return "Effect " + definition.getSprite().replace("avatar_effect", "") + " purchase"; + } + + if (definition.getSprite().equals("film")) { + return "Film purchase"; + } + + return definition.getName() + " purchase"; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/club/GET_CLUB.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/club/GET_CLUB.java new file mode 100644 index 0000000..102f7f1 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/club/GET_CLUB.java @@ -0,0 +1,12 @@ +package org.alexdev.havana.messages.incoming.club; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class GET_CLUB implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + player.refreshClub(); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/club/SCR_GIFT_APPROVAL.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/club/SCR_GIFT_APPROVAL.java new file mode 100644 index 0000000..69b32c5 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/club/SCR_GIFT_APPROVAL.java @@ -0,0 +1,27 @@ +package org.alexdev.havana.messages.incoming.club; + +import org.alexdev.havana.game.club.ClubSubscription; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.statistics.PlayerStatistic; +import org.alexdev.havana.log.Log; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +import java.sql.SQLException; + +public class SCR_GIFT_APPROVAL implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (ClubSubscription.isGiftDue(player)) { + + try { + while (player.getStatisticManager().getIntValue(PlayerStatistic.GIFTS_DUE) > 0) { + ClubSubscription.tryNextGift(player); + } + + } catch (SQLException e) { + Log.getErrorLogger().error("Error trying to process club gift for user (" + player.getDetails().getName() + "): ", e); + } + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/club/SUBSCRIBE_CLUB.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/club/SUBSCRIBE_CLUB.java new file mode 100644 index 0000000..edc1e0b --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/club/SUBSCRIBE_CLUB.java @@ -0,0 +1,20 @@ +package org.alexdev.havana.messages.incoming.club; + +import org.alexdev.havana.game.club.ClubSubscription; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.user.currencies.CREDIT_BALANCE; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class SUBSCRIBE_CLUB implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + reader.readString(); + int choice = reader.readInt(); + + if (ClubSubscription.subscribeClub(player.getDetails(), choice)) { + player.send(new CREDIT_BALANCE(player.getDetails().getCredits())); + player.refreshClub(); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/ecotron/GET_RECYCLER_PRIZES.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/ecotron/GET_RECYCLER_PRIZES.java new file mode 100644 index 0000000..3d228aa --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/ecotron/GET_RECYCLER_PRIZES.java @@ -0,0 +1,13 @@ +package org.alexdev.havana.messages.incoming.ecotron; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.ecotron.RECYCLER_PRIZES; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class GET_RECYCLER_PRIZES implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + player.send(new RECYCLER_PRIZES()); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/ecotron/GET_RECYCLER_STATUS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/ecotron/GET_RECYCLER_STATUS.java new file mode 100644 index 0000000..1bd8e76 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/ecotron/GET_RECYCLER_STATUS.java @@ -0,0 +1,13 @@ +package org.alexdev.havana.messages.incoming.ecotron; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.ecotron.RECYCLER_STATUS; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class GET_RECYCLER_STATUS implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + player.send(new RECYCLER_STATUS(1)); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/ecotron/RECYCLE_ITEMS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/ecotron/RECYCLE_ITEMS.java new file mode 100644 index 0000000..2dd82e2 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/ecotron/RECYCLE_ITEMS.java @@ -0,0 +1,116 @@ +package org.alexdev.havana.messages.incoming.ecotron; + +import org.alexdev.havana.dao.mysql.ItemDao; +import org.alexdev.havana.game.catalogue.CatalogueManager; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.ItemManager; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.ecotron.RECYCLER_STATUS; +import org.alexdev.havana.messages.outgoing.rooms.items.ITEM_DELIVERED; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.util.config.GameConfiguration; + +import java.util.ArrayList; +import java.util.List; + +public class RECYCLE_ITEMS implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + int amount = reader.readInt(); + + if (amount < 5) { + return; + } + + List itemsToDelete = new ArrayList<>(); + + for (int i = 0; i < amount; i++) { + Item item = player.getInventory().getItem(reader.readInt()); + + if (item == null || !item.getDefinition().isRecyclable()) { + continue; + } + + if (itemsToDelete.stream().anyMatch(listItem -> listItem.getDatabaseId() == item.getDatabaseId())) { + continue; + } + + itemsToDelete.add(item); + } + + if (itemsToDelete.size() != 5) { + return; + } + + /*int chance = 0; + int[] chances = {2000, 200, 40, 5}; + + for (int chanceCheck : chances) { + int randomID = ThreadLocalRandom.current().nextInt(1, chanceCheck + 1); + + if (randomID == chanceCheck) { + chance = chanceCheck; + break; + } + } + + List potentialPrizes = EcotronManager.getInstance().getRewardsByChance(chance); + + if (potentialPrizes.isEmpty()) { + return; // OOPS! Something happened + } + + EcotronItem ecotronItem = potentialPrizes.get(ThreadLocalRandom.current().nextInt(0, potentialPrizes.size())); + + if (ecotronItem == null) { + return; + } + + ItemDefinition prize = ItemManager.getInstance().getDefinitionBySprite(ecotronItem.getSpriteName()); + + if (prize == null) { + return; + } + + CatalogueItem catalogueItem = CatalogueManager.getInstance().getCatalogueBySprite(prize.getSpriteId()); + + if (catalogueItem == null) { + return; + }*/ + + + Item present = new Item(); + present.setDefinitionId(ItemManager.getInstance().getDefinitionBySprite("ecotron_box").getId()); + present.setOwnerId(player.getDetails().getId()); + + if (itemsToDelete.stream().anyMatch(x -> + x.getDefinition().getSprite().startsWith("chair_plasty") || + x.getDefinition().getSprite().startsWith("chair_plasto") || + x.getDefinition().getSprite().startsWith("table_plasto"))) { + final int percentage = 100; + + var chance = Math.random() * percentage; + var rainbowChance = 1.0; + + if ((percentage - rainbowChance) < chance) { + present.setCustomData("FLAG:RAINBOW_FURNI"); + } + } + + ItemDao.newItem(present); + + //Item present = ItemManager.getInstance().createGift(player.getDetails().getId(), player.getDetails().getName(), catalogueItem.getSaleCode(), "", "", true);//new Item(); + + for (Item item : itemsToDelete) { + player.getInventory().getItems().remove(item); + item.delete(); + } + + player.getInventory().addItem(present); + player.getInventory().getView("last"); + + player.send(new ITEM_DELIVERED()); + player.send(new RECYCLER_STATUS(1)); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/effects/ACTIVATE_AVATAR_EFFECT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/effects/ACTIVATE_AVATAR_EFFECT.java new file mode 100644 index 0000000..7d75829 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/effects/ACTIVATE_AVATAR_EFFECT.java @@ -0,0 +1,40 @@ +package org.alexdev.havana.messages.incoming.effects; + +import org.alexdev.havana.dao.mysql.EffectDao; +import org.alexdev.havana.game.effects.Effect; +import org.alexdev.havana.game.effects.EffectsManager; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.effects.AVATAR_EFFECTS; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.util.DateUtil; + +public class ACTIVATE_AVATAR_EFFECT implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + int effectId = reader.readInt(); + doAction(player, effectId); + } + + public static void doAction(Player player, int effectId) { + Effect toActivate = null; + var activatedEffectCheck = player.getEffects().stream().filter(effect -> effect.getEffectId() == effectId && !effect.isActivated()).findFirst(); + + if (activatedEffectCheck.isPresent()) { + toActivate = activatedEffectCheck.get(); + } + + if (toActivate == null) { + return; + } + + int effectTime = EffectsManager.getInstance().getEffectTime(effectId); + long expireTime = (DateUtil.getCurrentTimeSeconds() + effectTime); + + toActivate.setActivated(true); + toActivate.setExpiryDate(expireTime); + + player.send(new AVATAR_EFFECTS(player.getEffects())); + EffectDao.saveEffect(toActivate); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/effects/PURCHASE_AND_WEAR.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/effects/PURCHASE_AND_WEAR.java new file mode 100644 index 0000000..6a8cfd7 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/effects/PURCHASE_AND_WEAR.java @@ -0,0 +1,54 @@ +package org.alexdev.havana.messages.incoming.effects; + +import org.alexdev.havana.dao.mysql.CurrencyDao; +import org.alexdev.havana.game.catalogue.CatalogueItem; +import org.alexdev.havana.game.catalogue.CatalogueManager; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.catalogue.NO_CREDITS; +import org.alexdev.havana.messages.outgoing.user.currencies.ActivityPointNotification; +import org.alexdev.havana.messages.outgoing.user.currencies.CREDIT_BALANCE; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.util.DateUtil; + +public class PURCHASE_AND_WEAR implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + reader.readInt(); + CatalogueItem item = CatalogueManager.getInstance().getCatalogueItem(reader.readInt()); + + if (item == null || item.isHidden() || !item.getDefinition().hasBehaviour(ItemBehaviour.EFFECT)) { + return; + } + + int priceCoins = item.getPriceCoins(); + int pricePixels = item.getPricePixels(); + + if (priceCoins > player.getDetails().getCredits()) { + player.send(new NO_CREDITS(true, false)); + return; + } + + if (pricePixels > player.getDetails().getPixels()) { + player.send(new NO_CREDITS(false, true)); + return; + } + + CatalogueManager.getInstance().purchase(player.getDetails(), item, "", null, DateUtil.getCurrentTimeSeconds()); + + if (priceCoins > 0) { + CurrencyDao.decreaseCredits(player.getDetails(), priceCoins); + player.send(new CREDIT_BALANCE(player.getDetails().getCredits())); + } + + if (pricePixels > 0) { + CurrencyDao.decreasePixels(player.getDetails(), pricePixels); + player.send(new ActivityPointNotification(player.getDetails().getPixels(), ActivityPointNotification.ActivityPointAlertType.PIXELS_SOUND)); + } + + ACTIVATE_AVATAR_EFFECT.doAction(player, Integer.parseInt(item.getItemSpecialId())); + USE_AVATAR_EFFECT.doAction(player, Integer.parseInt(item.getItemSpecialId())); + } + +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/effects/USE_AVATAR_EFFECT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/effects/USE_AVATAR_EFFECT.java new file mode 100644 index 0000000..9338163 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/effects/USE_AVATAR_EFFECT.java @@ -0,0 +1,37 @@ +package org.alexdev.havana.messages.incoming.effects; + +import org.alexdev.havana.game.effects.Effect; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class USE_AVATAR_EFFECT implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + int effectId = reader.readInt(); + doAction(player, effectId); + } + + public static void doAction(Player player, int effectId) { + if (player.getRoomUser().getRoom() == null) { + return; + } + + if (effectId > 0) { + Effect toActivate = null; + var activatedEffectCheck = player.getEffects().stream().filter(effect -> effect.getEffectId() == effectId && effect.isActivated()).findFirst(); + + if (activatedEffectCheck.isPresent()) { + toActivate = activatedEffectCheck.get(); + } + + if (toActivate == null) { + return; + } + + player.getRoomUser().useEffect(effectId); + } else { + player.getRoomUser().useEffect(0); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/events/CAN_CREATE_ROOMEVENT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/events/CAN_CREATE_ROOMEVENT.java new file mode 100644 index 0000000..425a02d --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/events/CAN_CREATE_ROOMEVENT.java @@ -0,0 +1,15 @@ +package org.alexdev.havana.messages.incoming.events; + +import org.alexdev.havana.game.events.EventsManager; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.events.ROOMEVENT_PERMISSION; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class CAN_CREATE_ROOMEVENT implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + boolean canCreateEvent = EventsManager.getInstance().canCreateEvent(player); + player.send(new ROOMEVENT_PERMISSION(canCreateEvent)); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/events/CREATE_ROOMEVENT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/events/CREATE_ROOMEVENT.java new file mode 100644 index 0000000..4777e13 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/events/CREATE_ROOMEVENT.java @@ -0,0 +1,34 @@ +package org.alexdev.havana.messages.incoming.events; + +import org.alexdev.havana.game.events.Event; +import org.alexdev.havana.game.events.EventsManager; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.wordfilter.WordfilterManager; +import org.alexdev.havana.messages.outgoing.events.ROOMEEVENT_INFO; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.util.StringUtil; + +import java.util.ArrayList; +import java.util.List; + +public class CREATE_ROOMEVENT implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (!EventsManager.getInstance().canCreateEvent(player)) { + return; + } + + int category = reader.readInt(); + + if (category < 1 || category > 11) { + return; + } + + String name = WordfilterManager.filterSentence(StringUtil.filterInput(reader.readString(), true)); + String description = WordfilterManager.filterSentence(StringUtil.filterInput(reader.readString(), true)); + + Event event = EventsManager.getInstance().createEvent(player, category, name, description, new ArrayList<>()); + player.getRoomUser().getRoom().send(new ROOMEEVENT_INFO(event)); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/events/EDIT_ROOMEVENT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/events/EDIT_ROOMEVENT.java new file mode 100644 index 0000000..82bde92 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/events/EDIT_ROOMEVENT.java @@ -0,0 +1,56 @@ +package org.alexdev.havana.messages.incoming.events; + +import org.alexdev.havana.dao.mysql.EventsDao; +import org.alexdev.havana.game.events.Event; +import org.alexdev.havana.game.events.EventsManager; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.wordfilter.WordfilterManager; +import org.alexdev.havana.messages.outgoing.events.ROOMEEVENT_INFO; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.util.StringUtil; + +import java.util.ArrayList; +import java.util.List; + +public class EDIT_ROOMEVENT implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + Room room = player.getRoomUser().getRoom(); + + if (room == null) { + return; + } + + if (!room.isOwner(player.getDetails().getId())) { + return; + } + + if (!EventsManager.getInstance().hasEvent(room.getId())) { + return; + } + + Event event = EventsManager.getInstance().getEventByRoomId(room.getId()); + + if (event == null) { + return; + } + + int category = reader.readInt(); + + if (category < 1 || category > 11) { + return; + } + + String name = WordfilterManager.filterSentence(StringUtil.filterInput(reader.readString(), true)); + String description = WordfilterManager.filterSentence(StringUtil.filterInput(reader.readString(), true)); + + event.setCategoryId(category); + event.setName(name); + event.setDescription(description); + + room.send(new ROOMEEVENT_INFO(event)); + EventsDao.save(event); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/events/GET_ROOMEVENTS_BY_TYPE.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/events/GET_ROOMEVENTS_BY_TYPE.java new file mode 100644 index 0000000..33568d3 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/events/GET_ROOMEVENTS_BY_TYPE.java @@ -0,0 +1,24 @@ +package org.alexdev.havana.messages.incoming.events; + +import org.alexdev.havana.game.events.Event; +import org.alexdev.havana.game.events.EventsManager; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.events.ROOMEVENT_LIST; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +import java.util.List; + +public class GET_ROOMEVENTS_BY_TYPE implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + int categoryId = reader.readInt(); + + if (categoryId < 0 || categoryId > 11) { + return; + } + + List eventList = EventsManager.getInstance().getEvents(categoryId); + player.send(new ROOMEVENT_LIST(categoryId, eventList)); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/events/GET_ROOMEVENT_TYPE_COUNT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/events/GET_ROOMEVENT_TYPE_COUNT.java new file mode 100644 index 0000000..77d4425 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/events/GET_ROOMEVENT_TYPE_COUNT.java @@ -0,0 +1,14 @@ +package org.alexdev.havana.messages.incoming.events; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.events.ROOMEVENT_TYPES; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.util.config.GameConfiguration; + +public class GET_ROOMEVENT_TYPE_COUNT implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + player.send(new ROOMEVENT_TYPES(GameConfiguration.getInstance().getInteger("events.category.count"))); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/events/QUIT_ROOMEVENT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/events/QUIT_ROOMEVENT.java new file mode 100644 index 0000000..fc0fb68 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/events/QUIT_ROOMEVENT.java @@ -0,0 +1,37 @@ +package org.alexdev.havana.messages.incoming.events; + +import org.alexdev.havana.game.events.Event; +import org.alexdev.havana.game.events.EventsManager; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.events.ROOMEEVENT_INFO; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class QUIT_ROOMEVENT implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + Room room = player.getRoomUser().getRoom(); + + if (room == null) { + return; + } + + if (!room.isOwner(player.getDetails().getId())) { + return; + } + + if (!EventsManager.getInstance().hasEvent(room.getId())) { + return; + } + + Event event = EventsManager.getInstance().getEventByRoomId(room.getId()); + + if (event == null) { + return; + } + + EventsManager.getInstance().removeEvent(event); + room.send(new ROOMEEVENT_INFO(null)); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/games/GAMEEVENT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/games/GAMEEVENT.java new file mode 100644 index 0000000..8d5978a --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/games/GAMEEVENT.java @@ -0,0 +1,96 @@ +package org.alexdev.havana.messages.incoming.games; + +import org.alexdev.havana.game.games.Game; +import org.alexdev.havana.game.games.battleball.BattleBallGame; +import org.alexdev.havana.game.games.battleball.BattleBallPowerUp; +import org.alexdev.havana.game.games.battleball.events.ActivatePowerUpEvent; +import org.alexdev.havana.game.games.enums.GameType; +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.games.snowstorm.SnowStormGame; +import org.alexdev.havana.game.games.snowstorm.messages.SnowStormMessageHandler; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class GAMEEVENT implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (!player.getRoomUser().isWalkingAllowed()) { + return; + } + + GamePlayer gamePlayer = player.getRoomUser().getGamePlayer(); + + if (gamePlayer == null) { + return; + } + + Game game = gamePlayer.getGame(); + int eventType = reader.readInt(); + + if (game.getGameType() == GameType.SNOWSTORM) { + SnowStormMessageHandler.getInstance().handleMessage(eventType, reader, (SnowStormGame)game, gamePlayer); + } else { + + // Walk request + /*if (eventType == 0) { + if (!player.getRoomUser().isWalkingAllowed()) { + return; + } + + int X = reader.readInt(); + int Y = reader.readInt(); + + SnowStormHandler.doWalk((SnowStormGame)game, gamePlayer, X, Y); + }*/ + + // Pickup Snowballs request + /*if (eventType == 3) { + SnowStormHandler.pickupSnowball((SnowStormGame)game, gamePlayer); + }*/ + + // Jump request + if (eventType == 2) { + if (!player.getRoomUser().isWalkingAllowed()) { + return; + } + + int X = reader.readInt(); + int Y = reader.readInt(); + + player.getRoomUser().walkTo(X, Y); + } + + // Use power up request + if (eventType == 4) { + int powerId = reader.readInt(); + + if (game instanceof BattleBallGame) { + BattleBallGame battleballGame = (BattleBallGame) game; + + if (!battleballGame.getStoredPowers().containsKey(gamePlayer)) { + return; + } + + var powerList = battleballGame.getStoredPowers().get(gamePlayer); + + BattleBallPowerUp powerUp = null; + + for (BattleBallPowerUp power : powerList) { + if (power.getId() == powerId) { + powerUp = power; + break; + } + } + + if (powerUp != null) { + battleballGame.getEventsQueue().add(new ActivatePowerUpEvent(gamePlayer, powerUp)); + powerList.remove(powerUp); + + powerUp.usePower(gamePlayer, player.getRoomUser().getPosition()); + } + } + } + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/games/GAMEPARAMETERVALUES.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/games/GAMEPARAMETERVALUES.java new file mode 100644 index 0000000..a43e20a --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/games/GAMEPARAMETERVALUES.java @@ -0,0 +1,51 @@ +package org.alexdev.havana.messages.incoming.games; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.triggers.GameLobbyTrigger; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.util.StringUtil; + +import java.util.HashMap; +import java.util.Map; + +public class GAMEPARAMETERVALUES implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + // BcPA@IfieldTypeHI@HnumTeamsHJ@OallowedPowerupsI@O1,2,3,4,5,6,7,8@DnameI@DtestH + if (player.getRoomUser().getRoom() == null) { + return; + } + + Room room = player.getRoomUser().getRoom(); + + if (!(room.getModel().getRoomTrigger() instanceof GameLobbyTrigger)) { + return; + } + + GameLobbyTrigger gameLobbyTrigger = (GameLobbyTrigger) room.getModel().getRoomTrigger(); + + Map gameParameters = new HashMap<>(); + + int parameters = reader.readInt(); + + for (int i = 0; i < parameters; i++) { + String parameter = reader.readString(); + boolean isTextValue = reader.readBoolean(); + Object value; + + if (isTextValue) { + value = StringUtil.filterInput(reader.readString(), true); + } else { + value = reader.readInt(); + } + + gameParameters.put(parameter, value); + } + + gameLobbyTrigger.createGame(player, gameParameters); + + room.send(gameLobbyTrigger.getInstanceList()); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/games/GAMERESTART.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/games/GAMERESTART.java new file mode 100644 index 0000000..02e2b80 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/games/GAMERESTART.java @@ -0,0 +1,98 @@ +package org.alexdev.havana.messages.incoming.games; + +import org.alexdev.havana.game.games.Game; +import org.alexdev.havana.game.games.GameManager; +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.games.PLAYERREJOINED; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.util.config.GameConfiguration; + +import java.util.ArrayList; +import java.util.List; + +public class GAMERESTART implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + GamePlayer gamePlayer = player.getRoomUser().getGamePlayer(); + + if (gamePlayer == null) { + return; + } + + Game game = GameManager.getInstance().getGameById(gamePlayer.getGameId()); + + if (game == null || !game.isGameFinished() || gamePlayer.isClickedRestart()) { + return; + } + + // Only allow restart once everyone has clicked they'd like to restart + gamePlayer.setClickedRestart(true); + game.send(new PLAYERREJOINED(player.getRoomUser().getInstanceId())); + + List players = new ArrayList<>(); // Players who wanted to restart + List afkPlayers = new ArrayList<>(); // Players who didn't touch any button + + for (GamePlayer p : game.getActivePlayers()) { + if (!p.isClickedRestart()) { + afkPlayers.add(p); + } else { + players.add(p); + } + } + + if (afkPlayers.isEmpty()) { // Everyone clicked restart + for (GamePlayer p : game.getActivePlayers()) { + p.setClickedRestart(false); // Reset whether or not they clicked restart, for next game + } + + if (players.size() >= GameConfiguration.getInstance().getInteger(game.getGameType().name().toLowerCase() + ".start.minimum.active.teams")) { + game.restartGame(players); + } else { + afkPlayers.addAll(players); + } + + // Send spectators to lobby too + afkPlayers.addAll(game.getSpectators()); + + for (var afkPlayer : afkPlayers) { + game.sendToLobby(afkPlayer); + } + } + + +/* for (GameTeam gameTeam : game.getTeams().values()) { + for (GamePlayer p : gameTeam.getActivePlayers()) { + if (!p.isClickedRestart()) { + return; + } + } + + }*/ + /*Game restartGame = new Game(game.getId(), game.getMapId(), game.getGameType(), game.getName(), game.getTeamAmount(), game.getGameCreator().getDetails().getId()); + + List restartedPlayers = new ArrayList<>(); + + for (var gameUser : newPlayers) { + var gp = new GamePlayer(gameUser.getPlayer()); + gp.setGameId(game.getId()); + gp.setTeamId(gameUser.getTeamId()); + gp.setInGame(true); + + gameUser.getPlayer().getRoomUser().setGamePlayer(gp); + + game.leaveGame(gameUser); + restartGame.movePlayer(gp, -1, gp.getTeamId()); + + restartedPlayers.add(gp); + } + + restartGame.assignSpawnPoints();*/ + + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/games/GETINSTANCELIST.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/games/GETINSTANCELIST.java new file mode 100644 index 0000000..ceccd96 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/games/GETINSTANCELIST.java @@ -0,0 +1,32 @@ +package org.alexdev.havana.messages.incoming.games; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.triggers.GameLobbyTrigger; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.util.config.GameConfiguration; + +public class GETINSTANCELIST implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + Room room = player.getRoomUser().getRoom(); + + if (!(room.getModel().getRoomTrigger() instanceof GameLobbyTrigger)) { + return; + } + + GameLobbyTrigger gameLobbyTrigger = (GameLobbyTrigger) room.getModel().getRoomTrigger(); + + // Don't show panel and lounge info if create game is disabled + if (!GameConfiguration.getInstance().getBoolean(gameLobbyTrigger.getGameType().name().toLowerCase() + ".create.game.enabled")) { + return; + } + + player.send(gameLobbyTrigger.getInstanceList()); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/games/INITIATECREATEGAME.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/games/INITIATECREATEGAME.java new file mode 100644 index 0000000..dc5751b --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/games/INITIATECREATEGAME.java @@ -0,0 +1,56 @@ +package org.alexdev.havana.messages.incoming.games; + +import org.alexdev.havana.game.games.GameParameter; +import org.alexdev.havana.game.games.enums.GameType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.triggers.GameLobbyTrigger; +import org.alexdev.havana.messages.outgoing.games.CREATEFAILED; +import org.alexdev.havana.messages.outgoing.games.GAMEPARAMETERS; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class INITIATECREATEGAME implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + Room room = player.getRoomUser().getRoom(); + + if (!(room.getModel().getRoomTrigger() instanceof GameLobbyTrigger)) { + return; + } + + + GameLobbyTrigger gameLobbyTrigger = (GameLobbyTrigger) room.getModel().getRoomTrigger(); + GameParameter[] parameters = null; + + if (gameLobbyTrigger.getGameType() == GameType.BATTLEBALL) { + parameters = new GameParameter[]{ + new GameParameter("fieldType", true, "1", 1, 5), + new GameParameter("numTeams", true, "2", 2, 4), + new GameParameter("allowedPowerups", true, "1,2,3,4,5,6,7,8"), + new GameParameter("name", true, "") + }; + } + + if (gameLobbyTrigger.getGameType() == GameType.SNOWSTORM) { + parameters = new GameParameter[]{ + new GameParameter("fieldType", true, "1", 1, 7), + new GameParameter("numTeams", true, "2", 2, 4), + new GameParameter("gameLengthChoice", true, "1", 1, 3), + new GameParameter("name", true, "") + }; + } + + if (player.getDetails().getTickets() < gameLobbyTrigger.getGameType().getTicketCost()) { + player.send(new CREATEFAILED(CREATEFAILED.FailedReason.TICKETS_NEEDED)); + return; + } + + if (parameters != null) + player.send(new GAMEPARAMETERS(parameters)); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/games/INITIATEJOINGAME.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/games/INITIATEJOINGAME.java new file mode 100644 index 0000000..fdb24ac --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/games/INITIATEJOINGAME.java @@ -0,0 +1,71 @@ +package org.alexdev.havana.messages.incoming.games; + +import org.alexdev.havana.game.games.Game; +import org.alexdev.havana.game.games.GameManager; +import org.alexdev.havana.game.games.enums.GameState; +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.triggers.GameLobbyTrigger; +import org.alexdev.havana.messages.outgoing.games.JOINFAILED; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class INITIATEJOINGAME implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + Room room = player.getRoomUser().getRoom(); + + int instanceId = reader.readInt(); + int teamId = reader.readInt(); + + if (!(room.getModel().getRoomTrigger() instanceof GameLobbyTrigger)) { + return; + } + + /*GamePlayer gamePlayer = player.getRoomUser().getGamePlayer(); + + if (gamePlayer == null) { + return; + }*/ + + Game game = GameManager.getInstance().getGameById(instanceId); + + if (game == null || game.getGameState() != GameState.WAITING) { + return; + } + + if (player.getDetails().getTickets() < game.getTicketCost()) { + player.send(new JOINFAILED(JOINFAILED.FailedReason.TICKETS_NEEDED, null)); + return; + } + + if (!game.canSwitchTeam(teamId)) { + player.send(new JOINFAILED(JOINFAILED.FailedReason.TEAMS_FULL, "join")); + return; + } + + var currentGamePlayer = player.getRoomUser().getGamePlayer(); + + // If player was initially a spectator, they need to leave + if (currentGamePlayer != null && currentGamePlayer.isSpectator()) { + game.leaveGame(currentGamePlayer); + } + + // Their game player instance will always be null after leaveGame() + if (player.getRoomUser().getGamePlayer() == null) { + player.getRoomUser().setGamePlayer(new GamePlayer(player)); + player.getRoomUser().getGamePlayer().setGameId(game.getId()); + player.getRoomUser().getGamePlayer().setTeamId(teamId); + } + + GamePlayer gamePlayer = player.getRoomUser().getGamePlayer(); + game.getObservers().remove(player); // Player was a viewer + game.getSpectators().remove(gamePlayer); + game.movePlayer(gamePlayer, gamePlayer.getTeamId(), teamId); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/games/KICKPLAYER.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/games/KICKPLAYER.java new file mode 100644 index 0000000..64f350e --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/games/KICKPLAYER.java @@ -0,0 +1,59 @@ +package org.alexdev.havana.messages.incoming.games; + +import org.alexdev.havana.game.games.Game; +import org.alexdev.havana.game.games.GameManager; +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.games.player.GameTeam; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.triggers.GameLobbyTrigger; +import org.alexdev.havana.messages.outgoing.games.CREATEFAILED; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class KICKPLAYER implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + Room room = player.getRoomUser().getRoom(); + + if (!(room.getModel().getRoomTrigger() instanceof GameLobbyTrigger)) { + return; + } + + GamePlayer gamePlayer = player.getRoomUser().getGamePlayer(); + + if (gamePlayer == null) { + return; + } + + Game game = GameManager.getInstance().getGameById(gamePlayer.getGameId()); + + if (game == null || game.getGameCreatorId() != player.getDetails().getId()) { + return; + } + + int instanceId = reader.readInt(); + + GamePlayer teamPlayer = null; + + for (GameTeam team : game.getTeams().values()) { + for (GamePlayer p : team.getActivePlayers()) { + if (p.getPlayer().getRoomUser().getInstanceId() == instanceId) { + teamPlayer = p; + break; + } + } + } + + if (teamPlayer == null) { + return; + } + + game.leaveGame(teamPlayer); + teamPlayer.getPlayer().send(new CREATEFAILED(CREATEFAILED.FailedReason.KICKED)); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/games/LEAVEGAME.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/games/LEAVEGAME.java new file mode 100644 index 0000000..4550c86 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/games/LEAVEGAME.java @@ -0,0 +1,38 @@ +package org.alexdev.havana.messages.incoming.games; + +import org.alexdev.havana.game.games.Game; +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.triggers.GameLobbyTrigger; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class LEAVEGAME implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + Room room = player.getRoomUser().getRoom(); + + if (!(room.getModel().getRoomTrigger() instanceof GameLobbyTrigger)) { + return; + } + + GamePlayer gamePlayer = player.getRoomUser().getGamePlayer(); + + if (gamePlayer == null) { + return; + } + + Game game = gamePlayer.getGame(); + + if (game == null) { + return; + } + + game.leaveGame(gamePlayer); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/games/OBSERVEINSTANCE.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/games/OBSERVEINSTANCE.java new file mode 100644 index 0000000..bd16ba8 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/games/OBSERVEINSTANCE.java @@ -0,0 +1,77 @@ +package org.alexdev.havana.messages.incoming.games; + +import org.alexdev.havana.game.games.Game; +import org.alexdev.havana.game.games.GameManager; +import org.alexdev.havana.game.games.enums.GameState; +import org.alexdev.havana.game.games.history.GameHistory; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.triggers.GameLobbyTrigger; +import org.alexdev.havana.messages.outgoing.games.GAMEINSTANCE; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class OBSERVEINSTANCE implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + Room room = player.getRoomUser().getRoom(); + + if (!(room.getModel().getRoomTrigger() instanceof GameLobbyTrigger)) { + return; + } + + int gameId = reader.readInt(); + + Game game = GameManager.getInstance().getGameById(gameId); + + if (game != null && game.getGameState() != GameState.ENDED) { + player.send(new GAMEINSTANCE(game)); + player.getRoomUser().setObservingGameId(gameId); + + game.getObservers().add(player); + return; + } + + var lobbyTrigger = (GameLobbyTrigger)room.getModel().getRoomTrigger(); + GameHistory finishedGame = GameManager.getInstance().getFinishedGameById(lobbyTrigger.getGameType(), gameId); + + if (finishedGame != null) { + player.send(new GAMEINSTANCE(finishedGame)); + } + + /*if (game.getGameState() == GameState.WAITING) { + if (player.getDetails().getTickets() <= 1) { + player.send(new JOINFAILED(JOINFAILED.FailedReason.TICKETS_NEEDED)); + return; + } + + // Find team with lowest team members to add to + List sortedTeamList = new ArrayList<>(game.getTeams().values()); + sortedTeamList.sort(Comparator.comparingInt(team -> team.getPlayers().size())); + + // Select game team + GameTeam gameTeam = sortedTeamList.get(0); + + if (gameTeam == null) { + return; + } + + if (!game.canSwitchTeam(gameTeam.getId())) { + return; + } + + player.getRoomUser().setGamePlayer(new GamePlayer(player)); + player.getRoomUser().getGamePlayer().setGameId(game.getId()); + player.getRoomUser().getGamePlayer().setTeamId(gameTeam.getId()); + + game.movePlayer(player.getRoomUser().getGamePlayer(), -1, gameTeam.getId()); + game.send(new GAMEINSTANCE(game)); + }*/ + + + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/games/REQUESTFULLGAMESTATUS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/games/REQUESTFULLGAMESTATUS.java new file mode 100644 index 0000000..b60b444 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/games/REQUESTFULLGAMESTATUS.java @@ -0,0 +1,33 @@ +package org.alexdev.havana.messages.incoming.games; + +import org.alexdev.havana.game.games.Game; +import org.alexdev.havana.game.games.GameManager; +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.games.snowstorm.SnowStormGame; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.games.FULLGAMESTATUS; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class REQUESTFULLGAMESTATUS implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + GamePlayer gamePlayer = player.getRoomUser().getGamePlayer(); + + if (gamePlayer == null) { + return; + } + + Game game = GameManager.getInstance().getGameById(gamePlayer.getGameId()); + + if (!(game instanceof SnowStormGame)) { + return; + } + + player.send(new FULLGAMESTATUS(game)); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/games/REQUEST_GAME_LOBBY.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/games/REQUEST_GAME_LOBBY.java new file mode 100644 index 0000000..6031aaa --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/games/REQUEST_GAME_LOBBY.java @@ -0,0 +1,34 @@ +package org.alexdev.havana.messages.incoming.games; + +import org.alexdev.havana.game.games.enums.GameType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.RoomManager; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +import java.util.concurrent.ThreadLocalRandom; + +public class REQUEST_GAME_LOBBY implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (!player.isLoggedIn() || player.getRoomUser().getGamePlayer() != null) { + return; + } + + if (player.getRoomUser().getLastLobbyRedirection() == null) { + if (ThreadLocalRandom.current().nextBoolean()) { + player.getRoomUser().setLastLobbyRedirection(GameType.BATTLEBALL); + } else { + player.getRoomUser().setLastLobbyRedirection(GameType.SNOWSTORM); + } + } else { + if (player.getRoomUser().getLastLobbyRedirection() == GameType.BATTLEBALL) { + player.getRoomUser().setLastLobbyRedirection(GameType.SNOWSTORM); + } else { + player.getRoomUser().setLastLobbyRedirection(GameType.BATTLEBALL); + } + } + + RoomManager.getInstance().getRoomByModel(player.getRoomUser().getLastLobbyRedirection().getLobbyModel()).forward(player, false); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/games/STARTGAME.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/games/STARTGAME.java new file mode 100644 index 0000000..3c765a0 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/games/STARTGAME.java @@ -0,0 +1,57 @@ +package org.alexdev.havana.messages.incoming.games; + +import org.alexdev.havana.game.games.Game; +import org.alexdev.havana.game.games.GameManager; +import org.alexdev.havana.game.games.enums.GameState; +import org.alexdev.havana.game.games.enums.GameType; +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.triggers.GameLobbyTrigger; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; +import org.alexdev.havana.messages.outgoing.games.STARTFAILED; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class STARTGAME implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + + return; + } + + Room room = player.getRoomUser().getRoom(); + + if (!(room.getModel().getRoomTrigger() instanceof GameLobbyTrigger)) { + return; + } + + GamePlayer gamePlayer = player.getRoomUser().getGamePlayer(); + + if (gamePlayer == null) { + return; + } + + Game game = GameManager.getInstance().getGameById(gamePlayer.getGameId()); + + if (game.getGameState() != GameState.WAITING) { + return; + } + + if (game.getGameCreatorId() != player.getDetails().getId()) { + return; + } + + if (!game.canGameStart()) { + if (game.getGameType() == GameType.SNOWSTORM && game.getTeamAmount() == 1) { + player.send(new ALERT("There needs to be at least two players to start this match")); + } else { + player.send(new STARTFAILED(STARTFAILED.FailedReason.MINIMUM_TEAMS_REQUIRED, null)); + } + return; + } + + game.startGame(); + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/games/UNOBSERVEINSTANCE.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/games/UNOBSERVEINSTANCE.java new file mode 100644 index 0000000..a34b06b --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/games/UNOBSERVEINSTANCE.java @@ -0,0 +1,30 @@ +package org.alexdev.havana.messages.incoming.games; + +import org.alexdev.havana.game.games.Game; +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.games.GAMEINSTANCE; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class UNOBSERVEINSTANCE implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getObservingGameId() != -1) { + player.getRoomUser().stopObservingGame(); + } + + /* + if (player.getRoomUser().getGamePlayer() != null) { + GamePlayer gamePlayer = player.getRoomUser().getGamePlayer(); + Game game = gamePlayer.getGame(); + + if (game != null) { + if (gamePlayer.getGame().getSpectators().contains(gamePlayer)) { + gamePlayer.getGame().leaveGame(gamePlayer); + } + } + } + */ + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/games/WATCHGAME.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/games/WATCHGAME.java new file mode 100644 index 0000000..da4b341 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/games/WATCHGAME.java @@ -0,0 +1,54 @@ +package org.alexdev.havana.messages.incoming.games; + +import org.alexdev.havana.game.games.Game; +import org.alexdev.havana.game.games.GameManager; +import org.alexdev.havana.game.games.enums.GameState; +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.triggers.GameLobbyTrigger; +import org.alexdev.havana.messages.outgoing.games.GAMEINSTANCE; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class WATCHGAME implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + Room room = player.getRoomUser().getRoom(); + + if (!(room.getModel().getRoomTrigger() instanceof GameLobbyTrigger)) { + return; + } + + if (player.getRoomUser().getGamePlayer() != null) { + return; + } + + int gameId = reader.readInt(); + + Game game = GameManager.getInstance().getGameById(gameId); + + if (game == null) { + return; + } + + GamePlayer gamePlayer = new GamePlayer(player); + gamePlayer.setGameId(gameId); + gamePlayer.setSpectator(true); + + player.getRoomUser().setGamePlayer(gamePlayer); + + game.getSpectators().add(gamePlayer); + + if (game.getGameState() == GameState.STARTED) { + game.sendSpectatorToArena(gamePlayer); + } else { + game.send(new GAMEINSTANCE(game)); + game.sendObservers(new GAMEINSTANCE(game)); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/handshake/GENERATEKEY.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/handshake/GENERATEKEY.java new file mode 100644 index 0000000..bf48323 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/handshake/GENERATEKEY.java @@ -0,0 +1,24 @@ +package org.alexdev.havana.messages.incoming.handshake; + +import org.alexdev.havana.game.encryption.DiffieHellman; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.handshake.SECRET_KEY; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class GENERATEKEY implements MessageEvent { + + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.isLoggedIn()) { + return; + } + + String publicKey = reader.readString(); + + player.getDiffieHellman().generateSharedKey(publicKey); + player.setHasGenerateKey(true); + + player.send(new SECRET_KEY(DiffieHellman.generateRandomNumString(24)));//player.getDetails())); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/handshake/GET_SESSION_PARAMETERS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/handshake/GET_SESSION_PARAMETERS.java new file mode 100644 index 0000000..61fb257 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/handshake/GET_SESSION_PARAMETERS.java @@ -0,0 +1,13 @@ +package org.alexdev.havana.messages.incoming.handshake; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.handshake.SESSION_PARAMETERS; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class GET_SESSION_PARAMETERS implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + player.send(new SESSION_PARAMETERS(player.getDetails())); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/handshake/INIT_CRYPTO.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/handshake/INIT_CRYPTO.java new file mode 100644 index 0000000..3044912 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/handshake/INIT_CRYPTO.java @@ -0,0 +1,49 @@ +package org.alexdev.havana.messages.incoming.handshake; + +import org.alexdev.havana.game.GameScheduler; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.handshake.CRYPTO_PARAMETERS; +import org.alexdev.havana.messages.outgoing.handshake.SESSION_PARAMETERS; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +import java.util.concurrent.TimeUnit; + +public class INIT_CRYPTO implements MessageEvent { + + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.isLoggedIn()) { + return; + } + + //String prime = Util.getRSA().sign(dh.getPrime().toString()); + //String generator = Util.getRSA().sign(dh.getGenerator().toString()); + + //player.sendObject("DAQBHIIIKHJIPAIQAdd-MM-yyyy\u0002SAHPB/client\u0002QBHIJWVVVSNKQCFUBJASMSLKUUOJCOLJQPNSBIRSVQBRXZQOTGPMNJIHLVJCRRULBLUO" + (char)1); + + player.send(new CRYPTO_PARAMETERS()); + + // Try again + this.retrySend(player); + } + + /** + * Retry sending the crypto parameters if after a second we received no response from the client. + * + * @param player the player to send the parameters to + */ + private void retrySend(Player player) { + GameScheduler.getInstance().getService().schedule(() -> { + if (player.isDisconnected()) { + return; + } + + if (player.hasGenerateKey()) { + return; + } + + player.send(new CRYPTO_PARAMETERS()); + }, 1, TimeUnit.SECONDS); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/handshake/SSO.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/handshake/SSO.java new file mode 100644 index 0000000..b0debf2 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/handshake/SSO.java @@ -0,0 +1,51 @@ +package org.alexdev.havana.messages.incoming.handshake; + +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.server.util.MalformedPacketException; + +public class SSO implements MessageEvent { + + @Override + public void handle(Player player, NettyRequest reader){ + if (player.isLoggedIn()) { + return; + } + + String ticket = null; + try { + ticket = reader.readString(); + } catch (MalformedPacketException e) { + e.printStackTrace(); + } + + /* + if (GameConfiguration.getInstance().getBoolean("bot.connection.allow")) { + if (ticket.startsWith(GameConfiguration.getInstance().getString("bot.connection.sso.prefix"))) { + String sex = ThreadLocalRandom.current().nextBoolean() ? "M" : "F"; + int userId = ThreadLocalRandom.current().nextInt(0, Integer.MAX_VALUE); + String name = ticket.replace(GameConfiguration.getInstance().getString("bot.connection.sso.prefix") + "-", ""); + + try { + player.getDetails().fill(userId, name, FigureUtil.getRandomFigure(sex, ThreadLocalRandom.current().nextBoolean()), "I'm here to test things up!", sex); + player.getDetails().setRank(PlayerRank.NORMAL); + } catch (Exception e) { + e.printStackTrace(); + } + + player.login(); + return; + } + } + */ + + if (!PlayerDao.loginTicket(player, ticket)) { + //player.send(new LOCALISED_ERROR("Incorrect SSO ticket")); + player.kickFromServer(); + } else { + player.login(); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/handshake/TRY_LOGIN.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/handshake/TRY_LOGIN.java new file mode 100644 index 0000000..731d571 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/handshake/TRY_LOGIN.java @@ -0,0 +1,28 @@ +package org.alexdev.havana.messages.incoming.handshake; + +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.alerts.LOCALISED_ERROR; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.server.util.MalformedPacketException; +import org.alexdev.havana.util.StringUtil; + +public class TRY_LOGIN implements MessageEvent { + + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.isLoggedIn()) { + return; + } + + String username = StringUtil.filterInput(reader.readString(), true); + String password = StringUtil.filterInput(reader.readString(), true); + + if (!PlayerDao.login(player.getDetails(), username, password)) { + player.send(new LOCALISED_ERROR("Login incorrect")); + } else { + player.login(); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/handshake/UNIQUEID.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/handshake/UNIQUEID.java new file mode 100644 index 0000000..6a04cb8 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/handshake/UNIQUEID.java @@ -0,0 +1,28 @@ +package org.alexdev.havana.messages.incoming.handshake; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.handshake.UniqueIDMessageEvent; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +import java.util.UUID; + +public class UNIQUEID implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + String machineId = reader.readString(); + + if (machineId == null) { + player.kickFromServer(); + return; + } + + if (machineId.isBlank() || !(machineId.length() == 33 && machineId.startsWith("#"))) { + player.getNetwork().setClientMachineId("#" + UUID.randomUUID().toString().toUpperCase().replace("-", "")); + player.getNetwork().setSaveMachineId(true); + } else { + player.getNetwork().setClientMachineId(machineId); + player.send(new UniqueIDMessageEvent(machineId)); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/handshake/VERSIONCHECK.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/handshake/VERSIONCHECK.java new file mode 100644 index 0000000..9e41b4e --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/handshake/VERSIONCHECK.java @@ -0,0 +1,12 @@ +package org.alexdev.havana.messages.incoming.handshake; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class VERSIONCHECK implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/infobus/CHANGEWORLD.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/infobus/CHANGEWORLD.java new file mode 100644 index 0000000..44a3acc --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/infobus/CHANGEWORLD.java @@ -0,0 +1,21 @@ +package org.alexdev.havana.messages.incoming.infobus; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class CHANGEWORLD implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + // Do not process public room items + if (!player.getRoomUser().getRoom().isPublicRoom()) { + return; + } + + player.getRoomUser().walkTo(11,2); // Walk to exit square + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/infobus/TRYBUS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/infobus/TRYBUS.java new file mode 100644 index 0000000..53f0c26 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/infobus/TRYBUS.java @@ -0,0 +1,30 @@ +package org.alexdev.havana.messages.incoming.infobus; + +import org.alexdev.havana.game.infobus.InfobusManager; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.infobus.CANNOT_ENTER_BUS; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class TRYBUS implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + // Do not process public room items + if (!player.getRoomUser().getRoom().isPublicRoom()) { + return; + } + + if (!InfobusManager.getInstance().isDoorOpen()) { + player.send(new CANNOT_ENTER_BUS("The Infobus is closed, there is no event right now. Please check back later.")); + return; + } + + player.getRoomUser().walkTo( + InfobusManager.getInstance().getDoorX(), + InfobusManager.getInstance().getDoorY()); // Walk to enter square + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/infobus/VOTE.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/infobus/VOTE.java new file mode 100644 index 0000000..e12433f --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/infobus/VOTE.java @@ -0,0 +1,38 @@ +package org.alexdev.havana.messages.incoming.infobus; + +import org.alexdev.havana.dao.mysql.InfobusDao; +import org.alexdev.havana.game.infobus.InfobusManager; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.infobus.POLL_QUESTION; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class VOTE implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null || !player.getRoomUser().getRoom().getModel().getName().equals("park_b")) { + return; + } + + if (InfobusManager.getInstance().getCurrentPoll() == null) { + return; + } + + int choice = reader.readInt(); + var currentPoll = InfobusManager.getInstance().getCurrentPoll(); + + if (choice <= 0 || choice > currentPoll.getPollData().getAnswers().size()) { + return; + } + + if (InfobusDao.hasAnswer(currentPoll.getId(), player.getDetails().getId())) { + return; + } + + InfobusDao.addAnswer(currentPoll.getId(), choice - 1, player.getDetails().getId()); + + if (InfobusManager.getInstance().canUpdateResults()) { + InfobusManager.getInstance().showPollResults(InfobusManager.getInstance().getCurrentPoll().getId()); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/inventory/GETSTRIP.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/inventory/GETSTRIP.java new file mode 100644 index 0000000..6ebdc7d --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/inventory/GETSTRIP.java @@ -0,0 +1,39 @@ +package org.alexdev.havana.messages.incoming.inventory; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class GETSTRIP implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + int stripId = reader.readInt(); + String stripView = null; + + if (stripId == 0) { + stripView = "last"; + } + + if (stripId == 1) { + stripView = "next"; + } + + if (stripId == 2) { + stripView = "prev"; + } + + if (stripId == 3) { + stripView = "new"; + } + + if (stripId == 4) { + stripView = "current"; + } + + if (stripView == null) { + return; + } + + player.getInventory().getView(stripView); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/jukebox/ADD_JUKEBOX_DISC.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/jukebox/ADD_JUKEBOX_DISC.java new file mode 100644 index 0000000..e3b255c --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/jukebox/ADD_JUKEBOX_DISC.java @@ -0,0 +1,69 @@ +package org.alexdev.havana.messages.incoming.jukebox; + +import org.alexdev.havana.dao.mysql.JukeboxDao; +import org.alexdev.havana.dao.mysql.SongMachineDao; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.song.Song; +import org.alexdev.havana.game.song.jukebox.JukeboxManager; +import org.alexdev.havana.messages.outgoing.jukebox.JUKEBOX_DISCS; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class ADD_JUKEBOX_DISC implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + Room room = player.getRoomUser().getRoom(); + + if (room.getItemManager().getSoundMachine() == null) { + return; + } + + if (!room.hasRights(player.getDetails().getId()) && !player.hasFuse(Fuseright.MOD)) { + return; + } + + int itemId = reader.readInt(); + int slotId = reader.readInt(); + + Item songDisk = null; + + for (Item item : player.getInventory().getItems()) { + if (item.getVirtualId() == itemId && item.isVisible()) { + songDisk = item; + break; + } + } + + if (songDisk == null) { + return; + } + + songDisk.setHidden(true); + songDisk.save(); + + player.getInventory().getView("new"); // Refresh hand + + int songId = JukeboxDao.getSongIdByItem(songDisk.getDatabaseId()); + Song song = SongMachineDao.getSong(songId); + + if (song == null) { + return; + } + + if (slotId < 1 || slotId > 10) { + return; + } + + JukeboxDao.editDisk(songDisk.getDatabaseId(), room.getItemManager().getSoundMachine().getDatabaseId(), slotId); + + room.send(new JUKEBOX_DISCS(JukeboxManager.getInstance().getDisks(room.getItemManager().getSoundMachine().getDatabaseId()))); + new GET_USER_SONG_DISCS().handle(player, null); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/jukebox/GET_JUKEBOX_DISCS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/jukebox/GET_JUKEBOX_DISCS.java new file mode 100644 index 0000000..59f375c --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/jukebox/GET_JUKEBOX_DISCS.java @@ -0,0 +1,38 @@ +package org.alexdev.havana.messages.incoming.jukebox; + +import org.alexdev.havana.dao.mysql.JukeboxDao; +import org.alexdev.havana.dao.mysql.SongMachineDao; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.song.jukebox.BurnedDisk; +import org.alexdev.havana.game.song.Song; +import org.alexdev.havana.game.song.jukebox.JukeboxManager; +import org.alexdev.havana.messages.outgoing.jukebox.JUKEBOX_DISCS; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +import java.util.HashMap; +import java.util.Map; + +public class GET_JUKEBOX_DISCS implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + Room room = player.getRoomUser().getRoom(); + + if (room.getItemManager().getSoundMachine() == null) { + return; + } + + if (!room.hasRights(player.getDetails().getId()) && !player.hasFuse(Fuseright.MOD)) { + return; + } + + + player.send(new JUKEBOX_DISCS(JukeboxManager.getInstance().getDisks(room.getItemManager().getSoundMachine().getDatabaseId()))); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/jukebox/GET_USER_SONG_DISCS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/jukebox/GET_USER_SONG_DISCS.java new file mode 100644 index 0000000..29c15d0 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/jukebox/GET_USER_SONG_DISCS.java @@ -0,0 +1,46 @@ +package org.alexdev.havana.messages.incoming.jukebox; + +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.jukebox.USER_SONG_DISKS; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +import java.util.HashMap; +import java.util.Map; + +public class GET_USER_SONG_DISCS implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + Room room = player.getRoomUser().getRoom(); + + if (room.getItemManager().getSoundMachine() == null) { + return; + } + + if (!room.hasRights(player.getDetails().getId()) && !player.hasFuse(Fuseright.MOD)) { + return; + } + + Map userDisks = new HashMap<>(); + + for (Item item : player.getInventory().getItems()) { + if (!item.isVisible()) { + continue; + } + + if (item.hasBehaviour(ItemBehaviour.SONG_DISK)) { + userDisks.put(item, item.getVirtualId()); + } + } + + player.send(new USER_SONG_DISKS(userDisks)); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/jukebox/JUKEBOX_PLAYLIST_ADD.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/jukebox/JUKEBOX_PLAYLIST_ADD.java new file mode 100644 index 0000000..36e50e8 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/jukebox/JUKEBOX_PLAYLIST_ADD.java @@ -0,0 +1,55 @@ +package org.alexdev.havana.messages.incoming.jukebox; + +import org.alexdev.havana.dao.mysql.SongMachineDao; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.song.SongPlaylist; +import org.alexdev.havana.game.song.jukebox.BurnedDisk; +import org.alexdev.havana.game.song.jukebox.JukeboxManager; +import org.alexdev.havana.messages.outgoing.songs.SONG_PLAYLIST; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +public class JUKEBOX_PLAYLIST_ADD implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + Room room = player.getRoomUser().getRoom(); + + if (room.getItemManager().getSoundMachine() == null) { + return; + } + + if (!room.hasRights(player.getDetails().getId()) && !player.hasFuse(Fuseright.MOD)) { + //return; + } + + int songId = reader.readInt(); + SongMachineDao.removePlaylistSong(songId, room.getItemManager().getSoundMachine().getDatabaseId()); + + var playList = SongMachineDao.getSongPlaylist(room.getItemManager().getSoundMachine().getDatabaseId()); + var loadedDiscs = JukeboxManager.getInstance().getDisks(room.getItemManager().getSoundMachine().getDatabaseId()); + + // Don't load a song if it's not in the jukebox + if (loadedDiscs.keySet().stream().noneMatch(disc -> disc.getSongId() == songId)) { + return; + } + + List sortedDisks = new ArrayList<>(loadedDiscs.keySet()); + sortedDisks.sort(Comparator.comparingInt(BurnedDisk::getSlotId)); + + int newSlotId = (sortedDisks.size() > 0 ? sortedDisks.get(0).getSlotId() : 0) + 1; + SongMachineDao.addPlaylist(room.getItemManager().getSoundMachine().getDatabaseId(), songId, newSlotId); + + playList.add(new SongPlaylist(room.getItemManager().getSoundMachine().getDatabaseId(), SongMachineDao.getSong(songId), newSlotId)); + room.send(new SONG_PLAYLIST(playList)); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/jukebox/REMOVE_JUKEBOX_DISC.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/jukebox/REMOVE_JUKEBOX_DISC.java new file mode 100644 index 0000000..0e65678 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/jukebox/REMOVE_JUKEBOX_DISC.java @@ -0,0 +1,67 @@ +package org.alexdev.havana.messages.incoming.jukebox; + +import org.alexdev.havana.dao.mysql.JukeboxDao; +import org.alexdev.havana.dao.mysql.SongMachineDao; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.song.jukebox.BurnedDisk; +import org.alexdev.havana.game.song.jukebox.JukeboxManager; +import org.alexdev.havana.messages.outgoing.jukebox.JUKEBOX_DISCS; +import org.alexdev.havana.messages.outgoing.songs.SONG_PLAYLIST; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class REMOVE_JUKEBOX_DISC implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + Room room = player.getRoomUser().getRoom(); + + if (room.getItemManager().getSoundMachine() == null) { + return; + } + + if (!room.hasRights(player.getDetails().getId()) && !player.hasFuse(Fuseright.MOD)) { + return; + } + + int slotId = reader.readInt(); + BurnedDisk burnedDisk = JukeboxDao.getDisk(room.getItemManager().getSoundMachine().getDatabaseId(), slotId); + + if (burnedDisk == null) { + return; + } + + Item songDisk = null; + + for (Item item : player.getInventory().getItems()) { + if ((burnedDisk.getItemId() == item.getDatabaseId()) && !item.isVisible()) { + songDisk = item; + break; + } + } + + if (songDisk == null) { + return; + } + + songDisk.setHidden(false); + player.getInventory().addItem(songDisk); // Re-add at start. + + songDisk.save(); + + SongMachineDao.removePlaylistSong(burnedDisk.getSongId(), room.getItemManager().getSoundMachine().getDatabaseId()); + JukeboxDao.editDisk(songDisk.getDatabaseId(), 0, 0); + + player.getInventory().getView("new"); // Refresh hand + new GET_USER_SONG_DISCS().handle(player, null); + + room.send(new SONG_PLAYLIST(SongMachineDao.getSongPlaylist(room.getItemManager().getSoundMachine().getDatabaseId()))); + room.send(new JUKEBOX_DISCS(JukeboxManager.getInstance().getDisks(room.getItemManager().getSoundMachine().getDatabaseId()))); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/jukebox/RESET_JUKEBOX.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/jukebox/RESET_JUKEBOX.java new file mode 100644 index 0000000..b8e999f --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/jukebox/RESET_JUKEBOX.java @@ -0,0 +1,33 @@ +package org.alexdev.havana.messages.incoming.jukebox; + +import org.alexdev.havana.dao.mysql.SongMachineDao; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.songs.SONG_PLAYLIST; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +import java.util.List; + +public class RESET_JUKEBOX implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + Room room = player.getRoomUser().getRoom(); + + if (room.getItemManager().getSoundMachine() == null) { + return; + } + + if (!room.hasRights(player.getDetails().getId()) && !player.hasFuse(Fuseright.MOD)) { + return; + } + + SongMachineDao.clearPlaylist(room.getItemManager().getSoundMachine().getDatabaseId()); + room.send(new SONG_PLAYLIST(List.of())); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/messenger/FINDUSER.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/messenger/FINDUSER.java new file mode 100644 index 0000000..67e3614 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/messenger/FINDUSER.java @@ -0,0 +1,39 @@ +package org.alexdev.havana.messages.incoming.messenger; + +import org.alexdev.havana.dao.mysql.MessengerDao; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.messages.outgoing.messenger.MESSENGER_SEARCH; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +import java.util.ArrayList; +import java.util.List; + +public class FINDUSER implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + String searchQuery = reader.readString(); + + List userList = MessengerDao.search(searchQuery.toLowerCase()); + + List friends = new ArrayList<>(); + List others = new ArrayList<>(); + + for (int userId : userList) { + if (player.getMessenger().hasFriend(userId)) { + friends.add(PlayerManager.getInstance().getPlayerData(userId)); + } else { + others.add(PlayerManager.getInstance().getPlayerData(userId)); + } + } + + friends.removeIf(playerDetails -> playerDetails.getId() == player.getDetails().getId()); + + others.removeIf(playerDetails -> playerDetails.getId() == player.getDetails().getId()); + others.removeIf(playerDetails -> playerDetails.getName().equals("Abigail.Ryan")); + + player.send(new MESSENGER_SEARCH(friends, others)); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/messenger/FOLLOW_FRIEND.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/messenger/FOLLOW_FRIEND.java new file mode 100644 index 0000000..1a5182c --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/messenger/FOLLOW_FRIEND.java @@ -0,0 +1,61 @@ +package org.alexdev.havana.messages.incoming.messenger; + +import org.alexdev.havana.game.messenger.MessengerUser; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.RoomManager; +import org.alexdev.havana.messages.outgoing.messenger.FOLLOW_ERROR; +import org.alexdev.havana.messages.outgoing.messenger.ROOMFORWARD; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class FOLLOW_FRIEND implements MessageEvent { + private enum FollowErrors { + NOT_FRIEND(0), + OFFLINE(1), + ON_HOTELVIEW(2), + NO_CREEPING_ALLOWED(3); + + private int id; + + FollowErrors(int id) { + this.id = id; + } + + public int getErrorId(){ + return id; + } + } + + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + int friendId = reader.readInt(); + + if (!player.getMessenger().hasFriend(friendId)) { + player.send(new FOLLOW_ERROR(FollowErrors.NOT_FRIEND.getErrorId())); // Not their friend + return; + } + + Player friend = PlayerManager.getInstance().getPlayerById(friendId); + + if (friend == null) { + player.send(new FOLLOW_ERROR(FollowErrors.OFFLINE.getErrorId())); // Friend is not online + return; + } + + if (friend.getRoomUser().getRoom() == null || !new MessengerUser(friend.getDetails()).canFollowFriend(player)) { + player.send(new FOLLOW_ERROR(FollowErrors.ON_HOTELVIEW.getErrorId())); // Friend is on hotelview + return; + } + + if (!friend.getDetails().doesAllowStalking()) { + player.send(new FOLLOW_ERROR(FollowErrors.NO_CREEPING_ALLOWED.getErrorId())); // Friend does not allow stalking + return; + } + + Room friendRoom = friend.getRoomUser().getRoom(); + player.getMessenger().hasFollowed(friendRoom); + friendRoom.forward(player, false); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/messenger/FRIENDLIST_UPDATE.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/messenger/FRIENDLIST_UPDATE.java new file mode 100644 index 0000000..e0c28a8 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/messenger/FRIENDLIST_UPDATE.java @@ -0,0 +1,13 @@ +package org.alexdev.havana.messages.incoming.messenger; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.messenger.FRIENDS_UPDATE; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class FRIENDLIST_UPDATE implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + player.send(new FRIENDS_UPDATE(player, player.getMessenger())); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/messenger/INVITE_FRIEND.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/messenger/INVITE_FRIEND.java new file mode 100644 index 0000000..414ed17 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/messenger/INVITE_FRIEND.java @@ -0,0 +1,53 @@ +package org.alexdev.havana.messages.incoming.messenger; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.messenger.INSTANT_MESSAGE_INVITATION; +import org.alexdev.havana.messages.outgoing.messenger.INVITATION_ERROR; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.util.StringUtil; + +import java.util.ArrayList; +import java.util.List; + +public class INVITE_FRIEND implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + Room room = player.getRoomUser().getRoom(); + + if (room == null) { + return; + } + + + int users = reader.readInt(); + + List friends = new ArrayList<>(); + + for (int i = 0; i < users; i++) { + int userId = reader.readInt(); + + if (!player.getMessenger().hasFriend(userId)) { + player.send(new INVITATION_ERROR()); + break; + } + + Player friend = PlayerManager.getInstance().getPlayerById(userId); + + if (friend == null) { + player.send(new INVITATION_ERROR()); + continue; + } + + friends.add(friend); + } + + String message = StringUtil.filterInput(reader.readString(), false); + + for (Player friend : friends) { + friend.send(new INSTANT_MESSAGE_INVITATION(player.getDetails().getId(), message)); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/messenger/MESSENGERINIT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/messenger/MESSENGERINIT.java new file mode 100644 index 0000000..075e898 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/messenger/MESSENGERINIT.java @@ -0,0 +1,16 @@ +package org.alexdev.havana.messages.incoming.messenger; + +import org.alexdev.havana.game.messenger.Messenger; +import org.alexdev.havana.game.messenger.MessengerManager; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.messenger.MESSENGER_INIT; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class MESSENGERINIT implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + Messenger messenger = MessengerManager.getInstance().getMessengerData(player.getDetails().getId()); + player.send(new MESSENGER_INIT(player, messenger)); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/messenger/MESSENGER_ACCEPTBUDDY.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/messenger/MESSENGER_ACCEPTBUDDY.java new file mode 100644 index 0000000..f934ddd --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/messenger/MESSENGER_ACCEPTBUDDY.java @@ -0,0 +1,73 @@ +package org.alexdev.havana.messages.incoming.messenger; + +import org.alexdev.havana.dao.mysql.MessengerDao; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.game.messenger.*; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.messages.outgoing.messenger.ADD_BUDDY; +import org.alexdev.havana.messages.outgoing.messenger.BUDDY_REQUEST_RESULT; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.server.util.MalformedPacketException; + +import java.util.ArrayList; +import java.util.List; + +public class MESSENGER_ACCEPTBUDDY implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + List errors = new ArrayList<>(); + + int amount = reader.readInt(); + + for (int i = 0; i < amount; i++) { + int userId = reader.readInt(); + + MessengerUser newBuddy = player.getMessenger().getRequest(userId); + + if (newBuddy == null) { + MessengerError error = new MessengerError(MessengerErrorType.FRIEND_REQUEST_NOT_FOUND); + error.setCauser(""); + + errors.add(error); + continue; + } + + Messenger newBuddyData = MessengerManager.getInstance().getMessengerData(userId); + + if (newBuddyData == null) { + // log warning + continue; + } + + if (player.getMessenger().isFriendsLimitReached()) { + MessengerError error = new MessengerError(MessengerErrorType.FRIENDLIST_FULL); + error.setCauser(newBuddy.getUsername()); + + errors.add(error); + continue; + } + + if (newBuddyData.isFriendsLimitReached()) { + MessengerError error = new MessengerError(MessengerErrorType.TARGET_FRIEND_LIST_FULL); + error.setCauser(newBuddy.getUsername()); + + errors.add(error); + continue; + } + + /*if (!newBuddyData.allowsFriendRequests()) { + MessengerError error = new MessengerError(MessengerErrorType.TARGET_DOES_NOT_ACCEPT); + error.setCauser(newBuddy.getUsername()); + + errors.add(error); + continue; + }*/ + + player.getMessenger().addFriend(newBuddy); + } + + player.send(new BUDDY_REQUEST_RESULT(errors)); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/messenger/MESSENGER_DECLINEBUDDY.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/messenger/MESSENGER_DECLINEBUDDY.java new file mode 100644 index 0000000..000833b --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/messenger/MESSENGER_DECLINEBUDDY.java @@ -0,0 +1,31 @@ +package org.alexdev.havana.messages.incoming.messenger; + +import org.alexdev.havana.game.messenger.MessengerUser; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class MESSENGER_DECLINEBUDDY implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + boolean declineAll = reader.readBoolean(); + + if (declineAll) { + player.getMessenger().declineAllRequests(); + return; + } + + int amount = reader.readInt(); + + for (int i = 0; i < amount; i++) { + int userId = reader.readInt(); + + if (!player.getMessenger().hasRequest(userId)) { + continue; + } + + MessengerUser requester = player.getMessenger().getRequest(userId); + player.getMessenger().declineRequest(requester); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/messenger/MESSENGER_GETMESSAGES.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/messenger/MESSENGER_GETMESSAGES.java new file mode 100644 index 0000000..aab3b84 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/messenger/MESSENGER_GETMESSAGES.java @@ -0,0 +1,16 @@ +package org.alexdev.havana.messages.incoming.messenger; + +import org.alexdev.havana.game.messenger.MessengerMessage; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.messenger.MESSENGER_MSG; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class MESSENGER_GETMESSAGES implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + for (MessengerMessage offlineMessage : player.getMessenger().getOfflineMessages().values()) { + player.send(new MESSENGER_MSG(offlineMessage)); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/messenger/MESSENGER_GETREQUESTS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/messenger/MESSENGER_GETREQUESTS.java new file mode 100644 index 0000000..5be4b8b --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/messenger/MESSENGER_GETREQUESTS.java @@ -0,0 +1,13 @@ +package org.alexdev.havana.messages.incoming.messenger; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.messenger.FRIEND_REQUESTS; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class MESSENGER_GETREQUESTS implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + player.send(new FRIEND_REQUESTS(player.getMessenger().getRequests())); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/messenger/MESSENGER_MARKREAD.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/messenger/MESSENGER_MARKREAD.java new file mode 100644 index 0000000..5b67cf2 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/messenger/MESSENGER_MARKREAD.java @@ -0,0 +1,19 @@ +package org.alexdev.havana.messages.incoming.messenger; + +import org.alexdev.havana.dao.mysql.MessengerDao; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.server.util.MalformedPacketException; + +import java.sql.SQLException; + +public class MESSENGER_MARKREAD implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws SQLException, MalformedPacketException { + int messageId = reader.readInt(); + + MessengerDao.markMessageRead(messageId); + player.getMessenger().getOfflineMessages().remove(messageId); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/messenger/MESSENGER_REMOVEBUDDY.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/messenger/MESSENGER_REMOVEBUDDY.java new file mode 100644 index 0000000..7f8d854 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/messenger/MESSENGER_REMOVEBUDDY.java @@ -0,0 +1,68 @@ +package org.alexdev.havana.messages.incoming.messenger; + +import org.alexdev.havana.game.messenger.*; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.messages.outgoing.messenger.MESSENGER_ERROR; +import org.alexdev.havana.messages.outgoing.messenger.REMOVE_BUDDY; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +import java.util.ArrayList; +import java.util.List; + +public class MESSENGER_REMOVEBUDDY implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + // How many friends to remove? + int size = reader.readInt(); + + // List for removed friends + List friendsRemoved = new ArrayList<>(); + + // Friend instance, used later + MessengerUser meAsFriend = player.getMessenger().getMessengerUser(); + + // Remove all friends requested to be removed + for (int i = 0; i < size; i++) { + int friendId = reader.readInt(); + + MessengerUser friend = player.getMessenger().getFriend(friendId); + + // If the clients requests a friend to be removed whom is not a friend, something has gone terribly wrong. + if (!player.getMessenger().hasFriend(friendId)) { + player.send(new MESSENGER_ERROR(new MessengerError(MessengerErrorType.CONCURRENCY_ERROR))); + return; + } + + // Remove friend from our messenger + if (!player.getMessenger().removeFriend(friendId)) { + player.send(new MESSENGER_ERROR(new MessengerError(MessengerErrorType.CONCURRENCY_ERROR))); + return; + } + + // Get messenger data of friend + Messenger friendMessenger = MessengerManager.getInstance().getMessengerData(friendId); + + // Remove myself from friend's messenger + if (!friendMessenger.removeFriend(meAsFriend.getUserId())) { + player.send(new MESSENGER_ERROR(new MessengerError(MessengerErrorType.CONCURRENCY_ERROR))); + return; + } + + // Get player instance of friend, will return null if not online + Player playerFriend = PlayerManager.getInstance().getPlayerById(friendId); + + // If friend is online, send remove friend message + if (playerFriend != null) { + playerFriend.send(new REMOVE_BUDDY(playerFriend, meAsFriend)); + } + + // Add removed friend to list + friendsRemoved.add(friend); + + // Send list of removed friends + player.send(new REMOVE_BUDDY(player, friend)); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/messenger/MESSENGER_REQUESTBUDDY.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/messenger/MESSENGER_REQUESTBUDDY.java new file mode 100644 index 0000000..6707c7f --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/messenger/MESSENGER_REQUESTBUDDY.java @@ -0,0 +1,60 @@ +package org.alexdev.havana.messages.incoming.messenger; + +import org.alexdev.havana.game.messenger.Messenger; +import org.alexdev.havana.game.messenger.MessengerError; +import org.alexdev.havana.game.messenger.MessengerErrorType; +import org.alexdev.havana.game.messenger.MessengerManager; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.messenger.MESSENGER_ERROR; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class MESSENGER_REQUESTBUDDY implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + String username = reader.readString(); + Messenger target = MessengerManager.getInstance().getMessengerData(username); + + if (username.equalsIgnoreCase("Abigail.Ryan")) { + target = null; + } + + if (target == null) { + // Error type in external texts has it defined as "There was an error finding the user for the friend request" + player.send(new MESSENGER_ERROR(new MessengerError(MessengerErrorType.FRIEND_REQUEST_NOT_FOUND))); + return; + } + + Messenger callee = player.getMessenger(); + + if (username.toLowerCase().equals(player.getDetails().getName())) { + return; + } + + if (callee.isFriendsLimitReached()) { + player.send(new MESSENGER_ERROR(new MessengerError(MessengerErrorType.FRIENDLIST_FULL))); + return; + } + + if (target.hasFriend(player.getDetails().getId())) { + return; + } + + if (target.hasRequest(player.getDetails().getId())) { + return; + } + + if (target.isFriendsLimitReached()) { + player.send(new MESSENGER_ERROR(new MessengerError(MessengerErrorType.TARGET_FRIEND_LIST_FULL))); + return; + } + + if (!target.allowsFriendRequests()) { + player.send(new MESSENGER_ERROR(new MessengerError(MessengerErrorType.TARGET_DOES_NOT_ACCEPT))); + return; + } + + + target.addRequest(callee.getMessengerUser()); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/messenger/MESSENGER_SENDMSG.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/messenger/MESSENGER_SENDMSG.java new file mode 100644 index 0000000..14b16d6 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/messenger/MESSENGER_SENDMSG.java @@ -0,0 +1,69 @@ +package org.alexdev.havana.messages.incoming.messenger; + +import org.alexdev.havana.dao.mysql.MessengerDao; +import org.alexdev.havana.game.messenger.MessengerMessage; +import org.alexdev.havana.game.messenger.MessengerUser; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.wordfilter.WordfilterManager; +import org.alexdev.havana.messages.outgoing.messenger.INSTANT_MESSAGE_ERROR; +import org.alexdev.havana.messages.outgoing.messenger.MESSENGER_MSG; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.StringUtil; + +public class MESSENGER_SENDMSG implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + //int amount = reader.readInt(); + + /*List friends = new ArrayList<>(); + + for (int i = 0; i < amount; i++) { + int friend_id = reader.readInt(); + friends.add(friend_id); + }*/ + + int userId = reader.readInt(); + + String originalMessage = reader.readString(); + String message = WordfilterManager.filterMandatorySentence(StringUtil.filterInput(originalMessage, false)); + + if (message.isBlank()) { + return; + } + + if (WordfilterManager.hasBannableSentence(player, originalMessage)) { + WordfilterManager.performBan(player); + return; + } + + if (player.isMuted()) { + PlayerManager.getInstance().showMutedAlert(player); + return; + } + + MessengerUser friend = player.getMessenger().getFriend(userId); + + if (friend == null) { + player.send(new INSTANT_MESSAGE_ERROR(6, userId)); + return; + } + + Player friendPlayer = PlayerManager.getInstance().getPlayerById(userId); + + if (friendPlayer == null) { + player.send(new INSTANT_MESSAGE_ERROR(5, userId)); + return; + } + + String chatMessage = friendPlayer.getDetails().isWordFilterEnabled() ? WordfilterManager.filterSentence(message) : message; + int messageId = MessengerDao.newMessage(player.getDetails().getId(), userId, originalMessage); + + MessengerMessage msg = new MessengerMessage( + messageId, userId, player.getDetails().getId(), DateUtil.getCurrentTimeSeconds(), chatMessage); + + friendPlayer.send(new MESSENGER_MSG(msg)); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/moderation/CHANGECALLCATEGORY.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/moderation/CHANGECALLCATEGORY.java new file mode 100644 index 0000000..fbc90ee --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/moderation/CHANGECALLCATEGORY.java @@ -0,0 +1,23 @@ +package org.alexdev.havana.messages.incoming.moderation; + +import org.alexdev.havana.game.moderation.cfh.CallForHelp; +import org.alexdev.havana.game.moderation.cfh.CallForHelpManager; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class CHANGECALLCATEGORY implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (!player.hasFuse(Fuseright.RECEIVE_CALLS_FOR_HELP)) { + return; + } + + int callId = Integer.parseInt(reader.readString()); + int category = reader.readInt(); + + CallForHelp cfh = CallForHelpManager.getInstance().getCall(callId); + CallForHelpManager.getInstance().changeCategory(cfh, category); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/moderation/DELETE_CRY.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/moderation/DELETE_CRY.java new file mode 100644 index 0000000..9e833c6 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/moderation/DELETE_CRY.java @@ -0,0 +1,22 @@ +package org.alexdev.havana.messages.incoming.moderation; + +import org.alexdev.havana.game.moderation.cfh.CallForHelp; +import org.alexdev.havana.game.moderation.cfh.CallForHelpManager; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.moderation.CFH_ACK; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class DELETE_CRY implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + CallForHelp cfh = CallForHelpManager.getInstance().getPendingCall(player.getDetails().getId()); + + if (cfh == null) { + return; + } + + CallForHelpManager.getInstance().deleteCall(cfh); + player.send(new CFH_ACK(null)); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/moderation/FOLLOW_CRYFORHELP.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/moderation/FOLLOW_CRYFORHELP.java new file mode 100644 index 0000000..f216627 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/moderation/FOLLOW_CRYFORHELP.java @@ -0,0 +1,31 @@ +package org.alexdev.havana.messages.incoming.moderation; + +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.moderation.cfh.CallForHelp; +import org.alexdev.havana.game.moderation.cfh.CallForHelpManager; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class FOLLOW_CRYFORHELP implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (!player.hasFuse(Fuseright.RECEIVE_CALLS_FOR_HELP)) { + return; + } + + int callId = Integer.parseInt(reader.readString()); + CallForHelp cfh = CallForHelpManager.getInstance().getCall(callId); + + if (cfh == null) { + return; + } + + if (cfh.getRoom() == null) { + return; + } + + cfh.getRoom().forward(player, false); + CallForHelpManager.getInstance().deleteCall(cfh); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/moderation/MESSAGETOCALLER.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/moderation/MESSAGETOCALLER.java new file mode 100644 index 0000000..0250cf5 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/moderation/MESSAGETOCALLER.java @@ -0,0 +1,37 @@ +package org.alexdev.havana.messages.incoming.moderation; + +import org.alexdev.havana.game.moderation.cfh.CallForHelp; +import org.alexdev.havana.game.moderation.cfh.CallForHelpManager; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.messages.outgoing.moderation.CRY_REPLY; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class MESSAGETOCALLER implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (!player.hasFuse(Fuseright.RECEIVE_CALLS_FOR_HELP)) { + return; + } + + int callId = Integer.parseInt(reader.readString()); + String message = reader.readString(); + + CallForHelp cfh = CallForHelpManager.getInstance().getCall(callId); + + if (cfh == null) { + return; + } + + Player caller = PlayerManager.getInstance().getPlayerById(cfh.getCaller()); + + if (caller == null) { + return; + } + + caller.send(new CRY_REPLY(message)); + CallForHelpManager.getInstance().deleteCall(cfh); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/moderation/MODERATORACTION.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/moderation/MODERATORACTION.java new file mode 100644 index 0000000..55cc90d --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/moderation/MODERATORACTION.java @@ -0,0 +1,104 @@ +package org.alexdev.havana.messages.incoming.moderation; + +import org.alexdev.havana.dao.mysql.ModerationDao; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.moderation.ModerationActionType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.texts.TextsManager; +import org.alexdev.havana.messages.outgoing.rooms.user.HOTEL_VIEW; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; +import org.alexdev.havana.messages.outgoing.moderation.MODERATOR_ALERT; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +import java.util.List; + +public class MODERATORACTION implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + int targetType = reader.readInt(); + int actionType = reader.readInt(); + + String alertMessage = reader.readString(); + String notes = reader.readString(); + + for (ModerationActionType moderationActionType : ModerationActionType.values()) { + if (moderationActionType.getTargetType() == targetType && + moderationActionType.getActionType() == actionType) { + moderationActionType.getModerationAction().performAction(player, player.getRoomUser().getRoom(), alertMessage, notes, reader); + } + } + + // TODO: refactor this if-else mess in something more syntactically pleasing + /*if (commandCat == 0) { + // User Command + if (commandId == 0 && player.hasFuse(Fuseright.ROOM_ALERT)) { + String alertUser = reader.readString(); + + Player target = PlayerManager.getInstance().getPlayerByName(alertUser); + + if (target != null) { + target.send(new MODERATOR_ALERT(alertMessage)); + ModerationDao.addLog(ModerationActionType.ALERT_USER, player.getDetails().getId(), target.getDetails().getId(), alertMessage, notes); + } else { + player.send(new ALERT("Target user is not online.")); + } + } else if (commandId == 1 && player.hasFuse(Fuseright.KICK)) { + // Kick + String alertUser = reader.readString(); + Player target = PlayerManager.getInstance().getPlayerByName(alertUser); + + if (target != null) { + if (target.getDetails().getId() == player.getDetails().getId()) { + return; // Can't kick yourself! + } + + if (target.hasFuse(Fuseright.KICK)) { + player.send(new ALERT(TextsManager.getInstance().getValue("modtool_rankerror"))); + return; + } + + target.getRoomUser().kick(false); + target.send(new HOTEL_VIEW()); + target.send(new MODERATOR_ALERT(alertMessage)); + + ModerationDao.addLog(ModerationActionType.KICK_USER, player.getDetails().getId(), target.getDetails().getId(), alertMessage, notes); + } else { + player.send(new ALERT("Target user is not online.")); + } + } else if (commandId == 2 && player.hasFuse(Fuseright.BAN)) { + //Ban + // TODO: Banning + } + } else if (commandCat == 1) { + // Room Command + if (commandId == 0 && player.hasFuse(Fuseright.ROOM_ALERT)) { + List players = player.getRoomUser().getRoom().getEntityManager().getPlayers(); + + for (Player target : players) { + target.send(new MODERATOR_ALERT(alertMessage)); + } + + ModerationDao.addLog(ModerationActionType.ROOM_ALERT, player.getDetails().getId(), -1, alertMessage, notes); + } else if (commandId == 1 && player.hasFuse(Fuseright.ROOM_KICK)) { + // Room Kick + List players = player.getRoomUser().getRoom().getEntityManager().getPlayers(); + + for (Player target : players) { + // Don't kick other moderators + if (target.hasFuse(Fuseright.ROOM_KICK)) { + continue; + } + + target.getRoomUser().kick(false); + + target.send(new HOTEL_VIEW()); + target.send(new MODERATOR_ALERT(alertMessage)); + + ModerationDao.addLog(ModerationActionType.ROOM_KICK, player.getDetails().getId(), -1, alertMessage, notes); + } + } + }*/ + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/moderation/PICK_CALLFORHELP.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/moderation/PICK_CALLFORHELP.java new file mode 100644 index 0000000..1b8a04b --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/moderation/PICK_CALLFORHELP.java @@ -0,0 +1,32 @@ +package org.alexdev.havana.messages.incoming.moderation; + +import org.alexdev.havana.game.moderation.cfh.CallForHelp; +import org.alexdev.havana.game.moderation.cfh.CallForHelpManager; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class PICK_CALLFORHELP implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (!player.hasFuse(Fuseright.RECEIVE_CALLS_FOR_HELP)) { + return; + } + + int callId = Integer.parseInt(reader.readString()); + boolean blockCfh = reader.readBoolean(); + + CallForHelp cfh = CallForHelpManager.getInstance().getCall(callId); + + if (cfh == null) { + return; + } + + CallForHelpManager.getInstance().pickUp(cfh, player); + + if (blockCfh) { + CallForHelpManager.getInstance().deleteCall(cfh); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/moderation/REQUEST_CFH.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/moderation/REQUEST_CFH.java new file mode 100644 index 0000000..acd5bf8 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/moderation/REQUEST_CFH.java @@ -0,0 +1,19 @@ +package org.alexdev.havana.messages.incoming.moderation; + +import org.alexdev.havana.game.moderation.cfh.CallForHelp; +import org.alexdev.havana.game.moderation.cfh.CallForHelpManager; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.moderation.CFH_ACK; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class REQUEST_CFH implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + // Retrieve open calls from the current user + CallForHelp call = CallForHelpManager.getInstance().getPendingCall(player.getDetails().getId()); + + // Send details + player.send(new CFH_ACK(call)); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/moderation/SUBMIT_CFH.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/moderation/SUBMIT_CFH.java new file mode 100644 index 0000000..e48c8cc --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/moderation/SUBMIT_CFH.java @@ -0,0 +1,28 @@ +package org.alexdev.havana.messages.incoming.moderation; + +import org.alexdev.havana.game.moderation.cfh.CallForHelpManager; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.util.StringUtil; + +public class SUBMIT_CFH implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + String message = StringUtil.filterInput(reader.readString(), false); + + if (message.length() == 0) { + return; + } + + if (CallForHelpManager.getInstance().hasPendingCall(player)) { + return; + } + + CallForHelpManager.getInstance().submitCall(player, message); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/navigator/ADD_FAVORITE_ROOM.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/navigator/ADD_FAVORITE_ROOM.java new file mode 100644 index 0000000..c691045 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/navigator/ADD_FAVORITE_ROOM.java @@ -0,0 +1,53 @@ +package org.alexdev.havana.messages.incoming.navigator; + +import org.alexdev.havana.dao.mysql.RoomFavouritesDao; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.RoomManager; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +import java.util.List; + +public class ADD_FAVORITE_ROOM implements MessageEvent { + public static final int MAX_FAVOURITES = 30; + + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + int roomType = reader.readInt(); + int roomId = reader.readInt(); + + if (roomType == 1) { + roomId = (roomId - RoomManager.PUBLIC_ROOM_OFFSET); + } + + Room room = RoomManager.getInstance().getRoomById(roomId); + + if (room == null) { + return; // Room was null, ignore request + } + + List favouritesList = RoomManager.getInstance().getFavouriteRooms(player.getDetails().getId(), false); + + for (Room favroom : favouritesList) { + if (favroom.getId() == roomId) { + return; // Room already added, ignore request + } + } + + if (RoomManager.getInstance().getRoomById(roomId) == null) { + return; + } + + // Only count private rooms since there's a limited number of public rooms + int finalRoomId = roomId; + + var privateFavouriteRooms = RoomManager.getInstance().getFavouriteRooms(player.getDetails().getId(), false); + if (privateFavouriteRooms.size() >= MAX_FAVOURITES || privateFavouriteRooms.stream().anyMatch(r -> r.getId() == finalRoomId)) { + //player.send(new FLASH_ADD_FAVOURITE_FAILED()); + return; + } + + RoomFavouritesDao.addFavouriteRoom(player.getDetails().getId(), roomId); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/navigator/DEL_FAVORITE_ROOM.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/navigator/DEL_FAVORITE_ROOM.java new file mode 100644 index 0000000..9c72169 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/navigator/DEL_FAVORITE_ROOM.java @@ -0,0 +1,21 @@ +package org.alexdev.havana.messages.incoming.navigator; + +import org.alexdev.havana.dao.mysql.RoomFavouritesDao; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.RoomManager; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class DEL_FAVORITE_ROOM implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + int roomType = reader.readInt(); + int roomId = reader.readInt(); + + if (roomType == 1) { + roomId = (roomId - RoomManager.PUBLIC_ROOM_OFFSET); + } + + RoomFavouritesDao.removeFavouriteRoom(player.getDetails().getId(), roomId); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/navigator/GETFVRF.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/navigator/GETFVRF.java new file mode 100644 index 0000000..8f65c87 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/navigator/GETFVRF.java @@ -0,0 +1,23 @@ +package org.alexdev.havana.messages.incoming.navigator; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.RoomManager; +import org.alexdev.havana.messages.outgoing.navigator.FAVOURITEROOMRESULTS; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +import java.util.List; +import java.util.stream.Collectors; + +public class GETFVRF implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + List favouriteRooms = RoomManager.getInstance().getFavouriteRooms(player.getDetails().getId(), false); + + List favouritePublicRooms = favouriteRooms.stream().filter(Room::isPublicRoom).collect(Collectors.toList()); + List favouriteFlatRooms = favouriteRooms.stream().filter(room -> !room.isPublicRoom()).collect(Collectors.toList()); + + player.send(new FAVOURITEROOMRESULTS(player, favouritePublicRooms, favouriteFlatRooms)); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/navigator/GETSPACENODEUSERS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/navigator/GETSPACENODEUSERS.java new file mode 100644 index 0000000..4f88180 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/navigator/GETSPACENODEUSERS.java @@ -0,0 +1,40 @@ +package org.alexdev.havana.messages.incoming.navigator; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.RoomManager; +import org.alexdev.havana.messages.outgoing.navigator.NODESPACEUSERS; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +import java.util.ArrayList; +import java.util.List; + +public class GETSPACENODEUSERS implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + Room room = RoomManager.getInstance().getRoomById(reader.readInt() - RoomManager.PUBLIC_ROOM_OFFSET); + + if (room == null) { + return; + } + + var players = room.getEntityManager().getPlayers(); + + List childRooms; + + if (room.isPublicRoom()) { + childRooms = RoomManager.getInstance().getChildRooms(room); + } else { + childRooms = new ArrayList<>(); + } + + if (childRooms.size() > 0) { + for (Room childRoom : childRooms) { + players.addAll(childRoom.getEntityManager().getPlayers()); + } + } + + player.send(new NODESPACEUSERS(players)); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/navigator/GETUSERFLATCATS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/navigator/GETUSERFLATCATS.java new file mode 100644 index 0000000..68c3e5e --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/navigator/GETUSERFLATCATS.java @@ -0,0 +1,37 @@ +package org.alexdev.havana.messages.incoming.navigator; + +import org.alexdev.havana.game.navigator.NavigatorCategory; +import org.alexdev.havana.game.navigator.NavigatorManager; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.navigator.USERFLATCATS; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +public class GETUSERFLATCATS implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + List categoryList = new ArrayList<>(); + + for (NavigatorCategory category : NavigatorManager.getInstance().getCategories().values()) { + if (category.isPublicSpaces()) { + continue; + } + + if (category.getMinimumRoleAccess().getRankId() > player.getDetails().getRank().getRankId()) { + continue; + } + + if (category.isNode()) { + continue; + } + categoryList.add(category); + } + + categoryList.sort(Comparator.comparingInt(NavigatorCategory::getOrderId)); + player.send(new USERFLATCATS(categoryList)); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/navigator/NAVIGATE.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/navigator/NAVIGATE.java new file mode 100644 index 0000000..9266055 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/navigator/NAVIGATE.java @@ -0,0 +1,97 @@ +package org.alexdev.havana.messages.incoming.navigator; + +import org.alexdev.havana.dao.mysql.NavigatorDao; +import org.alexdev.havana.dao.mysql.RoomDao; +import org.alexdev.havana.game.navigator.NavigatorCategory; +import org.alexdev.havana.game.navigator.NavigatorManager; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.RoomManager; +import org.alexdev.havana.messages.outgoing.navigator.NAVNODEINFO; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +public class NAVIGATE implements MessageEvent { + + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + boolean hideFull = reader.readInt() == 1; + int categoryId = reader.readInt(); + + boolean wasFollow = false; + int originalCategoryId = categoryId; + + if (categoryId >= RoomManager.PUBLIC_ROOM_OFFSET) { // Public room follow, there should not any categories with an ID of 1000 or over... lol + Room room = RoomManager.getInstance().getRoomById(categoryId - RoomManager.PUBLIC_ROOM_OFFSET); + + if (room != null) { + wasFollow = true; + categoryId = room.getCategory().getId(); + } + } + + NavigatorCategory category = NavigatorManager.getInstance().getCategoryById(categoryId); + + if (category == null) { + return; + } + + if (category.getMinimumRoleAccess().getRankId() > player.getDetails().getRank().getRankId()) { + return; + } + + List subCategories = NavigatorManager.getInstance().getCategoriesByParentId(category.getId(), player.getDetails().getRank()); + subCategories.sort(Comparator.comparingInt(NavigatorCategory::getOrderId)); + + List rooms = new ArrayList<>(); + + int categoryCurrentVisitors = category.getCurrentVisitors(); + int categoryMaxVisitors = category.getMaxVisitors(); + + if (category.isPublicSpaces()) { + for (Room room : RoomManager.getInstance().replaceQueryRooms(RoomDao.getRoomsByUserId(0))) { + if (room.getData().isNavigatorHide()) { + continue; + } + + if (room.getData().getCategoryId() != category.getId()) { + continue; + } + + if (hideFull && (room.getData().getVisitorsNow() >= room.getData().getVisitorsMax())) { + continue; + } + + rooms.add(room); + } + } else { + List roomList = RoomManager.getInstance().replaceQueryRooms(NavigatorDao.getRecentRooms(30, category.getId())); + + for (Room room : roomList) { + if (room.getData().getCategoryId() != category.getId()) { + continue; + } + + if (hideFull && (room.getData().getVisitorsNow() >= room.getData().getVisitorsMax())) { + continue; + } + + rooms.add(room); + } + } + + RoomManager.getInstance().sortRooms(rooms); + RoomManager.getInstance().ratingSantiyCheck(rooms); + + player.send(new NAVNODEINFO(player, category, rooms, hideFull, subCategories, categoryCurrentVisitors, categoryMaxVisitors, player.getDetails().getRank().getRankId())); + + if (wasFollow && player.getMessenger().getFollowed() != null) { + player.getMessenger().getFollowed().forward(player, false); + player.getMessenger().hasFollowed(null); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/navigator/RECOMMENDED_ROOMS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/navigator/RECOMMENDED_ROOMS.java new file mode 100644 index 0000000..8063826 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/navigator/RECOMMENDED_ROOMS.java @@ -0,0 +1,35 @@ +package org.alexdev.havana.messages.incoming.navigator; + +import org.alexdev.havana.dao.mysql.RoomDao; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.RoomManager; +import org.alexdev.havana.messages.outgoing.navigator.RECOMMENDED_ROOM_LIST; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +import java.util.List; + +public class RECOMMENDED_ROOMS implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + List roomList = RoomManager.getInstance().replaceQueryRooms(RoomDao.getRecommendedRooms(3, 0)); + + RoomManager.getInstance().sortRooms(roomList); + RoomManager.getInstance().ratingSantiyCheck(roomList); + + /*if (roomList.size() < roomLimit) { + //int difference = roomLimit - roomList.size(); + + for (Room room : RoomManager.getInstance().replaceQueryRooms(RoomDao.getHighestRatedRooms(roomLimit, false))) { + if (roomList.size() == roomLimit) { + break; + } + + roomList.add(room); + } + }*/ + + player.send(new RECOMMENDED_ROOM_LIST(player, roomList)); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/navigator/SRCHF.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/navigator/SRCHF.java new file mode 100644 index 0000000..11084d8 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/navigator/SRCHF.java @@ -0,0 +1,45 @@ +package org.alexdev.havana.messages.incoming.navigator; + +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.dao.mysql.RoomDao; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.RoomManager; +import org.alexdev.havana.messages.outgoing.navigator.NOFLATS; +import org.alexdev.havana.messages.outgoing.navigator.SEARCH_FLAT_RESULTS; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.util.SearchUtil; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class SRCHF implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + String searchQuery = reader.readString(); + int roomOwner = -1; + + if (searchQuery.contains("owner:")) { + var ownerTag = SearchUtil.getOwnerTag(searchQuery); + + if (ownerTag != null) { + roomOwner = PlayerDao.getId(ownerTag.replaceFirst("owner:", "")); + } + + searchQuery = Arrays.stream(searchQuery.split(" ")).filter(s -> !s.toLowerCase().startsWith("owner:")).collect(Collectors.joining(",")); + } + + List roomList = RoomManager.getInstance().replaceQueryRooms(RoomDao.searchRooms(searchQuery, roomOwner, RoomDao.SHOCKWAVE_SEARCH_LIMIT)); + + if (roomList.size() > 0) { + RoomManager.getInstance().sortRooms(roomList); + RoomManager.getInstance().ratingSantiyCheck(roomList); + + player.send(new SEARCH_FLAT_RESULTS(roomList, player)); + } else { + player.send(new NOFLATS()); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/navigator/SUSERF.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/navigator/SUSERF.java new file mode 100644 index 0000000..47ab4f6 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/navigator/SUSERF.java @@ -0,0 +1,28 @@ +package org.alexdev.havana.messages.incoming.navigator; + +import org.alexdev.havana.dao.mysql.RoomDao; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.RoomManager; +import org.alexdev.havana.messages.outgoing.navigator.NOFLATSFORUSER; +import org.alexdev.havana.messages.outgoing.navigator.FLAT_RESULTS; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +import java.util.List; + +public class SUSERF implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + List roomList = RoomManager.getInstance().replaceQueryRooms(RoomDao.getRoomsByUserId(player.getDetails().getId())); + + if (roomList.size() > 0) { + RoomManager.getInstance().sortRooms(roomList); + RoomManager.getInstance().ratingSantiyCheck(roomList); + + player.send(new FLAT_RESULTS(roomList)); + } else { + player.send(new NOFLATSFORUSER(player.getDetails().getName())); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/pets/APPROVE_PET_NAME.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/pets/APPROVE_PET_NAME.java new file mode 100644 index 0000000..609cf44 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/pets/APPROVE_PET_NAME.java @@ -0,0 +1,17 @@ +package org.alexdev.havana.messages.incoming.pets; + +import org.alexdev.havana.game.pets.PetManager; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.pets.NAMEAPPROVED; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class APPROVE_PET_NAME implements MessageEvent { + + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + String name = reader.readString(); + int approveStatus = PetManager.getInstance().isValidName(player.getDetails().getName(), name); + player.send(new NAMEAPPROVED(approveStatus)); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/pets/GETPETSTAT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/pets/GETPETSTAT.java new file mode 100644 index 0000000..96c8c90 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/pets/GETPETSTAT.java @@ -0,0 +1,31 @@ +package org.alexdev.havana.messages.incoming.pets; + +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.pets.Pet; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.pets.PETSTAT; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class GETPETSTAT implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + Room room = player.getRoomUser().getRoom(); + + int petId = reader.readInt(); + String petName = reader.readString(); + + Pet pet = (Pet) room.getEntityManager().getById(petId, EntityType.PET); + + if (pet == null) { + return; + } + + player.send(new PETSTAT(pet)); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/polls/POLL_START.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/polls/POLL_START.java new file mode 100644 index 0000000..f19b104 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/polls/POLL_START.java @@ -0,0 +1,44 @@ +package org.alexdev.havana.messages.incoming.polls; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class POLL_START implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + player.send(new MessageComposer() { + @Override + public void compose(NettyResponse response) { + response.writeInt(1); + response.writeString("123"); + response.writeString("456"); + + int questions = 1; + response.writeInt(questions); + + for (int i = 0; i < questions; i++) { + response.writeInt(1); // Question ID + response.writeInt(1); // Question number + + response.writeInt(1); // Question type + response.writeString("Question?"); + + response.writeInt(2); // Selection count + response.writeInt(1); // Minimum select + response.writeInt(1); // Maximum select + + response.writeString("test1"); + response.writeString("test2"); + } + } + + @Override + public short getHeader() { + return 317; // tMsgs.setaProp(317, #handle_poll_contents) + } + }); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/purse/GETUSERCREDITLOG.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/purse/GETUSERCREDITLOG.java new file mode 100644 index 0000000..5501d7b --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/purse/GETUSERCREDITLOG.java @@ -0,0 +1,14 @@ +package org.alexdev.havana.messages.incoming.purse; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.user.currencies.CREDIT_BALANCE; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class GETUSERCREDITLOG implements MessageEvent { + + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/purse/REDEEM_VOUCHER.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/purse/REDEEM_VOUCHER.java new file mode 100644 index 0000000..bd41a2c --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/purse/REDEEM_VOUCHER.java @@ -0,0 +1,56 @@ +package org.alexdev.havana.messages.incoming.purse; + +import org.alexdev.havana.game.catalogue.CatalogueItem; +import org.alexdev.havana.game.catalogue.voucher.VoucherManager; +import org.alexdev.havana.game.catalogue.voucher.VoucherRedeemMode; +import org.alexdev.havana.game.catalogue.voucher.VoucherRedeemStatus; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; +import org.alexdev.havana.messages.outgoing.purse.VOUCHER_REDEEM_ERROR; +import org.alexdev.havana.messages.outgoing.purse.VOUCHER_REDEEM_OK; +import org.alexdev.havana.messages.outgoing.user.currencies.CREDIT_BALANCE; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.server.util.MalformedPacketException; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.concurrent.atomic.AtomicInteger; + +public class REDEEM_VOUCHER implements MessageEvent { + + @Override + public void handle(Player player, NettyRequest reader) throws SQLException, MalformedPacketException { + if (!player.isLoggedIn()) { + return; + } + + AtomicInteger redeemedCredits = new AtomicInteger(0); + var redeemedItem = new ArrayList(); + + var voucherStatus = VoucherManager.getInstance().redeem(player.getDetails(), VoucherRedeemMode.IN_GAME, reader.readString(), redeemedItem, redeemedCredits); + + if (voucherStatus == VoucherRedeemStatus.FAILURE) { + player.send(new VOUCHER_REDEEM_ERROR(VOUCHER_REDEEM_ERROR.RedeemError.INVALID)); + return; + } + + if (voucherStatus == VoucherRedeemStatus.FAILURE_NEW_ACCOUNT) { + player.send(new ALERT("Sorry, your account is too new and cannot redeem this voucher")); + return; + } + + player.send(new VOUCHER_REDEEM_OK(redeemedItem)); + + if (redeemedCredits.get() > 0) { + player.send(new CREDIT_BALANCE(player.getDetails().getCredits())); + } + + if (redeemedItem.size() > 0) { + player.getInventory().reload(); + + if (player.getRoomUser().getRoom() != null) + player.getInventory().getView("new"); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/FLATPROPBYITEM.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/FLATPROPBYITEM.java new file mode 100644 index 0000000..fca7472 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/FLATPROPBYITEM.java @@ -0,0 +1,62 @@ +package org.alexdev.havana.messages.incoming.rooms; + +import org.alexdev.havana.dao.mysql.RoomDao; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.rooms.FLATPROPERTY; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.server.util.MalformedPacketException; + +import java.sql.SQLException; + +public class FLATPROPBYITEM implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws SQLException, MalformedPacketException { + Room room = player.getRoomUser().getRoom(); + + if (room == null) { + return; + } + + if (!room.isOwner(player.getDetails().getId()) && !player.hasFuse(Fuseright.ANY_ROOM_CONTROLLER)) { + return; + } + + //String contents = reader.contents(); + //String property = contents.split("/")[0]; + + int itemId = reader.readInt();//Integer.parseInt(contents.split("/")[1]); + + Item item = player.getInventory().getItem(itemId); + + if (item == null) { + return; + } + + String property = item.getDefinition().getSprite(); + String value = item.getCustomData(); + + if (property.equals("wallpaper")) { + room.getData().setWallpaper(Integer.parseInt(value)); + } + + if (property.equals("floor")) { + room.getData().setFloor(Integer.parseInt(value)); + } + + if (property.equals("landscape")) { + room.getData().setLandscape(value); + } + + item.delete(); + RoomDao.saveDecorations(room); + + room.send(new FLATPROPERTY(property, value)); + + player.getInventory().getItems().remove(item); + player.getInventory().getView("new"); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/GETINTEREST.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/GETINTEREST.java new file mode 100644 index 0000000..fca13aa --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/GETINTEREST.java @@ -0,0 +1,52 @@ +package org.alexdev.havana.messages.incoming.rooms; + +import org.alexdev.havana.game.ads.AdManager; +import org.alexdev.havana.game.ads.Advertisement; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.rooms.INTERSITIALDATA; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.util.config.GameConfiguration; + +import java.util.concurrent.ThreadLocalRandom; + +public class GETINTEREST implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (!GameConfiguration.getInstance().getBoolean("room.intersitial.ads")) { + player.send(new INTERSITIALDATA(null, null)); + return; + } + + if (player.getRoomUser().isTeleporting()) { + player.send(new INTERSITIALDATA(null, null)); + return; + } + + if (ThreadLocalRandom.current().nextInt(5 + 1) != 5) { + player.send(new INTERSITIALDATA(null, null)); + return; + } + + String image = null; + String url = null; + + Advertisement advertisement = AdManager.getInstance().getRandomLoadingAd(); + + if (advertisement != null) { + /*image = GameConfiguration.getInstance().getString("advertisement.api"); + image = image.replace("{roomId}", String.valueOf(room.getId())); + image = image.replace("{pictureName}", advertisement.getImage());*/ + + if (advertisement.getImage() != null) { + image = GameConfiguration.getInstance().getString("site.path").replace("https", "http") + "/api/advertisement/get_img?ad=" + advertisement.getId(); + } + + if (advertisement.getUrl() != null) { + url = GameConfiguration.getInstance().getString("site.path").replace("https", "http") + "/api/advertisement/get_url?ad=" + advertisement.getId(); + } + } + + player.send(new INTERSITIALDATA(image, url)); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/GETROOMAD.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/GETROOMAD.java new file mode 100644 index 0000000..a22701d --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/GETROOMAD.java @@ -0,0 +1,66 @@ +package org.alexdev.havana.messages.incoming.rooms; + +import org.alexdev.havana.game.ads.AdManager; +import org.alexdev.havana.game.ads.Advertisement; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.rooms.ROOMAD; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.util.config.GameConfiguration; + +public class GETROOMAD implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + Room room = player.getRoomUser().getRoom(); + + String image = null; + String url = null; + + if (room.isPublicRoom()) { + Advertisement advertisement = AdManager.getInstance().getRandomAd(room.getId()); + + if (advertisement != null) { + /*image = GameConfiguration.getInstance().getString("advertisement.api"); + image = image.replace("{roomId}", String.valueOf(room.getId())); + image = image.replace("{pictureName}", advertisement.getImage());*/ + + if (advertisement.getImage() != null) { + image = GameConfiguration.getInstance().getString("site.path").replace("https", "http") + "/api/advertisement/get_img?ad=" + advertisement.getId(); + } + + if (advertisement.getUrl() != null) { + url = GameConfiguration.getInstance().getString("site.path").replace("https", "http") + "/api/advertisement/get_url?ad=" + advertisement.getId(); + } + } + } + + if (!GameConfiguration.getInstance().getBoolean("room.ads")) { + image = null; + url = null; + } + + player.send(new ROOMAD(image, url)); + + + /*player.send(new MessageComposer() { + @Override + public void compose(NettyResponse response) { + response.writeString("http://localhost/api/get_ad?roomId=123&picture=ad_lido_L.gif"); + response.writeString("http://localhost/"); + } + + @Override + public short getHeader() { + return 208; + } + });*/ + + /* response.writeString("http://localhost/c_images/billboards/getad.php?picture=ad_lido_L.gif"); + response.writeString("http://localhost/");*/ + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/GET_FLOORMAP.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/GET_FLOORMAP.java new file mode 100644 index 0000000..7cdbde5 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/GET_FLOORMAP.java @@ -0,0 +1,28 @@ +package org.alexdev.havana.messages.incoming.rooms; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.rooms.FLOOR_MAP; +import org.alexdev.havana.messages.outgoing.rooms.HEIGHTMAP; +import org.alexdev.havana.messages.outgoing.rooms.HEIGHTMAP_UPDATE; +import org.alexdev.havana.messages.outgoing.rooms.user.USER_OBJECTS; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +import java.util.List; + +public class GET_FLOORMAP implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + player.send(new FLOOR_MAP(player.getRoomUser().getRoom().getModel())); + + if (!player.getRoomUser().getRoom().isPublicRoom()) { + player.send(new HEIGHTMAP_UPDATE(player.getRoomUser().getRoom(), player.getRoomUser().getRoom().getModel())); + } + + player.send(new USER_OBJECTS(List.of())); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/GOTOFLAT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/GOTOFLAT.java new file mode 100644 index 0000000..0b04ae6 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/GOTOFLAT.java @@ -0,0 +1,26 @@ +package org.alexdev.havana.messages.incoming.rooms; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.RoomManager; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class GOTOFLAT implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + int roomId = reader.readInt(); + + if (player.getRoomUser().getAuthenticateId() != roomId) { + return; + } + + Room room = RoomManager.getInstance().getRoomById(roomId); + + if (room == null) { + return; + } + + room.getEntityManager().enterRoom(player, null); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/G_HMAP.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/G_HMAP.java new file mode 100644 index 0000000..8b84e69 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/G_HMAP.java @@ -0,0 +1,44 @@ +package org.alexdev.havana.messages.incoming.rooms; + +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.games.snowstorm.SnowStormGame; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.games.FULLGAMESTATUS; +import org.alexdev.havana.messages.outgoing.rooms.FLOOR_MAP; +import org.alexdev.havana.messages.outgoing.rooms.HEIGHTMAP; +import org.alexdev.havana.messages.outgoing.rooms.HEIGHTMAP_UPDATE; +import org.alexdev.havana.messages.outgoing.rooms.OBJECTS_WORLD; +import org.alexdev.havana.messages.outgoing.rooms.user.USER_OBJECTS; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +import java.util.List; + +public class G_HMAP implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + GamePlayer gamePlayer = player.getRoomUser().getGamePlayer(); + + if (gamePlayer != null && gamePlayer.getGame() instanceof SnowStormGame) { + SnowStormGame game = (SnowStormGame) gamePlayer.getGame(); + player.send(new HEIGHTMAP(game.getMap().getHeightMap())); + } else { + player.send(new HEIGHTMAP(player.getRoomUser().getRoom().getModel())); + } + + if (gamePlayer != null) { + player.send(new FULLGAMESTATUS(gamePlayer.getGame())); + + if (gamePlayer.getGame() instanceof SnowStormGame) { + SnowStormGame game = (SnowStormGame) gamePlayer.getGame(); + player.send(new OBJECTS_WORLD(game.getMap().getCompiledItems())); + } + + return; + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/G_ITEMS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/G_ITEMS.java new file mode 100644 index 0000000..a7f9886 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/G_ITEMS.java @@ -0,0 +1,20 @@ +package org.alexdev.havana.messages.incoming.rooms; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.rooms.ITEMS; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class G_ITEMS implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + Room room = player.getRoomUser().getRoom(); + + player.send(new ITEMS(room)); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/G_OBJS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/G_OBJS.java new file mode 100644 index 0000000..642542c --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/G_OBJS.java @@ -0,0 +1,24 @@ +package org.alexdev.havana.messages.incoming.rooms; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class G_OBJS implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + Room room = player.getRoomUser().getRoom(); + + if (room == null) { + return; + } + + player.sendObject("DuHH" + (char)1); + player.sendObject("DiHH" + (char)1); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/G_STAT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/G_STAT.java new file mode 100644 index 0000000..e327e74 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/G_STAT.java @@ -0,0 +1,164 @@ +package org.alexdev.havana.messages.incoming.rooms; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.games.Game; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.RoomManager; +import org.alexdev.havana.messages.outgoing.effects.USER_AVATAR_EFFECT; +import org.alexdev.havana.messages.outgoing.games.GAMESTART; +import org.alexdev.havana.messages.outgoing.rooms.groups.GROUP_BADGES; +import org.alexdev.havana.messages.outgoing.rooms.groups.GROUP_MEMBERSHIP_UPDATE; +import org.alexdev.havana.messages.outgoing.rooms.items.DICE_VALUE; +import org.alexdev.havana.messages.outgoing.rooms.items.SHOWPROGRAM; +import org.alexdev.havana.messages.outgoing.rooms.items.STUFFDATAUPDATE; +import org.alexdev.havana.messages.outgoing.rooms.user.*; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class G_STAT implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + if (player.getRoomUser().getGamePlayer() != null && player.getRoomUser().getGamePlayer().isSpectator()) { + player.send(new YOUARESPECTATOR()); + + Game game = player.getRoomUser().getGamePlayer().getGame(); + + if (game.isGameStarted()) { + player.send(new GAMESTART(game.getTotalSecondsLeft().get())); + } + return; + } + + if (player.getRoomUser().getGamePlayer() != null && player.getRoomUser().getGamePlayer().isInGame()) { + return; // Not needed for game arenas + } + + Room room = player.getRoomUser().getRoom(); + + if (room == null) { + return; + } + + room.getEntityManager().tryRoomEntry(player); + + /*if (!(room.getEntityManager().getPlayers().size() > 1)) { + room.getEntityManager().tryInitialiseRoom(); + + boolean isCancelled = PluginManager.getInstance().callEvent(PluginEvent.ROOM_FIRST_ENTRY_EVENT, new LuaValue[]{ + CoerceJavaToLua.coerce(player), + CoerceJavaToLua.coerce(room) + }); + + if (isCancelled) { + room.getEntityManager().leaveRoom(player, true); + } + }*/ + + player.send(new USER_OBJECTS(room.getEntities())); + room.send(new USER_OBJECTS(player), List.of(player)); + player.send(new USER_STATUSES(room.getEntities())); + + if (player.getRoomUser().isUsingEffect()) { + room.send(new USER_AVATAR_EFFECT(player.getRoomUser().getInstanceId(), player.getRoomUser().getEffectId())); + } + + for (Entity roomEntity : room.getEntities()) { + if (roomEntity.getDetails().getFavouriteGroupId() > 0 && roomEntity.getDetails().getId() != player.getDetails().getId()) { + var groupMember = roomEntity.getDetails().getGroupMember(); + player.send(new GROUP_MEMBERSHIP_UPDATE(roomEntity.getRoomUser().getInstanceId(), groupMember.getGroupId(), groupMember.getMemberRank().getClientRank())); + } + + if (roomEntity.getRoomUser().isUsingEffect()) { + player.send(new USER_AVATAR_EFFECT(roomEntity.getRoomUser().getInstanceId(), roomEntity.getRoomUser().getEffectId())); + } + + if (roomEntity.getRoomUser().isDancing()) { + player.send(new USER_DANCE(roomEntity.getRoomUser().getInstanceId(), roomEntity.getRoomUser().getDanceId())); + } + + if (roomEntity.getRoomUser().isSleeping()) { + player.send(new USER_SLEEP(roomEntity.getRoomUser().getInstanceId(), roomEntity.getRoomUser().isSleeping())); + } + } + + for (Item item : room.getItems()) { + if (item.getCurrentProgramValue().length() > 0) { + player.send(new SHOWPROGRAM(new String[] { item.getCurrentProgram(), item.getCurrentProgramValue() })); + } + + if (item.hasBehaviour(ItemBehaviour.INVISIBLE)) { + continue; + } + + // If item is requiring an update, apply animations etc + if (item.getRequiresUpdate()) { + // For some reason the wheel of fortune doesn't spin when the custom data on initial road equals -1, thus we send it again + if (item.hasBehaviour(ItemBehaviour.WHEEL_OF_FORTUNE)) { + player.send(new STUFFDATAUPDATE(item)); + } + + // Dices use a separate packet for rolling animation + if (item.hasBehaviour(ItemBehaviour.DICE)) { + player.send(new DICE_VALUE(item.getVirtualId(), true, 0)); + } + } + } + + if (player.getDetails().getFavouriteGroupId() > 0) { + var groupMember = player.getDetails().getGroupMember(); + + room.send(new GROUP_BADGES(new HashMap<>() {{ + put(groupMember.getGroupId(), player.getJoinedGroup(player.getDetails().getFavouriteGroupId()).getBadge()); + }})); + + room.send(new GROUP_MEMBERSHIP_UPDATE(player.getRoomUser().getInstanceId(), groupMember.getGroupId(), groupMember.getMemberRank().getClientRank())); + } + + if (RoomManager.getInstance().getRoomEntryBadges().containsKey(room.getId())) { + for (String badge : RoomManager.getInstance().getRoomEntryBadges().get(room.getId())) { + player.getBadgeManager().tryAddBadge(badge, null); + } + } + + List tempItems = new ArrayList(player.getInventory().getItems()); + boolean updateInventory = false; + + for (Item item : tempItems) { + for (Item roomItem : room.getItems()) { + if (roomItem.getDatabaseId() == item.getDatabaseId()) { + player.getInventory().getItems().removeIf(y -> y.getDatabaseId() == item.getDatabaseId()); + updateInventory = true; + } + } + } + + + if (updateInventory) { + player.getInventory().getView("new"); + } + + /*player.send(new MessageComposer() { + @Override + public void compose(NettyResponse response) { + response.writeInt(1); + response.writeString("We're currently collecting data through an online poll on how you found the server. Would you help answer our poll?"); + } + + @Override + public short getHeader() { + return 316; // #handle_poll_offer + } + });*/ + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/G_USRS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/G_USRS.java new file mode 100644 index 0000000..0faf617 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/G_USRS.java @@ -0,0 +1,58 @@ +package org.alexdev.havana.messages.incoming.rooms; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.rooms.ACTIVE_OBJECTS; +import org.alexdev.havana.messages.outgoing.rooms.OBJECTS_WORLD; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class G_USRS implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + Room room = player.getRoomUser().getRoom(); + + if (room == null) { + return; + } + + player.send(new OBJECTS_WORLD(room.getItemManager().getPublicItems())); + + if (room.getModel().getName().equals("park_a")) { + player.sendObject("@`SGSBMRDPBPA0.0\u0002I2\u0002Mqueue_tile2\u0002JMPGRAH0.0\u0002I2\u0002Mqueue_tile2\u0002SAMPFSAJ0.0\u0002I2\u0002Mqueue_tile2\u0002QBMRFSAPA0.0\u0002I2\u0002Mqueue_tile2\u0002SFMSERBJ0.0\u0002I2\u0002Mqueue_tile2\u0002SCMRFPBPA0.0\u0002I2\u0002Mqueue_tile2\u0002REMPGQBH0.0\u0002I2\u0002Mqueue_tile2\u0002PGMPFRBH0.0\u0002I2\u0002Mqueue_tile2\u0002PCMPEPBH0.0\u0002I2\u0002Mqueue_tile2\u0002QGMRFRBJ0.0\u0002I2\u0002Mqueue_tile2\u0002QDMRDQBPA0.0\u0002I2\u0002Mqueue_tile2\u0002RFMRERBJ0.0\u0002I2\u0002Mqueue_tile2\u0002PFMSDRBJ0.0\u0002I2\u0002Mqueue_tile2\u0002PDMPGPBH0.0\u0002I2\u0002Mqueue_tile2\u0002RGMSFRBJ0.0\u0002I2\u0002Mqueue_tile2\u0002RAMRESAPA0.0\u0002I2\u0002Mqueue_tile2\u0002RBMPGSAH0.0\u0002I2\u0002Mqueue_tile2\u0002SDMREQBPA0.0\u0002I2\u0002Mqueue_tile2\u0002QEMRFQBPA0.0\u0002I2\u0002Mqueue_tile2\u0002RCMPFPBH0.0\u0002I2\u0002Mqueue_tile2\u0002KMRDSAPA0.0\u0002I2\u0002Mqueue_tile2\u0002PAMPESAJ0.0\u0002I2\u0002Mqueue_tile2\u0002PBMQFSAJ0.0\u0002I2\u0002Mqueue_tile2\u0002IMPGQAH0.0\u0002I2\u0002Mqueue_tile2\u0002SEMRDRBJ0.0\u0002I2\u0002Mqueue_tile2\u0002QCMREPBPA0.0\u0002I2\u0002Mqueue_tile2\u0002SGMPGRBH0.0\u0002I2\u0002Mqueue_tile2\u0002QAMQESAJ0.0\u0002I2\u0002Mqueue_tile2\u0002QFMPERBH0.0\u0002I2\u0002Mqueue_tile2\u0002RDMPEQBH0.0\u0002I2\u0002Mqueue_tile2\u0002PEMPFQBH0.0\u0002I2\u0002Mqueue_tile2\u0002" + (char)1); + } else { + player.send(new ACTIVE_OBJECTS(room)); + } + + player.getMessenger().sendStatusUpdate(); + + /*Bot bot = new Bot(); + bot.getDetails().fill(0, "Test", player.getDetails().getFigure(), "Hello loser!", "M"); + room.getEntityManager().enterRoom(bot, null); + + for (Bot n : room.getEntityManager().getEntitiesByClass(Bot.class)) { + n.getRoomUser().talk("Hello, nerd!", CHAT_MESSAGE.ChatMessageType.WHISPER, List.of(player)); + }*/ + + + /* if (!(room.getEntityManager().getPlayers().size() > 1)) { + room.getEntityManager().tryInitialiseRoom(); + + boolean isCancelled = PluginManager.getInstance().callEvent(PluginEvent.ROOM_FIRST_ENTRY_EVENT, new LuaValue[]{ + CoerceJavaToLua.coerce(player), + CoerceJavaToLua.coerce(room) + }); + + if (isCancelled) { + room.getEntityManager().leaveRoom(player, true); + } + } + + player.send(new USER_OBJECTS(room.getEntities())); + room.send(new USER_OBJECTS(player), List.of(player));*/ + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/ROOM_DIRECTORY.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/ROOM_DIRECTORY.java new file mode 100644 index 0000000..484e452 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/ROOM_DIRECTORY.java @@ -0,0 +1,66 @@ +package org.alexdev.havana.messages.incoming.rooms; + +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.RoomManager; +import org.alexdev.havana.messages.outgoing.navigator.CANTCONNECT; +import org.alexdev.havana.messages.outgoing.navigator.CANTCONNECT.QueueError; +import org.alexdev.havana.messages.outgoing.rooms.OPEN_CONNECTION; +import org.alexdev.havana.messages.outgoing.rooms.ROOM_URL; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class ROOM_DIRECTORY implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + reader.readInt(); + int roomId = reader.readInt(); + + GamePlayer gamePlayer = player.getRoomUser().getGamePlayer(); + + if (roomId == -1 && gamePlayer != null && gamePlayer.isEnteringGame()) { + Room room = gamePlayer.getGame().getRoom(); + room.getEntityManager().enterRoom(player, gamePlayer.getSpawnPosition()); + return; + } + + Room room = RoomManager.getInstance().getRoomById(roomId); + + if (room == null) { + return; + } + + if (room.isClubOnly() && !player.getDetails().hasClubSubscription()) { + if (player.getRoomUser().getRoom() != null) + player.getRoomUser().getRoom().getEntityManager().leaveRoom(player, false); + + player.send(new CANTCONNECT(QueueError.CLUB_ONLY)); + return; + } + + /*if (room.isClubOnly()) { + player.send(new ROOMQUEUEDATA(3)); + + GameScheduler.getInstance().getService().schedule(()->{ + player.send(new ROOMQUEUEDATA(2)); + }, 3, TimeUnit.SECONDS); + return; + }*/ + + if (room.isPublicRoom()) { + if (room.getData().getTotalVisitorsNow() >= room.getData().getTotalVisitorsMax() && !player.hasFuse(Fuseright.ENTER_FULL_ROOMS)) { + player.send(new CANTCONNECT(CANTCONNECT.ConnectError.ROOM_FULL)); + return; + } + } + + player.send(new OPEN_CONNECTION()); + player.send(new ROOM_URL()); + + if (room.isPublicRoom()) { + room.getEntityManager().enterRoom(player, null); + } + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/TRYFLAT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/TRYFLAT.java new file mode 100644 index 0000000..873bbb8 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/TRYFLAT.java @@ -0,0 +1,98 @@ +package org.alexdev.havana.messages.incoming.rooms; + +import org.alexdev.havana.dao.mysql.RoomBanDao; +import org.alexdev.havana.dao.mysql.RoomDao; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.RoomManager; +import org.alexdev.havana.messages.outgoing.alerts.LOCALISED_ERROR; +import org.alexdev.havana.messages.outgoing.navigator.CANTCONNECT; +import org.alexdev.havana.messages.outgoing.rooms.DOORBELL_WAIT; +import org.alexdev.havana.messages.outgoing.rooms.FLATNOTALLOWEDTOENTER; +import org.alexdev.havana.messages.outgoing.rooms.FLAT_LETIN; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class TRYFLAT implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + int roomId = reader.remainingBytes().length > 0 ? reader.readInt() : player.getRoomUser().getRoom().getId(); + String password = ""; + + if (reader.remainingBytes().length > 0) { + password = reader.readString(); + } + + Room room = RoomManager.getInstance().getRoomById(roomId); + + if (room == null) { + room = RoomDao.getRoomById(roomId); + } + + if (room == null) { + return; + + } + + /* + if (room == null) { + if (player.getDetails().getTemporaryRoom() != null) { + room = player.getDetails().getTemporaryRoom(); + } else { + return; + } + } + + */ + + if (room.getData().getTotalVisitorsNow() >= room.getData().getTotalVisitorsMax() && !player.hasFuse(Fuseright.ENTER_FULL_ROOMS)) { + player.send(new CANTCONNECT(CANTCONNECT.ConnectError.ROOM_FULL)); + return; + } + + if (!player.hasFuse(Fuseright.ENTER_LOCKED_ROOMS)) { + if (RoomBanDao.hasBan(player.getDetails().getId(), roomId)) { + player.send(new CANTCONNECT(CANTCONNECT.ConnectError.BANNED)); + return; + } + + if (player.getRoomUser().getAuthenticateId() != roomId){ + if (room.getData().getAccessTypeId() == 1 && !room.hasRights(player.getDetails().getId(), false) && !player.hasFuse(Fuseright.ANY_ROOM_CONTROLLER)) { + if (rangDoorbell(room, player)) { + player.send(new DOORBELL_WAIT()); + } else { + player.send(new FLATNOTALLOWEDTOENTER()); + } + + return; + } + + if (room.getData().getAccessTypeId() == 2 && !room.isOwner(player.getDetails().getId()) && !player.hasFuse(Fuseright.ANY_ROOM_CONTROLLER)) { + if (!password.equals(room.getData().getPassword())) { + player.send(new LOCALISED_ERROR(-100002)); + return; + } + } + } + } + + player.getRoomUser().setAuthenticateId(roomId); + player.send(new FLAT_LETIN()); + } + + private boolean rangDoorbell(Room room, Player player) { + boolean sentWithRights = false; + + for (Player user : room.getEntityManager().getPlayers()) { + if (!room.hasRights(user.getDetails().getId()) && !player.hasFuse(Fuseright.MOD)) { + continue; + } + + user.send(new DOORBELL_WAIT(player.getDetails().getName())); + sentWithRights = true; + } + + return sentWithRights; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/dimmer/MSG_ROOMDIMMER_CHANGE_STATE.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/dimmer/MSG_ROOMDIMMER_CHANGE_STATE.java new file mode 100644 index 0000000..f3ebf9f --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/dimmer/MSG_ROOMDIMMER_CHANGE_STATE.java @@ -0,0 +1,67 @@ +package org.alexdev.havana.messages.incoming.rooms.dimmer; + +import org.alexdev.havana.dao.mysql.MoodlightDao; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.rooms.user.CHAT_MESSAGE; +import org.alexdev.havana.messages.outgoing.rooms.user.CHAT_MESSAGE.ChatMessageType; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.apache.commons.lang3.tuple.Pair; + +import java.util.ArrayList; + +public class MSG_ROOMDIMMER_CHANGE_STATE implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + Room room = player.getRoomUser().getRoom(); + + if (!room.isOwner(player.getDetails().getId()) && !player.hasFuse(Fuseright.ANY_ROOM_CONTROLLER)) { + return; + } + + Item item = room.getItemManager().getMoodlight(); + + if (item == null) { + return; + } + + if (!item.hasBehaviour(ItemBehaviour.ROOMDIMMER)) { + return; + } + + if (room.isOwner(player.getDetails().getId()) || player.hasFuse(Fuseright.ANY_ROOM_CONTROLLER)) { + if (!MoodlightDao.containsPreset(item.getDatabaseId())) { + MoodlightDao.createPresets(item.getDatabaseId()); + } + } + + // Cancel RainbowTask because the operator decided to use their own moodlight settings. + if (room.getTaskManager().hasTask("RainbowTask")) { + room.getTaskManager().cancelTask("RainbowTask"); + player.send(new CHAT_MESSAGE(ChatMessageType.WHISPER, player.getRoomUser().getInstanceId(), "Rainbow room dimmer cycle has stopped", 0)); + } + + Pair> presetData = MoodlightDao.getPresets(item.getDatabaseId()); + + if (presetData == null) { + return; + } + + int currentPreset = presetData.getLeft(); + ArrayList presets = presetData.getRight(); + + boolean isEnabled = !(item.getCustomData().charAt(0) == '2'); + + item.setCustomData((isEnabled ? "2" : "1") + "," + currentPreset + "," + presets.get(currentPreset - 1)); + item.updateStatus(); + item.save(); + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/dimmer/MSG_ROOMDIMMER_GET_PRESETS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/dimmer/MSG_ROOMDIMMER_GET_PRESETS.java new file mode 100644 index 0000000..459ce02 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/dimmer/MSG_ROOMDIMMER_GET_PRESETS.java @@ -0,0 +1,46 @@ +package org.alexdev.havana.messages.incoming.rooms.dimmer; + +import org.alexdev.havana.dao.mysql.MoodlightDao; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.rooms.dimmer.MOODLIGHT_PRESETS; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.apache.commons.lang3.tuple.Pair; + +import java.util.ArrayList; + +public class MSG_ROOMDIMMER_GET_PRESETS implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + Room room = player.getRoomUser().getRoom(); + Item item = room.getItemManager().getMoodlight(); + + if (item == null) { + return; + } + + if (room.isOwner(player.getDetails().getId()) || player.hasFuse(Fuseright.ANY_ROOM_CONTROLLER)) { + if (!MoodlightDao.containsPreset(item.getDatabaseId())) { + MoodlightDao.createPresets(item.getDatabaseId()); + } + } + + Pair> presetData = MoodlightDao.getPresets(item.getDatabaseId()); + + if (presetData == null) { + return; + } + + int currentPreset = presetData.getLeft(); + ArrayList presets = presetData.getRight(); + + player.send(new MOODLIGHT_PRESETS(currentPreset, presets)); + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/dimmer/MSG_ROOMDIMMER_SET_PRESET.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/dimmer/MSG_ROOMDIMMER_SET_PRESET.java new file mode 100644 index 0000000..e077bae --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/dimmer/MSG_ROOMDIMMER_SET_PRESET.java @@ -0,0 +1,86 @@ +package org.alexdev.havana.messages.incoming.rooms.dimmer; + +import org.alexdev.havana.dao.mysql.MoodlightDao; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.rooms.user.CHAT_MESSAGE; +import org.alexdev.havana.messages.outgoing.rooms.user.CHAT_MESSAGE.ChatMessageType; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.apache.commons.lang3.tuple.Pair; + +import java.util.ArrayList; +import java.util.List; + +public class MSG_ROOMDIMMER_SET_PRESET implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + Room room = player.getRoomUser().getRoom(); + + if (!room.isOwner(player.getDetails().getId()) && !player.hasFuse(Fuseright.ANY_ROOM_CONTROLLER)) { + return; + } + + Item item = room.getItemManager().getMoodlight(); + + if (item == null) { + return; + } + + if (!item.hasBehaviour(ItemBehaviour.ROOMDIMMER)) { + return; + } + + if (room.isOwner(player.getDetails().getId()) || player.hasFuse(Fuseright.ANY_ROOM_CONTROLLER)) { + if (!MoodlightDao.containsPreset(item.getDatabaseId())) { + MoodlightDao.createPresets(item.getDatabaseId()); + } + } + + int presetId = reader.readInt(); + int backgroundState = reader.readInt(); + String presetColour = reader.readString(); + int presetStrength = reader.readInt(); + + //if (!GameConfiguration.getInstance().getBoolean("roomdimmer.scripting.allowed")) { + // Only check if roomdimmer scripting is allowed + if (!(presetColour.equals("#74F5F5") || + presetColour.equals("#0053F7") || + presetColour.equals("#E759DE") || + presetColour.equals("#EA4532") || + presetColour.equals("#F2F851") || + presetColour.equals("#82F349") || + presetColour.equals("#000000"))) { + return; // Nope, no scripting room dimmers allowed here! + } + + // Cancel RainbowTask because the operator decided to use their own moodlight settings. + if (room.getTaskManager().hasTask("RainbowTask")) { + room.getTaskManager().cancelTask("RainbowTask"); + player.send(new CHAT_MESSAGE(ChatMessageType.WHISPER, player.getRoomUser().getInstanceId(), "Rainbow room dimmer cycle has stopped", 0)); + } + + Pair> presetData = MoodlightDao.getPresets(item.getDatabaseId()); + + if (presetData == null) { + return; + } + + List presets = presetData.getRight(); + + presets.set(presetId - 1, backgroundState + "," + presetColour + "," + presetStrength); + + item.setCustomData("2," + presetId + "," + backgroundState + "," + presetColour + "," + presetStrength); + item.updateStatus(); + item.save(); + + MoodlightDao.updatePresets(item.getDatabaseId(), presetId, presets); + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/idol/OPEN_PERFORMER_GUI.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/idol/OPEN_PERFORMER_GUI.java new file mode 100644 index 0000000..1a3e4a5 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/idol/OPEN_PERFORMER_GUI.java @@ -0,0 +1,31 @@ +package org.alexdev.havana.messages.incoming.rooms.idol; + +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.Map; + +public class OPEN_PERFORMER_GUI extends MessageComposer { + private final Map userDisks; + + public OPEN_PERFORMER_GUI(Map userDisks) { + this.userDisks = userDisks; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.userDisks.size()); + + for (var kvp : this.userDisks.entrySet()) { + response.writeInt(kvp.getKey().getVirtualId()); + response.writeString(kvp.getValue()); + + } + } + + @Override + public short getHeader() { + return 491; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/idol/START_PERFORMANCE.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/idol/START_PERFORMANCE.java new file mode 100644 index 0000000..28d8482 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/idol/START_PERFORMANCE.java @@ -0,0 +1,42 @@ +package org.alexdev.havana.messages.incoming.rooms.idol; + +import org.alexdev.havana.dao.mysql.JukeboxDao; +import org.alexdev.havana.dao.mysql.SongMachineDao; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.song.Song; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class START_PERFORMANCE implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + + } + + if (player.getRoomUser().getRoom().getIdolManager().getPerformer() != player) { + return; + } + + int itemId = reader.readInt(); + Item songDisk = null; + + for (Item item : player.getInventory().getItems()) { + if (item.getVirtualId() == itemId) { + songDisk = item; + break; + } + } + + Song song = null; + + if (songDisk != null) { + int songId = JukeboxDao.getSongIdByItem(songDisk.getDatabaseId()); + song = SongMachineDao.getSong(songId); + } + + player.getRoomUser().getRoom().getIdolManager().startPerformance(song); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/idol/VOTE_PERFORMANCE.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/idol/VOTE_PERFORMANCE.java new file mode 100644 index 0000000..51a49ee --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/idol/VOTE_PERFORMANCE.java @@ -0,0 +1,37 @@ +package org.alexdev.havana.messages.incoming.rooms.idol; + +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.interactors.InteractionType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.apache.commons.lang3.StringUtils; + +import java.util.Collections; +import java.util.stream.Collectors; + +public class VOTE_PERFORMANCE implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) + return; + + Item chair = player.getRoomUser().getCurrentItem(); + + if (chair == null) { + return; + } + + if (chair.getDefinition().getInteractionType() != InteractionType.IDOL_VOTE_CHAIR) { + return; + } + + Item scoreboard = player.getRoomUser().getRoom().getItemManager().getIdolScoreboard(); + + if (scoreboard == null) { + return; + } + + player.getRoomUser().getRoom().getIdolManager().vote(reader.readBoolean(), player); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/ADDSTRIPITEM.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/ADDSTRIPITEM.java new file mode 100644 index 0000000..a1cec73 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/ADDSTRIPITEM.java @@ -0,0 +1,52 @@ +package org.alexdev.havana.messages.incoming.rooms.items; + +import org.alexdev.havana.dao.mysql.ItemDao; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class ADDSTRIPITEM implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + Room room = player.getRoomUser().getRoom(); + + if (room == null) { + return; + } + + if (!room.isOwner(player.getDetails().getId()) && !player.hasFuse(Fuseright.ANY_ROOM_CONTROLLER)) { + return; + } + + //String content = reader.contents(); + //String[] data = content.split(" "); + + reader.readInt(); + + int itemId = reader.readInt();//Integer.parseInt(data[2]); + + Item item = room.getItemManager().getById(itemId); + + if (item == null) { + return; + } + + if (item.hasBehaviour(ItemBehaviour.POST_IT)) { + return; // The client does not allow picking up post-it's, thus neither will the server + } + + if (item.getOwnerId() != player.getDetails().getId()) { + item.setOwnerId(player.getDetails().getId()); + ItemDao.updateItemOwnership(item); + } + + room.getMapping().removeItem(player, item); + + player.getInventory().addItem(item); + player.getInventory().getView("update"); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/CONVERT_FURNI_TO_CREDITS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/CONVERT_FURNI_TO_CREDITS.java new file mode 100644 index 0000000..9e0495e --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/CONVERT_FURNI_TO_CREDITS.java @@ -0,0 +1,77 @@ +package org.alexdev.havana.messages.incoming.rooms.items; + +import org.alexdev.havana.dao.mysql.ItemDao; +import org.alexdev.havana.dao.mysql.TransactionDao; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; +import org.alexdev.havana.messages.outgoing.user.currencies.CREDIT_BALANCE; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class CONVERT_FURNI_TO_CREDITS implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + Room room = player.getRoomUser().getRoom(); + + if (room == null) { + return; + } + + if (!room.isOwner(player.getDetails().getId()) && !player.hasFuse(Fuseright.ANY_ROOM_CONTROLLER)) { + return; + } + + int itemId = reader.readInt(); + + if (itemId < 0) { + return; + } + + Item item = room.getItemManager().getById(itemId); + + if (item == null || !item.hasBehaviour(ItemBehaviour.REDEEMABLE) || item.isDeleted()) { + return; + } + + // Sprite is of format CF_50_goldbar. This retrieves the 50 part + Integer amount = Integer.parseInt(item.getDefinition().getSprite().split("_")[1]); + + // Delete item and update credits amount in one atomic operation + player.getInventory().getItems().forEach(x -> { + if (x.getDatabaseId() == item.getDatabaseId()) { + x.setDeleted(true); + } + }); + + room.getItems().forEach(x -> { + if (x.getDatabaseId() == item.getDatabaseId()) { + x.setDeleted(true); + } + }); + + int currentAmount = ItemDao.redeemCreditItem(amount, item.getDatabaseId(), player.getDetails().getId()); + + // Couldn't redeem item (database error) + if (currentAmount == -1) { + // TODO: find real composer for this. Maybe use error composer? + player.send(new ALERT("Unable to redeem furniture! Contact staff or support team.")); + return; + } + + TransactionDao.createTransaction(player.getDetails().getId(), + String.valueOf(item.getDatabaseId()), "", 1, + "Exchanged " + item.getDefinition().getName() + " into " + amount + " credits", + amount, 0, false); + + // Notify room of item removal and set credits of player + room.getMapping().removeItem(player, item); + player.getDetails().setCredits(currentAmount); + + // Send new credit amount + player.send(new CREDIT_BALANCE(player.getDetails().getCredits())); + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/DICE_OFF.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/DICE_OFF.java new file mode 100644 index 0000000..eb13a67 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/DICE_OFF.java @@ -0,0 +1,43 @@ +package org.alexdev.havana.messages.incoming.rooms.items; + +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.rooms.items.DICE_VALUE; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + + +public class DICE_OFF implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + Room room = player.getRoomUser().getRoom(); + + if (room == null) { + return; + } + + int itemId = reader.readInt(); + Item item = room.getItemManager().getById(itemId); + + if (item == null || !item.hasBehaviour(ItemBehaviour.DICE)) { + return; + } + + if (!player.getRoomUser().getPosition().touches(item.getPosition())) { + return; + } + + // Return if dice is already being rolled + if (item.getRequiresUpdate()) { + return; + } + + item.setCustomData("0"); + item.updateStatus(); + item.save(); + + room.send(new DICE_VALUE(itemId, false, 0)); + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/ENTER_ONEWAY_DOOR.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/ENTER_ONEWAY_DOOR.java new file mode 100644 index 0000000..7c2a48b --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/ENTER_ONEWAY_DOOR.java @@ -0,0 +1,58 @@ +package org.alexdev.havana.messages.incoming.rooms.items; + +import org.alexdev.havana.game.GameScheduler; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.mapping.RoomTile; +import org.alexdev.havana.messages.outgoing.rooms.items.CHANGESTATUS; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +import java.util.concurrent.TimeUnit; + +public class ENTER_ONEWAY_DOOR implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + Room room = player.getRoomUser().getRoom(); + + if (room == null) { + return; + } + + int itemId = reader.readInt(); + Item item = room.getItemManager().getById(itemId); + + if (item == null || !item.hasBehaviour(ItemBehaviour.ONE_WAY_GATE)) { + return; + } + + if (!item.getPosition().getSquareInFront().equals(player.getRoomUser().getPosition())) { + return; + } + + Position destination = item.getPosition().getSquareBehind(); + + if (!RoomTile.isValidTile(room, player, destination)) { + return; + } + + room.send(new CHANGESTATUS(itemId, 1)); + item.setCustomData("1"); + + player.getRoomUser().walkTo(destination.getX(), destination.getY()); + + if (!player.getRoomUser().isWalking()) { + return; + } + + player.getRoomUser().setEnableWalkingOnStop(true); + + GameScheduler.getInstance().getService().schedule(()->{ + room.send(new CHANGESTATUS(itemId, 0)); + item.setCustomData("0"); + }, 1, TimeUnit.SECONDS); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/G_IDATA.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/G_IDATA.java new file mode 100644 index 0000000..8d8968e --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/G_IDATA.java @@ -0,0 +1,40 @@ +package org.alexdev.havana.messages.incoming.rooms.items; + +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.rooms.items.IDATA; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class G_IDATA implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + Room room = player.getRoomUser().getRoom(); + + if (room == null) { + return; + } + + int itemId = reader.readInt(); + Item item = room.getItemManager().getById(itemId); + + if (item == null) { + return; + } + + if (item.hasBehaviour(ItemBehaviour.POST_IT)) { + String colour = item.getCustomData().substring(0, 6); + String text = ""; + + if (item.getCustomData().length() > 6) { + text = item.getCustomData().substring(6); + } + + player.send(new IDATA(item, colour, text)); + } else { + player.send(new IDATA(item)); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/MOVESTUFF.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/MOVESTUFF.java new file mode 100644 index 0000000..6f6d3d8 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/MOVESTUFF.java @@ -0,0 +1,81 @@ +package org.alexdev.havana.messages.incoming.rooms.items; + +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.rooms.items.MOVE_FLOORITEM; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class MOVESTUFF implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + Room room = player.getRoomUser().getRoom(); + + if (room == null) { + return; + } + + if (!room.hasRights(player.getDetails().getId()) && !player.hasFuse(Fuseright.MOD)) { + return; + } + + //String content = reader.contents(); + //String[] data = content.split(" "); + + int itemId = reader.readInt();//Integer.parseInt(data[0]); + Item item = room.getItemManager().getById(itemId); + + if (item == null) { + return; + } + + if (item.hasBehaviour(ItemBehaviour.WALL_ITEM)) { + return; + } + + if (item.getRequiresUpdate()) { + return; + } + + int x = reader.readInt();//(int) Double.parseDouble(data[1]); + int y = reader.readInt();//(int) Double.parseDouble(data[2]); + int rotation = reader.readInt();//(int) Double.parseDouble(data[3]); + + Position oldPosition = item.getPosition().copy(); + + boolean isRotation = false; + + if (item.getPosition().equals(new Position(x, y)) && item.getPosition().getRotation() != rotation) { + isRotation = true; + } + + if (isRotation) { + if (item.getRollingData() != null) { + return; // Don't allow rotating when rolling. + } + } + + if ((oldPosition.getX() == x && + oldPosition.getY() == y && + oldPosition.getRotation() == rotation) || !item.isValidMove(item, room, x, y, rotation)) { + // Send item update even though we cancelled, otherwise the client will be confused. + player.send(new MOVE_FLOORITEM(item)); + return; + } + + + // Validate placed item rotation + if (!item.getDefinition().hasBehaviour(ItemBehaviour.WALL_ITEM)) { + if (!item.getDefinition().getAllowedRotations().contains(rotation)) { + return; + } + } + + room.getMapping().moveItem(player, item, new Position(x, y, item.getPosition().getZ(), rotation, rotation), oldPosition); + player.getRoomUser().getTimerManager().resetRoomTimer(); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/PLACESTUFF.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/PLACESTUFF.java new file mode 100644 index 0000000..7d8a9d3 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/PLACESTUFF.java @@ -0,0 +1,176 @@ +package org.alexdev.havana.messages.incoming.rooms.items; + +import org.alexdev.havana.dao.mysql.ItemDao; +import org.alexdev.havana.dao.mysql.TransactionDao; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.managers.RoomTradeManager; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.NettyPlayerNetwork; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.server.util.MalformedPacketException; +import org.apache.commons.lang3.StringUtils; + +import java.sql.SQLException; + +public class PLACESTUFF implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws SQLException, MalformedPacketException { + Room room = player.getRoomUser().getRoom(); + + if (room == null) { + return; + } + + if (!room.hasRights(player.getDetails().getId()) && !player.hasFuse(Fuseright.MOD)) { + return; + } + + String content = reader.readString(); + String[] data = content.split(" "); + + if (data.length == 0) { + return; + } + + // Make sure provided data is numeric + if (!StringUtils.isNumeric(data[0])) { + return; + } + + int itemId = Integer.parseInt(data[0]); + Item item = player.getInventory().getItem(itemId); + + if (item == null || !item.isVisible()) { + return; + } + + // Prevent users from placing non-tradable objects in users' rooms + if (!player.hasFuse(Fuseright.MUTE) && room.getData().getOwnerId() != player.getDetails().getId()) { + if (!item.getDefinition().isTradable()) { + return; + } + } + + if (!player.hasFuse(Fuseright.MUTE) && room.getData().getOwnerId() != player.getDetails().getId()) { + if (player.getDetails().isTradeBanned()) { + player.send(new ALERT(RoomTradeManager.showTradeBanAlert(player))); + return; + } + } + + // Giving credits to self on same IP is suspicious behaviour + //if (item.hasBehaviour(ItemBehaviour.REDEEMABLE) || ItemManager.getInstance().hasPresentBehaviour(item, ItemBehaviour.REDEEMABLE)) { + if (!player.hasFuse(Fuseright.MUTE) + && room.getData().getOwnerId() != player.getDetails().getId()) { + RoomTradeManager.addTradeBan(player); + return; + } + //} + + var ownerData = PlayerManager.getInstance().getPlayerData(room.getData().getOwnerId()); + + if (ownerData != null && ownerData.isTradeBanned()) { + if (room.getData().getOwnerId() != player.getDetails().getId()) { + player.send(new ALERT("The room owner is trade banned.")); + return; + } + } + + if (room.getData().getOwnerId() != player.getDetails().getId()) { + TransactionDao.createTransaction(player.getDetails().getId(), + String.valueOf(item.getDatabaseId()), String.valueOf(item.getDefinition().getId()), 1, + "Placed item " + item.getDefinition().getName() + " into " + room.getData().getOwnerName() + "'s room: " + room.getData().getId(), + room.getId(), room.getData().getOwnerId(), false); + } + + if (item.hasBehaviour(ItemBehaviour.WALL_ITEM)) { + String wallPosition = content.substring(data[0].length() + 1); + + // if (!ValidationUtil.validateWallPosition(wallPosition)) { + // player.send(new CANNOT_PLACE_STUFF_FROM_STRIP(11)); + // return; + // } + + if (item.hasBehaviour(ItemBehaviour.POST_IT)) { + String defaultColour = "FFFF33"; + + Item sticky = new Item(); + sticky.setOwnerId(room.getData().getOwnerId()); + sticky.setDefinitionId(item.getDefinition().getId()); + sticky.setCustomData(defaultColour); + sticky.setWallPosition(wallPosition); + sticky.setRoomId(room.getId()); + + ItemDao.newItem(sticky); + room.getMapping().addItem(player, sticky); + + // Set custom data as 1 for 1 post-it, if for some reason they have no number for the post-it. + if (!StringUtils.isNumeric(item.getCustomData())) { + item.setCustomData("1"); + } + + if (StringUtils.isNumeric(item.getCustomData())) { + int totalStickies = Integer.parseInt(item.getCustomData()) - 1; + + if (totalStickies <= 0) { + player.getInventory().getItems().remove(item); + item.delete(); + } else { + item.setCustomData(String.valueOf(totalStickies)); + item.save(); + } + } + return; + } + + item.setWallPosition(wallPosition); + } else { + int x = Integer.parseInt(data[1]); + int y = Integer.parseInt(data[2]); + int rotation = Integer.parseInt(data[3]); + + if (item.hasBehaviour(ItemBehaviour.REDIRECT_ROTATION_0)) { + rotation = 0; + } + + if (item.hasBehaviour(ItemBehaviour.REDIRECT_ROTATION_2)) { + rotation = 2; + } + + if (item.hasBehaviour(ItemBehaviour.REDIRECT_ROTATION_4)) { + rotation = 4; + } + + // Validate placed item rotation + if (!item.getDefinition().hasBehaviour(ItemBehaviour.WALL_ITEM)) { + if (!item.getDefinition().getAllowedRotations().contains(rotation)) { + rotation = item.getDefinition().getAllowedRotations().get(0); + } + } + + if (!item.isValidMove(item, room, x, y, rotation)) { + return; + } + + if (room.getMapping().getTile(x, y) != null) { + item.getPosition().setX(x); + item.getPosition().setY(y); + item.getPosition().setRotation(rotation); + } + } + + if (room.getItemManager().hasTooMany(player, item)) + return; + + room.getMapping().addItem(player, item); + + player.getInventory().getItems().remove(item); + player.getRoomUser().getTimerManager().resetRoomTimer(); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/PRESENTOPEN.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/PRESENTOPEN.java new file mode 100644 index 0000000..dd5f5b2 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/PRESENTOPEN.java @@ -0,0 +1,194 @@ +package org.alexdev.havana.messages.incoming.rooms.items; + +import org.alexdev.havana.dao.mysql.ItemDao; +import org.alexdev.havana.game.catalogue.CatalogueItem; +import org.alexdev.havana.game.catalogue.CatalogueManager; +import org.alexdev.havana.game.ecotron.EcotronItem; +import org.alexdev.havana.game.ecotron.EcotronManager; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.ItemManager; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.item.base.ItemDefinition; +import org.alexdev.havana.game.item.interactors.InteractionType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.catalogue.DELIVER_PRESENT; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.util.DateUtil; + +import java.util.Collections; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; +import java.util.regex.Pattern; + +public class PRESENTOPEN implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + Room room = player.getRoomUser().getRoom(); + + if (room == null) { + return; + } + + if (!room.isOwner(player.getDetails().getId()) && !player.hasFuse(Fuseright.ANY_ROOM_CONTROLLER)) { + return; + } + + int itemId = reader.readInt();//Integer.parseInt(reader.contents()); + Item item = room.getItemManager().getById(itemId); + + if (item == null) { + return; + } + + if (item.hasBehaviour(ItemBehaviour.ECO_BOX) && item.getCustomData().startsWith("FLAG:")) { + String[] possibleFurni = null; + + switch (item.getCustomData().replace("FLAG:", "")) { + case "RAINBOW_FURNI": + { + possibleFurni = new String[] { + "table_plasto_sq_lm1", + "table_plasto_round_lm1", + "table_plasto_bigsq_lm1", + "table_plasto_4leg_lm1", + "chair_plasty_lm1", + "chair_plasto_lm1", + + }; + + break; + } + } + + if (possibleFurni == null) + return; + + String saleCode = possibleFurni[ThreadLocalRandom.current().nextInt(possibleFurni.length)]; + CatalogueItem catalogueItem = CatalogueManager.getInstance().getCatalogueItem(saleCode); + + if (catalogueItem != null) { + room.getMapping().removeItem(player, item); + + item.setDefinitionId(catalogueItem.getDefinition().getId()); + ItemDao.updateItem(item); + + player.send(new DELIVER_PRESENT(item)); + + player.getInventory().addItem(item); + player.getInventory().getView("new"); + + return; + } + } + + if (item.hasBehaviour(ItemBehaviour.PRESENT)) { + String[] presentData = item.getCustomData().split(Pattern.quote(Item.PRESENT_DELIMETER)); + + int saleCode = Integer.parseInt(presentData[0]); + String receivedFrom = presentData[1]; + String extraData = presentData[3]; + long timestamp = DateUtil.getCurrentTimeSeconds(); + + try { + timestamp = Long.parseLong(presentData[4]); + } catch (Exception ex) { + + } + //System.out.println("Present data: " + String.join(",", presentData)); + //System.out.println("Custom data: " + item.getCustomData()); + //System.out.println(receivedFrom); + + CatalogueItem catalogueItem = CatalogueManager.getInstance().getCatalogueItem(saleCode); + + if (catalogueItem == null) { + room.getMapping().removeItem(player, item); + item.delete(); + return; + } + + // Don't create a new item instance, reuse if the item isn't a trophy or teleporter, etc + if (!catalogueItem.isPackage() && !catalogueItem.getDefinition().hasBehaviour(ItemBehaviour.PRIZE_TROPHY) && + !catalogueItem.getDefinition().hasBehaviour(ItemBehaviour.TELEPORTER) && + (catalogueItem.getDefinition().getInteractionType() != InteractionType.PET_NEST) && + !catalogueItem.getDefinition().hasBehaviour(ItemBehaviour.ROOMDIMMER) && + !catalogueItem.getDefinition().hasBehaviour(ItemBehaviour.DECORATION) && + !catalogueItem.getDefinition().hasBehaviour(ItemBehaviour.POST_IT) && + !catalogueItem.getDefinition().getSprite().equalsIgnoreCase("film")) { + room.getMapping().removeItem(player, item); + + item.setDefinitionId(catalogueItem.getDefinition().getId()); + item.setCustomData(extraData); + + ItemDao.updateItem(item); + + player.send(new DELIVER_PRESENT(item)); + + player.getInventory().addItem(item); + player.getInventory().getView("new"); + } else { + List itemList = CatalogueManager.getInstance().purchase(player.getDetails(), catalogueItem, extraData, receivedFrom, timestamp); + + if (!itemList.isEmpty()) { + player.send(new DELIVER_PRESENT(itemList.get(0))); + player.getInventory().getView("new"); + } + + room.getMapping().removeItem(player, item); + item.delete(); + } + } + + if (item.hasBehaviour(ItemBehaviour.ECO_BOX)) { + int chance = 0; + int[] chances = {2000, 200, 40, 5}; + + for (int chanceCheck : chances) { + int randomID = ThreadLocalRandom.current().nextInt(1, chanceCheck + 1); + + if (randomID == chanceCheck) { + chance = chanceCheck; + break; + } + } + + List potentialPrizes = EcotronManager.getInstance().getRewardsByChance(chance); + + if (potentialPrizes.isEmpty()) { + return; // OOPS! Something happened + } + + EcotronItem ecotronItem = potentialPrizes.get(ThreadLocalRandom.current().nextInt(0, potentialPrizes.size())); + + if (ecotronItem == null) { + return; + } + + ItemDefinition prize = ItemManager.getInstance().getDefinitionBySprite(ecotronItem.getSpriteName()); + + if (prize == null) { + return; + } + + CatalogueItem catalogueItem = CatalogueManager.getInstance().getCatalogueBySprite(prize.getSpriteId()); + + if (catalogueItem == null) { + return; + } + + room.getMapping().removeItem(player, item); + + item.setDefinitionId(catalogueItem.getDefinition().getId()); + item.setCustomData(""); + + ItemDao.updateItem(item); + player.send(new DELIVER_PRESENT(item)); + + player.getInventory().addItem(item); + player.getInventory().getView("new"); + + } + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/REMOVEITEM.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/REMOVEITEM.java new file mode 100644 index 0000000..b9e4717 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/REMOVEITEM.java @@ -0,0 +1,49 @@ +package org.alexdev.havana.messages.incoming.rooms.items; + +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.server.util.MalformedPacketException; + +import java.sql.SQLException; + +public class REMOVEITEM implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws SQLException, MalformedPacketException { + Room room = player.getRoomUser().getRoom(); + + if (room == null) { + return; + } + + int itemId = reader.readInt(); + Item item = room.getItemManager().getById(itemId); + + if (item == null) { + return; + } + + if (!room.isOwner(player.getDetails().getId()) && + !((item.hasBehaviour(ItemBehaviour.PHOTO) && player.hasFuse(Fuseright.REMOVE_PHOTOS)) || + (item.hasBehaviour(ItemBehaviour.POST_IT) && player.hasFuse(Fuseright.REMOVE_STICKIES)))) { + return; + } + + + // Set up trigger for leaving a current item + if (player.getRoomUser().getCurrentItem() != null) { + if (player.getRoomUser().getCurrentItem().getDefinition().getInteractionType().getTrigger() != null) { + player.getRoomUser().getCurrentItem().getDefinition().getInteractionType().getTrigger().onEntityLeave(player, player.getRoomUser(), player.getRoomUser().getCurrentItem()); + } + } + + room.getMapping().removeItem(player, item); + item.delete(); + + player.getRoomUser().getTimerManager().resetRoomTimer(); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/SETITEMDATA.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/SETITEMDATA.java new file mode 100644 index 0000000..2fceb18 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/SETITEMDATA.java @@ -0,0 +1,81 @@ +package org.alexdev.havana.messages.incoming.rooms.items; + +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.util.StringUtil; + +public class SETITEMDATA implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + Room room = player.getRoomUser().getRoom(); + + if (room == null) { + return; + } + + //if (!room.hasRights(player.getDetails().getVirtualId())) { + // return; + //} + + //String contents = reader.contents(); + + int itemId = reader.readInt(); + String contents = reader.readString(); + + String colour = contents.substring(0, 6); + String newMessage = StringUtil.filterInput(contents.substring(7), false); + + if (!colour.equals("FFFFFF") && + !colour.equals("FFFF33") && + !colour.equals("FF9CFF") && + !colour.equals("9CFF9C") && + !colour.equals("9CCEFF")) { + return; + } + + Item item = room.getItemManager().getById(itemId); + + if (item == null) { + return; + } + + if (!item.hasBehaviour(ItemBehaviour.POST_IT)) { + return; + } + + String oldText = ""; + String oldColour = "FFFFFF"; + + if (item.getCustomData().length() > 6) { // Strip colour code + oldText = item.getCustomData().substring(6); + oldColour = item.getCustomData().substring(0, 6); + } + + // If the user doesn't have rights, make sure they can only append to the sticky, not remove the existing information before it + if (!room.hasRights(player.getDetails().getId()) && !player.hasFuse(Fuseright.MOD)) { + if (oldText.length() > 0 && !newMessage.startsWith(oldText)) { + return; + } + } + + // Validate the colour is the same if the user doesn't have any rights + if (!room.isOwner(player.getDetails().getId()) && !player.hasFuse(Fuseright.ANY_ROOM_CONTROLLER)) { + if (!oldColour.equals(colour)) { + return; + } + } + + if (newMessage.length() > 684) { + newMessage = newMessage.substring(0, 684); + } + + item.setCustomData(colour + newMessage); + item.updateStatus(); + item.save(); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/SET_RANDOM_STATE.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/SET_RANDOM_STATE.java new file mode 100644 index 0000000..a0b17d6 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/SET_RANDOM_STATE.java @@ -0,0 +1,68 @@ +package org.alexdev.havana.messages.incoming.rooms.items; + +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.mapping.RoomTile; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class SET_RANDOM_STATE implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + Room room = player.getRoomUser().getRoom(); + + if (room == null) { + return; + } + + int itemId = reader.readInt(); + Item item = room.getItemManager().getById(itemId); + + if (item == null) { + return; + } + + if (item.hasBehaviour(ItemBehaviour.ROOMDIMMER) + || item.hasBehaviour(ItemBehaviour.DICE) + || item.hasBehaviour(ItemBehaviour.PRIZE_TROPHY) + || item.hasBehaviour(ItemBehaviour.POST_IT) + || item.hasBehaviour(ItemBehaviour.ROLLER) + || item.hasBehaviour(ItemBehaviour.WHEEL_OF_FORTUNE) + || item.hasBehaviour(ItemBehaviour.SOUND_MACHINE_SAMPLE_SET)) { + return; // Prevent dice rigging, scripting trophies, post-its, etc. + } + + if (item.hasBehaviour(ItemBehaviour.REQUIRES_RIGHTS_FOR_INTERACTION) + && !room.hasRights(player.getDetails().getId()) + && !player.hasFuse(Fuseright.MOD)) { + return; + } + + if (item.hasBehaviour(ItemBehaviour.REQUIRES_TOUCHING_FOR_INTERACTION)) { + if (!item.getPosition().touches(player.getRoomUser().getPosition())) { + Position nextPosition = item.getPosition().getSquareInFront(); + + if (!item.hasBehaviour(ItemBehaviour.TELEPORTER)) { + if (!RoomTile.isValidTile(room, player, nextPosition)) { + nextPosition = item.getTile().getNextAvailablePosition(player); + } + + if (nextPosition != null) { + player.getRoomUser().walkTo( + nextPosition.getX(), + nextPosition.getY() + ); + } + + return; + } + } + } + + item.getDefinition().getInteractionType().getTrigger().onInteract(player, room, item, -1); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/SPIN_WHEEL_OF_FORTUNE.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/SPIN_WHEEL_OF_FORTUNE.java new file mode 100644 index 0000000..0c2ada9 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/SPIN_WHEEL_OF_FORTUNE.java @@ -0,0 +1,54 @@ +package org.alexdev.havana.messages.incoming.rooms.items; + +import org.alexdev.havana.game.GameScheduler; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.entities.RoomEntity; +import org.alexdev.havana.game.room.tasks.FortuneTask; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +import java.util.concurrent.TimeUnit; + + +public class SPIN_WHEEL_OF_FORTUNE implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + RoomEntity roomEntity = player.getRoomUser(); + Room room = roomEntity.getRoom(); + + if (room == null) { + return; + } + + if (!room.hasRights(player.getDetails().getId()) && !player.hasFuse(Fuseright.MOD)) { + return; + } + + int itemId = reader.readInt(); + + // Get item by ID + Item item = room.getItemManager().getById(itemId); + + // Check if item exists and if it is a wheel of fortune + if (item == null || !item.hasBehaviour(ItemBehaviour.WHEEL_OF_FORTUNE)) { + return; + } + + // Spin already being executed, return + if (item.getRequiresUpdate()) { + return; + } + + // Send spinning animation to room + item.setCustomData("-1"); + item.updateStatus(); + + item.setRequiresUpdate(true); + + GameScheduler.getInstance().getService().schedule(new FortuneTask(item), 4250, TimeUnit.MILLISECONDS); + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/THROW_DICE.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/THROW_DICE.java new file mode 100644 index 0000000..bd8f5ed --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/THROW_DICE.java @@ -0,0 +1,58 @@ +package org.alexdev.havana.messages.incoming.rooms.items; + +import org.alexdev.havana.game.GameScheduler; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.entities.RoomEntity; +import org.alexdev.havana.game.room.tasks.DiceTask; +import org.alexdev.havana.messages.outgoing.rooms.items.DICE_VALUE; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +import java.util.concurrent.TimeUnit; + + +public class THROW_DICE implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + RoomEntity roomEntity = player.getRoomUser(); + Room room = roomEntity.getRoom(); + + if (room == null) { + return; + } + + int itemId = reader.readInt(); + Item item = room.getItemManager().getById(itemId); + + if (item == null || !item.hasBehaviour(ItemBehaviour.DICE)) { + return; + } + + // Return if dice is already being rolled + if (item.getRequiresUpdate()) { + return; + } + + // Check if user is next to dice + if (!roomEntity.getPosition().touches(item.getPosition())) { + return; + } + + // We reset the room timer here too as in casinos you might be in the same place for a while + // And you don't want to get kicked while you're still actively rolling dices for people :) + player.getRoomUser().getTimerManager().resetRoomTimer(); + + room.send(new DICE_VALUE(itemId, true, -1)); + + // Send spinning animation to room + //item.setCustomData("1"); + //item.updateStatus(); + + item.setRequiresUpdate(true); + + GameScheduler.getInstance().getService().schedule(new DiceTask(item), 2, TimeUnit.SECONDS); + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/USEFURNITURE.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/USEFURNITURE.java new file mode 100644 index 0000000..fc19478 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/USEFURNITURE.java @@ -0,0 +1,89 @@ +package org.alexdev.havana.messages.incoming.rooms.items; + +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.mapping.RoomTile; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class USEFURNITURE implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + Room room = player.getRoomUser().getRoom(); + + if (room == null) { + return; + } + + int itemId = reader.readInt(); + int status = reader.readInt(); + + Item item = room.getItemManager().getById(itemId); + + if (item == null ) { + return; + } + + if (item.hasBehaviour(ItemBehaviour.ROOMDIMMER) + || item.hasBehaviour(ItemBehaviour.DICE) + || item.hasBehaviour(ItemBehaviour.PRIZE_TROPHY) + || item.hasBehaviour(ItemBehaviour.POST_IT) + || item.hasBehaviour(ItemBehaviour.ROLLER) + || item.hasBehaviour(ItemBehaviour.WHEEL_OF_FORTUNE) + || item.hasBehaviour(ItemBehaviour.SOUND_MACHINE_SAMPLE_SET)) { + return; // Prevent dice rigging, scripting trophies, post-its, etc. + } + + if (item.hasBehaviour(ItemBehaviour.REQUIRES_RIGHTS_FOR_INTERACTION) && !room.hasRights(player.getDetails().getId()) && !player.hasFuse(Fuseright.MOD)) { + return; + } + + if (item.hasBehaviour(ItemBehaviour.REQUIRES_TOUCHING_FOR_INTERACTION)) { + if (!item.getPosition().touches(player.getRoomUser().getPosition())) { + Position nextPosition = item.getPosition().getSquareInFront(); + + if (!RoomTile.isValidTile(room, player, nextPosition)) { + var tile = item.getTile(); + + if (tile != null) { + nextPosition = item.getTile().getNextAvailablePosition(player); + } + } + + if (nextPosition != null) { + player.getRoomUser().walkTo(nextPosition.getX(), nextPosition.getY()); + } + return; + } + } + + if (player.getRoomUser().hasItemDebug()) { + StringBuilder alert = new StringBuilder(); + alert.append("Name: " + item.getDefinition().getName()); + alert.append("
"); + alert.append("Description: " + item.getDefinition().getDescription()); + alert.append("
"); + alert.append("Definition ID: " + item.getDefinition().getId()); + alert.append("
"); + alert.append("Sprite ID: " + item.getDefinition().getSpriteId()); + alert.append("
"); + alert.append("Sprite Name: " + item.getDefinition().getSprite()); + alert.append("
"); + alert.append("Top Height: " + item.getDefinition().getTopHeight()); + alert.append("
"); + alert.append("Total Height: " + item.getTotalHeight()); + alert.append("
"); + alert.append("Z Height: " + item.getPosition().getZ()); + alert.append("
"); + alert.append("X Y: " + item.getPosition().toString()); + player.send(new ALERT(alert.toString())); + } + + item.getDefinition().getInteractionType().getTrigger().onInteract(player, room, item, status); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/USEWALLITEM.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/USEWALLITEM.java new file mode 100644 index 0000000..2d1acbf --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/items/USEWALLITEM.java @@ -0,0 +1,50 @@ +package org.alexdev.havana.messages.incoming.rooms.items; + +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class USEWALLITEM implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + Room room = player.getRoomUser().getRoom(); + + if (room == null) { + return; + } + + int itemId = reader.readInt(); + + Item item = room.getItemManager().getById(itemId); + + if (item == null ) { + return; + } + + if (!item.hasBehaviour(ItemBehaviour.WALL_ITEM)) { + return; // Prevent dice rigging, scripting trophies, post-its, etc. + } + + if (item.hasBehaviour(ItemBehaviour.ROOMDIMMER) + || item.hasBehaviour(ItemBehaviour.DICE) + || item.hasBehaviour(ItemBehaviour.PRIZE_TROPHY) + || item.hasBehaviour(ItemBehaviour.POST_IT) + || item.hasBehaviour(ItemBehaviour.ROLLER) + || item.hasBehaviour(ItemBehaviour.WHEEL_OF_FORTUNE) + || item.hasBehaviour(ItemBehaviour.SOUND_MACHINE_SAMPLE_SET)) { + return; // Prevent dice rigging, scripting trophies, post-its, etc. + } + + if (item.hasBehaviour(ItemBehaviour.REQUIRES_RIGHTS_FOR_INTERACTION) + && !room.hasRights(player.getDetails().getId()) + && !player.hasFuse(Fuseright.MOD)) { + return; + } + + item.getDefinition().getInteractionType().getTrigger().onInteract(player, room, item, -1); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/moderation/ASSIGNRIGHTS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/moderation/ASSIGNRIGHTS.java new file mode 100644 index 0000000..e191b25 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/moderation/ASSIGNRIGHTS.java @@ -0,0 +1,45 @@ +package org.alexdev.havana.messages.incoming.rooms.moderation; + +import org.alexdev.havana.dao.mysql.RoomRightsDao; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.server.util.MalformedPacketException; + +import java.sql.SQLException; + +public class ASSIGNRIGHTS implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws SQLException, MalformedPacketException { + if (player.getRoomUser().getRoom() == null) { + return; + } + + Room room = player.getRoomUser().getRoom(); + + if (!room.isOwner(player.getDetails().getId()) && !player.hasFuse(Fuseright.ANY_ROOM_CONTROLLER)) { + return; + } + + Player target = PlayerManager.getInstance().getPlayerByName(reader.contents()); + + if (target == null || target.getRoomUser().getRoom() == null || target.getRoomUser().getRoom().getId() != room.getId()) { + return; + } + + Integer userId = target.getDetails().getId(); + + if (room.getRights().contains(userId)) { + return; + } + + room.getRights().add(userId); + room.refreshRights(target, true); + + target.getRoomUser().setNeedsUpdate(true); + RoomRightsDao.addRights(target.getDetails(), room.getData()); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/moderation/BANUSER.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/moderation/BANUSER.java new file mode 100644 index 0000000..6605255 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/moderation/BANUSER.java @@ -0,0 +1,53 @@ +package org.alexdev.havana.messages.incoming.rooms.moderation; + +import org.alexdev.havana.dao.mysql.RoomBanDao; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.texts.TextsManager; +import org.alexdev.havana.messages.outgoing.navigator.CANTCONNECT; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.util.DateUtil; + +import java.util.concurrent.TimeUnit; + +public class BANUSER implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + Room room = player.getRoomUser().getRoom(); + + if (room == null) { + return; + } + + Player target = PlayerManager.getInstance().getPlayerByName(reader.contents()); + + if (target == null || target.getRoomUser().getRoom() == null || target.getRoomUser().getRoom().getId() != room.getId()) { + return; + } + + if (target.getDetails().getId() == player.getDetails().getId()) { + return; // Can't kick yourself! + } + + // Don't allow kicking if they are room moderators / room owners + if (target.hasFuse(Fuseright.KICK) || room.isOwner(target.getDetails().getId())) { + player.send(new ALERT(TextsManager.getInstance().getValue("modtool_rankerror"))); + return; + } + + // Don't allow kicking if you aren't room owner or don't have fuse rights + if (!room.isOwner(player.getDetails().getId()) && !player.hasFuse(Fuseright.KICK)) { + player.send(new ALERT(TextsManager.getInstance().getValue("modtool_rankerror"))); + return; + } + + target.send(new CANTCONNECT(CANTCONNECT.ConnectError.BANNED)); + target.getRoomUser().kick(false, true); + + RoomBanDao.addBan(target.getDetails().getId(), room.getId(), DateUtil.getCurrentTimeSeconds() + TimeUnit.HOURS.toSeconds(6)); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/moderation/KICK.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/moderation/KICK.java new file mode 100644 index 0000000..b29794d --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/moderation/KICK.java @@ -0,0 +1,47 @@ +package org.alexdev.havana.messages.incoming.rooms.moderation; + +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.texts.TextsManager; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; +import org.alexdev.havana.messages.outgoing.rooms.user.HOTEL_VIEW; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class KICK implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + Room room = player.getRoomUser().getRoom(); + + if (room == null) { + return; + } + + Player target = PlayerManager.getInstance().getPlayerByName(reader.contents()); + + if (target == null || target.getRoomUser().getRoom() == null || target.getRoomUser().getRoom().getId() != room.getId()) { + return; + } + + if (target.getDetails().getId() == player.getDetails().getId()) { + return; // Can't kick yourself! + } + + // Don't allow kicking if they are room moderators / room owners + if (target.hasFuse(Fuseright.KICK) || room.isOwner(target.getDetails().getId())) { + player.send(new ALERT(TextsManager.getInstance().getValue("modtool_rankerror"))); + return; + } + + // Don't allow kicking if you don't have room rights and don't have fuse rights + if (!room.hasRights(player.getDetails().getId()) && !player.hasFuse(Fuseright.KICK)) { + player.send(new ALERT(TextsManager.getInstance().getValue("modtool_rankerror"))); + return; + } + + target.send(new HOTEL_VIEW()); + target.getRoomUser().kick(false, true); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/moderation/LETUSERIN.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/moderation/LETUSERIN.java new file mode 100644 index 0000000..435c076 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/moderation/LETUSERIN.java @@ -0,0 +1,41 @@ +package org.alexdev.havana.messages.incoming.rooms.moderation; + +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.rooms.FLATNOTALLOWEDTOENTER; +import org.alexdev.havana.messages.outgoing.rooms.FLAT_LETIN; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class LETUSERIN implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + Room room = player.getRoomUser().getRoom(); + + if (room == null) { + return; + } + + if (!room.hasRights(player.getDetails().getId())&& !player.hasFuse(Fuseright.ANY_ROOM_CONTROLLER)) { + return; + } + + String username = reader.readString(); + boolean canEnter = reader.readBoolean(); + + Player enteringPlayer = PlayerManager.getInstance().getPlayerByName(username); + + if (enteringPlayer == null || enteringPlayer.getRoomUser().getAuthenticateId() == room.getId()) { + return; + } + + if (canEnter) { + enteringPlayer.getRoomUser().setAuthenticateId(room.getId()); + enteringPlayer.send(new FLAT_LETIN()); + } else { + enteringPlayer.send(new FLATNOTALLOWEDTOENTER()); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/moderation/REMOVEALLRIGHTS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/moderation/REMOVEALLRIGHTS.java new file mode 100644 index 0000000..f40fc89 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/moderation/REMOVEALLRIGHTS.java @@ -0,0 +1,34 @@ +package org.alexdev.havana.messages.incoming.rooms.moderation; + +import org.alexdev.havana.dao.mysql.RoomRightsDao; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.RoomManager; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class REMOVEALLRIGHTS implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + int roomId = reader.readInt(); + + Room room = RoomManager.getInstance().getRoomById(roomId); + + if (room == null) { + return; + } + + if (!room.isOwner(player.getDetails().getId()) && !player.hasFuse(Fuseright.ANY_ROOM_CONTROLLER)) { + return; + } + + room.getRights().clear(); + + for (Player roomPlayer : room.getEntityManager().getPlayers()) { + room.refreshRights(roomPlayer, true); + } + + RoomRightsDao.deleteRoomRights(room.getData()); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/moderation/REMOVERIGHTS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/moderation/REMOVERIGHTS.java new file mode 100644 index 0000000..3713eb5 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/moderation/REMOVERIGHTS.java @@ -0,0 +1,49 @@ +package org.alexdev.havana.messages.incoming.rooms.moderation; + +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.dao.mysql.RoomRightsDao; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +import java.util.List; + +public class REMOVERIGHTS implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + Room room = player.getRoomUser().getRoom(); + + if (!room.isOwner(player.getDetails().getId()) && !player.hasFuse(Fuseright.ANY_ROOM_CONTROLLER)) { + return; + } + + + List targets = List.of(PlayerDao.getId(reader.contents())); + + for (int targetId : targets) { + if (!room.getRights().contains(targetId)) { + continue; + } + + var target = PlayerManager.getInstance().getPlayerById(targetId); + + if (target != null) { + if (target.getRoomUser().getRoom() == null || target.getRoomUser().getRoom().getId() != room.getId()) { + continue; + } + + room.refreshRights(target, true); + } + + room.getRights().remove(Integer.valueOf(targetId)); + RoomRightsDao.removeRights(targetId, room.getData()); + } + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/pool/BTCKS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/pool/BTCKS.java new file mode 100644 index 0000000..0eabb37 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/pool/BTCKS.java @@ -0,0 +1,86 @@ +package org.alexdev.havana.messages.incoming.rooms.pool; + +import org.alexdev.havana.dao.mysql.CurrencyDao; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.game.catalogue.CatalogueManager; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.interactors.InteractionType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.messages.outgoing.catalogue.NO_CREDITS; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; +import org.alexdev.havana.messages.outgoing.user.currencies.CREDIT_BALANCE; +import org.alexdev.havana.messages.outgoing.alerts.NO_USER_FOUND; +import org.alexdev.havana.messages.outgoing.user.currencies.TICKET_BALANCE; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class BTCKS implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + int mode = reader.readInt(); + String ticketsFor = reader.readString(); + + if (ticketsFor == null) { + return; + } + + int costCredits; + int ticketsAmount; + + if (mode == 1) { + costCredits = 1; + ticketsAmount = 2; + } else { + costCredits = 6; + ticketsAmount = 20; + } + + if (costCredits > player.getDetails().getCredits()) { + player.send(new NO_CREDITS(true, false)); + return; + } + + int userId = PlayerDao.getId(ticketsFor); + + if (userId == -1) { + player.send(new NO_USER_FOUND(ticketsFor)); + return; + } + + PlayerDetails details = PlayerManager.getInstance().getPlayerData(userId); + CurrencyDao.increaseTickets(details, ticketsAmount); + + Player ticketPlayer = PlayerManager.getInstance().getPlayerByName(ticketsFor); + + if (ticketPlayer != null) { + if (userId != player.getDetails().getId()) { + ticketPlayer.send(new ALERT(player.getDetails().getName() + " has gifted you tickets!")); + } + + ticketPlayer.send(new TICKET_BALANCE(details.getTickets())); + } + + player.getRoomUser().getTimerManager().resetRoomTimer(); + + CurrencyDao.decreaseCredits(player.getDetails(), costCredits); + player.send(new CREDIT_BALANCE(player.getDetails().getCredits())); + + // Join queue after buying ticket + if (player.getRoomUser().getRoom().getModel().getName().equals("md_a")) { + Item item = player.getRoomUser().getCurrentItem(); + + if (item != null && item.getDefinition().getInteractionType() == InteractionType.WS_JOIN_QUEUE) { + item.getDefinition().getInteractionType().getTrigger().onEntityStop(player, player.getRoomUser(), item, false); + } + } + + /*Room room = player.getRoomUser().getRoom(); + + if (room != null && room.getModel().getModelTrigger() instanceof GameLobbyTrigger) { + GameLobbyTrigger gameLobbyTrigger = (GameLobbyTrigger) room.getModel().getModelTrigger(); + player.send(gameLobbyTrigger.getInstanceList()); + }*/ + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/pool/CLOSE_UIMAKOPPI.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/pool/CLOSE_UIMAKOPPI.java new file mode 100644 index 0000000..0243bca --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/pool/CLOSE_UIMAKOPPI.java @@ -0,0 +1,24 @@ +package org.alexdev.havana.messages.incoming.rooms.pool; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.handlers.PoolHandler; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class CLOSE_UIMAKOPPI implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + Room room = player.getRoomUser().getRoom(); + + if (room == null) { + return; + } + + if (!room.getData().getModel().equals("pool_a") && !room.getData().getModel().equals("md_a")) { + return; + } + + PoolHandler.exitBooth(player); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/pool/DIVE.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/pool/DIVE.java new file mode 100644 index 0000000..74b8788 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/pool/DIVE.java @@ -0,0 +1,25 @@ +package org.alexdev.havana.messages.incoming.rooms.pool; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.rooms.pool.JUMPDATA; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class DIVE implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + if (!player.getRoomUser().isDiving()) { + return; + } + + Room room = player.getRoomUser().getRoom(); + + String divingHandle = reader.contents(); + room.send(new JUMPDATA(player.getRoomUser().getInstanceId(), divingHandle)); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/pool/SIGN.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/pool/SIGN.java new file mode 100644 index 0000000..e869a62 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/pool/SIGN.java @@ -0,0 +1,40 @@ +package org.alexdev.havana.messages.incoming.rooms.pool; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.enums.StatusType; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.apache.commons.lang3.StringUtils; + +public class SIGN implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + Room room = player.getRoomUser().getRoom(); + + if (room == null) { + return; + } + + String contents = reader.contents(); + + if (!StringUtils.isNumeric(contents)) { + return; + } + + int vote = Integer.parseInt(contents); + + if (vote < 0) { + return; + } + + if (vote <= 7) { + player.getRoomUser().setLidoVote(vote + 3); + } + + player.getRoomUser().setStatus(StatusType.SIGN, contents, 5, null, -1, -1); + player.getRoomUser().setNeedsUpdate(true); + + player.getRoomUser().getTimerManager().resetRoomTimer(); + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/pool/SPLASH_POSITION.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/pool/SPLASH_POSITION.java new file mode 100644 index 0000000..8d244ab --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/pool/SPLASH_POSITION.java @@ -0,0 +1,82 @@ +package org.alexdev.havana.messages.incoming.rooms.pool; + +import org.alexdev.havana.game.GameScheduler; +import org.alexdev.havana.game.room.enums.StatusType; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.rooms.items.SHOWPROGRAM; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.util.StringUtil; + +import java.util.concurrent.TimeUnit; + +public class SPLASH_POSITION implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + if (!player.getRoomUser().isDiving()) { + return; + } + + Room room = player.getRoomUser().getRoom(); + + if (!room.getModel().getName().equals("pool_b")) { + return; + } + + Item currentItem = player.getRoomUser().getCurrentItem(); + + if (currentItem == null || !currentItem.getDefinition().getSprite().equals("poolLift")) { + return; + } + + Position destination = new Position(23, 19, 0); + String contents = destination.getX() + "," + destination.getY(); + + player.getRoomUser().setStatus(StatusType.SWIM, ""); + player.getRoomUser().warp(destination, true, false); + + room.send(new SHOWPROGRAM(new String[] { "BIGSPLASH", "POSITION", contents,})); + + player.getRoomUser().setDiving(false); + player.getRoomUser().walkTo(20, 19); + player.getRoomUser().setEnableWalkingOnStop(true); + + currentItem.showProgram("open"); + + GameScheduler.getInstance().getService().schedule(() -> { + int total = 0; + int sum = 0; + double finalScore = 0; + + for (Player p : room.getEntityManager().getPlayers()) { + if (p.getDetails().getId() == player.getDetails().getId()) { + continue; + } + + if (p.getRoomUser().getLidoVote() > 0) { + sum += p.getRoomUser().getLidoVote(); + total++; + } + } + + room.send(new SHOWPROGRAM(new String[]{"cam1", "targetcamera", String.valueOf(player.getRoomUser().getInstanceId())})); + + if (total > 0) { + finalScore = StringUtil.format((double) sum / total); + } + + room.send(new SHOWPROGRAM(new String[]{"cam1", "showtext", (player.getDetails().getName() + "'s\n score: " + finalScore)})); + + for (Player p : room.getEntityManager().getPlayers()) { + p.getRoomUser().setLidoVote(0); + } + }, 1, TimeUnit.SECONDS); + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/pool/SWIMSUIT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/pool/SWIMSUIT.java new file mode 100644 index 0000000..75ef1b1 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/pool/SWIMSUIT.java @@ -0,0 +1,36 @@ +package org.alexdev.havana.messages.incoming.rooms.pool; + +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.rooms.user.USER_OBJECTS; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.util.StringUtil; + +public class SWIMSUIT implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + Room room = player.getRoomUser().getRoom(); + + if (room == null) { + return; + } + + if (!room.getData().getModel().equals("pool_a") && + !room.getData().getModel().equals("md_a")) { + return; + } + + String swimsuit = StringUtil.filterInput(reader.contents(), true); + player.getDetails().setPoolFigure(swimsuit); + + room.send(new USER_OBJECTS(player)); + + PlayerDao.saveDetails( + player.getDetails().getId(), + player.getDetails().getFigure(), + player.getDetails().getPoolFigure(), + player.getDetails().getSex()); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/settings/CREATEFLAT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/settings/CREATEFLAT.java new file mode 100644 index 0000000..b67d91e --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/settings/CREATEFLAT.java @@ -0,0 +1,72 @@ +package org.alexdev.havana.messages.incoming.rooms.settings; + +import org.alexdev.havana.dao.mysql.NavigatorDao; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.models.RoomModelManager; +import org.alexdev.havana.game.texts.TextsManager; +import org.alexdev.havana.game.wordfilter.WordfilterManager; +import org.alexdev.havana.messages.outgoing.rooms.settings.GOTO_FLAT; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.server.util.MalformedPacketException; +import org.alexdev.havana.util.StringUtil; + +import java.sql.SQLException; + +public class CREATEFLAT implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws SQLException, MalformedPacketException { + String roomName = WordfilterManager.filterSentence(StringUtil.filterInput(reader.readString(), true)); + String roomModel = reader.readString(); + String roomAccess = reader.remainingBytes().length > 0 ? reader.readString() : ""; + boolean roomShowName = reader.remainingBytes().length <= 0 || reader.readBoolean(); + + if (roomName.replace(" ", "").isEmpty()) { + player.send(new ALERT(TextsManager.getInstance().getValue("roomatic_givename"))); + return; + } + + if (!roomModel.startsWith("model_")) { + return; + } + + if (RoomModelManager.getInstance().getModel(roomModel) == null) { + return; + } + + String modelType = roomModel.replace("model_", ""); + + if (!modelType.equals("a") && + !modelType.equals("b") && + !modelType.equals("c") && + !modelType.equals("d") && + !modelType.equals("e") && + !modelType.equals("f") && + !modelType.equals("i") && + !modelType.equals("j") && + !modelType.equals("k") && + !modelType.equals("l") && + !modelType.equals("m") && + !modelType.equals("n") && + !player.hasFuse(Fuseright.USE_SPECIAL_ROOM_LAYOUTS)) { + return; // Fuck off, scripter. + } + + int accessType = 0; + + if (roomAccess.equals("password")) { + accessType = 2; + } + + if (roomAccess.equals("closed")) { + accessType = 1; + } + + int roomId = NavigatorDao.createRoom(player.getDetails().getId(), roomName, roomModel, roomShowName, accessType); + + player.getRoomUser().setAuthenticateId(roomId); + player.send(new GOTO_FLAT(roomId, roomName)); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/settings/DELETEFLAT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/settings/DELETEFLAT.java new file mode 100644 index 0000000..793211a --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/settings/DELETEFLAT.java @@ -0,0 +1,54 @@ +package org.alexdev.havana.messages.incoming.rooms.settings; + +import org.alexdev.havana.dao.mysql.GroupDao; +import org.alexdev.havana.dao.mysql.RoomDao; +import org.alexdev.havana.dao.mysql.TagDao; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.RoomManager; +import org.alexdev.havana.log.Log; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class DELETEFLAT implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + int roomId = reader.readInt(); + delete(roomId, player.getDetails().getId()); + } + + public static void delete(int roomId, int userId) throws SQLException { + Room room = RoomManager.getInstance().getRoomById(roomId); + + if (room == null) { + return; + } + + if (!room.isOwner(userId)) { + return; + } + + for (var item : room.getItems()) { + item.delete(); + } + + List entities = new ArrayList<>(room.getEntities()); + + for (Entity entity : entities) { + room.getEntityManager().leaveRoom(entity, true); + } + + if (!room.tryDispose()) { + Log.getErrorLogger().error("Room " + roomId + " did not want to get disposed by player id " + userId); + } + + TagDao.removeTags(0, roomId, 0); + GroupDao.deleteHomeRoom(roomId); + RoomDao.delete(room); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/settings/GETFLATCAT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/settings/GETFLATCAT.java new file mode 100644 index 0000000..ce90e92 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/settings/GETFLATCAT.java @@ -0,0 +1,23 @@ +package org.alexdev.havana.messages.incoming.rooms.settings; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.RoomManager; +import org.alexdev.havana.messages.outgoing.rooms.settings.FLATCAT; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class GETFLATCAT implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + int roomId = reader.readInt(); + + Room room = RoomManager.getInstance().getRoomById(roomId); + + if (room == null) { + return; + } + + player.send(new FLATCAT(room.getId(), room.getData().getCategoryId())); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/settings/GETFLATINFO.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/settings/GETFLATINFO.java new file mode 100644 index 0000000..b32ea7a --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/settings/GETFLATINFO.java @@ -0,0 +1,29 @@ +package org.alexdev.havana.messages.incoming.rooms.settings; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.RoomManager; +import org.alexdev.havana.messages.outgoing.rooms.settings.FLATINFO; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class GETFLATINFO implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + int roomId = reader.readInt(); + + Room room = RoomManager.getInstance().getRoomById(roomId); + + if (room == null) { + return; + } + + boolean overrideLock = false; + + if (player.getRoomUser().getAuthenticateId() == roomId) { + overrideLock = true; + } + + player.send(new FLATINFO(player, room, overrideLock)); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/settings/SETFLATCAT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/settings/SETFLATCAT.java new file mode 100644 index 0000000..58ba1bd --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/settings/SETFLATCAT.java @@ -0,0 +1,46 @@ +package org.alexdev.havana.messages.incoming.rooms.settings; + +import org.alexdev.havana.dao.mysql.RoomDao; +import org.alexdev.havana.game.navigator.NavigatorCategory; +import org.alexdev.havana.game.navigator.NavigatorManager; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.RoomManager; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class SETFLATCAT implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + int roomId = reader.readInt(); + int categoryId = reader.readInt(); + + NavigatorCategory category = NavigatorManager.getInstance().getCategoryById(categoryId); + + if (category == null) { + return; + } + + if (category.getMinimumRoleSetFlat().getRankId() > player.getDetails().getRank().getRankId()) { + return; + } + + if (category.isNode() || category.isPublicSpaces()) { + categoryId = 2; + } + + Room room = RoomManager.getInstance().getRoomById(roomId); + + if (room == null) { + return; + } + + if (!room.isOwner(player.getDetails().getId())) { + return; + } + + room.getData().setCategoryId(categoryId); + RoomDao.save(room); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/settings/SETFLATINFO.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/settings/SETFLATINFO.java new file mode 100644 index 0000000..eebeee5 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/settings/SETFLATINFO.java @@ -0,0 +1,53 @@ +package org.alexdev.havana.messages.incoming.rooms.settings; + +import org.alexdev.havana.dao.mysql.RoomDao; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.RoomManager; +import org.alexdev.havana.game.wordfilter.WordfilterManager; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.util.StringUtil; + +public class SETFLATINFO implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + String contents = reader.contents(); + + if (contents.startsWith("/")) { + contents = contents.substring(1); + } + + int roomId = reader.readInt(); + + Room room = RoomManager.getInstance().getRoomById(roomId); + + if (room == null) { + return; + } + + if (!room.isOwner(player.getDetails().getId())) { + return; + } + + String description = WordfilterManager.filterSentence(reader.readString()); + String password = reader.readString(); + int allSuperUser = reader.readInt(); + + room.getData().setDescription(StringUtil.filterInput(description, true)); + room.getData().setPassword(StringUtil.filterInput(password, true)); + room.getData().setSuperUsers(allSuperUser == 1); + + if (reader.remainingBytes().length > 0) { + int maxVisitors = reader.readInt(); + + if (maxVisitors < 10 || maxVisitors > 50) { + maxVisitors = 25; + } + + room.getData().setVisitorsMax(maxVisitors); + } + + RoomDao.save(room); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/settings/UPDATEFLAT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/settings/UPDATEFLAT.java new file mode 100644 index 0000000..1d9f407 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/settings/UPDATEFLAT.java @@ -0,0 +1,46 @@ +package org.alexdev.havana.messages.incoming.rooms.settings; + +import org.alexdev.havana.dao.mysql.RoomDao; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.RoomManager; +import org.alexdev.havana.game.wordfilter.WordfilterManager; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.util.StringUtil; + +public class UPDATEFLAT implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + int roomId = reader.readInt(); + + Room room = RoomManager.getInstance().getRoomById(roomId); + + if (room == null) { + return; + } + + if (!room.isOwner(player.getDetails().getId())) { + return; + } + + String roomName = WordfilterManager.filterSentence(StringUtil.filterInput(reader.readString(), true)); + String accessType = reader.readString(); + boolean showOwner = reader.readBoolean(); + + int accessTypeId = 0; + + if (accessType.equals("closed")) { + accessTypeId = 1; + } + + if (accessType.equals("password")) { + accessTypeId = 2; + } + + room.getData().setName(roomName); + room.getData().setAccessType(accessTypeId); + room.getData().setShowOwnerName(showOwner); + RoomDao.save(room); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/CARRYDRINK.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/CARRYDRINK.java new file mode 100644 index 0000000..9e0f32e --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/CARRYDRINK.java @@ -0,0 +1,56 @@ +package org.alexdev.havana.messages.incoming.rooms.user; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.enums.StatusType; +import org.alexdev.havana.messages.outgoing.rooms.user.USER_DANCE; +import org.alexdev.havana.messages.outgoing.user.currencies.FILM; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class CARRYDRINK implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + int carryId = reader.readInt(); + + if (carryId > 0 && !player.getRoomUser().canCarry(carryId)) { + return; + } + + // Use old carry status for camera else when user walks, the camera doesn't get used + if (carryId == 20) { + player.getRoomUser().stopCarrying(); + player.getRoomUser().setStatus(StatusType.CARRY_ITEM, "20"); + player.getRoomUser().setNeedsUpdate(true); + + player.send(new FILM(player.getDetails())); + return; + } + + if (carryId == 0 && player.getRoomUser().containsStatus(StatusType.CARRY_ITEM)) { + // Remove carrying item status + player.getRoomUser().removeStatus(StatusType.CARRY_ITEM); + player.getRoomUser().setNeedsUpdate(true); + + if (player.getRoomUser().containsStatus(StatusType.SIT)) { + player.getRoomUser().refreshUser(); + } else { + player.getRoomUser().getRoom().send(new USER_DANCE(player.getRoomUser().getInstanceId(), 1)); + player.getRoomUser().getRoom().send(new USER_DANCE(player.getRoomUser().getInstanceId(), 0)); + } + } + + if (carryId > 0) { + player.getRoomUser().carryItem(carryId, null); + } else { + if (player.getRoomUser().isCarrying()) { + player.getRoomUser().stopCarrying(); + } + } + + player.getRoomUser().getTimerManager().resetRoomTimer(); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/CARRYITEM.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/CARRYITEM.java new file mode 100644 index 0000000..54918ea --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/CARRYITEM.java @@ -0,0 +1,52 @@ +package org.alexdev.havana.messages.incoming.rooms.user; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.enums.StatusType; +import org.alexdev.havana.messages.outgoing.rooms.user.USER_DANCE; +import org.alexdev.havana.messages.outgoing.user.currencies.FILM; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class CARRYITEM implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + int carryId = reader.readInt(); + + if (carryId > 0 && !player.getRoomUser().canCarry(carryId)) { + return; + } + + if (carryId == 20) { + player.getRoomUser().stopCarrying(); + player.getRoomUser().setStatus(StatusType.CARRY_ITEM, "20"); + player.getRoomUser().setNeedsUpdate(true); + + player.send(new FILM(player.getDetails())); + return; + } + + if (carryId == 0 && player.getRoomUser().containsStatus(StatusType.CARRY_ITEM)) { + // Remove carrying item status + player.getRoomUser().removeStatus(StatusType.CARRY_ITEM); + player.getRoomUser().setNeedsUpdate(true); + + // Hacky fix to remove "Carrying: camera" + player.getRoomUser().getRoom().send(new USER_DANCE(player.getRoomUser().getInstanceId(), 1)); + player.getRoomUser().getRoom().send(new USER_DANCE(player.getRoomUser().getInstanceId(), 0)); + } + + + /*if (StringUtils.isNumeric(contents)) { + player.getRoomUser().carryItem(Integer.parseInt(contents), null); + } else { + player.getRoomUser().carryItem(-1, contents); + }*/ + + player.getRoomUser().carryItem(carryId, null); + player.getRoomUser().getTimerManager().resetRoomTimer(); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/CHAT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/CHAT.java new file mode 100644 index 0000000..9a0b3b6 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/CHAT.java @@ -0,0 +1,106 @@ +package org.alexdev.havana.messages.incoming.rooms.user; + +import org.alexdev.havana.game.commands.CommandManager; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.wordfilter.WordfilterManager; +import org.alexdev.havana.messages.outgoing.rooms.user.CHAT_MESSAGE; +import org.alexdev.havana.messages.outgoing.rooms.user.TYPING_STATUS; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.util.StringUtil; + +public class CHAT implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + Room room = player.getRoomUser().getRoom(); + + if (room == null) { + return; + } + + String originalMessage = reader.readString(); + String message = WordfilterManager.filterMandatorySentence(StringUtil.filterInput(originalMessage, true)); + + if (message.isBlank()) { + return; + } + + if (WordfilterManager.hasBannableSentence(player, originalMessage)) { + WordfilterManager.performBan(player); + return; + } + + if (CommandManager.getInstance().hasCommand(player, originalMessage)) { + CommandManager.getInstance().invokeCommand(player, originalMessage); + return; + } + + if (player.isMuted()) { + PlayerManager.getInstance().showMutedAlert(player); + return; + } + + player.getRoomUser().setTyping(false); + room.send(new TYPING_STATUS(player.getRoomUser().getInstanceId(), player.getRoomUser().isTyping())); + + if (message.isEmpty()) { + return; + } + + player.getRoomUser().talk(message, CHAT_MESSAGE.ChatMessageType.CHAT); + // Make talk hard to read for long distance in public rooms + /*if (room.isPublicRoom() && GameConfiguration.getInstance().getBoolean("talk.garbled.text") && !room.getModel().getName().contains("_arena_")) { + int sourceX = player.getRoomUser().getPosition().getX(); + int sourceY = player.getRoomUser().getPosition().getY(); + + for (Player roomPlayer : room.getEntityManager().getPlayers()) { + int distX = Math.abs(sourceX - roomPlayer.getRoomUser().getPosition().getX()) - 1; + int distY = Math.abs(sourceY - roomPlayer.getRoomUser().getPosition().getY()) - 1; + + if (distX < 9 && distY < 9) {// User can hear + if (distX <= 6 && distY <= 6) {// User can hear full message + roomPlayer.send(new CHAT_MESSAGE(ChatMessageType.CHAT, player.getRoomUser().getInstanceId(), message, gestureId)); + } else { + int garbleIntensity = distX; + + if (distY < distX) { + garbleIntensity = distY; + } + + garbleIntensity -= 4; + char[] garbleMessage = message.toCharArray(); + + for (int pos = 0; pos < garbleMessage.length; pos++) { + int intensity = ThreadLocalRandom.current().nextInt(garbleIntensity, 6); + + if (intensity > 3 && + garbleMessage[pos] != ' ' && + garbleMessage[pos] != ',' && + garbleMessage[pos] != '?' && + garbleMessage[pos] != '!') { + garbleMessage[pos] = '.'; + } + } + + roomPlayer.send(new CHAT_MESSAGE(ChatMessageType.CHAT, player.getRoomUser().getInstanceId(), new String(garbleMessage), gestureId)); + } + } else { + // Disappearing talk bubble + roomPlayer.send(new CHAT_MESSAGE(ChatMessageType.CHAT, player.getRoomUser().getInstanceId(), "", gestureId)); + } + } + } else { + var chatMsg = new CHAT_MESSAGE(ChatMessageType.CHAT, player.getRoomUser().getInstanceId(), message, gestureId); + + for (Player sessions : room.getEntityManager().getPlayers()) { + if (sessions.getIgnoredList().contains(player.getDetails().getName())) { + continue; + } + + sessions.send(chatMsg); + } + }*/ + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/DANCE.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/DANCE.java new file mode 100644 index 0000000..e6d4b6b --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/DANCE.java @@ -0,0 +1,41 @@ +package org.alexdev.havana.messages.incoming.rooms.user; + + +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.enums.StatusType; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class DANCE implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + Room room = player.getRoomUser().getRoom(); + + if (room == null) { + return; + } + + if (player.getRoomUser().containsStatus(StatusType.SWIM) || player.getRoomUser().containsStatus(StatusType.SIT) || player.getRoomUser().containsStatus(StatusType.LAY)) { + return; // Don't allow dancing if they're sitting or laying. + } + + int danceId = reader.readInt(); + + if (danceId == 0) { + player.getRoomUser().stopDancing(); + } else if (danceId == 1) { + player.getRoomUser().dance(danceId); + } else if (danceId > 1 && danceId < 5) { + if (!player.hasFuse(Fuseright.USE_CLUB_DANCE)) { + return; + } + + player.getRoomUser().dance(danceId); + } + + player.getRoomUser().stopCarrying(); + player.getRoomUser().getTimerManager().resetRoomTimer(); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/GET_USER_TAGS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/GET_USER_TAGS.java new file mode 100644 index 0000000..aae63c5 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/GET_USER_TAGS.java @@ -0,0 +1,28 @@ +package org.alexdev.havana.messages.incoming.rooms.user; + +import org.alexdev.havana.dao.mysql.TagDao; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.rooms.user.TAG_LIST; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class GET_USER_TAGS implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + Room room = player.getRoomUser().getRoom(); + + if (room == null) { + return; + } + + Player p = PlayerManager.getInstance().getPlayerById(reader.readInt()); + + if (p == null) { + return; + } + + player.send(new TAG_LIST(p.getDetails().getId(), TagDao.getUserTags(p.getDetails().getId()))); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/GOAWAY.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/GOAWAY.java new file mode 100644 index 0000000..244b8dc --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/GOAWAY.java @@ -0,0 +1,33 @@ +package org.alexdev.havana.messages.incoming.rooms.user; + +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.handlers.walkways.WalkwaysManager; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class GOAWAY implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + if (!player.getRoomUser().isWalkingAllowed()) { + return; + } + + Room room = player.getRoomUser().getRoom(); + + if (room.isPublicRoom()) { + Position doorPosition = room.getModel().getDoorLocation(); + + if (WalkwaysManager.getInstance().getWalkway(room, doorPosition) != null) { + return; + } + } + + player.getRoomUser().kick(true, false); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/IIM.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/IIM.java new file mode 100644 index 0000000..2b6a972 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/IIM.java @@ -0,0 +1,59 @@ +package org.alexdev.havana.messages.incoming.rooms.user; + +import org.alexdev.havana.game.games.gamehalls.GamehallGame; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.entities.RoomEntity; +import org.alexdev.havana.game.games.triggers.GameTrigger; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class IIM implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + String contents = reader.contents(); + String[] commandArgs = reader.contents().split(" "); + + RoomEntity roomEntity = player.getRoomUser(); + + if (roomEntity.getRoom() == null) { + return; + } + + Room room = roomEntity.getRoom(); + Item currentItem = roomEntity.getCurrentItem(); + + // If we're on a current item and the current item has a valid trigger + if (currentItem == null) { + return; + } + + // If the trigger isn't a game trigger then ignore it + if (currentItem.getDefinition().getInteractionType().getTrigger() == null || !(currentItem.getDefinition().getInteractionType().getTrigger() instanceof GameTrigger)) { + return; + } + + GameTrigger trigger = (GameTrigger) currentItem.getDefinition().getInteractionType().getTrigger(); + GamehallGame game = trigger.getGameInstance(roomEntity.getPosition()); + + if (game == null) { + return; + } + + String gameId = commandArgs[0]; + String command = commandArgs[1]; + + if (!gameId.equals(game.getGameId())) { + return; + } + + String arguments = contents.replace(gameId + " " + command, ""); + + if (arguments.startsWith(" ")) { + arguments = arguments.trim(); + } + + game.handleCommand(player, room, player.getRoomUser().getCurrentItem(), command, arguments.split(" ")); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/LOOKTO.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/LOOKTO.java new file mode 100644 index 0000000..f6720ba --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/LOOKTO.java @@ -0,0 +1,87 @@ +package org.alexdev.havana.messages.incoming.rooms.user; + +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.item.interactors.InteractionType; +import org.alexdev.havana.game.room.enums.StatusType; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.pathfinder.Rotation; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class LOOKTO implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + Item item = player.getRoomUser().getCurrentItem(); + + // Don't allow LOOKTO to be handled on wobble squabble tiles. + if (item != null) { + if (item.getDefinition().getInteractionType() == InteractionType.WS_JOIN_QUEUE || + item.getDefinition().getInteractionType() == InteractionType.WS_QUEUE_TILE || + item.getDefinition().getInteractionType() == InteractionType.WS_TILE_START) { + return; // Don't process :sit command on furniture that the user is already on. + } + } + + int x = 0; + int y = 0; + + if (reader.contents().contains(" ")) { + String[] contents = reader.contents().split(" "); + x = Integer.parseInt(contents[0]); + y = Integer.parseInt(contents[1]); + } else { + x = reader.readInt(); + y = reader.readInt(); + } + + Position lookDirection = new Position(x, y); + + if (player.getRoomUser().containsStatus(StatusType.LAY)) { + return; + } + + if (player.getRoomUser().getCurrentItem() != null) { + if (player.getRoomUser().getCurrentItem().hasBehaviour(ItemBehaviour.NO_HEAD_TURN)) { + return; + } + } + + if (player.getRoomUser().getPosition().equals(lookDirection)) { + return; + } + + int rotation = Rotation.calculateHumanDirection( + player.getRoomUser().getPosition().getX(), + player.getRoomUser().getPosition().getY(), + lookDirection.getX(), + lookDirection.getY()); + + // When sitting calculate even rotation + if (player.getRoomUser().containsStatus(StatusType.SIT)) { + Position current = player.getRoomUser().getPosition(); + + // If they're sitting on the ground also rotate body. + //if (player.getRoomUser().isSittingOnGround()) { + // rotation = rotation / 2 * 2; + // player.getRoomUser().getPosition().setBodyRotation(rotation); + //} + + // And now rotate their head for all sitting people. + player.getRoomUser().getPosition().setHeadRotation(Rotation.getHeadRotation(current.getRotation(), current, lookDirection)); + + } else { + player.getRoomUser().getPosition().setRotation(rotation); + } + + player.getRoomUser().setNeedsUpdate(true); + + player.getRoomUser().getTimerManager().beginLookTimer(); // 1 minute looking at them + player.getRoomUser().getTimerManager().resetRoomTimer(); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/QUIT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/QUIT.java new file mode 100644 index 0000000..6e737ae --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/QUIT.java @@ -0,0 +1,20 @@ +package org.alexdev.havana.messages.incoming.rooms.user; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class QUIT implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + // Remove authentication values when user manually leaves + player.getRoomUser().setAuthenticateTelporterId(-1); + player.getRoomUser().setAuthenticateId(-1); + + player.getRoomUser().getRoom().getEntityManager().leaveRoom(player, false); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/RATEFLAT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/RATEFLAT.java new file mode 100644 index 0000000..d9b70ed --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/RATEFLAT.java @@ -0,0 +1,35 @@ +package org.alexdev.havana.messages.incoming.rooms.user; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class RATEFLAT implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + Room room = player.getRoomUser().getRoom(); + + if (room == null || room.isPublicRoom()) { + return; + } + + // Room owner is not allowed to vote on his own room + if (room.getData().getOwnerId() == player.getDetails().getId()) { + return; + } + + int answer = reader.readInt(); + + // It's either negative or positive + if (answer != 1 && answer != -1) { + return; + } + + if (room.hasVoted(player)) { + return; + } + + room.addVote(answer, player); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/RESPECT_USER.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/RESPECT_USER.java new file mode 100644 index 0000000..8c4a32f --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/RESPECT_USER.java @@ -0,0 +1,58 @@ +package org.alexdev.havana.messages.incoming.rooms.user; + +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.game.achievements.AchievementManager; +import org.alexdev.havana.game.achievements.AchievementType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.rooms.user.RESPECT_NOTIFICATION; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class RESPECT_USER implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + Room room = player.getRoomUser().getRoom(); + + if (room == null) { + return; + } + + if (!(player.getDetails().getDailyRespectPoints() > 0)) { + return; + } + + int userId = reader.readInt(); + + Player target = PlayerManager.getInstance().getPlayerById(userId); + + if (target == null) { + return; + } + + if (target.getDetails().getId() == player.getDetails().getId()) { + return; + } + + if (target.getRoomUser().getRoom() == null || target.getRoomUser().getRoom().getId() != room.getId()) { + return; + } + + // Add respect given + player.getDetails().setRespectGiven(player.getDetails().getRespectGiven() + 1); + AchievementManager.getInstance().tryProgress(AchievementType.ACHIEVEMENT_RESPECT_GIVEN, player); + + // Increase respect points for target + // target.getDetails().setRespectPoints(target.getDetails().getRespectPoints() + 1); + room.send(new RESPECT_NOTIFICATION(target.getDetails().getId(), 1)); + AchievementManager.getInstance().tryProgress(AchievementType.ACHIEVEMENT_RESPECT_EARNED, target); + + // Lower daily respect points for user + player.getDetails().setDailyRespectPoints(player.getDetails().getDailyRespectPoints() - 1); + + // Save both users + PlayerDao.saveRespect(target.getDetails().getId(), target.getDetails().getDailyRespectPoints(), target.getDetails().getRespectPoints(), target.getDetails().getRespectDay(), target.getDetails().getRespectGiven()); + PlayerDao.saveRespect(player.getDetails().getId(), player.getDetails().getDailyRespectPoints(), player.getDetails().getRespectPoints(), player.getDetails().getRespectDay(), player.getDetails().getRespectGiven()); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/SET_SOUND_SETTING.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/SET_SOUND_SETTING.java new file mode 100644 index 0000000..ffb1058 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/SET_SOUND_SETTING.java @@ -0,0 +1,16 @@ +package org.alexdev.havana.messages.incoming.rooms.user; + +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class SET_SOUND_SETTING implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + boolean enabled = reader.readBoolean(); + player.getDetails().setSoundSetting(enabled); + + PlayerDao.saveSoundSetting(player.getDetails().getId(), player.getDetails().getSoundSetting()); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/SHOUT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/SHOUT.java new file mode 100644 index 0000000..67316a0 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/SHOUT.java @@ -0,0 +1,54 @@ +package org.alexdev.havana.messages.incoming.rooms.user; + +import org.alexdev.havana.game.commands.CommandManager; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.wordfilter.WordfilterManager; +import org.alexdev.havana.messages.outgoing.rooms.user.CHAT_MESSAGE; +import org.alexdev.havana.messages.outgoing.rooms.user.TYPING_STATUS; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.util.StringUtil; + +public class SHOUT implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + Room room = player.getRoomUser().getRoom(); + + if (room == null) { + return; + } + + String originalMessage = reader.readString(); + String message = WordfilterManager.filterMandatorySentence(StringUtil.filterInput(originalMessage, true)); + + if (message.isBlank()) { + return; + } + + if (WordfilterManager.hasBannableSentence(player, originalMessage)) { + WordfilterManager.performBan(player); + return; + } + + if (CommandManager.getInstance().hasCommand(player, originalMessage)) { + CommandManager.getInstance().invokeCommand(player, originalMessage); + return; + } + + if (player.isMuted()) { + PlayerManager.getInstance().showMutedAlert(player); + return; + } + + player.getRoomUser().setTyping(false); + room.send(new TYPING_STATUS(player.getRoomUser().getInstanceId(), player.getRoomUser().isTyping())); + + if (message.isEmpty()) { + return; + } + + player.getRoomUser().talk(message, CHAT_MESSAGE.ChatMessageType.SHOUT); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/STOP.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/STOP.java new file mode 100644 index 0000000..e48983f --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/STOP.java @@ -0,0 +1,22 @@ +package org.alexdev.havana.messages.incoming.rooms.user; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class STOP implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + String stopWhat = reader.contents(); + + if (stopWhat.equals("Dance")) { + player.getRoomUser().stopDancing(); + } + + if (stopWhat.equals("CarryItem")) { + player.getRoomUser().stopCarrying(); + } + + player.getRoomUser().getTimerManager().resetRoomTimer(); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/USEITEM.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/USEITEM.java new file mode 100644 index 0000000..c4c18da --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/USEITEM.java @@ -0,0 +1,37 @@ +package org.alexdev.havana.messages.incoming.rooms.user; + +import org.alexdev.havana.game.GameScheduler; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.enums.StatusType; +import org.alexdev.havana.game.room.tasks.CameraTask; +import org.alexdev.havana.messages.outgoing.rooms.user.USER_STATUSES; +import org.alexdev.havana.messages.outgoing.rooms.user.USER_USE_OBJECT; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +import java.util.List; +import java.util.concurrent.TimeUnit; + +public class USEITEM implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + if (player.getRoomUser().containsStatus(StatusType.CARRY_ITEM)) { + String item = player.getRoomUser().getStatus(StatusType.CARRY_ITEM).getValue(); + + player.getRoomUser().getStatuses().remove(StatusType.CARRY_ITEM.getStatusCode()); + player.getRoomUser().setStatus(StatusType.USE_ITEM, item); + + if (!player.getRoomUser().isWalking()) { + player.getRoomUser().getRoom().send(new USER_STATUSES(List.of(player))); + } + + GameScheduler.getInstance().getService().schedule(new CameraTask(player), 1, TimeUnit.SECONDS); + } else { + //player.getRoomUser().getRoom().send(new USER_USE_OBJECT(player.getRoomUser().getInstanceId(), player.getRoomUser().getCarryId())); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/USER_CANCEL_TYPING.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/USER_CANCEL_TYPING.java new file mode 100644 index 0000000..1f9c712 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/USER_CANCEL_TYPING.java @@ -0,0 +1,27 @@ +package org.alexdev.havana.messages.incoming.rooms.user; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.rooms.user.TYPING_STATUS; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class USER_CANCEL_TYPING implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + Room room = player.getRoomUser().getRoom(); + + if (room == null || !player.getRoomUser().isTyping()) { + return; + } + + if (player.getRoomUser().getGamePlayer() != null && player.getRoomUser().getGamePlayer().isInGame()) { + return; // Not needed for game arenas + } + + player.getRoomUser().getTimerManager().stopChatBubbleTimer(); + player.getRoomUser().setTyping(false); + + room.send(new TYPING_STATUS(player.getRoomUser().getInstanceId(), player.getRoomUser().isTyping())); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/USER_START_TYPING.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/USER_START_TYPING.java new file mode 100644 index 0000000..ae5b3c0 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/USER_START_TYPING.java @@ -0,0 +1,27 @@ +package org.alexdev.havana.messages.incoming.rooms.user; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.rooms.user.TYPING_STATUS; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class USER_START_TYPING implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + Room room = player.getRoomUser().getRoom(); + + if (room == null || player.getRoomUser().isTyping()) { + return; + } + + if (player.getRoomUser().getGamePlayer() != null && player.getRoomUser().getGamePlayer().isInGame()) { + return; // Not needed for game arenas + } + + player.getRoomUser().getTimerManager().beginChatBubbleTimer(); + player.getRoomUser().setTyping(true); + + room.send(new TYPING_STATUS(player.getRoomUser().getInstanceId(), player.getRoomUser().isTyping())); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/WALK.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/WALK.java new file mode 100644 index 0000000..915b810 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/WALK.java @@ -0,0 +1,86 @@ +package org.alexdev.havana.messages.incoming.rooms.user; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.mapping.RoomTile; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.server.util.MalformedPacketException; + +public class WALK implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (!player.getRoomUser().isWalkingAllowed()) { + return; + } + + if (player.getRoomUser().getRoom() == null) { + return; + } + + int goalX = reader.readInt(); + int goalY = reader.readInt(); + + if (player.getRoomUser().getRoom().getModel().getName().equals("md_a")) { + if (reader.contents().equals("@U@S")|| reader.contents().equals("@U@G")) { + if (player.getRoomUser().getCurrentItem() != null && player.getRoomUser().getCurrentItem().getDefinition().getSprite().equals("wsQueueTile")) { + return; + } + } + if (reader.contents().equals("@U@S")) { // If using older CCT + player.getRoomUser().walkTo(21, 19); + } + + if (reader.contents().equals("@U@G")) { // If using older CCT + player.getRoomUser().walkTo(21, 7); + } + } + + + if (player.getRoomUser().getRoom().getModel().getName().equals("park_a")) { + if (goalX == 28 && goalY == 4) { + return; + } + } + + RoomTile roomTile = player.getRoomUser().getRoom().getMapping().getTile(goalX, goalY); + + /*if (roomTile != null && roomTile.getHighestItem() != null) { + var highestItem = roomTile.getHighestItem(); + + if (highestItem.getLastPlacedTime() > 0) { + if (System.currentTimeMillis() - highestItem.getLastPlacedTime() < 50) { + return; // Woah there buddy, that's wayyy too quick to request an item being placed! + } + } + }*/ + + if (player.getRoomUser().hasItemDebug()) { + if (roomTile != null && roomTile.getHighestItem() != null) { + var item = roomTile.getHighestItem(); + StringBuilder alert = new StringBuilder(); + alert.append("Name: " + item.getDefinition().getName()); + alert.append("
"); + alert.append("Description: " + item.getDefinition().getDescription()); + alert.append("
"); + alert.append("Definition ID: " + item.getDefinition().getId()); + alert.append("
"); + alert.append("Sprite ID: " + item.getDefinition().getSpriteId()); + alert.append("
"); + alert.append("Sprite Name: " + item.getDefinition().getSprite()); + alert.append("
"); + alert.append("Top Height: " + item.getDefinition().getTopHeight()); + alert.append("
"); + alert.append("Total Height: " + item.getTotalHeight()); + alert.append("
"); + alert.append("Z Height: " + item.getPosition().getZ()); + alert.append("
"); + alert.append("X Y: " + item.getPosition().toString()); + player.send(new ALERT(alert.toString())); + return; + } + } + + player.getRoomUser().walkTo(goalX, goalY); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/WAVE.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/WAVE.java new file mode 100644 index 0000000..17d06f7 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/WAVE.java @@ -0,0 +1,14 @@ +package org.alexdev.havana.messages.incoming.rooms.user; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class WAVE implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + player.getRoomUser().wave(); + player.getRoomUser().getTimerManager().resetRoomTimer(); + } + +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/WHISPER.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/WHISPER.java new file mode 100644 index 0000000..29a1704 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/user/WHISPER.java @@ -0,0 +1,56 @@ +package org.alexdev.havana.messages.incoming.rooms.user; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.wordfilter.WordfilterManager; +import org.alexdev.havana.messages.outgoing.rooms.user.CHAT_MESSAGE.ChatMessageType; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.util.StringUtil; + +import java.util.ArrayList; +import java.util.List; + +public class WHISPER implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + Room room = player.getRoomUser().getRoom(); + + if (room == null) { + return; + } + + String contents = reader.readString(); + + String username = contents.substring(0, contents.indexOf(" ")); + String message = WordfilterManager.filterMandatorySentence(StringUtil.filterInput(contents.substring(username.length() + 1), true)); + + if (message.isBlank()) { + return; + } + + if (WordfilterManager.hasBannableSentence(player, StringUtil.filterInput(contents.substring(username.length() + 1), true))) { + WordfilterManager.performBan(player); + return; + } + + if (player.isMuted()) { + PlayerManager.getInstance().showMutedAlert(player); + return; + } + + List receieveMessages = new ArrayList<>(); + receieveMessages.add(player); + + Player whisperUser = PlayerManager.getInstance().getPlayerByName(username); + + if (whisperUser != null) { + if (!whisperUser.getIgnoredList().contains(player.getDetails().getName())) { + receieveMessages.add(whisperUser); + } + } + + player.getRoomUser().talk(message, ChatMessageType.WHISPER, receieveMessages); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/songs/BURN_SONG.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/songs/BURN_SONG.java new file mode 100644 index 0000000..1382597 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/songs/BURN_SONG.java @@ -0,0 +1,72 @@ +package org.alexdev.havana.messages.incoming.songs; + +import org.alexdev.havana.dao.mysql.CurrencyDao; +import org.alexdev.havana.dao.mysql.ItemDao; +import org.alexdev.havana.dao.mysql.JukeboxDao; +import org.alexdev.havana.dao.mysql.SongMachineDao; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.ItemManager; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.song.Song; +import org.alexdev.havana.messages.outgoing.user.currencies.CREDIT_BALANCE; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +import java.util.Calendar; + +public class BURN_SONG implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + Room room = player.getRoomUser().getRoom(); + + if (room.getItemManager().getSoundMachine() == null) { + return; + } + + if (!room.hasRights(player.getDetails().getId()) && !player.hasFuse(Fuseright.MOD)) { + return; + } + + if (player.getDetails().getCredits() <= 0) { + return; + } + + int songId = reader.readInt(); + + Song song = SongMachineDao.getSong(songId); + + if (song == null) { + return; + } + + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(System.currentTimeMillis()); + + Item item = new Item(); + item.setOwnerId(player.getDetails().getId()); + item.setDefinitionId(ItemManager.getInstance().getDefinitionBySprite("song_disk").getId()); + item.setCustomData(player.getDetails().getName() + (char)10 + + cal.get(Calendar.DAY_OF_MONTH) + (char)10 + + cal.get(Calendar.MONTH) + (char)10 + + cal.get(Calendar.YEAR) + (char)10 + + ItemManager.getInstance().calculateSongLength(song.getData()) + (char)10 + + song.getTitle()); + + ItemDao.newItem(item); + + player.getInventory().addItem(item); + player.getInventory().getView("new"); + + JukeboxDao.addDisk(item.getDatabaseId(), 0, songId); + JukeboxDao.setBurned(songId, true); + + CurrencyDao.decreaseCredits(player.getDetails(), 1); + player.send(new CREDIT_BALANCE(player.getDetails().getCredits())); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/songs/DELETE_SONG.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/songs/DELETE_SONG.java new file mode 100644 index 0000000..4650fe9 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/songs/DELETE_SONG.java @@ -0,0 +1,50 @@ +package org.alexdev.havana.messages.incoming.songs; + +import org.alexdev.havana.dao.mysql.SongMachineDao; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.songs.SONG_PLAYLIST; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class DELETE_SONG implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + Room room = player.getRoomUser().getRoom(); + + if (!room.isOwner(player.getDetails().getId()) && !player.hasFuse(Fuseright.ANY_ROOM_CONTROLLER)) { + return; + } + + if (room.getItemManager().getSoundMachine() == null) { + return; + } + + // We don't want a user to get kicked when making cool beats + player.getRoomUser().getTimerManager().resetRoomTimer(); + + int songId = reader.readInt(); + var song = SongMachineDao.getSong(songId); + + if (song == null) { + return; + } + + if (song.getUserId() != player.getDetails().getId()) { + return; + } + + SongMachineDao.deleteSong(songId); + SongMachineDao.removePlaylistSong(songId, room.getItemManager().getSoundMachine().getDatabaseId()); + + if (room.getItemManager().getSoundMachine().hasBehaviour(ItemBehaviour.SOUND_MACHINE)) { + player.send(new SONG_PLAYLIST(SongMachineDao.getSongPlaylist(room.getItemManager().getSoundMachine().getDatabaseId()))); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/songs/EDIT_SONG.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/songs/EDIT_SONG.java new file mode 100644 index 0000000..cb2075a --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/songs/EDIT_SONG.java @@ -0,0 +1,54 @@ +package org.alexdev.havana.messages.incoming.songs; + +import org.alexdev.havana.dao.mysql.SongMachineDao; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.song.Song; +import org.alexdev.havana.messages.outgoing.songs.SONG_LOCKED; +import org.alexdev.havana.messages.outgoing.songs.USER_SOUND_PACKAGES; +import org.alexdev.havana.messages.outgoing.songs.SONG_INFO; +import org.alexdev.havana.messages.outgoing.songs.SOUND_PACKAGES; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class EDIT_SONG implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + Room room = player.getRoomUser().getRoom(); + + if (!room.isOwner(player.getDetails().getId()) && !player.hasFuse(Fuseright.ANY_ROOM_CONTROLLER)) { + return; + } + + if (room.getItemManager().getSoundMachine() == null) { + return; + } + + // We don't want a user to get kicked when making cool beats + player.getRoomUser().getTimerManager().resetRoomTimer(); + + int songId = reader.readInt(); + var song = SongMachineDao.getSong(songId); + + if (song == null) { + return; + } + + if (song.getUserId() != player.getDetails().getId()) { + return; + } + + if (song.isBurnt()) { + player.send(new SONG_LOCKED()); + } + + player.send(new SONG_INFO(song)); + player.send(new SOUND_PACKAGES(SongMachineDao.getTracks(room.getItemManager().getSoundMachine().getDatabaseId()))); + player.send(new USER_SOUND_PACKAGES(player.getInventory().getSoundsets())); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/songs/EJECT_SOUND_PACKAGE.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/songs/EJECT_SOUND_PACKAGE.java new file mode 100644 index 0000000..0a67cc2 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/songs/EJECT_SOUND_PACKAGE.java @@ -0,0 +1,78 @@ +package org.alexdev.havana.messages.incoming.songs; + +import org.alexdev.havana.dao.mysql.SongMachineDao; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.songs.USER_SOUND_PACKAGES; +import org.alexdev.havana.messages.outgoing.songs.SOUND_PACKAGES; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +import java.util.Map; + +public class EJECT_SOUND_PACKAGE implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + Room room = player.getRoomUser().getRoom(); + + if (!room.isOwner(player.getDetails().getId()) && !player.hasFuse(Fuseright.ANY_ROOM_CONTROLLER)) { + return; + } + + if (room.getItemManager().getSoundMachine() == null) { + return; + } + + // We don't want a user to get kicked when making cool beats + player.getRoomUser().getTimerManager().resetRoomTimer(); + + int slotId = reader.readInt(); + Map tracks = SongMachineDao.getTracks(room.getItemManager().getSoundMachine().getDatabaseId()); + + if (!tracks.containsKey(slotId)) { + return; + } + + SongMachineDao.removeTrack(room.getItemManager().getSoundMachine().getDatabaseId(), slotId); + + int songSoundId = tracks.get(slotId); + Item soundset = null; + + for (Item item : player.getInventory().getItems()) { + if (item.isVisible()) { + continue; + } + + if (!item.hasBehaviour(ItemBehaviour.SOUND_MACHINE_SAMPLE_SET)) { + continue; + } + + if (Integer.parseInt(item.getDefinition().getSprite().replace("sound_set_", "")) == songSoundId) { + soundset = item; + break; + } + } + + if (soundset == null) { + return; + } + + + soundset.setHidden(false); + player.getInventory().addItem(soundset); // Re-add at start. + soundset.save(); + + player.getInventory().getView("new"); + + player.send(new SOUND_PACKAGES(SongMachineDao.getTracks(room.getItemManager().getSoundMachine().getDatabaseId()))); + player.send(new USER_SOUND_PACKAGES(player.getInventory().getSoundsets())); + + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/songs/GET_PLAY_LIST.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/songs/GET_PLAY_LIST.java new file mode 100644 index 0000000..648e4c8 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/songs/GET_PLAY_LIST.java @@ -0,0 +1,29 @@ +package org.alexdev.havana.messages.incoming.songs; + +import org.alexdev.havana.dao.mysql.SongMachineDao; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.songs.SONG_PLAYLIST; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class GET_PLAY_LIST implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + Room room = player.getRoomUser().getRoom(); + + if (room.getItemManager().getSoundMachine() == null) { + return; + } + + if (room.getItemManager().getSoundMachine().hasBehaviour(ItemBehaviour.SOUND_MACHINE) || + room.getItemManager().getSoundMachine().hasBehaviour(ItemBehaviour.JUKEBOX)) { + player.send(new SONG_PLAYLIST(SongMachineDao.getSongPlaylist(room.getItemManager().getSoundMachine().getDatabaseId()))); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/songs/GET_SONG_INFO.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/songs/GET_SONG_INFO.java new file mode 100644 index 0000000..afa161c --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/songs/GET_SONG_INFO.java @@ -0,0 +1,27 @@ +package org.alexdev.havana.messages.incoming.songs; + +import org.alexdev.havana.dao.mysql.SongMachineDao; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.songs.SONG_INFO; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class GET_SONG_INFO implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + Room room = player.getRoomUser().getRoom(); + + if (room.getItemManager().getSoundMachine() == null) { + return; + } + + int songId = reader.readInt(); + + player.send(new SONG_INFO(SongMachineDao.getSong(songId))); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/songs/GET_SONG_LIST.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/songs/GET_SONG_LIST.java new file mode 100644 index 0000000..0e5bafd --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/songs/GET_SONG_LIST.java @@ -0,0 +1,30 @@ +package org.alexdev.havana.messages.incoming.songs; + +import org.alexdev.havana.dao.mysql.SongMachineDao; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.song.Song; +import org.alexdev.havana.messages.outgoing.songs.SONG_LIST; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +import java.util.List; + +public class GET_SONG_LIST implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + Room room = player.getRoomUser().getRoom(); + + if (room.getItemManager().getSoundMachine() == null) { + return; + } + + List songList = SongMachineDao.getSongList(room.getItemManager().getSoundMachine().getDatabaseId()); + + player.send(new SONG_LIST(songList)); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/songs/INSERT_SOUND_PACKAGE.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/songs/INSERT_SOUND_PACKAGE.java new file mode 100644 index 0000000..40d4537 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/songs/INSERT_SOUND_PACKAGE.java @@ -0,0 +1,79 @@ +package org.alexdev.havana.messages.incoming.songs; + +import org.alexdev.havana.dao.mysql.SongMachineDao; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.songs.USER_SOUND_PACKAGES; +import org.alexdev.havana.messages.outgoing.songs.SOUND_PACKAGES; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.server.util.MalformedPacketException; + +import java.sql.SQLException; +import java.util.Map; + +public class INSERT_SOUND_PACKAGE implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws SQLException, MalformedPacketException { + if (player.getRoomUser().getRoom() == null) { + return; + } + + Room room = player.getRoomUser().getRoom(); + + if (!room.isOwner(player.getDetails().getId()) && !player.hasFuse(Fuseright.ANY_ROOM_CONTROLLER)) { + return; + } + + if (room.getItemManager().getSoundMachine() == null) { + return; + } + + // We don't want a user to get kicked when making cool beats + player.getRoomUser().getTimerManager().resetRoomTimer(); + + Map tracks = SongMachineDao.getTracks(room.getItemManager().getSoundMachine().getDatabaseId()); + + int soundSetId = reader.readInt(); + int slotId = 1;//reader.readInt() - 1; + + while (tracks.containsKey(slotId)) { + slotId++; + } + + if (tracks.containsKey(slotId) || slotId >= 5 || slotId < 0) { + return; + } + + int trackId = -1; + Item trackItem = null; + + for (Item item : player.getInventory().getItems()) { + if (item.hasBehaviour(ItemBehaviour.SOUND_MACHINE_SAMPLE_SET) && item.isVisible()) { + int songId = Integer.parseInt(item.getDefinition().getSprite().split("_")[2]); + + if (songId == soundSetId) { + trackItem = item; + trackId = songId; + break; + } + } + } + + if (trackId == -1) { + return; + } + + trackItem.setHidden(true); + trackItem.save(); + + player.getInventory().getView("new"); + SongMachineDao.addTrack(room.getItemManager().getSoundMachine().getDatabaseId(), soundSetId, slotId); + + player.send(new SOUND_PACKAGES(SongMachineDao.getTracks(room.getItemManager().getSoundMachine().getDatabaseId()))); + player.send(new USER_SOUND_PACKAGES(player.getInventory().getSoundsets())); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/songs/NEW_SONG.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/songs/NEW_SONG.java new file mode 100644 index 0000000..b841abb --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/songs/NEW_SONG.java @@ -0,0 +1,35 @@ +package org.alexdev.havana.messages.incoming.songs; + +import org.alexdev.havana.dao.mysql.SongMachineDao; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.songs.USER_SOUND_PACKAGES; +import org.alexdev.havana.messages.outgoing.songs.SOUND_PACKAGES; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class NEW_SONG implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + Room room = player.getRoomUser().getRoom(); + + if (!room.isOwner(player.getDetails().getId()) && !player.hasFuse(Fuseright.ANY_ROOM_CONTROLLER)) { + return; + } + + if (room.getItemManager().getSoundMachine() == null) { + return; + } + + // We don't want a user to get kicked when making cool beats + player.getRoomUser().getTimerManager().resetRoomTimer(); + + player.send(new SOUND_PACKAGES(SongMachineDao.getTracks(room.getItemManager().getSoundMachine().getDatabaseId()))); + player.send(new USER_SOUND_PACKAGES(player.getInventory().getSoundsets())); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/songs/SAVE_SONG_EDIT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/songs/SAVE_SONG_EDIT.java new file mode 100644 index 0000000..21e41a8 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/songs/SAVE_SONG_EDIT.java @@ -0,0 +1,71 @@ +package org.alexdev.havana.messages.incoming.songs; + +import org.alexdev.havana.dao.mysql.SongMachineDao; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.item.ItemManager; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.song.Song; +import org.alexdev.havana.messages.outgoing.songs.*; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.util.StringUtil; + +public class SAVE_SONG_EDIT implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + Room room = player.getRoomUser().getRoom(); + + if (!room.isOwner(player.getDetails().getId()) && !player.hasFuse(Fuseright.ANY_ROOM_CONTROLLER)) { + return; + } + + if (room.getItemManager().getSoundMachine() == null) { + return; + } + + // We don't want a user to get kicked when making cool beats + player.getRoomUser().getTimerManager().resetRoomTimer(); + + int songId = reader.readInt(); + String title = StringUtil.filterInput(reader.readString(), true); + String data = StringUtil.filterInput(reader.readString(), true); + + Song song = SongMachineDao.getSong(songId); + + if (song == null) { + return; + } + + if (song.getUserId() != player.getDetails().getId()) { + return; + } + + var songList = SongMachineDao.getSongList(room.getItemManager().getSoundMachine().getDatabaseId()); + + // Don't allow overriding burnt song, alert user + if (song.isBurnt()) { + for (Song s : songList) { + if (s.getId() == songId && s.getTitle().equals(title)) { + player.send(new SONG_LOCKED()); + return; + } + } + + SongMachineDao.addSong(player.getDetails().getId(), room.getItemManager().getSoundMachine().getDatabaseId(), title, ItemManager.getInstance().calculateSongLength(data), data); + songList = SongMachineDao.getSongList(room.getItemManager().getSoundMachine().getDatabaseId()); + } else { + SongMachineDao.saveSong(songId, title, ItemManager.getInstance().calculateSongLength(data), data); + } + + player.send(new SONG_INFO(SongMachineDao.getSong(songId))); + player.send(new SONG_UPDATE()); + player.send(new SONG_LIST(songList)); + + room.send(new SONG_PLAYLIST(SongMachineDao.getSongPlaylist(room.getItemManager().getSoundMachine().getDatabaseId()))); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/songs/SAVE_SONG_NEW.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/songs/SAVE_SONG_NEW.java new file mode 100644 index 0000000..f163fab --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/songs/SAVE_SONG_NEW.java @@ -0,0 +1,46 @@ +package org.alexdev.havana.messages.incoming.songs; + +import org.alexdev.havana.dao.mysql.SongMachineDao; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.item.ItemManager; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.songs.SONG_NEW; +import org.alexdev.havana.messages.outgoing.songs.SOUND_PACKAGES; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.util.StringUtil; + +public class SAVE_SONG_NEW implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + Room room = player.getRoomUser().getRoom(); + + if (!room.isOwner(player.getDetails().getId()) && !player.hasFuse(Fuseright.ANY_ROOM_CONTROLLER)) { + return; + } + + if (room.getItemManager().getSoundMachine() == null) { + return; + } + + // We don't want a user to get kicked when making cool beats + player.getRoomUser().getTimerManager().resetRoomTimer(); + + String title = StringUtil.filterInput(reader.readString(), true); + String data = StringUtil.filterInput(reader.readString(), true); + + SongMachineDao.addSong(player.getDetails().getId(), + room.getItemManager().getSoundMachine().getDatabaseId(), + title, + ItemManager.getInstance().calculateSongLength(data), + data); + + player.send(new SOUND_PACKAGES(SongMachineDao.getTracks(room.getItemManager().getSoundMachine().getDatabaseId()))); + player.send(new SONG_NEW(room.getItemManager().getSoundMachine().getVirtualId(), title)); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/songs/UPDATE_PLAY_LIST.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/songs/UPDATE_PLAY_LIST.java new file mode 100644 index 0000000..313c7ce --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/songs/UPDATE_PLAY_LIST.java @@ -0,0 +1,46 @@ +package org.alexdev.havana.messages.incoming.songs; + +import org.alexdev.havana.dao.mysql.SongMachineDao; +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.songs.SONG_PLAYLIST; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class UPDATE_PLAY_LIST implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getRoomUser().getRoom() == null) { + return; + } + + Room room = player.getRoomUser().getRoom(); + + if (!room.isOwner(player.getDetails().getId()) && !player.hasFuse(Fuseright.ANY_ROOM_CONTROLLER)) { + return; + } + + if (room.getItemManager().getSoundMachine() == null) { + return; + } + + int amount = reader.readInt(); + + if (amount >= 6) { + return; + } + + // We don't want a user to get kicked when making cool beats + player.getRoomUser().getTimerManager().resetRoomTimer(); + + SongMachineDao.clearPlaylist(room.getItemManager().getSoundMachine().getDatabaseId()); + + for (int i = 0; i < amount; i++) { + int songId = reader.readInt(); + SongMachineDao.addPlaylist(room.getItemManager().getSoundMachine().getDatabaseId(), songId, i); + } + + room.send(new SONG_PLAYLIST(SongMachineDao.getSongPlaylist(room.getItemManager().getSoundMachine().getDatabaseId()))); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/trade/TRADE_ACCEPT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/trade/TRADE_ACCEPT.java new file mode 100644 index 0000000..ed670f5 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/trade/TRADE_ACCEPT.java @@ -0,0 +1,51 @@ +package org.alexdev.havana.messages.incoming.trade; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.outgoing.trade.TRADEACCEPT; +import org.alexdev.havana.messages.outgoing.trade.TRADECONFIRM; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class TRADE_ACCEPT implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + Room room = player.getRoomUser().getRoom(); + + if (room == null) { + return; + } + + if (player.getRoomUser().getTradePartner() == null) { + return; + } + + if (!player.getDetails().isTradeEnabled() || !player.getRoomUser().getTradePartner().getDetails().isTradeEnabled()) { + return; + } + + player.getRoomUser().setTradeAccept(true); + + player.send(new TRADEACCEPT(player.getDetails().getId(), player.getRoomUser().hasAcceptedTrade())); + player.getRoomUser().getTradePartner().send(new TRADEACCEPT(player.getDetails().getId(), player.getRoomUser().hasAcceptedTrade())); + //RoomTradeManager.refreshWindow(player); + //RoomTradeManager.refreshWindow(player.getRoomUser().getTradePartner()); + + if (player.getRoomUser().hasAcceptedTrade() && + player.getRoomUser().getTradePartner().getRoomUser().hasAcceptedTrade()) { + + /*RoomTradeManager.addItems(player, player.getRoomUser().getTradePartner()); + RoomTradeManager.addItems(player.getRoomUser().getTradePartner(), player); + + RoomTradeManager.close(player.getRoomUser());*/ + player.send(new TRADECONFIRM()); + player.getRoomUser().getTradePartner().send(new TRADECONFIRM()); + + player.getRoomUser().setCanConfirmTrade(true); + player.getRoomUser().getTradePartner().getRoomUser().setCanConfirmTrade(true); + + player.getRoomUser().setTradeAccept(false); + player.getRoomUser().setTradeAccept(false); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/trade/TRADE_ADDITEM.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/trade/TRADE_ADDITEM.java new file mode 100644 index 0000000..3981a2e --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/trade/TRADE_ADDITEM.java @@ -0,0 +1,58 @@ +package org.alexdev.havana.messages.incoming.trade; + +import org.alexdev.havana.dao.mysql.ItemDao; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.managers.RoomTradeManager; +import org.alexdev.havana.messages.outgoing.trade.ITEM_NOT_TRADABLE; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class TRADE_ADDITEM implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + Room room = player.getRoomUser().getRoom(); + + if (room == null) { + return; + } + + if (player.getRoomUser().getTradePartner() == null) { + return; + } + + if (!player.getDetails().isTradeEnabled() || !player.getRoomUser().getTradePartner().getDetails().isTradeEnabled()) { + return; + } + + if (player.getRoomUser().isTradeConfirmed() && player.getRoomUser().getTradePartner().getRoomUser().isTradeConfirmed()) { + return; + } + + if (player.getRoomUser().hasAcceptedTrade() && player.getRoomUser().getTradePartner().getRoomUser().hasAcceptedTrade()) { + return; + } + + int itemId = reader.readInt();//Integer.parseInt(reader.contents()); + Item inventoryItem = player.getInventory().getItem(itemId); + + if (inventoryItem == null || player.getRoomUser().getTradeItems().contains(inventoryItem) || !inventoryItem.isVisible() || inventoryItem.isInTrade()) { + return; + } + + if (!inventoryItem.getDefinition().isTradable()) { + player.send(new ITEM_NOT_TRADABLE()); + return; + } + + player.getRoomUser().setTradeAccept(false); + player.getRoomUser().getTradePartner().getRoomUser().setTradeAccept(false); + player.getRoomUser().getTradeItems().add(inventoryItem); + + ItemDao.updateTradeState(inventoryItem, true); + + RoomTradeManager.refreshWindow(player); + RoomTradeManager.refreshWindow(player.getRoomUser().getTradePartner()); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/trade/TRADE_CLOSE.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/trade/TRADE_CLOSE.java new file mode 100644 index 0000000..f1b5e64 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/trade/TRADE_CLOSE.java @@ -0,0 +1,24 @@ +package org.alexdev.havana.messages.incoming.trade; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.managers.RoomTradeManager; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class TRADE_CLOSE implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + Room room = player.getRoomUser().getRoom(); + + if (room == null) { + return; + } + + if (player.getRoomUser().getTradePartner() == null) { + return; + } + + RoomTradeManager.close(player.getRoomUser(), false); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/trade/TRADE_CONFIRM_ACCEPT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/trade/TRADE_CONFIRM_ACCEPT.java new file mode 100644 index 0000000..71df07c --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/trade/TRADE_CONFIRM_ACCEPT.java @@ -0,0 +1,45 @@ +package org.alexdev.havana.messages.incoming.trade; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.managers.RoomTradeManager; +import org.alexdev.havana.messages.outgoing.trade.TRADE_COMPLETED; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class TRADE_CONFIRM_ACCEPT implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + Room room = player.getRoomUser().getRoom(); + + if (room == null) { + return; + } + + if (player.getRoomUser().getTradePartner() == null) { + return; + } + + if (!player.getDetails().isTradeEnabled() || !player.getRoomUser().getTradePartner().getDetails().isTradeEnabled()) { + return; + } + + if (!player.getRoomUser().canConfirmTrade() || !player.getRoomUser().getTradePartner().getRoomUser().canConfirmTrade()) { + return; + } + + player.getRoomUser().setTradeConfirmed(true); + + if (player.getRoomUser().isTradeConfirmed() && + player.getRoomUser().getTradePartner().getRoomUser().isTradeConfirmed()) { + + player.send(new TRADE_COMPLETED()); + player.getRoomUser().getTradePartner().send(new TRADE_COMPLETED()); + + RoomTradeManager.addItems(player, player.getRoomUser().getTradePartner()); + RoomTradeManager.addItems(player.getRoomUser().getTradePartner(), player); + + RoomTradeManager.finish(player.getRoomUser()); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/trade/TRADE_OPEN.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/trade/TRADE_OPEN.java new file mode 100644 index 0000000..610b24a --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/trade/TRADE_OPEN.java @@ -0,0 +1,88 @@ +package org.alexdev.havana.messages.incoming.trade; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.enums.StatusType; +import org.alexdev.havana.game.room.managers.RoomTradeManager; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; +import org.alexdev.havana.messages.outgoing.openinghours.INFO_HOTEL_CLOSING; +import org.alexdev.havana.messages.outgoing.trade.TRADEOPEN; +import org.alexdev.havana.messages.outgoing.trade.TRADE_ALREADY_OPEN; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class TRADE_OPEN implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + Room room = player.getRoomUser().getRoom(); + + if (room == null) { + return; + } + + if (!room.getCategory().hasAllowTrading()) { + return; + } + + if (player.getRoomUser().getTradePartner() != null) { + return; + } + + if (player.getDetails().isTradeBanned()) { + player.send(new ALERT(RoomTradeManager.showTradeBanAlert(player))); + return; + } + + int instanceId = reader.readInt(); + Entity targetPartner = room.getEntityManager().getByInstanceId(instanceId); + + if (targetPartner == null) { + return; + } + + if (targetPartner.getType() != EntityType.PLAYER) { + return; + } + + Player tradePartner = (Player) targetPartner; + + if (tradePartner.getDetails().isTradeBanned()) { + player.send(new ALERT("You cannot trade with this user")); + return; + } + + if (tradePartner.getRoomUser().getTradePartner() != null) { + player.send(new TRADE_ALREADY_OPEN()); + return; + } + + if (PlayerManager.getInstance().isMaintenance()) { + player.send(new INFO_HOTEL_CLOSING(PlayerManager.getInstance().getMaintenanceAt())); + return; + } + + RoomTradeManager.close(player.getRoomUser(), false); + RoomTradeManager.close(tradePartner.getRoomUser(), false); + + player.send(new TRADEOPEN(player.getDetails().getId(), player.getDetails().isTradeEnabled(), tradePartner.getDetails().getId(), tradePartner.getDetails().isTradeEnabled())); + tradePartner.send(new TRADEOPEN(tradePartner.getDetails().getId(), tradePartner.getDetails().isTradeEnabled(), player.getDetails().getId(), player.getDetails().isTradeEnabled())); + + if (!player.getDetails().isTradeEnabled() && !tradePartner.getDetails().isTradeEnabled()) { + return; + } + + player.getRoomUser().setStatus(StatusType.TRADE, ""); + player.getRoomUser().setNeedsUpdate(true); + player.getRoomUser().setTradePartner(tradePartner); + + tradePartner.getRoomUser().setStatus(StatusType.TRADE, ""); + tradePartner.getRoomUser().setNeedsUpdate(true); + tradePartner.getRoomUser().setTradePartner(player); + + //RoomTradeManager.refreshWindow(player); + //RoomTradeManager.refreshWindow(tradePartner); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/trade/TRADE_REMOVE_ITEM.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/trade/TRADE_REMOVE_ITEM.java new file mode 100644 index 0000000..edea351 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/trade/TRADE_REMOVE_ITEM.java @@ -0,0 +1,67 @@ +package org.alexdev.havana.messages.incoming.trade; + +import org.alexdev.havana.dao.mysql.ItemDao; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.managers.RoomTradeManager; +import org.alexdev.havana.messages.outgoing.trade.ITEM_NOT_TRADABLE; +import org.alexdev.havana.messages.outgoing.trade.TRADEACCEPT; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +import java.util.List; + +public class TRADE_REMOVE_ITEM implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + Room room = player.getRoomUser().getRoom(); + + if (room == null) { + return; + } + + if (player.getRoomUser().getTradePartner() == null) { + return; + } + + if (!player.getDetails().isTradeEnabled() || !player.getRoomUser().getTradePartner().getDetails().isTradeEnabled()) { + return; + } + + if (player.getRoomUser().isTradeConfirmed() && player.getRoomUser().getTradePartner().getRoomUser().isTradeConfirmed()) { + return; + } + + if (player.getRoomUser().hasAcceptedTrade() && player.getRoomUser().getTradePartner().getRoomUser().hasAcceptedTrade()) { + return; + } + + int itemId = reader.readInt();//Integer.parseInt(reader.contents()); + Item inventoryItem = player.getInventory().getItem(itemId); + + if (inventoryItem == null) { + return; + } + + if (!inventoryItem.getDefinition().isTradable()) { + player.send(new ITEM_NOT_TRADABLE()); + return; + } + + player.getRoomUser().getTradeItems().remove(inventoryItem); + ItemDao.updateTradeState(inventoryItem, false); + + for (Player tradeUser : List.of(player, player.getRoomUser().getTradePartner())) { + if (tradeUser.getRoomUser().hasAcceptedTrade()) { + tradeUser.getRoomUser().setTradeAccept(false); + + tradeUser.send(new TRADEACCEPT(tradeUser.getDetails().getId(), tradeUser.getRoomUser().hasAcceptedTrade())); + tradeUser.getRoomUser().getTradePartner().send(new TRADEACCEPT(tradeUser.getDetails().getId(), tradeUser.getRoomUser().hasAcceptedTrade())); + } + } + + RoomTradeManager.refreshWindow(player); + RoomTradeManager.refreshWindow(player.getRoomUser().getTradePartner()); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/trade/TRADE_UNACCEPT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/trade/TRADE_UNACCEPT.java new file mode 100644 index 0000000..b64aa46 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/trade/TRADE_UNACCEPT.java @@ -0,0 +1,36 @@ +package org.alexdev.havana.messages.incoming.trade; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.managers.RoomTradeManager; +import org.alexdev.havana.messages.outgoing.trade.TRADEACCEPT; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class TRADE_UNACCEPT implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + Room room = player.getRoomUser().getRoom(); + + if (room == null) { + return; + } + + if (player.getRoomUser().getTradePartner() == null) { + return; + } + + if (!player.getDetails().isTradeEnabled() || !player.getRoomUser().getTradePartner().getDetails().isTradeEnabled()) { + return; + } + + if (!player.getRoomUser().canConfirmTrade() && player.getRoomUser().hasAcceptedTrade()) { + player.getRoomUser().setTradeAccept(false); + + player.send(new TRADEACCEPT(player.getDetails().getId(), player.getRoomUser().hasAcceptedTrade())); + player.getRoomUser().getTradePartner().send(new TRADEACCEPT(player.getDetails().getId(), player.getRoomUser().hasAcceptedTrade())); + } else { + RoomTradeManager.close(player.getRoomUser(), false); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/tutorial/MSG_ACCEPT_TUTOR_INVITATION.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/tutorial/MSG_ACCEPT_TUTOR_INVITATION.java new file mode 100644 index 0000000..c1bd3f8 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/tutorial/MSG_ACCEPT_TUTOR_INVITATION.java @@ -0,0 +1,61 @@ +package org.alexdev.havana.messages.incoming.tutorial; + +import org.alexdev.havana.game.guides.GuideManager; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.messages.outgoing.tutorial.INVITE_FOLLOW_FAILED; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.apache.commons.lang3.StringUtils; + +public class MSG_ACCEPT_TUTOR_INVITATION implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (!player.getGuideManager().isGuide()) { + return; + } + + if (player.getGuideManager().getInvites().isEmpty()) { + return; + } + + String data = reader.readString(); + + if (!StringUtils.isNumeric(data)) { + return; + } + + int userId = Integer.parseInt(data); + + if (!player.getGuideManager().hasInvite(userId)) { + return; + } + + Player newb = PlayerManager.getInstance().getPlayerById(userId); + + if (newb == null || newb.getRoomUser().getRoom() == null || !newb.getRoomUser().getRoom().isOwner(newb.getDetails().getId())) { + player.send(new INVITE_FOLLOW_FAILED()); + return; + } + + // TODO: Error checking + //on handleInvitationFollowFailed me, tMsg + // executeMessage(#alert, "invitation_follow_failed") + //end + // + //on handleInvitationCancelled me, tMsg + // me.getComponent().cancelInvitation() + //end + player.getGuideManager().removeInvite(userId); + player.getGuideManager().setInvitedBy(newb.getDetails().getId()); + + if (player.getRoomUser().getRoom() == null || player.getRoomUser().getRoom() != newb.getRoomUser().getRoom()) { + player.getRoomUser().setAuthenticateId(newb.getRoomUser().getRoom().getId()); + newb.getRoomUser().getRoom().forward(player, false); + } else { + if (player.getRoomUser().getRoom() == newb.getRoomUser().getRoom()) { + GuideManager.getInstance().tutorEnterRoom(player, newb); + } + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/tutorial/MSG_CANCEL_TUTOR_INVITATIONS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/tutorial/MSG_CANCEL_TUTOR_INVITATIONS.java new file mode 100644 index 0000000..811c8c9 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/tutorial/MSG_CANCEL_TUTOR_INVITATIONS.java @@ -0,0 +1,22 @@ +package org.alexdev.havana.messages.incoming.tutorial; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class MSG_CANCEL_TUTOR_INVITATIONS implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (!player.getGuideManager().isGuidable()) { + return; + } + + if (!player.getGuideManager().isWaitingForGuide()) { + return; + } + + player.getGuideManager().setWaitingForGuide(false); + player.getGuideManager().setGuidable(false); + player.getGuideManager().getInvited().clear(); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/tutorial/MSG_CANCEL_WAIT_FOR_TUTOR_INVITATIONS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/tutorial/MSG_CANCEL_WAIT_FOR_TUTOR_INVITATIONS.java new file mode 100644 index 0000000..2398bbe --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/tutorial/MSG_CANCEL_WAIT_FOR_TUTOR_INVITATIONS.java @@ -0,0 +1,21 @@ +package org.alexdev.havana.messages.incoming.tutorial; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class MSG_CANCEL_WAIT_FOR_TUTOR_INVITATIONS implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (!player.getGuideManager().isGuide()) { + return; + } + + player.getGuideManager().setWaitingForInvitations(false); + player.getGuideManager().getInvites().clear(); + + // Remove your user from the newbs that invited you + PlayerManager.getInstance().getPlayers().forEach(p -> p.getGuideManager().getInvited().removeIf(i -> i == player.getDetails().getId())); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/tutorial/MSG_GET_TUTORS_AVAILABLE.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/tutorial/MSG_GET_TUTORS_AVAILABLE.java new file mode 100644 index 0000000..7b916dc --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/tutorial/MSG_GET_TUTORS_AVAILABLE.java @@ -0,0 +1,33 @@ +package org.alexdev.havana.messages.incoming.tutorial; + +import org.alexdev.havana.game.achievements.AchievementManager; +import org.alexdev.havana.game.achievements.AchievementType; +import org.alexdev.havana.game.guides.GuideManager; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.statistics.PlayerStatistic; +import org.alexdev.havana.messages.outgoing.tutorial.TUTORS_AVAILABLE; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class MSG_GET_TUTORS_AVAILABLE implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + //int daysSinceJoined = (int) Math.floor(TimeUnit.SECONDS.toDays((long) (DateUtil.getCurrentTimeSeconds() - Math.floor(player.getDetails().getJoinDate())))); + if (player.getStatisticManager().getIntValue(PlayerStatistic.IS_GUIDABLE) != 1) { + GuideManager.getInstance().tryClearTutorial(player); + return; + } + + if (!player.getGuideManager().canUseTutorial()) { + GuideManager.getInstance().tryClearTutorial(player); + return; + } + + player.getGuideManager().setGuidable(true); + player.getGuideManager().setBlockingTutorial(true); + + AchievementManager.getInstance().tryProgress(AchievementType.ACHIEVEMENT_GRADUATE, player); + player.send(new TUTORS_AVAILABLE(1));//GuideManager.getInstance().getGuidesAvailable().size())); + } + +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/tutorial/MSG_INVITE_TUTORS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/tutorial/MSG_INVITE_TUTORS.java new file mode 100644 index 0000000..97d0461 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/tutorial/MSG_INVITE_TUTORS.java @@ -0,0 +1,28 @@ +package org.alexdev.havana.messages.incoming.tutorial; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.tutorial.INVITATION_SENT; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.config.GameConfiguration; + +import java.util.concurrent.TimeUnit; + +public class MSG_INVITE_TUTORS implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (!player.getGuideManager().isGuidable()) { + return; + } + + if (player.getGuideManager().isWaitingForGuide()) { + return; + } + + player.send(new INVITATION_SENT()); + + player.getGuideManager().setStartedForWaitingGuidesTime((int) (DateUtil.getCurrentTimeSeconds() + TimeUnit.MINUTES.toSeconds(GameConfiguration.getInstance().getInteger("guide.search.timeout.minutes")))); + player.getGuideManager().setWaitingForGuide(true); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/tutorial/MSG_REJECT_TUTOR_INVITATION.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/tutorial/MSG_REJECT_TUTOR_INVITATION.java new file mode 100644 index 0000000..4cee7a7 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/tutorial/MSG_REJECT_TUTOR_INVITATION.java @@ -0,0 +1,43 @@ +package org.alexdev.havana.messages.incoming.tutorial; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.messages.outgoing.tutorial.INVITE_CANCELLED; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.apache.commons.lang3.StringUtils; + +public class MSG_REJECT_TUTOR_INVITATION implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (!player.getGuideManager().isGuide()) { + return; + } + + if (player.getGuideManager().getInvites().isEmpty()) { + return; + } + + String data = reader.readString(); + + if (!StringUtils.isNumeric(data)) { + return; + } + + int userId = Integer.parseInt(data); + + if (!player.getGuideManager().getInvites().contains(userId)) { + return; + } + + Player newb = PlayerManager.getInstance().getPlayerById(userId); + + if (newb == null || newb.getRoomUser().getRoom() == null) { + return; + } + + // TODO: Error checking + player.getGuideManager().removeInvite(userId); + player.send(new INVITE_CANCELLED()); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/tutorial/MSG_REMOVE_ACCOUNT_HELP_TEXT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/tutorial/MSG_REMOVE_ACCOUNT_HELP_TEXT.java new file mode 100644 index 0000000..fe08381 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/tutorial/MSG_REMOVE_ACCOUNT_HELP_TEXT.java @@ -0,0 +1,63 @@ +package org.alexdev.havana.messages.incoming.tutorial; + +import org.alexdev.havana.game.achievements.AchievementManager; +import org.alexdev.havana.game.achievements.AchievementType; +import org.alexdev.havana.game.guides.GuideManager; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.statistics.PlayerStatistic; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class MSG_REMOVE_ACCOUNT_HELP_TEXT implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (!player.getGuideManager().hasTutorial()) { + return; + } + + if (player.getGuideManager().isBlockingTutorial()) { + player.getGuideManager().setBlockingTutorial(false); + player.getGuideManager().setCancelTutorial(true); + return; + } + + int id = reader.readInt(); + + if (player.getGuideManager().isCancelTutorial()) { + player.getGuideManager().setCancelTutorial(false); + GuideManager.getInstance().tryClearTutorial(player); + player.getStatisticManager().setLongValue(PlayerStatistic.IS_GUIDABLE, 0); + AchievementManager.getInstance().tryProgress(AchievementType.ACHIEVEMENT_GRADUATE, player); + return; + } + + /*if (id == 1) { + player.getDetails().getTutorialFlags().clear(); + } else { + player.getDetails().getTutorialFlags().remove(Integer.valueOf(id)); + }*/ + + //TutorialDao.updateTutorialFlags(player.getDetails().getId(), player.getDetails().getTutorialFlags()); + + if (!player.getGuideManager().canUseTutorial()) + player.getGuideManager().setCanUseTutorial(true); + + /*if (player.getDetails().getTutorialFlags().isEmpty()) { + if (!player.getGuideManager().isGuidable() && id == 2) { + player.getDetails().getTutorialFlags().clear(); + player.getGuideManager().setGuidable(false); + + PlayerStatisticsDao.updateStatistic(player.getDetails().getId(), PlayerStatistic.IS_GUIDABLE, 0); + TutorialDao.updateTutorialFlags(player.getDetails().getId(), player.getDetails().getTutorialFlags()); + } else if (id == 1 && !player.getDetails().getTutorialFlags().contains(1)) { + AchievementManager.getInstance().tryProgress(AchievementType.ACHIEVEMENT_GRADUATE, player); + + player.getDetails().getTutorialFlags().addAll(List.of(1, 2, 3, 4, 5, 6, 7, 8)); + + + player.getGuideManager().setTutorialFinished(true); + player.getGuideManager().setGuidable(true); + } + }*/ + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/tutorial/MSG_WAIT_FOR_TUTOR_INVITATIONS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/tutorial/MSG_WAIT_FOR_TUTOR_INVITATIONS.java new file mode 100644 index 0000000..51baa3a --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/tutorial/MSG_WAIT_FOR_TUTOR_INVITATIONS.java @@ -0,0 +1,40 @@ +package org.alexdev.havana.messages.incoming.tutorial; + +import org.alexdev.havana.game.guides.GuideManager; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.guides.PlayerGuideManager; +import org.alexdev.havana.messages.outgoing.tutorial.ENABLE_TUTOR_SERVICE_STATUS; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class MSG_WAIT_FOR_TUTOR_INVITATIONS implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (!player.getGuideManager().isGuide()) { + return; + } + + if (player.getGuideManager().isWaitingForInvitations()) { + return; + } + + if (GuideManager.getInstance().isDisabled()) { + player.send(new ENABLE_TUTOR_SERVICE_STATUS(ENABLE_TUTOR_SERVICE_STATUS.TutorEnableStatus.SERVICE_DISABLED)); + return; + } + + if (player.getMessenger().isFriendsLimitReached()) { + player.send(new ENABLE_TUTOR_SERVICE_STATUS(ENABLE_TUTOR_SERVICE_STATUS.TutorEnableStatus.FRIENDSLIST_FULL)); + return; + } + + if (player.getGuideManager().getGuiding().size() >= GuideManager.MAX_SIMULTANEOUS_GUIDING) { + player.send(new ENABLE_TUTOR_SERVICE_STATUS(ENABLE_TUTOR_SERVICE_STATUS.TutorEnableStatus.MAX_NEWBIES)); + return; + } + + + player.getGuideManager().setWaitingForInvitations(true); + //player.send(new INVITATION(player.getDetails())); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/tutorial/RESET_TUTORIAL.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/tutorial/RESET_TUTORIAL.java new file mode 100644 index 0000000..d4367d5 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/tutorial/RESET_TUTORIAL.java @@ -0,0 +1,29 @@ +package org.alexdev.havana.messages.incoming.tutorial; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.statistics.PlayerStatistic; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class RESET_TUTORIAL implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (!player.isLoggedIn()) { + return; + } + + if (player.getGuideManager().isGuide()) { + player.send(new ALERT("You cannot restart the tutorial while as a guide.")); + return; + } + + player.getStatisticManager().setLongValue(PlayerStatistic.HAS_TUTORIAL, 1); + + if (!player.getBadgeManager().hasBadge("ACH_Student1")) { + player.getStatisticManager().setLongValue(PlayerStatistic.IS_GUIDABLE, 1); + } + + player.send(new ALERT("You may now do the tutorial again, please relog for it to take effect.")); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/user/GET_CREDITS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/user/GET_CREDITS.java new file mode 100644 index 0000000..cccf2cf --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/user/GET_CREDITS.java @@ -0,0 +1,27 @@ +package org.alexdev.havana.messages.incoming.user; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.user.currencies.ActivityPointNotification; +import org.alexdev.havana.messages.outgoing.user.currencies.CREDIT_BALANCE; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class GET_CREDITS implements MessageEvent { + + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + player.send(new CREDIT_BALANCE(player.getDetails().getCredits())); + player.send(new ActivityPointNotification(player.getDetails().getPixels(), ActivityPointNotification.ActivityPointAlertType.NO_SOUND)); + + /*if (DateUtil.getCurrentTimeSeconds() > (player.getDetails().getLastPixelsTime() + TimeUnit.MINUTES.toSeconds(15))) { + player.getDetails().setLastPixelsTime(DateUtil.getCurrentTimeSeconds() + TimeUnit.MINUTES.toSeconds(15)); + + CurrencyDao.increasePixels(player.getDetails(), 15); + PlayerDao.saveLastPixelHandout(player.getDetails()); + + player.send(new ActivityPointNotification(player.getDetails().getPixels(), ActivityPointNotification.ActivityPointAlertType.PIXELS_RECEIVED)); + } else { + player.send(new ActivityPointNotification(player.getDetails().getPixels(), ActivityPointNotification.ActivityPointAlertType.NO_SOUND)); + }*/ + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/user/GET_IGNORE_LIST.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/user/GET_IGNORE_LIST.java new file mode 100644 index 0000000..f667349 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/user/GET_IGNORE_LIST.java @@ -0,0 +1,33 @@ +package org.alexdev.havana.messages.incoming.user; + +import org.alexdev.havana.dao.mysql.UsersMutesDao; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.messages.outgoing.user.IGNORED_LIST; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +import java.util.List; + +public class GET_IGNORE_LIST implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (player.getIgnoredList().size() > 0) { + return; + } + + List ignoreList = UsersMutesDao.getMutedUsers(player.getDetails().getId()); + + for (int userId : ignoreList) { + var playerData = PlayerManager.getInstance().getPlayerData(userId); + + if (playerData == null) { + continue; + } + + player.getIgnoredList().add(PlayerManager.getInstance().getPlayerData(userId).getName()); + } + + player.send(new IGNORED_LIST(player.getIgnoredList())); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/user/GET_INFO.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/user/GET_INFO.java new file mode 100644 index 0000000..c7ef994 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/user/GET_INFO.java @@ -0,0 +1,18 @@ +package org.alexdev.havana.messages.incoming.user; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.user.USER_OBJECT; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class GET_INFO implements MessageEvent { + + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (!player.isLoggedIn()) { + return; + } + + player.send(new USER_OBJECT(player.getDetails())); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/user/GET_POSSIBLE_ACHIEVEMENTS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/user/GET_POSSIBLE_ACHIEVEMENTS.java new file mode 100644 index 0000000..746ee2b --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/user/GET_POSSIBLE_ACHIEVEMENTS.java @@ -0,0 +1,21 @@ +package org.alexdev.havana.messages.incoming.user; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.user.POSSIBLE_ACHIEVEMENTS; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +import java.util.ArrayList; + +public class GET_POSSIBLE_ACHIEVEMENTS implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + var possibleAchievements = new ArrayList<>(player.getAchievementManager().getPossibleAchievements()); + + if (!player.getGuideManager().isGuide()) { + possibleAchievements.removeIf(ach -> ach.getName().equals("GL")); + } + + player.send(new POSSIBLE_ACHIEVEMENTS(possibleAchievements)); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/user/IGNORE_USER.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/user/IGNORE_USER.java new file mode 100644 index 0000000..8491f12 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/user/IGNORE_USER.java @@ -0,0 +1,25 @@ +package org.alexdev.havana.messages.incoming.user; + +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.dao.mysql.UsersMutesDao; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.user.IGNORE_USER_RESULT; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class IGNORE_USER implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + String username = reader.readString(); + + if (player.getIgnoredList().contains(username)) { + return; + } + + int userId = PlayerDao.getId(username); + UsersMutesDao.addMuted(player.getDetails().getId(), userId); + + player.getIgnoredList().add(username); + player.send(new IGNORE_USER_RESULT(1)); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/user/UNIGNORE_USER.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/user/UNIGNORE_USER.java new file mode 100644 index 0000000..2aa9377 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/user/UNIGNORE_USER.java @@ -0,0 +1,25 @@ +package org.alexdev.havana.messages.incoming.user; + +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.dao.mysql.UsersMutesDao; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.user.IGNORE_USER_RESULT; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class UNIGNORE_USER implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + String username = reader.readString(); + + if (!player.getIgnoredList().contains(username)) { + return; + } + + int userId = PlayerDao.getId(username); + UsersMutesDao.removeMuted(player.getDetails().getId(), userId); + + player.getIgnoredList().remove(username); + player.send(new IGNORE_USER_RESULT(3)); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/user/badges/GETAVAILABLEBADGES.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/user/badges/GETAVAILABLEBADGES.java new file mode 100644 index 0000000..aab4be7 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/user/badges/GETAVAILABLEBADGES.java @@ -0,0 +1,25 @@ +package org.alexdev.havana.messages.incoming.user.badges; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.guides.INIT_TUTOR_SERVICE_STATUS; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class GETAVAILABLEBADGES implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (!player.isLoggedIn()) { + return; + } + + if (player.isProcessLoginSteps()) { + player.getBadgeManager().refreshBadges(); + player.getAchievementManager().processAchievements(player, true); + player.setProcessLoginSteps(false); + } + + if (player.getGuideManager().isGuide()) { + player.send(new INIT_TUTOR_SERVICE_STATUS(1)); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/user/badges/GETSELECTEDBADGES.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/user/badges/GETSELECTEDBADGES.java new file mode 100644 index 0000000..bc3ec03 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/user/badges/GETSELECTEDBADGES.java @@ -0,0 +1,35 @@ +package org.alexdev.havana.messages.incoming.user.badges; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.messages.outgoing.user.badges.USERBADGE; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class GETSELECTEDBADGES implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (reader.contents().isEmpty()) { + return; + } + + if (player.getRoomUser().getRoom() == null) { + return; + } + + //if (player.getRoomUser().getLastBadgeRequest() > DateUtil.getCurrentTimeSeconds()) { + // return; + //} + + int userId = reader.readInt(); + + Player badgePlayer = PlayerManager.getInstance().getPlayerById(userId); + + if (badgePlayer == null) { + return; + } + + player.send(new USERBADGE(userId, badgePlayer.getBadgeManager().getEquippedBadges())); + //player.getRoomUser().setLastBadgeRequest(DateUtil.getCurrentTimeSeconds() + 5); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/user/badges/SETBADGE.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/user/badges/SETBADGE.java new file mode 100644 index 0000000..26fdf88 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/user/badges/SETBADGE.java @@ -0,0 +1,35 @@ +package org.alexdev.havana.messages.incoming.user.badges; + +import org.alexdev.havana.game.badges.Badge; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.user.badges.USERBADGE; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class SETBADGE implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + // Unequip all previous badges + for (Badge badge : player.getBadgeManager().getBadges()) { + player.getBadgeManager().changeBadge(badge.getBadgeCode(), false, 0); + } + + // Equip new badges + while (reader.contents().length() > 0) { + int slotId = reader.readInt(); + String badgeCode = reader.readString(); + + if (slotId > 0 && slotId < 6 && badgeCode.length() > 0) { + player.getBadgeManager().changeBadge(badgeCode, true, slotId); + } + } + + // Notify users of badge updates + if (player.getRoomUser().getRoom() != null) { + player.getRoomUser().getRoom().send(new USERBADGE(player.getDetails().getId(), player.getBadgeManager().getEquippedBadges())); + } + + player.getBadgeManager().refreshBadges(); + player.getBadgeManager().saveQueuedBadges(); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/user/latency/PONG.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/user/latency/PONG.java new file mode 100644 index 0000000..d0edd5d --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/user/latency/PONG.java @@ -0,0 +1,19 @@ +package org.alexdev.havana.messages.incoming.user.latency; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class PONG implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + // Nice pong :^) + player.setPingOK(true); + + if (!player.isLoggedIn()) { + return; + } + + player.getAchievementManager().processAchievements(player, false); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/user/latency/TEST_LATENCY.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/user/latency/TEST_LATENCY.java new file mode 100644 index 0000000..aa54e26 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/user/latency/TEST_LATENCY.java @@ -0,0 +1,14 @@ +package org.alexdev.havana.messages.incoming.user.latency; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.user.LATENCY; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class TEST_LATENCY implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + int latency = reader.readInt(); + player.send(new LATENCY(latency)); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/user/settings/GET_ACCOUNT_PREFERENCES.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/user/settings/GET_ACCOUNT_PREFERENCES.java new file mode 100644 index 0000000..9db0df2 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/user/settings/GET_ACCOUNT_PREFERENCES.java @@ -0,0 +1,17 @@ +package org.alexdev.havana.messages.incoming.user.settings; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.user.settings.ACCOUNT_PREFERENCES; +import org.alexdev.havana.messages.outgoing.user.settings.HELP_ITEMS; +import org.alexdev.havana.messages.outgoing.user.settings.SOUND_SETTING; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class GET_ACCOUNT_PREFERENCES implements MessageEvent { + + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + player.send(new SOUND_SETTING(player.getDetails())); + //player.send(new HELP_ITEMS()); + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/wobblesquabble/PTM.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/wobblesquabble/PTM.java new file mode 100644 index 0000000..98fca3a --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/wobblesquabble/PTM.java @@ -0,0 +1,32 @@ +package org.alexdev.havana.messages.incoming.wobblesquabble; + +import org.alexdev.havana.game.games.wobblesquabble.WobbleSquabbleManager; +import org.alexdev.havana.game.games.wobblesquabble.WobbleSquabbleMove; +import org.alexdev.havana.game.games.wobblesquabble.WobbleSquabblePlayer; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.types.MessageEvent; +import org.alexdev.havana.server.netty.streams.NettyRequest; + +public class PTM implements MessageEvent { + @Override + public void handle(Player player, NettyRequest reader) throws Exception { + if (!WobbleSquabbleManager.getInstance().isPlaying(player)) { + return; + } + + int moveId = reader.readInt(); + + if (moveId < 0 || moveId > 8) { + return; + } + + WobbleSquabblePlayer wsPlayer = WobbleSquabbleManager.getInstance().getPlayer(player); + + if (wsPlayer == null || WobbleSquabbleMove.getMove(moveId) == null) { + return; + } + + wsPlayer.setMove(WobbleSquabbleMove.getMove(moveId)); + wsPlayer.setRequiresUpdate(true); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/alerts/ALERT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/alerts/ALERT.java new file mode 100644 index 0000000..77265dc --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/alerts/ALERT.java @@ -0,0 +1,30 @@ +package org.alexdev.havana.messages.outgoing.alerts; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class ALERT extends MessageComposer { + private String message; + + public ALERT(String message) { + this.message = message; + } + + @Override + public void compose(NettyResponse response) { + response.writeString(this.message); + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + @Override + public short getHeader() { + return 139; // "BK" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/alerts/HOTEL_LOGOUT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/alerts/HOTEL_LOGOUT.java new file mode 100644 index 0000000..99762bb --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/alerts/HOTEL_LOGOUT.java @@ -0,0 +1,39 @@ +package org.alexdev.havana.messages.outgoing.alerts; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class HOTEL_LOGOUT extends MessageComposer { + public enum LogoutReason { + DISCONNECT(-1), + LOGGED_OUT(1), + LOGOUT_CONCURRENT(2), + LOGOUT_TIMEOUT(3); + + private final int msgId; + + LogoutReason(int msgId) { + this.msgId = msgId; + } + + public int getMsgId() { + return msgId; + } + } + private LogoutReason reason; + + public HOTEL_LOGOUT(LogoutReason reason) { + this.reason = reason; + } + + + @Override + public void compose(NettyResponse response) { + response.writeInt(reason.getMsgId()); + } + + @Override + public short getHeader() { + return 287; // "D_" + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/alerts/LOCALISED_ERROR.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/alerts/LOCALISED_ERROR.java new file mode 100644 index 0000000..110420a --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/alerts/LOCALISED_ERROR.java @@ -0,0 +1,33 @@ +package org.alexdev.havana.messages.outgoing.alerts; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class LOCALISED_ERROR extends MessageComposer { + private final String externalTextEntry; + private final int errorCode; + + public LOCALISED_ERROR(String externalTextEntry) { + this.externalTextEntry = externalTextEntry; + this.errorCode = -1; + } + + public LOCALISED_ERROR(int errorCode) { + this.externalTextEntry = null; + this.errorCode = errorCode; + } + + @Override + public void compose(NettyResponse response) { + if (this.externalTextEntry != null) { + response.write(this.externalTextEntry); + } else { + response.writeInt(this.errorCode); + } + } + + @Override + public short getHeader() { + return 33; // "@a" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/alerts/NO_USER_FOUND.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/alerts/NO_USER_FOUND.java new file mode 100644 index 0000000..cb7175c --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/alerts/NO_USER_FOUND.java @@ -0,0 +1,22 @@ +package org.alexdev.havana.messages.outgoing.alerts; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class NO_USER_FOUND extends MessageComposer { + private final String username; + + public NO_USER_FOUND(String username) { + this.username = username; + } + + @Override + public void compose(NettyResponse response) { + response.write(this.username); + } + + @Override + public short getHeader() { + return 76; // "AL" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/catalogue/ALIAS_TOGGLE.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/catalogue/ALIAS_TOGGLE.java new file mode 100644 index 0000000..eded422 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/catalogue/ALIAS_TOGGLE.java @@ -0,0 +1,16 @@ +package org.alexdev.havana.messages.outgoing.catalogue; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class ALIAS_TOGGLE extends MessageComposer { + @Override + public void compose(NettyResponse response) { + response.writeBool(false); + } + + @Override + public short getHeader() { + return 297; // "Di" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/catalogue/CATALOGUE_PAGE.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/catalogue/CATALOGUE_PAGE.java new file mode 100644 index 0000000..453764a --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/catalogue/CATALOGUE_PAGE.java @@ -0,0 +1,90 @@ +package org.alexdev.havana.messages.outgoing.catalogue; + +import org.alexdev.havana.game.catalogue.CatalogueItem; +import org.alexdev.havana.game.catalogue.CataloguePackage; +import org.alexdev.havana.game.catalogue.CataloguePage; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.messages.types.PlayerMessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.ArrayList; +import java.util.List; + +public class CATALOGUE_PAGE extends PlayerMessageComposer { + private final CataloguePage page; + private final List catalogueItems; + private final List images; + private final List texts; + + public CATALOGUE_PAGE(CataloguePage cataloguePage, List cataloguePageItems) { + this.page = cataloguePage; + this.catalogueItems = cataloguePageItems; + this.images = cataloguePage.getImages(); + this.texts = cataloguePage.getTexts(); + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.page.getId()); + response.writeString(this.page.getLayout()); + response.writeInt(this.images.size()); + + for (String image : this.images) { + response.writeString(image); + } + + response.writeInt(this.texts.size()); + + for (String text : this.texts) { + response.writeString(text); + } + + response.writeInt(this.catalogueItems.size()); + + for (CatalogueItem catalogueItem : this.catalogueItems) { + response.writeInt(catalogueItem.getId()); + + if (!catalogueItem.isPackage() && + (catalogueItem.getDefinition().getSprite().equals("poster") || + catalogueItem.getDefinition().getSprite().equals("landscape") || + catalogueItem.getDefinition().getSprite().equals("wallpaper") || + catalogueItem.getDefinition().getSprite().equals("floor"))) { + response.writeString(catalogueItem.getDefinition().getSprite() + " " + catalogueItem.getItemSpecialId()); + } else { + response.writeString(catalogueItem.getSaleCode()); + } + + response.writeInt(catalogueItem.getPriceCoins()); + response.writeInt(catalogueItem.getPricePixels()); + + response.writeInt(catalogueItem.getPackages().size()); + + for (CataloguePackage packageItem : catalogueItem.getPackages()) { + if (packageItem.getDefinition().hasBehaviour(ItemBehaviour.EFFECT)) { + response.writeString("e"); + } else if (packageItem.getDefinition().hasBehaviour(ItemBehaviour.WALL_ITEM)) { + response.writeString("i"); + } else { + response.writeString("s"); + } + + if (packageItem.getDefinition().hasBehaviour(ItemBehaviour.EFFECT)) { + response.writeInt(Integer.parseInt(packageItem.getSpecialSpriteId())); + } else { + response.writeInt(packageItem.getDefinition().getSpriteId()); + } + + response.writeString(packageItem.getSpecialSpriteId()); + response.writeInt(packageItem.getAmount()); + response.writeInt(packageItem.getDefinition().getRentalTimeAsMinutes()); + + } + } + + } + + @Override + public short getHeader() { + return 127; // "A" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/catalogue/CATALOGUE_PAGES.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/catalogue/CATALOGUE_PAGES.java new file mode 100644 index 0000000..44a5a4d --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/catalogue/CATALOGUE_PAGES.java @@ -0,0 +1,61 @@ +package org.alexdev.havana.messages.outgoing.catalogue; + +import org.alexdev.havana.game.catalogue.CatalogueManager; +import org.alexdev.havana.game.catalogue.CataloguePage; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.List; + +public class CATALOGUE_PAGES extends MessageComposer { + private final int rank; + private final boolean hasClub; + private final List parentTabs; + + public CATALOGUE_PAGES(int rank, boolean hasClub, List parentTabs) { + this.rank = rank; + this.hasClub = hasClub; + this.parentTabs = parentTabs; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(0); // Navigatable + response.writeInt(0); // Colour + response.writeInt(0); // Icon + response.writeInt(-1); // Page id + response.writeString(""); + response.writeInt(0); + + response.writeInt(this.parentTabs.size()); + + for (CataloguePage childTab : this.parentTabs) { + appendIndexNode(childTab, response); + recursiveIndexNode(childTab, response); + } + } + + public void appendIndexNode(CataloguePage cataloguePage, NettyResponse response) { + response.writeBool(true); // Navigatable + response.writeInt(cataloguePage.getColour()); // Colour + response.writeInt(cataloguePage.getIcon()); // Icon + response.writeInt(cataloguePage.getId()); // Page id + response.writeString(cataloguePage.getName()); + response.writeInt(0); + } + + private void recursiveIndexNode(CataloguePage parentTab, NettyResponse response) { + List childTabs = CatalogueManager.getInstance().getChildPages(parentTab.getId(), this.rank, this.hasClub); + response.writeInt(childTabs.size()); + + for (CataloguePage childTab : childTabs) { + appendIndexNode(childTab, response); + recursiveIndexNode(childTab, response); + } + } + + @Override + public short getHeader() { + return 126; // "A~" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/catalogue/DELIVER_PRESENT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/catalogue/DELIVER_PRESENT.java new file mode 100644 index 0000000..35bc182 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/catalogue/DELIVER_PRESENT.java @@ -0,0 +1,48 @@ +package org.alexdev.havana.messages.outgoing.catalogue; + +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class DELIVER_PRESENT extends MessageComposer { + private final Item present; + + public DELIVER_PRESENT(Item present) { + this.present = present; + } + + @Override + public void compose(NettyResponse response) { + if (this.present.getDefinition().hasBehaviour(ItemBehaviour.WALL_ITEM)) { + response.writeString("i"); + } else { + response.writeString("s"); + } + + response.writeInt(this.present.getDefinition().getSpriteId()); + + if (this.present.getDefinition().getSprite().equals("poster")) { + response.writeString(this.present.getDefinition().getSprite() + " " + this.present.getCustomData()); + } else { + response.writeString(this.present.getDefinition().getSprite()); + } + /*response.write(this.present.getDefinition().getSprite(), (char)13); + response.write(this.present.getDefinition().getSprite()); + + if (this.present.getDefinition().hasBehaviour(ItemBehaviour.WALL_ITEM)) { + response.write(" "); + response.writeString(this.present.getDefinition().getColour()); + } else { + response.write((char)13); + response.write(this.present.getDefinition().getLength(), (char)30); + response.write(this.present.getDefinition().getWidth(), (char)30); + response.write(this.present.getDefinition().getColour()); + }*/ + } + + @Override + public short getHeader() { + return 129; // "BA" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/catalogue/NO_CREDITS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/catalogue/NO_CREDITS.java new file mode 100644 index 0000000..cca9c0f --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/catalogue/NO_CREDITS.java @@ -0,0 +1,25 @@ +package org.alexdev.havana.messages.outgoing.catalogue; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class NO_CREDITS extends MessageComposer { + private boolean notEnoughCredits; + private boolean notEnoughPixels; + + public NO_CREDITS(boolean notEnoughCredits, boolean notEnoughPixels) { + this.notEnoughCredits = notEnoughCredits; + this.notEnoughPixels = notEnoughPixels; + } + + @Override + public void compose(NettyResponse response) { + response.writeBool(this.notEnoughCredits); + response.writeBool(this.notEnoughPixels); + } + + @Override + public short getHeader() { + return 68; // "AD" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/catalogue/SPRITE_LIST.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/catalogue/SPRITE_LIST.java new file mode 100644 index 0000000..2ee6eb9 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/catalogue/SPRITE_LIST.java @@ -0,0 +1,16 @@ +package org.alexdev.havana.messages.outgoing.catalogue; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class SPRITE_LIST extends MessageComposer { + @Override + public void compose(NettyResponse response) { + response.writeInt(0); + } + + @Override + public short getHeader() { + return 295; // "Dg" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/club/CLUB_GIFT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/club/CLUB_GIFT.java new file mode 100644 index 0000000..039a2ce --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/club/CLUB_GIFT.java @@ -0,0 +1,22 @@ +package org.alexdev.havana.messages.outgoing.club; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class CLUB_GIFT extends MessageComposer { + private final int giftCount; + + public CLUB_GIFT(int giftCount) { + this.giftCount = giftCount; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.giftCount); + } + + @Override + public short getHeader() { + return 280; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/club/CLUB_INFO.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/club/CLUB_INFO.java new file mode 100644 index 0000000..ee024d5 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/club/CLUB_INFO.java @@ -0,0 +1,30 @@ +package org.alexdev.havana.messages.outgoing.club; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class CLUB_INFO extends MessageComposer { + private final int remainingDaysThisMonth; + private final int sinceMonths; + private final int prepaidMonths; + + public CLUB_INFO(int remaining_days_for_this_month, int since_months, int prepaid_months) { + this.remainingDaysThisMonth = remaining_days_for_this_month; + this.sinceMonths = since_months; + this.prepaidMonths = prepaid_months; + } + + @Override + public void compose(NettyResponse response) { + response.writeString("club_habbo"); + response.writeInt(this.remainingDaysThisMonth); + response.writeInt(this.sinceMonths); + response.writeInt(this.prepaidMonths); + response.writeInt(1); // When set to 2, the Habbo club dialogue opens. + } + + @Override + public short getHeader() { + return 7; // "@G" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/ecotron/RECYCLER_PRIZES.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/ecotron/RECYCLER_PRIZES.java new file mode 100644 index 0000000..c8d7ecd --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/ecotron/RECYCLER_PRIZES.java @@ -0,0 +1,17 @@ +package org.alexdev.havana.messages.outgoing.ecotron; + +import org.alexdev.havana.game.ecotron.EcotronManager; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class RECYCLER_PRIZES extends MessageComposer { + @Override + public void compose(NettyResponse response) { + EcotronManager.getInstance().appendRewards(response); + } + + @Override + public short getHeader() { + return 506; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/ecotron/RECYCLER_STATUS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/ecotron/RECYCLER_STATUS.java new file mode 100644 index 0000000..fb9ecfd --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/ecotron/RECYCLER_STATUS.java @@ -0,0 +1,22 @@ +package org.alexdev.havana.messages.outgoing.ecotron; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class RECYCLER_STATUS extends MessageComposer { + private final int status; + + public RECYCLER_STATUS(int status) { + this.status = status; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.status); + } + + @Override + public short getHeader() { + return 507; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/effects/AVATAR_EFFECTS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/effects/AVATAR_EFFECTS.java new file mode 100644 index 0000000..0054375 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/effects/AVATAR_EFFECTS.java @@ -0,0 +1,54 @@ +package org.alexdev.havana.messages.outgoing.effects; + +import org.alexdev.havana.game.effects.Effect; +import org.alexdev.havana.messages.types.PlayerMessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.List; + +public class AVATAR_EFFECTS extends PlayerMessageComposer { + private final List effects; + + public AVATAR_EFFECTS(List effects) { + this.effects = effects; + } + + /* + + public function _SafeStr_2762(_arg_1:_SafeStr_610):Boolean + { + var _local_4:_SafeStr_85; + _SafeStr_6493 = new Array(); + var _local_2:int = _arg_1.ReadInteger(); + var _local_3:int; + while (_local_3 < _local_2) { + _local_4 = new _SafeStr_85(); + _local_4.type = _arg_1.ReadInteger(); + _local_4.duration = _arg_1.ReadInteger(); + _local_4._SafeStr_3430 = _arg_1.ReadInteger(); + _local_4._SafeStr_3431 = _arg_1.ReadInteger(); + _SafeStr_6493.push(_local_4); + _local_3++; + }; + return (true); + } + + */ + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.effects.size()); + + for (Effect effect : this.effects) { + response.writeInt(effect.getEffectId()); + response.writeInt(effect.getTimeDuration()); + response.writeInt((int) this.effects.stream().filter(e -> e.getEffectId() == effect.getEffectId()).count()); + response.writeInt(effect.isActivated() ? effect.getTimeLeft() : -1); + } + } + + @Override + public short getHeader() { + return 460; // "GL" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/effects/AVATAR_EFFECT_ACTIVATED.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/effects/AVATAR_EFFECT_ACTIVATED.java new file mode 100644 index 0000000..01ee353 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/effects/AVATAR_EFFECT_ACTIVATED.java @@ -0,0 +1,24 @@ +package org.alexdev.havana.messages.outgoing.effects; + +import org.alexdev.havana.game.effects.Effect; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class AVATAR_EFFECT_ACTIVATED extends MessageComposer { + private final Effect effect; + + public AVATAR_EFFECT_ACTIVATED(Effect effect) { + this.effect = effect; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.effect.getEffectId()); + response.writeInt(this.effect.getTimeLeft()); + } + + @Override + public short getHeader() { + return 462; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/effects/AVATAR_EFFECT_ADDED.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/effects/AVATAR_EFFECT_ADDED.java new file mode 100644 index 0000000..850f050 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/effects/AVATAR_EFFECT_ADDED.java @@ -0,0 +1,24 @@ +package org.alexdev.havana.messages.outgoing.effects; + +import org.alexdev.havana.game.effects.Effect; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class AVATAR_EFFECT_ADDED extends MessageComposer { + private final Effect effect; + + public AVATAR_EFFECT_ADDED(Effect effect) { + this.effect = effect; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.effect.getEffectId()); + response.writeInt(this.effect.getTimeLeft()); + } + + @Override + public short getHeader() { + return 461; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/effects/AVATAR_EFFECT_EXPIRED.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/effects/AVATAR_EFFECT_EXPIRED.java new file mode 100644 index 0000000..19e0b12 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/effects/AVATAR_EFFECT_EXPIRED.java @@ -0,0 +1,22 @@ +package org.alexdev.havana.messages.outgoing.effects; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class AVATAR_EFFECT_EXPIRED extends MessageComposer { + private final int effectId; + + public AVATAR_EFFECT_EXPIRED(int effectId) { + this.effectId = effectId; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.effectId); + } + + @Override + public short getHeader() { + return 463; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/effects/AVATAR_SELECTED.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/effects/AVATAR_SELECTED.java new file mode 100644 index 0000000..031b0fe --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/effects/AVATAR_SELECTED.java @@ -0,0 +1,23 @@ +package org.alexdev.havana.messages.outgoing.effects; + +import org.alexdev.havana.game.effects.Effect; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class AVATAR_SELECTED extends MessageComposer { + private final Effect activatedEffect; + + public AVATAR_SELECTED(Effect activatedEffect) { + this.activatedEffect = activatedEffect; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.activatedEffect.getEffectId()); + } + + @Override + public short getHeader() { + return 464; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/effects/USER_AVATAR_EFFECT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/effects/USER_AVATAR_EFFECT.java new file mode 100644 index 0000000..680e190 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/effects/USER_AVATAR_EFFECT.java @@ -0,0 +1,25 @@ +package org.alexdev.havana.messages.outgoing.effects; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class USER_AVATAR_EFFECT extends MessageComposer { + private final int instanceId; + private final int effectId; + + public USER_AVATAR_EFFECT(int instanceId, int effectId) { + this.instanceId = instanceId; + this.effectId = effectId; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.instanceId); + response.writeInt(this.effectId); + } + + @Override + public short getHeader() { + return 485; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/events/ROOMEEVENT_INFO.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/events/ROOMEEVENT_INFO.java new file mode 100644 index 0000000..09171b2 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/events/ROOMEEVENT_INFO.java @@ -0,0 +1,33 @@ +package org.alexdev.havana.messages.outgoing.events; + +import org.alexdev.havana.game.events.Event; +import org.alexdev.havana.messages.types.PlayerMessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class ROOMEEVENT_INFO extends PlayerMessageComposer { + private final Event event; + + public ROOMEEVENT_INFO(Event event) { + this.event = event; + } + + @Override + public void compose(NettyResponse response) { + if (this.event == null) { + response.writeString(-1); + } else { + response.writeString(this.event.getEventHoster().getId()); + response.writeString(this.event.getEventHoster().getName()); + response.writeString(this.event.getRoomId()); + response.writeInt(this.event.getCategoryId()); + response.writeString(this.event.getName()); + response.writeString(this.event.getDescription()); + response.writeString(this.event.getStartedDate()); + } + } + + @Override + public short getHeader() { + return 370; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/events/ROOMEVENT_LIST.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/events/ROOMEVENT_LIST.java new file mode 100644 index 0000000..7879c70 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/events/ROOMEVENT_LIST.java @@ -0,0 +1,36 @@ +package org.alexdev.havana.messages.outgoing.events; + +import org.alexdev.havana.game.events.Event; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.List; + +public class ROOMEVENT_LIST extends MessageComposer { + private final List events; + private final int typeId; + + public ROOMEVENT_LIST(int typeId, List events) { + this.typeId = typeId; + this.events = events; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.typeId); + response.writeInt(this.events.size()); + + for (Event event : this.events) { + response.writeString(event.getRoomId()); + response.writeString(event.getEventHoster().getName()); + response.writeString(event.getName()); + response.writeString(event.getDescription()); + response.writeString(event.getStartedDate()); + } + } + + @Override + public short getHeader() { + return 369; // "Eq" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/events/ROOMEVENT_PERMISSION.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/events/ROOMEVENT_PERMISSION.java new file mode 100644 index 0000000..455c9a2 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/events/ROOMEVENT_PERMISSION.java @@ -0,0 +1,23 @@ +package org.alexdev.havana.messages.outgoing.events; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class ROOMEVENT_PERMISSION extends MessageComposer { + private final boolean canCreateEvent; + + public ROOMEVENT_PERMISSION(boolean canCreateEvent) { + this.canCreateEvent = canCreateEvent; + } + + + @Override + public void compose(NettyResponse response) { + response.writeBool(this.canCreateEvent); + } + + @Override + public short getHeader() { + return 367; // "Eo" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/events/ROOMEVENT_TYPES.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/events/ROOMEVENT_TYPES.java new file mode 100644 index 0000000..85ca6ae --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/events/ROOMEVENT_TYPES.java @@ -0,0 +1,22 @@ +package org.alexdev.havana.messages.outgoing.events; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class ROOMEVENT_TYPES extends MessageComposer { + private final int count; + + public ROOMEVENT_TYPES(int count) { + this.count = count; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.count); + } + + @Override + public short getHeader() { + return 368; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/CREATEFAILED.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/CREATEFAILED.java new file mode 100644 index 0000000..74d9915 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/CREATEFAILED.java @@ -0,0 +1,37 @@ +package org.alexdev.havana.messages.outgoing.games; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class CREATEFAILED extends MessageComposer { + public enum FailedReason { + KICKED(6), + TICKETS_NEEDED(2); + + private final int reasonId; + + FailedReason(int reasonId) { + this.reasonId = reasonId; + } + + public int getReasonId() { + return reasonId; + } + } + + private final FailedReason failedReason; + + public CREATEFAILED(FailedReason failedReason) { + this.failedReason = failedReason; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.failedReason.getReasonId()); + } + + @Override + public short getHeader() { + return 236; // "Cl" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/FULLGAMESTATUS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/FULLGAMESTATUS.java new file mode 100644 index 0000000..43dde5c --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/FULLGAMESTATUS.java @@ -0,0 +1,78 @@ +package org.alexdev.havana.messages.outgoing.games; + +import org.alexdev.havana.game.games.Game; +import org.alexdev.havana.game.games.GameManager; +import org.alexdev.havana.game.games.battleball.BattleBallTile; +import org.alexdev.havana.game.games.enums.GameState; +import org.alexdev.havana.game.games.enums.GameType; +import org.alexdev.havana.game.games.snowstorm.SnowStormGame; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class FULLGAMESTATUS extends MessageComposer { + private final Game game; + + public FULLGAMESTATUS(Game game) { + this.game = game; + } + + @Override + public void compose(NettyResponse response) { + if (this.game.getGameType() == GameType.BATTLEBALL) { + response.writeInt(GameState.STARTED.getStateId()); + response.writeInt(this.game.getPreparingGameSecondsLeft().get()); + response.writeInt(GameManager.getInstance().getPreparingSeconds(game.getGameType())); + response.writeInt(this.game.getObjects().size()); // TODO: Objects here + + if (this.game.getGameType() == GameType.BATTLEBALL) { + for (var gameObject : this.game.getObjects()) { + response.writeInt(gameObject.getGameObjectType().getObjectId()); // type, 0 = player + gameObject.serialiseObject(response); + } + + response.writeInt(this.game.getRoomModel().getMapSizeY()); + response.writeInt(this.game.getRoomModel().getMapSizeX()); + + for (int y = 0; y < this.game.getRoomModel().getMapSizeY(); y++) { + for (int x = 0; x < this.game.getRoomModel().getMapSizeX(); x++) { + BattleBallTile tile = (BattleBallTile) this.game.getTile(x, y); + + if (tile == null) { + response.writeInt(-1); + response.writeInt(0); + } else { + response.writeInt(tile.getColour().getColourId()); + response.writeInt(tile.getState().getTileStateId()); + } + } + } + + response.writeInt(1); + response.writeInt(0); // TODO: Show events on game load + } + } + else { + var objects = this.game.getObjects(); + var turns = ((SnowStormGame)this.game).getUpdateTask().getExecutingTurns(); + + response.writeInt(this.game.getGameState().getStateId()); + response.writeInt(this.game.getPreparingGameSecondsLeft().get()); + response.writeInt(GameManager.getInstance().getPreparingSeconds(game.getGameType())); + response.writeInt(this.game.getObjects().size()); // TODO: Objects here + + for (var obj : objects) { + obj.serialiseObject(response); + } + + response.writeBool(false); + response.writeInt(this.game.getTeamAmount()); + + new SNOWSTORM_GAMESTATUS(turns).compose(response); + } + } + + @Override + public short getHeader() { + return 243; // "Cs" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/GAMEDELETED.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/GAMEDELETED.java new file mode 100644 index 0000000..6b5bbf4 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/GAMEDELETED.java @@ -0,0 +1,22 @@ +package org.alexdev.havana.messages.outgoing.games; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class GAMEDELETED extends MessageComposer { + private int gameId; + + public GAMEDELETED(int gameId) { + this.gameId = gameId; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.gameId); + } + + @Override + public short getHeader() { + return 237; // "Cm" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/GAMEEND.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/GAMEEND.java new file mode 100644 index 0000000..081f9aa --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/GAMEEND.java @@ -0,0 +1,46 @@ +package org.alexdev.havana.messages.outgoing.games; + +import org.alexdev.havana.game.games.GameManager; +import org.alexdev.havana.game.games.enums.GameType; +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.games.player.GameTeam; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.Map; + +public class GAMEEND extends MessageComposer { + private final GameType gameType; + private final Map teams; + + public GAMEEND(GameType game, Map teams) { + this.gameType = game; + this.teams = teams; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(GameManager.getInstance().getRestartSeconds(this.gameType)); + response.writeInt(this.teams.size()); + + for (GameTeam team : this.teams.values()) { + var players = team.getPlayers(); + response.writeInt(players.size()); + + if (players.size() > 0) { + for (GamePlayer gamePlayer : players) { + response.writeInt(gamePlayer.getObjectId()); + response.writeString(gamePlayer.getPlayer().getDetails().getName()); + response.writeInt(gamePlayer.getScore()); + } + + response.writeInt(team.getScore()); + } + } + } + + @Override + public short getHeader() { + return 248; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/GAMEINSTANCE.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/GAMEINSTANCE.java new file mode 100644 index 0000000..4a988f4 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/GAMEINSTANCE.java @@ -0,0 +1,162 @@ +package org.alexdev.havana.messages.outgoing.games; + +import org.alexdev.havana.game.games.history.GameHistory; +import org.alexdev.havana.game.games.history.GameHistoryPlayer; +import org.alexdev.havana.game.games.snowstorm.SnowStormGame; +import org.alexdev.havana.game.games.Game; +import org.alexdev.havana.game.games.enums.GameState; +import org.alexdev.havana.game.games.enums.GameType; +import org.alexdev.havana.game.games.battleball.BattleBallGame; +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.List; + +public class GAMEINSTANCE extends MessageComposer { + private Game game; + private GameHistory finishedGame; + + public GAMEINSTANCE(Game game) { + this.game = game; + } + + public GAMEINSTANCE(GameHistory game) { + this.finishedGame = game; + } + + @Override + public void compose(NettyResponse response) { + if (this.finishedGame == null) { + response.writeInt(this.game.getGameState().getStateId()); + + if (this.game.getGameState() == GameState.WAITING) { + response.writeInt(this.game.getId()); + response.writeString(this.game.getName()); + + // Host + response.writeInt(this.game.getGameCreatorId()); + response.writeString(this.game.getGameCreator()); + + if (this.game.getGameType() == GameType.SNOWSTORM) { + SnowStormGame snowStormGame = (SnowStormGame) this.game; + response.writeInt(snowStormGame.getGameLengthChoice()); + } + + response.writeInt(this.game.getMapId()); + response.writeInt(this.game.getSpectators().size()); + response.writeInt(this.game.getTeamAmount()); + + for (int i = 0; i < this.game.getTeamAmount(); i++) { + List playerList = this.game.getTeams().get(i).getPlayers(); + + response.writeInt(playerList.size()); + + for (GamePlayer player : playerList) { + response.writeInt(player.getPlayer().getRoomUser().getInstanceId()); + response.writeString(player.getPlayer().getDetails().getName()); + } + } + + if (this.game.getGameType() == GameType.BATTLEBALL) { + BattleBallGame battleballGame = (BattleBallGame) this.game; + List allowedPowerUps = battleballGame.getAllowedPowerUps(); + + String[] powerUps = new String[allowedPowerUps.size()]; + + for (int i = 0; i < allowedPowerUps.size(); i++) { + powerUps[i] = String.valueOf(allowedPowerUps.get(i)); + } + + response.writeString(String.join(",", powerUps)); + } + } + + if (this.game.getGameState() == GameState.STARTED) { + response.writeInt(this.game.getId()); + response.writeString(this.game.getName()); + response.writeString(this.game.getGameCreator()); + + if (this.game.getGameType() == GameType.SNOWSTORM) { + SnowStormGame snowStormGame = (SnowStormGame) this.game; + response.writeInt(snowStormGame.getGameLengthChoice()); + } + + response.writeInt(this.game.getMapId()); + response.writeInt(this.game.getTeamAmount()); + + for (int i = 0; i < this.game.getTeamAmount(); i++) { + List playerList = this.game.getTeams().get(i).getActivePlayers(); + + response.writeInt(playerList.size()); + + for (GamePlayer player : playerList) { + //response.writeInt(player.getPlayer().getRoomUser().getInstanceId()); + response.writeString(player.getPlayer().getDetails().getName()); + } + } + + // TODO: Special SnowStorm parameters + + if (this.game.getGameType() == GameType.BATTLEBALL) { + BattleBallGame battleballGame = (BattleBallGame) this.game; + List allowedPowerUps = battleballGame.getAllowedPowerUps(); + + String[] powerUps = new String[allowedPowerUps.size()]; + + for (int i = 0; i < allowedPowerUps.size(); i++) { + powerUps[i] = String.valueOf(allowedPowerUps.get(i)); + } + + response.writeString(String.join(",", powerUps)); + } + + } + } else { + response.writeInt(GameState.ENDED.getStateId()); + response.writeInt(this.finishedGame.getId()); + response.writeString(this.finishedGame.getName()); + response.writeString(this.finishedGame.getGameCreator()); + + if (this.finishedGame.getGameType() == GameType.SNOWSTORM) { + response.writeInt(Integer.valueOf(this.finishedGame.getExtraData())); + } + + var teamData = this.finishedGame.getHistoryData().getTeamData(); + + response.writeInt(this.finishedGame.getMapId()); + response.writeInt(teamData.size()); + + for (int i = 0; i < teamData.size(); i++) { + var players = teamData.get(i); + var teamScore = players.stream().mapToInt(GameHistoryPlayer::getScore).sum(); + + response.writeInt(players.size()); + + for (var kvp : players) { + response.writeString(kvp.getName()); + response.writeInt(kvp.getScore()); + } + + response.writeInt(teamScore); + } + + if (this.finishedGame.getGameType() == GameType.BATTLEBALL) { + List allowedPowerUps = this.finishedGame.getAllowedPowerUps(); + + String[] powerUps = new String[allowedPowerUps.size()]; + + for (int i = 0; i < allowedPowerUps.size(); i++) { + powerUps[i] = String.valueOf(allowedPowerUps.get(i)); + } + + response.writeString(String.join(",", powerUps)); + } + } + } + + @Override + public short getHeader() { + return 233; // "Ci" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/GAMELOCATION.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/GAMELOCATION.java new file mode 100644 index 0000000..f5e8088 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/GAMELOCATION.java @@ -0,0 +1,16 @@ +package org.alexdev.havana.messages.outgoing.games; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class GAMELOCATION extends MessageComposer { + @Override + public void compose(NettyResponse response) { + response.writeInt(-1); + } + + @Override + public short getHeader() { + return 241; // "Cq" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/GAMEPARAMETERS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/GAMEPARAMETERS.java new file mode 100644 index 0000000..a7f3702 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/GAMEPARAMETERS.java @@ -0,0 +1,93 @@ +package org.alexdev.havana.messages.outgoing.games; + +import org.alexdev.havana.game.games.GameParameter; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class GAMEPARAMETERS extends MessageComposer { + private GameParameter[] parameters; + + public GAMEPARAMETERS(GameParameter[] gameParameters) { + this.parameters = gameParameters; + + /* + + For snowstorm: + + on setNumberOfTeams(me, tValue) + tOldElem = "gs_radio_" & pGameParameters.getAt("numTeams") & "teams" + tNewElem = "gs_radio_" & tValue & "teams" + pGameParameters.setAt("numTeams", tValue) + pRenderObj.updateRadioButton("", [tOldElem]) + pRenderObj.updateRadioButton(tNewElem, []) + return(1) + exit + end + + on setGameLength(me, tValue) + tOldElem = "gs_radio_gamelength_" & pGameParameters.getAt("gameLengthChoice") + tNewElem = "gs_radio_gamelength_" & tValue + pGameParameters.setAt("gameLengthChoice", tValue) + pRenderObj.updateRadioButton("", [tOldElem]) + pRenderObj.updateRadioButton(tNewElem, []) + return(1) + exit + end + + on setFieldType(me, tValue) + pGameParameters.setAt("fieldType", integer(tValue)) + tWndObj = getWindow(pMainWindowId) + tDropDown = tWndObj.getElement("gs_dropmenu_gamefield") + if not ilk(tDropDown, #instance) then + return(error(me, "Unable to retrieve dropdown:" && tDropDown, #setFieldType)) + end if + tFieldTxtItems = [] + tFieldKeyItems = [] + i = 1 + repeat while i <= 7 + tFieldTxtItems.setAt(i, getText("sw_fieldname_" & i)) + tFieldKeyItems.setAt(i, string(i)) + i = 1 + i + end repeat + tDropDown.updateData(tFieldTxtItems, tFieldKeyItems, void(), tValue) + return(1) + exit +end + + */ + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.parameters.length); + + for (GameParameter parameter : this.parameters) { + response.writeString(parameter.getName()); + response.writeBool(!parameter.hasMinMax()); + response.writeInt(parameter.isEditable() ? 2 : 0); + + if (parameter.hasMinMax()) { + response.writeInt(Integer.parseInt(parameter.getDefaultValue())); + + if (parameter.getMin() != -1) { + response.writeBool(true); + response.writeInt(parameter.getMin()); + } + + if (parameter.getMax() != -1) { + response.writeBool(true); + response.writeInt(parameter.getMax()); + } + + } else { + response.writeString(parameter.getDefaultValue()); + response.writeInt(0); + } + } + } + + @Override + public short getHeader() { + return 235; // "Ck" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/GAMEPLAYERINFO.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/GAMEPLAYERINFO.java new file mode 100644 index 0000000..bac929d --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/GAMEPLAYERINFO.java @@ -0,0 +1,45 @@ +package org.alexdev.havana.messages.outgoing.games; + +import org.alexdev.havana.game.games.GameManager; +import org.alexdev.havana.game.games.enums.GameType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.statistics.PlayerStatistic; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.List; + +public class GAMEPLAYERINFO extends MessageComposer { + private final List players; + private final GameType type; + + public GAMEPLAYERINFO(GameType type, List players) { + this.type = type; + this.players = players; + } + + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.players.size()); + + for (Player player : this.players) { + response.writeInt(player.getRoomUser().getInstanceId()); + + if (this.type == GameType.BATTLEBALL) { + response.writeString(player.getStatisticManager().getIntValue(PlayerStatistic.BATTLEBALL_POINTS_ALL_TIME)); + } + + if (this.type == GameType.SNOWSTORM) { + response.writeString(player.getStatisticManager().getIntValue(PlayerStatistic.SNOWSTORM_POINTS_ALL_TIME)); + } + + response.writeString(GameManager.getInstance().getRankByPoints(this.type, player).getTitle()); + } + } + + @Override + public short getHeader() { + return 250; // "Cz" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/GAMERESET.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/GAMERESET.java new file mode 100644 index 0000000..fdc3ad0 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/GAMERESET.java @@ -0,0 +1,50 @@ +package org.alexdev.havana.messages.outgoing.games; + +import org.alexdev.havana.game.games.Game; +import org.alexdev.havana.game.games.GameObject; +import org.alexdev.havana.game.games.enums.GameType; +import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.List; + +public class GAMERESET extends MessageComposer { + private final Game game; + private int timeUntilGameStart; + private List gamePlayerList; + + public GAMERESET(int timeUntilGameStart, List gamePlayerList, Game game) { + this.timeUntilGameStart = timeUntilGameStart; + this.gamePlayerList = gamePlayerList; + this.game = game; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.timeUntilGameStart); + + if (this.game.getGameType() == GameType.BATTLEBALL) { + response.writeInt(this.gamePlayerList.size()); + + for (GamePlayer gamePlayer : this.gamePlayerList) { + response.writeInt(gamePlayer.getObjectId()); + response.writeInt(gamePlayer.getPlayer().getRoomUser().getPosition().getX()); + response.writeInt(gamePlayer.getPlayer().getRoomUser().getPosition().getY()); + response.writeInt(gamePlayer.getPlayer().getRoomUser().getPosition().getRotation()); + } + } else { + response.writeInt(this.game.getObjects().size()); + + for (GameObject gamePlayer : this.game.getObjects()) { + // -- System.out.println("OBJECT: " +gamePlayer.getGameObjectType().name()); + gamePlayer.serialiseObject(response); + } + } + } + + @Override + public short getHeader() { + return 249; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/GAMESTART.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/GAMESTART.java new file mode 100644 index 0000000..01aed6f --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/GAMESTART.java @@ -0,0 +1,22 @@ +package org.alexdev.havana.messages.outgoing.games; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class GAMESTART extends MessageComposer { + private final int gameLengthSeconds; + + public GAMESTART(int gameLengthSeconds) { + this.gameLengthSeconds = gameLengthSeconds; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.gameLengthSeconds); + } + + @Override + public short getHeader() { + return 247; // "Cw" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/GAMESTATUS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/GAMESTATUS.java new file mode 100644 index 0000000..686a87c --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/GAMESTATUS.java @@ -0,0 +1,110 @@ +package org.alexdev.havana.messages.outgoing.games; + +import org.alexdev.havana.game.games.Game; +import org.alexdev.havana.game.games.GameEvent; +import org.alexdev.havana.game.games.GameObject; +import org.alexdev.havana.game.games.battleball.BattleBallTile; +import org.alexdev.havana.game.games.enums.GameType; +import org.alexdev.havana.game.games.player.GameTeam; +import org.alexdev.havana.game.games.snowstorm.SnowStormGame; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.Collection; +import java.util.List; + +public class GAMESTATUS extends MessageComposer { + private final Game game; + + private final Collection gameTeams; + + private final List objects; + private final List events; + + private List updateTiles; + private List fillTiles; + + public GAMESTATUS(Game game, Collection gameTeams, List objects, List events, List updateTiles, List fillTiles) { + this.game = game; + this.gameTeams = gameTeams; + this.objects = objects; + this.events = events; + this.updateTiles = updateTiles; + this.fillTiles = fillTiles; + } + + public GAMESTATUS(SnowStormGame game, Collection gameTeams, List objects, List events) { + this.game = game; + this.gameTeams = gameTeams; + this.objects = objects; + this.events = events; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.objects.size()); // TODO: Handle more than just objects events (power ups, etc) + + for (GameObject gameObject : this.objects) { + response.writeInt(gameObject.getGameObjectType().getObjectId()); + gameObject.serialiseObject(response); + } + + /*for (GamePlayer gamePlayer : this.objects) { + response.writeInt(0); // type, 0 = player + response.writeInt(gamePlayer.getPlayer().getRoomUser().getInstanceId()); + response.writeInt(gamePlayer.getPlayer().getRoomUser().getPosition().getX()); + response.writeInt(gamePlayer.getPlayer().getRoomUser().getPosition().getY()); + response.writeInt((int) gamePlayer.getPlayer().getRoomUser().getPosition().getZ()); + response.writeInt(gamePlayer.getPlayer().getRoomUser().getPosition().getRotation()); + response.writeInt(0); + response.writeInt(-1); + }*/ + + if (this.game.getGameType() == GameType.BATTLEBALL) { + response.writeInt(this.updateTiles.size()); + + for (BattleBallTile tile : this.updateTiles) { + response.writeInt(tile.getPosition().getX()); + response.writeInt(tile.getPosition().getY()); + response.writeInt(tile.getColour().getColourId()); + response.writeInt(tile.getState().getTileStateId()); + } + + response.writeInt(this.fillTiles.size()); + + for (BattleBallTile tile : this.fillTiles) { + response.writeInt(tile.getPosition().getX()); + response.writeInt(tile.getPosition().getY()); + response.writeInt(tile.getColour().getColourId()); + response.writeInt(tile.getState().getTileStateId()); + } + } + + response.writeInt(this.gameTeams.size()); + + for (GameTeam team : this.gameTeams) { + response.writeInt(team.getScore()); + } + + response.writeInt(1); + response.writeInt(this.events.size()); + + for (GameEvent gameEvent : this.events) { + response.writeInt(gameEvent.getGameEventType().getEventId()); + gameEvent.serialiseEvent(response); + } + /*response.writeInt(this.movingPlayers.size()); + + for (var kvp : this.movingPlayers.entrySet()) { + response.writeInt(2); + response.writeInt(kvp.getKey().getPlayer().getRoomUser().getInstanceId()); + response.writeInt(kvp.getValue().getX()); + response.writeInt(kvp.getValue().getY()); + }*/ + } + + @Override + public short getHeader() { + return 244; // "Ct" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/INSTANCELIST.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/INSTANCELIST.java new file mode 100644 index 0000000..7dd3625 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/INSTANCELIST.java @@ -0,0 +1,78 @@ +package org.alexdev.havana.messages.outgoing.games; + +import org.alexdev.havana.game.games.enums.GameType; +import org.alexdev.havana.game.games.history.GameHistory; +import org.alexdev.havana.game.games.snowstorm.SnowStormGame; +import org.alexdev.havana.game.games.Game; +import org.alexdev.havana.game.games.enums.GameState; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.List; +import java.util.stream.Collectors; + +public class INSTANCELIST extends MessageComposer { + private final List createdGames; + private final List startedGames; + private final List finishedGames; + + public INSTANCELIST(List gamesByType, List finishedGames) { + this.createdGames = gamesByType.stream().filter(game -> game.getGameState() == GameState.WAITING).collect(Collectors.toList()); + this.startedGames = gamesByType.stream().filter(game -> game.getGameState() == GameState.STARTED).collect(Collectors.toList()); + this.finishedGames = finishedGames; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.createdGames.size()); + + for (Game game : this.createdGames) { + response.writeInt(game.getId()); + response.writeString(game.getName()); + + response.writeInt(game.getGameCreatorId()); + response.writeString(game.getGameCreator()); + + if (game.getGameType() == GameType.SNOWSTORM) { + SnowStormGame snowStormGame = (SnowStormGame) game; + response.writeInt(snowStormGame.getGameLength()); + } + + response.writeInt(game.getMapId()); + } + + response.writeInt(this.startedGames.size()); + + for (Game game : this.startedGames) { + response.writeInt(game.getId()); + response.writeString(game.getName()); + response.writeString(game.getGameCreator()); + + if (game.getGameType() == GameType.SNOWSTORM) { + SnowStormGame snowStormGame = (SnowStormGame) game; + response.writeInt(snowStormGame.getGameLength()); + } + + response.writeInt(game.getMapId()); + } + + response.writeInt(this.finishedGames.size()); + + for (GameHistory game : this.finishedGames) { + response.writeInt(game.getId()); + response.writeString(game.getName()); + response.writeString(game.getGameCreator()); + + if (game.getGameType() == GameType.SNOWSTORM) { + response.writeInt(game.getGameLength()); + } + + response.writeInt(game.getMapId()); + } + } + + @Override + public short getHeader() { + return 232; // "Ch" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/JOINFAILED.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/JOINFAILED.java new file mode 100644 index 0000000..2c410e9 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/JOINFAILED.java @@ -0,0 +1,43 @@ +package org.alexdev.havana.messages.outgoing.games; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class JOINFAILED extends MessageComposer { + public enum FailedReason { + TICKETS_NEEDED(2), + TEAMS_FULL(0); + + private final int reasonId; + + FailedReason(int reasonId) { + this.reasonId = reasonId; + } + + public int getReasonId() { + return reasonId; + } + } + + private final FailedReason reason; + private final String key; + + public JOINFAILED(FailedReason reason, String key) { + this.reason = reason; + this.key = key; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.reason.getReasonId()); + + if (this.key != null) { + response.writeString(this.key); + } + } + + @Override + public short getHeader() { + return 239; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/LOUNGEINFO.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/LOUNGEINFO.java new file mode 100644 index 0000000..16eb70e --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/LOUNGEINFO.java @@ -0,0 +1,19 @@ +package org.alexdev.havana.messages.outgoing.games; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class LOUNGEINFO extends MessageComposer { + @Override + public void compose(NettyResponse response) { + response.writeInt(0); + //response.writeString("Rank name"); // Rank name here + //response.writeInt(1); // Minimum points + //response.writeInt(1); // Maximum points + } + + @Override + public short getHeader() { + return 231; // "Cg" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/PLAYERREJOINED.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/PLAYERREJOINED.java new file mode 100644 index 0000000..668bdf9 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/PLAYERREJOINED.java @@ -0,0 +1,22 @@ +package org.alexdev.havana.messages.outgoing.games; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class PLAYERREJOINED extends MessageComposer { + private final int instanceId; + + public PLAYERREJOINED(int instanceId) { + this.instanceId = instanceId; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.instanceId); + } + + @Override + public short getHeader() { + return 245; // "Cu" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/SNOWSTORM_GAMESTATUS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/SNOWSTORM_GAMESTATUS.java new file mode 100644 index 0000000..ee6bda6 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/SNOWSTORM_GAMESTATUS.java @@ -0,0 +1,35 @@ +package org.alexdev.havana.messages.outgoing.games; + +import org.alexdev.havana.game.games.snowstorm.SnowStormTurn; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.List; + +public class SNOWSTORM_GAMESTATUS extends MessageComposer { + private final List turns; + + public SNOWSTORM_GAMESTATUS(List events) { + this.turns = events; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(1); + response.writeInt(1); + response.writeInt(this.turns.size() == 0 ? 1 : this.turns.size()); + + for (var turn : this.turns) { + response.writeInt(turn.getSubTurns().size()); + + for (var gameObject : turn.getSubTurns()) { + gameObject.serialiseObject(response); + } + } + } + + @Override + public short getHeader() { + return 244; // "Cs" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/STARTFAILED.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/STARTFAILED.java new file mode 100644 index 0000000..67f9441 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/STARTFAILED.java @@ -0,0 +1,42 @@ +package org.alexdev.havana.messages.outgoing.games; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class STARTFAILED extends MessageComposer { + public enum FailedReason { + MINIMUM_TEAMS_REQUIRED(8); + + private final int reasonId; + + FailedReason(int reasonId) { + this.reasonId = reasonId; + } + + public int getReasonId() { + return reasonId; + } + } + + private final FailedReason reason; + private final String key; + + public STARTFAILED(FailedReason reason, String key) { + this.reason = reason; + this.key = key; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.reason.getReasonId()); + + if (this.key != null) { + response.writeString(this.key); + } + } + + @Override + public short getHeader() { + return 242; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/guides/INIT_TUTOR_SERVICE_STATUS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/guides/INIT_TUTOR_SERVICE_STATUS.java new file mode 100644 index 0000000..63cd3d7 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/guides/INIT_TUTOR_SERVICE_STATUS.java @@ -0,0 +1,22 @@ +package org.alexdev.havana.messages.outgoing.guides; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class INIT_TUTOR_SERVICE_STATUS extends MessageComposer { + private final int status; + + public INIT_TUTOR_SERVICE_STATUS(int status) { + this.status = status; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.status); + } + + @Override + public short getHeader() { + return 425; // "Fi" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/guides/INVITATION.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/guides/INVITATION.java new file mode 100644 index 0000000..5a7eed9 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/guides/INVITATION.java @@ -0,0 +1,25 @@ +package org.alexdev.havana.messages.outgoing.guides; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class INVITATION extends MessageComposer { + private final Integer userId; + private final String username; + + public INVITATION(Integer userId, String username) { + this.userId = userId; + this.username = username; + } + + @Override + public void compose(NettyResponse response) { + response.writeString(this.userId); + response.writeString(this.username); + } + + @Override + public short getHeader() { + return 355; // "Ec" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/handshake/CRYPTO_PARAMETERS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/handshake/CRYPTO_PARAMETERS.java new file mode 100644 index 0000000..ce8273f --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/handshake/CRYPTO_PARAMETERS.java @@ -0,0 +1,19 @@ +package org.alexdev.havana.messages.outgoing.handshake; + +import org.alexdev.havana.game.encryption.DiffieHellman; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class CRYPTO_PARAMETERS extends MessageComposer { + + @Override + public void compose(NettyResponse response) { + response.writeString(DiffieHellman.generateRandomNumString(32)); + response.writeInt(0); + } + + @Override + public short getHeader() { + return 277; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/handshake/HELLO.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/handshake/HELLO.java new file mode 100644 index 0000000..b923fe1 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/handshake/HELLO.java @@ -0,0 +1,17 @@ +package org.alexdev.havana.messages.outgoing.handshake; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class HELLO extends MessageComposer { + + @Override + public void compose(NettyResponse response) { + + } + + @Override + public short getHeader() { + return 0; // "@@" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/handshake/LOGIN.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/handshake/LOGIN.java new file mode 100644 index 0000000..f3f0a3b --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/handshake/LOGIN.java @@ -0,0 +1,16 @@ +package org.alexdev.havana.messages.outgoing.handshake; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class LOGIN extends MessageComposer { + @Override + public void compose(NettyResponse response) { + + } + + @Override + public short getHeader() { + return 3; // "@C" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/handshake/RIGHTS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/handshake/RIGHTS.java new file mode 100644 index 0000000..43c63f3 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/handshake/RIGHTS.java @@ -0,0 +1,27 @@ +package org.alexdev.havana.messages.outgoing.handshake; + +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.List; + +public class RIGHTS extends MessageComposer { + private final List avaliableFuserights; + + public RIGHTS(List avaliableFuserights) { + this.avaliableFuserights = avaliableFuserights; + } + + @Override + public void compose(NettyResponse response) { + for (Fuseright fuseright : this.avaliableFuserights) { + response.writeString(fuseright.getFuseright()); + } + } + + @Override + public short getHeader() { + return 2; // "@B" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/handshake/SECRET_KEY.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/handshake/SECRET_KEY.java new file mode 100644 index 0000000..890bede --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/handshake/SECRET_KEY.java @@ -0,0 +1,22 @@ +package org.alexdev.havana.messages.outgoing.handshake; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class SECRET_KEY extends MessageComposer { + private final String key; + + public SECRET_KEY(String key) { + this.key = key; + } + + @Override + public void compose(NettyResponse response) { + response.write(this.key); + } + + @Override + public short getHeader() { + return 1; // "@A" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/handshake/SESSION_PARAMETERS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/handshake/SESSION_PARAMETERS.java new file mode 100644 index 0000000..0252aa7 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/handshake/SESSION_PARAMETERS.java @@ -0,0 +1,105 @@ +package org.alexdev.havana.messages.outgoing.handshake; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.messages.types.PlayerMessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; +import org.alexdev.havana.util.config.GameConfiguration; + +import java.util.HashMap; +import java.util.Map; + +public class SESSION_PARAMETERS extends PlayerMessageComposer { + public enum SessionParamType { + // conf_coppa is enabled when value higher than 0, + // conf_strong_coppa_required is enabled when value is higher than 1 + REGISTER_COPPA(0), + + // conf_voucher. Determines if vouchers are enabled in the client (in-game) + VOUCHER_ENABLED(1), + + // conf_parent_email_request. I think this is to switch parent email on/off + REGISTER_REQUIRE_PARENT_EMAIL(2), + + // conf_parent_email_request_reregistration. ??? + REGISTER_SEND_PARENT_EMAIL(3), + + // conf_allow_direct_mail. ??? + ALLOW_DIRECT_MAIL(4), + + // Configures date formatting. Value is date string. + DATE_FORMAT(5), + + // conf_partner_integration. Value is either 1 or 0 (enabled or disabled) + PARTNER_INTEGRATION_ENABLED(6), + + // allow_profile_editing. Enables the client (in-game) profile editor + ALLOW_PROFILE_EDITING(7), + + // tracking_header. Value is unknown + TRACKING_HEADER(8), + + // tutorial_enabled. Value is either 1 or 0 (enabled or disabled) + TUTORIAL_ENABLED(9); + + private final int paramID; + + SessionParamType(int paramID) { + this.paramID = paramID; + } + + public int getParamID() { + return this.paramID; + } + } + + private PlayerDetails details; + + public SESSION_PARAMETERS(PlayerDetails details) { + this.details = details; + } + + @Override + public void compose(NettyResponse response) { + Map parameters = new HashMap<>(); + + parameters.put(SessionParamType.VOUCHER_ENABLED, GameConfiguration.getInstance().getBoolean("vouchers.enabled") ? "1" : "0"); // conf_voucher. Determines if vouchers are enabled in the client (in-game) + parameters.put(SessionParamType.REGISTER_REQUIRE_PARENT_EMAIL, "0"); // conf_parent_email_request. I think this is to switch parent email on/off + parameters.put(SessionParamType.REGISTER_SEND_PARENT_EMAIL, "0"); // conf_parent_email_request_reregistration. ??? + parameters.put(SessionParamType.ALLOW_DIRECT_MAIL, "0"); // conf_allow_direct_mail. ??? + parameters.put(SessionParamType.DATE_FORMAT, "yyyy-MM-dd"); // Configures date formatting. Value is date string. + parameters.put(SessionParamType.PARTNER_INTEGRATION_ENABLED, "0"); // conf_partner_integration. Value is either 1 or 0 (enabled or disabled) + parameters.put(SessionParamType.ALLOW_PROFILE_EDITING, GameConfiguration.getInstance().getBoolean("profile.editing") ? "1" : "0"); // allow_profile_editing. Enables the client (in-game) profile editor + parameters.put(SessionParamType.TRACKING_HEADER, ""); // tracking_header. Value is unknown + parameters.put(SessionParamType.TUTORIAL_ENABLED, isTutorialEnabled(getPlayer()) ? "1" : "0");//GameConfiguration.getInstance().getBoolean("tutorial.enabled") ? "1" : "0"); // tutorial_enabled. Value is either 1 or 0 (enabled or disabled) + + response.writeInt(parameters.size()); + + for (Map.Entry entry : parameters.entrySet()) { + SessionParamType key = entry.getKey(); + String value = entry.getValue(); + + response.writeInt(key.getParamID()); + + if (value.length() > 0 && Character.isDigit(value.charAt(0))) { + response.writeInt(Integer.parseInt(value)); + } else { + response.writeString(value); + } + } + } + + private boolean isTutorialEnabled(Player player) { + if (!GameConfiguration.getInstance().getBoolean("tutorial.enabled")) { + return false; + } + + return true; + } + + @Override + public short getHeader() { + return 257; // "DA" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/handshake/UniqueIDMessageEvent.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/handshake/UniqueIDMessageEvent.java new file mode 100644 index 0000000..3eb3622 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/handshake/UniqueIDMessageEvent.java @@ -0,0 +1,22 @@ +package org.alexdev.havana.messages.outgoing.handshake; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class UniqueIDMessageEvent extends MessageComposer { + private final String uuid; + + public UniqueIDMessageEvent(String uuid) { + this.uuid = uuid; + } + + @Override + public void compose(NettyResponse response) { + response.writeString(this.uuid); + } + + @Override + public short getHeader() { + return 439; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/infobus/BUS_DOOR.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/infobus/BUS_DOOR.java new file mode 100644 index 0000000..1ba11da --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/infobus/BUS_DOOR.java @@ -0,0 +1,22 @@ +package org.alexdev.havana.messages.outgoing.infobus; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class BUS_DOOR extends MessageComposer { + private final boolean status; + + public BUS_DOOR(boolean status) { + this.status = status; + } + + @Override + public void compose(NettyResponse response) { + response.writeBool(this.status); + } + + @Override + public short getHeader() { + return 503; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/infobus/CANNOT_ENTER_BUS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/infobus/CANNOT_ENTER_BUS.java new file mode 100644 index 0000000..d9d1151 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/infobus/CANNOT_ENTER_BUS.java @@ -0,0 +1,22 @@ +package org.alexdev.havana.messages.outgoing.infobus; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class CANNOT_ENTER_BUS extends MessageComposer { + private final String message; + + public CANNOT_ENTER_BUS(String message) { + this.message = message; + } + + @Override + public void compose(NettyResponse response) { + response.writeString(this.message); + } + + @Override + public short getHeader() { + return 81; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/infobus/POLL_QUESTION.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/infobus/POLL_QUESTION.java new file mode 100644 index 0000000..2625122 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/infobus/POLL_QUESTION.java @@ -0,0 +1,35 @@ +package org.alexdev.havana.messages.outgoing.infobus; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.List; + +public class POLL_QUESTION extends MessageComposer { + private final String question; + private final List answers; + + public POLL_QUESTION(String question, List answers) { + this.question = question; + this.answers = answers; + } + + @Override + public void compose(NettyResponse response) { + response.writeString(this.question); + response.writeInt(this.answers.size()); + + int index = 0; + + for (String answer : this.answers) { + response.writeInt(index); + response.writeString(answer); + index++; + } + } + + @Override + public short getHeader() { + return 79; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/infobus/VOTE_RESULTS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/infobus/VOTE_RESULTS.java new file mode 100644 index 0000000..3051e39 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/infobus/VOTE_RESULTS.java @@ -0,0 +1,42 @@ +package org.alexdev.havana.messages.outgoing.infobus; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.List; +import java.util.Map; + +public class VOTE_RESULTS extends MessageComposer { + private final String question; + private final List answers; + private final Map answerResults; + private final int totalAnswers; + + public VOTE_RESULTS(String question, List answers, Map answerResults, int totalAnswers) { + this.question = question; + this.answers = answers; + this.answerResults = answerResults; + this.totalAnswers = totalAnswers; + } + + @Override + public void compose(NettyResponse response) { + response.writeString(this.question); + response.writeInt(this.answers.size()); + + int i = 0; + for (String answer : this.answers) { + response.writeInt(i); + response.writeString(answer); + response.writeInt(this.answerResults.getOrDefault(i, 0)); + i++; + } + + response.writeInt(this.totalAnswers); + } + + @Override + public short getHeader() { + return 80; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/inventory/INVENTORY.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/inventory/INVENTORY.java new file mode 100644 index 0000000..028896f --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/inventory/INVENTORY.java @@ -0,0 +1,34 @@ +package org.alexdev.havana.messages.outgoing.inventory; + +import org.alexdev.havana.game.inventory.Inventory; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.Map; + +public class INVENTORY extends MessageComposer { + private final Inventory inventory; + private final Map casts; + + public INVENTORY(Inventory inventory, Map casts) { + this.inventory = inventory; + this.casts = casts; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.casts.size()); + + for (var kvp : this.casts.entrySet()) { + this.inventory.serialise(response, kvp.getValue(), kvp.getKey()); + } + + response.writeInt(this.inventory.getDisplayedItems().size()); + } + + @Override + public short getHeader() { + return 140; // "BL" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/jukebox/JUKEBOX_DISCS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/jukebox/JUKEBOX_DISCS.java new file mode 100644 index 0000000..1126ce6 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/jukebox/JUKEBOX_DISCS.java @@ -0,0 +1,41 @@ +package org.alexdev.havana.messages.outgoing.jukebox; + +import org.alexdev.havana.game.item.ItemManager; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.song.jukebox.BurnedDisk; +import org.alexdev.havana.game.song.Song; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.Map; + +public class JUKEBOX_DISCS extends MessageComposer { + private final Map disks; + + public JUKEBOX_DISCS(Map savedTracks) { + this.disks = savedTracks; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(10); + response.writeInt(this.disks.size()); + + for (var kvp : this.disks.entrySet()) { + BurnedDisk burnedDisk = kvp.getKey(); + Song song = kvp.getValue(); + + response.writeInt(burnedDisk.getSlotId()); + response.writeInt(song.getId()); + response.writeInt(ItemManager.getInstance().calculateSongLength(song.getData()) / 2); + + response.writeString(song.getTitle()); + response.writeString(PlayerManager.getInstance().getPlayerData(song.getUserId()).getName()); + } + } + + @Override + public short getHeader() { + return 334; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/jukebox/USER_SONG_DISKS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/jukebox/USER_SONG_DISKS.java new file mode 100644 index 0000000..1df9faf --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/jukebox/USER_SONG_DISKS.java @@ -0,0 +1,31 @@ +package org.alexdev.havana.messages.outgoing.jukebox; + +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.List; +import java.util.Map; + +public class USER_SONG_DISKS extends MessageComposer { + private final Map userDisks; + + public USER_SONG_DISKS(Map userDisks) { + this.userDisks = userDisks; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.userDisks.size()); + + for (var kvp : this.userDisks.entrySet()) { + response.writeInt(kvp.getValue()); + response.writeString(kvp.getKey().getCustomData().split(Character.toString((char)10))[5]); + } + } + + @Override + public short getHeader() { + return 333; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/ADD_BUDDY.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/ADD_BUDDY.java new file mode 100644 index 0000000..bc7d9f2 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/ADD_BUDDY.java @@ -0,0 +1,37 @@ +package org.alexdev.havana.messages.outgoing.messenger; + +import org.alexdev.havana.game.messenger.MessengerCategory; +import org.alexdev.havana.game.messenger.MessengerUser; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class ADD_BUDDY extends MessageComposer { + private final MessengerUser friend; + private final Player player; + + public ADD_BUDDY(Player player, MessengerUser friend) { + this.friend = friend; + this.player = player; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.player.getMessenger().getCategories().size()); + + for (var category : this.player.getMessenger().getCategories()) { + response.writeInt(category.getId()); + response.writeString(category.getName()); + } + + response.writeInt(1); + response.writeInt(1); + + this.friend.serialise(this.player, response); + } + + @Override + public short getHeader() { + return 13; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/BUDDY_REQUEST_RESULT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/BUDDY_REQUEST_RESULT.java new file mode 100644 index 0000000..0d13453 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/BUDDY_REQUEST_RESULT.java @@ -0,0 +1,30 @@ +package org.alexdev.havana.messages.outgoing.messenger; + +import org.alexdev.havana.game.messenger.MessengerError; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.List; + +public class BUDDY_REQUEST_RESULT extends MessageComposer { + private List errors; + + public BUDDY_REQUEST_RESULT(List errors) { + this.errors = errors; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.errors.size()); + + for (MessengerError error : this.errors) { + response.writeString(error.getCauser()); + response.writeInt(error.getErrorType().getErrorCode()); + } + } + + @Override + public short getHeader() { + return 315; // "D{" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/FOLLOW_ERROR.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/FOLLOW_ERROR.java new file mode 100644 index 0000000..8105324 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/FOLLOW_ERROR.java @@ -0,0 +1,22 @@ +package org.alexdev.havana.messages.outgoing.messenger; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class FOLLOW_ERROR extends MessageComposer { + private final int errorId; + + public FOLLOW_ERROR(int errorId) { + this.errorId = errorId; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.errorId); + } + + @Override + public short getHeader() { + return 349; // "E]" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/FRIENDLIST.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/FRIENDLIST.java new file mode 100644 index 0000000..3cbd4b6 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/FRIENDLIST.java @@ -0,0 +1,32 @@ +package org.alexdev.havana.messages.outgoing.messenger; + +import org.alexdev.havana.game.messenger.MessengerUser; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.List; + +public class FRIENDLIST extends MessageComposer { + private final Player player; + private final List friends; + + public FRIENDLIST(Player player, List friends) { + this.player = player; + this.friends = friends; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.friends.size()); + + for (MessengerUser friend : this.friends) { + friend.serialise(player, response); + } + } + + @Override + public short getHeader() { + return 263; // "DG" + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/FRIENDS_UPDATE.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/FRIENDS_UPDATE.java new file mode 100644 index 0000000..5065e56 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/FRIENDS_UPDATE.java @@ -0,0 +1,46 @@ +package org.alexdev.havana.messages.outgoing.messenger; + +import org.alexdev.havana.game.messenger.Messenger; +import org.alexdev.havana.game.messenger.MessengerUser; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.ArrayList; +import java.util.List; + +public class FRIENDS_UPDATE extends MessageComposer { + private final Messenger messenger; + private final Player player; + private final List friendsUpdated; + + public FRIENDS_UPDATE(Player player, Messenger messenger) { + this.messenger = messenger; + this.player = player; + + this.friendsUpdated = new ArrayList<>(); + this.messenger.getFriendsUpdate().drainTo(this.friendsUpdated); + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.messenger.getCategories().size()); + + for (var category : this.messenger.getCategories()) { + response.writeInt(category.getId()); + response.writeString(category.getName()); + } + + response.writeInt(this.friendsUpdated.size()); + + for (MessengerUser friend : this.friendsUpdated) { + response.writeInt(0); + friend.serialise(this.player, response); + } + } + + @Override + public short getHeader() { + return 13; // "@M" + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/FRIEND_REQUEST.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/FRIEND_REQUEST.java new file mode 100644 index 0000000..0dcbe26 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/FRIEND_REQUEST.java @@ -0,0 +1,25 @@ +package org.alexdev.havana.messages.outgoing.messenger; + +import org.alexdev.havana.game.messenger.MessengerUser; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class FRIEND_REQUEST extends MessageComposer { + private final MessengerUser requester; + + public FRIEND_REQUEST(MessengerUser requester) { + this.requester = requester; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.requester.getUserId()); + response.writeString(this.requester.getUsername()); + response.writeString(String.valueOf(this.requester.getUserId())); + } + + @Override + public short getHeader() { + return 132; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/FRIEND_REQUESTS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/FRIEND_REQUESTS.java new file mode 100644 index 0000000..c536d27 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/FRIEND_REQUESTS.java @@ -0,0 +1,32 @@ +package org.alexdev.havana.messages.outgoing.messenger; + +import org.alexdev.havana.game.messenger.MessengerUser; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.List; + +public class FRIEND_REQUESTS extends MessageComposer { + private final List requests; + + public FRIEND_REQUESTS(List requests) { + this.requests = requests; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.requests.size()); + response.writeInt(this.requests.size()); + + for (MessengerUser messengerUser : this.requests) { + response.writeInt(messengerUser.getUserId()); + response.writeString(messengerUser.getUsername()); + response.writeString(messengerUser.getUserId()); + } + } + + @Override + public short getHeader() { + return 314; // "BD" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/INSTANT_MESSAGE_ERROR.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/INSTANT_MESSAGE_ERROR.java new file mode 100644 index 0000000..cae1c75 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/INSTANT_MESSAGE_ERROR.java @@ -0,0 +1,25 @@ +package org.alexdev.havana.messages.outgoing.messenger; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class INSTANT_MESSAGE_ERROR extends MessageComposer { + private int errorCode; + private int chatId; + + public INSTANT_MESSAGE_ERROR(int errorCode, int chatId) { + this.errorCode = errorCode; + this.chatId = chatId; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.errorCode); + response.writeInt(this.chatId); + } + + @Override + public short getHeader() { + return 261; // "DE" + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/INSTANT_MESSAGE_INVITATION.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/INSTANT_MESSAGE_INVITATION.java new file mode 100644 index 0000000..00f5387 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/INSTANT_MESSAGE_INVITATION.java @@ -0,0 +1,25 @@ +package org.alexdev.havana.messages.outgoing.messenger; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class INSTANT_MESSAGE_INVITATION extends MessageComposer { + private final int userId; + private final String message; + + public INSTANT_MESSAGE_INVITATION(int userId, String message) { + this.userId = userId; + this.message = message; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.userId); + response.writeString(this.message); + } + + @Override + public short getHeader() { + return 135; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/INVITATION_ERROR.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/INVITATION_ERROR.java new file mode 100644 index 0000000..d8bdf6b --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/INVITATION_ERROR.java @@ -0,0 +1,16 @@ +package org.alexdev.havana.messages.outgoing.messenger; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class INVITATION_ERROR extends MessageComposer { + @Override + public void compose(NettyResponse response) { + response.writeInt(0); + } + + @Override + public short getHeader() { + return 262; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/MESSENGER_ERROR.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/MESSENGER_ERROR.java new file mode 100644 index 0000000..eb47302 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/MESSENGER_ERROR.java @@ -0,0 +1,29 @@ +package org.alexdev.havana.messages.outgoing.messenger; + +import org.alexdev.havana.game.messenger.MessengerError; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class MESSENGER_ERROR extends MessageComposer { + private int clientMessageId; // The client likes to log the message id that caused this error + private final MessengerError error; + + public MESSENGER_ERROR(MessengerError error) { + this.error = error; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.clientMessageId); + response.writeInt(this.error.getErrorType().getErrorCode()); + + if (this.error.getErrorReason() != null) { + response.writeInt(this.error.getErrorReason().getReasonCode()); + } + } + + @Override + public short getHeader() { + return 260; // "DD" + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/MESSENGER_INIT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/MESSENGER_INIT.java new file mode 100644 index 0000000..d4b5915 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/MESSENGER_INIT.java @@ -0,0 +1,61 @@ +package org.alexdev.havana.messages.outgoing.messenger; + +import org.alexdev.havana.game.messenger.Messenger; +import org.alexdev.havana.game.messenger.MessengerUser; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; +import org.alexdev.havana.util.config.GameConfiguration; + +import java.util.ArrayList; +import java.util.List; + +public class MESSENGER_INIT extends MessageComposer { + private final Player player; + private final int friendsLimit; + private List friends; + + public MESSENGER_INIT(Player player, Messenger data) { + this.player = player; + this.friendsLimit = data.getFriendsLimit(); + this.friends = new ArrayList<>(data.getFriends().values()); + } + + @Override + public void compose(NettyResponse response) { + //response.writeString(this.persistentMessage); + +// if (this.isClubMember) { +// response.writeInt(clubFriendsLimit); +// } else { +// response.writeInt(normalFriendsLimit); +// } + + int normalFriendsLimit = GameConfiguration.getInstance().getInteger("messenger.max.friends.nonclub"); + int clubFriendsLimit = GameConfiguration.getInstance().getInteger("messenger.max.friends.club"); + + response.writeInt(this.friendsLimit); + response.writeInt(normalFriendsLimit); + response.writeInt(clubFriendsLimit); + response.writeInt(this.player.getMessenger().getCategories().size()); + + for (var category : this.player.getMessenger().getCategories()) { + response.writeInt(category.getId()); + response.writeString(category.getName()); + } + + response.writeInt(this.friends.size()); + + for (MessengerUser friend : this.friends) { + friend.serialise(player, response); + } + + response.writeInt(0); + response.writeInt(0); + } + + @Override + public short getHeader() { + return 12; // "@L" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/MESSENGER_MSG.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/MESSENGER_MSG.java new file mode 100644 index 0000000..505e271 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/MESSENGER_MSG.java @@ -0,0 +1,30 @@ +package org.alexdev.havana.messages.outgoing.messenger; + +import org.alexdev.havana.game.messenger.MessengerMessage; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class MESSENGER_MSG extends MessageComposer { + private final MessengerMessage message; + + public MESSENGER_MSG(MessengerMessage message) { + this.message = message; + } + + @Override + public void compose(NettyResponse response) { + //response.writeInt(this.message.getVirtualId()); + response.writeInt(this.message.getFromId()); + //response.writeString(DateUtil.getDateAsString(this.message.getTimeSet())); + response.writeString(this.message.getMessage()); + } + + public MessengerMessage getMessage() { + return message; + } + + @Override + public short getHeader() { + return 134; // "BF" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/MESSENGER_SEARCH.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/MESSENGER_SEARCH.java new file mode 100644 index 0000000..000c935 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/MESSENGER_SEARCH.java @@ -0,0 +1,57 @@ +package org.alexdev.havana.messages.outgoing.messenger; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; +import org.alexdev.havana.util.DateUtil; + +import java.util.List; + +public class MESSENGER_SEARCH extends MessageComposer { + private final List friends; + private final List others; + + public MESSENGER_SEARCH(List friends, List others) { + this.friends = friends; + this.others = others; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.friends.size()); + + for (PlayerDetails playerDetails : this.friends) { + this.serialiseSearch(response, playerDetails); + } + + response.writeInt(this.others.size()); + + for (PlayerDetails playerDetails : this.others) { + this.serialiseSearch(response, playerDetails); + } + } + + private void serialiseSearch(NettyResponse response, PlayerDetails playerDetails) { + response.writeInt(playerDetails.getId()); + response.writeString(playerDetails.getName()); + response.writeString(playerDetails.getMotto()); + + Player player = PlayerManager.getInstance().getPlayerById(playerDetails.getId()); + boolean isOnline = PlayerManager.getInstance().isPlayerOnline(playerDetails.getId()); + + response.writeBool(isOnline); + response.writeBool(isOnline && player.getRoomUser().getRoom() != null); + response.writeString((isOnline && player.getRoomUser().getRoom() != null) ? player.getRoomUser().getRoom().getData().getName() : ""); + + response.writeBool(playerDetails.getSex().toUpperCase().equals("M")); + response.writeString(isOnline ? playerDetails.getFigure() : ""); + response.writeString(DateUtil.getDate(playerDetails.getLastOnline(), DateUtil.LONG_DATE)); + } + + @Override + public short getHeader() { + return 435; // Fs + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/REMOVE_BUDDY.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/REMOVE_BUDDY.java new file mode 100644 index 0000000..c837edc --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/REMOVE_BUDDY.java @@ -0,0 +1,37 @@ +package org.alexdev.havana.messages.outgoing.messenger; + +import org.alexdev.havana.game.messenger.MessengerUser; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class REMOVE_BUDDY extends MessageComposer { + private final MessengerUser friend; + private final Player player; + + public REMOVE_BUDDY(Player player, MessengerUser friend) { + this.friend = friend; + this.player = player; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.player.getMessenger().getCategories().size()); + + for (var category : this.player.getMessenger().getCategories()) { + response.writeInt(category.getId()); + response.writeString(category.getName()); + } + + + response.writeInt(1); + response.writeInt(-1); + + response.writeInt(friend.getUserId()); + } + + @Override + public short getHeader() { + return 13; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/ROOMFORWARD.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/ROOMFORWARD.java new file mode 100644 index 0000000..ca53f1f --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/messenger/ROOMFORWARD.java @@ -0,0 +1,28 @@ +package org.alexdev.havana.messages.outgoing.messenger; + +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.RoomManager; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class ROOMFORWARD extends MessageComposer { + private final boolean isPublic; + private int roomId; + + public ROOMFORWARD(boolean isPublic, int roomId) { + this.isPublic = isPublic; + this.roomId = roomId; + } + + + @Override + public void compose(NettyResponse response) { + response.writeBool(this.isPublic); + response.writeInt(this.roomId); + } + + @Override + public short getHeader() { + return 286; // "D^" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/moderation/CALL_FOR_HELP.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/moderation/CALL_FOR_HELP.java new file mode 100644 index 0000000..0487b69 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/moderation/CALL_FOR_HELP.java @@ -0,0 +1,44 @@ +package org.alexdev.havana.messages.outgoing.moderation; + +import org.alexdev.havana.game.moderation.cfh.CallForHelp; +import org.alexdev.havana.game.room.RoomManager; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class CALL_FOR_HELP extends MessageComposer { + private CallForHelp cfh; + + public CALL_FOR_HELP(CallForHelp cfh){ + this.cfh = cfh; + } + + @Override + public void compose(NettyResponse response) { + response.writeString(this.cfh.getCryId()); + response.writeInt(this.cfh.getCategory()); + response.writeString(this.cfh.getFormattedRequestTime()); + response.writeString(this.cfh.getCaller()); + response.writeString(this.cfh.getMessage()); + response.writeString(this.cfh.getCaller()); + response.writeString(this.cfh.getRoom().getData().getName()); + + if (this.cfh.getRoom() != null) { + if (this.cfh.getRoom().isPublicRoom()) { + response.writeInt(0); + response.writeString(this.cfh.getRoom().getData().getCcts()); + response.writeInt(this.cfh.getRoom().getId() + RoomManager.PUBLIC_ROOM_OFFSET); + response.writeInt(this.cfh.getRoom().getId()); + } else { + response.writeInt(1); + response.writeString(this.cfh.getRoom().getData().getName()); + response.writeInt(this.cfh.getRoom().getId() ); + response.writeString(this.cfh.getRoom().getData().getOwnerName()); + } + } + } + + @Override + public short getHeader() { + return 148; // "BT" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/moderation/CFH_ACK.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/moderation/CFH_ACK.java new file mode 100644 index 0000000..347fb4f --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/moderation/CFH_ACK.java @@ -0,0 +1,30 @@ +package org.alexdev.havana.messages.outgoing.moderation; + +import org.alexdev.havana.game.moderation.cfh.CallForHelp; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class CFH_ACK extends MessageComposer { + private final CallForHelp call; + + public CFH_ACK(CallForHelp call){ + this.call = call; + } + + @Override + public void compose(NettyResponse response) { + // TODO: verify if structure and packet name is correct by looking at the lingo + response.writeBool(call != null); + + if (call != null) { + response.writeString(call.getCryId()); + response.writeString(call.getFormattedRequestTime()); + response.writeString(call.getMessage()); + } + } + + @Override + public short getHeader() { + return 319; // "D" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/moderation/CRY_RECEIVED.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/moderation/CRY_RECEIVED.java new file mode 100644 index 0000000..adf486f --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/moderation/CRY_RECEIVED.java @@ -0,0 +1,16 @@ +package org.alexdev.havana.messages.outgoing.moderation; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class CRY_RECEIVED extends MessageComposer { + @Override + public void compose(NettyResponse response) { + response.writeString("H"); + } + + @Override + public short getHeader() { + return 321; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/moderation/CRY_REPLY.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/moderation/CRY_REPLY.java new file mode 100644 index 0000000..f3001c9 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/moderation/CRY_REPLY.java @@ -0,0 +1,22 @@ +package org.alexdev.havana.messages.outgoing.moderation; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class CRY_REPLY extends MessageComposer { + private final String message; + + public CRY_REPLY(String message){ + this.message = message; + } + + @Override + public void compose(NettyResponse response) { + response.writeString(this.message); + } + + @Override + public short getHeader() { + return 274; // "DR" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/moderation/DELETE_CRY.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/moderation/DELETE_CRY.java new file mode 100644 index 0000000..adc2f03 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/moderation/DELETE_CRY.java @@ -0,0 +1,22 @@ +package org.alexdev.havana.messages.outgoing.moderation; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class DELETE_CRY extends MessageComposer { + private int cryId; + + public DELETE_CRY(int cryId){ + this.cryId = cryId; + } + + @Override + public void compose(NettyResponse response) { + response.writeString(cryId); + } + + @Override + public short getHeader() { + return 273; // "DQ" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/moderation/MODERATOR_ALERT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/moderation/MODERATOR_ALERT.java new file mode 100644 index 0000000..acb481d --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/moderation/MODERATOR_ALERT.java @@ -0,0 +1,23 @@ +package org.alexdev.havana.messages.outgoing.moderation; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class MODERATOR_ALERT extends MessageComposer { + private final String message; + + public MODERATOR_ALERT(String message){ + this.message = message; + } + + @Override + public void compose(NettyResponse response) { + response.writeString(this.message); + response.writeString(""); + } + + @Override + public short getHeader() { + return 161; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/moderation/PICKED_CRY.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/moderation/PICKED_CRY.java new file mode 100644 index 0000000..78cc97a --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/moderation/PICKED_CRY.java @@ -0,0 +1,25 @@ +package org.alexdev.havana.messages.outgoing.moderation; + +import org.alexdev.havana.game.moderation.cfh.CallForHelp; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class PICKED_CRY extends MessageComposer { + + private CallForHelp cfh; + + public PICKED_CRY(CallForHelp cfh){ + this.cfh = cfh; + } + + @Override + public void compose(NettyResponse response) { + response.writeString(cfh.getCryId()); + response.writeString(cfh.getPickedUpBy()); + } + + @Override + public short getHeader() { + return 149; // "BU" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/navigator/CANTCONNECT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/navigator/CANTCONNECT.java new file mode 100644 index 0000000..3ac7b31 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/navigator/CANTCONNECT.java @@ -0,0 +1,69 @@ +package org.alexdev.havana.messages.outgoing.navigator; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class CANTCONNECT extends MessageComposer { + public enum QueueError { + RESET("queue_reset"), + FULL("queue_full"), + STAFF_ONLY("na"), + EVENT_PARTICIPENTS_ONLY_COPY("e2"), + EVENT_PARTICIPENTS_ONLY("e1"), + CLUB_ONLY("c"); + + private final String reasonType; + + QueueError(String reasonType) { + this.reasonType = reasonType; + } + + public String getReasonType() { + return this.reasonType; + } + } + + public enum ConnectError { + ROOM_FULL(1), + ROOM_CLOSED(2), + QUEUE_ERROR(3), + BANNED(4); + + private final int errorId; + + ConnectError(int errorId) { + this.errorId = errorId; + } + + public int getErrorId() { + return this.errorId; + } + } + + private final ConnectError connectError; + private final QueueError queueError; + + public CANTCONNECT(ConnectError error) { + this.connectError = error; + this.queueError = null; + } + + public CANTCONNECT(QueueError error) { + this.connectError = ConnectError.QUEUE_ERROR; + this.queueError = error; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.connectError.getErrorId()); + + if (this.queueError != null) { + response.writeString(this.queueError.getReasonType()); + } + } + + @Override + public short getHeader() { + return 224; // "C`" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/navigator/FAVOURITEROOMRESULTS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/navigator/FAVOURITEROOMRESULTS.java new file mode 100644 index 0000000..8d2b4db --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/navigator/FAVOURITEROOMRESULTS.java @@ -0,0 +1,88 @@ +package org.alexdev.havana.messages.outgoing.navigator; + +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.RoomManager; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.List; + +public class FAVOURITEROOMRESULTS extends MessageComposer { + private final int nodeType; + private final List favouritePublicRooms; + private final List favouriteFlatRooms; + private final Player viewer; + + public FAVOURITEROOMRESULTS(Player viewer, List favouritePublicRooms, List favouriteFlatRooms) { + this.nodeType = 2; + this.viewer = viewer; + this.favouritePublicRooms = favouritePublicRooms; + this.favouriteFlatRooms = favouriteFlatRooms; + } + + @Override + public void compose(NettyResponse response) { + /* tNodeMask = tConn.GetIntFrom() + tNodeId = tConn.GetIntFrom() + tNodeType = tConn.GetIntFrom() + tNodeInfo = [#id:string(tNodeId), #nodeType:tNodeType, #name:tConn.GetStrFrom(), #usercount:tConn.GetIntFrom(), #maxUsers:tConn.GetIntFrom(), #parentid:string(tConn.GetIntFrom())]*/ + response.writeInt(0); + response.writeInt(0); + response.writeInt(this.nodeType); // Node type: 2 to show private rooms + response.writeString(""); + response.writeInt(0); + response.writeInt(0); + response.writeInt(0); + + if (this.nodeType == 2) { + response.writeInt(this.favouriteFlatRooms.size()); + + for (Room room : this.favouriteFlatRooms) { + response.writeInt(room.getId()); + response.writeString(room.getData().getName()); + + if (room.isOwner(this.viewer.getDetails().getId())|| room.getData().showOwnerName() || this.viewer.hasFuse(Fuseright.SEE_ALL_ROOMOWNERS)) { + response.writeString(room.getData().getOwnerName()); + } else { + response.writeString("-"); + } + + response.writeString(room.getData().getAccessType()); + response.writeInt(room.getData().getVisitorsNow()); + response.writeInt(room.getData().getVisitorsMax()); + response.writeString(room.getData().getDescription()); + } + } + + for (Room room : this.favouritePublicRooms) { + int door = 0; + String description = room.getData().getDescription(); + + if (room.getData().getDescription().contains("/")) { + String[] data = description.split("/"); + description = data[0]; + door = Integer.parseInt(data[1]); + } + + response.writeInt(room.getId() + RoomManager.PUBLIC_ROOM_OFFSET); + response.writeInt(1); + response.writeString(room.getData().getName()); + response.writeInt(room.getData().getTotalVisitorsNow()); + response.writeInt(room.getData().getTotalVisitorsMax()); + response.writeInt(room.getData().getCategoryId()); + response.writeString(description); + response.writeInt(room.getId()); + response.writeInt(door); + response.writeString(room.getData().getCcts()); + response.writeInt(0); + response.writeInt(1); + } + } + + @Override + public short getHeader() { + return 61; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/navigator/FLAT_RESULTS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/navigator/FLAT_RESULTS.java new file mode 100644 index 0000000..4e6f8f4 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/navigator/FLAT_RESULTS.java @@ -0,0 +1,35 @@ +package org.alexdev.havana.messages.outgoing.navigator; + +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.List; + +public class FLAT_RESULTS extends MessageComposer { + private final List roomList; + + public FLAT_RESULTS(List roomList) { + this.roomList = roomList; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.roomList.size()); + + for (Room room : this.roomList) { + response.writeInt(room.getId()); + response.writeString(room.getData().getName()); + response.writeString(room.getData().getOwnerName()); + response.writeString(room.getData().getAccessType()); + response.writeInt(room.getData().getVisitorsNow()); + response.writeInt(room.getData().getVisitorsMax()); + response.writeString(room.getData().getDescription()); + } + } + + @Override + public short getHeader() { + return 16; // "@P" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/navigator/NAVNODEINFO.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/navigator/NAVNODEINFO.java new file mode 100644 index 0000000..1ec5305 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/navigator/NAVNODEINFO.java @@ -0,0 +1,106 @@ +package org.alexdev.havana.messages.outgoing.navigator; + +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.navigator.NavigatorCategory; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.RoomManager; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.List; + +public class NAVNODEINFO extends MessageComposer { + private Player viewer; + private NavigatorCategory parentCategory; + private List rooms; + private boolean hideFull; + private List subCategories; + private int categoryCurrentVisitors; + private int categoryMaxVisitors; + private int rank; + + public NAVNODEINFO(Player viewer, NavigatorCategory parentCategory, List rooms, boolean hideFull, List subCategories, int categoryCurrentVisitors, int categoryMaxVisitors, int rank) { + this.viewer = viewer; + this.parentCategory = parentCategory; + this.rooms = rooms; + this.hideFull = hideFull; + this.subCategories = subCategories; + this.categoryCurrentVisitors = categoryCurrentVisitors; + this.categoryMaxVisitors = categoryMaxVisitors; + this.rank = rank; + } + + @Override + public void compose(NettyResponse response) { + response.writeBool(this.hideFull); + response.writeInt(this.parentCategory.getId()); + response.writeInt(this.parentCategory.isPublicSpaces() ? 0 : 2); + response.writeString(this.parentCategory.getName()); + response.writeInt(this.categoryCurrentVisitors); + response.writeInt(this.categoryMaxVisitors); + response.writeInt(this.parentCategory.getParentId()); + + if (!this.parentCategory.isPublicSpaces()) { + response.writeInt(this.rooms.size()); + } + + for (Room room : this.rooms) { + if (room.isPublicRoom()) { + int door = 0; + String description = room.getData().getDescription(); + + if (room.getData().getDescription().contains("/")) { + String[] data = description.split("/"); + description = data[0]; + door = Integer.parseInt(data[1]); + } + + response.writeInt(room.getId() + RoomManager.PUBLIC_ROOM_OFFSET); + response.writeInt(1); + response.writeString(room.getData().getName()); + response.writeInt(room.getData().getTotalVisitorsNow()); + response.writeInt(room.getData().getTotalVisitorsMax()); + response.writeInt(room.getData().getCategoryId()); + response.writeString(description); + response.writeInt(room.getId()); + response.writeInt(door); + response.writeString(room.getData().getCcts()); + response.writeInt(0); + response.writeInt(1); + } else { + response.writeInt(room.getId()); + response.writeString(room.getData().getName()); + + if (room.isOwner(this.viewer.getDetails().getId())|| room.getData().showOwnerName() || this.viewer.hasFuse(Fuseright.SEE_ALL_ROOMOWNERS)) { + response.writeString(room.getData().getOwnerName()); + } else { + response.writeString("-"); + } + + response.writeString(room.getData().getAccessType()); + response.writeInt(room.getData().getVisitorsNow()); + response.writeInt(room.getData().getVisitorsMax()); + response.writeString(room.getData().getDescription()); + } + } + + for (NavigatorCategory subCategory : this.subCategories) { + if (subCategory.getMinimumRoleAccess().getRankId() > this.rank) { + continue; + } + response.writeInt(subCategory.getId()); + response.writeInt(0); + response.writeString(subCategory.getName()); + response.writeInt(subCategory.getCurrentVisitors()); + response.writeInt(subCategory.getMaxVisitors()); + response.writeInt(this.parentCategory.getId()); + } + + } + + @Override + public short getHeader() { + return 220; // "C\" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/navigator/NODESPACEUSERS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/navigator/NODESPACEUSERS.java new file mode 100644 index 0000000..3aad4d4 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/navigator/NODESPACEUSERS.java @@ -0,0 +1,30 @@ +package org.alexdev.havana.messages.outgoing.navigator; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.List; + +public class NODESPACEUSERS extends MessageComposer { + private final List players; + + public NODESPACEUSERS(List players) { + this.players = players; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(-1); // tNodeId = string(tConn.GetIntFrom()) + response.writeInt(this.players.size()); + + for (Player player : this.players) { + response.writeString(player.getDetails().getName()); + } + } + + @Override + public short getHeader() { + return 223; // "C_" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/navigator/NOFLATS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/navigator/NOFLATS.java new file mode 100644 index 0000000..30cb396 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/navigator/NOFLATS.java @@ -0,0 +1,16 @@ +package org.alexdev.havana.messages.outgoing.navigator; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class NOFLATS extends MessageComposer { + @Override + public void compose(NettyResponse response) { + + } + + @Override + public short getHeader() { + return 58; // "@z + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/navigator/NOFLATSFORUSER.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/navigator/NOFLATSFORUSER.java new file mode 100644 index 0000000..a4df02b --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/navigator/NOFLATSFORUSER.java @@ -0,0 +1,22 @@ +package org.alexdev.havana.messages.outgoing.navigator; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class NOFLATSFORUSER extends MessageComposer { + private String username; + + public NOFLATSFORUSER(String username) { + this.username = username; + } + + @Override + public void compose(NettyResponse response) { + response.writeString(this.username); + } + + @Override + public short getHeader() { + return 57; // "@y" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/navigator/RECOMMENDED_ROOM_LIST.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/navigator/RECOMMENDED_ROOM_LIST.java new file mode 100644 index 0000000..60b4372 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/navigator/RECOMMENDED_ROOM_LIST.java @@ -0,0 +1,45 @@ +package org.alexdev.havana.messages.outgoing.navigator; + +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.List; + +public class RECOMMENDED_ROOM_LIST extends MessageComposer { + private final Player player; + private final List roomList; + + public RECOMMENDED_ROOM_LIST(Player player, List roomList) { + this.player = player; + this.roomList = roomList; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.roomList.size()); + + for (Room room : this.roomList) { + response.writeInt(room.getId()); + response.writeString(room.getData().getName()); + + if (room.isOwner(this.player.getDetails().getId()) || room.getData().showOwnerName() || this.player.hasFuse(Fuseright.SEE_ALL_ROOMOWNERS)) { + response.writeString(room.getData().getOwnerName()); + } else { + response.writeString("-"); + } + + response.writeString(room.getData().getAccessType()); + response.writeInt(room.getData().getVisitorsNow()); + response.writeInt(room.getData().getVisitorsMax()); + response.writeString(room.getData().getDescription()); + } + } + + @Override + public short getHeader() { + return 351; // "E_" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/navigator/SEARCH_FLAT_RESULTS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/navigator/SEARCH_FLAT_RESULTS.java new file mode 100644 index 0000000..af5765c --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/navigator/SEARCH_FLAT_RESULTS.java @@ -0,0 +1,45 @@ +package org.alexdev.havana.messages.outgoing.navigator; + +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.List; + +public class SEARCH_FLAT_RESULTS extends MessageComposer { + private final List roomList; + private final Player player; + + public SEARCH_FLAT_RESULTS(List roomList, Player player) { + this.roomList = roomList; + this.player = player; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.roomList.size()); + + for (Room room : this.roomList) { + response.writeInt(room.getId()); + response.writeString(room.getData().getName()); + + if (room.isOwner(this.player.getDetails().getId()) || room.getData().showOwnerName() || this.player.hasFuse(Fuseright.SEE_ALL_ROOMOWNERS)) { + response.writeString(room.getData().getOwnerName()); + } else { + response.writeString("-"); + } + + response.writeString(room.getData().getAccessType()); + response.writeInt(room.getData().getVisitorsNow()); + response.writeInt(room.getData().getVisitorsMax()); + response.writeString(room.getData().getDescription()); + } + } + + @Override + public short getHeader() { + return 55; // "@w" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/navigator/USERFLATCATS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/navigator/USERFLATCATS.java new file mode 100644 index 0000000..79ee298 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/navigator/USERFLATCATS.java @@ -0,0 +1,30 @@ +package org.alexdev.havana.messages.outgoing.navigator; + +import org.alexdev.havana.game.navigator.NavigatorCategory; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.List; + +public class USERFLATCATS extends MessageComposer { + private final List categoryList; + + public USERFLATCATS(List categoryList) { + this.categoryList = categoryList; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.categoryList.size()); + + for (NavigatorCategory category : this.categoryList) { + response.writeInt(category.getId()); + response.writeString(category.getName()); + } + } + + @Override + public short getHeader() { + return 221; // "C]" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/openinghours/INFO_HOTEL_CLOSED.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/openinghours/INFO_HOTEL_CLOSED.java new file mode 100644 index 0000000..e5eb2e1 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/openinghours/INFO_HOTEL_CLOSED.java @@ -0,0 +1,31 @@ +package org.alexdev.havana.messages.outgoing.openinghours; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.time.LocalTime; + +public class INFO_HOTEL_CLOSED extends MessageComposer { + private final LocalTime openTime; + + // Denotes if the ugly popup is used or the more fancy one + private final boolean disconnect; + + public INFO_HOTEL_CLOSED(LocalTime openTime, boolean disconnect) { + this.openTime = openTime; + this.disconnect = disconnect; + } + + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.openTime.getHour()); + response.writeInt(this.openTime.getMinute()); + response.writeBool(this.disconnect); + } + + @Override + public short getHeader() { + return 292; // "Dd" + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/openinghours/INFO_HOTEL_CLOSING.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/openinghours/INFO_HOTEL_CLOSING.java new file mode 100644 index 0000000..df11f25 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/openinghours/INFO_HOTEL_CLOSING.java @@ -0,0 +1,25 @@ +package org.alexdev.havana.messages.outgoing.openinghours; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.time.Duration; + +public class INFO_HOTEL_CLOSING extends MessageComposer { + private Duration minutesUntil; + + public INFO_HOTEL_CLOSING(Duration minutesUntil) { + this.minutesUntil = minutesUntil; + } + + + @Override + public void compose(NettyResponse response) { + response.writeInt(Math.toIntExact(minutesUntil.toMinutes())); + } + + @Override + public short getHeader() { + return 291; // "Dc" + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/pets/NAMEAPPROVED.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/pets/NAMEAPPROVED.java new file mode 100644 index 0000000..e44c85c --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/pets/NAMEAPPROVED.java @@ -0,0 +1,22 @@ +package org.alexdev.havana.messages.outgoing.pets; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class NAMEAPPROVED extends MessageComposer { + private final int approveStatus; + + public NAMEAPPROVED(int approveStatus) { + this.approveStatus = approveStatus; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.approveStatus); + } + + @Override + public short getHeader() { + return 36; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/pets/PETSTAT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/pets/PETSTAT.java new file mode 100644 index 0000000..d07e0cd --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/pets/PETSTAT.java @@ -0,0 +1,29 @@ +package org.alexdev.havana.messages.outgoing.pets; + +import org.alexdev.havana.game.pets.Pet; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class PETSTAT extends MessageComposer { + private final Pet pet; + + public PETSTAT(Pet pet) { + this.pet = pet; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.pet.getRoomUser().getInstanceId()); + response.writeInt(this.pet.getAge()); + response.writeInt(this.pet.getHunger()); + response.writeInt(this.pet.getThirst()); + response.writeInt(this.pet.getHappiness()); + response.writeInt(this.pet.getDetails().getNatureNegative()); + response.writeInt(this.pet.getDetails().getNaturePositive()); + } + + @Override + public short getHeader() { + return 210; // "CR" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/purse/VOUCHER_REDEEM_ERROR.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/purse/VOUCHER_REDEEM_ERROR.java new file mode 100644 index 0000000..f64a215 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/purse/VOUCHER_REDEEM_ERROR.java @@ -0,0 +1,49 @@ +package org.alexdev.havana.messages.outgoing.purse; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class VOUCHER_REDEEM_ERROR extends MessageComposer { + public enum RedeemError { + TECHNICAL_ERROR(0), + INVALID(1), + PRODUCT_DELIVERY_FAILED(2), + WEB_ONLY(3); + + private int errorCode; + + RedeemError(int errorCode) { + this.errorCode = errorCode; + } + + public int getErrorCode() { + return this.errorCode; + } + } + + private final RedeemError error; + + public VOUCHER_REDEEM_ERROR(RedeemError error) { + this.error = error; + } + + @Override + public void compose(NettyResponse response) { + // if ERROR = 213 then + // me.getInterface().setVoucherInput(1) + // tDelim = the itemDelimiter + // the itemDelimiter = "\t" + // -- UNK_B0 257 + // tErrorCode = 1.getPropRef().getProp(#item, 1) + // the itemDelimiter = tDelim + // -- UNK_65 1 + // return(executeMessage(#alert, [#Msg:"purse_vouchers_error" & tErrorCode])) + // end if + response.writeString(this.error.getErrorCode()); + } + + @Override + public short getHeader() { + return 213; // "CU" + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/purse/VOUCHER_REDEEM_OK.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/purse/VOUCHER_REDEEM_OK.java new file mode 100644 index 0000000..a003fe4 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/purse/VOUCHER_REDEEM_OK.java @@ -0,0 +1,50 @@ +package org.alexdev.havana.messages.outgoing.purse; + +import org.alexdev.havana.game.catalogue.CatalogueItem; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.List; +import java.util.stream.Collectors; + +public class VOUCHER_REDEEM_OK extends MessageComposer { + private final List redeemableItems; + + public VOUCHER_REDEEM_OK(List redeemableItems) { + this.redeemableItems = redeemableItems; + } + + @Override + public void compose(NettyResponse response) { +// tProductName = tConn.GetStrFrom() +// if tProductName <> "" then +// tResultStr = getText("purse_vouchers_furni_success") & "\r" & "\r" +// repeat while tProductName <> "" +// tDescription = tConn.GetStrFrom() +// tResultStr = tResultStr & tProductName & "\r" +// tProductName = tConn.GetStrFrom() +// end repeat +// -- UNK_65 1 +// return(executeMessage(#alert, [#Msg:tResultStr])) +// else +// -- UNK_65 1 +// return(executeMessage(#alert, [#Msg:"purse_vouchers_success"])) +// end if + + if (this.redeemableItems != null && this.redeemableItems.size() > 0) { + if (this.redeemableItems.size() == 1) { + response.writeString(this.redeemableItems.get(0).getDefinition().getName()); + response.writeString(this.redeemableItems.get(0).getDefinition().getDescription()); + } else { + response.writeString(this.redeemableItems.stream().map(item -> item.getDefinition().getName()).collect(Collectors.joining(", " ))); + response.writeString(""); + } + } + } + + @Override + public short getHeader() { + return 212; // "CT" + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/ACTIVE_OBJECTS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/ACTIVE_OBJECTS.java new file mode 100644 index 0000000..ce43f37 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/ACTIVE_OBJECTS.java @@ -0,0 +1,29 @@ +package org.alexdev.havana.messages.outgoing.rooms; + +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.List; + +public class ACTIVE_OBJECTS extends MessageComposer { + private final List items; + + public ACTIVE_OBJECTS(Room room) { + this.items = room.getItemManager().getFloorItems(); + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.items.size()); + + for (Item item : this.items) { + item.serialise(response); + } + } + @Override + public short getHeader() { + return 32; // "@`" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/DOORBELL_WAIT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/DOORBELL_WAIT.java new file mode 100644 index 0000000..9f8d5eb --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/DOORBELL_WAIT.java @@ -0,0 +1,26 @@ +package org.alexdev.havana.messages.outgoing.rooms; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class DOORBELL_WAIT extends MessageComposer { + private final String username; + + public DOORBELL_WAIT() { + this.username = ""; + } + + public DOORBELL_WAIT(String username) { + this.username = username; + } + + @Override + public void compose(NettyResponse response) { + response.writeString(this.username); + } + + @Override + public short getHeader() { + return 91; // "A[" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/FLATNOTALLOWEDTOENTER.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/FLATNOTALLOWEDTOENTER.java new file mode 100644 index 0000000..d0ae6a5 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/FLATNOTALLOWEDTOENTER.java @@ -0,0 +1,16 @@ +package org.alexdev.havana.messages.outgoing.rooms; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class FLATNOTALLOWEDTOENTER extends MessageComposer { + @Override + public void compose(NettyResponse response) { + + } + + @Override + public short getHeader() { + return 131; // "BC" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/FLATPROPERTY.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/FLATPROPERTY.java new file mode 100644 index 0000000..4a0ee04 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/FLATPROPERTY.java @@ -0,0 +1,25 @@ +package org.alexdev.havana.messages.outgoing.rooms; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class FLATPROPERTY extends MessageComposer { + private final String property; + private final String value; + + public FLATPROPERTY(String property, Object value) { + this.property = property; + this.value = String.valueOf(value); + } + + @Override + public void compose(NettyResponse response) { + response.writeString(this.property); + response.writeString(this.value); + } + + @Override + public short getHeader() { + return 46; // "@n" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/FLAT_LETIN.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/FLAT_LETIN.java new file mode 100644 index 0000000..fb88076 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/FLAT_LETIN.java @@ -0,0 +1,16 @@ +package org.alexdev.havana.messages.outgoing.rooms; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class FLAT_LETIN extends MessageComposer { + @Override + public void compose(NettyResponse response) { + + } + + @Override + public short getHeader() { + return 41; // "@i" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/FLOOR_MAP.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/FLOOR_MAP.java new file mode 100644 index 0000000..e8a6fde --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/FLOOR_MAP.java @@ -0,0 +1,39 @@ +package org.alexdev.havana.messages.outgoing.rooms; + +import org.alexdev.havana.game.room.models.RoomModel; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class FLOOR_MAP extends MessageComposer { + private final RoomModel roomModel; + + public FLOOR_MAP(RoomModel roomModel) { + this.roomModel = roomModel; + } + + @Override + public void compose(NettyResponse response) { + String[] lines = roomModel.getHeightmap().split("\r"); + + for (int y = 0; y < roomModel.getMapSizeY(); y++) { + String line = lines[y]; + + for (int x = 0; x < roomModel.getMapSizeX(); x++) { + char tile = line.charAt(x); + + if (x == roomModel.getDoorLocation().getX() && y == roomModel.getDoorLocation().getY()) { + response.write((int) roomModel.getDoorLocation().getZ()); + } else { + response.write(tile); + } + } + + response.write((char)13); + } + } + + @Override + public short getHeader() { + return 470; // "GV" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/HEIGHTMAP.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/HEIGHTMAP.java new file mode 100644 index 0000000..edac32c --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/HEIGHTMAP.java @@ -0,0 +1,27 @@ +package org.alexdev.havana.messages.outgoing.rooms; + +import org.alexdev.havana.game.room.models.RoomModel; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class HEIGHTMAP extends MessageComposer { + private final String heightmap; + + public HEIGHTMAP(String heightmap) { + this.heightmap = heightmap; + } + + public HEIGHTMAP(RoomModel roomModel) { + this.heightmap = roomModel.getHeightmap(); + } + + @Override + public void compose(NettyResponse response) { + response.write(this.heightmap); + } + + @Override + public short getHeader() { + return 31; // "@_" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/HEIGHTMAP_UPDATE.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/HEIGHTMAP_UPDATE.java new file mode 100644 index 0000000..34b5652 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/HEIGHTMAP_UPDATE.java @@ -0,0 +1,64 @@ +package org.alexdev.havana.messages.outgoing.rooms; + +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.models.RoomModel; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class HEIGHTMAP_UPDATE extends MessageComposer { + private final String heightmap; + + public HEIGHTMAP_UPDATE(Room room, RoomModel roomModel) { + String[] lines = roomModel.getHeightmap().split("\r"); + + StringBuilder updateMap = new StringBuilder(); + + for (int y = 0; y < roomModel.getMapSizeY(); y++) { + String line = lines[y]; + + for (int x = 0; x < roomModel.getMapSizeX(); x++) { + char tile = line.charAt(x); + + if (Character.isDigit(tile)) { + var roomTile = room.getMapping().getTile(x, y); + + if (roomTile == null) { + continue; + } + + int height = (int) Math.round(roomTile.getWalkingHeight());//Character.getNumericValue(tile); + + if (height < 0 || height > 8) { + height = 0; + } + + /*if (room.getMapping().getTile(x, y).getHighestItem() != null && + room.getMapping().getTile(x, y).getHighestItem().hasBehaviour(ItemBehaviour.CAN_STACK_ON_TOP)) { + //char updateChar = (char) (height + 65); + updateMap.append(height); + } else { +*/ + //char updateChar = (char) (height + 65); + updateMap.append(height); + // } + } else { + updateMap.append("x"); + } + } + + updateMap.append("\r"); + } + + this.heightmap = updateMap.toString(); + } + + @Override + public void compose(NettyResponse response) { + response.writeString(this.heightmap); + } + + @Override + public short getHeader() { + return 219; // "@_" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/INTERSITIALDATA.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/INTERSITIALDATA.java new file mode 100644 index 0000000..98d808b --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/INTERSITIALDATA.java @@ -0,0 +1,25 @@ +package org.alexdev.havana.messages.outgoing.rooms; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class INTERSITIALDATA extends MessageComposer { + private final String image; + private final String url; + + public INTERSITIALDATA(String image, String url) { + this.image = image; + this.url = url; + } + + @Override + public void compose(NettyResponse response) { + response.writeString(this.image); + response.writeString(this.url); + } + + @Override + public short getHeader() { + return 258; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/ITEMS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/ITEMS.java new file mode 100644 index 0000000..5123cd8 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/ITEMS.java @@ -0,0 +1,29 @@ +package org.alexdev.havana.messages.outgoing.rooms; + +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.List; + +public class ITEMS extends MessageComposer { + private final List items; + + public ITEMS(Room room) { + this.items = room.getItemManager().getWallItems(); + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.items.size()); + + for (Item item : this.items) { + item.serialise(response); + } + } + @Override + public short getHeader() { + return 45; // "@m" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/OBJECTS_WORLD.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/OBJECTS_WORLD.java new file mode 100644 index 0000000..5a611fa --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/OBJECTS_WORLD.java @@ -0,0 +1,60 @@ +package org.alexdev.havana.messages.outgoing.rooms; + +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.List; +import java.util.UUID; + +public class OBJECTS_WORLD extends MessageComposer { + private List items; + private String[] data; + + public OBJECTS_WORLD(List items) { + this.items = items; + } + + public OBJECTS_WORLD(String old) { + this.data = old.split("\r"); + } + + @Override + public void compose(NettyResponse response) { + if (items != null) { + response.writeInt(this.items.size()); + + for (Item item : this.items) { + item.serialise(response); + } + } + else { + response.writeInt(this.data.length); + + for (String entry : data) { + response.writeBool(false); + response.writeString(UUID.randomUUID().toString().split("-")[0]); + response.writeString(entry.split(" ")[1]); + + response.writeInt(Integer.parseInt(entry.split(" ")[2])); + response.writeInt(Integer.parseInt(entry.split(" ")[3])); + response.writeInt(Integer.parseInt(entry.split(" ")[4])); + response.writeInt(Integer.parseInt(entry.split(" ")[5])); + } + } + /* response.writeInt(hasDimensions ? 1 : 0); + response.writeString(this.customData); + response.writeString(definition.getSprite()); + response.writeInt(this.position.getX()); + response.writeInt(this.position.getY()); + response.writeInt((int) this.position.getZ()); + + if (!hasDimensions) { + response.writeInt(this.position.getRotation());*/ + } + + @Override + public short getHeader() { + return 30; // "@^" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/OPEN_CONNECTION.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/OPEN_CONNECTION.java new file mode 100644 index 0000000..83a71d2 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/OPEN_CONNECTION.java @@ -0,0 +1,16 @@ +package org.alexdev.havana.messages.outgoing.rooms; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class OPEN_CONNECTION extends MessageComposer { + @Override + public void compose(NettyResponse response) { + + } + + @Override + public short getHeader() { + return 19; // "@S" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/ROOMAD.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/ROOMAD.java new file mode 100644 index 0000000..9b6723e --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/ROOMAD.java @@ -0,0 +1,30 @@ +package org.alexdev.havana.messages.outgoing.rooms; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class ROOMAD extends MessageComposer { + private final String image; + private final String url; + + public ROOMAD(String image, String url) { + this.image = image; + this.url = url; + + } + + @Override + public void compose(NettyResponse response) { + if (this.image != null) { + response.writeString(this.image); + response.writeString(this.url); + } else { + response.writeString(""); + } + } + + @Override + public short getHeader() { + return 208; // "CP" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/ROOM_AD.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/ROOM_AD.java new file mode 100644 index 0000000..e7f7492 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/ROOM_AD.java @@ -0,0 +1,16 @@ +package org.alexdev.havana.messages.outgoing.rooms; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class ROOM_AD extends MessageComposer { + @Override + public void compose(NettyResponse response) { + response.write(0); + } + + @Override + public short getHeader() { + return 208; // "CP" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/ROOM_READY.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/ROOM_READY.java new file mode 100644 index 0000000..54adbba --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/ROOM_READY.java @@ -0,0 +1,25 @@ +package org.alexdev.havana.messages.outgoing.rooms; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class ROOM_READY extends MessageComposer { + private final int roomId; + private final String model; + + public ROOM_READY(int roomId, String model) { + this.roomId = roomId; + this.model = model; + } + + @Override + public void compose(NettyResponse response) { + response.writeString(this.model); + response.writeInt(this.roomId); + } + + @Override + public short getHeader() { + return 69; // "AE" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/ROOM_URL.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/ROOM_URL.java new file mode 100644 index 0000000..d13c704 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/ROOM_URL.java @@ -0,0 +1,17 @@ +package org.alexdev.havana.messages.outgoing.rooms; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class ROOM_URL extends MessageComposer { + + @Override + public void compose(NettyResponse response) { + response.writeString("/client/"); + } + + @Override + public short getHeader() { + return 166; // "Bf" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/UPDATE_VOTES.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/UPDATE_VOTES.java new file mode 100644 index 0000000..a10c2c4 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/UPDATE_VOTES.java @@ -0,0 +1,22 @@ +package org.alexdev.havana.messages.outgoing.rooms; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class UPDATE_VOTES extends MessageComposer { + private final int rating; + + public UPDATE_VOTES(int rating) { + this.rating = rating; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.rating); + } + + @Override + public short getHeader() { + return 345; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/dimmer/MOODLIGHT_PRESETS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/dimmer/MOODLIGHT_PRESETS.java new file mode 100644 index 0000000..d182c19 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/dimmer/MOODLIGHT_PRESETS.java @@ -0,0 +1,38 @@ +package org.alexdev.havana.messages.outgoing.rooms.dimmer; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.List; + +public class MOODLIGHT_PRESETS extends MessageComposer { + private final int currentPreset; + private final List presets; + + public MOODLIGHT_PRESETS(int currentPreset, List presets) { + this.currentPreset = currentPreset; + this.presets = presets; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.presets.size()); + response.writeInt(this.currentPreset); + + int i = 1; + for (String preset : this.presets) { + String[] presetData = preset.split(","); + + response.writeInt(i); + response.writeInt(Integer.parseInt(presetData[0])); + response.writeString(presetData[1].replace("#", "")); + response.writeInt(Integer.parseInt(presetData[2])); + i++; + } + } + + @Override + public short getHeader() { + return 365; // "Em" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/games/CLOSEGAMEBOARD.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/games/CLOSEGAMEBOARD.java new file mode 100644 index 0000000..de7feb9 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/games/CLOSEGAMEBOARD.java @@ -0,0 +1,26 @@ +package org.alexdev.havana.messages.outgoing.rooms.games; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class CLOSEGAMEBOARD extends MessageComposer { + private final String gameId; + private final String type; + + public CLOSEGAMEBOARD(String gameId, String type) { + this.gameId = gameId; + this.type = type; + } + + @Override + public void compose(NettyResponse response) { + response.write(this.gameId, (char)9); + response.write(this.type, (char)9); + //response.write("xo", (char)9); + } + + @Override + public short getHeader() { + return 146; // "BQ" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/games/ITEMMSG.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/games/ITEMMSG.java new file mode 100644 index 0000000..76ab3e7 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/games/ITEMMSG.java @@ -0,0 +1,22 @@ +package org.alexdev.havana.messages.outgoing.rooms.games; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class ITEMMSG extends MessageComposer { + private final String[] commands; + + public ITEMMSG(String[] commands) { + this.commands = commands; + } + + @Override + public void compose(NettyResponse response) { + response.write(String.join(Character.toString((char)13), this.commands)); + } + + @Override + public short getHeader() { + return 144; // "BP" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/games/OPENGAMEBOARD.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/games/OPENGAMEBOARD.java new file mode 100644 index 0000000..3cd0dd9 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/games/OPENGAMEBOARD.java @@ -0,0 +1,26 @@ +package org.alexdev.havana.messages.outgoing.rooms.games; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class OPENGAMEBOARD extends MessageComposer { + private final String gameId; + private final String type; + + public OPENGAMEBOARD(String gameId, String type) { + this.gameId = gameId; + this.type = type; + } + + @Override + public void compose(NettyResponse response) { + response.write(this.gameId, (char)9); + response.write(this.type, (char)9); + //response.write("xo", (char)9); + } + + @Override + public short getHeader() { + return 145; // "BQ" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/groups/GROUP_BADGES.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/groups/GROUP_BADGES.java new file mode 100644 index 0000000..8978639 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/groups/GROUP_BADGES.java @@ -0,0 +1,29 @@ +package org.alexdev.havana.messages.outgoing.rooms.groups; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.HashMap; + +public class GROUP_BADGES extends MessageComposer { + private final HashMap groupBadges; + + public GROUP_BADGES(HashMap groupBadges) { + this.groupBadges = groupBadges; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.groupBadges.size()); + + for (var entry : this.groupBadges.entrySet()) { + response.writeInt(entry.getKey()); + response.writeString(entry.getValue()); + } + } + + @Override + public short getHeader() { + return 309; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/groups/GROUP_INFO.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/groups/GROUP_INFO.java new file mode 100644 index 0000000..6c39691 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/groups/GROUP_INFO.java @@ -0,0 +1,36 @@ +package org.alexdev.havana.messages.outgoing.rooms.groups; + +import org.alexdev.havana.game.groups.Group; +import org.alexdev.havana.game.room.RoomManager; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class GROUP_INFO extends MessageComposer { + private final Group group; + + public GROUP_INFO(Group group) { + this.group = group; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.group.getId()); + response.writeString(this.group.getName()); + response.writeString(this.group.getDescription()); + + var room = RoomManager.getInstance().getRoomById(this.group.getRoomId()); + + if (this.group.getRoomId() > 0 && room != null) { + response.writeInt(this.group.getRoomId()); + response.writeString(room.getData().getName()); + } else { + response.writeInt(-1); + response.writeString(""); + } + } + + @Override + public short getHeader() { + return 311; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/groups/GROUP_MEMBERSHIP_UPDATE.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/groups/GROUP_MEMBERSHIP_UPDATE.java new file mode 100644 index 0000000..89b6a0a --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/groups/GROUP_MEMBERSHIP_UPDATE.java @@ -0,0 +1,28 @@ +package org.alexdev.havana.messages.outgoing.rooms.groups; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class GROUP_MEMBERSHIP_UPDATE extends MessageComposer { + private final int instanceId; + private final int groupId; + private final int rankId; + + public GROUP_MEMBERSHIP_UPDATE(int instanceId, int groupId, int rankId) { + this.instanceId = instanceId; + this.groupId = groupId; + this.rankId = rankId; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.instanceId); + response.writeInt(this.groupId); + response.writeInt(this.rankId); + } + + @Override + public short getHeader() { + return 310; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/BROADCAST_TELEPORTER.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/BROADCAST_TELEPORTER.java new file mode 100644 index 0000000..55b3868 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/BROADCAST_TELEPORTER.java @@ -0,0 +1,32 @@ +package org.alexdev.havana.messages.outgoing.rooms.items; + +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class BROADCAST_TELEPORTER extends MessageComposer { + private final Item item; + private final String name; + private final boolean disappearUser; + + public BROADCAST_TELEPORTER(Item item, String name, boolean disappearUser) { + this.item = item; + this.name = name; + this.disappearUser = disappearUser; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.item.getVirtualId()); + response.writeString(this.name); + } + + @Override + public short getHeader() { + if (this.disappearUser) { + return 89; // "AY" + } else { + return 92; // "A\" + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/CANNOT_PLACE_STUFF_FROM_STRIP.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/CANNOT_PLACE_STUFF_FROM_STRIP.java new file mode 100644 index 0000000..3039088 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/CANNOT_PLACE_STUFF_FROM_STRIP.java @@ -0,0 +1,22 @@ +package org.alexdev.havana.messages.outgoing.rooms.items; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class CANNOT_PLACE_STUFF_FROM_STRIP extends MessageComposer { + private final int reasonCode; + + public CANNOT_PLACE_STUFF_FROM_STRIP(int reasonCode) { + this.reasonCode = reasonCode; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.reasonCode); + } + + @Override + public short getHeader() { + return 516; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/CHANGESTATUS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/CHANGESTATUS.java new file mode 100644 index 0000000..8612a32 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/CHANGESTATUS.java @@ -0,0 +1,25 @@ +package org.alexdev.havana.messages.outgoing.rooms.items; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class CHANGESTATUS extends MessageComposer { + private final int status; + private final int itemId; + + public CHANGESTATUS(int itemId, int status) { + this.itemId = itemId; + this.status = status; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.itemId); + response.writeInt(this.status); + } + + @Override + public short getHeader() { + return 312; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/DICE_VALUE.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/DICE_VALUE.java new file mode 100644 index 0000000..b3cb4f2 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/DICE_VALUE.java @@ -0,0 +1,35 @@ +package org.alexdev.havana.messages.outgoing.rooms.items; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class DICE_VALUE extends MessageComposer { + private final int itemId; + private final boolean spin; + private final int randomNumber; + + public DICE_VALUE(int itemId, boolean spin, int randomNumber) { + this.itemId = itemId; + this.spin = spin; + this.randomNumber = randomNumber; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.itemId); + response.writeInt(this.randomNumber); + /* (!this.spin) { + if (this.randomNumber > 0) { + response.writeInt((this.itemId * 38) + this.randomNumber); + } else { + response.writeInt(this.itemId * 38); + } + }*/ + } + + @Override + public short getHeader() { + return 90; // "AZ" + } +} + diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/IDATA.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/IDATA.java new file mode 100644 index 0000000..1d17929 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/IDATA.java @@ -0,0 +1,40 @@ +package org.alexdev.havana.messages.outgoing.rooms.items; + +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class IDATA extends MessageComposer { + private String colour; + private String text; + private Item item; + + public IDATA(Item item, String colour, String text) { + this.item = item; + this.colour = colour; + this.text = text; + } + + public IDATA(Item item) { + this.item = item; + } + + @Override + public void compose(NettyResponse response) { + response.writeString(this.item.getVirtualId()); + + if (this.item.hasBehaviour(ItemBehaviour.POST_IT)) { + response.write(this.colour, ' '); + response.writeString(this.text); + } else { + response.writeString(Long.toString(item.getVirtualId()) + " " + item.getCustomData()); + } + } + + @Override + public short getHeader() { + return 48; // "@p" + } +} + diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/ITEM_DELIVERED.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/ITEM_DELIVERED.java new file mode 100644 index 0000000..34e3d84 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/ITEM_DELIVERED.java @@ -0,0 +1,16 @@ +package org.alexdev.havana.messages.outgoing.rooms.items; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class ITEM_DELIVERED extends MessageComposer { + @Override + public void compose(NettyResponse response) { + + } + + @Override + public short getHeader() { + return 67; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/JUDGE_GUI_STATUS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/JUDGE_GUI_STATUS.java new file mode 100644 index 0000000..861f27b --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/JUDGE_GUI_STATUS.java @@ -0,0 +1,27 @@ +package org.alexdev.havana.messages.outgoing.rooms.items; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class JUDGE_GUI_STATUS extends MessageComposer { + private final int status; + private final int userId; + + public JUDGE_GUI_STATUS(int status, int userId) { + this.status = status; + this.userId = userId; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.status); + + if (this.status == 2) + response.writeInt(this.userId); + } + + @Override + public short getHeader() { + return 490; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/MOVE_FLOORITEM.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/MOVE_FLOORITEM.java new file mode 100644 index 0000000..76f3ce2 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/MOVE_FLOORITEM.java @@ -0,0 +1,23 @@ +package org.alexdev.havana.messages.outgoing.rooms.items; + +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class MOVE_FLOORITEM extends MessageComposer { + private final Item item; + + public MOVE_FLOORITEM(Item item) { + this.item = item; + } + + @Override + public void compose(NettyResponse response) { + this.item.serialise(response); + } + + @Override + public short getHeader() { + return 95; // "A_ + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/PLACE_FLOORITEM.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/PLACE_FLOORITEM.java new file mode 100644 index 0000000..5929518 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/PLACE_FLOORITEM.java @@ -0,0 +1,23 @@ +package org.alexdev.havana.messages.outgoing.rooms.items; + +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class PLACE_FLOORITEM extends MessageComposer { + private final Item item; + + public PLACE_FLOORITEM(Item item) { + this.item = item; + } + + @Override + public void compose(NettyResponse response) { + this.item.serialise(response); + } + + @Override + public short getHeader() { + return 93; // "A]" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/PLACE_WALLITEM.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/PLACE_WALLITEM.java new file mode 100644 index 0000000..84c42a7 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/PLACE_WALLITEM.java @@ -0,0 +1,23 @@ +package org.alexdev.havana.messages.outgoing.rooms.items; + +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class PLACE_WALLITEM extends MessageComposer { + private final Item item; + + public PLACE_WALLITEM(Item item) { + this.item = item; + } + + @Override + public void compose(NettyResponse response) { + this.item.serialise(response); + } + + @Override + public short getHeader() { + return 83; // "AS" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/REMOVE_FLOORITEM.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/REMOVE_FLOORITEM.java new file mode 100644 index 0000000..9d1419d --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/REMOVE_FLOORITEM.java @@ -0,0 +1,23 @@ +package org.alexdev.havana.messages.outgoing.rooms.items; + +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class REMOVE_FLOORITEM extends MessageComposer { + private final Item item; + + public REMOVE_FLOORITEM(Item item) { + this.item = item; + } + + @Override + public void compose(NettyResponse response) { + response.writeString(this.item.getVirtualId()); + } + + @Override + public short getHeader() { + return 94; // "A^" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/REMOVE_WALLITEM.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/REMOVE_WALLITEM.java new file mode 100644 index 0000000..cc43503 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/REMOVE_WALLITEM.java @@ -0,0 +1,23 @@ +package org.alexdev.havana.messages.outgoing.rooms.items; + +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class REMOVE_WALLITEM extends MessageComposer { + private final Item item; + + public REMOVE_WALLITEM(Item item) { + this.item = item; + } + + @Override + public void compose(NettyResponse response) { + response.writeString(this.item.getVirtualId()); + } + + @Override + public short getHeader() { + return 84; // "AT" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/SHOWPROGRAM.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/SHOWPROGRAM.java new file mode 100644 index 0000000..d0303df --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/SHOWPROGRAM.java @@ -0,0 +1,21 @@ +package org.alexdev.havana.messages.outgoing.rooms.items; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class SHOWPROGRAM extends MessageComposer { + private final String[] arguments; + public SHOWPROGRAM(String[] arguments) { + this.arguments = arguments; + } + + @Override + public void compose(NettyResponse response) { + response.write(String.join(" ", this.arguments)); + } + + @Override + public short getHeader() { + return 71; // "AG" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/SLIDEOBJECTBUNDLE.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/SLIDEOBJECTBUNDLE.java new file mode 100644 index 0000000..04beec5 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/SLIDEOBJECTBUNDLE.java @@ -0,0 +1,56 @@ +package org.alexdev.havana.messages.outgoing.rooms.items; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.roller.RollingData; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; +import org.alexdev.havana.util.StringUtil; + +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +public class SLIDEOBJECTBUNDLE extends MessageComposer { + private Item roller; + private List rollingItems; + private RollingData rollingEntity; + + public SLIDEOBJECTBUNDLE(Item roller, List rollingItems, RollingData rollingEntity) { + this.roller = roller; + this.rollingItems = rollingItems; + this.rollingEntity = rollingEntity; + } + + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.roller.getPosition().getX()); + response.writeInt(this.roller.getPosition().getY()); + response.writeInt(this.roller.getPosition().getSquareInFront().getX()); + response.writeInt(this.roller.getPosition().getSquareInFront().getY()); + response.writeInt(this.rollingItems.size()); + + for (RollingData item : this.rollingItems) { + response.writeInt(item.getItem().getVirtualId()); + response.writeString(StringUtil.format(item.getFromPosition().getZ())); + response.writeString(StringUtil.format(item.getNextPosition().getZ())); + } + + boolean hasEntity = this.rollingEntity != null && this.rollingEntity.getEntity().getRoomUser().getRoom() != null; + + response.writeInt(this.roller.getVirtualId()); + response.writeInt(hasEntity ? 2 : 0); + + if (hasEntity) { + response.writeInt(this.rollingEntity.getEntity().getRoomUser().getInstanceId()); + response.writeString(StringUtil.format(this.rollingEntity.getFromPosition().getZ())); + response.writeString(StringUtil.format(this.rollingEntity.getDisplayHeight())); + } + } + + @Override + public short getHeader() { + return 230; // "Cf" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/STUFFDATAUPDATE.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/STUFFDATAUPDATE.java new file mode 100644 index 0000000..9a7fe60 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/STUFFDATAUPDATE.java @@ -0,0 +1,33 @@ +package org.alexdev.havana.messages.outgoing.rooms.items; + +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class STUFFDATAUPDATE extends MessageComposer { + private final Item item; + + public STUFFDATAUPDATE(Item item) { + this.item = item; + } + + @Override + public void compose(NettyResponse response) { + if (this.item.hasBehaviour(ItemBehaviour.WALL_ITEM)) { + this.item.serialise(response); + } else { + response.writeString(this.item.getVirtualId()); + response.writeString(this.item.getCustomData()); + } + } + + @Override + public short getHeader() { + if (this.item.hasBehaviour(ItemBehaviour.WALL_ITEM)) { + return 85; // "AU" + } else { + return 88; // "AX" + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/TELEPORTER_INIT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/TELEPORTER_INIT.java new file mode 100644 index 0000000..1cf57a2 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/items/TELEPORTER_INIT.java @@ -0,0 +1,25 @@ +package org.alexdev.havana.messages.outgoing.rooms.items; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class TELEPORTER_INIT extends MessageComposer { + private final int teleporterId; + private final int roomId; + + public TELEPORTER_INIT(int teleporterId, int roomId) { + this.teleporterId = teleporterId; + this.roomId = roomId; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.teleporterId); + response.writeInt(this.roomId); + } + + @Override + public short getHeader() { + return 62; // "@~" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/moderation/YOUARECONTROLLER.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/moderation/YOUARECONTROLLER.java new file mode 100644 index 0000000..829fc7c --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/moderation/YOUARECONTROLLER.java @@ -0,0 +1,16 @@ +package org.alexdev.havana.messages.outgoing.rooms.moderation; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class YOUARECONTROLLER extends MessageComposer { + @Override + public void compose(NettyResponse response) { + + } + + @Override + public short getHeader() { + return 42; // "@j" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/moderation/YOUAROWNER.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/moderation/YOUAROWNER.java new file mode 100644 index 0000000..d97aaa3 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/moderation/YOUAROWNER.java @@ -0,0 +1,16 @@ +package org.alexdev.havana.messages.outgoing.rooms.moderation; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class YOUAROWNER extends MessageComposer { + @Override + public void compose(NettyResponse response) { + + } + + @Override + public short getHeader() { + return 47; // "@o" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/moderation/YOUNOTCONTROLLER.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/moderation/YOUNOTCONTROLLER.java new file mode 100644 index 0000000..10db4d0 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/moderation/YOUNOTCONTROLLER.java @@ -0,0 +1,16 @@ +package org.alexdev.havana.messages.outgoing.rooms.moderation; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class YOUNOTCONTROLLER extends MessageComposer { + @Override + public void compose(NettyResponse response) { + + } + + @Override + public short getHeader() { + return 43; // "@k" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/pool/JUMPDATA.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/pool/JUMPDATA.java new file mode 100644 index 0000000..12719a3 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/pool/JUMPDATA.java @@ -0,0 +1,25 @@ +package org.alexdev.havana.messages.outgoing.rooms.pool; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class JUMPDATA extends MessageComposer { + private final int instanceId; + private final String divingHandle; + + public JUMPDATA(int instanceId, String divingHandle) { + this.instanceId = instanceId; + this.divingHandle = divingHandle; + } + + @Override + public void compose(NettyResponse response) { + response.write(this.instanceId, (char)13); + response.write(this.divingHandle); + } + + @Override + public short getHeader() { + return 74; // "AJ" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/pool/JUMPINGPLACE_OK.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/pool/JUMPINGPLACE_OK.java new file mode 100644 index 0000000..5796ac3 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/pool/JUMPINGPLACE_OK.java @@ -0,0 +1,16 @@ +package org.alexdev.havana.messages.outgoing.rooms.pool; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class JUMPINGPLACE_OK extends MessageComposer { + @Override + public void compose(NettyResponse response) { + + } + + @Override + public short getHeader() { + return 125; // "A}" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/pool/OPEN_UIMAKOPPI.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/pool/OPEN_UIMAKOPPI.java new file mode 100644 index 0000000..01d7690 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/pool/OPEN_UIMAKOPPI.java @@ -0,0 +1,17 @@ +package org.alexdev.havana.messages.outgoing.rooms.pool; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class OPEN_UIMAKOPPI extends MessageComposer { + + @Override + public void compose(NettyResponse response) { + + } + + @Override + public short getHeader() { + return 96; // "A`" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/settings/FLATCAT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/settings/FLATCAT.java new file mode 100644 index 0000000..97a9e74 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/settings/FLATCAT.java @@ -0,0 +1,25 @@ +package org.alexdev.havana.messages.outgoing.rooms.settings; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class FLATCAT extends MessageComposer { + private final int roomId; + private final int categoryId; + + public FLATCAT(int roomId, int categoryId) { + this.roomId = roomId; + this.categoryId = categoryId; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.roomId); + response.writeInt(this.categoryId); + } + + @Override + public short getHeader() { + return 222; // "C^" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/settings/FLATINFO.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/settings/FLATINFO.java new file mode 100644 index 0000000..68bfb1c --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/settings/FLATINFO.java @@ -0,0 +1,46 @@ +package org.alexdev.havana.messages.outgoing.rooms.settings; + +import org.alexdev.havana.game.fuserights.Fuseright; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class FLATINFO extends MessageComposer { + private final boolean overrideLock; + private Player player; + private Room room; + + public FLATINFO(Player player, Room room, boolean overrideLock) { + this.player = player; + this.room = room; + this.overrideLock = overrideLock; + } + + @Override + public void compose(NettyResponse response) { + response.writeBool(this.room.getData().allowSuperUsers()); + response.writeInt(this.overrideLock ? 0 : this.room.getData().getAccessTypeId()); + response.writeInt(this.room.getId()); + + if (this.room.isOwner(player.getDetails().getId())|| this.room.getData().showOwnerName() || this.player.hasFuse(Fuseright.SEE_ALL_ROOMOWNERS)) { + response.writeString(this.room.getData().getOwnerName()); + } else { + response.writeString("-"); + } + + response.writeString(this.room.getModel().getName()); // Is called "marker" in Lingo code + response.writeString(this.room.getData().getName()); + response.writeString(this.room.getData().getDescription()); + response.writeBool(this.room.getData().showOwnerName()); + response.writeBool(this.room.getCategory().hasAllowTrading()); // Allow trading + response.writeInt(this.room.getData().getVisitorsNow()); + response.writeInt(this.room.getData().getVisitorsMax()); + } + + @Override + public short getHeader() { + return 54; // "@v" + } +} + diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/settings/GOTO_FLAT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/settings/GOTO_FLAT.java new file mode 100644 index 0000000..c22a1c5 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/settings/GOTO_FLAT.java @@ -0,0 +1,25 @@ +package org.alexdev.havana.messages.outgoing.rooms.settings; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class GOTO_FLAT extends MessageComposer { + private final int roomId; + private final String roomName; + + public GOTO_FLAT(int roomId, String roomName) { + this.roomId = roomId; + this.roomName = roomName; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.roomId); + response.writeString(this.roomName); + } + + @Override + public short getHeader() { + return 59; // "@{" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/CHAT_MESSAGE.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/CHAT_MESSAGE.java new file mode 100644 index 0000000..710a2a8 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/CHAT_MESSAGE.java @@ -0,0 +1,54 @@ +package org.alexdev.havana.messages.outgoing.rooms.user; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class CHAT_MESSAGE extends MessageComposer { + public enum ChatMessageType { + CHAT (24), // @X + SHOUT (26), // @Z + WHISPER (25); // @Y + + private final short header; + + ChatMessageType(int header) { + this.header = (short) header; + } + + public short getHeader() { + return header; + } + } + + private final ChatMessageType type; + private final int instanceId; + private String message; + private final int gestureId; + + public CHAT_MESSAGE(ChatMessageType type, int instanceId, String message, int gestureId) { + this.type = type; + this.instanceId = instanceId; + this.message = message; + this.gestureId = gestureId; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.instanceId); + response.writeString(this.message); + response.writeInt(this.gestureId); + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + @Override + public short getHeader() { + return this.type.getHeader(); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/FIGURE_CHANGE.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/FIGURE_CHANGE.java new file mode 100644 index 0000000..53dfd35 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/FIGURE_CHANGE.java @@ -0,0 +1,28 @@ +package org.alexdev.havana.messages.outgoing.rooms.user; + +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class FIGURE_CHANGE extends MessageComposer { + private final int instanceId; + private final PlayerDetails details; + + public FIGURE_CHANGE(int instanceId, PlayerDetails details) { + this.instanceId = instanceId; + this.details = details; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.instanceId); + response.writeString(this.details.getFigure()); + response.writeString(this.details.getSex()); + response.writeString(this.details.getMotto()); + } + + @Override + public short getHeader() { + return 266; // "DJ" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/HOTEL_VIEW.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/HOTEL_VIEW.java new file mode 100644 index 0000000..9416178 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/HOTEL_VIEW.java @@ -0,0 +1,16 @@ +package org.alexdev.havana.messages.outgoing.rooms.user; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class HOTEL_VIEW extends MessageComposer { + @Override + public void compose(NettyResponse response) { + + } + + @Override + public short getHeader() { + return 18; // "@R" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/LOGOUT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/LOGOUT.java new file mode 100644 index 0000000..dd7c7fc --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/LOGOUT.java @@ -0,0 +1,22 @@ +package org.alexdev.havana.messages.outgoing.rooms.user; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class LOGOUT extends MessageComposer { + private final int instanceId; + + public LOGOUT(int instanceId) { + this.instanceId = instanceId; + } + + @Override + public void compose(NettyResponse response) { + response.writeString(this.instanceId); + } + + @Override + public short getHeader() { + return 29; // "@] + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/RESPECT_NOTIFICATION.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/RESPECT_NOTIFICATION.java new file mode 100644 index 0000000..2225e89 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/RESPECT_NOTIFICATION.java @@ -0,0 +1,25 @@ +package org.alexdev.havana.messages.outgoing.rooms.user; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class RESPECT_NOTIFICATION extends MessageComposer { + private final int userId; + private final int respectPoints; + + public RESPECT_NOTIFICATION(int userId, int respectPoints) { + this.userId = userId; + this.respectPoints = respectPoints; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.userId); + response.writeInt(this.respectPoints); + } + + @Override + public short getHeader() { + return 440; // "Fx" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/TAG_LIST.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/TAG_LIST.java new file mode 100644 index 0000000..3338ef2 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/TAG_LIST.java @@ -0,0 +1,31 @@ +package org.alexdev.havana.messages.outgoing.rooms.user; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.List; + +public class TAG_LIST extends MessageComposer { + private final List tags; + private final int userId; + + public TAG_LIST(int userId, List tags) { + this.userId = userId; + this.tags = tags; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.userId); + response.writeInt(this.tags.size()); + + for (String tag : this.tags) { + response.writeString(tag); + } + } + + @Override + public short getHeader() { + return 350; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/TYPING_STATUS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/TYPING_STATUS.java new file mode 100644 index 0000000..4fe043b --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/TYPING_STATUS.java @@ -0,0 +1,25 @@ +package org.alexdev.havana.messages.outgoing.rooms.user; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class TYPING_STATUS extends MessageComposer { + private final int instanceId; + private final boolean typing; + + public TYPING_STATUS(int instanceId, boolean typing) { + this.instanceId = instanceId; + this.typing = typing; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.instanceId); + response.writeBool(this.typing); + } + + @Override + public short getHeader() { + return 361; // "Ei" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/USER_CARRY_OBJECT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/USER_CARRY_OBJECT.java new file mode 100644 index 0000000..b462d34 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/USER_CARRY_OBJECT.java @@ -0,0 +1,28 @@ +package org.alexdev.havana.messages.outgoing.rooms.user; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class USER_CARRY_OBJECT extends MessageComposer { + private final int userId; + private final int carryId; + private final String carryName; + + public USER_CARRY_OBJECT(int userId, int carryId, String carryName) { + this.userId = userId; + this.carryId = carryId; + this.carryName = carryName; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.userId); + response.writeInt(this.carryId); + response.writeString(this.carryName); + } + + @Override + public short getHeader() { + return 482; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/USER_DANCE.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/USER_DANCE.java new file mode 100644 index 0000000..b6114e0 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/USER_DANCE.java @@ -0,0 +1,26 @@ +package org.alexdev.havana.messages.outgoing.rooms.user; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class USER_DANCE extends MessageComposer { + private final int instanceId; + private final int danceId; + + public USER_DANCE(int instanceId, int danceId) { + this.instanceId = instanceId; + this.danceId = danceId; + } + + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.instanceId); + response.writeInt(this.danceId); + } + + @Override + public short getHeader() { + return 480; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/USER_OBJECTS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/USER_OBJECTS.java new file mode 100644 index 0000000..e6b7499 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/USER_OBJECTS.java @@ -0,0 +1,131 @@ +package org.alexdev.havana.messages.outgoing.rooms.user; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityState; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.statistics.PlayerStatistic; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; +import org.alexdev.havana.util.StringUtil; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ConcurrentLinkedQueue; + +public class USER_OBJECTS extends MessageComposer { + private List states; + + public USER_OBJECTS(ConcurrentLinkedQueue entities) { + createEntityStates(new ArrayList<>(entities)); + } + + public USER_OBJECTS(List users) { + createEntityStates(users); + } + + public USER_OBJECTS(Entity entity) { + createEntityStates(List.of(entity)); + } + + private void createEntityStates(List entities) { + this.states = new ArrayList<>(); + + for (Entity user : entities) { + this.states.add(new EntityState( + user.getDetails().getId(), + user.getRoomUser().getInstanceId(), + user.getType(), + user.getDetails(), + user.getRoomUser().getRoom(), + user.getRoomUser().getPosition().copy(), + user.getRoomUser().getStatuses(), + user)); + } + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.states.size()); + + for (EntityState states : states) { + response.writeInt(states.getEntityId()); + response.writeString(states.getDetails().getName()); + response.writeString(states.getDetails().getMotto() + " "); + response.writeString(states.getDetails().getFigure()); + response.writeInt(states.getInstanceId()); + response.writeInt(states.getPosition().getX()); + response.writeInt(states.getPosition().getY()); + response.writeString(StringUtil.format(states.getPosition().getZ())); + response.writeInt(states.getPosition().getRotation()); + + response.writeInt(states.getEntityType().getTypeId()); // TODO: Types + + if (states.getEntityType() == EntityType.PLAYER) { + Player player = (Player) states.getEntity(); + int xp = player.getStatisticManager().getIntValue(PlayerStatistic.XP_EARNED_MONTH); + + response.writeString(states.getDetails().getSex().toUpperCase()); + response.writeInt(xp == 0 ? -1 : xp); + + if (states.getGroupMember() != null) { + response.writeInt(states.getGroupMember().getGroupId()); // Group id + response.writeInt(states.getGroupMember().getMemberRank().getClientRank()); // Group status + } else { + response.writeInt(-1); // Group id + response.writeInt(-1); // Group status + } + + if (states.getRoom() != null && (states.getRoom().getModel().getName().startsWith("pool_") || states.getRoom().getModel().getName().equals("md_a")) && states.getDetails().getPoolFigure().length() > 0) { + response.writeString(states.getDetails().getPoolFigure()); + } else { + response.writeString(""); + } + } + } + + /*for (EntityState states : states) { + response.writeInt(states.getEntityId()); + response.writeString(states.getDetails().getName()); + response.writeString(states.getDetails().getFigure()); + response.writeString(states.getDetails().getName()); + response.writeString(states.getDetails().getMotto()); + response.writeString(states.getDetails().getFigure()); + response.writeInt(states.getInstanceId()); + response.writeInt(states.getPosition().getX()); + response.writeInt(states.getPosition().getY()); + response.writeString(StringUtil.format(states.getPosition().getZ())); + response.writeInt(states.getPosition().getRotation()); + response.writeInt(1); // TODO: Types + response.writeString(Character.toString(Character.toUpperCase(states.getDetails().getSex()))); + + response.writeInt(0); // Group id + response.writeInt(0); // Group status + + response.writeString(""); + + /*response.writeKeyValue("l", states.getPosition().getX() + " " + states.getPosition().getY() + " " + Double.toString(StringUtil.format(states.getPosition().getZ()))); + + if (states.getDetails().getMotto().length() > 0) { + response.writeKeyValue("c", states.getDetails().getMotto()); + } + + if (states.getDetails().getShowBadge()) { + response.writeKeyValue("b", states.getDetails().getCurrentBadge()); + } + + if (states.getRoom().getModel().getName().startsWith("pool_") || + states.getRoom().getModel().getName().equals("md_a")) { + + if (states.getDetails().getPoolFigure().length() > 0) { + response.writeKeyValue("p", states.getDetails().getPoolFigure()); + } + } + }*/ + } + + @Override + public short getHeader() { + return 28; // "@\" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/USER_SLEEP.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/USER_SLEEP.java new file mode 100644 index 0000000..4084137 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/USER_SLEEP.java @@ -0,0 +1,25 @@ +package org.alexdev.havana.messages.outgoing.rooms.user; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class USER_SLEEP extends MessageComposer { + private final int instanceId; + private final boolean isSleeping; + + public USER_SLEEP(int instanceId, boolean isSleeping) { + this.instanceId = instanceId; + this.isSleeping = isSleeping; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.instanceId); + response.writeBool(this.isSleeping); + } + + @Override + public short getHeader() { + return 486; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/USER_STATUSES.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/USER_STATUSES.java new file mode 100644 index 0000000..7c2e3f0 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/USER_STATUSES.java @@ -0,0 +1,111 @@ +package org.alexdev.havana.messages.outgoing.rooms.user; + +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityState; +import org.alexdev.havana.game.room.enums.StatusType; +import org.alexdev.havana.messages.types.PlayerMessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; +import org.alexdev.havana.util.StringUtil; + +import java.util.ArrayList; +import java.util.List; + +public class USER_STATUSES extends PlayerMessageComposer { + private List states; + + public USER_STATUSES(List users) { + createEntityStates(users); + } + + private void createEntityStates(List entities) { + this.states = new ArrayList<>(); + + for (Entity user : entities) { + this.states.add(new EntityState( + user.getDetails().getId(), + user.getRoomUser().getInstanceId(), + user.getType(), + user.getDetails(), + user.getRoomUser().getRoom(), + user.getRoomUser().getPosition().copy(), + user.getRoomUser().getStatuses(), + user)); + } + } + + @Override + public void compose(NettyResponse response) { + var player = getPlayer(); + + response.writeInt(this.states.size()); + + for (EntityState states : states) { + response.writeInt(states.getInstanceId()); + response.writeInt(states.getPosition().getX()); + response.writeInt(states.getPosition().getY()); + + /*if (player.getRoomUser().getRoom().getModel().getName().equals("picnic")) { + if (states.getPosition().getX() == 7 && + states.getPosition().getY() == 24) { + + if (player.getNetwork().isFlashConnected()) { + response.writeString(StringUtil.format(2.0)); + } else { + response.writeString(StringUtil.format(4.0)); + } + } else if (states.getPosition().getX() == 8 && + states.getPosition().getY() == 24) { + if (player.getNetwork().isFlashConnected()) { + response.writeString(StringUtil.format(4.0)); + } else { + response.writeString(StringUtil.format(7.0)); + } + } else { + response.writeString(StringUtil.format(states.getPosition().getZ())); + } + } + else { + response.writeString(StringUtil.format(states.getPosition().getZ())); + }*/ + + //} else { + response.writeString(StringUtil.format(states.getPosition().getZ())); + //} + + response.writeInt(states.getPosition().getHeadRotation()); + response.writeInt(states.getPosition().getBodyRotation()); + response.write("/"); + + for (var status : states.getStatuses().values()) { + response.write(status.getKey().getStatusCode()); + + if (status.getValue().length() > 0) { + response.write(" "); + + if (status.getKey() == StatusType.SIT && + player.getRoomUser().getRoom() != null && + player.getRoomUser().getRoom().getModel().getName().equals("picnic")) { + + if (states.getPosition().getX() == 8 && + states.getPosition().getY() == 24) { + response.writeString(StringUtil.format(7.0)); + } else { + response.write(status.getValue()); + } + } else { + response.write(status.getValue()); + } + } + + response.write("/"); + } + + response.write((char)2); + } + } + + @Override + public short getHeader() { + return 34; // "@b" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/USER_USE_OBJECT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/USER_USE_OBJECT.java new file mode 100644 index 0000000..e739541 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/USER_USE_OBJECT.java @@ -0,0 +1,25 @@ +package org.alexdev.havana.messages.outgoing.rooms.user; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class USER_USE_OBJECT extends MessageComposer { + private final int userId; + private final int carryId; + + public USER_USE_OBJECT(int userId, int carryId) { + this.userId = userId; + this.carryId = carryId; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.userId); + response.writeInt(this.carryId); + } + + @Override + public short getHeader() { + return 488; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/USER_WAVE.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/USER_WAVE.java new file mode 100644 index 0000000..7ca8e70 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/USER_WAVE.java @@ -0,0 +1,22 @@ +package org.alexdev.havana.messages.outgoing.rooms.user; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class USER_WAVE extends MessageComposer { + private final int instanceId; + + public USER_WAVE(int instanceId) { + this.instanceId = instanceId; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.instanceId); + } + + @Override + public short getHeader() { + return 481; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/YOUARESPECTATOR.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/YOUARESPECTATOR.java new file mode 100644 index 0000000..81be5cc --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/rooms/user/YOUARESPECTATOR.java @@ -0,0 +1,16 @@ +package org.alexdev.havana.messages.outgoing.rooms.user; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class YOUARESPECTATOR extends MessageComposer { + @Override + public void compose(NettyResponse response) { + + } + + @Override + public short getHeader() { + return 254; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/songs/SONG_INFO.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/songs/SONG_INFO.java new file mode 100644 index 0000000..38296c2 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/songs/SONG_INFO.java @@ -0,0 +1,25 @@ +package org.alexdev.havana.messages.outgoing.songs; + +import org.alexdev.havana.game.song.Song; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class SONG_INFO extends MessageComposer { + private final Song song; + + public SONG_INFO(Song song) { + this.song = song; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.song.getId()); + response.writeString(this.song.getTitle()); + response.writeString(this.song.getData()); + } + + @Override + public short getHeader() { + return 300; // "Dl" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/songs/SONG_LIST.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/songs/SONG_LIST.java new file mode 100644 index 0000000..ec17dbe --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/songs/SONG_LIST.java @@ -0,0 +1,33 @@ +package org.alexdev.havana.messages.outgoing.songs; + +import org.alexdev.havana.game.item.ItemManager; +import org.alexdev.havana.game.song.Song; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.List; + +public class SONG_LIST extends MessageComposer { + private final List songList; + + public SONG_LIST(List songList) { + this.songList = songList; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.songList.size()); + + for (Song song : this.songList) { + response.writeInt(song.getId()); + response.writeInt(ItemManager.getInstance().calculateSongLength(song.getData()) / 2); + response.writeString(song.getTitle()); + response.writeBool(song.isBurnt()); + } + } + + @Override + public short getHeader() { + return 322; // "EB" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/songs/SONG_LOCKED.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/songs/SONG_LOCKED.java new file mode 100644 index 0000000..d96d847 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/songs/SONG_LOCKED.java @@ -0,0 +1,16 @@ +package org.alexdev.havana.messages.outgoing.songs; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class SONG_LOCKED extends MessageComposer { + @Override + public void compose(NettyResponse response) { + + } + + @Override + public short getHeader() { + return 336; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/songs/SONG_NEW.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/songs/SONG_NEW.java new file mode 100644 index 0000000..394a181 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/songs/SONG_NEW.java @@ -0,0 +1,25 @@ +package org.alexdev.havana.messages.outgoing.songs; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class SONG_NEW extends MessageComposer { + private final int itemId; + private final String title; + + public SONG_NEW(int id, String title) { + this.itemId = id; + this.title = title; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.itemId); + response.writeString(this.title); + } + + @Override + public short getHeader() { + return 331; // "EK" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/songs/SONG_PLAYLIST.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/songs/SONG_PLAYLIST.java new file mode 100644 index 0000000..ac0047f --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/songs/SONG_PLAYLIST.java @@ -0,0 +1,37 @@ +package org.alexdev.havana.messages.outgoing.songs; + +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.game.item.ItemManager; +import org.alexdev.havana.game.song.SongPlaylist; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.List; + +public class SONG_PLAYLIST extends MessageComposer { + private final List songPlaylist; + + public SONG_PLAYLIST(List songPlaylist) { + this.songPlaylist = songPlaylist; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(0); + response.writeInt(this.songPlaylist.size()); + + int slotId = 1; + for (SongPlaylist playlist : this.songPlaylist) { + response.writeInt(playlist.getSong().getId()); + response.writeInt(ItemManager.getInstance().calculateSongLength(playlist.getSong().getData()) / 2); + response.writeString(playlist.getSong().getTitle()); + response.writeString(PlayerDao.getName(playlist.getSong().getUserId())); + slotId++; + } + } + + @Override + public short getHeader() { + return 323; // "EC" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/songs/SONG_UPDATE.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/songs/SONG_UPDATE.java new file mode 100644 index 0000000..a88f78c --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/songs/SONG_UPDATE.java @@ -0,0 +1,16 @@ +package org.alexdev.havana.messages.outgoing.songs; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class SONG_UPDATE extends MessageComposer { + @Override + public void compose(NettyResponse response) { + + } + + @Override + public short getHeader() { + return 339; // "ES" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/songs/SOUND_PACKAGES.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/songs/SOUND_PACKAGES.java new file mode 100644 index 0000000..2f4dd41 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/songs/SOUND_PACKAGES.java @@ -0,0 +1,40 @@ +package org.alexdev.havana.messages.outgoing.songs; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.Map; + +public class SOUND_PACKAGES extends MessageComposer { + private final Map tracks; + + public SOUND_PACKAGES(Map tracks) { + this.tracks = tracks; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(4); + response.writeInt(this.tracks.size()); + + for (var set : this.tracks.entrySet()) { + int slotId = set.getKey(); + int soundSet = set.getValue(); + + response.writeInt(slotId); + response.writeInt(soundSet); + response.writeInt(9); // 9 samples per set + + int v = (soundSet * 9) - 8; + + for (int j = v; j <= v + 8; j++) { + response.writeInt(j); + } + } + } + + @Override + public short getHeader() { + return 301; // "Dm" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/songs/START_PLAYING_SONG.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/songs/START_PLAYING_SONG.java new file mode 100644 index 0000000..28001ca --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/songs/START_PLAYING_SONG.java @@ -0,0 +1,22 @@ +package org.alexdev.havana.messages.outgoing.songs; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class START_PLAYING_SONG extends MessageComposer { + private final int id; + + public START_PLAYING_SONG(int id) { + this.id = id; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.id); + } + + @Override + public short getHeader() { + return 493; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/songs/STOP_PLAYING_SONG.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/songs/STOP_PLAYING_SONG.java new file mode 100644 index 0000000..fe679b5 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/songs/STOP_PLAYING_SONG.java @@ -0,0 +1,22 @@ +package org.alexdev.havana.messages.outgoing.songs; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class STOP_PLAYING_SONG extends MessageComposer { + private final int id; + + public STOP_PLAYING_SONG(int id) { + this.id = id; + } + + @Override + public void compose(NettyResponse response) { + + } + + @Override + public short getHeader() { + return 494; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/songs/USER_SOUND_PACKAGES.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/songs/USER_SOUND_PACKAGES.java new file mode 100644 index 0000000..fe1affe --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/songs/USER_SOUND_PACKAGES.java @@ -0,0 +1,28 @@ +package org.alexdev.havana.messages.outgoing.songs; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.List; + +public class USER_SOUND_PACKAGES extends MessageComposer { + private final List handSoundsets; + + public USER_SOUND_PACKAGES(List handSoundsets) { + this.handSoundsets = handSoundsets; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.handSoundsets.size()); + + for (Integer songTrackId : this.handSoundsets) { + response.writeInt(songTrackId); + } + } + + @Override + public short getHeader() { + return 302; // "Dn" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/trade/ITEM_NOT_TRADABLE.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/trade/ITEM_NOT_TRADABLE.java new file mode 100644 index 0000000..49afe62 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/trade/ITEM_NOT_TRADABLE.java @@ -0,0 +1,16 @@ +package org.alexdev.havana.messages.outgoing.trade; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class ITEM_NOT_TRADABLE extends MessageComposer { + @Override + public void compose(NettyResponse response) { + + } + + @Override + public short getHeader() { + return 515; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/trade/TRADEACCEPT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/trade/TRADEACCEPT.java new file mode 100644 index 0000000..9a742c8 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/trade/TRADEACCEPT.java @@ -0,0 +1,25 @@ +package org.alexdev.havana.messages.outgoing.trade; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class TRADEACCEPT extends MessageComposer { + private final int userId; + private final boolean status; + + public TRADEACCEPT(int id, boolean status) { + this.userId = id; + this.status = status; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.userId); + response.writeBool(this.status); + } + + @Override + public short getHeader() { + return 109; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/trade/TRADECONFIRM.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/trade/TRADECONFIRM.java new file mode 100644 index 0000000..48f8f90 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/trade/TRADECONFIRM.java @@ -0,0 +1,16 @@ +package org.alexdev.havana.messages.outgoing.trade; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class TRADECONFIRM extends MessageComposer { + @Override + public void compose(NettyResponse response) { + + } + + @Override + public short getHeader() { + return 111; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/trade/TRADEOPEN.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/trade/TRADEOPEN.java new file mode 100644 index 0000000..c3c4da3 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/trade/TRADEOPEN.java @@ -0,0 +1,31 @@ +package org.alexdev.havana.messages.outgoing.trade; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class TRADEOPEN extends MessageComposer { + private final int userId; + private final boolean userCanTrade; + private final int partnerId; + private final boolean partnerCanTrade; + + public TRADEOPEN(int userId, boolean userCanTrade, int partnerId, boolean partnerCanTrade) { + this.userId = userId; + this.userCanTrade = userCanTrade; + this.partnerId = partnerId; + this.partnerCanTrade = partnerCanTrade; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.userId); + response.writeBool(this.userCanTrade); + response.writeInt(this.partnerId); + response.writeBool(this.partnerCanTrade); // User can trade. TODO: Honour user settings + } + + @Override + public short getHeader() { + return 104; // "Ah" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/trade/TRADE_ALREADY_OPEN.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/trade/TRADE_ALREADY_OPEN.java new file mode 100644 index 0000000..638583a --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/trade/TRADE_ALREADY_OPEN.java @@ -0,0 +1,16 @@ +package org.alexdev.havana.messages.outgoing.trade; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class TRADE_ALREADY_OPEN extends MessageComposer { + @Override + public void compose(NettyResponse response) { + + } + + @Override + public short getHeader() { + return 105; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/trade/TRADE_CLOSE.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/trade/TRADE_CLOSE.java new file mode 100644 index 0000000..07442a7 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/trade/TRADE_CLOSE.java @@ -0,0 +1,22 @@ +package org.alexdev.havana.messages.outgoing.trade; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class TRADE_CLOSE extends MessageComposer { + private int userClosedId; + + public TRADE_CLOSE(int userClosedId) { + this.userClosedId = userClosedId; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.userClosedId); + } + + @Override + public short getHeader() { + return 110; // "An" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/trade/TRADE_COMPLETED.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/trade/TRADE_COMPLETED.java new file mode 100644 index 0000000..b870535 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/trade/TRADE_COMPLETED.java @@ -0,0 +1,16 @@ +package org.alexdev.havana.messages.outgoing.trade; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class TRADE_COMPLETED extends MessageComposer { + @Override + public void compose(NettyResponse response) { + + } + + @Override + public short getHeader() { + return 112; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/trade/TRADE_ITEMS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/trade/TRADE_ITEMS.java new file mode 100644 index 0000000..9f5bdd9 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/trade/TRADE_ITEMS.java @@ -0,0 +1,84 @@ +package org.alexdev.havana.messages.outgoing.trade; + +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.base.ItemBehaviour; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.List; + +public class TRADE_ITEMS extends MessageComposer { + private final Player player; + private final List ownItems; + private final Player tradePartner; + private final List partnerItems; + + public TRADE_ITEMS(Player player, List ownItems, Player tradePartner, List partnerItems) { + this.player = player; + this.ownItems = ownItems; + this.tradePartner = tradePartner; + this.partnerItems = partnerItems; + } + + @Override + public void compose(NettyResponse response) { + /*response.write(this.player.getDetails().getName(), (char) 9); + response.write(this.playerAcceptedTrade ? "true" : "false", (char) 9); + + for (int i = 0; i < this.ownItems.size(); i++) { + Item item = this.ownItems.get(i); + Inventory.serialise(response, item, i); + } + + response.write((char) 13); + + response.write(this.tradePartner.getDetails().getName(), (char) 9); + response.write(this.partnerAcceptedTrade ? "true" : "false", (char) 9); + + for (int i = 0; i < this.partnerItems.size(); i++) { + Item item = this.partnerItems.get(i); + Inventory.serialise(response, item, i); + }*/ + + response.writeInt(this.player.getDetails().getId()); + response.writeInt(this.ownItems.size()); + + int j = 0; + for (Item item : this.ownItems) { + this.serialiseItem(response, item); + //Inventory.serialise(response, item, j++); + } + + response.writeInt(this.tradePartner.getDetails().getId()); + response.writeInt(this.partnerItems.size()); + + int i = 0; + for (Item item : this.partnerItems) { + this.serialiseItem(response, item); + //Inventory.serialise(response, item, i++); + } + } + + private void serialiseItem(NettyResponse response, Item item) { + response.writeInt(item.getVirtualId()); + response.writeString(item.hasBehaviour(ItemBehaviour.WALL_ITEM) ? "i" : "s"); + response.writeInt(item.getVirtualId()); + response.writeInt(item.getDefinition().getSpriteId()); + response.writeInt(-1); + response.writeInt(-1); + response.writeString(item.getCustomData()); + response.writeInt(-1); + response.writeInt(-1); + response.writeInt(-1); + + if (!item.hasBehaviour(ItemBehaviour.WALL_ITEM)) { + response.writeInt(-1); + } + } + + @Override + public short getHeader() { + return 108; // "Al" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/tutorial/ENABLE_TUTOR_SERVICE_STATUS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/tutorial/ENABLE_TUTOR_SERVICE_STATUS.java new file mode 100644 index 0000000..3cd6057 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/tutorial/ENABLE_TUTOR_SERVICE_STATUS.java @@ -0,0 +1,38 @@ +package org.alexdev.havana.messages.outgoing.tutorial; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class ENABLE_TUTOR_SERVICE_STATUS extends MessageComposer { + public enum TutorEnableStatus { + FRIENDSLIST_FULL(2), + SERVICE_DISABLED(3), + MAX_NEWBIES(4); + + private final int stateId; + + TutorEnableStatus(int stateId) { + this.stateId = stateId; + } + + public int getStateId() { + return stateId; + } + } + + private final TutorEnableStatus status; + + public ENABLE_TUTOR_SERVICE_STATUS(TutorEnableStatus status) { + this.status = status; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.status.getStateId()); + } + + @Override + public short getHeader() { + return 426; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/tutorial/GUIDE_FOUND.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/tutorial/GUIDE_FOUND.java new file mode 100644 index 0000000..8f57c04 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/tutorial/GUIDE_FOUND.java @@ -0,0 +1,22 @@ +package org.alexdev.havana.messages.outgoing.tutorial; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class GUIDE_FOUND extends MessageComposer { + private final int accountId; + + public GUIDE_FOUND(int accountId) { + this.accountId = accountId; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.accountId); + } + + @Override + public short getHeader() { + return 423; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/tutorial/INVITATION_SENT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/tutorial/INVITATION_SENT.java new file mode 100644 index 0000000..50537f8 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/tutorial/INVITATION_SENT.java @@ -0,0 +1,16 @@ +package org.alexdev.havana.messages.outgoing.tutorial; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class INVITATION_SENT extends MessageComposer { + @Override + public void compose(NettyResponse response) { + + } + + @Override + public short getHeader() { + return 421; // "Fe" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/tutorial/INVITE_CANCELLED.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/tutorial/INVITE_CANCELLED.java new file mode 100644 index 0000000..c9eff2b --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/tutorial/INVITE_CANCELLED.java @@ -0,0 +1,16 @@ +package org.alexdev.havana.messages.outgoing.tutorial; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class INVITE_CANCELLED extends MessageComposer { + @Override + public void compose(NettyResponse response) { + + } + + @Override + public short getHeader() { + return 360; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/tutorial/INVITE_FOLLOW_FAILED.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/tutorial/INVITE_FOLLOW_FAILED.java new file mode 100644 index 0000000..8863927 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/tutorial/INVITE_FOLLOW_FAILED.java @@ -0,0 +1,16 @@ +package org.alexdev.havana.messages.outgoing.tutorial; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class INVITE_FOLLOW_FAILED extends MessageComposer { + @Override + public void compose(NettyResponse response) { + + } + + @Override + public short getHeader() { + return 359; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/tutorial/INVITING_COMPLETED.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/tutorial/INVITING_COMPLETED.java new file mode 100644 index 0000000..18c80ad --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/tutorial/INVITING_COMPLETED.java @@ -0,0 +1,32 @@ +package org.alexdev.havana.messages.outgoing.tutorial; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class INVITING_COMPLETED extends MessageComposer { + public enum InvitationResult { + SUCCESS, + FAILURE; + } + + private InvitationResult result; + + public INVITING_COMPLETED(InvitationResult result) { + this.result = result; + } + + @Override + public void compose(NettyResponse response) { + if (this.result == InvitationResult.SUCCESS) { + response.writeBool(true); + } else { + response.writeBool(false); + } + } + + @Override + public short getHeader() { + return 357; // "Ee" + } +} + diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/tutorial/TUTORS_AVAILABLE.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/tutorial/TUTORS_AVAILABLE.java new file mode 100644 index 0000000..e0bc54b --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/tutorial/TUTORS_AVAILABLE.java @@ -0,0 +1,22 @@ +package org.alexdev.havana.messages.outgoing.tutorial; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class TUTORS_AVAILABLE extends MessageComposer { + private final int tutors; + + public TUTORS_AVAILABLE(int tutors) { + this.tutors = tutors; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.tutors); + } + + @Override + public short getHeader() { + return 356; // "Ed" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/IGNORED_LIST.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/IGNORED_LIST.java new file mode 100644 index 0000000..60a43f6 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/IGNORED_LIST.java @@ -0,0 +1,28 @@ +package org.alexdev.havana.messages.outgoing.user; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.Set; + +public class IGNORED_LIST extends MessageComposer { + private final Set ignoreList; + + public IGNORED_LIST(Set ignoreList) { + this.ignoreList = ignoreList; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.ignoreList.size()); + + for (String username : this.ignoreList) { + response.writeString(username); + } + } + + @Override + public short getHeader() { + return 420; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/IGNORE_USER_RESULT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/IGNORE_USER_RESULT.java new file mode 100644 index 0000000..17955ee --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/IGNORE_USER_RESULT.java @@ -0,0 +1,22 @@ +package org.alexdev.havana.messages.outgoing.user; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class IGNORE_USER_RESULT extends MessageComposer { + private final int result; + + public IGNORE_USER_RESULT(int result) { + this.result = result; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.result); + } + + @Override + public short getHeader() { + return 419; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/LATENCY.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/LATENCY.java new file mode 100644 index 0000000..2ffea16 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/LATENCY.java @@ -0,0 +1,22 @@ +package org.alexdev.havana.messages.outgoing.user; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class LATENCY extends MessageComposer { + private final int latency; + + public LATENCY(int latency) { + this.latency = latency; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.latency); + } + + @Override + public short getHeader() { + return 354; // "Eb" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/PING.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/PING.java new file mode 100644 index 0000000..3891b93 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/PING.java @@ -0,0 +1,16 @@ +package org.alexdev.havana.messages.outgoing.user; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class PING extends MessageComposer { + @Override + public void compose(NettyResponse response) { + + } + + @Override + public short getHeader() { + return 50; // "@r" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/POSSIBLE_ACHIEVEMENTS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/POSSIBLE_ACHIEVEMENTS.java new file mode 100644 index 0000000..0e98117 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/POSSIBLE_ACHIEVEMENTS.java @@ -0,0 +1,38 @@ +package org.alexdev.havana.messages.outgoing.user; + +import org.alexdev.havana.game.achievements.AchievementInfo; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; +import org.alexdev.havana.util.StringUtil; + +import java.util.List; + +public class POSSIBLE_ACHIEVEMENTS extends MessageComposer { + private List possibleAchievements; + + public POSSIBLE_ACHIEVEMENTS(List possibleAchievements) { + this.possibleAchievements = possibleAchievements; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.possibleAchievements.size()); + + for (var achievement : this.possibleAchievements) { + response.writeInt(achievement.getId()); + response.writeInt(achievement.getLevel()); + + if (achievement.getName().equals("GL")) { + response.writeString(String.format("%s%s", achievement.getName(), StringUtil.toAlphabetic(achievement.getLevel()))); + } else { + response.writeString(String.format("%s%d", achievement.getName(), achievement.getLevel())); + } + + } + } + + @Override + public short getHeader() { + return 436; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/USER_OBJECT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/USER_OBJECT.java new file mode 100644 index 0000000..2826eb3 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/USER_OBJECT.java @@ -0,0 +1,33 @@ +package org.alexdev.havana.messages.outgoing.user; + +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class USER_OBJECT extends MessageComposer { + private final PlayerDetails details; + + public USER_OBJECT(PlayerDetails details) { + this.details = details; + } + + @Override + public void compose(NettyResponse response) { + response.writeString(this.details.getId()); + response.writeString(this.details.getName()); + response.writeString(this.details.getFigure()); + response.writeString(this.details.getSex()); + response.writeString(this.details.getMotto()); + response.writeInt(this.details.getTickets()); + response.writeString(this.details.getPoolFigure()); + response.writeInt(this.details.getFilm()); + response.writeBool(false); // directMail + response.writeInt(this.details.getDailyRespectPoints() > 0 ? this.details.getRespectPoints() : 0);//this.details.getRespectPoints()); + response.writeInt(this.details.getDailyRespectPoints() > 0 ? this.details.getDailyRespectPoints() : 0); + } + + @Override + public short getHeader() { + return 5; // "@E" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/badges/ACHIEVEMENT_NOTIFICATION.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/badges/ACHIEVEMENT_NOTIFICATION.java new file mode 100644 index 0000000..a4da136 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/badges/ACHIEVEMENT_NOTIFICATION.java @@ -0,0 +1,32 @@ +package org.alexdev.havana.messages.outgoing.user.badges; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class ACHIEVEMENT_NOTIFICATION extends MessageComposer { + private final int typeId; + private final int level; + private final String badgeCode; + private final String badgeRemove; + + public ACHIEVEMENT_NOTIFICATION(String badgeCode, String badgeRemove, int level) { + this.typeId = 0; + this.level = level; + this.badgeCode = badgeCode; + this.badgeRemove = badgeRemove; + } + + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.typeId); + response.writeInt(this.level); + response.writeString(this.badgeCode); + response.writeString(this.badgeRemove == null ? "" : this.badgeRemove); + } + + @Override + public short getHeader() { + return 437; // "Fu" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/badges/AVAILABLE_BADGES.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/badges/AVAILABLE_BADGES.java new file mode 100644 index 0000000..b6d50d0 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/badges/AVAILABLE_BADGES.java @@ -0,0 +1,39 @@ +package org.alexdev.havana.messages.outgoing.user.badges; + +import org.alexdev.havana.game.badges.Badge; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.List; + +public class AVAILABLE_BADGES extends MessageComposer { + private final List badges; + private final List equippedBadges; + + public AVAILABLE_BADGES(List badges, List equippedBadges) { + this.badges = badges; + this.equippedBadges = equippedBadges; + } + + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.badges.size()); + + for (Badge badge : this.badges) { + response.writeString(badge.getBadgeCode()); + } + + response.writeInt(this.equippedBadges.size()); + + for (Badge badge : this.equippedBadges) { + response.writeInt(badge.getSlotId()); + response.writeString(badge.getBadgeCode()); + } + } + + @Override + public short getHeader() { + return 229; // "Ce" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/badges/USERBADGE.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/badges/USERBADGE.java new file mode 100644 index 0000000..4a4d701 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/badges/USERBADGE.java @@ -0,0 +1,33 @@ +package org.alexdev.havana.messages.outgoing.user.badges; + +import org.alexdev.havana.game.badges.Badge; +import org.alexdev.havana.messages.types.PlayerMessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.List; + +public class USERBADGE extends PlayerMessageComposer { + private final int userId; + private final List equippedBadges; + + public USERBADGE(int userId, List equippedBadges) { + this.userId = userId; + this.equippedBadges = equippedBadges; + } + + @Override + public void compose(NettyResponse response) { + response.writeString(this.userId); + response.writeInt(this.equippedBadges.size()); + + for (Badge badge : this.equippedBadges) { + response.writeInt(badge.getSlotId()); + response.writeString(badge.getBadgeCode()); + } + } + + @Override + public short getHeader() { + return 228; // "Cd" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/currencies/ActivityPointNotification.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/currencies/ActivityPointNotification.java new file mode 100644 index 0000000..c57aa42 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/currencies/ActivityPointNotification.java @@ -0,0 +1,42 @@ +package org.alexdev.havana.messages.outgoing.user.currencies; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class ActivityPointNotification extends MessageComposer { + public enum ActivityPointAlertType { + PIXELS_RECEIVED, + PIXELS_SOUND, + NO_SOUND, + } + + private final int pixels; + private final ActivityPointAlertType alertType; + + public ActivityPointNotification(int pixels, ActivityPointAlertType alertType) { + this.pixels = pixels; + this.alertType = alertType; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.pixels); + + if (this.alertType == ActivityPointAlertType.PIXELS_RECEIVED) { + response.writeInt(15); + } + + if (this.alertType == ActivityPointAlertType.PIXELS_SOUND) { + response.writeInt(-1); + } + + if (this.alertType == ActivityPointAlertType.NO_SOUND) { + response.writeInt(0); + } + } + + @Override + public short getHeader() { + return 438; // "Fv" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/currencies/CREDIT_BALANCE.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/currencies/CREDIT_BALANCE.java new file mode 100644 index 0000000..8244970 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/currencies/CREDIT_BALANCE.java @@ -0,0 +1,23 @@ +package org.alexdev.havana.messages.outgoing.user.currencies; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class CREDIT_BALANCE extends MessageComposer { + private final int credits; + + public CREDIT_BALANCE(int credits) { + this.credits = credits; + } + + + @Override + public void compose(NettyResponse response) { + response.write(this.credits); + } + + @Override + public short getHeader() { + return 6; // "@F + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/currencies/FILM.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/currencies/FILM.java new file mode 100644 index 0000000..b01391e --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/currencies/FILM.java @@ -0,0 +1,23 @@ +package org.alexdev.havana.messages.outgoing.user.currencies; + +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class FILM extends MessageComposer { + private final int film; + + public FILM(PlayerDetails details) { + this.film = details.getFilm(); + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.film); + } + + @Override + public short getHeader() { + return 4; // "@D" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/currencies/NO_TICKETS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/currencies/NO_TICKETS.java new file mode 100644 index 0000000..1f9a2ba --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/currencies/NO_TICKETS.java @@ -0,0 +1,16 @@ +package org.alexdev.havana.messages.outgoing.user.currencies; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class NO_TICKETS extends MessageComposer { + @Override + public void compose(NettyResponse response) { + + } + + @Override + public short getHeader() { + return 73; // "AI" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/currencies/TICKET_BALANCE.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/currencies/TICKET_BALANCE.java new file mode 100644 index 0000000..d17543d --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/currencies/TICKET_BALANCE.java @@ -0,0 +1,22 @@ +package org.alexdev.havana.messages.outgoing.user.currencies; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class TICKET_BALANCE extends MessageComposer { + private final int tickets; + + public TICKET_BALANCE(int tickets) { + this.tickets = tickets; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.tickets); + } + + @Override + public short getHeader() { + return 124; // "A|" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/settings/ACCOUNT_PREFERENCES.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/settings/ACCOUNT_PREFERENCES.java new file mode 100644 index 0000000..715f60f --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/settings/ACCOUNT_PREFERENCES.java @@ -0,0 +1,23 @@ +package org.alexdev.havana.messages.outgoing.user.settings; + +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class ACCOUNT_PREFERENCES extends MessageComposer { + private final PlayerDetails details; + + public ACCOUNT_PREFERENCES(PlayerDetails details) { + this.details = details; + } + + @Override + public void compose(NettyResponse response) { + response.writeBool(this.details.getSoundSetting()); + } + + @Override + public short getHeader() { + return 308; // "Dt": [[#tutorial_handler, #handleAccountPreferences]] + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/settings/HELP_ITEMS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/settings/HELP_ITEMS.java new file mode 100644 index 0000000..4ff8873 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/settings/HELP_ITEMS.java @@ -0,0 +1,29 @@ +package org.alexdev.havana.messages.outgoing.user.settings; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +import java.util.List; + +public class HELP_ITEMS extends MessageComposer { + private final List tutorialFlags; + + public HELP_ITEMS(List tutorialFlags) { + this.tutorialFlags = tutorialFlags; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.tutorialFlags.size()); + + for (int flag : this.tutorialFlags) { + response.writeInt(flag); + } + + } + + @Override + public short getHeader() { + return 352; // "E`" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/settings/SOUND_SETTING.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/settings/SOUND_SETTING.java new file mode 100644 index 0000000..e5c5062 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/user/settings/SOUND_SETTING.java @@ -0,0 +1,24 @@ +package org.alexdev.havana.messages.outgoing.user.settings; + +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class SOUND_SETTING extends MessageComposer { + private final PlayerDetails details; + + public SOUND_SETTING(PlayerDetails details) { + this.details = details; + } + + @Override + public void compose(NettyResponse response) { + response.writeBool(this.details.getSoundSetting()); + response.writeInt(0); // TODO: find out why this is needed + } + + @Override + public short getHeader() { + return 308; // "Dt": [[#login_handler, #handleSoundSetting]] + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/wobblesquabble/PT_END.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/wobblesquabble/PT_END.java new file mode 100644 index 0000000..fe47253 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/wobblesquabble/PT_END.java @@ -0,0 +1,16 @@ +package org.alexdev.havana.messages.outgoing.wobblesquabble; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class PT_END extends MessageComposer { + @Override + public void compose(NettyResponse response) { + + } + + @Override + public short getHeader() { + return 116; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/wobblesquabble/PT_PREPARE.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/wobblesquabble/PT_PREPARE.java new file mode 100644 index 0000000..1091d64 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/wobblesquabble/PT_PREPARE.java @@ -0,0 +1,27 @@ +package org.alexdev.havana.messages.outgoing.wobblesquabble; + +import org.alexdev.havana.game.games.wobblesquabble.WobbleSquabblePlayer; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class PT_PREPARE extends MessageComposer { + private final WobbleSquabblePlayer player1; + private final WobbleSquabblePlayer player2; + + public PT_PREPARE(WobbleSquabblePlayer player1, WobbleSquabblePlayer player2) { + this.player1 = player1; + this.player2 = player2; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.player1.getPlayer().getRoomUser().getInstanceId()); + response.writeInt(this.player2.getPlayer().getRoomUser().getInstanceId()); + } + + @Override + public short getHeader() { + return 115; // "As" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/wobblesquabble/PT_START.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/wobblesquabble/PT_START.java new file mode 100644 index 0000000..ef62192 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/wobblesquabble/PT_START.java @@ -0,0 +1,27 @@ +package org.alexdev.havana.messages.outgoing.wobblesquabble; + +import org.alexdev.havana.game.games.wobblesquabble.WobbleSquabblePlayer; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class PT_START extends MessageComposer { + private final WobbleSquabblePlayer player1; + private final WobbleSquabblePlayer player2; + + public PT_START(WobbleSquabblePlayer player1, WobbleSquabblePlayer player2) { + this.player1 = player1; + this.player2 = player2; + } + + @Override + public void compose(NettyResponse response) { + response.writeInt(this.player1.getPlayer().getRoomUser().getInstanceId()); + response.writeInt(this.player2.getPlayer().getRoomUser().getInstanceId()); + } + + @Override + public short getHeader() { + return 114; // "Ar" + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/wobblesquabble/PT_STATUS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/wobblesquabble/PT_STATUS.java new file mode 100644 index 0000000..a650a43 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/wobblesquabble/PT_STATUS.java @@ -0,0 +1,33 @@ +package org.alexdev.havana.messages.outgoing.wobblesquabble; + +import org.alexdev.havana.game.games.wobblesquabble.WobbleSquabblePlayer; +import org.alexdev.havana.game.games.wobblesquabble.WobbleSquabbleStatus; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class PT_STATUS extends MessageComposer { + private final WobbleSquabbleStatus[] statuses; + + public PT_STATUS(WobbleSquabblePlayer wsPlayer1, WobbleSquabblePlayer wsPlayer2) { + this.statuses = new WobbleSquabbleStatus[2]; + this.statuses[0] = new WobbleSquabbleStatus(wsPlayer1.getPosition(), wsPlayer1.getBalance(), wsPlayer1.getMove(), wsPlayer1.isHit()); + this.statuses[1] = new WobbleSquabbleStatus(wsPlayer2.getPosition(), wsPlayer2.getBalance(), wsPlayer2.getMove(), wsPlayer2.isHit()); + } + + @Override + public void compose(NettyResponse response) { + for (int i = 0; i < 2; i++) { + WobbleSquabbleStatus wsStatus = this.statuses[i]; + + response.writeInt(wsStatus.getPosition()); + response.writeInt(wsStatus.getBalance()); + response.writeInt(wsStatus.getMove().getId()); + response.writeBool(wsStatus.isHit()); + } + } + + @Override + public short getHeader() { + return 118; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/wobblesquabble/PT_TIMEOUT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/wobblesquabble/PT_TIMEOUT.java new file mode 100644 index 0000000..e9e11a4 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/wobblesquabble/PT_TIMEOUT.java @@ -0,0 +1,16 @@ +package org.alexdev.havana.messages.outgoing.wobblesquabble; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class PT_TIMEOUT extends MessageComposer { + @Override + public void compose(NettyResponse response) { + response.writeInt(0); + } + + @Override + public short getHeader() { + return 117; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/wobblesquabble/PT_WIN.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/wobblesquabble/PT_WIN.java new file mode 100644 index 0000000..2a989ef --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/wobblesquabble/PT_WIN.java @@ -0,0 +1,28 @@ +package org.alexdev.havana.messages.outgoing.wobblesquabble; + +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public class PT_WIN extends MessageComposer { + private final int winner; + + public PT_WIN(int winner) { + this.winner = winner; + } + + @Override + public void compose(NettyResponse response) { + if (this.winner == -1) { + response.writeInt(0); + } else if (this.winner == 1) { + response.writeInt(-1); + } else if (this.winner == 0) { + response.writeInt(1); + } + } + + @Override + public short getHeader() { + return 119; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/types/MessageComposer.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/types/MessageComposer.java new file mode 100644 index 0000000..d202152 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/types/MessageComposer.java @@ -0,0 +1,15 @@ +package org.alexdev.havana.messages.types; + +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public abstract class MessageComposer { + /** + * Write the message to send back to the client. + */ + public abstract void compose(NettyResponse response); + + /** + * Get the header + */ + public abstract short getHeader(); +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/types/MessageEvent.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/types/MessageEvent.java new file mode 100644 index 0000000..1911bc1 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/types/MessageEvent.java @@ -0,0 +1,16 @@ +package org.alexdev.havana.messages.types; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.server.util.MalformedPacketException; + +public interface MessageEvent { + + /** + * Handle the incoming client message. + * + * @param player the player + * @param reader the reader + */ + void handle(Player player, NettyRequest reader) throws Exception; +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/types/PlayerMessageComposer.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/types/PlayerMessageComposer.java new file mode 100644 index 0000000..4dc8e46 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/types/PlayerMessageComposer.java @@ -0,0 +1,26 @@ +package org.alexdev.havana.messages.types; + +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.server.netty.streams.NettyResponse; + +public abstract class PlayerMessageComposer extends MessageComposer { + private Player player; + + /** + * The player currently handling the packet for + * + * @return the player. + */ + public Player getPlayer() { + return player; + } + + /** + * Sets the player currently being handled for. + * + * @param player the player + */ + public void setPlayer(Player player) throws Exception { + this.player = player; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/server/mus/MusChannelInitializer.java b/Havana-Server/src/main/java/org/alexdev/havana/server/mus/MusChannelInitializer.java new file mode 100644 index 0000000..29ca8ad --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/server/mus/MusChannelInitializer.java @@ -0,0 +1,25 @@ +package org.alexdev.havana.server.mus; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import org.alexdev.havana.server.mus.codec.MusNetworkDecoder; +import org.alexdev.havana.server.mus.codec.MusNetworkEncoder; + +public class MusChannelInitializer extends ChannelInitializer { + private final MusServer musServer; + + public MusChannelInitializer(MusServer musServer) { + this.musServer = musServer; + } + + @Override + protected void initChannel(SocketChannel socketChannel) throws Exception { + ChannelPipeline pipeline = socketChannel.pipeline(); + pipeline.addLast("frameDecoder",new LengthFieldBasedFrameDecoder(1683226630, 2, 4, 0, 0)); + pipeline.addLast("gameDecoder", new MusNetworkDecoder()); + pipeline.addLast("gameEncoder", new MusNetworkEncoder()); + pipeline.addLast("handler", new MusConnectionHandler()); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/server/mus/MusConnectionHandler.java b/Havana-Server/src/main/java/org/alexdev/havana/server/mus/MusConnectionHandler.java new file mode 100644 index 0000000..cd73b66 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/server/mus/MusConnectionHandler.java @@ -0,0 +1,192 @@ +package org.alexdev.havana.server.mus; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; +import io.netty.util.AttributeKey; +import org.alexdev.havana.dao.mysql.CurrencyDao; +import org.alexdev.havana.dao.mysql.ItemDao; +import org.alexdev.havana.dao.mysql.PhotoDao; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.ItemManager; +import org.alexdev.havana.game.item.Photo; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.log.Log; +import org.alexdev.havana.messages.outgoing.user.currencies.FILM; +import org.alexdev.havana.server.mus.connection.MusClient; +import org.alexdev.havana.server.mus.streams.MusMessage; +import org.alexdev.havana.server.mus.streams.MusPropList; +import org.alexdev.havana.server.mus.streams.MusTypes; +import org.alexdev.havana.server.netty.NettyPlayerNetwork; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.StringUtil; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; + +public class MusConnectionHandler extends SimpleChannelInboundHandler { + final private static AttributeKey MUS_CLIENT_KEY = AttributeKey.valueOf("MusClient"); + final private static Logger log = LoggerFactory.getLogger(MusConnectionHandler.class); + + public MusConnectionHandler() { } + + @Override + public void channelRegistered(ChannelHandlerContext ctx) { + MusClient client = new MusClient(ctx.channel()); + ctx.channel().attr(MUS_CLIENT_KEY).set(client); + } + + @Override + public void channelRead0(ChannelHandlerContext ctx, MusMessage message) { + MusMessage reply; + MusClient client = ctx.channel().attr(MUS_CLIENT_KEY).get(); + + if (client == null) { + ctx.close(); + return; + } + + try { + //log.info("[MUS] Message from {}: {}", ctx.channel().remoteAddress().toString().replace("/", "").split(":")[0], message.toString()); + + if (message.getSubject().equals("Logon")) { + reply = new MusMessage(); + reply.setSubject("Logon"); + reply.setContentType(MusTypes.String); + reply.setContentString("Havana: Habbo Hotel shockwave emulator"); + ctx.channel().writeAndFlush(reply); + + reply = new MusMessage(); + reply.setSubject("HELLO"); + reply.setContentType(MusTypes.String); + reply.setContentString(""); + ctx.channel().writeAndFlush(reply); + } + + if (message.getSubject().equals("LOGIN")) { + String[] credentials = message.getContentString().split(" ", 2); + + if (!StringUtils.isNumeric(credentials[0])) { + return; + } + + int userId = Integer.valueOf(credentials[0]); + Player player = PlayerManager.getInstance().getPlayerById(userId); + + // Er, ma, gerd, we logged in! ;O + if (player != null && NettyPlayerNetwork.getIpAddress(player.getNetwork().getChannel()).equals(NettyPlayerNetwork.getIpAddress(ctx.channel()))) { + client.setUserId(userId); + } else { + ctx.channel().close(); // Lol, bye, imposter scum! + } + } + + if (message.getSubject().equals("PHOTOTXT")) { + if (client.getUserId() > 0) { + var photoText = StringUtil.filterInput(message.getContentString().substring(1), true); + + if (photoText.length() >= 105) { + photoText = photoText.substring(0, 105); + } + + client.setPhotoText(photoText); + } + } + + if (message.getSubject().equals("BINDATA")) { + Player player = PlayerManager.getInstance().getPlayerById(client.getUserId()); + + if (player == null) { + return; + } + + if (client.getUserId() < 1) { + return; + } + + if (player.getRoomUser().getRoom() == null) { + return; + } + + long timeSeconds = DateUtil.getCurrentTimeSeconds(); + + String time = message.getContentPropList().getPropAsString("time"); + Integer cs = message.getContentPropList().getPropAsInt("cs"); + byte[] image = message.getContentPropList().getPropAsBytes("image"); + String photoText = client.getPhotoText(); + + Item photo = new Item(); + photo.setOwnerId(client.getUserId()); + photo.setDefinitionId(ItemManager.getInstance().getDefinitionBySprite("photo").getId()); + photo.setCustomData(DateUtil.getDate(timeSeconds, DateUtil.LONG_DATE) + "\r" + photoText); + ItemDao.newItem(photo); + + PhotoDao.addPhoto(photo.getDatabaseId(), client.getUserId(), DateUtil.getCurrentTimeSeconds(), image, cs); + + reply = new MusMessage(); + reply.setSubject("BINDATA_SAVED"); + reply.setContentType(MusTypes.String); + reply.setContentString(Integer.toString(client.getUserId())); + ctx.channel().writeAndFlush(reply); + + player.getInventory().addItem(photo); + player.getInventory().getView("new"); + + CurrencyDao.decreaseFilm(player.getDetails(), 1); + player.send(new FILM(player.getDetails())); + } + + if (message.getSubject().equals("GETBINDATA")) { + int photoID = Integer.parseInt(message.getContentString().split(" ")[0]); + + Player player = PlayerManager.getInstance().getPlayerById(client.getUserId()); + + if (player == null || player.getRoomUser().getRoom() == null) { + return; + } + + Item item = player.getRoomUser().getRoom().getItemManager().getById(photoID); + + if (item == null) { + return; + } + + long databaseId = item.getDatabaseId(); + Photo photo = PhotoDao.getPhoto(databaseId); + + if (photo == null) { + return; + } + + if (client.getUserId() < 1) { + return; + } + + reply = new MusMessage(); + reply.setSubject("BINARYDATA"); + reply.setContentType(MusTypes.PropList); + reply.setContentPropList(new MusPropList(3)); + reply.getContentPropList().setPropAsBytes("image", MusTypes.Media, photo.getData()); + reply.getContentPropList().setPropAsString("time", DateUtil.getDate(photo.getTime(), DateUtil.LONG_DATE)); + reply.getContentPropList().setPropAsInt("cs", photo.getChecksum()); + ctx.channel().writeAndFlush(reply); + } + + } catch (Exception ex) { + Log.getErrorLogger().error("Exception occurred when handling MUS message: ", ex); + } + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { + if (cause instanceof Exception) { + if (!(cause instanceof IOException)) { + Log.getErrorLogger().error("[MUS] Netty error occurred: ", cause); + } + } + + ctx.close(); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/server/mus/MusServer.java b/Havana-Server/src/main/java/org/alexdev/havana/server/mus/MusServer.java new file mode 100644 index 0000000..eaf591a --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/server/mus/MusServer.java @@ -0,0 +1,123 @@ +package org.alexdev.havana.server.mus; + +import io.netty.bootstrap.ServerBootstrap; +import io.netty.buffer.PooledByteBufAllocator; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.FixedRecvByteBufAllocator; +import io.netty.channel.epoll.Epoll; +import io.netty.channel.epoll.EpollEventLoopGroup; +import io.netty.channel.epoll.EpollServerSocketChannel; +import io.netty.channel.group.DefaultChannelGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.util.concurrent.GlobalEventExecutor; +import org.alexdev.havana.log.Log; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.net.InetSocketAddress; +import java.util.concurrent.atomic.AtomicInteger; + +public class MusServer { + final private static int BACK_LOG = 20; + final private static int BUFFER_SIZE = 2048; + final private static Logger log = LoggerFactory.getLogger(MusServer.class); + + private final String ip; + private final int port; + + private DefaultChannelGroup channels; + private ServerBootstrap bootstrap; + private AtomicInteger connectionIds; + + private EventLoopGroup bossGroup; + private EventLoopGroup workerGroup; + + public MusServer(String ip, int port) { + this.ip = ip; + this.port = port; + this.channels = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); + this.bootstrap = new ServerBootstrap(); + this.connectionIds = new AtomicInteger(0); + } + + /** + * Create the Netty sockets. + */ + public void createSocket() { + int threads = Runtime.getRuntime().availableProcessors(); + this.bossGroup = (Epoll.isAvailable()) ? new EpollEventLoopGroup(threads) : new NioEventLoopGroup(threads); + this.workerGroup = (Epoll.isAvailable()) ? new EpollEventLoopGroup(threads) : new NioEventLoopGroup(threads); + + this.bootstrap.group(bossGroup, workerGroup) + .channel((Epoll.isAvailable()) ? EpollServerSocketChannel.class : NioServerSocketChannel.class) + .childHandler(new MusChannelInitializer(this)) + .option(ChannelOption.SO_BACKLOG, BACK_LOG) + .childOption(ChannelOption.TCP_NODELAY, true) + .childOption(ChannelOption.SO_KEEPALIVE, true) + .childOption(ChannelOption.SO_RCVBUF, BUFFER_SIZE) + .childOption(ChannelOption.RCVBUF_ALLOCATOR, new FixedRecvByteBufAllocator(BUFFER_SIZE)) + .childOption(ChannelOption.ALLOCATOR, new PooledByteBufAllocator(true)); + } + + /** + * Bind the server to its address that's been specified + */ + public void bind() { + this.bootstrap.bind(new InetSocketAddress(this.getIp(), this.getPort())).addListener(objectFuture -> { + if (!objectFuture.isSuccess()) { + Log.getErrorLogger().error("Failed to start MUS server on address: {}:{}", this.getIp(), this.getPort()); + Log.getErrorLogger().error("Please double check there's no programs using the same port, and you have set the correct IP address to listen on.", this.getIp(), this.getPort()); + } else { + log.info("Multi User Server (MUS) is listening on {}:{}", this.getIp(), this.getPort()); + } + }); + } + + /** + * Dispose the server handler. + * + * @throws InterruptedException will throw exception if fails + */ + public void dispose() throws InterruptedException { + // Shutdown gracefully + this.workerGroup.shutdownGracefully().sync(); + this.bossGroup.shutdownGracefully().sync(); + } + + /** + * Get the IP of this server. + * + * @return the server ip + */ + private String getIp() { + return ip; + } + + /** + * Get the port of this server. + * + * @return the port + */ + private Integer getPort() { + return port; + } + + /** + * Get default channel group of channels + * @return channels + */ + public DefaultChannelGroup getChannels() { + return channels; + } + + /** + * Get handler for connection ids. + * + * @return the atomic int instance + */ + public AtomicInteger getConnectionIds() { + return connectionIds; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/server/mus/MusUtil.java b/Havana-Server/src/main/java/org/alexdev/havana/server/mus/MusUtil.java new file mode 100644 index 0000000..939fa5b --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/server/mus/MusUtil.java @@ -0,0 +1,101 @@ +package org.alexdev.havana.server.mus; + +import io.netty.buffer.ByteBuf; +import org.alexdev.havana.server.mus.streams.MusPropList; +import org.alexdev.havana.server.mus.streams.MusTypes; + +public class MusUtil { + public static String readEvenPaddedString(ByteBuf in) { + // String length + int length = in.readInt(); + if (length <= 0) { + return ""; + } else { + // Actual string bytes + byte[] bytes = new byte[length]; + in.readBytes(bytes); + + // Advance one byte if uneven + if ((length % 2) != 0) { + in.readByte(); + } + + // Return the string + return new String(bytes); + } + } + + public static void writeEvenPaddedString(ByteBuf out, String str) { + // String length + out.writeInt(str.length()); + + // Actual string bytes + out.writeBytes(str.getBytes()); + + // Add a null byte if uneven + if ((str.length() % 2) != 0) { + out.writeByte(0); + } + } + + public static MusPropList readPropList(ByteBuf in) { + // Length of list + int length = in.readInt(); + + // Allocate props + MusPropList props = new MusPropList(length); + + // Parse them + for (int i = 0; i < length; i++) { + // Symbol type (always string) + in.readShort(); + + // Symbol (key) + String symbol = MusUtil.readEvenPaddedString(in); + + // Data type + short dataType = in.readShort(); + + // Data (value) + int dataLength; + if (dataType == MusTypes.Integer) { + dataLength = 4; + } else { + dataLength = in.readInt(); + } + byte[] data = new byte[dataLength]; + in.readBytes(data); + if ((dataLength % 2) != 0) { + in.readByte(); + } + + // Set prop + props.setPropAsBytes(symbol, dataType, data); + } + + return props; + } + + public static void writePropList(ByteBuf out, MusPropList props) { + // Length + out.writeInt(props.length()); + + // Serialize elements + for (int i = 0; i < props.length(); i++) { + // Symbol + out.writeShort(MusTypes.Symbol); + MusUtil.writeEvenPaddedString(out, props.getSymbolAt(i)); + + // Value + out.writeShort(props.getDataTypeAt(i)); + byte[] data = props.getDataAt(i); + if (props.getDataTypeAt(i) != MusTypes.Integer) { + out.writeInt(data.length); + } + out.writeBytes(data); + if ((data.length % 2) != 0) { + out.writeByte(0); + } + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/server/mus/codec/MusNetworkDecoder.java b/Havana-Server/src/main/java/org/alexdev/havana/server/mus/codec/MusNetworkDecoder.java new file mode 100644 index 0000000..48ff521 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/server/mus/codec/MusNetworkDecoder.java @@ -0,0 +1,66 @@ +package org.alexdev.havana.server.mus.codec; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.bytes.ByteArrayDecoder; +import org.alexdev.havana.server.mus.MusUtil; +import org.alexdev.havana.server.mus.streams.MusMessage; +import org.alexdev.havana.server.mus.streams.MusTypes; + +import java.util.List; + +public class MusNetworkDecoder extends ByteArrayDecoder { + + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf buffer, List out) { + byte headerTag = buffer.readByte(); + buffer.readByte(); + + if (headerTag != 'r') { + ctx.channel().close(); + } else { + MusMessage musMessage = new MusMessage(); + musMessage.setSize(buffer.readInt()); + + if (buffer.readableBytes() < musMessage.getSize()) { + buffer.resetReaderIndex(); + return; + } + + ByteBuf body = buffer.readBytes(musMessage.getSize()); + + musMessage.setErrorCode(body.readInt()); + musMessage.setTimestamp(body.readInt()); + musMessage.setSubject(MusUtil.readEvenPaddedString(body)); + musMessage.setSenderId(MusUtil.readEvenPaddedString(body)); + + String[] receivers = new String[body.readInt()]; + + for (int i = 0; i < receivers.length; i++) { + receivers[i] = MusUtil.readEvenPaddedString(body); + } + + if (musMessage.getSubject().equals("Logon")) { + // Read in remaining data + byte[] tmpBytes = new byte[body.readableBytes()]; + body.readBytes(tmpBytes); + + // Set fields + musMessage.setContentType(MusTypes.String); + musMessage.setContentString(new String(tmpBytes)); + } else { + musMessage.setContentType(body.readShort()); + + if (musMessage.getContentType() == MusTypes.Integer) + musMessage.setContentInt(body.readInt()); + else if (musMessage.getContentType() == MusTypes.String) + musMessage.setContentString(MusUtil.readEvenPaddedString(body)); + else if (musMessage.getContentType() == MusTypes.PropList) + musMessage.setContentPropList(MusUtil.readPropList(body)); + } + + body.release(); + out.add(musMessage); + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/server/mus/codec/MusNetworkEncoder.java b/Havana-Server/src/main/java/org/alexdev/havana/server/mus/codec/MusNetworkEncoder.java new file mode 100644 index 0000000..027b799 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/server/mus/codec/MusNetworkEncoder.java @@ -0,0 +1,66 @@ +package org.alexdev.havana.server.mus.codec; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.MessageToMessageEncoder; +import org.alexdev.havana.server.mus.MusUtil; +import org.alexdev.havana.server.mus.streams.MusMessage; +import org.alexdev.havana.server.mus.streams.MusTypes; +import org.alexdev.havana.server.netty.codec.NetworkEncoder; +import org.alexdev.havana.util.DateUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; + +public class MusNetworkEncoder extends MessageToMessageEncoder { + final private static Logger log = LoggerFactory.getLogger(NetworkEncoder.class); + + @Override + protected void encode(ChannelHandlerContext ctx, MusMessage msg, List out) throws Exception { + ByteBuf buffer = ctx.alloc().buffer(); + + msg.setSenderId("System"); + msg.setReceivers(new String[] { "*" }); + msg.setTimestamp(DateUtil.getCurrentTimeSeconds()); + + ByteBuf temporaryBuffer = ctx.alloc().buffer(); + temporaryBuffer.writeInt(msg.getErrorCode()); + temporaryBuffer.writeInt((int) msg.getTimestamp()); // Ugh, I know right? Old protocol... + + MusUtil.writeEvenPaddedString(temporaryBuffer, msg.getSubject()); + MusUtil.writeEvenPaddedString(temporaryBuffer, msg.getSenderId()); + + temporaryBuffer.writeInt(msg.getReceivers().length); + + for (int i = 0; i < msg.getReceivers().length; i++) { + MusUtil.writeEvenPaddedString(temporaryBuffer, msg.getReceivers()[i]); + } + + temporaryBuffer.writeShort(msg.getContentType()); + + // Content + if (msg.getContentType() != MusTypes.Void) { + if (msg.getContentType() == MusTypes.Integer) + temporaryBuffer.writeInt(msg.getContentInt()); + else if (msg.getContentType() == MusTypes.String) + MusUtil.writeEvenPaddedString(temporaryBuffer, msg.getContentString()); + else if (msg.getContentType() == MusTypes.PropList) + MusUtil.writePropList(temporaryBuffer, msg.getContentPropList()); + else + System.out.println("Unsupported MusMessage content type " + msg.getContentType() + "!"); + } + + byte[] body = new byte[temporaryBuffer.readableBytes()]; + + temporaryBuffer.readBytes(body); + temporaryBuffer.release(); + + buffer.writeByte('r'); + buffer.writeByte(0); + buffer.writeInt(body.length); + buffer.writeBytes(body); + + out.add(buffer); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/server/mus/connection/MusClient.java b/Havana-Server/src/main/java/org/alexdev/havana/server/mus/connection/MusClient.java new file mode 100644 index 0000000..e3e3f95 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/server/mus/connection/MusClient.java @@ -0,0 +1,35 @@ +package org.alexdev.havana.server.mus.connection; + +import io.netty.channel.Channel; + +public class MusClient { + private Channel channel; + private String photoText; + private int userId; + + public MusClient(Channel channel) { + this.channel = channel; + this.userId = 0; + this.photoText = ""; + } + + public int getUserId() { + return userId; + } + + public void setUserId(int userId) { + this.userId = userId; + } + + public String getPhotoText() { + return photoText; + } + + public void setPhotoText(String photoText) { + this.photoText = photoText; + } + + public Channel getChannel() { + return channel; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/server/mus/streams/MusMessage.java b/Havana-Server/src/main/java/org/alexdev/havana/server/mus/streams/MusMessage.java new file mode 100644 index 0000000..399850b --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/server/mus/streams/MusMessage.java @@ -0,0 +1,102 @@ +package org.alexdev.havana.server.mus.streams; + +public class MusMessage { + private int size; + private int errorCode; + private long timestamp; + private String subject; + private String senderId; + private String[] receivers; + private short contentType; + private int contentInt; + private String contentString; + private MusPropList contentPropList; + + public int getSize() { + return size; + } + + public void setSize(int size) { + this.size = size; + } + + public int getErrorCode() { + return errorCode; + } + + public void setErrorCode(int errorCode) { + this.errorCode = errorCode; + } + + public long getTimestamp() { + return timestamp; + } + + public void setTimestamp(long timestamp) { + this.timestamp = timestamp; + } + + public String getSubject() { + return subject; + } + + public void setSubject(String subject) { + this.subject = subject; + } + + public String getSenderId() { + return senderId; + } + + public void setSenderId(String senderId) { + this.senderId = senderId; + } + + public String[] getReceivers() { + return receivers; + } + + public void setReceivers(String[] receivers) { + this.receivers = receivers; + } + + public short getContentType() { + return contentType; + } + + public void setContentType(short contentType) { + this.contentType = contentType; + } + + public int getContentInt() { + return contentInt; + } + + public void setContentInt(int contentInt) { + this.contentInt = contentInt; + } + + public String getContentString() { + return contentString; + } + + public void setContentString(String contentString) { + this.contentString = contentString; + } + + public MusPropList getContentPropList() { + return contentPropList; + } + + public void setContentPropList(MusPropList contentPropList) { + this.contentPropList = contentPropList; + } + + @Override + public String toString() { + if (this.contentString != null) + return this.subject + ":\"" + this.contentString + "\""; + else + return this.subject + ":\"\""; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/server/mus/streams/MusPropList.java b/Havana-Server/src/main/java/org/alexdev/havana/server/mus/streams/MusPropList.java new file mode 100644 index 0000000..e72015e --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/server/mus/streams/MusPropList.java @@ -0,0 +1,94 @@ +package org.alexdev.havana.server.mus.streams; + +import org.alexdev.havana.util.BitUtil; + +public class MusPropList { + private String[] symbols; + private short[] dataTypes; + private byte[][] data; + + public MusPropList(int length) { + symbols = new String[length]; + dataTypes = new short[length]; + data = new byte[length][0]; + } + + public boolean setPropAsBytes(String symbol, short type, byte[] data) { + for (int i = 0; i < symbols.length; i++) { + if (symbols[i] == null) { + symbols[i] = symbol; + dataTypes[i] = type; + this.data[i] = data; + + return true; + } + } + + // No space + return false; + } + + public void setPropAsInt(String symbol, int i) { + byte[] data = BitUtil.intToBytes(i); + this.setPropAsBytes(symbol, MusTypes.Integer, data); + } + + public void setPropAsString(String symbol, String str) { + byte[] data = str.getBytes(); + this.setPropAsBytes(symbol, MusTypes.String, data); + } + + public short getPropType(String symbol) { + for (int i = 0; i < symbols.length; i++) { + if (symbols[i] != null) { + if (symbols[i].equals(symbol)) { + return dataTypes[i]; + } + } + } + + return MusTypes.Void; + } + + public byte[] getPropAsBytes(String symbol) { + for (int i = 0; i < symbols.length; i++) { + if (symbols[i] != null) { + if (symbols[i].equals(symbol)) { + return data[i]; + } + } + } + + return new byte[0]; + } + + public int getPropAsInt(String symbol) { + byte[] bytes = this.getPropAsBytes(symbol); + if (bytes.length == 0) { + return -1; + } else { + return BitUtil.bytesToInt(bytes); + } + } + + public String getPropAsString(String symbol) { + byte[] bytes = this.getPropAsBytes(symbol); + return new String(bytes); + } + + public String getSymbolAt(int slot) { + return symbols[slot]; + } + + public short getDataTypeAt(int slot) { + return dataTypes[slot]; + } + + public byte[] getDataAt(int slot) { + return data[slot]; + } + + public int length() { + return symbols.length; + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/server/mus/streams/MusTypes.java b/Havana-Server/src/main/java/org/alexdev/havana/server/mus/streams/MusTypes.java new file mode 100644 index 0000000..4f8ea65 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/server/mus/streams/MusTypes.java @@ -0,0 +1,65 @@ +package org.alexdev.havana.server.mus.streams; + +public final class MusTypes +{ + /** + * No encoded data or additional bytes + */ + public final static short Void = 0; + /** + * 4 bytes in network (not Intel) order + */ + public final static short Integer = 1; + /** + * 4 bytes with string length, then N bytes of string data, not null terminated,but padded to an even byte boundary + */ + public final static short Symbol = 2; + /** + * 4 bytes with string length, then N bytes of string data, not null terminated,but padded to an even byte boundary + */ + public final static short String = 3; + /** + * 4 bytes with data length, then N bytes of binary picture data, padded to an even byte boundary + */ + public final static short Picture = 5; + /** + * 8 bytes in network (not Intel) order + */ + public final static short Float = 6; + /** + * 4 bytes with the number of elements in the list, then N values + */ + public final static short List = 7; + /** + * 2 numeric values, each may be either an integer or float. First is X, then Y + */ + public final static short Point = 8; + /** + * 4 numeric values, each may be either an integer or float. First is top, left, bottom, then right + */ + public final static short Rect = 9; + /** + * 4 bytes with the number of elements in the list, then N pairs of values. The first of each pair is a symbol, then the corresponding value + */ + public final static short PropList = 10; + /** + * 4 bytes of binary data + */ + public final static short Color = 18; + /** + * 16 bytes of binary data + */ + public final static short Date = 19; + /** + * 4 bytes with the data length, then N bytes of binary media data, padded to an even byte boundary + */ + public final static short Media = 20; + /** + * 3 floats (8 bytes each, 24 total) in network order + */ + public final static short Vector3D = 22; + /** + * 16 floats (8 bytes each, 128 total) in network order + */ + public final static short Transform3D = 23; +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/server/netty/NettyChannelInitializer.java b/Havana-Server/src/main/java/org/alexdev/havana/server/netty/NettyChannelInitializer.java new file mode 100644 index 0000000..3a923b0 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/server/netty/NettyChannelInitializer.java @@ -0,0 +1,38 @@ +package org.alexdev.havana.server.netty; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.timeout.IdleStateHandler; +import io.netty.handler.traffic.ChannelTrafficShapingHandler; +import org.alexdev.havana.server.netty.codec.NetworkDecoder; +import org.alexdev.havana.server.netty.codec.NetworkEncoder; +import org.alexdev.havana.server.netty.connections.ConnectionHandler; +import org.alexdev.havana.server.netty.connections.IdleConnectionHandler; +import org.alexdev.havana.util.config.GameConfiguration; + +public class NettyChannelInitializer extends ChannelInitializer { + private final NettyServer nettyServer; + //private final long readLimit = 40*1024; + //private final long writeLimit = 25*1024; + + public NettyChannelInitializer(NettyServer nettyServer) { + this.nettyServer = nettyServer; + } + + @Override + protected void initChannel(SocketChannel socketChannel) throws Exception { + ChannelPipeline pipeline = socketChannel.pipeline(); + + if (GameConfiguration.getInstance().getBoolean("server.limit.bandwidth")) { + long bandwidthLimit = GameConfiguration.getInstance().getLong("server.limit.bandwidth.amount"); + pipeline.addLast("trafficShapingHandler", new ChannelTrafficShapingHandler(bandwidthLimit, bandwidthLimit)); + } + + pipeline.addLast("gameEncoder", new NetworkEncoder()); + pipeline.addLast("gameDecoder", new NetworkDecoder()); + pipeline.addLast("handler", new ConnectionHandler(this.nettyServer)); + pipeline.addLast("idleStateHandler", new IdleStateHandler(60, 0, 0)); + pipeline.addLast("idleHandler", new IdleConnectionHandler()); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/server/netty/NettyPlayerNetwork.java b/Havana-Server/src/main/java/org/alexdev/havana/server/netty/NettyPlayerNetwork.java new file mode 100644 index 0000000..9e2b937 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/server/netty/NettyPlayerNetwork.java @@ -0,0 +1,76 @@ +package org.alexdev.havana.server.netty; + +import io.netty.channel.Channel; +import org.alexdev.havana.Havana; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.util.StringUtil; +import org.alexdev.havana.util.config.ServerConfiguration; +import org.apache.commons.validator.routines.InetAddressValidator; + +public class NettyPlayerNetwork { + private Channel channel; + private int connectionId; + + private boolean saveMachineId; + private String clientMachineId; + + public NettyPlayerNetwork(Channel channel, int connectionId) { + this.channel = channel; + this.connectionId = connectionId; + } + + public Channel getChannel() { + return this.channel; + } + + public void send(Object response) { + this.channel.writeAndFlush(response); + } + + public void disconnect() { + this.channel.close(); + } + + public int getConnectionId() { + return connectionId; + } + + public static String getIpAddress(Channel channel) { + var data = channel.remoteAddress().toString().replace("/", ""); + String[] ipData = data.split(":"); + + InetAddressValidator validator = InetAddressValidator.getInstance(); + + // Validate an IPv4 address + if (validator.isValidInet4Address(ipData[0])) { + return ipData[0]; + } else { + // Try validate IPv6 + String ip = data.replace(":" + ipData[ipData.length - 1], ""); + + if (validator.isValidInet6Address(ip)) { + return ip; + } + } + + return null; + } + + public String getClientMachineId() { + return clientMachineId; + } + + public void setClientMachineId(String clientMachineId) { + this.clientMachineId = clientMachineId; + } + + public boolean saveMachineId() { + return saveMachineId; + } + + public void setSaveMachineId(boolean saveMachineId) { + this.saveMachineId = saveMachineId; + } + +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/server/netty/NettyServer.java b/Havana-Server/src/main/java/org/alexdev/havana/server/netty/NettyServer.java new file mode 100644 index 0000000..baddc9f --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/server/netty/NettyServer.java @@ -0,0 +1,136 @@ +package org.alexdev.havana.server.netty; + +import io.netty.bootstrap.ServerBootstrap; +import io.netty.buffer.PooledByteBufAllocator; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.FixedRecvByteBufAllocator; +import io.netty.channel.epoll.Epoll; +import io.netty.channel.epoll.EpollEventLoopGroup; +import io.netty.channel.epoll.EpollServerSocketChannel; +import io.netty.channel.group.DefaultChannelGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.util.concurrent.GlobalEventExecutor; +import org.alexdev.havana.log.Log; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.net.InetSocketAddress; +import java.util.concurrent.atomic.AtomicInteger; + +public class NettyServer { + final private static int BACK_LOG = 20; + final private static int BUFFER_SIZE = 2048; + final private static Logger log = LoggerFactory.getLogger(NettyServer.class); + + private final String ip; + private final int port; + + private DefaultChannelGroup channels; + private ServerBootstrap bootstrap; + private AtomicInteger connectionIds; + + private EventLoopGroup bossGroup; + private EventLoopGroup workerGroup; + + public NettyServer(String ip, int port) { + this.ip = ip; + this.port = port; + this.channels = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); + this.bootstrap = new ServerBootstrap(); + this.connectionIds = new AtomicInteger(0); + } + + /** + * Create the Netty sockets. + */ + public void createSocket() { + int threads = Runtime.getRuntime().availableProcessors(); + this.bossGroup = (Epoll.isAvailable()) ? new EpollEventLoopGroup(threads) : new NioEventLoopGroup(threads); + this.workerGroup = (Epoll.isAvailable()) ? new EpollEventLoopGroup(threads) : new NioEventLoopGroup(threads); + + this.bootstrap.group(bossGroup, workerGroup) + .channel((Epoll.isAvailable()) ? EpollServerSocketChannel.class : NioServerSocketChannel.class) + .childHandler(new NettyChannelInitializer(this)) + .option(ChannelOption.SO_BACKLOG, BACK_LOG) + .childOption(ChannelOption.TCP_NODELAY, true) + .childOption(ChannelOption.SO_KEEPALIVE, true) + .childOption(ChannelOption.SO_RCVBUF, BUFFER_SIZE) + .childOption(ChannelOption.RCVBUF_ALLOCATOR, new FixedRecvByteBufAllocator(BUFFER_SIZE)) + .childOption(ChannelOption.ALLOCATOR, new PooledByteBufAllocator(true)); + } + + /** + * Bind the server to its address that's been specified + */ + public void bind() { + this.bootstrap.bind(new InetSocketAddress(this.getIp(), this.getPort())).addListener(objectFuture -> { + if (!objectFuture.isSuccess()) { + Log.getErrorLogger().error("Failed to start server on address: {}:{}", this.getIp(), this.port); + Log.getErrorLogger().error("Please double check there's no programs using the same game port, and you have set the correct IP address to listen on."); + } else { + log.info("Shockwave game server is listening on {}:{}", this.getIp(), this.getPort()); + } + }); + } + + public int getFlashPort() { + return this.port + 2; + } + + public int getBetaPort() { + return this.port + 4; + } + + /** + * Dispose the server handler. + * + * @throws InterruptedException + */ + public void dispose(boolean doSync) throws InterruptedException { + // Shutdown gracefully + if (doSync) { + this.workerGroup.shutdownGracefully().sync(); + this.bossGroup.shutdownGracefully().sync(); + } else { + this.workerGroup.shutdownGracefully(); + this.bossGroup.shutdownGracefully(); + } + } + + /** + * Get the IP of this server. + * + * @return the server ip + */ + private String getIp() { + return ip; + } + + /** + * Get the port of this server. + * + * @return the port + */ + private Integer getPort() { + return port; + } + + /** + * Get default channel group of channels + * @return channels + */ + public DefaultChannelGroup getChannels() { + return channels; + } + + /** + * Get handler for connection ids. + * + * @return the atomic int instance + */ + public AtomicInteger getConnectionIds() { + return connectionIds; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/server/netty/ServerHandlerType.java b/Havana-Server/src/main/java/org/alexdev/havana/server/netty/ServerHandlerType.java new file mode 100644 index 0000000..b235f7c --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/server/netty/ServerHandlerType.java @@ -0,0 +1,5 @@ +package org.alexdev.havana.server.netty; + +public enum ServerHandlerType { + RC4 +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/server/netty/codec/EncryptionDecoder.java b/Havana-Server/src/main/java/org/alexdev/havana/server/netty/codec/EncryptionDecoder.java new file mode 100644 index 0000000..93671ea --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/server/netty/codec/EncryptionDecoder.java @@ -0,0 +1,29 @@ +package org.alexdev.havana.server.netty.codec; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import org.alexdev.havana.game.encryption.RC4; + +import java.util.List; + +public class EncryptionDecoder extends ByteToMessageDecoder { + + private RC4 rc4; + + public EncryptionDecoder(RC4 rc4) { + this.rc4 = rc4; + } + + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf buffer, List out) throws Exception { + ByteBuf result = Unpooled.buffer(); + + while (buffer.readableBytes() > 0) { + result.writeByte((byte) (buffer.readByte() ^ this.rc4.next())); + } + + out.add(result); + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/server/netty/codec/NetworkDecoder.java b/Havana-Server/src/main/java/org/alexdev/havana/server/netty/codec/NetworkDecoder.java new file mode 100644 index 0000000..86dfeee --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/server/netty/codec/NetworkDecoder.java @@ -0,0 +1,35 @@ +package org.alexdev.havana.server.netty.codec; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.util.encoding.Base64Encoding; + +import java.util.List; + +public class NetworkDecoder extends ByteToMessageDecoder { + + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf buffer, List out) { + if (buffer.readableBytes() < 5) { + // If the incoming data is less than 5 bytes, it's junk. + return; + } + + buffer.markReaderIndex(); + int length = Base64Encoding.decode(new byte[]{buffer.readByte(), buffer.readByte(), buffer.readByte()}); + + if (buffer.readableBytes() < length) { + buffer.resetReaderIndex(); + return; + } + + if (length < 0) { + return; + } + + out.add(new NettyRequest(buffer.readBytes(length))); + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/server/netty/codec/NetworkEncoder.java b/Havana-Server/src/main/java/org/alexdev/havana/server/netty/codec/NetworkEncoder.java new file mode 100644 index 0000000..a6b4f2f --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/server/netty/codec/NetworkEncoder.java @@ -0,0 +1,67 @@ +package org.alexdev.havana.server.netty.codec; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.MessageToMessageEncoder; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.log.Log; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; +import org.alexdev.havana.messages.outgoing.messenger.MESSENGER_MSG; +import org.alexdev.havana.messages.outgoing.rooms.user.CHAT_MESSAGE; +import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.messages.types.PlayerMessageComposer; +import org.alexdev.havana.server.netty.streams.NettyResponse; +import org.alexdev.havana.util.config.ServerConfiguration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; + +public class NetworkEncoder extends MessageToMessageEncoder { + final private static Logger log = LoggerFactory.getLogger(NetworkEncoder.class); + + @Override + protected void encode(ChannelHandlerContext ctx, Object obj, List out) throws Exception { + Player player = ctx.channel().attr(Player.PLAYER_KEY).get(); + ByteBuf buffer = ctx.alloc().buffer(); + + if (obj instanceof MessageComposer) { + MessageComposer msg = (MessageComposer) obj; + + if (obj instanceof PlayerMessageComposer) { + PlayerMessageComposer playerMessageComposer = (PlayerMessageComposer) obj; + playerMessageComposer.setPlayer(player); + } + + NettyResponse response = new NettyResponse(msg.getHeader(), buffer); + + try { + msg.compose(response); + } catch (Exception ex) { + String name = ""; + + if (player != null && player.isLoggedIn()) { + name = player.getDetails().getName(); + } + + Log.getErrorLogger().error("Error occurred when composing (" + response.getHeader() + ") for user (" + name + "):", ex); + return; + } + + if (!response.isFinalised()) { + buffer.writeByte(1); + response.setFinalised(true); + } + + if (ServerConfiguration.getBoolean("log.sent.packets")) { + log.info("SENT: {} / {}", msg.getHeader(), response.getBodyString()); + } + } + + if (obj instanceof String) { + buffer.writeBytes(((String) obj).getBytes()); + } + + out.add(buffer); + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/server/netty/connections/ConnectionHandler.java b/Havana-Server/src/main/java/org/alexdev/havana/server/netty/connections/ConnectionHandler.java new file mode 100644 index 0000000..69216cb --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/server/netty/connections/ConnectionHandler.java @@ -0,0 +1,121 @@ +package org.alexdev.havana.server.netty.connections; + +import io.netty.channel.Channel; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; +import org.alexdev.havana.Havana; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.log.Log; +import org.alexdev.havana.messages.MessageHandler; +import org.alexdev.havana.messages.outgoing.handshake.HELLO; +import org.alexdev.havana.server.netty.NettyPlayerNetwork; +import org.alexdev.havana.server.netty.NettyServer; +import org.alexdev.havana.server.netty.streams.NettyRequest; +import org.alexdev.havana.util.config.GameConfiguration; +import org.alexdev.havana.util.config.ServerConfiguration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; + +public class ConnectionHandler extends SimpleChannelInboundHandler { + final private static Logger log = LoggerFactory.getLogger(ConnectionHandler.class); + private static final int MAX_CONNECTIONS = 1000; + final private NettyServer server; + + public ConnectionHandler(NettyServer server) { + this.server = server; + } + + @Override + public void channelRegistered(ChannelHandlerContext ctx) throws Exception { + int maxConnectionsPerIp = GameConfiguration.getInstance().getInteger("max.connections.per.ip"); + String ipAddress = NettyPlayerNetwork.getIpAddress(ctx.channel()); + + // TODO: IP ban checking + + if (maxConnectionsPerIp > 0) { + int count = 0; + + for (Channel channel : this.server.getChannels()) { + String connectedIpAddress = NettyPlayerNetwork.getIpAddress(channel); + + if (connectedIpAddress.equals(ipAddress)) { + count++; + } + } + + if (count >= maxConnectionsPerIp) { + //log.debug("Kicking off connection from " + ipAddress + " due to max connections reached"); + ctx.channel().close(); + return; + } + } + + Player player = new Player(new NettyPlayerNetwork(ctx.channel(), this.server.getConnectionIds().getAndIncrement())); + ctx.channel().attr(Player.PLAYER_KEY).set(player); + + if (!this.server.getChannels().add(ctx.channel()) || Havana.isShuttingdown()) { + ctx.close(); + return; + } + + player.send(new HELLO()); + + if (ServerConfiguration.getBoolean("log.connections")) { + log.info("[{}] Connection from {} ", player.getNetwork().getConnectionId(), NettyPlayerNetwork.getIpAddress(ctx.channel())); + } + } + + @Override + public void channelUnregistered(ChannelHandlerContext ctx) throws Exception { + if (this.server.getConnectionIds().get() > 0) + this.server.getConnectionIds().getAndDecrement(); // Decrement because we don't want it to reach Integer.MAX_VALUE + + if (this.server.getChannels().contains(ctx.channel())) { + this.server.getChannels().remove(ctx.channel()); + } + + Player player = ctx.channel().attr(Player.PLAYER_KEY).get(); + + if (player != null) { + player.dispose(); + + if (ServerConfiguration.getBoolean("log.connections")) { + log.info("[{}] Disconnection from {} ", player.getNetwork().getConnectionId(), NettyPlayerNetwork.getIpAddress(ctx.channel())); + } + } + } + + @Override + public void channelRead0(ChannelHandlerContext ctx, NettyRequest message) { + Player player = ctx.channel().attr(Player.PLAYER_KEY).get(); + + if (player == null) { + Log.getErrorLogger().error("Player was null from {}", ctx.channel().remoteAddress().toString().replace("/", "").split(":")[0]); + return; + } + + if (message == null) { + Log.getErrorLogger().error("Receiving message was null from {}", ctx.channel().remoteAddress().toString().replace("/", "").split(":")[0]); + return; + } + + MessageHandler.getInstance().handleRequest(player, message); + + try { + message.dispose(); + } catch (Exception ex) { + Log.getErrorLogger().error("Error when disposing message:", ex); + } + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + //if (cause instanceof Exception) { + if (!(cause instanceof IOException)) { + Log.getErrorLogger().error("Netty error occurred: ", cause); //ctx.close(); + } + //} + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/server/netty/connections/IdleConnectionHandler.java b/Havana-Server/src/main/java/org/alexdev/havana/server/netty/connections/IdleConnectionHandler.java new file mode 100644 index 0000000..5e217cb --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/server/netty/connections/IdleConnectionHandler.java @@ -0,0 +1,41 @@ +package org.alexdev.havana.server.netty.connections; + +import io.netty.channel.ChannelDuplexHandler; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.timeout.IdleState; +import io.netty.handler.timeout.IdleStateEvent; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.messages.outgoing.user.PING; +import org.alexdev.havana.util.config.ServerConfiguration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class IdleConnectionHandler extends ChannelDuplexHandler { + private static Logger logger = LoggerFactory.getLogger(IdleConnectionHandler.class); + + @Override + public void userEventTriggered(ChannelHandlerContext ctx, Object event) { + if (event instanceof IdleStateEvent) { + IdleStateEvent e = (IdleStateEvent) event; + + if (e.state() == IdleState.READER_IDLE) { + Player player = ctx.channel().attr(Player.PLAYER_KEY).get(); + + if (player.isPingOK()) { + player.setPingOK(false); + player.send(new PING()); + } else { + if (ServerConfiguration.getBoolean("log.connections")) { + if (player.isLoggedIn()) { + logger.info("Player {} has timed out", player.getDetails().getName()); + } else { + logger.info("Connection {} has timed out", player.getNetwork().getConnectionId()); + } + } + + player.kickFromServer(); + } + } + } + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/server/netty/streams/NettyRequest.java b/Havana-Server/src/main/java/org/alexdev/havana/server/netty/streams/NettyRequest.java new file mode 100644 index 0000000..5f0f042 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/server/netty/streams/NettyRequest.java @@ -0,0 +1,162 @@ +package org.alexdev.havana.server.netty.streams; + +import io.netty.buffer.ByteBuf; +import org.alexdev.havana.server.util.MalformedPacketException; +import org.alexdev.havana.util.StringUtil; +import org.alexdev.havana.util.encoding.Base64Encoding; +import org.alexdev.havana.util.encoding.VL64Encoding; + +import java.nio.charset.Charset; + +public class NettyRequest { + final private int headerId; + final private String header; + final private ByteBuf buffer; + private boolean isDisposed; + + public NettyRequest(ByteBuf buffer) { + this.buffer = buffer; + this.header = new String(new byte[] { buffer.readByte(), buffer.readByte() }); + this.headerId = Base64Encoding.decode(header.getBytes()); + } + + + public NettyRequest(int headerId, ByteBuf buffer) { + this.buffer = buffer; + this.headerId = headerId; + this.header = new String(Base64Encoding.encode(headerId, 2), StringUtil.getCharset()); + } + + public Integer readInt() throws MalformedPacketException { + try { + byte[] remaining = this.remainingBytes(); + + int length = remaining[0] >> 3 & 7; + int value = VL64Encoding.decode(remaining); + readBytes(length); + + return value; + } catch (Exception ex) { + throw new MalformedPacketException("The packet sent to the server was malformed."); + } + } + + public int readBase64() throws MalformedPacketException { + try { + return Base64Encoding.decode(new byte[] { + this.buffer.readByte(), + this.buffer.readByte() + }); + } catch (Exception ex) { + throw new MalformedPacketException("The packet sent to the server was malformed."); + } + } + + public boolean readBoolean() throws MalformedPacketException { + try { + return this.readInt() == 1; + } catch (Exception ex) { + throw new MalformedPacketException("The packet sent to the server was malformed."); + } + + } + + public String readString() throws MalformedPacketException { + try { + int length = this.readBase64(); + byte[] data = this.readBytes(length); + + return new String(data, StringUtil.getCharset()); + } catch (Exception ex) { + throw new MalformedPacketException("The packet sent to the server was malformed."); + } + } + + public String readClientString() throws MalformedPacketException { + try { + byte[] data = remainingBytes(); + + int position = 0; + + for (int i = 0; i < data.length; i++) { + if (data[i] == (byte) 2) { + break; + } + + position = i; + } + + String readData = new String(this.readBytes(position + 1), StringUtil.getCharset()); + this.readBytes(1); + return readData; + + } catch (Exception ex) { + throw new MalformedPacketException("The packet sent to the server was malformed."); + } + } + + public byte[] readBytes(int len) throws MalformedPacketException { + try { + byte[] payload = new byte[len]; + this.buffer.readBytes(payload); + return payload; + } catch (Exception ex) { + throw new MalformedPacketException("The packet sent to the server was malformed."); + } + } + + public byte[] remainingBytes() throws MalformedPacketException { + try { + this.buffer.markReaderIndex(); + + byte[] bytes = new byte[this.buffer.readableBytes()]; + buffer.readBytes(bytes); + + this.buffer.resetReaderIndex(); + return bytes; + } catch (Exception ex) { + throw new MalformedPacketException("The packet sent to the server was malformed."); + } + } + + public String contents() throws MalformedPacketException { + try { + byte[] remiainingBytes = this.remainingBytes(); + + if (remiainingBytes != null) { + return new String(remiainingBytes); + } + + return null; + } catch (Exception ex) { + throw new MalformedPacketException("The packet sent to the server was malformed."); + } + } + + public String getMessageBody() { + String consoleText = this.buffer.toString(Charset.defaultCharset()); + + for (int i = 0; i < 14; i++) { + consoleText = consoleText.replace(Character.toString((char)i), "{" + i + "}"); + } + + return this.header + consoleText; + } + + public String getHeader() { + return header; + } + + public int getHeaderId() { + return headerId; + } + + public void dispose() { + if (this.isDisposed) { + return; + } + + this.isDisposed = true; + this.buffer.release(); + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/server/netty/streams/NettyResponse.java b/Havana-Server/src/main/java/org/alexdev/havana/server/netty/streams/NettyResponse.java new file mode 100644 index 0000000..7a6781d --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/server/netty/streams/NettyResponse.java @@ -0,0 +1,117 @@ +package org.alexdev.havana.server.netty.streams; + +import io.netty.buffer.ByteBuf; +import org.alexdev.havana.util.StringUtil; +import org.alexdev.havana.util.encoding.Base64Encoding; +import org.alexdev.havana.util.encoding.VL64Encoding; + +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; + +public class NettyResponse { + private short id; + private ByteBuf buffer; + private boolean finalised; + + public NettyResponse(short header, ByteBuf buffer) { + this.id = header; + this.buffer = buffer; + this.buffer.writeBytes(Base64Encoding.encode(header, 2)); + } + + /** + * Write an object as a raw string. + * + * @param obj the object to write + */ + public void write(Object obj) { + this.buffer.writeBytes(obj.toString().getBytes(StringUtil.getCharset())); + } + + /** + * Write an object with a character 2 suffix. + * + * @param obj the string to write + */ + public void writeString(Object obj) { + if (obj == null) { + obj = ""; + } + + this.buffer.writeBytes(obj.toString().getBytes(StringUtil.getCharset())); + this.buffer.writeByte(2); + // this.writeString(obj, null); + } + + /** + * Write a VL74 encoded integer. + * + * @param number the number to encode. + */ + public void writeInt(Integer number) { + this.buffer.writeBytes(VL64Encoding.encode(number)); + } + + /** + * Write an object with a custom delimeter. + * + * @param key the key to write + * @param value the delimeter to write + */ + public void write(Object key, Object value) { + this.buffer.writeBytes(key.toString().getBytes(StringUtil.getCharset())); + this.buffer.writeBytes(value.toString().getBytes(StringUtil.getCharset())); + } + + /** + * Write boolean, H or I in VL64 representation. + * + * @param obj the boolean to write + */ + public void writeBool(Boolean obj) { + this.writeInt(obj ? 1 : 0); + } + + /** + * Get a packet string but in readable format. + * + * @return the readable packet + */ + public String getBodyString() { + String str = this.buffer.toString(Charset.defaultCharset()); + + for (int i = 0; i < 14; i++) { + str = str.replace(Character.toString((char)i), "[" + i + "]"); + } + + return str; + } + + /** + * If this packet has been finalised before sending. + * Means it will add the character 1 suffix. + * + * @return true, if it was + */ + public boolean isFinalised() { + return finalised; + + } + + /** + * Setting to finalised means it will not add + * the character 1 suffix since it has already been added. + * + * @param finalised whether it should be finalised or not + */ + public void setFinalised(boolean finalised) { + this.finalised = finalised; + } + + /* (non-Javadoc) + * @see org.alexdev.icarus.server.api.messages.Response#getHeader() + */ + public int getHeader() { + return this.id; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/server/rcon/RconChannelInitializer.java b/Havana-Server/src/main/java/org/alexdev/havana/server/rcon/RconChannelInitializer.java new file mode 100644 index 0000000..1bd3d0a --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/server/rcon/RconChannelInitializer.java @@ -0,0 +1,21 @@ +package org.alexdev.havana.server.rcon; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import org.alexdev.havana.server.rcon.codec.RconNetworkDecoder; + +public class RconChannelInitializer extends ChannelInitializer { + private final RconServer musServer; + + public RconChannelInitializer(RconServer musServer) { + this.musServer = musServer; + } + + @Override + protected void initChannel(SocketChannel socketChannel) throws Exception { + ChannelPipeline pipeline = socketChannel.pipeline(); + pipeline.addLast("gameDecoder", new RconNetworkDecoder()); + pipeline.addLast("handler", new RconConnectionHandler(this.musServer)); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/server/rcon/RconConnectionHandler.java b/Havana-Server/src/main/java/org/alexdev/havana/server/rcon/RconConnectionHandler.java new file mode 100644 index 0000000..89e9623 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/server/rcon/RconConnectionHandler.java @@ -0,0 +1,331 @@ +package org.alexdev.havana.server.rcon; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; +import org.alexdev.havana.Havana; +import org.alexdev.havana.dao.mysql.*; +import org.alexdev.havana.game.achievements.AchievementManager; +import org.alexdev.havana.game.achievements.AchievementType; +import org.alexdev.havana.game.ads.AdManager; +import org.alexdev.havana.game.groups.GroupMember; +import org.alexdev.havana.game.infobus.InfobusManager; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.ItemManager; +import org.alexdev.havana.game.messenger.MessengerUser; +import org.alexdev.havana.game.pathfinder.Position; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.PlayerManager; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.RoomManager; +import org.alexdev.havana.log.Log; +import org.alexdev.havana.messages.incoming.catalogue.GET_CATALOG_INDEX; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; +import org.alexdev.havana.messages.outgoing.handshake.RIGHTS; +import org.alexdev.havana.messages.outgoing.rooms.groups.GROUP_BADGES; +import org.alexdev.havana.messages.outgoing.rooms.groups.GROUP_MEMBERSHIP_UPDATE; +import org.alexdev.havana.messages.outgoing.user.currencies.CREDIT_BALANCE; +import org.alexdev.havana.server.rcon.messages.RconMessage; +import org.alexdev.havana.util.config.GameConfiguration; +import org.alexdev.havana.util.config.writer.GameConfigWriter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.HashMap; + +public class RconConnectionHandler extends ChannelInboundHandlerAdapter { + final private static Logger log = LoggerFactory.getLogger(RconConnectionHandler.class); + + private final RconServer server; + + public RconConnectionHandler(RconServer rconServer) { + this.server = rconServer; + } + + @Override + public void channelRegistered(ChannelHandlerContext ctx) { + if (!this.server.getChannels().add(ctx.channel()) || Havana.isShuttingdown()) { + //Log.getErrorLogger().error("Could not accept RCON connection from {}", ctx.channel().remoteAddress().toString().replace("/", "").split(":")[0]); + ctx.close(); + } + + //log.info("[RCON] Connection from {}", ctx.channel().remoteAddress().toString().replace("/", "").split(":")[0]); + } + + @Override + public void channelUnregistered(ChannelHandlerContext ctx) { + this.server.getChannels().remove(ctx.channel()); + //log.info("[RCON] Disconnection from {}", ctx.channel().remoteAddress().toString().replace("/", "").split(":")[0]); + } + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) { + if (!(msg instanceof RconMessage)) { + return; + } + + RconMessage message = (RconMessage) msg; + + //log.info("[RCON] Message received: " + message); + + try { + switch (message.getHeader()) { + case DISCONNECT_USER: + Player online = PlayerManager.getInstance().getPlayerById(Integer.parseInt(message.getValues().get("userId"))); + + if (online != null) { + online.getNetwork().disconnect(); + } + + break; + case REFRESH_LOOKS: + online = PlayerManager.getInstance().getPlayerById(Integer.parseInt(message.getValues().get("userId"))); + + if (online != null) { + online.getRoomUser().refreshAppearance(); + } + + break; + case HOTEL_ALERT: + String messageSender = message.getValues().get("sender"); + String hotelAlert = message.getValues().get("message"); + + StringBuilder alert = new StringBuilder(); + alert.append(hotelAlert).append("
"); + alert.append("
"); + alert.append("- ").append(messageSender); + + for (Player player : PlayerManager.getInstance().getPlayers()) { + player.send(new ALERT(alert.toString())); + } + break; + case REFRESH_CLUB: + online = PlayerManager.getInstance().getPlayerById(Integer.parseInt(message.getValues().get("userId"))); + + if (online != null) { + PlayerDetails playerDetails = PlayerDao.getDetails(online.getDetails().getId()); + + online.getDetails().setCredits(playerDetails.getCredits()); + online.getDetails().setClubExpiration(playerDetails.getClubExpiration()); + online.getDetails().setFirstClubSubscription(playerDetails.getFirstClubSubscription()); + + PlayerDao.saveCurrency(online.getDetails().getId(), playerDetails.getCredits(), online.getDetails().getPixels()); + + online.send(new CREDIT_BALANCE(online.getDetails().getCredits())); + online.send(new RIGHTS(online.getFuserights())); + online.refreshClub(); + + AchievementManager.getInstance().tryProgress(AchievementType.ACHIEVEMENT_HC, online); + } + + break; + + case REFRESH_TAGS: + online = PlayerManager.getInstance().getPlayerById(Integer.parseInt(message.getValues().get("userId"))); + + if (online != null) { + AchievementManager.getInstance().tryProgress(AchievementType.ACHIEVEMENT_TAGS, online); + + if (online.getRoomUser().getRoom() != null) { + online.getRoomUser().refreshTags(); + } + } + break; + case REFRESH_HAND: + online = PlayerManager.getInstance().getPlayerById(Integer.parseInt(message.getValues().get("userId"))); + + if (online != null) { + online.getInventory().reload(); + + if (online.getRoomUser().getRoom() != null) + online.getInventory().getView("new"); + } + + break; + case REFRESH_CREDITS: + online = PlayerManager.getInstance().getPlayerById(Integer.parseInt(message.getValues().get("userId"))); + + if (online != null) { + online.getDetails().setCredits(CurrencyDao.getCredits(online.getDetails().getId())); + online.send(new CREDIT_BALANCE(online.getDetails().getCredits())); + } + + break; + case FRIEND_REQUEST: + online = PlayerManager.getInstance().getPlayerById(Integer.parseInt(message.getValues().get("friendId"))); + int requestFrom = Integer.parseInt(message.getValues().get("userId")); + + if (online != null) { + if (!online.getMessenger().hasRequest(requestFrom)) { + online.getMessenger().addRequest(new MessengerUser(PlayerManager.getInstance().getPlayerData(requestFrom))); + } + } + + break; + case REFRESH_MESSENGER_CATEGORIES: + online = PlayerManager.getInstance().getPlayerById(Integer.parseInt(message.getValues().get("userId"))); + + if (online != null) { + online.getMessenger().getCategories().clear(); + online.getMessenger().getCategories().addAll(MessengerDao.getCategories(online.getDetails().getId())); + + // Refresh friends for categories + for (MessengerUser dbFriend : MessengerDao.getFriends(online.getDetails().getId()).values()) { + MessengerUser friend = online.getMessenger().getFriend(dbFriend.getUserId()); + + if (friend != null) { + if (friend.getCategoryId() != dbFriend.getCategoryId()) { + friend.setCategoryId(dbFriend.getCategoryId()); + online.getMessenger().queueFriendUpdate(friend); + } + } + } + } + + break; + case REFRESH_TRADE_SETTING: + online = PlayerManager.getInstance().getPlayerById(Integer.parseInt(message.getValues().get("userId"))); + + if (online != null) { + boolean oldTradeSetting = online.getDetails().isTradeEnabled(); + online.getDetails().setTradeEnabled(message.getValues().get("tradeEnabled").equalsIgnoreCase("1")); + + if (!oldTradeSetting && online.getDetails().isTradeEnabled()) { + AchievementManager.getInstance().tryProgress(AchievementType.ACHIEVEMENT_TRADERPASS, online); + + if (online.getRoomUser().getRoom() != null && + !online.getRoomUser().getRoom().isGameArena()) { + Position currentPosition = online.getRoomUser().getPosition(); + + online.getRoomUser().getRoom().getEntityManager().enterRoom(online, currentPosition); + online.getRoomUser().invokeItem(null, false); + } + } + } + break; + case REFRESH_GROUP_PERMS: + online = PlayerManager.getInstance().getPlayerById(Integer.parseInt(message.getValues().get("userId"))); + + if (online != null) { + online.refreshJoinedGroups(); + + PlayerDetails newDetails = PlayerDao.getDetails(online.getDetails().getId()); + online.getDetails().setFavouriteGroupId(newDetails.getFavouriteGroupId()); + + int newGroup = newDetails.getFavouriteGroupId(); + + if (online.getRoomUser().getRoom() != null) { + GroupMember groupMember = null; + + if (online.getDetails().getFavouriteGroupId() > 0) { + groupMember = online.getDetails().getGroupMember(); + } + + if (groupMember != null) { + online.getRoomUser().getRoom().send(new GROUP_BADGES(new HashMap<>() {{ + put(newGroup, online.getJoinedGroup(newGroup).getBadge()); + }})); + } + + online.getRoomUser().getRoom().send(new GROUP_MEMBERSHIP_UPDATE(online.getRoomUser().getInstanceId(), groupMember == null ? -1 : groupMember.getGroupId(), groupMember == null ? -1 : groupMember.getMemberRank().getClientRank())); + } + } + + break; + case GROUP_DELETED: + int groupId = Integer.parseInt(message.getValues().get("groupId")); + + for (Player player : PlayerManager.getInstance().getPlayers()) { + if (player.getDetails().getFavouriteGroupId() == groupId) { + player.getDetails().setFavouriteGroupId(0); + + if (player.getRoomUser().getRoom() != null) { + player.getRoomUser().getRoom().send(new GROUP_MEMBERSHIP_UPDATE(player.getRoomUser().getInstanceId(), -1, -1)); + } + + player.refreshJoinedGroups(); + } + } + break; + case REFRESH_GROUP: + groupId = Integer.parseInt(message.getValues().get("groupId")); + + for (Player player : PlayerManager.getInstance().getPlayers()) { + if (player.getJoinedGroup(groupId) != null) { + player.refreshJoinedGroups(); + } + } + + break; + case REFRESH_ADS: + AdManager.getInstance().reset(); + break; + case REFRESH_ROOM_BADGES: + RoomManager.getInstance().reloadBadges(); + RoomManager.getInstance().giveBadges(); + break; + case INFOBUS_DOOR_STATUS: + InfobusManager.getInstance().updateDoorStatus(message.getValues().get("doorStatus").equals("1")); + break; + case INFOBUS_END_EVENT: + InfobusManager.getInstance().stopEvent(); + break; + case INFOBUS_POLL: + int pollId = Integer.parseInt(message.getValues().get("pollId")); + InfobusManager.getInstance().startPolling(pollId); + break; + case REFRESH_CATALOGUE_FRONTPAGE: + GameConfiguration.reset(new GameConfigWriter()); + + for (Player p : PlayerManager.getInstance().getPlayers()) { + new GET_CATALOG_INDEX().handle(p, null); + } + + break; + case CLEAR_PHOTO: + long itemId = Long.parseLong(message.getValues().get("itemId")); + int userId = Integer.parseInt(message.getValues().get("userId")); + + Item item = ItemManager.getInstance().resolveItem(itemId); + + if (item != null) { + Room room = item.getRoom(); + + if (room != null) { + room.getMapping().removeItem(null, item); + } + + item.delete(); + PhotoDao.deleteItem(itemId); + + TransactionDao.createTransaction(userId, String.valueOf(itemId), "0", 1, + "Hidden photo " + itemId, 0, 0, false); + } + + break; + case REFRESH_STATISTICS: + online = PlayerManager.getInstance().getPlayerById(Integer.parseInt(message.getValues().get("userId"))); + + if (online != null) { + online.getStatisticManager().reload(); + } + + break; + } + } catch (Exception ex) { + Log.getErrorLogger().error("[RCON] Error occurred when handling RCON message: ", ex); + } + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { + if (cause instanceof Exception) { + if (!(cause instanceof IOException)) { + Log.getErrorLogger().error("[RCON] Error occurred: ", cause); + } + } + + ctx.close(); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/server/rcon/RconServer.java b/Havana-Server/src/main/java/org/alexdev/havana/server/rcon/RconServer.java new file mode 100644 index 0000000..55fc4f4 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/server/rcon/RconServer.java @@ -0,0 +1,123 @@ +package org.alexdev.havana.server.rcon; + +import io.netty.bootstrap.ServerBootstrap; +import io.netty.buffer.PooledByteBufAllocator; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.FixedRecvByteBufAllocator; +import io.netty.channel.epoll.Epoll; +import io.netty.channel.epoll.EpollEventLoopGroup; +import io.netty.channel.epoll.EpollServerSocketChannel; +import io.netty.channel.group.DefaultChannelGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.util.concurrent.GlobalEventExecutor; +import org.alexdev.havana.log.Log; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.net.InetSocketAddress; +import java.util.concurrent.atomic.AtomicInteger; + +public class RconServer { + final private static int BACK_LOG = 20; + final private static int BUFFER_SIZE = 2048; + final private static Logger log = LoggerFactory.getLogger(RconServer.class); + + private final String ip; + private final int port; + + private DefaultChannelGroup channels; + private ServerBootstrap bootstrap; + private AtomicInteger connectionIds; + + private EventLoopGroup bossGroup; + private EventLoopGroup workerGroup; + + public RconServer(String ip, int port) { + this.ip = ip; + this.port = port; + this.channels = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); + this.bootstrap = new ServerBootstrap(); + this.connectionIds = new AtomicInteger(0); + } + + /** + * Create the Netty sockets. + */ + public void createSocket() { + int threads = Runtime.getRuntime().availableProcessors(); + this.bossGroup = (Epoll.isAvailable()) ? new EpollEventLoopGroup(threads) : new NioEventLoopGroup(threads); + this.workerGroup = (Epoll.isAvailable()) ? new EpollEventLoopGroup(threads) : new NioEventLoopGroup(threads); + + this.bootstrap.group(bossGroup, workerGroup) + .channel((Epoll.isAvailable()) ? EpollServerSocketChannel.class : NioServerSocketChannel.class) + .childHandler(new RconChannelInitializer(this)) + .option(ChannelOption.SO_BACKLOG, BACK_LOG) + .childOption(ChannelOption.TCP_NODELAY, true) + .childOption(ChannelOption.SO_KEEPALIVE, true) + .childOption(ChannelOption.SO_RCVBUF, BUFFER_SIZE) + .childOption(ChannelOption.RCVBUF_ALLOCATOR, new FixedRecvByteBufAllocator(BUFFER_SIZE)) + .childOption(ChannelOption.ALLOCATOR, new PooledByteBufAllocator(true)); + } + + /** + * Bind the server to its address that's been specified + */ + public void bind() { + this.bootstrap.bind(new InetSocketAddress(this.getIp(), this.getPort())).addListener(objectFuture -> { + if (!objectFuture.isSuccess()) { + Log.getErrorLogger().error("Failed to start RCON server on address: {}:{}", this.getIp(), this.getPort()); + Log.getErrorLogger().error("Please double check there's no programs using the same port, and you have set the correct IP address to listen on.", this.getIp(), this.getPort()); + } else { + log.info("RCON (remote connection) is listening on {}:{}", this.getIp(), this.getPort()); + } + }); + } + + /** + * Dispose the server handler. + * + * @throws InterruptedException will throw exception if fails + */ + public void dispose() throws InterruptedException { + // Shutdown gracefully + this.workerGroup.shutdownGracefully().sync(); + this.bossGroup.shutdownGracefully().sync(); + } + + /** + * Get the IP of this server. + * + * @return the server ip + */ + private String getIp() { + return ip; + } + + /** + * Get the port of this server. + * + * @return the port + */ + private Integer getPort() { + return port; + } + + /** + * Get default channel group of channels + * @return channels + */ + public DefaultChannelGroup getChannels() { + return channels; + } + + /** + * Get handler for connection ids. + * + * @return the atomic int instance + */ + public AtomicInteger getConnectionIds() { + return connectionIds; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/server/rcon/codec/RconNetworkDecoder.java b/Havana-Server/src/main/java/org/alexdev/havana/server/rcon/codec/RconNetworkDecoder.java new file mode 100644 index 0000000..a106f66 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/server/rcon/codec/RconNetworkDecoder.java @@ -0,0 +1,110 @@ +package org.alexdev.havana.server.rcon.codec; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import org.alexdev.havana.server.rcon.messages.RconMessage; +import org.alexdev.havana.util.StringUtil; + +import java.util.HashMap; +import java.util.List; + +public class RconNetworkDecoder extends ByteToMessageDecoder { + + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf buffer, List out) { + if (buffer.readableBytes() < 8) { + // If the incoming data is less than 8 bytes, it's junk. + return; + } + + buffer.markReaderIndex(); + int length = buffer.readInt(); + + if (buffer.readableBytes() < length) { + buffer.resetReaderIndex(); + return; + } + + ByteBuf buf = buffer.readBytes(length); + String header = readString(buf); + + if (header == null) { + clear(buf); + return; + } + + int parameterCount = buf.readInt(); + HashMap parameters = new HashMap<>(parameterCount); + + for (int i = 0; i < parameterCount; i++) { + String key = readString(buf); + String value = readString(buf); + + if (key == null || value == null) { + clear(buf); + return; + } + + parameters.put(key, value); + } + + clear(buf); + + // Send new rcon message + out.add(new RconMessage(header, parameters)); + } + + private void clear(ByteBuf buf) { + if (buf.refCnt() > 0) { + buf.release(); + } + } + + /** + * Release buffer on failure. + * @param buffer the buffer + */ + private void tryRelease(ByteBuf buffer) { + try { + buffer.release(); + } catch (Exception ignored) { + + } + } + + /** + * Read string from byte buffer. + * + * @param buffer the buffer to read from + * @return the string + */ + public String readString(ByteBuf buffer) { + int length = buffer.readInt(); + byte[] data = this.readBytes(buffer, length); + + if (data == null) { + return null; + } + + return new String(data, StringUtil.getCharset()); + } + + /** + * Read bytes of byte buffer. + * + * @param buf the buffer to read the bytes from + * @param len the amount of bytes to read + * @return the bytes returned + */ + public byte[] readBytes(ByteBuf buf, int len) { + if (buf.readableBytes() < len) { + return null; + } + + byte[] payload = new byte[len]; + buf.readBytes(payload); + return payload; + } + +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/server/rcon/messages/RconHeader.java b/Havana-Server/src/main/java/org/alexdev/havana/server/rcon/messages/RconHeader.java new file mode 100644 index 0000000..5833f18 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/server/rcon/messages/RconHeader.java @@ -0,0 +1,45 @@ +package org.alexdev.havana.server.rcon.messages; + +public enum RconHeader { + REFRESH_LOOKS("refresh_looks"), + HOTEL_ALERT("hotel_alert"), + REFRESH_CLUB("refresh_club"), + REFRESH_TAGS("refresh_tags"), + REFRESH_HAND("refresh_hand"), + REFRESH_CREDITS("refresh_credits"), + FRIEND_REQUEST("friendrequest"), + REFRESH_MESSENGER_CATEGORIES("refreshmessengercategories"), + REFRESH_TRADE_SETTING("refreshtrade"), + GROUP_DELETED("groupdeleted"), + REFRESH_GROUP("refreshgroup"), + REFRESH_GROUP_PERMS("refreshgroupperms"), + REFRESH_ADS("refreshads"), + INFOBUS_POLL("infobuspoll"), + INFOBUS_DOOR_STATUS("infobusdoorstatus"), + REFRESH_ROOM_BADGES("refreshroombadges"), + INFOBUS_END_EVENT("infobusendevent"), + REFRESH_CATALOGUE_FRONTPAGE("refreshcataloguefrontpage"), + CLEAR_PHOTO("clearphoto"), + DISCONNECT_USER("disconnect"), + REFRESH_STATISTICS("refreshstats"); + + private final String rawHeader; + + RconHeader(String rawHeader) { + this.rawHeader = rawHeader; + } + + public String getRawHeader() { + return rawHeader; + } + + public static RconHeader getByHeader(String header) { + for (var rconHeader : values()) { + if (rconHeader.getRawHeader().equalsIgnoreCase(header)) { + return rconHeader; + } + } + + return null; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/server/rcon/messages/RconMessage.java b/Havana-Server/src/main/java/org/alexdev/havana/server/rcon/messages/RconMessage.java new file mode 100644 index 0000000..d007cf6 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/server/rcon/messages/RconMessage.java @@ -0,0 +1,23 @@ +package org.alexdev.havana.server.rcon.messages; + +import io.netty.buffer.ByteBuf; + +import java.util.Map; + +public class RconMessage { + private RconHeader header; + private Map values; + + public RconMessage(String header, Map values) { + this.header = RconHeader.getByHeader(header); + this.values = values; + } + + public RconHeader getHeader() { + return header; + } + + public Map getValues() { + return values; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/server/util/MalformedPacketException.java b/Havana-Server/src/main/java/org/alexdev/havana/server/util/MalformedPacketException.java new file mode 100644 index 0000000..ce71786 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/server/util/MalformedPacketException.java @@ -0,0 +1,7 @@ +package org.alexdev.havana.server.util; + +public class MalformedPacketException extends Exception { + public MalformedPacketException(String error) { + super(error); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/util/BitUtil.java b/Havana-Server/src/main/java/org/alexdev/havana/util/BitUtil.java new file mode 100644 index 0000000..329cf5f --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/util/BitUtil.java @@ -0,0 +1,32 @@ +package org.alexdev.havana.util; + +public class BitUtil { + private static final int NUMBER_OF_BITS_IN_A_BYTE = 8; + private static final short MASK_TO_BYTE = 0xFF; + + public static byte[] intToBytes(int i) { + byte[] bytes = new byte[4]; + bytes[3] = (byte) (i & MASK_TO_BYTE); + i >>= NUMBER_OF_BITS_IN_A_BYTE; + bytes[2] = (byte) (i & MASK_TO_BYTE); + i >>= NUMBER_OF_BITS_IN_A_BYTE; + bytes[1] = (byte) (i & MASK_TO_BYTE); + i >>= NUMBER_OF_BITS_IN_A_BYTE; + bytes[0] = (byte) (i & MASK_TO_BYTE); + + return bytes; + } + + private static int bytesToInt(byte A, byte B, byte C, byte D) { + int i = (D & MASK_TO_BYTE); + i |= ((C & MASK_TO_BYTE) << 8); + i |= ((B & MASK_TO_BYTE) << 16); + i |= ((A & MASK_TO_BYTE) << 24); + + return i; + } + + public static int bytesToInt(byte[] bytes) { + return bytesToInt(bytes[0], bytes[1], bytes[2], bytes[3]); + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/util/DateUtil.java b/Havana-Server/src/main/java/org/alexdev/havana/util/DateUtil.java new file mode 100644 index 0000000..075eefa --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/util/DateUtil.java @@ -0,0 +1,196 @@ +package org.alexdev.havana.util; + +import org.alexdev.havana.log.Log; + +import java.text.SimpleDateFormat; +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Date; +import java.util.TimeZone; + +public class DateUtil { + public static final String LONG_DATE = "dd-MM-yyyy HH:mm:ss"; + public static final String CAMERA_DATE = "dd/MM/yyyy HH:mm:ss"; + public static final String SHORT_DATE = "dd-MM-yyyy"; + public static final String SHORT_DATE_TIME = "dd-MM-yyyy hh:mm a"; + + /** + * Returns the current date as "dd-MM-yyyy" + * @return the date as string + */ + public static String getCurrentDate(String format) { + try { + Date date = new Date(); + return new SimpleDateFormat(format).format(date); + } catch (Exception e) { + e.printStackTrace(); + } + + return format; + } + + + /** + * Returns the current date with custom format. + * + * @return the date as string + */ + public static String getDate(long time, String format) { + try { + Date date = new Date(); + date.setTime(time * 1000); + return new SimpleDateFormat(format).format(date); + } catch (Exception e) { + e.printStackTrace(); + } + + return format; + } + + + /** + * Gets the date given by unix timestamp as string. + * + * @param time the unix timestamp + * @return the date as string + */ + public static String getFriendlyDate(long time) { + try { + Date date = new Date(); + date.setTime(time * 1000); + return new SimpleDateFormat("MMM dd, yyyy hh:mm:ss a").format(date).replace("am", "AM").replace("pm","PM").replace(".", ""); + } catch (Exception e) { + e.printStackTrace(); + } + + return "[getFriendlyDate error with " + String.valueOf(time) + "]"; + } + + public static long getFromFormat(String format, String date) { + try { + SimpleDateFormat sdf = new SimpleDateFormat(format); + var d = sdf.parse(date); + return d.getTime() / 1000L; + } catch (Exception e) { + e.printStackTrace(); + } + + return 0; + } + + /** + * Gets the readable timestamp. + * + * @param timestamp the timestamp + * @return the readable timestamp + */ + public static String getReadableTimestamp(long timestamp) { + try { + long different = System.currentTimeMillis() - (timestamp * 1000); + + long secondsInMilli = 1000; + long minutesInMilli = secondsInMilli * 60; + long hoursInMilli = minutesInMilli * 60; + long daysInMilli = hoursInMilli * 24; + + long elapsedDays = different / daysInMilli; + different = different % daysInMilli; + + long elapsedHours = different / hoursInMilli; + different = different % hoursInMilli; + + long elapsedMinutes = different / minutesInMilli; + different = different % minutesInMilli; + + long elapsedSeconds = different / secondsInMilli; + return elapsedDays + " days, " + elapsedHours + " hours, " + elapsedMinutes + " minutes, " + elapsedSeconds + " seconds"; + + } catch (Exception e){ + Log.getErrorLogger().error("Error occurred: ", e); + } + + return null; + } + + /** + * Convert seconds to readable English. + * + * @param input the seconds input + * @return the seconds represented as words + */ + public static String getReadableSeconds(long input) { + try { + //long different = System.currentTimeMillis() - (timestamp * 1000); + long uptime = input * 1000; + long days = (uptime / (1000 * 60 * 60 * 24)); + long hours = (uptime - days * (1000 * 60 * 60 * 24)) / (1000 * 60 * 60); + long minutes = (uptime - days * (1000 * 60 * 60 * 24) - hours * (1000 * 60 * 60)) / (1000 * 60); + long seconds = (uptime - days * (1000 * 60 * 60 * 24) - hours * (1000 * 60 * 60) - minutes * (1000 * 60)) / (1000); + + return days + " day(s), " + hours + " hour(s), " + minutes + " minute(s) and " + seconds + " second(s)"; + + } catch (Exception e){ + Log.getErrorLogger().error("Error occurred: ", e); + } + + return null; + } + + public static String getMarketplaceReadableSeconds(long input) { + try { + //long different = System.currentTimeMillis() - (timestamp * 1000); + long uptime = input * 1000; + long days = (uptime / (1000 * 60 * 60 * 24)); + long hours = (uptime - days * (1000 * 60 * 60 * 24)) / (1000 * 60 * 60); + long minutes = (uptime - days * (1000 * 60 * 60 * 24) - hours * (1000 * 60 * 60)) / (1000 * 60); + long seconds = (uptime - days * (1000 * 60 * 60 * 24) - hours * (1000 * 60 * 60) - minutes * (1000 * 60)) / (1000); + + String r = ""; + + if (days == 1) { + r += days + " day
"; + } else { + r += days + " days
"; + } + + if (hours == 1) { + r += hours + " hour"; + } else { + r += hours + " hours"; + } + + if (days < 1) { + return "" + r + ""; + } + + return r; + + } catch (Exception e){ + Log.getErrorLogger().error("Error occurred: ", e); + } + + return null; + } + + public static LocalDateTime getDateTimeFromTimestamp(long timestamp) { + if (timestamp == 0) + return null; + return LocalDateTime.ofInstant(Instant.ofEpochSecond(timestamp), TimeZone + .getDefault().toZoneId()); + } + + public static LocalDate getDateFromTimestamp(long timestamp) { + LocalDateTime date = getDateTimeFromTimestamp(timestamp); + return date == null ? null : date.toLocalDate(); + } + + /** + * Gets the current time in seconds. + * + * @return the current time in seconds + */ + public static int getCurrentTimeSeconds() { + return (int) (System.currentTimeMillis() / 1000); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/util/EasterUtil.java b/Havana-Server/src/main/java/org/alexdev/havana/util/EasterUtil.java new file mode 100644 index 0000000..dec34f2 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/util/EasterUtil.java @@ -0,0 +1,32 @@ +package org.alexdev.havana.util; + +import java.time.LocalDate; +import java.time.Year; + +public class EasterUtil { + public static boolean isEasterMonday() { + var date = LocalDate.now(); + LocalDate easterThatYear = sundayFor(Year.of(date.getYear())); + return date.equals(easterThatYear.plusDays(1)); + } + + private static LocalDate sundayFor(Year year) { + final int y = year.getValue(); + final int a = y % 19; + final int b = y / 100; + final int c = y % 100; + final int d = b / 4; + final int e = b % 4; + final int f = (b + 8) / 25; + final int g = (b - f + 1) / 3; + final int h = (19 * a + b - d - g + 15) % 30; + final int i = c / 4; + final int k = c % 4; + final int m = (32 + 2 * e + 2 * i - h - k) % 7; + final int n = (a + 11 * h + 22 * m) / 451; + final int o = h + m - 7 * n + 114; + final int month = o / 31; + final int day = ((o % 31) + 1); + return LocalDate.of(y, month, day); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/util/FigureUtil.java b/Havana-Server/src/main/java/org/alexdev/havana/util/FigureUtil.java new file mode 100644 index 0000000..a253cda --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/util/FigureUtil.java @@ -0,0 +1,158 @@ +package org.alexdev.havana.util; + +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import java.io.File; +import java.io.IOException; +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.concurrent.ThreadLocalRandom; + +public class FigureUtil { + public static String getRandomFigure(String genderReq, boolean clubReq) throws ParserConfigurationException, IOException, SAXException { + StringBuilder figureOutput = new StringBuilder(); + + if (genderReq == null) { + if (ThreadLocalRandom.current().nextBoolean()) { + genderReq = "M"; + } else { + genderReq = "F"; + } + } + + DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); + + Document doc = dBuilder.parse(new File("figuredata.xml")); + doc.normalize(); + + NodeList setTypeList = doc.getElementsByTagName("settype"); + + for (int i = 0; i < setTypeList.getLength(); i++) { + Node setType = setTypeList.item(i); + NodeList setList = setType.getChildNodes(); + + LinkedHashMap possibleSets = new LinkedHashMap<>(); + LinkedList randomColours = new LinkedList<>(); + + boolean isMandatory = (setType.getAttributes().getNamedItem("mandatory") != null && setType.getAttributes().getNamedItem("mandatory").getNodeValue().equals("1")) || + ThreadLocalRandom.current().nextBoolean(); + + if (isMandatory) { + String type = setType.getAttributes().getNamedItem("type").getNodeValue(); + + boolean hasColour = false; + + for (int j = 0; j < setList.getLength(); j++) { + Node set = setList.item(j); + + if (set.getNodeName().equals("set")) { + var genderXml = set.getAttributes().getNamedItem("gender"); + + if (genderXml == null) { + continue; + } else { + String gender = set.getAttributes().getNamedItem("gender").getNodeValue(); + + if (!gender.equals("U") && !gender.equals(genderReq)) { + continue; + } + } + + var selectableXml = set.getAttributes().getNamedItem("selectable"); + + if (selectableXml != null) { + String selectable = set.getAttributes().getNamedItem("selectable").getNodeValue(); + + if (selectable.equals("0")) { + continue; + } + } + + var colourableXml = set.getAttributes().getNamedItem("colorable"); + + if (colourableXml != null) { + String colorable = set.getAttributes().getNamedItem("colorable").getNodeValue(); + hasColour = colorable.equals("0"); + } + + var clubXml = set.getAttributes().getNamedItem("club"); + + if (clubXml != null) { + String club = set.getAttributes().getNamedItem("club").getNodeValue(); + + if (club.equals("1") && !clubReq) { + continue; + } + } + + possibleSets.put(set.getAttributes().getNamedItem("id").getNodeValue(), hasColour); + } + } + + int index = ThreadLocalRandom.current().nextInt(0, possibleSets.size()); + + String setId = (String) possibleSets.keySet().toArray()[index]; + boolean isColouringAllowed = (boolean) possibleSets.values().toArray()[index]; + + if (!isColouringAllowed) { + NodeList paletteList = getNodes(doc, setType.getAttributes().getNamedItem("paletteid").getNodeValue()); + + for (int k = 0; k < (paletteList != null ? paletteList.getLength() : 0); k++) { + Node set = paletteList.item(k); + + if (!set.getNodeName().equals("color")) { + continue; + } + + var clubXml = set.getAttributes().getNamedItem("club").getNodeValue(); + + if (clubXml.equals("1") && !clubReq) { + continue; + } + + var selectableXml = set.getAttributes().getNamedItem("selectable").getNodeValue(); + + if (selectableXml.equals("0")) { + continue; + } + + + randomColours.add(set.getAttributes().getNamedItem("id").getNodeValue()); + } + } + + figureOutput.append(type).append("-").append(setId); + figureOutput.append('-'); + + if (randomColours.size() > 0) { + figureOutput.append(randomColours.get(ThreadLocalRandom.current().nextInt(0, randomColours.size()))); + } + + figureOutput.append('.'); + } + } + + return figureOutput.toString().substring(0, figureOutput.toString().length() - 1); + } + + private static NodeList getNodes(Document doc, String paletteId) { + NodeList setTypeList = doc.getElementsByTagName("palette"); + + for (int i = 0; i < setTypeList.getLength(); i++) { + Node setType = setTypeList.item(i); + + if (setType.getAttributes().getNamedItem("id").getNodeValue().equals(paletteId)) { + return setType.getChildNodes(); + } + } + + return null; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/util/HexValidator.java b/Havana-Server/src/main/java/org/alexdev/havana/util/HexValidator.java new file mode 100644 index 0000000..dd4afaa --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/util/HexValidator.java @@ -0,0 +1,20 @@ +package org.alexdev.havana.util; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class HexValidator{ + private static final String HEX_PATTERN = "^([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$"; + + /** + * Validate hex with regular expression + * @param hex hex for validation + * @return true valid hex, false invalid hex + */ + public static boolean validate(final String hex){ + var pattern = Pattern.compile(HEX_PATTERN); + Matcher matcher = pattern.matcher(hex); + return matcher.matches(); + + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/util/SearchUtil.java b/Havana-Server/src/main/java/org/alexdev/havana/util/SearchUtil.java new file mode 100644 index 0000000..d145e60 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/util/SearchUtil.java @@ -0,0 +1,12 @@ +package org.alexdev.havana.util; + +public class SearchUtil { + public static String getOwnerTag(String searchQuery) { + for (String search : searchQuery.split(" ")) { + if (search.startsWith("owner:")) + return search; + } + + return null; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/util/StringUtil.java b/Havana-Server/src/main/java/org/alexdev/havana/util/StringUtil.java new file mode 100644 index 0000000..f6e1e3f --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/util/StringUtil.java @@ -0,0 +1,210 @@ +package org.alexdev.havana.util; + +import com.google.gson.Gson; +import org.alexdev.havana.dao.mysql.TagDao; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.util.config.GameConfiguration; +import org.apache.commons.lang3.StringUtils; + +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.text.Normalizer; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArrayList; + +public class StringUtil { + public static Gson GSON = new Gson(); + + /** + * Checks if is null or empty. + * + * @param param the param + * @return true, if is null or empty + */ + public static boolean isNullOrEmpty(String param) { + return param == null || param.trim().length() == 0; + } + + /** + * Filter input. + * + * @param input the input + * @param filerNewline if new lines (ENTER) should be filtered + * @return the string + */ + public static String filterInput(String input, boolean filerNewline) { + input = input.replace((char) 1, ' '); + input = input.replace((char) 2, ' '); + input = input.replace((char) 9, ' '); + input = input.replace((char) 10, ' '); + input = input.replace((char) 12, ' '); + + if (filerNewline) { + input = input.replace((char) 13, ' '); + } + + if (GameConfiguration.getInstance().getBoolean("normalise.input.strings")) { + input = Normalizer.normalize(input, Normalizer.Form.NFD); + } + + if (input.contains("∂") && input.contains("∫") && input.contains("å") && input.contains("æ")) { + input = input.replace("∂", ""); + input = input.replace("∫", ""); + input = input.replace("å", ""); + input = input.replace("æ", ""); + } + + return input; + } + + /** + * Paginate a list of items. + * + * @param the generic type + * @param originalList the original list + * @param chunkSize the chunk size + * @return the list + */ + public static Map> paginate(List originalList, int chunkSize) { + return paginate(originalList, chunkSize, false); + } + + public static Map> paginate(List originalList, int chunkSize, boolean emptyFirstPage) { + Map> chunks = new ConcurrentHashMap<>(); + List> listOfChunks = new CopyOnWriteArrayList<>(); + + for (int i = 0; i < originalList.size() / chunkSize; i++) { + listOfChunks.add(originalList.subList(i * chunkSize, i * chunkSize + chunkSize)); + } + + if (originalList.size() % chunkSize != 0) { + listOfChunks.add(originalList.subList(originalList.size() - originalList.size() % chunkSize, originalList.size())); + } + + for (int i = 0; i < listOfChunks.size(); i++) { + chunks.put(i, listOfChunks.get(i)); + } + + if (emptyFirstPage && chunks.isEmpty()) { + chunks.put(0, new ArrayList<>()); + } + + return chunks; + } + + /** + * Round to two decimal places. + * + * @param decimal the decimal + * @return the double + */ + public static double format(double decimal) { + return Math.round(decimal * 100.0) / 100.0; + } + + /** + * Split. + * + * @param str the string + * @param delim the delimiter + * @return the list + */ + public static List split(String str, String delim) { + return new ArrayList<>(Arrays.asList(str.split(delim))); + } + + /** + * Get words in a string + * + * @param s the string to get the list for + * @return the list of words + */ + public static String[] getWords(String s) { + String[] words = s.split("\\s+"); + + for (int i = 0; i < words.length; i++) { + words[i] = words[i].replaceAll("[^\\w]", ""); + } + + return words; + } + + /** + * Get encoding for strings + * + * @return the encoding + */ + public static Charset getCharset() { + return StandardCharsets.UTF_8; + } + + public static String isValidTag(String tag, int userId, int roomId, int groupId) { + String formatTag = StringUtils.normalizeSpace((StringUtil.filterInput(tag, false))).replaceAll("\\<[^>]*>", "").replace(",", "").toLowerCase(); + + if (tag.length() <= 1 || tag.trim().isEmpty() || tag.length() > 20 || TagDao.hasTag(userId, roomId, groupId, tag)) { + return null; + } + + return formatTag; + } + + public static String toAlphabetic(int i) { + i = i - 1; + + if (i < 0) { + return "-" + toAlphabetic(-i - 1); + } + + int quot = i / 26; + int rem = i % 26; + char letter = (char) ((int) 'A' + rem); + if (quot == 0) { + return "" + letter; + } else { + return toAlphabetic(quot - 1) + letter; + } + } + + public static void addTag(String tag, int userId, int roomId, int groupId) { + boolean checkAgain = false; + + if (tag.equalsIgnoreCase("br") || tag.equalsIgnoreCase("brasil")) { + tag = "brazil"; + checkAgain = true; + } + + if (tag.equalsIgnoreCase("spanish") || tag.equalsIgnoreCase("es")) { + tag = "español"; + checkAgain = true; + } + + if (checkAgain) { + if (TagDao.hasTag(userId, roomId, groupId, tag)) { + return; + } + } + + TagDao.addTag(userId, roomId, groupId, tag); + } + + public static boolean hasValue(List firstList, List secondList) { + for (var str : firstList) { + if (secondList.contains(str)) { + return true; + } + } + + return false; + } + + public static String replaceAlertMessage(String message, Player player) { + String newString = message; + newString = newString.replace("\r\n", "
"); + newString = newString.replace("\r", "
"); + newString = newString.replace("\n", "
"); + + newString = newString.replace("%username%", player.getDetails().getName()); + return newString; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/util/ValidationUtil.java b/Havana-Server/src/main/java/org/alexdev/havana/util/ValidationUtil.java new file mode 100644 index 0000000..c608d02 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/util/ValidationUtil.java @@ -0,0 +1,83 @@ +package org.alexdev.havana.util; + +import java.util.regex.Pattern; + +public class ValidationUtil { + public static boolean validateWallPosition(String wallPosition) { + //:w=3,2 l=9,63 l + try { + if (wallPosition.contains(Character.toString((char) 13))) { + return false; + } + if (wallPosition.contains(Character.toString((char) 9))) { + return false; + } + + String[] posD = wallPosition.split(" "); + + if (!posD[2].equals("l") && !posD[2].equals("r")) + return false; + + String[] widD = posD[0].substring(3).split(","); + int widthX = Integer.parseInt(widD[0]); + int widthY = Integer.parseInt(widD[1]); + if (widthX < 0 || widthY < 0 || widthX > 200 || widthY > 200) + return false; + + String[] lenD = posD[1].substring(2).split(","); + int lengthX = Integer.parseInt(lenD[0]); + int lengthY = Integer.parseInt(lenD[1]); + + if (lengthX < 0 || lengthY < 0 || lengthX > 200 || lengthY > 200) + return false; + + return true; + } catch (Exception ex) { + return false; + } + } + + public static boolean validateAnstiMutant(String Look, String Gender) { + boolean HasHead = false; + + if (Look.length() < 1) { + return false; + } + + try { + String[] Sets = Look.split(Pattern.quote(".")); + + if (Sets.length < 4) { + return false; + } + + for (String Set : Sets) { + String[] Parts = Set.split(Pattern.quote("-")); + + if (Parts.length < 2 || Parts.length > 3) { + return false; + } + + String Name = Parts[0]; + int Type = Integer.parseInt(Parts[1]); + int Color = Integer.parseInt(Parts[1]); + + if (Type <= 0 || Color < 0) { + return false; + } + + if (Name.length() != 2) { + return false; + } + + if (Name.equals("hd")) { + HasHead = true; + } + } + } catch (Exception ex) { + return false; + } + + return HasHead && (Gender.equals("M") || Gender.equals("F")); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/util/config/Configuration.java b/Havana-Server/src/main/java/org/alexdev/havana/util/config/Configuration.java new file mode 100644 index 0000000..465a2f5 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/util/config/Configuration.java @@ -0,0 +1,66 @@ +package org.alexdev.havana.util.config; + +import org.apache.commons.configuration2.INIConfiguration; +import org.apache.commons.configuration2.SubnodeConfiguration; +import org.apache.commons.configuration2.ex.ConfigurationException; + +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +public class Configuration { + public static Map load(String configPath) throws IOError, IOException, ConfigurationException { + Map config = new ConcurrentHashMap<>(); + Path path = Paths.get(configPath); + + INIConfiguration ini = new INIConfiguration(); + BufferedReader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8); + ini.read(reader); + + Set sectionNames = ini.getSections(); + //System.out.printf("Section names: %s", sectionNames.toString()); + + for (String sectionName : sectionNames) { + SubnodeConfiguration section = ini.getSection(sectionName); + + if (section != null) { + Iterator keys = section.getKeys(); + + while (keys.hasNext()) { + String key = keys.next(); + String value = section.getString(key); + + if (value != null) { + key = key.replace("..", "."); // TODO: find a better way than this hack + config.put(key, value); + } + } + } + } + + reader.close(); + + return config; + } + + /** + * Create config file + * @throws IOException the exception if the file couldn't be read/written to + */ + public static PrintWriter createConfigurationFile(String configPath) throws IOException { + File file = new File(configPath); + + if (!file.isFile() && file.createNewFile()) { + return new PrintWriter(file.getAbsoluteFile()); + } + + return null; + } + +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/util/config/GameConfiguration.java b/Havana-Server/src/main/java/org/alexdev/havana/util/config/GameConfiguration.java new file mode 100644 index 0000000..b0d4944 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/util/config/GameConfiguration.java @@ -0,0 +1,130 @@ +package org.alexdev.havana.util.config; + +import org.alexdev.havana.dao.mysql.SettingsDao; +import org.alexdev.havana.util.config.writer.ConfigWriter; + +import java.util.Map; + +public class GameConfiguration { + private static GameConfiguration instance; + private Map config; + + public GameConfiguration(ConfigWriter configWriter) { + this.config = configWriter.setConfigurationDefaults(); + + Map settings = SettingsDao.getAllSettings(); + + for (var entrySet : this.config.entrySet()) { + String value = settings.get(entrySet.getKey()); + + if (value != null) { + this.config.put(entrySet.getKey(), value); + } else { + SettingsDao.newSetting(entrySet.getKey(), entrySet.getValue()); + } + } + } + + /** + * Get the configuration map. + * + * @return the configuration map + */ + public Map getConfig() { + return config; + } + + /** + * Get key from configuration and cast to an Boolean + * + * @param key the key to use + * @return value as boolean + */ + public boolean getBoolean(String key) { + String val = config.getOrDefault(key, "false"); + + if (val.equalsIgnoreCase("true")) { + return true; + } + + if (val.equals("1")) { + return true; + } + + return val.equalsIgnoreCase("yes"); + + } + + /** + * Get value from configuration + * + * @param key the key to use + * @return value + */ + public String getString(String key) { + return config.getOrDefault(key, key); + } + + /** + * Get value from configuration with default value + * + * @param key the key to use + * @param def the default value + * @return value + */ + public String getString(String key, String def) { + return config.getOrDefault(key, def); + } + + /** + * Get value from configuration and cast to an Integer + * + * @param key the key to use + * @return value as int + */ + public int getInteger(String key) { + return Integer.parseInt(config.getOrDefault(key, "0")); + } + + /** + * Get value from configuration and cast to a long. + * + * @param key the key to use + * @return value as long + */ + public long getLong(String key) { + return Long.parseLong(config.getOrDefault(key, "0")); + } + + /** + * Method to update setting. + * + * @param key the key to set for the value it has + * @param value the new value it has + */ + public void updateSetting(String key, Object value) { + this.config.put(key, value.toString()); + SettingsDao.updateSetting(key, value.toString()); + } + + /** + * Reset all game configuration values. + */ + public static void reset(ConfigWriter configWriter) { + instance = null; + GameConfiguration.getInstance(configWriter); + } + + /** + * Get the instance of {@link GameConfiguration} + * + * @return the instance + */ + public static GameConfiguration getInstance(ConfigWriter... configWriter) { + if (instance == null || configWriter.length > 0) { + instance = new GameConfiguration(configWriter[0]); + } + + return instance; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/util/config/LoggingConfiguration.java b/Havana-Server/src/main/java/org/alexdev/havana/util/config/LoggingConfiguration.java new file mode 100644 index 0000000..2172147 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/util/config/LoggingConfiguration.java @@ -0,0 +1,64 @@ +package org.alexdev.havana.util.config; + +import org.apache.log4j.PropertyConfigurator; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.PrintWriter; + +public class LoggingConfiguration { + /** + * Create the configuration files for this application, with the default values. Will throw an + * exception if it could not create such files. + * + * @throws FileNotFoundException the exception if an error happens + */ + public static void checkLoggingConfig() throws FileNotFoundException { + String output = "log4j.rootLogger=INFO, stdout, SERVER_LOG\n" + + "log4j.appender.stdout.threshold=info\n" + + "log4j.appender.stdout=org.apache.log4j.ConsoleAppender\n" + + "log4j.appender.stdout.Target=System.out\n" + + "log4j.appender.stdout.layout=org.apache.log4j.PatternLayout\n" + + "log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd'T'HH:mm:ss.SSS} %-5p [%c] - %m%n\n" + + "\n" + + "# Create new logger information for error\n" + + "log4j.logger.ErrorLogger=ERROR, error, ERROR_FILE\n" + + "log4j.additivity.ErrorLogger=false\n" + + "\n" + + "# Set settings for the error logger\n" + + "log4j.appender.error=org.apache.log4j.ConsoleAppender\n" + + "log4j.appender.error.Target=System.err\n" + + "log4j.appender.error.layout=org.apache.log4j.PatternLayout\n" + + "log4j.appender.error.layout.ConversionPattern=%d{yyyy-MM-dd'T'HH:mm:ss.SSS} %-5p [%c] - %m%n\n" + + "\n" + + "# Define the file appender for errors\n" + + "log4j.appender.ERROR_FILE=org.apache.log4j.FileAppender\n" + + "log4j.appender.ERROR_FILE.File=error.log\n" + + "log4j.appender.ERROR_FILE.ImmediateFlush=true\n" + + "log4j.appender.ERROR_FILE.Threshold=debug\n" + + "log4j.appender.ERROR_FILE.Append=true\n" + + "log4j.appender.ERROR_FILE.layout=org.apache.log4j.PatternLayout\n" + + "log4j.appender.ERROR_FILE.layout.conversionPattern=%d{yyyy-MM-dd'T'HH:mm:ss.SSS} - [%c] - %m%n\n" + + "\n" + + "# Define the file appender for server output\n" + + "log4j.appender.SERVER_LOG=org.apache.log4j.FileAppender\n" + + "log4j.appender.SERVER_LOG.File=server.log\n" + + "log4j.appender.SERVER_LOG.ImmediateFlush=true\n" + + "log4j.appender.SERVER_LOG.Threshold=debug\n" + + "log4j.appender.SERVER_LOG.Append=true\n" + + "log4j.appender.SERVER_LOG.layout=org.apache.log4j.PatternLayout\n" + + "log4j.appender.SERVER_LOG.layout.conversionPattern=%d{yyyy-MM-dd'T'HH:mm:ss.SSS} - [%c] - %m%n\n"; + + File loggingConfig = new File("log4j.properties"); + + if (!loggingConfig.exists()) { + PrintWriter writer = new PrintWriter(loggingConfig.getAbsoluteFile()); + writer.write(output); + writer.flush(); + writer.close(); + } + + //Change the path where the logger property should be read from + PropertyConfigurator.configure(loggingConfig.getAbsolutePath()); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/util/config/ServerConfiguration.java b/Havana-Server/src/main/java/org/alexdev/havana/util/config/ServerConfiguration.java new file mode 100644 index 0000000..1394608 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/util/config/ServerConfiguration.java @@ -0,0 +1,177 @@ +package org.alexdev.havana.util.config; + +import org.alexdev.havana.util.config.writer.ConfigWriter; +import org.apache.commons.configuration2.ex.ConfigurationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOError; +import java.io.IOException; +import java.io.PrintWriter; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class ServerConfiguration { + private static Logger log = LoggerFactory.getLogger(ServerConfiguration.class); + private static Map config = new ConcurrentHashMap<>(); + private static ConfigWriter writer; + + public static void load(String configPath) throws IOError, IOException, ConfigurationException { + config = writer.setConfigurationDefaults(); + + var configurationFile = Configuration.createConfigurationFile(configPath); + + if (configurationFile != null) { + writer.setConfigurationData(config, configurationFile); + } + + config = Configuration.load(configPath); + + // Environment variables override everything (used for production setup) + loadEnvironmentConfiguration(); + } + + private static void loadEnvironmentConfiguration() { + String envBind = System.getenv("KEPLER_BIND"); + + if (envBind != null) { + try { + config.put("bind", InetAddress.getByName(envBind).getHostAddress()); + } catch (UnknownHostException e) { + log.warn("Could not use {} as bind for game server, reverting to default {}", envBind, config.get("bind")); + } + } + + String envPort = System.getenv("KEPLER_PORT"); + + if (envPort != null) { + int parsedPort = Integer.parseUnsignedInt(envPort); + if (parsedPort > 0) { + config.put("server.port", Integer.toString(parsedPort)); + } + } + + String envMusPort = System.getenv("KEPLER_MUS_PORT"); + + if (envMusPort != null) { + int parsedPort = Integer.parseUnsignedInt(envMusPort); + if (parsedPort > 0) { + config.put("mus.port", Integer.toString(parsedPort)); + } + } + + String envRconBind = System.getenv("KEPLER_RCON_BIND"); + + if (envRconBind != null) { + try { + config.put("rcon.bind", InetAddress.getByName(envRconBind).getHostAddress()); + } catch (UnknownHostException e) { + // Ignore, will revert to default + log.warn("Could not use {} as bind for RCON server, reverting to default {}", envRconBind, config.get("rcon.bind")); + } + } + + String envRconPort = System.getenv("KEPLER_RCON_PORT"); + + if (envRconPort != null) { + int parsedPort = Integer.parseUnsignedInt(envRconPort); + if (parsedPort > 0) { + config.put("rcon.port", Integer.toString(parsedPort)); + } + } + + String envMysqlHost = System.getenv("MYSQL_HOST"); + + if (envMysqlHost != null) { + try { + config.put("mysql.hostname", InetAddress.getByName(envMysqlHost).getHostAddress()); + } catch (UnknownHostException e) { + log.warn("Could not use {} as MariaDB host, reverting to default {}", envMysqlHost, config.get("mysql.hostname")); + } + } + + String envMysqlPort = System.getenv("MYSQL_PORT"); + + if (envMysqlPort != null) { + int parsedPort = Integer.parseUnsignedInt(envMysqlPort); + if (parsedPort > 0) { + config.put("mysql.port", Integer.toString(parsedPort)); + } + } + + String envMysqlUser = System.getenv("MYSQL_USER"); + + if (envMysqlUser != null) { + config.put("mysql.username", envMysqlUser); + } + + String envMysqlDatabase = System.getenv("MYSQL_DATABASE"); + + if (envMysqlDatabase != null) { + config.put("mysql.database", envMysqlDatabase); + } + + String envMysqlPassword = System.getenv("MYSQL_PASSWORD"); + + if (envMysqlPassword != null) { + config.put("mysql.password", envMysqlPassword); + } + } + + /** + * Writes default server configuration + * + * @param writer - {@link PrintWriter} the file writer + */ + private static void setConfigurationData(PrintWriter writer) { + + } + + + /** + * Get key from configuration and cast to an Boolean + * + * @param key the key to use + * @return value as boolean + */ + public static boolean getBoolean(String key) { + String val = config.getOrDefault(key, "false"); + + if (val.equalsIgnoreCase("true")) { + return true; + } + + if (val.equals("1")) { + return true; + } + + return val.equalsIgnoreCase("yes"); + + } + + /** + * Get value from configuration + * + * @param key the key to use + * @return value + */ + public static String getString(String key) { + return config.getOrDefault(key, key); + } + + /** + * Get value from configuration and cast to an Integer + * + * @param key the key to use + * @return value as int + */ + public static int getInteger(String key) { + return Integer.parseInt(config.getOrDefault(key, "0")); + } + + public static void setWriter(ConfigWriter writer) { + ServerConfiguration.writer = writer; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/util/config/writer/ConfigWriter.java b/Havana-Server/src/main/java/org/alexdev/havana/util/config/writer/ConfigWriter.java new file mode 100644 index 0000000..d07253e --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/util/config/writer/ConfigWriter.java @@ -0,0 +1,9 @@ +package org.alexdev.havana.util.config.writer; + +import java.io.PrintWriter; +import java.util.Map; + +public interface ConfigWriter { + public Map setConfigurationDefaults(); + public void setConfigurationData(Map config, PrintWriter writer); +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/util/config/writer/DefaultConfigWriter.java b/Havana-Server/src/main/java/org/alexdev/havana/util/config/writer/DefaultConfigWriter.java new file mode 100644 index 0000000..dd97bdf --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/util/config/writer/DefaultConfigWriter.java @@ -0,0 +1,73 @@ +package org.alexdev.havana.util.config.writer; + +import java.io.PrintWriter; +import java.util.HashMap; +import java.util.Map; + +public class DefaultConfigWriter implements ConfigWriter { + @Override + public Map setConfigurationDefaults() { + Map config = new HashMap<>(); + // DEFAULT settings + config.put("server.bind", "127.0.0.1"); + config.put("server.port", "12321"); + + config.put("server.limit.bandwidth", "false");//String.valueOf(40*1024)); + config.put("server.limit.bandwidth.amount", String.valueOf(40*1024)); + + config.put("mus.bind", "127.0.0.1"); + config.put("mus.port", "12322"); + + config.put("rcon.bind", "127.0.0.1"); + config.put("rcon.port", "12309"); + + config.put("log.connections", "true"); + config.put("log.sent.packets", "false"); + config.put("log.received.packets", "false"); + + config.put("mysql.hostname", "127.0.0.1"); + config.put("mysql.port", "3306"); + config.put("mysql.username", "havana"); + config.put("mysql.password", "verysecret"); + config.put("mysql.database", "havana"); + + config.put("debug", "false"); + return config; + } + + @Override + public void setConfigurationData(Map config, PrintWriter writer) { + writer.println("[Global]"); + writer.println("server.bind=" + config.get("server.bind")); + writer.println("server.port=" + config.get("server.port")); + writer.println(""); + writer.println("[Server]"); + writer.println("server.port=" + config.get("server.port")); + writer.println("server.limit.bandwidth=" + config.get("server.limit.bandwidth")); + writer.println("server.limit.bandwidth.amount=" + config.get("server.limit.bandwidth.amount")); + writer.println(""); + writer.println("[Rcon]"); + writer.println("rcon.bind=" + config.get("rcon.bind")); + writer.println("rcon.port=" + config.get("rcon.port")); + writer.println(""); + writer.println("[Mus]"); + writer.println("mus.bind=" + config.get("mus.bind")); + writer.println("mus.port=" + config.get("mus.port")); + writer.println(""); + writer.println("[Database]"); + writer.println("mysql.hostname=" + config.get("mysql.hostname")); + writer.println("mysql.port=" + config.get("mysql.port")); + writer.println("mysql.username=" + config.get("mysql.username")); + writer.println("mysql.password=" + config.get("mysql.password")); + writer.println("mysql.database=" + config.get("mysql.database")); + writer.println(""); + writer.println("[Logging]"); + writer.println("log.received.packets=" + config.get("log.received.packets")); + writer.println("log.sent.packets=" + config.get("log.sent.packets")); + writer.println(""); + writer.println("[Console]"); + writer.print("debug=" + config.get("debug")); + writer.flush(); + writer.close(); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/util/config/writer/GameConfigWriter.java b/Havana-Server/src/main/java/org/alexdev/havana/util/config/writer/GameConfigWriter.java new file mode 100644 index 0000000..5741827 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/util/config/writer/GameConfigWriter.java @@ -0,0 +1,156 @@ +package org.alexdev.havana.util.config.writer; + +import org.alexdev.havana.game.commands.CommandManager; +import org.alexdev.havana.util.DateUtil; + +import java.io.PrintWriter; +import java.util.HashMap; +import java.util.Map; + +public class GameConfigWriter implements ConfigWriter { + @Override + public Map setConfigurationDefaults() { + Map config = new HashMap<>(); + config.put("site.path", "http://localhost"); + + config.put("room.ads", "true"); + config.put("room.intersitial.ads", "true"); + + /* + config.put("bot.connection.allow", "false"); + config.put("bot.connection.sso.prefix", "botcon2019-"); + */ + + config.put("fuck.aaron", "true"); + config.put("max.connections.per.ip", "2"); + config.put("normalise.input.strings", "false"); + + config.put("room.dispose.timer.enabled", "true"); + config.put("room.dispose.timer.seconds", "30"); + + config.put("welcome.message.enabled", "false"); + config.put("welcome.message.content", "Hello, %username%! And welcome to the Havana server!"); + + config.put("roller.tick.default", "2000"); + + config.put("afk.timer.seconds", "900"); + config.put("sleep.timer.seconds", "300"); + config.put("carry.timer.seconds", "300"); + + config.put("stack.height.limit", "8"); + config.put("players.online", "0"); + + config.put("credits.scheduler.timeunit", "MINUTES"); + config.put("credits.scheduler.interval", "15"); + config.put("credits.scheduler.amount", "20"); + + config.put("daily.credits.wait.time", "300"); + config.put("daily.credits.amount", "120"); + + config.put("pixels.received.timeunit", "MINUTES"); + config.put("pixels.received.interval", "10"); + config.put("pixels.max.tries.single.room.instance", String.valueOf(Integer.MAX_VALUE)); + + config.put("talk.garbled.text", "true"); + config.put("talk.bubble.timeout.seconds", "15"); + + config.put("messenger.max.friends.nonclub", "100"); + config.put("messenger.max.friends.club", "600"); + + config.put("battleball.create.game.enabled", "true"); + config.put("battleball.start.minimum.active.teams", "2"); + config.put("battleball.preparing.game.seconds", "10"); // 5, 4, 3, 2, 1 - then destruction of 1 + config.put("battleball.game.lifetime.seconds", "180"); + config.put("battleball.restart.game.seconds", "30"); + config.put("battleball.ticket.charge", "2"); + config.put("battleball.increase.points", "true"); + + config.put("snowstorm.create.game.enabled", "false"); + config.put("snowstorm.start.minimum.active.teams", "2"); + config.put("snowstorm.preparing.game.seconds", "10"); // 5, 4, 3, 2, 1 - then destruction of 1 + config.put("snowstorm.game.lifetime.seconds", "0"); + config.put("snowstorm.restart.game.seconds", "30"); + config.put("snowstorm.ticket.charge", "2"); + config.put("snowstorm.increase.points", "true"); + + config.put("tutorial.enabled", "false"); + config.put("profile.editing", "false"); + config.put("vouchers.enabled", "true"); + config.put("shutdown.minutes", "1"); + + config.put("reset.sso.after.login", "true"); + config.put("navigator.show.hidden.rooms", "false"); + config.put("navigator.hide.empty.public.categories", "true"); + + config.put("events.category.count", "11"); + config.put("events.expiry.minutes", "120"); + + config.put("club.gift.timeunit", "DAYS"); + config.put("club.gift.interval", "30"); + config.put("club.gift.present.label", "You have just received your monthly club gift!"); + + config.put("alerts.gift.message", "A new gift has arrived. This time you received a %item_name%."); + + config.put("wordfitler.enabled", "true"); + config.put("wordfilter.word.replacement", "bobba"); + + config.put("reward.credits.winner.range", "10-20"); + config.put("reward.credits.loser.range", "0-4"); + + //config.put("advertisement.api", "http://localhost/api/get_ad?picture={pictureName}&roomId={roomId}"); + config.put("xp.monthly.expiry", DateUtil.getCurrentDate("dd-MM")); + config.put("april.fools", "false"); + + config.put("delete.chatlogs.after.x.age", "2592000"); + config.put("delete.iplogs.after.x.age", "2592000"); + config.put("delete.tradelogs.after.x.age", "2592000"); + + config.put("guides.group.id", "0"); + config.put("guide.search.timeout.minutes", "5"); + config.put("guide.completion.minutes", "4320"); + + config.put("habbo.experts.group.id", "0"); + config.put("childline.group.id", "0"); + + config.put("happy.hour.weekday.start", "17:00:00"); + config.put("happy.hour.weekday.end", "18:00:00"); + + config.put("happy.hour.weekend.start", "12:00:00"); + config.put("happy.hour.weekend.end", "13:00:00"); + + config.put("regenerate.map.enabled", "true"); + config.put("regenerate.map.interval", "1"); + + config.put("players.all.time.peak", "0"); + config.put("players.daily.peak", "0"); + config.put("players.daily.peak.date", DateUtil.getCurrentDate(DateUtil.SHORT_DATE)); + + config.put("catalogue.frontpage.input.1", "topstory_habbo_beta.gif"); + config.put("catalogue.frontpage.input.2", "Server is in beta!"); + config.put("catalogue.frontpage.input.3", "Please bare with us while we sort out the final kinks and hitches"); + config.put("catalogue.frontpage.input.4", ""); + + config.put("enforce.strict.packet.policy", "true"); + config.put("trade.email.verification", "false"); + config.put("seasonal.items", "false"); + + config.put("chat.spam.count", "10"); + config.put("walk.spam.count", "10"); + + config.put("stout.room", "0"); + config.put("messenger.enable.official.update.speed", "false"); + + for (var set : CommandManager.getCommands()) { + if (set.getValue().getPlayerRank().getRankId() > 1) { + config.put("groups.ids.permission." + set.getKey()[0], ""); + } + } + + return config; + } + + @Override + public void setConfigurationData(Map config, PrintWriter writer) { + + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/util/encoding/Base64Encoding.java b/Havana-Server/src/main/java/org/alexdev/havana/util/encoding/Base64Encoding.java new file mode 100644 index 0000000..1995875 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/util/encoding/Base64Encoding.java @@ -0,0 +1,37 @@ +package org.alexdev.havana.util.encoding; + +public class Base64Encoding { + public byte NEGATIVE = 64; + public byte POSITIVE = 65; + + public static byte[] encode(int i, int numBytes) { + byte[] bzRes = new byte[numBytes]; + for (int j = 1; j <= numBytes; j++) + { + int k = ((numBytes - j) * 6); + bzRes[j - 1] = (byte)(0x40 + ((i >> k) & 0x3f)); + } + + return bzRes; + } + + public static int decode(byte[] bzData) { + int i = 0; + int j = 0; + for (int k = bzData.length - 1; k >= 0; k--) + { + int x = bzData[k] - 0x40; + if (j > 0) + x *= (int)Math.pow(64.0, (double)j); + + i += x; + j++; + } + + return i; + } + + public static short decodeEwout(byte[] b) { + return (short)(64 * (b[0] & 63) + (b[1] & 63)); + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/util/encoding/VL64Encoding.java b/Havana-Server/src/main/java/org/alexdev/havana/util/encoding/VL64Encoding.java new file mode 100644 index 0000000..a5efb46 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/util/encoding/VL64Encoding.java @@ -0,0 +1,59 @@ +package org.alexdev.havana.util.encoding; + +public class VL64Encoding { + public static byte NEGATIVE = 72; + public static byte POSITIVE = 73; + public static int MAX_INTEGER_BYTE_AMOUNT = 6; + + public static byte[] encode(int i) { + byte[] wf = new byte[VL64Encoding.MAX_INTEGER_BYTE_AMOUNT]; + + int pos = 0; + int numBytes = 1; + int startPos = pos; + int negativeMask = i >= 0 ? 0 : 4; + + i = Math.abs(i); + + wf[pos++] = (byte)(64 + (i & 3)); + + for (i >>= 2; i != 0; i >>= VL64Encoding.MAX_INTEGER_BYTE_AMOUNT) + { + numBytes++; + wf[pos++] = (byte)(64 + (i & 0x3f)); + } + wf[startPos] = (byte)(wf[startPos] | numBytes << 3 | negativeMask); + + byte[] bzData = new byte[numBytes]; + + System.arraycopy(wf, 0, bzData, 0, numBytes); + return bzData; + } + + public static int decode(byte[] bzData) { + int pos = 0; + int v = 0; + + boolean negative = (bzData[pos] & 4) == 4; + int totalBytes = bzData[pos] >> 3 & 7; + + v = bzData[pos] & 3; + + pos++; + + int shiftAmount = 2; + + for (int b = 1; b < totalBytes; b++) + { + v |= (bzData[pos] & 0x3f) << shiftAmount; + shiftAmount = 2 + 6 * b; + pos++; + } + + if (negative) { + v *= -1; + } + + return v; + } +} diff --git a/Havana-Server/src/main/java/org/alexdev/havana/util/encryption/HugeInt15.java b/Havana-Server/src/main/java/org/alexdev/havana/util/encryption/HugeInt15.java new file mode 100644 index 0000000..7f8f8a9 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/util/encryption/HugeInt15.java @@ -0,0 +1,60 @@ +package org.alexdev.havana.util.encryption; + +import java.util.ArrayList; + +public class HugeInt15 { + public static int encode(int tPlain) { + var tSeed = 5678; + var tSBox = new int[] {7530, 6652, 4115, 1750, 3354, 3647, 5188, 2844, 818, 2026, 7133, 2592, 3578}; + var tIterations = 54; + var tCipher = tPlain; + var i = 1; + while (i <= tIterations) { + tSeed = ((((69069 * tSeed) + (139 * i)) + 92541) % 10000); + tSeed = (tSeed + ((int)Math.pow(i, 3))); + tSeed = (((tSBox[(i % tSBox.length)] * tSeed) + 2541) % 10000); + tCipher = tSeed ^ tCipher; + tCipher = (1379 + tSBox[(i % tSBox.length)]) ^ tCipher; + tCipher = ((((14 * tSBox[((i % tSBox.length))]) + 13) % 10000) ^ tCipher); + tCipher = (tCipher * 2); + var tHighBit = (tCipher & 32768); + tCipher = (tCipher & 32767); + tCipher = (tCipher | (tHighBit != 0 ? 1 : 0)); + i = (1 + i); + } + + tCipher = (7639 ^ tCipher); + return tCipher; + } + + public static int decode(int tInput) { + var tSeed = 5678; + var tSBox = new int[]{7530, 6652, 4115, 1750, 3354, 3647, 5188, 2844, 818, 2026, 7133, 2592, 3578}; + var tIterations = 54; + var tSeedCycle = new ArrayList(); + var i = 1; + while (i <= tIterations) { + tSeed = (((69069 * tSeed) + (139 * i)) + 92541) % 10000; + tSeed = (tSeed + ((int) Math.pow(i, 3))); + tSeed = ((tSBox[i % tSBox.length] * tSeed) + 2541) % 10000; + tSeedCycle.add(tSeed); + i = (1 + i); + } + var tCipher = tInput; + tCipher = (7639 ^ tCipher); + i = 1; + while (i <= tIterations) { + var tLowBit = (tCipher & 1); + tCipher = (tCipher / 2); + tLowBit = (tLowBit * 16384); + tCipher = (tCipher | tLowBit); + var tOffset = tIterations - i; + tCipher = (tSeedCycle.get(tOffset) ^ tCipher); + tCipher = ((1379 + tSBox[(tOffset + 1) % tSBox.length]) ^ tCipher); + tCipher = ((((14 * tSBox[(tOffset + 1) % tSBox.length]) + 13) % 10000) ^ tCipher); + i = (1 + i); + } + + return tCipher; + } +} \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/util/schedule/FutureRunnable.java b/Havana-Server/src/main/java/org/alexdev/havana/util/schedule/FutureRunnable.java new file mode 100644 index 0000000..18e5869 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/util/schedule/FutureRunnable.java @@ -0,0 +1,22 @@ +package org.alexdev.havana.util.schedule; + +import java.util.concurrent.Future; + +public abstract class FutureRunnable implements Runnable { + private Future future; + + public Future getFuture() { + return future; + } + + public void setFuture(Future future) { + this.future = future; + } + + public void cancelFuture() { + if (this.future != null) { + this.future.cancel(false); + this.future = null; + } + } +} \ No newline at end of file diff --git a/Havana-Web/.gitignore b/Havana-Web/.gitignore new file mode 100644 index 0000000..34c5f4b --- /dev/null +++ b/Havana-Web/.gitignore @@ -0,0 +1,18 @@ +.gradle/ +.idea/ +/out/ +**.iml +/gradle/ +/build/ +bin/ +tmp/ + +gradlew +gradlew.bat + +habbohotel.properties +game.properties +icarus.properties +locale.ini +log4j.properties +error.log \ No newline at end of file diff --git a/Havana-Web/build.gradle b/Havana-Web/build.gradle new file mode 100644 index 0000000..d649a54 --- /dev/null +++ b/Havana-Web/build.gradle @@ -0,0 +1,95 @@ +apply plugin: 'java' +apply plugin: 'application' + +java { + sourceCompatibility = JavaVersion.toVersion("1.11") + targetCompatibility = JavaVersion.toVersion("1.11") +} + +mainClassName = 'org.alexdev.http.HavanaWeb' + +repositories { + flatDir { + dirs 'libs' + } + maven { url 'https://jitpack.io' } + mavenCentral() +} + +dependencies { + // https://mvnrepository.com/artifact/org.ini4j/ini4j + implementation group: 'org.ini4j', name: 'ini4j', version: '0.5.4' + + // https://mvnrepository.com/artifact/io.pebbletemplates/pebble + implementation group: 'io.pebbletemplates', name: 'pebble', version: '3.1.5' + + // https://mvnrepository.com/artifact/com.zaxxer/HikariCP + implementation group: 'com.zaxxer', name: 'HikariCP', version: '3.4.1' + + // https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client + implementation group: 'org.mariadb.jdbc', name: 'mariadb-java-client', version: '2.2.5' + + // https://mvnrepository.com/artifact/org.apache.commons/commons-configuration2 + implementation group: 'org.apache.commons', name: 'commons-configuration2', version: '2.2' + + // https://mvnrepository.com/artifact/org.apache.commons/commons-text + implementation group: 'org.apache.commons', name: 'commons-text', version: '1.5' + + // https://mvnrepository.com/artifact/commons-io/commons-io + implementation group: 'commons-io', name: 'commons-io', version: '2.5' + + // https://mvnrepository.com/artifact/commons-validator/commons-validator + implementation group: 'commons-validator', name: 'commons-validator', version: '1.6' + + // https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient + implementation group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.5' + + // https://github.com/Quackster/duckHTTPD/ + implementation name: 'duckHTTPD-all' + + // jsoup HTML parser library @ https://jsoup.org/ + implementation 'org.jsoup:jsoup:1.13.1' + + // https://github.com/Quackster/Kepler/Kepler-Server + implementation project(':Havana-Server') + + // https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 + implementation group: 'org.slf4j', name: 'slf4j-log4j12', version: '1.7.25' + + // https://mvnrepository.com/artifact/com.tunyk.mvn.plugins.htmlcompressor/htmlcompressor-maven-plugin + implementation group: 'com.tunyk.mvn.plugins.htmlcompressor', name: 'htmlcompressor-maven-plugin', version: '1.3' + + // https://mvnrepository.com/artifact/com.google.code.gson/gson + implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.0' + + // https://mvnrepository.com/artifact/javax.mail/mail + implementation group: 'javax.mail', name: 'mail', version: '1.4.7' + + implementation 'com.goterl:lazysodium-java:5.0.1' + implementation "net.java.dev.jna:jna:5.8.0" +} + +task fatJar(type: Jar) { + zip64 true + duplicatesStrategy 'exclude' + manifest { + attributes 'Main-Class': mainClassName + } + baseName = project.name + '-all' + from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } } + with jar +} + +// Create jar with no libraries inside of it, used when creating with "gradle distZip" and +// libraries are then to be stored in the folder next to it called 'dependency-jars' +// https://vocon-it.com/2016/11/15/how-to-build-a-lean-jar-file-with-gradle/ +/*jar { + manifest { + attributes ( + 'Main-Class': mainClassName, + "Class-Path": '. dependency-jars/' + configurations.compile.collect { + it.getName() + }.join(' dependency-jars/') + ) + } +}*/ \ No newline at end of file diff --git a/Havana-Web/libs/duckHTTPD-all.jar b/Havana-Web/libs/duckHTTPD-all.jar new file mode 100644 index 0000000..5e871a4 Binary files /dev/null and b/Havana-Web/libs/duckHTTPD-all.jar differ diff --git a/Havana-Web/src/main/java/org/alexdev/http/HavanaWeb.java b/Havana-Web/src/main/java/org/alexdev/http/HavanaWeb.java new file mode 100644 index 0000000..1030421 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/HavanaWeb.java @@ -0,0 +1,133 @@ +package org.alexdev.http; + +import com.google.gson.Gson; +import io.netty.util.ResourceLeakDetector; +import org.alexdev.duckhttpd.routes.RouteManager; +import org.alexdev.duckhttpd.server.WebServer; +import org.alexdev.duckhttpd.util.config.Settings; +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.dao.mysql.LogDao; +import org.alexdev.havana.game.catalogue.CatalogueManager; +import org.alexdev.havana.game.item.ItemManager; +import org.alexdev.havana.game.wordfilter.WordfilterManager; +import org.alexdev.havana.log.Log; +import org.alexdev.havana.util.config.GameConfiguration; +import org.alexdev.havana.util.config.ServerConfiguration; +import org.alexdev.http.game.news.NewsManager; +import org.alexdev.http.game.stickers.StickerManager; +import org.alexdev.http.server.ServerResponses; +import org.alexdev.http.server.Watchdog; +import org.alexdev.http.template.TwigTemplate; +import org.alexdev.http.util.config.WebLoggingConfiguration; +import org.alexdev.http.util.config.WebServerConfigWriter; +import org.alexdev.http.util.config.WebSettingsConfigWriter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +public class HavanaWeb { + private static Logger logger = LoggerFactory.getLogger(HavanaWeb.class); + + private static final Gson gson = new Gson(); + private static ScheduledExecutorService scheduler; + private static ExecutorService executor; + + public static void main(String[] args) throws Exception { + WebLoggingConfiguration.checkLoggingConfig(); + ServerConfiguration.setWriter(new WebServerConfigWriter()); + ServerConfiguration.load("webserver-config.ini"); + + logger.info("HavanaWeb by Quackster"); + logger.info("Loading configuration.."); + + ResourceLeakDetector.setLevel(ResourceLeakDetector.Level.ADVANCED); + + Settings settings = Settings.getInstance(); + settings.setSiteDirectory(ServerConfiguration.getString("site.directory")); + settings.setDefaultResponses(new ServerResponses()); + settings.setTemplateBase(TwigTemplate.class); + settings.setSaveSessions(true); + + // Spammers + /*Settings.getInstance().getBlockIpv4().add("192.190"); + Settings.getInstance().getBlockIpv4().add("79.108"); + Settings.getInstance().getBlockIpv4().add("194.59"); + Settings.getInstance().getBlockIpv4().add("185.189"); + Settings.getInstance().getBlockIpv4().add("212.8"); + Settings.getInstance().getBlockIpv4().add("104.250"); + */ + + if (!Storage.connect()) { + Log.getErrorLogger().error("Could not connect to MySQL"); + return; + } + + GameConfiguration.getInstance(new WebSettingsConfigWriter()); + + /*byte[] pw = "lol123".getBytes(StandardCharsets.UTF_8); + byte[] outputHash = new byte[PwHash.STR_BYTES]; + PwHash.Native pwHash = (PwHash.Native) PlayerDao.LIB_SODIUM; + boolean success = pwHash.cryptoPwHashStr( + outputHash, + pw, + pw.length, + PwHash.OPSLIMIT_INTERACTIVE, + PwHash.MEMLIMIT_INTERACTIVE + ); + System.out.println(new String(outputHash));*/ + + WordfilterManager.getInstance(); + StickerManager.getInstance(); + ItemManager.getInstance(); + NewsManager.getInstance(); + + executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); + scheduler = Executors.newScheduledThreadPool(Runtime.getRuntime().availableProcessors()); + scheduler.scheduleWithFixedDelay(new Watchdog(), 1, 1, TimeUnit.SECONDS); + + logger.info("Registering web routes.."); + //logger.info(EmailUtil.renderRegistered("Alex", "01/01/1970", UUID.randomUUID().toString())); + + Routes.register(); + logger.info("Registered " + RouteManager.getRoutes().size() + " route(s)!"); + + int port = ServerConfiguration.getInteger("bind.port"); + logger.info("Starting http service on port " + port); + + WebServer instance = new WebServer(port); + instance.start(); + } + + /** + * Boots up JTwig engine. + */ + /*private static void setupTemplateSystem() { + var template = JtwigTemplate.inlineTemplate("test"); + var model = JtwigModel.newModel(); + model.with("test", "HavanaWeb"); + template.render(model); + }*/ + + public static ExecutorService getExecutor() { + return executor; + } + + public static Gson getGson() { + return gson; + } + + public static long hashSpriteName(String name) { + name = name.toUpperCase(); + long hash = 0; + for (int index = 0; index < name.length(); index++) { + hash = hash * 61 + name.charAt(index) - 32; + hash = hash + (hash >> 56) & 0xFFFFFFFFFFFFFFL; + } + + return hash; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/Routes.java b/Havana-Web/src/main/java/org/alexdev/http/Routes.java new file mode 100644 index 0000000..e8b981e --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/Routes.java @@ -0,0 +1,321 @@ +package org.alexdev.http; + +import org.alexdev.duckhttpd.routes.RouteManager; +import org.alexdev.http.controllers.BaseController; +import org.alexdev.http.controllers.api.*; +import org.alexdev.http.controllers.groups.*; +import org.alexdev.http.controllers.groups.discussions.DiscussionActionsController; +import org.alexdev.http.controllers.groups.discussions.DiscussionController; +import org.alexdev.http.controllers.groups.discussions.DiscussionPreviewController; +import org.alexdev.http.controllers.habblet.*; +import org.alexdev.http.controllers.homes.HomesController; +import org.alexdev.http.controllers.homes.NoteEditorController; +import org.alexdev.http.controllers.homes.WidgetController; +import org.alexdev.http.controllers.homes.store.StoreController; +import org.alexdev.http.controllers.homes.widgets.*; +import org.alexdev.http.controllers.housekeeping.*; +import org.alexdev.http.controllers.site.*; + +public class Routes { + public static String HOUSEKEEPING_PATH = "allseeingeye/hk"; + + public static void register() { + RouteManager.addRoute(new String[] { "/", "/index", "/home"}, HomepageController::homepage); + RouteManager.addRoute("/maintenance", HomepageController::maintenance); + + RouteManager.addRoute("", new BaseController()); + + // Site + RouteManager.addRoute("/me", AccountController::me); + RouteManager.addRoute("/welcome", AccountController::welcome); + + // News + RouteManager.addRoute("/articles", NewsController::articles); + RouteManager.addRoute("/articles/archive", NewsController::articles); + RouteManager.addRoute("/articles/category/*", NewsController::articles); + RouteManager.addRoute("/articles/*-*", NewsController::articles); + + // Events + RouteManager.addRoute("/community/events", NewsController::events); + RouteManager.addRoute("/community/events/archive", NewsController::events); + RouteManager.addRoute("/community/events/category/*", NewsController::events); + RouteManager.addRoute("/community/events/*-*", NewsController::events); + //RouteManager.addRoute("/events/steampunk", CustomEventsController::steampunk); + + // Fansites + RouteManager.addRoute("/community/fansites", NewsController::fansites); + RouteManager.addRoute("/community/fansites/archive", NewsController::fansites); + RouteManager.addRoute("/community/fansites/category/*", NewsController::events); + RouteManager.addRoute("/community/fansites/*-*", NewsController::fansites); + + // Site + RouteManager.addRoute("/community", CommunityController::community); + RouteManager.addRoute("/games", GamesController::games); + RouteManager.addRoute("/games/score_all_time", GamesController::games_all_time); + RouteManager.addRoute("/habblet/personalhighscores", GamesController::personalhighscores); + RouteManager.addRoute("/credits", CreditsController::credits); + RouteManager.addRoute("/credits/history", CreditsController::transactions); + RouteManager.addRoute("/credits/pixels", SiteController::pixels); + RouteManager.addRoute("/credits/club", ClubController::club); + RouteManager.addRoute("/credits/collectables", CollectablesController::collectables); + RouteManager.addRoute("/credits/club/tryout", ClubController::clubTryout); + RouteManager.addRoute("/tag", TagController::tag); + RouteManager.addRoute("/tag/*", TagController::search); + //RouteManager.addRoute("/help/install_shockwave", SiteController::install_shockwave); + //RouteManager.addRoute("/help/shockwave_app", SiteController::shockwave_app); + RouteManager.addRoute("/help/*", FaqController::faq); + + // Client + RouteManager.addRoute("/components/updateHabboCount", ClientController::updateHabboCount); + RouteManager.addRoute("/client", ClientController::client); + RouteManager.addRoute("/clientlog/update", ClientController::blank); + RouteManager.addRoute("/cacheCheck", ClientController::blank); + //RouteManager.addRoute("/beta_client", ClientController::betaClient); // R34 client: deprecated + RouteManager.addRoute("/client_popup/install_shockwave", ClientController::clientInstallShockwave); + RouteManager.addRoute("/client_error", ClientController::client_error); + RouteManager.addRoute("/client_connection_failed", ClientController::client_connection_failed); + + // Account + RouteManager.addRoute("/account/banned", AccountController::banned); + RouteManager.addRoute("/account/logout", AccountController::logout); + RouteManager.addRoute("/account/login", AccountController::login_popup); + RouteManager.addRoute("/account/password/forgot", RecoveryController::forgot); + RouteManager.addRoute("/account/password/recovery", RecoveryController::recovery); + RouteManager.addRoute("/account/activate", RecoveryController::activate); + RouteManager.addRoute("/login_popup", AccountController::login_popup); + RouteManager.addRoute("/account/submit", AccountController::submit); + RouteManager.addRoute("/security_check", AccountController::securityCheck); + RouteManager.addRoute("/account/reauthenticate", AccountController::reauthenticate); + + // Profile + RouteManager.addRoute("/profile", ProfileController::profile); + //RouteManager.addRoute("/profile/flash", ProfileController::profile_flash); + RouteManager.addRoute("/profile/verify", ProfileController::verify); + RouteManager.addRoute("/profile/send_email", ProfileController::send_email); + + RouteManager.addRoute("/profile/wardrobeStore", ProfileController::wardrobeStore); + RouteManager.addRoute("/profile/passwordupdate", ProfileController::passwordupdate); + RouteManager.addRoute("/profile/emailupdate", ProfileController::emailupdate); + RouteManager.addRoute("/profile/characterupdate", ProfileController::characterupdate); + RouteManager.addRoute("/profile/profile.action", ProfileController::action); + RouteManager.addRoute("/profile/profileupdate", ProfileController::profileupdate); + RouteManager.addRoute("/profile/securitysettingupdate", ProfileController::securitysettingupdate); + RouteManager.addRoute("/club", ProfileController::club); + + RouteManager.addRoute("/friendmanagement/ajax/editCategory", FriendManagementController::editCategory); + RouteManager.addRoute("/friendmanagement/ajax/createcategory", FriendManagementController::createcategory); + RouteManager.addRoute("/friendmanagement/ajax/deletecategory", FriendManagementController::deletecategory); + RouteManager.addRoute("/friendmanagement/ajax/viewcategory", FriendManagementController::viewCategory); + RouteManager.addRoute("/friendmanagement/ajax/updatecategoryoptions", FriendManagementController::updateCategoryOptions); + RouteManager.addRoute("/friendmanagement/ajax/movefriends", FriendManagementController::movefriends); + RouteManager.addRoute("/friendmanagement/ajax/deletefriends", FriendManagementController::deletefriends); + + // Register + RouteManager.addRoute("/register", RegisterController::register); + RouteManager.addRoute("/register/cancel", RegisterController::registerCancelled); + RouteManager.addRoute("/captcha.jpg", RegisterController::captcha); + + // Habblets + RouteManager.addRoute("/habblet/ajax/namecheck", NameCheckController::namecheck); + RouteManager.addRoute("/habblet/ajax/updatemotto", UpdateMottoController::updatemotto); + RouteManager.addRoute("/habblet/ajax/roomselectionCreate", RoomSelectionController::create); + RouteManager.addRoute("/habblet/ajax/roomselectionConfirm", RoomSelectionController::confirm); + RouteManager.addRoute("/habblet/ajax/roomselectionHide", RoomSelectionController::hide); + RouteManager.addRoute("/components/roomNavigation", NavigationComponent::navigation); + RouteManager.addRoute("/habblet/proxy", ProxyHabblet::moreInfo); + RouteManager.addRoute("/habboclub/habboclub_confirm", HabboClubHabblet::confirm); + RouteManager.addRoute("/habboclub/habboclub_subscribe", HabboClubHabblet::subscribe); + RouteManager.addRoute("/habboclub/habboclub_reminder_remove", HabboClubHabblet::reminderRemove); + RouteManager.addRoute("/habblet/ajax/habboclub_gift", ClubController::habboClubGift); + RouteManager.addRoute("/habblet/ajax/habboclub_enddate", HabboClubHabblet::enddate); + RouteManager.addRoute("/myhabbo/tag/add", TagController::add); + RouteManager.addRoute("/myhabbo/tag/remove", TagController::remove); + RouteManager.addRoute("/habblet/ajax/redeemvoucher", VoucherController::redeemVoucher); + RouteManager.addRoute("/remove_all_tags", TagController::remove_all_tags); + RouteManager.addRoute("/habblet/ajax/tagsearch", TagController::tagsearch); + RouteManager.addRoute("/habblet/ajax/tagfight", TagController::tagfight); + RouteManager.addRoute("/habblet/mytagslist", TagController::mytaglist); + RouteManager.addRoute("/habblet/ajax/tagmatch", TagController::tagmatch); + RouteManager.addRoute("/habblet/ajax/tagmatch", TagController::tagmatch); + RouteManager.addRoute("/habblet/ajax/collectiblesConfirm", CollectablesController::confirm); + RouteManager.addRoute("/habblet/ajax/collectiblesPurchase", CollectablesController::purchase); + RouteManager.addRoute("/habblet/ajax/load_events", EventController::loadEvents); + RouteManager.addRoute("/habblet/ajax/mgmgetinvitelink", InviteController::inviteLink); + RouteManager.addRoute("/habblet/habbosearchcontent", InviteController::searchContent); + RouteManager.addRoute("/habblet/ajax/confirmAddFriend", InviteController::confirmAddFriend); + RouteManager.addRoute("/habblet/ajax/addFriend", InviteController::addFriend); + RouteManager.addRoute("/myhabbo/avatarlist/avatarinfo", FriendsWidgetController::avatarinfo); + RouteManager.addRoute("/myhabbo/friends/add", InviteController::add); + RouteManager.addRoute("/habblet/cproxy", ProxyHabblet::minimail); + RouteManager.addRoute("/habblet/ajax/removeFeedItem", FeedController::removeFeedItem); + RouteManager.addRoute("/habblet/ajax/nextgift", FeedController::nextgift); + RouteManager.addRoute("/habblet/ajax/giftqueueHide", FeedController::giftqueueHide); + RouteManager.addRoute("/habblet/ajax/clear_hand", ProxyHabblet::clearhand); + RouteManager.addRoute("/habblet/ajax/token_generate", ProxyHabblet::token_generate); + RouteManager.addRoute("/habblet/ajax/preview_news_article", HousekeepingNewsController::preview_news_article); + + // Groups + RouteManager.addRoute("/groups/*/id", GroupController::viewGroup); + RouteManager.addRoute("/groups/*", GroupController::viewGroup); + RouteManager.addRoute("/grouppurchase/group_create_form", GroupHabbletController::groupCreateForm); + RouteManager.addRoute("/grouppurchase/purchase_confirmation", GroupHabbletController::purchaseConfirmation); + RouteManager.addRoute("/grouppurchase/purchase_ajax", GroupHabbletController::purchaseAjax); + RouteManager.addRoute("/groups/actions/startEditingSession/*", GroupController::startEditingSession); + RouteManager.addRoute("/groups/actions/cancelEditingSession", GroupController::cancelEditingSession); + RouteManager.addRoute("/groups/actions/group_settings", GroupHabbletController::groupSettings); + RouteManager.addRoute("/groups/actions/saveEditingSession", GroupController::saveEditingSession); + RouteManager.addRoute("/groups/actions/update_group_settings", GroupHabbletController::updateGroupSettings); + RouteManager.addRoute("/groups/actions/check_group_url", GroupHabbletController::checkGroupUrl); + RouteManager.addRoute("/groups/actions/show_badge_editor", GroupHabbletController::showBadgeEditor); + RouteManager.addRoute("/groups/actions/update_group_badge", GroupHabbletController::updateGroupBadge); + RouteManager.addRoute("/groups/actions/confirm_delete_group", GroupHabbletController::confirmDeleteGroup); + RouteManager.addRoute("/groups/actions/delete_group", GroupHabbletController::deleteGroup); + RouteManager.addRoute("/myhabbo/tag/addgrouptag", GroupTagController::addGroupTag); + RouteManager.addRoute("/myhabbo/tag/listgrouptags", GroupTagController::listGroupTag); + RouteManager.addRoute("/myhabbo/tag/removegrouptag", GroupTagController::removeGroupTag); + RouteManager.addRoute("/groups/actions/join", GroupMemberController::join); + RouteManager.addRoute("/groups/actions/confirm_leave", GroupMemberController::confirmLeave); + RouteManager.addRoute("/groups/actions/leave", GroupMemberController::leave); + RouteManager.addRoute("/myhabbo/groups/memberlist", GroupMemberController::memberlist); + RouteManager.addRoute("/myhabbo/groups/batch/confirm_revoke_rights", GroupMemberController::confirmRevokeRights); + RouteManager.addRoute("/myhabbo/groups/batch/revoke_rights", GroupMemberController::revokeRights); + RouteManager.addRoute("/myhabbo/groups/batch/confirm_give_rights", GroupMemberController::confirmGiveRights); + RouteManager.addRoute("/myhabbo/groups/batch/give_rights", GroupMemberController::giveRights); + RouteManager.addRoute("/myhabbo/groups/batch/confirm_remove", GroupMemberController::confirmRemove); + RouteManager.addRoute("/myhabbo/groups/batch/remove", GroupMemberController::remove); + RouteManager.addRoute("/myhabbo/groups/batch/confirm_accept", GroupMemberController::confirmAccept); + RouteManager.addRoute("/myhabbo/groups/batch/accept", GroupMemberController::accept); + RouteManager.addRoute("/myhabbo/groups/batch/confirm_decline", GroupMemberController::confirmDecline); + RouteManager.addRoute("/myhabbo/groups/batch/decline", GroupMemberController::decline); + RouteManager.addRoute("/myhabbo/avatarlist/membersearchpaging", MemberWidgetController::membersearchpaging); + RouteManager.addRoute("/groups/actions/confirm_select_favorite", GroupFavouriteController::confirmselectfavourite); + RouteManager.addRoute("/groups/actions/select_favorite", GroupFavouriteController::selectfavourite); + RouteManager.addRoute("/groups/actions/confirm_deselect_favorite", GroupFavouriteController::confirmdeselectfavourite); + RouteManager.addRoute("/groups/actions/deselect_favorite", GroupFavouriteController::deselectfavourite); + + // Group discussions + RouteManager.addRoute("/groups/*/id/discussions/page/*", GroupDiscussionsController::viewDiscussionsPage); + RouteManager.addRoute("/groups/*/discussions/page/*", GroupDiscussionsController::viewDiscussionsPage); + RouteManager.addRoute("/groups/*/id/discussions", GroupDiscussionsController::viewDiscussions); + RouteManager.addRoute("/groups/*/discussions", GroupDiscussionsController::viewDiscussions); + RouteManager.addRoute("/groups/*/id/discussions/*/id", DiscussionController::viewDiscussion); + RouteManager.addRoute("/groups/*/discussions/*/id", DiscussionController::viewDiscussion); + RouteManager.addRoute("/groups/*/id/discussions/*/id/page/*", DiscussionController::viewDiscussion); + RouteManager.addRoute("/groups/*/discussions/*/id/page/*", DiscussionController::viewDiscussion); + RouteManager.addRoute("/discussions/actions/pingsession", DiscussionActionsController::pingsession); + RouteManager.addRoute("/discussions/actions/newtopic", DiscussionActionsController::newtopic); + RouteManager.addRoute("/discussions/actions/savetopic", DiscussionActionsController::savetopic); + RouteManager.addRoute("/discussions/actions/previewtopic", DiscussionPreviewController::previewtopic); + RouteManager.addRoute("/discussions/actions/previewpost", DiscussionPreviewController::previewpost); + RouteManager.addRoute("/discussions/actions/opentopicsettings", DiscussionActionsController::opentopicsettings); + RouteManager.addRoute("/discussions/actions/confirm_delete_topic", DiscussionActionsController::confirm_delete_topic); + RouteManager.addRoute("/discussions/actions/deletetopic", DiscussionActionsController::deletetopic); + RouteManager.addRoute("/discussions/actions/savetopicsettings", DiscussionActionsController::savetopicsettings); + RouteManager.addRoute("/discussions/actions/updatepost", DiscussionActionsController::updatepost); + RouteManager.addRoute("/discussions/actions/deletepost", DiscussionActionsController::deletepost); + RouteManager.addRoute("/discussions/actions/savepost", DiscussionActionsController::savepost); + + // Store + RouteManager.addRoute("/myhabbo/store/main", StoreController::main); + RouteManager.addRoute("/myhabbo/store/items", StoreController::items); + RouteManager.addRoute("/myhabbo/store/preview", StoreController::preview); + RouteManager.addRoute("/myhabbo/store/purchase_confirm", StoreController::purchaseConfirm); + RouteManager.addRoute("/myhabbo/store/background_warning", StoreController::backgroundWarning); + RouteManager.addRoute("/myhabbo/store/purchase_stickers", StoreController::purchaseStickers); + RouteManager.addRoute("/myhabbo/store/purchase_backgrounds", StoreController::purchaseBackgrounds); + RouteManager.addRoute("/myhabbo/store/purchase_stickie_notes", StoreController::purchaseStickieNotes); + RouteManager.addRoute("/myhabbo/sticker/place_sticker", WidgetController::placeSticker); + RouteManager.addRoute("/myhabbo/sticker/remove_sticker", WidgetController::removeSticker); + RouteManager.addRoute("/myhabbo/widget/add", WidgetController::placeWidget); + RouteManager.addRoute("/myhabbo/widget/delete", WidgetController::removeWidget); + RouteManager.addRoute("/myhabbo/save", HomesController::save); + + // Homes + RouteManager.addRoute("/home/*", HomesController::home); + RouteManager.addRoute("/home/*/id", HomesController::home); + RouteManager.addRoute("/myhabbo/widget/edit", WidgetController::editWidget); + RouteManager.addRoute("/myhabbo/store/inventory", HomesController::inventory); + RouteManager.addRoute("/myhabbo/store/inventory_items", HomesController::inventoryItems); + RouteManager.addRoute("/myhabbo/store/inventory_preview", HomesController::inventoryPreview); + RouteManager.addRoute("/myhabbo/tag/list", HomesController::tagList); + RouteManager.addRoute("/myhabbo/noteeditor/editor", NoteEditorController::noteEditor); + RouteManager.addRoute("/myhabbo/noteeditor/preview", NoteEditorController::notePreview); + RouteManager.addRoute("/myhabbo/linktool/search", NoteEditorController::search); + RouteManager.addRoute("/myhabbo/noteeditor/place", NoteEditorController::place); + RouteManager.addRoute("/myhabbo/stickie/edit", NoteEditorController::stickieEdit); + RouteManager.addRoute("/myhabbo/stickie/delete", NoteEditorController::stickieDelete); + RouteManager.addRoute("/myhabbo/startSession/*", HomesController::startEditingSession); + RouteManager.addRoute("/myhabbo/cancel/*", HomesController::cancelEditingSession); + RouteManager.addRoute("/myhabbo/stickie/delete", NoteEditorController::stickieDelete); + + // Widgets + RouteManager.addRoute("/myhabbo/rating/rate", RateController::rate); + RouteManager.addRoute("/myhabbo/rating/reset_ratings", RateController::resetRating); + RouteManager.addRoute("/myhabbo/badgelist/badgepaging", BadgesController::badgepaging); + RouteManager.addRoute("/myhabbo/avatarlist/friendsearchpaging", FriendsWidgetController::friendsearchpaging); + RouteManager.addRoute("/myhabbo/groups/groupinfo", GroupController::groupinfo); + RouteManager.addRoute("/myhabbo/guestbook/preview", GuestbookController::preview); + RouteManager.addRoute("/myhabbo/guestbook/add", GuestbookController::add); + RouteManager.addRoute("/myhabbo/guestbook/remove", GuestbookController::remove); + RouteManager.addRoute("/myhabbo/guestbook/configure", GuestbookController::configure); + RouteManager.addRoute("/myhabbo/traxplayer/select_song", TraxController::selectSong); + RouteManager.addRoute("/trax/song/*", TraxController::getSong); + + // Minimail + RouteManager.addRoute("/minimail/loadMessages", MinimailController::loadMessages); + RouteManager.addRoute("/minimail/recipients", MinimailController::recipients); + RouteManager.addRoute("/minimail/preview", MinimailController::preview); + RouteManager.addRoute("/minimail/sendMessage", MinimailController::sendMessage); + RouteManager.addRoute("/minimail/loadMessage", MinimailController::loadMessage); + RouteManager.addRoute("/minimail/deleteMessage", MinimailController::deleteMessage); + RouteManager.addRoute("/minimail/undeleteMessage", MinimailController::undeleteMessage); + RouteManager.addRoute("/minimail/emptyTrash", MinimailController::emptyTrash); + + // Quick menu + RouteManager.addRoute("/quickmenu/groups", QuickmenuController::groups); + RouteManager.addRoute("/quickmenu/rooms", QuickmenuController::rooms); + RouteManager.addRoute("/quickmenu/friends_all", QuickmenuController::friends); + + // API + RouteManager.addRoute("/api/advertisement/get_img", AdvertisementController::getImg); + RouteManager.addRoute("/api/advertisement/get_url", AdvertisementController::getUrl); + RouteManager.addRoute("/photos/my_photos", PhotosController::viewphotos); + RouteManager.addRoute("/api/verify/get/*", VerifyController::get); + RouteManager.addRoute("/api/verify/clear/*", VerifyController::clear); + + // Housekeeping + RouteManager.addRoute("/" + HOUSEKEEPING_PATH + "", HousekeepingController::dashboard); + RouteManager.addRoute("/" + HOUSEKEEPING_PATH + "/", HousekeepingController::dashboard); + RouteManager.addRoute("/" + HOUSEKEEPING_PATH + "/login", HousekeepingController::login); + RouteManager.addRoute("/" + HOUSEKEEPING_PATH + "/api/ban", HousekeepingCommandsController::ban); + RouteManager.addRoute("/" + HOUSEKEEPING_PATH + "/logout", HousekeepingController::logout); + RouteManager.addRoute("/" + HOUSEKEEPING_PATH + "/transaction/lookup", HousekeepingTransactionsController::search); + RouteManager.addRoute("/" + HOUSEKEEPING_PATH + "/transaction/track_item", HousekeepingTransactionsController::item_lookup); + RouteManager.addRoute("/" + HOUSEKEEPING_PATH + "/users/search", HousekeepingUsersController::search); + RouteManager.addRoute("/" + HOUSEKEEPING_PATH + "/users/create", HousekeepingUsersController::create); + RouteManager.addRoute("/" + HOUSEKEEPING_PATH + "/users/edit", HousekeepingUsersController::edit); + RouteManager.addRoute("/" + HOUSEKEEPING_PATH + "/users/imitate/*", HousekeepingUsersController::imitate); + RouteManager.addRoute("/" + HOUSEKEEPING_PATH + "/infobus_polls", HousekeepingInfobusController::polls); + RouteManager.addRoute("/" + HOUSEKEEPING_PATH + "/infobus_polls/create", HousekeepingInfobusController::create_polls); + RouteManager.addRoute("/" + HOUSEKEEPING_PATH + "/infobus_polls/delete", HousekeepingInfobusController::delete); + RouteManager.addRoute("/" + HOUSEKEEPING_PATH + "/infobus_polls/edit", HousekeepingInfobusController::edit); + RouteManager.addRoute("/" + HOUSEKEEPING_PATH + "/infobus_polls/view_results", HousekeepingInfobusController::view_results); + RouteManager.addRoute("/" + HOUSEKEEPING_PATH + "/infobus_polls/clear_results", HousekeepingInfobusController::clear_results); + RouteManager.addRoute("/" + HOUSEKEEPING_PATH + "/infobus_polls/send_poll", HousekeepingInfobusController::send_poll); + RouteManager.addRoute("/" + HOUSEKEEPING_PATH + "/infobus_polls/close_event", HousekeepingInfobusController::close_event); + RouteManager.addRoute("/" + HOUSEKEEPING_PATH + "/infobus_polls/door_status", HousekeepingInfobusController::door_status); + RouteManager.addRoute("/" + HOUSEKEEPING_PATH + "/articles", HousekeepingNewsController::articles); + RouteManager.addRoute("/" + HOUSEKEEPING_PATH + "/articles/create", HousekeepingNewsController::create); + RouteManager.addRoute("/" + HOUSEKEEPING_PATH + "/articles/delete", HousekeepingNewsController::delete); + RouteManager.addRoute("/" + HOUSEKEEPING_PATH + "/articles/edit", HousekeepingNewsController::edit); + RouteManager.addRoute("/" + HOUSEKEEPING_PATH + "/configurations", HousekeepingConfigController::configurations); + RouteManager.addRoute("/" + HOUSEKEEPING_PATH + "/bans", HousekeepingBansController::bans); + RouteManager.addRoute("/" + HOUSEKEEPING_PATH + "/room_ads", HousekeepingAdsController::roomads); + RouteManager.addRoute("/" + HOUSEKEEPING_PATH + "/room_ads/delete", HousekeepingAdsController::delete); + RouteManager.addRoute("/" + HOUSEKEEPING_PATH + "/room_ads/create", HousekeepingAdsController::create); + RouteManager.addRoute("/" + HOUSEKEEPING_PATH + "/room_badges", HousekeepingRoomBadgesController::badges); + RouteManager.addRoute("/" + HOUSEKEEPING_PATH + "/room_badges/delete", HousekeepingRoomBadgesController::delete); + RouteManager.addRoute("/" + HOUSEKEEPING_PATH + "/room_badges/create", HousekeepingRoomBadgesController::create); + RouteManager.addRoute("/" + HOUSEKEEPING_PATH + "/catalogue/edit_frontpage", HousekeepingCatalogueFrontpageController::edit); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/BaseController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/BaseController.java new file mode 100644 index 0000000..00c01eb --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/BaseController.java @@ -0,0 +1,123 @@ +package org.alexdev.http.controllers; + +import io.netty.handler.codec.http.HttpHeaderNames; +import org.alexdev.duckhttpd.routes.Route; +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.config.GameConfiguration; +import org.alexdev.http.Routes; +import org.alexdev.http.util.SessionUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class BaseController implements Route { + private static Logger logger = LoggerFactory.getLogger(BaseController.class); + + @Override + public void handleRoute(WebConnection webConnection) throws Exception { + /*if (!webConnection.request().headers().isEmpty()) { + for (String name: webConnection.request().headers().names()) { + for (String value: webConnection.request().headers().getAll(name)) { + System.out.println("HEADER: " + name + " = " + value); + } + } + System.out.println(); + }*/ + + if (webConnection.isRequestHandled()) { + if (GameConfiguration.getInstance().getBoolean("maintenance") && !webConnection.getRouteRequest().startsWith("/api")) { + if (!webConnection.getRouteRequest().startsWith("/maintenance") && !webConnection.getRouteRequest().startsWith("/" + Routes.HOUSEKEEPING_PATH)) { + webConnection.redirect("/maintenance"); + return; + } + } + } + + if (!webConnection.getRouteRequest().startsWith("/api")) { + if (!webConnection.request().headers().isEmpty()) { + String host = webConnection.request().headers().get(HttpHeaderNames.HOST); + + if (webConnection.request().headers().contains("X-Forwarded-Proto")) { + String request = webConnection.request().headers().get("X-Forwarded-Proto"); + + if (host != null && request.equalsIgnoreCase("http")) { + String targetUrl = "https://" + host; + String requestUri = webConnection.request().uri(); + + if (!requestUri.startsWith("/")) { + targetUrl += "/"; + } + + targetUrl += requestUri; + + webConnection.movedpermanently(targetUrl); + return; + } + } + } + } + + if (webConnection.isRequestHandled()) { + /*if (!(webConnection.getRouteRequest().equals("/register") + || webConnection.getRouteRequest().equals("/client") + || webConnection.getRouteRequest().equals("/login_popup") + || webConnection.getRouteRequest().startsWith("/clientlog") + || webConnection.getRouteRequest().equals("/client") + || webConnection.getRouteRequest().equals("/security_check") + || webConnection.getRouteRequest().startsWith("/account/") + || webConnection.getRouteRequest().startsWith("/api/") + || webConnection.getRouteRequest().startsWith("/habblet/") + || webConnection.getRouteRequest().startsWith("/groups/actions") + || webConnection.getRouteRequest().startsWith("/myhabbo/"))) { + webConnection.session().set("lastBrowsedPage", webConnection.getRouteRequest()); + }*/ + + if (webConnection.session().getBoolean("authenticated")) { + this.handleAuthenticatedRoute(webConnection); + } else { + SessionUtil.checkCookie(webConnection); + } + } + } + + private void handleAuthenticatedRoute(WebConnection webConnection) { + if (webConnection.getRouteRequest().equals("/client")) { + webConnection.session().set("lastRequest", String.valueOf(DateUtil.getCurrentTimeSeconds() + SessionUtil.REAUTHENTICATE_TIME)); + } + + if (webConnection.session().contains("lastRequest")) { + long lastRequest = webConnection.session().getLongOrElse("lastRequest", 0); + + if (DateUtil.getCurrentTimeSeconds() > lastRequest) { + //if (webConnection.cookies().exists(SessionUtil.REMEMEBER_TOKEN_NAME)) { + webConnection.session().set("clientAuthenticate", true); + //} + } + } else { + webConnection.session().set("clientAuthenticate", false); + + } + + /*StringBuilder postRequest = new StringBuilder("("); + StringBuilder getRequest = new StringBuilder(); + + for (var entry : webConnection.post().getValues().entrySet()) { + postRequest.append(entry.getKey()); + postRequest.append(" = "); + postRequest.append(entry.getValue()); + postRequest.append(", "); + } + + for (var entry : webConnection.get().getValues().entrySet()) { + getRequest.append(entry.getKey()); + getRequest.append(" = "); + getRequest.append(entry.getValue()); + getRequest.append(", "); + } + + getRequest.append(")"); + postRequest.append(")"); + + logger.info("Request: " + webConnection.getUriRequest() + " from " + webConnection.getIpAddress() + " with payload POST: " + postRequest + ", GET: " + getRequest);*/ + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/api/AdvertisementController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/api/AdvertisementController.java new file mode 100644 index 0000000..c0b5975 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/api/AdvertisementController.java @@ -0,0 +1,39 @@ +package org.alexdev.http.controllers.api; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.havana.game.ads.AdManager; +import org.alexdev.havana.game.ads.Advertisement; + +public class AdvertisementController { + public static void getImg(WebConnection webConnection) { + if (!webConnection.get().contains("ad")) { + webConnection.send(""); + return; + } + + Advertisement advertisement = AdManager.getInstance().getAd(webConnection.get().getInt("ad")); + + if (advertisement == null) { + webConnection.send(""); + return; + } + + webConnection.redirect(advertisement.getImage()); + } + + public static void getUrl(WebConnection webConnection) { + if (!webConnection.get().contains("ad")) { + webConnection.send(""); + return; + } + + Advertisement advertisement = AdManager.getInstance().getAd(webConnection.get().getInt("ad")); + + if (advertisement == null) { + webConnection.send(""); + return; + } + + webConnection.redirect(advertisement.getUrl()); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/api/PhotosController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/api/PhotosController.java new file mode 100644 index 0000000..e74a9ca --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/api/PhotosController.java @@ -0,0 +1,77 @@ +package org.alexdev.http.controllers.api; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.havana.game.item.Photo; +import org.alexdev.http.dao.CommunityDao; +import org.alexdev.http.util.HtmlUtil; +import org.alexdev.photorenderer.PhotoRenderer; +import org.alexdev.photorenderer.RenderOption; +import org.alexdev.photorenderer.palettes.GreyscalePalette; +import org.apache.commons.codec.binary.Base64; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.IOException; + +public class PhotosController { + public static void viewphotos(WebConnection webConnection) throws Exception { + if (!webConnection.session().contains("user.id")) { + webConnection.send("Please sign in"); + return; + } + + PhotoRenderer photoViewer = null; + var photos = CommunityDao.getPhotos(webConnection.session().getInt("user.id")); + + StringBuilder stringBuilder = new StringBuilder(); + + var renderOption = RenderOption.GREYSCALE; + + if (webConnection.get().contains("greyscale")) { + renderOption = RenderOption.GREYSCALE; + } + + if (webConnection.get().contains("sepia")) { + renderOption = RenderOption.SEPIA; + } + + if (renderOption != RenderOption.GREYSCALE) { + stringBuilder.append("

View images as greyscale? View Greyscale

"); + } else { + stringBuilder.append("

View images as original Sepia? View as Sepia

"); + } + + photoViewer = new PhotoRenderer(GreyscalePalette.getPalette(), renderOption); + + //int i = 1; + for (Photo photo : photos) { + var src = photoViewer.createImage(photo.getData()); + stringBuilder.append(" "); + + /*if (i % 6 == 0) { + stringBuilder.append("
"); + } + + i++;*/ + } + + /*i = 1; + for (Photo photo : photos) { + PhotoRenderer photoViewer = new PhotoRenderer(); + var src = photoViewer.createImage(photo.getData(), photoViewer.getCachedPalette(), PhotoRenderOption.GREYSCALE); + stringBuilder.append(" "); + + if (i % 6 == 0) { + stringBuilder.append("
"); + } + + i++; + }*/ + + stringBuilder.append("

Made by Alex

"); + webConnection.send(stringBuilder.toString()); + } + + +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/api/VerifyController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/api/VerifyController.java new file mode 100644 index 0000000..fd30a7f --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/api/VerifyController.java @@ -0,0 +1,36 @@ +package org.alexdev.http.controllers.api; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.http.dao.VerifyDao; + +public class VerifyController { + public static void get(WebConnection webConnection) { + if (webConnection.getMatches().isEmpty() || webConnection.getMatches().get(0).isBlank()) { + webConnection.send("error: INVALID"); + return; + } + + var username = VerifyDao.getName(webConnection.getMatches().get(0)); + + if (username == null) { + webConnection.send("error: INVALID"); + return; + } + + webConnection.send(username); + } + + public static void clear(WebConnection webConnection) { + if (webConnection.getMatches().isEmpty() || webConnection.getMatches().get(0).isBlank()) { + webConnection.send("error: INVALID"); + return; + } + + try { + VerifyDao.clearName(webConnection.getMatches().get(0)); + webConnection.send("SUCCESS"); + } catch (Exception ex) { + webConnection.send("error: INVALID"); + } + } +} \ No newline at end of file diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/groups/GroupController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/groups/GroupController.java new file mode 100644 index 0000000..a04a995 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/groups/GroupController.java @@ -0,0 +1,332 @@ +package org.alexdev.http.controllers.groups; + +import io.netty.handler.codec.http.HttpResponseStatus; +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.duckhttpd.util.config.Settings; +import org.alexdev.havana.dao.mysql.GroupDao; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.dao.mysql.RoomDao; +import org.alexdev.havana.dao.mysql.TagDao; +import org.alexdev.havana.game.groups.Group; +import org.alexdev.havana.game.groups.GroupMember; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.http.dao.GroupEditDao; +import org.alexdev.http.dao.WidgetDao; +import org.alexdev.http.game.homes.Widget; +import org.alexdev.http.util.HomeUtil; +import org.alexdev.http.util.XSSUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.regex.Pattern; + +public class GroupController { + public static void viewGroup(WebConnection webConnection) { + XSSUtil.clear(webConnection); + + if (!webConnection.session().contains("authenticated")) { + return; + } + + webConnection.session().set("page", "community"); + + String match = webConnection.getMatches().get(0); + + String groupAlias = null; + Group group = null; + + if (StringUtils.isNumeric(match) && webConnection.getRouteRequest().endsWith("/id")) { + group = GroupDao.getGroup(Integer.parseInt(match)); + + if (group == null) { + webConnection.send(Settings.getInstance().getDefaultResponses().getResponse(HttpResponseStatus.NOT_FOUND, webConnection)); + return; + } + + if (!group.getAlias().isBlank()) { + webConnection.redirect("/groups/" + group.getAlias()); + return; + } + + } else if (!webConnection.getRouteRequest().endsWith("/id")) { + groupAlias = match; + group = GroupDao.getGroupByAlias(groupAlias); + } + + if (group == null) { + webConnection.send(Settings.getInstance().getDefaultResponses().getResponse(HttpResponseStatus.NOT_FOUND, webConnection)); + return; + } + + long sessionTime = -1; + if (webConnection.session().getBoolean("authenticated")) { + int userId = webConnection.session().getInt("user.id"); + sessionTime = GroupEditDao.getSession(userId, group.getId()); + } + + if (sessionTime != -1) { + webConnection.session().delete("homeEditSession"); + webConnection.session().set("groupEditSession", group.getId()); + } + + if (group.getAlias() != null) { + if (group.getAlias().equalsIgnoreCase("battleball_rebound")) { + webConnection.session().set("page", "games"); + } + + if (group.getAlias().equalsIgnoreCase("lido")) { + webConnection.session().set("page", "games"); + } + + if (group.getAlias().equalsIgnoreCase("snow_storm")) { + webConnection.session().set("page", "games"); + } + + if (group.getAlias().equalsIgnoreCase("wobble_squabble")) { + webConnection.session().set("page", "games"); + } + } + + var template = webConnection.template("groups"); + template.set("editMode", sessionTime != -1); + template.set("group", group); + template.set("stickers", WidgetDao.getGroupWidgets(group.getId(), true)); + template.set("tags", TagDao.getGroupTags(group.getId())); + template.set("guestbookSetting", WidgetDao.getGroupWidgets(group.getId()).stream().filter(w -> w.getProduct().getData().equalsIgnoreCase("guestbookwidget")).findFirst().get().getGuestbookState()); + template.set("stickerLimit", HomeUtil.getStickerLimit(true)); + + if (sessionTime != -1) { + template.set("expireMinutes", TimeUnit.SECONDS.toMinutes(sessionTime - DateUtil.getCurrentTimeSeconds())); + } + + if (group.getRoomId() > 0) { + Room room = RoomDao.getRoomById(group.getRoomId()); + + if (room != null) { + template.set("room", room); + } + } + + template.set("hasMember", false); + + if (webConnection.session().getBoolean("authenticated")) { + int userId = webConnection.session().getInt("user.id"); + + GroupMember groupMember = group.getMember(userId); + + if (groupMember != null) { + template.set("hasMember", true); + template.set("groupMember", groupMember); + } + } + + template.render(); + } + + public static void startEditingSession(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int userId = webConnection.session().getInt("user.id"); + String match = webConnection.getMatches().get(0); + + Group group = null; + + if (StringUtils.isNumeric(match)) { + group = GroupDao.getGroup(Integer.parseInt(match)); + } + + if (group == null) { + webConnection.send(Settings.getInstance().getDefaultResponses().getResponse(HttpResponseStatus.NOT_FOUND, webConnection)); + return; + } + + if (group.isMember(userId) && group.hasAdministrator(userId)) { + if (!GroupEditDao.hasSession(userId, group.getId())) { + GroupEditDao.delete(userId, group.getId()); + + GroupEditDao.createSession(userId, group.getId()); + webConnection.session().delete("homeEditSession"); + webConnection.session().set("groupEditSession", group.getId()); + } + } + + webConnection.redirect(group.generateClickLink()); + } + + public static void cancelEditingSession(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + if (!webConnection.session().contains("groupEditSession")) { + webConnection.redirect("/"); + return; + } + + int userId = webConnection.session().getInt("user.id"); + int groupId = webConnection.session().getInt("groupEditSession"); + + if (GroupEditDao.hasSession(userId, groupId)) { + GroupEditDao.delete(userId, groupId); + webConnection.session().delete("homeEditSession"); + webConnection.session().delete("groupEditSession"); + } + + Group group = GroupDao.getGroup(groupId); + webConnection.redirect(group.generateClickLink()); + } + + + public static void saveEditingSession(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + PlayerDetails playerDetails = PlayerDao.getDetails(webConnection.session().getInt("user.id")); + + if (playerDetails == null) { + webConnection.session().delete("user.id"); + webConnection.session().delete("authenticated"); + webConnection.redirect("/"); + return; + } + + int userId = webConnection.session().getInt("user.id"); + int groupId = webConnection.session().getInt("groupEditSession"); + + Group group = GroupDao.getGroup(groupId); + + if (group == null) { + webConnection.send(""); + return; + } + + if (!GroupEditDao.hasSession(userId, group.getId())) { + webConnection.send(""); + return; + } + + List groupWidgets = WidgetDao.getGroupWidgets(groupId, true); + + try { + if (webConnection.post().contains("background")) { + int backgroundId = Integer.parseInt(webConnection.post().getString("background").split(":")[0]); + + + List widgetList = WidgetDao.getInventoryWidgets(playerDetails.getId()); + Widget widget = widgetList.stream().filter(w -> w.getId() == backgroundId).findFirst().orElse(null); + + if (widget != null) { + group.setBackground(widget.getProduct().getData()); + group.saveBackground(); + group.save(); + } + } + + if (webConnection.post().contains("stickers")) { + String[] stickerData = webConnection.post().getString("stickers").split(Pattern.quote("/")); + + if (stickerData.length >= HomeUtil.getStickerLimit(true)) { + webConnection.send(""); + return; + } + + for (String sticker : stickerData) { + int stickerId = Integer.parseInt(sticker.split(":")[0]); + String[] coordData = sticker.replace(stickerId + ":", "").split(","); + + int x = Integer.parseInt(coordData[0]); + int y = Integer.parseInt(coordData[1]); + int z = Integer.parseInt(coordData[2]); + + Widget widget = groupWidgets.stream().filter(w -> w.getId() == stickerId).findFirst().orElse(null); + + if (widget != null) { + widget.setX(x); + widget.setY(y); + widget.setZ(z); + widget.save(); + } + } + } + + if (webConnection.post().contains("widgets")) { + String[] stickerData = webConnection.post().getString("widgets").split(Pattern.quote("/")); + + for (String sticker : stickerData) { + int stickerId = Integer.parseInt(sticker.split(":")[0]); + String[] coordData = sticker.replace(stickerId + ":", "").split(","); + + int x = Integer.parseInt(coordData[0]); + int y = Integer.parseInt(coordData[1]); + int z = Integer.parseInt(coordData[2]); + + Widget widget = groupWidgets.stream().filter(w -> w.getId() == stickerId).findFirst().orElse(null); + + if (widget != null) { + widget.setX(x); + widget.setY(y); + widget.setZ(z); + widget.save(); + } + } + } + + if (webConnection.post().contains("stickienotes")) { + String[] stickerData = webConnection.post().getString("stickienotes").split(Pattern.quote("/")); + + for (String sticker : stickerData) { + int stickerId = Integer.parseInt(sticker.split(":")[0]); + String[] coordData = sticker.replace(stickerId + ":", "").split(","); + + int x = Integer.parseInt(coordData[0]); + int y = Integer.parseInt(coordData[1]); + int z = Integer.parseInt(coordData[2]); + + Widget widget = groupWidgets.stream().filter(w -> w.getId() == stickerId).findFirst().orElse(null); + + if (widget != null) { + widget.setX(x); + widget.setY(y); + widget.setZ(z); + widget.save(); + } + } + } + } catch (Exception ex) { + + } + + GroupEditDao.delete(userId, groupId); + + webConnection.session().delete("homeEditSession"); + webConnection.session().delete("groupEditSession"); + + webConnection.send(""); + } + + public static void groupinfo(WebConnection webConnection) { + int groupId = webConnection.post().getInt("groupId"); + Group group = GroupDao.getGroup(groupId); + + if (group == null) { + webConnection.send(""); + return; + } + + var template = webConnection.template("homes/widget/habblet/groupinfo"); + template.set("group", group); + template.render(); + + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/groups/GroupDiscussionsController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/groups/GroupDiscussionsController.java new file mode 100644 index 0000000..cee0eb1 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/groups/GroupDiscussionsController.java @@ -0,0 +1,166 @@ +package org.alexdev.http.controllers.groups; + +import io.netty.handler.codec.http.HttpResponseStatus; +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.duckhttpd.template.Template; +import org.alexdev.duckhttpd.util.config.Settings; +import org.alexdev.havana.dao.mysql.GroupDao; +import org.alexdev.havana.game.groups.Group; +import org.alexdev.havana.game.groups.GroupForumType; +import org.alexdev.havana.game.groups.GroupMember; +import org.alexdev.havana.util.config.GameConfiguration; +import org.alexdev.http.dao.GroupDiscussionDao; +import org.alexdev.http.game.groups.DiscussionTopic; +import org.alexdev.http.util.XSSUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; + +public class GroupDiscussionsController { + public static void viewDiscussions(WebConnection webConnection) { + XSSUtil.clear(webConnection); + + webConnection.session().set("page", "community"); + String match = webConnection.getMatches().get(0); + + String groupAlias = null; + Group group = null; + + if (StringUtils.isNumeric(match) && webConnection.getRouteRequest().endsWith("/id/discussions")) { + group = GroupDao.getGroup(Integer.parseInt(match)); + + if (group == null) { + webConnection.send(Settings.getInstance().getDefaultResponses().getResponse(HttpResponseStatus.NOT_FOUND, webConnection)); + return; + } + + if (!group.getAlias().isBlank()) { + webConnection.redirect("/groups/" + group.getAlias() + "/discussions"); + return; + } + + } else if (webConnection.getRouteRequest().endsWith("/discussions")) { + groupAlias = match; + group = GroupDao.getGroupByAlias(groupAlias); + } + + if (group == null) { + webConnection.send(Settings.getInstance().getDefaultResponses().getResponse(HttpResponseStatus.NOT_FOUND, webConnection)); + return; + } + + var template = webConnection.template("groups/view_discussions"); + template.set("group", group); + render(webConnection, group, template, 1); + template.render(); + } + + public static void viewDiscussionsPage(WebConnection webConnection) { + XSSUtil.clear(webConnection); + + webConnection.session().set("page", "community"); + + String match = webConnection.getMatches().get(0); + + String groupAlias = null; + Group group = null; + + if (StringUtils.isNumeric(match) && webConnection.getRouteRequest().contains("/id/discussions")) { + group = GroupDao.getGroup(Integer.parseInt(match)); + + if (group == null) { + webConnection.send(Settings.getInstance().getDefaultResponses().getResponse(HttpResponseStatus.NOT_FOUND, webConnection)); + return; + } + + if (!group.getAlias().isBlank()) { + webConnection.redirect("/groups/" + group.getAlias() + "/discussions"); + return; + } + + } else if (webConnection.getRouteRequest().contains("/discussions") && !webConnection.getRouteRequest().contains("id/")) { + groupAlias = match; + group = GroupDao.getGroupByAlias(groupAlias); + } + + if (group == null) { + webConnection.send(Settings.getInstance().getDefaultResponses().getResponse(HttpResponseStatus.NOT_FOUND, webConnection)); + return; + } + + int page = 1; + + try { + page = Integer.parseInt(webConnection.getMatches().get(1)); + } catch (Exception ex) { + + } + + var template = webConnection.template("groups/view_discussions"); + template.set("group", group); + render(webConnection, group, template, page); + template.render(); + } + + private static void render(WebConnection webConnection, Group group, Template template, int pageNumber) { + boolean loggedIn = webConnection.session().getBoolean("authenticated"); + template.set("hasMember", false); + template.set("canViewForum", group.getForumType() == GroupForumType.PUBLIC); + template.set("canPostForum", false);//(loggedIn && (!group.canForumPost(playerDetails.getId())))); + + if (webConnection.session().getBoolean("authenticated")) { + int userId = webConnection.session().getInt("user.id"); + + GroupMember groupMember = group.getMember(userId); + template.set("canPostForum", group.canForumPost(groupMember)); + + if (groupMember != null) { + template.set("hasMember", true); + template.set("groupMember", groupMember); + template.set("canViewForum", (loggedIn && group.canViewForum(groupMember))); + } + } + + if (pageNumber <= 0) { + pageNumber = 1; + } + + List discussionTopics = new ArrayList<>(); + + int limit = GameConfiguration.getInstance().getInteger("discussions.per.page"); + int discussionCount = 0; + int pages = 1; + + if ((boolean)template.get("canViewForum")) { + discussionCount = GroupDiscussionDao.countDiscussions(group.getId()); + pages = discussionCount > 0 ? (int) Math.ceil((double) discussionCount / (double) limit) : 1; + discussionTopics = GroupDiscussionDao.getDiscussions(group.getId(), pageNumber, limit, webConnection.session().getIntOrElse("user.id", 0)); + } + + for (int i = 1; i < 3 + 1; i++) { + int newPage = pageNumber - i; + + if (newPage >= 1) { + template.set("previousPage" + i, pageNumber - i); + } else { + template.set("previousPage" + i, -1); + } + } + + for (int i = 1; i < 3 + 1; i++) { + int newPage = pageNumber + i; + + if (newPage > 1 && newPage <= pages) { + template.set("nextPage" + i, pageNumber + i); + } else { + template.set("nextPage" + i, -1); + } + } + + template.set("currentPage", pageNumber); + template.set("pages", pages); + template.set("discussionTopics", discussionTopics); + } + +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/groups/GroupFavouriteController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/groups/GroupFavouriteController.java new file mode 100644 index 0000000..3ae8960 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/groups/GroupFavouriteController.java @@ -0,0 +1,90 @@ +package org.alexdev.http.controllers.groups; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.havana.dao.mysql.GroupDao; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.game.groups.Group; +import org.alexdev.havana.server.rcon.messages.RconHeader; +import org.alexdev.http.util.RconUtil; + +import java.util.HashMap; + +public class GroupFavouriteController { + public static void confirmselectfavourite(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int groupId = webConnection.post().getInt("groupId"); + String groupName = GroupDao.getGroupName(groupId); + + if (groupName == null) { + webConnection.send(""); + return; + } + + var template = webConnection.template("groups/favourite/confirm_select_favourite"); + template.set("groupName", groupName); + template.render(); + } + + public static void selectfavourite(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int groupId = webConnection.post().getInt("groupId"); + int userId = webConnection.session().getInt("user.id"); + + Group group = GroupDao.getGroup(groupId); + + if (group == null || !group.isMember(userId)) { + webConnection.send(""); + return; + } + + PlayerDao.saveFavouriteGroup(userId, groupId); + RconUtil.sendCommand(RconHeader.REFRESH_GROUP_PERMS, new HashMap<>() {{ + put("userId", String.valueOf(userId)); + }}); + + webConnection.send("OK"); + } + + public static void confirmdeselectfavourite(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + var template = webConnection.template("groups/favourite/confirm_deselect_favourite"); + template.render(); + } + + public static void deselectfavourite(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int groupId = webConnection.post().getInt("groupId"); + int userId = webConnection.session().getInt("user.id"); + + Group group = GroupDao.getGroup(groupId); + + if (group == null || !group.isMember(userId)) { + webConnection.send(""); + return; + } + + PlayerDao.saveFavouriteGroup(userId, 0); + + RconUtil.sendCommand(RconHeader.REFRESH_GROUP_PERMS, new HashMap<>() {{ + put("userId", String.valueOf(userId)); + }}); + + webConnection.send("OK"); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/groups/GroupHabbletController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/groups/GroupHabbletController.java new file mode 100644 index 0000000..6cfb385 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/groups/GroupHabbletController.java @@ -0,0 +1,362 @@ +package org.alexdev.http.controllers.groups; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.havana.dao.mysql.*; +import org.alexdev.havana.game.groups.Group; +import org.alexdev.havana.game.groups.GroupForumType; +import org.alexdev.havana.game.groups.GroupPermissionType; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.server.rcon.messages.RconHeader; +import org.alexdev.havana.util.StringUtil; +import org.alexdev.havana.util.config.GameConfiguration; +import org.alexdev.http.dao.GroupEditDao; +import org.alexdev.http.dao.WidgetDao; +import org.alexdev.http.game.stickers.StickerManager; +import org.alexdev.http.game.stickers.StickerType; +import org.alexdev.http.util.GroupUtil; +import org.alexdev.http.util.HtmlUtil; +import org.alexdev.http.util.RconUtil; + +import java.util.HashMap; +import java.util.stream.Collectors; + +public class GroupHabbletController { + public static void groupCreateForm(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.send(""); + return; + } + + PlayerDetails playerDetails = PlayerDao.getDetails(webConnection.session().getInt("user.id")); + + if (playerDetails.getCredits() < GameConfiguration.getInstance().getInteger("group.purchase.cost")) { + var template = webConnection.template("groups/habblet/purchase_result_error"); + template.render(); + } else { + var template = webConnection.template("groups/habblet/group_create_form"); + template.set("groupCost", GameConfiguration.getInstance().getInteger("group.purchase.cost")); + template.render(); + } + } + + public static void purchaseConfirmation(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.send(""); + return; + } + + String name = HtmlUtil.removeHtmlTags(StringUtil.filterInput(webConnection.post().getString("name"), true)); + + var template = webConnection.template("groups/habblet/purchase_confirmation"); + template.set("groupName", name); + template.set("groupCost", GameConfiguration.getInstance().getInteger("group.purchase.cost")); + template.render(); + } + + public static void purchaseAjax(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.send(""); + return; + } + + var template = webConnection.template("groups/habblet/purchase_ajax"); + PlayerDetails playerDetails = (PlayerDetails) template.get("playerDetails"); + + if (playerDetails.getCredits() < GameConfiguration.getInstance().getInteger("group.purchase.cost")) { + webConnection.send(""); + return; + } + + CurrencyDao.decreaseCredits(playerDetails, GameConfiguration.getInstance().getInteger("group.purchase.cost")); + + RconUtil.sendCommand(RconHeader.REFRESH_CREDITS, new HashMap<>() {{ + put("userId", playerDetails.getId()); + }}); + + String name = HtmlUtil.removeHtmlTags(StringUtil.filterInput(webConnection.post().getString("name"), true)); + String description = HtmlUtil.removeHtmlTags(StringUtil.filterInput(webConnection.post().getString("description"), true)); + + int groupId = GroupDao.addGroup(name, description, playerDetails.getId()); + + // (int userId, int x, int y, int z, String skin, int stickerId, int groupId, boolean isPlaced) + WidgetDao.purchaseWidget(0, 40, 34, 6, 1, StickerManager.getInstance().getStickerByData("guestbookwidget", StickerType.GROUP_WIDGET).getId(), "", groupId, true); + WidgetDao.purchaseWidget(0, 433, 40, 3, 1, StickerManager.getInstance().getStickerByData("groupinfowidget", StickerType.GROUP_WIDGET).getId(), "", groupId, true); + WidgetDao.purchaseWidget(0, 0, 0, 0, 1, StickerManager.getInstance().getStickerByData("memberwidget", StickerType.GROUP_WIDGET).getId(), "", groupId, false); + WidgetDao.purchaseWidget(0, 0, 0, 0, 1, StickerManager.getInstance().getStickerByData("traxplayerwidget", StickerType.GROUP_WIDGET).getId(), "", groupId, false); + + template.set("groupName", name); + template.set("groupId", groupId); + template.set("deductedCredits", playerDetails.getCredits()); + template.render(); + } + + public static void groupSettings(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int groupId = webConnection.post().getInt("groupId"); + Group group = GroupDao.getGroup(groupId); + + if (group == null) { + webConnection.send(""); + return; + } + + int userId = webConnection.session().getInt("user.id"); + + if (group.getOwnerId() != userId) { + webConnection.send(""); + return; + } + + var template = webConnection.template("groups/habblet/group_settings"); + template.set("group", group); + template.set("selected" + group.getGroupType() + "GroupType", " checked=\"checked\""); + template.set("selected" + group.getForumType().getId() + "ForumType", " checked=\"checked\""); + template.set("selected" + group.getForumPermission().getId() + "ForumPermissionType", " checked=\"checked\""); + template.set("charactersLeft", String.valueOf(255 - group.getDescription().length())); + template.set("rooms", RoomDao.getRoomsByUserId(userId).stream().filter(room -> room.getData().getGroupId() == 0 || room.getData().getGroupId() == group.getId()).collect(Collectors.toList())); + template.render(); + } + + public static void checkGroupUrl(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + var template = webConnection.template("groups/habblet/check_group_url"); + template.set("url", HtmlUtil.escape(webConnection.post().getString("url"))); + template.render(); + } + + public static void updateGroupSettings(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int userId = webConnection.session().getInt("user.id"); + int groupId = webConnection.post().getInt("groupId"); + + Group group = GroupDao.getGroup(groupId); + + if (group == null) { + return; + } + + if (group.getOwnerId() != userId) { + return; + } + + /** + + name: Alex's group + description: lol fuck u xdddd + groupId: 114 + type: 1 + url: + forumType: 0 + newTopicPermission: 0 + + */ + + String name = HtmlUtil.removeHtmlTags(webConnection.post().getString("name")); + String description = HtmlUtil.removeHtmlTags(webConnection.post().getString("description")); + String url = webConnection.post().getString("url").replaceAll("[^a-zA-Z0-9]", ""); + + if (url.length() > 30) { + url = url.substring(0, 30); + } + + if (name.length() > 30) { + name = name.substring(0, 30); + } + + if (description.length() > 255) { + description = description.substring(0, 255); + } + + int groupType = webConnection.post().getInt("type"); + int forumType = webConnection.post().getInt("forumType"); + int forumTypePermission = webConnection.post().getInt("newTopicPermission"); + int roomId = 0; + + try { + roomId = webConnection.post().getString("roomId").length() > 0 ? webConnection.post().getInt("roomId") : 0; + } catch (Exception ex) { + + } + if (groupType < 0 || groupType > 3) { + groupType = 0; + } + + if (roomId < 0) { + roomId = 0; + } + + if (forumType < 0 || forumType > 1) { + forumType = 0; + } + + if (forumTypePermission < 0 || forumTypePermission > 2) { + forumTypePermission = 0; + } + + group.setName(name); + group.setDescription(description); + + if (group.getGroupType() != 3) { + group.setGroupType(groupType); + } + + group.setForumType(GroupForumType.getById(forumType)); + group.setForumPermission(GroupPermissionType.getById(forumTypePermission)); + + if (group.getAlias() == null || group.getAlias().isBlank()) { + group.setAlias(null); + + if (!url.isBlank()) { + boolean existing = GroupDao.hasGroupByAlias(url); + + if (!existing) { + group.setAlias(url); + } + } + } + + RoomDao.saveGroupId(group.getRoomId(), 0); + + if (roomId > 0) { + Room room = RoomDao.getRoomById(roomId); + + if (room == null || room.getData().getOwnerId() != userId) { + roomId = 0; + } else { + RoomDao.saveGroupId(roomId, groupId); + } + } + + group.setRoomId(roomId); + group.save(); + + GroupUtil.refreshGroup(groupId); + + var template = webConnection.template("groups/habblet/update_group_settings"); + template.set("group", group); + template.set("message", "Editing group settings successful"); + template.render(); + } + + public static void showBadgeEditor(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int userId = webConnection.session().getInt("user.id"); + int groupId = webConnection.post().getInt("groupId"); + + Group group = GroupDao.getGroup(groupId); + + if (group == null) { + return; + } + + if (group.getOwnerId() != userId) { + return; + } + + var template = webConnection.template("groups/habblet/show_badge_editor"); + template.set("group", group); + template.render(); + } + + public static void updateGroupBadge(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int userId = webConnection.session().getInt("user.id"); + int groupId = webConnection.post().getInt("groupId"); + String badge = HtmlUtil.removeHtmlTags(webConnection.post().getString("code")); + + Group group = GroupDao.getGroup(groupId); + + if (group == null) { + return; + } + + if (group.getOwnerId() != userId) { + return; + } + + group.setBadge(badge.replaceAll("[^a-zA-Z0-9]", "")); + group.saveBadge(); + + GroupUtil.refreshGroup(groupId); + webConnection.redirect(group.generateClickLink()); + } + + public static void confirmDeleteGroup(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int userId = webConnection.session().getInt("user.id"); + int groupId = webConnection.post().getInt("groupId"); + + Group group = GroupDao.getGroup(groupId); + + if (group == null) { + return; + } + + if (group.getOwnerId() != userId) { + return; + } + + var template = webConnection.template("groups/habblet/confirm_delete_group"); + template.set("group", group); + template.render(); + } + + public static void deleteGroup(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int userId = webConnection.session().getInt("user.id"); + int groupId = webConnection.post().getInt("groupId"); + + Group group = GroupDao.getGroup(groupId); + + if (group == null) { + return; + } + + if (group.getOwnerId() != userId) { + return; + } + + GroupEditDao.deleteGroupWidgets(groupId); + GroupEditDao.pickupUserWidgets(groupId); + + GroupMemberDao.deleteMembers(groupId); + GroupMemberDao.resetFavourites(groupId); + GroupDao.delete(groupId); + + RconUtil.sendCommand(RconHeader.GROUP_DELETED, new HashMap<>() {{ + put("groupId", String.valueOf(groupId)); + }}); + + var template = webConnection.template("groups/habblet/delete_group"); + template.render(); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/groups/GroupMemberController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/groups/GroupMemberController.java new file mode 100644 index 0000000..4162d30 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/groups/GroupMemberController.java @@ -0,0 +1,455 @@ +package org.alexdev.http.controllers.groups; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.havana.dao.mysql.GroupDao; +import org.alexdev.havana.dao.mysql.GroupMemberDao; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.game.groups.Group; +import org.alexdev.havana.game.groups.GroupMember; +import org.alexdev.havana.game.groups.GroupMemberRank; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.server.rcon.messages.RconHeader; +import org.alexdev.http.util.RconUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.List; + +public class GroupMemberController { + public static void join(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int groupId = webConnection.post().getInt("groupId"); + Group group = GroupDao.getGroup(groupId); + + if (group == null) { + webConnection.send(""); + return; + } + + int userId = webConnection.session().getInt("user.id"); + var playerDetails = PlayerDao.getDetails(userId); + + if (playerDetails == null || group.isMember(userId) || group.isPendingMember(userId) || group.getGroupType() == 2) { + webConnection.send(""); + return; + } + + if (group.getGroupType() == 0 || group.getGroupType() == 3 || playerDetails.getRank().getRankId() >= PlayerRank.MODERATOR.getRankId()) { + var template = webConnection.template("groups/member/member_added"); + template.render(); + + /*webConnection.send("

\n" + + "You have now joined this group

\n" + + "\n" + + "

\n" + + "Ok\n" + + "

\n" + + "\n" + + "
"));*/ + } + + if (group.getGroupType() == 1) { + var template = webConnection.template("groups/member/member_added_request"); + template.render(); + /*webConnection.send("

\n" + + "Your membership request has been sent.

\n" + + "\n" + + "

\n" + + "Ok\n" + + "

\n" + + "\n" + + "
"));*/ + } + + if (playerDetails.getRank().getRankId() >= PlayerRank.MODERATOR.getRankId()) { + GroupMemberDao.addMember(userId, groupId, false); + } else { + GroupMemberDao.addMember(userId, groupId, group.getGroupType() == 1); + } + } + + public static void confirmLeave(WebConnection webConnection) { + var template = webConnection.template("groups/member/confirm_leave"); + template.render(); + + /* + webConnection.send("

\n" + + + "Are you sure you want to leave this group?

\n" + + "\n" + + "\n" + + "

\n" + + "Cancel\n" + + "Ok\n" + + "

\n" + + "\n" + + "
"));*/ + } + + public static void leave(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int groupId = webConnection.post().getInt("groupId"); + Group group = GroupDao.getGroup(groupId); + + if (group == null) { + webConnection.send(""); + return; + } + + int userId = webConnection.session().getInt("user.id"); + + if (group.isMember(userId)) { + GroupMember groupMember = group.getMember(userId); + + GroupMemberDao.deleteMember(userId, groupId); + + if (groupMember.getUser().getFavouriteGroupId() == group.getId()) { + PlayerDao.saveFavouriteGroup(userId, 0); + + RconUtil.sendCommand(RconHeader.REFRESH_GROUP_PERMS, new HashMap<>() {{ + put("userId", String.valueOf(userId)); + }}); + } + } + + /*webConnection.send("

\n" + + "Are you sure you want to leave this group?

\n" + + "\n" + + "\n" + + "

\n" + + "Cancel\n" + + "Ok\n" + + "

\n" + + "\n" + + "
"));*/ + var template = webConnection.template("groups/member/leave"); + template.set("groupId", groupId); + template.render(); + } + + public static void memberlist(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int groupId = webConnection.post().getInt("groupId"); + int userId = webConnection.session().getInt("user.id"); + + Group group = GroupDao.getGroup(groupId); + + if (group == null || !group.hasAdministrator(userId)) { + webConnection.send(""); + return; + } + + int pageNumber = 1; + + try { + pageNumber = webConnection.post().getInt("pageNumber"); + } catch (Exception ex) { + + } + + if (pageNumber <= 0) { + pageNumber = 1; + } + + int pendingMembers = GroupMemberDao.countMembers(group.getId(), true); + int groupMembers = GroupMemberDao.countMembers(group.getId(), false); + + int limit = 12; + boolean isPending = webConnection.post().getBoolean("pending"); + List groupMemberList = GroupMemberDao.getMembers(groupId, isPending, "", pageNumber, limit); + + int memberCount = isPending ? pendingMembers : groupMembers; + int pages = memberCount > 0 ? (int) Math.ceil((double)memberCount / (double)limit) : 0; + + if (pages == 0) { + pages = 1; + } + + GroupMember selfMember = group.getMember(userId); + webConnection.headers().put("X-JSON", "{\"pending\":\"Pending members (" + pendingMembers + ")\",\"members\":\"Members (" + groupMembers + ")\"}"); + + var template = webConnection.template("groups/memberlist"); + template.set("pages", pages); + template.set("memberList", groupMemberList); + template.set("currentPage", pageNumber); + template.set("selfMember", selfMember); + template.render(); + + + } + + public static void confirmRevokeRights(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int targetIds = webConnection.post().getArray("targetIds").size(); + + var template = webConnection.template("groups/member/confirm_revoke_rights"); + template.set("targetIds", targetIds); + template.render(); + } + + public static void revokeRights(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int groupId = webConnection.post().getInt("groupId"); + int userId = webConnection.session().getInt("user.id"); + + Group group = GroupDao.getGroup(groupId); + + if (group == null || group.getMember(userId).getMemberRank() != GroupMemberRank.OWNER) { + webConnection.send(""); + return; + } + + List data = webConnection.post().getArray("targetIds"); + + for (String user : data) { + if (!StringUtils.isNumeric(user)) { + continue; + } + + int memberId = Integer.parseInt(user); + GroupMember groupMember = group.getMember(memberId); + + if (groupMember == null || groupMember.getMemberRank() == GroupMemberRank.OWNER) { + continue; + } + + GroupMemberDao.updateMember(groupMember.getUserId(),groupMember.getGroupId(), GroupMemberRank.MEMBER, false); + } + + webConnection.send("OK"); + } + + public static void confirmGiveRights(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int targetIds = webConnection.post().getArray("targetIds").size(); + + var template = webConnection.template("groups/member/confirm_give_rights"); + template.set("targetIds", targetIds); + template.render(); + } + + public static void giveRights(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int groupId = webConnection.post().getInt("groupId"); + int userId = webConnection.session().getInt("user.id"); + + Group group = GroupDao.getGroup(groupId); + + if (group == null || group.getMember(userId).getMemberRank() != GroupMemberRank.OWNER) { + webConnection.send(""); + return; + } + + List data = webConnection.post().getArray("targetIds"); + + for (String user : data) { + if (!StringUtils.isNumeric(user)) { + continue; + } + + int memberId = Integer.parseInt(user); + GroupMember groupMember = group.getMember(memberId); + + if (groupMember == null || groupMember.getMemberRank() == GroupMemberRank.OWNER) { + continue; + } + + + GroupMemberDao.updateMember(groupMember.getUserId(),groupMember.getGroupId(), GroupMemberRank.ADMINISTRATOR, false); + } + + webConnection.send("OK"); + } + + public static void confirmRemove(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int targetIds = webConnection.post().getArray("targetIds").size(); + + var template = webConnection.template("groups/member/confirm_remove"); + template.set("targetIds", targetIds); + template.render(); + } + + public static void remove(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int groupId = webConnection.post().getInt("groupId"); + int userId = webConnection.session().getInt("user.id"); + + Group group = GroupDao.getGroup(groupId); + + if (group == null || !(group.getMember(userId).getMemberRank() == GroupMemberRank.OWNER || group.getMember(userId).getMemberRank() == GroupMemberRank.ADMINISTRATOR)) { + webConnection.send(""); + return; + } + + List data = webConnection.post().getArray("targetIds"); + + for (String user : data) { + if (!StringUtils.isNumeric(user)) { + continue; + } + + int memberId = Integer.parseInt(user); + GroupMember groupMember = group.getMember(memberId); + + if (groupMember == null || groupMember.getMemberRank() == GroupMemberRank.OWNER || groupMember.getMemberRank() == GroupMemberRank.ADMINISTRATOR) { + continue; + } + + GroupMemberDao.deleteMember(groupMember.getUserId(), groupMember.getGroupId()); + + if (groupMember.getUser().getFavouriteGroupId() == group.getId()) { + PlayerDao.saveFavouriteGroup(groupMember.getUserId(), 0); + + if (groupMember.getUser().isOnline()) { + RconUtil.sendCommand(RconHeader.REFRESH_GROUP_PERMS, new HashMap<>() {{ + put("userId", String.valueOf(userId)); + }}); + } + } + } + + webConnection.send("OK"); + } + + public static void confirmAccept(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int groupId = webConnection.post().getInt("groupId"); + String groupName = GroupDao.getGroupName(groupId); + + if (groupName == null) { + webConnection.send(""); + return; + } + + var template = webConnection.template("groups/member/confirm_accept"); + template.set("groupName", groupName); + template.render(); + } + + public static void accept(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int groupId = webConnection.post().getInt("groupId"); + int userId = webConnection.session().getInt("user.id"); + + Group group = GroupDao.getGroup(groupId); + + if (group == null || !(group.getMember(userId).getMemberRank() == GroupMemberRank.OWNER || group.getMember(userId).getMemberRank() == GroupMemberRank.ADMINISTRATOR)) { + webConnection.send(""); + return; + } + + List data = webConnection.post().getArray("targetIds"); + + for (String user : data) { + if (!StringUtils.isNumeric(user)) { + continue; + } + + int memberId = Integer.parseInt(user); + GroupMember groupMember = group.getPendingMember(memberId); + + if (groupMember == null || groupMember.getMemberRank() == GroupMemberRank.OWNER || groupMember.getMemberRank() == GroupMemberRank.ADMINISTRATOR) { + continue; + } + + GroupMemberDao.updateMember(groupMember.getUserId(), groupMember.getGroupId(), GroupMemberRank.MEMBER, false); + } + + webConnection.send("OK"); + } + + public static void confirmDecline(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int targetIds = webConnection.post().getString("targetIds").split(",").length; + + var template = webConnection.template("groups/member/confirm_decline"); + template.set("targetIds", targetIds); + template.render(); + } + + public static void decline(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int groupId = webConnection.post().getInt("groupId"); + int userId = webConnection.session().getInt("user.id"); + + Group group = GroupDao.getGroup(groupId); + + if (group == null || !(group.getMember(userId).getMemberRank() == GroupMemberRank.OWNER || group.getMember(userId).getMemberRank() == GroupMemberRank.ADMINISTRATOR)) { + webConnection.send(""); + return; + } + + List data = webConnection.post().getArray("targetIds"); + + for (String user : data) { + if (!StringUtils.isNumeric(user)) { + continue; + } + + int memberId = Integer.parseInt(user); + GroupMember groupMember = group.getPendingMember(memberId); + + if (groupMember == null || groupMember.getMemberRank() == GroupMemberRank.OWNER || groupMember.getMemberRank() == GroupMemberRank.ADMINISTRATOR) { + continue; + } + + GroupMemberDao.deleteMember(groupMember.getUserId(), groupMember.getGroupId()); + } + + webConnection.send("OK"); + } + +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/groups/GroupTagController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/groups/GroupTagController.java new file mode 100644 index 0000000..ebfd3e7 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/groups/GroupTagController.java @@ -0,0 +1,110 @@ +package org.alexdev.http.controllers.groups; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.havana.dao.mysql.GroupDao; +import org.alexdev.havana.dao.mysql.TagDao; +import org.alexdev.havana.game.groups.Group; +import org.alexdev.havana.game.wordfilter.WordfilterManager; +import org.alexdev.havana.util.StringUtil; +import org.alexdev.havana.util.config.GameConfiguration; + +import java.util.List; + +public class GroupTagController { + public static void addGroupTag(WebConnection webConnection) { + int userId = webConnection.session().getInt("user.id"); + + if (userId < 1) { + webConnection.send(""); + return; + } + + int groupId = webConnection.post().getInt("groupId"); + Group group = GroupDao.getGroup(groupId); + + if (group == null) { + webConnection.send(""); + return; + } + + if (group.getOwnerId() != userId) { + webConnection.send(""); + return; + } + + var tagList = TagDao.getGroupTags(groupId); + + if (tagList.size() >= GameConfiguration.getInstance().getInteger("max.tags.groups")) { + webConnection.send("taglimit"); + return; + } + + String tag = StringUtil.isValidTag(webConnection.post().getString("tagName"), 0, 0, groupId); + + if (tag == null) { + webConnection.send("invalidtag"); + return; + } + + if (WordfilterManager.filterSentence(tag).equals(tag)) { + StringUtil.addTag(tag, 0, 0, groupId); + } + + webConnection.send("valid"); + } + + public static void removeGroupTag(WebConnection webConnection) { + int userId = webConnection.session().getInt("user.id"); + + if (userId < 1) { + webConnection.send(""); + return; + } + + int groupId = webConnection.post().getInt("groupId"); + Group group = GroupDao.getGroup(groupId); + + if (group == null) { + webConnection.send(""); + return; + } + + if (group.getOwnerId() != userId) { + webConnection.send(""); + return; + } + + TagDao.removeTag(0, 0, groupId, webConnection.post().getString("tagName")); + List groupTags = TagDao.getGroupTags(groupId); + + var template = webConnection.template("groups/habblet/listgrouptags"); + template.set("tags", groupTags); + template.set("group", group); + template.render(); + } + + public static void listGroupTag(WebConnection webConnection) { + int userId = webConnection.session().getInt("user.id"); + + if (userId < 1) { + webConnection.send(""); + return; + } + + int groupId = webConnection.post().getInt("groupId"); + Group group = GroupDao.getGroup(groupId); + + if (group == null) { + webConnection.send(""); + return; + } + + List groupTags = TagDao.getGroupTags(groupId); + + var template = webConnection.template("groups/habblet/listgrouptags"); + template.set("tags", groupTags); + template.set("group", group); + template.render(); + } + +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/groups/discussions/DiscussionActionsController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/groups/discussions/DiscussionActionsController.java new file mode 100644 index 0000000..7805b65 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/groups/discussions/DiscussionActionsController.java @@ -0,0 +1,577 @@ +package org.alexdev.http.controllers.groups.discussions; + +import io.netty.handler.codec.http.FullHttpResponse; +import org.alexdev.duckhttpd.response.ResponseBuilder; +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.havana.dao.mysql.GroupDao; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.game.groups.Group; +import org.alexdev.havana.game.groups.GroupForumType; +import org.alexdev.havana.game.groups.GroupMemberRank; +import org.alexdev.havana.game.groups.GroupPermissionType; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.util.config.GameConfiguration; +import org.alexdev.http.dao.GroupDiscussionDao; +import org.alexdev.http.game.groups.DiscussionReply; +import org.alexdev.http.game.groups.DiscussionTopic; +import org.alexdev.http.util.Captcha; +import org.alexdev.http.util.XSSUtil; + +public class DiscussionActionsController { + public static void newtopic(WebConnection webConnection) { + XSSUtil.clear(webConnection); + + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + + var template = webConnection.template("groups/discussions/newpost"); + template.render(); + } + + public static void savetopic(WebConnection webConnection) { + XSSUtil.clear(webConnection); + + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + String captcha = webConnection.post().getString("captcha"); + String message = webConnection.post().getString("message"); + String topicName = webConnection.post().getString("topicName"); + + int groupId = 0; + + try { + groupId = webConnection.post().getInt("groupId"); + } catch (Exception ex) { + + } + + if (topicName.isBlank() || message.isBlank()) { + var template = webConnection.template("groups/discussion_replies"); + template.set("hasMessage", true); + template.set("message", "Please supply a valid message."); + template.render(); + return; + } + + if (!webConnection.session().getString("captcha-text").equals(captcha)) { + webConnection.session().delete("captcha-text"); + + FullHttpResponse httpResponse = ResponseBuilder.create(""); + httpResponse.headers().set("X-JSON", "{\"captchaError\":\"true\"}"); + webConnection.send(httpResponse); + return; + } + + int userId = webConnection.session().getInt("user.id"); + var latestMessage = GroupDiscussionDao.getLatestReply(userId); + + if (latestMessage != null && latestMessage.getMessage().startsWith(message)) { + var template = webConnection.template("groups/discussion_replies"); + template.set("hasMessage", true); + template.set("message", "Do not spam the forums"); + template.render(); + return; + } + + Group group = GroupDao.getGroup(groupId); + + if (group == null) { + webConnection.redirect("/"); + return; + } + + if (group.getForumType() == GroupForumType.PRIVATE || + group.getForumPermission() == GroupPermissionType.MEMBER_ONLY || + group.getForumPermission() == GroupPermissionType.ADMIN_ONLY) { + var groupMember = group.getMember(userId); + + if (groupMember == null) { + webConnection.redirect("/"); + return; + } + + if (group.getForumPermission() == GroupPermissionType.ADMIN_ONLY) { + if (groupMember.getMemberRank() != GroupMemberRank.ADMINISTRATOR && groupMember.getMemberRank() != GroupMemberRank.OWNER) { + webConnection.redirect("/"); + return; + } + } + } + + if (topicName.length() > 32) { + topicName = topicName.substring(0, 32); + } + + /*int topicId = 1; + + if (WordfilterManager.filterSentence(message).equals(message)) { + topicId = GroupDiscussionDao.createDiscussion(groupId, userId, topicName); + GroupDiscussionDao.createReplies(topicId, userId, message); + }*/ + + int topicId = GroupDiscussionDao.createDiscussion(groupId, userId, topicName); + GroupDiscussionDao.createReplies(topicId, userId, message); + + webConnection.session().delete("captcha-text"); + webConnection.send(group.generateClickLink() + "/discussions/" + topicId + "/id"); + } + + public static void pingsession(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + FullHttpResponse httpResponse = ResponseBuilder.create(""); + httpResponse.headers().set("X-JSON", "{\"privilegeLevel\":\"1\"}"); + webConnection.send(httpResponse); + } + + + public static void opentopicsettings(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int groupId = 0; + + try { + groupId = webConnection.post().getInt("groupId"); + } catch (Exception ex) { + + } + + int topicId = 0; + + try { + topicId = webConnection.post().getInt("topicId"); + } catch (Exception ex) { + + } + + DiscussionTopic discussionTopic = GroupDiscussionDao.getDiscussion(groupId, topicId, webConnection.session().getIntOrElse("user.id", 0)); + + if (discussionTopic == null) { + webConnection.redirect("/"); + return; + } + + var template = webConnection.template("groups/discussions/opentopicsettings"); + template.set("topic", discussionTopic); + template.render(); + } + + public static void confirm_delete_topic(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + var template = webConnection.template("groups/discussions/confirm_delete_topic"); + template.render(); + } + + public static void deletetopic(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int groupId = 0; + + try { + groupId = webConnection.post().getInt("groupId"); + } catch (Exception ex) { + + } + + int topicId = 0; + + try { + topicId = webConnection.post().getInt("topicId"); + } catch (Exception ex) { + + } + + DiscussionTopic discussionTopic = GroupDiscussionDao.getDiscussion(groupId, topicId, webConnection.session().getIntOrElse("user.id", 0)); + + if (discussionTopic == null) { + webConnection.redirect("/"); + return; + } + + Group group = GroupDao.getGroup(groupId); + + if (group == null) { + webConnection.redirect("/"); + return; + } + + int userId = webConnection.session().getInt("user.id"); + + if (discussionTopic.getCreatorId() != userId) { + var playerDetails = PlayerDao.getDetails(userId); + var groupMember = group.getMember(userId); + + if (!Group.hasTopicAdmin(playerDetails.getRank())) { + if (groupMember == null || groupMember.getMemberRank() == GroupMemberRank.MEMBER) { + return; + } + } + } + + GroupDiscussionDao.deleteDiscussion(groupId, topicId); + webConnection.send("SUCCESS"); + } + + public static void savetopicsettings(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int groupId = 0; + int topicId = 0; + + try { + groupId = webConnection.post().getInt("groupId"); + topicId = webConnection.post().getInt("topicId"); + } catch (Exception ex) { + + } + + + DiscussionTopic discussionTopic = GroupDiscussionDao.getDiscussion(groupId, topicId, webConnection.session().getIntOrElse("user.id", 0)); + + if (discussionTopic == null) { + webConnection.redirect("/"); + return; + } + + Group group = GroupDao.getGroup(groupId); + + if (group == null) { + webConnection.redirect("/"); + return; + } + + var template = webConnection.template("groups/discussion_replies"); + var playerDetails = (PlayerDetails)template.get("playerDetails"); + + int userId = webConnection.session().getInt("user.id"); + + if (discussionTopic.getCreatorId() != userId) { + var groupMember = group.getMember(userId); + + if (!Group.hasTopicAdmin(playerDetails.getRank())) { + if (groupMember == null || groupMember.getMemberRank() == GroupMemberRank.MEMBER) { + return; + } + } + } + + int pageNumber = 1; + + try { + pageNumber = webConnection.post().getInt("page"); + } catch (Exception ex) { + + } + + if (pageNumber <= 0) { + pageNumber = 1; + } + + try { + String topicTitle = webConnection.post().getString("topicName"); + + if (topicTitle.length() > 32) { + topicTitle = topicTitle.substring(0, 32); + } + + discussionTopic.setOpen(webConnection.post().getInt("topicClosed") == 0); + discussionTopic.setStickied(webConnection.post().getInt("topicSticky") == 1); + discussionTopic.setTopicTitle(topicTitle); + GroupDiscussionDao.saveDiscussion(discussionTopic); + } catch (Exception ex) { + + } + + DiscussionController.appendpagedata(template, webConnection, group, discussionTopic, pageNumber); + template.render(); + } + + public static void updatepost(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int groupId = 0; + int topicId = 0; + int postId = 0; + int pageNumber = 1; + + try { + groupId = webConnection.post().getInt("groupId"); + topicId = webConnection.post().getInt("topicId"); + postId = webConnection.post().getInt("postId"); + pageNumber = webConnection.post().getInt("page"); + } catch (Exception ex) { + + } + + if (pageNumber <= 0) { + pageNumber = 1; + } + + DiscussionTopic discussionTopic = GroupDiscussionDao.getDiscussion(groupId, topicId, webConnection.session().getIntOrElse("user.id", 0)); + + if (discussionTopic == null || !discussionTopic.isOpen()) { + webConnection.redirect("/"); + return; + } + + DiscussionReply discussionReply = GroupDiscussionDao.getReply(discussionTopic.getId(), postId, webConnection.session().getIntOrElse("user.id", 0)); + + if (discussionReply == null) { + webConnection.redirect("/"); + return; + } + + Group group = GroupDao.getGroup(groupId); + + if (group == null) { + webConnection.redirect("/"); + return; + } + + if (Captcha.matches(webConnection, webConnection.post().getString("captcha"))) { + webConnection.session().delete("captcha-text"); + + FullHttpResponse httpResponse = ResponseBuilder.create(""); + httpResponse.headers().set("X-JSON", "{\"captchaError\":\"true\"}"); + webConnection.send(httpResponse); + return; + } + + int userId = webConnection.session().getInt("user.id"); + + if (discussionReply.getUserId() != userId) { + /*var playerDetails = PlayerDao.getDetails(userId); + var groupMember = group.getMember(userId); + + if (groupMember == null) { + if (playerDetails.getRank().getRankId() < 6) { + return; + } + } else { + if (groupMember.getMemberRank() == GroupMemberRank.MEMBER) { + return; + } + }*/ + webConnection.redirect("/"); + return; + } + + var template = webConnection.template("groups/discussion_replies"); + var playerDetails = (PlayerDetails)template.get("playerDetails"); + + try { + String message = webConnection.post().getString("message"); + discussionReply.setMessage(message); + + if (!Group.hasTopicAdmin(playerDetails.getRank())) { + discussionReply.setEdited(true); + } + + GroupDiscussionDao.saveReply(discussionReply); + /*if (WordfilterManager.filterSentence(message).equals(message)) { + discussionReply.setMessage(message); + + if (!Group.hasTopicAdmin(playerDetails.getRank())) { + discussionReply.setEdited(true); + } + + GroupDiscussionDao.saveReply(discussionReply); + }*/ + } catch (Exception ex) { + + } + + webConnection.session().delete("captcha-text"); + + DiscussionController.appendpagedata(template, webConnection, group, discussionTopic, pageNumber); + template.render(); + } + + public static void deletepost(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int groupId = 0; + int topicId = 0; + int postId = 0; + int pageNumber = 1; + + try { + groupId = webConnection.post().getInt("groupId"); + topicId = webConnection.post().getInt("topicId"); + postId = webConnection.post().getInt("postId"); + pageNumber = webConnection.post().getInt("page"); + } catch (Exception ex) { + + } + + if (pageNumber <= 0) { + pageNumber = 1; + } + + DiscussionTopic discussionTopic = GroupDiscussionDao.getDiscussion(groupId, topicId, webConnection.session().getIntOrElse("user.id", 0)); + + if (discussionTopic == null || !discussionTopic.isOpen()) { + webConnection.redirect("/?1"); + return; + } + + DiscussionReply discussionReply = GroupDiscussionDao.getReply(discussionTopic.getId(), postId, webConnection.session().getIntOrElse("user.id", 0)); + + if (discussionReply == null) { + webConnection.redirect("/?2"); + return; + } + + Group group = GroupDao.getGroup(groupId); + + if (group == null) { + webConnection.redirect("/?3"); + return; + } + + var template = webConnection.template("groups/discussion_replies"); + var playerDetails = (PlayerDetails)template.get("playerDetails"); + + int userId = webConnection.session().getInt("user.id"); + + if (discussionReply.getUserId() != userId) { + var groupMember = group.getMember(userId); + + if (!Group.hasTopicAdmin(playerDetails.getRank())) { + if (groupMember == null || groupMember.getMemberRank() == GroupMemberRank.MEMBER) { + return; + } + } + } + + try { + if (discussionReply.getUserId() != userId) { + GroupDiscussionDao.deleteReply(discussionReply); + } else { + if (!Group.hasTopicAdmin(playerDetails.getRank())) { + discussionReply.setDeleted(true); + GroupDiscussionDao.saveReply(discussionReply); + } else { + GroupDiscussionDao.deleteReply(discussionReply); + } + } + } catch (Exception ex) { + + } + + DiscussionController.appendpagedata(template, webConnection, group, discussionTopic, pageNumber); + template.render(); + } + + public static void savepost(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int groupId = 0; + int topicId = 0; + + try { + groupId = webConnection.post().getInt("groupId"); + topicId = webConnection.post().getInt("topicId"); + } catch (Exception ex) { + + } + + if (!webConnection.session().getString("captcha-text").equals(webConnection.post().getString("captcha"))) { + webConnection.session().delete("captcha-text"); + + FullHttpResponse httpResponse = ResponseBuilder.create(""); + httpResponse.headers().set("X-JSON", "{\"captchaError\":\"true\"}"); + webConnection.send(httpResponse); + return; + } + + String message = webConnection.post().getString("message"); + + if (message.isBlank()) { + var template = webConnection.template("groups/discussion_replies"); + template.set("hasMessage", true); + template.set("message", "Please supply a valid message."); + template.render(); + return; + } + var template = webConnection.template("groups/discussion_replies"); + var playerDetails = (PlayerDetails)template.get("playerDetails"); + + DiscussionTopic discussionTopic = GroupDiscussionDao.getDiscussion(groupId, topicId, webConnection.session().getIntOrElse("user.id", 0)); + + if (discussionTopic == null || (!discussionTopic.isOpen() && !Group.hasTopicAdmin(playerDetails.getRank()))) { + webConnection.redirect("/"); + return; + } + + int userId = webConnection.session().getInt("user.id"); + var latestMessage = GroupDiscussionDao.getLatestReply(userId); + + if (latestMessage != null && latestMessage.getMessage().startsWith(message)) { + template.set("hasMessage", true); + template.set("message", "Do not spam the forums"); + template.render(); + return; + } + + Group group = GroupDao.getGroup(groupId); + + if (group == null) { + webConnection.redirect("/"); + return; + } + + if (group.getForumType() == GroupForumType.PRIVATE) { + var groupMember = group.getMember(userId); + + if (groupMember == null) { + webConnection.redirect("/"); + return; + } + } + + webConnection.session().delete("captcha-text"); + + //if (WordfilterManager.filterSentence(message).equals(message)) { + GroupDiscussionDao.createReplies(topicId, userId, message); + //} + + int limit = GameConfiguration.getInstance().getInteger("discussions.replies.per.page"); + int replyCount = GroupDiscussionDao.countReplies(discussionTopic.getId()); + int pages = replyCount > 0 ? (int) Math.ceil((double) replyCount / (double) limit) : 1; + + DiscussionController.appendpagedata(template, webConnection, group, discussionTopic, pages); + template.render(); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/groups/discussions/DiscussionController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/groups/discussions/DiscussionController.java new file mode 100644 index 0000000..d57b6a5 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/groups/discussions/DiscussionController.java @@ -0,0 +1,186 @@ +package org.alexdev.http.controllers.groups.discussions; + +import io.netty.handler.codec.http.HttpResponseStatus; +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.duckhttpd.template.Template; +import org.alexdev.duckhttpd.util.config.Settings; +import org.alexdev.havana.dao.mysql.GroupDao; +import org.alexdev.havana.game.groups.Group; +import org.alexdev.havana.game.groups.GroupForumType; +import org.alexdev.havana.game.groups.GroupMember; +import org.alexdev.havana.game.groups.GroupMemberRank; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.util.config.GameConfiguration; +import org.alexdev.http.dao.GroupDiscussionDao; +import org.alexdev.http.dao.ReplyDao; +import org.alexdev.http.game.groups.DiscussionReply; +import org.alexdev.http.game.groups.DiscussionTopic; +import org.alexdev.http.util.XSSUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.stream.Collectors; + +public class DiscussionController { + public static void viewDiscussion(WebConnection webConnection) { + XSSUtil.clear(webConnection); + + webConnection.session().set("page", "community"); + String match = webConnection.getMatches().get(0); + + int discussionId = 0; + + try { + discussionId = Integer.parseInt(webConnection.getMatches().get(1)); + } catch (Exception ex) { + + } + + boolean hasPageSpecified = false; + int pageNumber = 1; + + try { + pageNumber = Integer.parseInt(webConnection.getMatches().get(2)); + hasPageSpecified = true; + } catch (Exception ex) { + + } + + String groupAlias; + Group group; + + if (StringUtils.isNumeric(match) && webConnection.getRouteRequest().contains("/id/discussions")) { + group = GroupDao.getGroup(Integer.parseInt(match)); + + if (group == null) { + webConnection.send(Settings.getInstance().getDefaultResponses().getResponse(HttpResponseStatus.NOT_FOUND, webConnection)); + return; + } + + if (!group.getAlias().isBlank()) { + webConnection.redirect("/groups/" + group.getAlias() + "/discussions/" + discussionId + "/id" + (hasPageSpecified ? "/page/" + pageNumber : "")); + return; + } + + } else { + groupAlias = match; + group = GroupDao.getGroupByAlias(groupAlias); + } + + if (group == null) { + webConnection.send(Settings.getInstance().getDefaultResponses().getResponse(HttpResponseStatus.NOT_FOUND, webConnection)); + return; + } + + DiscussionTopic discussionTopic = GroupDiscussionDao.getDiscussion(group.getId(), discussionId, webConnection.session().getIntOrElse("user.id", 0)); + + if (discussionTopic == null) { + webConnection.send(Settings.getInstance().getDefaultResponses().getResponse(HttpResponseStatus.NOT_FOUND, webConnection)); + return; + } + + + var template = webConnection.template("groups/discussion"); + + if (pageNumber <= 0) { + pageNumber = 1; + } + + if (!webConnection.session().contains("hasViewedDiscussion" + discussionId)) { + webConnection.session().set("hasViewedDiscussion" + discussionId, true); + GroupDiscussionDao.incrementViews(discussionId); + } + + appendpagedata(template, webConnection, group, discussionTopic, pageNumber); + template.render(); + } + + public static void appendpagedata(Template template, WebConnection webConnection, Group group, DiscussionTopic discussionTopic, int pageNumber) { + boolean loggedIn = webConnection.session().getBoolean("authenticated"); + boolean hasTopicAdmin = false; + + if (loggedIn) { + var playerDetails = (PlayerDetails)template.get("playerDetails"); + hasTopicAdmin = Group.hasTopicAdmin(playerDetails.getRank()); + } + + template.set("group", group); + template.set("hasMember", false); + template.set("hasMessage", false); + template.set("canViewForum", group.getForumType() == GroupForumType.PUBLIC); + template.set("canReplyForum", false);//(loggedIn && (!group.canForumPost(playerDetails.getId())))); + + int userId = webConnection.session().getIntOrElse("user.id", 0); + + if (webConnection.session().getBoolean("authenticated")) { + GroupMember groupMember = group.getMember(userId); + + template.set("canViewForum", (loggedIn && group.canViewForum(groupMember))); + template.set("canReplyForum", (loggedIn && group.canReplyForum(groupMember))); + + if (groupMember != null) { + template.set("hasMember", true); + template.set("groupMember", groupMember); + + if (!hasTopicAdmin) { + hasTopicAdmin = (groupMember.getMemberRank() == GroupMemberRank.ADMINISTRATOR || groupMember.getMemberRank() == GroupMemberRank.OWNER); + } + } + } + + if (!discussionTopic.isOpen()) { + template.set("canReplyForum", false); + } + + if (!((boolean)template.get("canViewForum"))) { + template.set("hasMessage", true); + template.set("message", "View forums denied. Please check that you are logged in and have the appropriate rights to view the forums. If you are logged in and still can't view the forums, the group may be private. If so, you need to join the group in order to view the forums. "); + return; + } + + int firstReply = GroupDiscussionDao.getFirstReply(discussionTopic.getId()); + template.set("firstReply", firstReply); + + int limit = GameConfiguration.getInstance().getInteger("discussions.replies.per.page"); + + int replyCount = GroupDiscussionDao.countReplies(discussionTopic.getId()); + int pages = replyCount > 0 ? (int) Math.ceil((double) replyCount / (double) limit) : 1; + List replyList = GroupDiscussionDao.getReplies(discussionTopic.getId(), pageNumber, limit, webConnection.session().getIntOrElse("user.id", 0)); + + if (userId > 0) { + var isNew = replyList.stream().filter(DiscussionReply::isNew).collect(Collectors.toList()); + + if (isNew.size() > 0) { + ReplyDao.read(userId, replyList.stream().filter(DiscussionReply::isNew).collect(Collectors.toList())); + } + } + + for (int i = 1; i < 3 + 1; i++) { + int newPage = pageNumber - i; + + if (newPage >= 1) { + template.set("previousPage" + i, pageNumber - i); + } else { + template.set("previousPage" + i, -1); + } + } + + for (int i = 1; i < 3 + 1; i++) { + int newPage = pageNumber + i; + + if (newPage > 1 && newPage <= pages) { + template.set("nextPage" + i, pageNumber + i); + } else { + template.set("nextPage" + i, -1); + } + } + + template.set("currentPage", pageNumber); + template.set("pages", pages); + template.set("replyList", replyList); + template.set("discussionId", discussionTopic.getId()); + template.set("discussionTopic", discussionTopic); + template.set("hasTopicAdmin", hasTopicAdmin); + + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/groups/discussions/DiscussionPreviewController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/groups/discussions/DiscussionPreviewController.java new file mode 100644 index 0000000..8e3e9ef --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/groups/discussions/DiscussionPreviewController.java @@ -0,0 +1,114 @@ +package org.alexdev.http.controllers.groups.discussions; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.http.dao.GroupDiscussionDao; +import org.alexdev.http.game.groups.DiscussionTopic; +import org.alexdev.http.util.BBCode; +import org.alexdev.http.util.HtmlUtil; + +public class DiscussionPreviewController { + public static void previewtopic(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int groupId = 0; + + try { + groupId = webConnection.post().getInt("groupId"); + } catch (Exception ex) { + + } + + String topicName = webConnection.post().getString("topicName"); + String topicMessage = webConnection.post().getString("message"); + + int userId = webConnection.session().getInt("user.id"); + var displayBadges = GroupDiscussionDao.getDisplayBadges(userId); + + var template = webConnection.template("groups/discussions/previewtopic"); + template.set("topicName", topicName); + template.set("topicMessage", BBCode.format(HtmlUtil.escape(BBCode.normalise(topicMessage)), false)); + template.set("previewDay", DateUtil.getDate(DateUtil.getCurrentTimeSeconds(), "MMM dd, yyyy").replace("am", "AM").replace("pm", "PM").replace(".", "")); + template.set("previewTime", DateUtil.getDate(DateUtil.getCurrentTimeSeconds(), "h:mm a").replace("am", "AM").replace("pm", "PM").replace(".", "")); + template.set("userReplies", GroupDiscussionDao.countUserReplies(userId)); + + template.set("hasBadge", false); + template.set("hasGroup", false); + + if (displayBadges[0] != null) { + template.set("hasBadge", true); + template.set("badge", displayBadges[0]); + } + + if (displayBadges[1] != null) { + template.set("hasGroup", true); + template.set("groupId", ((PlayerDetails) template.get("playerDetails")).getFavouriteGroupId()); + template.set("groupBadge", displayBadges[1]); + } + + template.render(); + } + + public static void previewpost(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int topicId = 0; + + try { + topicId = webConnection.post().getInt("topicId"); + } catch (Exception ex) { + + } + + int groupId = 0; + + try { + groupId = webConnection.post().getInt("groupId"); + } catch (Exception ex) { + + } + + DiscussionTopic discussionTopic = GroupDiscussionDao.getDiscussion(groupId, topicId, webConnection.session().getIntOrElse("user.id", 0)); + + if (discussionTopic == null) { + webConnection.redirect("/"); + return; + } + + + String topicMessage = webConnection.post().getString("message"); + + int userId = webConnection.session().getInt("user.id"); + var displayBadges = GroupDiscussionDao.getDisplayBadges(userId); + + var template = webConnection.template("groups/discussions/previewpost"); + template.set("postName", "RE: " + discussionTopic.getTopicTitle()); + template.set("postMessage", BBCode.format(HtmlUtil.escape(BBCode.normalise(topicMessage)), false)); + template.set("previewDay", DateUtil.getDate(DateUtil.getCurrentTimeSeconds(), "MMM dd, yyyy").replace("am", "AM").replace("pm","PM").replace(".", "")); + template.set("previewTime", DateUtil.getDate(DateUtil.getCurrentTimeSeconds(), "h:mm a").replace("am", "AM").replace("pm","PM").replace(".", "")); + template.set("userReplies", GroupDiscussionDao.countUserReplies(userId)); + + template.set("hasBadge", false); + template.set("hasGroup", false); + + if (displayBadges[0] != null) { + template.set("hasBadge", true); + template.set("badge", displayBadges[0]); + } + + if (displayBadges[1] != null) { + template.set("hasGroup", true); + template.set("groupId", ((PlayerDetails)template.get("playerDetails")).getFavouriteGroupId()); + template.set("groupBadge", displayBadges[1]); + } + + template.render(); + } +} \ No newline at end of file diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/habblet/EventController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/habblet/EventController.java new file mode 100644 index 0000000..e80b8bf --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/habblet/EventController.java @@ -0,0 +1,22 @@ +package org.alexdev.http.controllers.habblet; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.havana.dao.mysql.EventsDao; +import org.alexdev.http.server.Watchdog; + +import java.util.stream.Collectors; + +public class EventController { + public static void loadEvents(WebConnection webConnection) { + if (!webConnection.post().contains("eventTypeId")) { + webConnection.send(""); + return; + } + + int filterId = webConnection.post().getInt("eventTypeId"); + + var tpl = webConnection.template("habblet/load_events"); + tpl.set("events", Watchdog.EVENTS.stream().filter(event -> event.getCategoryId() == filterId).collect(Collectors.toList())); + tpl.render(); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/habblet/FeedController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/habblet/FeedController.java new file mode 100644 index 0000000..a5f6b04 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/habblet/FeedController.java @@ -0,0 +1,93 @@ +package org.alexdev.http.controllers.habblet; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.havana.dao.mysql.AlertsDao; +import org.alexdev.havana.dao.mysql.PlayerStatisticsDao; +import org.alexdev.havana.game.alerts.AccountAlert; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.statistics.PlayerStatistic; +import org.alexdev.havana.game.player.statistics.PlayerStatisticManager; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.http.game.account.BeginnerGiftManager; + +import java.util.List; + +public class FeedController { + public static void removeFeedItem(WebConnection connection) { + if (!connection.session().getBoolean("authenticated")) { + connection.redirect("/"); + return; + } + + int feedItemIndex = -1; + + try { + feedItemIndex = connection.post().getInt("feedItemIndex"); + } catch (Exception ex) { + + } + + if (feedItemIndex != -1) { + int userId = connection.session().getInt("user.id"); + List accountAlerts = AlertsDao.getAlerts(userId); + + try { + AccountAlert alert = accountAlerts.get(feedItemIndex); + AlertsDao.deleteAlert(userId, alert.getId()); + } catch (Exception ex) { + + } + + connection.send(""); + } + } + + public static void nextgift(WebConnection connection) { + if (!connection.session().getBoolean("authenticated")) { + connection.send(""); + return; + } + + var template = connection.template("habblet/nextgift"); + + PlayerDetails playerDetails = (PlayerDetails) template.get("playerDetails"); + var statistics = new PlayerStatisticManager(playerDetails.getId(), PlayerStatisticsDao.getStatistics(playerDetails.getId())); + + template.set("newbieRoomLayout", statistics.getIntValue(PlayerStatistic.NEWBIE_ROOM_LAYOUT)); + template.set("newbieNextGift", statistics.getIntValue(PlayerStatistic.NEWBIE_GIFT)); + + if (statistics.getIntValue(PlayerStatistic.NEWBIE_ROOM_LAYOUT) > 0 && statistics.getIntValue(PlayerStatistic.NEWBIE_GIFT) > 0) { + int seconds = statistics.getIntValue(PlayerStatistic.NEWBIE_GIFT_TIME) - DateUtil.getCurrentTimeSeconds(); + + if (BeginnerGiftManager.progress(playerDetails, statistics)) { + seconds = statistics.getIntValue(PlayerStatistic.NEWBIE_GIFT_TIME) - DateUtil.getCurrentTimeSeconds(); + template.set("newbieNextGift", statistics.getIntValue(PlayerStatistic.NEWBIE_GIFT)); + } + + if (seconds < 0) { + seconds = 0; + } + + template.set("newbieGiftSeconds", seconds); + } + + template.render(); + } + + public static void giftqueueHide(WebConnection connection) { + if (!connection.session().getBoolean("authenticated")) { + connection.send(""); + return; + } + + int userId = connection.session().getInt("user.id"); + + int nextGift = (int) PlayerStatisticsDao.getStatisticLong(userId, PlayerStatistic.NEWBIE_GIFT); + + if (nextGift == 3) { + PlayerStatisticsDao.updateStatistic(userId, PlayerStatistic.NEWBIE_GIFT, 4); + } + + connection.send(""); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/habblet/HabboClubHabblet.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/habblet/HabboClubHabblet.java new file mode 100644 index 0000000..afca0c6 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/habblet/HabboClubHabblet.java @@ -0,0 +1,113 @@ +package org.alexdev.http.controllers.habblet; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.havana.dao.mysql.AlertsDao; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.dao.mysql.PlayerStatisticsDao; +import org.alexdev.havana.game.alerts.AlertType; +import org.alexdev.havana.game.club.ClubSubscription; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.statistics.PlayerStatistic; +import org.alexdev.havana.server.rcon.messages.RconHeader; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.config.GameConfiguration; +import org.alexdev.http.util.RconUtil; + +import java.util.HashMap; +import java.util.concurrent.TimeUnit; + +public class HabboClubHabblet { + public static void confirm(WebConnection webConnection) { + int optionNumber = 1; + + try { + optionNumber = Integer.parseInt(webConnection.post().getString("optionNumber")); + } catch (Exception ex) { + + } + + if (optionNumber < 0 || optionNumber > 4) { + return; + } + + var choiceData = ClubSubscription.getChoiceData(optionNumber); + + var template = webConnection.template("habblet/habboClubConfirm"); + template.set("clubCredits", choiceData.getKey()); + template.set("clubDays", choiceData.getValue()); + template.set("clubType", optionNumber); + template.render(); + } + + public static void subscribe(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + return; + } + + int optionNumber = 1; + + try { + optionNumber = Integer.parseInt(webConnection.post().getString("optionNumber")); + } catch (Exception ex) { + + } + + var choiceData = ClubSubscription.getChoiceData(optionNumber); + + int credits = choiceData.getKey(); + int days = choiceData.getValue(); + + var template = webConnection.template("habblet/habboClubSubscribe"); + PlayerDetails playerDetails = (PlayerDetails) template.get("playerDetails"); + + if (playerDetails.getCredits() < credits) { + template.set("subscribeMsg", "You don't have enough credits to complete the subscription purchase."); + } else { + template.set("subscribeMsg", "Congratulations! You have successfully subscribed to " + GameConfiguration.getInstance().getString("site.name") + " Club."); + + boolean firstTime = (playerDetails.getFirstClubSubscription() == 0); + + ClubSubscription.subscribeClub(playerDetails, optionNumber); + PlayerStatisticsDao.updateStatistic(playerDetails.getId(), PlayerStatistic.CLUB_MEMBER_TIME_UPDATED, DateUtil.getCurrentTimeSeconds() + ClubSubscription.getClubGiftSeconds()); + + if (playerDetails.isOnline()) { + RconUtil.sendCommand(RconHeader.REFRESH_CLUB, new HashMap<>() {{ + put("userId", playerDetails.getId()); + }}); + + if (firstTime) { + RconUtil.sendCommand(RconHeader.REFRESH_HAND, new HashMap<>() {{ + put("userId", playerDetails.getId()); + }}); + } + } + } + + template.render(); + } + + public static void enddate(WebConnection webConnection) { + var template = webConnection.template("habblet/habboClubEnddate"); + + if (webConnection.session().getBoolean("authenticated")) { + PlayerDetails playerDetails = (PlayerDetails) template.get("playerDetails"); + + if (playerDetails.hasClubSubscription()) { + template.set("hcDays", TimeUnit.SECONDS.toDays(playerDetails.getClubExpiration() - DateUtil.getCurrentTimeSeconds())); + } + } + + template.render(); + } + + public static void reminderRemove(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + return; + } + + PlayerDetails playerDetails = PlayerDao.getDetails(webConnection.session().getInt("user.id")); + AlertsDao.disableAlerts(playerDetails.getId(), AlertType.HC_EXPIRED); + + webConnection.send(""); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/habblet/InviteController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/habblet/InviteController.java new file mode 100644 index 0000000..33bb46d --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/habblet/InviteController.java @@ -0,0 +1,189 @@ +package org.alexdev.http.controllers.habblet; + +import org.alexdev.duckhttpd.response.ResponseBuilder; +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.duckhttpd.template.Template; +import org.alexdev.havana.dao.mysql.MessengerDao; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.game.messenger.Messenger; +import org.alexdev.havana.game.messenger.MessengerManager; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.server.rcon.messages.RconHeader; +import org.alexdev.havana.util.StringUtil; +import org.alexdev.http.util.RconUtil; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; + +public class InviteController { + public static void inviteLink(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + //PlayerDetails playerDetails = PlayerDao.getDetails(webConnection.session().getInt("user.id")); + + Template template = webConnection.template("habblet/invite_referralLink"); + template.render(); + } + + public static void searchContent(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + Template template = webConnection.template("habblet/invite_searchContent"); + PlayerDetails playerDetails = (PlayerDetails) template.get("playerDetails"); + + Messenger messenger = new Messenger(playerDetails); + + String searchString = webConnection.post().getString("searchString"); + int pageId = webConnection.post().contains("pageNumber") ? webConnection.post().getInt("pageNumber") - 1 : 0; + int nextPageId = -1; + int previousPageId = -1; + + List searchedFriends = new ArrayList<>(); + + for (int userId : MessengerDao.search(searchString)) { + if (playerDetails.getId() == userId) { + continue; + } + + searchedFriends.add(PlayerDao.getDetails(userId)); + } + + searchedFriends.sort(Comparator.comparing(PlayerDetails::getName)); + + var searchMap = StringUtil.paginate(searchedFriends, 5); + List searchResults = null; + + if (searchMap.containsKey(pageId)) { + searchResults = searchMap.get(pageId); + } else { + searchResults = new ArrayList<>(); + } + + if (searchMap.containsKey(pageId - 1)) { + previousPageId = pageId -1; + } + + if (searchMap.containsKey(pageId + 1)) { + nextPageId = pageId + 1; + } + + nextPageId = nextPageId > -1 ? nextPageId + 1 : -1; + previousPageId = previousPageId > -1 ? previousPageId + 1 : -1; + + template.set("searchResults", searchResults); + template.set("currentPage", pageId + 1); + template.set("totalPages", searchMap.size()); + template.set("previousPageId", previousPageId); + template.set("nextPageId", nextPageId); + template.set("messenger", messenger); + template.render(); + } + + public static void confirmAddFriend(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + Template template = webConnection.template("habblet/invite_confirmAddFriend"); + PlayerDetails playerDetails = (PlayerDetails) template.get("playerDetails"); + + if (playerDetails == null) { + webConnection.send(""); + return; + } + + template.set("username", playerDetails.getName()); + template.render(); + } + + public static void addFriend(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int accountId = 0; + + try { + accountId = webConnection.post().getInt("accountId"); + } catch (Exception ex) { + + } + + Template template = webConnection.template("habblet/invite_addFriend"); + template.set("message", createFriendRequestResponse(webConnection, accountId)); + template.render(); + } + + public static void add(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int accountId = 0; + + try { + accountId = webConnection.post().getInt("accountId"); + } catch (Exception ex) { + + } + + webConnection.send(ResponseBuilder.create("application/x-javascript", "Dialog.showInfoDialog(\"add-friend-messages\", \"" + createFriendRequestResponse(webConnection, accountId) + "\", \"OK\");")); + } + + public static String createFriendRequestResponse(WebConnection webConnection, int accountId) { + String response; + + Messenger target = MessengerManager.getInstance().getMessengerData(accountId); + Messenger callee = MessengerManager.getInstance().getMessengerData(webConnection.session().getInt("user.id")); + + if (target == null) { + //player.send(new MESSENGER_ERROR(new MessengerError(MessengerErrorType.FRIEND_REQUEST_NOT_FOUND))); + response = "There was an error finding the user for the friend request."; + } else { + if (target.getMessengerUser().getUsername().equalsIgnoreCase("Abigail.Ryan")) { + target = null; + } + + if (target == null) { + //player.send(new MESSENGER_ERROR(new MessengerError(MessengerErrorType.FRIEND_REQUEST_NOT_FOUND))); + response = "There was an error finding the user for the friend request."; + } else if (callee.isFriendsLimitReached()) { + //player.send(new MESSENGER_ERROR(new MessengerError(MessengerErrorType.FRIENDLIST_FULL))); + response = "Your friends list is full."; + } else if (target.hasFriend(webConnection.session().getInt("user.id"))) { + response = "This person is already your friend"; + } else if (target.hasRequest(webConnection.session().getInt("user.id"))) { + response = "There is already a friend request for this user."; + } else if (target.isFriendsLimitReached()) { + response = "This user's friend list is full."; + } else if (!target.allowsFriendRequests()) { + //player.send(new MESSENGER_ERROR(new MessengerError(MessengerErrorType.TARGET_DOES_NOT_ACCEPT))); + //return; + response = "This user does not accept friend requests at the moment."; + } else if (webConnection.post().getInt("accountId") == webConnection.session().getInt("user.id")) { + response = "There was an error processing your request."; + } else { + response = "Friend request has been sent successfully."; + target.addRequest(callee.getMessengerUser()); + + RconUtil.sendCommand(RconHeader.FRIEND_REQUEST, new HashMap<>() {{ + put("userId", webConnection.session().getInt("user.id")); + put("friendId", webConnection.post().getInt("accountId")); + }}); + } + } + + return response; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/habblet/NameCheckController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/habblet/NameCheckController.java new file mode 100644 index 0000000..7036d23 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/habblet/NameCheckController.java @@ -0,0 +1,49 @@ +package org.alexdev.http.controllers.habblet; + +import io.netty.handler.codec.http.FullHttpResponse; +import org.alexdev.duckhttpd.response.ResponseBuilder; +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.http.util.RegisterUtil; + +public class NameCheckController { + public static void namecheck(WebConnection webConnection) { + String errorMessage = ""; + + String username = webConnection.post().getString("name"); + int errorCode = RegisterUtil.getNameErrorCode(username); + + if (errorCode == 6) { + errorMessage = "This name is unacceptable to hotel management."; + } else if (errorCode == 5) { + errorMessage = "Your username is invalid or contains invalid characters."; + } else if (errorCode == 4) { + errorMessage = "This name is not allowed."; + } else if (errorCode == 3) { + errorMessage = "The name you have chosen is too long."; + } else if (errorCode == 2) { + errorMessage = "Please enter a username."; + } else if (errorCode == 1) { + errorMessage = "A user with this name already exists."; + } + + FullHttpResponse httpResponse = ResponseBuilder.create(""); + httpResponse.headers().set("X-JSON", "{\"registration_name\":\"" + errorMessage + "\"}"); + webConnection.send(httpResponse); + } + + public static boolean hasAllowedCharacters(String str, String allowedChars) { + if (str == null) { + return false; + } + + for (int i = 0; i < str.length(); i++) { + if (allowedChars.contains(Character.valueOf(str.toCharArray()[i]).toString())) { + continue; + } + + return false; + } + + return true; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/habblet/NavigationComponent.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/habblet/NavigationComponent.java new file mode 100644 index 0000000..7aa6854 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/habblet/NavigationComponent.java @@ -0,0 +1,9 @@ +package org.alexdev.http.controllers.habblet; + +import org.alexdev.duckhttpd.server.connection.WebConnection; + +public class NavigationComponent { + public static void navigation(WebConnection webConnection) { + webConnection.send(""); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/habblet/ProxyHabblet.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/habblet/ProxyHabblet.java new file mode 100644 index 0000000..13a0843 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/habblet/ProxyHabblet.java @@ -0,0 +1,195 @@ +package org.alexdev.http.controllers.habblet; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.duckhttpd.template.Template; +import org.alexdev.havana.dao.mysql.*; +import org.alexdev.havana.game.groups.Group; +import org.alexdev.havana.server.rcon.messages.RconHeader; +import org.alexdev.havana.util.config.GameConfiguration; +import org.alexdev.http.controllers.site.MinimailController; +import org.alexdev.http.dao.CommunityDao; +import org.alexdev.http.server.Watchdog; +import org.alexdev.http.util.RconUtil; +import org.alexdev.http.util.XSSUtil; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.UUID; +import java.util.function.ToIntFunction; + +public class ProxyHabblet { + public static void moreInfo(WebConnection webConnection) { + if (!webConnection.get().contains("hid")) { + webConnection.send(""); + return; + } + + if (webConnection.get().getString("hid").equals("h21")) { + webConnection.send("\n" + + "
\n" + + "
    \n" + + "\n" + + "
  • \n" + + "
    \n" + + " Room name\n" + + " Alex \n" + + "\t\t\t\t

    test

    \n" + + "
    \n" + + "
  • \n" + + "
\n" + + "
\n" + + "\n"); + return; + } + + if (webConnection.get().getString("hid").equals("h122")) { + int limit = GameConfiguration.getInstance().getInteger("hot.groups.community.limit"); + + var hotGroups = CommunityDao.getHotGroups(limit, 0); + var hotSortedGroups = new ArrayList<>(hotGroups.keySet()); + hotSortedGroups.sort(Comparator.comparingInt((ToIntFunction) hotGroups::get).reversed()); + + var hotHiddenGroups = CommunityDao.getHotGroups(limit, limit); + var HotHiddenSortedGroups = new ArrayList<>(hotHiddenGroups.keySet()); + HotHiddenSortedGroups.sort(Comparator.comparingInt((ToIntFunction) hotHiddenGroups::get).reversed()); + + + Template template = webConnection.template("habblet/community_hot_groups"); + template.set("hotGroups", hotSortedGroups); + template.set("hotHiddenGroups", HotHiddenSortedGroups); + template.render(); + + return; + } + + if (webConnection.get().getString("hid").equals("h120")) { + Template template = webConnection.template("habblet/showMoreRooms"); + template.set("highestRatedRooms", RoomDao.getHighestRatedRooms(5, 0)); + template.set("highestHiddenRatedRooms", RoomDao.getHighestRatedRooms(5, 5)); + template.render(); + return; + } + + if (webConnection.get().getString("hid").equals("h24")) { + Template template = webConnection.template("habblet/tagList"); + template.set("tagCloud", Watchdog.TAG_CLOUD_20); + template.render(); + return; + } + + if (webConnection.get().getString("hid").equals("groups")) { + var hotGroups = CommunityDao.getHotGroups(GameConfiguration.getInstance().getInteger("hot.groups.limit"), 0); + + var sortedGroups = new ArrayList<>(hotGroups.keySet()); + sortedGroups.sort(Comparator.comparingInt((ToIntFunction) hotGroups::get).reversed()); + + Template template = webConnection.template("habblet/hot_groups"); + template.set("groups", sortedGroups); + template.render(); + return; + } + + webConnection.send(""); + } + + public static void minimail(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + String habbletKey = ""; + + if (webConnection.get().contains("habbletKey")) { + habbletKey = webConnection.get().getString("habbletKey"); + } + + if (habbletKey.equalsIgnoreCase("news")) { + webConnection.send("
\t\t\n" + + "\t\n" + + "\t
\n" + + "\t\n" + + "\t\t
\n" + + "\t\t\n" + + "\t\t\t
\n" + + "\t\t\t\n" + + "\t\t\t
The shit you don't even wanna know!
\n" + + "\t\t\t\n" + + "\t\t
\n" + + "\t\t\n" + + "\t\t
\n" + + "\t\t\n" + + "\t\t\t
\n" + + "\t\t\t\n" + + "\t\t\t\t
    \n" + + "\n" + + "\t\t\t\t
\n" + + "\t\t\t\t\n" + + "\t\t\t
\n" + + "\t\t\t\n" + + "\t\t
\n" + + "\t\t\n" + + "\t\t
\n" + + "\t\n" + + "\t
\n" + + "\n" + + "\t\n" + + "\n" + + "
\n" + + "\n" + + ""); + return; + } + + Template template = webConnection.template("habblet/minimail"); + webConnection.session().set("minimailLabel", "inbox"); + MinimailController.appendMessages(webConnection, template, true, false, false, false, false, false); + template.set("minimailClient", true); + template.render(); + } + + public static void clearhand(WebConnection connection) { + if (!connection.session().getBoolean("authenticated")) { + connection.send(""); + return; + } + + /* + System.out.println(connection.session().getString(XSSUtil.XSSKey)); + System.out.println(connection.session().getString(XSSUtil.XSSRequested)); + System.out.println(connection.session().getString(XSSUtil.XSSSeed)); + */ + + if (!XSSUtil.verifyKey(connection, "/credits")) { + connection.send("Failed to securely verify request"); + return; + } + + int userId = connection.session().getInt("user.id"); + ItemDao.deleteHandItems(userId); + + RconUtil.sendCommand(RconHeader.REFRESH_HAND, new HashMap<>() {{ + put("userId", userId); + }}); + + connection.send(""); + } + + public static void token_generate(WebConnection connection) { + if (!connection.session().getBoolean("authenticated")) { + connection.send(""); + return; + } + + String uuid = "token-" + UUID.randomUUID(); + connection.session().set("authenticationToken", uuid); + connection.send(uuid); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/habblet/RoomSelectionController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/habblet/RoomSelectionController.java new file mode 100644 index 0000000..122aeb8 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/habblet/RoomSelectionController.java @@ -0,0 +1,58 @@ +package org.alexdev.http.controllers.habblet; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.dao.mysql.PlayerStatisticsDao; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.statistics.PlayerStatistic; + +public class RoomSelectionController { + public static void confirm(WebConnection webConnection) { + var template = webConnection.template("habblet/roomselectionConfirm"); + template.render(); + } + + public static void create(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated") || !webConnection.post().contains("roomType")) { + webConnection.send(""); + return; + } + + PlayerDetails playerDetails = PlayerDao.getDetails(webConnection.session().getInt("user.id")); + + if (!playerDetails.canSelectRoom()) { + webConnection.send(""); + return; + } + + int roomType = Integer.parseInt(webConnection.post().getString("roomType")); + + if (roomType < 0 || roomType > 5) { + webConnection.send(""); + return; + } + + webConnection.send(""); + } + + public static void hide(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.send(""); + return; + } + + PlayerDetails playerDetails = PlayerDao.getDetails(webConnection.session().getInt("user.id")); + + if (!playerDetails.canSelectRoom()) { + webConnection.send(""); + return; + } + + playerDetails.setSelectedRoomId(-1); + + PlayerDao.saveSelectedRoom(playerDetails.getId(), -1); + PlayerStatisticsDao.updateStatistic(playerDetails.getId(), PlayerStatistic.NEWBIE_ROOM_LAYOUT, -1); + + webConnection.send(""); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/habblet/UpdateMottoController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/habblet/UpdateMottoController.java new file mode 100644 index 0000000..417ecd4 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/habblet/UpdateMottoController.java @@ -0,0 +1,81 @@ +package org.alexdev.http.controllers.habblet; + +import io.netty.handler.codec.http.FullHttpResponse; +import org.alexdev.duckhttpd.response.ResponseBuilder; +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.wordfilter.WordfilterManager; +import org.alexdev.havana.server.rcon.messages.RconHeader; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.config.GameConfiguration; +import org.alexdev.http.util.HtmlUtil; +import org.alexdev.http.util.RconUtil; + +import java.util.HashMap; + +public class UpdateMottoController { + public static void updatemotto(WebConnection webConnection) { + int userId = webConnection.session().getInt("user.id"); + + if (userId < 1) { + webConnection.send(""); + return; + } + + PlayerDetails playerDetails = PlayerDao.getDetails(webConnection.session().getInt("user.id")); + + if (webConnection.session().contains("lastMottoUpdate")) { + long lastUpdateDate = webConnection.session().getLongOrElse("lastMottoUpdate", DateUtil.getCurrentTimeSeconds()); + + if (DateUtil.getCurrentTimeSeconds() < lastUpdateDate) { + FullHttpResponse httpResponse = ResponseBuilder.create("" + HtmlUtil.escape(playerDetails.getMotto())); + webConnection.send(httpResponse); + return; + } + } + + webConnection.session().set("lastMottoUpdate", String.valueOf(DateUtil.getCurrentTimeSeconds())); + + String responseMotto = ""; + String motto = WordfilterManager.filterSentence(HtmlUtil.removeHtmlTags(webConnection.post().getString("motto"))); + + if (motto.length() > 100) { + motto = motto.substring(0, 100); + } + + if (motto.replace(" ", "").isEmpty()) { + responseMotto = "Click to enter your motto/ status"; + motto = ""; + } else if (motto.toLowerCase().equals("crikey")) { + responseMotto = ""; + /* else { + // Check previous motto and send back figure + if (playerDetails.getMotto().toLowerCase().equals("crikey")) { + responseMotto = "" + motto; + } + }*/ + } else { + + } + + if (!playerDetails.getMotto().equals(motto)) { + PlayerDao.saveMotto(userId, motto); + + if (playerDetails.isOnline()) { + RconUtil.sendCommand(RconHeader.REFRESH_LOOKS, new HashMap<>() {{ + put("userId", userId); + }}); + } + } + + FullHttpResponse httpResponse = ResponseBuilder.create(responseMotto + HtmlUtil.escape(motto)); + webConnection.send(httpResponse); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/habblet/VoucherController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/habblet/VoucherController.java new file mode 100644 index 0000000..0862ef8 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/habblet/VoucherController.java @@ -0,0 +1,53 @@ +package org.alexdev.http.controllers.habblet; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.havana.game.catalogue.CatalogueItem; +import org.alexdev.havana.game.catalogue.voucher.VoucherManager; +import org.alexdev.havana.game.catalogue.voucher.VoucherRedeemMode; +import org.alexdev.havana.game.catalogue.voucher.VoucherRedeemStatus; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.server.rcon.messages.RconHeader; +import org.alexdev.http.util.RconUtil; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +public class VoucherController { + public static void redeemVoucher(WebConnection webConnection) { + var tpl = webConnection.template("habblet/redeemvoucher"); + PlayerDetails playerDetails = (PlayerDetails) tpl.get("playerDetails"); + + AtomicInteger redeemedCredits = new AtomicInteger(0); + List redeemedItems = new ArrayList<>(); + + var voucherStatus = VoucherManager.getInstance().redeem(playerDetails, VoucherRedeemMode.IN_GAME, webConnection.post().getString("voucherCode"), redeemedItems, redeemedCredits); + + if (voucherStatus == VoucherRedeemStatus.FAILURE) { + tpl.set("voucherResult", "error"); + } + + if (voucherStatus == VoucherRedeemStatus.FAILURE_NEW_ACCOUNT) { + tpl.set("voucherResult", "too_new"); + } + + if (voucherStatus == VoucherRedeemStatus.SUCCESS) { + tpl.set("voucherResult", "success"); + } + + if (redeemedItems.size() > 0) { + RconUtil.sendCommand(RconHeader.REFRESH_HAND, new HashMap<>() {{ + put("userId", playerDetails.getId()); + }}); + } + + if (redeemedCredits.get() > 0) { + RconUtil.sendCommand(RconHeader.REFRESH_CREDITS, new HashMap<>() {{ + put("userId", playerDetails.getId()); + }}); + } + + tpl.render(); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/homes/HomesController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/homes/HomesController.java new file mode 100644 index 0000000..6f352ef --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/homes/HomesController.java @@ -0,0 +1,571 @@ +package org.alexdev.http.controllers.homes; + +import io.netty.handler.codec.http.HttpResponseStatus; +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.duckhttpd.template.Template; +import org.alexdev.duckhttpd.util.config.Settings; +import org.alexdev.havana.dao.mysql.*; +import org.alexdev.havana.game.badges.Badge; +import org.alexdev.havana.game.groups.Group; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.game.player.statistics.PlayerStatistic; +import org.alexdev.havana.util.config.GameConfiguration; +import org.alexdev.http.dao.HomeEditDao; +import org.alexdev.http.dao.HomesDao; +import org.alexdev.http.dao.WidgetDao; +import org.alexdev.http.game.homes.Home; +import org.alexdev.http.game.homes.Widget; +import org.alexdev.http.game.stickers.StickerCategory; +import org.alexdev.http.game.stickers.StickerManager; +import org.alexdev.http.game.stickers.StickerType; +import org.alexdev.http.util.HomeUtil; +import org.alexdev.http.util.XSSUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +public class HomesController { + public static void home(WebConnection webConnection) { + XSSUtil.clear(webConnection); + + if (!webConnection.session().contains("authenticated")) { + return; + } + + Template template = webConnection.template("home"); + PlayerDetails playerDetails = null; + + if (webConnection.session().contains("authenticated")) { + playerDetails = (PlayerDetails) template.get("playerDetails"); + } + + String username = webConnection.getMatches().get(0); + + if (webConnection.getRouteRequest().endsWith("/id")) { + try { + int userId = Integer.parseInt(username); + username = PlayerDao.getName(userId); + } catch (Exception ex) { + + } + } + + if (username == null) { + webConnection.send(Settings.getInstance().getDefaultResponses().getResponse(HttpResponseStatus.NOT_FOUND, webConnection)); + return; + } + + PlayerDetails user = PlayerDao.getDetails(username); + + if (user == null) { + webConnection.send(Settings.getInstance().getDefaultResponses().getResponse(HttpResponseStatus.NOT_FOUND, webConnection)); + return; + } + + if (playerDetails == null || playerDetails.getRank().getRankId() < PlayerRank.MODERATOR.getRankId()) { + if (!user.isProfileVisible() || user.isBanned() != null) { + webConnection.send(Settings.getInstance().getDefaultResponses().getResponse(HttpResponseStatus.NOT_FOUND, webConnection)); + return; + } + } + + Home home = HomesDao.getHome(user.getId()); + + boolean defultWidgets = false; + + if (home == null) { + home = new Home(user.getId(), "bg_pattern_abstract2"); + defultWidgets = true; + //StickerManager.getInstance().createHome(user.getId()); + //home = HomesDao.getHome(user.getId()); + } + + boolean canAddFriend = false; + + int userId = -1;//webConnection.session().getInt("user.id"); + long sessionTime = -1;//HomeEditDao.getSession(webConnection.session().getInt("user.id")); + + if (webConnection.session().getBoolean("authenticated")) { + userId = webConnection.session().getInt("user.id"); + sessionTime = HomeEditDao.getSession(webConnection.session().getInt("user.id")); + + if (sessionTime != -1 && userId == user.getId()) { + webConnection.session().delete("groupEditSession"); + webConnection.session().set("homeEditSession", user); + } + + if (userId != user.getId() && !MessengerDao.friendExists(userId, user.getId())) { + canAddFriend = true; + } + } + + List widgets = null; + + if (defultWidgets) { + widgets = StickerManager.getInstance().getDefaultWidgets(user.getId()); + } else { + widgets = WidgetDao.getHomeWidgets(user.getId(), true); + } + + var enabledBadges = BadgeDao.getBadges(user.getId()).stream().filter(Badge::isEquipped).sorted(Comparator.comparingInt(Badge::getSlotId)).collect(Collectors.toList()); + var guestbook = WidgetDao.getHomeWidgets(user.getId()).stream().filter(w -> w.getProduct().getData().equalsIgnoreCase("guestbookwidget")).findFirst().orElse(null); + + webConnection.session().set("page", "me"); + + template.set("user", user); + template.set("tags", TagDao.getUserTags(user.getId())); + template.set("hasBadge", enabledBadges.size() > 0); + template.set("editMode", sessionTime != -1 && userId == user.getId()); + template.set("stickers", widgets); + template.set("homeBannerAd", HomeUtil.getRandomAd()); + template.set("home", home); + template.set("canAddFriend", canAddFriend); + template.set("guestbookSetting", guestbook != null ? guestbook.getGuestbookState() : "public"); + template.set("stickerLimit", HomeUtil.getStickerLimit(user.hasClubSubscription())); + template.set("tagCloud", new ArrayList()); + + if (enabledBadges.size() > 0) { + template.set("badgeCode", enabledBadges.get(0).getBadgeCode()); + } + + template.set("hasFavouriteGroup", false); + + if (user.getFavouriteGroupId() > 0) { + Group group = GroupDao.getGroup(user.getFavouriteGroupId()); + + if (group != null) { + template.set("hasFavouriteGroup", true); + template.set("group", group); + } + } + + if (webConnection.session().getBoolean("authenticated")) { + if (user.getId() == userId) { + PlayerStatisticsDao.updateStatistic(userId, PlayerStatistic.GUESTBOOK_UNREAD_MESSAGES, 0); + //HomesDao.resetUnreadMessages(userId); + } + } + + template.render(); + } + + public static void inventory(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + var tpl = webConnection.template("homes/inventory/inventory"); + PlayerDetails playerDetails = (PlayerDetails) tpl.get("playerDetails"); + + if (playerDetails == null) { + webConnection.session().delete("user.id"); + webConnection.session().delete("authenticated"); + webConnection.redirect("/"); + return; + } + + List categories = StickerManager.getInstance().getCategories(playerDetails.getRank().getRankId()); + var stickerCategories = categories.stream().filter(category -> category.getCategoryType() == StickerCategory.STICKER_BACKGROUND_TYPE).sorted(Comparator.comparing(StickerCategory::getName)).collect(Collectors.toList()); + var backgroundCategories = categories.stream().filter(category -> category.getCategoryType() == StickerCategory.BACKGROUND_CATEGORY_TYPE).sorted(Comparator.comparing(StickerCategory::getName)).collect(Collectors.toList()); + + List widgetList = WidgetDao.getInventoryWidgets(playerDetails.getId(), 1); + List inventoryWidgets = new ArrayList<>(); + + for (Widget widget : widgetList) { + if (inventoryWidgets.stream().anyMatch(w -> w.getStickerId() == widget.getStickerId())) { + Widget w = inventoryWidgets.stream().filter(inv -> inv.getStickerId() == widget.getStickerId()).findFirst().get(); + w.setAmount(w.getAmount() + 1); + } else { + inventoryWidgets.add(widget); + } + } + + inventoryWidgets.sort(Comparator.comparingInt(Widget::getId).reversed()); + + int emptyBoxes = 0; + + if (widgetList.size() > 0) { + Widget widget = widgetList.get(0); + webConnection.headers().put("X-JSON", "[[\"Inventory\",\"Web Store\"],[\"" + widget.getProduct().getCssClass() + "\",\"" + widget.getProduct().getData() + "\",\"" + widget.getProduct().getName() + "\",\"Stickers\",null,1]]"); + } else { + webConnection.headers().put("X-JSON", "[[\"Inventory\",\"Web Store\"],[\"\",\"\",\"\",\"Stickers\",null,1]]"); + } + + if (widgetList.size() > 20) { + emptyBoxes = (int) (Math.ceil(widgetList.size()/4.0) * 4); + } else { + emptyBoxes = 20 - widgetList.size(); + } + + List emptyBox = new ArrayList<>(); + + if (emptyBoxes > 0) { + for (int i = 0; i < emptyBoxes; i++) { + emptyBox.add(null); + } + } + + tpl.set("stickerCategories", stickerCategories); + tpl.set("backgroundCategories", backgroundCategories); + tpl.set("emptyBoxes", emptyBox); + tpl.set("widgets", inventoryWidgets); + tpl.render(); + } + + public static void inventoryItems(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + + int typeId = 0; + String type = webConnection.post().getString("type"); + + if (type.equalsIgnoreCase("stickers")) { + typeId = 1; + } + + if (type.equalsIgnoreCase("backgrounds")) { + typeId = 4; + } + + if (type.equalsIgnoreCase("notes")) { + typeId = 3; + } + + if (!type.equalsIgnoreCase("widgets")) { + List widgetList = WidgetDao.getInventoryWidgets(webConnection.session().getInt("user.id"), typeId); + List inventoryWidgets = new ArrayList<>(); + + for (Widget widget : widgetList) { + if (inventoryWidgets.stream().anyMatch(w -> w.getStickerId() == widget.getStickerId())) { + Widget w = inventoryWidgets.stream().filter(inv -> inv.getStickerId() == widget.getStickerId()).findFirst().get(); + w.setAmount(w.getAmount() + 1); + } else { + inventoryWidgets.add(widget); + } + } + + inventoryWidgets.sort(Comparator.comparingInt(Widget::getId).reversed()); + + int emptyBoxes = 0; + + if (widgetList.size() > 20) { + emptyBoxes = (int) (Math.ceil(widgetList.size() / 4.0) * 4); + } else { + emptyBoxes = 20 - widgetList.size(); + } + + List emptyBox = new ArrayList<>(); + + if (emptyBoxes > 0) { + for (int i = 0; i < emptyBoxes; i++) { + emptyBox.add(null); + } + } + + var tpl = webConnection.template("homes/inventory/inventory_items"); + tpl.set("emptyBoxes", emptyBox); + tpl.set("widgets", inventoryWidgets); + tpl.set("widgetMode", false); + tpl.render(); + } else { + List widgetList = new ArrayList<>(); + + if (webConnection.session().contains("groupEditSession")) { + int groupId = webConnection.session().getInt("groupEditSession"); + widgetList = WidgetDao.getGroupWidgets(groupId); + widgetList = widgetList.stream().filter(widget -> widget.getProduct().getType() == StickerType.GROUP_WIDGET).collect(Collectors.toList()); + } else { + int userId = webConnection.session().getInt("user.id"); + widgetList = WidgetDao.getHomeWidgets(userId); + widgetList = widgetList.stream().filter(widget -> widget.getProduct().getType() == StickerType.HOME_WIDGET).collect(Collectors.toList()); + widgetList.removeIf(widget -> widget.getProduct().getData().equalsIgnoreCase("profilewidget")); + } + + var tpl = webConnection.template("homes/inventory/inventory_items"); + tpl.set("widgetMode", true); + tpl.set("widgets", widgetList); + tpl.render(); + } + } + + public static void inventoryPreview(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int itemId = webConnection.post().getInt("itemId"); + String type = webConnection.post().getString("type"); + int typeId = 0; + + if (type.equalsIgnoreCase("stickers")) { + typeId = 1; + } + + if (type.equalsIgnoreCase("backgrounds")) { + typeId = 4; + } + + if (type.equalsIgnoreCase("notes")) { + typeId = 3; + } + + if (type.equalsIgnoreCase("widgets")) { + typeId = webConnection.session().contains("groupEditSession") ? StickerType.GROUP_WIDGET.getTypeId() : StickerType.HOME_WIDGET.getTypeId(); + } + + Widget widget = null; + + if (typeId == StickerType.GROUP_WIDGET.getTypeId()) { + int groupId = webConnection.session().getInt("groupEditSession"); + List widgetList = WidgetDao.getGroupWidgets(groupId); + widget = widgetList.stream().filter(w -> w.getId() == itemId).findFirst().orElse(null); + } else if (typeId == StickerType.HOME_WIDGET.getTypeId()) { ; + int userId = webConnection.session().getInt("user.id"); + List widgetList = WidgetDao.getHomeWidgets(userId); + widget = widgetList.stream().filter(w -> w.getId() == itemId).findFirst().orElse(null); + } else { + List widgetList = WidgetDao.getInventoryWidgets(webConnection.session().getInt("user.id"), typeId); + widget = widgetList.stream().filter(w -> w.getId() == itemId).findFirst().orElse(null); + } + + if (widget != null && typeId == 1) { + webConnection.headers().put("X-JSON", "[\"" + widget.getProduct().getCssClass() + "\",\"" + widget.getProduct().getData() + "\",\"" + widget.getProduct().getName() + "\",\"Sticker\",null,1]"); + } else if (widget != null && typeId == 4) { + webConnection.headers().put("X-JSON", String.format("[\"%s\",\"b_%s\",\"%s\",\"%s\",null,1]", widget.getProduct().getCssClass(), widget.getProduct().getData(), widget.getProduct().getName(), "Background")); + } else if (widget != null && typeId == 3) { + webConnection.headers().put("X-JSON", "[\"commodity_stickienote_pre\",null,\"Notes\",\"WebCommodity\",null,1]"); + } else if (widget != null && (typeId == StickerType.GROUP_WIDGET.getTypeId() || typeId == StickerType.HOME_WIDGET.getTypeId())) { + webConnection.headers().put("X-JSON", "[\"" + widget.getProduct().getCssClass() + "\",null,\"\",\"Widget\",\"true\",1]"); + } else { + webConnection.headers().put("X-JSON", "[\"\",\"\",\"\",\"Sticker\",null,1]"); + } + + var tpl = webConnection.template("homes/inventory/inventory_preview"); + tpl.render(); + } + + public static void startEditingSession(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int userId = webConnection.session().getInt("user.id"); + String match = webConnection.getMatches().get(0); + + if (!StringUtils.isNumeric(match)) { + webConnection.redirect("/me"); + return; + } + + int targetId = Integer.parseInt(match); + + if (targetId != userId) { + webConnection.redirect("/me"); + return; + } + + Home home = HomesDao.getHome(targetId); + + if (home == null) { + StickerManager.getInstance().createHome(targetId); + } + + if (!HomeEditDao.hasSession(userId)) { + HomeEditDao.createSession(userId); + webConnection.session().set("homeEditSession", userId); + webConnection.session().delete("groupEditSession"); + } + + PlayerDetails playerDetails = PlayerDao.getDetails(webConnection.session().getInt("user.id")); + webConnection.redirect("/home/" + playerDetails.getName()); + } + + public static void cancelEditingSession(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int userId = webConnection.session().getInt("user.id"); + String match = webConnection.getMatches().get(0); + + if (!StringUtils.isNumeric(match)) { + webConnection.redirect("/me"); + return; + } + + int targetId = Integer.parseInt(match); + + if (targetId != userId) { + webConnection.redirect("/me"); + return; + } + + if (HomeEditDao.hasSession(userId)) { + HomeEditDao.delete(userId); + webConnection.session().delete("homeEditSession"); + webConnection.session().delete("groupEditSession"); + } + + PlayerDetails playerDetails = PlayerDao.getDetails(webConnection.session().getInt("user.id")); + webConnection.redirect("/home/" + playerDetails.getName()); + } + + public static void save(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + PlayerDetails playerDetails = PlayerDao.getDetails(webConnection.session().getInt("user.id")); + + if (playerDetails == null) { + webConnection.session().delete("user.id"); + webConnection.session().delete("authenticated"); + webConnection.redirect("/"); + return; + } + + int userId = webConnection.session().getInt("user.id"); + + if (!HomeEditDao.hasSession(userId)) { + webConnection.send(""); + return; + } + + Home home = HomesDao.getHome(userId); + List homeWidgets = WidgetDao.getHomeWidgets(userId, true); + + try { + if (webConnection.post().contains("background")) { + int backgroundId = Integer.parseInt(webConnection.post().getString("background").split(":")[0]); + + + List widgetList = WidgetDao.getInventoryWidgets(playerDetails.getId()); + Widget widget = widgetList.stream().filter(w -> w.getId() == backgroundId).findFirst().orElse(null); + + if (widget != null) { + home.setBackground(widget.getProduct().getData()); + home.saveBackground(); + } + } + + if (webConnection.post().contains("stickers")) { + String[] stickerData = webConnection.post().getString("stickers").split(Pattern.quote("/")); + + if (stickerData.length >= HomeUtil.getStickerLimit(playerDetails.hasClubSubscription())) { + webConnection.send(""); + return; + } + + for (String sticker : stickerData) { + int stickerId = Integer.parseInt(sticker.split(":")[0]); + String[] coordData = sticker.replace(stickerId + ":", "").split(","); + + int x = Integer.parseInt(coordData[0]); + int y = Integer.parseInt(coordData[1]); + int z = Integer.parseInt(coordData[2]); + + Widget widget = homeWidgets.stream().filter(w -> w.getId() == stickerId).findFirst().orElse(null); + + if (widget != null) { + widget.setX(x); + widget.setY(y); + widget.setZ(z); + widget.save(); + } + } + } + + if (webConnection.post().contains("widgets")) { + String[] stickerData = webConnection.post().getString("widgets").split(Pattern.quote("/")); + + for (String sticker : stickerData) { + int stickerId = Integer.parseInt(sticker.split(":")[0]); + String[] coordData = sticker.replace(stickerId + ":", "").split(","); + + int x = Integer.parseInt(coordData[0]); + int y = Integer.parseInt(coordData[1]); + int z = Integer.parseInt(coordData[2]); + + Widget widget = homeWidgets.stream().filter(w -> w.getId() == stickerId).findFirst().orElse(null); + + if (widget != null) { + widget.setX(x); + widget.setY(y); + widget.setZ(z); + widget.save(); + } + } + } + + if (webConnection.post().contains("stickienotes")) { + String[] stickerData = webConnection.post().getString("stickienotes").split(Pattern.quote("/")); + + for (String sticker : stickerData) { + int stickerId = Integer.parseInt(sticker.split(":")[0]); + String[] coordData = sticker.replace(stickerId + ":", "").split(","); + + int x = Integer.parseInt(coordData[0]); + int y = Integer.parseInt(coordData[1]); + int z = Integer.parseInt(coordData[2]); + + Widget widget = homeWidgets.stream().filter(w -> w.getId() == stickerId).findFirst().orElse(null); + + if (widget != null) { + widget.setX(x); + widget.setY(y); + widget.setZ(z); + widget.save(); + } + } + } + } catch (Exception ex) { + + } + + webConnection.send("\n"); + + + HomeEditDao.delete(userId); + webConnection.session().delete("homeEditSession"); + } + + public static void tagList(WebConnection webConnection) { + int userId = webConnection.session().getInt("user.id"); + + if (userId < 1) { + webConnection.send(""); + return; + } + + int accountId = webConnection.post().getInt("accountId"); + + var template = webConnection.template("homes/widget/habblet/taglist"); + PlayerDetails playerDetails = (PlayerDetails) template.get("playerDetails"); + + if (playerDetails == null) { + webConnection.send(""); + return; + } + + List tags = TagDao.getUserTags(accountId); + + template.set("tags", tags); + template.set("user", playerDetails); + template.render(); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/homes/NoteEditorController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/homes/NoteEditorController.java new file mode 100644 index 0000000..3562af7 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/homes/NoteEditorController.java @@ -0,0 +1,297 @@ +package org.alexdev.http.controllers.homes; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.duckhttpd.template.Template; +import org.alexdev.havana.dao.mysql.GroupDao; +import org.alexdev.havana.dao.mysql.MessengerDao; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.dao.mysql.RoomDao; +import org.alexdev.havana.game.groups.Group; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.room.Room; +import org.alexdev.http.dao.GroupEditDao; +import org.alexdev.http.dao.WidgetDao; +import org.alexdev.http.game.homes.Widget; +import org.alexdev.http.game.stickers.StickerManager; +import org.alexdev.http.game.stickers.StickerType; +import org.alexdev.http.util.BBCode; +import org.alexdev.http.util.HtmlUtil; +import org.apache.commons.lang3.tuple.Pair; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +public class NoteEditorController { + public static void noteEditor(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + String noteText = webConnection.post().getString("noteText"); + int skin = webConnection.post().getInt("skin"); + + if (noteText.length() > 500) { + noteText = noteText.substring(0, 500); + } + + Template template = webConnection.template("homes/editor/noteeditor"); + + if (skin > 0 && skin < 9) { + template.set("skin" + skin + "Selected", " selected"); + } + + template.set("noteText", noteText); + template.render(); + } + + + public static void notePreview(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + String noteText = BBCode.format(HtmlUtil.escape(BBCode.normalise(webConnection.post().getString("noteText"))), false); + int skin = webConnection.post().getInt("skin"); + + if (noteText.length() > 500) { + noteText = noteText.substring(0, 500); + } + + Template template = webConnection.template("homes/editor/preview"); + template.set("skin", StickerManager.getInstance().getSkin(skin)); + template.set("noteText", noteText); + template.render(); + } + + public static void search(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + String query = webConnection.get().getString("query"); + int scope = webConnection.get().getInt("scope"); + String type = null; + + + List> querySearch = new ArrayList<>(); + + switch (scope) { + case 1: + type = "habbo"; + + List searchedFriends = new ArrayList<>(); + + for (int playerId : MessengerDao.search(query)) { + searchedFriends.add(PlayerDao.getDetails(playerId)); + } + + searchedFriends.sort(Comparator.comparing(PlayerDetails::getName)); + + for (PlayerDetails playerDetails : searchedFriends.stream().limit(10).collect(Collectors.toList())) { + querySearch.add(Pair.of(playerDetails.getName(), String.valueOf(playerDetails.getId()))); + } + + break; + case 2: + type = "room"; + + var roomList = RoomDao.searchRooms(query, -1, 30); + + for (Room room : roomList.stream().limit(10).collect(Collectors.toList())) { + querySearch.add(Pair.of(room.getData().getName(), String.valueOf(room.getData().getId()))); + } + + break; + default: + type = "group"; + + var groupList = GroupDao.querySearch(query); + + for (Group group : groupList.stream().limit(10).collect(Collectors.toList())) { + querySearch.add(Pair.of(group.getName(), String.valueOf(group.getId()))); + } + + break; + } + + Template tpl = webConnection.template("homes/editor/search"); + tpl.set("querySearch", querySearch); + tpl.set("type", type); + tpl.render(); + } + + public static void place(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int userId = webConnection.session().getInt("user.id"); + + int skin = webConnection.post().getInt("skin"); + String noteText = webConnection.post().getString("noteText"); + + if (noteText.length() > 500) { + noteText = noteText.substring(0, 500); + } + + boolean isGroupEdit = webConnection.session().contains("groupEditSession"); + + if (isGroupEdit) { + int groupId = webConnection.session().getInt("groupEditSession"); + Group group = GroupDao.getGroup(groupId); + + if (group == null) { + webConnection.send(""); + return; + } + + if (!GroupEditDao.hasSession(userId, group.getId())) { + webConnection.send(""); + return; + } + + + } else { + if (!webConnection.session().contains("homeEditSession")) { + webConnection.send(""); + return; + } + } + + Widget widget = WidgetDao.getInventoryWidgets(userId, StickerType.NOTE.getTypeId()).get(0); + widget.setX(20); + widget.setY(30); + widget.setZ(1); + + if (isGroupEdit) { + widget.setGroupId(webConnection.session().getInt("groupEditSession")); + } + + widget.setText(noteText); + widget.setSkinId(skin); + widget.setPlaced(true); + widget.save(); + + webConnection.headers().put("X-JSON", "" + widget.getId() + ""); + + Template tpl = widget.template(webConnection); + tpl.render(); + } + + public static void stickieEdit(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int userId = webConnection.session().getInt("user.id"); + boolean isGroupEdit = webConnection.session().contains("groupEditSession"); + + + if (isGroupEdit) { + int groupId = webConnection.session().getInt("groupEditSession"); + Group group = GroupDao.getGroup(groupId); + + if (group == null) { + webConnection.send(""); + return; + } + + if (!GroupEditDao.hasSession(userId, group.getId())) { + webConnection.send(""); + return; + } + + + } else { + if (!webConnection.session().contains("homeEditSession")) { + webConnection.send(""); + return; + } + } + + int widgetId = webConnection.post().getInt("stickieId"); + int skinId = webConnection.post().getInt("skinId"); + + Widget widget = null; + + if (isGroupEdit) { + widget = WidgetDao.getGroupWidget(widgetId, webConnection.session().getInt("groupEditSession")); + } else { + widget = WidgetDao.getHomeWidget(userId, widgetId); + } + + if (widget == null) { + webConnection.send(""); + return; + } + + Template tpl = widget.template(webConnection); + PlayerDetails playerDetails = (PlayerDetails) tpl.get("playerDetails"); + + if ((skinId == 7 || skinId == 8) && !playerDetails.hasClubSubscription()) { + skinId = 1; + } + + if (skinId == 9 && playerDetails.getRank().getRankId() < 5) { + skinId = 1; + } + + widget.setSkinId(skinId); + widget.save(); + + webConnection.headers().put("X-JSON", "{\"id\":\"" + widget.getId() + "\",\"cssClass\":\"n_skin_" + widget.getSkin() + "\",\"type\":\"stickie\"}"); + + + tpl.set("sticker", widget); + tpl.render(); + } + + public static void stickieDelete(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int userId = webConnection.session().getInt("user.id"); + boolean isGroupEdit = webConnection.session().contains("groupEditSession"); + + if (isGroupEdit) { + int groupId = webConnection.session().getInt("groupEditSession"); + Group group = GroupDao.getGroup(groupId); + + if (group == null) { + webConnection.send(""); + return; + } + + if (!GroupEditDao.hasSession(userId, group.getId())) { + webConnection.send(""); + return; + } + + + } else { + if (!webConnection.session().contains("homeEditSession")) { + webConnection.send(""); + return; + } + } + + int stickieId = webConnection.post().getInt("stickieId"); + + if (isGroupEdit) { + WidgetDao.delete(stickieId, webConnection.session().getInt("groupEditSession")); + } else { + WidgetDao.deleteHomeNote(stickieId, userId); + } + + webConnection.send("SUCCESS"); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/homes/WidgetController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/homes/WidgetController.java new file mode 100644 index 0000000..9bd865b --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/homes/WidgetController.java @@ -0,0 +1,329 @@ +package org.alexdev.http.controllers.homes; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.duckhttpd.template.Template; +import org.alexdev.havana.dao.mysql.GroupDao; +import org.alexdev.havana.game.groups.Group; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.http.dao.GroupEditDao; +import org.alexdev.http.dao.WidgetDao; +import org.alexdev.http.game.homes.Widget; + +public class WidgetController { + public static void editWidget(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int userId = webConnection.session().getInt("user.id"); + boolean isGroupEdit = webConnection.session().contains("groupEditSession"); + + if (isGroupEdit) { + int groupId = webConnection.session().getInt("groupEditSession"); + Group group = GroupDao.getGroup(groupId); + + if (group == null) { + webConnection.send(""); + return; + } + + if (!GroupEditDao.hasSession(userId, group.getId())) { + webConnection.send(""); + return; + } + + + } else { + if (!webConnection.session().contains("homeEditSession")) { + webConnection.send(""); + return; + } + } + + int widgetId = webConnection.post().getInt("widgetId"); + int skinId = webConnection.post().getInt("skinId"); + + Widget widget = null; + + if (isGroupEdit) { + widget = WidgetDao.getGroupWidget(widgetId, webConnection.session().getInt("groupEditSession")); + } else { + widget = WidgetDao.getHomeWidget(userId, widgetId); + } + + if (widget == null) { + webConnection.send(""); + return; + } + + Template tpl = widget.template(webConnection); + PlayerDetails playerDetails = (PlayerDetails) tpl.get("playerDetails"); + + if ((skinId == 7 || skinId == 8) && !playerDetails.hasClubSubscription()) { + skinId = 1; + } + + if (skinId == 9 && playerDetails.getRank().getRankId() < 5) { + skinId = 1; + } + + widget.setSkinId(skinId); + widget.save(); + + if (widget.getProduct().isGroupWidget() || widget.getProduct().isHomeWidget()) { + webConnection.headers().put("X-JSON", "{\"id\":\"" + widget.getId() + "\",\"cssClass\":\"w_skin_" + widget.getSkin() + "\",\"type\":\"widget\"}"); + } + + + tpl.set("sticker", widget); + tpl.render(); + + } + + public static void placeSticker(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int userId = webConnection.session().getInt("user.id"); + boolean isGroupEdit = webConnection.session().contains("groupEditSession"); + + if (isGroupEdit) { + int groupId = webConnection.session().getInt("groupEditSession"); + Group group = GroupDao.getGroup(groupId); + + if (group == null) { + webConnection.send(""); + return; + } + + if (!GroupEditDao.hasSession(userId, group.getId())) { + webConnection.send(""); + return; + } + + + } else { + if (!webConnection.session().contains("homeEditSession")) { + webConnection.send(""); + return; + } + } + + int widgetId = webConnection.post().getInt("selectedStickerId"); + int zindex = webConnection.post().getInt("zindex"); + + if (zindex < 0 || zindex > 100) { + zindex = 0; + } + + Widget widget = WidgetDao.getInventoryWidget(userId, widgetId); + widget.setX(20); + widget.setY(30); + widget.setZ(zindex); + + if (isGroupEdit) { + widget.setGroupId( webConnection.session().getInt("groupEditSession")); + } + + widget.setPlaced(true); + widget.save(); + + webConnection.headers().put("X-JSON", "[\"" + widget.getId() + "\"]"); + + Template tpl = widget.template(webConnection); + tpl.render(); + + } + + public static void placeWidget(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int userId = webConnection.session().getInt("user.id"); + boolean isGroupEdit = webConnection.session().contains("groupEditSession"); + + if (isGroupEdit) { + int groupId = webConnection.session().getInt("groupEditSession"); + Group group = GroupDao.getGroup(groupId); + + if (group == null) { + webConnection.send(""); + return; + } + + if (!GroupEditDao.hasSession(userId, group.getId())) { + webConnection.send(""); + return; + } + + + } else { + if (!webConnection.session().contains("homeEditSession")) { + webConnection.send(""); + return; + } + } + + int widgetId = webConnection.post().getInt("widgetId"); + int zindex = webConnection.post().getInt("zindex"); + + if (zindex < 0 || zindex > 100) { + zindex = 0; + } + + Widget widget = null; + + if (isGroupEdit) { + widget = WidgetDao.getGroupWidget(widgetId, webConnection.session().getInt("groupEditSession")); + } else { + widget = WidgetDao.getHomeWidget(userId, widgetId); + } + + widget.setX(10); + widget.setY(10); + widget.setZ(zindex); + + if (isGroupEdit) { + widget.setGroupId(webConnection.session().getInt("groupEditSession")); + } + + widget.setPlaced(true); + widget.save(); + + webConnection.headers().put("X-JSON", "[\"" + widget.getId() + "\"]"); + + Template tpl = widget.template(webConnection); + + if (isGroupEdit) { + tpl.set("group", GroupDao.getGroup(widget.getGroupId())); + } + + tpl.render(); + + } + + public static void removeSticker(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int userId = webConnection.session().getInt("user.id"); + boolean isGroupEdit = webConnection.session().contains("groupEditSession"); + + if (isGroupEdit) { + int groupId = webConnection.session().getInt("groupEditSession"); + Group group = GroupDao.getGroup(groupId); + + if (group == null) { + webConnection.send(""); + return; + } + + if (!GroupEditDao.hasSession(userId, group.getId())) { + webConnection.send(""); + return; + } + + + } else { + if (!webConnection.session().contains("homeEditSession")) { + webConnection.send(""); + return; + } + } + + int widgetId = webConnection.post().getInt("stickerId"); + Widget widget = null; + + if (isGroupEdit) { + widget = WidgetDao.getGroupWidget(widgetId, webConnection.session().getInt("groupEditSession")); + } else { + widget = WidgetDao.getHomeWidget(userId, widgetId); + } + + if (widget == null) { + webConnection.send(""); + return; + } + + widget.setX(0); + widget.setY(0); + widget.setZ(0); + widget.setGroupId(0); + widget.setPlaced(false); + widget.save(); + + webConnection.send("SUCCESS"); + } + + public static void removeWidget(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int userId = webConnection.session().getInt("user.id"); + boolean isGroupEdit = webConnection.session().contains("groupEditSession"); + + if (isGroupEdit) { + int groupId = webConnection.session().getInt("groupEditSession"); + Group group = GroupDao.getGroup(groupId); + + if (group == null) { + webConnection.send(""); + return; + } + + if (!GroupEditDao.hasSession(userId, group.getId())) { + webConnection.send(""); + return; + } + + + } else { + if (!webConnection.session().contains("homeEditSession")) { + webConnection.send(""); + return; + } + } + + int widgetId = webConnection.post().getInt("widgetId"); + + Widget widget = null; + + if (isGroupEdit) { + widget = WidgetDao.getGroupWidget(widgetId, webConnection.session().getInt("groupEditSession")); + } else { + widget = WidgetDao.getHomeWidget(userId, widgetId); + } + + if (widget == null) { + webConnection.send(""); + return; + } + + if (widget.getProduct().getData().equalsIgnoreCase("groupinfowidget") || widget.getProduct().getData().equalsIgnoreCase("profilewidget")) { + webConnection.send(""); + return; + } + + widget.setX(0); + widget.setY(0); + widget.setZ(0); + + if (isGroupEdit) { + widget.setGroupId(webConnection.session().getInt("groupEditSession")); + } + + widget.setPlaced(false); + widget.save(); + + webConnection.send("SUCCESS"); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/homes/store/StoreController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/homes/store/StoreController.java new file mode 100644 index 0000000..dd29d46 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/homes/store/StoreController.java @@ -0,0 +1,345 @@ +package org.alexdev.http.controllers.homes.store; + +import io.netty.handler.codec.http.HttpResponseStatus; +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.duckhttpd.util.config.Settings; +import org.alexdev.havana.dao.mysql.CurrencyDao; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.server.rcon.messages.RconHeader; +import org.alexdev.http.dao.WidgetDao; +import org.alexdev.http.game.stickers.StickerCategory; +import org.alexdev.http.game.stickers.StickerManager; +import org.alexdev.http.game.stickers.StickerProduct; +import org.alexdev.http.game.stickers.StickerType; +import org.alexdev.http.util.RconUtil; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.stream.Collectors; + +public class StoreController { + public static void main(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + var tpl = webConnection.template("homes/store/main"); + PlayerDetails playerDetails = (PlayerDetails) tpl.get("playerDetails"); + + if (playerDetails == null) { + webConnection.session().delete("user.id"); + webConnection.session().delete("authenticated"); + webConnection.redirect("/"); + return; + } + + List categories = StickerManager.getInstance().getCategories(playerDetails.getRank().getRankId()); + var stickerCategories = categories.stream().filter(category -> category.getCategoryType() == StickerCategory.STICKER_BACKGROUND_TYPE).sorted(Comparator.comparing(StickerCategory::getName)).collect(Collectors.toList()); + var backgroundCategories = categories.stream().filter(category -> category.getCategoryType() == StickerCategory.BACKGROUND_CATEGORY_TYPE).sorted(Comparator.comparing(StickerCategory::getName)).collect(Collectors.toList()); + + int stickerCategory = -1; + List products = new ArrayList<>(); + + if (stickerCategories.size() > 0) { + stickerCategory = stickerCategories.get(0).getId(); + } else if (backgroundCategories.size() > 0) { + stickerCategory = backgroundCategories.get(0).getId(); + } + + if (stickerCategory != -1) { + int finalStickerCategory = stickerCategory; + products = StickerManager.getInstance().getCatalogueList().stream().filter(product -> product.getCategoryId() == finalStickerCategory).collect(Collectors.toList()); + } + + int emptyBoxes = 0; + + if (products.size() > 20) { + emptyBoxes = (int) (Math.ceil(products.size()/5.0) * 5); + } else { + emptyBoxes = 20 - products.size(); + } + + StickerProduct product = null; + + if (products.size() > 0) { + product = products.get(0); + webConnection.headers().put("X-JSON", "[[\"Inventory\",\"Web Store\"],[{\"itemCount\":" + product.getAmount() + ",\"previewCssClass\":\"" + product.getCssClass() + "\",\"titleKey\":\"\"}]]"); + } else { + webConnection.headers().put("X-JSON", "[[\"Inventory\",\"Web Store\"],[{\"itemCount\":0,\"titleKey\":\"\"}]]"); + } + + List emptyBox = new ArrayList<>(); + + if (emptyBoxes > 0) { + for (int i = 0; i < emptyBoxes; i++) { + emptyBox.add(null); + } + } + + tpl.set("stickerCategories", stickerCategories); + tpl.set("backgroundCategories", backgroundCategories); + tpl.set("products", products); + tpl.set("product", product); + tpl.set("emptyBoxes", emptyBox); + tpl.render(); + } + + public static void items(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + var tpl = webConnection.template("homes/store/items"); + PlayerDetails playerDetails = (PlayerDetails) tpl.get("playerDetails"); + + if (playerDetails == null) { + webConnection.session().delete("user.id"); + webConnection.session().delete("authenticated"); + webConnection.redirect("/"); + return; + } + + int subCategory = webConnection.post().getInt("subCategoryId"); + StickerCategory category = StickerManager.getInstance().getCategory(subCategory); + + if (category == null) { + webConnection.send(Settings.getInstance().getDefaultResponses().getResponse(HttpResponseStatus.NOT_FOUND, webConnection)); + return; + } + + List products = StickerManager.getInstance().getCatalogueList().stream().filter(product -> product.getCategoryId() == category.getId()).collect(Collectors.toList()); + + int emptyBoxes = 0; + + if (products.size() > 20) { + emptyBoxes = (int) (Math.ceil(products.size()/5.0) * 5); + } else { + emptyBoxes = 20 - products.size(); + } + + tpl.set("products", products); + tpl.set("emptyProducts", emptyBoxes); + tpl.render(); + } + + public static void preview(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int productId = webConnection.post().getInt("productId"); + StickerProduct stickerProduct = StickerManager.getInstance().getCatalogueList().stream().filter(product -> product.getId() == productId).findFirst().orElse(null); + + if (stickerProduct == null) { + webConnection.send(Settings.getInstance().getDefaultResponses().getResponse(HttpResponseStatus.NOT_FOUND, webConnection)); + return; + } + + if (stickerProduct.getType() == StickerType.STICKER || stickerProduct.getType() == StickerType.NOTE) { + webConnection.headers().put("X-JSON", "[{\"itemCount\":" + stickerProduct.getAmount() + ",\"previewCssClass\":\"" + stickerProduct.getCssClass() + "\",\"titleKey\":\"" + stickerProduct.getName() + "\"}]"); + } else if (stickerProduct.getType() == StickerType.BACKGROUND){ + webConnection.headers().put("X-JSON", "[{\"bgCssClass\":\"b_" + stickerProduct.getData() + "\",\"itemCount\":" + stickerProduct.getAmount() + ",\"previewCssClass\":\"" + stickerProduct.getCssClass() + "\",\"titleKey\":\"" + stickerProduct.getName() + "\"}]"); + } + + var tpl = webConnection.template("homes/store/preview"); + tpl.set("product", stickerProduct); + tpl.render(); + } + + public static void purchaseConfirm(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int productId = webConnection.post().getInt("productId"); + StickerProduct stickerProduct = StickerManager.getInstance().getCatalogueList().stream().filter(product -> product.getId() == productId).findFirst().orElse(null); + + if (stickerProduct == null) { + return; + } + + + var tpl = webConnection.template("homes/store/purchase_confirm"); + PlayerDetails playerDetails = (PlayerDetails) tpl.get("playerDetails"); + + tpl.set("product", stickerProduct); + + if (playerDetails.getCredits() < stickerProduct.getPrice()) { + tpl.set("noCredits", true); + } else { + tpl.set("noCredits", false); + } + + tpl.render(); + } + + public static void backgroundWarning(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + var tpl = webConnection.template("homes/store/background_warning"); + tpl.render(); + + } + + public static void purchaseBackgrounds(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int userId = webConnection.session().getInt("user.id"); + int widgetId = webConnection.post().getInt("selectedId"); + + /* + +

+You already own this item.
+

+ +

+Cancel +

+ +
+ + */ + + StickerProduct stickerProduct = StickerManager.getInstance().getCatalogueList().stream().filter(product -> product.getId() == widgetId).findFirst().orElse(null); + + if (stickerProduct == null) { + webConnection.send(Settings.getInstance().getDefaultResponses().getResponse(HttpResponseStatus.NOT_FOUND, webConnection)); + return; + } + + if (stickerProduct.getType() != StickerType.BACKGROUND) { + webConnection.send(Settings.getInstance().getDefaultResponses().getResponse(HttpResponseStatus.NOT_FOUND, webConnection)); + return; + } + + + PlayerDetails playerDetails = PlayerDao.getDetails(webConnection.session().getInt("user.id")); + + if (playerDetails.getCredits() < stickerProduct.getPrice()) { + webConnection.send(""); + return; + } + + for (int i = 0; i < stickerProduct.getAmount(); i++) { + WidgetDao.purchaseWidget(userId, 0, 0, 0, 0, stickerProduct.getId(), "", 0, false); + } + + CurrencyDao.decreaseCredits(playerDetails, stickerProduct.getPrice()); + + RconUtil.sendCommand(RconHeader.REFRESH_CREDITS, new HashMap<>() {{ + put("userId", playerDetails.getId()); + }}); + + webConnection.send("OK"); + } + + public static void purchaseStickers(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int userId = webConnection.session().getInt("user.id"); + int widgetId = webConnection.post().getInt("selectedId"); + + StickerProduct stickerProduct = StickerManager.getInstance().getCatalogueList().stream().filter(product -> product.getId() == widgetId).findFirst().orElse(null); + + if (stickerProduct == null) { + webConnection.send(Settings.getInstance().getDefaultResponses().getResponse(HttpResponseStatus.NOT_FOUND, webConnection)); + return; + } + + if (stickerProduct.getType() != StickerType.STICKER) { + webConnection.send(Settings.getInstance().getDefaultResponses().getResponse(HttpResponseStatus.NOT_FOUND, webConnection)); + return; + } + + PlayerDetails playerDetails = PlayerDao.getDetails(webConnection.session().getInt("user.id")); + + if (playerDetails.getCredits() < stickerProduct.getPrice()) { + webConnection.send(""); + return; + } + + for (int i = 0; i < stickerProduct.getAmount(); i++) { + WidgetDao.purchaseWidget(userId, 0, 0, 0, 0, stickerProduct.getId(), "", 0, false); + } + + // if (type.equalsIgnoreCase("stickers")) { + // typeId = 1; + // } + // + // if (type.equalsIgnoreCase("backgrounds")) { + // typeId = 4; + // } + // + // if (type.equalsIgnoreCase("notes")) { + // typeId = 3; + // } + + CurrencyDao.decreaseCredits(playerDetails, stickerProduct.getPrice()); + + RconUtil.sendCommand(RconHeader.REFRESH_CREDITS, new HashMap<>() {{ + put("userId", playerDetails.getId()); + }}); + + webConnection.send("OK"); + } + + public static void purchaseStickieNotes(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int userId = webConnection.session().getInt("user.id"); + int widgetId = webConnection.post().getInt("selectedId"); + + StickerProduct stickerProduct = StickerManager.getInstance().getCatalogueList().stream().filter(product -> product.getId() == widgetId).findFirst().orElse(null); + + if (stickerProduct == null) { + webConnection.send(Settings.getInstance().getDefaultResponses().getResponse(HttpResponseStatus.NOT_FOUND, webConnection)); + return; + } + + if (stickerProduct.getType() != StickerType.NOTE) { + webConnection.send(Settings.getInstance().getDefaultResponses().getResponse(HttpResponseStatus.NOT_FOUND, webConnection)); + return; + } + + PlayerDetails playerDetails = PlayerDao.getDetails(webConnection.session().getInt("user.id")); + + if (playerDetails.getCredits() < stickerProduct.getPrice()) { + webConnection.send(""); + return; + } + + + for (int i = 0; i < stickerProduct.getAmount(); i++) { + WidgetDao.purchaseWidget(userId, 0, 0, 0, 0, stickerProduct.getId(), "", 0, false); + } + + CurrencyDao.decreaseCredits(playerDetails, stickerProduct.getPrice()); + + RconUtil.sendCommand(RconHeader.REFRESH_CREDITS, new HashMap<>() {{ + put("userId", playerDetails.getId()); + }}); + + webConnection.send("OK"); + } + +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/homes/widgets/BadgesController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/homes/widgets/BadgesController.java new file mode 100644 index 0000000..1f1acd0 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/homes/widgets/BadgesController.java @@ -0,0 +1,51 @@ +package org.alexdev.http.controllers.homes.widgets; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.havana.game.badges.Badge; +import org.alexdev.http.dao.WidgetDao; +import org.alexdev.http.game.homes.Widget; + +import java.util.List; + +public class BadgesController { + public static void badgepaging(WebConnection webConnection) { + int widgetId = webConnection.post().getInt("widgetId"); + int pageNumber = webConnection.post().getInt("pageNumber"); + + Widget widget = WidgetDao.getWidget(widgetId); + + if (widget == null) { + webConnection.send(""); + return; + } + + var pages = widget.getBadgeList(); + boolean showLast = true; + + List badgeList = pages.get(0); + + if (pageNumber > pages.size()) { + pageNumber = pages.size(); + } + + if (pageNumber >= pages.size()) { + showLast = false; + } + + if (pageNumber <= 0) { + pageNumber = 1; + } + + if (pages.containsKey(pageNumber - 1)) { + badgeList = pages.get(pageNumber - 1); + } + + var template = webConnection.template("homes/widget/habblet/badgepaging"); + template.set("sticker", widget); + template.set("pages", pages.size()); + template.set("showLast", showLast); + template.set("badgeList", badgeList); + template.set("currentPage", pageNumber); + template.render(); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/homes/widgets/FriendsWidgetController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/homes/widgets/FriendsWidgetController.java new file mode 100644 index 0000000..a1607ab --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/homes/widgets/FriendsWidgetController.java @@ -0,0 +1,62 @@ +package org.alexdev.http.controllers.homes.widgets; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.game.messenger.MessengerUser; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.http.dao.WidgetDao; +import org.alexdev.http.game.homes.Widget; + +import java.util.List; + +public class FriendsWidgetController { + public static void friendsearchpaging(WebConnection webConnection) { + int widgetId = webConnection.post().getInt("widgetId"); + int pageNumber = 1; + + try { + pageNumber = webConnection.post().getInt("pageNumber"); + } catch (Exception ex) { + + } + + if (pageNumber <= 0) { + pageNumber = 1; + } + + String searchString = webConnection.post().getString("searchString"); + + Widget widget = WidgetDao.getWidget(widgetId); + + if (widget == null) { + webConnection.send(""); + return; + } + + var pages = searchString.isBlank() ? widget.getFriendsPages() : widget.getFriendsPagesSearch(searchString); + List friendsList = widget.getFriendsList(searchString, pageNumber); + + var template = webConnection.template("homes/widget/habblet/friendsearchpaging"); + template.set("sticker", widget); + template.set("pages", pages); + template.set("friends", widget.getFriendsAmount()); + template.set("friendsList", friendsList); + template.set("currentPage", pageNumber); + template.render(); + + } + + public static void avatarinfo(WebConnection webConnection) { + int userId = webConnection.post().getInt("anAccountId"); + PlayerDetails playerDetails = PlayerDao.getDetails(userId); + + if (playerDetails == null) { + webConnection.send(""); + return; + } + + var template = webConnection.template("homes/widget/habblet/avatarinfo"); + template.set("avatar", playerDetails); + template.render(); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/homes/widgets/GuestbookController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/homes/widgets/GuestbookController.java new file mode 100644 index 0000000..a27b18d --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/homes/widgets/GuestbookController.java @@ -0,0 +1,200 @@ +package org.alexdev.http.controllers.homes.widgets; + +import org.alexdev.duckhttpd.response.ResponseBuilder; +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.duckhttpd.template.Template; +import org.alexdev.havana.dao.mysql.GroupDao; +import org.alexdev.havana.dao.mysql.PlayerStatisticsDao; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.statistics.PlayerStatistic; +import org.alexdev.havana.game.wordfilter.WordfilterManager; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.http.dao.GuestbookDao; +import org.alexdev.http.dao.WidgetDao; +import org.alexdev.http.game.homes.GuestbookEntry; +import org.alexdev.http.game.homes.Widget; +import org.alexdev.http.game.stickers.StickerType; +import org.alexdev.http.util.BBCode; +import org.alexdev.http.util.HtmlUtil; + +import java.util.concurrent.ThreadLocalRandom; + +public class GuestbookController { + public static void preview(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + String message = BBCode.format(HtmlUtil.escape(BBCode.normalise(webConnection.post().getString("message"))), false); + + if (message.length() > 200) { + message = message.substring(0, 200); + } + + Template template = webConnection.template("homes/widget/guestbook/preview"); + PlayerDetails playerDetails = (PlayerDetails) template.get("playerDetails"); + + template.set("message", message); + template.set("author", playerDetails); + template.set("formattedDate", DateUtil.getFriendlyDate(DateUtil.getCurrentTimeSeconds())); + template.render(); + } + + public static void add(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int widgetId = webConnection.post().getInt("widgetId"); + Widget widget = WidgetDao.getWidget(widgetId); + + if (widget == null || !widget.getProduct().getData().toLowerCase().equals("guestbookwidget")) { + webConnection.send(""); + return; + } + + String message = webConnection.post().getString("message"); + + if (message.length() > 200) { + message = message.substring(0, 200); + } + + if (!widget.isPlaced()) { + webConnection.send(""); + return; + } + + if (!widget.isPostingAllowed(webConnection.session().getInt("user.id"))) { + webConnection.send(""); + return; + } + + int homeId = 0; + int groupId = 0; + + if (widget.getProduct().getType() == StickerType.GROUP_WIDGET) { + groupId = widget.getGroupId(); + } else if (widget.getProduct().getType() == StickerType.HOME_WIDGET) { + homeId = widget.getUserId(); + + if (homeId != webConnection.session().getInt("user.id")) { + PlayerStatisticsDao.incrementStatistic(homeId, PlayerStatistic.GUESTBOOK_UNREAD_MESSAGES, 1); + //HomesDao.incrementUnreadMessages(homeId); + } + } + GuestbookEntry guestbookEntry = null; + + if (WordfilterManager.filterSentence(message).equals(message)) { + guestbookEntry = GuestbookDao.create(webConnection.session().getInt("user.id"), homeId, groupId, message); + } else { + guestbookEntry = new GuestbookEntry(ThreadLocalRandom.current().nextInt(Integer.MAX_VALUE), webConnection.session().getInt("user.id"), homeId, groupId, message, DateUtil.getCurrentTimeSeconds()); + } + + Template template = webConnection.template("homes/widget/guestbook/add"); + template.set("entry", guestbookEntry); + template.set("sticker", widget); + template.set("canDeleteEntries", widget.canDeleteEntries(webConnection.session().getInt("user.id"))); + template.render(); + } + + public static void remove(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + int entryId = -1; + int widgetId = -1; + + try { + entryId = webConnection.post().getInt("entryId"); + widgetId = webConnection.post().getInt("widgetId"); + } catch (Exception ex) { + + } + + Widget widget = WidgetDao.getWidget(widgetId); + + if (widget == null || !widget.getProduct().getData().toLowerCase().equals("guestbookwidget") || !widget.isPlaced()) { + webConnection.send(""); + return; + } + + GuestbookEntry entry = GuestbookDao.getEntry(entryId); + + if (entry == null || !widget.canDeleteEntries(webConnection.session().getInt("user.id")) && entry.getUserId() != webConnection.session().getInt("user.id")) { + webConnection.send(""); + return; + } + + int homeId = 0; + int groupId = 0; + + if (widget.getProduct().getType() == StickerType.GROUP_WIDGET) { + groupId = widget.getGroupId(); + } else if (widget.getProduct().getType() == StickerType.HOME_WIDGET) { + homeId = widget.getUserId(); + } + + GuestbookDao.remove(entryId, homeId, groupId); + + Template template = webConnection.template("homes/widget/guestbook_widget"); + template.set("editMode", webConnection.session().contains("homeEditSession") || webConnection.session().contains("groupEditSession")); + template.set("sticker", widget); + template.render(); + } + + public static void configure(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int userId = webConnection.session().getInt("user.id"); + int widgetId = webConnection.post().getInt("widgetId"); + + Widget widget = WidgetDao.getWidget(widgetId); + + if (widget == null || !widget.getProduct().getData().toLowerCase().equals("guestbookwidget") || !widget.isPlaced()) { + webConnection.send(""); + return; + } + + int ownerId = 0; + + if (widget.getProduct().getType() == StickerType.GROUP_WIDGET) { + ownerId = GroupDao.getGroupOwner(widget.getGroupId()); + } else if (widget.getProduct().getType() == StickerType.HOME_WIDGET) { + ownerId = widget.getUserId(); + } + + if (ownerId != userId) { + webConnection.send(""); + return; + } + + if (widget.getGuestbookState().equalsIgnoreCase("private")) { + widget.setExtraData("public"); + } else { + widget.setExtraData("private"); + } + + widget.save(); + + webConnection.send(ResponseBuilder.create("text/javascript", "var el = $(\"guestbook-type\");\n" + + "if (el) {\n" + + "\tif (el.hasClassName(\"public\")) {\n" + + "\t\tel.className = \"private\";\n" + + "\t\tnew Effect.Pulsate(el,\n" + + "\t\t\t{ duration: 1.0, afterFinish : function() { Element.setOpacity(el, 1); } }\n" + + "\t\t);\t\t\t\t\t\t\n" + + "\t} else {\t\t\t\t\t\t\n" + + "\t\tnew Effect.Pulsate(el,\n" + + "\t\t\t{ duration: 1.0, afterFinish : function() { Element.setOpacity(el, 0); el.className = \"public\"; } }\n" + + "\t\t);\t\t\t\t\t\t\n" + + "\t}\n" + + "}")); + + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/homes/widgets/MemberWidgetController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/homes/widgets/MemberWidgetController.java new file mode 100644 index 0000000..af99422 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/homes/widgets/MemberWidgetController.java @@ -0,0 +1,47 @@ +package org.alexdev.http.controllers.homes.widgets; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.havana.dao.mysql.GroupDao; +import org.alexdev.havana.game.groups.GroupMember; +import org.alexdev.http.dao.WidgetDao; +import org.alexdev.http.game.homes.Widget; + +import java.util.List; + +public class MemberWidgetController { + public static void membersearchpaging(WebConnection webConnection) { + int widgetId = webConnection.post().getInt("widgetId"); + int pageNumber = 1; + + try { + pageNumber = webConnection.post().getInt("pageNumber"); + } catch (Exception ex) { + + } + + if (pageNumber <= 0) { + pageNumber = 1; + } + + String searchString = webConnection.post().getString("searchString"); + + Widget widget = WidgetDao.getWidget(widgetId); + + if (widget == null) { + webConnection.send(""); + return; + } + + var pages = widget.getMembersPages(); + List memberList = widget.getMembersList(searchString, pageNumber); + + var template = webConnection.template("homes/widget/habblet/membersearchpaging"); + template.set("sticker", widget); + template.set("pages", pages); + template.set("members", widget.getMembersAmount()); + template.set("membersList", memberList); + template.set("currentPage", pageNumber); + template.set("group", GroupDao.getGroup(widget.getGroupId())); + template.render(); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/homes/widgets/RateController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/homes/widgets/RateController.java new file mode 100644 index 0000000..b1f5805 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/homes/widgets/RateController.java @@ -0,0 +1,87 @@ +package org.alexdev.http.controllers.homes.widgets; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.http.dao.RatingDao; +import org.alexdev.http.dao.WidgetDao; +import org.alexdev.http.game.homes.Widget; + +public class RateController { + public static void rate(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int userId = webConnection.session().getInt("user.id"); + + int widgetId = -1; + int rating = -1; + + try { + widgetId = webConnection.get().getInt("ratingId"); + rating = webConnection.get().getInt("givenRate"); + } catch (Exception ex) { + + } + + if (rating < 1 || rating > 5) { + webConnection.send(""); + return; + } + + Widget widget = WidgetDao.getWidget(widgetId); + + if (widget == null) { + webConnection.send(""); + return; + } + + int homeId = widget.getUserId(); + + if (homeId == userId) { + webConnection.send(""); + return; + } + + if (RatingDao.hasRated(userId, homeId)) { + webConnection.send(""); + return; + } + + RatingDao.rate(userId, homeId, rating); + + var template = webConnection.template("homes/widget/habblet/rate"); + template.set("sticker", widget); + template.render(); + } + + public static void resetRating(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int userId = webConnection.session().getInt("user.id"); + int widgetId = webConnection.get().getInt("ratingId"); + + Widget widget = WidgetDao.getWidget(widgetId); + + if (widget == null) { + webConnection.send(""); + return; + } + + int homeId = widget.getUserId(); + + if (homeId != userId) { + webConnection.send(""); + return; + } + + RatingDao.deleteRating(homeId); + + var template = webConnection.template("homes/widget/habblet/rate"); + template.set("sticker", widget); + template.render(); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/homes/widgets/TraxController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/homes/widgets/TraxController.java new file mode 100644 index 0000000..589723f --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/homes/widgets/TraxController.java @@ -0,0 +1,105 @@ +package org.alexdev.http.controllers.homes.widgets; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.duckhttpd.template.Template; +import org.alexdev.havana.dao.mysql.GroupDao; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.dao.mysql.SongMachineDao; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.song.Song; +import org.alexdev.http.dao.WidgetDao; +import org.alexdev.http.game.homes.Widget; +import org.alexdev.http.game.stickers.StickerType; +import org.apache.commons.lang3.StringUtils; + +public class TraxController { + public static void selectSong(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + PlayerDetails playerDetails = PlayerDao.getDetails(webConnection.session().getInt("user.id")); + + int widgetId = -1; + int songId = -1; + + try { + widgetId = webConnection.post().getInt("widgetId"); + } catch (Exception ex) { + + } + + try { + songId = webConnection.post().getInt("songId"); + } catch (Exception ex) { + + } + + Widget widget = WidgetDao.getWidget(widgetId); + + if (widget == null || !widget.getProduct().getData().toLowerCase().equals("traxplayerwidget")) { + webConnection.send(""); + return; + } + + boolean canSelect = false; + + if (widget.getProduct().getType() == StickerType.GROUP_WIDGET) { + canSelect = (GroupDao.getGroupOwner(widget.getGroupId()) == playerDetails.getId()); + } else if (widget.getProduct().getType() == StickerType.HOME_WIDGET) { + canSelect = (widget.getUserId() == playerDetails.getId()); + } + + if (!canSelect) { + webConnection.send(""); + return; + } + + var songList = widget.getSongs(); + Song song = SongMachineDao.getSong(songId); + + if (songId == 0 || song == null || songList.stream().noneMatch(s -> s.getId() == song.getId())) { + widget.setExtraData(""); + } else { + widget.setExtraData("" + song.getId()); + } + + WidgetDao.save(widget); + + Template template = webConnection.template("homes/widget/habblet/trax_song"); + template.set("sticker", widget); + template.render(); + } + + public static void getSong(WebConnection webConnection) { + String songData = null; + + try { + songData = webConnection.getMatches().get(0); + } catch (Exception ex) { + + } + + if (!StringUtils.isNumeric(songData)) { + webConnection.send(""); + return; + } + + try { + Song song = SongMachineDao.getSong(Integer.parseInt(songData)); + String data = song.getData().substring(0, song.getData().length() - 1); + + String trackData = data; + trackData = trackData.replace(":4:", "&track4="); + trackData = trackData.replace(":3:", "&track3="); + trackData = trackData.replace(":2:", "&track2="); + trackData = trackData.replace("1:", "&track1="); + + String author = PlayerDao.getName(song.getUserId()); + webConnection.send("status=0&name=" + song.getTitle() + "&author=" + author + trackData); + } catch (Exception ex) { + webConnection.send(""); + } + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/housekeeping/HousekeepingAdsController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/housekeeping/HousekeepingAdsController.java new file mode 100644 index 0000000..d92bc96 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/housekeeping/HousekeepingAdsController.java @@ -0,0 +1,180 @@ +package org.alexdev.http.controllers.housekeeping; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.duckhttpd.template.Template; +import org.alexdev.havana.dao.mysql.AdvertisementsDao; +import org.alexdev.havana.game.ads.AdManager; +import org.alexdev.havana.game.ads.Advertisement; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.server.rcon.messages.RconHeader; +import org.alexdev.http.Routes; +import org.alexdev.http.game.housekeeping.HousekeepingManager; +import org.alexdev.http.util.RconUtil; +import org.alexdev.http.util.SessionUtil; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; + +public class HousekeepingAdsController { + + /** + * Handle the /housekeeping/room_ads URI request + * + * @param client the connection + */ + public static void roomads(WebConnection client) { + if (!client.session().getBoolean(SessionUtil.LOGGED_IN_HOUSKEEPING)) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + Template tpl = client.template("housekeeping/room_ads"); + tpl.set("housekeepingManager", HousekeepingManager.getInstance()); + + PlayerDetails playerDetails = (PlayerDetails) tpl.get("playerDetails"); + + if (!HousekeepingManager.getInstance().hasPermission(playerDetails.getRank(), "room_ads")) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + try { + if (client.post().queries().size() > 0) { + List advertisementList = new ArrayList<>(); + + for (var kvp : client.post().getValues().entrySet()) { + String key = kvp.getKey(); + String value = kvp.getValue(); + + if (!key.startsWith("roomad-id-")) { + continue; + } + + int roomId = client.post().getInt("roomad-" + value + "-roomid"); + boolean isLoadingAd = client.post().contains("roomad-" + value + "-loading-ad") && client.post().getString("roomad-" + value + "-loading-ad").equalsIgnoreCase("on"); + boolean isEnabled = client.post().contains("roomad-" + value + "-enabled") && client.post().getString("roomad-" + value + "-enabled").equalsIgnoreCase("on"); + String image = client.post().getString("roomad-" + value + "-image"); + String url = client.post().getString("roomad-" + value + "-url"); + + advertisementList.add(new Advertisement(Integer.parseInt(value), isLoadingAd, roomId, image, url, isEnabled)); + } + + AdvertisementsDao.updateAds(advertisementList); + AdManager.getInstance().reset(); + + /* + for (var kvp : client.post().getValues().entrySet()) { + String key = kvp.getKey(); + String value = kvp.getValue(); + + System.out.println(key + " / " + value); + }*/ + + client.session().set("alertColour", "success"); + client.session().set("alertMessage", "All room ads have been saved successfully!"); + + RconUtil.sendCommand(RconHeader.REFRESH_ADS, new HashMap<>()); + } + + } catch (Exception ex) { + + } + + var advertisements = new ArrayList<>(AdManager.getInstance().getAds());//.stream().sorted(); + advertisements.sort(Comparator.comparingInt(Advertisement::getId)); + + tpl.set("pageName", "Room Ads"); + tpl.set("roomAds", advertisements); + tpl.render(); + + // Delete alert after it's been rendered + client.session().delete("alertMessage"); + } + + public static void delete(WebConnection client) { + if (!client.session().getBoolean(SessionUtil.LOGGED_IN_HOUSKEEPING)) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + Template tpl = client.template("housekeeping/room_ads"); + tpl.set("housekeepingManager", HousekeepingManager.getInstance()); + + PlayerDetails playerDetails = (PlayerDetails) tpl.get("playerDetails"); + + if (!HousekeepingManager.getInstance().hasPermission(playerDetails.getRank(), "room_ads")) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + try { + int id = client.get().getInt("id"); + AdvertisementsDao.deleteAd(id); + + client.session().set("alertColour", "danger"); + client.session().set("alertMessage", "Room ad has been deleted successfully"); + + RconUtil.sendCommand(RconHeader.REFRESH_ADS, new HashMap<>()); + } catch (Exception ex) { + + } + + AdManager.getInstance().reset(); + var advertisements = AdManager.getInstance().getAds();//.stream().sorted(); + + + tpl.set("pageName", "Room Ads"); + tpl.set("roomAds", advertisements); + tpl.render(); + + // Delete alert after it's been rendered + client.session().delete("alertMessage"); + } + + public static void create(WebConnection client) { + if (!client.session().getBoolean(SessionUtil.LOGGED_IN_HOUSKEEPING)) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + Template tpl = client.template("housekeeping/room_ads_create"); + tpl.set("housekeepingManager", HousekeepingManager.getInstance()); + + PlayerDetails playerDetails = (PlayerDetails) tpl.get("playerDetails"); + + if (!HousekeepingManager.getInstance().hasPermission(playerDetails.getRank(), "room_ads")) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + try { + if (client.post().getValues().size() > 0) { + int roomId = client.post().getInt("roomid"); + String url = client.post().getString("url"); + String image = client.post().getString("image"); + boolean isEnabled = client.post().contains("enabled") && client.post().getString("enabled").equalsIgnoreCase("on"); + boolean isRoomLoadingAd = client.post().contains("loading-ad") && client.post().getString("loading-ad").equalsIgnoreCase("on"); + + AdvertisementsDao.create(roomId, url, image, isEnabled, isRoomLoadingAd); + AdManager.getInstance().reset(); + + client.session().set("alertColour", "success"); + client.session().set("alertMessage", "Room ad has been created successfully"); + + RconUtil.sendCommand(RconHeader.REFRESH_ADS, new HashMap<>()); + } + + } catch (Exception ex) { + ex.printStackTrace(); + } + + + tpl.set("pageName", "Room Ads"); + tpl.render(); + + // Delete alert after it's been rendered + client.session().delete("alertMessage"); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/housekeeping/HousekeepingBansController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/housekeeping/HousekeepingBansController.java new file mode 100644 index 0000000..a72ab0d --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/housekeeping/HousekeepingBansController.java @@ -0,0 +1,34 @@ +package org.alexdev.http.controllers.housekeeping; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.duckhttpd.template.Template; +import org.alexdev.havana.dao.mysql.BanDao; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.http.Routes; +import org.alexdev.http.game.housekeeping.HousekeepingManager; +import org.alexdev.http.util.SessionUtil; + +public class HousekeepingBansController { + public static void bans(WebConnection client) { + if (!client.session().getBoolean(SessionUtil.LOGGED_IN_HOUSKEEPING)) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + Template tpl = client.template("housekeeping/users_bans"); + tpl.set("housekeepingManager", HousekeepingManager.getInstance()); + + PlayerDetails playerDetails = (PlayerDetails) tpl.get("playerDetails"); + + if (!HousekeepingManager.getInstance().hasPermission(playerDetails.getRank(), "bans")) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + tpl.set("bans", BanDao.getActiveBans()); + tpl.render(); + + // Delete alert after it's been rendered + client.session().delete("alertMessage"); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/housekeeping/HousekeepingCatalogueFrontpageController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/housekeeping/HousekeepingCatalogueFrontpageController.java new file mode 100644 index 0000000..9791f97 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/housekeeping/HousekeepingCatalogueFrontpageController.java @@ -0,0 +1,67 @@ +package org.alexdev.http.controllers.housekeeping; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.duckhttpd.template.Template; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.server.rcon.messages.RconHeader; +import org.alexdev.havana.util.config.GameConfiguration; +import org.alexdev.http.Routes; +import org.alexdev.http.dao.NewsDao; +import org.alexdev.http.game.housekeeping.HousekeepingManager; +import org.alexdev.http.util.RconUtil; +import org.alexdev.http.util.SessionUtil; + +import java.util.HashMap; +import java.util.List; + +public class HousekeepingCatalogueFrontpageController { + public static void edit(WebConnection client) { + if (!client.session().getBoolean(SessionUtil.LOGGED_IN_HOUSKEEPING)) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + PlayerDetails session = PlayerDao.getDetails(client.session().getInt("user.id")); + + if (!HousekeepingManager.getInstance().hasPermission(session.getRank(), "catalogue/edit_frontpage")) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + if (client.post().getValues().size() > 0) { + if (client.post().getString("header").isBlank()) { + client.session().set("alertColour", "danger"); + client.session().set("alertMessage", "Header cannot be blank"); + } else if (client.post().getString("subtext").isBlank()) { + client.session().set("alertColour", "danger"); + client.session().set("alertMessage", "The subtext cannot be blank"); + } else { + client.session().set("alertColour", "success"); + client.session().set("alertMessage", "The frontpage has been successfully saved"); + } + + GameConfiguration.getInstance().updateSetting("catalogue.frontpage.input.1", client.post().getString("image")); + GameConfiguration.getInstance().updateSetting("catalogue.frontpage.input.2", client.post().getString("header")); + GameConfiguration.getInstance().updateSetting("catalogue.frontpage.input.3", client.post().getString("subtext")); + GameConfiguration.getInstance().updateSetting("catalogue.frontpage.input.4", client.post().getString("link")); + + RconUtil.sendCommand(RconHeader.REFRESH_CATALOGUE_FRONTPAGE, new HashMap<>()); + } + + List images = NewsDao.getTopStoryImages(); + + Template tpl = client.template("housekeeping/catalogue_frontpage"); + tpl.set("housekeepingManager", HousekeepingManager.getInstance()); + tpl.set("pageName", "Edit Catalogue Frontpage"); + tpl.set("images", images); + tpl.set("frontpageText1", GameConfiguration.getInstance().getString("catalogue.frontpage.input.1")); + tpl.set("frontpageText2", GameConfiguration.getInstance().getString("catalogue.frontpage.input.2")); + tpl.set("frontpageText3", GameConfiguration.getInstance().getString("catalogue.frontpage.input.3")); + tpl.set("frontpageText4", GameConfiguration.getInstance().getString("catalogue.frontpage.input.4")); + tpl.render(); + + // Delete alert after it's been rendered + client.session().delete("alertMessage"); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/housekeeping/HousekeepingCommandsController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/housekeeping/HousekeepingCommandsController.java new file mode 100644 index 0000000..4a7ca35 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/housekeeping/HousekeepingCommandsController.java @@ -0,0 +1,42 @@ +package org.alexdev.http.controllers.housekeeping; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.game.moderation.actions.ModeratorBanUserAction; +import org.alexdev.havana.server.rcon.messages.RconHeader; +import org.alexdev.http.util.RconUtil; +import org.alexdev.http.util.SessionUtil; + +import java.util.HashMap; + +public class HousekeepingCommandsController { + + /** + * Handle the /housekeeping URI request + * + * @param client the connection + */ + public static void ban(WebConnection client) { + // If they are logged in, send them to the /me page + if (!client.session().getBoolean(SessionUtil.LOGGED_IN_HOUSKEEPING)) { + client.send(""); + } + + var playerDetails = PlayerDao.getDetails(client.get().getString("username")); + + if (playerDetails != null) { + RconUtil.sendCommand(RconHeader.DISCONNECT_USER, new HashMap<>() {{ + put("userId", playerDetails.getId()); + }}); + + int banningId = client.session().getInt("user.id"); + var banningPlayerDetails = PlayerDao.getDetails(banningId); + + //ModerationDao.addLog(ModerationActionType.ALERT_USER, player.getDetails().getId(), playerDetails.getId(), "Banned for breaking the HabboWay", ""); + client.send(ModeratorBanUserAction.ban(banningPlayerDetails, "Banned for breaking the HabboWay", "", playerDetails.getName(), 999999999, true, true)); + return; + } + + client.send("User doesn't exist"); + } +} \ No newline at end of file diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/housekeeping/HousekeepingConfigController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/housekeeping/HousekeepingConfigController.java new file mode 100644 index 0000000..3ce905a --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/housekeeping/HousekeepingConfigController.java @@ -0,0 +1,65 @@ +package org.alexdev.http.controllers.housekeeping; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.duckhttpd.template.Template; +import org.alexdev.havana.dao.mysql.SettingsDao; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.util.config.GameConfiguration; +import org.alexdev.http.Routes; +import org.alexdev.http.game.housekeeping.HousekeepingManager; +import org.alexdev.http.util.ConfigEntry; +import org.alexdev.http.util.SessionUtil; +import org.alexdev.http.util.config.WebSettingsConfigWriter; + +import java.util.ArrayList; +import java.util.Comparator; + +public class HousekeepingConfigController { + /** + * Handle the /housekeeping/articles URI request + * + * @param client the connection + */ + public static void configurations(WebConnection client) { + if (!client.session().getBoolean(SessionUtil.LOGGED_IN_HOUSKEEPING)) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + Template tpl = client.template("housekeeping/configurations"); + tpl.set("housekeepingManager", HousekeepingManager.getInstance()); + + PlayerDetails playerDetails = (PlayerDetails) tpl.get("playerDetails"); + + if (!HousekeepingManager.getInstance().hasPermission(playerDetails.getRank(), "configuration")) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + if (client.post().queries().size() > 0) { + SettingsDao.updateSettings(client.post().getValues().entrySet()); + + // Reload config + // GameConfiguration.getInstance(new WebSettingsConfigWriter()); + + client.session().set("alertColour", "success"); + client.session().set("alertMessage", "All configuration values have been saved successfully! It will take effect within 30 seconds."); + } + + var settings = new ArrayList(); + + for (var setting : SettingsDao.getAllSettings().entrySet()) { + settings.add(new ConfigEntry(setting.getKey(), setting.getValue())); + } + + settings.sort(Comparator.comparing(ConfigEntry::getKey)); + //var settings = SettingsDao.getAllSettings().entrySet();//.stream().sorted(); + + tpl.set("pageName", "Configurations"); + tpl.set("configs", settings); + tpl.render(); + + // Delete alert after it's been rendered + client.session().delete("alertMessage"); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/housekeeping/HousekeepingController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/housekeeping/HousekeepingController.java new file mode 100644 index 0000000..ab953ad --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/housekeeping/HousekeepingController.java @@ -0,0 +1,137 @@ +package org.alexdev.http.controllers.housekeeping; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.duckhttpd.template.Template; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.http.Routes; +import org.alexdev.http.dao.HousekeepingDao; +import org.alexdev.http.dao.housekeeping.HousekeepingPlayerDao; +import org.alexdev.http.game.housekeeping.HousekeepingManager; +import org.alexdev.http.game.housekeeping.HousekeepingStats; +import org.alexdev.http.util.SessionUtil; + +public class HousekeepingController { + + /** + * Handle the /housekeeping URI request + * + * @param client the connection + */ + public static void dashboard(WebConnection client) { + // If they are logged in, send them to the /me page + if (!client.session().getBoolean(SessionUtil.LOGGED_IN_HOUSKEEPING)) { + Template tpl = client.template("housekeeping/login"); + tpl.render(); + } else { + + int currentPage = 0; + + if (client.get().contains("page")) { + currentPage = Integer.parseInt(client.get().getString("page")); + } + + boolean zeroCoinsFlag = false; + + if (client.get().contains("zerocoins")) { + zeroCoinsFlag = true; + } + + String sortBy = "created_at"; + + if (client.get().contains("sort")) { + if (client.get().getString("sort").equals("last_online") || + client.get().getString("sort").equals("created_at")) { + sortBy = client.get().getString("sort"); + } + } + + Template tpl = client.template("housekeeping/dashboard"); + tpl.set("housekeepingManager", HousekeepingManager.getInstance()); + + tpl.set("pageName", "Dashboard"); + tpl.set("players", HousekeepingPlayerDao.getPlayers(currentPage, zeroCoinsFlag, sortBy)); + tpl.set("nextPlayers", HousekeepingPlayerDao.getPlayers(currentPage + 1, zeroCoinsFlag, sortBy)); + tpl.set("previousPlayers", HousekeepingPlayerDao.getPlayers(currentPage - 1, zeroCoinsFlag, sortBy)); + tpl.set("page", currentPage); + tpl.set("sortBy", sortBy); + tpl.set("stats", new HousekeepingStats( + HousekeepingDao.getUserCount(), + HousekeepingDao.getInventoryItemsCount(), + HousekeepingDao.getRoomItemCount(), + HousekeepingDao.getGroupCount(), + HousekeepingDao.getPetCount(), + HousekeepingDao.getPhotoCount())); + tpl.set("zeroCoinsFlag", zeroCoinsFlag); + tpl.render(); + + // Delete alert after it's been rendered + client.session().delete("alertMessage"); + } + } + + /** + * Handle the /housekeeping/login URI request + * + * @param client the connection + */ + public static void login(WebConnection client) { + String[] fieldCheck = new String[] { "hkusername", "hkpassword" }; + + for (String field : fieldCheck) { + + if (client.post().contains(field) && + client.post().getString(field).length() > 0) { + continue; + } + + client.session().set("alertColour", "danger"); + client.session().set("alertMessage", "You need to enter both your email and password"); + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + /*if (!PlayerDao.emailExists(client.post().get("hkemail"), 0)) { + client.session().set("showAlert"434, true); + client.session().set("alertColour", "danger"); + client.session().set("alertMessage", "You have entered invalid details"); + client.redirect("/housekeeping"); + return; + }*/ + + PlayerDetails playerDetails = new PlayerDetails(); + + if (!PlayerDao.login(playerDetails, client.post().getString("hkusername"), client.post().getString("hkpassword"))) { + client.session().set("alertColour", "danger"); + client.session().set("alertMessage", "You have entered invalid details"); + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + if (!HousekeepingManager.getInstance().hasPermission(playerDetails.getRank(), "root/login")) { + client.session().set("alertColour", "warning"); + client.session().set("alertMessage", "You don't have permission"); + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + client.session().set(SessionUtil.LOGGED_IN_HOUSKEEPING, true); + client.session().set(SessionUtil.USER_ID, String.valueOf(playerDetails.getId())); + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + } + + /** + * Handle the /housekeeping/login URI request + * + * @param client the connection + */ + public static void logout(WebConnection client) { + if (client.session().getBoolean(SessionUtil.LOGGED_IN_HOUSKEEPING)) { + client.session().set("alertColour", "success"); + client.session().set("alertMessage", "Successfully logged out!"); + client.session().set(SessionUtil.LOGGED_IN_HOUSKEEPING, false); + } + + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + } +} \ No newline at end of file diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/housekeeping/HousekeepingInfobusController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/housekeeping/HousekeepingInfobusController.java new file mode 100644 index 0000000..a7769d5 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/housekeeping/HousekeepingInfobusController.java @@ -0,0 +1,458 @@ +package org.alexdev.http.controllers.housekeeping; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.duckhttpd.template.Template; +import org.alexdev.havana.dao.mysql.AdvertisementsDao; +import org.alexdev.havana.dao.mysql.InfobusDao; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.game.infobus.InfobusPoll; +import org.alexdev.havana.game.infobus.InfobusPollData; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.server.rcon.messages.RconHeader; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.http.Routes; +import org.alexdev.http.dao.NewsDao; +import org.alexdev.http.game.housekeeping.HousekeepingManager; +import org.alexdev.http.game.news.NewsArticle; +import org.alexdev.http.util.HtmlUtil; +import org.alexdev.http.util.RconUtil; +import org.alexdev.http.util.SessionUtil; +import org.alexdev.http.util.piechart.PieChart; +import org.alexdev.http.util.piechart.Slice; + +import java.awt.*; +import java.awt.image.BufferedImage; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.TimeUnit; + +public class HousekeepingInfobusController { + + /** + * Handle the /housekeeping/infobus_polls URI request + * + * @param client the connection + */ + public static void polls(WebConnection client) { + if (!client.session().getBoolean(SessionUtil.LOGGED_IN_HOUSKEEPING)) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + Template tpl = client.template("housekeeping/infobus_polls"); + tpl.set("housekeepingManager", HousekeepingManager.getInstance()); + + PlayerDetails playerDetails = (PlayerDetails) tpl.get("playerDetails"); + + if (!HousekeepingManager.getInstance().hasPermission(playerDetails.getRank(), "infobus")) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + tpl.set("pageName", "View Infobus Polls"); + tpl.set("infobusPolls", InfobusDao.getInfobusPolls()); + tpl.render(); + + // Delete alert after it's been rendered + client.session().delete("alertMessage"); + } + + public static void create_polls(WebConnection client) { + if (!client.session().getBoolean(SessionUtil.LOGGED_IN_HOUSKEEPING)) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + Template tpl = client.template("housekeeping/infobus_polls_create"); + tpl.set("housekeepingManager", HousekeepingManager.getInstance()); + + PlayerDetails playerDetails = (PlayerDetails) tpl.get("playerDetails"); + + if (!HousekeepingManager.getInstance().hasPermission(playerDetails.getRank(), "infobus")) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + try { + if (client.post().getValues().size() > 0) { + String question = client.post().getString("question"); + + client.session().set("alertColour", "success"); + client.session().set("alertMessage", "Infobus poll has been created successfully"); + + InfobusPollData infobusPollData = new InfobusPollData(question); + infobusPollData.getAnswers().addAll(client.post().getArray("answers[]")); + InfobusDao.createInfobusPoll(playerDetails.getId(), infobusPollData); + + client.redirect("/" + Routes.HOUSEKEEPING_PATH + "/infobus_polls"); + return; + } + } catch (Exception ex) { + + } + + tpl.set("pageName", "Create Infobus Poll"); + tpl.set("oneHourLater", DateUtil.getDate(DateUtil.getCurrentTimeSeconds() + TimeUnit.HOURS.toSeconds(1), "yyyy-MM-dd'T'HH:mm")); + tpl.render(); + + // Delete alert after it's been rendered + client.session().delete("alertMessage"); + } + + /** + * Handle the /housekeeping/infobus_polls/delete URI request + * + * @param client the connection + */ + public static void delete(WebConnection client) { + if (!client.session().getBoolean(SessionUtil.LOGGED_IN_HOUSKEEPING)) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + Template tpl = client.template("housekeeping/articles"); + tpl.set("housekeepingManager", HousekeepingManager.getInstance()); + + PlayerDetails playerDetails = (PlayerDetails) tpl.get("playerDetails"); + InfobusPoll poll = InfobusDao.get(client.get().getInt("id")); + + if (poll == null) { + client.session().set("alertColour", "danger"); + client.session().set("alertMessage", "The infobus poll does not exist"); + client.redirect("/" + Routes.HOUSEKEEPING_PATH + "/infobus_polls"); + return; + } + + if (poll.getInitiatedBy() != playerDetails.getId()) { + if (!HousekeepingManager.getInstance().hasPermission(playerDetails.getRank(), "infobus/delete_any")) { + client.session().set("alertColour", "danger"); + client.session().set("alertMessage", "No permission to delete other polls"); + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + } + + if (!HousekeepingManager.getInstance().hasPermission(playerDetails.getRank(), "infobus/delete_own")) { + client.session().set("alertColour", "danger"); + client.session().set("alertMessage", "No permission to delete"); + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + if (!client.get().contains("id")) { + client.session().set("alertColour", "danger"); + client.session().set("alertMessage", "There was no infobus poll selected to delete"); + } else { + var answers = InfobusDao.getAnswers(poll.getId()); + int totalAnswers = answers.values().stream().mapToInt(Integer::intValue).sum(); + + if (totalAnswers > 0) { + client.session().set("alertColour", "danger"); + client.session().set("alertMessage", "You can't delete a poll with answers"); + client.redirect("/" + Routes.HOUSEKEEPING_PATH + "/infobus_polls"); + return; + } + + client.session().set("alertColour", "success"); + client.session().set("alertMessage", "Successfully deleted the infobus poll"); + + InfobusDao.delete(client.get().getInt("id")); + InfobusDao.clearAnswers(client.get().getInt("id")); + } + + client.redirect("/" + Routes.HOUSEKEEPING_PATH + "/infobus_polls"); + + } + + /** + * Handle the /housekeeping/infobus_polls/send_poll URI request + * + * @param client the connection + */ + public static void send_poll(WebConnection client) { + if (!client.session().getBoolean(SessionUtil.LOGGED_IN_HOUSKEEPING)) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + Template tpl = client.template("housekeeping/articles"); + tpl.set("housekeepingManager", HousekeepingManager.getInstance()); + + PlayerDetails playerDetails = (PlayerDetails) tpl.get("playerDetails"); + + if (!HousekeepingManager.getInstance().hasPermission(playerDetails.getRank(), "infobus")) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + InfobusPoll poll = InfobusDao.get(client.get().getInt("id")); + + if (poll == null) { + client.session().set("alertColour", "danger"); + client.session().set("alertMessage", "The infobus poll does not exist"); + client.redirect("/" + Routes.HOUSEKEEPING_PATH + "/infobus_polls"); + return; + } + + client.session().set("alertColour", "warning"); + client.session().set("alertMessage", "The infobus poll request has been sent"); + + RconUtil.sendCommand(RconHeader.INFOBUS_POLL, new HashMap<>() {{ + put("pollId", String.valueOf(poll.getId())); + }}); + + client.redirect("/" + Routes.HOUSEKEEPING_PATH + "/infobus_polls"); + + } + + /** + * Handle the /housekeeping/infobus_polls/edit URI request + * + * @param client the connection + */ + public static void edit(WebConnection client) { + if (!client.session().getBoolean(SessionUtil.LOGGED_IN_HOUSKEEPING)) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + Template tpl = client.template("housekeeping/infobus_polls_edit"); + tpl.set("housekeepingManager", HousekeepingManager.getInstance()); + + PlayerDetails playerDetails = (PlayerDetails) tpl.get("playerDetails"); + + if (!HousekeepingManager.getInstance().hasPermission(playerDetails.getRank(), "infobus")) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + InfobusPoll infobusPoll = InfobusDao.get(client.get().getInt("id")); + + if (!client.get().contains("id")) { + client.session().set("alertColour", "danger"); + client.session().set("alertMessage", "There was no infobus poll selected to edit"); + client.redirect("/" + Routes.HOUSEKEEPING_PATH + "/infobus_polls"); + return; + } else if (infobusPoll == null) { + client.session().set("alertColour", "danger"); + client.session().set("alertMessage", "The infobus poll does not exist"); + client.redirect("/" + Routes.HOUSEKEEPING_PATH + "/infobus_polls"); + return; + } else { + if (client.post().queries().size() > 0) { + int id = infobusPoll.getId(); + String question = client.post().getString("question"); + + var answers = InfobusDao.getAnswers(infobusPoll.getId()); + int totalAnswers = answers.values().stream().mapToInt(Integer::intValue).sum(); + + if (totalAnswers > 0) { + client.session().set("alertColour", "danger"); + client.session().set("alertMessage", "You can't edit the poll if it has answers"); + } else { + /*var activePoll = InfobusDao.getActivePoll(); + + if (activePoll != null && activePoll.getId() != infobusPoll.getId() && enabled) { + client.session().set("alertColour", "warning"); + client.session().set("alertMessage", "Cannot activate this poll while there's already a different active poll"); + enabled = false; + } else {*/ + client.session().set("alertColour", "success"); + client.session().set("alertMessage", "The infobus poll was successfully saved"); + + InfobusPollData infobusPollData = new InfobusPollData(question); + infobusPollData.getAnswers().addAll(client.post().getArray("answers[]")); + InfobusDao.saveInfobusPoll(id, infobusPollData); + } + + //RconUtil.sendCommand(RconHeader.REFRESH_INFOBUS_POLLS, new HashMap<>()); + client.redirect("/" + Routes.HOUSEKEEPING_PATH + "/infobus_polls"); + return; + } + + //tpl.set("pollDate", DateUtil.getDate(infobusPoll.getExpiresAt(), "yyyy-MM-dd'T'HH:mm")); + tpl.set("poll", infobusPoll); + } + + tpl.render(); + + // Delete alert after it's been rendered + client.session().delete("alertMessage"); + } + + /** + * Handle the /housekeeping/infobus_polls/edit URI request + * + * @param client the connection + */ + public static void view_results(WebConnection client) { + if (!client.session().getBoolean(SessionUtil.LOGGED_IN_HOUSKEEPING)) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + Template tpl = client.template("housekeeping/infobus_polls_view"); + tpl.set("housekeepingManager", HousekeepingManager.getInstance()); + + PlayerDetails playerDetails = (PlayerDetails) tpl.get("playerDetails"); + + if (!HousekeepingManager.getInstance().hasPermission(playerDetails.getRank(), "infobus")) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + InfobusPoll infobusPoll = InfobusDao.get(client.get().getInt("id")); + + if (!client.get().contains("id")) { + client.session().set("alertColour", "danger"); + client.session().set("alertMessage", "There was no infobus poll selected to edit"); + client.redirect("/" + Routes.HOUSEKEEPING_PATH + "/infobus_polls"); + return; + } else if (infobusPoll == null) { + client.session().set("alertColour", "danger"); + client.session().set("alertMessage", "The infobus poll does not exist"); + client.redirect("/" + Routes.HOUSEKEEPING_PATH + "/infobus_polls"); + return; + } else { + tpl.set("poll", infobusPoll); + } + + var image = new BufferedImage(500, 250, BufferedImage.TYPE_INT_ARGB); + + var answers = InfobusDao.getAnswers(infobusPoll.getId()); + int totalAnswers = answers.values().stream().mapToInt(Integer::intValue).sum(); + + var slices = new ArrayList(); + + int i = 0; + + if (totalAnswers > 0) { + for (var answer : answers.entrySet()) { + Color color = null; + + if (i == 0) { + color = Color.BLUE; + } + + if (i == 1) { + color = Color.RED; + } + + if (i == 2) { + color = Color.YELLOW; + } + + if (i == 3) { + color = Color.PINK; + } + + if (i == 4) { + color = Color.ORANGE; + } + + try { + slices.add(new Slice(infobusPoll.getPollData().getAnswers().get(answer.getKey()), (double) (answer.getValue() > 0 ? totalAnswers / answer.getValue() : 0), color)); + } catch (Exception ex) { + client.session().set("alertColour", "danger"); + client.session().set("alertMessage", "There was an answer to a question that doesn't exist, some answers may not be visible on this chart"); + } + + i++; + } + } + + new PieChart(image, slices); + + tpl.set("imageData", "data:image/png;base64," + HtmlUtil.encodeToString(image, "PNG")); + tpl.set("noAnswers", totalAnswers == 0); + + tpl.render(); + + // Delete alert after it's been rendered + client.session().delete("alertMessage"); + } + + public static void clear_results(WebConnection client) { + if (!client.session().getBoolean(SessionUtil.LOGGED_IN_HOUSKEEPING)) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + Template tpl = client.template("housekeeping/infobus_polls_view"); + tpl.set("housekeepingManager", HousekeepingManager.getInstance()); + + PlayerDetails playerDetails = (PlayerDetails) tpl.get("playerDetails"); + + if (!HousekeepingManager.getInstance().hasPermission(playerDetails.getRank(), "infobus")) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + InfobusPoll infobusPoll = InfobusDao.get(client.get().getInt("id")); + + if (!client.get().contains("id")) { + client.session().set("alertColour", "danger"); + client.session().set("alertMessage", "There was no infobus poll selected to edit"); + client.redirect("/" + Routes.HOUSEKEEPING_PATH + "/infobus_polls"); + return; + } else if (infobusPoll == null) { + client.session().set("alertColour", "danger"); + client.session().set("alertMessage", "The infobus poll does not exist"); + client.redirect("/" + Routes.HOUSEKEEPING_PATH + "/infobus_polls"); + return; + } else { + client.session().set("alertColour", "success"); + client.session().set("alertMessage", "The infobus poll has had all answers cleared"); + + InfobusDao.clearAnswers(infobusPoll.getId()); + client.redirect("/" + Routes.HOUSEKEEPING_PATH + "/infobus_polls"); + } + } + + public static void close_event(WebConnection client) { + if (!client.session().getBoolean(SessionUtil.LOGGED_IN_HOUSKEEPING)) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + int userId = client.session().getInt("user.id"); + PlayerDetails playerDetails = PlayerDao.getDetails(userId); + + if (!HousekeepingManager.getInstance().hasPermission(playerDetails.getRank(), "infobus")) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + client.session().set("alertColour", "success"); + client.session().set("alertMessage", "The infobus status has been sent"); + + RconUtil.sendCommand(RconHeader.INFOBUS_END_EVENT, new HashMap<>()); + client.redirect("/" + Routes.HOUSEKEEPING_PATH + "/infobus_polls"); + } + + public static void door_status(WebConnection client) { + if (!client.session().getBoolean(SessionUtil.LOGGED_IN_HOUSKEEPING)) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + int userId = client.session().getInt("user.id"); + PlayerDetails playerDetails = PlayerDao.getDetails(userId); + + if (!HousekeepingManager.getInstance().hasPermission(playerDetails.getRank(), "infobus")) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + RconUtil.sendCommand(RconHeader.INFOBUS_DOOR_STATUS, new HashMap<>() {{ + put("doorStatus", String.valueOf(client.get().getInt("status"))); + }}); + + client.session().set("alertColour", "success"); + client.session().set("alertMessage", "The infobus door status has been sent"); + + client.redirect("/" + Routes.HOUSEKEEPING_PATH + "/infobus_polls"); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/housekeeping/HousekeepingNewsController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/housekeeping/HousekeepingNewsController.java new file mode 100644 index 0000000..c43bcb3 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/housekeeping/HousekeepingNewsController.java @@ -0,0 +1,268 @@ +package org.alexdev.http.controllers.housekeeping; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.duckhttpd.template.Template; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.http.Routes; +import org.alexdev.http.dao.NewsDao; +import org.alexdev.http.game.housekeeping.HousekeepingManager; +import org.alexdev.http.game.news.NewsArticle; +import org.alexdev.http.game.news.NewsCategory; +import org.alexdev.http.game.news.NewsDateKey; +import org.alexdev.http.game.news.NewsManager; +import org.alexdev.http.util.HousekeepingUtil; +import org.alexdev.http.util.SessionUtil; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +public class HousekeepingNewsController { + private static final int MAX_NEWS_TO_DISPLAY = 250; + + /** + * Handle the /housekeeping/articles URI request + * + * @param client the connection + */ + public static void articles(WebConnection client) { + if (!client.session().getBoolean(SessionUtil.LOGGED_IN_HOUSKEEPING)) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + Template tpl = client.template("housekeeping/articles"); + tpl.set("housekeepingManager", HousekeepingManager.getInstance()); + + PlayerDetails playerDetails = (PlayerDetails) tpl.get("playerDetails"); + + if (!HousekeepingManager.getInstance().hasPermission(playerDetails.getRank(), "articles/create")) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + tpl.set("pageName", "View News"); + tpl.set("articles", NewsDao.getTop(NewsDateKey.ALL, MAX_NEWS_TO_DISPLAY, true, List.of(), 0)); + tpl.render(); + + // Delete alert after it's been rendered + client.session().delete("alertMessage"); + } + + /** + * Handle the /housekeeping/articles/create URI request + * + * @param client the connection + */ + public static void create(WebConnection client) { + if (!client.session().getBoolean(SessionUtil.LOGGED_IN_HOUSKEEPING)) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + PlayerDetails session = PlayerDao.getDetails(client.session().getInt("user.id")); + + if (!HousekeepingManager.getInstance().hasPermission(session.getRank(), "articles/create")) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + if (client.post().queries().size() > 0) { + long publishDate = DateUtil.getFromFormat("yyyy-MM-dd'T'HH:mm", client.post().getString("datePublished")); + + List categories = new ArrayList<>(); + + for (String data : client.post().getArray("categories[]")) { + var category = NewsManager.getInstance().getCategoryByLabel(data); + + if (category != null) { + categories.add(category); + } + } + + int articleId = NewsDao.create( + client.post().getString("title"), + client.post().getString("shortstory"), + client.post().getString("fullstory"), + client.post().getString("topstory"), + client.post().getString("topstoryOverride"), + session.getId(), + client.post().getString("authorOverride"), + client.post().getString("category"), + client.post().getString("articleimage"), + publishDate, + client.post().getString("futurePublished").equals("true"), + client.post().getString("published").equals("true") + ); + + NewsDao.insertCategories(articleId, categories); + + client.session().set("alertColour", "success"); + client.session().set("alertMessage", "The submission of the news article was successful"); + client.redirect("/" + Routes.HOUSEKEEPING_PATH + "/articles"); + return; + } + + List images = NewsDao.getTopStoryImages(); + + Template tpl = client.template("housekeeping/articles_create"); + tpl.set("housekeepingManager", HousekeepingManager.getInstance()); + tpl.set("pageName", "Create News"); + tpl.set("images", images); + tpl.set("randomImage", images.get(ThreadLocalRandom.current().nextInt(images.size()))); + tpl.set("currentDate", DateUtil.getDate(DateUtil.getCurrentTimeSeconds(), "yyyy-MM-dd'T'HH:mm")); + tpl.set("categories", NewsManager.getInstance().getCategories()); + tpl.render(); + + // Delete alert after it's been rendered + client.session().delete("alertMessage"); + } + + /** + * Handle the /housekeeping/articles/delete URI request + * + * @param client the connection + */ + public static void delete(WebConnection client) { + if (!client.session().getBoolean(SessionUtil.LOGGED_IN_HOUSKEEPING)) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + NewsArticle article = NewsDao.get(client.get().getInt("id")); + + Template tpl = client.template("housekeeping/articles"); + tpl.set("housekeepingManager", HousekeepingManager.getInstance()); + + PlayerDetails playerDetails = (PlayerDetails) tpl.get("playerDetails"); + + if (article.getAuthorId() != playerDetails.getId()) { + if (!HousekeepingManager.getInstance().hasPermission(playerDetails.getRank(), "articles/delete_any")) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + } + + if (!HousekeepingManager.getInstance().hasPermission(playerDetails.getRank(), "articles/delete_own")) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + if (!client.get().contains("id")) { + client.session().set("alertColour", "danger"); + client.session().set("alertMessage", "There was no article selected to delete"); + } else if (!NewsDao.exists(client.get().getInt("id"))) { + client.session().set("alertColour", "danger"); + client.session().set("alertMessage", "The article does not exist"); + } else { + client.session().set("alertColour", "success"); + client.session().set("alertMessage", "Successfully deleted the article"); + NewsDao.delete(client.get().getInt("id")); + } + + + tpl.set("pageName", "Delete News"); + tpl.set("articles", NewsDao.getTop(NewsDateKey.ALL, MAX_NEWS_TO_DISPLAY, true, List.of(), 0)); + tpl.render(); + + // Delete alert after it's been rendered + client.session().delete("alertMessage"); + + } + + /** + * Handle the /housekeeping/articles/edit URI request + * + * @param client the connection + */ + public static void edit(WebConnection client) { + if (!client.session().getBoolean(SessionUtil.LOGGED_IN_HOUSKEEPING)) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + Template tpl = client.template("housekeeping/articles_edit"); + tpl.set("housekeepingManager", HousekeepingManager.getInstance()); + + PlayerDetails playerDetails = (PlayerDetails) tpl.get("playerDetails"); + + if (!HousekeepingManager.getInstance().hasPermission(playerDetails.getRank(), "articles/edit_own")) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + tpl.set("images", NewsDao.getTopStoryImages()); + + if (!client.get().contains("id")) { + client.session().set("alertColour", "danger"); + client.session().set("alertMessage", "There was no article selected to edit"); + } else if (!NewsDao.exists(client.get().getInt("id"))) { + client.session().set("alertColour", "danger"); + client.session().set("alertMessage", "The article does not exist"); + } else { + NewsArticle article = NewsDao.get(client.get().getInt("id")); + + if (article.getAuthorId() != playerDetails.getId()) { + if (!HousekeepingManager.getInstance().hasPermission(playerDetails.getRank(), "articles/edit_any")) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + } + + if (client.post().queries().size() > 0) { + long publishDate = DateUtil.getFromFormat("yyyy-MM-dd'T'HH:mm", client.post().getString("datePublished")); + + List categories = new ArrayList<>(); + + for (String data : client.post().getArray("categories[]")) { + var category = NewsManager.getInstance().getCategoryByLabel(data); + + if (category != null) { + categories.add(category); + } + } + + NewsDao.insertCategories(article.getId(), categories); + + article.setTitle(client.post().getString("title")); + article.setShortStory(client.post().getString("shortstory")); + article.setFullStory(client.post().getString("fullstory")); + article.setTopStory(client.post().getString("topstory")); + article.setTopstoryOverride(client.post().getString("topstoryOverride")); + article.setAuthorOverride(client.post().getString("authorOverride")); + article.setArticleImage(client.post().getString("articleimage")); + article.setPublished(client.post().getString("published").equals("true")); + article.setFuturePublished(client.post().getString("futurePublished").equals("true")); + article.setTimestamp(publishDate); + + article.getCategories().clear(); + article.getCategories().addAll(categories); + + NewsDao.save(article); + + client.session().set("alertColour", "success"); + client.session().set("alertMessage", "The article was successfully saved"); + } + + tpl.set("currentDate", DateUtil.getDate(article.getTimestamp(), "yyyy-MM-dd'T'HH:mm")); + tpl.set("article", article); + tpl.set("categories", NewsManager.getInstance().getCategories()); + } + + tpl.render(); + + // Delete alert after it's been rendered + client.session().delete("alertMessage"); + } + + public static void preview_news_article(WebConnection webConnection) { + if (!webConnection.post().contains("body")) { + webConnection.send(""); + return; + } + + webConnection.send(new HousekeepingUtil().formatNewsStory(webConnection.post().getString("body"))); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/housekeeping/HousekeepingRoomBadgesController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/housekeeping/HousekeepingRoomBadgesController.java new file mode 100644 index 0000000..4724979 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/housekeeping/HousekeepingRoomBadgesController.java @@ -0,0 +1,170 @@ +package org.alexdev.http.controllers.housekeeping; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.duckhttpd.template.Template; +import org.alexdev.havana.dao.mysql.BadgeDao; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.room.RoomManager; +import org.alexdev.havana.server.rcon.messages.RconHeader; +import org.alexdev.http.Routes; +import org.alexdev.http.game.housekeeping.HousekeepingManager; +import org.alexdev.http.util.HousekeepingUtil; +import org.alexdev.http.util.RconUtil; +import org.alexdev.http.util.SessionUtil; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class HousekeepingRoomBadgesController { + public static void badges(WebConnection client) { + if (!client.session().getBoolean(SessionUtil.LOGGED_IN_HOUSKEEPING)) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + Template tpl = client.template("housekeeping/room_badges"); + tpl.set("housekeepingManager", HousekeepingManager.getInstance()); + + PlayerDetails playerDetails = (PlayerDetails) tpl.get("playerDetails"); + + if (!HousekeepingManager.getInstance().hasPermission(playerDetails.getRank(), "room_badges")) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + try { + if (client.post().queries().size() > 0) { + Map> badges = new HashMap<>(); + + for (var kvp : client.post().getValues().entrySet()) { + String key = kvp.getKey(); + + if (!key.startsWith("roombadge-id-")) { + continue; + } + + String values = key.replace("roombadge-id-", ""); + + String[] data = values.split("_"); + int roomId = client.post().getInt("roomad-" + values + "-roomid"); + String badgeCode = client.post().getString("roomad-" + values + "-badge"); + + if (!badges.containsKey(roomId)) { + badges.put(roomId, new ArrayList<>()); + } + + badges.get(roomId).add(badgeCode); + } + + BadgeDao.updateBadges(badges); + sendRoomBadgeUpdate(); + + client.session().set("alertColour", "success"); + client.session().set("alertMessage", "All badge rooms have been saved successfully!"); + } + + } catch (Exception ex) { + client.session().set("alertColour", "danger"); + client.session().set("alertMessage", "Error occurred, make sure the room ID is a valid number"); + } + + RoomManager.getInstance(); + tpl.set("roomBadges", RoomManager.getInstance().getRoomEntryBadges()); + tpl.set("util", new HousekeepingUtil()); + tpl.render(); + + // Delete alert after it's been rendered + client.session().delete("alertMessage"); + } + + public static void delete(WebConnection client) { + if (!client.session().getBoolean(SessionUtil.LOGGED_IN_HOUSKEEPING)) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + Template tpl = client.template("housekeeping/room_badges"); + tpl.set("housekeepingManager", HousekeepingManager.getInstance()); + + PlayerDetails playerDetails = (PlayerDetails) tpl.get("playerDetails"); + + if (!HousekeepingManager.getInstance().hasPermission(playerDetails.getRank(), "room_badges")) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + if (client.post().queries().size() > 0) { + client.session().set("alertColour", "success"); + client.session().set("alertMessage", "All badge rooms have been saved successfully!"); + } + + if (!client.get().contains("id")) { + client.session().set("alertColour", "danger"); + client.session().set("alertMessage", "There was no badge selected to delete"); + } else { client.session().set("alertColour", "success"); + client.session().set("alertMessage", "Successfully deleted the badge"); + + String[] data = client.get().getString("id").split("_"); + BadgeDao.deleteRoomBadge(data[0], data[1]); + } + + sendRoomBadgeUpdate(); + + tpl.set("roomBadges", RoomManager.getInstance().getRoomEntryBadges()); + tpl.set("util", new HousekeepingUtil()); + tpl.render(); + + // Delete alert after it's been rendered + client.session().delete("alertMessage"); + } + + public static void create(WebConnection client) { + if (!client.session().getBoolean(SessionUtil.LOGGED_IN_HOUSKEEPING)) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + Template tpl = client.template("housekeeping/room_badges_create"); + tpl.set("housekeepingManager", HousekeepingManager.getInstance()); + + PlayerDetails playerDetails = (PlayerDetails) tpl.get("playerDetails"); + + if (!HousekeepingManager.getInstance().hasPermission(playerDetails.getRank(), "room_badges")) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + if (client.post().getValues().size() > 0) { + try { + BadgeDao.createEntryBadge( + client.post().getInt("roomid"), + client.post().getString("badgecode")); + + client.session().set("alertColour", "success"); + client.session().set("alertMessage", "Successfully created the room entry badge"); + + sendRoomBadgeUpdate(); + client.redirect("/" + Routes.HOUSEKEEPING_PATH + "/room_badges"); + + return; + } catch (Exception ex) { + client.session().set("alertColour", "danger"); + client.session().set("alertMessage", "Error occurred, make sure the room ID is a valid number"); + } + + } + + tpl.render(); + + + // Delete alert after it's been rendered + client.session().delete("alertMessage"); + } + + private static void sendRoomBadgeUpdate() { + RoomManager.getInstance().reloadBadges(); + RconUtil.sendCommand(RconHeader.REFRESH_ROOM_BADGES, new HashMap<>()); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/housekeeping/HousekeepingTransactionsController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/housekeeping/HousekeepingTransactionsController.java new file mode 100644 index 0000000..49f193b --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/housekeeping/HousekeepingTransactionsController.java @@ -0,0 +1,81 @@ +package org.alexdev.http.controllers.housekeeping; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.duckhttpd.template.Template; +import org.alexdev.havana.dao.mysql.TransactionDao; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.http.Routes; +import org.alexdev.http.game.housekeeping.HousekeepingManager; +import org.alexdev.http.util.SessionUtil; +import org.apache.commons.lang3.StringUtils; + +public class HousekeepingTransactionsController { + + /** + * Handle the /housekeeping/users/search URI request + * + * @param client the connection + */ + public static void search(WebConnection client) { + if (!client.session().getBoolean(SessionUtil.LOGGED_IN_HOUSKEEPING)) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + Template tpl = client.template("housekeeping/transaction_lookup"); + tpl.set("housekeepingManager", HousekeepingManager.getInstance()); + + PlayerDetails playerDetails = (PlayerDetails) tpl.get("playerDetails"); + + if (!HousekeepingManager.getInstance().hasPermission(playerDetails.getRank(), "transaction/lookup")) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + try { + if (client.post().getValues().size() > 0) { + var transactions = TransactionDao.getTransactionsPastMonth(client.post().getString("searchQuery"), true); + tpl.set("transactions", transactions); + } + + if (client.get().getValues().size() > 0) { + var transactions = TransactionDao.getTransactionsPastMonth(client.get().getString("searchQuery"), true); + tpl.set("transactions", transactions); + } + } catch (Exception ex) { + + } + + tpl.set("pageName", "Transaction Lookup"); + tpl.render(); + + // Delete alert after it's been rendered + client.session().delete("alertMessage"); + } + + public static void item_lookup(WebConnection client) { + if (!client.session().getBoolean(SessionUtil.LOGGED_IN_HOUSKEEPING)) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + Template tpl = client.template("housekeeping/transaction_item_lookup"); + tpl.set("housekeepingManager", HousekeepingManager.getInstance()); + + PlayerDetails playerDetails = (PlayerDetails) tpl.get("playerDetails"); + + if (!HousekeepingManager.getInstance().hasPermission(playerDetails.getRank(), "transaction/lookup")) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + var transactions = TransactionDao.getTransactionByItem(StringUtils.isNumeric(client.get().getString("id")) ? client.get().getInt("id") : 0); + tpl.set("transactions", transactions); + + tpl.set("pageName", "Transaction Lookup"); + tpl.render(); + + // Delete alert after it's been rendered + client.session().delete("alertMessage"); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/housekeeping/HousekeepingUsersController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/housekeeping/HousekeepingUsersController.java new file mode 100644 index 0000000..9983de1 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/housekeeping/HousekeepingUsersController.java @@ -0,0 +1,296 @@ +package org.alexdev.http.controllers.housekeeping; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.duckhttpd.template.Template; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.server.netty.NettyPlayerNetwork; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.http.Routes; +import org.alexdev.http.dao.housekeeping.HousekeepingPlayerDao; +import org.alexdev.http.game.housekeeping.HousekeepingManager; +import org.alexdev.http.util.SessionUtil; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.validator.routines.EmailValidator; + +import java.util.ArrayList; +import java.util.List; + +public class HousekeepingUsersController { + + /** + * Handle the /housekeeping/users/imitate/ URI request + * + * @param webConnection the connection + */ + public static void imitate(WebConnection webConnection) { + if (!webConnection.session().getBoolean(SessionUtil.LOGGED_IN_HOUSKEEPING)) { + webConnection.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + Template tpl = webConnection.template("housekeeping/users_create"); + tpl.set("housekeepingManager", HousekeepingManager.getInstance()); + + PlayerDetails playerDetails = PlayerDao.getDetails(webConnection.session().getInt("user.id")); + + if (!HousekeepingManager.getInstance().hasPermission(playerDetails.getRank(), "user/imitate")) { + webConnection.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + var playerName = webConnection.getMatches().get(0); + PlayerDetails player = PlayerDao.getDetails(playerName); + + if (playerName == null) + return; + + webConnection.session().set("authenticated", true); + webConnection.session().set("captcha.invalid", false); + webConnection.session().set("user.id", player.getId()); + webConnection.session().set("clientAuthenticate", false); + webConnection.session().set(SessionUtil.LOGGED_IN_HOUSKEEPING, false); + webConnection.session().set("lastRequest", String.valueOf(DateUtil.getCurrentTimeSeconds() + SessionUtil.REAUTHENTICATE_TIME)); + webConnection.redirect("/me"); + + } + + /** + * Handle the /housekeeping/users/search URI request + * + * @param client the connection + */ + public static void search(WebConnection client) { + if (!client.session().getBoolean(SessionUtil.LOGGED_IN_HOUSKEEPING)) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + Template tpl = client.template("housekeeping/users_search"); + tpl.set("housekeepingManager", HousekeepingManager.getInstance()); + + PlayerDetails playerDetails = (PlayerDetails) tpl.get("playerDetails"); + + if (!HousekeepingManager.getInstance().hasPermission(playerDetails.getRank(), "user/search")) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + if (client.post().queries().size() > 0) { + String[] fieldCheck = new String[]{"searchField", "searchQuery", "searchType" }; + + for (String field : fieldCheck) { + if (client.post().contains(field) && client.post().getString(field).length() > 0) { + continue; + } + + client.session().set("alertColour", "danger"); + client.session().set("alertMessage", "You need to enter all fields"); + tpl.render(); + + // Delete alert after it's been rendered + client.session().delete("alertMessage"); + return; + } + + String field = client.post().getString("searchField"); + String input = client.post().getString("searchQuery"); + String type = client.post().getString("searchType"); + + List whitelistColumns = new ArrayList<>(); + whitelistColumns.add("username"); + whitelistColumns.add("id"); + whitelistColumns.add("credits"); + whitelistColumns.add("pixels"); + whitelistColumns.add("mission"); + + List players = null; + + if (whitelistColumns.contains(field)) { + players = HousekeepingPlayerDao.search(type, field, input); + } else { + players = new ArrayList<>(); + } + + tpl.set("players", players); + } + + tpl.set("pageName", "Search Users"); + tpl.render(); + + // Delete alert after it's been rendered + client.session().delete("alertMessage"); + } + + /** + * Handle the /housekeeping/users/create URI request + * + * @param client the connection + */ + public static void create(WebConnection client) { + if (!client.session().getBoolean(SessionUtil.LOGGED_IN_HOUSKEEPING)) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + Template tpl = client.template("housekeeping/users_create"); + tpl.set("housekeepingManager", HousekeepingManager.getInstance()); + + PlayerDetails playerDetails = (PlayerDetails) tpl.get("playerDetails"); + + if (!HousekeepingManager.getInstance().hasPermission(playerDetails.getRank(), "user/create")) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + /*tpl.set("defaultFigure", Configuration.REGISTER_FIGURE); + tpl.set("defaultMission", Configuration.REGISTER_MOTTO); + tpl.set("defaultCredits", Configuration.REGISTER_CREDITS); + tpl.set("defaultDuckets", Configuration.REGISTER_DUCKETS);*/ + + if (client.post().queries().size() > 0) { + String[] fieldCheck = new String[]{"username", "password", "confirmpassword", "figure", "email", "mission"}; + + for (String field : fieldCheck) { + if (client.post().contains(field) && client.post().getString(field).length() > 0) { + continue; + } + + client.session().set("alertColour", "danger"); + client.session().set("alertMessage", "You need to enter all fields"); + } + + if (!client.session().contains("alertMessage")) { + client.session().set("alertColour", "warning"); + + /*if (PlayerDao.emailExists(client.post().get("email"), 0)) { + client.session().set("alertMessage", "The email chosen is already in use"); + + } else */ + if (!client.post().getString("password").equals(client.post().getString("confirmpassword"))) { + client.session().set("alertMessage", "The two passwords do not match"); + } else if (client.post().getString("password").length() < 6) { + client.session().set("alertMessage", "The password needs to be at least 6 or more characters"); + } else if (!EmailValidator.getInstance().isValid(client.post().getString("email"))) { + client.session().set("alertMessage", "The email entered is not valid"); + + } + } + + // Successful maybe? + if (client.post().queries().size() > 0 && !client.session().contains("alertMessage")) { + int userId = -1; + //int userId = PlayerDao.create(client.post().get("username"), client.post().get("email"), client.post().get("password"), client.post().get("mission"), client.post().get("figure")); + + client.session().set("alertColour", "success"); + client.session().set("alertMessage", "The new user has been successfully created. Click here to edit them."); + } + } + + tpl.set("pageName", "Create User"); + tpl.render(); + + // Delete alert after it's been rendered + client.session().delete("alertMessage"); + } + + /** + * Handle the /housekeeping/users/edit URI request + * + * @param client the connection + */ + public static void edit(WebConnection client) { + if (!client.session().getBoolean(SessionUtil.LOGGED_IN_HOUSKEEPING)) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + Template tpl = client.template("housekeeping/users_edit"); + tpl.set("housekeepingManager", HousekeepingManager.getInstance()); + + PlayerDetails playerDetails = (PlayerDetails) tpl.get("playerDetails"); + + if (!HousekeepingManager.getInstance().hasPermission(playerDetails.getRank(), "user/edit")) { + client.redirect("/" + Routes.HOUSEKEEPING_PATH); + return; + } + + if (!client.get().contains("id")) { + client.session().set("alertColour", "danger"); + client.session().set("alertMessage", "You did not select a user to edit"); + } + + if (client.post().queries().size() > 0) { + String[] fieldCheck = new String[]{"username", "figure", "email", "motto", "credits", "pixels"}; + + for (String field : fieldCheck) { + if (client.post().contains(field) && client.post().getString(field).length() > 0) { + continue; + } + + client.session().set("alertColour", "danger"); + client.session().set("alertMessage", "You need to enter all fields. The " + field + " field is missing."); + } + + if (!client.session().contains("alertMessage")) { + client.session().set("alertColour", "warning"); + + /*if (PlayerDao.emailExists(client.post().get("email"), client.get().getInt("id"))) { + client.session().set("alertMessage", "The email chosen is already in use"); + } else */ + + if (!EmailValidator.getInstance().isValid(client.post().getString("email"))) { + client.session().set("alertMessage", "The email entered is not valid"); + } else if (!StringUtils.isNumeric(client.post().getString("credits"))) { + client.session().set("alertMessage", "The value supplied for credits is not a number"); + } else if (!StringUtils.isNumeric(client.post().getString("pixels"))) { + client.session().set("alertMessage", "The value supplied for pixels is not a number"); + } + } + } + + PlayerDetails player = PlayerDao.getDetails(client.get().getInt("id")); + + if (player == null) { + client.session().set("alertColour", "danger"); + client.session().set("alertMessage", "The user does not exist"); + } else { + //Player session = client.session().get(SessionUtil.PLAYER, Player.class); + PlayerDetails session = PlayerDao.getDetails(client.session().getInt("user.id")); + + if (session.getRank().getRankId() <= player.getRank().getRankId()) { + client.session().set("alertColour", "danger"); + client.session().set("alertMessage", "You cannot edit someone that has a equal or higher rank than you"); + } else { + if (client.post().queries().size() > 0 && !client.session().contains("alertMessages")) { + player.setFigure(client.post().getString("figure")); + player.setMotto(client.post().getString("motto")); + player.setPixels(Integer.parseInt(client.post().getString("pixels"))); + player.setCredits(Integer.parseInt(client.post().getString("credits"))); + player.setEmail(client.post().getString("email")); + + PlayerDao.saveDetails(player.getId(), player.getFigure(), player.getPoolFigure(), player.getSex()); + PlayerDao.saveMotto(player.getId(), player.getMotto()); + PlayerDao.saveCurrency(player.getId(), player.getCredits(), player.getPixels()); + PlayerDao.saveEmail(player.getId(), player.getEmail()); + + client.session().set("alertColour", "success"); + client.session().set("alertMessage", "The user has been successfully saved"); + } + } + + tpl.set("playerId", player.getId()); + tpl.set("playerUsername", player.getName()); + tpl.set("playerEmail", player.getEmail()); + tpl.set("playerMotto", player.getMotto()); + tpl.set("playerPixels", player.getPixels()); + tpl.set("playerCredits", player.getCredits()); + tpl.set("playerFigure", player.getFigure()); + } + + tpl.set("pageName", "Edit User"); + tpl.render(); + + // Delete alert after it's been rendered + client.session().delete("alertMessage"); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/site/AccountController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/site/AccountController.java new file mode 100644 index 0000000..b4d4899 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/site/AccountController.java @@ -0,0 +1,351 @@ +package org.alexdev.http.controllers.site; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.havana.dao.mysql.*; +import org.alexdev.havana.game.alerts.AlertType; +import org.alexdev.havana.game.club.ClubSubscription; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.statistics.PlayerStatistic; +import org.alexdev.havana.game.player.statistics.PlayerStatisticManager; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.config.GameConfiguration; +import org.alexdev.http.dao.GroupDiscussionDao; +import org.alexdev.http.game.account.BeginnerGiftManager; +import org.alexdev.http.game.friends.FriendsFeed; +import org.alexdev.http.game.news.NewsArticle; +import org.alexdev.http.server.Watchdog; +import org.alexdev.http.util.*; + +import java.time.LocalDateTime; +import java.time.Period; +import java.util.List; +import java.util.UUID; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +public class AccountController { + public static void submit(WebConnection webConnection) { + XSSUtil.clear(webConnection); + + String username = HtmlUtil.removeHtmlTags(webConnection.post().getString("username")); + String password = HtmlUtil.removeHtmlTags(webConnection.post().getString("password")); + + if (SessionUtil.login(webConnection, username, password, true)) { + webConnection.redirect("/security_check"); + } else { + boolean rememberMe = webConnection.post().getString("_login_remember_me").equals("true"); + + var template = webConnection.template("account/submit"); + template.set("rememberMe", rememberMe ? "true" : "false"); + template.set("username", username); + template.render(); + } + } + + public static void securityCheck(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + //System.out.println("webconnection " + webConnection.getIpAddress() + " is not authenticated after submitting"); + webConnection.redirect("/"); + return; + } + + var template = webConnection.template("/security_check"); + template.set("redirectPath", webConnection.session().contains("lastBrowsedPage") ? webConnection.session().getString("lastBrowsedPage") : "/me"); + template.render(); + } + + public static void me(WebConnection webConnection) { + XSSUtil.clear(webConnection); + + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + var template = webConnection.template("me"); + PlayerDetails playerDetails = (PlayerDetails) template.get("playerDetails"); + + if (playerDetails == null) { + webConnection.session().delete("user.id"); + webConnection.session().delete("authenticated"); + webConnection.redirect("/"); + return; + } + + var pair = playerDetails.isBanned(); + + if (pair != null) { + webConnection.redirect("/account/banned"); + return; + } + + webConnection.session().set("page", "me"); // Set current page + webConnection.session().delete("captcha.invalid"); // Wipe any trace of making /register remember + + /*if (CacheManager.useCachePage(webConnection, "me")) { + webConnection.send(CacheManager.getPage(webConnection, "me")); + return; + }*/ + + if (playerDetails.hasClubSubscription()) { + template.set("hcDays", TimeUnit.SECONDS.toDays(playerDetails.getClubExpiration() - DateUtil.getCurrentTimeSeconds())); + } + + NewsArticle[] articles = new NewsArticle[5]; + + int i = 0; + + boolean includeUnpublished = template.get("playerDetails") != null && ((PlayerDetails)template.get("playerDetails")).getRank().getRankId() > 1; + List articleList = includeUnpublished ? Watchdog.NEWS_STAFF : Watchdog.NEWS; + + if (articleList == null) { + articleList = List.of(); + } + + for (var article : articleList) { + articles[i++] = article; + } + + for (i = 0; i < 5; i++) { + if (articles[i] == null) { + articles[i] = new NewsArticle(0, "No news", 0, "", "", "", DateUtil.getCurrentTimeSeconds(), "attention_topstory.png", "", "", "0", true, 0, false); + } + + template.set("article" + (i + 1), articles[i]); + } + + var alerts = AlertsDao.getAlerts(playerDetails.getId()); + var statisticsValues = PlayerStatisticsDao.getStatistics(playerDetails.getId()); + + if (statisticsValues.isEmpty()) { + PlayerStatisticsDao.newStatistics(playerDetails.getId(), UUID.randomUUID().toString()); + statisticsValues = PlayerStatisticsDao.getStatistics(playerDetails.getId()); + } + + var statistics = new PlayerStatisticManager(playerDetails.getId(), statisticsValues); + + template.set("newbieRoomLayout", statistics.getIntValue(PlayerStatistic.NEWBIE_ROOM_LAYOUT)); + template.set("newbieNextGift", statistics.getIntValue(PlayerStatistic.NEWBIE_GIFT)); + + if (statistics.getIntValue(PlayerStatistic.NEWBIE_ROOM_LAYOUT) > 0 && statistics.getIntValue(PlayerStatistic.NEWBIE_GIFT) > 0) { + int seconds = statistics.getIntValue(PlayerStatistic.NEWBIE_GIFT_TIME) - DateUtil.getCurrentTimeSeconds(); + + if (BeginnerGiftManager.progress(playerDetails, statistics)) { + seconds = statistics.getIntValue(PlayerStatistic.NEWBIE_GIFT_TIME) - DateUtil.getCurrentTimeSeconds(); + } + + if (seconds < 0) { + seconds = 0; + } + + template.set("newbieNextGift", statistics.getIntValue(PlayerStatistic.NEWBIE_GIFT)); + template.set("newbieGiftSeconds", seconds); + } + + if (playerDetails.hasClubSubscription()) { + if (alerts.stream().anyMatch(alert -> alert.getAlertType() == AlertType.HC_EXPIRED)) { + AlertsDao.deleteAlerts(playerDetails.getId(), AlertType.HC_EXPIRED); + } + } else if (alerts.stream().noneMatch(alert -> alert.getAlertType() == AlertType.HC_EXPIRED)) { + if (playerDetails.getFirstClubSubscription() > 0) { + AlertsDao.createAlert(playerDetails.getId(), AlertType.HC_EXPIRED, ""); + } + } + + if (playerDetails.getSelectedRoomId() == -1 && statistics.getIntValue(PlayerStatistic.NEWBIE_ROOM_LAYOUT) != -1) { + statistics.setLongValue(PlayerStatistic.NEWBIE_ROOM_LAYOUT, -1); + } + + if (playerDetails.formatJoinDate("MM/dd").equalsIgnoreCase(DateUtil.getDate(DateUtil.getCurrentTimeSeconds(), "MM/dd")) && + !(playerDetails.formatJoinDate("MM/dd/yyyy").equalsIgnoreCase(DateUtil.getDate(DateUtil.getCurrentTimeSeconds(), "MM/dd/yyy")))) { + LocalDateTime birthday = DateUtil.getDateTimeFromTimestamp(playerDetails.getJoinDate()); + LocalDateTime now = DateUtil.getDateTimeFromTimestamp(DateUtil.getCurrentTimeSeconds()); + + Period period = Period.between(birthday.toLocalDate(), now.toLocalDate()); + + template.set("hasBirthday", true); + template.set("birthdayAge", period.getYears()); + + if (String.valueOf(period.getYears()).endsWith("1")) { + template.set("birthdayPrefix", "st"); + } else if (String.valueOf(period.getYears()).endsWith("2")) { + template.set("birthdayPrefix", "nd"); + } else if (String.valueOf(period.getYears()).endsWith("3")) { + template.set("birthdayPrefix", "rd"); + } else { + template.set("birthdayPrefix", "th"); + } + } else { + template.set("hasBirthday", false); + } + + template.set("tags", TagDao.getUserTags(playerDetails.getId())); + template.set("lastOnline", DateUtil.getFriendlyDate(playerDetails.getLastOnline())); + template.set("tagRandomQuestion", TagUtil.getRandomQuestion()); + template.set("events", Watchdog.EVENTS);//EventsDao.getEvents()); + template.set("groups", GroupDao.getJoinedGroups(webConnection.session().getInt("user.id"))); + template.set("alerts", AlertsDao.getAlerts(playerDetails.getId()).stream().filter(alert -> !alert.isDisabled()).collect(Collectors.toList())); + template.set("recommendedGroups", Watchdog.RECOMMENDED_GROUPS);//RecommendedDao.getRecommendedGroups(false)); + template.set("staffPickGroups", Watchdog.STAFF_PICK_GROUPS); + + FriendsFeed.createFriendsOnline(webConnection, template); + MinimailController.appendMessages(webConnection, template, true, false, false, false, false, false); + + var pendingDetails = GroupMemberDao.getPendingMembers(playerDetails.getId()); + template.set("pendingMembers", pendingDetails.getKey()); + template.set("pendingGroups", pendingDetails.getValue()); + + var newGroupPosts = GroupDiscussionDao.getNewGroupMessages(playerDetails.getId(), playerDetails.getLastOnline()); + template.set("newPostsAmount", newGroupPosts.getKey()); + template.set("newPosts", newGroupPosts.getValue()); + template.set("unreadGuestbookMessages", statistics.getIntValue(PlayerStatistic.GUESTBOOK_UNREAD_MESSAGES)); + template.render(); + + ClubSubscription.countMemberDays(playerDetails, statistics); + //CacheManager.savePage(webConnection, "me", ((TwigTemplate)template).renderHTML(), (int) TimeUnit.SECONDS.toSeconds(15)); + //webConnection.send(CacheManager.getPage(webConnection, "me")); + + var ipAddress = webConnection.getIpAddress(); + var latestIpAddress = PlayerDao.getLatestIp(playerDetails.getId()); + + if (latestIpAddress == null || !latestIpAddress.equals(ipAddress)) { + PlayerDao.logIpAddress(playerDetails.getId(), ipAddress); + } + + if (!webConnection.cookies().exists(SessionUtil.MACHINE_ID) || !webConnection.cookies().get(SessionUtil.MACHINE_ID).equals(playerDetails.getMachineId())) { + if (!playerDetails.getMachineId().isBlank()) { + webConnection.cookies().set(SessionUtil.MACHINE_ID, playerDetails.getMachineId().replace("#", ""), 2, TimeUnit.DAYS); + } + } + } + + public static void welcome(WebConnection webConnection) { + XSSUtil.clear(webConnection); + + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + var template = webConnection.template("welcome"); + PlayerDetails playerDetails = (PlayerDetails) template.get("playerDetails"); + + var pair = playerDetails.isBanned(); + + if (pair != null) { + webConnection.redirect("/account/banned"); + return; + } + + if (!playerDetails.canSelectRoom()) { + webConnection.redirect("/me"); + return; + } + + // Set current page + webConnection.session().set("page", "welcome"); + template.render(); + } + + public static void reauthenticate(WebConnection webConnection) { + XSSUtil.clear(webConnection); + + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + if (webConnection.post().queries().size() > 0) { + PlayerDetails playerDetails = PlayerDao.getDetails(webConnection.session().getInt("user.id")); + + String username = playerDetails.getName(); + String password = webConnection.post().getString("password"); + + if (SessionUtil.login(webConnection, username, password, false)) { + webConnection.redirect(webConnection.session().contains("clientRequest") ? webConnection.session().getString("clientRequest") : "/me"); + return; + } + } + + // Set current page + webConnection.session().set("page", "reauthenticate"); + + var template = webConnection.template("account/reauthenticate"); + template.render(); + + // Delete alert after it's been rendered + webConnection.session().delete("alertMessage"); + + } + + public static void login_popup(WebConnection webConnection) { + // Set current page + webConnection.session().set("page", "login_popup"); + + var template = webConnection.template("account/login"); + template.render(); + + // Delete alert after it's been rendered + webConnection.session().delete("alertMessage"); + + } + + public static void banned(WebConnection webConnection) { + XSSUtil.clear(webConnection); + + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + webConnection.session().delete("lastBrowsedPage"); + + var template = webConnection.template("account/banned"); + PlayerDetails playerDetails = (PlayerDetails) template.get("playerDetails"); + + var pair = playerDetails.isBanned(); + + if (pair == null) { + webConnection.redirect("/me"); + return; + } + + // Set current page + webConnection.session().set("page", "banned"); + + String bannedMessage = String.format("You have been banned from %s. The reason for the ban is \"%s\". The ban will expire at %s.", + GameConfiguration.getInstance().getString("site.name"), + pair.getKey(), + DateUtil.getDate(pair.getValue(), DateUtil.LONG_DATE)); + + template.set("bannedMsg", bannedMessage); + template.render(); + + if (!webConnection.cookies().exists(SessionUtil.MACHINE_ID) || !webConnection.cookies().get(SessionUtil.MACHINE_ID).equals(playerDetails.getMachineId())) { + if (!playerDetails.getMachineId().isBlank()) { + webConnection.cookies().set(SessionUtil.MACHINE_ID, playerDetails.getMachineId().replace("#", ""), 2, TimeUnit.DAYS); + } + } + + // Delete user login session + SessionUtil.logout(webConnection); + + //webConnection.session().delete("user.id"); + //webConnection.session().delete("authenticated"); + } + + public static void logout(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + SessionUtil.logout(webConnection); + + // Set current page + webConnection.session().set("page", "logout"); + + var template = webConnection.template("account/logout"); + template.render(); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/site/ClientController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/site/ClientController.java new file mode 100644 index 0000000..fab0918 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/site/ClientController.java @@ -0,0 +1,209 @@ +package org.alexdev.http.controllers.site; + +import io.netty.handler.codec.http.FullHttpResponse; +import org.alexdev.duckhttpd.response.ResponseBuilder; +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.dao.mysql.PlayerStatisticsDao; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.statistics.PlayerStatistic; +import org.alexdev.havana.game.room.handlers.RoomSelectionHandler; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.config.GameConfiguration; +import org.alexdev.http.server.Watchdog; +import org.alexdev.http.util.SessionUtil; +import org.alexdev.http.util.XSSUtil; +import org.apache.commons.lang3.StringUtils; + +import java.sql.SQLException; +import java.text.NumberFormat; +import java.util.Locale; +import java.util.UUID; +import java.util.concurrent.TimeUnit; + +public class ClientController { + public static void client(WebConnection webConnection) throws SQLException { + XSSUtil.clear(webConnection); + + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/login_popup"); + return; + } + + webConnection.session().set("clientRequest", webConnection.request().uri()); + + if (webConnection.session().getBoolean("clientAuthenticate")) { + webConnection.redirect("/account/reauthenticate"); + return; + } + + boolean forwardRoom = false; + int forwardType = -1; + int forwardId = -1; + + var template = webConnection.template("client"); + PlayerDetails playerDetails = (PlayerDetails) template.get("playerDetails"); + + if (playerDetails == null) { + SessionUtil.logout(webConnection); + webConnection.redirect("/"); + return; + } + + var pair = playerDetails.isBanned(); + + if (pair != null) { + webConnection.redirect("/account/banned"); + return; + } + + if (webConnection.get().contains("createRoom") && StringUtils.isNumeric(webConnection.get().getString("createRoom"))) { + int roomType = Integer.parseInt(webConnection.get().getString("createRoom")); + boolean setGift = false; + + if (!playerDetails.canSelectRoom()) { + int roomLayout = (int) PlayerStatisticsDao.getStatisticLong(playerDetails.getId(), PlayerStatistic.NEWBIE_ROOM_LAYOUT); + + if (roomLayout == 0) { + if (!(roomType < 0 || roomType > 5)) { + setGift = true; + } + } + } else { + setGift = RoomSelectionHandler.selectRoom(playerDetails.getId(), roomType); + } + + if (setGift) { + PlayerStatisticsDao.updateStatistic(playerDetails.getId(), PlayerStatistic.NEWBIE_ROOM_LAYOUT, roomType + 1); + PlayerStatisticsDao.updateStatistic(playerDetails.getId(), PlayerStatistic.NEWBIE_GIFT, 1); + PlayerStatisticsDao.updateStatistic(playerDetails.getId(), PlayerStatistic.NEWBIE_GIFT_TIME, DateUtil.getCurrentTimeSeconds() + TimeUnit.DAYS.toSeconds(1)); + } + + playerDetails = PlayerDao.getDetails(webConnection.session().getInt("user.id")); + forwardRoom = true; + + forwardType = 2; // Private room + forwardId = playerDetails.getSelectedRoomId(); + } + + if (webConnection.get().contains("forwardId")) { + forwardRoom = true; + try { + forwardId = webConnection.get().getInt("roomId"); + forwardType = webConnection.get().getInt("forwardId"); + } catch (Exception ex) { + + } + } + + if (webConnection.get().contains("shortcut")) { + int redirectionId = 0; + + if (webConnection.get().getString("shortcut").equals("roomomatic")) { + redirectionId = 1; + } + + if (redirectionId > 0) { + template.set("shortcut", "shortcut.id=" + redirectionId + ";"); + } + } + + var ssoTicket = playerDetails.getSsoTicket(); + + // Update sso ticket + if (GameConfiguration.getInstance().getBoolean("reset.sso.after.login") || ssoTicket.isBlank()) { + ssoTicket = UUID.randomUUID().toString(); + PlayerDao.setTicket(webConnection.session().getInt("user.id"), ssoTicket); + } + + template.set("ssoTicket", ssoTicket); + template.set("forwardRoom", forwardRoom); + + if (forwardRoom) { + template.set("forward", ""); + template.set("forwardSub", "sw9=\"forward.type=" + forwardType + ";forward.id=" + forwardId + ";processlog.url=\""); + + template.set("forwardScript", ""); + template.set("forwardSubScript", "sw9=\\\"forward.type=" + forwardType + ";forward.id=" + forwardId + ";processlog.url=\\\""); + } + + template.render(); + } + + public static void clientInstallShockwave(WebConnection webConnection) { + XSSUtil.clear(webConnection); + + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/login_popup"); + return; + } + + var template = webConnection.template("client_install_shockwave"); + PlayerDetails playerDetails = (PlayerDetails) template.get("playerDetails"); + + var pair = playerDetails.isBanned(); + + if (pair != null) { + webConnection.redirect("/account/banned"); + return; + } + + template.render(); + } + + public static void updateHabboCount(WebConnection webConnection) { + FullHttpResponse httpResponse = ResponseBuilder.create(""); + httpResponse.headers().set("X-JSON", "{\"habboCountText\":\"" + NumberFormat.getNumberInstance(Locale.US).format(Watchdog.USERS_ONLNE) + " members online" + "\"}"); + webConnection.send(httpResponse); + } + + public static void blank(WebConnection webConnection) { + webConnection.send(""); + } + + public static void client_error(WebConnection webConnection) { + XSSUtil.clear(webConnection); + + var template = webConnection.template("client_error"); + + if (webConnection.session().getBoolean("authenticated")) { + PlayerDetails playerDetails = (PlayerDetails) template.get("playerDetails"); + + var pair = playerDetails.isBanned(); + + if (pair != null) { + webConnection.redirect("/account/banned"); + return; + } + } + + if (webConnection.get().contains("error_id")) { + template.set("errorId", webConnection.get().getString("error_id")); + } + + template.render(); + } + + public static void client_connection_failed(WebConnection webConnection) { + XSSUtil.clear(webConnection); + + var template = webConnection.template("client_connection_failed"); + + if (webConnection.session().getBoolean("authenticated")) { + PlayerDetails playerDetails = (PlayerDetails) template.get("playerDetails"); + + var pair = playerDetails.isBanned(); + + if (pair != null) { + webConnection.redirect("/account/banned"); + return; + } + } + + if (webConnection.get().contains("error_id")) { + template.set("errorId", webConnection.get().getString("error_id")); + } + + template.render(); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/site/ClubController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/site/ClubController.java new file mode 100644 index 0000000..0fd177b --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/site/ClubController.java @@ -0,0 +1,221 @@ +package org.alexdev.http.controllers.site; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.duckhttpd.template.Template; +import org.alexdev.havana.dao.mysql.PlayerStatisticsDao; +import org.alexdev.havana.game.catalogue.CatalogueManager; +import org.alexdev.havana.game.club.ClubSubscription; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.statistics.PlayerStatistic; +import org.alexdev.havana.game.player.statistics.PlayerStatisticManager; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.http.util.XSSUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.TimeUnit; + +public class ClubController { + public static void club(WebConnection webConnection) { + XSSUtil.clear(webConnection); + + webConnection.session().set("page", "credits"); + renderclub(webConnection); + } + + public static void renderclub(WebConnection webConnection) { + XSSUtil.clear(webConnection); + + var template = webConnection.template("club"); + + if (webConnection.session().getBoolean("authenticated")) { + var playerDetails = (PlayerDetails) template.get("playerDetails"); + var statistics = new PlayerStatisticManager(playerDetails.getId(), PlayerStatisticsDao.getStatistics(playerDetails.getId())); + ClubSubscription.countMemberDays(playerDetails, statistics); + } + + for (int i = 0; i < 3; i++) { + var choiceData = ClubSubscription.getChoiceData(i + 1); + + template.set("clubChoiceCredits" + (i + 1), choiceData.getKey()); + template.set("clubChoiceDays" + (i + 1), choiceData.getValue()); + } + + if (webConnection.session().getBoolean("authenticated")) { + PlayerDetails playerDetails = (PlayerDetails) template.get("playerDetails"); + PlayerStatisticManager statisticManager = new PlayerStatisticManager(playerDetails.getId(), PlayerStatisticsDao.getStatistics(playerDetails.getId())); + + if (playerDetails.hasClubSubscription()) { + template.set("hcDays", TimeUnit.SECONDS.toDays(playerDetails.getClubExpiration() - DateUtil.getCurrentTimeSeconds())); + + int days = (int) TimeUnit.SECONDS.toDays(statisticManager.getLongValue(PlayerStatistic.CLUB_MEMBER_TIME)); + int sinceMonths = days > 0 ? days / 31 : 0;//(int) (now - player.getDetails().getFirstClubSubscription()) / 60 / 60 / 24 / 31; + + template.set("hcSinceMonths", sinceMonths); + } + } + + appendgiftdata(template, webConnection.session().contains("lastClubGiftMonth") ? webConnection.session().getInt("lastClubGiftMonth") : 1, 0, webConnection); + template.render(); + } + + + public static void habboClubGift(WebConnection connection) { + if (!connection.post().contains("month") || + !connection.post().contains("catalogpage")) { + connection.send(""); + return; + } + + if (!StringUtils.isNumeric(connection.post().getString("month")) || + !StringUtils.isNumeric(connection.post().getString("catalogpage"))) { + connection.send(""); + return; + } + + int month = connection.post().getInt("month"); + int catalogpage = connection.post().getInt("catalogpage"); + + var template = connection.template("habblet/habboclubgift"); + appendgiftdata(template, month, catalogpage, connection); + template.render(); + } + + private static void appendgiftdata(Template template, int month, int catalogpage, WebConnection connection) { + XSSUtil.clear(connection); + + var giftOrder = new ArrayList<>(Arrays.asList(ClubSubscription.getGiftOrder())); + giftOrder.add(0, "club_sofa"); + + int position = month - 1; + + if (position >= giftOrder.size()) { + position = 0; + } + + var nextSpriteGift = giftOrder.get(0); + + try { + nextSpriteGift = giftOrder.get(position); + } catch (Exception ex) { } + + List pages = new ArrayList<>(); + + catalogpage = 0; + + if (month >= 5 && month <= 8) { + catalogpage = 1; + } + + if (month >= 9 && month <= 12) { + catalogpage = 2; + } + + if (month >= 13 && month <= 16) { + catalogpage = 3; + } + + if (month >= 17 && month <= 20) { + catalogpage = 4; + } + + if (month >= 21 && month <= 23) { + catalogpage = 5; + } + + if (catalogpage == 0) { + pages.add(1); + pages.add(2); + pages.add(3); + pages.add(4); + pages.add(5); + } + + if (catalogpage == 1) { + pages.add(5); + pages.add(6); + pages.add(7); + pages.add(8); + pages.add(9); + } + + if (catalogpage == 2) { + pages.add(9); + pages.add(10); + pages.add(11); + pages.add(12); + pages.add(13); + } + + if (catalogpage == 3) { + pages.add(13); + pages.add(14); + pages.add(15); + pages.add(16); + pages.add(17); + } + + if (catalogpage == 4) { + pages.add(17); + pages.add(18); + pages.add(19); + pages.add(20); + pages.add(21); + } + + if (catalogpage == 5) { + pages.add(19); + pages.add(20); + pages.add(21); + pages.add(22); + pages.add(23); + } + + var definition = CatalogueManager.getInstance().getCatalogueItem(nextSpriteGift); + + template.set("pages", pages); + template.set("currentPage", month); + template.set("lastPage", giftOrder.size()); + + if (definition.getDefinition() == null) { + template.set("item", definition.getPackages().get(0).getDefinition()); + } else { + template.set("item", definition.getDefinition()); + } + + connection.session().set("lastClubGiftMonth", month); + } + + public static void clubTryout(WebConnection webConnection) { + var template = webConnection.template("club_tryout"); + + for (int i = 0; i < 3; i++) { + var choiceData = ClubSubscription.getChoiceData(i + 1); + + template.set("clubChoiceCredits" + (i + 1), choiceData.getKey()); + template.set("clubChoiceDays" + (i + 1), choiceData.getValue()); + } + + if (webConnection.session().getBoolean("authenticated")) { + PlayerDetails playerDetails = (PlayerDetails) template.get("playerDetails"); + PlayerStatisticManager statisticManager = new PlayerStatisticManager(playerDetails.getId(), PlayerStatisticsDao.getStatistics(playerDetails.getId())); + + if (playerDetails.hasClubSubscription()) { + template.set("hcDays", TimeUnit.SECONDS.toDays(playerDetails.getClubExpiration() - DateUtil.getCurrentTimeSeconds())); + + int days = (int) TimeUnit.SECONDS.toDays(statisticManager.getLongValue(PlayerStatistic.CLUB_MEMBER_TIME)); + int sinceMonths = days > 0 ? days / 31 : 0;//(int) (now - player.getDetails().getFirstClubSubscription()) / 60 / 60 / 24 / 31; + + template.set("hcSinceMonths", sinceMonths); + } + + template.set("figure", playerDetails.getFigure()); + template.set("sex", playerDetails.getSex()); + } + + webConnection.session().set("page", "credits"); + template.render(); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/site/CollectablesController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/site/CollectablesController.java new file mode 100644 index 0000000..9513498 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/site/CollectablesController.java @@ -0,0 +1,154 @@ +package org.alexdev.http.controllers.site; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.havana.dao.mysql.CurrencyDao; +import org.alexdev.havana.dao.mysql.TransactionDao; +import org.alexdev.havana.game.catalogue.CatalogueManager; +import org.alexdev.havana.game.catalogue.collectables.CollectableData; +import org.alexdev.havana.game.catalogue.collectables.CollectablesManager; +import org.alexdev.havana.game.item.ItemManager; +import org.alexdev.havana.game.item.base.ItemDefinition; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.messages.incoming.catalogue.GRPC; +import org.alexdev.havana.server.rcon.messages.RconHeader; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.config.GameConfiguration; +import org.alexdev.http.game.collectables.CollectableEntry; +import org.alexdev.http.util.RconUtil; +import org.alexdev.http.util.XSSUtil; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.stream.Collectors; + +public class CollectablesController { + public static void collectables(WebConnection webConnection) { + XSSUtil.clear(webConnection); + + int pageId = GameConfiguration.getInstance().getInteger("collectables.page"); + CollectableData collectablesData = CollectablesManager.getInstance().getCollectableDataByPage(pageId); + + webConnection.session().set("page", "credits"); + + var template = webConnection.template("collectables"); + template.set("hasCollectable", (collectablesData != null)); + + List entries = new ArrayList<>(); + + if (collectablesData != null) { + collectablesData.checkCycle(); + + template.set("collectableSprite", collectablesData.getActiveItem().getDefinition().getSprite()); + template.set("collectableName", collectablesData.getActiveItem().getDefinition().getName()); + template.set("collectableDescription", collectablesData.getActiveItem().getDefinition().getDescription()); + template.set("expireSeconds", collectablesData.getExpiry() - DateUtil.getCurrentTimeSeconds()); + + + for (String sprite : collectablesData.getSprites()) { + ItemDefinition definition = ItemManager.getInstance().getDefinitionBySprite(sprite); + entries.add(new CollectableEntry(sprite, definition.getName(), definition.getDescription())); + } + } + + template.set("collectablesShowroom", entries); + template.render(); + } + + public static void confirm(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int pageId = GameConfiguration.getInstance().getInteger("collectables.page"); + CollectableData collectablesData = CollectablesManager.getInstance().getCollectableDataByPage(pageId); + + if (collectablesData == null) { + webConnection.redirect("/"); + return; + } + + var template = webConnection.template("habblet/collectiblesConfirm"); + + template.set("collectableName", collectablesData.getActiveItem().getDefinition().getName()); + template.set("collectableCost", collectablesData.getActiveItem().getPriceCoins()); + + template.render(); + } + + public static void purchase(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + var template = webConnection.template("habblet/collectiblesPurchase"); + PlayerDetails playerDetails = (PlayerDetails) template.get("playerDetails"); + + var pair = playerDetails.isBanned(); + + if (pair != null) { + webConnection.redirect("/account/banned"); + return; + } + + int pageId = GameConfiguration.getInstance().getInteger("collectables.page"); + CollectableData collectablesData = CollectablesManager.getInstance().getCollectableDataByPage(pageId); + + if (collectablesData == null) { + webConnection.redirect("/"); + return; + } + + + if (playerDetails.getCredits() >= collectablesData.getActiveItem().getPriceCoins() && + playerDetails.getPixels() >= collectablesData.getActiveItem().getPricePixels()) { + + if (collectablesData.getActiveItem().getPriceCoins() > 0) { + CurrencyDao.decreaseCredits(playerDetails, collectablesData.getActiveItem().getPriceCoins()); + } + + if (collectablesData.getActiveItem().getPricePixels() > 0) { + CurrencyDao.decreasePixels(playerDetails, collectablesData.getActiveItem().getPricePixels()); + } + + template.set("message", "You've successfully bought a " + collectablesData.getActiveItem().getDefinition().getName()); + + + try { + var items = CatalogueManager.getInstance().purchase(playerDetails, collectablesData.getActiveItem(), "", "", DateUtil.getCurrentTimeSeconds()); + + String transactionDscription = GRPC.getTransactionDescription(collectablesData.getActiveItem()); + + if (transactionDscription != null) { + TransactionDao.createTransaction(playerDetails.getId(), + items.stream().map(e -> String.valueOf(e.getDatabaseId())).collect(Collectors.joining(",")), + collectablesData.getActiveItem().getId() + "", + collectablesData.getActiveItem().getAmount(), + "Collectable " + transactionDscription, + collectablesData.getActiveItem().getPriceCoins(), collectablesData.getActiveItem().getPricePixels(), true); + } + + } catch (Exception ex) { + template.set("message", "Purchasing the collectable failed due to system error"); + } + + RconUtil.sendCommand(RconHeader.REFRESH_HAND, new HashMap<>() {{ + put("userId", playerDetails.getId()); + }}); + + RconUtil.sendCommand(RconHeader.REFRESH_CREDITS, new HashMap<>() {{ + put("userId", playerDetails.getId()); + }}); + } else { + if (collectablesData.getActiveItem().getPricePixels() > playerDetails.getPixels()) { + template.set("message", "Purchasing the collectable failed. You don't have enough pixels."); + } else { + template.set("message", "Purchasing the collectable failed. You don't have enough credits."); + } + } + + template.render(); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/site/CommunityController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/site/CommunityController.java new file mode 100644 index 0000000..ced764c --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/site/CommunityController.java @@ -0,0 +1,60 @@ +package org.alexdev.http.controllers.site; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.http.game.news.NewsArticle; +import org.alexdev.http.server.Watchdog; +import org.alexdev.http.util.XSSUtil; + +import java.util.List; + +public class CommunityController { + public static void community(WebConnection webConnection) { + XSSUtil.clear(webConnection); + var template = webConnection.template("community"); + + if (!webConnection.session().contains("authenticated")) { + return; + } + + /* + if (CacheManager.useCachePage(webConnection, "community")) { + webConnection.send(CacheManager.getPage(webConnection, "community")); + return; + } + */ + //boolean includeUnpublished = template.get("playerDetails") != null && ((PlayerDetails)template.get("playerDetails")).getRank().getRankId() > 1; + NewsArticle[] articles = new NewsArticle[5]; + + int i = 0; + List articleList = /*includeUnpublished ? Watchdog.NEWS_STAFF : */Watchdog.NEWS; + + for (var article : articleList) { + articles[i++] = article; + } + + for (i = 0; i < 5; i++) { + if (articles[i] == null) { + articles[i] = new NewsArticle(0,"No news", 0, "", "","", DateUtil.getCurrentTimeSeconds(), "attention_topstory.png", "", "", "0", true, 0, false); + } + + template.set("article" + (i + 1), articles[i]); + } + + webConnection.session().set("page", "community"); + + template.set("recommendedRooms", Watchdog.RECOMMENDED_ROOMS); + template.set("hiddenRecommendedRooms", Watchdog.HIDDEN_RECOMMENDED_ROOMS); + template.set("randomHabbos", PlayerDao.getRandomHabbos(18)); + template.set("tagCloud", Watchdog.TAG_CLOUD_10); + template.set("recentTopics", Watchdog.RECENT_DISCUSSIONS); + template.set("recentHiddenTopics", Watchdog.NEXT_RECENT_DISCUSSIONS); + + template.render(); + + //CacheManager.savePage(webConnection, "community", ((TwigTemplate)template).renderHTML(), 15); + //webConnection.send(CacheManager.getPage(webConnection, "community")); + } + +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/site/CreditsController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/site/CreditsController.java new file mode 100644 index 0000000..eacf099 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/site/CreditsController.java @@ -0,0 +1,99 @@ +package org.alexdev.http.controllers.site; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.havana.dao.mysql.TransactionDao; +import org.alexdev.havana.game.item.Transaction; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.http.util.XSSUtil; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +public class CreditsController { + public static void credits(WebConnection webConnection) { + XSSUtil.createKey(webConnection, "/credits"); + + var template = webConnection.template("credits"); + webConnection.session().set("page", "credits"); + template.render(); + } + + public static void transactions(WebConnection webConnection) { + XSSUtil.clear(webConnection); + + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + Calendar presentDayCalendar = Calendar.getInstance(); + Calendar currentCalendar = Calendar.getInstance(); + Calendar futureCalendar = Calendar.getInstance(); + Calendar previousCalendar = Calendar.getInstance(); + + var template = webConnection.template("credits_history"); + var details = (PlayerDetails) template.get("playerDetails"); + + int userId = details.getId(); + boolean viewAll = false; + + if (details.getRank().getRankId() >= PlayerRank.MODERATOR.getRankId()) { + viewAll = true; + + try { + if (webConnection.get().contains("userId")) + userId = webConnection.get().getInt("userId"); + } catch (Exception ex) { + + } + } + + boolean hasDateParameter = webConnection.get().contains("period") && DateUtil.getFromFormat("yyyy-MM-dd", webConnection.get().getString("period")) > 0; + List transactionsThisMonth = null; + + + if (hasDateParameter) { + long time = DateUtil.getFromFormat("yyyy-MM-dd", webConnection.get().getString("period")); + + currentCalendar.setTimeInMillis(time * 1000); + futureCalendar.setTimeInMillis(time * 1000); + previousCalendar.setTimeInMillis(time * 1000); + } + + previousCalendar.add(Calendar.MONTH, -1); + futureCalendar.add(Calendar.MONTH, 1); + + int year = currentCalendar.get(Calendar.YEAR); + int month = currentCalendar.get(Calendar.MONTH) + 1; + transactionsThisMonth = TransactionDao.getTransactions(userId, month, year, viewAll); + + template.set("canGoNext", currentCalendar.get(Calendar.MONTH) != presentDayCalendar.get(Calendar.MONTH) || currentCalendar.get(Calendar.YEAR) != (presentDayCalendar.get(Calendar.YEAR))); + + String previousMonth = new SimpleDateFormat("MMMM").format(previousCalendar.getTime()); + int previousYear = previousCalendar.get(Calendar.YEAR); + int previousNumericalMonth = previousCalendar.get(Calendar.MONTH) + 1; + + template.set("previousYear", previousYear); + template.set("previousMonth", previousMonth); + template.set("previousNumericalMonth", previousNumericalMonth); + + String futureMonth = new SimpleDateFormat("MMMM").format(futureCalendar.getTime()); + int futureYear = futureCalendar.get(Calendar.YEAR); + int futureNumericalMonth = futureCalendar.get(Calendar.MONTH) + 1; + + template.set("futureYear", futureYear); + template.set("futureMonth", futureMonth); + template.set("futureNumericalMonth", futureNumericalMonth); + + webConnection.session().set("page", "credits"); + + template.set("currentYear", year); + template.set("currentMonth", new SimpleDateFormat("MMMM").format(currentCalendar.getTime())); + + template.set("transactions", transactionsThisMonth); + template.render(); + } +} \ No newline at end of file diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/site/FaqController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/site/FaqController.java new file mode 100644 index 0000000..afec068 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/site/FaqController.java @@ -0,0 +1,13 @@ +package org.alexdev.http.controllers.site; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.http.util.XSSUtil; + +public class FaqController { + public static void faq(WebConnection webConnection) { + XSSUtil.clear(webConnection); + + var template = webConnection.template("faq"); + template.render(); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/site/FriendManagementController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/site/FriendManagementController.java new file mode 100644 index 0000000..9ab0789 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/site/FriendManagementController.java @@ -0,0 +1,287 @@ +package org.alexdev.http.controllers.site; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.duckhttpd.template.Template; +import org.alexdev.havana.dao.mysql.MessengerDao; +import org.alexdev.havana.game.messenger.MessengerCategory; +import org.alexdev.havana.game.messenger.MessengerUser; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.server.rcon.messages.RconHeader; +import org.alexdev.http.dao.FriendManagementDao; +import org.alexdev.http.util.RconUtil; +import org.alexdev.http.util.XSSUtil; + +import java.util.*; +import java.util.stream.Collectors; + +public class FriendManagementController { + public static void friendmanagement(Template template, WebConnection webConnection, int limit, int currentPage, int categoryId, String searchString) { + XSSUtil.clear(webConnection); + + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + PlayerDetails playerDetails = (PlayerDetails) template.get("playerDetails"); + + var friendsCount = 0; + List friends = new ArrayList<>(); + + if (searchString != null) { + friends = FriendManagementDao.getFriendsSearch(playerDetails.getId(), searchString, currentPage, limit).stream() + .sorted(Comparator.comparingLong(MessengerUser::getLastOnline).reversed()) + .collect(Collectors.toList()); + friendsCount = FriendManagementDao.getFriendsCount(playerDetails.getId(), searchString); + } else { + friends = FriendManagementDao.getFriends(playerDetails.getId(), currentPage, limit).stream() + .sorted(Comparator.comparingLong(MessengerUser::getLastOnline).reversed()) + .collect(Collectors.toList()); + friendsCount = FriendManagementDao.getFriendsCount(playerDetails.getId()); + } + + + int pages = friendsCount > 0 ? (int) Math.ceil((double)friendsCount / (double)limit) : 0; + + if (pages == 0) { + pages = 1; + } + + var categories = MessengerDao.getCategories(playerDetails.getId()); + categories.sort(Comparator.comparingInt(MessengerCategory::getId)); + + friends.forEach(friend -> { + if (categories.stream().noneMatch(category -> friend.getCategoryId() == category.getId())) { + friend.setCategoryId(0); + MessengerDao.updateFriendCategory(playerDetails.getId(), friend.getUserId(), 0); + } + }); + + if (categoryId > -1) { + friends = friends.stream().filter(friend -> friend.getCategoryId() == categoryId).collect(Collectors.toList()); + } + + template.set("friends", friends); + template.set("categories", categories); + template.set("currentPage", currentPage); + template.set("pageLimit", limit); + + if (currentPage >= 2) { + template.set("firstPage", 1); + } else { + template.set("firstPage", -1); + } + + if (currentPage > 1) { + template.set("previousPage", currentPage - 1); + } else { + template.set("previousPage", -1); + } + + if (pages >= (currentPage + 1)) { + template.set("nextPage", currentPage + 1); + } else { + template.set("nextPage", -1); + } + + if (pages >= (currentPage + 2)) { + template.set("lastPage", pages); + } else { + template.set("lastPage", -1); + } + } + + public static void editCategory(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + var template = webConnection.template("profile/profile_widgets/friend_category_widget"); + PlayerDetails playerDetails = (PlayerDetails) template.get("playerDetails"); + + String newName = webConnection.post().getString("name"); + int categoryId = webConnection.post().getInt("categoryId"); + + if (!newName.isBlank()) { + MessengerDao.updateCategory(newName, categoryId, playerDetails.getId()); + } + + RconUtil.sendCommand(RconHeader.REFRESH_MESSENGER_CATEGORIES, new HashMap<>() {{ + put("userId", playerDetails.getId()); + }}); + + var categories = MessengerDao.getCategories(playerDetails.getId()); + categories.sort(Comparator.comparingInt(MessengerCategory::getId)); + + template.set("categories", categories); + template.render(); + } + + public static void createcategory(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + var template = webConnection.template("profile/profile_widgets/friend_category_widget"); + PlayerDetails playerDetails = (PlayerDetails) template.get("playerDetails"); + + String newName = webConnection.post().getString("name"); + + if (!newName.isBlank()) { + if (newName.length() > 50) { + newName = newName.substring(0, 50); + } + + MessengerDao.addCategory(newName, playerDetails.getId()); + } + + RconUtil.sendCommand(RconHeader.REFRESH_MESSENGER_CATEGORIES, new HashMap<>() {{ + put("userId", playerDetails.getId()); + }}); + + var categories = MessengerDao.getCategories(playerDetails.getId()); + categories.sort(Comparator.comparingInt(MessengerCategory::getId)); + + template.set("categories", categories); + template.render(); + } + + public static void deletecategory(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + var template = webConnection.template("profile/profile_widgets/friend_category_widget"); + PlayerDetails playerDetails = (PlayerDetails) template.get("playerDetails"); + + int categoryId = webConnection.post().getInt("categoryId"); + MessengerDao.deleteCategory(categoryId, playerDetails.getId()); + + RconUtil.sendCommand(RconHeader.REFRESH_MESSENGER_CATEGORIES, new HashMap<>() {{ + put("userId", playerDetails.getId()); + }}); + + var categories = MessengerDao.getCategories(playerDetails.getId()); + categories.sort(Comparator.comparingInt(MessengerCategory::getId)); + + MessengerDao.resetFriendCategories(playerDetails.getId(), categoryId); + + template.set("categories", categories); + template.render(); + } + + public static void viewCategory(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int pageNumber = webConnection.get().contains("pageNumber") ? webConnection.get().getInt("pageNumber") : 1; + int pageSize = webConnection.get().getInt("pageSize"); + int categoryId = webConnection.get().contains("categoryId") ? webConnection.get().getInt("categoryId") : -1; + String searchString = webConnection.get().contains("searchString") ? webConnection.get().getString("searchString") : null; + + if (webConnection.get().queries().size() == 0) { + pageSize = webConnection.post().getInt("pageSize"); + searchString = webConnection.post().contains("searchString") ? webConnection.post().getString("searchString") : null; + } + + if (pageSize > 100 || pageSize <= 0) { + pageSize = 30; + } + + if (pageNumber <= 0) { + pageNumber = 1; + } + + Template template = webConnection.template("profile/profile_widgets/friend_view_category"); + friendmanagement(template, webConnection, pageSize, pageNumber, categoryId, searchString); + template.render(); + } + + public static void updateCategoryOptions(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + Template template = webConnection.template("profile/profile_widgets/friend_category_options"); + PlayerDetails playerDetails = (PlayerDetails) template.get("playerDetails"); + + template.set("categories", MessengerDao.getCategories(playerDetails.getId())); + template.render(); + } + + public static void movefriends(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int pageSize = webConnection.post().getInt("pageSize"); + int categoryId = webConnection.post().contains("moveCategoryId") ? webConnection.post().getInt("moveCategoryId") : -1; + + if (pageSize > 100 || pageSize <= 0) { + pageSize = 30; + } + + Template template = webConnection.template("profile/profile_widgets/friend_view_category"); + PlayerDetails playerDetails = (PlayerDetails) template.get("playerDetails"); + + if (webConnection.post().contains("friendList[]")) { + for (String value : webConnection.post().getArray("friendList[]")) { + try { + int userId = Integer.parseInt(value); + MessengerDao.updateFriendCategory(playerDetails.getId(), userId, categoryId); + } catch (Exception ex) { + + } + } + } + + RconUtil.sendCommand(RconHeader.REFRESH_MESSENGER_CATEGORIES, new HashMap<>() {{ + put("userId", playerDetails.getId()); + }}); + + friendmanagement(template, webConnection, pageSize, 1, categoryId, null); + template.render(); + } + + public static void deletefriends(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + Template template = webConnection.template("profile/profile_widgets/friend_view_category"); + PlayerDetails playerDetails = (PlayerDetails) template.get("playerDetails"); + + if (webConnection.post().contains("friendList[]")) { + for (String value : webConnection.post().getArray("friendList[]")) { + int userId = Integer.parseInt(value); + + MessengerDao.removeFriend(playerDetails.getId(), userId); + MessengerDao.removeFriend(userId, playerDetails.getId()); + } + + } + + if (webConnection.post().contains("friendId")) { + int userId = webConnection.post().getInt("friendId"); + + MessengerDao.removeFriend(playerDetails.getId(), userId); + MessengerDao.removeFriend(userId, playerDetails.getId()); + } + + RconUtil.sendCommand(RconHeader.REFRESH_MESSENGER_CATEGORIES, new HashMap<>() {{ + put("userId", playerDetails.getId()); + }}); + + + friendmanagement(template, webConnection, 30, 1, -1, null); + template.render(); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/site/GamesController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/site/GamesController.java new file mode 100644 index 0000000..2fcfa8f --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/site/GamesController.java @@ -0,0 +1,128 @@ +package org.alexdev.http.controllers.site; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.duckhttpd.template.Template; +import org.alexdev.havana.dao.mysql.HighscoreDao; +import org.alexdev.havana.game.games.enums.GameType; +import org.alexdev.http.util.XSSUtil; +import org.apache.commons.lang3.StringUtils; + +public class GamesController { + private static final int HIGHSCORES_LIMIT = 10; + + public static void games(WebConnection webConnection) { + XSSUtil.clear(webConnection); + + var template = webConnection.template("games"); + + if (!webConnection.session().contains("highscoreGameId")) { + webConnection.session().set("highscoreGameId", "1"); + } + + GameType gameType = GameType.BATTLEBALL; + int gameId = webConnection.session().getInt("highscoreGameId"); + + if (gameId == 1) { + gameType = GameType.BATTLEBALL; + } + + if (gameId == 2) { + gameType = GameType.SNOWSTORM; + } + + if (gameId == 0) { + gameType = GameType.WOBBLE_SQUABBLE; + } + + webConnection.session().set("gameScoreViewMonthly", true); + + webConnection.session().set("page", "games"); + appendpersonalhighscores(template, gameType, 1, gameId, webConnection.session().getBoolean("gameScoreViewMonthly")); + template.render(); + } + + public static void games_all_time(WebConnection webConnection) { + XSSUtil.clear(webConnection); + + var template = webConnection.template("games"); + + if (!webConnection.session().contains("highscoreGameId")) { + webConnection.session().set("highscoreGameId", "1"); + } + + GameType gameType = GameType.BATTLEBALL; + int gameId = webConnection.session().getInt("highscoreGameId"); + + if (gameId == 1) { + gameType = GameType.BATTLEBALL; + } + + if (gameId == 2) { + gameType = GameType.SNOWSTORM; + } + + if (gameId == 0) { + gameType = GameType.WOBBLE_SQUABBLE; + } + + webConnection.session().set("gameScoreViewMonthly", false); + + webConnection.session().set("page", "games"); + appendpersonalhighscores(template, gameType, 1, gameId, webConnection.session().getBoolean("gameScoreViewMonthly")); + template.render(); + } + + private static void appendpersonalhighscores(Template template, GameType gameType, int pageNumber, int gameId, boolean viewMonthly) { + template.set("scoreEntries", HighscoreDao.getScores(GamesController.HIGHSCORES_LIMIT, gameType, pageNumber, viewMonthly)); + template.set("gameId", gameId); + template.set("pageNumber", pageNumber); + template.set("viewMonthlyScores", viewMonthly); + + boolean hasNextPage = false; + + if (HighscoreDao.getScores(GamesController.HIGHSCORES_LIMIT, gameType, pageNumber + 1, viewMonthly).size() > 0) { + hasNextPage = true; + } + + template.set("hasNextPage", hasNextPage); + } + + public static void personalhighscores(WebConnection webConnection) { + var template = webConnection.template("habblet/personalhighscores"); + + int pageNumber = 1; + + if (webConnection.post().contains("pageNumber") && StringUtils.isNumeric(webConnection.post().getString("pageNumber"))) { + pageNumber = webConnection.post().getInt("pageNumber"); + + if (pageNumber < 1) { + pageNumber = 1; + } + } + + int gameId = 1; + GameType gameType = GameType.BATTLEBALL; + + if (webConnection.post().contains("gameId") && StringUtils.isNumeric(webConnection.post().getString("gameId"))) { + gameId = webConnection.post().getInt("gameId"); + + if (gameId == 1) { + gameType = GameType.BATTLEBALL; + } + + if (gameId == 2) { + gameType = GameType.SNOWSTORM; + } + + if (gameId == 0) { + gameType = GameType.WOBBLE_SQUABBLE; + } + + webConnection.session().set("highscoreGameId", String.valueOf(gameId)); + } + + appendpersonalhighscores(template, gameType, pageNumber, gameId, webConnection.session().getBoolean("gameScoreViewMonthly")); + template.render(); + } + +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/site/HomepageController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/site/HomepageController.java new file mode 100644 index 0000000..5d078d3 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/site/HomepageController.java @@ -0,0 +1,42 @@ +package org.alexdev.http.controllers.site; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.config.GameConfiguration; +import org.alexdev.http.server.Watchdog; +import org.alexdev.http.util.HomeUtil; +import org.alexdev.http.util.HtmlUtil; +import org.alexdev.http.util.XSSUtil; + +public class HomepageController { + public static void homepage(WebConnection webConnection) { + XSSUtil.clear(webConnection); + + if (webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/me"); + return; + } + + boolean rememberMe = webConnection.get().getString("rememberme").equals("true"); + String username = HtmlUtil.removeHtmlTags(webConnection.get().getString("username")); + + var template = webConnection.template(GameConfiguration.getInstance().getString("homepage.template.file")); + template.set("rememberMe", rememberMe); + template.set("username", username); + template.set("tagCloud", Watchdog.TAG_CLOUD_20); + + boolean isValentinesMonth = Integer.parseInt(DateUtil.getCurrentDate("M")) == 2 && Integer.parseInt(DateUtil.getCurrentDate("DD")) <= 16; + template.set("isValentinesMonth", isValentinesMonth); + template.set("randomValentinesImage", HomeUtil.getRandomValentinesImage()); + + template.render(); + + // Delete alert after it's been rendered + webConnection.session().delete("alertMessage"); + } + + public static void maintenance(WebConnection webConnection) { + var template = webConnection.template("maintenance"); + template.render(); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/site/MinimailController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/site/MinimailController.java new file mode 100644 index 0000000..f78fb1e --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/site/MinimailController.java @@ -0,0 +1,442 @@ +package org.alexdev.http.controllers.site; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.duckhttpd.template.Template; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.dao.mysql.PlayerStatisticsDao; +import org.alexdev.havana.game.messenger.Messenger; +import org.alexdev.havana.game.messenger.MessengerUser; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.statistics.PlayerStatistic; +import org.alexdev.havana.game.wordfilter.WordfilterManager; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.StringUtil; +import org.alexdev.http.dao.MinimailDao; +import org.alexdev.http.game.minimail.MinimailMessage; +import org.alexdev.http.util.BBCode; +import org.alexdev.http.util.HtmlUtil; +import org.alexdev.http.util.XSSUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.*; + +public class MinimailController { + public static void loadMessages(WebConnection webConnection) { + XSSUtil.clear(webConnection); + + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.send(""); + return; + } + + var template = webConnection.template("habblet/minimail/minimail_messages"); + appendMessages(webConnection, template, false, false, false, false, false, false); + template.render(); + } + + public static void appendMessages(WebConnection webConnection, Template template, boolean isPageLoad, boolean messageSent, boolean messageDeleted, boolean messageUndeleted, boolean trashEmptied, boolean isMuted) { + XSSUtil.clear(webConnection); + + String label = webConnection.post().getString("label"); + + if (label.isBlank()) { + if (!webConnection.session().contains("minimailLabel")) { + label = "inbox"; + } else { + label = webConnection.session().getString("minimailLabel"); + + if (label.equals("conversation") && !webConnection.post().contains("conversationId")) { + label = "inbox"; + } + } + } + + var startNumber = 0; + boolean unreadOnly = false; + + try { + startNumber = webConnection.post().getInt("start"); + } catch (Exception ex) { + webConnection.send(""); + return; + } + + try { + unreadOnly = webConnection.post().getBoolean("unreadOnly"); + } catch (Exception ex) { + webConnection.send(""); + return; + } + + int userId = webConnection.session().getInt("user.id"); + + int pageNumber = 0; + if (startNumber > 0) { + pageNumber = startNumber / 10; + } + + webConnection.session().set("minimailLabel", label); + template.set("minimailLabel", label); + + List entireMessageList = new ArrayList<>(); + + if (label.equalsIgnoreCase("inbox")) { + entireMessageList = MinimailDao.getMessages(userId); + } + + if (label.equalsIgnoreCase("sent")) { + entireMessageList = MinimailDao.getMessagesSent(userId); + } + + if (label.equalsIgnoreCase("trash")) { + entireMessageList = MinimailDao.getMessageTrash(userId); + } + + if (label.equalsIgnoreCase("conversation")) { + int conversationId = 0; + + try { + conversationId = webConnection.post().getInt("conversationId"); + } catch (Exception ex) { + + } + + entireMessageList = MinimailDao.getMessagesConversation(userId, conversationId); + } + + if (unreadOnly) { + entireMessageList.removeIf(MinimailMessage::isRead); + } + + template.set("unreadOnly", unreadOnly); + + entireMessageList.sort(Comparator.comparingLong(MinimailMessage::getDateSent).reversed()); + var paginatedMessages = StringUtil.paginate(entireMessageList, 10, true); + var minimailMessages = paginatedMessages.get(pageNumber); + + template.set("showOlder", false); + template.set("showOldest", false); + + if (paginatedMessages.containsKey(pageNumber + 1)) { + template.set("showOlder", true); + } + + if (paginatedMessages.containsKey(pageNumber + 2)) { + template.set("showOldest", true); + } + + if (paginatedMessages.containsKey(pageNumber - 1)) { + template.set("showNewer", true); + } + + if (paginatedMessages.containsKey(pageNumber - 2)) { + template.set("showNewest", true); + } + + template.set("minimailMessages", minimailMessages); + template.set("totalMessages", entireMessageList.size()); + template.set("minimailClient", false); + + var endPage = 10; + var startPage = startNumber; + + if (startNumber != 0) { + startPage++; + endPage = startNumber + 10; + } else { + startPage = 1; + } + + if (endPage > entireMessageList.size()) { + endPage = entireMessageList.size(); + } + + template.set("startPage", startPage); + template.set("endPage", endPage); + + Map playerDetailsMap = new HashMap<>(); + + for (MinimailMessage minimailMessage : minimailMessages) { + if (!playerDetailsMap.containsKey(minimailMessage.getToId())) { + playerDetailsMap.put(minimailMessage.getToId(), PlayerDao.getDetails(minimailMessage.getToId())); + } + + if (!playerDetailsMap.containsKey(minimailMessage.getSenderId())) { + playerDetailsMap.put(minimailMessage.getSenderId(), PlayerDao.getDetails(minimailMessage.getSenderId())); + } + + + minimailMessage.setAuthor(playerDetailsMap.get(minimailMessage.getSenderId())); + minimailMessage.setTarget(playerDetailsMap.get(minimailMessage.getToId())); + } + + if (!isPageLoad) { + if (messageSent) { + if (isMuted) { + webConnection.headers().put("X-JSON", "{\"message\":\"You are muted and cannot send messages.\",\"totalMessages\":" + entireMessageList.size() + "}"); + } else { + webConnection.headers().put("X-JSON", "{\"message\":\"Message sent successfully.\",\"totalMessages\":" + entireMessageList.size() + "}"); + } + } else if (messageDeleted) { + webConnection.headers().put("X-JSON", "{\"message\":\"The message has been moved to the trash. You can undelete it, if you wish\",\"totalMessages\":" + entireMessageList.size() + "}"); + } else if (messageUndeleted) { + webConnection.headers().put("X-JSON", "{\"message\":\"Message undeleted\",\"totalMessages\":" + entireMessageList.size() + "}"); + } else if (trashEmptied) { + webConnection.headers().put("X-JSON", "{\"message\":\"The trash has been emptied. Good Job!\",\"totalMessages\":" + entireMessageList.size() + "}"); + } else { + webConnection.headers().put("X-JSON", "{\"totalMessages\":" + entireMessageList.size() + "}"); + } + } + } + + public static void recipients(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + return; + } + + PlayerDetails playerDetails = PlayerDao.getDetails(webConnection.session().getInt("user.id")); + Messenger messenger = new Messenger(playerDetails); + + StringBuilder recipients = new StringBuilder(); + + int i = 0; + for (MessengerUser messengerUser : new ArrayList<>(messenger.getFriends().values())) { + i++; + + recipients.append("{\"id\":").append(messengerUser.getUserId()).append(",\"name\":\"").append(messengerUser.getUsername()).append("\"}"); + + if (messenger.getFriends().size() > i) { + recipients.append(","); + } + } + + webConnection.send("/*-secure-\n[" + recipients.toString() + "]\n */"); + } + + public static void preview(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.send(""); + return; + } + + webConnection.send(BBCode.format(HtmlUtil.escape(webConnection.post().getString("body")), false)); + } + + public static void sendMessage(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.send(""); + return; + } + + List minimailMessageList = new ArrayList<>(); + String message = webConnection.post().getString("body"); + + var template = webConnection.template("habblet/minimail/minimail_messages"); + PlayerDetails playerDetails = (PlayerDetails) template.get("playerDetails"); + + var muteExpireTime = PlayerStatisticsDao.getStatisticLong(playerDetails.getId(), PlayerStatistic.MUTE_EXPIRES_AT); + var isMuted = muteExpireTime > 0 && muteExpireTime > DateUtil.getCurrentTimeSeconds(); + + if (!isMuted) { + if (webConnection.post().contains("recipientIds")) { + String[] recipients = webConnection.post().getString("recipientIds").split(","); + String subject = webConnection.post().getString("subject"); + + Messenger messenger = new Messenger(playerDetails); + + for (String data : recipients) { + if (!StringUtils.isNumeric(data)) { + continue; + } + + int toId = Integer.parseInt(data); + + if (!messenger.hasFriend(toId)) { + continue; + } + + if (WordfilterManager.filterSentence(message).equals(message)) { + minimailMessageList.add(new MinimailMessage(-1, webConnection.session().getInt("user.id"), toId, webConnection.session().getInt("user.id"), false, subject, message, 0, 0, false)); + minimailMessageList.add(new MinimailMessage(-1, toId, toId, webConnection.session().getInt("user.id"), false, subject, message, 0, 0, false)); + } + + } + } else if (webConnection.post().contains("messageId")) { + int messageId = 0; + int userId = webConnection.session().getInt("user.id"); + + try { + messageId = webConnection.post().getInt("messageId"); + } catch (Exception e) { + + } + + MinimailMessage minimailMessage = MinimailDao.getMessage(messageId, userId); + + if (minimailMessage != null) { + minimailMessage.setConversationId(messageId); + MinimailDao.updateMessage(minimailMessage); + + if (WordfilterManager.filterSentence(message).equals(message)) { + minimailMessageList.add(new MinimailMessage(-1, webConnection.session().getInt("user.id"), minimailMessage.getSenderId(), webConnection.session().getInt("user.id"), false, "Re: " + minimailMessage.getSubject(), message, 0, minimailMessage.getConversationId(), false)); + minimailMessageList.add(new MinimailMessage(-1, minimailMessage.getSenderId(), minimailMessage.getSenderId(), webConnection.session().getInt("user.id"), false, "Re: " + minimailMessage.getSubject(), message, 0, minimailMessage.getConversationId(), false)); + } + } + } + + MinimailDao.createMessages(minimailMessageList); + } + + appendMessages(webConnection, template, false, true, false, false, false, isMuted); + template.render(); + } + + public static void loadMessage(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.send(""); + return; + } + + int userId = webConnection.session().getInt("user.id"); + int messageId = 0; + + try { + messageId = webConnection.get().getInt("messageId"); + } catch (Exception ex) { + webConnection.send("1"); + return; + } + + if (!(messageId > 0)) { + webConnection.send("2"); + return; + } + + MinimailMessage minimailMessage = MinimailDao.getMessage(messageId, userId); + + if (minimailMessage == null) { + webConnection.send(""); + return; + } + + boolean canSetUnread = false; + + if (webConnection.session().getString("minimailLabel").equalsIgnoreCase("conversation")) { + if (userId != minimailMessage.getTargetId() && userId != minimailMessage.getSenderId()) { + webConnection.send(""); + return; + } + } else if (webConnection.session().getString("minimailLabel").equalsIgnoreCase("sent")) { + if (userId != minimailMessage.getTargetId() && userId != minimailMessage.getSenderId()) { + webConnection.send(""); + return; + } + } + + canSetUnread = true; + + minimailMessage.setTarget(PlayerDao.getDetails(minimailMessage.getToId())); + minimailMessage.setAuthor(PlayerDao.getDetails(minimailMessage.getSenderId())); + + if (canSetUnread && !minimailMessage.isRead()) { + minimailMessage.setRead(true); + MinimailDao.updateMessage(minimailMessage); + } + + + var template = webConnection.template("habblet/minimail/minimail_load_message"); + template.set("minimailLabel", webConnection.session().getString("minimailLabel")); + template.set("minimailMessage", minimailMessage); + template.render(); + } + + public static void deleteMessage(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.send(""); + return; + } + + int userId = webConnection.session().getInt("user.id"); + int messageId = 0; + + try { + messageId = webConnection.post().getInt("messageId"); + } catch (Exception ex) { + webConnection.send(""); + return; + } + + if (!(messageId > 0)) { + webConnection.send(""); + return; + } + + MinimailMessage minimailMessage = MinimailDao.getMessage(messageId, userId); + + if (minimailMessage == null) { + webConnection.send(""); + return; + } + + if (!minimailMessage.isTrash()) { + minimailMessage.setTrash(true); + MinimailDao.updateMessage(minimailMessage); + } else { + MinimailDao.deleteMessage(minimailMessage); + } + + var template = webConnection.template("habblet/minimail/minimail_messages"); + appendMessages(webConnection, template, false, false, true, false, false, false); + template.render(); + } + + public static void undeleteMessage(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.send(""); + return; + } + + int userId = webConnection.session().getInt("user.id"); + int messageId = 0; + + try { + messageId = webConnection.post().getInt("messageId"); + } catch (Exception ex) { + webConnection.send(""); + return; + } + + if (!(messageId > 0)) { + webConnection.send(""); + return; + } + + MinimailMessage minimailMessage = MinimailDao.getMessage(messageId, userId); + + if (minimailMessage == null) { + webConnection.send(""); + return; + } + + minimailMessage.setTrash(false); + MinimailDao.updateMessage(minimailMessage); + + var template = webConnection.template("habblet/minimail/minimail_messages"); + appendMessages(webConnection, template, false, false, false, true, false, false); + template.render(); + } + + public static void emptyTrash(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.send(""); + return; + } + + int userId = webConnection.session().getInt("user.id"); + MinimailDao.emptyTrash(userId); + + var template = webConnection.template("habblet/minimail/minimail_messages"); + appendMessages(webConnection, template, false, false, false, false, true, false); + template.render(); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/site/NewsController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/site/NewsController.java new file mode 100644 index 0000000..d15da9d --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/site/NewsController.java @@ -0,0 +1,167 @@ +package org.alexdev.http.controllers.site; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.duckhttpd.template.Template; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.http.dao.NewsDao; +import org.alexdev.http.game.news.*; +import org.alexdev.http.util.XSSUtil; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class NewsController { + public static void articles(WebConnection webConnection) { + XSSUtil.clear(webConnection); + + webConnection.session().set("page", "community"); + + var template = webConnection.template("news_articles"); + template.set("newsPage", "news"); + rendernews(webConnection, template, null); + template.render(); + } + + public static void fansites(WebConnection webConnection) { + XSSUtil.clear(webConnection); + webConnection.session().set("page", "community"); + + var template = webConnection.template("news_articles"); + template.set("newsPage", "fansites"); + rendernews(webConnection, template, NewsManager.getInstance().getCategoryByLabel("fansites")); + template.render(); + } + + public static void events(WebConnection webConnection) { + XSSUtil.clear(webConnection); + + webConnection.session().set("page", "community"); + + var template = webConnection.template("news_articles"); + template.set("newsPage", "events"); + rendernews(webConnection, template, NewsManager.getInstance().getCategoryByLabel("events")); + template.render(); + } + + private static void rendernews(WebConnection webConnection, Template template, NewsCategory override) { + int newsArticleId = 0; + + try { + newsArticleId = Integer.parseInt(webConnection.getMatches().get(0)); + } catch (Exception ignored) { + } + + int filterCategoryId = (override != null ? override.getId() : 0); + boolean hasArchive = false; + + /*if (filterCategoryId > 0) { + var categoryLabel = webConnection.getMatches().get(0); + var category = NewsManager.getInstance().getCategoryByLabel(categoryLabel); + + if (category != null) { + filterCategoryId = category.getId(); + } + + template.set("urlSuffix", ""); + hasArchive = true; + }*/ + + NewsView view = NewsView.DEFAULT; + + template.set("monthlyView", false); + template.set("archiveView", false); + + template.set("archives", new HashMap>());; + template.set("months", new HashMap>()); + template.set("articlesToday", new ArrayList<>()); + template.set("articlesYesterday", new ArrayList<>()); + template.set("articlesThisWeek", new ArrayList<>()); + template.set("articlesThisMonth", new ArrayList<>()); + template.set("articlesPastYear", new ArrayList<>()); + + if (webConnection.getRouteRequest().endsWith("archive") || + webConnection.getRouteRequest().endsWith("archive/")) { + template.set("urlSuffix", "/in/archive"); + template.set("archiveView", true); + view = NewsView.ARCHIVE; + + } else if (filterCategoryId > 0 || webConnection.getRouteRequest().contains("/category/")) { + if (webConnection.getRouteRequest().contains("/category/")) { + override = NewsManager.getInstance().getCategoryByLabel(webConnection.getMatches().get(0)); + } + + if (override != null) { + filterCategoryId = override.getId(); + view = NewsView.MONTHS; + template.set("monthlyView", true); + } + + } else { + template.set("urlSuffix", ""); + } + + boolean includeUnpublished = template.get("playerDetails") != null && ((PlayerDetails)template.get("playerDetails")).getRank().getRankId() > 1; + NewsArticle newsArticle = null; + + if (!NewsDao.exists(newsArticleId)) { + try { + var articles = NewsDao.getTop(NewsDateKey.ALL, 1, includeUnpublished, List.of(), filterCategoryId); + + if (articles.size() > 0) { + newsArticle = articles.get(0); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } else { + newsArticle = NewsDao.get(newsArticleId); + } + + + if (newsArticle == null || (!newsArticle.isPublished() && !includeUnpublished)) { + newsArticle = new NewsArticle(1, + "No news", + -1, + "Hotel Staff", + "", + "There is no news.", + System.currentTimeMillis() / 1000L, + "", + "", + "", + "", + true, 0,false); + //webConnection.send(Settings.getInstance().getDefaultResponses().getResponse(HttpResponseStatus.NOT_FOUND, webConnection)); + //return; + } + + template.set("currentArticle", newsArticle); + + if (view == NewsView.ARCHIVE) { + var monthlyArticles = NewsDao.getArchive(includeUnpublished); + template.set("archives", monthlyArticles); + template.set("archiveView", true); + } + + if (view == NewsView.MONTHS) { + var monthlyArticles = NewsDao.getPastYear(includeUnpublished, filterCategoryId); + template.set("months", monthlyArticles); + template.set("monthlyView", true); + } + + if (view == NewsView.DEFAULT) { + var articleList = NewsDao.getTop(Integer.MAX_VALUE, includeUnpublished, filterCategoryId); + template.set("articlesToday", articleList.get(NewsDateKey.TODAY)); + template.set("articlesYesterday", articleList.get(NewsDateKey.YESTERDAY)); + template.set("articlesThisWeek", articleList.get(NewsDateKey.THIS_WEEK)); + template.set("articlesThisMonth", articleList.get(NewsDateKey.THIS_MONTH)); + template.set("articlesPastYear", (articleList.get(NewsDateKey.TODAY).isEmpty() && articleList.get(NewsDateKey.YESTERDAY).isEmpty() && articleList.get(NewsDateKey.THIS_WEEK).isEmpty() && articleList.get(NewsDateKey.THIS_MONTH).isEmpty()) ? + articleList.get(NewsDateKey.PAST_YEAR) : + List.of()); + //template.set("articlesThisYear", hasArchive ? articleList.get(NewsDateKey.THIS_YEAR) : List.of()); + } + + //template.set("articles", articleList); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/site/ProfileController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/site/ProfileController.java new file mode 100644 index 0000000..51162d1 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/site/ProfileController.java @@ -0,0 +1,669 @@ +package org.alexdev.http.controllers.site; + +import io.netty.handler.codec.http.FullHttpResponse; +import org.alexdev.duckhttpd.response.ResponseBuilder; +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.duckhttpd.template.Template; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.dao.mysql.PlayerStatisticsDao; +import org.alexdev.havana.dao.mysql.WardrobeDao; +import org.alexdev.havana.game.misc.figure.FigureManager; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.Wardrobe; +import org.alexdev.havana.game.player.statistics.PlayerStatistic; +import org.alexdev.havana.game.player.statistics.PlayerStatisticManager; +import org.alexdev.havana.server.rcon.messages.RconHeader; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.StringUtil; +import org.alexdev.havana.util.config.GameConfiguration; +import org.alexdev.http.dao.SessionDao; +import org.alexdev.http.util.*; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.validator.routines.EmailValidator; + +import javax.mail.internet.AddressException; +import java.util.HashMap; +import java.util.List; +import java.util.UUID; +import java.util.concurrent.ThreadLocalRandom; + +import static org.alexdev.havana.game.achievements.progressions.AchievementTraderPass.isActivated; + +public class ProfileController { + public static void profile(WebConnection webConnection) { + XSSUtil.clear(webConnection); + + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int userId = webConnection.session().getInt("user.id"); + var statistics = new PlayerStatisticManager(userId, PlayerStatisticsDao.getStatistics(userId)); + + webConnection.session().set("page", "me"); + int tab = 0; + + if (webConnection.get().contains("tab")) { + String value = webConnection.get().getString("tab"); + + if (StringUtils.isNumeric(value)) { + tab = Integer.parseInt(value); + } + }; + + Template template = null; + + switch (tab) { + case 1: { + template = webConnection.template("profile/change_looks"); + profile_flash(template, webConnection); + break; + } + case 2: { + template = webConnection.template("profile/change_preferences"); + preferences(template, webConnection); + break; + } + case 3: { + template = webConnection.template("profile/change_email"); + break; + } + case 4: { + template = webConnection.template("profile/change_password"); + break; + } + case 5: { + template = webConnection.template("profile/friend_management"); + FriendManagementController.friendmanagement(template, webConnection, 30, 1, -1, null); + break; + } + case 6: { + template = webConnection.template("profile/change_trade_settings"); + tradesettings(template, webConnection); + break; + } + default: { + template = webConnection.template("profile/change_looks"); + profile_flash(template, webConnection); + break; + } + } + + if (template != null) { + template.set("settingsSavedAlert", false); + template.set("accountActivated", isActivated(statistics.getValue(PlayerStatistic.ACTIVATION_CODE))); + + if (webConnection.session().contains("settings.saved.successfully")) { + template.set("settingsSavedAlert", true); + } + + template.set("randomNumber", ThreadLocalRandom.current().nextInt(0, Integer.MAX_VALUE)); + template.render(); + } + webConnection.session().delete("settings.saved.successfully"); + + webConnection.session().delete("alertMessage"); + webConnection.session().delete("alertColour"); + } + + + private static void changelooks(Template template, WebConnection webConnection) { + // https://www.habbo.com/habbo-imaging/avatarimage?figure={{ wardrobeFigure1 }}&size=s&direction=4&head_direction=4&crr=0&gesture=sml&frame=1 + // System.out.println("lol 123"); + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + PlayerDetails playerDetails = (PlayerDetails) template.get("playerDetails"); + + if (!playerDetails.hasClubSubscription()) { + webConnection.redirect("/"); + return; + } + + + List wardrobeList = WardrobeDao.getWardrobe(playerDetails.getId()); + + Wardrobe wardrobeSlot1 = wardrobeList.stream().filter(wardrobe -> wardrobe.getSlotId() == 1).findFirst().orElse(null); + Wardrobe wardrobeSlot2 = wardrobeList.stream().filter(wardrobe -> wardrobe.getSlotId() == 2).findFirst().orElse(null); + Wardrobe wardrobeSlot3 = wardrobeList.stream().filter(wardrobe -> wardrobe.getSlotId() == 3).findFirst().orElse(null); + Wardrobe wardrobeSlot4 = wardrobeList.stream().filter(wardrobe -> wardrobe.getSlotId() == 4).findFirst().orElse(null); + Wardrobe wardrobeSlot5 = wardrobeList.stream().filter(wardrobe -> wardrobe.getSlotId() == 5).findFirst().orElse(null); + + template.set("wardrobe1", false); + template.set("wardrobe2", false); + template.set("wardrobe3", false); + template.set("wardrobe4", false); + template.set("wardrobe5", false); + + if (wardrobeSlot1 != null) { + template.set("wardrobe1", true); + template.set("wardrobeUrl1", HtmlUtil.createFigureLink(wardrobeSlot1.getFigure(), wardrobeSlot1.getSex())); + template.set("wardrobeFigure1", wardrobeSlot1.getFigure()); + template.set("wardrobeSex1", wardrobeSlot1.getSex()); + } + + if (wardrobeSlot2 != null) { + template.set("wardrobe2", true); + template.set("wardrobeUrl2", HtmlUtil.createFigureLink(wardrobeSlot2.getFigure(), wardrobeSlot2.getSex())); + template.set("wardrobeFigure2", wardrobeSlot2.getFigure()); + template.set("wardrobeSex2", wardrobeSlot2.getSex()); + } + + if (wardrobeSlot3 != null) { + template.set("wardrobe3", true); + template.set("wardrobeUrl3", HtmlUtil.createFigureLink(wardrobeSlot3.getFigure(), wardrobeSlot3.getSex())); + template.set("wardrobeFigure3", wardrobeSlot3.getFigure()); + template.set("wardrobeSex3", wardrobeSlot3.getSex()); + } + + if (wardrobeSlot4 != null) { + template.set("wardrobe4", true); + template.set("wardrobeUrl4", HtmlUtil.createFigureLink(wardrobeSlot4.getFigure(), wardrobeSlot4.getSex())); + template.set("wardrobeFigure4", wardrobeSlot4.getFigure()); + template.set("wardrobeSex4", wardrobeSlot4.getSex()); + } + + if (wardrobeSlot5 != null) { + template.set("wardrobe5", true); + template.set("wardrobeUrl5", HtmlUtil.createFigureLink(wardrobeSlot5.getFigure(), wardrobeSlot5.getSex())); + template.set("wardrobeFigure5", wardrobeSlot5.getFigure()); + template.set("wardrobeSex5", wardrobeSlot5.getSex()); + } + + if (!playerDetails.hasClubSubscription()) { + int validateFigureCode = FigureManager.getInstance().validateFigureCode(playerDetails.getFigure(), playerDetails.getSex(), false); + + if (validateFigureCode == 6) { + template.set("figureHasClub", true); + } else { + template.set("figureHasClub", false); + } + } else { + template.set("figureHasClub", false); + } + } + + public static void passwordupdate(WebConnection webConnection) throws Exception { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + Template template = webConnection.template("profile/change_password"); + PlayerDetails playerDetails = (PlayerDetails) template.get("playerDetails"); + + boolean logout = false; + + if (webConnection.post().getString("currentpassword").isBlank() || + webConnection.post().getString("newpassword").isBlank() || + webConnection.post().getString("newpasswordconfirm").isBlank() || + webConnection.post().getString("captcha").isBlank()) { + + webConnection.session().set("alertMessage", "Please enter all fields"); + webConnection.session().set("alertColour", "red"); + } else { + String currentPassword = webConnection.post().getString("currentpassword"); + String newPassword = webConnection.post().getString("newpassword"); + String newPasswordConfirm = webConnection.post().getString("newpasswordconfirm"); + String captcha = webConnection.post().getString("captcha"); + + if (!PlayerDao.login(playerDetails, playerDetails.getName(), currentPassword)) { + webConnection.session().set("alertMessage", "Your current password is invalid"); + webConnection.session().set("alertColour", "red"); + } else if (newPassword.length() < 6) { + webConnection.session().set("alertMessage", "Password is too short, 6 characters minimum"); + webConnection.session().set("alertColour", "red"); + } /*else if (newPassword.length() > 25) { + webConnection.session().set("alertMessage", "Password is too long, 25 characters maximum"); + webConnection.session().set("alertColour", "red"); + } */else if (!newPassword.equals(newPasswordConfirm)) { + webConnection.session().set("alertMessage", "The passwords don't match"); + webConnection.session().set("alertColour", "red"); + } else if (!webConnection.session().getString("captcha-text").equals(captcha)) { + webConnection.session().set("alertMessage", "The security code was invalid, please try again."); + webConnection.session().set("alertColour", "red"); + } else { + webConnection.session().set("alertMessage", "Your password has been changed successfully. You will need to login again."); + webConnection.session().set("alertColour", "green"); + + PlayerDao.setPassword(playerDetails.getId(), PlayerDao.createPassword(newPassword)); + logout = true; + } + } + + + template.set("randomNumber", ThreadLocalRandom.current().nextInt(0, Integer.MAX_VALUE)); + template.render(); + + webConnection.session().delete("alertMessage"); + webConnection.session().delete("alertColour"); + webConnection.session().delete("captcha-text"); + + if (logout) { + SessionUtil.logout(webConnection); + } + } + + public static void emailupdate(WebConnection webConnection) throws AddressException { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + PlayerDetails playerDetails = PlayerDao.getDetails(webConnection.session().getInt("user.id")); + + if (webConnection.post().getString("password").isBlank() || + webConnection.post().getString("captcha").isBlank()) { + + webConnection.session().set("alertMessage", "Please enter all fields"); + webConnection.session().set("alertColour", "red"); + } else { + String currentPassword = webConnection.post().getString("password"); + String email = webConnection.post().getString("email"); + String captcha = webConnection.post().getString("captcha"); + + if (!PlayerDao.login(playerDetails, playerDetails.getName(), currentPassword)) { + webConnection.session().set("alertMessage", "Your current password is invalid"); + webConnection.session().set("alertColour", "red"); + } else if (!EmailValidator.getInstance().isValid(email)) { + webConnection.session().set("alertMessage", "The email you entered is invalid"); + webConnection.session().set("alertColour", "red"); + } else if (!webConnection.session().getString("captcha-text").equals(captcha)) { + webConnection.session().set("alertMessage", "The security code was invalid, please try again."); + webConnection.session().set("alertColour", "red"); + } else { + webConnection.session().set("alertMessage", "Your email has been changed successfully."); + webConnection.session().set("alertColour", "green"); + + if (!playerDetails.getEmail().equals(email)) { + var activationCode = UUID.randomUUID().toString(); + + if (GameConfiguration.getInstance().getBoolean("email.smtp.enable")) { + if (EmailUtil.send(webConnection, email, "Activate your account at Classic Habbo", + EmailUtil.renderActivate( + playerDetails.getId(), + playerDetails.getName(), + email, + activationCode + ) + )) { + PlayerStatisticsDao.updateStatistic(playerDetails.getId(), PlayerStatistic.ACTIVATION_CODE, activationCode); + + if (GameConfiguration.getInstance().getBoolean("trade.email.verification")) { + if (playerDetails.isTradeEnabled()) { + SessionDao.saveTrade(playerDetails.getId(), false); + + RconUtil.sendCommand(RconHeader.REFRESH_TRADE_SETTING, new HashMap<>() {{ + put("userId", playerDetails.getId()); + put("tradeEnabled", "0"); + }}); + } + + } + + PlayerDao.setEmail(playerDetails.getId(), email); + } + } + } + } + } + + + webConnection.redirect("/profile?tab=3"); + webConnection.session().delete("captcha-text"); + } + + public static void characterupdate(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + + String[] expectedFields = new String[] { "figureData", "newGender" }; + + for (String field : expectedFields) { + if (!webConnection.post().queries().containsKey(field) || webConnection.post().queries().get(field).isEmpty()) { + webConnection.redirect("/profile"); + return; + } + } + + String newFigure = webConnection.post().getString("figureData"); + String newGender = webConnection.post().getString("newGender"); + + PlayerDetails playerDetails = PlayerDao.getDetails(webConnection.session().getInt("user.id")); + int validateFigureCode = FigureManager.getInstance().validateFigureCode(newFigure, newGender, playerDetails.hasClubSubscription()); + if (validateFigureCode > 0) { + webConnection.redirect("/profile");/*?errorCode=" + validateFigureCode);*/ + return; + } + + if (newGender.charAt(0) != 'M' && newGender.charAt(0) != 'F') { + webConnection.redirect("/profile"); + return; + } + + + PlayerDao.saveDetails(playerDetails.getId(), newFigure, playerDetails.getPoolFigure(), newGender); + + if (playerDetails.isOnline()) { + RconUtil.sendCommand(RconHeader.REFRESH_LOOKS, new HashMap<>() {{ + put("userId", playerDetails.getId()); + }}); + } + + webConnection.session().set("settings.saved.successfully", ""); + webConnection.redirect("/profile"); + } + + public static void action(WebConnection webConnection) { + webConnection.redirect("/profile"); + } + + public static void club(WebConnection webConnection) { + webConnection.session().set("page", "me"); + ClubController.renderclub(webConnection); + } + + public static void preferences(Template template, WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + PlayerDetails playerDetails = (PlayerDetails) template.get("playerDetails"); + + template.set("onlineStatusEnabled", ""); + template.set("onlineStatusDisabled", ""); + //template.set("hasFlashWarningEnabled", ""); + //template.set("hasFlashWarningDisabled", ""); + template.set("followFriendEnabled", ""); + template.set("followFriendDisabled", ""); + template.set("profileVisibleEnabled", ""); + template.set("profileVisibleDisabled", ""); + template.set("allowFriendRequests", ""); + template.set("allowFriendRequests", ""); + template.set("wordFilterSetting", ""); + template.set("wordFilterSetting", ""); + template.set("onlineStatusEnabled", ""); + template.set("onlineStatusDisabled", ""); + + if (playerDetails.isOnlineStatusVisible()) { + template.set("onlineStatusEnabled", "checked=\"checked\""); + } else { + template.set("onlineStatusDisabled", "checked=\"checked\""); + } + + /* + if (playerDetails.hasFlashWarning()) { + template.set("hasFlashWarningEnabled", "checked=\"checked\""); + } else { + template.set("hasFlashWarningDisabled", "checked=\"checked\""); + } + */ + + if (playerDetails.doesAllowStalking()) { + template.set("followFriendEnabled", "checked=\"checked\""); + } else { + template.set("followFriendDisabled", "checked=\"checked\""); + } + + if (playerDetails.isProfileVisible()) { + template.set("profileVisibleEnabled", "checked=\"checked\""); + } else { + template.set("profileVisibleDisabled", "checked=\"checked\""); + } + + if (playerDetails.isAllowFriendRequests()) { + template.set("allowFriendRequests", "checked=\"true\""); + } else { + template.set("allowFriendRequests", ""); + } + + if (playerDetails.isWordFilterEnabled()) { + template.set("wordFilterSetting", ""); + } else { + template.set("wordFilterSetting", "checked=\"true\""); + } + } + + public static void profileupdate(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int userId = webConnection.session().getInt("user.id"); + + String motto = webConnection.post().getString("motto"); + boolean profileVisibility = webConnection.post().getString("visibility").equals("EVERYONE"); + boolean onlineStatusVisibility = webConnection.post().getString("showOnlineStatus").equals("true"); + boolean wordFilterEnabled = !webConnection.post().getString("wordFilterSetting").equals("false"); + boolean allowFriendRequests = webConnection.post().getString("allowFriendRequests").equals("true"); + boolean allowFriendStalking = webConnection.post().getString("followFriendSetting").equals("true"); + boolean shockwavePreferred = webConnection.post().getString("clientpreference").equals("SHOCKWAVE"); + String authToken = webConnection.session().getString("authenticationToken"); + + if (motto.length() > 32) { + motto = motto.substring(0, 32); + } + + SessionDao.savePreferences(motto, profileVisibility, onlineStatusVisibility, wordFilterEnabled, allowFriendRequests, allowFriendStalking, userId); + PlayerDao.setAuthToken(userId, authToken, DateUtil.getCurrentTimeSeconds()); + + webConnection.session().set("settings.saved.successfully", "true"); + webConnection.redirect("/profile?tab=2"); + } + + private static void tradesettings(Template template, WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + PlayerDetails playerDetails = (PlayerDetails) template.get("playerDetails"); + + /*boolean canUseTrade = TimeUnit.SECONDS.toDays(DateUtil.getCurrentTimeSeconds() - playerDetails.getJoinDate()) >= 3 && + PlayerStatisticsDao.getStatistic(playerDetails.getId(), PlayerStatistic.ONLINE_TIME) >= TimeUnit.HOURS.toSeconds(1);*/ + boolean canUseTrade = !GameConfiguration.getInstance().getBoolean("trade.email.verification") || isActivated(PlayerStatisticsDao.getStatisticString(playerDetails.getId(), PlayerStatistic.ACTIVATION_CODE)); + template.set("canUseTrade", canUseTrade); + + if (!playerDetails.isTradeEnabled()) { + //template.set("tradeDisabled", "checked=\"checked\""); + } else { + //template.set("tradeEnabled", "checked=\"checked\""); + } + } + + public static void securitysettingupdate(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + PlayerDetails playerDetails = PlayerDao.getDetails(webConnection.session().getInt("user.id")); + String currentPassword = webConnection.post().getString("password"); + + if (currentPassword.isEmpty()) { + webConnection.session().set("alertMessage", "You did not enter a password"); + webConnection.session().set("alertColour", "red"); + } else if (!PlayerDao.login(playerDetails, playerDetails.getName(), currentPassword)) { + webConnection.session().set("alertMessage", "Your current password is invalid"); + webConnection.session().set("alertColour", "red"); + } else if (GameConfiguration.getInstance().getBoolean("trade.email.verification") && + !isActivated(PlayerStatisticsDao.getStatisticString(playerDetails.getId(), PlayerStatistic.ACTIVATION_CODE))) { + webConnection.session().set("alertMessage", "You must verify your email before enabling trade."); + webConnection.session().set("alertColour", "red"); + } else if (EmailUtil.isAlreadyTradePass(playerDetails.getId(), playerDetails.getEmail())) { + webConnection.session().set("alertMessage", "This email is already used for a trade pass."); + webConnection.session().set("alertColour", "red"); + } else { + webConnection.session().set("alertMessage", "Security settings updated successfully"); + webConnection.session().set("alertColour", "green"); + + /*boolean canUseTrade = TimeUnit.SECONDS.toDays(DateUtil.getCurrentTimeSeconds() - playerDetails.getJoinDate()) >= 3 && + PlayerStatisticsDao.getStatistic(playerDetails.getId(), PlayerStatistic.ONLINE_TIME) >= TimeUnit.HOURS.toSeconds(1); + + if (!canUseTrade) { + webConnection.post().setValue("tradesetting", "false"); + }*/ + + boolean tradeSetting = webConnection.post().getString("tradingsetting").equals("true"); + SessionDao.saveTrade(playerDetails.getId(), tradeSetting); + + RconUtil.sendCommand(RconHeader.REFRESH_TRADE_SETTING, new HashMap<>() {{ + put("userId", playerDetails.getId()); + put("tradeEnabled", tradeSetting ? "1" : "0"); + }}); + } + + webConnection.redirect("/profile?tab=6"); + } + + public static void wardrobeStore(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + if (!StringUtils.isNumeric( webConnection.post().getString("slot"))) { + webConnection.redirect("/"); + return; + } + + int userId = webConnection.session().getInt("user.id"); + int slotId = webConnection.post().getInt("slot"); + + String figure = StringUtil.filterInput(webConnection.post().getString("figure"), true); + String sex = StringUtil.filterInput(webConnection.post().getString("gender"), true); + + if (sex.isBlank()) { + sex = "M"; + } + + PlayerDetails playerDetails = PlayerDao.getDetails(userId); + + if (!FigureManager.getInstance().validateFigure(figure, sex, playerDetails.hasClubSubscription())) { + webConnection.redirect("/"); + return; + } + + if (slotId < 1 || slotId > 5) { + webConnection.redirect("/"); + return; + } + + List wardrobeList = WardrobeDao.getWardrobe(userId); + Wardrobe wardrobeData = wardrobeList.stream().filter(wardrobe -> wardrobe.getSlotId() == slotId).findFirst().orElse(null); + + if (wardrobeData == null) { + WardrobeDao.addWardrobe(userId, slotId, figure, sex.toUpperCase()); + } else { + WardrobeDao.updateWardrobe(userId, slotId, figure, sex.toUpperCase()); + } + + FullHttpResponse httpResponse = ResponseBuilder.create("application/json", "{\"slot\":\"" + slotId + "\",\"u\":\"" + HtmlUtil.createFigureLink(figure, sex) + "\",\"f\":\"" + figure + "\",\"g\":77}"); + webConnection.send(httpResponse); + } + + public static void verify(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int userId = webConnection.session().getInt("user.id"); + var statistics = new PlayerStatisticManager(userId, PlayerStatisticsDao.getStatistics(userId)); + + webConnection.session().set("page", "me"); + + var template = webConnection.template("profile/verify_email"); + template.set("accountActivated", isActivated(statistics.getValue(PlayerStatistic.ACTIVATION_CODE))); + template.render(); + + webConnection.session().delete("alertMessage"); + webConnection.session().delete("alertColour"); + } + + public static void send_email(WebConnection webConnection) throws AddressException { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int userId = webConnection.session().getInt("user.id"); + + var playerDetails = PlayerDao.getDetails(userId); + var statistics = new PlayerStatisticManager(userId, PlayerStatisticsDao.getStatistics(userId)); + + if (isActivated(statistics.getValue(PlayerStatistic.ACTIVATION_CODE))) { + webConnection.session().set("alertMessage", "Your email is already activated"); + webConnection.session().set("alertColour", "red"); + webConnection.redirect("/profile/verify"); + return; + } + + statistics.setValue(PlayerStatistic.ACTIVATION_CODE, UUID.randomUUID().toString()); + + if (GameConfiguration.getInstance().getBoolean("email.smtp.enable")) { + webConnection.session().set("alertMessage", "A verification email has been sent to your email address"); + webConnection.session().set("alertColour", "green"); + + EmailUtil.send(webConnection, playerDetails.getEmail(), "Activate your account at Classic Habbo", + EmailUtil.renderActivate( + userId, + playerDetails.getName(), + playerDetails.getEmail(), + statistics.getValue(PlayerStatistic.ACTIVATION_CODE) + ) + ); + } + + webConnection.redirect("/profile/verify"); + } + + public static void profile_flash(Template template, WebConnection webConnection) { + XSSUtil.clear(webConnection); + + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + int userId = webConnection.session().getInt("user.id"); + var statistics = new PlayerStatisticManager(userId, PlayerStatisticsDao.getStatistics(userId)); + + webConnection.session().set("page", "me"); + int tab = 0; + + if (webConnection.get().contains("tab")) { + String value = webConnection.get().getString("tab"); + + if (StringUtils.isNumeric(value)) { + tab = Integer.parseInt(value); + } + }; + + // Template template = webConnection.template("profile/change_looks_flash"); + changelooks(template, webConnection); + + if (template != null) { + template.set("accountActivated", isActivated(statistics.getValue(PlayerStatistic.ACTIVATION_CODE))); + + if (webConnection.session().contains("settings.saved.successfully")) { + template.set("settingsSavedAlert", "true"); + } + + template.set("randomNumber", ThreadLocalRandom.current().nextInt(0, Integer.MAX_VALUE)); + template.render(); + } + webConnection.session().delete("settings.saved.successfully"); + + webConnection.session().delete("alertMessage"); + webConnection.session().delete("alertColour"); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/site/QuickmenuController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/site/QuickmenuController.java new file mode 100644 index 0000000..e1e41cc --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/site/QuickmenuController.java @@ -0,0 +1,69 @@ +package org.alexdev.http.controllers.site; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.havana.dao.mysql.GroupDao; +import org.alexdev.havana.dao.mysql.MessengerDao; +import org.alexdev.havana.dao.mysql.RoomDao; +import org.alexdev.havana.game.messenger.MessengerUser; +import org.alexdev.http.util.XSSUtil; + +import java.util.Comparator; +import java.util.stream.Collectors; + +public class QuickmenuController { + public static void groups(WebConnection webConnection) { + XSSUtil.clear(webConnection); + + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + var groups = GroupDao.getJoinedGroups(webConnection.session().getInt("user.id")); + + var tpl = webConnection.template("quickmenu/groups"); + tpl.set("groups", groups); + tpl.render(); + } + + public static void friends(WebConnection webConnection) { + XSSUtil.clear(webConnection); + + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + var friends = MessengerDao.getFriends(webConnection.session().getInt("user.id")); + + var friendsOnline = friends.values().stream() + .filter(MessengerUser::isOnline) + .sorted(Comparator.comparingLong(MessengerUser::getLastOnline).reversed()) + .limit(10) + .collect(Collectors.toList()); + + var friendsOffline = friends.values().stream() + .filter(user -> !user.isOnline()) + .sorted(Comparator.comparingLong(MessengerUser::getLastOnline).reversed()) + .limit(10) + .collect(Collectors.toList()); + + var tpl = webConnection.template("quickmenu/friends_all"); + tpl.set("onlineFriends", friendsOnline); + tpl.set("offlineFriends", friendsOffline); + tpl.render(); + } + + public static void rooms(WebConnection webConnection) { + XSSUtil.clear(webConnection); + + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + var tpl = webConnection.template("quickmenu/rooms"); + tpl.set("rooms", RoomDao.getRoomsByUserId(webConnection.session().getInt("user.id"))); + tpl.render(); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/site/RecoveryController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/site/RecoveryController.java new file mode 100644 index 0000000..0b434d7 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/site/RecoveryController.java @@ -0,0 +1,184 @@ +package org.alexdev.http.controllers.site; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.dao.mysql.PlayerStatisticsDao; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.statistics.PlayerStatistic; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.config.GameConfiguration; +import org.alexdev.http.dao.EmailDao; +import org.alexdev.http.util.EmailUtil; +import org.alexdev.http.util.SessionUtil; +import org.apache.commons.validator.routines.EmailValidator; + +import java.util.UUID; + +public class RecoveryController { + public static void forgot(WebConnection webConnection) { + if (!GameConfiguration.getInstance().getBoolean("email.smtp.enable")) { + webConnection.redirect("/"); + return; + } + + var template = webConnection.template("account/email/account_forgot"); + + if (webConnection.post().getValues().size() > 0) { + if (webConnection.post().contains("actionList")) { + var email = webConnection.post().getString("ownerEmailAddress"); + + if (!webConnection.post().contains("ownerEmailAddress") + || !EmailValidator.getInstance().isValid(email) + || !EmailDao.getDetailsByEmail(webConnection.post().getString("ownerEmailAddress"))) { + template.set("invalidForgetName", true); + template.render(); + return; + } + + template = webConnection.template("account/email/sent"); + template.render(); + //template.set("validForgetName", true); + return; + } + + if (webConnection.post().contains("actionForgot")) { + var email = webConnection.post().getString("forgottenpw-email"); + + if (!webConnection.post().contains("forgottenpw-username") || webConnection.post().getString("forgottenpw-username").isBlank()) { + template.set("invalidForgetPassword", true); + template.render(); + return; + } + + if (!webConnection.post().contains("forgottenpw-email") || webConnection.post().getString("forgottenpw-email").isBlank()) { + template.set("invalidForgetPassword", true); + template.render(); + return; + } + + var details = EmailDao.getDetails(webConnection.post().getString("forgottenpw-username"), webConnection.post().getString("forgottenpw-email")); + + if (!EmailValidator.getInstance().isValid(email) || details == null) { + template.set("invalidForgetPassword", true); + template.render(); + return; + } + + //var statistics = new PlayerStatisticManager(playerDetails.getId(), PlayerStatisticsDao.getStatistics(playerDetails.getId())); + var recoveryCode = UUID.randomUUID().toString(); + var userId = PlayerDao.getId(webConnection.post().getString("forgottenpw-username")); + + PlayerStatisticsDao.updateStatistic(userId, PlayerStatistic.FORGOT_PASSWORD_CODE, recoveryCode); + PlayerStatisticsDao.updateStatistic(userId, PlayerStatistic.FORGOT_RECOVERY_REQUESTED_TIME, DateUtil.getCurrentTimeSeconds()); + + if (GameConfiguration.getInstance().getBoolean("email.smtp.enable")) { + EmailUtil.send(webConnection, email, "Password recovery at Classic Habbo", + EmailUtil.renderPasswordRecovery( + details.getId(), + details.getName(), + recoveryCode + ) + ); + } + + + template = webConnection.template("account/email/sent"); + template.render(); + return; + //template.set("validForgetPassword", true); + } + } + + + webConnection.session().set("page", "recover"); + template.render(); + } + + + public static void recovery(WebConnection webConnection) throws Exception { + if (!GameConfiguration.getInstance().getBoolean("email.smtp.enable")) { + webConnection.redirect("/"); + return; + } + + int userId = 0; + + try { + userId = webConnection.get().getInt("id"); + } catch (Exception ex) { + + } + + String recoveryCode = webConnection.get().getString("code"); + + var template = webConnection.template("account/email/account_recovery"); + PlayerDetails playerDetails = (PlayerDetails) template.get("playerDetails"); + + if (webConnection.post().contains("user_id") && webConnection.post().contains("recovery_code")) { + userId = webConnection.post().getInt("user_id"); + recoveryCode = webConnection.post().getString("recovery_code"); + } + + if ((userId == 0 || recoveryCode == null) || !EmailDao.recoveryExists(userId, recoveryCode)) { + webConnection.session().set("alertMessage", "The recovery code was invalid"); + webConnection.session().set("alertColour", "red"); + } else { + if (webConnection.post().contains("password") && webConnection.post().contains("confirmpassword")) { + var password = webConnection.post().getString("password"); + var newPassword = webConnection.post().getString("confirmpassword"); + + if (!newPassword.equals(password)) { + webConnection.session().set("alertMessage", "The passwords don't match"); + webConnection.session().set("alertColour", "red"); + } else if (newPassword.length() < 6) { + webConnection.session().set("alertMessage", "Password is too short, 6 characters minimum"); + webConnection.session().set("alertColour", "red"); + } else { + webConnection.session().set("alertMessage", "Your password has been changed successfully."); + webConnection.session().set("alertColour", "green"); + + PlayerDao.setPassword(userId, PlayerDao.createPassword(newPassword)); + EmailDao.removeRecoveryCode(userId); + } + } + + template.set("recoveryCode", recoveryCode); + template.set("userId", userId); + } + + template.render(); + + webConnection.session().delete("alertMessage"); + webConnection.session().delete("alertColour"); + } + + public static void activate(WebConnection webConnection) { + if (!GameConfiguration.getInstance().getBoolean("email.smtp.enable")) { + webConnection.redirect("/"); + return; + } + + int userId = 0; + + try { + userId = webConnection.get().getInt("id"); + } catch (Exception ex) { + + } + + String activationCode = webConnection.get().getString("code"); + + var template = webConnection.template("account/email/account_activated"); + template.set("verifySuccess", true); + + if (userId == 0 || activationCode == null) { + template.set("verifySuccess", false); + } else if (!EmailDao.exists(userId, activationCode)) { + template.set("verifySuccess", false); + } else { + EmailDao.activate(userId, activationCode); + } + + template.render(); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/site/RegisterController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/site/RegisterController.java new file mode 100644 index 0000000..a67f3b9 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/site/RegisterController.java @@ -0,0 +1,274 @@ +package org.alexdev.http.controllers.site; + +import io.netty.handler.codec.http.FullHttpResponse; +import io.netty.handler.codec.http.HttpResponseStatus; +import org.alexdev.duckhttpd.response.ResponseBuilder; +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.duckhttpd.util.MimeType; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.dao.mysql.PlayerStatisticsDao; +import org.alexdev.havana.dao.mysql.ReferredDao; +import org.alexdev.havana.game.misc.figure.FigureManager; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.FigureUtil; +import org.alexdev.havana.util.config.GameConfiguration; +import org.alexdev.http.dao.RegisterDao; +import org.alexdev.http.util.*; + +import java.util.UUID; +import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.TimeUnit; + +public class RegisterController { + public static void register(WebConnection webConnection) throws Exception { + if (webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/me"); + return; + } + + int maxConnectionsPerIp = GameConfiguration.getInstance().getInteger("max.connections.per.ip"); + String ipAddress = webConnection.getIpAddress(); + + if (PlayerDao.countIpAddress(ipAddress) >= maxConnectionsPerIp) { + webConnection.session().set("alertMessage", "You already have enough accounts registered"); + webConnection.redirect("/"); + return; + } + + if (webConnection.cookies().exists(SessionUtil.MACHINE_ID)) { + var machineId = webConnection.cookies().get(SessionUtil.MACHINE_ID); + + if (PlayerDao.countMachineId("#" + machineId) >= maxConnectionsPerIp) { + webConnection.session().set("alertMessage", "You already have enough accounts registered"); + webConnection.redirect("/"); + return; + } + } + + if (GameConfiguration.getInstance().getBoolean("registration.disabled")) { + var template = webConnection.template("register_disabled"); + template.render(); + return; + } + + int referral = 0; + + try { + referral = webConnection.get().contains("referral") ? webConnection.get().getInt("referral") : 0; + } catch (Exception ignored) { + + } + + if (referral > 0) { + webConnection.session().set("referral", referral); + } + + if (webConnection.post().queries().size() > 3) { + String[] checkEmpty = new String[]{"bean.avatarName", "bean.captchaResponse", "retypedPassword", "bean.email"}; + + for (var field : checkEmpty) { + if (webConnection.post().queries().containsKey(field) && webConnection.post().getString(field).isBlank()) { + webConnection.session().set("captcha.invalid", false); + webConnection.redirect("/register?errorCode=blank_fields"); + break; + } + } + + String username = "";//HtmlUtil.removeHtmlTags(webConnection.session().getString("registerUsername")); + String email = "";//HtmlUtil.removeHtmlTags(webConnection.session().getString("registerEmail")); + + if (webConnection.post().contains("registerUsername")) { + username = HtmlUtil.removeHtmlTags(webConnection.session().getString("registerUsername")); + } + + if (webConnection.post().contains("registerEmail")) { + email = HtmlUtil.removeHtmlTags(webConnection.session().getString("registerEmail")); + } + + if (webConnection.post().contains("bean.avatarName")) { + username = HtmlUtil.removeHtmlTags(webConnection.post().getString("bean.avatarName")); + } + + if (webConnection.post().contains("bean.email")) { + email = HtmlUtil.removeHtmlTags(webConnection.post().getString("bean.email")); + } + + //String username = HtmlUtil.removeHtmlTags(webConnection.post().getString("bean.avatarName")); + //String email = HtmlUtil.removeHtmlTags(webConnection.post().getString("bean.email")); + + if (webConnection.post().queries().size() > 10) { + String password = HtmlUtil.removeHtmlTags(webConnection.post().getString("retypedPassword")); + String day = HtmlUtil.removeHtmlTags(webConnection.post().getString("bean.day")); + String month = HtmlUtil.removeHtmlTags(webConnection.post().getString("bean.month")); + String year = HtmlUtil.removeHtmlTags(webConnection.post().getString("bean.year")); + String figure = null; + String gender = null; + + if (webConnection.post().contains("randomFigure")) { + String temp = HtmlUtil.removeHtmlTags(webConnection.post().getString("randomFigure")); + figure = temp.substring(2); + gender = temp.substring(0, 1); + } else { + figure = HtmlUtil.removeHtmlTags(webConnection.post().getString("bean.figure")); + gender = HtmlUtil.removeHtmlTags(webConnection.post().getString("bean.gender")); + } + + webConnection.session().set("registerUsername", username); + webConnection.session().set("registerPassword", password); + webConnection.session().set("registerShowPassword", password.replaceAll("(?s).", "*")); + webConnection.session().set("registerFigure", figure); + webConnection.session().set("registerGender", gender); + webConnection.session().set("registerEmail", email); + webConnection.session().set("registerDay", day); + webConnection.session().set("registerMonth", month); + webConnection.session().set("registerYear", year); + + if (!FigureManager.getInstance().validateFigure(figure, gender, false)) { + webConnection.redirect("/register?error=bad_look"); + return; + } + + if (!RegisterUtil.isValidName(username)) { + webConnection.redirect("/register?error=bad_username"); + return; + } + + if (!RegisterUtil.isValidEmail(email)) { + webConnection.session().set("email.invalid", true); + webConnection.redirect("/register?error=bad_email"); + return; + } + } + + String captchaResponse = HtmlUtil.removeHtmlTags(webConnection.post().getString("bean.captchaResponse")); + + if (!captchaResponse.equals(webConnection.session().getString("captcha-text"))) { + webConnection.session().set("captcha.invalid", true); + webConnection.redirect("/register?error=bad_captcha"); + return; + } else { + if (webConnection.post().contains("bean.email")) { + email = HtmlUtil.removeHtmlTags(webConnection.post().getString("bean.email")); + webConnection.session().set("registerEmail", email); + } + + if (!RegisterUtil.isValidEmail(webConnection.session().getString("registerEmail"))) { + webConnection.session().set("email.invalid", true); + webConnection.redirect("/register?error=bad_email"); + return; + } + + String hashedPassword = PlayerDao.createPassword(webConnection.session().getString("registerPassword")); + int userId = RegisterDao.newUser( + webConnection.session().getString("registerUsername"), + hashedPassword, + webConnection.session().getString("registerFigure"), + webConnection.session().getString("registerGender"), + webConnection.session().getString("registerEmail")); + + String activationCode = UUID.randomUUID().toString(); + PlayerStatisticsDao.newStatistics(userId, activationCode); + + if (GameConfiguration.getInstance().getBoolean("email.smtp.enable")) { + EmailUtil.send(webConnection, webConnection.session().getString("registerEmail"), "Activate your account at Classic Habbo", + EmailUtil.renderRegistered( + userId, + webConnection.session().getString("registerUsername"), + webConnection.session().getString("registerEmail"), + activationCode + ) + ); + } + + var latestIpAddress = PlayerDao.getLatestIp(userId); + + if (latestIpAddress == null || !latestIpAddress.equals(ipAddress)) { + PlayerDao.logIpAddress(userId, ipAddress); + } + + referral = webConnection.session().getInt("referral"); + + if (referral > 0) { + ReferredDao.addReferred(referral, userId); + } + + webConnection.session().delete("referral"); + webConnection.session().delete("captcha.invalid"); + + webConnection.session().set("user.id", userId); + webConnection.session().set("authenticated", true); + + /* + if (GameConfiguration.getInstance().getBoolean("free.month.hc.registration")) { + PlayerDao.saveSubscription(userId, 0, DateUtil.getCurrentTimeSeconds() + TimeUnit.DAYS.toSeconds(30)); + } + */ + + /*if (webConnection.cookies().exists(SessionUtil.MACHINE_ID)) { + var machineId = webConnection.cookies().get(SessionUtil.MACHINE_ID); + + if (PlayerDao.countMachineId("#" + machineId) > 0) { + PlayerDao.setMachineId(userId, "#" + machineId); + webConnection.cookies().set(SessionUtil.MACHINE_ID, machineId.replace("#", ""), 2, TimeUnit.DAYS); + } + }*/ + + //AlertsDao.createAlert(userId, AlertType.CREDIT_DONATION, "A reminder
If you play for 5 minutes daily, you will receive 120 credits!"); + webConnection.redirect("/welcome"); + } + + //webConnection.session().delete("captcha-text"); + } else { + var template = webConnection.template("register"); + + if (webConnection.session().getBoolean("captcha.invalid") || webConnection.session().getBoolean("email.invalid")) { + if (webConnection.session().getBoolean("captcha.invalid")) { + template.set("registerCaptchaInvalid", true); + } + + if (webConnection.session().getBoolean("email.invalid")) { + template.set("registerEmailInvalid", true); + } + + template.set("registerUsername", webConnection.session().getString("registerUsername")); + template.set("registerShowPassword", webConnection.session().getString("registerPassword").replaceAll("(?s).", "*")); + template.set("registerFigure", webConnection.session().getString("registerFigure")); + template.set("registerGender", webConnection.session().getString("registerGender")); + template.set("registerEmail", webConnection.session().getString("registerEmail")); + template.set("registerDay", webConnection.session().getString("registerDay")); + template.set("registerMonth", webConnection.session().getString("registerMonth")); + template.set("registerYear", webConnection.session().getString("registerYear")); + } + + template.set("randomNum", ThreadLocalRandom.current().nextInt(0, 10000)); + template.set("randomFemaleFigure1", FigureUtil.getRandomFigure("F", false)); + template.set("randomFemaleFigure2", FigureUtil.getRandomFigure("F", false)); + template.set("randomFemaleFigure3", FigureUtil.getRandomFigure("F", false)); + + template.set("randomMaleFigure1", FigureUtil.getRandomFigure("M", false)); + template.set("randomMaleFigure2", FigureUtil.getRandomFigure("M", false)); + template.set("randomMaleFigure3", FigureUtil.getRandomFigure("M", false)); + + template.set("referral", webConnection.session().getInt("referral")); + + template.render(); + } + } + + public static void registerCancelled(WebConnection webConnection) { + webConnection.session().delete("referral"); + webConnection.session().delete("captcha.invalid"); + webConnection.redirect("/"); + } + + public static void captcha(WebConnection webConnection) { + String captchaText = Captcha.generateText(7); + webConnection.session().set("captcha-text", captchaText); + + FullHttpResponse response = ResponseBuilder.create( + HttpResponseStatus.OK, MimeType.getContentType("png"), Captcha.generateImage(captchaText) + ); + + webConnection.send(response); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/site/SiteController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/site/SiteController.java new file mode 100644 index 0000000..ddc4588 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/site/SiteController.java @@ -0,0 +1,19 @@ +package org.alexdev.http.controllers.site; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.http.util.XSSUtil; + +public class SiteController { + public static void pixels(WebConnection webConnection) { + XSSUtil.clear(webConnection); + + if (!webConnection.session().contains("authenticated")) { + return; + } + + var template = webConnection.template("pixels"); + webConnection.session().set("page", "credits"); + template.render(); + } + +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/controllers/site/TagController.java b/Havana-Web/src/main/java/org/alexdev/http/controllers/site/TagController.java new file mode 100644 index 0000000..bbae129 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/controllers/site/TagController.java @@ -0,0 +1,330 @@ +package org.alexdev.http.controllers.site; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.havana.dao.mysql.MessengerDao; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.dao.mysql.TagDao; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.tags.HabboTag; +import org.alexdev.havana.game.wordfilter.WordfilterManager; +import org.alexdev.havana.server.rcon.messages.RconHeader; +import org.alexdev.havana.util.StringUtil; +import org.alexdev.havana.util.config.GameConfiguration; +import org.alexdev.http.server.Watchdog; +import org.alexdev.http.util.HtmlUtil; +import org.alexdev.http.util.RconUtil; +import org.alexdev.http.util.TagUtil; +import org.alexdev.http.util.XSSUtil; +import org.apache.commons.lang3.StringUtils; + +import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class TagController { + public static void tag(WebConnection webConnection) { + XSSUtil.clear(webConnection); + + int pageId = webConnection.get().getInt("pageNumber"); + + List tags = new ArrayList<>(); + Map> paginatedUsers = StringUtil.paginate(tags, 5); + + if (!paginatedUsers.containsKey(pageId - 1)) { + pageId = 1; + } + + if (paginatedUsers.get(pageId - 1) == null) { + paginatedUsers.put(pageId - 1, new ArrayList<>()); + } + + var tpl = webConnection.template("tag"); + tpl.set("tagList", paginatedUsers.get(pageId - 1)); + tpl.set("pageId", pageId); + tpl.set("totalCount", tags.size()); + tpl.set("tagCloud", Watchdog.TAG_CLOUD_10); + tpl.set("tagSearchAdd", ""); + tpl.set("showOlder", false); + tpl.set("showOldest", false); + tpl.set("showNewer", false); + tpl.set("showNewest", false); + tpl.set("showFirst", false); + tpl.set("showLast", false); + tpl.set("showFirstPage", 1); + webConnection.session().set("page", "community"); + tpl.render(); + } + + public static void search(WebConnection webConnection) { + String tag = null; + int pageId = 1;// + + try { + pageId = webConnection.get().getInt("pageNumber"); + } catch (Exception ex) { + + } + + if (webConnection.get().contains("tag")) { + tag = webConnection.get().getString("tag"); + } else { + tag = webConnection.getMatches().get(0); + } + + respondWithSearch(webConnection, tag, pageId, "tag"); + } + + + public static void tagsearch(WebConnection webConnection) { + XSSUtil.clear(webConnection); + + int pageId = 0; + String tag = webConnection.post().getString("tag"); + + respondWithSearch(webConnection, tag, pageId, "base/tag_search"); + } + + private static void respondWithSearch(WebConnection webConnection, String tag, int pageId, String template) { + XSSUtil.clear(webConnection); + + try { + tag = URLDecoder.decode(tag, StandardCharsets.UTF_8); + } catch (Exception ex) { + + } + + List tags = tag.isBlank() ? new ArrayList<>() : TagDao.getTagInfoList(tag); + Map> paginatedUsers = StringUtil.paginate(tags, 5); + + if (!paginatedUsers.containsKey(pageId - 1)) { + pageId = 1; + } + + tag = StringUtils.normalizeSpace(HtmlUtil.removeHtmlTags(tag)); + var tpl = webConnection.template(template); + + tpl.set("tagSearchAdd", ""); + + if (webConnection.session().getBoolean("authenticated")) { + int userId = webConnection.session().getInt("user.id"); + + var temporaryTag = StringUtil.isValidTag(tag, userId, 0, 0); + boolean isValidTag = temporaryTag != null; + + if (isValidTag) { + tpl.set("tagSearchAdd", "

Tag yourself with: " + tag + "

\n"); + } + } + + tpl.set("showOlder", false); + tpl.set("showOldest", false); + tpl.set("showNewer", false); + tpl.set("showNewest", false); + tpl.set("showFirst", false); + tpl.set("showFirstPage", 1); + tpl.set("showLast", false); + + int codePage = pageId - 1; + + if (paginatedUsers.containsKey(codePage - 1)) { + tpl.set("showOlder", true); + } + + if (paginatedUsers.containsKey(codePage - 2)) { + tpl.set("showOldest", true); + } + + if (paginatedUsers.containsKey(codePage + 1)) { + tpl.set("showNewer", true); + } + + if (paginatedUsers.containsKey(codePage + 2)) { + tpl.set("showNewest", true); + } + + if (paginatedUsers.containsKey(codePage + 3)) { + tpl.set("showLast", true); + tpl.set("showLastPage", paginatedUsers.size()); + } + + if (paginatedUsers.containsKey(codePage - 3)) { + tpl.set("showFirst", true); + tpl.set("showFirstPage", 1); + } + + tpl.set("tagList", paginatedUsers.get(pageId - 1)); + tpl.set("totalTagUsers", paginatedUsers); + tpl.set("tag", tag); + tpl.set("pageId", pageId); + tpl.set("totalCount", tags.size()); + tpl.set("tagCloud", Watchdog.TAG_CLOUD_10); + tpl.set("lastPage", tags.size()); + webConnection.session().set("page", "community"); + tpl.render(); + } + + public static void add(WebConnection webConnection) { + XSSUtil.clear(webConnection); + + int userId = webConnection.session().getInt("user.id"); + + if (userId < 1) { + return; + } + + var tagList = TagDao.getUserTags(userId); + + if (tagList.size() >= GameConfiguration.getInstance().getInteger("max.tags.users")) { + webConnection.send("taglimit"); + return; + } + + String tag = StringUtil.isValidTag(webConnection.post().getString("tagName"), userId, 0, 0); + + if (tag == null) { + webConnection.send("invalidtag"); + return; + } + + if (WordfilterManager.filterSentence(tag).equals(tag)) { + StringUtil.addTag(tag, userId, 0, 0); + } + + webConnection.send("valid"); + + RconUtil.sendCommand(RconHeader.REFRESH_TAGS, new HashMap<>() {{ + put("userId", userId); + }}); + } + + + public static void remove(WebConnection webConnection) { + XSSUtil.clear(webConnection); + + int userId = webConnection.session().getInt("user.id"); + + if (userId < 1) { + webConnection.send(""); + return; + } + + var template = webConnection.template("homes/widget/habblet/taglist"); + PlayerDetails playerDetails = (PlayerDetails) template.get("playerDetails"); + + if (playerDetails == null) { + webConnection.send(""); + return; + } + + String tag = webConnection.post().getString("tagName"); + TagDao.removeTag(userId, 0, 0, tag); + + List tags = TagDao.getUserTags(userId); + + template.set("tags", tags); + template.set("user", playerDetails); + template.render(); + + RconUtil.sendCommand(RconHeader.REFRESH_TAGS, new HashMap<>() {{ + put("userId", userId); + }}); + } + + public static void mytaglist(WebConnection webConnection) { + int userId = webConnection.session().getInt("user.id"); + + if (userId < 1) { + return; + } + + var template = webConnection.template("habblet/myTagList"); + template.set("tags", TagDao.getUserTags(userId)); + template.set("tagRandomQuestion", TagUtil.getRandomQuestion()); + template.render(); + } + + public static void tagfight(WebConnection webConnection) { + /*
+ Tie!
+ test + (1) hits +
+ alex + (1) hits +
+
+ + New Fight + +
+*/ + String firstTag = HtmlUtil.removeHtmlTags(webConnection.post().getString("tag1")); + String secondTag = HtmlUtil.removeHtmlTags(webConnection.post().getString("tag2")); + + int firstCount = TagDao.countTag(firstTag); + int secondCount = TagDao.countTag(secondTag); + int imageNumber = 0; + + String result = "Tie!"; + + if (secondCount > firstCount) { + imageNumber = 1; + result = "The winner is:"; + } + + if (secondCount < firstCount) { + imageNumber = 2; + result = "The winner is:"; + } + + var template = webConnection.template("habblet/tagFightResult"); + template.set("result", result); + template.set("resultTag1", firstTag); + template.set("resultTag2", secondTag); + template.set("resultHits1", firstCount); + template.set("resultHits2", secondCount); + template.set("tagFightImage", imageNumber); + template.render(); + } + + public static void tagmatch(WebConnection webConnection) { + if (!webConnection.session().getBoolean("authenticated")) { + webConnection.redirect("/"); + return; + } + + var template = webConnection.template("habblet/tagMatch"); + PlayerDetails playerDetails = (PlayerDetails) template.get("playerDetails"); + + if (playerDetails == null) { + webConnection.redirect("/"); + return; + } + + String friendName = webConnection.post().getString("friendName"); + String errorMessage = ""; + + if (!MessengerDao.friendExists(playerDetails.getId(), PlayerDao.getId(friendName))) { + errorMessage = "Friend not found. Are you sure that they really exist?"; + } + + template.set("errorMsg", errorMessage); + template.render(); + } + + public static void remove_all_tags(WebConnection webConnection) { + int userId = webConnection.session().getInt("user.id"); + + if (userId < 1) { + webConnection.send("Please login to remove all your tags."); + return; + } + + var myTagList = TagDao.getUserTags(userId); + TagDao.removeTags(userId, 0, 0); + webConnection.send("All tags removed!

The tags removed: " + String.join(", ", myTagList)); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/dao/CommunityDao.java b/Havana-Web/src/main/java/org/alexdev/http/dao/CommunityDao.java new file mode 100644 index 0000000..f964410 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/dao/CommunityDao.java @@ -0,0 +1,153 @@ +package org.alexdev.http.dao; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.dao.mysql.GroupDao; +import org.alexdev.havana.dao.mysql.ItemDao; +import org.alexdev.havana.game.groups.Group; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.Photo; +import org.alexdev.http.game.CommunityPhoto; +import org.alexdev.http.game.groups.DiscussionTopic; +import org.alexdev.photorenderer.PhotoRenderer; + +import java.sql.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class CommunityDao { + public static Map getHotGroups(int limit, int offset) { + Map hotGroups = new HashMap<>(); + // SELECT group_id, COUNT(group_id) AS popularity FROM groups_memberships WHERE (UNIX_TIMESTAMP(created_at) + 2592000) > UNIX_TIMESTAMP() GROUP BY group_id + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT *, " + + "(SELECT COUNT(*) FROM groups_memberships " + + "WHERE group_id = id " + + "AND (groups_memberships.created_at between (CURDATE() - INTERVAL 1 MONTH ) and CURDATE())) AS popularity " + + "FROM groups_details " + + "WHERE groups_details.created_at between (CURDATE() - INTERVAL 1 MONTH) and CURDATE()" + + "LIMIT " + limit + " OFFSET " + offset, sqlConnection); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + hotGroups.put(GroupDao.fill(resultSet), resultSet.getInt("popularity")); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(resultSet); + } + + return hotGroups; + } + + public static List getRecentDiscussions(int limit, int offset) { + List discussionList = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT DISTINCT " + + "cms_forum_threads.*, " + + "cms_forum_replies.created_at AS last_message_at, " + + "cms_forum_replies.id AS last_reply_id, " + + /* + "creator.username AS creator_name, " + + "creator.id AS creator_id, " + + "replier.username AS last_reply_name, " + + */ + "'' AS creator_name, " + + "0 AS creator_id, " + + "'' AS last_reply_name, " + + "(SELECT COUNT(*) FROM cms_forum_replies WHERE cms_forum_replies.thread_id = cms_forum_threads.id) AS reply_count, " + + /*(userId > 0 ? "(SELECT COUNT(*) FROM cms_forums_read_replies WHERE cms_forums_read_replies.reply_id = last_reply_id AND cms_forums_read_replies.user_id = " + userId + " AND " + + "last_message_at < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL " + GroupDiscussionDao.MAX_UNREAD_DAYS + " DAY))) AS has_read " : "0 as has_read ") +*/ + "0 as has_read " + + "FROM " + + "cms_forum_replies " + + "INNER JOIN cms_forum_threads ON cms_forum_threads.id = cms_forum_replies.thread_id " + + //"INNER JOIN users replier ON cms_forum_replies.poster_id = replier.id " + + //"INNER JOIN users creator ON cms_forum_threads.poster_id = creator.id " + + "WHERE " + + "cms_forum_replies.id = (SELECT MAX(id) FROM cms_forum_replies WHERE cms_forum_replies.thread_id = cms_forum_threads.id) " + + "ORDER BY " + + //"is_stickied DESC, " + + "cms_forum_replies.created_at DESC " + + "LIMIT " + limit + " OFFSET " + offset, sqlConnection); + /*preparedStatement = Storage.getStorage().prepare("SELECT DISTINCT " + + "cms_forum_threads.*, " + + "NOW() AS last_message_at, " + + "0 AS last_reply_id, " + + "'null' AS creator_name, " + + "0 AS creator_id, " + + "'null' AS last_reply_name, " + + "(SELECT COUNT(*) FROM cms_forum_replies WHERE cms_forum_replies.thread_id = cms_forum_threads.id) AS reply_count, " + + "0 as has_read " + + "FROM " + + "cms_forum_threads " + + "ORDER BY " + + "created_at DESC " + + "LIMIT " + limit + " OFFSET " + offset, sqlConnection);*/ + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + discussionList.add(GroupDiscussionDao.fill(resultSet)); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(resultSet); + } + + return discussionList; + } + + public static List getPhotos(int userId) throws SQLException { + List photoList = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM items_photos WHERE photo_user_id = ? ORDER BY timestamp DESC", sqlConnection);// (photo_id, photo_user_id, timestamp, photo_data, photo_checksum) VALUES (?, ?, ?, ?, ?)", sqlConnection); + preparedStatement.setInt(1, userId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + Blob photoBlob = resultSet.getBlob("photo_data"); + int blobLength = (int) photoBlob.length(); + + byte[] photoBlobBytes = photoBlob.getBytes(1, blobLength); + photoList.add(new Photo(resultSet.getInt("photo_id"), resultSet.getInt("photo_checksum"), photoBlobBytes, resultSet.getLong("timestamp"))); + } + + } catch (Exception e) { + Storage.logError(e); + throw e; + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(resultSet); + } + + return photoList; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/dao/EmailDao.java b/Havana-Web/src/main/java/org/alexdev/http/dao/EmailDao.java new file mode 100644 index 0000000..7be293d --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/dao/EmailDao.java @@ -0,0 +1,212 @@ +package org.alexdev.http.dao; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.game.player.PlayerDetails; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +public class EmailDao { + public static boolean exists(int id, String activationCode) { + boolean exists = false; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM users_statistics WHERE user_id = ? AND activation_code = ? LIMIT 1", sqlConnection); + preparedStatement.setInt(1, id); + preparedStatement.setString(2, activationCode); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + exists = true; + } + } catch (SQLException e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return exists; + } + + public static boolean recoveryExists(int id, String recoveryCode) { + boolean exists = false; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM users_statistics WHERE user_id = ? AND forgot_password_code = ? LIMIT 1", sqlConnection); + preparedStatement.setInt(1, id); + preparedStatement.setString(2, recoveryCode); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + exists = true; + } + } catch (SQLException e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return exists; + } + + public static void activate(int userId, String activationCode) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE users_statistics SET activation_code = NULL WHERE user_id = ? AND activation_code = ? LIMIT 1", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setString(2, activationCode); + preparedStatement.execute(); + } catch (SQLException e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + } + + public static void removeRecoveryCode(int userId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE users_statistics SET forgot_password_code = NULL, forgot_recovery_requested_time = NULL WHERE user_id = ? LIMIT 1", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.execute(); + } catch (SQLException e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void removeRecoveryCodeBatch() { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE users_statistics SET forgot_password_code = NULL, forgot_recovery_requested_time = NULL WHERE forgot_recovery_requested_time < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 1 DAY))", sqlConnection); + preparedStatement.execute(); + } catch (SQLException e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static boolean hasUserTradePass(int userId, String email) { + boolean exists = false; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM users INNER JOIN users_statistics ON users.id = users_statistics.user_id WHERE email = ? AND id <> ?", sqlConnection); + preparedStatement.setString(1, email); + preparedStatement.setInt(2, userId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + exists = resultSet.getString("activation_code") == null && resultSet.getBoolean("trade_enabled"); + } + } catch (SQLException e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return exists; + } + + public static PlayerDetails getDetails(String username, String email) { + PlayerDetails playerDetails = null; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM users WHERE username = ? AND email = ? LIMIT 1", sqlConnection); + preparedStatement.setString(1, username); + preparedStatement.setString(2, email); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + playerDetails = new PlayerDetails(); + PlayerDao.fill(playerDetails, resultSet); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return playerDetails; + } + + public static boolean getDetailsByEmail(String email) { + boolean exists = false; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT id FROM users WHERE email = ? LIMIT 1", sqlConnection); + preparedStatement.setString(1, email); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + exists = true; + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return exists; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/dao/FriendManagementDao.java b/Havana-Web/src/main/java/org/alexdev/http/dao/FriendManagementDao.java new file mode 100644 index 0000000..764ee37 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/dao/FriendManagementDao.java @@ -0,0 +1,158 @@ +package org.alexdev.http.dao; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.game.messenger.MessengerUser; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.ArrayList; +import java.util.List; + +public class FriendManagementDao { + /** + * Gets the friends through pagination. + * + * @param userId the user id + * @return the friends + */ + public static List getFriends(int userId, int page, int itemsPerPage) { + List friends = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT id,username,figure,motto,last_online,sex,allow_stalking,is_online,category_id,online_status_visible FROM messenger_friends INNER JOIN users ON messenger_friends.from_id = users.id WHERE to_id = ? " + + "ORDER BY UNIX_TIMESTAMP(last_online) DESC LIMIT " + ((page - 1) * itemsPerPage) + "," + itemsPerPage, sqlConnection); + preparedStatement.setInt(1, userId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + friends.add(new MessengerUser(resultSet.getInt("id"), resultSet.getString("username"), resultSet.getString("figure"), + resultSet.getString("sex"), resultSet.getString("motto"), resultSet.getTime("last_online").getTime() / 1000L, + resultSet.getBoolean("allow_stalking"), resultSet.getInt("category_id"), + resultSet.getBoolean("is_online"), resultSet.getBoolean("online_status_visible"))); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return friends; + } + + /** + * Gets the friends through pagination. + * + * @param userId the user id + * @return the friends + */ + public static List getFriendsSearch(int userId, String searchQuery, int page, int itemsPerPage) { + List friends = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT id,username,figure,motto,last_online,sex,allow_stalking,is_online,category_id,online_status_visible FROM messenger_friends INNER JOIN users ON messenger_friends.from_id = users.id WHERE to_id = ? " + + "AND username LIKE ? ORDER BY UNIX_TIMESTAMP(last_online) DESC LIMIT " + ((page - 1) * itemsPerPage) + "," + itemsPerPage, sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setString(2, searchQuery + "%"); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + friends.add(new MessengerUser(resultSet.getInt("id"), resultSet.getString("username"), resultSet.getString("figure"), + resultSet.getString("sex"), resultSet.getString("motto"), resultSet.getTime("last_online").getTime() / 1000L, + resultSet.getBoolean("allow_stalking"), resultSet.getInt("category_id"), + resultSet.getBoolean("is_online"), resultSet.getBoolean("online_status_visible"))); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return friends; +} + + /** + * Gets the friends through pagination. + * + * @param userId the user id + * @return the friends + */ + public static int getFriendsCount(int userId, String searchQuery) { + int friends = 0; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT COUNT(*) as friends_amount,username FROM messenger_friends INNER JOIN users ON messenger_friends.from_id = users.id WHERE to_id = ? AND username LIKE ?", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setString(2, searchQuery + "%"); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + friends = resultSet.getInt("friends_amount"); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return friends; + } + + /** + * Counts the friends through search querying. + * + * @param userId the user id + * @return the friends + */ + public static int getFriendsCount(int userId) { + int friends = 0; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT count(*) as friends_amount FROM messenger_friends WHERE to_id = ?", sqlConnection); + preparedStatement.setInt(1, userId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + friends = resultSet.getInt("friends_amount"); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return friends; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/dao/GroupDiscussionDao.java b/Havana-Web/src/main/java/org/alexdev/http/dao/GroupDiscussionDao.java new file mode 100644 index 0000000..9371429 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/dao/GroupDiscussionDao.java @@ -0,0 +1,643 @@ +package org.alexdev.http.dao; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.http.game.groups.DiscussionReply; +import org.alexdev.http.game.groups.DiscussionTopic; +import org.apache.commons.lang3.tuple.Pair; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class GroupDiscussionDao { + public static final int MAX_UNREAD_DAYS = 7; + + public static Pair> getNewGroupMessages(int userId, long lastOnline) { + var groupData = new HashMap(); + var groups = new HashMap(); + int pendingMembers = 0; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT " + + "groups_details.id AS group_id, " + + "groups_details.name AS group_name " + + "FROM groups_memberships " + + "RIGHT JOIN " + + "groups_details ON groups_memberships.group_id = groups_details.id " + + "WHERE (owner_id = ? " + + "OR (groups_memberships.user_id = ? AND groups_memberships.is_pending = 0 AND (groups_memberships.member_rank = '1' OR groups_memberships.member_rank = '2' OR groups_memberships.member_rank = '3')))", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, userId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + int groupId = resultSet.getInt("group_id"); + String groupName = resultSet.getString("group_name"); + groupData.put(String.valueOf(groupId), groupName); + } + + if (groupData.size() > 0) { + preparedStatement = Storage.getStorage().prepare("SELECT group_id " + + "FROM cms_forum_replies " + + "INNER JOIN cms_forum_threads ON cms_forum_threads.id = cms_forum_replies.thread_id " + + "WHERE " + + "cms_forum_threads.group_id IN (" + String.join(",", groupData.keySet()) + ") " + + "AND (DATEDIFF(NOW(), cms_forum_replies.created_at) <= " + GroupDiscussionDao.MAX_UNREAD_DAYS + ") " + + "AND NOT EXISTS (SELECT * FROM cms_forums_read_replies WHERE cms_forums_read_replies.reply_id = (SELECT MAX(id) FROM cms_forum_replies WHERE cms_forum_replies.thread_id = cms_forum_threads.id)" + + " AND cms_forums_read_replies.user_id = " + userId + ") " + + "GROUP BY group_id", sqlConnection); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + int groupId = resultSet.getInt("group_id"); + + if (!groups.containsKey(String.valueOf(groupId))) { + groups.put(String.valueOf(groupId), groupData.get(String.valueOf(groupId))); + } + + pendingMembers++; + } + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return Pair.of(pendingMembers, groups); + } + + public static List getDiscussions(int groupId, int page, int itemsPerPage, int userId) { + List discussionList = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT " + + "cms_forum_threads.*, " + + "cms_forum_replies.created_at AS last_message_at, " + + "cms_forum_replies.id AS last_reply_id, " + + "creator.username AS creator_name, " + + "creator.id AS creator_id, " + + "replier.username AS last_reply_name, " + + "(SELECT COUNT(*) FROM cms_forum_replies WHERE cms_forum_replies.thread_id = cms_forum_threads.id) AS reply_count, " + + (userId > 0 ? "(SELECT COUNT(*) FROM cms_forums_read_replies WHERE (cms_forums_read_replies.reply_id = last_reply_id AND cms_forums_read_replies.user_id = " + userId + ") OR " + + " (DATEDIFF(NOW(), cms_forum_replies.created_at) > " + GroupDiscussionDao.MAX_UNREAD_DAYS + ")) AS has_read " : "0 as has_read ") + + "FROM " + + "cms_forum_replies " + + "INNER JOIN cms_forum_threads ON cms_forum_threads.id = cms_forum_replies.thread_id " + + "INNER JOIN users replier ON cms_forum_replies.poster_id = replier.id " + + "INNER JOIN users creator ON cms_forum_threads.poster_id = creator.id " + + "WHERE " + + "cms_forum_replies.id = (SELECT MAX(id) FROM cms_forum_replies WHERE cms_forum_replies.thread_id = cms_forum_threads.id) AND " + + "group_id = ? " + + "ORDER BY " + + "is_stickied DESC, " + + "cms_forum_replies.created_at DESC " + + "LIMIT " + ((page - 1) * itemsPerPage) + "," + itemsPerPage, sqlConnection); + preparedStatement.setInt(1, groupId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + discussionList.add(fill(resultSet)); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(resultSet); + } + + return discussionList; + } + + public static int countDiscussions(int groupId) { + int discussions = 0; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT COUNT(*) AS discussion_count FROM cms_forum_threads WHERE cms_forum_threads.group_id = ?", sqlConnection); + preparedStatement.setInt(1, groupId); + preparedStatement.executeUpdate(); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + discussions = resultSet.getInt("discussion_count"); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(resultSet); + } + + return discussions; + } + + public static List getReplies(int groupId, int page, int itemsPerPage, int userId) { + List replyList = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT " + + "cms_forum_replies.*, " + + "users.id AS user_id, " + + "users.figure AS figure, " + + "users.username AS username, " + + "users.is_online AS is_online, " + + "IFNULL(users.favourite_group, 0) as group_id, " + + "(SELECT users_badges.badge FROM users_badges WHERE users_badges.user_id = users.id AND users_badges.equipped ORDER BY slot_id ASC LIMIT 1) AS equipped_badge, " + + "(SELECT groups_details.badge FROM groups_details WHERE groups_details.id = users.favourite_group) AS group_badge, " + + "(SELECT COUNT(*) FROM cms_forum_replies WHERE cms_forum_replies.poster_id = users.id) AS forum_messages, " + + (userId > 0 ? "(SELECT COUNT(*) FROM cms_forums_read_replies WHERE (cms_forums_read_replies.reply_id = cms_forum_replies.id AND cms_forums_read_replies.user_id = " + userId + ") OR " + + " (DATEDIFF(NOW(), cms_forum_replies.created_at) > " + GroupDiscussionDao.MAX_UNREAD_DAYS + ")) AS has_read " : "0 as has_read ") + + "FROM " + + "cms_forum_replies " + + "INNER JOIN users ON users.id = cms_forum_replies.poster_id " + + "WHERE " + + "thread_id = ? " + + "ORDER BY " + + "cms_forum_replies.created_at " + + "ASC LIMIT " + ((page - 1) * itemsPerPage) + "," + itemsPerPage, sqlConnection); + preparedStatement.setInt(1, groupId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + replyList.add(fillReply(resultSet)); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(resultSet); + } + + return replyList; + } + + public static int getFirstReply(int discussionId) { + int id = 0; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT id FROM cms_forum_replies WHERE thread_id = ? ORDER BY created_at ASC LIMIT 1", sqlConnection); + preparedStatement.setInt(1, discussionId); + preparedStatement.executeUpdate(); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + id = resultSet.getInt("id"); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(resultSet); + } + + return id; + } + + public static int countReplies(int groupId) { + int replies = 0; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT " + + "COUNT(*) AS replies " + + "FROM " + + "cms_forum_replies " + + "INNER JOIN users ON users.id = cms_forum_replies.poster_id " + + "WHERE " + + "thread_id = ? " + + "ORDER BY " + + "cms_forum_replies.created_at " + + "ASC", sqlConnection); + preparedStatement.setInt(1, groupId); + preparedStatement.executeUpdate(); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + replies = resultSet.getInt("replies"); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(resultSet); + } + + return replies; + } + + public static int createDiscussion(int groupId, int posterId, String topicTitle) { + int id = 0; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO cms_forum_threads (topic_title, poster_id, group_id) VALUES (?, ?, ?)", sqlConnection); + preparedStatement.setString(1, topicTitle); + preparedStatement.setInt(2, posterId); + preparedStatement.setInt(3, groupId); + preparedStatement.executeUpdate(); + resultSet = preparedStatement.getGeneratedKeys(); + + if (resultSet != null && resultSet.next()) { + id = resultSet.getInt(1); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(resultSet); + } + + return id; + } + + public static DiscussionTopic getDiscussion(int groupId, int discussionId, int userId) { + DiscussionTopic topic = null; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT " + + "cms_forum_threads.*, " + + "cms_forum_replies.created_at AS last_message_at, " + + "cms_forum_replies.id AS last_reply_id, " + + "creator.username AS creator_name, " + + "creator.id AS creator_id, " + + "replier.username AS last_reply_name, " + + "(SELECT COUNT(*) FROM cms_forum_replies WHERE cms_forum_replies.thread_id = cms_forum_threads.id) AS reply_count, " + + (userId > 0 ? "(SELECT COUNT(*) FROM cms_forums_read_replies WHERE (cms_forums_read_replies.reply_id = last_reply_id AND cms_forums_read_replies.user_id = " + userId + ") OR " + + " (DATEDIFF(NOW(), cms_forum_replies.created_at) > " + GroupDiscussionDao.MAX_UNREAD_DAYS + ")) AS has_read " : "0 as has_read ") + + "FROM " + + "cms_forum_replies " + + "INNER JOIN cms_forum_threads ON cms_forum_threads.id = cms_forum_replies.thread_id " + + "INNER JOIN users replier ON cms_forum_replies.poster_id = replier.id " + + "INNER JOIN users creator ON cms_forum_threads.poster_id = creator.id " + + "WHERE " + + "cms_forum_threads.group_id = ? " + + "AND cms_forum_threads.id = ? " + + "ORDER BY " + + "cms_forum_replies.created_at " + + "DESC " + + "LIMIT 1", sqlConnection); + preparedStatement.setInt(1, groupId); + preparedStatement.setInt(2, discussionId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + topic = fill(resultSet); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(resultSet); + } + + return topic; + } + + public static DiscussionReply getReply(int discussionId, int replyId, int userId) { + DiscussionReply reply = null; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT " + + "cms_forum_replies.*, " + + "users.id AS user_id, " + + "users.figure AS figure, " + + "users.username AS username, " + + "users.is_online AS is_online, " + + "IFNULL(users.favourite_group, 0) as group_id, " + + "(SELECT users_badges.badge FROM users_badges WHERE users_badges.user_id = users.id AND users_badges.equipped ORDER BY slot_id ASC LIMIT 1) AS equipped_badge, " + + "(SELECT groups_details.badge FROM groups_details WHERE groups_details.id = users.favourite_group) AS group_badge, " + + "(SELECT COUNT(*) FROM cms_forum_replies WHERE cms_forum_replies.poster_id = users.id) AS forum_messages, " + + (userId > 0 ? "(SELECT COUNT(*) FROM cms_forums_read_replies WHERE (cms_forums_read_replies.reply_id = cms_forum_replies.id AND cms_forums_read_replies.user_id = " + userId + ") OR " + + " (DATEDIFF(NOW(), cms_forum_replies.created_at) > " + GroupDiscussionDao.MAX_UNREAD_DAYS + ")) AS has_read " : "0 as has_read ") + + "FROM " + + "cms_forum_replies " + + "INNER JOIN users ON users.id = cms_forum_replies.poster_id " + + "WHERE " + + "thread_id = ? AND cms_forum_replies.id = ? LIMIT 1", sqlConnection); + preparedStatement.setInt(1, discussionId); + preparedStatement.setInt(2, replyId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + reply = fillReply(resultSet); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(resultSet); + } + + return reply; + } + + public static DiscussionReply getLatestReply(int userId) { + DiscussionReply reply = null; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT " + + "cms_forum_replies.*, " + + "users.id AS user_id, " + + "users.figure AS figure, " + + "users.username AS username, " + + "users.is_online AS is_online, " + + "IFNULL(users.favourite_group, 0) as group_id, " + + "(SELECT users_badges.badge FROM users_badges WHERE users_badges.user_id = users.id AND users_badges.equipped ORDER BY slot_id ASC LIMIT 1) AS equipped_badge, " + + "(SELECT groups_details.badge FROM groups_details WHERE groups_details.id = users.favourite_group) AS group_badge, " + + "(SELECT COUNT(*) FROM cms_forum_replies WHERE cms_forum_replies.poster_id = users.id) AS forum_messages, " + + (userId > 0 ? "(SELECT COUNT(*) FROM cms_forums_read_replies WHERE (cms_forums_read_replies.reply_id = cms_forum_replies.id AND cms_forums_read_replies.user_id = " + userId + ") OR " + + " (DATEDIFF(NOW(), cms_forum_replies.created_at) > " + GroupDiscussionDao.MAX_UNREAD_DAYS + ")) AS has_read " : "0 as has_read ") + + "FROM " + + "cms_forum_replies " + + "INNER JOIN users ON users.id = cms_forum_replies.poster_id " + + "WHERE " + + "poster_id = ? ORDER BY created_at DESC LIMIT 1", sqlConnection); + preparedStatement.setInt(1, userId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + reply = fillReply(resultSet); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(resultSet); + } + + return reply; + } + + public static int countUserReplies(int userId) { + int replies = 0; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT COUNT(*) FROM cms_forum_replies WHERE cms_forum_replies.poster_id = ?", sqlConnection); + preparedStatement.setInt(1, userId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + replies = resultSet.getInt(1); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(resultSet); + } + + return replies; + } + + public static String[] getDisplayBadges(int userId) { + String[] badges = new String[2]; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT " + + "(SELECT users_badges.badge FROM users_badges WHERE users_badges.user_id = users.id AND users_badges.equipped ORDER BY slot_id ASC LIMIT 1) AS equipped_badge, " + + "(SELECT groups_details.badge FROM groups_details WHERE groups_details.id = users.favourite_group) AS group_badge " + + "FROM " + + "users " + + "WHERE " + + "users.id = ?", sqlConnection); + preparedStatement.setInt(1, userId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + badges[0] = resultSet.getString("equipped_badge"); + badges[1] = resultSet.getString("group_badge"); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(resultSet); + } + + return badges; + } + + public static void createReplies(int threadId, int posterId, String message) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO cms_forum_replies (thread_id, message, poster_id) VALUES (?, ?, ?)", sqlConnection); + preparedStatement.setInt(1, threadId); + preparedStatement.setString(2, message); + preparedStatement.setInt(3, posterId); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void deleteDiscussion(int groupId, int topicId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM cms_forum_threads WHERE id = ? AND group_id = ?", sqlConnection); + preparedStatement.setInt(1, groupId); + preparedStatement.setInt(2, topicId); + preparedStatement.execute(); + + preparedStatement = Storage.getStorage().prepare("DELETE FROM cms_forum_replies WHERE thread_id = ?", sqlConnection); + preparedStatement.setInt(1, topicId); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void saveDiscussion(DiscussionTopic discussionTopic) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE cms_forum_threads SET topic_title = ?, is_open = ?, is_stickied = ? WHERE id = ?", sqlConnection); + preparedStatement.setString(1, discussionTopic.getTopicTitle()); + preparedStatement.setBoolean(2, discussionTopic.isOpen()); + preparedStatement.setBoolean(3, discussionTopic.isStickied()); + preparedStatement.setInt(4, discussionTopic.getId()); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void saveReply(DiscussionReply discussionReply) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE cms_forum_replies SET is_deleted = ?, is_edited = ?, message = ? WHERE id = ?", sqlConnection); + preparedStatement.setBoolean(1, discussionReply.isDeleted()); + preparedStatement.setBoolean(2, discussionReply.isEdited()); + preparedStatement.setString(3, discussionReply.getMessage()); + preparedStatement.setInt(4, discussionReply.getId()); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void deleteReply(DiscussionReply discussionReply) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM cms_forum_replies WHERE id = ?", sqlConnection); + preparedStatement.setInt(1, discussionReply.getId()); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void incrementViews(int discussionId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE cms_forum_threads SET views = views + 1 WHERE id = ?", sqlConnection); + preparedStatement.setInt(1, discussionId); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static DiscussionTopic fill(ResultSet resultSet) throws SQLException { + return new DiscussionTopic(resultSet.getInt("id"), resultSet.getInt("group_id"), + resultSet.getString("topic_title"), + resultSet.getInt("reply_count"), resultSet.getBoolean("is_open"), + resultSet.getBoolean("is_stickied"), resultSet.getInt("views"), + resultSet.getTime("created_at"), resultSet.getTime("last_message_at"), + resultSet.getInt("creator_id"), + resultSet.getString("creator_name"), resultSet.getString("last_reply_name"), resultSet.getInt("has_read") != 0); + } + + private static DiscussionReply fillReply(ResultSet resultSet) throws SQLException { + return new DiscussionReply(resultSet.getInt("id"), resultSet.getInt("user_id"), + resultSet.getString("message"), resultSet.getString("figure"), + resultSet.getString("username"), resultSet.getBoolean("is_online"), resultSet.getString("equipped_badge"), + resultSet.getInt("group_id"), resultSet.getString("group_badge"), + resultSet.getInt("forum_messages"), + resultSet.getBoolean("is_edited"), resultSet.getBoolean("is_deleted"), + resultSet.getTime("created_at"), resultSet.getTime("modified_at"), resultSet.getInt("has_read") != 0); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/dao/GroupEditDao.java b/Havana-Web/src/main/java/org/alexdev/http/dao/GroupEditDao.java new file mode 100644 index 0000000..6431b47 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/dao/GroupEditDao.java @@ -0,0 +1,151 @@ +package org.alexdev.http.dao; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.util.DateUtil; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.concurrent.TimeUnit; + +public class GroupEditDao { + public static void createSession(int userId, int groupId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO groups_edit_sessions (user_id, group_id, expire) VALUES (?, ?, ?)", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, groupId); + preparedStatement.setLong(3, DateUtil.getCurrentTimeSeconds() + TimeUnit.MINUTES.toSeconds(30)); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static boolean hasSession(int userId, int groupId) { + boolean exists = false; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM groups_edit_sessions WHERE user_id = ? AND group_id = ? AND expire > ? LIMIT 1", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, groupId); + preparedStatement.setLong(3, DateUtil.getCurrentTimeSeconds()); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + exists = true; + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return exists; + } + + public static long getSession(int userId, int groupId) { + long expireDate = -1; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM groups_edit_sessions WHERE user_id = ? AND group_id = ? AND expire > ? LIMIT 1", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, groupId); + preparedStatement.setLong(3, DateUtil.getCurrentTimeSeconds()); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + expireDate = resultSet.getLong("expire"); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return expireDate; + } + + public static void delete(int userId, int groupId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM groups_edit_sessions WHERE user_id = ? AND group_id = ?", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, groupId); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void deleteGroupWidgets(int groupId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM cms_stickers WHERE group_id = ? AND user_id = 0", sqlConnection); + preparedStatement.setInt(1, groupId); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void pickupUserWidgets(int groupId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE cms_stickers SET group_id = 0 WHERE group_id = ? AND user_id <> 0", sqlConnection); + preparedStatement.setInt(1, groupId); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/dao/GuestbookDao.java b/Havana-Web/src/main/java/org/alexdev/http/dao/GuestbookDao.java new file mode 100644 index 0000000..2c1cedf --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/dao/GuestbookDao.java @@ -0,0 +1,156 @@ +package org.alexdev.http.dao; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.http.game.homes.GuestbookEntry; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class GuestbookDao { + public static GuestbookEntry create(int userId, int homeId, int groupId, String message) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + int guestbookId = -1; + long guestbookCreation = -1; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO cms_guestbook_entries (user_id, home_id, group_id, message) VALUES (?, ?, ?, ?)", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, homeId); + preparedStatement.setInt(3, groupId); + preparedStatement.setString(4, message); + preparedStatement.execute(); + resultSet = preparedStatement.getGeneratedKeys(); + + if (resultSet.next()) { + guestbookId = resultSet.getInt("id"); + guestbookCreation = DateUtil.getCurrentTimeSeconds(); + } + + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(sqlConnection); + Storage.closeSilently(preparedStatement); + } + + return new GuestbookEntry(guestbookId, userId, homeId, groupId, message, guestbookCreation); + } + + public static void remove(int id, int homeId, int groupId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM cms_guestbook_entries WHERE id = ? AND home_id = ? AND group_id = ?", sqlConnection); + preparedStatement.setInt(1, id); + preparedStatement.setInt(2, homeId); + preparedStatement.setInt(3, groupId); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(sqlConnection); + Storage.closeSilently(preparedStatement); + } + } + + public static GuestbookEntry getEntry(int id) { + GuestbookEntry entry = null; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM cms_guestbook_entries WHERE id = ?", sqlConnection); + preparedStatement.setInt(1, id); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + entry = fill(resultSet); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(resultSet); + } + + return entry; + } + + public static List getEntriesByHome(int homeId) { + List entries = new ArrayList(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM cms_guestbook_entries WHERE home_id = ? ORDER BY created_at DESC LIMIT 500", sqlConnection); + preparedStatement.setInt(1, homeId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + entries.add(fill(resultSet)); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(resultSet); + } + + return entries; + } + + public static List getEntriesByGroup(int groupId) { + List entries = new ArrayList(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM cms_guestbook_entries WHERE group_id = ? ORDER BY created_at DESC LIMIT 500", sqlConnection); + preparedStatement.setInt(1, groupId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + entries.add(fill(resultSet)); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(resultSet); + } + + return entries; + } + + private static GuestbookEntry fill(ResultSet resultSet) throws SQLException { + return new GuestbookEntry(resultSet.getInt("id"), resultSet.getInt("user_id"), resultSet.getInt("home_id"), resultSet.getInt("group_id"), + resultSet.getString("message"), resultSet.getTime("created_at").getTime() / 1000L); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/dao/HomeEditDao.java b/Havana-Web/src/main/java/org/alexdev/http/dao/HomeEditDao.java new file mode 100644 index 0000000..f55710e --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/dao/HomeEditDao.java @@ -0,0 +1,111 @@ +package org.alexdev.http.dao; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.util.DateUtil; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.concurrent.TimeUnit; + +public class HomeEditDao { + public static void createSession(int userId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO homes_edit_sessions (user_id, expire) VALUES (?, ?)", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setLong(2, DateUtil.getCurrentTimeSeconds() + TimeUnit.MINUTES.toSeconds(30)); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static boolean hasSession(int userId) { + boolean exists = false; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM homes_edit_sessions WHERE user_id = ? AND expire > ? LIMIT 1", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setLong(2, DateUtil.getCurrentTimeSeconds()); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + exists = true; + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return exists; + } + + public static long getSession(int userId) { + long expireDate = -1; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM homes_edit_sessions WHERE user_id = ? AND expire > ? LIMIT 1", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setLong(2, DateUtil.getCurrentTimeSeconds()); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + expireDate = resultSet.getLong("expire"); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return expireDate; + } + + public static void delete(int userId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM homes_edit_sessions WHERE user_id = ?", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/dao/HomesDao.java b/Havana-Web/src/main/java/org/alexdev/http/dao/HomesDao.java new file mode 100644 index 0000000..cfb94d4 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/dao/HomesDao.java @@ -0,0 +1,78 @@ +package org.alexdev.http.dao; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.http.game.homes.Home; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +public class HomesDao { + public static void create(int userId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO homes_details (user_id) VALUES (?)", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(sqlConnection); + Storage.closeSilently(preparedStatement); + } + } + + public static Home getHome(int userId) { + Home home = null; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM homes_details WHERE user_id = ?", sqlConnection); + preparedStatement.setInt(1, userId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + home = fill(resultSet); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(resultSet); + } + + return home; + } + + public static void saveBackground(int userId, String background) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE homes_details SET background = ? WHERE user_id = ?", sqlConnection); + preparedStatement.setString(1, background); + preparedStatement.setInt(2, userId); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(sqlConnection); + Storage.closeSilently(preparedStatement); + }//guestbook_unread_messages + } + + private static Home fill(ResultSet resultSet) throws SQLException { + return new Home(resultSet.getInt("user_id"), resultSet.getString("background")); + } + + +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/dao/HousekeepingDao.java b/Havana-Web/src/main/java/org/alexdev/http/dao/HousekeepingDao.java new file mode 100644 index 0000000..11fd8cc --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/dao/HousekeepingDao.java @@ -0,0 +1,178 @@ +package org.alexdev.http.dao; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.util.DateUtil; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; + +public class HousekeepingDao { + public static int getUserCount() { + int count = 0; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT COUNT(*) AS counted FROM users", sqlConnection); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + count = resultSet.getInt("counted"); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return count; + } + + public static int getRoomItemCount() { + int count = 0; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT COUNT(*) AS counted FROM items WHERE room_id > 0", sqlConnection); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + count = resultSet.getInt("counted"); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return count; + } + + public static int getGroupCount() { + int count = 0; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT COUNT(*) AS counted FROM groups_details", sqlConnection); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + count = resultSet.getInt("counted"); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return count; + } + + public static int getInventoryItemsCount() { + int count = 0; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT COUNT(*) AS counted FROM items WHERE room_id = 0", sqlConnection); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + count = resultSet.getInt("counted"); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return count; + } + + public static int getPetCount() { + int count = 0; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT COUNT(*) AS counted FROM items_pets INNER JOIN items ON items_pets.item_id = items.id", sqlConnection); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + count = resultSet.getInt("counted"); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return count; + } + + public static int getPhotoCount() { + int count = 0; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT COUNT(*) AS counted FROM items_photos INNER JOIN items ON items_photos.photo_id = items.id", sqlConnection); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + count = resultSet.getInt("counted"); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return count; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/dao/MinimailDao.java b/Havana-Web/src/main/java/org/alexdev/http/dao/MinimailDao.java new file mode 100644 index 0000000..049bd79 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/dao/MinimailDao.java @@ -0,0 +1,256 @@ +package org.alexdev.http.dao; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.http.game.minimail.MinimailMessage; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class MinimailDao { + public static MinimailMessage getMessage(int messageId, int targetId) { + MinimailMessage message = null; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM cms_minimail WHERE id = ? AND (target_id = ? OR sender_id = ?)", sqlConnection); + preparedStatement.setInt(1, messageId); + preparedStatement.setInt(2, targetId); + preparedStatement.setInt(3, targetId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + message = fill(resultSet); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return message; + } + + public static List getMessages(int userId) { + List messages = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM cms_minimail WHERE to_id = ? AND is_trash = 0 AND is_deleted = 0 AND target_id = ?", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, userId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + messages.add(fill(resultSet)); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return messages; + } + + public static List getMessagesSent(int userId) { + List messages = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM cms_minimail WHERE sender_id = ? AND is_trash = 0 AND is_deleted = 0 AND target_id = ?", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, userId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + messages.add(fill(resultSet)); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return messages; + } + + public static void createMessages(List minimailMessages) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO cms_minimail (target_id, sender_id, to_id, subject, message, conversation_id) VALUES (?, ?, ?, ?, ?, ?)", sqlConnection); + sqlConnection.setAutoCommit(false); + + for (MinimailMessage minimailMessage : minimailMessages) { + preparedStatement.setInt(1, minimailMessage.getTargetId()); + preparedStatement.setInt(2, minimailMessage.getSenderId()); + preparedStatement.setInt(3, minimailMessage.getToId()); + preparedStatement.setString(4, minimailMessage.getSubject()); + preparedStatement.setString(5, minimailMessage.getMessage()); + preparedStatement.setInt(6, minimailMessage.getConversationId()); + preparedStatement.addBatch(); + } + + preparedStatement.executeBatch(); + sqlConnection.setAutoCommit(true); + + } catch (Exception ex) { + Storage.logError(ex); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void updateMessage(MinimailMessage minimailMessage) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE cms_minimail SET is_trash = ?, conversation_id = ?, is_read = ? WHERE id = ?", sqlConnection); + preparedStatement.setInt(1, minimailMessage.isTrash() ? 1 : 0); + preparedStatement.setInt(2, minimailMessage.getConversationId()); + preparedStatement.setInt(3, minimailMessage.isRead() ? 1 : 0); + preparedStatement.setInt(4, minimailMessage.getId()); + preparedStatement.execute(); + } catch (Exception ex) { + Storage.logError(ex); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void deleteMessage(MinimailMessage minimailMessage) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE cms_minimail SET is_deleted = 1 WHERE id = ? AND target_id = ?", sqlConnection); + preparedStatement.setInt(1, minimailMessage.getId()); + preparedStatement.setInt(2, minimailMessage.getTargetId()); + preparedStatement.execute(); + } catch (Exception ex) { + Storage.logError(ex); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + + public static void emptyTrash(int userId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE cms_minimail SET is_deleted = 1 WHERE is_trash = 1 AND target_id = ?", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.execute(); + } catch (Exception ex) { + Storage.logError(ex); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static List getMessagesConversation(int userId, int conversationId) { + List messages = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM cms_minimail WHERE conversation_id = ? AND target_id = ? OR (sender_id = " + userId + " AND id = " + conversationId + ")", sqlConnection); + preparedStatement.setInt(1, conversationId); + preparedStatement.setInt(2, userId); + + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + messages.add(fill(resultSet)); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return messages; + } + + public static List getMessageTrash(int userId) { + List messages = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM cms_minimail WHERE is_trash = 1 AND is_deleted = 0 AND target_id = ?", sqlConnection); + preparedStatement.setInt(1, userId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + messages.add(fill(resultSet)); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return messages; + } + + private static MinimailMessage fill(ResultSet resultSet) throws SQLException { + return new MinimailMessage(resultSet.getInt("id"), resultSet.getInt("target_id"), resultSet.getInt("to_id"), resultSet.getInt("sender_id"), + resultSet.getBoolean("is_read"), resultSet.getString("subject"), resultSet.getString("message"), resultSet.getTime("date_sent").getTime() / 1000L, + resultSet.getInt("conversation_id"), resultSet.getBoolean("is_trash")); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/dao/NewsDao.java b/Havana-Web/src/main/java/org/alexdev/http/dao/NewsDao.java new file mode 100644 index 0000000..b6d9d28 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/dao/NewsDao.java @@ -0,0 +1,493 @@ +package org.alexdev.http.dao; + +import org.alexdev.duckhttpd.util.config.Settings; +import org.alexdev.havana.dao.Storage; +import org.alexdev.http.game.news.NewsArticle; +import org.alexdev.http.game.news.NewsCategory; +import org.alexdev.http.game.news.NewsDateKey; + +import java.io.File; +import java.nio.file.Paths; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +public class NewsDao { + public static Map> getPastYear(boolean includeUnpublished, int filterCategoryId) { + var monthlyNews = new LinkedHashMap>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + StringBuilder queryBuilder = new StringBuilder(); + queryBuilder.append("SELECT *, " + + "CONCAT(MONTHNAME(created_at), ' ', YEAR(created_at)) AS month_year, " + + "(SELECT GROUP_CONCAT(category_id SEPARATOR ',') FROM site_articles_categories " + + "WHERE article_id = site_articles.id GROUP BY article_id) AS categories FROM `site_articles` WHERE "); + + if (!includeUnpublished) { + queryBuilder.append("is_published = 1 "); + } else { + queryBuilder.append("(is_published = 0 OR is_published = 1) "); + } + + + if (filterCategoryId > 0) { + queryBuilder.append("AND ((SELECT COUNT(*) FROM site_articles_categories WHERE category_id = " + filterCategoryId + " AND article_id = id) > 0) "); + + } + + queryBuilder.append("ORDER BY created_at DESC"); + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare(queryBuilder.toString(), sqlConnection); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + String monthYear = resultSet.getString("month_year"); + + if (!monthlyNews.containsKey(monthYear)) { + monthlyNews.put(monthYear, new LinkedList<>()); + } + + monthlyNews.get(monthYear).add(fill(resultSet)); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return monthlyNews; + } + + public static Map> getArchive(boolean includeUnpublished) { + var categorised = new LinkedHashMap>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + StringBuilder queryBuilder = new StringBuilder(); + queryBuilder.append("SELECT *, " + + "(SELECT label FROM article_categories WHERE article_categories.id = (SELECT category_id FROM site_articles_categories WHERE article_id = site_articles.id GROUP BY article_id LIMIT 1)) as category_name, " + + "(SELECT GROUP_CONCAT(category_id SEPARATOR ',') FROM site_articles_categories WHERE article_id = site_articles.id GROUP BY article_id) AS categories " + + "FROM `site_articles` WHERE "); + + if (!includeUnpublished) { + queryBuilder.append("is_published = 1 "); + } else { + queryBuilder.append("(is_published = 0 OR is_published = 1) "); + } + + queryBuilder.append("ORDER BY created_at DESC"); + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare(queryBuilder.toString(), sqlConnection); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + String categoryName = resultSet.getString("category_name"); + + if (categoryName == null) { + continue; + } + + if (!categorised.containsKey(categoryName)) { + categorised.put(categoryName, new LinkedList<>()); + } + + categorised.get(categoryName).add(fill(resultSet)); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return categorised; + } + + public static List getTop(NewsDateKey dateKey, int limit, boolean includeUnpublished, List excludeNews, int filterCategoryId) { + List articles = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + Calendar c = Calendar.getInstance(); + + StringBuilder queryBuilder = new StringBuilder(); + queryBuilder.append("SELECT *, " + + "(SELECT GROUP_CONCAT(category_id SEPARATOR ',') FROM site_articles_categories WHERE article_id = site_articles.id GROUP BY article_id) AS categories" + + " FROM `site_articles` WHERE "); + + if (!includeUnpublished) { + queryBuilder.append("is_published = 1 "); + } else { + queryBuilder.append("(is_published = 0 OR is_published = 1) "); + } + + if (dateKey == NewsDateKey.TODAY) { + queryBuilder.append("AND YEAR(created_at) = YEAR(NOW()) AND MONTH(created_at) = MONTH(NOW()) AND DAY(created_at) = DAY(NOW()) "); + } + + if (dateKey == NewsDateKey.YESTERDAY) { + queryBuilder.append("AND DATE(created_at) = SUBDATE(CURRENT_DATE(), INTERVAL 1 DAY) "); + } + + if (dateKey == NewsDateKey.THIS_WEEK) { + queryBuilder.append("AND UNIX_TIMESTAMP() < (UNIX_TIMESTAMP(created_at) + " + TimeUnit.DAYS.toSeconds(7) + ") "); + //queryBuilder.append("AND YEARWEEK(created_at) = YEARWEEK(NOW()) "); + } + + if (dateKey == NewsDateKey.THIS_MONTH) { + queryBuilder.append("AND UNIX_TIMESTAMP() < (UNIX_TIMESTAMP(created_at) + " + TimeUnit.DAYS.toSeconds(c.getActualMaximum(Calendar.DAY_OF_MONTH)) + ") "); + //queryBuilder.append("AND (YEAR(created_at) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH) AND MONTH(created_at) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)) "); + } + + if (dateKey == NewsDateKey.PAST_YEAR) { + queryBuilder.append("AND UNIX_TIMESTAMP() < (UNIX_TIMESTAMP(created_at) + " + TimeUnit.DAYS.toSeconds(c.getActualMaximum(Calendar.DAY_OF_YEAR)) + ") "); + //queryBuilder.append("AND (created_at >= (NOW() - INTERVAL 12 MONTH)) "); + } + + /*if (dateKey == NewsDateKey.THIS_YEAR) { + queryBuilder.append("AND ((YEAR(created_at) = YEAR(NOW())) OR (YEAR(created_at) = YEAR(NOW()) - 1))"); + }*/ + + + /*if (dateKey == NewsDateKey.LAST_MONTH) { + queryBuilder.append("AND YEAR(created_at) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH) AND MONTH(created_at) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)"); + }*/ + + /*if (dateKey == NewsDateKey.LAST_WEEK) { + queryBuilder.append("AND YEAR(created_at) = YEAR(CURRENT_DATE - INTERVAL 1 WEEK) AND MONTH(created_at) = MONTH(CURRENT_DATE - INTERVAL 1 WEEK)"); + }*/ + + if (excludeNews.size() > 0) { + queryBuilder.append("AND id NOT IN (" + String.join(",", excludeNews) + ") "); + } + + if (filterCategoryId > 0) { + queryBuilder.append("AND ((SELECT COUNT(*) FROM site_articles_categories WHERE category_id = " + filterCategoryId + " AND article_id = id) > 0) "); + + } + + queryBuilder.append("ORDER BY created_at DESC LIMIT " + limit); + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare(queryBuilder.toString(), sqlConnection); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + articles.add(fill(resultSet)); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return articles; + } + + public static HashMap> getTop(int limit, boolean includeUnpublished, int filterCategoryId) { + HashMap> articleMap = new HashMap<>(); + + var newsToday = getTop(NewsDateKey.TODAY, limit, includeUnpublished, List.of(), filterCategoryId); + var exclusionList = newsToday.stream() + .map(article -> String.valueOf(article.getId())) + .collect(Collectors.toList()); + + var newsYesterday = getTop(NewsDateKey.YESTERDAY, limit, includeUnpublished, exclusionList, filterCategoryId); + exclusionList.addAll(newsYesterday.stream() + .map(article -> String.valueOf(article.getId())) + .collect(Collectors.toList())); + + var newsThisWeek = getTop(NewsDateKey.THIS_WEEK, limit, includeUnpublished, exclusionList, filterCategoryId); + exclusionList.addAll(newsThisWeek.stream() + .map(article -> String.valueOf(article.getId())) + .collect(Collectors.toList())); + + var newsThisMonth = getTop(NewsDateKey.THIS_MONTH, limit, includeUnpublished, exclusionList, filterCategoryId); + exclusionList.addAll(newsThisMonth.stream() + .map(article -> String.valueOf(article.getId())) + .collect(Collectors.toList())); + + var newsPastYear = getTop(NewsDateKey.PAST_YEAR, limit, includeUnpublished, exclusionList, filterCategoryId); + exclusionList.addAll(newsPastYear.stream() + .map(article -> String.valueOf(article.getId())) + .collect(Collectors.toList())); + + + /*var newsThisYear = getTop(NewsDateKey.THIS_YEAR, limit, includeUnpublished, exclusionList, filterCategoryId); + exclusionList.addAll(newsThisYear.stream() + .map(article -> String.valueOf(article.getId())) + .collect(Collectors.toList()));*/ + + articleMap.put(NewsDateKey.TODAY, newsToday); + articleMap.put(NewsDateKey.YESTERDAY, newsYesterday); + articleMap.put(NewsDateKey.THIS_WEEK, newsThisWeek); + articleMap.put(NewsDateKey.THIS_MONTH, newsThisMonth); + articleMap.put(NewsDateKey.PAST_YEAR, newsPastYear); + //articleMap.put(NewsDateKey.LAST_WEEK, newsLastWeek); + //articleMap.put(NewsDateKey.LAST_MONTH, newsLastMonth); + //articleMap.put(NewsDateKey.THIS_YEAR, newsThisYear); + return articleMap; + } + + public static Map getCategories() { + var categories = new HashMap(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM article_categories", sqlConnection); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + categories.put(resultSet.getInt("id"), new NewsCategory(resultSet.getInt("id"), resultSet.getString("label"), resultSet.getString("category_index"))); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return categories; + } + + public static void insertCategories(int articleId, List newsCategories) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM site_articles_categories WHERE article_id = ?", sqlConnection); + preparedStatement.setInt(1, articleId); + preparedStatement.execute(); + + for (var category : newsCategories) { + preparedStatement = Storage.getStorage().prepare("INSERT INTO site_articles_categories (article_id, category_id) VALUES (?, ?)", sqlConnection); + preparedStatement.setInt(1, articleId); + preparedStatement.setInt(2, category.getId()); + preparedStatement.execute(); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static int create(String title, String shortstory, String fullstory, String topstory, String topstoryOverride, int authorId, String authorOverride, String category, String articleImage, long publishDate, boolean isFuturePublished, boolean isPublished) { + int articleId = 0; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO `site_articles` (title, author_id, author_override, short_story, full_story, created_at, topstory, topstory_override, article_image, is_future_published, is_published) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", sqlConnection); + preparedStatement.setString(1, title); + preparedStatement.setInt(2, authorId); + preparedStatement.setString(3, authorOverride); + preparedStatement.setString(4, shortstory); + preparedStatement.setString(5, fullstory); + preparedStatement.setTimestamp(6, new java.sql.Timestamp(publishDate * 1000L)); + preparedStatement.setString(7, topstory); + preparedStatement.setString(8, topstoryOverride); + preparedStatement.setString(9, articleImage); + preparedStatement.setBoolean(10, isFuturePublished); + preparedStatement.setBoolean(11, isPublished); + preparedStatement.execute(); + resultSet = preparedStatement.getGeneratedKeys(); + + if (resultSet.next()) { + articleId = resultSet.getInt(1); + } + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return articleId; + } + + public static boolean exists(int id) { + boolean exists = false; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT id FROM site_articles WHERE id = ? LIMIT 1", sqlConnection); + preparedStatement.setInt(1, id); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + exists = true; + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return exists; + } + + public static NewsArticle get(int id) { + NewsArticle article = null; + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT *, (SELECT GROUP_CONCAT(category_id SEPARATOR ',') FROM site_articles_categories WHERE article_id = site_articles.id GROUP BY article_id) AS categories FROM site_articles WHERE id = ? LIMIT 1", sqlConnection); + preparedStatement.setInt(1, id); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + article = fill(resultSet); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return article; + } + + public static void delete(int id) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM site_articles WHERE id = ? LIMIT 1", sqlConnection); + preparedStatement.setInt(1, id); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void publishFutureArticles() { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE site_articles SET is_published = 1 WHERE CURRENT_TIMESTAMP() > created_at AND is_published = 0 AND is_future_published = 1", sqlConnection); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void save(NewsArticle article) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE site_articles SET title = ?, short_story = ?, full_story = ?, topstory = ?, article_image = ?, is_published = ?, created_at = ?, is_future_published = ?, author_override = ?, topstory_override = ? WHERE id = ?", sqlConnection); + preparedStatement.setString(1, article.getTitle()); + preparedStatement.setString(2, article.getShortStory()); + preparedStatement.setString(3, article.getFullStory()); + preparedStatement.setString(4, article.getTopStory()); + preparedStatement.setString(5, article.getArticleImage()); + preparedStatement.setBoolean(6, article.isPublished()); + preparedStatement.setTimestamp(7, new java.sql.Timestamp(article.getTimestamp() * 1000L)); + preparedStatement.setBoolean(8, article.isFuturePublished()); + preparedStatement.setString(9, article.getAuthorOverride()); + preparedStatement.setString(10, article.getTopstoryOverride()); + preparedStatement.setInt(11, article.getId()); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static List getTopStoryImages() { + List images = new ArrayList(); + + for (File file : Objects.requireNonNull(Paths.get(Settings.getInstance().getSiteDirectory(), "c_images", "Top_Story_Images").toFile().listFiles())) { + if (!file.getName().contains(".gif")) { + continue; + } + + images.add(file.getName()); + } + + Collections.sort(images); + return images; + } + + private static NewsArticle fill(ResultSet resultSet) throws SQLException { + return new NewsArticle( + resultSet.getInt("id"), resultSet.getString("title"), resultSet.getInt("author_id"), resultSet.getString("author_override"), + resultSet.getString("short_story"), resultSet.getString("full_story"), resultSet.getTime("created_at").getTime() / 1000L, + resultSet.getString("topstory"), resultSet.getString("topstory_override"), resultSet.getString("article_image"), resultSet.getString("categories"), + resultSet.getBoolean("is_published"), resultSet.getInt("views"), resultSet.getBoolean("is_future_published")); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/dao/RatingDao.java b/Havana-Web/src/main/java/org/alexdev/http/dao/RatingDao.java new file mode 100644 index 0000000..23fe1ef --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/dao/RatingDao.java @@ -0,0 +1,196 @@ +package org.alexdev.http.dao; + +import org.alexdev.havana.dao.Storage; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; + +public class RatingDao { + public static void rate(int userId, int homeId, int rating) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO `homes_ratings` (user_id, home_id, rating) VALUES (?, ?, ?)", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, homeId); + preparedStatement.setInt(3, rating); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void deleteRating(int homeId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM `homes_ratings` WHERE home_id = ?", sqlConnection); + preparedStatement.setInt(1, homeId); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static boolean hasRated(int userId, int homeId) { + boolean hasRated = false; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM `homes_ratings` WHERE user_id = ? AND home_id = ?", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, homeId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + hasRated = true; + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return hasRated; + } + + public static double getAverageRating(int homeId) { + double rating = 0; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT AVG(rating) AS 'average_rating' FROM homes_ratings WHERE home_id = ?", sqlConnection); + preparedStatement.setInt(1, homeId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + rating = resultSet.getDouble("average_rating"); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return rating; + } + + public static int getUserRated(int userId, int homeId) { + int rating = 0; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT rating FROM homes_ratings WHERE user_id = ? AND home_id = ?", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, homeId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + rating = resultSet.getInt("rating"); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return rating; + } + + public static int getHighVoteCount(int homeId) { + int count = 0; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT COUNT(rating) as 'votes' FROM homes_ratings WHERE home_id = ? AND rating >= 4", sqlConnection); + preparedStatement.setInt(1, homeId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + count = resultSet.getInt("votes"); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return count; + } + + public static int getVoteCount(int homeId) { + int count = 0; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT COUNT(rating) as 'votes' FROM homes_ratings WHERE home_id = ?", sqlConnection); + preparedStatement.setInt(1, homeId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + count = resultSet.getInt("votes"); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return count; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/dao/RecommendedDao.java b/Havana-Web/src/main/java/org/alexdev/http/dao/RecommendedDao.java new file mode 100644 index 0000000..3838c34 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/dao/RecommendedDao.java @@ -0,0 +1,41 @@ +package org.alexdev.http.dao; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.dao.mysql.GroupDao; +import org.alexdev.havana.game.groups.Group; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.ArrayList; +import java.util.List; + +public class RecommendedDao { + public static List getRecommendedGroups(boolean staffPick) { + List groupList = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT groups_details.* FROM cms_recommended INNER JOIN groups_details ON cms_recommended.recommended_id = groups_details.id WHERE type = 'GROUP' AND is_staff_pick = ?", sqlConnection); + preparedStatement.setInt(1, staffPick ? 1 : 0); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + groupList.add(GroupDao.fill(resultSet)); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(resultSet); + } + + return groupList; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/dao/RegisterDao.java b/Havana-Web/src/main/java/org/alexdev/http/dao/RegisterDao.java new file mode 100644 index 0000000..9ad2ad3 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/dao/RegisterDao.java @@ -0,0 +1,43 @@ +package org.alexdev.http.dao; + +import org.alexdev.havana.dao.Storage; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +public class RegisterDao { + public static int newUser(String username, String password, String figure, String gender, String email) throws SQLException { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + int userId = -1; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO users (username, password, figure, sex, pool_figure, sso_ticket, email) VALUES (?, ?, ?, ?, '', '', ?)", sqlConnection); + preparedStatement.setString(1, username); + preparedStatement.setString(2, password); + preparedStatement.setString(3, figure); + preparedStatement.setString(4, gender); + preparedStatement.setString(5, email); + preparedStatement.execute(); + resultSet = preparedStatement.getGeneratedKeys(); + + if (resultSet.next()) { + userId = resultSet.getInt(1); + } + } catch (SQLException e) { + Storage.logError(e); + throw e; + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return userId; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/dao/ReplyDao.java b/Havana-Web/src/main/java/org/alexdev/http/dao/ReplyDao.java new file mode 100644 index 0000000..09bb571 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/dao/ReplyDao.java @@ -0,0 +1,68 @@ +package org.alexdev.http.dao; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.http.game.groups.DiscussionReply; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.List; + +public class ReplyDao { + public static void read(int userId, List replies) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT IGNORE INTO `cms_forums_read_replies` (user_id, reply_id) VALUES (?, ?)", sqlConnection); + sqlConnection.setAutoCommit(false); + + for (DiscussionReply reply : replies) { + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, reply.getId()); + preparedStatement.addBatch(); + } + + preparedStatement.executeBatch(); + sqlConnection.setAutoCommit(true); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static boolean hasRead(int userId, int replyId) { + boolean hasRated = false; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM `cms_forums_read_replies` WHERE user_id = ? AND reply_id = ?", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, replyId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + hasRated = true; + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return hasRated; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/dao/SessionDao.java b/Havana-Web/src/main/java/org/alexdev/http/dao/SessionDao.java new file mode 100644 index 0000000..91bf5eb --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/dao/SessionDao.java @@ -0,0 +1,112 @@ +package org.alexdev.http.dao; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.http.game.account.ClientPreference; + +import java.sql.*; + +public class SessionDao { + public static int getRememberToken(String token) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + int userId = 0; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT id FROM users WHERE remember_token = ?", sqlConnection); + preparedStatement.setString(1, token); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + userId = resultSet.getInt("id"); + } + } catch (SQLException e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return userId; + } + + public static void setRememberToken(int userId, String token) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE users SET remember_token = ? WHERE id = ?", sqlConnection); + preparedStatement.setString(1, token); + preparedStatement.setInt(2, userId); + preparedStatement.execute(); + } catch (SQLException e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void clearRememberToken(int userId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE users SET remember_token = ? WHERE id = ?", sqlConnection); + preparedStatement.setNull(1, Types.VARCHAR); + preparedStatement.setInt(2, userId); + preparedStatement.execute(); + } catch (SQLException e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void savePreferences(String motto, boolean profileVisibility, boolean showOnlineStatus, boolean wordFilterEnabled, boolean allowFriendRequests, boolean allowStalking, int userId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE users SET motto = ?, profile_visible = ?, online_status_visible = ?, wordfilter_enabled = ?, allow_friend_requests = ?, allow_stalking = ? WHERE id = ?", sqlConnection); + preparedStatement.setString(1, motto); + preparedStatement.setInt(2, profileVisibility ? 1 : 0); + preparedStatement.setInt(3, showOnlineStatus ? 1 : 0); + preparedStatement.setInt(4, wordFilterEnabled ? 1 : 0); + preparedStatement.setInt(5, allowFriendRequests ? 1 : 0); + preparedStatement.setInt(6, allowStalking ? 1 : 0); + preparedStatement.setInt(7, userId); + preparedStatement.execute(); + } catch (SQLException e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void saveTrade(int userId, boolean tradeSetting) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE users SET trade_enabled = ? WHERE id = ?", sqlConnection); + preparedStatement.setInt(1, tradeSetting ? 1 : 0); + preparedStatement.setInt(2, userId); + preparedStatement.execute(); + } catch (SQLException e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/dao/SiteDao.java b/Havana-Web/src/main/java/org/alexdev/http/dao/SiteDao.java new file mode 100644 index 0000000..822bdf8 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/dao/SiteDao.java @@ -0,0 +1,40 @@ +package org.alexdev.http.dao; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.util.DateUtil; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.concurrent.TimeUnit; + +public class SiteDao { + public static int getLastVisits() throws SQLException { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + int count = 0; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT COUNT(*) as count FROM users WHERE UNIX_TIMESTAMP(last_online) > ?", sqlConnection); + preparedStatement.setLong(1, DateUtil.getCurrentTimeSeconds() - TimeUnit.DAYS.toSeconds(30)); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + count = resultSet.getInt("count"); + } + } catch (SQLException e) { + Storage.logError(e); + throw e; + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return count; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/dao/StoreDao.java b/Havana-Web/src/main/java/org/alexdev/http/dao/StoreDao.java new file mode 100644 index 0000000..e0b0163 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/dao/StoreDao.java @@ -0,0 +1,70 @@ +package org.alexdev.http.dao; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.http.game.stickers.StickerCategory; +import org.alexdev.http.game.stickers.StickerProduct; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class StoreDao { + public static List getCategories() { + List categoryList = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM cms_stickers_categories", sqlConnection); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + categoryList.add(new StickerCategory(resultSet.getInt("id"), resultSet.getString("name"), resultSet.getInt("min_rank"), + resultSet.getInt("category_type"))); + } + } catch (SQLException e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return categoryList; + } + + public static List getCatalogue() { + List productList = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM cms_stickers_catalogue", sqlConnection); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + productList.add(new StickerProduct( + resultSet.getInt("id"), resultSet.getString("name"), resultSet.getString("description"), resultSet.getInt("min_rank"), + resultSet.getString("data"), resultSet.getInt("price"), resultSet.getInt("amount"), + resultSet.getInt("category_id"), resultSet.getInt("widget_type"), resultSet.getInt("type"))); + } + } catch (SQLException e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return productList; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/dao/VerifyDao.java b/Havana-Web/src/main/java/org/alexdev/http/dao/VerifyDao.java new file mode 100644 index 0000000..564d513 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/dao/VerifyDao.java @@ -0,0 +1,55 @@ +package org.alexdev.http.dao; + +import org.alexdev.havana.dao.Storage; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +public class VerifyDao { + public static String getName(String verifyCode) { + String name = null; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT username FROM users_statistics INNER JOIN users ON users_statistics.user_id = users.id WHERE verify_code = ? LIMIT 1", sqlConnection); + preparedStatement.setString(1, verifyCode); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + name = resultSet.getString("username"); + } + } catch (SQLException e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return name; + } + + public static void clearName(String verifyCode) throws SQLException { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE users_statistics SET verify_code = NULL WHERE verify_code = ? LIMIT 1", sqlConnection); + preparedStatement.setString(1, verifyCode); + preparedStatement.execute(); + } catch (SQLException e) { + Storage.logError(e); + throw e; + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/dao/WidgetDao.java b/Havana-Web/src/main/java/org/alexdev/http/dao/WidgetDao.java new file mode 100644 index 0000000..a3b1ba8 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/dao/WidgetDao.java @@ -0,0 +1,408 @@ +package org.alexdev.http.dao; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.http.game.homes.Widget; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class WidgetDao { + public static List getHomeWidgets(int userId) { + List widgets = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM cms_stickers WHERE user_id = ? AND group_id = 0", sqlConnection); + preparedStatement.setInt(1, userId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + widgets.add(fill(resultSet)); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return widgets; + } + + public static List getHomeWidgets(int userId, boolean isPlaced) { + List widgets = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM cms_stickers WHERE user_id = ? AND group_id = 0 AND is_placed = ?", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, isPlaced ? 1 : 0); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + widgets.add(fill(resultSet)); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return widgets; + } + + public static List getGroupWidgets(int groupId) { + List widgets = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM cms_stickers WHERE group_id = ?", sqlConnection); + preparedStatement.setInt(1, groupId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + widgets.add(fill(resultSet)); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return widgets; + } + + public static List getGroupWidgets(int groupId, boolean isPlaced) { + List widgets = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM cms_stickers WHERE group_id = ? AND is_placed = ?", sqlConnection); + preparedStatement.setInt(1, groupId); + preparedStatement.setInt(2, isPlaced ? 1 : 0); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + widgets.add(fill(resultSet)); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return widgets; + } + + public static List getInventoryWidgets(int userId, int typeId) { + List widgets = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM cms_stickers INNER JOIN cms_stickers_catalogue ON cms_stickers_catalogue.id = cms_stickers.sticker_id WHERE cms_stickers.user_id = ? AND cms_stickers_catalogue.type = ? AND cms_stickers.group_id = 0 AND is_placed = 0", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, typeId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + widgets.add(fill(resultSet)); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return widgets; + } + + public static List getInventoryWidgets(int userId) { + List widgets = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM cms_stickers WHERE user_id = ? AND group_id = 0 AND is_placed = 0", sqlConnection); + preparedStatement.setInt(1, userId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + widgets.add(fill(resultSet)); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return widgets; + } + + public static Widget purchaseWidget(int userId, int x, int y, int z, int skinId, int stickerId, String text, int groupId, boolean isPlaced) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + int widgetId = 0; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO cms_stickers (user_id, x, y, z, skin_id, sticker_id, text, group_id, is_placed) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, x); + preparedStatement.setInt(3, y); + preparedStatement.setInt(4, z); + preparedStatement.setInt(5, skinId); + preparedStatement.setInt(6, stickerId); + preparedStatement.setString(7, text); + preparedStatement.setInt(8, groupId); + preparedStatement.setInt(9, isPlaced ? 1 : 0); + preparedStatement.executeUpdate(); + resultSet = preparedStatement.getGeneratedKeys(); + + if (resultSet.next()) { + widgetId = resultSet.getInt(1); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(resultSet); + } + + return new Widget(widgetId, userId, x, y, z, stickerId, skinId, groupId, text, 1, isPlaced, null); + } + + public static void save(Widget widget) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("UPDATE cms_stickers SET group_id = ?, x = ?, y = ?, z = ?, skin_id = ?, text = ?, is_placed = ?, extra_data = ? WHERE id = ?", sqlConnection); + preparedStatement.setInt(1, widget.getGroupId()); + preparedStatement.setInt(2, widget.getX()); + preparedStatement.setInt(3, widget.getY()); + preparedStatement.setInt(4, widget.getZ()); + preparedStatement.setInt(5, widget.getSkinId()); + preparedStatement.setString(6, widget.getText()); + preparedStatement.setInt(7, widget.isPlaced() ? 1 : 0); + preparedStatement.setString(8, widget.getExtraData()); + preparedStatement.setInt(9, widget.getId()); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static void delete(int widgetId, int groupId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM cms_stickers WHERE group_id = ? AND id = ?", sqlConnection); + preparedStatement.setInt(1, groupId); + preparedStatement.setInt(2, widgetId); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + + public static void deleteHomeNote(int stickieId, int userId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("DELETE FROM cms_stickers WHERE group_id = 0 AND is_placed = 1 AND user_id = ? AND id = ?", sqlConnection); + preparedStatement.setInt(1, userId); + preparedStatement.setInt(2, stickieId); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static Widget getGroupWidget(int widgetId, int groupId) { + Widget widget = null; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM cms_stickers WHERE group_id = ? AND id = ?", sqlConnection); + preparedStatement.setInt(1, groupId); + preparedStatement.setInt(2, widgetId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + widget = fill(resultSet); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return widget; + } + + public static Widget getInventoryWidget(int userId, int widgetId) { + Widget widget = null; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM cms_stickers WHERE id = ? AND user_id = ? AND is_placed = 0", sqlConnection); + preparedStatement.setInt(1, widgetId); + preparedStatement.setInt(2, userId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + widget = fill(resultSet); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return widget; + } + + public static Widget getHomeWidget(int userId, int widgetId) { + Widget widget = null; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM cms_stickers WHERE id = ? AND user_id = ? AND group_id = 0", sqlConnection); + preparedStatement.setInt(1, widgetId); + preparedStatement.setInt(2, userId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + widget = fill(resultSet); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return widget; + } + + public static Widget getWidget(int widgetId) { + Widget widget = null; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM cms_stickers WHERE id = ?", sqlConnection); + preparedStatement.setInt(1, widgetId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + widget = fill(resultSet); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return widget; + } + + private static Widget fill(ResultSet resultSet) throws SQLException { + return new Widget(resultSet.getInt("id"), resultSet.getInt("user_id"), resultSet.getInt("x"), resultSet.getInt("y"), resultSet.getInt("z"), + resultSet.getInt("sticker_id"), resultSet.getInt("skin_id"), resultSet.getInt("group_id"), resultSet.getString("text"), 1, resultSet.getBoolean("is_placed"), + resultSet.getString("extra_data")); + } + +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/dao/housekeeping/HousekeepingPlayerDao.java b/Havana-Web/src/main/java/org/alexdev/http/dao/housekeeping/HousekeepingPlayerDao.java new file mode 100644 index 0000000..2d32b81 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/dao/housekeeping/HousekeepingPlayerDao.java @@ -0,0 +1,104 @@ +package org.alexdev.http.dao.housekeeping; + +import org.alexdev.havana.dao.Storage; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.game.player.PlayerDetails; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.ArrayList; +import java.util.List; + +public class HousekeepingPlayerDao { + + public static List getPlayers(int page, boolean zeroCoinsFlag, String sortBy) { + List players = new ArrayList<>(); + + int rows = 25; + int nextOffset = page * rows; + + if (nextOffset >= 0) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + + String statement = ""; + + if (zeroCoinsFlag) { + statement += " AND credits = 0 "; + } + + preparedStatement = Storage.getStorage().prepare("SELECT * FROM users WHERE username <> '' " + statement + "ORDER BY " + sortBy + " DESC LIMIT ? OFFSET ?", sqlConnection); + preparedStatement.setInt(1, rows); + preparedStatement.setInt(2, nextOffset); + + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + PlayerDetails playerDetails = new PlayerDetails(); + PlayerDao.fill(playerDetails, resultSet); + + players.add(playerDetails); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + return players; + } + + public static List search(String type, String field, String input) { + List players = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + + sqlConnection = Storage.getStorage().getConnection(); + + if (type.equals("contains")) { + preparedStatement = Storage.getStorage().prepare("SELECT * FROM users WHERE " + field + " LIKE ?", sqlConnection); + preparedStatement.setString(1, "%" + input + "%"); + } else if (type.equals("starts_with")) { + preparedStatement = Storage.getStorage().prepare("SELECT * FROM users WHERE " + field + " LIKE ?", sqlConnection); + preparedStatement.setString(1, input + "%"); + } else if (type.equals("ends_with")) { + preparedStatement = Storage.getStorage().prepare("SELECT * FROM users WHERE " + field + " LIKE ?", sqlConnection); + preparedStatement.setString(1, "%" + input); + } else { + preparedStatement = Storage.getStorage().prepare("SELECT * FROM users WHERE " + field + " = ?", sqlConnection); + preparedStatement.setString(1, input); + } + + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + PlayerDetails playerDetails = new PlayerDetails(); + PlayerDao.fill(playerDetails, resultSet); + + players.add(playerDetails); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return players; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/game/CommunityPhoto.java b/Havana-Web/src/main/java/org/alexdev/http/game/CommunityPhoto.java new file mode 100644 index 0000000..093bc2b --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/game/CommunityPhoto.java @@ -0,0 +1,63 @@ +package org.alexdev.http.game; + +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.Photo; +import org.alexdev.http.util.HtmlUtil; +import org.alexdev.photorenderer.PhotoRenderer; + +public class CommunityPhoto { + private final Photo photo; + private final PhotoRenderer photoViewer; + private final Item item; + private final long id; + + public CommunityPhoto(Photo photo, PhotoRenderer photoViewer, Item item) { + this.id = photo.getId(); + this.photo = photo; + this.photoViewer = photoViewer; + this.item = item; + } + + public long getId() { + return id; + } + + public String getDate() { + var customData = this.item.getCustomData(); + + if (customData.contains("\r")) { + return customData.substring(0, customData.indexOf("\r") - 3); + } + + return null; + } + + public String getDescription() { + var customData = this.item.getCustomData(); + + if (customData.contains("\r")) { + return customData.substring(customData.indexOf("\r") + 1); + } + + return null; + } + + public Photo getPhoto() { + return photo; + } + + public String renderPhoto() { + try { + var src = this.photoViewer.createImage(photo.getData()); + return HtmlUtil.encodeToString(src, "PNG"); + } catch (Exception e) { + + } + + return null; + } + + public PhotoRenderer getPhotoViewer() { + return photoViewer; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/game/account/BeginnerGiftManager.java b/Havana-Web/src/main/java/org/alexdev/http/game/account/BeginnerGiftManager.java new file mode 100644 index 0000000..dbcc38c --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/game/account/BeginnerGiftManager.java @@ -0,0 +1,64 @@ +package org.alexdev.http.game.account; + +import org.alexdev.havana.game.alerts.AlertType; +import org.alexdev.havana.game.item.ItemManager; +import org.alexdev.havana.game.item.base.ItemDefinition; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.player.statistics.PlayerStatistic; +import org.alexdev.havana.game.player.statistics.PlayerStatisticManager; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.config.GameConfiguration; +import org.alexdev.havana.dao.mysql.AlertsDao; + +import java.util.concurrent.TimeUnit; + +public class BeginnerGiftManager { + public static boolean progress(PlayerDetails playerDetails, PlayerStatisticManager statistics) { + if (!(statistics.getIntValue(PlayerStatistic.NEWBIE_ROOM_LAYOUT) > 0 && statistics.getIntValue(PlayerStatistic.NEWBIE_GIFT) > 0)) { + return false; + } + + if (statistics.getIntValue(PlayerStatistic.NEWBIE_GIFT) > 2) { + return false; + } + + if (statistics.getIntValue(PlayerStatistic.NEWBIE_GIFT_TIME) > DateUtil.getCurrentTimeSeconds()) { + return false; + } + + int roomLayout = statistics.getIntValue(PlayerStatistic.NEWBIE_ROOM_LAYOUT); + int gift = statistics.getIntValue(PlayerStatistic.NEWBIE_GIFT); + + ItemDefinition itemGift = null; + + switch (gift) { + case 1: + itemGift = ItemManager.getInstance().getDefinitionBySprite("noob_stool*" + roomLayout); + break; + case 2: + itemGift = ItemManager.getInstance().getDefinitionBySprite("noob_plant"); + break; + } + + if (itemGift == null) { + return false; + } + + String presentLabel = GameConfiguration.getInstance().getString("alerts.gift.message").replace("%item_name%", itemGift.getName()); + AlertsDao.createAlert(playerDetails.getId(), AlertType.PRESENT, presentLabel); + + ItemManager.getInstance().createGift(playerDetails.getId(), playerDetails.getName(), itemGift.getSprite(), presentLabel, ""); + + int nextGift = gift + 1; + + if (nextGift < 3) { + statistics.setLongValue(PlayerStatistic.NEWBIE_GIFT, nextGift); + statistics.setLongValue(PlayerStatistic.NEWBIE_GIFT_TIME, DateUtil.getCurrentTimeSeconds() + TimeUnit.DAYS.toSeconds(1)); + } else { + statistics.setLongValue(PlayerStatistic.NEWBIE_GIFT, 3); + statistics.setLongValue(PlayerStatistic.NEWBIE_GIFT_TIME, 0); + } + + return true; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/game/account/CacheManager.java b/Havana-Web/src/main/java/org/alexdev/http/game/account/CacheManager.java new file mode 100644 index 0000000..5c9ba70 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/game/account/CacheManager.java @@ -0,0 +1,36 @@ +package org.alexdev.http.game.account; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.havana.util.DateUtil; + +public class CacheManager { + public static void savePage(WebConnection connection, String pageName, String page, int maxLifetimeSeconds) { + connection.session().set("savedCache" + pageName + "Time", String.valueOf(DateUtil.getCurrentTimeSeconds() + maxLifetimeSeconds)); + connection.session().set("savedCache" + pageName + "Source", page); + } + + public static void deletePage(WebConnection connection, String pageName) { + connection.session().delete("savedCache" + pageName + "Time"); + connection.session().delete("savedCache" + pageName + "Source"); + } + + public static String getPage(WebConnection connection, String pageName) { + return connection.session().getString("savedCache" + pageName + "Source"); + } + + public static boolean useCachePage(WebConnection connection, String pageName) { + if (connection.session().contains("savedCache" + pageName + "Time")) { + try { + long expire = connection.session().getLong("savedCache" + pageName + "Time"); + + if (DateUtil.getCurrentTimeSeconds() < expire) { + return true; + } + } catch (Exception ex) { + + } + } + + return false; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/game/account/ClientPreference.java b/Havana-Web/src/main/java/org/alexdev/http/game/account/ClientPreference.java new file mode 100644 index 0000000..71f8ab9 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/game/account/ClientPreference.java @@ -0,0 +1,6 @@ +package org.alexdev.http.game.account; + +public enum ClientPreference { + SHOCKWAVE, + FLASH +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/game/collectables/CollectableEntry.java b/Havana-Web/src/main/java/org/alexdev/http/game/collectables/CollectableEntry.java new file mode 100644 index 0000000..27e485a --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/game/collectables/CollectableEntry.java @@ -0,0 +1,25 @@ +package org.alexdev.http.game.collectables; + +public class CollectableEntry { + private String sprite; + private String name; + private String description; + + public CollectableEntry(String sprite, String name, String description) { + this.sprite = sprite; + this.name = name; + this.description = description; + } + + public String getSprite() { + return sprite; + } + + public String getName() { + return name; + } + + public String getDescription() { + return description; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/game/friends/FriendsFeed.java b/Havana-Web/src/main/java/org/alexdev/http/game/friends/FriendsFeed.java new file mode 100644 index 0000000..69a4c98 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/game/friends/FriendsFeed.java @@ -0,0 +1,31 @@ +package org.alexdev.http.game.friends; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.duckhttpd.template.Template; +import org.alexdev.havana.game.messenger.MessengerUser; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.dao.mysql.AlertsDao; + +import java.util.stream.Collectors; + +public class FriendsFeed { + public static void createFriendsOnline(WebConnection webConnection, Template template) { + if (!webConnection.session().getBoolean("authenticated")) { + return; + } + + PlayerDetails playerDetails = (PlayerDetails) template.get("playerDetails"); + + if (playerDetails == null) { + return; + } + + var friends = AlertsDao.getOnlineFriends(playerDetails.getId()); + var requests = AlertsDao.countRequests(playerDetails.getId()); + + template.set("feedFriendsOnline", friends.values().stream().filter(MessengerUser::isOnline).collect(Collectors.toList())); + template.set("feedFriendRequests", requests); + + webConnection.session().delete("friendsOnlineRequest"); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/game/groups/DiscussionReply.java b/Havana-Web/src/main/java/org/alexdev/http/game/groups/DiscussionReply.java new file mode 100644 index 0000000..394cdf6 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/game/groups/DiscussionReply.java @@ -0,0 +1,136 @@ +package org.alexdev.http.game.groups; + +import org.alexdev.havana.game.wordfilter.WordfilterManager; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.http.util.BBCode; +import org.alexdev.http.util.HtmlUtil; + +import java.sql.Time; + +public class DiscussionReply { + private final int id; + private final int userId; + private final boolean isNew; + private final int groupId; + private String message; + private final String figure; + private final String username; + private final boolean isOnline; + private final String equippedBadge; + private final String groupBadge; + private final int forumMessages; + private final long createdAt; + private boolean isEdited; + private boolean isDeleted; + private final long modifiedAt; + + public DiscussionReply(int id, int userId, String message, String figure, String username, boolean isOnline, String equippedBadge, int groupId, String groupBadge, int forumMessages, boolean isEdited, boolean isDeleted, Time createdAt, Time modifiedAt, boolean hasRead) { + this.id = id; + this.userId = userId; + this.message = message; + this.figure = figure; + this.username = username; + this.isOnline = isOnline; + this.equippedBadge = equippedBadge; + this.groupId = groupId; + this.groupBadge = groupBadge; + this.forumMessages = forumMessages; + this.isEdited = isEdited; + this.isDeleted = isDeleted; + this.createdAt = createdAt.getTime() / 1000L; + this.modifiedAt = modifiedAt.getTime() / 1000L; + this.isNew = (!hasRead); + } + + public String getCreatedDate(String dateFormat) { + return DateUtil.getDate(this.createdAt, dateFormat).replace("am", "AM").replace("pm","PM").replace(".", ""); + } + + public String getEditedDate(String dateFormat) { + return DateUtil.getDate(this.modifiedAt, dateFormat).replace("am", "AM").replace("pm","PM").replace(".", ""); + } + + public int getId() { + return id; + } + + public int getUserId() { + return userId; + } + + public String getMessage() { + return WordfilterManager.filterSentence(this.message); + } + + public String getFormattedMessage() { + return BBCode.format(HtmlUtil.escape(BBCode.normalise(WordfilterManager.filterSentence(this.message))), false); + } + + public String getFigure() { + return figure; + } + + public String getUsername() { + return username; + } + + public boolean isOnline() { + return isOnline; + } + + public String getEquippedBadge() { + return equippedBadge; + } + + public boolean hasBadge() { + return equippedBadge != null; + } + + public int getGroupId() { + return groupId; + } + + public boolean hasGroupBadge() { + return groupBadge != null; + } + + public String getGroupBadge() { + return groupBadge; + } + + public int getForumMessages() { + return forumMessages; + } + + public long getCreatedAt() { + return createdAt; + } + + public boolean isEdited() { + return isEdited; + } + + public boolean isDeleted() { + return isDeleted; + } + + public long getModifiedAt() { + return modifiedAt; + } + + public void setMessage(String message) { + this.message = WordfilterManager.filterSentence(message); + } + + public void setEdited(boolean edited) { + isEdited = edited; + } + + public void setDeleted(boolean deleted) { + isDeleted = deleted; + } + + public boolean isNew() { + return isNew; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/game/groups/DiscussionTopic.java b/Havana-Web/src/main/java/org/alexdev/http/game/groups/DiscussionTopic.java new file mode 100644 index 0000000..8278b82 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/game/groups/DiscussionTopic.java @@ -0,0 +1,165 @@ +package org.alexdev.http.game.groups; + +import org.alexdev.havana.game.groups.*; +import org.alexdev.havana.game.wordfilter.WordfilterManager; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.config.GameConfiguration; + +import java.sql.Time; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class DiscussionTopic { + private final int id; + private final String creatorName; + private final int creatorId; + private final String lastReplyName; + private final int replyCount; + private final int groupId; + private String topicTitle; + private boolean isOpen; + private boolean isStickied; + private int views; + private final long createdAt; + private final long lastMessageAt; + private boolean isNew; + + public DiscussionTopic(int id, int groupId, String topicTitle, int replyCount, boolean isOpen, boolean isStickied, int views, Time createdAt, Time lastMessageAt, int creatorId, String creatorName, String lastReplyName, boolean hasRead) { + this.id = id; + this.groupId = groupId; + this.topicTitle = topicTitle; + this.replyCount = replyCount; + this.isOpen = isOpen; + this.isStickied = isStickied; + this.views = views; + this.creatorId = creatorId; + this.creatorName = creatorName; + this.lastReplyName = lastReplyName; + this.createdAt = createdAt.getTime() / 1000L; + this.lastMessageAt = lastMessageAt.getTime() / 1000L; + this.isNew = (!hasRead); + } + + public boolean canPostReply(Group group, GroupMember member) { + if (!this.isOpen) { + return false; + } + + if (group.getForumType() == GroupForumType.PRIVATE || + group.getForumPermission() == GroupPermissionType.MEMBER_ONLY || + group.getForumPermission() == GroupPermissionType.ADMIN_ONLY) { + + if (member == null) { + return false; + } + + if (group.getForumPermission() == GroupPermissionType.ADMIN_ONLY) { + return member.getMemberRank() == GroupMemberRank.ADMINISTRATOR || member.getMemberRank() == GroupMemberRank.OWNER; + } + } + + + return true; + } + + public List getRecentPages() { + List pageList = new ArrayList<>(); + + int limit = GameConfiguration.getInstance().getInteger("discussions.replies.per.page"); + + if (this.replyCount > limit) { + for (int i = 0; i < 2 + 1; i++) { + int newNumber = this.getReplyPages() - i; + + if (newNumber > 1) { + pageList.add(newNumber); + } + } + } + + Collections.sort(pageList); + return pageList; + } + + public int getId() { + return id; + } + + public int getGroupId() { + return groupId; + } + + public int getCreatorId() { + return creatorId; + } + + public String getCreatorName() { + return creatorName; + } + + public String getLastReplyName() { + return lastReplyName; + } + + public String getTopicTitle() { + return WordfilterManager.filterSentence(topicTitle); + } + + public int getReplyCount() { + return replyCount; + } + + public int getReplyPages() { + int limit = GameConfiguration.getInstance().getInteger("discussions.replies.per.page"); + return (this.replyCount > 0 ? (int) Math.ceil((double)replyCount / (double)limit) : 1); + } + + public boolean isOpen() { + return isOpen; + } + + public boolean isStickied() { + return isStickied; + } + + public int getViews() { + return views; + } + + public void setTopicTitle(String topicTitle) { + this.topicTitle = topicTitle; + } + + public void setOpen(boolean open) { + isOpen = open; + } + + public void setStickied(boolean stickied) { + isStickied = stickied; + } + + public void setViews(int views) { + this.views = views; + } + + public long getCreatedAt() { + return createdAt; + } + + public long getLastMessageAt() { + return lastMessageAt; + } + + public String getCreatedDate(String dateFormat) { + return DateUtil.getDate(this.createdAt, dateFormat).replace("am", "AM").replace("pm","PM").replace(".", ""); + } + + public String getLastMessage(String dateFormat) { + return DateUtil.getDate(this.lastMessageAt, dateFormat).replace("am", "AM").replace("pm","PM").replace(".", ""); + } + + public boolean isNew() { + return isNew; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/game/homes/GuestbookEntry.java b/Havana-Web/src/main/java/org/alexdev/http/game/homes/GuestbookEntry.java new file mode 100644 index 0000000..84dbd88 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/game/homes/GuestbookEntry.java @@ -0,0 +1,54 @@ +package org.alexdev.http.game.homes; + +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.wordfilter.WordfilterManager; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.http.util.BBCode; +import org.alexdev.http.util.HtmlUtil; + +public class GuestbookEntry { + private final int id; + private final int userId; + private final int homeId; + private final int groupId; + private final long creationDate; + private final String message; + + public GuestbookEntry(int id, int userId, int homeId, int groupId, String message, long creationDate) { + this.id = id; + this.userId = userId; + this.homeId = homeId; + this.groupId = groupId; + this.message = message; + this.creationDate = creationDate; + } + + public int getId() { + return id; + } + + public int getUserId() { + return userId; + } + + public PlayerDetails getUser() { + return PlayerDao.getDetails(this.userId); + } + + public int getHomeId() { + return homeId; + } + + public int getGroupId() { + return groupId; + } + + public String getCreationDate() { + return DateUtil.getFriendlyDate(this.creationDate); + } + + public String getMessage() { + return BBCode.format(HtmlUtil.escape(BBCode.normalise(WordfilterManager.filterSentence(this.message))), false); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/game/homes/Home.java b/Havana-Web/src/main/java/org/alexdev/http/game/homes/Home.java new file mode 100644 index 0000000..3b2c694 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/game/homes/Home.java @@ -0,0 +1,29 @@ +package org.alexdev.http.game.homes; + +import org.alexdev.http.dao.HomesDao; + +public class Home { + private int userId; + private String background; + + public Home(int userId, String background) { + this.userId = userId; + this.background = background; + } + + public int getUserId() { + return userId; + } + + public String getBackground() { + return background; + } + + public void setBackground(String background) { + this.background = background; + } + + public void saveBackground() { + HomesDao.saveBackground(userId, background); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/game/homes/Widget.java b/Havana-Web/src/main/java/org/alexdev/http/game/homes/Widget.java new file mode 100644 index 0000000..5a9c21b --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/game/homes/Widget.java @@ -0,0 +1,443 @@ +package org.alexdev.http.game.homes; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.duckhttpd.template.Template; +import org.alexdev.havana.dao.mysql.*; +import org.alexdev.havana.game.badges.Badge; +import org.alexdev.havana.game.badges.BadgeManager; +import org.alexdev.havana.game.groups.Group; +import org.alexdev.havana.game.groups.GroupMember; +import org.alexdev.havana.game.groups.GroupMemberRank; +import org.alexdev.havana.game.item.Item; +import org.alexdev.havana.game.item.ItemManager; +import org.alexdev.havana.game.messenger.MessengerUser; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.game.room.RoomManager; +import org.alexdev.havana.game.song.Song; +import org.alexdev.havana.game.wordfilter.WordfilterManager; +import org.alexdev.havana.util.StringUtil; +import org.alexdev.http.dao.FriendManagementDao; +import org.alexdev.http.dao.GuestbookDao; +import org.alexdev.http.dao.RatingDao; +import org.alexdev.http.dao.WidgetDao; +import org.alexdev.http.game.stickers.StickerManager; +import org.alexdev.http.game.stickers.StickerProduct; +import org.alexdev.http.game.stickers.StickerType; +import org.alexdev.http.util.BBCode; +import org.alexdev.http.util.HtmlUtil; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class Widget { + private static final Integer FRIENDS_PAGING_AMOUNT = 32; + private static final Integer MEMBER_PAGING_AMOUNT = 32; + + private final int id; + private final int userId; + private int x; + private int y; + private int z; + private final int stickerId; + private int skinId; + private int groupId; + private int amount; + private String text; + private boolean isPlaced; + private String extraData; + + public Widget(int id, int userId, int x, int y, int z, int stickerId, int skinId, int groupId, String text, int amount, boolean isPlaced, String extraData) { + this.id = id; + this.userId = userId; + this.x = x; + this.y = y; + this.z = z; + this.stickerId = stickerId; + this.skinId = skinId; + this.groupId = groupId; + this.text = text; + this.amount = amount; + this.isPlaced = isPlaced; + this.extraData = extraData; + } + + public Template template(WebConnection webConnection) { + Template tpl = null; + + if (this.getProduct().getData().equalsIgnoreCase("groupinfowidget")) { + tpl = webConnection.template("homes/widget/group_info_widget"); + } else if (this.getProduct().getData().equalsIgnoreCase("guestbookwidget")) { + tpl = webConnection.template("homes/widget/guestbook_widget"); + } else if (this.getProduct().getData().equalsIgnoreCase("stickienote")) { + tpl = webConnection.template("homes/widget/note"); + } else if (this.getProduct().getData().equalsIgnoreCase("memberwidget")) { + tpl = webConnection.template("homes/widget/member_widget"); + } else if (this.getProduct().getData().equalsIgnoreCase("traxplayerwidget")) { + tpl = webConnection.template("homes/widget/trax_player_widget"); + } else if (this.getProduct().getData().equalsIgnoreCase("profilewidget")) { + tpl = webConnection.template("homes/widget/profile_widget"); + } else if (this.getProduct().getData().equalsIgnoreCase("roomswidget")) { + tpl = webConnection.template("homes/widget/rooms_widget"); + } else if (this.getProduct().getData().equalsIgnoreCase("highscoreswidget")) { + tpl = webConnection.template("homes/widget/highscores_widget"); + } else if (this.getProduct().getData().equalsIgnoreCase("badgeswidget")) { + tpl = webConnection.template("homes/widget/badges_widget"); + } else if (this.getProduct().getData().equalsIgnoreCase("friendswidget")) { + tpl = webConnection.template("homes/widget/friends_widget"); + } else if (this.getProduct().getData().equalsIgnoreCase("groupswidget")) { + tpl = webConnection.template("homes/widget/groups_widget"); + } else if (this.getProduct().getData().equalsIgnoreCase("ratingwidget")) { + tpl = webConnection.template("homes/widget/rating_widget"); + } else { + tpl = webConnection.template("homes/widget/sticker"); + } + + tpl.set("editMode", webConnection.session().contains("homeEditSession") || webConnection.session().contains("groupEditSession")); + tpl.set("sticker", this); + + if (webConnection.session().contains("homeEditSession")) { + PlayerDetails playerDetails = PlayerDao.getDetails(webConnection.session().getInt("user.id")); + tpl.set("user", playerDetails); + tpl.set("canAddFriend", false); + + if (this.getProduct().getData().equalsIgnoreCase("profilewidget")) { + var badges = BadgeDao.getBadges(playerDetails.getId()); + var enabledBadges = new ArrayList<>(badges); + badges.removeIf(badge -> !badge.isEquipped()); + badges.sort(Comparator.comparingInt(Badge::getSlotId)); + + tpl.set("hasBadge", enabledBadges.size() > 0); + + if (enabledBadges.size() > 0) { + tpl.set("badgeCode", enabledBadges.get(0).getBadgeCode()); + } + + tpl.set("hasFavouriteGroup", false); + + if (playerDetails.getFavouriteGroupId() > 0) { + Group group = GroupDao.getGroup(playerDetails.getFavouriteGroupId()); + + if (group != null) { + tpl.set("hasFavouriteGroup", true); + tpl.set("group", group); + } + } + } + } + + return tpl; + } + + public List getFirstBadges() { + return StringUtil.paginate(new BadgeManager(this.userId).getBadges(), 16, true).get(0); + } + + public Map> getBadgeList() { + return StringUtil.paginate(new BadgeManager(this.userId).getBadges(), 16); + } + + public List getOwnerRooms() { + var roomList = RoomDao.getRoomsByUserId(this.userId); + RoomManager.getInstance().sortRooms(roomList); + + return roomList; + } + + public List getFirstFriendsList() { + return FriendManagementDao.getFriends(this.userId, 1, FRIENDS_PAGING_AMOUNT); + } + + public int getFriendsPagesSearch(String search) { + int friends = FriendManagementDao.getFriendsCount(this.userId, search); + int pages = friends > 0 ? (int) Math.ceil((double)friends / (double)FRIENDS_PAGING_AMOUNT) : 0; + return pages == 0 ? 1 : pages; + } + + public int getFriendsPages() { + int friends = FriendManagementDao.getFriendsCount(this.userId); + int pages = friends > 0 ? (int) Math.ceil((double)friends / (double)FRIENDS_PAGING_AMOUNT) : 0; + return pages == 0 ? 1 : pages; + } + + public int getFriendsAmount() { + return MessengerDao.getFriendsCount(this.userId); + } + + public List getFriendsList(String query, int page) { + if (!query.isBlank()) { + return FriendManagementDao.getFriendsSearch(this.userId, query, page, FRIENDS_PAGING_AMOUNT); + } else { + return FriendManagementDao.getFriends(this.userId, page, FRIENDS_PAGING_AMOUNT); + } + } + + public String getGuestbookState() { + if (this.extraData.equalsIgnoreCase("public")) { + return "public"; + } + + if (this.extraData.equalsIgnoreCase("private")) { + return "private"; + } + + return "public"; + } + + public boolean isPostingAllowed(int userId) { + if (this.getGuestbookState().equalsIgnoreCase("public")) { + return true; + } + + if (this.getProduct().getType() == StickerType.GROUP_WIDGET) { + Group group = GroupDao.getGroup(this.groupId); + return group.isMember(userId); + } + + if (this.getProduct().getType() == StickerType.HOME_WIDGET) { + return userId == this.getUserId() || MessengerDao.friendExists(userId, this.getUserId()); + } + + return false; + } + + public List getGuestbookEntries() { + List entries = null; + + int id = 0; + + if (this.getProduct().getType() == StickerType.GROUP_WIDGET) { + entries = GuestbookDao.getEntriesByGroup(this.getGroupId()); + } else if (this.getProduct().getType() == StickerType.HOME_WIDGET) { + entries = GuestbookDao.getEntriesByHome(this.getUserId()); + } + + return entries; + } + + public boolean canDeleteEntries(int userId) { + boolean canDelete = false; + + if (this.getProduct().getType() == StickerType.GROUP_WIDGET) { + canDelete = (GroupDao.getGroupOwner(this.groupId) == userId); + } else if (this.getProduct().getType() == StickerType.HOME_WIDGET) { + canDelete = (userId == this.getUserId()); + } + + return canDelete; + } + + public List getSongs() { + List songList = null; + int userId = 0; + + if (this.getProduct().getType() == StickerType.GROUP_WIDGET) { + userId = GroupDao.getGroupOwner(this.groupId); + songList = SongMachineDao.getSongUserList(userId); + } else if (this.getProduct().getType() == StickerType.HOME_WIDGET) { + userId = this.getUserId(); + songList = SongMachineDao.getSongUserList(userId); + } + + for (Item item : ItemDao.getUserItemsByDefinition(userId, ItemManager.getInstance().getDefinitionBySprite("song_disk"))) { + int songId = JukeboxDao.getSongIdByItem(item.getDatabaseId()); + Song song = SongMachineDao.getSong(songId); + + if (song == null) { + continue; + } + + if (songList != null) { + if (songList.stream().noneMatch(s -> s.getId() == song.getId())) { + songList.add(song); + } + } + } + + return songList; + } + + public List getFirstMembersList() { + var members = GroupMemberDao.getMembers(this.groupId, false, "",1, FRIENDS_PAGING_AMOUNT); + members.add(new GroupMember(GroupDao.getGroupOwner(this.groupId), this.groupId, false, GroupMemberRank.OWNER.getRankId())); + return members.stream() + .sorted(Comparator.comparingLong((GroupMember gp) -> gp.getUser().getLastOnline()).reversed()) + .collect(Collectors.toList()); + } + + public List getMembersList(String query, int page) { + var members = GroupMemberDao.getMembers(this.groupId, false, query, page, FRIENDS_PAGING_AMOUNT); + return members.stream() + .sorted(Comparator.comparingLong((GroupMember gp) -> gp.getUser().getLastOnline()).reversed()) + .collect(Collectors.toList()); + } + + public int getMembersAmount() { + return GroupMemberDao.countMembers(this.groupId, false) + 1; + } + + public int getMembersPages() { + int members = GroupMemberDao.countMembers(this.groupId, false) + 1; + int pages = members > 0 ? (int) Math.ceil((double)members / (double)FRIENDS_PAGING_AMOUNT) : 0; + return pages == 0 ? 1 : pages; + } + + + public boolean hasSong() { + Song song = null; + + if (StringUtils.isNumeric(this.extraData)) { + int songId = Integer.parseInt(this.extraData); + song = SongMachineDao.getSong(songId); + } + + return song != null; + } + + + public Song getSong() { + Song song = null; + + if (StringUtils.isNumeric(this.extraData)) { + int songId = Integer.parseInt(this.extraData); + song = SongMachineDao.getSong(songId); + } + + return song; + } + + + public List getOwnerGroups() { + return GroupDao.getJoinedGroups(this.userId); + } + + public boolean hasRated(int userId) { + return RatingDao.hasRated(userId, this.userId); + } + + public int getAverageRating() { + return (int)(RatingDao.getAverageRating(this.userId)); + } + + public int getRatingPixels() { + double rating = getAverageRating(); + + if (rating <= 0) { + rating = 1; + } + + return (int) Math.round(rating * 150 / 5); + } + + public int getHighVoteCount() { + return RatingDao.getHighVoteCount(this.userId); + } + + public int getVoteCount() { + return RatingDao.getVoteCount(this.userId); + } + + public void save() { + WidgetDao.save(this); + } + + public StickerProduct getProduct() { + return StickerManager.getInstance().getStickerProduct(this.stickerId); + } + + public int getId() { + return id; + } + + public int getUserId() { + return userId; + } + + public int getX() { + return x; + } + + public void setX(int x) { + this.x = x; + } + + public int getY() { + return y; + } + + public void setY(int y) { + this.y = y; + } + + public int getZ() { + return z; + } + + public void setZ(int z) { + this.z = z; + } + + public int getStickerId() { + return stickerId; + } + + public String getSkin() { + return StickerManager.getInstance().getSkin(this.skinId); + } + + public void setSkinId(int skinId) { + this.skinId = skinId; + } + + public int getGroupId() { + return groupId; + } + + public void setGroupId(int groupId) { + this.groupId = groupId; + } + + public int getSkinId() { + return skinId; + } + + public int getAmount() { + return amount; + } + + public void setAmount(int amount) { + this.amount = amount; + } + + public String getText() { + return WordfilterManager.filterSentence(text); + } + + public String getFormattedText() { + return BBCode.format(HtmlUtil.escape(BBCode.normalise(WordfilterManager.filterSentence(this.text))), false); + } + + public void setText(String text) { + this.text = text; + } + + public boolean isPlaced() { + return isPlaced; + } + + public void setPlaced(boolean placed) { + isPlaced = placed; + } + + public String getExtraData() { + return extraData; + } + + public void setExtraData(String extraData) { + this.extraData = extraData; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/game/housekeeping/HousekeepingManager.java b/Havana-Web/src/main/java/org/alexdev/http/game/housekeeping/HousekeepingManager.java new file mode 100644 index 0000000..03e7dbe --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/game/housekeeping/HousekeepingManager.java @@ -0,0 +1,65 @@ +package org.alexdev.http.game.housekeeping; + +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.http.game.stickers.StickerManager; + +import java.util.HashMap; +import java.util.Map; + +public class HousekeepingManager { + private static HousekeepingManager instance; + private Map permissions; + + public HousekeepingManager() { + this.loadPermissions(); + } + + private void loadPermissions() { + this.permissions = new HashMap<>(); + this.permissions.put("root/login", PlayerRank.MODERATOR); + this.permissions.put("transaction/lookup", PlayerRank.MODERATOR); + this.permissions.put("marketplace/log_check", PlayerRank.MODERATOR); + this.permissions.put("marketplace/user_log", PlayerRank.MODERATOR); + this.permissions.put("bans", PlayerRank.MODERATOR); + this.permissions.put("user/search", PlayerRank.ADMINISTRATOR); + this.permissions.put("user/edit", PlayerRank.ADMINISTRATOR); + this.permissions.put("user/create", PlayerRank.ADMINISTRATOR); + this.permissions.put("articles/create", PlayerRank.MODERATOR); + this.permissions.put("articles/edit_any", PlayerRank.ADMINISTRATOR); + this.permissions.put("articles/edit_own", PlayerRank.MODERATOR); + this.permissions.put("articles/delete_any", PlayerRank.ADMINISTRATOR); + this.permissions.put("articles/delete_own", PlayerRank.MODERATOR); + this.permissions.put("room_ads", PlayerRank.ADMINISTRATOR); + this.permissions.put("room_badges", PlayerRank.COMMUNITY_MANAGER); + this.permissions.put("configuration", PlayerRank.ADMINISTRATOR); + this.permissions.put("infobus", PlayerRank.COMMUNITY_MANAGER); + this.permissions.put("infobus/delete_any", PlayerRank.ADMINISTRATOR); + this.permissions.put("infobus/delete_own", PlayerRank.COMMUNITY_MANAGER); + this.permissions.put("catalogue/edit_frontpage", PlayerRank.COMMUNITY_MANAGER); + this.permissions.put("user/imitate", PlayerRank.ADMINISTRATOR); + this.permissions.put("user/matches", PlayerRank.ADMINISTRATOR); + this.permissions.put("badges", PlayerRank.COMMUNITY_MANAGER); + } + + /** + * Get instance of {@link StickerManager} + * + * @return the manager instance + */ + public static HousekeepingManager getInstance() { + if (instance == null) { + instance = new HousekeepingManager(); + } + + return instance; + } + + public boolean hasPermission(PlayerRank rank, String permission) { + if (this.permissions.containsKey(permission)) { + var permissibleRank = this.permissions.get(permission); + return rank.getRankId() >= permissibleRank.getRankId(); + } + + return false; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/game/housekeeping/HousekeepingStats.java b/Havana-Web/src/main/java/org/alexdev/http/game/housekeeping/HousekeepingStats.java new file mode 100644 index 0000000..09357e7 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/game/housekeeping/HousekeepingStats.java @@ -0,0 +1,19 @@ +package org.alexdev.http.game.housekeeping; + +public class HousekeepingStats { + private final int userCount; + private final int inventoryItemsCount; + private final int roomItemCount; + private final int groupCount; + private final int petCount; + private final int photoCount; + + public HousekeepingStats(int userCount, int inventoryItemsCount, int roomItemCount, int groupCount, int petCount, int photoCount) { + this.userCount = userCount; + this.inventoryItemsCount = inventoryItemsCount; + this.roomItemCount = roomItemCount; + this.groupCount = groupCount; + this.petCount = petCount; + this.photoCount = photoCount; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/game/housekeeping/MarketplacePurchaseOccurance.java b/Havana-Web/src/main/java/org/alexdev/http/game/housekeeping/MarketplacePurchaseOccurance.java new file mode 100644 index 0000000..a869b9f --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/game/housekeeping/MarketplacePurchaseOccurance.java @@ -0,0 +1,25 @@ +package org.alexdev.http.game.housekeeping; + +public class MarketplacePurchaseOccurance { + private final int userId; + private final String username; + private final int purchaseCount; + + public MarketplacePurchaseOccurance(int userId, String username, int purchaseCount) { + this.userId = userId; + this.username = username; + this.purchaseCount = purchaseCount; + } + + public int getUserId() { + return userId; + } + + public String getUsername() { + return username; + } + + public int getPurchaseCount() { + return purchaseCount; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/game/marketplace/MarketplaceOffer.java b/Havana-Web/src/main/java/org/alexdev/http/game/marketplace/MarketplaceOffer.java new file mode 100644 index 0000000..f5d5066 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/game/marketplace/MarketplaceOffer.java @@ -0,0 +1,105 @@ +package org.alexdev.http.game.marketplace; + +import org.alexdev.havana.game.item.ItemManager; +import org.alexdev.havana.game.item.base.ItemDefinition; +import org.alexdev.havana.util.DateUtil; + +import java.text.NumberFormat; +import java.util.Locale; +import java.util.concurrent.TimeUnit; + +public class MarketplaceOffer { + private final long id; + private final int userId; + private final long itemId; + private final int definitionId; + private final int price; + private final int lowestPrice; + private final int rotation; + private final int state; + private final int colour; + private final long createdAt; + private final boolean isActive; + private final int itemsAlike; + + public MarketplaceOffer(long id, int userId, long itemId, int definitionId, int price, int lowestPrice, int rotation, int state, int colour, int itemsAlike, long createdAt, boolean isActive) { + this.id = id; + this.userId = userId; + this.itemId = itemId; + this.definitionId = definitionId; + this.price = price; + this.lowestPrice = lowestPrice; + this.rotation = rotation; + this.state = state; + this.colour = colour; + this.createdAt = createdAt; + this.isActive = isActive; + this.itemsAlike = itemsAlike; + } + + public String getTimeUntilExpiry() { + long timestamp = this.createdAt + TimeUnit.DAYS.toSeconds(7); + return DateUtil.getMarketplaceReadableSeconds(timestamp - DateUtil.getCurrentTimeSeconds()); + } + + public long getId() { + return id; + } + + public int getUserId() { + return userId; + } + + public ItemDefinition getDefinition() { + return ItemManager.getInstance().getDefinition(this.definitionId); + } + + public long getItemId() { + return itemId; + } + + public int getDefinitionId() { + return definitionId; + } + + public int getPrice() { + return price; + } + + public String getFormattedPrice() { + return NumberFormat.getInstance(Locale.US).format(price); + } + + public int getLowestPrice() { + return lowestPrice; + } + + public String getFormattedLowestPrice() { + return NumberFormat.getInstance(Locale.US).format(lowestPrice); + } + + + public int getRotation() { + return rotation; + } + + public int getState() { + return state; + } + + public int getColour() { + return colour; + } + + public long getCreatedAt() { + return createdAt; + } + + public boolean isActive() { + return isActive; + } + + public int getItemsAlike() { + return itemsAlike; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/game/minimail/MinimailMessage.java b/Havana-Web/src/main/java/org/alexdev/http/game/minimail/MinimailMessage.java new file mode 100644 index 0000000..18e337f --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/game/minimail/MinimailMessage.java @@ -0,0 +1,139 @@ +package org.alexdev.http.game.minimail; + +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.game.wordfilter.WordfilterManager; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.http.util.BBCode; +import org.alexdev.http.util.HtmlUtil; + +public class MinimailMessage { + private final int id; + private boolean isRead; + private int targetId; + private int toId; + private int senderId; + private String subject; + private String message; + private final long dateSent; + private int conversationId; + private boolean isTrash; + private PlayerDetails target; + private PlayerDetails author; + + public MinimailMessage(int id, int targetId, int toId, int senderId, boolean isRead, String subject, String message, long dateSent, int conversationId, boolean isTrash) { + this.id = id; + this.targetId = targetId; + this.toId = toId; + this.isRead = isRead; + this.senderId = senderId; + this.subject = subject; + this.message = message; + this.dateSent = dateSent; + this.conversationId = conversationId; + this.isTrash = isTrash; + } + + public int getId() { + return id; + } + + public int getTargetId() { + return targetId; + } + + public void setTargetId(int targetId) { + this.targetId = targetId; + } + + public int getToId() { + return toId; + } + + public void setToId(int toId) { + this.toId = toId; + } + + public boolean isRead() { + return isRead; + } + + public void setRead(boolean read) { + isRead = read; + } + + public void setMessage(String message) { + this.message = message; + } + + public int getSenderId() { + return senderId; + } + + public void setSenderId(int senderId) { + this.senderId = senderId; + } + + public String getSubject() { + return subject; + } + + public void setSubject(String subject) { + this.subject = subject; + } + + public String getMessage() { + return WordfilterManager.filterSentence(message); + } + + public String getFormattedSubject() { + return BBCode.format(HtmlUtil.escape(this.subject), false); + } + + public String getFormattedMessage() { + return BBCode.format(HtmlUtil.escape(WordfilterManager.filterSentence(this.message)), false); + } + + public long getDateSent() { + return dateSent; + } + + public String getDate() { + return DateUtil.getFriendlyDate(this.dateSent); + } + + public String getIsoDate() { + return DateUtil.getDate(this.dateSent, "yyyy-MM-dd'T'HH:mm:ssZ"); + } + + public int getConversationId() { + return conversationId; + } + + public void setConversationId(int conversationId) { + this.conversationId = conversationId; + } + + public boolean isTrash() { + return isTrash; + } + + public void setTrash(boolean trash) { + isTrash = trash; + } + + public PlayerDetails getTarget() { + return target; + } + + public void setTarget(PlayerDetails target) { + this.target = target; + } + + public PlayerDetails getAuthor() { + return author; + } + + public void setAuthor(PlayerDetails author) { + this.author = author; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/game/news/NewsArticle.java b/Havana-Web/src/main/java/org/alexdev/http/game/news/NewsArticle.java new file mode 100644 index 0000000..a4ee861 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/game/news/NewsArticle.java @@ -0,0 +1,227 @@ +package org.alexdev.http.game.news; + +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.config.GameConfiguration; +import org.alexdev.http.util.HousekeepingUtil; + +import java.util.ArrayList; +import java.util.List; + +public class NewsArticle { + private int id; + private String title; + private int authorId; + private String authorOverride; + private String shortstory; + private String fullstory; + private long timestamp; + private String topstory; + private String topstoryOverride; + private String articleImage; + private List categories; + private boolean isPublished; + private int views; + private boolean isFuturePublished; + + public NewsArticle(int id, String title, int authorId, String authorOverride, String shortstory, String fullStory, long date, String topstory, String topstoryOverride, String articleImage, String categories, boolean isPublished, int views, boolean isFuturePublished) { + this.id = id; + this.title = title; + this.authorId = authorId; + this.authorOverride = authorOverride; + this.shortstory = shortstory; + this.fullstory = fullStory; + this.timestamp = date; + this.articleImage = articleImage; + this.topstory = topstory; + this.topstoryOverride = topstoryOverride; + this.categories = parseCategories(categories); + this.isPublished = isPublished; + this.views = views; + this.isFuturePublished = isFuturePublished; + } + + private List parseCategories(String categories) { + var categoryList = new ArrayList(); + + if (categories != null && categories.length() > 0) { + for (String categoryData : categories.split(",")) { + var category = NewsManager.getInstance().getCategoryById(Integer.parseInt(categoryData)); + + if (category != null) { + categoryList.add(category); + } + } + } + + return categoryList; + } + + public boolean hasCategory(int id) { + return this.categories.stream().anyMatch(category -> category.getId() == id); + } + + public String getAuthor() { + if (this.authorOverride.length() > 0) + return this.authorOverride; + + return PlayerDao.getName(this.authorId); + } + + public int getAuthorId() { + return authorId; + } + + public String getUrl() { + if (this.id == 0) { + return "0-no-news"; + } + + String newTitle = this.title; + newTitle = newTitle.replace("!", ""); + newTitle = newTitle.replace("'", ""); + newTitle = newTitle.replace("@", ""); + newTitle = newTitle.replace("&", ""); + newTitle = newTitle.replace("*", ""); + newTitle = newTitle.replace("%", ""); + newTitle = newTitle.replace("[", ""); + newTitle = newTitle.replace("]", ""); + newTitle = newTitle.replace("#", ""); + newTitle = newTitle.replace("=", ""); + newTitle = newTitle.replace("\"", ""); + newTitle = newTitle.replace(":", ""); + newTitle = newTitle.replace(">", ""); + newTitle = newTitle.replace("<", ""); + newTitle = newTitle.replace(",", ""); + newTitle = newTitle.replace(".", ""); + newTitle = newTitle.replace("+", ""); + newTitle = newTitle.replace("-", ""); + newTitle = newTitle.replace("=", ""); + newTitle = newTitle.replace("_", ""); + newTitle = newTitle.replace("/", ""); + newTitle = newTitle.replace("?", ""); + newTitle = newTitle.replace("\\", ""); + newTitle = newTitle.replace(" ", "-"); + newTitle = newTitle.toLowerCase(); + + return this.id + "-" + newTitle; + } + + /** + * Get id of article + * @return the id + */ + public int getId() { + return id; + } + + /** + * Get title of news article + * @return the title + */ + public String getTitle() { + return title; + } + + /** + * Set title of news article + * + * @param title the new title + */ + public void setTitle(String title) { + this.title = title; + } + + public String getShortStory() { + return shortstory; + } + + public void setShortStory(String shortstory) { + this.shortstory = shortstory; + } + + public String getDate() { + return DateUtil.getDate(this.timestamp, "EEE dd MMM, yyyy").replace(".", ""); + } + + public long getTimestamp() { + return timestamp; + } + + public void setTimestamp(long timestamp) { + this.timestamp = timestamp; + } + + public String getLiveTopStory() { + if (this.topstoryOverride.length() > 0) { + return this.topstoryOverride; + } + + //{{ site.staticContentPath }}/c_images/Top_Story_Images/{{ article1.getTopStory() }} + + return GameConfiguration.getInstance().getString("static.content.path") + "/c_images/Top_Story_Images/" + topstory; + } + + public String getTopStory() { + return topstory; + } + + public void setTopStory(String topstory) { + this.topstory = topstory; + } + + public String getFullStory() { + return this.fullstory; + } + + public String getEscapedStory() { return new HousekeepingUtil().formatNewsStory(this.fullstory); + } + + public void setFullStory(String fullstory) { + this.fullstory = fullstory; + } + + public List getCategories() { + return categories; + } + + public String getArticleImage() { + return articleImage; + } + + public void setArticleImage(String articleImage) { + this.articleImage = articleImage; + } + + public boolean isPublished() { + return isPublished; + } + + public void setPublished(boolean published) { + isPublished = published; + } + + public boolean isFuturePublished() { + return isFuturePublished; + } + + public void setFuturePublished(boolean futurePublished) { + isFuturePublished = futurePublished; + } + + public String getAuthorOverride() { + return authorOverride; + } + + public void setAuthorOverride(String authorOverride) { + this.authorOverride = authorOverride; + } + + public String getTopstoryOverride() { + return topstoryOverride; + } + + public void setTopstoryOverride(String topstoryOverride) { + this.topstoryOverride = topstoryOverride; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/game/news/NewsCategory.java b/Havana-Web/src/main/java/org/alexdev/http/game/news/NewsCategory.java new file mode 100644 index 0000000..38c2373 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/game/news/NewsCategory.java @@ -0,0 +1,25 @@ +package org.alexdev.http.game.news; + +public class NewsCategory { + private int id; + private String label; + private String index; + + public NewsCategory(int id, String label, String index) { + this.id = id; + this.label = label; + this.index = index; + } + + public int getId() { + return id; + } + + public String getLabel() { + return label; + } + + public String getIndex() { + return index; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/game/news/NewsDateKey.java b/Havana-Web/src/main/java/org/alexdev/http/game/news/NewsDateKey.java new file mode 100644 index 0000000..24340d7 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/game/news/NewsDateKey.java @@ -0,0 +1,9 @@ +package org.alexdev.http.game.news; + +public enum NewsDateKey { + YESTERDAY, + THIS_WEEK, + THIS_MONTH, + ALL, + TODAY, PAST_YEAR; +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/game/news/NewsManager.java b/Havana-Web/src/main/java/org/alexdev/http/game/news/NewsManager.java new file mode 100644 index 0000000..b098f82 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/game/news/NewsManager.java @@ -0,0 +1,57 @@ +package org.alexdev.http.game.news; + +import org.alexdev.http.dao.NewsDao; + +import java.util.*; + +public class NewsManager { + private Map newsCategoryMap; + private static NewsManager instance; + + public NewsManager() { + this.newsCategoryMap = NewsDao.getCategories(); + } + + /** + * Get category by ID. + * @param categoryId the category id. + * @return the category, if successful + */ + public NewsCategory getCategoryById(int categoryId) { + return this.newsCategoryMap.getOrDefault(categoryId, null); + } + + /** + * Get category by label. + * @param categoryLabel the category id. + * @return the category, if successful + */ + public NewsCategory getCategoryByLabel(String categoryLabel) { + return this.newsCategoryMap.values().stream().filter(article -> article.getIndex().equalsIgnoreCase(categoryLabel)).findFirst().orElse(null); + } + + /** + * Get categories + * + * @return the list of categories + */ + public List getCategories() { + List categories = new ArrayList<>(this.newsCategoryMap.values()); + categories.sort(Comparator.comparing(NewsCategory::getLabel)); + return categories; + } + + /** + * Get instance of {@link NewsManager} + * + * @return the manager instance + */ + public static NewsManager getInstance() { + if (instance == null) { + instance = new NewsManager(); + } + + return instance; + } + +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/game/news/NewsView.java b/Havana-Web/src/main/java/org/alexdev/http/game/news/NewsView.java new file mode 100644 index 0000000..ab4b0e5 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/game/news/NewsView.java @@ -0,0 +1,5 @@ +package org.alexdev.http.game.news; + +public enum NewsView { + MONTHS, ARCHIVE, DEFAULT +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/game/stickers/StickerCategory.java b/Havana-Web/src/main/java/org/alexdev/http/game/stickers/StickerCategory.java new file mode 100644 index 0000000..703d4bb --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/game/stickers/StickerCategory.java @@ -0,0 +1,34 @@ +package org.alexdev.http.game.stickers; + +public class StickerCategory { + public static final int BACKGROUND_CATEGORY_TYPE = 2; + public static final int STICKER_BACKGROUND_TYPE = 1; + + private final int id; + private final String name; + private final int minRank; + private final int categoryType; + + public StickerCategory(int id, String name, int minRank, int categoryType) { + this.id = id; + this.name = name; + this.minRank = minRank; + this.categoryType = categoryType; + } + + public int getId() { + return id; + } + + public String getName() { + return name; + } + + public int getMinRank() { + return minRank; + } + + public int getCategoryType() { + return categoryType; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/game/stickers/StickerManager.java b/Havana-Web/src/main/java/org/alexdev/http/game/stickers/StickerManager.java new file mode 100644 index 0000000..73ab192 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/game/stickers/StickerManager.java @@ -0,0 +1,203 @@ +package org.alexdev.http.game.stickers; + +import org.alexdev.http.dao.HomesDao; +import org.alexdev.http.dao.StoreDao; +import org.alexdev.http.dao.WidgetDao; +import org.alexdev.http.game.homes.Widget; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class StickerManager { + private static StickerManager instance; + private List catalogueList; + private List categoryList; + + public StickerManager() { + this.categoryList = StoreDao.getCategories(); + this.catalogueList = StoreDao.getCatalogue(); + } + + /** + * Create home handler. + * + * @param userId the user id to create the home for + */ + public void createHome(int userId) { + HomesDao.create(userId); + + /* + +
+
+ + +
+
+ + +
+ + + */ + + WidgetDao.purchaseWidget(userId, 455, 27, 129, 1, this.getStickerByData("profilewidget", StickerType.HOME_WIDGET).getId(), "", 0, true); + WidgetDao.purchaseWidget(userId, 440, 321, 177, 1, this.getStickerByData("roomswidget", StickerType.HOME_WIDGET).getId(), "", 0, true); + WidgetDao.purchaseWidget(userId, 383, 491, 179, 6, this.getStickerByData("highscoreswidget", StickerType.HOME_WIDGET).getId(), "", 0, true); + WidgetDao.purchaseWidget(userId, 183, 371, 171, 1, this.getStickerByData("paper_clip_1", StickerType.STICKER).getId(), "", 0, true); + WidgetDao.purchaseWidget(userId, 109, 19, 134, 1, this.getStickerByData("needle_3", StickerType.STICKER).getId(), "", 0, true); + WidgetDao.purchaseWidget(userId, 281, 346, 150, 1, this.getStickerByData("sticker_spaceduck", StickerType.STICKER).getId(), "", 0, true); + WidgetDao.purchaseWidget(userId, 56, 229, 151, 2, this.getStickerByData("stickienote", StickerType.NOTE).getId(), "Welcome to a brand new Habbo Home page!\n" + + "This is the place where you can express yourself with a wild and unique variety of stickers, hoot yo\n" + + "trap off with colourful notes and showcase your Habbo rooms! To\n" + + "start editing just click the edit button.\n", 0, true); + + WidgetDao.purchaseWidget(userId, 110, 409, 170, 5, this.getStickerByData("stickienote", StickerType.NOTE).getId(), "Where are my friends?\n" + + "To add your buddy list to your page click edit and look in your widgets inventory. After placing it on the page you can move it all over the place and even change how it looks. Go on!", 0, true); + + WidgetDao.purchaseWidget(userId, 125, 38, 131, 4, this.getStickerByData("stickienote", StickerType.NOTE).getId(), "Remember!\n" + + "Posting personal information about yourself or your friends, including addresses, phone numbers or email, and getting round the filter will result in your note being deleted.\n" + + "Deleted notes will not be funded.\n", 0, true); + + WidgetDao.purchaseWidget(userId, 0, 0, 0, 1, this.getStickerByData("guestbookwidget", StickerType.HOME_WIDGET).getId(), "", 0, false); + WidgetDao.purchaseWidget(userId, 0, 0, 0, 1, this.getStickerByData("badgeswidget", StickerType.HOME_WIDGET).getId(), "", 0, false); + WidgetDao.purchaseWidget(userId, 0, 0, 0, 1, this.getStickerByData("friendswidget", StickerType.HOME_WIDGET).getId(), "", 0, false); + WidgetDao.purchaseWidget(userId, 0, 0, 0, 1, this.getStickerByData("groupswidget", StickerType.HOME_WIDGET).getId(), "", 0, false); + WidgetDao.purchaseWidget(userId, 0, 0, 0, 1, this.getStickerByData("traxplayerwidget", StickerType.HOME_WIDGET).getId(), "", 0, false); + WidgetDao.purchaseWidget(userId, 0, 0, 0, 1, this.getStickerByData("ratingwidget", StickerType.HOME_WIDGET).getId(), "", 0, false); + + } + + public List getDefaultWidgets(int userId) { + List widgets = new ArrayList<>(); + /* + +
+
+ + +
+
+ + +
+ + + */ + + //(int id, int userId, int x, int y, int z, int stickerId, int skinId, int groupId, String text, int amount, boolean isPlaced, String extraData) { + + widgets.add(new Widget(1, userId, 455, 27, 129, this.getStickerByData("profilewidget", StickerType.HOME_WIDGET).getId(), 1, 1, "", 1, true, "")); + widgets.add(new Widget(2, userId, 440, 321, 177, this.getStickerByData("roomswidget", StickerType.HOME_WIDGET).getId(), 6, 1, "", 1, true, "")); + widgets.add(new Widget(3, userId, 383, 491, 179, this.getStickerByData("highscoreswidget", StickerType.HOME_WIDGET).getId(), 1, 1, "", 1, true, "")); + widgets.add(new Widget(4, userId, 183, 371, 171, this.getStickerByData("paper_clip_1", StickerType.STICKER).getId(), 1, 1, "", 1, true, "")); + widgets.add(new Widget(5, userId, 109, 19, 134, this.getStickerByData("needle_3", StickerType.STICKER).getId(), 1, 1, "", 1, true, "")); + widgets.add(new Widget(6, userId, 281, 346, 150, this.getStickerByData("sticker_spaceduck", StickerType.STICKER).getId(), 2, 1, "", 1, true, "")); + + widgets.add(new Widget(7, userId, 56, 229, 151, this.getStickerByData("stickienote", StickerType.NOTE).getId(), 2, 1, "Welcome to a brand new Habbo Home page!\n" + + "This is the place where you can express yourself with a wild and unique variety of stickers, hoot yo\n" + + "trap off with colourful notes and showcase your Habbo rooms! To\n" + + "start editing just click the edit button.\n", 1, true, "")); + + widgets.add(new Widget(8, userId, 110, 409, 170, this.getStickerByData("stickienote", StickerType.NOTE).getId(), 5, 1, "To add your buddy list to your page click edit and look in your widgets inventory. After placing it on the page you can move it all over the place and even change how it looks. Go on!", + 1, true, "")); + + widgets.add(new Widget(9, userId, 125, 38, 131, this.getStickerByData("stickienote", StickerType.NOTE).getId(), 4, 1, "Remember!\n" + + "Posting personal information about yourself or your friends, including addresses, phone numbers or email, and getting round the filter will result in your note being deleted.\n" + + "Deleted notes will not be funded.\n", 1, true, "")); + + + return widgets; + } + + /** + * Get the sticker list. + * + * @return the sticker list + */ + public List getCatalogueList() { + return catalogueList; + } + + /** + * Get the category list by minimum rank. + * + * @param minRank the min rank to check + * @return the list of categories + */ + public List getCategories(int minRank) { + return categoryList.stream().filter(category -> minRank >= category.getMinRank()).collect(Collectors.toList()); + } + + /** + * Get the category by id + * + * @return the categrory + */ + public StickerCategory getCategory(int id) { + return categoryList.stream().filter(category -> category.getId() == id).findFirst().orElse(null); + } + + /** + * Get the sticker product by id. + * + * @param stickerId the sticker id + * @return the sticker + */ + public StickerProduct getStickerProduct(int stickerId) { + return catalogueList.stream().filter(product -> product.getId() == stickerId).findFirst().orElse(null); + } + + /** + * Get the skin by id. + * + * @param skinId the skin id + * @return the skin name + */ + public String getSkin(int skinId) { + switch (skinId) { + case 1: + return "defaultskin"; + case 2: + return "speechbubbleskin"; + case 3: + return "metalskin"; + case 4: + return "noteitskin"; + case 5: + return "notepadskin"; + case 6: + return "goldenskin"; + case 7: + return "hc_machineskin"; + case 8: + return "hc_pillowskin"; + } + + return "nakedskin"; + } + + /** + * Method to get sticker by data. + * + * @param data the data of the sticker + * @return the sticker + */ + public StickerProduct getStickerByData(String data, StickerType stickerType) { + return catalogueList.stream().filter(product -> product.getData().toLowerCase().equals(data.toLowerCase()) && product.getType() == stickerType).findFirst().orElse(null); + } + + /** + * Get instance of {@link StickerManager} + * + * @return the manager instance + */ + public static StickerManager getInstance() { + if (instance == null) { + instance = new StickerManager(); + } + + return instance; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/game/stickers/StickerProduct.java b/Havana-Web/src/main/java/org/alexdev/http/game/stickers/StickerProduct.java new file mode 100644 index 0000000..3795e7b --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/game/stickers/StickerProduct.java @@ -0,0 +1,107 @@ +package org.alexdev.http.game.stickers; + +public class StickerProduct { + private final int id; + private final String name; + private final String description; + private final int minRank; + private final String data; + private final int price; + private final int amount; + private final int categoryId; + private final int widgetType; + private final int type; + + public StickerProduct(int id, String name, String description, int minRank, String data, int price, int amount, int categoryId, int widgetType, int type) { + this.id = id; + this.name = name; + this.description = description; + this.minRank = minRank; + this.data = data; + this.price = price; + this.amount = amount; + this.categoryId = categoryId; + this.type = type; + this.widgetType = widgetType; + } + + public String getCssClass() { + if (this.type == 1) { + return "s_" + this.data + "_pre"; + } + + if (this.type == 4) { + return "b_" + this.data + "_pre"; + } + + if (this.type == 3) { + return "commodity_" + this.data + "_pre"; + } + + if (this.type == StickerType.GROUP_WIDGET.getTypeId() || this.type == StickerType.HOME_WIDGET.getTypeId()) { + return "w_" + this.data + "_pre"; + } + + return null; + } + + public int getId() { + return id; + } + + public String getName() { + return name; + } + + public String getDescription() { + return description; + } + + public int getMinRank() { + return minRank; + } + + public String getData() { + return data; + } + + public int getPrice() { + return price; + } + + public int getAmount() { + return amount; + } + + public int getCategoryId() { + return categoryId; + } + + public StickerType getType() { + return StickerType.getByType(this.type); + } + + public boolean isProduct() { + if (this.widgetType == 0) { + return true; + } + + return false; + } + + public boolean isGroupWidget() { + if (this.widgetType == -1) { + return true; + } + + return false; + } + + public boolean isHomeWidget() { + if (this.widgetType == 1) { + return true; + } + + return false; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/game/stickers/StickerType.java b/Havana-Web/src/main/java/org/alexdev/http/game/stickers/StickerType.java new file mode 100644 index 0000000..6c3cd12 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/game/stickers/StickerType.java @@ -0,0 +1,29 @@ +package org.alexdev.http.game.stickers; + +public enum StickerType { + STICKER(1), + BACKGROUND(4), + NOTE(3), + HOME_WIDGET(2), + GROUP_WIDGET(5); + + private final int typeId; + + StickerType(int typeId) { + this.typeId = typeId; + } + + public static StickerType getByType(int type) { + for (StickerType stickerType : values()) { + if (stickerType.getTypeId() == type) { + return stickerType; + } + } + + return null; + } + + public int getTypeId() { + return typeId; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/log/Log.java b/Havana-Web/src/main/java/org/alexdev/http/log/Log.java new file mode 100644 index 0000000..dd3e342 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/log/Log.java @@ -0,0 +1,10 @@ +package org.alexdev.http.log; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Log { + public static Logger getErrorLogger() { + return LoggerFactory.getLogger("ErrorLogger"); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/server/ServerResponses.java b/Havana-Web/src/main/java/org/alexdev/http/server/ServerResponses.java new file mode 100644 index 0000000..3fc7317 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/server/ServerResponses.java @@ -0,0 +1,61 @@ +package org.alexdev.http.server; + +import io.netty.handler.codec.http.FullHttpResponse; +import io.netty.handler.codec.http.HttpResponseStatus; +import org.alexdev.duckhttpd.exceptions.NoServerResponseException; +import org.alexdev.duckhttpd.response.ResponseBuilder; +import org.alexdev.duckhttpd.response.WebResponses; +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.http.log.Log; +import org.alexdev.http.template.TwigTemplate; + +import java.io.IOException; + +public class ServerResponses implements WebResponses { + @Override + public FullHttpResponse getErrorResponse(WebConnection client, Throwable throwable) { + if (throwable != null) { + if (throwable instanceof NoServerResponseException) { + Log.getErrorLogger().error("Server did not send response for: " + client.getRouteRequest()); + } + + Log.getErrorLogger().error("Error occurred: ", throwable); + } + + client.session().delete("page"); + + TwigTemplate tpl = (TwigTemplate) client.template("overrides/default"); + try { + return ResponseBuilder.create(tpl.renderHTML()); + } catch (IOException e) { + e.printStackTrace(); + } + + return null; + } + + @Override + public FullHttpResponse getResponse(HttpResponseStatus status, WebConnection webConnection) { + webConnection.session().delete("page"); + + if (status == HttpResponseStatus.FORBIDDEN) { + return ResponseBuilder.create(HttpResponseStatus.FORBIDDEN, "\n" + "\n" + "\n" + "\n" + "\n" + "

Forbidden

\n" + "\n" + ""); + } + + if (status == HttpResponseStatus.NOT_FOUND) { + TwigTemplate twigTemplate = new TwigTemplate(webConnection); + twigTemplate.start("overrides/default"); + try { + return ResponseBuilder.create(HttpResponseStatus.NOT_FOUND, twigTemplate.renderHTML());//"\n" + "\n" + "\n" + "\n" + "\n" + "

Not Found

\n" + "\n" + ""); + } catch (IOException e) { + e.printStackTrace(); + } + } + + //if (status == HttpResponseStatus.BAD_REQUEST) { + return ResponseBuilder.create(HttpResponseStatus.BAD_REQUEST, "\n" + "\n" + "\n" + "\n" + "\n" + "

Bad Request

\n" + "\n" + ""); + //} + + //return null; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/server/Watchdog.java b/Havana-Web/src/main/java/org/alexdev/http/server/Watchdog.java new file mode 100644 index 0000000..af8c938 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/server/Watchdog.java @@ -0,0 +1,222 @@ +package org.alexdev.http.server; + +import org.alexdev.havana.dao.mysql.*; +import org.alexdev.havana.game.catalogue.CatalogueManager; +import org.alexdev.havana.game.events.Event; +import org.alexdev.havana.game.groups.Group; +import org.alexdev.havana.game.item.ItemManager; +import org.alexdev.havana.game.room.Room; +import org.alexdev.havana.util.config.GameConfiguration; +import org.alexdev.havana.util.config.ServerConfiguration; +import org.alexdev.http.dao.*; +import org.alexdev.http.game.groups.DiscussionTopic; +import org.alexdev.http.game.news.NewsArticle; +import org.alexdev.http.game.news.NewsDateKey; +import org.alexdev.http.util.config.WebSettingsConfigWriter; +import org.apache.commons.lang3.tuple.Pair; + +import java.net.Socket; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; + +public class Watchdog implements Runnable { + public static List STAFF_PICK_GROUPS = new ArrayList<>(); + public static List RECOMMENDED_GROUPS = new ArrayList<>(); + public static List EVENTS = new ArrayList<>(); + public static List RECOMMENDED_ROOMS = new ArrayList<>(); + public static List HIDDEN_RECOMMENDED_ROOMS = new ArrayList<>(); + public static List RECENT_DISCUSSIONS = new ArrayList<>(); + public static List NEXT_RECENT_DISCUSSIONS = new ArrayList<>(); + public static List> TAG_CLOUD_10 = new ArrayList<>(); + public static List> TAG_CLOUD_20 = new ArrayList<>(); + public static List NEWS = new ArrayList<>(); + public static List NEWS_STAFF = new ArrayList<>(); + + public static int USERS_ONLNE; + public static boolean IS_SERVER_ONLINE; + public static int LAST_VISITS; + + private boolean canResetUsersFlag = true; + private boolean hasResetUsersFlag = false; + + private AtomicInteger counter; + + public Watchdog() { + this.counter = new AtomicInteger(0); + } + + @Override + public void run() { + if (this.counter.get() % TimeUnit.MINUTES.toSeconds(5) == 0) { + try { + NewsDao.publishFutureArticles(); + } catch (Exception ex) { + + } + } + + if (this.counter.get() % TimeUnit.HOURS.toSeconds(1) == 0) { + try { + if (GameConfiguration.getInstance().getBoolean("email.smtp.enable")) { + EmailDao.removeRecoveryCodeBatch(); + } + + batchClean(); + + } catch (Exception ex) { + + } + } + + if (this.counter.get() % 30 == 0) { + try { + + IS_SERVER_ONLINE = isServerOnline(ServerConfiguration.getString("rcon.ip"), ServerConfiguration.getInteger("rcon.port")); + USERS_ONLNE = Integer.parseInt(SettingsDao.getSetting("players.online")); + LAST_VISITS = SiteDao.getLastVisits(); + + // Checks to make sure the user count is set as 0 once while offline. + if (!IS_SERVER_ONLINE) { + USERS_ONLNE = 0; + + if (this.canResetUsersFlag) { + this.canResetUsersFlag = false; + this.hasResetUsersFlag = true; + } + } else { + this.canResetUsersFlag = true; + } + + if (this.hasResetUsersFlag) { + this.hasResetUsersFlag = false; + PlayerDao.resetOnline(); + } + + } catch (Exception ex) { + ex.printStackTrace(); + } + + try { + EVENTS = EventsDao.getEvents(); + } catch (Exception ex) { + + } + + try { + RECOMMENDED_GROUPS = RecommendedDao.getRecommendedGroups(false); + } catch (Exception ex) { + + } + + try { + STAFF_PICK_GROUPS = RecommendedDao.getRecommendedGroups(true); + } catch (Exception ex) { + + } + + try { + RECOMMENDED_ROOMS = RoomDao.getRecommendedRooms(5, 0); + } catch (Exception ex) { + + } + + try { + HIDDEN_RECOMMENDED_ROOMS = RoomDao.getRecommendedRooms(5, 5); + } catch (Exception ex) { + + } + + try { + RECENT_DISCUSSIONS = CommunityDao.getRecentDiscussions(10, 0); + } catch (Exception ex) { + + } + + try { + NEXT_RECENT_DISCUSSIONS = CommunityDao.getRecentDiscussions(10, 10); + } catch (Exception ex) { + + } + + try { + TAG_CLOUD_10 = TagDao.getPopularTags(10); + } catch (Exception ex) { + + } + + try { + TAG_CLOUD_20 = TagDao.getPopularTags(20); + } catch (Exception ex) { + + } + + try { + NEWS = NewsDao.getTop(NewsDateKey.ALL, 5, false, List.of(), 0); + } catch (Exception ex) { + ex.printStackTrace(); + } + + try { + NEWS_STAFF = NewsDao.getTop(NewsDateKey.ALL, 5, true, List.of(), 0); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + if (this.counter.get() % TimeUnit.HOURS.toSeconds(1) == 0) { + try { + ItemManager.reset(); + CatalogueManager.reset(); + } catch (Exception ex) { + + } + } + + // Reload config every 30 seconds + if (this.counter.get() % TimeUnit.SECONDS.toSeconds(30) == 0) { + GameConfiguration.getInstance(new WebSettingsConfigWriter()); + } + + this.resetCounter(); + } + + private void batchClean() { + if (GameConfiguration.getInstance().getInteger("delete.chatlogs.after.x.age") > 0) { + LogDao.deleteChatLogs(GameConfiguration.getInstance().getInteger("delete.chatlogs.after.x.age")); + } + + if (GameConfiguration.getInstance().getInteger("delete.iplogs.after.x.age") > 0) { + LogDao.deleteIpAddressLogs(GameConfiguration.getInstance().getInteger("delete.iplogs.after.x.age")); + } + + if (GameConfiguration.getInstance().getInteger("delete.tradelogs.after.x.age") > 0) { + LogDao.deleteTradeLogs(GameConfiguration.getInstance().getInteger("delete.tradelogs.after.x.age")); + } + } + + private void resetCounter() { + try { + this.counter.incrementAndGet(); + } catch (Exception ex) { + this.counter.set(0); + } + } + + public boolean isServerOnline(String host, int port) { + if (GameConfiguration.getInstance().getBoolean("hotel.check.online")) { + return this.isHostOnline(host, port); + } else { + return true; + } + } + + public boolean isHostOnline(String host, int port) { + try (Socket socket = new Socket(host, port)) { + return true; + } catch (Exception ex) { + return false; + } + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/template/PresentTest.java b/Havana-Web/src/main/java/org/alexdev/http/template/PresentTest.java new file mode 100644 index 0000000..a6947b7 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/template/PresentTest.java @@ -0,0 +1,30 @@ +package org.alexdev.http.template; + +import com.mitchellbosecke.pebble.error.PebbleException; +import com.mitchellbosecke.pebble.extension.AbstractExtension; +import com.mitchellbosecke.pebble.extension.Test; +import com.mitchellbosecke.pebble.template.EvaluationContext; +import com.mitchellbosecke.pebble.template.EvaluationContextImpl; +import com.mitchellbosecke.pebble.template.PebbleTemplate; + +import java.util.List; +import java.util.Map; + +public class PresentTest extends AbstractExtension implements Test { + + @Override + public boolean apply(Object input, Map args, PebbleTemplate self, EvaluationContext context, int lineNumber) throws PebbleException { + if (!(input instanceof String)) throw new IllegalArgumentException("present test only accepts a string"); + return ((EvaluationContextImpl) context).getScopeChain().containsKey((String) input); + } + + @Override + public List getArgumentNames() { + return null; + } + + @Override + public Map getTests() { + return Map.of("present", this); + } +} \ No newline at end of file diff --git a/Havana-Web/src/main/java/org/alexdev/http/template/TwigTemplate.java b/Havana-Web/src/main/java/org/alexdev/http/template/TwigTemplate.java new file mode 100644 index 0000000..22140f2 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/template/TwigTemplate.java @@ -0,0 +1,147 @@ +package org.alexdev.http.template; + +import com.mitchellbosecke.pebble.PebbleEngine; +import com.mitchellbosecke.pebble.template.PebbleTemplate; +import io.netty.handler.codec.http.HttpHeaderNames; +import org.alexdev.duckhttpd.response.ResponseBuilder; +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.duckhttpd.template.Template; +import org.alexdev.duckhttpd.util.config.Settings; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.util.StringUtil; +import org.alexdev.havana.util.config.ServerConfiguration; +import org.alexdev.http.log.Log; +import org.alexdev.http.template.binders.AlertBinder; +import org.alexdev.http.template.binders.SessionBinder; +import org.alexdev.http.template.binders.SiteBinder; + +import java.io.File; +import java.io.IOException; +import java.io.StringWriter; +import java.io.Writer; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.HashMap; +import java.util.Map; + +public class TwigTemplate extends Template { + private File file; + private String view; + + private PebbleEngine engine; + private PebbleTemplate compiledTemplate; + private HashMap context; + + public TwigTemplate(WebConnection session) { + super(session); + this.context = new HashMap<>(); + } + + @Override + public void start(String view) { + this.view = view; + + try { + File file = Paths.get(ServerConfiguration.getString("template.directory"), ServerConfiguration.getString("template.name"), view + ".tpl").toFile(); + + if (file.exists() && file.isFile()) { + this.file = file; + String prefix = Path.of(ServerConfiguration.getString("template.directory"), ServerConfiguration.getString("template.name")).toAbsolutePath().toString(); + + this.engine = new PebbleEngine.Builder() + .strictVariables(false) + .autoEscaping(false) + .extension(new PresentTest()) + .build(); + + this.engine.getLoader().setCharset(StringUtil.getCharset().toString()); + this.engine.getLoader().setPrefix(prefix); + + this.compiledTemplate = this.engine.getTemplate(view + ".tpl"); + } else { + throw new Exception("The template view " + view + " does not exist!\nThe path: " + file.getCanonicalPath()); + } + + if (this.webConnection != null) { + if (this.webConnection.session().getBoolean("authenticated") || + this.webConnection.session().getBoolean("authenticatedHousekeeping")) { + PlayerDetails playerDetails = PlayerDao.getDetails(this.webConnection.session().getInt("user.id")); + + if (playerDetails == null) { + this.webConnection.session().delete("authenticated"); + this.webConnection.redirect("/"); + return; + } + + this.set("playerDetails", PlayerDao.getDetails(this.webConnection.session().getInt("user.id"))); + } + } + + } catch (Exception ex) { + if (this.webConnection != null) { + Settings.getInstance().getDefaultResponses().getErrorResponse(this.webConnection, ex); + } else { + Log.getErrorLogger().error("Error: ", ex); + } + } + } + + @Override + public void set(String name, Object value) { + this.context.put(name, value); + } + + @Override + public Object get(String s) { + if (this.context.containsKey(s)) { + return this.context.get(s); + } + + return null; + } + + private void attachBinders() { + this.registerBinder(new SessionBinder()); + this.registerBinder(new SiteBinder()); + + if (this.webConnection != null) { + this.registerBinder(new AlertBinder( + this.webConnection.session().getString("alertMessage"), + this.webConnection.session().getString("alertColour")) + ); + } + } + + public String renderHTML() throws IOException { + this.attachBinders(); + + for (var key : context.keySet()) { + //System.out.println(key); + } + + Writer writer = new StringWriter(); + compiledTemplate.evaluate(writer, context); + String html = writer.toString(); + writer.close(); + + return html; + } + + @Override + public void render() { + try { + var html = this.renderHTML(); + var response = ResponseBuilder.create(html); + + for (var entry : this.webConnection.headers().entrySet()) { + response.headers().add(entry.getKey(), entry.getValue()); + } + + this.webConnection.send(response); + this.webConnection.headers().clear(); + } catch (Exception ex) { + Settings.getInstance().getDefaultResponses().getErrorResponse(this.webConnection, ex); + } + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/template/binders/AlertBinder.java b/Havana-Web/src/main/java/org/alexdev/http/template/binders/AlertBinder.java new file mode 100644 index 0000000..6b2c193 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/template/binders/AlertBinder.java @@ -0,0 +1,36 @@ +package org.alexdev.http.template.binders; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.duckhttpd.template.Template; +import org.alexdev.duckhttpd.template.TemplateBinder; + +public class AlertBinder implements TemplateBinder { + private boolean hasAlert; + private String message; + private String colour; + + public AlertBinder(String message, String colour) { + if (message != null) { + this.hasAlert = true; + this.message = message; + this.colour = colour; + } + } + + @Override + public void onRegister(Template template, WebConnection webConnection) { + template.set("alert", this); + } + + public boolean isHasAlert() { + return hasAlert; + } + + public String getMessage() { + return message; + } + + public String getColour() { + return colour; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/template/binders/SessionBinder.java b/Havana-Web/src/main/java/org/alexdev/http/template/binders/SessionBinder.java new file mode 100644 index 0000000..3bc78ae --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/template/binders/SessionBinder.java @@ -0,0 +1,31 @@ +package org.alexdev.http.template.binders; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.duckhttpd.template.Template; +import org.alexdev.duckhttpd.template.TemplateBinder; + +public class SessionBinder implements TemplateBinder { + private boolean loggedIn; + private String currentPage; + + @Override + public void onRegister(Template template, WebConnection webConnection) { + if (webConnection != null) { + this.currentPage = webConnection.session().getString("page"); + + if (webConnection.session().getBoolean("authenticated")) { + this.loggedIn = true; + } + } + + template.set("session", this); + } + + public boolean isLoggedIn() { + return loggedIn; + } + + public String getCurrentPage() { + return currentPage; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/template/binders/SiteBinder.java b/Havana-Web/src/main/java/org/alexdev/http/template/binders/SiteBinder.java new file mode 100644 index 0000000..e367363 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/template/binders/SiteBinder.java @@ -0,0 +1,215 @@ +package org.alexdev.http.template.binders; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.duckhttpd.template.Template; +import org.alexdev.duckhttpd.template.TemplateBinder; +import org.alexdev.http.Routes; +import org.alexdev.http.server.Watchdog; +import org.alexdev.havana.util.config.GameConfiguration; +import org.alexdev.http.util.Captcha; +import org.codehaus.plexus.util.StringUtils; + +import java.text.NumberFormat; +import java.util.Locale; + +public class SiteBinder implements TemplateBinder { + private String siteName; + private String sitePath; + + private String loaderGameIp; + private String loaderGamePort; + + private String loaderMusIp; + private String loaderMusPort; + + private String loaderDcr; + private String loaderVariables; + private String loaderTexts; + + private int usersOnline; + private boolean serverOnline; + private String formattedUsersOnline; + + private int visits; + private String housekeepingPath; + private String staticContentPath; + private String habboImagingPath; + + private String loaderFlashBase; + private String loaderFlashSwf; + private String loaderFlashTexts; + private String loaderFlashVariables; + + private String loaderFlashBetaBase; + private String loaderFlashBetaSwf; + private String loaderFlashBetaTexts; + private String loaderFlashBetaVariables; + + private String emailSiteName; + private String emailHotelName; + private String emailStaticPath; + private String furniImagerPath; + + private Captcha captcha; + + @Override + public void onRegister(Template template, WebConnection webConnection) { + this.captcha = new Captcha(); + + this.siteName = GameConfiguration.getInstance().getString("site.name"); + this.sitePath = GameConfiguration.getInstance().getString("site.path"); + this.staticContentPath = GameConfiguration.getInstance().getString("static.content.path"); + this.furniImagerPath = "https://classichabbo.com/imager/furni"; + + this.emailStaticPath = GameConfiguration.getInstance().getString("email.static.content.path"); + this.emailHotelName = StringUtils.capitalise(GameConfiguration.getInstance().getString("site.path").replace("https://", "").replace("http://", "").replace("/", "")); + + this.habboImagingPath = GameConfiguration.getInstance().getString("site.imaging.path");//"https://alex-dev.org"; + + this.loaderGameIp = GameConfiguration.getInstance().getString("loader.game.ip"); + this.loaderGamePort = GameConfiguration.getInstance().getString("loader.game.port"); + + this.loaderMusIp = GameConfiguration.getInstance().getString("loader.mus.ip"); + this.loaderMusPort = GameConfiguration.getInstance().getString("loader.mus.port"); + + this.loaderDcr = GameConfiguration.getInstance().getString("loader.dcr"); + this.loaderVariables = GameConfiguration.getInstance().getString("loader.external.variables"); + this.loaderTexts = GameConfiguration.getInstance().getString("loader.external.texts"); + + this.loaderFlashBase = GameConfiguration.getInstance().getString("loader.flash.base"); + this.loaderFlashSwf = GameConfiguration.getInstance().getString("loader.flash.swf"); + this.loaderFlashTexts = GameConfiguration.getInstance().getString("loader.flash.external.texts"); + this.loaderFlashVariables = GameConfiguration.getInstance().getString("loader.flash.external.variables"); + + this.loaderFlashBetaBase = GameConfiguration.getInstance().getString("loader.flash.beta.base"); + this.loaderFlashBetaSwf = GameConfiguration.getInstance().getString("loader.flash.beta.swf"); + this.loaderFlashBetaTexts = GameConfiguration.getInstance().getString("loader.flash.beta.external.texts"); + this.loaderFlashBetaVariables = GameConfiguration.getInstance().getString("loader.flash.beta.external.variables"); + + this.serverOnline = Watchdog.IS_SERVER_ONLINE; + this.usersOnline = Watchdog.USERS_ONLNE; + this.formattedUsersOnline = NumberFormat.getNumberInstance(Locale.US).format(this.usersOnline); + + this.visits = Watchdog.LAST_VISITS; + this.housekeepingPath = Routes.HOUSEKEEPING_PATH; + + template.set("site", this); + template.set("gameConfig", GameConfiguration.getInstance()); + } + + public String getSiteName() { + return siteName; + } + + public String getSitePath() { + return sitePath; + } + + public String getLoaderGameIp() { + return loaderGameIp; + } + + public String getLoaderGamePort() { + return loaderGamePort; + } + + public String getLoaderMusIp() { + return loaderMusIp; + } + + public String getLoaderMusPort() { + return loaderMusPort; + } + + public String getLoaderDcr() { + return loaderDcr; + } + + public String getLoaderVariables() { + return loaderVariables; + } + + public String getLoaderTexts() { + return loaderTexts; + } + + public int getUsersOnline() { + return usersOnline; + } + + public boolean isServerOnline() { + return serverOnline; + } + + public String getFormattedUsersOnline() { + return formattedUsersOnline; + } + + public int getVisits() { + return visits; + } + + public String getHousekeepingPath() { + return housekeepingPath; + } + + public String getStaticContentPath() { + return staticContentPath; + } + + public String getHabboImagingPath() { + return habboImagingPath; + } + + public String getLoaderFlashBase() { + return loaderFlashBase; + } + + public String getLoaderFlashSwf() { + return loaderFlashSwf; + } + + public String getLoaderFlashTexts() { + return loaderFlashTexts; + } + + public String getLoaderFlashVariables() { + return loaderFlashVariables; + } + + public String getLoaderFlashBetaBase() { + return loaderFlashBetaBase; + } + + public String getLoaderFlashBetaSwf() { + return loaderFlashBetaSwf; + } + + public String getLoaderFlashBetaTexts() { + return loaderFlashBetaTexts; + } + + public String getLoaderFlashBetaVariables() { + return loaderFlashBetaVariables; + } + + public String getEmailSiteName() { + return emailSiteName; + } + + public String getEmailHotelName() { + return emailHotelName; + } + + public String getEmailStaticPath() { + return emailStaticPath; + } + + public String getFurniImagerPath() { + return furniImagerPath; + } + + public Captcha getCaptcha() { + return captcha; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/util/BBCode.java b/Havana-Web/src/main/java/org/alexdev/http/util/BBCode.java new file mode 100644 index 0000000..ee0c4ae --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/util/BBCode.java @@ -0,0 +1,79 @@ +package org.alexdev.http.util; + +import org.alexdev.havana.util.config.GameConfiguration; + +public class BBCode { + public static String format(String message, boolean allowImages) { + message = parse(message, allowImages); + String siteContentPath = GameConfiguration.getInstance().getString("static.content.path"); + /*message = message.replace(":)", " Smiley "); + message = message.replace(";)", " Smiley "); + message = message.replace(":P", " Smiley "); + message = message.replace(";P", " Smiley "); + message = message.replace(":p", " Smiley "); + message = message.replace(";p", " Smiley "); + message = message.replace("(L)", " Smiley "); + message = message.replace("(l)", " Smiley "); + message = message.replace(":o", " Smiley "); + message = message.replace(":O", " Smiley ");*/ + return message; + } + + public static String normalise(String message) { + message = message.replaceAll("\r", "\n"); + message = message.replaceAll("\\[/quote]\n\n", "[/quote]"); + message = message.replaceAll("\\[/quote]\n", "[/quote]"); + /*message = message.replaceAll("\n\n", "\n"); + message = message.replaceAll("\n\n", "\n");*/ + message = message.replaceAll("\n", "[br]"); + return message; + } + + private static String parse(String message, boolean allowImages) { + String sitePath = GameConfiguration.getInstance().getString("site.path"); + + if (message.contains("javascript:") || + message.contains("document.write")) { + message = message.replace("javascript:", ""); + message = message.replace("document.write", ""); + } + + message = message.replaceAll("\\[b](.*?)\\[/b]", "$1"); + message = message.replaceAll("\\[i](.*?)\\[/i]", "$1"); + message = message.replaceAll("\\[u](.*?)\\[/u]", "$1"); + message = message.replaceAll("\\[s](.*?)\\[/s]", "$1"); + message = message.replaceAll("\\[strike](.*?)\\[/strike]", "$1"); + message = message.replaceAll("\\[link=(.*?)](.*?)\\[/link]", "$2"); + message = message.replaceAll("\\[url=(.*?)](.*?)\\[/url]", "$2"); + message = message.replaceAll("\\[color=(orange|red|yellow|green|cyan|blue|gray|black|white)](.*?)\\[/color]", "$2"); + message = message.replaceAll("\\[color=(#[0-9a-fA-F]{6})](.*?)\\[/color]", "$2"); + message = message.replaceAll("\\[size=small](.*?)\\[/size]", "$1"); + message = message.replaceAll("\\[size=large](.*?)\\[/size]", "$1"); + message = message.replaceAll("\\[code](.*?)\\[/code]", "
$1
"); + message = message.replaceAll("\\[habbo=(.*?)](.*?)\\[/habbo]", "$2"); + message = message.replaceAll("\\[room=(.*?)](.*?)\\[/room]", "$2"); + message = message.replaceAll("\\[group=(.*?)](.*?)\\[/group]", "$2"); + + for (int i = 0; i < 10; i++) { + message = message.replaceAll("\\[quote](.*?)\\[/quote]", "
$1
"); + } + + message = message.replaceAll("\\[br]", "
"); + + if (allowImages) { + message = message.replaceAll("\\[img=(.*?)](.*?)\\[/img]", "\"$1\""); + message = message.replaceAll("\\[img](.*?)\\[/img]", ""); + + message = message.replaceAll("\\[img height='(.*?)' width='(.*?)'](.*?)\\[/img]", ""); + message = message.replaceAll("\\[img](.*?)\\[/img]", ""); + + message = message.replaceAll("\\[article_images](.*?)\\[/article_images]", "
$1
"); + message = message.replaceAll("\\[article_image](.*?)\\[/article_image]", ""); + message = message.replaceAll("\\[article_image x=(.*?) y=(.*?)](.*?)\\[/article_image]", ""); + message = message.replaceAll("\\[center](.*?)\\[/center]", "
$1
"); + message = message.replace("

", "
"); + } + + return message; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/util/Captcha.java b/Havana-Web/src/main/java/org/alexdev/http/util/Captcha.java new file mode 100644 index 0000000..4965460 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/util/Captcha.java @@ -0,0 +1,200 @@ +/* +Copyright 2009-2016 Igor Polevoy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +package org.alexdev.http.util; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.apache.commons.codec.binary.Hex; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Locale; +import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; + +/** + * This is a simple captcha class, use it to generate a random string and then to create an image of it. + * + * @author Igor Polevoy + */ +public class Captcha { + private static boolean showGrid = false; + private static int width = 200; + private static int height = 50; + private static int gridSize = 11; + private static int fontSize = 45; + private static int rotationAmplitude = 15; + private static int scaleAmplitude = 15; + + public Captcha(){} + + public String createHash() { + MessageDigest messageDigest = null; + + try { + messageDigest = MessageDigest.getInstance("MD5"); + } catch (NoSuchAlgorithmException e) { + return null; + } + + String str = generateText(32); + + messageDigest.reset(); + messageDigest.update(str.getBytes(StandardCharsets.UTF_8)); + final byte[] resultByte = messageDigest.digest(); + final String result = new String(Hex.encodeHex(resultByte)); + return result; + } + + /** + * Generates a random alpha-numeric string of eight characters. + * + * @return random alpha-numeric string of eight characters. + */ + public static String generateText(int length) { + + char[] data = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', + 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', + 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', + 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', + 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', + '7', '8', '9'}; + + char[] index = new char[length - 1]; + + Random r = new Random(); + int i = 0; + + for (i = 0; i < (index.length); i++) { + int ran = r.nextInt(data.length); + index[i] = data[ran]; + } + return new String(index).toLowerCase(); + } + + /** + * Generates a PNG image of text 180 pixels wide, 40 pixels high with white background. + * + * @param text expects string size eight (8) characters. + * @return byte array that is a PNG image generated with text displayed. + */ + public static byte[] generateImage(String text) { + if (text == null || text.length() == 0) { + throw new IllegalArgumentException("No captcha text given"); + } + + BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); + Graphics2D g2d = image.createGraphics(); + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2d.setBackground(Color.WHITE); + g2d.setColor(Color.BLACK); + + clearCanvas(g2d); + + if (showGrid) { + drawGrid(g2d); + } + + for(int i = 0; i < 8; i++) { + int oldX = ThreadLocalRandom.current().nextInt(0, width); + int oldY = ThreadLocalRandom.current().nextInt(0, height); + + int newX = ThreadLocalRandom.current().nextInt(0, height); + int newY = ThreadLocalRandom.current().nextInt(0, height); + + g2d.drawLine(oldX, oldY, newX, newY); + } + + int xPos = 20; + + for (char ch : text.toCharArray()) { + int charMaxWidth = (width / text.length()) - ThreadLocalRandom.current().nextInt(0, 20); + drawCharacter(g2d, ch, xPos, charMaxWidth); + xPos += charMaxWidth; + } + + g2d.dispose(); + ByteArrayOutputStream bout = new ByteArrayOutputStream(); + try { + ImageIO.write(image, "png", bout); + } catch (Exception e) { + throw new RuntimeException(e); + } + return bout.toByteArray(); + } + + private static void drawCharacter(Graphics2D g2d, char ch, int x, int boxWidth) { + Font normalFont = new Font("Arial", Font.PLAIN, fontSize); + Font boldFont = new Font("Arial", Font.BOLD, fontSize); + + double degree = (ThreadLocalRandom.current().nextDouble() * rotationAmplitude * 2) - rotationAmplitude; + double scale = 1 - (ThreadLocalRandom.current().nextDouble() * scaleAmplitude / 100); + + Graphics2D cg2d = (Graphics2D) g2d.create(); + + if (ThreadLocalRandom.current().nextBoolean()) { + cg2d.setFont(normalFont);//fontSize)); + } else { + cg2d.setFont(boldFont); + } + + cg2d.translate(x + (boxWidth / 2), height / 2); + cg2d.rotate(degree * Math.PI / 90); + cg2d.scale(scale, scale); + + FontMetrics fm = cg2d.getFontMetrics(); + int charWidth = fm.charWidth(ch); + int charHeight = fm.getAscent() + fm.getDescent(); + + cg2d.drawString(String.valueOf(ch), -(charWidth / 2), fm.getAscent() - (charHeight / 2)); + + cg2d.dispose(); + } + + /** + * Clears the canvas. + */ + private static void clearCanvas(Graphics2D g2d) { + g2d.clearRect(0, 0, width, height); + } + + /** + * Draws the background grid. + */ + private static void drawGrid(Graphics2D g2d) { + for (int y = 2; y < height; y += gridSize) { + g2d.drawLine(0, y, width - 1, y); + } + + for (int x = 2; x < width; x += gridSize) { + g2d.drawLine(x, 0, x, height -1); + } + } + + public static boolean matches(WebConnection webConnection, String captcha) { + String captchaGenerated = webConnection.session().getString("captcha-text"); + + if (captchaGenerated == null || captchaGenerated.isBlank()) + return false; + + return captchaGenerated.equals(captcha); + } +} \ No newline at end of file diff --git a/Havana-Web/src/main/java/org/alexdev/http/util/ConfigEntry.java b/Havana-Web/src/main/java/org/alexdev/http/util/ConfigEntry.java new file mode 100644 index 0000000..3b53e0a --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/util/ConfigEntry.java @@ -0,0 +1,27 @@ +package org.alexdev.http.util; + +public class ConfigEntry { + private String key; + private String value; + + public ConfigEntry(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } +} \ No newline at end of file diff --git a/Havana-Web/src/main/java/org/alexdev/http/util/EmailUtil.java b/Havana-Web/src/main/java/org/alexdev/http/util/EmailUtil.java new file mode 100644 index 0000000..f0e8e67 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/util/EmailUtil.java @@ -0,0 +1,132 @@ +package org.alexdev.http.util; + +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.havana.util.config.GameConfiguration; +import org.alexdev.http.HavanaWeb; +import org.alexdev.http.dao.EmailDao; +import org.alexdev.http.template.TwigTemplate; +import org.apache.commons.validator.routines.EmailValidator; + +import javax.mail.*; +import javax.mail.internet.*; +import java.io.IOException; +import java.util.Properties; + +public class EmailUtil { + private static final long EMAIL_COOLDOWN = 2*60; + + public static boolean send(WebConnection webConnection, String targetEmail, String subject, String renderedHTML) { + if (!GameConfiguration.getInstance().getBoolean("email.smtp.enable")) { + return true; + } + + if (!EmailValidator.getInstance().isValid(targetEmail)) { + return false; + } + + if (webConnection.session().contains("lastEmailTime")) { + long lastEmailTime = Long.parseLong(webConnection.session().getString("lastEmailTime")) + EMAIL_COOLDOWN; + + if (lastEmailTime > DateUtil.getCurrentTimeSeconds()) { + webConnection.session().set("alertMessage", "Please wait a few minutes before sending an email again"); + webConnection.session().set("alertColour", "red"); + return false; + } + } + + webConnection.session().set("lastEmailTime", String.valueOf(DateUtil.getCurrentTimeSeconds())); + + HavanaWeb.getExecutor().execute(() -> { + try { + Properties prop = new Properties(); + prop.put("mail.smtp.auth", true); + prop.put("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory"); + prop.put("mail.smtp.socketFactory.fallback","false"); + prop.put("mail.smtp.socketFactory.port", "465"); + prop.put("mail.smtp.host", GameConfiguration.getInstance().getString("email.smtp.host")); + prop.put("mail.smtp.port", GameConfiguration.getInstance().getString("email.smtp.port")); + prop.put("mail.smtp.connectiontimeout", "5000"); + prop.put("mail.smtp.timeout", "5000"); + + Session session = Session.getInstance(prop, new Authenticator() { + @Override + protected PasswordAuthentication getPasswordAuthentication() { + String username = GameConfiguration.getInstance().getString("email.smtp.login.username"); + String password = GameConfiguration.getInstance().getString("email.smtp.login.password"); + return new PasswordAuthentication(username, password); + } + }); + Message message = new MimeMessage(session); + message.setFrom(new InternetAddress(GameConfiguration.getInstance().getString("email.smtp.from.email"), GameConfiguration.getInstance().getString("email.smtp.from.name"))); + message.setRecipients( + Message.RecipientType.TO, InternetAddress.parse(targetEmail)); + message.setSubject(subject); + + MimeBodyPart mimeBodyPart = new MimeBodyPart(); + mimeBodyPart.setContent(renderedHTML, "text/html"); + + Multipart multipart = new MimeMultipart(); + multipart.addBodyPart(mimeBodyPart); + + message.setContent(multipart); + Transport.send(message); + } catch (Exception ex) { + ex.printStackTrace(); + } + }); + + return true; + } + + public static String renderRegistered(int playerId, String playerName, String playerEmail, String activationCode) { + var tpl = new TwigTemplate(null); + tpl.start("account/email/email_registered"); + tpl.set("playerId", playerId); + tpl.set("playerName", playerName); + tpl.set("playerEmail", playerEmail); + tpl.set("activationCode", activationCode); + try { + return tpl.renderHTML(); + } catch (IOException e) { + e.printStackTrace(); + } + + return null; + } + + public static String renderActivate(int playerId, String playerName, String playerEmail, String activationCode) { + var tpl = new TwigTemplate(null); + tpl.start("account/email/email_activate"); + tpl.set("playerId", playerId); + tpl.set("playerName", playerName); + tpl.set("playerEmail", playerEmail); + tpl.set("activationCode", activationCode); + try { + return tpl.renderHTML(); + } catch (IOException e) { + e.printStackTrace(); + } + + return null; + } + + public static String renderPasswordRecovery(int playerId, String playerName, String recoveryCode) { + var tpl = new TwigTemplate(null); + tpl.start("account/email/email_recovery"); + tpl.set("playerId", playerId); + tpl.set("playerName", playerName); + tpl.set("recoveryCode", recoveryCode); + try { + return tpl.renderHTML(); + } catch (IOException e) { + e.printStackTrace(); + } + + return null; + } + + public static boolean isAlreadyTradePass(int userId, String email) { + return EmailDao.hasUserTradePass(userId, email); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/util/GroupUtil.java b/Havana-Web/src/main/java/org/alexdev/http/util/GroupUtil.java new file mode 100644 index 0000000..9abe593 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/util/GroupUtil.java @@ -0,0 +1,46 @@ +package org.alexdev.http.util; + +import io.netty.handler.codec.http.HttpResponseStatus; +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.duckhttpd.util.config.Settings; +import org.alexdev.havana.dao.mysql.GroupDao; +import org.alexdev.havana.game.groups.Group; +import org.alexdev.havana.server.rcon.messages.RconHeader; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; + +public class GroupUtil { + public static void refreshGroup(int groupId) { + RconUtil.sendCommand(RconHeader.REFRESH_GROUP, new HashMap<>() {{ + put("groupId", String.valueOf(groupId)); + }}); + } + + public static Group resolve(WebConnection webConnection) { + String match = webConnection.getMatches().get(0); + + String groupAlias = null; + Group group = null; + + if (StringUtils.isNumeric(match) && webConnection.getRouteRequest().endsWith("/id/discussions")) { + group = GroupDao.getGroup(Integer.parseInt(match)); + + if (group == null) { + webConnection.send(Settings.getInstance().getDefaultResponses().getResponse(HttpResponseStatus.NOT_FOUND, webConnection)); + return null; + } + + if (!group.getAlias().isBlank()) { + webConnection.redirect("/groups/" + group.getAlias() + "/discussions"); + return null; + } + + } else if (!webConnection.getRouteRequest().endsWith("/id/discussions")){ + groupAlias = match; + group = GroupDao.getGroupByAlias(groupAlias); + } + + return group; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/util/HomeUtil.java b/Havana-Web/src/main/java/org/alexdev/http/util/HomeUtil.java new file mode 100644 index 0000000..f1a32f9 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/util/HomeUtil.java @@ -0,0 +1,47 @@ +package org.alexdev.http.util; + +import java.util.concurrent.ThreadLocalRandom; + +public class HomeUtil { + public static String getRandomAd() { + String[] advertisements = new String[] { + "habbo_banner_1.gif", + "Habbohome_phold_160x600.gif", + "Habbohome_phold_160x600.gif", + "Habbohome_phold_160x600.gif", + "bb2_placeholder.gif", + "SciFi_spaceholder_160x600_001.gif", + "HC2_placeh_160x600.gif", + "battleball_reddevil_br.gif", + "HC_Promo_160x600_GIF01.gif" + + }; + + if (advertisements.length > 0) { + return advertisements[ThreadLocalRandom.current().nextInt(advertisements.length)]; + } + + return null; + } + + public static String getRandomValentinesImage() { + String[] advertisements = new String[] { + "valentines_1_chanaho.png", + "valentines_2_ultra.png", + "valentines_3_santi13.png", + "valentines_4_santi13.png", + "valentines_5_rasta.png" + + }; + + if (advertisements.length > 0) { + return advertisements[ThreadLocalRandom.current().nextInt(advertisements.length)]; + } + + return null; + } + + public static int getStickerLimit(boolean hasClubSubscription) { + return hasClubSubscription ? 350 : 200; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/util/HousekeepingUtil.java b/Havana-Web/src/main/java/org/alexdev/http/util/HousekeepingUtil.java new file mode 100644 index 0000000..9eea53d --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/util/HousekeepingUtil.java @@ -0,0 +1,19 @@ +package org.alexdev.http.util; + +import org.alexdev.havana.dao.mysql.RoomDao; + +public class HousekeepingUtil { + public String getRoomName(int roomId) { + var room = RoomDao.getRoomById(roomId); + + if (room == null) { + return "ERROR"; + } + + return room.getData().getName(); + } + + public String formatNewsStory(String fullstory) { + return BBCode.format(HtmlUtil.escape(BBCode.normalise(fullstory)), true); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/util/HtmlUtil.java b/Havana-Web/src/main/java/org/alexdev/http/util/HtmlUtil.java new file mode 100644 index 0000000..a67acaa --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/util/HtmlUtil.java @@ -0,0 +1,110 @@ +package org.alexdev.http.util; + +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.io.IOUtils; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.*; +import java.net.URL; +import java.nio.charset.Charset; + +public class HtmlUtil { + /** + * Strip HTML tags. + * + * @param str the string to strip + * @return the new string + */ + public static String removeHtmlTags(String str) { + return str.replaceAll("\\<[^>]*>",""); + } + + /** + * Conver text to HTML. + * + * @param s the string to convert + * @return the converted text + */ + public static String escape(String s) { + StringBuilder builder = new StringBuilder(); + boolean previousWasASpace = false; + + for (char c : s.toCharArray()) { + if (c == ' ') { + if (previousWasASpace) { + builder.append(" "); + previousWasASpace = false; + continue; + } + previousWasASpace = true; + } else { + previousWasASpace = false; + } + + switch (c) { + case '<': + builder.append("<"); + break; + case '>': + builder.append(">"); + break; + case '&': + builder.append("&"); + break; + case '"': + builder.append("""); + break; + case '\n': + builder.append("
"); + break; + // We need Tab support here, because we print StackTraces as HTML + case '\t': + builder.append("     "); + break; + default: + if (c < 128) { + builder.append(c); + } else { + builder.append("&#").append((int) c).append(";"); + } + } + } + return builder.toString(); + } + + public static String createFigureLink(String figure, String sex) { + return "https://cdn.classichabbo.com/habbo-imaging/avatarimage?figure=" + figure + "&size=s&direction=4&head_direction=4&crr=0&gesture=sml&frame=1"; + } + + public static String encodeToString(BufferedImage image, String type) { + String imageString = null; + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + + try { + ImageIO.write(image, type, bos); + byte[] imageBytes = bos.toByteArray(); + + imageString = new String(Base64.encodeBase64(imageBytes)); + + bos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + return imageString; + } + + public static String getResponse(String url) { + InputStream in = null; + String val = null; + + try { + in = new URL(url).openStream(); + val = IOUtils.toString( in, Charset.defaultCharset()); + } catch (Exception ignored) { + IOUtils.closeQuietly(in); + } + + return val; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/util/RconUtil.java b/Havana-Web/src/main/java/org/alexdev/http/util/RconUtil.java new file mode 100644 index 0000000..a1479b2 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/util/RconUtil.java @@ -0,0 +1,14 @@ +package org.alexdev.http.util; + +import org.alexdev.havana.server.rcon.messages.RconHeader; +import org.alexdev.http.HavanaWeb; +import org.alexdev.http.util.rcon.RconTask; + +import java.util.Map; + +public class RconUtil { + public static void sendCommand(RconHeader header, Map parameters) { + RconTask rconTask = new RconTask(header, parameters); + HavanaWeb.getExecutor().execute(rconTask); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/util/RegisterUtil.java b/Havana-Web/src/main/java/org/alexdev/http/util/RegisterUtil.java new file mode 100644 index 0000000..6078fa5 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/util/RegisterUtil.java @@ -0,0 +1,54 @@ +package org.alexdev.http.util; + +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.game.wordfilter.WordfilterManager; +import org.alexdev.http.controllers.habblet.NameCheckController; +import org.apache.commons.validator.routines.EmailValidator; + +public class RegisterUtil { + public static boolean isValidName(String username) { + return getNameErrorCode(username) == 0; + } + + public static int getNameErrorCode(String username) { + if (!WordfilterManager.filterSentence(username).equals(username)) { + return 6; + } else if (!NameCheckController.hasAllowedCharacters(username.toLowerCase(), "1234567890qwertyuiopasdfghjklzxcvbnm-+=?!@:.,$")) { + return 5; + } else if (username.equalsIgnoreCase("admin") || + username.equalsIgnoreCase("mod") || + username.equalsIgnoreCase("staff") || + username.equalsIgnoreCase("moderator") || + username.equalsIgnoreCase("vip") || + username.toLowerCase().startsWith("admin-") || + username.toLowerCase().startsWith("admin=") || + username.toLowerCase().startsWith("mod-") || + username.toLowerCase().startsWith("mod=") || + username.toLowerCase().startsWith("bot-") || + username.toLowerCase().startsWith("bot=") || + username.toLowerCase().startsWith("vip=") || + username.toLowerCase().startsWith("vip-")) { + return 4; + } else if (username.length() > 24) { + return 3; + } else if (username.length() < 1) { + return 2; + } else if (PlayerDao.getId(username) > 0) { + return 1; + } + + return 0; + } + + public static boolean isValidEmail(String email) { + if (!EmailValidator.getInstance().isValid(email)) { + return false; + } + + if (PlayerDao.getByEmail(email) > 0) { + return false; + } + + return true; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/util/SessionUtil.java b/Havana-Web/src/main/java/org/alexdev/http/util/SessionUtil.java new file mode 100644 index 0000000..b29794a --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/util/SessionUtil.java @@ -0,0 +1,117 @@ +package org.alexdev.http.util; + +import com.goterl.lazysodium.interfaces.PwHash; +import org.alexdev.duckhttpd.server.connection.WebConnection; +import org.alexdev.havana.dao.mysql.PlayerDao; +import org.alexdev.havana.game.player.PlayerDetails; +import org.alexdev.havana.util.DateUtil; +import org.alexdev.http.dao.SessionDao; + +import java.util.UUID; +import java.util.concurrent.TimeUnit; + +public class SessionUtil { + public static final String PLAYER = "player"; + public static final String USER_ID = "user.id"; + public static final String LOGGED_IN = "authenticated"; + public static final String LOGGED_IN_HOUSKEEPING = "authenticatedHousekeeping"; + public static final String MACHINE_ID = "SECURITY_KEY"; + + public static String REMEMEBER_TOKEN_NAME = "remember_token"; + public static int REMEMBER_TOKEN_AGE_SECONDS = (int) TimeUnit.DAYS.toSeconds(31); + public static int REAUTHENTICATE_TIME = (int) TimeUnit.MINUTES.toSeconds(30); + + public static boolean login(WebConnection webConnection, String username, String password, boolean deleteAuthVariables) { + PlayerDetails details = new PlayerDetails(); + boolean hasError; + + if (username.isBlank() || password.isBlank()) { + hasError = true; + } else { + hasError = !PlayerDao.login(details, username, password); + } + + if (hasError) { + webConnection.session().set("alertMessage", "Incorrect username or password\n"); + + // Delete user login session + if (deleteAuthVariables) { + webConnection.session().delete("user.id"); + webConnection.session().delete("authenticated"); + } + return false; + } else { + webConnection.session().set("authenticated", true); + webConnection.session().set("captcha.invalid", false); + webConnection.session().set("user.id", details.getId() + ""); + webConnection.session().set("clientAuthenticate", false); + webConnection.session().set("lastRequest", String.valueOf(DateUtil.getCurrentTimeSeconds() + SessionUtil.REAUTHENTICATE_TIME)); + + boolean rememberMe = webConnection.post().getString("_login_remember_me").equals("true"); + + if (rememberMe) { + String rememberMeToken = String.valueOf(UUID.randomUUID()); + webConnection.cookies().set(SessionUtil.REMEMEBER_TOKEN_NAME, rememberMeToken, DateUtil.getCurrentTimeSeconds() + SessionUtil.REMEMBER_TOKEN_AGE_SECONDS, TimeUnit.SECONDS); + SessionDao.setRememberToken(details.getId(), rememberMeToken); + } else { + webConnection.cookies().set(SessionUtil.REMEMEBER_TOKEN_NAME, "", 0, TimeUnit.SECONDS); // Clear cookie + } + + webConnection.cookies().set("vote_stamp", "", 0, TimeUnit.SECONDS); // Clear cookie + + var pair = details.isBanned(); + + if (pair != null) { + webConnection.redirect("/account/banned"); + } + + return true; + } + } + + public static void logout(WebConnection webConnection) { + // Delete cookies + if (webConnection.cookies().exists(SessionUtil.REMEMEBER_TOKEN_NAME)) { + webConnection.cookies().set(SessionUtil.REMEMEBER_TOKEN_NAME, "", 0, TimeUnit.SECONDS); + SessionDao.clearRememberToken(webConnection.session().getInt("user.id")); + } + + // Delete user login session + webConnection.session().delete("user.id"); + webConnection.session().delete("authenticated"); + webConnection.session().delete("minimailLabel"); + webConnection.session().delete("lastBrowsedPage"); + + } + + public static void checkCookie(WebConnection webConnection) { + if (!webConnection.cookies().exists(SessionUtil.REMEMEBER_TOKEN_NAME)) { + return; + } + + String token = webConnection.cookies().get(SessionUtil.REMEMEBER_TOKEN_NAME); + + if (token == null || token.isBlank()) { + return; + } + + int userId = SessionDao.getRememberToken(token); + + if (userId > 0) { + webConnection.session().set("authenticated", true); + webConnection.session().set("captcha.invalid", false); + webConnection.session().set("user.id", userId); + + if (webConnection.request().uri().equals("/home") || + webConnection.request().uri().equals("/index") || + webConnection.request().uri().equals("/")) { + webConnection.redirect("/me"); + } + } else { + webConnection.session().delete("user.id"); + webConnection.session().delete("authenticated"); + webConnection.cookies().set(SessionUtil.REMEMEBER_TOKEN_NAME, "", 0, TimeUnit.SECONDS); + } + } + +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/util/TagUtil.java b/Havana-Web/src/main/java/org/alexdev/http/util/TagUtil.java new file mode 100644 index 0000000..0f7b644 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/util/TagUtil.java @@ -0,0 +1,590 @@ +package org.alexdev.http.util; + +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +public class TagUtil { + public static String getRandomQuestion() { + var questions = getRandomQuestions(); + + String question = questions.get(ThreadLocalRandom.current().nextInt(0, questions.size())); + //question = question.toLowerCase(); + //question = question.substring(0, 1).toUpperCase() + question.substring(1); + + return question; + + } + public static List getRandomQuestions() { + var stringList = new String[] { + "Dog or Cat?", + "Netflix or YouTube?", + "Phone Call or Text?", + "Toast or Eggs?", + "Cardio or Weights?", + "Facebook or Twitter?", + "Ice Cream Cone or Snow Cone?", + "Mobile Games or Console Games?", + "Music or Podcasts?", + "iOS or Android?", + "Form or Function?", + "Pop or Indie?", + "Cake or Pie?", + "Swimming or Sunbathing?", + "High-tech or Low-tech?", + "Big Party or Small Gathering?", + "New Clothes or New Phone?", + "Rich Friend or Loyal Friend?", + "Football or Basketball?", + "Work Hard or Play Hard?", + "Nice Car or Nice Home Interior?", + "What’s worse: Laundry or Dishes?", + "Jogging or Hiking?", + "Bath or Shower?", + "Sneakers or Sandals?", + "Glasses or Contacts?", + "Hamburger or Taco?", + "Couch or Recliner?", + "Online Shopping or Shopping in a Store?", + "Receive: Email or Letter?", + "Passenger or Driver?", + "Tablet or Computer?", + "Intelligent or Funny?", + "Car or Truck?", + "Blue or Red?", + "Money or Free Time?", + "Amusement Park or Day at the Beach?", + "At a movie: Candy or Popcorn?", + "Pen or Pencil?", + "Toilet paper: Over or Under?", + "Cups in the cupboard: Right Side Up or Up Side Down?", + "Pancake or Waffle?", + "Coke or Pepsi?", + "Coffee Cup or Thermos?", + "Blinds or Curtain?", + "Train or Plane?", + "Phone or Phablet?", + "Iced Coffee or Hot Coffee?", + "Meat or Vegetables?", + "International Vacation or a New TV?", + "Save or Spend?", + "Honesty or Other’s Feelings?", + "Coffee or Tea?", + "TV or Book?", + "Movie at Home or Movie at the Theater?", + "Ocean or Mountains?", + "Horror Movie or Comedy Movie?", + "City or Countryside?", + "Winter or Summer?", + "Mac or PC?", + "Console Gaming or PC Gaming?", + "Soup or Sandwich?", + "Card Game or Board Game?", + "Classical Art or Modern Art?", + "Beer or Wine?", + "Dine In or Delivery?", + "Sweater or Hoodie?", + "Comic Book or Comic Strips?", + "Motorcycle or Bicycle?", + "Book or eBook?", + "Ninjas or Pirates?", + "TV Shows or Movies?", + "Fish or steak?", + "Eggs or oatmeal?", + "Coffee or tea?", + "Coke or Pepsi?", + "Beer or mixed drinks?", + "Juice or water?", + "White or wheat bread?", + "Cake or donuts?", + "Vanilla or chocolate?", + "Ice cream or sherbet?", + "Pork or chicken?", + "Bacon or sausage?", + "Scrambled eggs or over easy?", + "Over easy or poached eggs?", + "Cream and sugar or black coffee?", + "Well done or rare?", + "Corn or peas?", + "Salad or squash?", + "Green beans or broccoli?", + "Black beans or kidney beans?", + "Pinto or Lima beans?", + "Frozen veggies or canned?", + "Pancakes or waffles?", + "Pastries or confectionaries?", + "Burgers or seafood?", + "Food truck or diner?", + "Ginger ale or Sprite?", + "Orange soda or Grape?", + "Trail mix or candy bar?", + "Payday or 5th avenue?", + "Reese’s peanut butter cup or Hershey’s bar?", + "Almond Joy or Snickers?", + "Three Musketeers or Peppermint Patty?", + "O’Henry or Baby Ruth?", + "Apples or bananas?", + "Oranges or peaches?", + "Watermelon or plums?", + "Cantaloupe or grapefruit?", + "Cake or pie?", + "Pastries or cookies?", + "Hash browns or home fries?", + "Jello or pudding?", + "Cherry or raspberry?", + "Grape or orange?", + "Lime or blueberry?", + "Slim Jim or Jerky?", + "Cupcake or Dingdong?", + "Swiss cake or Hoho?", + "Gum or Lifesavers?", + "Tic-tac or Altoids?", + "Tootsie rolls or Skittles?", + "Licorice or fruit roll ups?", + "Popcorn or peanuts?", + "Hot pretzels or nachos?", + "Grilled or pan fried?", + "Deep fried or baked?", + "Apple or cherry pie?", + "Sugar or chocolate chip cookies?", + "Pumpkin or blueberry?", + "Pie or cobbler?", + "Breaded or plain?", + "Iced or hot coffee?", + "Hot or iced tea?", + "Sweetened tea or unsweetened?", + "Chinese or Italian?", + "Indian or Thai?", + "American or Mexican?", + "Sweet or sour?", + "Eat in or dine out?", + "Cook at home or take out?", + "Cheeseburger or calamari?", + "Hot dog or taco?", + "Stew or chili?", + "Sweet potato or French fries?", + "Baked potato or onion rings?", + "Ketchup or mustard?", + "Mayo or salad dressing?", + "Sandwich or soup?", + "Ribs or wings?", + "Family run or chain restaurant?", + "Cook out in backyard or catered?", + "Wine or beer?", + "Jack Daniels or Jim Beam?", + "Irish coffee or plain coffee?", + "Orange juice or grapefruit juice?", + "Re-fried beans or rice?", + "Tacos or chicken parmigiana?", + "Pizza or subs?", + "Peanuts or almonds?", + "Cashews or hazelnut?", + "Walnuts or sunflower seeds?", + "Garlic or onion?", + "Bagels or English muffins", + "Poppy seed or onion rolls?", + "Cinnamon or blueberry bagels?", + "Everything or sesame seed bagels?", + "Thousand Island or Ranch?", + "Catalina or vinaigrette?", + "Onion dip or bacon horseradish dip?", + "Cheese fries or chili fries?", + "French fries or onion rings?", + "Cheese and crackers or pretzels?", + "Chips with dip or vegetables and dip?", + "Fruit or vegetables?", + "Dinner rolls or croissant rolls?", + "Biscuits or bread?", + "Whole wheat or rye?", + "Whole grain or white?", + "Corn muffin or blueberry?", + "Pastrami or bologna?", + "Italian sub or ham and cheese?", + "Turkey and cheese or roast beef sub?", + "Sub roll or ciabatta roll?", + "Sour cream and onion chips or barbecue?", + "Cheddar and sour cream or salt and vinegar?", + "Corn chips or Doritos?", + "Action movies or dramas?", + "Comedy or thrillers?", + "Romantic or documentaries?", + "Reality or fiction?", + "Family or adult movies?", + "Netflix or Hulu?", + "Cable or satellite?", + "Watch live or recorded so you don’t have to watch commercials?", + "Television or book?", + "Detective novels or super heroes?", + "Romance novels or spy novels?", + "Horror stories or mysteries?", + "Rock or country?", + "Pop or reggae?", + "Choose classical or rap?", + "Smooth jazz or techno?", + "Standards or classic country like Johnny Cash?", + "Bound book or Ebook?", + "Newspaper or online news blog?", + "Play or musical?", + "Dancing or cooking classes?", + "Concert or play?", + "Massage or facial?", + "Bowling or theater?", + "Paint ball or arcade?", + "Crocheting or knitting?", + "Cards or board games?", + "Carnival or circus?", + "Roller coasters or ferris wheel?", + "Woodworking or leather working?", + "Darts or pool?", + "Gardening or walking?", + "Jeans and tee or a suit?", + "Dress or pants?", + "Formal or casual?", + "Sneakers or dress shoes?", + "Sandals or high heels?", + "Make up or none?", + "Black and white décor?", + "Elegant or casual interior?", + "Eclectic or organized interior?", + "Leather or fabric?", + "Sneakers or sandals?", + "Flip flops or water shoes?", + "Paintings or photos?", + "Black and white or color?", + "Drapes or blinds?", + "Plants or collectibles?", + "Chandelier or lamps?", + "Paper or paneling?", + "Paint or paper?", + "Rugs or hardwood floors?", + "Modern or rustic?", + "Retro or antique?", + "Ranch style or two-story home?", + "Farmhouse kitchen or galley style?", + "Car or truck?", + "European or lake front style home?", + "Riding mower or push?", + "Apartment or home?", + "Work boots or cowboy boots?", + "Country or city?", + "Rural or suburban?", + "Farm or just an acre or two?", + "Neutral colors or bold?", + "Stoneware or China?", + "Colonial or cottage style home?", + "Candles or wax melts?", + "Fireplace or furnace?", + "Wicker or wood?", + "Metal or wood?", + "Wood or gas for a cook stove?", + "Butcher block or granite counter-tops?", + "Stainless steel or Teflon cookware?", + "Skylights or mirrored wall?", + "Spiral or straight stairs?", + "Shag or tight pile?", + "Leather or fabric?", + "Wood or metal and glasses?", + "Hardwood chairs or padded?", + "Houseboat or yacht?", + "Landscaped yard or just lawn?", + "Game room or sewing room?", + "Farmhouse or shingle style home?", + "Stainless steel or porcelain sink?", + "Wood cabinets or metal in kitchen?", + "Log cabin or contemporary style home?", + "Sun porch or deck?", + "Manicure or make over?", + "Football or baseball?", + "Soccer or hockey?", + "Golf or basketball?", + "Racing or polo?", + "Soccer or football?", + "Field hockey or ice hockey?", + "Polo or horse racing?", + "Nascar or drag racing?", + "College or pro?", + "Touch or tackle football when you play?", + "Short stop or third base?", + "First base or outfielder?", + "Catcher or pitcher?", + "Winger or defenseman?", + "Goalie or defenseman?", + "Hunting or fishing?", + "Deer or bear?", + "Elk or moose?", + "Bass or tuna?", + "Ocean or lake?", + "Lake or river?", + "Skiing or surfing?", + "Xbox or PS?", + "Multiplayer or single player?", + "Sports or shooter?", + "Strategy or puzzle?", + "Pacman or Tetris?", + "Foosball or Ping-Pong?", + "Computer or game consoles?", + "Fantasy leagues or playing with your buds?", + "Live action role playing or online gaming?", + "Wrestling or mix martial arts?", + "Bowling or tennis?", + "Poker or chess?", + "Volley ball or skateboarding?", + "Cardio or weightlifting?", + "Go to gym or home exercise?", + "Boats or 4 wheelers?", + "Walking or jogging?", + "Weightlifting or pilates?", + "Off road or race track?", + "Skiing or snowboarding?", + "Sweating to the oldies or playing handball?", + "Working out three times a week or every day?", + "Eating whatever you want or eating healthy to stay in shape?", + "Workout alone or with a partner?", + "Swimming or reading?", + "Paintball or motocross?", + "BMX racing or hang-gliding?", + "Skateboarding or swimming?", + "Triathlon or marathon running?", + "Personal trainer or work out alone?", + "Nutritionist or make your own meal plan?", + "Skeet shoot or archery?", + "TRAVEL", + "Domestic or international?", + "Drive or fly?", + "Plane or boat?", + "Amusement park or historical sites?", + "Train or bus?", + "Hunting trip or ski resort?", + "Tropical or artic?", + "Hot tub or hot springs?", + "Spring or fall?", + "Winter or summer?", + "Auctions or closeout sales?", + "Performing arts or science?", + "Grand Canyon or Jelly Stone?", + "Marlin fishing or wild boar hunting?", + "Ghost tour or historical tour?", + "Art festival or music festival?", + "Renaissance fair or craft fair?", + "Flea market or mall?", + "Carnival or theme park?", + "Zoo or aquarium?", + "Thunderstorm or snow storm?", + "State parks or off the beaten path?", + "Interstates or back roads?", + "Truck or motorcycle?", + "Beach or mountain climbing?", + "Architectural sites or shopping?", + "Hiking or monster truck rally?", + "Spa or gym?", + "Nature or indoors?", + "Tent or RV?", + "Ghost hunting or artifact hunting", + "A cruise or romantic retreat package?", + "Ireland or Hong Kong?", + "Anthropology dig or safari?", + "Jamaica or Rio?", + "Africa or Asia?", + "Mexico or Monte Carlo?", + "New York City or Vegas?", + "LA or Atlanta?", + "Phoenix or St. Louis?", + "Portland or Seattle?", + "Boston or Miami?", + "Time share or motel?", + "Rental home or bed and breakfast?", + "Antiquing or Flea markets?", + "Museums or observatory?", + "Group travel or alone?", + "Fireman or policeman?", + "Doctor or nurse?", + "Military or civilian?", + "Boss or worker?", + "Lawyer or carpenter?", + "Plumber or stock market?", + "Taxi driver or bus driver?", + "Railroad engineer or mechanical Engineer?", + "Wood working or automotive mechanic?", + "Supervisor or hourly employee?", + "Self-employed or a company man?", + "Office work or outside work?", + "Work from home or commute to work?", + "Pilot or ship captain?", + "Electrician or engineer?", + "Author or editor?", + "A job you love or one that pays you more money?", + "Fisherman or lumberjack?", + "Farmer or factory worker?", + "Gas station attendant or sales clerk?", + "Government work or private sector?", + "Work on a team or to work alone?", + "Landscaper or welder?", + "Fashion designer or interior designer?", + "Meetings all day or producing goods?", + "Working with your hands or with a computer?", + "Working in a store with the public or working in research?", + "A long commute or a short commute to work?", + "Party planner or printer?", + "Anthropologist or astronomer?", + "Suit and tie or jeans?", + "Coveralls or scrubs?", + "Drug representative or researcher?", + "Cook or waitress?", + "Janitor or IT tech?", + "Banker or stock trader?", + "Insurance actuary or detective?", + "Street sweeper or sanitation supervisor?", + "Telemarketer or appointment setter?", + "Secretary or office manager?", + "Physical therapist or psychologist?", + "Rock star or race car driver?", + "Country singer or professional athlete?", + "Wrestler or football player?", + "Professional bowler or poker player?", + "Professional league coach or college coach?", + "Professional cheerleader or model?", + "Actor or model?", + "Actress or talk show host?", + "News anchor or meteorologist?", + "Construction worker or artist?", + "Newspaper editor or reporter?", + "Journalist or photographer?", + "Dentist or podiatrist?", + "Medical examiner or emergency doctor?", + "Teacher or administrator?", + "Auctioneer or sports caster?", + "Stock broker or day trader?", + "Author or advertising agent?", + "Truck mechanic or long haul driver?", + "Salesman or lawyer?", + "Artist or curator?", + "Shower or bath?", + "Dog or cat?", + "Tattoo or piercings?", + "Smoke or chew?", + "Sleep in PJs or nude?", + "Silk or flannel sheets?", + "Egyptian cotton or silk?", + "Regular bed or waterbed?", + "Savings or shopping?", + "Night owl or early riser?", + "A slacker or an overachiever?", + "3 meals a day or 5 small meals?", + "Silver or gold?", + "Pen or pencil?", + "Green or blue eyes?", + "Contacts or glasses?", + "Adventurous or cautious?", + "Call or text?", + "Email or snail mail?", + "Long or short hair?", + "Freckles or dimples?", + "Shy or outgoing?", + "Automated answering service or speak to a live person?", + "Frozen pizza or Dominoes?", + "Pizza hut or Little Caesars?", + "Sweater or hoodie?", + "When hanging toilet paper, over or under?", + "Blue or red?", + "Green or white?", + "Pants or shorts?", + "Brains or beauty?", + "Date someone older or younger than yourself?", + "Beads or pearls?", + "Mac or PC?", + "Take time to style your hair or wear a cap?", + "Dye your hair or have natural color?", + "Natural or breast implants?", + "Give roses or daisies?", + "Receive roses or daisies?", + "For a snack something salty or sweet?", + "Facebook or twitter?", + "Charmin or Angel Soft?", + "Scrubbing bubbles or Lysol?", + "Flower or vegetable garden?", + "High tech or low tech?", + "Security system or a dog?", + "A large crowd or a small party?", + "Telepathy or teleporting?", + "Hero or villain?", + "Dominate or subservient?", + "Money or fame?", + "Encounter ghost or demons?", + "Vampires or angels?", + "A witch or sorcerer?", + "Pirates or a motorcycle gang?", + "Quick temper or to have control?", + "Kisses or hugs?", + "Sugar or spice?", + "After shave or cologne?", + "Perfume or body spray?", + "Healthy or comfort food?", + "Necklace or Bracelet?", + "Cubed or crushed ice?", + "Swimming or sunbathing?", + "Sofa or recliner?", + "Candle light or lamp light?", + "Online or in store shopping?", + "Good Will or Macy’s?", + "Pudding or custard?", + "Google or Bing?", + "Roommate a neat freak or a messy person?", + "Movies at home or in theaters?", + "Your nails, long or short?", + "Home garden or go to farmers market?", + "Your day – crazy or sane?", + "Live in the past or present?", + "Paper or plastic bags?", + "Open spaces or small closed in areas?", + "For dinning, paper plates or china?", + "Watch sports or play?", + "Kids or pets?", + "Spend time in living room or bedroom?", + "Cremation or burial?", + "Life support to keep you alive for years or not?", + "A maid or a cook?", + "Live in a cold or hot area?", + "For home pets, hamster or rabbit?", + "Pet fish or a lizard?", + "Christmas or Halloween?", + "Thanksgiving or Easter?", + "Memorial Day or St. Patrick’s Day?", + "New Year’s or Valentines?", + "American made or imports?", + "Slippers or barefoot?", + "Public library or bookstore?", + "Dunkin Donuts or Tim Horton?", + "Starbucks or Dunkin Donuts?", + "Whole bean or ground?", + "Loose leaf or teabag?", + "Glazed donut or jelly?", + "Cinnamon bun or danish?", + "Pictionary or charades?", + "A rainy Sunday in bed or the mall?", + "Prepaid or contract cell plan?", + "College or trade school?", + "Public education or home school?", + "Straw hat or baseball cap?", + "Cowboy hat or knit cap?", + "Sunglasses or sun visor?", + "Elegant or casual dinner?", + "E-harmony or Match?", + "Plenty of Fish or Zoosk?", + "Many causal friends or just a few close friends?", + "Surprise party or theme party?", + "Costume party or pool party?", + "Luau or pig roast?", + "Cell phone or landline?", + "Home owner or renter?", + "Bubble bath or just a hot soak?", + "Eye sight or hearing?", + "Taste or smell?", + "Be creative or genius?", + "Lounge wear or jeans?", + "Swimming pool or lake?", + "Strategy games or Bingo?" + }; + + return Arrays.asList(stringList); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/util/XSSUtil.java b/Havana-Web/src/main/java/org/alexdev/http/util/XSSUtil.java new file mode 100644 index 0000000..1fdd87b --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/util/XSSUtil.java @@ -0,0 +1,60 @@ +package org.alexdev.http.util; + +import org.alexdev.duckhttpd.server.connection.WebConnection; + +import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; + +public class XSSUtil { + public static final String XSSKey = "xssKey"; + public static final String XSSSeed = "xssSeed"; + public static final String XSSRequested = "xssRequested"; + + public static boolean verifyKey(WebConnection connection, String verifyRouteRequest) { + if (!connection.session().contains(XSSKey) || + !connection.session().contains(XSSSeed) || + !connection.session().contains(XSSRequested)) { + clear(connection); + return false; + } + + var expectedRouteRequest = connection.session().getString(XSSRequested); + + if (!verifyRouteRequest.equalsIgnoreCase(expectedRouteRequest)) { + clear(connection); + return false; + } + + var random = new Random(connection.session().getInt(XSSSeed)); + var key = random.nextInt(); + + if (key != connection.session().getInt(XSSKey)) { + clear(connection); + return false; + } + + clear(connection); + return true; + } + + public static void createKey(WebConnection connection, String expectedRouteRequest) { + clear(connection); + + var seed = ThreadLocalRandom.current().nextInt(); + var key = new Random(seed).nextInt(); + + connection.session().set(XSSKey, key); + connection.session().set(XSSSeed, seed); + connection.session().set(XSSRequested, expectedRouteRequest); + } + + public static void clear(WebConnection connection) { + if (connection.session().contains(XSSKey) || + connection.session().contains(XSSSeed) || + connection.session().contains(XSSRequested)) { + connection.session().delete(XSSSeed); + connection.session().delete(XSSKey); + connection.session().delete(XSSRequested); + } + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/util/config/WebLoggingConfiguration.java b/Havana-Web/src/main/java/org/alexdev/http/util/config/WebLoggingConfiguration.java new file mode 100644 index 0000000..fb25227 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/util/config/WebLoggingConfiguration.java @@ -0,0 +1,64 @@ +package org.alexdev.http.util.config; + +import org.apache.log4j.PropertyConfigurator; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.PrintWriter; + +public class WebLoggingConfiguration { + /** + * Create the configuration files for this application, with the default values. Will throw an + * exception if it could not create such files. + * + * @throws FileNotFoundException the exception if an error happens + */ + public static void checkLoggingConfig() throws FileNotFoundException { + String output = "log4j.rootLogger=INFO, stdout, SERVER_LOG\n" + + "log4j.appender.stdout.threshold=info\n" + + "log4j.appender.stdout=org.apache.log4j.ConsoleAppender\n" + + "log4j.appender.stdout.Target=System.out\n" + + "log4j.appender.stdout.layout=org.apache.log4j.PatternLayout\n" + + "log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd'T'HH:mm:ss.SSS} %-5p [%c] - %m%n\n" + + "\n" + + "# Create new logger information for error\n" + + "log4j.logger.ErrorLogger=ERROR, error, ERROR_FILE\n" + + "log4j.additivity.ErrorLogger=false\n" + + "\n" + + "# Set settings for the error logger\n" + + "log4j.appender.error=org.apache.log4j.ConsoleAppender\n" + + "log4j.appender.error.Target=System.err\n" + + "log4j.appender.error.layout=org.apache.log4j.PatternLayout\n" + + "log4j.appender.error.layout.ConversionPattern=%d{yyyy-MM-dd'T'HH:mm:ss.SSS} %-5p [%c] - %m%n\n" + + "\n" + + "# Define the file appender for errors\n" + + "log4j.appender.ERROR_FILE=org.apache.log4j.FileAppender\n" + + "log4j.appender.ERROR_FILE.File=error.web.log\n" + + "log4j.appender.ERROR_FILE.ImmediateFlush=true\n" + + "log4j.appender.ERROR_FILE.Threshold=debug\n" + + "log4j.appender.ERROR_FILE.Append=true\n" + + "log4j.appender.ERROR_FILE.layout=org.apache.log4j.PatternLayout\n" + + "log4j.appender.ERROR_FILE.layout.conversionPattern=%d{yyyy-MM-dd'T'HH:mm:ss.SSS} - [%c] - %m%n\n" + + "\n" + + "# Define the file appender for server output\n" + + "log4j.appender.SERVER_LOG=org.apache.log4j.FileAppender\n" + + "log4j.appender.SERVER_LOG.File=server.web.log\n" + + "log4j.appender.SERVER_LOG.ImmediateFlush=true\n" + + "log4j.appender.SERVER_LOG.Threshold=debug\n" + + "log4j.appender.SERVER_LOG.Append=true\n" + + "log4j.appender.SERVER_LOG.layout=org.apache.log4j.PatternLayout\n" + + "log4j.appender.SERVER_LOG.layout.conversionPattern=%d{yyyy-MM-dd'T'HH:mm:ss.SSS} - [%c] - %m%n\n"; + + File loggingConfig = new File("log4j.web.properties"); + + if (!loggingConfig.exists()) { + PrintWriter writer = new PrintWriter(loggingConfig.getAbsoluteFile()); + writer.write(output); + writer.flush(); + writer.close(); + } + + //Change the path where the logger property should be read from + PropertyConfigurator.configure(loggingConfig.getAbsolutePath()); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/util/config/WebServerConfigWriter.java b/Havana-Web/src/main/java/org/alexdev/http/util/config/WebServerConfigWriter.java new file mode 100644 index 0000000..05ad127 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/util/config/WebServerConfigWriter.java @@ -0,0 +1,59 @@ +package org.alexdev.http.util.config; + +import org.alexdev.havana.util.config.writer.ConfigWriter; + +import java.io.PrintWriter; +import java.util.HashMap; +import java.util.Map; + +public class WebServerConfigWriter implements ConfigWriter { + @Override + public Map setConfigurationDefaults() { + Map config = new HashMap<>(); + // DEFAULT settings + config.put("site.directory", "tools/www"); + + config.put("bind.ip", "127.0.0.1"); + config.put("bind.port", "80"); + + config.put("rcon.ip", "127.0.0.1"); + config.put("rcon.port", "12309"); + + config.put("mysql.hostname", "127.0.0.1"); + config.put("mysql.port", "3306"); + config.put("mysql.username", "havana"); + config.put("mysql.password", "verysecret"); + config.put("mysql.database", "havana"); + + config.put("template.directory", "tools/www-tpl"); + config.put("template.name", "default"); + return config; + } + + @Override + public void setConfigurationData(Map config, PrintWriter writer) { + writer.println("[Site]"); + writer.println("site.directory=" + config.get("site.directory")); + writer.println(""); + writer.println("[Global]"); + writer.println("bind.ip=" + config.get("bind.ip")); + writer.println("bind.port=" + config.get("bind.port")); + writer.println(""); + writer.println("[Rcon]"); + writer.println("rcon.ip=" + config.get("rcon.ip")); + writer.println("rcon.port=" + config.get("rcon.port")); + writer.println(""); + writer.println("[Database]"); + writer.println("mysql.hostname=" + config.get("mysql.hostname")); + writer.println("mysql.port=" + config.get("mysql.port")); + writer.println("mysql.username=" + config.get("mysql.username")); + writer.println("mysql.password=" + config.get("mysql.password")); + writer.println("mysql.database=" + config.get("mysql.database")); + writer.println(""); + writer.println("[Template]"); + writer.println("template.directory=" + config.get("template.directory")); + writer.println("template.name=" + config.get("template.name")); + writer.flush(); + writer.close(); + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/util/config/WebSettingsConfigWriter.java b/Havana-Web/src/main/java/org/alexdev/http/util/config/WebSettingsConfigWriter.java new file mode 100644 index 0000000..c638816 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/util/config/WebSettingsConfigWriter.java @@ -0,0 +1,94 @@ +package org.alexdev.http.util.config; + +import org.alexdev.havana.util.config.writer.ConfigWriter; +import org.alexdev.havana.util.config.writer.GameConfigWriter; + +import java.io.PrintWriter; +import java.util.HashMap; +import java.util.Map; + +public class WebSettingsConfigWriter implements ConfigWriter { + @Override + public Map setConfigurationDefaults() { + Map config = new HashMap<>(); + config.put("site.name", "Habbo"); + config.put("site.path", "http://localhost"); + config.put("static.content.path", "http://localhost"); + config.put("site.imaging.path", "http://localhost"); + + config.put("hotel.check.online", "true"); + + config.put("loader.game.ip", "127.0.0.1"); + config.put("loader.game.port", "12321"); + + config.put("loader.mus.ip", "127.0.0.1"); + config.put("loader.mus.port", "12322"); + + config.put("loader.dcr", "http://localhost/dcr/v31/habbo.dcr?"); + config.put("loader.external.variables", "http://localhost/dcr/v31/gamedata/external_variables.txt?"); + config.put("loader.external.texts", "http://localhost/dcr/v31/gamedata/external_texts.txt?"); + + config.put("registration.disabled", "false"); + config.put("collectables.page", "51"); + + config.put("group.purchase.cost", "20"); + config.put("group.default.badge", "b0503Xs09114s05013s05015"); + + config.put("hot.groups.community.limit", "8"); + config.put("hot.groups.limit", "10"); + + config.put("discussions.per.page", "10"); + config.put("discussions.replies.per.page", "10"); + + config.put("alerts.gift.message", "A new gift has arrived. This time you received a %item_name%."); + config.put("homepage.template.file", "index"); + + config.put("free.month.hc.registration", "true"); + + config.put("max.tags.users", "8"); + config.put("max.tags.groups", "20"); + + /* + + prop.put("mail.smtp.host", GameConfiguration.getInstance().getString("email.smtp.host")); + prop.put("mail.smtp.port", GameConfiguration.getInstance().getString("email.smtp.port")); + prop.put("mail.smtp.connectiontimeout", "5000"); + prop.put("mail.smtp.timeout", "5000"); + + Session session = Session.getInstance(prop, new Authenticator() { + @Override + protected PasswordAuthentication getPasswordAuthentication() { + String username = GameConfiguration.getInstance().getString("email.smtp.login.username"); + String password = GameConfiguration.getInstance().getString("email.smtp.login.password"); + return new PasswordAuthentication(username, password); + } + }); + Message message = new MimeMessage(session); + message.setFrom(new InternetAddress(GameConfiguration.getInstance().getString("email.smtp.from.email"), GameConfiguration.getInstance().getString("email.smtp.from.name"))); + + */ + + config.put("trade.email.verification", "false"); + config.put("email.smtp.enable", "false"); + config.put("email.static.content.path", "http://localhost"); + + config.put("email.smtp.host", ""); + config.put("email.smtp.port", "465"); + + config.put("email.smtp.login.username", ""); + config.put("email.smtp.login.password", ""); + + config.put("email.smtp.from.email", ""); + config.put("email.smtp.from.name", ""); + + config.put("maintenance", "false"); + + config.putAll(new GameConfigWriter().setConfigurationDefaults()); + return config; + } + + @Override + public void setConfigurationData(Map config, PrintWriter writer) { + + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/http/util/piechart/PieChart.java b/Havana-Web/src/main/java/org/alexdev/http/util/piechart/PieChart.java new file mode 100644 index 0000000..8a71bdb --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/util/piechart/PieChart.java @@ -0,0 +1,76 @@ +package org.alexdev.http.util.piechart; + +import java.awt.*; +import java.awt.image.BufferedImage; +import java.util.Comparator; +import java.util.List; + +public class PieChart { + + private BufferedImage image; + private Graphics2D g2d; + private List slices; + + public PieChart(BufferedImage image, List slices) { + this.image = image; + this.g2d = (Graphics2D)image.getGraphics(); + this.slices = slices; + + + this.slices.sort(Comparator.comparingDouble(Slice::getValue)); + + RenderingHints rh = new RenderingHints( + RenderingHints.KEY_TEXT_ANTIALIASING, + RenderingHints.VALUE_TEXT_ANTIALIAS_ON); + g2d.setRenderingHints(rh); + + drawPie(this.g2d, new Rectangle(image.getWidth() / 2, image.getHeight())); + drawLegend(); + + this.g2d.dispose(); + } + + private void drawPie(Graphics2D g, Rectangle area) { + double total = 0.0D; + + for (Slice slice : this.slices) { + total += slice.getValue(); + } + + double curValue = 0; + int startAngle; + + for (Slice slice : this.slices) { + startAngle = (int) (curValue * 361 / total); + int arcAngle = (int) (slice.getValue() * 361 / total); + + g.setColor(slice.getColor()); + g.fillArc((int)area.getX(), (int)area.getY(), (int)area.getWidth(), (int)area.getHeight(), startAngle, arcAngle); + + curValue += slice.getValue(); + } + } + + private void drawLegend() { + int heightBetweenText = 20; + + for (Slice slice : slices) { + FontMetrics fm = g2d.getFontMetrics(); + + int x = (this.image.getWidth() / 2) + 10; + int y = fm.getHeight() + heightBetweenText; + + g2d.setPaint(Color.black); + g2d.setFont(new Font("Arial", Font.PLAIN, 15)); + g2d.drawString(slice.getLabel(), x + 10, y + 6); + + for (int sqX = x; sqX < x + 5; sqX++) { + for (int sqY = y; sqY < y + 5; sqY++) { + image.setRGB(sqX, sqY, slice.getColor().getRGB()); + } + } + + heightBetweenText += 20; + } + } +} \ No newline at end of file diff --git a/Havana-Web/src/main/java/org/alexdev/http/util/piechart/Slice.java b/Havana-Web/src/main/java/org/alexdev/http/util/piechart/Slice.java new file mode 100644 index 0000000..ab19e8d --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/util/piechart/Slice.java @@ -0,0 +1,33 @@ +package org.alexdev.http.util.piechart; + +import java.awt.*; + +public class Slice { + + private String label; + private double value; + private Color color; + + public Slice(String label, double value, Color color) { + this.label = label; + this.value = value; + this.color = color; + } + + public String getLabel() { + return label; + } + + public double getValue() { + return value; + } + + public Color getColor() { + return color; + } +} + + + + + diff --git a/Havana-Web/src/main/java/org/alexdev/http/util/rcon/RconTask.java b/Havana-Web/src/main/java/org/alexdev/http/util/rcon/RconTask.java new file mode 100644 index 0000000..80f5116 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/http/util/rcon/RconTask.java @@ -0,0 +1,57 @@ +package org.alexdev.http.util.rcon; + +import org.alexdev.havana.server.rcon.messages.RconHeader; +import org.alexdev.havana.util.StringUtil; +import org.alexdev.havana.util.config.ServerConfiguration; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.net.Socket; +import java.util.Map; + +public class RconTask implements Runnable { + private final RconHeader header; + private final Map parameters; + + public RconTask(RconHeader header, Map parameters) { + this.header = header; + this.parameters = parameters; + } + + @Override + public void run() { + try (Socket socket = new Socket(ServerConfiguration.getString("rcon.ip"), ServerConfiguration.getInteger("rcon.port"))) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + DataOutputStream daos = new DataOutputStream(baos); + + daos.writeInt(header.getRawHeader().length()); + daos.write(header.getRawHeader().getBytes(StringUtil.getCharset())); + daos.writeInt(parameters.size()); + + for (var entry : parameters.entrySet()) { + daos.writeInt(entry.getKey().length()); + daos.write(entry.getKey().getBytes(StringUtil.getCharset())); + + daos.writeInt(entry.getValue().toString().length()); + daos.write(entry.getValue().toString().getBytes(StringUtil.getCharset())); + } + + try (DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream())) { + byte[] message = baos.toByteArray(); + + dataOutputStream.writeInt(message.length); + dataOutputStream.write(message); + dataOutputStream.flush(); + + baos.close(); + daos.close(); + socket.close(); + } catch (IOException ignored) { + + } + } catch (IOException ignored) { + + } + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/photorenderer/PhotoRenderer.java b/Havana-Web/src/main/java/org/alexdev/photorenderer/PhotoRenderer.java new file mode 100644 index 0000000..e16ebe1 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/photorenderer/PhotoRenderer.java @@ -0,0 +1,161 @@ +package org.alexdev.photorenderer; + +import org.alexdev.photorenderer.utils.BorderEffect; +import org.alexdev.photorenderer.utils.DataUtils; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.awt.image.DataBuffer; +import java.awt.image.IndexColorModel; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.Collections; +import java.util.stream.Collectors; + +public class PhotoRenderer { + private Color[] paletteData; + private RenderOption option; + + public PhotoRenderer(Color[] paletteData, RenderOption option) { + this.paletteData = paletteData; + this.option = option; + } + + public BufferedImage createImage(byte[] photoData) throws Exception { + int CAST_PROPERTIES_OFFSET = 28; + + var bais = new ByteArrayInputStream(photoData); + var bigEndianStream = new DataInputStream(bais); + bigEndianStream.skip(CAST_PROPERTIES_OFFSET); + + int totalWidth = bigEndianStream.readShort() & 0x7FFF; + + int top = bigEndianStream.readShort(); + int left = bigEndianStream.readShort(); + int bottom = bigEndianStream.readShort(); + int right = bigEndianStream.readShort(); + + Rectangle rectangle = new Rectangle(left, top, right - left, bottom - top); + + bigEndianStream.read(); + bigEndianStream.skip(7); + bigEndianStream.readShort(); + bigEndianStream.readShort(); + bigEndianStream.read(); + + int bitDepth = DataUtils.readLittleEndianByte(bigEndianStream); + + if (bitDepth != 8) + throw new Exception("illegal"); + + int palette = bigEndianStream.readInt() - 1; //Make sure that this one equals -3 = Grayscale + + if (palette != -3) + throw new Exception("illegal"); + + bigEndianStream.readInt(); // No idea! Lmao + bigEndianStream.skip(4); // Reversed, should equal BITD + + int length = DataUtils.readLittleEndianInt(bigEndianStream); + int position = 0; + + /*var bytes = new byte[bais.available()]; + bais.read(bytes); + + Files.write(Path.of("habbo_photo.txt"), bytes);*/ + + var data = new int[totalWidth * rectangle.height]; + + while (bigEndianStream.available() > 0) { + int marker = bigEndianStream.read(); + + if (marker >= 128) { + int fill = bigEndianStream.read(); + + for (int i = 0; i < 257 - marker; i++) { + data[position] = fill; + position++; + } + + } else { + int[] buffer = new int[marker + 1]; + + for (int i = 0; i < buffer.length; i++) { + data[position] = bigEndianStream.read(); + position++; + } + } + } + + var image = new BufferedImage(rectangle.width, rectangle.height, BufferedImage.TYPE_INT_RGB); + + for (int y = 0; y < rectangle.height; y++) { + int[] row = Arrays.copyOfRange(data, y * totalWidth, (y * totalWidth) + totalWidth); + + if (row.length > 0) { + for (int x = 0; x < rectangle.width; x++) { + var rgb = this.paletteData[row[x]]; + + int r = rgb.getRed(); + int g = rgb.getGreen(); + int b = rgb.getBlue(); + + Color color = new Color(r, g, b); + image.setRGB(x, y, color.getRGB()); + } + } + } + + bigEndianStream.close(); + + if (option == RenderOption.SEPIA) { + int[] palettes = { + 0xffb85e2f, + 0xffc06533, + 0xfff08b46, + 0xff681f10, + 0xff88381c, + 0xffc86b36, + 0xffffd169, + 0xffe07e3f, + 0xffffb159, + 0xffffde6f, + 0xff702513, + 0xffffea75, + 0xffffd269 + }; + + IndexColorModel colorModel = new IndexColorModel(8, // bits per pixel + palettes.length, // size of color component array + palettes, // color map + 0, // offset in the map + false, // has alpha + 0, // the pixel value that should be transparent + DataBuffer.TYPE_BYTE); + + BufferedImage img = new BufferedImage( + image.getWidth(), image.getHeight(), // match source + BufferedImage.TYPE_BYTE_BINARY, // required to work + colorModel); // TYPE_BYTE_BINARY color model (i.e. palette) + + Graphics2D g2 = img.createGraphics(); + g2.drawImage(image, 0, 0, null); + g2.dispose(); + + // Sneaky stuff to re-add back black border, else just use "return img;" here + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ImageIO.write(img, "PNG", bos); + byte[] imageBytes = bos.toByteArray(); + + var borderEffect = new BorderEffect(1, Color.black); + return borderEffect.apply(ImageIO.read(new ByteArrayInputStream(imageBytes))); + } + + return image; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/photorenderer/RenderOption.java b/Havana-Web/src/main/java/org/alexdev/photorenderer/RenderOption.java new file mode 100644 index 0000000..db34cba --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/photorenderer/RenderOption.java @@ -0,0 +1,6 @@ +package org.alexdev.photorenderer; + +public enum RenderOption { + GREYSCALE, + SEPIA +} diff --git a/Havana-Web/src/main/java/org/alexdev/photorenderer/palettes/GreyscalePalette.java b/Havana-Web/src/main/java/org/alexdev/photorenderer/palettes/GreyscalePalette.java new file mode 100644 index 0000000..8f06b67 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/photorenderer/palettes/GreyscalePalette.java @@ -0,0 +1,266 @@ +package org.alexdev.photorenderer.palettes; + +import java.awt.*; + +public class GreyscalePalette { + public static Color[] getPalette() { + return new Color[] { + new Color( 255, 255, 255), + new Color( 254, 254, 254), + new Color( 255, 255, 255), + new Color( 253, 253, 253), + new Color( 252, 252, 252), + new Color( 251, 251, 251), + new Color( 250, 250, 250), + new Color( 249, 249, 249), + new Color( 248, 248, 248), + new Color( 247, 247, 247), + new Color( 246, 246, 246), + new Color( 245, 245, 245), + new Color( 244, 244, 244), + new Color( 243, 243, 243), + new Color( 255, 255, 255), + new Color( 242, 242, 242), + new Color( 241, 241, 241), + new Color( 240, 240, 240), + new Color( 239, 239, 239), + new Color( 238, 238, 238), + new Color( 237, 237, 237), + new Color( 236, 236, 236), + new Color( 235, 235, 235), + new Color( 234, 234, 234), + new Color( 233, 233, 233), + new Color( 232, 232, 232), + new Color( 255, 255, 255), + new Color( 231, 231, 231), + new Color( 230, 230, 230), + new Color( 229, 229, 229), + new Color( 228, 228, 228), + new Color( 227, 227, 227), + new Color( 223, 223, 223), + new Color( 222, 222, 222), + new Color( 255, 255, 255), + new Color( 221, 221, 221), + new Color( 220, 220, 220), + new Color( 219, 219, 219), + new Color( 218, 218, 218), + new Color( 217, 217, 217), + new Color( 216, 216, 216), + new Color( 215, 215, 215), + new Color( 214, 214, 214), + new Color( 213, 213, 213), + new Color( 212, 212, 212), + new Color( 211, 211, 211), + new Color( 255, 255, 255), + new Color( 210, 210, 210), + new Color( 209, 209, 209), + new Color( 208, 208, 208), + new Color( 207, 207, 207), + new Color( 206, 206, 206), + new Color( 205, 205, 205), + new Color( 204, 204, 204), + new Color( 203, 203, 203), + new Color( 202, 202, 202), + new Color( 201, 201, 201), + new Color( 200, 200, 200), + new Color( 255, 255, 255), + new Color( 199, 199, 199), + new Color( 198, 198, 198), + new Color( 197, 197, 197), + new Color( 196, 196, 196), + new Color( 195, 195, 195), + new Color( 255, 255, 255), + new Color( 255, 255, 255), + new Color( 255, 255, 255), + new Color( 255, 255, 255), + new Color( 255, 255, 255), + new Color( 255, 255, 255), + new Color( 255, 255, 255), + new Color( 255, 255, 255), + new Color( 255, 255, 255), + new Color( 255, 255, 255), + new Color( 255, 255, 255), + new Color( 255, 255, 255), + new Color( 255, 255, 255), + new Color( 255, 255, 255), + new Color( 255, 255, 255), + new Color( 255, 255, 255), + new Color( 255, 255, 255), + new Color( 255, 255, 255), + new Color( 255, 255, 255), + new Color( 255, 255, 255), + new Color( 255, 255, 255), + new Color( 255, 255, 255), + new Color( 255, 255, 255), + new Color( 255, 255, 255), + new Color( 255, 255, 255), + new Color( 255, 255, 255), + new Color( 255, 255, 255), + new Color( 255, 255, 255), + new Color( 255, 255, 255), + new Color( 255, 255, 255), + new Color( 255, 255, 255), + new Color( 255, 255, 255), + new Color( 191, 191, 191), + new Color( 190, 190, 190), + new Color( 255, 255, 255), + new Color( 189, 189, 189), + new Color( 188, 188, 188), + new Color( 187, 187, 187), + new Color( 186, 186, 186), + new Color( 185, 185, 185), + new Color( 184, 184, 184), + new Color( 183, 183, 183), + new Color( 182, 182, 182), + new Color( 181, 181, 181), + new Color( 180, 180, 180), + new Color( 179, 179, 179), + new Color( 255, 255, 255), + new Color( 178, 178, 178), + new Color( 177, 177, 177), + new Color( 176, 176, 176), + new Color( 175, 175, 175), + new Color( 174, 174, 174), + new Color( 173, 173, 173), + new Color( 172, 172, 172), + new Color( 171, 171, 171), + new Color( 170, 170, 170), + new Color( 169, 169, 169), + new Color( 168, 168, 168), + new Color( 255, 255, 255), + new Color( 167, 167, 167), + new Color( 166, 166, 166), + new Color( 165, 165, 165), + new Color( 164, 164, 164), + new Color( 163, 163, 163), + new Color( 159, 159, 159), + new Color( 158, 158, 158), + new Color( 255, 255, 255), + new Color( 157, 157, 157), + new Color( 156, 156, 156), + new Color( 155, 155, 155), + new Color( 154, 154, 154), + new Color( 153, 153, 153), + new Color( 152, 152, 152), + new Color( 151, 151, 151), + new Color( 150, 150, 150), + new Color( 149, 149, 149), + new Color( 148, 148, 148), + new Color( 147, 147, 147), + new Color( 255, 255, 255), + new Color( 146, 146, 146), + new Color( 145, 145, 145), + new Color( 144, 144, 144), + new Color( 143, 143, 143), + new Color( 142, 142, 142), + new Color( 141, 141, 141), + new Color( 140, 140, 140), + new Color( 139, 139, 139), + new Color( 138, 138, 138), + new Color( 137, 137, 137), + new Color( 136, 136, 136), + new Color( 255, 255, 255), + new Color( 135, 135, 135), + new Color( 134, 134, 134), + new Color( 133, 133, 133), + new Color( 132, 132, 132), + new Color( 131, 131, 131), + new Color( 127, 127, 127), + new Color( 126, 126, 126), + new Color( 255, 255, 255), + new Color( 125, 125, 125), + new Color( 124, 124, 124), + new Color( 123, 123, 123), + new Color( 122, 122, 122), + new Color( 121, 121, 121), + new Color( 120, 120, 120), + new Color( 119, 119, 119), + new Color( 118, 118, 118), + new Color( 117, 117, 117), + new Color( 116, 116, 116), + new Color( 115, 115, 115), + new Color( 255, 255, 255), + new Color( 114, 114, 114), + new Color( 113, 113, 113), + new Color( 112, 112, 112), + new Color( 111, 111, 111), + new Color( 110, 110, 110), + new Color( 109, 109, 109), + new Color( 108, 108, 108), + new Color( 107, 107, 107), + new Color( 106, 106, 106), + new Color( 105, 105, 105), + new Color( 104, 104, 104), + new Color( 255, 255, 255), + new Color( 103, 103, 103), + new Color( 102, 102, 102), + new Color( 101, 101, 101), + new Color( 100, 100, 100), + new Color( 99, 99, 99), + new Color( 95, 95, 95), + new Color( 94, 94, 94), + new Color( 255, 255, 255), + new Color( 93, 93, 93), + new Color( 92, 92, 92), + new Color( 91, 91, 91), + new Color( 90, 90, 90), + new Color( 89, 89, 89), + new Color( 88, 88, 88), + new Color( 87, 87, 87), + new Color( 86, 86, 86), + new Color( 85, 85, 85), + new Color( 84, 84, 84), + new Color( 83, 83, 83), + new Color( 255, 255, 255), + new Color( 82, 82, 82), + new Color( 81, 81, 81), + new Color( 80, 80, 80), + new Color( 79, 79, 79), + new Color( 78, 78, 78), + new Color( 77, 77, 77), + new Color( 76, 76, 76), + new Color( 75, 75, 75), + new Color( 74, 74, 74), + new Color( 73, 73, 73), + new Color( 72, 72, 72), + new Color( 255, 255, 255), + new Color( 71, 71, 71), + new Color( 70, 70, 70), + new Color( 69, 69, 69), + new Color( 68, 68, 68), + new Color( 67, 67, 67), + new Color( 63, 63, 63), + new Color( 62, 62, 62), + new Color( 255, 255, 255), + new Color( 61, 61, 61), + new Color( 60, 60, 60), + new Color( 59, 59, 59), + new Color( 58, 58, 58), + new Color( 57, 57, 57), + new Color( 56, 56, 56), + new Color( 55, 55, 55), + new Color( 54, 54, 54), + new Color( 53, 53, 53), + new Color( 52, 52, 52), + new Color( 51, 51, 51), + new Color( 255, 255, 255), + new Color( 50, 50, 50), + new Color( 49, 49, 49), + new Color( 48, 48, 48), + new Color( 47, 47, 47), + new Color( 46, 46, 46), + new Color( 45, 45, 45), + new Color( 44, 44, 44), + new Color( 43, 43, 43), + new Color( 42, 42, 42), + new Color( 41, 41, 41), + new Color( 40, 40, 40), + new Color( 255, 255, 255), + new Color( 39, 39, 39), + new Color( 38, 38, 38), + new Color( 37, 37, 37), + new Color( 36, 36, 36), + new Color( 35, 35, 35) + }; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/photorenderer/palettes/PaletteUtils.java b/Havana-Web/src/main/java/org/alexdev/photorenderer/palettes/PaletteUtils.java new file mode 100644 index 0000000..25a6194 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/photorenderer/palettes/PaletteUtils.java @@ -0,0 +1,33 @@ +package org.alexdev.photorenderer.palettes; + +import java.awt.*; +import java.io.DataInputStream; +import java.io.FileInputStream; + +public class PaletteUtils { + public Color[] readPalette(String paletteFileName) throws Exception { + var input = new DataInputStream(new FileInputStream(paletteFileName)); + new String(input.readNBytes(4)); + + input.readInt(); + + new String(input.readNBytes(4)); + new String(input.readNBytes(4)); + + input.readInt(); + input.readShort(); + + Color[] colors = new Color[input.readShort()]; + + for (int i = 0; i < colors.length; i++) { + int r = input.read(); + int g = input.read(); + int b = input.read(); + colors[i] = new Color(r, g, b); + input.readByte(); + //System.out.println("new Color( " + r + ", " + g + ", " + b + "),"); + } + + return colors; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/photorenderer/utils/BorderEffect.java b/Havana-Web/src/main/java/org/alexdev/photorenderer/utils/BorderEffect.java new file mode 100644 index 0000000..dcdc814 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/photorenderer/utils/BorderEffect.java @@ -0,0 +1,26 @@ +package org.alexdev.photorenderer.utils; + +import java.awt.*; +import java.awt.image.BufferedImage; + +public class BorderEffect { + private final int borderSize; + private final Color color; + + public BorderEffect(int borderSize, Color color) { + this.borderSize = borderSize; + this.color = color; + } + + public BufferedImage apply(BufferedImage bufferedImage) { + Graphics2D graphics2D = bufferedImage.createGraphics(); + graphics2D.setPaint(color); + //Horizontal + graphics2D.fillRect(0, 0, bufferedImage.getWidth(), borderSize); + graphics2D.fillRect(0, bufferedImage.getHeight() - borderSize, bufferedImage.getWidth(), borderSize); + //Vertical + graphics2D.fillRect(0, 0, borderSize, bufferedImage.getHeight()); + graphics2D.fillRect(bufferedImage.getWidth() - borderSize, 0, borderSize, bufferedImage.getHeight()); + return bufferedImage; + } +} diff --git a/Havana-Web/src/main/java/org/alexdev/photorenderer/utils/DataUtils.java b/Havana-Web/src/main/java/org/alexdev/photorenderer/utils/DataUtils.java new file mode 100644 index 0000000..62cfe47 --- /dev/null +++ b/Havana-Web/src/main/java/org/alexdev/photorenderer/utils/DataUtils.java @@ -0,0 +1,32 @@ +package org.alexdev.photorenderer.utils; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +public class DataUtils { + public static short readLittleEndianShort(InputStream inputStream) throws IOException { + ByteBuffer bb = ByteBuffer.wrap(readBytes(inputStream, 2)); + bb.order(ByteOrder.LITTLE_ENDIAN); + return bb.getShort(); + } + + public static int readLittleEndianInt(InputStream inputStream) throws IOException { + ByteBuffer bb = ByteBuffer.wrap(readBytes(inputStream, 4)); + bb.order(ByteOrder.LITTLE_ENDIAN); + return bb.getInt(); + } + + public static int readLittleEndianByte(InputStream inputStream) throws IOException { + ByteBuffer bb = ByteBuffer.wrap(readBytes(inputStream, 1)); + bb.order(ByteOrder.LITTLE_ENDIAN); + return bb.get(); + } + + private static byte[] readBytes(InputStream inputStream, int length) throws IOException { + byte[] buffer = new byte[length]; + inputStream.read(buffer); + return buffer; + } +} diff --git a/README.md b/README.md index ff712ef..fcb6b5b 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,205 @@ -# Havana - A server created in Java designed to revive Habbo Hotel v31 from the 2009 era. +![](https://i.imgur.com/alAG9uW.png) + +# Information + +Originally started as a fork from [Quackster/Kepler](Quackster/Kepler), this is a server created in Java designed to revive Habbo Hotel v31 from the 2009 era and its inception was in early 2018 as a side project. Havana is the most complete v31+ server to date, this was undertaken by various reverse engineering efforts of the Shockwave client throughout the years to achieve this. + +*Want to see this project live?* Visit [ClassicHabbo.com](https://classicHabbo.com/) where we have been running the hotel for 4+ years straight, reviving old memories and creating new ones. + +Sulake used the Adobe/Macromedia Shockwave as its multimedia platform for their game (Habbo Hotel) from 2001-2009. In the last year, Habbo made the move to the Adobe Flash client, and then in 2020 made the switch to the Unity engine, while still maintaining their flash client. + +Nowadays, the Shockwave client cannot be played in modern browsers as they have removed NPAPI support due to deprecation, end of life support and therefore has security concerns, and therefore must be played on forks of browsers that still have the NPAPI enabled. + +The reason why Shockwave emulators exist is for multiple reasons, the first is that Habbo uses a virtual currency called credits which is spent using real money and makes it a pay to win game, our own faithful recreation of Habbo can make credits free for everybody. The second is the fact that modern Habbo still lacks features that were once available to the users that played during the Shockwave-era - and is thus, to be intended to be used for **educational purposes only** as a preservation effort for an old game. + +# Features + +### Server + +- Handshake + - Login via SSO ticket + - Login via username/password +- Games + - Battleball + - Snowstorm + - Wobble Squabble + - Tic Tac Toe (available in Cunningfox Gamehall) + - Battle Ships (available in Cunningfox Gamehall) + - Chess (available in Cunningfox Gamehall) +- Catalogue + - Main/sub category page support + - Catalogue pages + - Catalogue items + - Purchasing from catalogues + - Effect previews + - Pixel rental previews + - Automatic rotation of collectibles + - Redemption of vouchers +- Effects + - Purchasing effects + - Effect expiry + - Configurable effect duration +- Navigator + - Recommended rooms + - List public rooms + - Room categories + - Favourite rooms + - Room search (including filtering with owner:) +- Rooms + - Create private rooms + - Edit private room settings + - Enter private rooms + - Private room doorbell + - Private room ratings (default expiry over 30 days) + - Enter public rooms + - Public room furniture + - Pool ladders (swimming) + - Pool diving deck (diving) + - Public room bots (your classics such as Piers the Habbo Kitchen chef!) + - All Infobus support + - Show tags on user +- Items + - Inventory + - Item purchasing + - Sit on chairs + - Lay on beds + - Trophies + - Coin redeeming + - Dice rolling + - Wheel of fortune + - Love randomizer + - Scoreboard + - Totem head/leg/planet interaction to gain special totem effects + - Vending machine interaction + - Teleporters + - American idol voting system + - Rollers + - Gates + - One-way gates + - Photos + - Song disks + - Presents + - Room dimmers +- Trax Machine + - Create music + - Save music + - Delete music + - Burn disk +- Jukebox + - Play disks + - Queue multiple disks +- Camera + - Take photos + - Load photos +- Messenger + - Status update + - Send friend request + - Accept friend request + - Send instant message + - Offline messaging + - Follow friend + - Invite friends +- Trading + - All safe trading features enabled +- Events + - Users can host events, is integrated into website +- Groups + - Display user favourited group when in-game +- Achievements + - American Idol voting + - Time online + - Change looks + - Game played (BattleBall and SnowStorm) + - Habbo Club membership + - Happy Hour + - Consecutive logins + - Friend referrals + - Motto + - Account age + - Respect earnt + - Respect given + - Room entries to private rooms that aren't yours + - Completing the tutorial + - Adding tags + - Trade pass + - Guides + Habbo Club + - Monthly gifts + - First gift club sofa + - Exclusive Habbo Club items + - Exclusive Habbo Club rooms + - Habbo club clothing options enabled +- Ecotron + - Recycle items + - Ecotron rewards visible in catalogue + - Ecotron rewards after recycling items +- Guides + - Complete tutorial + - After tutorial, search for guide + - Guide must be part of the guide group to join + - Guide badge progression + +### Website + +- Login +- Register +- Community +- Groups +- Group discussions +- User referrals +- Homes +- Home customisation +- Housekeeping + - News + - Users + - Room entry badges + - Infobus management + - Ban management + +(There's a good chance I missed a lot, the CMS itself is very complete) + +# Screenshots + +![image](https://user-images.githubusercontent.com/1328523/188254181-edc73039-bef7-4dc8-af0b-46541cec9b4c.png) + +![image](https://user-images.githubusercontent.com/1328523/188254211-c9f9bf21-4c60-444f-b3b6-a8713c72d9b0.png) + +![image](https://user-images.githubusercontent.com/1328523/188254197-30a5b3d3-7854-403c-a863-508c2300a086.png) + +# Installation + +Install MariaDB server, connect to the database server and import havana.sql (located in /tools/havana.sql). + +Download the latest development build on the [releases page](https://github.com/Quackster/Havana/releases) and rename the files to remove the short build hash version, for convenience. + +Install any JDK version that is equal or above >= 11 to run the jar files. + +Run both Havana-Server.jar and Havana-Web.jar at least once to generate the necessary configuration files, configure the MySQL attributes to connect to the MariaDB server. + +Download the [havana_www.zip](https://www.mediafire.com/file/x94neh4qbu3l2s2/havana_www.zip/file) file, and then extract it to /tools/www/ this directory is located where you ran Havana-Web.jar. + +*(This is the default directory for static content within the Havana-Web project, but the directory where it looks for static images can be configured in the Housekeeping settings).* + +Open Havana-Web.jar via + +``` +java -jar Havana-Web.jar +``` + +Open Havana-Server.jar via + +``` +java -jar Havana-Server.jar +``` + +Your server should be up and running and accessible via http://localhost/ + +I highly recommend [this browser](https://forum.ragezone.com/f353/portable-browser-with-flash-shockwave-1192727/) to be able to play Adobe Shockwave movies in the present day. + +### Important for Linux users + +Install the font manager, to enable the captcha to work on the website. + +``` +apt-get install font-manager +``` diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..98989ff --- /dev/null +++ b/settings.gradle @@ -0,0 +1,5 @@ +include 'Havana-Server' +project(":Havana-Server").projectDir = file("Havana-Server") + +include 'Havana-Web' +project(":Havana-Web").projectDir = file("Havana-Web") \ No newline at end of file diff --git a/tools/.gitignore b/tools/.gitignore new file mode 100644 index 0000000..d9cf7cd --- /dev/null +++ b/tools/.gitignore @@ -0,0 +1 @@ +www/ \ No newline at end of file diff --git a/tools/cleanup.sql b/tools/cleanup.sql new file mode 100644 index 0000000..d269673 --- /dev/null +++ b/tools/cleanup.sql @@ -0,0 +1,293 @@ +ALTER TABLE `achievements`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `achievements` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `catalogue_collectables`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `catalogue_collectables` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `catalogue_items`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `catalogue_items` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `catalogue_packages`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `catalogue_packages` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `catalogue_pages`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `catalogue_pages` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `cms_alerts`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `cms_alerts` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `cms_forum_replies`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `cms_forum_replies` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `cms_forum_threads`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `cms_forum_threads` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `cms_guestbook_entries`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `cms_guestbook_entries` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `cms_minimail`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `cms_minimail` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `cms_recommended`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `cms_recommended` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `cms_stickers`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `cms_stickers` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `cms_stickers_catalogue`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `cms_stickers_catalogue` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `cms_stickers_categories`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `cms_stickers_categories` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `external_texts`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `external_texts` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `games_maps`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `games_maps` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `games_player_spawns`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `games_player_spawns` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `games_ranks`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `games_ranks` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `groups_details`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `groups_details` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `groups_edit_sessions`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `groups_edit_sessions` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `groups_memberships`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `groups_memberships` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `homes_details`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `homes_details` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `homes_edit_sessions`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `homes_edit_sessions` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `homes_ratings`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `homes_ratings` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `housekeeping_audit_log`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `housekeeping_audit_log` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `items`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `items` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `items_definitions`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `items_definitions` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `items_moodlight_presets`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `items_moodlight_presets` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `items_pets`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `items_pets` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `items_photos`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `items_photos` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `items_teleporter_links`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `items_teleporter_links` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `messenger_categories`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `messenger_categories` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `messenger_friends`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `messenger_friends` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `messenger_messages`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `messenger_messages` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `messenger_requests`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `messenger_requests` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `public_items`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `public_items` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `rank_badges`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `rank_badges` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `rank_fuserights`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `rank_fuserights` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `recycler_rewards`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `recycler_rewards` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `rooms`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `rooms` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `rooms_ads`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `rooms_ads` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `rooms_bans`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `rooms_bans` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `rooms_bots`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `rooms_bots` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `rooms_categories`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `rooms_categories` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `rooms_events`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `rooms_events` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `rooms_models`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `rooms_models` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `rooms_rights`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `rooms_rights` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `room_chatlogs`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `room_chatlogs` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `settings`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `settings` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `settings_effects`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `settings_effects` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `site_articles`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `site_articles` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `soundmachine_disks`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `soundmachine_disks` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `soundmachine_playlists`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `soundmachine_playlists` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `soundmachine_songs`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `soundmachine_songs` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `soundmachine_tracks`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `soundmachine_tracks` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `users`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `users` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `users_achievements`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `users_achievements` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `users_badges`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `users_badges` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `users_bans`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `users_bans` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `users_club_gifts`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `users_club_gifts` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `users_effects`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `users_effects` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `users_ip_logs`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `users_ip_logs` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `users_mutes`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `users_mutes` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `users_referred`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `users_referred` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `users_room_favourites`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `users_room_favourites` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `users_room_votes`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `users_room_votes` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `users_tags`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `users_tags` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `users_wardrobes`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `users_wardrobes` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `vouchers`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `vouchers` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `vouchers_history`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `vouchers_history` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `vouchers_items`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `vouchers_items` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `wordfilter`DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +ALTER TABLE `wordfilter` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; + +SET FOREIGN_KEY_CHECKS = 0; +TRUNCATE `games_played_history`; +TRUNCATE `groups_details`; +TRUNCATE `groups_memberships`; +TRUNCATE `groups_edit_sessions`; +TRUNCATE `homes_details`; +TRUNCATE `homes_edit_sessions`; +TRUNCATE `homes_ratings`; +TRUNCATE `cms_guestbook_entries`; +TRUNCATE `cms_stickers`; +TRUNCATE `items`; +TRUNCATE `items_pets`; +TRUNCATE `items_photos`; +TRUNCATE `items_teleporter_links`; +TRUNCATE `items_moodlight_presets`; +TRUNCATE `messenger_categories`; +TRUNCATE `messenger_friends`; +TRUNCATE `messenger_messages`; +TRUNCATE `messenger_requests`; +TRUNCATE `rooms_bans`; +TRUNCATE `rooms_rights`; +TRUNCATE `room_chatlogs`; +TRUNCATE `soundmachine_disks`; +TRUNCATE `soundmachine_playlists`; +TRUNCATE `soundmachine_songs`; +TRUNCATE `soundmachine_tracks`; +TRUNCATE `users_club_gifts`; +TRUNCATE `users_tags`; +TRUNCATE `users_bans`; +TRUNCATE `users_mutes`; +TRUNCATE `users_achievements`; +TRUNCATE `users_effects`; +TRUNCATE `users_referred`; +TRUNCATE `users_wardrobes`; +TRUNCATE `users_ip_logs`; +TRUNCATE `users_tutorial_progress`; +TRUNCATE `users_statistics`; +TRUNCATE `users_room_votes`; +DELETE FROM `users_badges`; +DELETE FROM `users`; +TRUNCATE `settings`; +TRUNCATE `site_articles`; +TRUNCATE `vouchers`; +TRUNCATE `vouchers_history`; +TRUNCATE `vouchers_items`; +TRUNCATE `cms_minimail`; +TRUNCATE `cms_recommended`; +TRUNCATE `cms_forum_threads`; +TRUNCATE `users_transactions`; +TRUNCATE `rooms_events`; +TRUNCATE `room_visits`; +TRUNCATE `users_room_favourites`; +TRUNCATE `infobus_polls_answers`; +TRUNCATE `infobus_polls`; +ALTER TABLE `cms_forum_threads` AUTO_INCREMENT=1; +TRUNCATE `cms_forum_replies`; +TRUNCATE `cms_forums_read_replies`; +ALTER TABLE `cms_forum_replies` AUTO_INCREMENT=1; +ALTER TABLE `cms_minimail` AUTO_INCREMENT=1; +TRUNCATE `cms_alerts`; +ALTER TABLE `cms_alerts` AUTO_INCREMENT=1; +UPDATE `catalogue_collectables` SET `expiry` = '-1' WHERE `catalogue_collectables`.`store_page` = 51; +UPDATE `catalogue_collectables` SET `expiry` = '-1' WHERE `catalogue_collectables`.`store_page` = 93; +UPDATE `catalogue_collectables` SET `current_position` = '0' WHERE `catalogue_collectables`.`store_page` = 51; +UPDATE `catalogue_collectables` SET `current_position` = '0' WHERE `catalogue_collectables`.`store_page` = 93; +DELETE FROM rooms WHERE id >= 1000; +ALTER TABLE `rooms` AUTO_INCREMENT=1000; +ALTER TABLE `users` AUTO_INCREMENT=1; +ALTER TABLE `groups_details` AUTO_INCREMENT=1; +ALTER TABLE `cms_stickers` AUTO_INCREMENT=1; +ALTER TABLE `users_effects` AUTO_INCREMENT=1; +ALTER TABLE `items` AUTO_INCREMENT=1; +ALTER TABLE `users` AUTO_INCREMENT=1; +ALTER TABLE `site_articles` AUTO_INCREMENT=1; +TRUNCATE `site_articles_categories`; +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/tools/gamedata/flash/Habbo.swf b/tools/gamedata/flash/Habbo.swf new file mode 100644 index 0000000..2bd4cb1 Binary files /dev/null and b/tools/gamedata/flash/Habbo.swf differ diff --git a/tools/gamedata/flash/external_flash_texts.txt b/tools/gamedata/flash/external_flash_texts.txt new file mode 100644 index 0000000..4549565 --- /dev/null +++ b/tools/gamedata/flash/external_flash_texts.txt @@ -0,0 +1,2706 @@ +nav_venue_bb_lobby_beginner_3/0_desc= +nav_venue_sw_lobby_beginner_0_name=Snow Rookies Lobby +nav_venue_$unit.name$/0_desc=Roam more of the hotel's corridors +nav_venue_sun_terrace/0_name=Sun Terrace +nav_venue_the_chromide_club/0_desc=Ghetto Fabulous +nav_venue_bb_lobby_beginner_9_name=Beginners Battle Ball 10 +nav_venue_bb_lobby_beginner_10_name=Beginners Battle Ball 11 +nav_venue_sw_lobby_expert_2_name=Snow Marksmen Lobby +nav_venue_bb_lobby_expert_4/0_desc= +nav_venue_sw_lobby_beginner_6_name=Snow Rookies Lobby +nav_venue_ballroom/0_desc=Forget Beijing, check out Habbo's very own Olympic Stadium! +nav_venue_tv_studio/0_desc=Will you reach the final of the biggest brains in Habbo competition? +nav_venue_basement_lobby_name=Basement Lobby +nav_venue_bb_lobby_beginner_8/0_desc= +nav_venue_bb_lobby_free_1/0_desc=Meet friends and play BattleBall: Rebound! +nav_venue_bb_lobby_amateur_1_name=Gevorderden Battle Ball 2 +nav_venue_median_lobby/0_desc=A Mean place to hang +nav_venue_sw_lobby_amateur_2/0_desc= +nav_venue_space_cafe_name=Ten Forward +nav_venue_star_lounge/0_desc=Celebrities favourite hang out +nav_venue_bb_lobby_intermediate_0/0_desc= +nav_venue_club_massiva/2_name=Dancefloor +nav_venue_bb_lobby_amateur_desc=Amateur battle ball! +nav_venue_bb_lobby_tournament_0_name=Tournament +nav_venue_sw_lobby_beginner_1_name=Snow Rookies Lobby +nav_venue_bb_lobby_expert_4_name=Experts Battle Ball 5 +nav_venue_bb_lobby_beginner_2_name=Beginners Battle Ball 3 +nav_venue_cafe_gold/0_desc=Receive and discuss the latest safety tips and tricks. +nav_venue_bb_lobby_intermediate_2_name=Semi-profs Battle Ball 3 +nav_venue_theatredrome_deli/0_desc=Join in all the fun of the fair! +nav_venue_bb_lobby_beginner_6/0_desc= +nav_venue_rooftop_rumble_name=Rooftop Rumble +nav_venue_sw_lobby_amateur_7_name=Snow Slingers Lobby +nav_venue_picnic/0_desc=Enjoy the great outdoors, celebrate mother nature and party! +nav_venue_the_chromide_club_name=The Chromide Club +nav_venue_emperors/0_desc=Debate and engage another Bionicle Glatorian into battle before stepping into the Arena +nav_venue_sw_lobby_amateur_0_name=Snow Slingers Lobby +nav_venue_bb_lobby_beginner_10/0_desc= +nav_venue_theatredrome_xmas/0_desc= +nav_venue_sw_lobby_tournament_3_name=Tournament Lobby +nav_venue_habbo_lido_ii_name=Habbo Lido II +nav_venue_sw_lobby_expert_1/0_desc= +nav_venue_hallway_ii_name=Hallway II +nav_venue_theatredrome_habbowood/0_desc=Home to the Habbowood Gala and HAFTA Awards! +nav_venue_sw_lobby_amateur_2_name=Snow Slingers Lobby +nav_venue_sw_lobby_beginner_6/0_desc= +nav_venue_chill/0_name=Zen Garden +nav_venue_gate_park_name=Imperial Park +nav_venue_bb_lobby_intermediate_0_name=Intermediate +nav_venue_sw_arena_expert_name=Playing expert game +nav_venue_old_skool/0_desc=A set of rooms inspired by the original and legendary Mobiles Disco, the progenitor of Habbo +nav_venue_sunset_cafe/0_desc=Home to the Otter Island residents. +nav_venue_sw_lobby_beginner_7_name=Snow Rookies Lobby +nav_venue_bb_lobby_beginner_2/0_desc= +nav_venue_orient/0_name=Club Golden Dragon +nav_venue_sw_lobby_beginner_4_name=Snow Rookies Lobby +nav_venue_star_lounge_desc=Is there a VIP visitor in the hotel? +nav_venue_bb_lobby_tournament_2/0_desc= +nav_venue_bb_lobby_intermediate_3/0_desc= +nav_venue_bb_lobby_expert_0/0_desc= +nav_venue_club_mammoth_name=Club Mammoth +nav_venue_sw_lobby_amateur_6_name=Snow Slingers Lobby +nav_venue_hotel_kitchen_name=Hotel Kitchen +nav_venue_bb_lobby_amateur_3/0_desc= +nav_venue_beauty_salon_loreal/0_desc=No Pixel Surgery. +nav_venue_sw_arena_beginner_name(0)=SnowStorm Aloittelijat +nav_venue_club_mammoth/0_name=Club Mammoth +nav_venue_library/0_name=Habbo Library +nav_venue_gate_park/0_desc=Follow the path... +nav_venue_sunset_cafe_name=Sunset Cafe +nav_venue_pizza/0_desc=Pizza Palace +nav_venue_sw_arena_intermediate_name(0)=SnowStorm Keskitaso +nav_venue_sw_lobby_free_3_name=Free Game Lobby +nav_venue_sw_lobby_expert_2/0_desc=Todellisille lumisotureille. +nav_venue_sw_lobby_free_2/0_desc= +nav_venue_bb_lobby_beginner_4_name=Beginners Battle Ball 5 +nav_venue_sw_lobby_intermediate_5/0_desc=Lumisota sen kuin vain kovenee. +nav_venue_bb_lobby_tournament_7/0_desc= +nav_venue_sw_arena_intermediate_name=Playing intermediate game +nav_venue_theatredrome_easter_name=Theatredrome Easter +nav_venue_bb_lobby_tournament_3/0_desc= +nav_venue_median_lobby_name=Median Lobby +nav_venue_bb_lobby_amateur_0/0_desc= +nav_venue_pizzeria_name=Slice of Life +nav_venue_sw_lobby_amateur_4/0_desc=Astetta rankempaa lumisotaa. +nav_venue_sw_lobby_intermediate_5_name=Snow Bombardiers Lobby +nav_venue_club_massiva/1_desc=Strut your funky stuff +nav_venue_theatredrome_halloween_name=Theatredrome Habboween +nav_venue_sport/0_name=The Power Gym +nav_venue_sw_lobby_amateur_1_name=Snow Slingers Lobby +nav_venue_bb_lobby_tournament_16/0_desc= +nav_venue_orient/0_desc=Tres chic with an Eastern twist. For Habbo Club members only. +nav_venue_club_massiva_name=Club Massiva +nav_venue_bb_lobby_beginner_0_name=Beginner +nav_venue_bb_lobby_amateur_13/0_desc= +nav_venue_the_dirty_duck_pub/0_desc=Grab a stool and hear Dave and Sadie talk about the good old days... +nav_venue_sw_lobby_tournament_8/0_desc= +nav_venue_park/0_desc=Visit the park and the infamous Infobus +nav_venue_cafe_gold/0_name=Kultakahvila +nav_venue_theatredrome/0_desc=Perform your latest master piece, or simply catch the latest gossip. +nav_venue_sw_lobby_beginner_0/0_desc= +nav_venue_sw_lobby_intermediate_2_name=Snow Bombardiers Lobby +nav_venue_sw_lobby_beginner_3_name=Snow Rookies Lobby +nav_venue_bb_lobby_amateur_6_name=Gevorderden Battle Ball 7 +nav_venue_bb_lobby_intermediate_2/0_desc= +nav_venue_bb_lobby_beginner_0/0_desc= +nav_venue_sw_lobby_free_4_name=Free Game Lobby +nav_venue_sw_lobby_beginner_5/0_desc= +nav_venue_bb_lobby_tournament_9/0_desc= +nav_venue_bb_lobby_intermediate_3_name=Semi-profs Battle Ball 4 +nav_venue_hallway_ii/0_desc=Taking you to the far reaches of Habbo Hotel +nav_venue_bb_lobby_intermediate_9/0_desc= +nav_venue_habburger's_name=Habburgers +nav_venue_sw_lobby_tournament_2_name=Tournament Lobby +nav_venue_bb_lobby_tournament_13_name=Competitie Battle Ball 14 +nav_venue_tearoom/0_desc=Try the tea in this Mongol cafe - it is to die for darlings! +nav_venue_bb_lobby_amateur_3_name=Gevorderden Battle Ball 4 +nav_venue_sw_lobby_intermediate_1/0_desc= +nav_venue_sw_lobby_free_desc=Come and play. It's free! +nav_venue_basement_lobby/0_desc=For low level hanging +nav_venue_bb_lobby_amateur_4_name=Gevorderden Battle Ball 5 +nav_venue_sw_lobby_tournament_1_name=Tournament Lobby +nav_venue_bb_lobby_tournament_4/0_desc= +nav_venue_ice_cafe_name=Ice Cafe +nav_venue_sw_lobby_free_8_name=Free Game Lobby +nav_venue_bb_lobby_amateur_5/0_desc= +nav_venue_sw_lobby_free_9/0_desc=Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan. +nav_venue_bb_lobby_tournament_8_name=Competitie Battle Ball 9 +nav_venue_bb_lobby_tournament_1_name=Competitie Battle Ball 2 +nav_venue_sw_lobby_free_5_name=Free Game Lobby +nav_venue_bb_lobby_tournament_3_name=Competitie Battle Ball 4 +nav_venue_bb_lobby_free_0/0_desc=Meet friends and play BattleBall: Rebound! +nav_venue_sw_lobby_tournament_9/0_desc= +nav_venue_sw_lobby_amateur_3_name=Snow Slingers Lobby +nav_venue_bb_lobby_amateur_10/0_desc= +nav_venue_bb_lobby_intermediate_4_name=Semi-profs Battle Ball 5 +nav_venue_sw_lobby_tournament_6/0_desc= +nav_venue_bb_lobby_5_name=Battle Ball Kaikille +nav_venue_snowwar_lobby/0_desc=Snow Storm LobbyCome and be a Snow Stormer! +nav_venue_bb_lobby_amateur_9_name=Gevorderden Battle Ball 10 +nav_venue_rooftop_rumble_ii_name=Rooftop Rumble II +nav_venue_club_massiva_desc=Strut your funky stuff! +nav_venue_branded/0_desc=Something funny's going on, do you know what? +nav_venue_bb_lobby_expert_1_name=Experts Battle Ball 2 +nav_venue_sw_lobby_tournament_4/0_desc= +nav_venue_skylight_lobby_name=Skylight Lobby +nav_venue_ballroom_name=Ballroom +nav_venue_sw_lobby_free_4/0_desc=Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan. +nav_venue_bb_lobby_beginner_9/0_desc= +nav_venue_bb_lobby_beginner_desc=Beginner battle ball +nav_venue_bb_arena_1_name=Battle Ball Aloittelijat +nav_venue_snowwar_lobby_name=Snow Storm Lobby +nav_venue_sw_lobby_beginner_9_name=Snow Rookies Lobby +nav_venue_bb_lobby_amateur_2/0_desc= +nav_venue_netcafe/0_desc=Learn a foreign language and win Habbo Credits in our quests! +nav_venue_theatredrome_halloween/0_desc=Habboween 2008 starts right here, right now! Ready? +nav_venue_bb_lobby_amateur_0_name=Amateur +nav_venue_bb_lobby_beginner_17/0_desc= +nav_venue_welcome_lounge_name=Welcome Lounge +nav_venue_sw_lobby_amateur_5_name=Snow Slingers Lobby +nav_venue_sw_lobby_expert_1_name=Snow Marksmen Lobby +nav_venue_bb_lobby_beginner_1_name=Beginners Battle Ball 2 +nav_venue_club_massiva/0_desc=Rest your dancing feet! +nav_venue_sw_arena_amateur_name(0)=SnowStorm Amatöörit +nav_venue_bb_lobby_beginner_13_name=Beginners Battle Ball 14 +nav_venue_chill_name=Zen Garden +nav_venue_sw_lobby_intermediate_4_name=Snow Bombardiers Lobby +nav_venue_tearoom/0_name=Chinese Tea Room +nav_venue_sun_terrace/0_desc=Grab a sunbed and top up that tan! +nav_venue_bb_lobby_expert_7/0_desc= +nav_venue_bb_lobby_amateur_7/0_desc= +nav_venue_bb_lobby_expert_3/0_desc= +nav_venue_bb_lobby_tournament_14/0_desc= +nav_venue_bb_lobby_free_3/0_desc=Meet friends and play BattleBall: Rebound! +nav_venue_sw_lobby_intermediate_3_name=Snow Bombardiers Lobby +nav_venue_bb_lobby_intermediate_1/0_desc= +nav_venue_bb_lobby_tournament_17/0_desc= +nav_venue_the_den/0_desc=Popular? Win a cool band and party at your school. You soon will be! +nav_venue_bb_lobby_beginner_15/0_desc= +nav_venue_habbo_cinema_name=Habbo Cinema +nav_venue_bb_lobby_amateur_2_name=Gevorderden Battle Ball 3 +nav_venue_bb_lobby_expert_6/0_desc= +nav_venue_rooftop/0_desc=One of the highest points in Habbo Hotel! +nav_venue_bouncer_room_4_name=Experts Battle Ball Arena +nav_venue_bb_arena_2_name=Battle Ball Amatöörit +nav_venue_bb_lobby_beginner_5_name=Beginners Battle Ball 6 +nav_venue_sw_lobby_beginner_2_name=Snow Rookies Lobby +nav_venue_bb_lobby_tournament_desc=Play battle ball tournament! +nav_venue_sw_lobby_expert_0/0_desc= +nav_venue_sw_lobby_beginner_9/0_desc= +nav_venue_pizza_name=Slice of Life +nav_venue_picnic/0_name=Picnic Garden +nav_venue_bb_lobby_expert_2_name=Experts Battle Ball 3 +nav_venue_sw_lobby_beginner_8_name=Snow Rookies Lobby +nav_venue_bb_lobby_beginner_14_name=Beginners Battle Ball 15 +nav_venue_kattoterassi/0_desc=When push comes to shove... +nav_venue_bb_lobby_tournament_0/0_desc= +nav_venue_the_den_name=The Den +nav_venue_bb_lobby_free_2/0_desc=Meet friends and play BattleBall: Rebound! +nav_venue_tv_studio_general/0_desc=Suosikki rules! Musaa, leffoja ja staroja! +nav_venue_bb_lobby_expert_1/0_desc= +nav_venue_bb_lobby_expert_9/0_desc= +nav_venue_bouncer_room_0_name=Battle Ball Competitie Arena +nav_venue_sw_lobby_tournament_desc=For stand-alone Tournaments. +nav_venue_bb_lobby_beginner_19/0_desc= +nav_venue_eric's_eaterie/0_desc=Join Billy for a bite to eat and some office gossip in the HABprentice +nav_venue_habbo_cinema/0_desc=Now Showing: The Making of Habbo Big Brother +nav_venue_bb_lobby_beginner_8_name=Beginners Battle Ball 9 +nav_venue_sw_lobby_free_7_name=Free Game Lobby +nav_venue_bb_lobby_intermediate_1_name=Semi-profs Battle Ball 2 +nav_venue_sw_lobby_amateur_3/0_desc=Astetta rankempaa lumisotaa. +nav_venue_bb_lobby_beginner_18/0_desc= +nav_venue_sw_lobby_tournament_0/0_desc= +nav_venue_sw_lobby_amateur_7/0_desc=Astetta rankempaa lumisotaa. +nav_venue_sw_lobby_free_1_name=Free Game Lobby +nav_venue_sw_lobby_amateur_1/0_desc= +nav_venue_sw_lobby_free_1/0_desc= +nav_venue_bb_lobby_tournament_14_name=Competitie Battle Ball 15 +nav_venue_bb_lobby_expert_8/0_desc= +nav_venue_bb_lobby_amateur_11/0_desc= +nav_venue_welcome_lounge/0_desc=New? Lost? Get a warm welcome here! +nav_venue_sport_name=Power Gym +nav_venue_bb_lobby_amateur_1/0_desc= +nav_venue_bb_lobby_beginner_11_name=Beginners Battle Ball 12 +nav_venue_emperors_name=Emperor's hall +nav_venue_hotel_kitchen/0_desc=Beware the flying knives! +nav_venue_bb_lobby_beginner_4/0_desc= +nav_venue_sw_lobby_free_5/0_desc=Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan. +nav_venue_sw_lobby_beginner_1/0_desc= +nav_venue_sunset_cafe_ii/0_desc=Home to the Duck Island residents. +nav_venue_sw_lobby_beginner_7/0_desc= +nav_venue_sw_lobby_amateur_desc=Practice improves a Snow Stormer's aim... Ops, missed! +nav_venue_bb_lobby_amateur_8/0_desc= +nav_venue_sw_lobby_tournament_7_name=Tournament Lobby +nav_venue_club_mammoth/0_desc=Monumental and magnificent. For Habbo Club members only. +nav_venue_bb_game/0_name=Battle Ball Arena +nav_venue_pizzeria/0_desc=Pizza; food of the hungry! +nav_venue_pizza_desc=Tunnelmallinen pizzapaikka kiireettömään nautiskeluun. +nav_venue_bb_lobby_amateur_12/0_desc= +nav_venue_sw_lobby_free_6_name=Free Game Lobby +nav_venue_sw_lobby_free_8/0_desc=Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan. +nav_venue_theatredrome_xmas_name=Theatredrome Xmas +nav_venue_sw_lobby_free_0_name=Free Game Lobby +nav_venue_tv_studio_name=MuchMusic HQ +nav_venue_sw_arena_amateur_name=Playing amateur game +nav_venue_sw_lobby_intermediate_desc=For the accomplished Snow Stormers. +nav_venue_hallway_name=Hallway +nav_venue_bb_lobby_beginner_3_name=Beginners Battle Ball 4 +nav_venue_theatredrome_name=Theatredrome +nav_venue_bb_lobby_tournament_19/0_desc= +nav_venue_bb_lobby_amateur_9/0_desc= +nav_venue_bb_lobby_beginner_5/0_desc= +nav_venue_bb_lobby_tournament_11_name=Competitie Battle Ball 12 +nav_venue_sw_arena_free_name(0)=SnowStorm - kaikki kaikkia vastaan +nav_venue_rooftop_name=Rooftop Cafe +nav_venue_eric's_eaterie_name=Eric's Eaterie +nav_venue_sw_lobby_expert_desc=For the William Tells and Robin Hoods of Snow Storming. +nav_venue_sw_lobby_intermediate_1_name=Snow Bombardiers Lobby +nav_venue_rooftop_rumble_ii/0_desc=Duel on the floats or chill by the waterfall. +nav_venue_bb_lobby_beginner_12/0_desc= +nav_venue_bb_lobby_amateur_5_name=Gevorderden Battle Ball 6 +nav_venue_bb_lobby_tournament_4_name=Competitie Battle Ball 5 +nav_venue_sw_lobby_beginner_desc=Yes, take a load of snowballs and hit the enemy Teams. Easy, isn't it? +nav_venue_sw_lobby_amateur_6/0_desc=Astetta rankempaa lumisotaa. +nav_venue_bb_lobby_tournament_6_name=Competitie Battle Ball 7 +nav_venue_sw_lobby_beginner_8/0_desc= +nav_venue_bb_lobby_tournament_6/0_desc= +nav_venue_sw_lobby_tournament_5_name=Tournament Lobby +nav_venue_habbo_lido_ii/0_desc=Pool is open for swimming and diving! +nav_venue_skylight_lobby/0_desc=This was the Habbo Big Brother Lounge during series 1 (2008) +nav_venue_sw_lobby_tournament_2/0_desc= +nav_venue_sw_lobby_tournament_6_name=Tournament Lobby +nav_venue_space_cafe/0_desc=Star Wars The Clone Wars on Blu-Ray and DVD from December 8 +nav_venue_bouncer_room_3_name=Semi-profs Battle Ball Arena +nav_venue_bb_lobby_amateur_14/0_desc= +nav_venue_bb_lobby_tournament_12_name=Competitie Battle Ball 13 +nav_venue_ice_cafe/0_desc=The dawn of the dinosaurs has begun +nav_venue_sw_lobby_beginner_5_name=Snow Rookies Lobby +nav_venue_sw_lobby_amateur_5/0_desc=Astetta rankempaa lumisotaa. +nav_venue_netcafe_name=My Habbo Home Netcafe +nav_venue_club_massiva/2_desc=Make all the right moves +nav_venue_park_name=Habbo Gardens +nav_venue_bb_lobby_expert_desc=Expert battle ball! +nav_venue_bb_lobby_beginner_1/0_desc= +nav_venue_sw_lobby_tournament_4_name=Tournament Lobby +nav_venue_sw_lobby_tournament_8_name=Tournament Lobby +nav_venue_sw_lobby_tournament_7/0_desc= +nav_venue_bb_arena_4_name=Battle Ball Expertit +nav_venue_bouncer_room_1_name=Beginners Battle Ball Arena +nav_venue_sport/0_desc=Zac Efron owns in the 17 Again basketball court � what would you do with your second shot? +nav_venue_bb_lobby_intermediate_5/0_desc= +nav_venue_bb_lobby_beginner_13/0_desc= +nav_venue_sw_lobby_free_7/0_desc=Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan. +nav_venue_sun_terrace_name=Sun Terrace +nav_venue_bb_lobby_intermediate_6/0_desc= +nav_venue_bb_lobby_expert_0_name=Expert +nav_venue_welcome_lounge_iii/0_desc=New? Lost? Get a warm welcome here from Habbo eXperts. +nav_venue_bb_lobby_tournament_15/0_desc= +nav_venue_sw_lobby_free_6/0_desc=Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan. +nav_venue_sw_lobby_intermediate_0_name=Snow Bombardiers Lobby +nav_venue_sw_lobby_free_3/0_desc= +nav_venue_bb_lobby_intermediate_8/0_desc= +nav_venue_sw_lobby_tournament_3/0_desc= +nav_venue_bb_lobby_tournament_13/0_desc= +nav_venue_bb_arena_0_name=Battle Ball kaikille +nav_venue_the_dirty_duck_pub_name=The Dirty Duck Pub +nav_venue_sw_lobby_amateur_4_name=Snow Slingers Lobby +nav_venue_orient_name=Club Orient +nav_venue_bb_lobby_tournament_11/0_desc= +nav_venue_welcome_lounge_ii/0_desc=New? Lost? Get a warm welcome here! +nav_venue_old_skool_name=Old Skool Habbo +nav_venue_bb_lobby_expert_2/0_desc= +nav_venue_theatredrome_valentine_name=Theatredrome Valentine +nav_venue_sw_lobby_intermediate_4/0_desc=Lumisota sen kuin vain kovenee. +nav_venue_sw_arena_expert_name(0)=SnowStorm Expertit +nav_venue_sw_lobby_tournament_1/0_desc= +nav_venue_bb_lobby_intermediate_desc=Intermediate battle ball! +nav_venue_beauty_salon_general/0_desc=Come for treatments on behalf of Chic by Charlie Girl +nav_venue_picnic_dudesons/0_desc=Duudsoneiden sponssaama oma Ranchi - www.extremeduudsonit.com +nav_venue_hallway/0_desc=Connecting you to the heart of Habbo Hotel +nav_venue_dusty_lounge/0_desc=Old, cool, Dusty and the perfect room for the biggest brains in Habbo +nav_venue_bb_lobby_tournament_1/0_desc= +nav_venue_bb_arena_3_name=Battle Ball Keskitaso +nav_venue_sw_lobby_beginner_4/0_desc= +nav_venue_rooftop_rumble/0_desc=Wabble Squabble your bum off in our cool rooftop hang out +nav_venue_library/0_desc=Books! Glorius books! Fill yourself with information and lose yourself in wonderful literary worlds. +nav_venue_bb_lobby_tournament_8/0_desc= +nav_venue_bb_lobby_tournament_18/0_desc= +nav_venue_bb_lobby_amateur_4/0_desc= +nav_venue_bb_lobby_beginner_16/0_desc= +nav_venue_sw_lobby_free_2_name=Free Game Lobby +nav_venue_bb_lobby_intermediate_7/0_desc= +nav_venue_beauty_salon_loreal_name=Beauty salon +nav_venue_habburger's/0_desc=Get food here! +nav_venue_dusty_lounge_name=Dusty Lounge +nav_venue_cafe_gold_name=The Oasis +nav_venue_tv_studio_nike/0_desc= +nav_venue_theatredrome_valentine/0_desc=Home of Ralph (wannabe panda in training) +nav_venue_beauty_salon_general_name=Beauty salon +nav_venue_sw_lobby_free_9_name=Free Game Lobby +nav_venue_floatinggarden_name=Floating Garden +nav_venue_bb_lobby_intermediate_5_name=Semi-profs Battle Ball 6 +nav_venue_star_lounge_name=Star Lounge +nav_venue_bb_lobby_beginner_7/0_desc= +nav_venue_sw_lobby_intermediate_0/0_desc= +nav_venue_bb_lobby_amateur_7_name=Gevorderden Battle Ball 8 +nav_venue_bb_lobby_tournament_12/0_desc= +nav_venue_sw_arena_tournament_name=Playing a tournament game! +nav_venue_sw_lobby_tournament_9_name=Tournament Lobby +nav_venue_club_massiva/1_name=Chill-out Room +nav_venue_sw_lobby_tournament_5/0_desc= +nav_venue_sw_lobby_free_0/0_desc=Meet friends and play SnowStorm! +nav_venue_bb_lobby_beginner_12_name=Beginners Battle Ball 13 +nav_venue_floatinggarden/0_desc=Climb the rocks, chill in the shade and watch for pirate ships! +nav_venue_sw_lobby_amateur_0/0_desc= +nav_venue_bb_lobby_beginner_11/0_desc= +nav_venue_bb_lobby_beginner_6_name=Beginners Battle Ball 7 +nav_venue_sw_lobby_beginner_2/0_desc= +nav_venue_bb_lobby_tournament_5_name=Competitie Battle Ball 6 +nav_venue_bb_lobby_beginner_7_name=Beginners Battle Ball 8 +nav_venue_tearoom_name=Chinese Tea Room +nav_venue_bb_lobby_beginner_14/0_desc= +nav_venue_sw_lobby_beginner_3/0_desc= +nav_venue_bb_lobby_expert_3_name=Experts Battle Ball 4 +nav_venue_sw_lobby_intermediate_2/0_desc= +nav_venue_cafe_ole_name=Cafe ole +nav_venue_sw_lobby_intermediate_3/0_desc=Lumisota sen kuin vain kovenee. +nav_venue_theatredrome_easter/0_desc=Easter is Eco! Now sing the environmentally friendly song. +nav_venue_habbo_lido_name=Habbo Lido +nav_venue_habbo_lido/0_desc=Splish, splash and have a bash in the Habbo pool! +nav_venue_bb_lobby_tournament_5/0_desc= +nav_venue_bb_lobby_tournament_7_name=Competitie Battle Ball 8 +nav_venue_sw_arena_free_name=Playing free for all game +nav_venue_bb_lobby_tournament_9_name=Competitie Battle Ball 10 +nav_venue_sw_lobby_expert_0_name=Snow Marksmen Lobby +nav_venue_bouncer_room_2_name=Gevorderden Battle Ball Arena +nav_venue_chill/0_desc=Where Ideas can flow freely +nav_venue_bb_lobby_tournament_2_name=Competitie Battle Ball 3 +nav_venue_sw_lobby_tournament_0_name=Tournament Lobby +nav_venue_main_lobby/0_desc=The heart of Habbo Hotel +nav_venue_bb_lobby_tournament_10_name=Competitie Battle Ball 11 +nav_venue_cafe_ole/0_desc=Relax with friends over one of Marias specialty coffees +nav_venue_bb_lobby_intermediate_4/0_desc= +nav_venue_sw_arena_beginner_name=Playing beginner game +nav_venue_bb_lobby_amateur_8_name=Gevorderden Battle Ball 9 +nav_venue_main_lobby_name=Main Lobby +nav_venue_bb_lobby_expert_5/0_desc= +nav_venue_bb_lobby_amateur_6/0_desc= +nav_venue_bb_lobby_tournament_10/0_desc= +notifications.text.clubdays.long=You have %days% days and %months% months of Habbo Club remaining. +notifications.text.buyfurni=%furni_name% bought and delivered to your inventory! +notifications.text.friend.online=%user_name% came online. +notifications.text.clubdays=You have %days% days of Habbo Club remaining. +notifications.text.respect.2=You now have %count% respect points. +notifications.text.recycle.ok=Recycling complete! You received a package with mystery content... +notifications.text.achievement=You reached level %level% on %badge%. Click here to see your new badge. +notifications.text.friend.offline=%user_name% went offline. +notifications.text.respect.1=Respect! You were respected. +notifications.text.pixels=%change% pixels received, you now have %count%. +notifications.text.receivedcredits=You received %count% credits. +notifications.text.purchase.ok=You successfully purchased a %productName%! +notifications.text.hcdays=You now have %count% days of Habbo Club left. +notifications.broadcast.title=Message from the Hotel Manager +messenger.info=Choose a friend from your online friend list and send an instant message or an invite. +messenger.error.offline=Your friend is not online. +messenger.error.sendermuted=Your message was not sent because you are muted. +messenger.notification.offline=Your friend went offline. +messenger.notification.online=Your friend came online. +messenger.title=Chat +messenger.moderationinfo=Sharing your password or personal details online is dangerous. The moderators might monitor these conversations for your safety. +messenger.invitation=Your friend sent you an invitation: +messenger.error.receivermuted=Your friend is muted and cannot reply. +messenger.error.busy=Your friend is busy. +messenger.followfriend.tooltip=Go to room your friend is currently in +messenger.error.notfriend=Receiver is not your friend anymore. +messenger.minimail.tooltip=Send minimail to your friend +toolbar.icon.tooltip.help=Help +toolbar.icon.tooltip.roominfo=Information of the room you are currently in +toolbar.icon.tooltip.catalogue=Catalogue for shopping with your Credits and Pixels. +toolbar.icon.tooltip.friendlist=View and follow your friends +toolbar.icon.tooltip.memenu=Dance, wave, use effects, show badges, change clothes and check your rooms +toolbar.icon.tooltip.settings=Settings +toolbar.icon.tooltip.inventory=Your Furniture, Effects, Badges and Achievements +toolbar.icon.tooltip.zoom=Zoom the room view in and out +toolbar.icon.tooltip.navigator=Rooms and events +toolbar.icon.tooltip.messenger=Send messages to your friends +roomevent_type_2=Trading Events +roomevent_default_name=Event name.. +roomevent_not_available=Sorry, no events available +roomevent_type_0=Hottest Events +roomevent_type_6=Grand Opening Events +roomevent_default_description=Come and check out my event! +roomevent_type_5=Debates & Discussion Events +roomevent_default_desc=Event description.. +roomevent_quit=End event +roomevent_type_1=Party & Music Events +roomevent_browser_title=Events +roomevent_create=Create +roomevent_create_name=Type the name of your event +roomevent_type_9=Group Events +roomevent_type_8=Job seeking Events +roomevent_host=Host: +roomevent_type_11=Helpdesk Events +roomevent_type_7=Dating Events +roomevent_type_10=Play and Production Events +roomevent_type_3=Game Events +roomevent_browser_create=Host an event +roomevent_starttime=Started at: +interface_icon_events=Open the room event browser +roomevent_invalid_input=You must give your event a name and a description. +roomevent_create_description=Describe your event +roomevent_edit=Edit +roomevent_type_4=Habbo Guides' Events +help.button.faq=Browse all FAQ topics >> +help.button.faq.topiclist=Go back to list of topics +help.faq.title.urgent=Current issues +help.button.faq.categorylist=Go back to list of categories +help.faq.search.default=Type in keywords to search +help.mainpage.topics.title=Known issues, read these first: +help.cfh.reply.title=Your call has been responded to as follows: +help.cfh.sent.title=Thanks for your call. +help.faq.browse.topics=Click a topic to view questions: +help.cfh.topic.2=Someone is sharing phone numbers or home address +help.button.cfh=Help +help.cfh.pick.topic=Choose a topic for your call that best matches your problem: +help.cfh.error.pending=Your previous call for help has not been answered yet. To make a new one you must delete the old message. +help.cfh.topic.1=Someone is bullying or being abusive +help.cfh.input.text=Please give us more details about what has happened. +help.button.faq.next.entry=View the next issue: +help.button.habboway=Read the community guidelines >> +help.cfh.topic.5=Someone is trying to scam passwords +help.faq.title.searchresults=Search results +help.call.for.guide.bot=A guide bot can be called to help answer any questions you may have. +help.cfh.button.send=Make a help request +help.button.call.guide.bot=Call guide bot +help.cfh.topic.4=Someone is blocking or being disruptive +help.cfh.topic.6=Other problem +help.faq.categories.text=Browse FAQs by category: +help.window.title=Help +help.cfh.error.title=Your call for help was not sent! +help.cfh.topic.3=Someone is asking for webcam contact or photos +help.info.cfh=Click here if you want to make a help request +help.button.habboway.url=http://%predefined%/groups/HabboWay +help.cfh.button.delete=Delete your pending calls for help. +help.faq.title.normal=FAQ Topics +link.help.habboway=http://%predefined%/groups/HabboWay +help.cfh.sent.text=A moderator will investigate the situation and take appropriate action. Please check Service Updates on the FAQs for known technical problems. +item_ad_url_ads_mall_winmus=http://ads.habbogroup.com/max/adclick.php?maxparams=2__bannerid=8303__zoneid=2618__cb=a7f8c3d445__maxdest=http://www.habbo.co.uk/groups/habbomall +item_ad_url_ads_mall_winice=http://ads.habbogroup.com/max/adclick.php?maxparams=2__bannerid=8303__zoneid=2618__cb=a7f8c3d445__maxdest=http://www.habbo.co.uk/groups/habbomall +item_ad_url_ads_mall_winchi=http://ads.habbogroup.com/max/adclick.php?maxparams=2__bannerid=8274__zoneid=2607__cb=a7f8c3d445__maxdest=http://www.habbo.co.uk/groups/theideaagency +item_ad_url_ads_clwall2=http://ads.habbogroup.com/max/adclick.php?maxparams=2__bannerid=7377__zoneid=2208__cb=a7f8c3d445__maxdest=http://www.idea.me.uk +item_ad_url_ads_clwall1=http://ads.habbogroup.com/max/adclick.php?maxparams=2__bannerid=7376__zoneid=2207__cb=a7f8c3d445__maxdest=http://www.childline.org.uk +item_ad_url_ads_clwall3=http://ads.habbogroup.com/max/adclick.php?maxparams=2__bannerid=7378__zoneid=2209__cb=a7f8c3d445__maxdest=http://www.childline.org.uk +item_ad_url_ads_mall_winspo=http://ads.habbogroup.com/max/adclick.php?maxparams=2__bannerid=8303__zoneid=2618__cb=a7f8c3d445__maxdest=http://www.habbo.co.uk/groups/habbomall +item_ad_url_ads_mall_wincin=http://ads.habbogroup.com/max/adclick.php?maxparams=2__bannerid=8303__zoneid=2618__cb=a7f8c3d445__maxdest=http://www.habbo.co.uk/groups/habbomall +item_ad_url_ads_mall_winbea=http://ads.habbogroup.com/max/adclick.php?maxparams=2__bannerid=8303__zoneid=2618__cb=a7f8c3d445__maxdest=http://www.habbo.co.uk/groups/habbomall +item_ad_url_ads_mall_winclo=http://ads.habbogroup.com/max/adclick.php?maxparams=2__bannerid=8303__zoneid=2618__cb=a7f8c3d445__maxdest=http://www.habbo.co.uk/groups/habbomall +infostand.button.rotate=Rotate +infostand.button.report=Report +widgets.memenu.effects.activate=Activate +infostand.button.friend=Ask to be a friend +widgets.memenu.effects.active.timeleft=%time_left% +infostand.button.removerights=Remove rights +infostand.text.handitem=Carrying: %item% +infostand.button.move=Move +infostand.button.pickup=Pick up +infostand.button.ignore=Shut up +infostand.button.trade=Trade +infostand.button.giverights=Give rights +infostand.button.respect=Give respect (%count%) +infostand.button.ban=Ban +infostand.button.kick=Kick +infostand.text.xp=Monthly XP: %xp% +infostand.button.unignore=Listen +badge_desc_XMA=Penguin Competition winner 2008! +badge_name_HX7=Habbo eXpert +badge_name_AC2=Bensalem Tribe Member +badge_desc_ACH_EmailVerification1=For activating your email address and for making it easier to return your password. Worth 200 pixels. +badge_desc_MMC= +badge_name_ACH_Login1=Traveler +badge_desc_WH6=Awarded to competition winners during Habboween 2008. +badge_name_XM1=Rasta Santa +badge_desc_HF1=I was a member of the Habbo Dream Team 2006! +badge_name_ACH_GamePlayed10=Battle Royal X +badge_name_Z04=Environmentalism +badge_desc_BOT=I'm an automated worker at Habbo Hotel. +badge_name_HX5=Habbo eXpert +badge_desc_ACH_AllTimeHotelPresence9=Level 9 - spending total of 1152 hours in hotel. Worth 20 pixels. +badge_name_DK6=Camp Rock Guitar Green +badge_name_FRE=Prehistoric World +badge_desc_Z51=Winner of a 17 Again competition +badge_desc_WH4=Habboween competition /event winner. +badge_name_U02=Idea Agency competition winner! +badge_name_HX3=Habbo eXpert +badge_desc_ACH_GamePlayed5=Level 5 - For playing and winning Snow Storm or for the game of Battle Ball 100 times. Worth 100 pixels. +badge_desc_Z65=Charlie Girl Chic Sleepover competition winner +badge_desc_CY3=Awarded to owners of trials that MeiLing failed. CNY 2009 +badge_desc_Z58=Official Habbo Museum security guard +badge_name_ACH_AllTimeHotelPresence9=Online time IX-Tornado +badge_name_KO1=Koala Face +badge_desc_UKH=Dark is Rising sign of stone. 2007. +badge_name_ACH_AIPerformanceVote10=Notorious X +badge_name_ACH_AIPerformanceVote1=Unknown Star I +badge_name_ACH_AIPerformanceVote2=Hidden Talent II +badge_name_ACH_AIPerformanceVote3=Unique III +badge_name_ACH_AIPerformanceVote4=Noteworthy IV +badge_name_ACH_AIPerformanceVote5=Influental V +badge_name_ACH_AIPerformanceVote6=Famous VI +badge_name_ACH_AIPerformanceVote7=Grand VII +badge_name_ACH_AIPerformanceVote8=Well-known VIII +badge_name_ACH_AIPerformanceVote9=Glorious IX +badge_desc_ACH_AIPerformanceVote1=Level 1 - For gathering a vote on stage. Worth 20 pixels. +badge_desc_ACH_AIPerformanceVote2=Level 2 - For gathering 20 votes on stage. Worth 20 pixels. +badge_desc_ACH_AIPerformanceVote3=Level 3 - For gathering 50 votes on stage. Worth 20 pixels. +badge_desc_ACH_AIPerformanceVote4=Level 4 - For gathering 100 votes on stage. Worth 20 pixels. +badge_desc_ACH_AIPerformanceVote5=Level 5 - For gathering 180 votes on stage. Worth 40 pixels. +badge_desc_ACH_AIPerformanceVote6=Level 6 - For gathering 200 votes on stage. Worth 40 pixels. +badge_desc_ACH_AIPerformanceVote7=Level 7 - For gathering 200 votes on stage. Worth 40 pixels. +badge_desc_ACH_AIPerformanceVote8=Level 8 - For gathering 300 votes on stage. Worth 60 pixels. +badge_desc_ACH_AIPerformanceVote9=Level 9 - For gathering 300 votes on stage. Worth 100 pixels. +badge_desc_ACH_AIPerformanceVote10=Level 10 - For gathering 300 votes on stage. Worth 200 pixels. +badge_desc_Z32=I took a stand against knife crime +badge_desc_UK2=The sole champion of the Always Salon in 2006. +badge_desc_PIR=Arrr! Pirate competition winner May 2006. +badge_name_ACH_Student1=Habbo Student +badge_name_Z29=Blue Insider +badge_desc_ACH_Login8=Level 8 - For logging in 80 days in a row. Sensational. Worth 200 pixels. +badge_desc_NEI=HMF:Neon Epic Party Winner +badge_desc_HM1=Built a room for the Habbo Mall 2009 +badge_desc_UKF=Dark is Rising sign of iron. 2007. +badge_name_Z20=Mall Detective (2/2) +badge_name_VA7=Small Shalimar +badge_desc_Z30=Awarded to all winners and runners up of the pumpkin design competition. October 2008. +badge_desc_ACH_GamePlayed1=Level 1 - For playing and winning Snow Storm or for the game of Battle Ball. Worth 10 pixels. +badge_name_OL2=Habbolympic Silver +badge_desc_Z18=Against cervical cancer campaign supporter. +badge_name_WTM=Safe Surfer +badge_desc_UK4=Habbo Council member. The Habbo Council postponed all future meetings from June 2006. +badge_name_ACH_Motto1=Master of Words +badge_name_DU1=Gold Habbowealth +badge_name_UKA=Summer Resort +badge_name_ST3=Energy Analyst +badge_name_CL1=Idea Agency competition runner-up! +badge_desc_UKD=Adventure Story competition winner 2007. +badge_name_Z71=Orc of the Dark Lord +badge_desc_Z35=Friday's Official Friend +badge_desc_HJ5=Winner of the Harajuku Lovers quest +badge_desc_ACH_RespectGiven1=For giving respect 100 times. Worth 20 pixels. +badge_name_UKC=Habbo Journalist +badge_desc_AR2=Alhambra Prize Winner 2008 +badge_name_HX9=Habbo eXpert +badge_name_UKQ=St Trinian's Head Boy +badge_desc_ST2=You need Science and Maths skills for this job! +badge_desc_ACH_MGM9=Level 9 - For creating your own fellowship - party of 16. For inviting two more real life friends to Habbo. Worth 180 pixels. +badge_desc_VIP=Celebrity guests and special visitors. +badge_name_Z58=Museum Security +badge_desc_ACH_GamePlayed7=Level 7 - For playing and winning Snow Storm or game of Battle Ball 200 times. Worth 150 pixels. +badge_desc_HX9=X Leader +badge_desc_DN2=Roadtrip USA 5 Points 2008. +badge_name_EC4=HabboSphere Contributor +badge_desc_FRE=Winner in the Frederic Santini Comp - Prehistoric. Sep 09. +badge_desc_UKQ=Winner of St Trinians Head Boy competition. +badge_name_UK6=Billboard Designer +badge_name_ACH_MGM7=Housewarming +badge_desc_HX7=Gold Tech eXpert +badge_name_XM3=Xmas Reindeer +badge_desc_DN4=Roadtrip USA 5 Points 2008. +badge_desc_Z02=Celebrating Earth Week 2020 with Habbo! +badge_desc_ACH_RegistrationDuration10=Level 10 - For true Habbos who have been members of the community for 5 years. Worth 200 pixels. +badge_name_FRG=Ultimate Bobba Champ +badge_desc_ACH_AllTimeHotelPresence7=Level 7 - spending total of 288 hours in hotel. Worth 20 pixels. +badge_name_ACH_Login7=Space dust on your shoes +badge_name_EC2=Melting Ice Caps Survivor +badge_desc_SB7=Winner of a Habbo Hood gang competition. September 2008 +badge_name_UKO=Habbo Seeker +badge_name_HX1=Habbo eXpert +badge_desc_Z16=My Spy Family quest 3 winner. +badge_name_UK8=NSPCC +badge_name_Z18=HPV +badge_name_ST5=Sports Technologist +badge_name_ACH_MGM9=Fiesta +badge_name_RLX01=Relax Comp Winner +badge_name_ACH_Login3=Frequent Resident +badge_desc_ACH_RoomEntry7=Level 7 - For hanging out in 120 Guest Rooms that you do not own .Gold digger. 20 pixels. +badge_name_UK015=Official Fame Talent +badge_desc_ACH_AllTimeHotelPresence5=Level 5 - spending total of 48 hours in hotel. Worth 20 pixels. +badge_name_NEI=HMF: Neon Club Winner +badge_name_ACH_RespectEarned2=Been respected 6 times. +badge_name_ACH_AllTimeHotelPresence3=Online time III-Dust Devil +badge_desc_ACH_AllTimeHotelPresence3=Level 3 - spending total of 8 hours in hotel. Worth 20 pixels. +badge_name_HJ4=Harajuku Lovers Love +badge_desc_ACH_GamePlayed9=Level 9 - For playing and winning Snow Storm or the game of Battle Ball 360 times. Worth 280 pixels. +badge_desc_ACH_GamePlayed3=Level 3 - For playing and winning Snow Storm or for the game of Battle Ball 20 times. Worth 50 pixels. +badge_desc_SB3=Shabbolins gang member on the Streets Of Bobba September 2006. +badge_desc_Z28=Awarded to The Insiders poll and quest winners. October 2008. +badge_name_HBA=Gold Hobba +badge_name_NI5=Mythology World +badge_name_UKK=Fantastic4 Bronze +badge_desc_UKZ=Awarded to fashion designers during Fashion Week 2008. +badge_name_ACH_TraderPass1=Trader's Pass +badge_desc_ACH_Graduate1=For completing your confusing Habbo newbie experience. Worth 20 pixels. +badge_name_ACH_RespectEarned4=Been respected 66 times. +badge_name_ACH_RoomEntry5=Vacationer +badge_name_CO5=Gardener +badge_name_VA2=Valentine Heart +badge_desc_YAK=Awarded for competitions during Japanese Sushi campaign. +badge_desc_ACH_MGM8=Level 8 - For creating your own fellowship - party of 14. For For inviting two more real life friends to Habbo. Worth 170 pixels. +badge_desc_UK007=Official Wizard Detective +badge_name_Z36=Hotel For Dogs 1* Resort Owner +badge_desc_UKB=Murder mystery play writing competition winner 2007. +badge_desc_ACH_RegistrationDuration8=Level 8 - For true Habbos who have been members of the community for 3 years. Worth 200 pixels. +badge_desc_ACH_Login4=Level 4 - For logging in 28 days in a row. Scary. Worth 150 pixels. +badge_name_UKS=Perfect Prefect +badge_name_Z31=HMF: Neon Artist +badge_desc_VA3=Awarded to competition winners during Valentine's 2008. +badge_name_ACH_RoomEntry3=Ultimate Room Raider +badge_desc_TC1=BattleBall Challenge involved being in the top 20 highscores for 15 weeks in a row! +badge_desc_ACH_MGM6=Level 6 - For creating your own fellowship - party of 10. For inviting two more real life friends to Habbo. Worth 150 pixels. +badge_name_FAN=Official Fansite Staff +badge_desc_Z69=Friend of the Realm's natural wonders +badge_desc_Z14=My Spy Family quest 2 winner. +badge_desc_U06=Winning a Habbo Raceway Grand Prix. +badge_desc_ACH_RegistrationDuration6=Level 6 - For true Habbos who have been members of the community for a year. Worth 200 pixels. +badge_name_50S=MUZU VJ +badge_name_ACH_RegistrationDuration4=40 % True Habbo +badge_name_Z38=Hotel For Dogs 3* Resort Owner +badge_name_UKU=Theme Park Clown +badge_name_BOT=Habbo Bot +badge_name_GLF=Lynx +badge_name_ACH_AllTimeHotelPresence5=Online time V- Haze +badge_desc_RLX01=Awarded to all winners of Habbo Relax Competitions September 2009. +badge_name_ACH_HappyHour1=Happy Hour +badge_name_UK008=Flint's Meatballs +badge_name_SB2=Bobbaschi +badge_name_Z32=It Doesn't Have To Happen +badge_desc_SU2=Lvl2 Tiki Competition winner. Middle award. Summer 2008. +badge_name_UKM=Fantastic4 Gold +badge_name_SU2=Medium Tiki Mana +badge_name_ACH_GamePlayed4=Battle Royal IV +badge_desc_ACH_RegistrationDuration2=Level 2 - For true Habbos who have been members of the community for 3 weeks. Worth 60 pixels. +badge_name_Z69=Realm Elf +badge_desc_FRG=Ultimate Bobba Wrestling Champion 2008. Kick Wars competition. +badge_name_ACH_RegistrationDuration10=100% True Habbo +badge_name_U06=Habbo Raceway GP +badge_desc_ACH_RoomEntry9=Level 9 - For hanging out in 160 Guest Rooms that you do not own. Spaceman. Worth 30 pixels. +badge_desc_ACH_RespectEarned6=Level 6 - For earning respect a further 200 times. Worth 200 pixels. +badge_name_ACH_AllTimeHotelPresence1=Online time I-Thunderstorm +badge_name_HQ001=Kitchen Survivor +badge_name_WH6=Virus Ooze +badge_desc_DU1=Habbowealth Games 2005. +badge_desc_DSX=Roadtrip USA Room Winner 2008. +badge_desc_ACH_AllTimeHotelPresence1=Level 1 - spending total of 1 hour in hotel. Worth 30 pixels. +badge_desc_WTM=Way too much information! +badge_desc_WH2=Habboween competition /event winner. +badge_desc_ACH_RespectEarned8=Level 8 - For earning respect a further 200 times. Worth 200 pixels. +badge_desc_Z63=Helped shape the new Habbo June 2009 +badge_name_Z60=The Golden Tablet +badge_desc_ST5=You need Science and Maths skills for this job! +badge_name_ACH_RegistrationDuration6=60 % True Habbo +badge_name_AF1=April Fools Day 2009 +badge_desc_AC4=Used the inner Spirit Eagle to find the Lost Tribe of Bensalem +badge_name_SNW=SnowStorm HOF +badge_name_UKX=St Trinian's Quiz +badge_desc_ACH_RespectEarned4=Level 4 - For earning respect a further 50 times. Worth 50 pixels. +badge_name_UKI=Water Sign +badge_name_NWB=Silver Hobba +badge_name_UKE=Tournament King +badge_name_MD1=Meet Dave Quiz +badge_name_Z17=Hairspray Talent +badge_name_HJ2=Harajuku Lovers G +badge_desc_UKS=Winner of the St Trinians perfect prefect competition. +badge_desc_Z24=Official evil scientist! Maximum level. October 2008. +badge_name_ACH_GamePlayed6=Battle Royal VI +badge_desc_AC2=Initiated through the Totem bases of fire GREEN +badge_name_ACH_Login5=A Piece Of The Furniture +badge_name_UKG=Fire Sign +badge_remove=Clear +badge_desc_Z45=HAFTAS Winner 2007 +badge_desc_ACH_RegistrationDuration4=Level 4 - For true Habbos who have been members of the community for 16 weeks. Worth 120 pixels. +badge_desc_FAN=Official Fansite representative. Check out the Official fansite rooms on the upper floors of the Habbo Mall. +badge_name_Z15=Evil Bot Affair +badge_desc_GRR=The Gorillaz visited Habbo in 2005! +badge_desc_MD2=Awarded to winners of the Meet Dave body building competition. 2008. +badge_name_HJ6=Harajuku Lovers Lil' Angel +badge_desc_Z01=Habbo Fashion Week 2008 competition winner. +badge_name_ACH_AllTimeHotelPresence7=Online time VII- Cyclone +badge_name_XXX=Habbo eXpert +badge_name_DN3=Green Fuel Flag +badge_desc_HJ3=Harajuku Lovers Baby +badge_desc_UKW=Theme Park team competition winner. 2008 +badge_desc_ACH_HappyHour1=For spending a Happy moment in Habbo! Log in on Happy Hour to receive this achievement. Worth 100 pixels. +badge_name_HC2=HC Club membership II +badge_name_DS7=Green Tea Elemental +badge_desc_CO4=On the spot prize from the Mayor of Yukka Tree Hill. +badge_name_HC5=HC Club membership V +badge_name_Z12=HBB Champion +badge_name_Z49=Bionicle Quiz Winner +badge_name_UKZ=Fashion Designer +badge_desc_Z49=I showed the intelligence of a Bionicle glatorian! +badge_desc_ACH_RespectEarned3=Level 3 - For earning respect a further 10 times. Worth 20 pixels. +badge_name_DN5=Red Fuel Flag +badge_name_ACH_AvatarLooks1=Looks that Kill +badge_name_Z78=Ice Age Quest Winner +badge_desc_AF1=You got pranked on April Fools Day 2009 +badge_name_GLI=Eagle +badge_name_BE2=Valued BETA tester +badge_desc_NEB=HMF:Neon Fan Club Winner +badge_desc_Z41=HABWrecked Ducks Fan 2009 +badge_desc_EC4=Trying to make Habbo a greener place +badge_name_Z47=Bionicle Quest Winner +badge_desc_AP1=The HABprentice Boardroom Table Member +badge_desc_KO1=For creating the perfect Koala habitat. November 2008. +badge_desc_SB1=Bouncing Queens gang member on the Streets Of Bobba September 2006. +badge_name_DSX=Tourist Expert +badge_desc_ACH_RespectEarned10=Level 10 - For earning respect a further 200 times. Worth 400 pixels. +badge_desc_USP=I successfully found a staff. Nothing stops me anymore! April 2020. +badge_desc_UKK=Fantastic Four Bronze Medallion. 2007. +badge_desc_Z76=The One Ring to rule all other Realm builders +badge_name_OL3=Habbolympic Bronze +badge_name_Z45=HAFTAS Winner 2007 +badge_desc_VA5=Awarded to paired Habbos during Valentine's each year. +badge_name_YAK=Black Dragon +badge_name_AC3=Bensalem Tribe Member +badge_desc_VA8=For making a winning Bollywood Movie. 2009. +badge_desc_UKU=Theme Park entertainment winner. 2008 +badge_name_ACH_GamePlayed2=Battle Royal II +badge_desc_EXH=Hobba volunteer mod until 2006. +badge_desc_RU3=SafeSid Competition Winner +badge_name_ACH_RespectEarned8=Been respected 766 times. +badge_name_ACH_RegistrationDuration1=10 % True Habbo +badge_desc_DU2=Habbowealth Games 2005. +badge_name_Z10=Underage Festival +badge_name_CAG=Atlantis World +badge_name_ACH_MGM2=Luau +badge_desc_Z26=Road Trip USA King badge winner. Awarded to anyone who exchanged 25 Fuel Points. 2008 +badge_desc_XXX=Habbo eXperts are experienced Habbos who answer your questions on Habbo. +badge_name_SHA= +badge_desc_GLE=Level 5 - The clever one - is swift of thought and foot. Sorry. This Achievement is not available at the moment. +badge_name_EXH=Hobba Medal +badge_name_SB7=Habbo Hood Big Flame +badge_name_ACH_RoomEntry8=Sightseer +badge_name_TC1=BattleBall Champ +badge_name_CL3=Idea Agency competition winner! +badge_desc_HC5=Level 5 - For 48 months of Habbo Club membership. Worth 500 pixels. +badge_desc_TC3=SnowStorm Challenge involved being in the top 20 highscores for 15 weeks in a row! +badge_desc_SU3=Lvl3 Tiki Competition winner. Highest award. Summer 2008. +badge_desc_ACH_TraderPass1=Level 1 - Achieved by verifying your email, owning Habbo account for at least 3 days and being online at least 1 h. +badge_desc_ACH_Login5=Level 5 - For logging in 35 days in a row. Amazing. Worth 200 pixels. +badge_name_Z26=Road Trip King +badge_name_SB5=Habbo Hood Small Flame +badge_name_DU3=Bronze Habbowealth +badge_desc_SB5=Selected member of a Habbo Hood Group. September 2008 +badge_name_AC5=The Spirit Squid +badge_name_MTV01=MTV EMA 2009 +badge_desc_Z47=I showed the guile of a Bionicle glatorian! +badge_desc_UK013=Finalist of Habbo Big Brother 2009. +selected_badges=Currently wearing: +badge_desc_U05=Having a Course featured in a Habbo Raceway Grand Prix. +badge_desc_OL2=Awarded to members of the 2nd Habbolympic team 2008. +badge_desc_HX5=Gold Host eXpert +badge_name_SU3=High Tiki Mana +badge_desc_DS7=Elementals Vs Warriors 2007. +badge_name_DN2=Blue Fuel Flag +badge_desc_Z11=Contestant of Habbo Big Brother series1 in July 2008. +badge_desc_DS1=I built the best oldschool room. April 2020. +badge_desc_GLK=Level X - The eXperienced one with the knowledge to show the way. +badge_name_ACH_Login9=Habbo Stayer +badge_name_AP1=The HABprentice Finalist +badge_name_Z24=IGOR EVIL SCIENTIST'S COAT +badge_name_ACH_RegistrationDuration8=80 % True Habbo +badge_name_UK001=Habbo Big Brother Press +badge_desc_ACH_MGM2=Level 2 - For creating your own fellowship - party of 3. For inviting one real life friend to Habbo. Worth 55 pixels. +badge_name_GLK=Head Guide (Wolf) +badge_name_UK014=HBB 09 Contestant +badge_name_Z57=CH Rare Museum +badge_desc_ACH_RoomEntry2=Level 2 - For hanging out in 15 guest rooms that you do not own. Worth 10 pixels. +badge_desc_UK7=Awarded to experts at creating their own quests. +badge_name_XM2=Xmas Elf +badge_name_DS1=OLDSCHOOL +badge_desc_GLI=Level 9 - The sharp eyed one - flying to your aid from afar. Sorry. This Achievement is not available at the moment. +badge_name_Z41=Team Ducks Supporter +badge_name_TC3=SnowStorm Champ +badge_name_ACH_MGM5=Slumber Party +badge_name_CY3=High Yin Yang +badge_desc_ACH_RespectEarned1=Level 1 - For earning respect your first time. Worth 20 pixels. +badge_desc_ACH_Student1=For being guided by a Habbo Guide and to be confused no more. Worth 20 pixels. +badge_name_WH2=Evil Smile +badge_desc_DK5=Camp Rock Winner 2008 +badge_name_Z28=Silver Insider +badge_name_UK006=ChildLine Champion +badge_desc_GLA=Level 1 - The speedy one - Sorry. This Achievement is not available at the moment. +badge_desc_AP2=The HABprentice: Design Edition Boardroom Table Member +badge_desc_CL1=Idea Agency brief runner-up! +badge_name_WH4=Smelly Brain +badge_name_ACH_Graduate1=The Graduate +badge_name_ACH_AllTimeHotelPresence10=Online time X - F5 Tornado +badge_desc_HX2=Safety eXpert +badge_desc_Z39=Tracked the scent and made it to the Hotel +badge_name_Z01=Habbo Model +badge_desc_NWB=Hobbas were volunteer moderators. +badge_name_XM4=Xmas Tree +badge_name_Z07=Gold Graffiti +badge_desc_AC6=Used the inner Angry Spirit Ape to find the Lost Tribe of Bensalem +badge_desc_BE2=Helped shape the new Habbo June 2009 +badge_desc_Z37=Hotel For Dogs 2* Resort Owner +badge_desc_ACH_MGM4=Level 4 - For creating your own fellowship - party of 6. For inviting two more real life friends to Habbo. Worth 130 pixels. +badge_desc_UK001=Member of the Official Habbo Big Brother Press team 2009. +badge_desc_LC3=Completed the quest of Lemuria 02/09 +badge_name_MB2=Madball Yellow Card +badge_desc_CL3=Idea Agency Golden brief winner! +badge_desc_Z72=The Rohirrim, horse lord fighter +badge_desc_XM4=Awarded to everyone who visited Habbo during December 2006. Happy Christmas! +badge_desc_UKO=Awarded to anyone who successfully collected all Dark Is Rising Badges. 2007 +badge_desc_Z07=1st place in the Step Up 2 The Streets dance competition. +badge_name_GLC=Otter +badge_desc_Z20=You found the murderer! +badge_name_ACH_MGM3=Block party +badge_name_AR2=Alhambra Sword +badge_name_ACH_GamePlayed7=Battle Royal VII +badge_desc_U01=Idea Agency brief runner-up! +badge_desc_Z43=HABWrecked Contestant 2009 +badge_desc_MB2=Competition winners during Habbo Madball 2008. +badge_name_UK3=Frank Bus +badge_name_ACH_AvatarTags1=5 words of wisdom +badge_name_Z70=Realm Dwarf +badge_desc_HC3=Level 3 - For 24 months of Habbo Club membership. Worth 300 pixels. +badge_desc_U03=Idea Agency Golden brief winner! +badge_desc_HX3=Tech eXpert +badge_name_HWB=Evil Smile +badge_desc_ACH_RoomEntry4=Level 4 - For hanging out in 50 Guest Rooms that you do not own. Backpacker. Worth 15 pixels. +badge_name_Z72=Realm Horse Lord +badge_desc_HC1=Level 1 - For joining the Habbo Club. Worth 100 pixels. +badge_name_VA5=Wedding Ring +badge_name_Z09=Underage Festival +badge_name_ACH_RespectEarned6=Been respected 366 times. +badge_name_Z22=IGOR HELMET +badge_desc_ACH_Login1=Level 1 - For logging in 5 days in a row. Try it if you dare. Worth 50 pixels. +badge_desc_GLC=Level 3 - The one who will not let you sink under pressure. Sorry. This Achievement is not available at the moment. +badge_name_GLE=Fox +badge_name_Z74=Realm Wizard +badge_desc_UKM=Fantastic Four Gold Medallion. 2007. +badge_desc_Z74=Magical fighter of the Realm +badge_desc_Z22=You have reached LEVEL6. October 2008. +badge_name_Z43=HABWrecked Contestant 2009 +badge_name_Z65=Charlie's Best Friend +badge_name_ACH_GamePlayed9=Battle Royal IX +badge_name_ACH_AllTimeHotelPresence8=Online time VIII- Meso Cyclone +badge_desc_Z57=I visited the Rare Museum +badge_desc_WH5=Musically gifted Habbo! +badge_name_ACH_Login4=High Roller +badge_name_HC3=HC Club membership III +badge_name_VA4=Habborella Crew +badge_desc_ACH_MGM10=Level 10 - For creating your own fellowship - party of 18. For inviting two more real life friends to Habbo. Worth 200 pixels. +badge_desc_CY2=Awarded to owners of trials that MeiLing defeated. CNY 2009 +badge_name_HX8=Habbo eXpert +badge_name_Z05=Habbo X Medal +badge_name_WAR=Peace Protest 2008 +badge_desc_Z05=Habbo eXperts were volunteer helpers between 2006 and 2008. +badge_name_UKF=Iron Sign +badge_desc_WH7=Awarded to competition winners during Habboween 2008. +badge_desc_UKG=Dark is Rising sign of fire. 2007. +badge_name_UKP=Perfect Prefect +badge_name_Z63=Valued BETA tester +badge_name_ST6=Climate Scientist +badge_name_AR1=Alhambra Genie +badge_desc_Z78=Found Scrat's nut - it was big! +badge_desc_UKA=Battle of the Resorts Summer 2007 +badge_name_Z03=Stop Pollution +badge_name_Z51=Zac Efron Fan +badge_name_UKH=Stone Sign +badge_name_UKD=Adventure Story +badge_desc_Z09=Competition winner at the Habbo Underage Festival 2008. +badge_desc_ACH_RegistrationDuration1=Level 1 - For true Habbos who have been members of the community for 3 days. Worth 30 pixels. +badge_desc_Z70=Mines in the Realm for riches +badge_desc_UK3=Frank Bus moderator. +badge_desc_Z17=Hairspray The Musical talent show competition winner! 2008 +badge_name_HX4=Habbo eXpert +badge_desc_WH3=Habboween competition /event winner. +badge_desc_ACH_GamePlayed4=Level 4 - For playing and winning Snow Storm or for the game of Battle Ball 50 times. Worth 80 pixels. +badge_desc_ACH_Login7=Level 7 - For logging in 70 days in a row. Awesome. Worth 200 pixels. +badge_desc_UKY=Awarded to Quest Guild members. You must submit a Quest to enter the guild. +badge_name_ACH_Login2=Preferred Guest +badge_name_ADM=Habbo Staff +badge_name_Z76=My Precious +badge_name_ACH_Login10=Phoenix +badge_desc_ACH_Login9=Level 9 - For logging in 90 days in a row. Extraordinary. Worth 200 pixels. +badge_desc_DN1=Diner Room Winner 2008. +badge_name_OL1=Habbolympic Gold +badge_desc_HJ6=Attended the Harajuku Lovers Hub launch party! +badge_name_WBL=Wobble Squabble HOF +badge_name_HM1=Mall Builder +badge_desc_HWB=Habboween competition badge. +badge_name_UK5=Comic Creator +badge_desc_WBL=Hall of Fame member. Awarded to the top 25 Wobble Squabble players. +badge_desc_HW1=Winning Director of a Habbowood movie. Habbowood ran in both 2006 and 2007. +badge_name_CO6=YTH Champion Villager +badge_name_ST4=Cosmetics Specialist +badge_desc_CL2=Idea Agency Silver brief winner! +badge_name_NEB=Official EPIC Party Host +badge_name_UKR=St Trinian's Head Girl +badge_desc_ACH_AllTimeHotelPresence6=Level 6 - spending total of 144 hours in hotel. Worth 20 pixels. +badge_name_ACH_MGM10=Prom +badge_name_HX2=Habbo eXpert +badge_name_ACH_RoomEntry6=House Guest +badge_name_WH1=Evil Eye +badge_desc_UK5=Habbo comic creator. Comics were displayed on the homepage for 2 weeks during 2007. +badge_desc_GLG=Level 7 - The strong one - the one you can depend on. Sorry. This Achievement is not available at the moment. +badge_name_GLA=Bunny +badge_name_LC3=Lemuria Adventurer +badge_desc_UK9=Japanese quest winner 2007. +badge_desc_Z03=Earth week competition winner. +badge_desc_DN3=Roadtrip USA 15 Points 2008. +badge_desc_ACH_AllTimeHotelPresence8=Level 8 - spending total of 576 hours in hotel. Worth 20 pixels. +badge_desc_Z31=Official Habbo Music Festival Artist +badge_name_UK7=Quest Builder +badge_name_ACH_MGM8=Ball +badge_name_VA3=Habborella Cruise +badge_desc_HX8=Gold Game eXpert +badges_tab_title=My badges +badge_name_AC1=Bensalem Tribe Member +badge_name_EC5=Earth Week Riddle +badge_desc_ST3=You need Science and Maths skills for this job! +badge_desc_ACH_AvatarLooks1=For finally putting some fresh clothes on. Worth 50 pixels. +badge_name_SB1=Bouncing Queens +badge_name_ST2=Digital Designer +badge_name_Z59=History Buff +badge_desc_Z66=Entered an ultimate sleepover room to Charlie +badge_name_UKB=Play Writer +badge_name_Z42=Team Otters Supporter +badge_name_HW1=Habbowood Director +badge_name_Z35=Hotel For Dogs Quest Winner +badge_desc_AC1=Initiated through the Totem bases of fire PINK +badge_name_UK007=Skulduggery Pleasant's Asst. +badge_desc_ACH_RoomEntry10=Level 10 - For hanging out in 200 Guest Rooms that you do not own. Time traveler. Worth 40 pixels. +badge_desc_ACH_RegistrationDuration7=Level 7 - For true Habbos who have been members of the community for 2 years. Worth 200 pixels. +badge_name_UKT=Candy Floss +badge_name_CO4=YTH Prize Winner +badge_name_UKL=Fantastic4 Silver +badge_name_ACH_RoomEntry4=Day tripper +badge_desc_ACH_AllTimeHotelPresence4=Level 4 - spending total of 16 hours in hotel. Worth 20 pixels. +badge_name_ACH_GamePlayed5=Battle Royal V +badge_name_ACH_TraderPass2=Trader's Pass +badge_name_RU3=SafeSid Competition Winner +badge_desc_Z13=Runner Up of Habbo Big Brother series1 in July 2008. +badge_desc_SHA= +badge_desc_ACH_GamePlayed8=Level 8 - For playing and winning Snow Storm or the game of Battle Ball 280 times. Worth 220 pixels. +badge_desc_ACH_RegistrationDuration5=Level 5 - For true Habbos who have been members of the community for 24 weeks. Worth 160 pixels. +badge_desc_ACH_MGM7=Level 7 - For creating your own fellowship - party of 12. For inviting two more real life friends to Habbo. Worth 160 pixels. +badge_name_ACH_RespectEarned1=Been respected once. +badge_name_Z33=It Doesn't Have To Happen +badge_desc_ACH_RoomEntry8=Level 8 - For hanging out in 140 Guest Rooms that you do not own. Orion. Worth 30 pixels. +badge_desc_XM2=Elf Vs Reindeer Christmas 2005 +badge_desc_SU1=Lvl1 Tiki Competition winner. Lowest award. Summer 2008. +badge_desc_SB2=Bobbaschi gang member on the Streets Of Bobba September 2006. +badge_name_ACH_Login8=Rotten tomato +badge_desc_BTB=Hall of Fame member. Awarded to the top 25 BattleBall players. +badge_desc_UK015=Dream it. Earn it. Live it on Habbo +badge_desc_ACH_GamePlayed2=Level 2 - For playing and winning Snow Storm or for the game of Battle Ball 5 times. Worth 30 pixels +badge_desc_ACH_RespectEarned9=Level 9 - For earning respect a further 200 times. Worth 200 pixels. +badge_desc_ACH_Login3=Level 3 - For logging in 15 days in a row. Strange. Worth 120 pixels. +badges_window_title=Badges +badge_name_UK9=Japanese Statue +badge_name_JF2=Japanese Sushi +badge_desc_ACH_RoomEntry6=Level 6 - For hanging out in 80 Guest Rooms that you do not own. Out of towner. Worth 20 pixels. +badge_desc_CO6=Villager at the largest village in Yukka Tree Hill. +badge_name_USP=TRAP! +badge_name_Z39=Hotel For Dogs Maze Winner +badge_desc_ACH_AllTimeHotelPresence10=Level 10 - spending total of 2304 hours in hotel. Worth 20 pixels. +badge_name_Z40=Habbo UK is 8! +badge_name_ACH_AllTimeHotelPresence2=Online time II - Drizzle +badge_name_SB3=Shabbolins +badge_name_ACH_RespectGiven1=Nice as pie! +badge_name_UK012=HBB 09 Winner +badge_name_GLG=Buffalo +badge_name_HJ3=Designed Gwen Stefani an outfit with Harajuku Lovers +badge_desc_ACH_RespectEarned7=Level 7 - For earning respect a further 200 times. Worth 200 pixels. +badge_desc_UKC=Habbo submitted news stories. +badge_name_UKV=Gold Rollercoaster +badge_desc_VA7=For making a really good Bollywood Movie. 2009. +badge_name_BTB=BattleBall HOF +badge_name_ACH_AllTimeHotelPresence6=Online time VI- Jet Stream +badge_desc_UK008=Saved Habbo from a freak weather machine +badge_name_UKJ=Wood Sign +badge_desc_Z33=Play Director and Reviewer extraordinaire +badge_desc_ACH_GamePlayed6=Level 6 - For playing and winning Snow Storm or the game of Battle Ball 160 times. Worth 120 pixels. +badge_name_ACH_RespectEarned3=Been respected 16 times. +badge_desc_ACH_AllTimeHotelPresence2=Level 2 - spending total of 3 hours in hotel. Worth 20 pixels. +badge_name_VA1=Superlove Heart +badge_desc_CAC=Landscape Room Winner 2008. +badge_name_ACH_RoomEntry2=Running Room Raider +badge_name_PIR=Pirate Necklace +badge_name_ACH_RegistrationDuration3=30 % True Habbo +badge_desc_ST4=You need Science and Maths skills for this job! +badge_desc_MD1=Awarded to winners of the Meet Dave quiz competition. 2008. +badge_name_UKW=Silver Rollercoaster +badge_name_SU1=Low Tiki Mana +badge_desc_Z29=Awarded to The Insiders prank competition winners. October 2008. +badge_desc_UKE=I left everything behind and was able to win. April 2020. +badge_desc_ADM=Habbo Employees including London office staff. If their Habbo name has MOD in it, then they are Moderators. +badge_name_U01=Idea Agency competition runner-up! +badge_name_ACH_EmailVerification1=True You +badge_desc_EC2=Won a Love The Earth event +badge_name_CL2=Idea Agency competition winner! +badge_desc_AC3=Initiated through the Totem bases of fire BLUE +badge_name_ACH_Login6=Covered with moss +badge_name_WH7=Virus Blood +badge_desc_Z27=Road Trip USA Queen badge winner. Awarded to anyone who exchanged 25 Fuel Points. 2008 +badge_desc_HJ2=I'm an official Harajuku Lovers girl +badge_name_Z14=Briefcase Affair +badge_name_ACH_GamePlayed3=Battle Royal III +badge_desc_CAG=Winner in the Frederic Santini Comp - Atlantis. Sep 09. +badge_desc_Z19=You have reached LEVEL4. October 2008. +badge_desc_UK006=A true ChildLine ambassador +badge_name_DK5=Camp Rock Guitar Blue +badge_desc_ACH_RespectEarned5=Level 5 - For earning respect a further 100 times. Worth 100 pixels. +badge_desc_HJ4=Member of the Cool Japan Quiz winning team +badge_desc_Z60=Built a Museum room to house a replica tablet +badge_name_ACH_AllTimeHotelPresence4=Online time IV - Blizzard +badge_name_Z16=Newspaper Affair +badge_desc_ACH_Motto1=For editing your motto & letting us know how you're feeling. Worth 10 pixels. +badge_name_Z66=Charlie Girl Chic Competitor +badge_name_U03=Idea Agency competition winner! +badge_desc_Z59=Master of the history quest +badge_name_Z37=Hotel For Dogs 2* Resort Owner +badge_name_HX6=Habbo eXpert +badge_desc_ACH_RegistrationDuration3=Level 3 - For true Habbos who have been members of the community for 8 weeks. Worth 90 pixels. +badge_name_MD2=Meet Dave Body +badge_desc_WH1=Habboween competition /event winner. +badge_desc_UKR=Winner of St Trinians Head Girl competition. +badge_name_Z68=The Dark Lord's Wraiths +badge_desc_Z15=My Spy Family quest 1 winner. +badge_name_HJ5=Harajuku Lovers Music +badge_desc_Z68=He sees all, and I search for him +badge_name_U05=Habbo Raceway Course +badge_name_ACH_MGM1=Baby Shower +badge_name_GLH=Bear +badge_name_Z46=HAFTAS Winner 2009 +bage_name_XMA=Christmas 2008 comp winner +badge_name_HF1=Golden Football Boot +badge_name_Z13=HBB Runner Up +badge_name_ACH_RoomEntry10=Pilgrim +badge_desc_UKJ=Dark is Rising sign of wood. 2007. +achievements_desc=Achievements are tasks that you can do in Habbo Hotel. For each Achievement you receive a badge and some pixels +badge_desc_Z42=HABWrecked Otters Fan 2009 +badge_name_UKY=Quest Guild +badge_name_ACH_RegistrationDuration5=50 % True Habbo +badge_desc_VA1=Awarded to the two superlove champions Valentine's 2006. +badge_desc_UKX=Winner at the St Trinian's Quiz competiton 2008. +badge_name_Z48=Bionicle Kick Wars Winner +badge_desc_UKV=Theme Park team competition champion. 2008 +badge_name_DN4=Pink Fuel Flag +badge_desc_SNW=Hall of Fame member. Awarded to the top 25 SnowStorm players. +badge_desc_HC4=Level 4 - For 36 months of Habbo Club membership. Worth 400 pixels. +badge_desc_Z25=You have reached LEVEL1. October 2008. +badge_desc_ATW=Globetrekker competition winner. Country room is in our Globetrekker Tour Guide 2008. +badge_name_ACH_GamePlayed1=Battle Royal I +badge_name_Z77=HARD2BEAT Glowstick +badge_desc_UKT=Theme Park creative competition winner. 2008 +badge_desc_UKN=Awarded to winners of the 2007 HAFTAs where rooms were built based on films. +badge_desc_ST6=You need Science and Maths skills for this job! +badge_desc_ACH_Login10=Level 10 - For logging in 100 days in a row. Breathtaking. Worth 200 pixels. +badge_desc_CO5=I submitted my room to the Flower Power Room Competition! June 2020. +badge_desc_EC5=Found the Tree within. +badge_name_ACH_RoomEntry1=Room Raider +badge_name_AC4=The Spirit Eagle +badge_desc_HUB=For entering our Infobus Session in April 2020. +badge_desc_Z44=HABWrecked Overall Winner 2009 +badge_name_ACH_RegistrationDuration2=20 % True Habbo +badge_name_HC1=HC Club membership I +badge_desc_DU3=Habbowealth Games 2005. +badge_desc_HQ001=Kitchen Survivor Competition winner. September 2009. +badge_name_CY2=Low Yin Yang +badge_name_XM9=Arctic Snowballers! +badge_desc_SB4=Furnihilists gang member on the Streets Of Bobba September 2006. +badge_desc_ACH_Login6=Level 6 - For logging in 60 days in a row. Phenomenal. Worth 200 pixels. +badge_desc_XM3=Reindeer Vs Elf Christmas 2005 +badge_desc_HX4=Game eXpert +badge_name_SB4=Furnihilists +badge_name_DN1=Diner Expert +badge_name_ACH_RoomEntry9=Habitué +badge_name_Z11=HBB Contestant +badge_name_Z30=Pumpkin Design +badge_desc_VA4=Habborella cruise ship staff Valentine's 2008. +badge_name_UKN=HAFTAs Award +badge_desc_UK8=NSPCC campaign badge. Stop Bullying. Full stop. +badge_desc_UKP=Winner of the St Trinians perfect prefect competition. +badge_name_ACH_RoomEntry7=Traveler +badge_name_KIR=Keep It Real +badge_desc_Z40=I celebrated Habbo UK's 8th birthday, 17/1/2009 +badge_name_Z25=IGOR GOGGLES +badge_desc_UK012=Winner of Habbo Big Brother 2009 +badge_name_ACH_RegistrationDuration7=70 % True Habbo +badge_name_UK013=HBB 09 Runner Up +badge_desc_UK014=Contestant of Habbo Big Brother 2009. +badge_desc_TC2=Wobble Squabble Challenge involved being in the top 20 highscores for 15 weeks in a row! +badge_desc_HBA=Hobbas were volunteer moderators. +badge_desc_VA2=Awarded to competition winners during Valentine's week each year. +badge_desc_ACH_RoomEntry5=Level 5 - For hanging out in 60 Guest Rooms that you do not own. Globetrotter.Worth 15 pixels. +badge_desc_OL3=Awarded to members of the 3rd Habbolympic team 2008. +badge_desc_Z10=Competition winner at the Habbo Underage Festival 2008. +badge_name_ACH_RespectEarned10=Been respected 1166 times. +badge_desc_Z46=HAFTAS Winner 2009 +badge_desc_Z23=You have reached LEVEL2. October 2008. +badge_desc_ACH_RegistrationDuration9=Level 9 - For true Habbos who have been members of the community for 4 years. Worth 200 pixels. +badge_name_ACH_RegistrationDuration9=90 % True Habbo +badge_desc_ACH_TraderPass2=Level 2 - Achieved if you have been busy trading your stuff. Keep it up! +badge_desc_Z48=I showed the strength of a Bionicle glatorian! +badge_desc_XM1=Rasta Santa was awarded during Christmas 2005. He visited the hotel December 2006. +badge_desc_Z04=Earth Week 2020 +badge_desc_MTV01=Member of the MTV EMA 2009 Group. +badge_name_ACH_MGM6=Reunion +badge_name_WH3=Vampire Fangs +badge_name_Z02=Earth Week 2020 +badge_name_Z56=The Buzz Brain of Habbo +badge_name_Z27=Road Trip Queen +slots_full=5 badges worn! +badge_desc_Z71=Henchman of the Dark Lord +badge_name_HUB=Infobus Session April +badge_desc_KIR=Keep It Real competition winner. Don't forget to keep it 100% Habbo! +badge_desc_U02=Idea Agency Silver brief winner! +badge_desc_AP3=A winner or runner-up in the HABprentice: Designer Edition tasks +badge_desc_ACH_GamePlayed10=Level 10 - For playing and winning Snow Storm or the game of Battle Ball 440 times. Worth 340 pixels. +badge_wear=Wear +badge_name_TC2=Wobble Squabble Champ +badge_save=Save +badge_desc_WAR=Awarded for attending the Peace Protest in 2008 or responding correctly to the Peace Poll. +badge_desc_ACH_RespectEarned2=Level 2 - For earning respect a further 5 times. Worth 20 pixels. +badge_desc_DK6=Camp Rock Winner 2008 +badge_desc_ACH_RoomEntry3=Level 3 - For hanging out in 30 guest rooms that you do not own. Worth 15 pixels. +badge_desc_UK6=Billboard design winner. Billboards were displayed in the Gallery Cafe for 2 weeks during 2007! +badge_name_GLJ=Owl +badge_desc_Z08=2nd place in the Step Up 2 The Streets dance competition. +badge_desc_OL1=Awarded to members of the 1st Habbolympic team 2008. +badge_desc_Z73=Fights for the Dark Lord of the Realm +badge_desc_GLH=Level 8 - The friendly one - kind and always there. Sorry. This Achievement is not available at the moment. +badge_desc_HX6=Gold Safety eXpert +badge_name_AP2=Official HABprentice Designer 2009 +badge_desc_BE1=Helped shape the new Habbo June 2009 +badge_desc_DN5=Roadtrip USA 10 Points 2008. +badge_name_Z19=IGOR BUBBLING BEAKER +badge_name_ST1=Sound Engineer +badge_name_CAC=Landscape Expert +badge_name_UK002=Habbo Mall Cop +badge_desc_ACH_MGM1=Level 1 - For creating your own fellowship - party of 2. For inviting one real life friend to Habbo. Worth 50 pixels. +badge_name_AC6=The Angry Spirit Ape +badge_name_ACH_GamePlayed8=Battle Royal VIII +badge_desc_ACH_RoomEntry1=Level 1 - For hanging out in 5 guest rooms that you do not own. Worth 5 pixels. +badge_desc_GLJ=Level 10 - The old and wise one - loyal, with a heart of gold. Sorry. This Achievement is not available at the moment. +badge_name_Z75=Realm Protectors +badge_desc_ACH_AvatarTags1=For tagging yourself with 5 tags. Use your words wisely. Describe yourself for a wicked match! Worth 50 pixels. +badge_desc_ACH_MGM3=Level 3 - For creating your own fellowship - party of 4. For inviting one real life friend to Habbo. Worth 60 pixels. +badge_name_WH5=Purple Guitar +badge_desc_AR1=Alhambra Prize Winner 2008 +badge_name_GRR=Gorillaz Celeb Visit +badge_desc_GLD=Level 4 - The digger one - has information you cannot find. Sorry. This Achievement is not available at the moment. +badge_desc_Z77=Winner of a Celebrity Visit competition from HARD2BEAT Records. +badge_name_ACH_RespectEarned9=Been respected 966 times. +badge_name_Z08=Silver Graffiti +badge_desc_XM9=For Arctic Maze survivors! +badge_desc_AC5=Used the inner Spirit Squid to find the Lost Tribe of Bensalem +badge_name_Z73=Warrior of the Dark Lord +badge_name_DU2=Silver Habbowealth +badge_name_GLB=Bambi +badge_name_UK2=Always Salon Champ +badge_desc_ACH_MGM5=Level 5 - For creating your own fellowship - party of 8. For inviting two more real life friends to Habbo. Worth 140 pixels. +badge_name_VIP=VIP Pass +badge_desc_UK002=Paul Blart: Mall Cop quiz winner +badge_desc_Z06=3rd place in the Step Up 2 The Streets dance competition. +badge_desc_GLB=Level 2 - The loving one - Sorry. This Achievement is not available at the moment. +badge_name_UK4=Habbo Council +badge_desc_HX1=Host eXpert +badge_name_ACH_MGM4=Dance Party +badge_desc_Z21=You have reached LEVEL3. October 2008. +badge_name_MB1=Madball Red Card +achievements_tab_title=Achievements +badge_name_ACH_RespectEarned7=Been respected 566 times. +badge_name_ATW=Globetrekker +badge_desc_HC2=Level 2 - For 12 months of Habbo Club membership. Worth 200 pixels. +badge_desc_Z36=Hotel For Dogs 1* Resort Owner +badge_name_VA8=Large Shalimar +badge_desc_JF2=Awarded to everyone who opened a Sushi Parlour that was visited and endorsed by Kitsune. 2008 +badge_name_ACH_RespectEarned5=Been respected 166 times. +badge_name_BE1=Official BETA tester +badge_name_Z06=Bronze Graffiti +badge_desc_UKI=Dark is Rising sign of water. 2007. +badge_desc_Z75=A protector of the Realm +badge_name_Z23=IGOR BUNSEN BURNER +badge_desc_Z12=Winner of Habbo Big Brother series1 in July 2008. +badge_desc_ACH_Login2=Level 2 - For logging in 8 days in a row. Weird. Worth 80 pixels. +badge_name_GLD=Badger +badge_desc_Z56=I've got the biggest brain in all of Habbo! +badge_desc_NI5=Winner in the Frederic Santini Comp - Mythology. Sep 09. +badge_name_MMC= +badge_desc_GLF=Level 6 - The hunter - stalks down the answers. Sorry. This Achievement is not available at the moment. +badge_desc_50S=Winner of the MUZU VJ Playlist competition. Enter now at /groups/MUZU +badge_name_Z44=HABWrecked Winner 2009 +badge_name_HC4=HC Club membership IV +badge_desc_Z38=Hotel For Dogs 3* Resort Owner +badge_desc_UKL=Fantastic Four Silver Medallion. 2007. +badge_desc_MB1=Overall champions of Habbo Madball 2008. +badge_desc_ST1=You need Science and Maths skills for this job! +badge_name_Z21=IGOR PINCERS +fx_12_desc=Ice cold! +fx_18=UFO in yellow +fx_4_desc=Twinkle like the star you are. +object_displayer_fx=%fx (%t) +fx_19=BluesMobile +fx_5=Torch +fx_bubbles=Forever blowing bubbles! +fx_26=totem_mix_name +fx_18_desc=Unidentified yellow flying object. +fx_17_desc=Fly away with this UFO of love. +fx_20_desc=How can I help? +fx_16=Microphone +fx_25=totem_eagle_name +fx_22_desc=This is black sunshine! +fx_11_desc=X-Rayed +fx_explosion=Explosions +fx15=Hover board +fx_flare=Flares! +fx_4=Twinkle +fx_20=HelpMobile +fx_12=Frozen +fx_1_desc=Shine the light on me! +fx_9=Love +fx_9_desc=Love is in the air. +fx_11=X-Ray +fx_7=Butterfly effect +fx_8=Fireflies +fx_8_desc=Light my fire +fx_6=HRJP-3000 +fx_24_desc=totem_merdragon_desc +fx_17=UFO in pink +fx_24=totem_merdragon_name +fx_21=RebelMobile +fx_3_desc=Help, I'm being abducted. +fx_19_desc=We're on a mission from god. +fx_16_desc=Habbo Dragonfly microphone +fx_26_desc=totem_mix_desc +fx15_desc=The future of transportation in yellow. +fx_6_desc=Habbo Rocket Jet Pack. +fx_15=Yellow hover board +fx_10_desc=Get a shower! +fx_2=Hover board +fx_21_desc=Drive like lightning, crash like thunder! +fx_23_desc=totem_man_desc +fx_13_desc=Spooky +fx14_desc=The future of transportation in pink. +fx_3=UFO +fx_10=Flies +fx_13=Ghost +fx_25_desc=totem_eagle_desc +fx_14_desc=See the world on pink hover board. +fx14=Hover board +fx_1=Spotlight +fx_23=totem_man_name +fx_5_desc=Light the dark corners of your existence. +fx_7_desc=Let the butterflies flap their wings. +fx_22=BadMobile +fx_14=Pink hover board +fx_2_desc=The future of transportation. +fx_15_desc=As yellow as a submarine. +navigator.frontpage.staticsearch.1=Popular Rooms +navigator.embed.info=The HTML code in below field allows you to embed this room to a web page. Copy the code to your clipboard to apply it to a web page. +navigator.password.button.try=Try password +navigator.roominfo.removefromfavourites=Remove from favorites +navigator.roominfo.addtofavourites=Add to favorites +navigator.roomownercaption=Owner: +navigator.tab.3=Friends +navigator.cannotcreateevent.error.5=Room already has an event. +navigator.createevent=Create event +navigator.roomsettings.deleteroom.confirm.message=Are you sure you want to delete %room_name%? YOU WILL PERMANENTLY LOSE ALL FURNITURE IN THIS ROOM. They will be gone forever. +navigator.loading=Loading... +navigator.tab.4=Search +navigator.createroom.hcpromo.text=You get more room options if you join the Habbo Club, the Club of most active Habbos +navigator.roomrating=Rating: +navigator.password.retryinfo=Wrong password. Please retry, or cancel entering the room. +navigator.navibutton.11=Public Rooms +navigator.thumbeditor.selectpos=Define place: +navigator.navisel.highestscore=Rooms with highest scores +navigator.eventstartedat=Started at: +navigator.removefavourite=Remove Favourite +navigator.thumbeditor.nextobj=Next +navigator.roomsettings.doormode.password=Require a password to enter room +navigator.navisel.visitedrooms=Room I've recently visited +navigator.eventsettings.nameerr=You must choose a name for you event +room.queue.spectator.position.hc=Your position in the HC spectator queue: %position% +navigator.navibutton.10=Front Page +navigator.roomsettings.save=Save settings +navigator.usercounttooltip.friends=Amount of friends are in this room +navigator.moreroomscaption=Want more rooms? +navigator.rateroom=Rate this room +navigator.favouritesfull.body=Your favourite list is full. You must remove some favourite rooms before adding more. +navigator.navisel.mainattractions=Main attractions +navigator.roomsettings.doormode.open=Open, anyone can enter +navigator.search.info=Type your search words here... +navigator.navibutton.1=Popular Rooms +room.queue.error.c=This room is for Habbo Club members only. In order to enter, you need to subscribe to Habbo Club. Check your Catalogue for details. +navigator.navisel.alllatestevents=Latest Events +navigator.roominfo.makehome=Make home room +navigator.password.enter=Enter password +navigator.eventsettings.edit=Edit +navigator.roomsettings.flatctrls.limitinfo=Showing first %cnt% users, most recently added users first. +navigator.navisel.myfavourites=My favourite rooms +navigator.roomsettings.unacceptablewords=Unacceptable words! +navigator.roomsettings.passwordismandatory=You must enter a valid password +navigator.remove=Remove +navigator.embed.caption=Embed this room +navigator.roominfo.sethomeroom=Home +navigator.doorbell.title=Doorbell +navigator.roomsettings.basiccaption=Basic room settings +navigator.navisel.myrooms=Rooms owned by me +room.queue.error.title=Cannot enter room! +room.queue.position.hc=Your position in the HC queue: %position% +navigator.thumbeditor.bgtab=Background image +navigator.cannotcreateevent.error.2=Only room owner can create events. +room.queue.button.exit=Exit queue +navigator.frontpage.staticsearch.9=Tag Search +navigator.thumbeditor.save=Save +navigator.roomsettings.flatctrls.info=Choose users from the list above and then click "remove" to take away their rights to this room. Click on Remove All to remove rights from all users. +room.queue.spectatormode=Change to spectator view +navigator.doorbell.info=This room is locked. You need to ring the doorbell to enter. If you ring the doorbell, you will have to exit this room. +navigator.roomsettings.delete=Delete this room +navigator.thumbeditor.caption.bg=Select background image +navigator.create=Create +navigator.roominfo.clearhome=Remove home +navigator.createroom.hcpromo.link=Click here to read more >> +navigator.roominfo.clearhome.tooltip=This room is your Home Room. Click here to remove your Home Room setting. +navigator.roomsettings.doormode.doorbell=Visitors have to ring the doorbell +navigator.roomctg=Category: +room.queue.spectator.info=In spectator mode you can spectate the room. +navigator.thumbeditor.objtab=Icons +navigator.thumbeditor.prevobj=Prev +navigator.usercounttooltip.staticsearch=Amount of users in rooms that match this search +navigator.tab.2=Me +navigator.frontpage.staticsearch.5=My Rooms +navigator.roomsettings.advancedcaption=Advanced room settings +room.queue.link=Habbo Club members bypass the queue! Read more >> +navigator.embed.copytoclipboard=Copy to clipboard +navigator.makefavourite.tooltip=Click here to add this room to your favourites list. +navigator.guestroomfull.text=Sorry, the room you tried to enter is full. +navigator.frontpage.staticsearch.6=Favourite Rooms +navigator.navibutton.12=Events +navigator.title=Navigator +navigator.cannotcreateevent.error.1=You must be in a room to start an event. +navigator.navisel.wherearemyfriends=Rooms where my friends are +navigator.cannotcreateevent.title=Cannot Create event. +navigator.roomsettings.tobasicsettings=Basic settings +navigator.createroom=Create room +navigator.tab.special=Public +navigator.thumbeditor.caption.obj=Select image for the top +navigator.doorbell.no.answer=No answer. +navigator.eventsettings.descerr=Event description is mandatory +room.queue.position=Your position in the queue: %position% +navigator.frontpage.staticsearch.4=Where are my friends? +navigator.tab.1=Everyone +navigator.navibutton.9=By Category +navigator.favouritedeleted=Favourite %room_name% deleted! +navigator.frontpage.officialrooms=Official Habbo Rooms +navigator.roomsettings.removeallflatctrls=Remove all +navigator.editroom=Edit Room +navigator.error.nosuchflat.title=Could not delete room +navigator.tohotelview.tooltip=Exit current room. +navigator.roomsettings.invalidconfirm=The passwords don't match +navigator.roomsettings.nonuserchoosabletag=Reserved for staff use +navigator.thumbeditor.caption=Edit Navigator room icon +navigator.navibutton.3=My Friends' Rooms +navigator.createroom.tilesize=tiles +navigator.usercounttooltip.users=Amount users currently in this room +navigator.noroomsfound=No rooms found +navigator.createroom.title=Room creation +navigator.embed.src= +navigator.eventsettings.name=Event name +navigator.favouritesfull.title=Cannot add favorite +navigator.eventsettings.editcaption=Edit event +navigator.ratingcaption=Rating: +navigator.password.info=This room is locked with a password. If you want to try to insert a password, you will be moved from this room. +navigator.roomsettings.desc=Add a description +navigator.searchusers=Search users +navigator.tab.rooms=Rooms +room.queue.title=Room queue +navigator.roomsettings.roominfo=Room info +navigator.info.doorbell=Room door is locked. Owner may open the door from inside. +navigator.doorbell.waiting=The doorbell is ringing, waiting for someone to open the door... +navigator.cannotcreateevent.error.4=Room event feature is currently disabled. +navigator.roomsettings.roomnameismandatory=You must enter a name for your room +navigator.roomsettings=Room settings +navigator.navibutton.2=Highest Score +navigator.createroom.error=Cannot create room +navigator.cannotcreateevent.error.3=The door of the room must be open to create an event. You can change the door mode in room settings. +navigator.thumbeditor.caption.top=Select image for the top +navigator.roomsettings.editthumbnail=Edit navigator icon +navigator.guestroomfull.title=Cannot enter room! +navigator.thumbeditor.toptab=Top layer +navigator.tab.events=Events +navigator.frontpage=Front page +navigator.textsearchresults=Found %room_count% rooms +navigator.createroom.limitreached=You are not allowed to own more than %limit% rooms. +navigator.eventsettings.desc=Event description +navigator.search.tags=...or select tag below +navigator.notagsfound=No popular tags found +navigator.tab.search=Search +navigator.banned.text=Sorry, but the owner of this room has banned you. Therefore you cannot enter this room. Please try another room. +navigator.cannonaddfavourite.exists=This room is already in your favourites. +navigator.password.title=Password +navigator.createroom.nameerr=Room name is mandatory! +navigator.doorbell.button.ring=Ring doorbell +navigator.roomsettings.toadvancedsettings=Advanced settings +navigator.usercounttooltip.populartag=Amount of users in rooms that have this tag +navigator.tagsearchresults=Found %room_count% rooms matching %tag_name% +navigator.roomsettings.doormode=Access to this room: +navigator.navibutton.4=Where Are They? +navigator.roomname=Room name +navigator.roominfo.editevent=Edit event +navigator.navibutton.5=My Rooms +navigator.category=Category +navigator.error.nosuchflat.message=Could not delete the room, since it doesn't exist or you are not the owner. +navigator.undofavouritedeletion=Undo +navigator.createroom.chooselayoutcaption=Choose room layout +room.queue.back=Back to visitor queue +navigator.info.password=Password in required when entering this room. +room.queue.spectator.position=Your position in the spectator queue: %position% +navigator.back=Back +navigator.frontpage.staticsearch.8=Text Search +navigator.roominfo.makehome.tooltip=Set this room as your Home Room. You automatically enter your Home Room when you enter Habbo. +navigator.roomsettings.password=Password for the room: +navigator.cannotcreateevent.error.6=You already have an ongoing event in some other room. +navigator.roomsettings.flatctrls.caption=%cnt% users have rights to this room +navigator.navibutton.7=Visited rooms +navigator.createroom.create=Create room +navigator.navisel.popularrooms=Rooms with most visitors +navigator.tags=Tags +navigator.banned.title=You are banned from this room. +navigator.roomsettings.deleteroom.confirm.title=Confirm room deletion +navigator.roomsettings.passwordconfirm=Re-type password: +navigator.tab.me=Me +navigator.info.tradingallowed=Trading is allowed in this room. +navigator.cannonaddfavourite.full=Your favourite list is full. +navigator.clearsearchresults=Clear results +navigator.createroom.chooselayout=Choose +navigator.doorbell.button.cancel.entering=Cancel entering the room +navigator.eventsettings.end=End +navigator.navibutton.6=My Favourites +room.queue.error.e1=This room is currently available only to Habbos participating to the event. +navigator.navisel.myfriendsrooms=Rooms owned by my friends +navigator.createroom.roomnameinfo=Room name +poll_offer_later=Later +poll_question_number=Question %number%/%count% +poll_offer_title=Poll +poll_cancel_confirm_long=Are you sure you want to stop answering the poll? You can't continue later. +poll_cancel_confirm_short=Stop answering? +poll_offer_window=Poll +poll_thanks_title=Thanks! +poll_question_title=Question +poll_alert_answer_missing=Please give an answer +poll_cancel_confirm_title=Cancel poll +inventory.furni.item.song_disk_author="%name%" by %author% +inventory.trading.info.already_open=You are already trading with someone and you cannot start a new trade. +inventory.furni=Furniture +inventory.badges.wearbadge=Wear badge +inventory.trading.accept=Accept trade +inventory.trading.minimized.continue_trade=Continue +inventory.trading.modify=Modify trade +inventory.furni.tab.wall=Wall +inventory.furni.placetoroom=Place to room +inventory.trading.areoffering=are offering +inventory.trading.offer=Offer +inventory.purse.creditbalance=Credits: %balance% +inventory.effects.active=This effect is activated. Time left %timeleft%/%duration%. You have %itemcount% pieces of these. +inventory.furni.item.floor.desc=Set this to the current room +inventory.purse.pixelbalance=Pixels: %balance% +inventory.trading.confirm=Confirm +inventory.purse.clubdays=Habbo Club: %months%m %days%d +inventory.badges.clearbadge=Clear badge +inventory.trading.warning.other_not_offering=The other Habbo has not put anything into trade. This might be a scamming attempt! +inventory.trading.warning.own_account_disabled=This account does not have trading in use. You can receive items from other users but cannot give them anything. Check your trading settings and make sure your email-address is activated. +inventory.trading.countdown=Please wait... %counter% +inventory.badges.defaultdescription=Here are your badges. Select the ones that you want to wear and then save the selection. +inventory.furni.preview.tradeable_amount=You have this many items that can be traded +inventory.furni.item.landscape.name=Landscape +inventory.trading.minimized.trade_in_progress=Trade in progress +inventory.trading.notification.title=Trading Notification +inventory.trading.info.waiting=Waiting for other user to confirm the trade. +inventory.effects.inactive=This effect is not yet activated. One item last for %duration%, once activated. You have %itemcount% pieces of these. +inventory.furni.preview.recyclable_amount=You have this many items that can be recycled +inventory.furni.item.wallpaper.name=Wallpaper +inventory.effects.defaultdescription=No effect is selected. Buy effects from the catalogue and activate them here. Then you can select which one to use from the Me Menu. +inventory.furni.item.wallpaper.desc=Set this to the current room +inventory.title=Inventory +inventory.achievements=Achievements +inventory.badges.savebadges=Save settings +inventory.trading.isoffering=is offering +inventory.trading.info.confirm=These are the final offers. Please confirm the trade. +inventory.trading.other=Other +inventory.trading.info.add=Add items to box. +inventory.trading.warning.both_accounts_disabled=Trading is not in use for either of you, check your trading settings. +inventory.badges.inactivebadges=My badges +inventory.furni.item.landscape.desc=Set this to the current room +inventory.furni.preview.not_tradeable=None of these items are tradeable +inventory.furni.preview.not_recyclable=None of these items are recyclable +inventory.trading.warning.others_account_disabled=This user does not have trading in use. You can give him/her items but he can't give you anything in return. +inventory.effects=Effects +inventory.trading.you=You +inventory.badges=Badges +inventory.furni.tab.floor=Floor +inventory.badges.activebadges=Wearing +inventory.furni.item.floor.name=Floor +inventory.trading.info.closed=Other user cancelled the trade. +poster_1000_desc=The Noble and Silver Show +poster_1000_name=Comedy Poster +poster_1001_desc=even walls have ears +poster_1001_name=Prince Charles Poster +poster_1002_desc=For our UK Habbos. +poster_1002_name=Queen Mum Poster +poster_1003_desc=The lovely Isles for your wall. +poster_1003_name=UK Map +poster_1004_desc=Celebrate with us +poster_1004_name=Eid Mubarak Poster +poster_1005_desc=The muscly movie hero. +poster_1005_name=Johnny Squabble +poster_1006_desc=The eyes follow you... +poster_1006_name=Jack-o-Lantern +poster_10_desc=A beautiful sunset. +poster_10_name=Lapland Poster +poster_11_desc=For the accomplished Habbo. +poster_11_name=Certificate +poster_12_desc=Skyscrapers at night. +poster_12_name=Skyline Poster +poster_13_desc=Skyscrapers in black and white. +poster_13_name=BW Skyline Poster +poster_14_desc=A truly cunning design. +poster_14_name=Fox Poster +poster_15_desc=Marvellous mountains. +poster_15_name=Himalaya Poster +poster_16_desc=High security for your room. +poster_16_name=Bars +poster_17_desc=Flutter by. +poster_17_name=Butterfly Cabinet 1 +poster_18_desc=Flutter by. +poster_18_name=Butterfly Cabinet 2 +poster_19_desc=Trying to get in or out? +poster_19_name=Hole In The Wall +poster_1_desc=Behold the root of thine genealogy! +poster_1_name=Ancestress +poster_2000_desc=You know where to put it. +poster_2000_name=Map of Finland +poster_2001_desc=Not to be worn. +poster_2001_name=Rug on the Wall +poster_2002_desc=Whoever he is he looks important. +poster_2002_name=Guy With Glasses +poster_2003_desc=Carlos, diskotappaja +poster_2003_name=Carlos +poster_2004_desc=Every little thing is gonna be alright +poster_2004_name=Rastaman Poster +poster_2005_desc=Infobus +poster_2005_name=Infobus +poster_2006_desc=The legendary DJ himself! +poster_2006_name=DJ Throne +poster_2007_desc=The FATHER of Habbo Hotel! +poster_2007_name=The Father of Habbo +poster_2008_desc=Got Frog? +poster_2008_name=Habbo Cola Poster +poster_20_desc=A new use for carrots! +poster_20_name=Snowman Poster +poster_21_desc=See that halo gleam! +poster_21_name=Angel Poster +poster_22_desc=A chilly snowy scene +poster_22_name=Winter Wonderland +poster_23_desc=Ho Ho Ho! +poster_23_name=Santa Poster +poster_24_desc=Following the star! +poster_24_name=Three Wise Men Poster +poster_25_desc=Doing a hard night's work +poster_25_name=Reindeer Poster +poster_26_desc=Hung yours up yet? +poster_26_name=Stocking +poster_27_desc=Deck the halls! +poster_27_name=Holly Garland +poster_28_desc=A touch of festive sparkle +poster_28_name=Tinsel (silver) +poster_29_desc=A touch of festive sparkle +poster_29_name=Tinsel (gold) +poster_2_desc=Take pride in your veg! +poster_2_name=Carrot Plaque +poster_30_desc=Pucker up +poster_30_name=Mistletoe +poster_31_desc=Pure and unbridled nu-metal. +poster_31_name=System of a Ban +poster_32_desc=Om Shanti - peace to all. +poster_32_name=Shiva Poster +poster_33_desc=We can't bear to lose them. +poster_33_name=Save the Panda +poster_34_desc=Habbo-punk for the never-agreeing. +poster_34_name=Scamme´d +poster_35_desc=The hotel's girlband. Dream on! +poster_35_name=The Habbo Babes 1 +poster_36_desc=The hotel's girlband. Dream on! +poster_36_name=The Habbo Babes 2 +poster_37_desc=The hotel's girlband. Dream on! +poster_37_name=The Habbo Babes 3 +poster_38_desc=Power and fury for reeeally tough Habbos! +poster_38_name=Smiling Headbangers +poster_39_desc=The rock masters of virtual music. +poster_39_name=The Screaming Furnies +poster_3_desc=Smells fishy looks cool. +poster_3_name=Fish Plaque +poster_40_desc=The one and only. Adore her! +poster_40_name=Bonnie Blonde +poster_41_desc=For the best music-makers +poster_41_name=Habbo Golden Record +poster_42_desc=Not something you want to run into +poster_42_name=Spiderweb +poster_43_desc=Shake, rattle and roll +poster_43_name=Chains +poster_44_desc=Beware the curse... +poster_44_name=Mummy +poster_45_desc=Needs a few more Habburgers +poster_45_name=Skeleton +poster_46_desc=Twinkle, twinkle +poster_46_name=Small gold star +poster_47_desc=Twinkle, twinkle +poster_47_name=Small silver star +poster_48_desc=All that glitters... +poster_48_name=Large gold star +poster_49_desc=All that glitters... +poster_49_name=Large silver star +poster_4_desc=Fake of course! +poster_4_name=Bear Plaque +poster_500_desc=Hang it proudly! +poster_500_name=The UK Flag +poster_501_desc=For pirates everywhere +poster_501_name=Jolly Roger +poster_502_desc=Hang it proudly! +poster_502_name=The USA Flag +poster_503_desc=Hang it proudly! +poster_503_name=The Swiss Flag +poster_504_desc=Hang it proudly! +poster_504_name=The German Flag +poster_505_desc=Hang it proudly! +poster_505_name=The Canadian Flag +poster_506_desc=Hang it proudly! +poster_506_name=The Finnish Flag +poster_507_desc=Hang it proudly! +poster_507_name=The French Flag +poster_508_desc=Hang it proudly! +poster_508_name=The Spanish Flag +poster_509_desc=Hang it proudly! +poster_509_name=The Jamaican Flag +poster_50_desc=flap, flap, screech, screech... +poster_50_name=Bat Poster +poster_510_desc=Hang it proudly! +poster_510_name=The Italian Flag +poster_511_desc=Hang it proudly! +poster_511_name=The Dutch Flag +poster_512_desc=Hang it proudly! +poster_512_name=The Irish Flag +poster_513_desc=Hang it proudly! +poster_513_name=The Australian Flag +poster_514_desc=Hang it proudly! +poster_514_name=The EU Flag +poster_515_desc=Hang it proudly! +poster_515_name=The Swedish Flag +poster_516_desc=Hang it proudly! +poster_516_name=The English Flag +poster_517_desc=Hang it proudly! +poster_517_name=The Scottish Flag +poster_518_desc=Hang it proudly! +poster_518_name=The Welsh Flag +poster_51_desc=2 points for every basket +poster_51_name=Basketball Hoop +poster_520_desc=Every color for everyone +poster_520_name=The Rainbow Flag +poster_521_desc=Hang it proudly! +poster_521_name=The Brazilian Flag +poster_522_desc=Hang it proudly! +poster_522_name=The Japanese Flag +poster_523_desc=Hang it proudly! +poster_523_name=The Indian Flag +poster_52_desc=Get sporty! +poster_52_name=Hockey Stick +poster_53_desc=Get sporty! +poster_53_name=Hockey Stick +poster_54_desc=Get sporty! +poster_54_name=Hockey Stick +poster_55_desc=For the Habbo Tree-huggers. +poster_55_name=Tree Poster +poster_56_desc=Do the hustle! +poster_56_name=Disco Sign +poster_57_desc=With a steady hand and a focused mind. +poster_57_name=Chinese Calligraphy +poster_58_desc=Choose your blessing! +poster_58_name=Chinese Red Knots +poster_59_desc=Torch - it gives you some light +poster_59_name=Torch +poster_5_desc=Quacking good design! +poster_5_name=Duck Poster +poster_6_desc=But is it the right way up? +poster_6_name=Abstract Poster +poster_7_desc=for emergencies only +poster_7_name=Hammer Cabinet +poster_83_desc=Pöllö huhuilee, huhuu! +poster_83_name=Pöllö huhuilee +poster_8_desc=Habbos come in all colors +poster_8_name=Habbo Colors Poster +poster_9_desc=do your bit for the environment +poster_9_name=Rainforest Poster +hubu.info=Welcome to the Infobus! The next Infobus event is on 5th July 2020 @ 7PM BST - this session is all about Internet Safety! Check back regularly for the latest Infobus sessions on a range of topics including online safety, scams and using Habbo. In the meantime, you can access our FAQs on the link below: +hubu.info.link2=Habbo FAQs +hubu.info.url2=http://www.habbo.co.uk/help +hubu.info.url1=http://www.habbo.co.uk/help +hubu.info.link1=Infobus Information +hubu.info.title=Infobus +hubu.dialog.title=Infobus - Next Event +connection.error.id.desc=Something went wrong when talking with the game server. Received error: %id% +connection.login.name=Name +connection.login.password=Password +connection.login.title=Sign in +connection.login.login=Sign in +connection.login.error.-400.desc=Connecting to the server failed +connection.login.useTicket=Use SSO Ticket +connection.error.id.title=Error +connection.login.error.-3.desc=Authentication failed +generic.ok=Ok +generic.close=Close +generic.cancel=Cancel +generic.back=Back +generic.search=Search +catalog.purchase.confirmation.dialog.remaining=You will have %remaining% in your Purse after purchasing this. +catalog.purchase.confirmation.dialog.costs=%offer_name% costs %price%. +ctlg_spaces_wall=Wall +purse_coins=Credits +catalog.alert.published.title=Refresh your catalogue and open it again. +recycler.prizes.category.3=Arcane +catalog.purchase.confirmation.dialog.amount=You have %amount%. +catalog.page.club=Buy Habbo Club +catalog.chooseproduct=Choose Product +catalog.purse.creditbalance=Credits: %balance% >> +catalog.voucher.empty.title=Voucher code missing +catalog_selectproduct=Select an item +recycler.alert.trading=Recycling cannot begin while you are trading. Please close the safe trading box before recycling. +recycler.prizes.odds.3=%odds% chances to get one of these. +catalog.purchase.confirmation.dialog.title=Order Info +purse.redeem.code.failed_technical=The code you entered is not valid. Please remember that codes are always written in lower case and never include letters i, l, o, w. +catalog.alert.notenough.title=Not enough credits +cancel=Cancel +catalog.title=Catalog +shopping_asagift=Gift this to another user +recycler.prizes.category.4=Phenomenal +catalog.purchase.price.pixels=%pixels% pixels +catalog.alert.voucherredeem.ok.title=Voucher processed +catalog.alert.petname.empty=Please enter a name for your pet! +recycler.prizes.category.1=Common +purse_buy_coins=Buy Credits +ctlg_spaces_colour=Colour +catalog.purchase.confirmation.dialog.buyasgift.greetings.info=Type your greetings here (don't forget to put your name!): +recycler.alert.non.recyclable=This furniture is not recyclable. +catalog.alert.voucherredeem.error.description.3=This voucher must be redeemed in Habbo Web. +catalog.purchase.price.credits+pixels=%credits% credit(s) + %pixels% pixels +catalog_giftfor=Gift recipient +ctlg_spaces_floor=Floor +catalog.alert.petname.length=Pet name is too long. +catalog.redeem.dialog.button.exchange=Exchange +catalog.alert.purchaseerror.title=There was an error with your purchase. Try again. +catalog.choosecolour=Choose Colour +ctlg_spaces_preview=Preview +catalog.alert.notenough.pixels.description=You don't have enough pixels. +catalog.alert.voucherredeem.error.description=We could not process your voucher code. Please retry and check the spelling extra carefully. +catalog.purchase.confirmation.dialog.price.none=Nothing +catalog.alert.published.description=Something new has been added to the catalogue. +catalog.alert.voucherredeem.error.description.0=The code you entered is not valid, please check it and try again. +catalog.purchase.price.none=Free! +purse_voucherbutton=Redeem Credits +catalog.alert.notenough.credits.description=You don't have enough Credits to purchase this item! Click OK button below to see different ways of getting Credits. +catalog.alert.voucherredeem.error.description.1=Technical error! Irredeemable voucher code or the code has already been used. Please note that codes are always written in lower case and never include letters i, l, o, w. +ctlg_spaces_landscape=Landscape +recycler.prizes.odds.5=Dream on... you have only %odds% chance to get this. +catalog.alert.voucherredeem.ok.description=Voucher process succeeded! Credit balance updated. +catalog.voucher.empty.desc=You didn't seem to enter a voucher code +recycler.info.closed=Recycler is closed at the moment. Please check back later to recycle your Furniture. +buy=Buy +catalog.alert.external.link.title=Link to the website +catalog_typeurname=Please type your name +catalog.alert.purchasenotallowed.hc.description=You have to be in the Habbo Club to be able to buy this. +recycler.prizes.category.2=Uncommon +catalog.purchase.price.credits=%credits% credit(s) +catalog.page.specialeffects=Special Effects +credits=Credits +catalog.purchase.confirmation.dialog.price.pixels=%pixels% pixels +catalog.alert.notenough.creditsandpixels.description=You don't have enough credits and pixels to purchase this product. Click 'ok' to see different ways of getting credits. +catalog.purse.pixelbalance=Pixels: %balance% >> +redeem=Redeem +catalog.recycler.button.recycle=Recycle +buy_andwear=Buy and wear +recycler.alert.privateroom=You need to go to a private room to use the recycler. +catalog.alert.external.link.desc=Link opens to a webpage +recycler.info.finished=Recycling is complete. You have made a great environmentally friendly decision. All the Recycled items you received have been made from old items which helps to save natural resources and reduce pollution. +recycler.prizes.odds.1=You can always get one of these if all else fails. +catalog.comingsoon=(Coming soon) +catalog.purse.clubdays=HC: %months%m %days%d >> +catalog.alert.voucherredeem.error.title=Error processing voucher +catalog.alert.petname.chars=Name contained forbidden characters, try again. +catalog.purchase.confirmation.dialog.price.credits+pixels=%credits% credit(s) + %pixels% pixels +catalog.redeem.dialog.title=Credit Exchange +recycler.prizes.odds.2=You have %odds% chance to get one of these. +catalog.purse.club.join=Join HC >> +catalog.purchase.confirmation.dialog.price.credits=%credits% credit(s) +catalog.alert.voucherredeem.ok.description.furni=Voucher process succeeded! You got the following furniture: %productName%, %productDescription% +recycler.alert.timeout=You have to wait %minutes% minutes and %seconds% seconds before you can recycle again. +catalog.alert.purchasenotallowed.title=Sorry, this item cannot be bought. +catelog.redeem.dialog.readmore.description=Read more about coin sets >> +purse_youhave=You have +recycler.info.ready=Drag 5 items to the boxes below and click recycle. Recyclable items display a recyclable tag in your inventory. Check out the prizes and the instructions for recycling before you recycle. +recycler.prizes.category.5=Urban Legend +catalog.alert.purchasenotallowed.unknown.description=Sorry, but you are doing something illegal. +recycler.prizes.odds.4=%odds% chances to get this one. Good luck! +catalog.purchase.confirmation.dialog.buyasgift.checkbox=This is a gift for: +catalog.alert.purchaseerror.description=There was a problem processing your purchase. Please retry. +catalog.alert.petname.bobba=Name contained forbidden words, try again. +catalog.alert.recycler.inventory=You have to pick up the furniture from the room to your inventory before you can put it in the recycler! +ctlg_spaces_pattern=Pattern +pet.mood.5=Joyful +pet.enrg.9=Tireless +pet.enrg.5=Rabid +pet.race.0.020=Patchy Pup +pet.enrg.6=Active +pet.age=Age: +pet.race.1.024=Cat Burglar +pet.race.0.016=Murmurin' Minimastiff +pet.race.0.009=Hound of Hull +pet.race.0.018=Bushy Woofer +pet.mood.2=Blue +pet.race.2.007=Pretty Pui Pui +pet.race.0.005=Paws Forethought +pet.enrg.0=Tired +pet.hunger=Hunger: +pet.thirst.3=Not thirsty +pet.frnd.5=Friendly +pet.race.0.014=Whiffy Woofy +pet.race.2.009=Swampy Siamese +pet.race.2.011=Petty Petsuchos +pet.race.1.019=Bobcat Wailer +pet.frnd.8=Loving +pet.race.1.003=Hidden Clause +pet.race.0.013=Mangy Mutt +pet.thirst.1=Parched +pet.race.1.010=Wannabe Wildcat +pet.race.1.002=Lesser Spotted Longhair +pet.frnd.9=Loyal +pet.frnd.3=Cool +pet.mood.3=Contented +pet.race.0.001=Habbo Husky +pet.frnd.2=Suspicious +pet.mood.0=Miserable +pet.mood=Happiness: +pet.enrg.11=Nutcase +pet.race.0.022=Schnitzel Snatcher +pet.race.1.007=Burmese Buddy +pet.frnd.7=Affectionate +pet.race.1.008=Mad Mouser +pet.race.0.021=Loyal Labrador +pet.frnd.4=Calm +pet.race.0.002=Joe Cocker Spaniel +pet.race.1.009=Scaredy Kat +pet.thirst.2=Thirsty +pet.race.0.012=Tawny Bleugh +pet.race.1.006=Titchy Tiger +pet.race.0.015=Pixie Poodle +pet.hunger.1=Hungry +pet.frnd.6=Warm +pet.race.0.004=Droopy of Pawford +pet.hunger.0=Empty +pet.race.2.001=Krazy Krokodilos +pet.race.0.003=Rescue Bernard +pet.frnd.10=Adoring +pet.race.0.011=Lappy Lassie +pet.race.2.000=Endangered Albino +pet.race.1.011=Egyptian Angora +pet.race.1.004=Soft-Toed Sneaker +pet.race.2.006=Confused Croc +pet.enrg.1=Slow +pet.hunger.2=Rumbling +pet.race.1.005=Cat Astroflea +pet.race.0.008=Springy Spaniel +pet.thirst=Thirst: +pet.race.1.018=Trusting Tabby +pet.race.1.012=Freckled Feral +pet.hunger.4=Satisfied +pet.race.2.005=Galled Gator +pet.race.2.004=Dirty Dundee +pet.race.1.015=Haughty House Pet +pet.race.0.007=Slobber Don +pet.hunger.3=Peckish +pet.race.1.016=Curiosity - The Return! +pet.race.2.010=Giggly Go-go +pet.race.0.024=Black-eyed Boxer +pet.enrg.2=Sluggish +pet.thirst.0=Gasping +pet.race.2.002=Nile Dile +pet.frnd.11=Devoted +pet.race.1.017=Furry Friend +pet.race.2.008=Indifferent +pet.mood.4=Happy +pet.race.0.006=Stripy Setter +pet.race.1.022=Matted Moggy +pet.enrg.4=Relaxed +pet.race.1.014=Bushy Bobtail +pet.mood.6=Ecstatic +pet.race.0.019=Tiny Terrier +pet.race.1.013=Felis Catus Allergicus +pet.hunger.5=Full +pet.race.0.000=Yappy Yorkie +pet.race.2.003=Silly Sobek +pet.race.0.023=Dotty Dalmatian +pet.race.0.017=Speckled Sheepdog +pet.enrg.8=Lively +pet.enrg.3=Lazy +pet.race.1.001=Purr-Sian +pet.nature=Nature: +pet.race.1.023=Indoor Alley Cat +pet.race.1.000=Sleepy Siamese +pet.frnd.1=Angry +pet.race.0.010=Furry McScottie +pet.frnd.0=Hostile +pet.enrg.10=Mad +pet.race.1.021=Fabulous Feline +pet.enrg.7=Energetic +pet.mood.1=Depressed +pet.race.1.020=Caterwaul Kitty +pet.hunger.6=Stuffed +avatareditor.habboclub.info=Habbo Club is required in order to be able to use the wardrobe. +avatareditor.generic.boy=Boy +avatareditor.promo.supportedphones.title=Supported phones +avatareditor.promo.supportedphones=Habbo Club purchasing works on Virgin, Tesco Network, Vodafone UK, O2, T-Mobile, 3 and Orange phones +avatareditor.hotlooks.title=Hot Looks from the Hotel +avatareditor.hotlooks.choose=Click to choose +avatar.editor.character.update.url=http://%predefined%/profile/characterupdate +avatareditor.wardrobe.title=My Wardrobe +avatareditor.wardrobe.choose=Click to choose a look +avatareditor.habboclub.link=Get Habbo Club Membership +avatareditor.promo.moreinfo=More info +avatareditor.promo.instructions=1. Text "HABBO" to 78881.\n\n2. Enter the special code to the form below and press redeem. +avatareditor.hotlooks.more=More Looks +avatareditor.habboclub.title=Habbo Club Required +avatareditor.title=Change Your Looks +avatareditor.promo.title=Want more clothes? Get Habbo Club for 31 days & 15 credits for �3 +avatareditor.promo.redeem=Redeem my club +avatareditor.cancel=Cancel +avatareditor.promo.showphones=Show supported phones +avatareditor.save=Save changes +avatareditor.generic.girl=Girl +avatareditor.wardrobe.store=Click to store your outfit +friendlist.search.friendscaption=Friends (%cnt%) : +friendlist.tip.remove=Remove friend +friendlist.requests.acceptall=Accept all +friendlist.error.friend_requests_disabled=Cannot send friend request, user is not accepting new friends. +friendlist.tip.mail=Send minimail +friendlist.friends.offlinecaption=Offline Friends +friendlist.tip.home=Home page +friendlist.invite.summary=Inviting %count% people to this room. +friendlist.weblinkinfo=Link opened to web page +friendlist.request.accepted=Accepted +friendlist.alert.title=Notice! +friendlist.followerror.notfriend=The user you tried to follow is not on your friends list anymore, so you cannot follow him/her. +friendlist.tip.follow=Follow +friendlist.friendrequestsent.title=Notice! +friendlist.tip.preferences=Edit categories +friendlist.tip.compose=Send minimail +friendlist.followerror.hotelview=Your friend is currently not in any room, so you cannot follow him/her. +friendlist.removefriendconfirm.title=Confirm remove +friendlist.settings=Settings +friendlist.followerror.offline=Your friend is offline. +friendlist.tip.invite=Invite friends +friendlist.error.friendlistlimitofrequester=Cannot send friend request as their friend list is full. +friendlist.tip.addfriend=Send friend request +friendlist.error.requestnotfound=Cannot send friend request, friend request was not found! +friendlist.tip.decline=Decline +friendlist.friendrequestsent.text=%user_name% has been sent your Friend Request. (S)he will be added into your Friends List if (s)he accepts it. +friendlist.tip.declineall=Decline all +friendlist.invite.send=Send +friendlist.tip.im=Send a message +friendlist.requests.dismissall=Decline all +friendlist.invite.emptyalert.text=Invite friends to this room: +friendlist.request.declined=Declined +friendlist.tip.tab.2=Friend requests +friendlist.tip.searchstr=Enter search +friendlist.tab.friendrequests=Friend Requests +friendlist.avatarpopup.lastaccess=Last visit: %last_access% +friendlist.tip.inbox=Minimail inbox +friendlist.friends=Friends +friendlist.tip.search=Search users +friendlist.search.noothersfound=No users found +friendlist.requests.norequests=No friend requests +friendlist.invite.note=Make sure you can be followed. +friendlist.followerror.prevented=Your friend has prevented others from following him/her. +friendlist.listfull.title=Notice! +friendlist.tip.accept=Accept +friendlist.error.friendlistownlimit=Cannot send friend request, your friend list is full. +friendlist.search.nofriendsfound=No friends found +friendlist.avatarpopup.online=Online +friendlist.listfull.text=Your friend list contains the maximum of %mylimit% Habbos, so you cannot add any more friends to the list. Members of Habbo Club can have up to %clublimit% friends in their list. +friendlist.tip.tab.1=Your friends +friendlist.search.otherscaption=Other Habbos (%cnt%) : +friendlist.removefriendconfirm.userlist=Remove friends: %user_names%? +friendlist.invite.title=Invitation +friendlist.tip.acceptall=Accept all +friendlist.invite.emptyalert.title=Notice! +friendlist.request.failed=Failed +friendlist.tip.tab.3=Search for Habbos +widget.furni.ecotronbox.open=Open Box +widget.dimmer.type.checkbox=Background only +widget.furni.present.hc=You got a subscription to Habbo Club! +widget.memenu.activeeffects=Activate and use effects +widget.dimmer.button.off=Turn off +widget.memenu.dance4=The Rollie +widget.memenu.back=Back +widget.dimmer.button.apply=Apply to room +widgets.chatinput.mode.whisper=:tell +widget.memenu.myrooms=My Rooms +infostand.button.whisper=Whisper +widgets.doorbell.title=Doorbell +widget.memenu.clothes.add=Save outfits in the clothes editor and they'll appear here +widget.memenu.hc.long=HC %days%d %months%m +group.privileges=Privileges: %privileges% +widget.memenu.editavatar=Change Looks +group.homepage=Group homepage >> +widget.memenu.dance3=Duck Funk +group.window.title=Habbo Groups +room.loading=Please wait while loading the room. +widget.dimmer.button.on=Turn on +widget.memenu.effects=My Effects +widget.memenu.dance.stop=Stop Dancing +widget.memenu.dance1=Dance +widget.memenu.dance2=Pogo Mogo +widget.memenu.clothes.info=Join Habbo Club to quickly choose outfits in this menu. +group.owner=Owner +group.member=Member +widgets.chatinput.default=Click here to chat... +widgets.doorbell.info=Following users are ringing the doorbell: +widget.memenu.hc=HC %days%d +widgets.memenu.effects.active.timeleft=%time_left% +group.homepage.url=http://%predefined%/groups/%groupid%/id +widget.dimmer.tab.2=Preset 2 +widget.memenu.moreeffects=Buy more +widget.furni.ecotronbox.title=Ecotron box +widget.memenu.hc.join=Join HC! +widget.dimmer.info.off=Room dimmer is currently turned off. Turn it on to adjust the lighting of your room. +widget.furni.info.url=http://%predefined%//help/6 +widgets.chatinput.mode.speak=:speak +widgets.furniture.credit.redeem.value=This bag or bar contains %value% credits, you can redeem it now. +widget.dimmer.info=Room dimmer effect is previewed in your room. Apply the effect to the room to make other users see it too. +widget.memenu.dance=Dance +widget.dimmer.tab.3=Preset 3 +widget.furni.present.open=Open the present +ads.interstitial.tooltip=This is an advertisement. Clicking it will open another web page. +group.admin=Administrator +widget.furni.trophy.title=Trophy +widget.memenu.myclothes=Change Looks +widget.memenu.wave=Wave +widget.dimmer.tab.1=Preset 1 +widget.memenu.effects.info=You don't have any active effects. +Activate some or get more. +widgets.chatinput.mode.shout=:shout +widget.memenu.dance.clubinfo=Join Habbo Club to get more dance moves. +widget.memenu.badges=My badges +widget.dimmer.title=Room dimmer Controller +widget.furni.present.title=Present +group.room.link=Group's room: %room_name% >>> +chat.history.drag.tooltip=Drag this to display chat history +chat.input.alert.flood=You're typing too fast, don't flood the room! - %time% seconds remaining +info.comingsoon.text=Coming Soon! +info.comingsoon.caption=The feature is not yet available! +info.client.version=Version: %version% +mod.alert.link=More information >> +mod.alert.title=Message from Habbo Staff +mod.ban.title=You are banned! +room.error.cant_trade_stuff=You cannot place this in someone else's room! +room.error.guide.not.available=All guide bots are in use at this time. Please try again later! +room.error.cant_set_not_owner=You don't have rights to put furniture in here! +room.error.max_stickies=Only 50 stickies per room are allowed! +room.error.cant_set_item=You cannot place this item here. +room.error.guide.already.exists=A guide bot already exists in your room! +error.title=Error! +room.error.max_furniture=This room has the maximum amount of Furni. +room.error.max_pets=Too many pets in the room! +room.error.max_queuetiles=You can't fit more Habbo Rollers in this room! +room.error.max_soundfurni=You can only place one sound playing Furni per room. +handitem1=Tea +handitem28=sake +handitem44=Test Tube +handitem4=Ice-cream +handitem23=Beetroot Habbo Soda +handitem29=Tomato juice +handitem34=Kipperific! Yum Yum. +handitem15=Iced +handitem35=pink champagne! +handitem26=Calippo +handitem14=Filter +handitem100=Water +handitem13=Espresso +handitem101=Water +handitem9=Decaff +handitem30=Radioactive liquid +handitem19=Habbo Cola +handitem16=Cappuccino +handitem11=Mocha +handitem25=Love potion +handitem2=Juice +handitem8=Regular +handitem3=Carrot +handitem10=Latte +handitem24=Bubble juice from 1999 +handitem21=Hamburger +handitem7=Water +handitem20=Camera +handitem31=Pink Champagne +handitem27=Tea +handitem22=Lime Habbo Soda +handitem18=Tap +handitem5=Milk +handitem17=Java +handitem6=Blackcurrant +handitem41=Sumppi-kuppi +handitem12=Macchiato +handitem36=Pear +handitem37=Yummy peach +handitem38=Orange +handitem39=Pineapple +handitem45=Excited Moodi +handitem46=Happy Moodi +handitem47=Angry Moodi +handitem50=Bubble Juice Bottle +play_preview=Play preview +badge_desc_UK070=For winning an officially hosted game! +badge_name_UK070=Golden Duck +badge_name_DEV=Codebreaker +badge_desc_DEV= For guessing the room password +badge_name_DEX=Codebreaker Pro +badge_desc_DEX=For guessing the room password 2x +badge_name_DEW=Codebreaker Champion +badge_desc_DEW=For guessing the room password 3x +badge_name_HO1=Room of the Week +badge_desc_HO1=Winner of the Room of the Week competition +badge_name_DET=Room of the Week +badge_desc_DET=2nd place of the Room of the Week competition +badge_name_DEU=Room of the Week +badge_desc_DEU=3nd place of the Room of the Week competition +badge_name_FR019=Pro Gamer +badge_desc_FR019=I won an officially hosted game! +badge_name_DE039=Home Of The Week +badge_desc_DE039=I know how to design an amazing Habbo Home! +badge_name_PX01=StrayPixels Honorable Mention +badge_desc_PX01=I won honorable mention and all I got was this... badge. +badge_name_PX02=StrayPixels Gold +badge_desc_PX02=I won, I actually won ...once +badge_name_PX03=StrayPixels Jade +badge_desc_PX03=Three wins! I own your pixel soul. +badge_name_PX04=StrayPixels Diamond +badge_desc_PX04=brought to you by the number 5. Which is also how many wins I have. +badge_name_PX05=StrayPixels Circuit +badge_desc_PX05=On my seventh win the heavens opened up and this magical badge floated down. +badge_name_PX06=StrayPixels Full Pixel +badge_desc_PX06=I am the most epic winner of all time. ALL TIME! +badge_name_PX07=StrayPixels Hair Cube +badge_desc_PX07=I submitted a hair design for a StrayPixels theme! +badge_name_PX00=StrayPixels Theme +badge_desc_PX00=I sent in a theme for StrayPixels and they actually used it. Suckers. +badge_name_MRG00=Opening Day +badge_desc_MRG00=I joined this hotel on opening day. +badge_name_XM19=Xmas Tree +badge_desc_XM19=Awarded to everyone who visited Habbo during December 2019. Happy Christmas! +badge_name_Z64=Back So Soon +badge_desc_Z64=I survived the Great Wipe of 2019 +badge_name_GA1=Golden Gamer +badge_desc_GA1=You're looking at a hardcore gamer, baby! +badge_name_XM3=Rasta Santa +badge_desc_XM3=Rasta Santa was awarded during Christmas 2005. He visited the hotel again in December 2006. +badge_name_XMB=Mr. Frosty +badge_desc_XMB=Christmas 2019 Penguin Games. +badge_name_MRG01=Habbo Canada +badge_desc_MRG01=Remembering my Habbo roots! +badge_name_MRG02=Habbo USA +badge_desc_MRG02=Remembering my Habbo roots! +badge_name_MRG03=Habbo UK +badge_desc_MRG03=Remembering my Habbo roots! +badge_name_MRG04=Habbo Australia +badge_desc_MRG04=Remembering my Habbo roots! +badge_name_MRG05=Habbo SG +badge_desc_MRG05=Remembering my Habbo roots! +badge_name_BR5=Habbo Portugal +badge_desc_BR5=Remembering my Habbo roots! +badge_name_NL035=Habbo NL +badge_desc_NL035=Remembering my Habbo roots! +badge_name_ES005=Argentina +badge_desc_ES005=Remembering my Habbo roots! +badge_name_ES006=Bolivia +badge_desc_ES006=Remembering my Habbo roots! +badge_name_ES007=Chile +badge_desc_ES007=Remembering my Habbo roots! +badge_name_ES008=Colombia +badge_desc_ES008=Remembering my Habbo roots! +badge_name_ES009=Costa Rica +badge_desc_ES009=Remembering my Habbo roots! +badge_name_ES010=Equador +badge_desc_ES010=Remembering my Habbo roots! +badge_name_ES011=El Salvador +badge_desc_ES011=Remembering my Habbo roots! +badge_name_ES012=España +badge_desc_ES012=Remembering my Habbo roots! +badge_name_ES013=Honduras +badge_desc_ES013=Remembering my Habbo roots! +badge_name_ES014=México +badge_desc_ES014=Remembering my Habbo roots! +badge_name_ES015=Nicaragua +badge_desc_ES015=Remembering my Habbo roots! +badge_name_ES016=Panama +badge_desc_ES016=Remembering my Habbo roots! +badge_name_ES017=Paraguay +badge_desc_ES017=Remembering my Habbo roots! +badge_name_ES018=Peru +badge_desc_ES018=Remembering my Habbo roots! +badge_name_ES019=Uruguay +badge_desc_ES019=Remembering my Habbo roots! +badge_name_ES020=Venezuela +badge_desc_ES020=Remembering my Habbo roots! +badge_name_DE4=Österreich +badge_desc_DE4=Remembering my Habbo roots! +badge_name_DE5=Deutschland +badge_desc_DE5=Remembering my Habbo roots! +badge_name_BR003=Brazil +badge_desc_BR003=Remembering my Habbo roots! +badge_name_CH010=Help Desk +badge_desc_CH010=I'm helping at the official Help Desk! +badge_name_STOUT=Stout +badge_desc_STOUT=omg hou op x +badge_name_BE=Belgium +badge_desc_BE=Remembering my Habbo roots! +badge_name_DK=Denmark +badge_desc_DK=Remembering my Habbo roots! +badge_name_FI=Finland +badge_desc_FI=Remembering my Habbo roots! +badge_name_NO=Norway +badge_desc_NO=Remembering my Habbo roots! +badge_name_RU=Russia +badge_desc_RU=Remembering my Habbo roots! +badge_name_SE=Sweden +badge_desc_SE=Remembering my Habbo roots! +badge_name_WAA00=Waasa Fan! +badge_desc_WAA00=For celebrating the release of Waasa +badge_name_COC02=Coco Coordinator +badge_desc_COC02=Thanks for sending us your resort activity! +badge_name_COC04=Coco-Maniac +badge_desc_COC04=Having a hoot at the Coco Resort! +badge_name_COC03=Coco-Nut Inspector +badge_desc_COC03=For celebrating the release of Coco +badge_name_FRH=Habbo Fashion Week +badge_desc_FRH=For being a part of the Habbo Fashion Week. February 2020. +badge_name_UK071=Habbo Raceway +badge_desc_UK071=Dino Cup Winner. February 2020. +badge_name_Z01=Habbo Model +badge_desc_Z01=Habbo Fashion Week 2020 competition winner. +badge_name_VA014=Blingtastic! +badge_desc_VA014=For celebrating the release of Bling +badge_name_VA014=Blingtastic! +badge_desc_VA014=For celebrating the release of Bling +badge_name_VA012=Bling Master +badge_desc_VA012=Habbo Bling 2020 room competition winner. +badge_name_VA013=Bling Week +badge_desc_VA013=For being a part of the Habbo Bling week. February/March 2020. +badge_name_UK176=ChildLine Group +badge_desc_UK176=I am a member of the ChildLine group +badge_name_UK111=ChildLine Anti-Bullying Badge +badge_desc_UK111=Take action together against bullying! +badge_name_UK175=ChildLine Self-harm Awarness +badge_desc_UK175=I correctly answered the ChildLine Self-harm Awareness Quiz! +badge_name_NEC=Trax Master +badge_desc_NEC=For winning the Trax DJ Party Competition +badge_name_NEJ=Good Party Host +badge_desc_NEJ=For participating in the Trax DJ Party Competition +badge_name_LC7=Little Crab +badge_desc_LC7=For participating in the Aquarium Room Competition +badge_name_LC8=Golden Crab +badge_desc_LC8=For winning the Aquarium Room Competition +badge_name_DS6=Galaxy Maze +badge_desc_DS6=I completed the Habbo Galaxies Maze! +badge_name_ES68H=#StayInHabbo +badge_desc_ES68H=We're all in this together, and we, as a community, stand together. +badge_name_WH8=HABBOTICS Pharm. +badge_desc_WH8=You received the cure to the virus 2020 +badge_name_UK1=Infobus Session April +badge_desc_UK1=For entering our Infobus Session in April 2020. +badge_name_S10=Golden Medal +badge_desc_S10=Given to Habbos who won one of the events or tournaments during #StayInHabbo 2020. +badge_name_UST=Oldschool Amateur +badge_desc_UST=For participating in the oldschool room competition. April 2020. +badge_name_MAL03=Habbo Mall (3/3) +badge_desc_MAL03=Secret Mall Achievement +badge_name_MAL02=Habbo Mall (2/3) +badge_desc_MAL02=I found the Malls Hidden Room +badge_name_MAL01=Habbo Mall (1/3) +badge_desc_MAL01=I discovered the Habbo Mall +badge_name_HM1=Mall Builder +badge_desc_HM1=Built a room for the Habbo Mall +badge_name_UK824=HONK! +badge_desc_UK824=I won the Duck in Deal or No Deal! +badge_name_HBX1=Habbox.CO Re-Launch +badge_desc_HBX1=I joined Habbox for their Re-Launch! +badge_name_HBX2=Takeshi's Castle +badge_desc_HBX2=I won a round of Takeshi's Castle! +badge_name_PT737=Infobus Session April +badge_desc_PT737=For entering our Infobus Session in April 2020. +badge_name_FAN2=Fansite Values Staff +badge_desc_FAN2=I contribute to the Rare Values on a Habbo Fansite! +badge_name_FAN3=Fansite Event Staff +badge_desc_FAN3=I plan and host events for a Habbo Fansite! +badge_name_FAN4=Ex-Fansite Staff +badge_desc_FAN4=I was a Staff Member at a Habbo Fansite! +badge_name_SIM1=Yellow Team Winner +badge_desc_SIM1=I won an Official Sims Game! +badge_name_SIM2=Red Team Winner +badge_desc_SIM2=I won an Official Sims Game! +badge_name_SIM3=Green Team Winner +badge_desc_SIM3=I won an Official Sims Game! +badge_name_SIM4=Blue Team Winner +badge_desc_SIM4=I won an Official Sims Game! +badge_name_IT482=Bingo! (1/4) +badge_desc_IT482=I've won 1 game of Bingo! +badge_name_IT483=Bingo! (2/4) +badge_desc_IT483=I've won 2 games of Bingo! +badge_name_IT484=Bingo! (3/4) +badge_desc_IT484=I've won 3 games of Bingo! +badge_name_IT485=Bingo! (4/4) +badge_desc_IT485=I've won 4 games of Bingo! +badge_name_RE2=Reach Out! Winner +badge_desc_RE2=Reach Out! Competition Winners +badge_name_EGG20=Easter Egg Hunt 2020 +badge_desc_EGG20=Completed the Easter Egg Hunt! +badge_name_EGG22=Easter 2020 +badge_desc_EGG22=Happy Easter! +badge_name_EAB=Easter Bunny +badge_desc_EAB=I found the Bunny! +badge_name_EGG25=You!, Easter Eggs! +badge_desc_EGG25=I found the Bunny's Easter Eggs in a Users Room! +badge_name_EGG26=Farewell, Mr. Bunny +badge_desc_EGG26=I said goodbye to the Easter Bunny, April 2020. +badge_name_EST04=Easter Codebreaker +badge_desc_EST04=I guessed the Secret Easter Codeword! +badge_name_DE511=LGBT+ Pride +badge_desc_DE511=Celebrating equality, love, understanding and tolerance in the LGBT+ Lounge. +badge_name_TAKE1=Takeshi's Castle (1/3) +badge_desc_TAKE1=I won a round of Takeshi's Castle. +badge_name_TAKE5=Takeshi's Castle (2/3) +badge_desc_TAKE5=I won 5 games of Takeshi's Castle. +badge_name_TAKE10=Takeshi's Castle (3/3) +badge_desc_TAKE10=I won 10 games of Takeshi's Castle. +badge_name_SGD=Mall Detective (1/2) +badge_desc_SGD=I'm hunting the clues... +badge_name_CH3=Habbo Switzerland +badge_desc_CH3=Remembering my Habbo roots! +badge_name_SWISS=Switzerland +badge_desc_SWISS=Remembering my Habbo roots! +badge_name_NL249=Penguin Rescue +badge_desc_NL249=I joined Habbo during Earth Day 2020 +badge_name_DOND1=Deal or No Deal! +badge_desc_DOND1=I won the Grand Prize in Deal or No Deal! +badge_name_MAYY4=4/5 +badge_desc_MAYY4=May the Fourth be with You! +badge_name_BR075=Q&A #1 +badge_desc_BR075=Attended a Staff Q&A Session +badge_name_ES467=Earth Week Infobus +badge_desc_ES467=Joined Habbo Staff for Special Infobus session +badge_name_ES819=Earth Week Quiz +badge_desc_ES819=Completed the Earth Week Quiz! +badge_name_FFBAN=Falling Furni Winner +badge_desc_FFBAN=I won a game of Falling Furni! +badge_name_DRA6=Don't Roll a 6 +badge_desc_DRA6=I won a game of Don't Roll a 6! +badge_name_NT081=BB #EventsWeek +badge_desc_NT081=I won a Game of Battle Ball during #EventsWeek +badge_name_IT480=Bank Game +badge_desc_IT480=I won an Official Bank Game! +badge_name_ITC54=LGBT+ Infobus +badge_desc_ITC54=I attended the LGBT+ Infobus session! +badge_name_US081=Babybus +badge_desc_US081=Contributed to an Infobus debating session! +badge_name_100O=100 Peak +badge_desc_100O=I helped get 100 Users Online! +badge_name_ESO=Chica Tampax +badge_desc_ESO=Visted the Tampax Event 2020! +badge_name_CLUBS=Oops! +badge_desc_CLUBS=In memory of the Habbo Club Massacre. May 2020. +badge_name_ALP23=Lockdown 2020 +badge_desc_ALP23=What a bummer... +badge_name_CLUBG=Big Oops! +badge_desc_CLUBG=In memory of the Habbo Club Massacre. May 2020. +badge_name_UK037=Britney Spears +badge_desc_UK037=Joined Britney Spears for her Hotel Debut! +badge_name_DE35A=Ban Hammer +badge_desc_DE35A=Moderation makes the world go round... +badge_name_RBH=Real Bingo Hours +badge_desc_RBH=??? +badge_name_BRIT1=She visited! +badge_desc_BRIT1=Britney Spears visited my room. +badge_name_DE182=She answered! +badge_desc_DE182=Britney Spears answered my question. +badge_name_FRIDG=Elegant Carrot +badge_desc_FRIDG=I played and won at the Zana Kick memorial game. +badge_name_GAMB=Gambler +badge_desc_GAMB=Jack of all trades, master of none. +badge_name_RARE1=Gold Rare Hoarder! +badge_desc_RARE1=Still not enough rares! +badge_name_RARE2=Silver Rare Hoarder! +badge_desc_RARE2=Still not enough rares! +badge_name_RARE3=Bronze Rare Hoarder! +badge_desc_RARE3=Still not enough rares! +badge_name_TACO=Tacos Tuesday +badge_desc_TACO=We can't get enough of them! +badge_name_WRITE=King Of Writing +badge_desc_WRITE=You are an authentic writer! +badge_name_ROTW1=ROTW 1st Place +badge_desc_ROTW1=You're a winner baby! +badge_name_ROTW2=ROTW 2nd Place +badge_desc_ROTW2=So close... +badge_name_ROTW3=ROTW 3rd Place +badge_desc_ROTW3=Nearly there... +badge_name_IT021=#IDAHOBIT +badge_desc_IT021=International Day Against Homophobia, Biphobia and Transphobia +badge_name_TC054=Eid Mubarak 2020 +badge_desc_TC054=Celebrating Eid with ClassicHabbo! +badge_name_ES9=Calippo Summer +badge_desc_ES9=Joined ClassicHabbo for a Calippo Summer +badge_name_ES8=Calippo King +badge_desc_ES8=Won the Calippo Summer Giveaway +badge_name_RTS01=The BHF's +badge_desc_RTS01=Best Habbo's Forever. We're popular and we Rule the School! +badge_name_RTS02=The GN0RKS +badge_desc_RTS02=Gamers, Skaters, Geeks, Nerds and Dorks. Unite to Rule the School! +badge_name_RTS03=The Habcats +badge_desc_RTS03=Jocks, football players and cheerleaders - together we Rule the School! +badge_name_RTS04=The Punks +badge_desc_RTS04=Emos, goths, punks and wannabe poets. Anarchy Rules the School! +badge_name_RTS05=Golden Graduation Badge +badge_desc_RTS05=RTS 2020 Winning Group - %PLACEHOLDER%! +badge_name_RTS06=Pop Quiz Badge #1 +badge_desc_RTS06=Aced a Rule The School Pop Quiz about Maths! +badge_name_RTS07=Pop Quiz Badge #2 +badge_desc_RTS07=Aced a Rule The School Pop Quiz about Science! +badge_name_RTS08=Pop Quiz Badge #3 +badge_desc_RTS08=Aced a Rule The School Pop Quiz about History! +badge_name_RTS09=Basketball Champ +badge_desc_RTS09=On the Winning Team! +badge_name_RTS10=Sports Stud +badge_desc_RTS10=Root for your team! +badge_name_RTS16=Red Scholar Badge +badge_desc_RTS16=Straight A's for this Habbo Student +badge_name_RTS18=Glee Club Member +badge_desc_RTS18=I'm a Gleek, hear me sing! +badge_name_RTS19=Green Scholar Badge +badge_desc_RTS19=Straight A's for this Habbo Student +badge_name_RTS22=RTS Hideout Winner +badge_desc_RTS22=Created a perfect Hideout for their school group! +badge_name_RTS25=Not In Use +badge_desc_RTS25=Not In Use +badge_name_RTS26=Blue Scholar Badge +badge_desc_RTS26=Straight A's for this Habbo Student +badge_name_YOUN=YouNow +badge_desc_YOUN=I came from YouNow +badge_name_MLENG=Diversity & Equality! +badge_desc_MLENG=Badges are now multilingual - thanks for joining us on this journey. +badge_name_MLPT=Diversidade & Igualdade! +badge_desc_MLPT=Emblemas agora s�o multil�ngues - Obrigado por se juntar a n�s nesta jornada. +badge_name_MLES=Diversidad & Igualdad! +badge_desc_MLES=Las insignias ahora son multiling�es- Gracias por acompa�arnos en este viaje. +badge_name_MLIT=Awaiting Translation +badge_desc_MLIT=Awaiting Italian Translation +badge_name_BLM=#BlackLivesMatter +badge_desc_BLM=Always, and forever. Take a stand! +badge_name_EAS01=FP Maze (1/3) +badge_desc_EAS01=1 Down, 2 to go! +badge_name_EAS02=FP Maze (2/3) +badge_desc_EAS02=Almost there... +badge_name_EAS03=FP Maze (3/3) +badge_desc_EAS03=I did it! I completed all 3 Flower Power Mazes! +badge_name_EAS04=Flower Power! +badge_desc_EAS04=Discovered a whole new world of Flowers! +badge_name_EAS05=Professional Gardener +badge_desc_EAS05=A Pro Gardner? Probably... +badge_name_ES11A=Wired Tester +badge_desc_ES11A=I am a BETA Tester for Wired! Coming soon... +badge_name_PT107=Pride Month 2020 +badge_desc_PT107=Standing side by side with my brothers and sisters, during Pride Month 2020. +badge_name_UK479=Picnic Fields +badge_desc_UK479=Enjoy the great outdoors, celebrate mother nature and party! +badge_name_THE01=Theatredome +badge_desc_THE01=Perform your latest master piece, or simply catch the latest gossip. +badge_name_ITB61=Habbo Lido +badge_desc_ITB61=Splish, splash and have a bash in the Habbo pool! +badge_name_MLNL=Diversiteit & gelijkheid +badge_desc_MLNL=Badges zijn nu meertalig - bedankt om ons te volgen op deze tocht. +badge_name_NT258=Welcome to ClassicHabbo +badge_desc_NT258=What a great place to start! +badge_name_AST09=Habburgers +badge_desc_AST09=Get food here! +badge_name_SMC04=Library +badge_desc_SMC04=Books! Glorious books! Fill yourself with information and lose yourself in wonderful literary worlds. +badge_name_HLY03=Power Gym +badge_desc_HLY03=Fancy a workout? +badge_name_NL563=Mickey Duck +badge_desc_NL563=flash sino 2 is pretty neat, right? +badge_name_UK982=Juicy +badge_desc_UK982=This is eggciting! +badge_name_UK983=Peachy +badge_desc_UK983=I appeachiate you! +badge_name_MITY=Times are changing! +badge_desc_MITY=You don't have to deal with this all alone! +badge_name_500G=Five Hundred +badge_desc_500G=I counted to 500 on Discord! +badge_name_500S=Five Hundred +badge_desc_500S=Wow! Discord #counting reached 500! +badge_name_BOD1=Body Part (Common) +badge_desc_BOD1=1/3 +badge_name_BOD2=Body Part (Rare) +badge_desc_BOD2=2/3 +badge_name_BOD3=Body Part (Epic) +badge_desc_BOD3=3/3 +badge_name_BUST=BUSTED! +badge_desc_BUST=I got caught Credit Farming...but I've changed my ways! +badge_name_FAG=Smoking Hot +badge_desc_FAG=Fancy a cig buddy? +badge_name_KIDDO=Kiddo +badge_desc_KIDDO=For joining the Cult of Kiddo! +badge_name_POOH=Winnie-the-Pooh +badge_desc_POOH=At your service! +badge_name_ITB25=ITGTTS +badge_desc_ITB25=I'm too GAY to think STRAIGHT! +badge_name_ITB26=ITGTTS +badge_desc_ITB26=I'm too GAY to think STRAIGHT! +badge_name_PT960=Chromatica +badge_desc_PT960=Battle for your life! Babylon! +badge_name_TEST21=Testing Testing +badge_desc_TEST21=1 2 3 4 +badge_name_ITA06=Magnifying Glass +badge_desc_ITA06=For solving GingerBrad mystery. +badge_name_ITA53=Expert Detective +badge_desc_ITA53=I was one of the first 10 Habbo's to Solve GingerBrad's mystery! +badge_name_MDI=Cup of Coffee +badge_desc_MDI=For those Late Night Habbo's +badge_name_IT2=Battle Ball Gold +badge_desc_IT2=Congratulations Chromatica Team! (Leone, esdras90, Lucas-4 and xJoonq) +badge_name_IT3=Battle Ball Silver +badge_desc_IT3=Congratulations AbstractisMyAss! (Abstractis, crxstxnxx, Frvncisco and Punked20) +badge_name_IT4=Battle Ball Bronze +badge_desc_IT4=Congratulations Snek Klan! (devrik, Joorren, boo and EatAss) +badge_name_DEB=Botanist +badge_desc_DEB=I won the Flower Power Room Competition. June 2020. +badge_name_ES26I=L +badge_desc_ES26I=. +badge_name_ES27I=G +badge_desc_ES27I=. +badge_name_ES29I=B +badge_desc_ES29I=. +badge_name_ES28I=T +badge_desc_ES28I=. +badge_name_ES30I=+ +badge_desc_ES30I=. +badge_name_ES32H=Avo Love +badge_desc_ES32H=You're everything I Avo wanted! +badge_name_DE26C=Gamer Gold +badge_desc_DE26C=Winner winner chicken dinner! +badge_name_DE27C=Gamer Silver +badge_desc_DE27C=Winner winner chicken dinner! +badge_name_DE28C=Gamer Bronze +badge_desc_DE28C=Winner winner chicken dinner! +badge_name_BSH11=Bet on it... +badge_desc_BSH11=I'm a Dice PRO! +badge_name_US019=Canada Day 2020 +badge_desc_US019=Celebrating all things Canadian with Habbo! +badge_name_UK827=Eh?! +badge_desc_UK827=It's a Canadian thing... +badge_name_CAK=Maple Leaf +badge_desc_CAK=A national symbol... +badge_name_IT472=Looking Forward... +badge_desc_IT472=July 2020 Infobus Session on the Future of Classic Habbo! +badge_name_DE258=I voted in 2020 Habbo Elections +badge_desc_DE258=I hope my president wins! #notmypresident +badge_name_DE640=Presidential Nominee July 2020 +badge_desc_DE640=For the tears, the glory and the bobba. +badge_name_US106=Presidential Medal of Recognition +badge_desc_US106=Awarded by President %username% +badge_name_ES35B=Habbo President +badge_desc_ES35B=President of Classic Habbo - 2020! +badge_name_HOT2=Hot +badge_desc_HOT2=One Hot Habbo - Hot/Cool 2020 +badge_name_COL2=Cool +badge_desc_COL2=One Cool Habbo - Hot/Cool 2020 +badge_name_HOT=Hot Badge +badge_desc_HOT=Hot or Cool Campaign +badge_name_COL=Cool Badge +badge_desc_COL=Hot or Cool Campaign +badge_name_ES498=Bacon Medal +badge_desc_ES498=I might not have won but I was there! +badge_name_NL712=Flower Detective +badge_desc_NL712=I solved the mystery! July 2020 +badge_name_REPF1=SAW! Player +badge_desc_REPF1=I entered the Flower Power Castle (Rep Event) +badge_name_REPF2=SAW! Winner +badge_desc_REPF2=I conquered the Flower Power Castle (Rep Event) +badge_name_SSCB=Snow Storm Bronze +badge_desc_SSCB=Congratulations to Joorren and devrik +badge_name_SSCG=Snow Storm Gold +badge_desc_SSCG=Congratulations to Big.ViuS and Kaah +badge_name_SSCS=Snow Storm Silver +badge_desc_SSCS=Congratulations to Why and $$ +badge_name_UK694=USA Independence Day +badge_desc_UK694=Happy 4th of July! +badge_name_DEA=Flower Investigator +badge_desc_DEA=I was one of the 15 best detectives! July 2020 +badge_name_DISC2=One Thousand +badge_desc_DISC2=Wow! Discord #counting reached 1000! +badge_name_VRFD=Verified +badge_desc_VRFD=My account is verified on the official CH discord! +badge_name_POKHR=Pro Gambler +badge_desc_POKHR=A gambler at Heart +badge_name_POKSP=Pro Gambler +badge_desc_POKSP=A gambler by Trade +badge_name_ALEX=Alex +badge_desc_ALEX=I love Alex +badge_name_WING2LGBT+ Punk +badge_desc_WING2=I am LGBT and PUNK! +badge_name_WING1=LGBT+ Punk +badge_desc_WING1=I am LGBT and PUNK! +badge_name_FRECK=Freck +badge_desc_FRECK=Hobo life-style +badge_name_DEVRI=Devrik +badge_desc_DEVRI=Fan of the design +badge_name_CHRIS=Chrisol +badge_desc_CHRIS=Do I look like a baby to you? :/ +badge_name_IT221=Good vs Evil +badge_desc_IT221=Only one team will win! Who will it be? July 2020. +badge_name_FRI02=Lucifer +badge_desc_FRI02=I found Luci, the cat! What a wicked boy. +badge_name_MS3=Malign +badge_desc_MS3=Do not mess with me! Devil's Maze Top 10 +badge_name_MS1=Bad +badge_desc_MS1=You are bad, but not that bad! Devil's Maze Top 30 +badge_name_MS2=Evil +badge_desc_MS2=You are more evil than most Habbos! Devil's Maze Top 20 +badge_name_DE9=Flower Power Designer +badge_desc_DE9=For drawing one of the best Flower Power images! July 2020. +badge_name_DE8=Flower Power Pixel Artist +badge_desc_DE8=For creating the best Flower Power flyers. July 2020. +badge_name_KCK01=Kick Wars +badge_desc_KCK01=I trialed Kick Wars with Habbo Staff! +badge_name_BR026=Rock 'N' Roll +badge_desc_BR026=Celebrated International Day of Rock 'N' Roll with Habbo Hotel, 2020. +badge_name_DE08C=Good Angel +badge_desc_DE08C=Winner of Good vs Evil - I defeated the Evil forces. +badge_name_ES12D=Evil Angel +badge_desc_ES12D=Lost the battle between Good vs Evil. +badge_name_ES814=Mean Girls 2020 +badge_desc_ES814=On Wednesdays, we wear pink! +badge_name_US114=Mean Girls 2020 +badge_desc_US114=You can't sit with us! +badge_name_IT492=Artist +badge_desc_IT492=Official Habbo Hotel Pixel Artist +badge_name_PX4=Behind The Pixels +badge_desc_PX4=Joined Staff for the Launch of BTP, 2020. diff --git a/tools/gamedata/flash/external_variables.txt b/tools/gamedata/flash/external_variables.txt new file mode 100644 index 0000000..f0241bc --- /dev/null +++ b/tools/gamedata/flash/external_variables.txt @@ -0,0 +1,249 @@ +char.conversion.mac=[128:219,130:226,131:196,132:227,133:201,134:160,135:224,136:246,137:228,139:220,140:206,145:212,146:213,147:210,148:211,149:165,150:208,151:209,152:247,153:170,155:221,156:207,159:217,161:193,165:180,167:164,168:172,170:187,171:199,172:194,173:208,174:168,176:161,180:171,182:166,183:225,184:252,186:188,187:200,191:192,192:203,193:231,194:229,195:204,196:128,197:129,198:174,199:130,200:233,201:131,202:230,203:232,204:237,205:234,206:235,207:236,209:132,210:241,211:238,212:239,213:205,214:133,216:175,217:244,218:242,219:243,220:134,223:167,224:136,225:135,226:137,227:139,228:138,229:140,230:190,231:141,232:143,233:142,234:144,235:145,236:147,237:146,238:148,239:149,241:150,242:152,243:151,244:153,246:154,247:214,248:191,249:157,250:156,251:158,252:159,255:216] +stats.tracking.javascript=google +productdata.load.url=https://cdn.classichabbo.com/r38/gamedata/productdata.txt +image.library.questing.url=https://cdn.classichabbo.com/c_images/Quests/ +purse.widget.enabled=1 +avatar.widget.enabled=1 +figure.partsets.xml=https://cdn.classichabbo.com/r38/r63/figurepartconfig/partsets.xml +struct.font.grey=[#font:"v", #fontSize:9,#lineHeight:10,#color:rgb("#666666"),#ilk:#struct,#fontStyle:[#italic]] +viral.furni.post_type=appRequest +billboard.adwarning.left.url=AdWarningsUK/ad_warning_L.png +security.cast.load.url=https://cdn.classichabbo.com/r38/gordon/RELEASE38-22219-22056-200910151012_31a79855239b3813da4dbae573bd0f54/sec.cct?t=%token% +navigator.default.view=public +latencytest.interval=20000 +external.figurepartlist.txt=https://cdn.classichabbo.com/r38/gamedata/figuredata.xml +image.library.url=https://cdn.classichabbo.com/c_images/ +navigator.visible.public.root=3 +permitted.name.chars=1234567890qwertyuiopasdfghjklzxcvbnm-=?!@:., +external.texts.txt=https://cdn.classichabbo.com/r38/gamedata/external_flash_texts.txt +latencytest.report.delta=100 +struct.font.bold=[#font:"vb",#fontSize:9,#lineHeight:10,#color:rgb("#000000"),#ilk:#struct,#fontStyle:[#plain]] +figure.draworder.xml=https://cdn.classichabbo.com/r38/gamedata/figurepartconfig/draworder.xml +client.hotel_view.image=hotel_view_images_hq/hotelview_default.png +billboard.adwarning.right.url=AdWarningsUK/ad_warning_R.png +image.library.catalogue.url=https://cdn.classichabbo.com/c_images/catalogue/ +flash.dynamic.download.url=https://cdn.classichabbo.com/r38/dcr/hof_furni/ +room.default.wall=201 +new.chat.bubbles.enabled=1 +navigator.always_open_after_login=0 +menu.avatar.enabled=true +infostand.use.button.enabled=1 +purse.widget.currency.shells.enabled=0 +feed.badge_decorations.decoration_id=001 +purse.transactions.active=1 +new.chat.widget.enabled=1 +client.use.invites=1 +struct.font.plain=[#font:"v", #fontSize:9,#lineHeight:10,#color:rgb("#000000"),#ilk:#struct,#fontStyle:[#plain]] +hotelview.banner.url=https://cdn.classichabbo.com/r38/gamedata/banner.png +client.textdata.utf8=1 +logout.concurrent.url=https://cdn.classichabbo.com/r38/index.php +figure.animation.xml=https://cdn.classichabbo.com/r38/gamedata/figurepartconfig/animation.xml +dynamic.download.url=https://cdn.classichabbo.com/r38/furniture/ +language=en +struct.font.italic=[#font:"v", #fontSize:9,#lineHeight:10,#color:rgb("#000000"),#ilk:#struct,#fontStyle:[#italic]] +feed.badge_decorations.album=Feed_Badges +external.figurepartlist.txt.secure=https://cdn.classichabbo.com/r38/gamedata/figuredata.xml +logout.url=https://cdn.classichabbo.com/r38/index.php +room.default.floor=111 +navigator.public.default=3 +tutorial.name.new_user_flow=NUF_mini +furnidata.load.url=https://cdn.classichabbo.com/r38/gamedata/furnidata.txt +flash.dynamic.download.name.template=%typeid%.swf +struct.font.tooltip=[#font:"v", #fontSize:9,#lineHeight:10,#color:rgb("#000000"),#ilk:#struct,#fontStyle:[#plain]] +struct.font.link=[#font:"v", #fontSize:9,#lineHeight:10,#color:rgb("#000000"),#ilk:#struct,#fontStyle:[#underline]] +figure.draworder.xml.secure=https://cdn.classichabbo.com/r38/gamedata/figurepartconfig/draworder.xml +fuse.project.id=habbo_de +flash.dynamic.download.samples.template=mp3/sound_machine_sample_%typeid%.mp3 +navigator.private.default=4 +client.window.title=Habbo Hotel +dynamic.download.name.template=hh_furni_xx_%typeid%.cct +avatareditor.allowclubtryout=1 +private.image.library.url=https://cdn.classichabbo.com/c_images/ +logout.disconnect.url=https://cdn.classichabbo.com/r38/index.php +latencytest.report.index=3 +dynamic.download.samples.template=%typeid%.cct +navigator.visible.private.root=4 +stats.tracking.javascript.template=\TCODE +link.format.friendlist.pref=https://cdn.classichabbo.com/r38/profile/friendsmanagement?tab=6 +cast.entry.10=hh_human_hats +cast.entry.11=hh_human_hair +cast.entry.12=hh_human_shirt +interface.cmds.user.friend=["friend","trade","ignore","unignore","userpage"] +cast.entry.13=hh_human_leg +cast.entry.14=hh_human_shoe +cast.entry.15=hh_kiosk_room +cast.entry.17=hh_room_utils +cast.entry.16=hh_pets_common +cast.entry.19=hh_furni_classes +cast.entry.18=hh_room_ui +cfh.usercategories.withnoharasser=101,102,103,104,105,106 +room.cast.12=hh_human_50_fx +interface.cmds.active.ctrl=["move","rotate"] +room.cast.11=hh_human_fx +room.cast.10=hh_roomdimmer +client.minimail.embed.enabled=true +room.cast.1=hh_soundmachine +room.cast.2=hh_human_acc_chest +room.cast.3=hh_human_acc_waist +club.subscription.disabled=1 +cfh.usercategories.withharasser=101,102,103,104,105,106 +room.cast.8=hh_human_50_acc_chest +room.cast.9=hh_human_50_acc_waist +moderatoractionlog.url=http://theallseeingeye.sulake.com/ase/habbo/de/housekeeping/extra/hobba/moderator_activity.action?searchCriteria.habboName= +room.cast.4=hh_human_50_shirt +interstitial.interval=120000 +room.cast.5=hh_human_50_leg +room.cast.6=hh_human_50_shoe +room.cast.7=hh_human_50_item +navigator.tagcolorlimit.yellow=500 +interstitial.show.time=5000 +avatar.editor.club.promo.image=https://cdn.classichabbo.com/c_images/catalogue/club_promo_uk.gif +room.rating.enable=1 +interface.cmds.user.personal=["badge","dance","wave","hcdance","userpage"] +paalu.key.list=[#bal1:"Q", #bal2:"E", #push1:"A", #push2:"D", #move1:"N", #move2:"M", #stabilise:"SPACE"] +navigator.cache.duration=30 +navigator.colorlimit.orange=80 +room.cast.private=["hh_room_private", "hh_room_landscapes"] +displayer.tag.expiration.time=600000 +navigator.default_tab=official +navigator.tagcolorlimit.orange=1000 +client.full.refresh.period=5000 +interface.cmds.user.owner=["take_rights","give_rights","kick","friend","trade","ignore","unignore","userpage"] +text.crap.fixing=1 +castload.retry.delay=20000 +roomenterad.habblet.enabled=true +navigator.always_open_after_login=0 +interstitial.enabled=true +pixels.enabled=true +friendbar.enabled=true +interface.cmds.item.owner=["pick"] +cast.entry.42=hh_friend_list +interface.cmds.photo.owner=["pick","delete"] +cast.entry.41=hh_human_50_body +room.cast.small.1=hh_pets_50 +cast.entry.44=hh_pets +interface.cmds.active.owner=["move","rotate","pick"] +cast.entry.43=hh_instant_messenger +cast.entry.45=hh_guide +embed.showInRoomInfo=true +client.fatal.error.url=https://cdn.classichabbo.com/r38/index.php? +cast.entry.40=hh_human_50_acc_head +swimjump.key.list=[#run1:"A", #run2:"D", #dive1:"W", #dive2:"E", #dive3:"A", #dive4:"S", #dive5:"D", #dive6:"Y", #dive7:"X", #jump:"SPACE"] +cast.entry.9=hh_human_item +cast.entry.8=hh_human_face +cast.entry.7=hh_human_body +cast.entry.6=hh_human +cast.entry.5=hh_patch_de +cast.entry.4=hh_interface +cast.entry.3=hh_shared +cast.entry.2=hh_entry_base +cast.entry.1=hh_entry_de +client.credits.embed.enabled=true +avatar.editor.trial.promo=1 +text.render.compatibility.mode=2 +moderator.cmds=[":alert x",":ban x",":kick x",":superban x",":shutup x",":unmute x",":transfer x",":softkick x"] +cast.entry.38=hh_human_50_acc_eye +cast.entry.39=hh_human_50_acc_face +cast.entry.37=hh_human_50_hair +cast.entry.36=hh_human_50_hats +cast.entry.35=hh_human_50_face +avatar.editor.club.promo=0 +cast.entry.34=hh_human_acc_head +cast.entry.33=hh_human_acc_face +cast.entry.32=hh_human_acc_eye +cast.entry.31=hh_entry_init +cast.entry.30=hh_badges +navigator.colorlimit.yellow=50 +interstitial.max.displays=5 +client.flood.timeout=30000 +client.version.id=401 +navigator.tagcolorlimit.red=2000 +cast.entry.27=hh_dynamic_downloader +cast.entry.28=hh_recycler +cast.entry.29=hh_poll +cast.entry.24=hh_cat_new +cast.entry.23=hh_navigator +cast.entry.26=hh_buffer +cast.entry.25=hh_cat_gfx_all +cast.entry.20=hh_room +cast.entry.22=hh_photo +infostand.report.show=1 +cast.entry.21=hh_club +subscription.reminder.when.days.left=5 +navigator.colorlimit.red=92 +interface.cmds.user.ctrl=["kick","friend","trade","ignore","unignore","userpage"] +interface.cmds.photo.ctrl=[] +interface.cmds.item.ctrl=[] +lagWarningLog.enabled=1 +client.toolbar.static.enabled=true +questing.startQuestDelayInSeconds=10 +client.hotel_view.show_on_startup=1 +cfh.usercategories.withnoharasser=101,102,103,104,105,106 +roominfo.widget.enabled=1 +navigator.always_open_after_login=0 +client.minimail.embed.enabled=true +friend_bar.helper.friend_finding.enabled=true +interstitial.enabled=true +pixels.enabled=true +questing.enabled=true +welcome.screen.enabled=0 +link.format.club=http://%predefined%/credits/habboclub +club.subscription.disabled=1 +cfh.usercategories.withharasser=101,102,103,104,105,106 +client.fatal.error.url=http://%predefined%/client_error +embed.showInRoomInfo=true +friendbar.enabled=true +interstitial.interval=120000 +interstitial.show.time=5000 +client.allow.external.links=1 +client.credits.embed.enabled=true +room.rating.enable=1 +navigator.colorlimit.yellow=50 +new.chat.widget.enabled=1 +interstitial.max.displays=8 +questing.defaultCampaign=room_builder +navigator.colorlimit.orange=80 +link.format.collectibles=http://%predefined%/credits/collectibles +link.format.userpage=http://%predefined%//rd/%ID% +avatar.widget.enabled=1 +navigator.default_tab=official +client.logout.enabled=true +subscription.reminder.when.days.left=5 +infostand.report.show=1 +navigator.colorlimit.red=92 +client.news.embed.enabled=true +purse.widget.enabled=1 +questing.showDetailsForNextQuest=true +room.dragging.always_center=0 +client.allow.facebook.like=1 +catalog.drag_and_drop=true +hover.name.enabled=true +trax.player.sample.memory.purge.enabled=1 +standaloneAchievementList.enabled=true +menu.own_avatar.enabled=1 +menu.avatar.enabled=true +questing.useWing=true +catalog.furniture.animation=true +friendbar.notifications.enabled=true +userdefinedroomevents.enabled=true +room.recommendations=1 +avatar.editor.trial.promo=1 +userdefinedroomevents.enabled=true +text.crap.fixing=1 +welcome.screen.enabled=1 +menu.avatar.enabled=true +hover.name.enabled=true +new.chat.bubbles.enabled=1 +infostand.use.button.enabled=1 +inventory.furni.tab.new=new +questing.enabled=true +standaloneAchievementList.enabled=true +menu.own_avatar.enabled=1 +toolbar.new_additions.notification.enabled=true +simple.memenu.enabled=1 +friendbar.requests.enabled=true +friendbar.notifications.enabled=true +friendbar.stream.enabled=true +supersaverads.video.promo.enabled=true +group.badge.url=https://cdn.classichabbo.com/habbo-imaging/badge/%imagerdata%.gif +group.homepage.url=https://classichabbo.com/groups/%groupid%/id \ No newline at end of file diff --git a/tools/gamedata/flash/figuredata.txt b/tools/gamedata/flash/figuredata.txt new file mode 100644 index 0000000..6d23a40 --- /dev/null +++ b/tools/gamedata/flash/figuredata.txt @@ -0,0 +1,2 @@ + +FFCB98E3AE7DC99263AE7748945C2F6E482CFFC680F4AC54DC9B4CFFDBC1FFB696FF987FF0DCA3F5DA88DFC375EFD17DC89F56A89473B875609C543F6E392CEAEFD0E2E4B0D5D08CC4A7B3C2C4A7C5C0C2F1E5DAB3BDC34C311E644628926338A97C44B3957FBD9562C2A896CA9072CBBC90D1A78CD1BCADD7BCA9D7CBA3D8A595D8B07EE0BD91E0D0C5E2DBB9E3D38DE7C9A3EDD7BBEEE7E0EFC3B6F1D6B4F8E5DAFDDACFFFCC99FFD6A9DFA66FD1803AFFEEB9F6D059F2B11D9A5D2EAC5300783400D8D3D9918D984A4656F291599E3D3B5C4332FF8746FC610CDE3900D2FF00FFFFFFE5FF09A3FF8F3399663A7B93FFBDBCDE34A49F5699D5F9FB6699CCE71B0A95FFFA2D2D2D00FA000A0A0A1052621062621E321420B4A4234CAF248954282828292929298BB42DA5E9319CF631F6DE322F3E323235325B6A3296FA333333394194463C144A6A184B5A5A4D32234F87C0579E1F5A480A5A837B624A41625A20626262646D6C662608666666674E3B6A3910736346781414784215786D5A7B18947D5B1780557C8331418A49248B18208C694B8C967E904839926338946220947BAC948B6A94BD2994DFFF94FFD5976D3E9CF0689E3F0BA08C64A4A4A4A4DEFFA55A18A7272CA97C44B29B86B2A590B3957FB429CDB4EE29B58B5CB9A16EBD9562BD9CFFBDBD9DC21A86C29C57C2A896C2E3E8C376C4C4FFFFC54A29C59462C8D2E6C96B2FCA5A1ECA5A33CA9072CBBC90CD99C7CF6254D1A78CD1BCADD2C8CCD45B0AD4FE80D54173D5FF9CD7BCA9D7CBA3D8A595D8B07EDA945EDB7C62DCDCC8DDA934DE73DEDEDEDEDFDAB4DFDABEE0BA78E0BD91E0D0C5E1CC78E2DBB9E63139E6A4F6E7C9A3E7E92DEA5959ECFFEDEDD7BBEEE7E0EEEEEEEFC3B6F1D6B4F6AC31F73B32F8E5DAFDA61EFDDACFFE6D6DFE834DFF0000FF006AFF4814FF4C2FFF5F9BFF7329FF7383FF7BDEFF9C62FFA772FFADAEFFBC42FFBDBDFFBE73FFC53AFFCD94FFCD9BFFDC7AFFE639FFE673FFEAACFFEAADFFEEC5FFFFFFEEEEEEA4A4A4595959F6E179E7B027A86B19F8C790EB7E43C74400FFBFC2ED5C509F2B31E7D1EEAC94B37E5B90ACC9E66D80BB544A81C5EDE675B7C74F7AA2BBF3BD6BAE61456F40D2FF00EDFF9ABABB3D7A7D22F3E1AF96743D6B573BFFFFFFFFF41DFF9211FF27A6FF1300FF6D8FE993FFC600AD9B001D76FF2D1CDC00AFF20300B9A894FFEC1BD2FF1F55FF0219A53A53411E1E1E003F1D096E16105262106262121D6D1F1F1F20B4A420B9132828C8292929298BB42F2D26319CF631F6DE333333336633365E8A378BE837E8C53941943B7AC03D3D3D406A6543001A4562834A6A184C882B5A837B5CC4455F5F5F624A41625A20626262656A406666666874506A39106A405C6A4A40779FBB795E537B18947B58187C8F7D7D00047D003483314187D7CD88E0DE8B1820946220947BAC948B6A94BD2994FFD595784E983E4F98863E9FD787A4A4A4A4DEFFA88139ADD0FFAFDCDFB3FCFFB429CDB4EE29B6396DB79BFFB8E737BA9D73BAAD68BAC7FFBB2430BD9CFFBDFFC8C0B4C7C1C1C1C1D2DBC54A29C59462C6B3D6C745D9CA2221CDCDFFCDFFB3D1DFAFD1FFD4D54173D5FF9CD68C8CD7C187D9457ED97145DE73DEDEDEDEDFAFD1DFCBAFE63139E6A4F6E8B137E8FFFFEEEEEEF64C3EF6AC31F9A0A0FF006AFF1092FF45D6FF7329FF7383FF7BDEFF8516FF9C62FFB3D7FFB6DEFFBDBDFFC800FFC92BFFCD94FFCE64FFD2B3FFE639FFE673FFEDB3FFEE6DFFEEC5FFFF00FFFF66FFFFFAFFFFFF \ No newline at end of file diff --git a/tools/gamedata/flash/figuremap.xml b/tools/gamedata/flash/figuremap.xml new file mode 100644 index 0000000..7d07459 --- /dev/null +++ b/tools/gamedata/flash/figuremap.xml @@ -0,0 +1,1562 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/gamedata/flash/partsets.txt b/tools/gamedata/flash/partsets.txt new file mode 100644 index 0000000..0d1c15c --- /dev/null +++ b/tools/gamedata/flash/partsets.txt @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tools/gamedata/flash/partsets.xml b/tools/gamedata/flash/partsets.xml new file mode 100644 index 0000000..ade7b82 --- /dev/null +++ b/tools/gamedata/flash/partsets.xml @@ -0,0 +1,117 @@ + +- + + + + + + + + + + + + + + + + + + + + + + + +- + + + + + + + + + + + + + + + + + + + + + +- + + + + + + + + + + + +- + + + + + + + + +- + + + + +- + + + +- + + + + + +- + + + + + +- + + + + + + + + + +- + + + + + +- + + + +- + + + + + + + \ No newline at end of file diff --git a/tools/gamedata/shockwave/.htaccess b/tools/gamedata/shockwave/.htaccess new file mode 100644 index 0000000..bfe7ff4 --- /dev/null +++ b/tools/gamedata/shockwave/.htaccess @@ -0,0 +1,2 @@ +RewriteEngine On +RewriteRule ^external_variables.txt external_variables.php \ No newline at end of file diff --git a/tools/gamedata/shockwave/animation.txt b/tools/gamedata/shockwave/animation.txt new file mode 100644 index 0000000..e88e48a --- /dev/null +++ b/tools/gamedata/shockwave/animation.txt @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tools/gamedata/shockwave/animation.xml b/tools/gamedata/shockwave/animation.xml new file mode 100644 index 0000000..e88e48a --- /dev/null +++ b/tools/gamedata/shockwave/animation.xml @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tools/gamedata/shockwave/draworder.txt b/tools/gamedata/shockwave/draworder.txt new file mode 100644 index 0000000..0659812 --- /dev/null +++ b/tools/gamedata/shockwave/draworder.txt @@ -0,0 +1,874 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tools/gamedata/shockwave/draworder.xml b/tools/gamedata/shockwave/draworder.xml new file mode 100644 index 0000000..0659812 --- /dev/null +++ b/tools/gamedata/shockwave/draworder.xml @@ -0,0 +1,874 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tools/gamedata/shockwave/external_texts.txt b/tools/gamedata/shockwave/external_texts.txt new file mode 100644 index 0000000..aaee5e7 --- /dev/null +++ b/tools/gamedata/shockwave/external_texts.txt @@ -0,0 +1,4314 @@ +hubu_t2_1= +hubu_h3=Huumetietobussi +hubu_info_link1=Infobus Information +hubu_info_url_2=http://www.habbo.co.uk/help +hubu_close=Sulje kioski +hubu_t3_1= +hubu_h4=Anna palautetta +hubu_odotetaan=Waiting for replies from others... +hubu_answ_count=Replies +hubu_info_link2=Habbo FAQs +hubu_info=Welcome to the Infobus! The next Infobus event is on 5th July 2020 @ 7PM BST - this session is all about Looking Forward! Check back regularly for the latest Infobus sessions on a range of topics including online safety, scams and using Habbo. In the meantime, you can access our FAQs on the link below: +bus.full_msg=The Infobus is either full or closed at the moment, please come back later or visit our FAQs below for more information. +hubu_win=Bus - Info +hubu_t3_2=Hubun kiertuekalenteri 2002 +hubu_h5=Huumetietoa +hubu_t1_1=Kaupunkien pu_t2_2=Katso onko kotisi l_1=Tietoa Hubusta +hubu_h1=Puhelintuki +hubu_t4_2=Tsekkaa heebelin jorinat +hubu_info_t=The Infobus +hubu_t2_2= +hubu_t5_3=Yleistietoa EOPH ry:st-------------- +hubu_t2_3=Vapaa-ajan linkkejä +hubu_t4_1=Anna palautetta Hubusta +hubu_vastaa=Answer the question +hubu_t1_3= +hubu_t5_2=Huumeista-esite +hubu_h2=Harrastamaan! +hubu_t5_1=Lisetoa huumeista +hubu_info_url_1=http://www.habbohotel.co.uk/habbo/en/help/12 +hubu_t1_2= +nav_search_hd=Search rooms by Habbo name or room name. +nav_venue_cunning_fox_gamehall/0_desc=Pit your wits on the battlefield, the board or the baize - choose what to play here +nav_venue_bb_lobby_beginner_3/0_desc= +nav_public_helptext_hd=Public Spaces +nav_venue_sw_lobby_beginner_0_name=Snow Rookies Lobby +nav_venue_$unit.name$/0_desc=Roam more of the hotel's corridors +nav_venue_sun_terrace/0_name=Sun Terrace +nav_venue_bb_lobby_beginner_9_name=Beginners Battle Ball 10 +nav_venue_the_chromide_club/0_desc=Ghetto Fabulous +nav_venue_bb_lobby_beginner_10_name=Beginners Battle Ball 11 +nav_venue_sw_lobby_expert_2_name=Snow Marksmen Lobby +nav_venue_bb_lobby_expert_4/0_desc= +nav_venue_sw_lobby_beginner_6_name=Snow Rookies Lobby +nav_venue_ballroom/0_desc=Forget Beijing, check out Habbo's very own Olympic Stadium! +nav_venue_tv_studio/0_desc=Will you reach the final of the biggest brains in Habbo competition? +nav_venue_basement_lobby_name=Basement Lobby +nav_venue_bb_lobby_beginner_8/0_desc= +nav_venue_bb_lobby_free_1/0_desc=Meet friends and play BattleBall: Rebound! +nav_venue_bb_lobby_amateur_1_name=Gevorderden Battle Ball 2 +nav_venue_median_lobby/0_desc=A Mean place to hang +nav_venue_sw_lobby_amateur_2/0_desc= +nav_venue_space_cafe_name=Ten Forward +nav_venue_star_lounge/0_desc=Celebrities favourite hang out +nav_venue_club_massiva/2_name=Dancefloor +nav_venue_bb_lobby_intermediate_0/0_desc= +nav_venue_bb_lobby_amateur_desc=Amateur battle ball! +nav_venue_bb_lobby_tournament_0_name=Tournament +nav_venue_sw_lobby_beginner_1_name=Snow Rookies Lobby +nav_venue_cafe_gold/0_desc=Receive and discuss the latest safety tips and tricks. +nav_favourites_helptext=These are your favourite rooms. Nice selection you have here... +nav_modify_doorstatus_passwordprotected=Let other people move and leave furniture in the room. +nav_venue_bb_lobby_beginner_2_name=Beginners Battle Ball 3 +nav_venue_bb_lobby_expert_4_name=Experts Battle Ball 5 +nav_popup_header=Recommended rooms +nav_venue_bb_lobby_intermediate_2_name=Semi-profs Battle Ball 3 +nav_venue_theatredrome_deli/0_desc=Join in all the fun of the fair! +nav_venue_bb_lobby_beginner_6/0_desc= +nav_venue_rooftop_rumble_name=Rooftop Rumble +nav_venue_sw_lobby_amateur_7_name=Snow Slingers Lobby +nav_venue_picnic/0_desc=Enjoy the great outdoors, celebrate mother nature and party! +nav_venue_the_chromide_club_name=The Chromide Club +nav_private_norooms=You dont have any rooms - create one? +nav_venue_emperors/0_desc=Even the smallest of light... shines in the darkness +nav_venue_sw_lobby_amateur_0_name=Snow Slingers Lobby +nav_venue_bb_lobby_beginner_10/0_desc= +nav_venue_theatredrome_xmas/0_desc= +nav_venue_habbo_lido_ii_name=Habbo Lido II +nav_venue_sw_lobby_tournament_3_name=Tournament Lobby +nav_venue_sw_lobby_expert_1/0_desc= +nav_popup_nav_link=Open the Navigator +nav_venue_hallway_ii_name=Hallway II +nav_private_helptext_hd=Rooms +nav_venue_theatredrome_habbowood/0_desc=Home to the Habbowood Gala and HAFTA Awards! +nav_venue_sw_lobby_amateur_2_name=Snow Slingers Lobby +nav_venue_sw_lobby_beginner_6/0_desc= +alert_no_category=Your room has no category. Select one from the list. +nav_venue_chill/0_name=Zen Garden +nav_venue_gate_park_name=Imperial Park +nav_own_hd=Your Rooms. +nav_venue_bb_lobby_intermediate_0_name=Intermediate +nav_addtofavourites=Add to favourites +nav_venue_sw_arena_expert_name=Playing expert game +nav_venue_old_skool/0_desc=A set of rooms inspired by the original and legendary Mobiles Disco, the progenitor of Habbo +nav_venue_sunset_cafe/0_desc=Come and chat about Official Fansites and meet their staff! +nav_help_text=Click the Public Spaces tab on the top left of this navigator to find gaming rooms! +nav_venue_sw_lobby_beginner_7_name=Snow Rookies Lobby +nav_venue_bb_lobby_beginner_2/0_desc= +nav_venue_orient/0_name=Club Golden Dragon +nav_venue_sw_lobby_beginner_4_name=Snow Rookies Lobby +nav_venue_star_lounge_desc=Is there a VIP visitor in the hotel? +nav_modify_choosecategory=Choose a category for your room +nav_venue_bb_lobby_tournament_2/0_desc= +nav_venue_bb_lobby_intermediate_3/0_desc= +nav_venue_bb_lobby_expert_0/0_desc= +nav_venue_club_mammoth_name=Club Mammoth +nav_roomInfo=Room info +nav_venue_sw_lobby_amateur_6_name=Snow Slingers Lobby +nav_venue_hotel_kitchen_name=Hotel Kitchen +nav_venue_beauty_salon_loreal/0_desc=No Pixel Surgery, only natural make-ups! +nav_venue_bb_lobby_amateur_3/0_desc= +nav_venue_sw_arena_beginner_name(0)=SnowStorm Aloittelijat +nav_venue_club_mammoth/0_name=Club Mammoth +nav_venue_library/0_name=Habbo Library +nav_venue_gate_park/0_desc=Follow the path... +nav_venue_sunset_cafe_name=Sunset Cafe +nav_venue_pizza/0_desc=Pizza Palace +nav_venue_sw_arena_intermediate_name(0)=SnowStorm Keskitaso +nav_venue_sw_lobby_free_3_name=Free Game Lobby +nav_venue_sw_lobby_expert_2/0_desc=Todellisille lumisotureille. +nav_venue_sw_lobby_free_2/0_desc= +nav_venue_bb_lobby_beginner_4_name=Beginners Battle Ball 5 +nav_venue_sw_lobby_intermediate_5/0_desc=Lumisota sen kuin vain kovenee. +nav_venue_bb_lobby_tournament_7/0_desc= +nav_error_passwordtooshort=The password is too short. +nav_venue_sw_arena_intermediate_name=Playing intermediate game +nav_incorrectflatpw=Incorrect, try again. +nav_venue_theatredrome_easter_name=Theatredrome Easter +nav_dooropens=Door opens! Go on in... +nav_venue_bb_lobby_tournament_3/0_desc= +nav_modify_doorstatus_open=Open +nav_venue_median_lobby_name=Median Lobby +nav_venue_bb_lobby_amateur_0/0_desc= +nav_venue_pizzeria_name=Slice of Life +nav_venue_sw_lobby_amateur_4/0_desc=Astetta rankempaa lumisotaa. +nav_modify=Modify +nav_modify_doorstatus=Door status +nav_venue_club_massiva/1_desc=Strut your funky stuff +nav_venue_sw_lobby_intermediate_5_name=Snow Bombardiers Lobby +nav_venue_sport/0_name=The Power Gym +nav_venue_theatredrome_halloween_name=Theatredrome Habboween +nav_venue_sw_lobby_amateur_1_name=Snow Slingers Lobby +nav_venue_bb_lobby_tournament_16/0_desc= +nav_venue_orient/0_desc=Tres chic with an Eastern twist. For Habbo Club members only. +nav_venue_club_massiva_name=Club Massiva +nav_venue_bb_lobby_beginner_0_name=Beginner +nav_ownrooms_helptext=If you didn't know, these are your rooms. Here you can modify your rooms or create new ones if you feel like it. +nav_roomnfo_hd_src=Search Rooms +nav_search_helptext=Looking for something? Here you can search other Habbo's rooms. Type the room name or the name of the Habbo to search for a room. +nav_venue_bb_lobby_amateur_13/0_desc= +nav_venue_the_dirty_duck_pub/0_desc=Grab a stool and hear Dave and Sadie talk about the good old days... +nav_rooms_own=Own Room(s) +nav_venue_park/0_desc=Visit the park and the infamous Infobus +nav_venue_sw_lobby_tournament_8/0_desc= +nav_venue_cafe_gold/0_name=Kultakahvila +nav_venue_theatredrome/0_desc=Perform your latest master piece, or simply catch the latest gossip. +nav_venue_sw_lobby_beginner_0/0_desc= +nav_venue_sw_lobby_intermediate_2_name=Snow Bombardiers Lobby +nav_venue_sw_lobby_beginner_3_name=Snow Rookies Lobby +nav_venue_bb_lobby_amateur_6_name=Gevorderden Battle Ball 7 +nav_venue_bb_lobby_intermediate_2/0_desc= +nav_venue_bb_lobby_beginner_0/0_desc= +nav_loading=Loading... +nav_modify_nameoftheroom=Name Of The Room +nav_venue_sw_lobby_free_4_name=Free Game Lobby +nav_venue_sw_lobby_beginner_5/0_desc= +nav_venue_bb_lobby_tournament_9/0_desc= +nav_venue_bb_lobby_intermediate_3_name=Semi-profs Battle Ball 4 +nav_venue_hallway_ii/0_desc=Taking you to the far reaches of Habbo Hotel +nav_venue_habburger's_name=Habburgers +nav_venue_bb_lobby_intermediate_9/0_desc= +nav_owner=Owner +nav_venue_sw_lobby_tournament_2_name=Tournament Lobby +nav_venue_bb_lobby_tournament_13_name=Competitie Battle Ball 14 +nav_removerights=Reset +nav_venue_tearoom/0_desc=Try the tea in this Mongol cafe - it is to die for darlings! +nav_venue_bb_lobby_amateur_3_name=Gevorderden Battle Ball 4 +nav_venue_sw_lobby_intermediate_1/0_desc= +nav_privateRooms=Rooms +nav_venue_basement_lobby/0_desc=For low level hanging +nav_venue_bb_lobby_amateur_4_name=Gevorderden Battle Ball 5 +nav_venue_sw_lobby_free_desc=Come and play. It's free! +nav_venue_sw_lobby_tournament_1_name=Tournament Lobby +nav_venue_bb_lobby_tournament_4/0_desc= +nav_venue_ice_cafe_name=Ice Cafe +nav_venue_sw_lobby_free_8_name=Free Game Lobby +nav_venue_bb_lobby_amateur_5/0_desc= +nav_venue_sw_lobby_free_9/0_desc=Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan. +nav_venue_bb_lobby_tournament_8_name=Competitie Battle Ball 9 +nav_venue_bb_lobby_tournament_1_name=Competitie Battle Ball 2 +nav_venue_sw_lobby_free_5_name=Free Game Lobby +nav_venue_bb_lobby_tournament_3_name=Competitie Battle Ball 4 +nav_venue_bb_lobby_free_0/0_desc=Meet friends and play BattleBall: Rebound! +nav_venue_sw_lobby_tournament_9/0_desc= +nav_venue_sw_lobby_amateur_3_name=Snow Slingers Lobby +nav_venue_bb_lobby_amateur_10/0_desc= +nav_venue_bb_lobby_intermediate_4_name=Semi-profs Battle Ball 5 +nav_venue_bb_lobby_5_name=Battle Ball Kaikille +nav_venue_sw_lobby_tournament_6/0_desc= +nav_venue_snowwar_lobby/0_desc=Snow Storm LobbyCome and be a Snow Stormer! +nav_noanswer=No answer +nav_venue_bb_lobby_amateur_9_name=Gevorderden Battle Ball 10 +nav_venue_rooftop_rumble_ii_name=Rooftop Rumble II +nav_rooms_popular=Popular rooms +nav_venue_club_massiva_desc=Strut your funky stuff! +nav_venue_branded/0_desc=Something funny's going on, do you know what? +nav_delroom1=If you want to save the furniture in this room, move it to the giant hand before you continue. +nav_venue_bb_lobby_expert_1_name=Experts Battle Ball 2 +nav_venue_sw_lobby_tournament_4/0_desc= +nav_venue_skylight_lobby_name=Skylight Lobby +nav_venue_ballroom_name=Ballroom +nav_venue_bb_lobby_beginner_9/0_desc= +nav_venue_sw_lobby_free_4/0_desc=Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan. +nav_venue_bb_lobby_beginner_desc=Beginner battle ball +nav_venue_bb_arena_1_name=Battle Ball Aloittelijat +nav_venue_snowwar_lobby_name=Snow Storm Lobby +nav_venue_sw_lobby_beginner_9_name=Snow Rookies Lobby +nav_venue_bb_lobby_amateur_2/0_desc= +nav_venue_netcafe/0_desc=Learn a foreign language and win Habbo Credits in our quests! +nav_venue_bb_lobby_amateur_0_name=Amateur +nav_venue_theatredrome_halloween/0_desc=Habboween 2008 starts right here, right now! Ready? +nav_goingprivate=Going to Guest room +nav_modify_name=Name of the room +nav_venue_bb_lobby_beginner_17/0_desc= +nav_venue_welcome_lounge_name=Welcome Lounge +nav_venue_sw_lobby_amateur_5_name=Snow Slingers Lobby +nav_venue_bb_lobby_beginner_1_name=Beginners Battle Ball 2 +nav_venue_sw_lobby_expert_1_name=Snow Marksmen Lobby +nav_venue_club_massiva/0_desc=Rest your dancing feet! +nav_venue_sw_arena_amateur_name(0)=SnowStorm Amatöörit +nav_venue_chill_name=Zen Garden +nav_venue_bb_lobby_beginner_13_name=Beginners Battle Ball 14 +nav_venue_sw_lobby_intermediate_4_name=Snow Bombardiers Lobby +nav_venue_tearoom/0_name=Chinese Tea Room +nav_venue_sun_terrace/0_desc=Grab a sunbed and top up that tan! +nav_venue_bb_lobby_expert_7/0_desc= +nav_venue_bb_lobby_amateur_7/0_desc= +nav_venue_bb_lobby_expert_3/0_desc= +nav_modify_roomdescription=Room Description +nav_prvrooms_notfound=Your search did not match any rooms +nav_venue_bb_lobby_tournament_14/0_desc= +nav_venue_bb_lobby_free_3/0_desc=Meet friends and play BattleBall: Rebound! +nav_venue_sw_lobby_intermediate_3_name=Snow Bombardiers Lobby +nav_venue_bb_lobby_tournament_17/0_desc= +nav_venue_bb_lobby_intermediate_1/0_desc= +nav_venue_habbo_cinema_name=Habbo Cinema +nav_venue_bb_lobby_beginner_15/0_desc= +nav_venue_the_den/0_desc=Popular? Win a cool band and party at your school. You soon will be! +nav_venue_bb_lobby_amateur_2_name=Gevorderden Battle Ball 3 +nav_hotelview=Hotel view +nav_venue_bb_lobby_expert_6/0_desc= +nav_venue_rooftop/0_desc=One of the highest points in Habbo Hotel! +nav_delroom3=Room deleted! +nav_modify_nameshow=Show your name in the room info +nav_venue_bouncer_room_4_name=Experts Battle Ball Arena +nav_venue_bb_arena_2_name=Battle Ball Amatöörit +nav_venue_bb_lobby_beginner_5_name=Beginners Battle Ball 6 +nav_modify_doorstatus_locked=Locked (visitors have to ring the bell) +nav_modify_doorstatus_pwagain=pw again: +nav_venue_sw_lobby_beginner_2_name=Snow Rookies Lobby +nav_venue_bb_lobby_tournament_desc=Play battle ball tournament! +Alert_YourPasswordIstooShort=Room password is too short. It must be at least 6 characters long +nav_venue_sw_lobby_expert_0/0_desc= +nav_venue_sw_lobby_beginner_9/0_desc= +nav_venue_pizza_name=Slice of Life +nav_venue_picnic/0_name=Picnic Garden +nav_venue_bb_lobby_expert_2_name=Experts Battle Ball 3 +nav_venue_sw_lobby_beginner_8_name=Snow Rookies Lobby +nav_venue_bb_lobby_beginner_14_name=Beginners Battle Ball 15 +nav_venue_kattoterassi/0_desc=When push comes to shove... +nav_venue_bb_lobby_tournament_0/0_desc= +nav_venue_the_den_name=The Den +nav_venue_bb_lobby_free_2/0_desc=Meet friends and play BattleBall: Rebound! +nav_venue_tv_studio_general/0_desc=Suosikki rules! Musaa, leffoja ja staroja! +nav_venue_bb_lobby_expert_1/0_desc= +nav_venue_bb_lobby_expert_9/0_desc= +nav_deleteroom=Delete +nav_venue_bouncer_room_0_name=Battle Ball Competitie Arena +nav_venue_sw_lobby_tournament_desc=For stand-alone Tournaments. +nav_venue_bb_lobby_beginner_19/0_desc= +nav_venue_eric's_eaterie/0_desc=Join Eric for a bite to eat +nav_venue_habbo_cinema/0_desc=Now Showing: The Making of Habbo Big Brother +nav_people=Who's in here? +nav_recommended_rooms=Recommended Rooms +nav_venue_bb_lobby_beginner_8_name=Beginners Battle Ball 9 +nav_venue_sw_lobby_free_7_name=Free Game Lobby +nav_venue_bb_lobby_intermediate_1_name=Semi-profs Battle Ball 2 +nav_venue_sw_lobby_amateur_3/0_desc=Astetta rankempaa lumisotaa. +nav_venue_bb_lobby_beginner_18/0_desc= +nav_venue_sw_lobby_amateur_7/0_desc=Astetta rankempaa lumisotaa. +nav_venue_sw_lobby_tournament_0/0_desc= +nav_venue_sw_lobby_amateur_1/0_desc= +nav_venue_sw_lobby_free_1_name=Free Game Lobby +nav_venue_sw_lobby_free_1/0_desc= +nav_venue_bb_lobby_tournament_14_name=Competitie Battle Ball 15 +nav_refresh_recoms=Refresh recommendations +nav_venue_bb_lobby_expert_8/0_desc= +nav_venue_bb_lobby_amateur_11/0_desc= +nav_venue_welcome_lounge/0_desc=New? Lost? Get a warm welcome here! +nav_venue_sport_name=Power Gym +nav_venue_bb_lobby_amateur_1/0_desc= +nav_venue_bb_lobby_beginner_11_name=Beginners Battle Ball 12 +nav_venue_emperors_name=Emperor's hall +nav_venue_hotel_kitchen/0_desc=Beware the flying knives! +nav_venue_bb_lobby_beginner_4/0_desc= +nav_venue_sw_lobby_free_5/0_desc=Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan. +nav_help_title=Want a room of your own? +nav_venue_sw_lobby_beginner_1/0_desc= +nav_venue_sunset_cafe_ii/0_desc=Home to the Duck Island residents. +nav_venue_sw_lobby_beginner_7/0_desc= +nav_venue_sw_lobby_amateur_desc=Practice improves a Snow Stormer's aim... Ops, missed! +nav_venue_bb_lobby_amateur_8/0_desc= +nav_venue_sw_lobby_tournament_7_name=Tournament Lobby +nav_searchbutton=Search +nav_venue_club_mammoth/0_desc=Monumental and magnificent. For Habbo Club members only. +nav_venue_bb_game/0_name=Battle Ball Arena +nav_venue_pizzeria/0_desc=Pizza; food of the hungry! +nav_venue_pizza_desc=Tunnelmallinen pizzapaikka kiireettömään nautiskeluun. +nav_venue_bb_lobby_amateur_12/0_desc= +nav_venue_sw_lobby_free_6_name=Free Game Lobby +nav_venue_sw_lobby_free_8/0_desc=Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan. +nav_venue_theatredrome_xmas_name=Theatredrome Xmas +nav_venue_sw_lobby_free_0_name=Free Game Lobby +nav_venue_tv_studio_name=MuchMusic HQ +nav_venue_sw_arena_amateur_name=Playing amateur game +nav_venue_hallway_name=Hallway +nav_venue_sw_lobby_intermediate_desc=For the accomplished Snow Stormers. +nav_venue_bb_lobby_beginner_3_name=Beginners Battle Ball 4 +nav_venue_theatredrome_name=Theatredrome +nav_venue_bb_lobby_tournament_19/0_desc= +nav_venue_bb_lobby_amateur_9/0_desc= +nav_ringbell=The door is locked. Ringing the bell, and waiting... +nav_venue_bb_lobby_tournament_11_name=Competitie Battle Ball 12 +nav_venue_bb_lobby_beginner_5/0_desc= +nav_venue_sw_arena_free_name(0)=SnowStorm - kaikki kaikkia vastaan +nav_venue_rooftop_name=Rooftop Cafe +nav_venue_eric's_eaterie_name=Eric's Eaterie +nav_venue_sw_lobby_expert_desc=For the William Tells and Robin Hoods of Snow Storming. +navigator.no_category=No Category +nav_venue_sw_lobby_intermediate_1_name=Snow Bombardiers Lobby +nav_publicRooms=Public Spaces +nav_venue_rooftop_rumble_ii/0_desc=Duel on the floats or chill by the waterfall. +nav_venue_bb_lobby_beginner_12/0_desc= +nav_updatenote_header=Note! +nav_room_banned=You are banned from this room. +nav_venue_bb_lobby_amateur_5_name=Gevorderden Battle Ball 6 +nav_venue_bb_lobby_tournament_4_name=Competitie Battle Ball 5 +nav_cancel=Cancel +nav_tryingpw=Trying the password... +nav_venue_sw_lobby_beginner_desc=Yes, take a load of snowballs and hit the enemy Teams. Easy, isn't it? +nav_venue_sw_lobby_amateur_6/0_desc=Astetta rankempaa lumisotaa. +nav_venue_bb_lobby_tournament_6_name=Competitie Battle Ball 7 +nav_venue_sw_lobby_beginner_8/0_desc= +nav_venue_bb_lobby_tournament_6/0_desc= +nav_venue_sw_lobby_tournament_5_name=Tournament Lobby +nav_venue_habbo_lido_ii/0_desc=Pool is open for swimming and diving! +nav_venue_skylight_lobby/0_desc=This was the Habbo Big Brother Lounge during series 1 (2008) +nav_venue_sw_lobby_tournament_2/0_desc= +nav_showfull=Show Full Rooms +nav_venue_sw_lobby_tournament_6_name=Tournament Lobby +nav_venue_space_cafe/0_desc=Star Wars The Clone Wars on Blu-Ray and DVD from December 8 +nav_venue_bouncer_room_3_name=Semi-profs Battle Ball Arena +nav_venue_bb_lobby_tournament_12_name=Competitie Battle Ball 13 +nav_venue_bb_lobby_amateur_14/0_desc= +nav_venue_ice_cafe/0_desc=Grab some brain juice! +nav_removerights_desc=Remove all rights to this room from other users. +nav_modify_doorstatus_pwprotected=Password protected: +nav_modify_maxvisitors=Choose maximum number of visitors +nav_venue_sw_lobby_beginner_5_name=Snow Rookies Lobby +nav_venue_sw_lobby_amateur_5/0_desc=Astetta rankempaa lumisotaa. +nav_venue_netcafe_name=My Habbo Home Netcafe +nav_venue_club_massiva/2_desc=Make all the right moves +nav_venue_park_name=Habbo Gardens +nav_remrightsconf=You are about to remove all rights from your room. This means that only you will have rights to move and place furni in the room. +nav_venue_bb_lobby_beginner_1/0_desc= +nav_venue_bb_lobby_expert_desc=Expert battle ball! +nav_venue_sw_lobby_tournament_4_name=Tournament Lobby +nav_venue_sw_lobby_tournament_8_name=Tournament Lobby +roomatic_choosecategory=Choose a category for your room. +nav_venue_sw_lobby_tournament_7/0_desc= +nav_venue_bb_arena_4_name=Battle Ball Expertit +nav_venue_bouncer_room_1_name=Beginners Battle Ball Arena +nav_venue_sport/0_desc=Get a solid work out! +nav_venue_bb_lobby_intermediate_5/0_desc= +nav_venue_bb_lobby_beginner_13/0_desc= +nav_venue_sw_lobby_free_7/0_desc=Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan. +nav_venue_sun_terrace_name=Sun Terrace +nav_venue_bb_lobby_intermediate_6/0_desc= +nav_venue_bb_lobby_expert_0_name=Expert +nav_venue_welcome_lounge_iii/0_desc=New? Lost? Get a warm welcome here from Habbo eXperts. +nav_venue_bb_lobby_tournament_15/0_desc= +nav_venue_sw_lobby_free_6/0_desc=Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan. +nav_venue_sw_lobby_intermediate_0_name=Snow Bombardiers Lobby +nav_error_room_closed=The room is closed. +nav_venue_sw_lobby_free_3/0_desc= +nav_venue_bb_lobby_intermediate_8/0_desc= +nav_venue_sw_lobby_tournament_3/0_desc= +nav_gobutton=Go +nav_venue_bb_lobby_tournament_13/0_desc= +nav_private_helptext_hd_main=Habbo Guest Rooms +nav_venue_bb_arena_0_name=Battle Ball kaikille +nav_updatenote=Updating your room properties may take a while. The changes have been made, but it'll take a few minutes until all Habbos can see them. +nav_venue_sw_lobby_amateur_4_name=Snow Slingers Lobby +nav_venue_the_dirty_duck_pub_name=The Dirty Duck Pub +nav_venue_orient_name=Club Orient +nav_venue_bb_lobby_tournament_11/0_desc= +nav_venue_welcome_lounge_ii/0_desc=New? Lost? Get a warm welcome here! +nav_rooms_search=Search +nav_venue_old_skool_name=Old Skool Habbo +nav_venue_bb_lobby_expert_2/0_desc= +nav_venue_sw_lobby_intermediate_4/0_desc=Lumisota sen kuin vain kovenee. +nav_venue_theatredrome_valentine_name=Theatredrome Valentine +nav_venue_sw_arena_expert_name(0)=SnowStorm Expertit +nav_public_helptext=These are hotel's public rooms. What are you waiting for? Go and meet other Habbos! +nav_venue_sw_lobby_tournament_1/0_desc= +nav_venue_bb_lobby_intermediate_desc=Intermediate battle ball! +nav_venue_beauty_salon_general/0_desc=Angus, Thongs and Perfect Snogging in cinemas July 25th +nav_venue_picnic_dudesons/0_desc=Duudsoneiden sponssaama oma Ranchi - www.extremeduudsonit.com +nav_venue_hallway/0_desc=Connecting you to the heart of Habbo Hotel +nav_venue_dusty_lounge/0_desc=Old, cool, Dusty and the perfect room for the biggest brains in Habbo +nav_rooms_favourite=Favourites +nav_venue_bb_lobby_tournament_1/0_desc= +nav_venue_bb_arena_3_name=Battle Ball Keskitaso +nav_openbutton=Open +nav_venue_sw_lobby_beginner_4/0_desc= +nav_venue_rooftop_rumble/0_desc=Wabble Squabble your bum off in our cool rooftop hang out +nav_venue_library/0_desc=Books! Glorius books! Fill yourself with information and lose yourself in wonderful literary worlds. +nav_venue_bb_lobby_tournament_8/0_desc= +nav_venue_bb_lobby_tournament_18/0_desc= +nav_venue_bb_lobby_amateur_4/0_desc= +nav_venue_bb_lobby_beginner_16/0_desc= +nav_venue_bb_lobby_intermediate_7/0_desc= +nav_venue_sw_lobby_free_2_name=Free Game Lobby +nav_venue_beauty_salon_loreal_name=Beauty salon +nav_venue_habburger's/0_desc=Get food here! +nav_venue_dusty_lounge_name=Dusty Lounge +nav_roomispwprotected=The room is password protected. +nav_venue_cafe_gold_name=The Oasis +nav_venue_tv_studio_nike/0_desc= +nav_venue_beauty_salon_general_name=Beauty salon +nav_venue_theatredrome_valentine/0_desc=Home of Ralph (wannabe panda in training) +nav_delroom2=Are you sure you want to delete this room? All the furniture left in it will also be deleted. +nav_venue_sw_lobby_free_9_name=Free Game Lobby +nav_venue_floatinggarden_name=Floating Garden +nav_venue_bb_lobby_intermediate_5_name=Semi-profs Battle Ball 6 +nav_venue_star_lounge_name=Star Lounge +nav_venue_bb_lobby_beginner_7/0_desc= +nav_venue_sw_lobby_intermediate_0/0_desc= +nav_venue_bb_lobby_amateur_7_name=Gevorderden Battle Ball 8 +nav_private_helptext=These are the rooms owned by Habbos. Select a category first and then browse some rooms and meet some people! +nav_roomnfo_hd_own=Own Rooms +nav_venue_bb_lobby_tournament_12/0_desc= +nav_error_room_full=The room is full. +nav_venue_sw_arena_tournament_name=Playing a tournament game! +nav_venue_sw_lobby_tournament_9_name=Tournament Lobby +nav_venue_club_massiva/1_name=Chill-out Room +nav_modify_doorstatus_givepw=Password for the room +nav_fullbutton=Full +nav_venue_sw_lobby_tournament_5/0_desc= +navigator=Hotel Navigator +nav_venue_floatinggarden/0_desc=Climb the rocks, chill in the shade and watch for pirate ships! +nav_venue_bb_lobby_beginner_12_name=Beginners Battle Ball 13 +nav_venue_sw_lobby_free_0/0_desc=Meet friends and play SnowStorm! +nav_venue_sw_lobby_amateur_0/0_desc= +nav_venue_bb_lobby_beginner_11/0_desc= +nav_venue_bb_lobby_beginner_6_name=Beginners Battle Ball 7 +nav_hidefull=Hide Full Rooms +nav_venue_sw_lobby_beginner_2/0_desc= +nav_createroom=Create Own Room +nav_venue_bb_lobby_tournament_5_name=Competitie Battle Ball 6 +nav_venue_bb_lobby_beginner_7_name=Beginners Battle Ball 8 +nav_venue_tearoom_name=Chinese Tea Room +nav_popup_go=>> +nav_venue_bb_lobby_beginner_14/0_desc= +nav_venue_sw_lobby_beginner_3/0_desc= +nav_venue_bb_lobby_expert_3_name=Experts Battle Ball 4 +nav_venue_sw_lobby_intermediate_2/0_desc= +nav_src_hd=Search Results. +nav_venue_cafe_ole_name=Cafe ole +nav_venue_sw_lobby_intermediate_3/0_desc=Lumisota sen kuin vain kovenee. +nav_venue_theatredrome_easter/0_desc=Easter is Eco! Now sing the environmentally friendly song. +nav_venue_habbo_lido_name=Habbo Lido +nav_venue_habbo_lido/0_desc=Splish, splash and have a bash in the Habbo pool! +nav_venue_bb_lobby_tournament_5/0_desc= +nav_venue_bb_lobby_tournament_7_name=Competitie Battle Ball 8 +nav_removefavourites=Remove from favourites +nav_venue_sw_arena_free_name=Playing free for all game +nav_venue_bb_lobby_tournament_9_name=Competitie Battle Ball 10 +nav_venue_sw_lobby_expert_0_name=Snow Marksmen Lobby +nav_venue_bouncer_room_2_name=Gevorderden Battle Ball Arena +nav_venue_chill/0_desc=Where Ideas can flow freely +nav_modify_letothersmove=Let other people move and leave furniture in the room. +nav_venue_bb_lobby_tournament_2_name=Competitie Battle Ball 3 +nav_venue_sw_lobby_tournament_0_name=Tournament Lobby +nav_venue_main_lobby/0_desc=The heart of Habbo Hotel +nav_ok=OK +nav_venue_bb_lobby_tournament_10_name=Competitie Battle Ball 11 +nav_roomnfo_hd_fav=Favourite Rooms +nav_venue_cafe_ole/0_desc=Relax with friends over one of Marias specialty coffees +nav_venue_bb_lobby_intermediate_4/0_desc= +nav_venue_sw_arena_beginner_name=Playing beginner game +nav_venue_bb_lobby_amateur_8_name=Gevorderden Battle Ball 9 +nav_venue_main_lobby_name=Main Lobby +nav_venue_bb_lobby_amateur_6/0_desc= +nav_venue_bb_lobby_expert_5/0_desc= +nav_createroom_hd=Here you can create your own room! +nav_venue_bb_lobby_tournament_10/0_desc= +nav_fav_hd=Your Favourite Rooms. +roomevent_type_2=Trading +roomevent_default_name=Event name.. +roomevent_not_available=Sorry, no events available +roomevent_type_0=Hottest Events +roomevent_type_6=Grand Openings +roomevent_default_description=Come and check out my event! +roomevent_type_5=Debates & Discussion +roomevent_default_desc=Event description.. +roomevent_quit=End event +roomevent_type_1=Parties & Music +roomevent_browser_title=Events +roomevent_create=Create +roomevent_create_name=Type the name of your event +roomevent_type_9=Group Events +roomevent_type_8=Jobs +roomevent_host=Host: +roomevent_type_11=Helpdesk +roomevent_type_7=Dating +roomevent_type_10=Performance +roomevent_type_3=Games +roomevent_browser_create=Host an event +roomevent_starttime=Started at: +interface_icon_events=Open the room event browser +roomevent_invalid_input=You must give your event a name and a description. +roomevent_create_description=Describe your event +roomevent_edit=Edit +roomevent_type_4=Habbo Guides' Events +credit_trade_value=Includes credit furnis worth %value% credits. +purse_value=VALUE +purse_coins=Habbo Credits +purse_vouchers_exitbutton=Cancel +purse_vouchers_error1=Invalid voucher code. +purse_vouchers_checking=Checking code, please wait... +credit_redeem_text=You are going to change Furni to %value% credits. +transaction_system_refunds=Refund +purse_head=HABBO ACCOUNT ACTIVITY +purse_link=Click here to see how to get Credits. +purse_vouchers_sendbutton=Get Credits! +purse_vouchers_helpbutton=More about vouchers >> +purse_transaction=View Transactions +# purse_ad_url=http://www.sulake.com/images/habbo.gif +purse_vouchers_error0=Technical error! Cannot redeem voucher. +transaction_system_bank_op=Osuuspankki +credit_redeem_info=More info about credit furni >> +transaction_system_sms_dna=DNA +purse_header=Habbo Purse +purse_credits=You have \x1 Habbo Credit(s) in your purse. +purse_event=ACTIVITY +credit_redeem_url=http://%predefined%//help/19 +purse_info=DESCRIPTION +purse_info_tickets=Gaming Tickets +win_voucher=Habbo Credit Code +purse_buy_coins=Buy Credits +transaction_system_sms_win_tmobile=T-Mobile SMS +transaction_system_bank_luottokunta=Luottokortti +win_purse=Habbo Purse +# purse_Click_url=http://www.sulake.com +purse_vouchers_error3=This voucher must be redeemed on the Habbo website +credit_redeem_button=Redeem +transaction_system_bank_digiraha=Digiraha +transaction_system_bank_sampo=Sampo +purse_vouchers_success=Voucher was successfully redeemed. You have the Credits. +transaction_system_sms_slahti=Saunalahti +transaction_system_stuff_store=Catalogue purchase +purse_vouchers_error2=Product delivery failed, please contact Customer Service +purse_info_film=Films For Camera +purse_note=NOTE : The transactions are updated at 6 am every day. +transaction_system_bibit=Credit card +purse_noevents=You haven't made any transactions yet. Click the button below to find out how to get Habbo Credits.\rRemember: you must ask your parents permission before you buy Habbo Credits. +transaction_system_club_habbo=Habbo Club payment +purse_voucherbutton=Vouchers +transaction_system_bank_nordea=Nordea +transaction_system_sms_sonera=Sonera +transaction_system_sms_win_orange=Orange SMS +transaction_system_splashplastic=SplashPlastic +purse_vouchers_entercode=Enter code here: +more_info_link=More Information +purse_vouchers_furni_success=Voucher was successfully redeemed. You have been given the following furniture: +transaction_system_sms_win_vodafone=Vodafone SMS +transaction_system_messenger=Console SMS +purse_time=TIME +transaction_system_tsms_win_tmobile=T-Mobile SMS +transaction_system_sms_rl=Elisa +purse_date=DATE +purse_vouchers_error3_url=http://%predefined%//credits +transaction_system_sms_radiolinja=Elisa +credit_redeem_window=Redeem credit furni +purse_vouchers_info=When you buy Habbo Credits with a mobile phone, you will receive a special voucher code. Enter the code in the box above, click 'Get Credits!' and they'll be added to your purse. +transaction_system_sms_win_kpn=KPN SMS +purse_back_to_credits=Back To Purse +transaction_system_creditcards_is=Creditcard +transaction_system_htk_singledrop=Landline +purse_head2=ACCOUNT TRANSACTIONS +tx_history.description.bank_wallie=Wallie-card +transaction_system_sms_win_btcellnet=O2 SMS +purse_youhave=You Have +purse_vouchers_helpurl=http://%predefined%//credits/? +transaction_system_sms_sra=Sonera +transaction_system_sms_telia=Telia +transaction_system_web_internal=Housekeeping purchase +camera_dialog_open=Shoot +camera_open_dialog_text=Would you like to take some photos\ror put your camera in your room? +camera_open_dialog_heading=Camera +cam_txtscreen.help=Caption +cam_save_nofilm=You have run out of film.\rGet a roll (5 photos) from\rthe Catalogue for 6 Credits. +camera_dialog_place=Move +photo_legend=Caption +cam_release.help=Cancel Photo +cam_film.help=Number Of Photos Left +cam_zoom_in.help=Zoom In +cam_zoom_out.help=Zoom Out +cam_shoot.help=Shutter Release +cam_savetxt=Saving Photo... +cam_save.help=Save & Print Photo +badge_desc_XMA=Penguin Competition winner 2008! +badge_name_HX7=Habbo eXpert +badge_name_AC2=Bensalem Tribe Member +badge_desc_ACH_EmailVerification1=For activating your email address and for making it easier to return your password. Worth 200 pixels. +badge_desc_MMC= +badge_name_ACH_Login1=Traveler +badge_desc_WH6=Awarded to competition winners during Habboween 2008. +badge_name_XM1=Rasta Santa +badge_desc_HF1=I was a member of the Habbo Dream Team 2006! +badge_name_ACH_GamePlayed10=Battle Royal X +badge_name_Z04=Environmentalism +badge_name_HX5=Habbo eXpert +badge_desc_ACH_AllTimeHotelPresence9=Level 9 - spending total of 1152 hours in hotel. Worth 20 pixels. +badge_name_DK6=Camp Rock Guitar Green +badge_desc_Z51=Winner of a 17 Again competition +badge_desc_WH4=Habboween competition /event winner. +badge_name_U02=Idea Agency competition winner! +badge_name_HX3=Habbo eXpert +badge_desc_ACH_GamePlayed5=Level 5 - For playing and winning Snow Storm or for the game of Battle Ball 100 times. Worth 100 pixels. +badge_desc_CY3=Awarded to owners of trials that MeiLing failed. CNY 2009 +badge_desc_Z58=Official Habbo Museum security guard +badge_name_NEC=HMF Golden Glitterball +badge_name_ACH_AllTimeHotelPresence9=Online time IX-Tornado +badge_name_KO1=Koala Face +badge_desc_UKH=Dark is Rising sign of stone. 2007. +badge_name_ACH_AIPerformanceVote10=Notorious X +badge_name_ACH_AIPerformanceVote1=Unknown Star I +badge_name_ACH_AIPerformanceVote2=Hidden Talent II +badge_name_ACH_AIPerformanceVote3=Unique III +badge_name_ACH_AIPerformanceVote4=Noteworthy IV +badge_name_ACH_AIPerformanceVote5=Influental V +badge_name_ACH_AIPerformanceVote6=Famous VI +badge_name_ACH_AIPerformanceVote7=Grand VII +badge_name_ACH_AIPerformanceVote8=Well-known VIII +badge_name_ACH_AIPerformanceVote9=Glorious IX +badge_desc_ACH_AIPerformanceVote1=Level 1 - For gathering a vote on stage. Worth 20 pixels. +badge_desc_ACH_AIPerformanceVote2=Level 2 - For gathering 20 votes on stage. Worth 20 pixels. +badge_desc_ACH_AIPerformanceVote3=Level 3 - For gathering 50 votes on stage. Worth 20 pixels. +badge_desc_ACH_AIPerformanceVote4=Level 4 - For gathering 100 votes on stage. Worth 20 pixels. +badge_desc_ACH_AIPerformanceVote5=Level 5 - For gathering 180 votes on stage. Worth 40 pixels. +badge_desc_ACH_AIPerformanceVote6=Level 6 - For gathering 200 votes on stage. Worth 40 pixels. +badge_desc_ACH_AIPerformanceVote7=Level 7 - For gathering 200 votes on stage. Worth 40 pixels. +badge_desc_ACH_AIPerformanceVote8=Level 8 - For gathering 300 votes on stage. Worth 60 pixels. +badge_desc_ACH_AIPerformanceVote9=Level 9 - For gathering 300 votes on stage. Worth 100 pixels. +badge_desc_ACH_AIPerformanceVote10=Level 10 - For gathering 300 votes on stage. Worth 200 pixels. +badge_desc_Z32=I took a stand against knife crime +badge_desc_UK2=The sole champion of the Always Salon in 2006. +badge_desc_PIR=Arrr! Pirate competition winner May 2006. +badge_name_ACH_Student1=Habbo Student +badge_name_Z29=Blue Insider +badge_desc_ACH_Login8=Level 8 - For logging in 80 days in a row. Sensational. Worth 200 pixels. +badge_desc_NEI=HMF:Neon Epic Party Winner +badge_desc_HM1=Built a room for the Habbo Mall 2009 +badge_desc_UKF=Dark is Rising sign of iron. 2007. +badge_name_Z20=Mall Detective (2/2) +badge_name_VA7=Small Shalimar +badge_desc_Z30=Awarded to all winners and runners up of the pumpkin design competition. October 2008. +badge_desc_ACH_GamePlayed1=Level 1 - For playing and winning Snow Storm or for the game of Battle Ball. Worth 10 pixels. +badge_name_OL2=Habbolympic Silver +badge_desc_Z18=Against cervical cancer campaign supporter. +badge_name_WTM=Safe Surfer +badge_name_ACH_Motto1=Master of Words +badge_desc_UK4=Habbo Council member. The Habbo Council postponed all future meetings from June 2006. +badge_name_DU1=Gold Habbowealth +badge_name_UKA=Summer Resort +badge_name_ST3=Energy Analyst +badge_name_CL1=Idea Agency competition runner-up! +badge_desc_UKD=Adventure Story competition winner 2007. +badge_desc_Z35=Friday's Official Friend +badge_desc_HJ5=Winner of the Harajuku Lovers quest +badge_desc_ACH_RespectGiven1=For giving respect 100 times. Worth 20 pixels. +badge_name_UKC=Habbo Journalist +badge_desc_AR2=Alhambra Prize Winner 2008 +badge_name_HX9=Habbo eXpert +badge_name_UKQ=St Trinian's Head Boy +badge_desc_ACH_MGM9=Level 9 - For creating your own fellowship - party of 16. For inviting two more real life friends to Habbo. Worth 180 pixels. +badge_desc_ST2=You need Science and Maths skills for this job! +badge_desc_VIP=Celebrity guests and special visitors. +badge_name_Z58=Museum Security +badge_desc_ACH_GamePlayed7=Level 7 - For playing and winning Snow Storm or game of Battle Ball 200 times. Worth 150 pixels. +badge_desc_HX9=X Leader +badge_desc_DN2=Roadtrip USA 5 Points 2008. +badge_name_EC4=HabboSphere Contributor +badge_desc_UKQ=Winner of St Trinians Head Boy competition. +badge_name_UK6=Billboard Designer +badge_name_ACH_MGM7=Housewarming +badge_desc_HX7=Gold Tech eXpert +badge_name_XM3=Xmas Reindeer +badge_desc_DN4=Roadtrip USA 5 Points 2008. +badge_desc_Z02=Celebrating Earth Week 2020 with Habbo! +badge_desc_ACH_RegistrationDuration10=Level 10 - For true Habbos who have been members of the community for 5 years. Worth 200 pixels. +badge_name_FRG=Ultimate Bobba Champ +badge_name_ACH_Login7=Space dust on your shoes +badge_desc_ACH_AllTimeHotelPresence7=Level 7 - spending total of 288 hours in hotel. Worth 20 pixels. +badge_name_EC2=Melting Ice Caps Survivor +badge_desc_SB7=Winner of a Habbo Hood gang competition. September 2008 +badge_name_UKO=Habbo Seeker +badge_name_HX1=Habbo eXpert +badge_desc_Z16=My Spy Family quest 3 winner. +badge_name_UK8=NSPCC +badge_name_Z18=HPV +badge_name_ST5=Sports Technologist +badge_name_ACH_MGM9=Fiesta +badge_name_ACH_Login3=Frequent Resident +badge_desc_ACH_RoomEntry7=Level 7 - For hanging out in 120 Guest Rooms that you do not own .Gold digger. 20 pixels. +badge_desc_ACH_AllTimeHotelPresence5=Level 5 - spending total of 48 hours in hotel. Worth 20 pixels. +badge_name_NEI=HMF: Neon Club Winner +badge_name_ACH_RespectEarned2=Been respected 6 times. +badge_name_ACH_AllTimeHotelPresence3=Online time III-Dust Devil +badge_desc_ACH_AllTimeHotelPresence3=Level 3 - spending total of 8 hours in hotel. Worth 20 pixels. +badge_name_HJ4=Harajuku Lovers Love +badge_desc_ACH_GamePlayed9=Level 9 - For playing and winning Snow Storm or the game of Battle Ball 360 times. Worth 280 pixels. +badge_desc_ACH_GamePlayed3=Level 3 - For playing and winning Snow Storm or for the game of Battle Ball 20 times. Worth 50 pixels. +badge_desc_SB3=Shabbolins gang member on the Streets Of Bobba September 2006. +badge_desc_Z28=Awarded to The Insiders poll and quest winners. October 2008. +badge_name_HBA=Gold Hobba +badge_name_UKK=Fantastic4 Bronze +badge_desc_UKZ=Awarded to fashion designers during Fashion Week 2008. +badge_name_ACH_TraderPass1=Trader's Pass +badge_name_ACH_RespectEarned4=Been respected 66 times. +badge_desc_ACH_Graduate1=For completing your confusing Habbo newbie experience. Worth 20 pixels. +badge_name_ACH_RoomEntry5=Vacationer +badge_name_VA2=Valentine Heart +badge_desc_YAK=Awarded for competitions during Japanese Sushi campaign. +badge_desc_ACH_MGM8=Level 8 - For creating your own fellowship - party of 14. For For inviting two more real life friends to Habbo. Worth 170 pixels. +badge_name_Z36=Hotel For Dogs 1* Resort Owner +badge_desc_UKB=Murder mystery play writing competition winner 2007. +badge_desc_ACH_RegistrationDuration8=Level 8 - For true Habbos who have been members of the community for 3 years. Worth 200 pixels. +badge_desc_ACH_Login4=Level 4 - For logging in 28 days in a row. Scary. Worth 150 pixels. +badge_name_UKS=Perfect Prefect +badge_name_Z31=HC-ARTIST +badge_desc_VA3=Awarded to competition winners during Valentine's 2008. +badge_name_ACH_RoomEntry3=Ultimate Room Raider +badge_desc_TC1=BattleBall Challenge involved being in the top 20 highscores for 15 weeks in a row! +badge_desc_ACH_MGM6=Level 6 - For creating your own fellowship - party of 10. For inviting two more real life friends to Habbo. Worth 150 pixels. +badge_name_FAN=Official Fansite Staff +badge_desc_Z14=My Spy Family quest 2 winner. +badge_desc_U06=Winning a Habbo Raceway Grand Prix. +badge_desc_ACH_RegistrationDuration6=Level 6 - For true Habbos who have been members of the community for a year. Worth 200 pixels. +badge_name_ACH_RegistrationDuration4=40 % True Habbo +badge_name_Z38=Hotel For Dogs 3* Resort Owner +badge_name_UKU=Theme Park Clown +badge_name_GLF=Lynx +badge_name_ACH_AllTimeHotelPresence5=Online time V- Haze +badge_name_ACH_HappyHour1=Happy Hour +badge_name_SB2=Bobbaschi +badge_name_Z32=It Doesn't Have To Happen +badge_desc_SU2=Lvl2 Tiki Competition winner. Middle award. Summer 2008. +badge_name_UKM=Fantastic4 Gold +badge_name_SU2=Medium Tiki Mana +badge_name_ACH_GamePlayed4=Battle Royal IV +badge_desc_ACH_RegistrationDuration2=Level 2 - For true Habbos who have been members of the community for 3 weeks. Worth 60 pixels. +badge_name_ACH_RegistrationDuration10=100% True Habbo +badge_desc_FRG=Ultimate Bobba Wrestling Champion 2008. Kick Wars competition. +badge_name_U06=Habbo Raceway GP +badge_desc_ACH_RoomEntry9=Level 9 - For hanging out in 160 Guest Rooms that you do not own. Spaceman. Worth 30 pixels. +badge_desc_ACH_RespectEarned6=Level 6 - For earning respect a further 200 times. Worth 200 pixels. +badge_name_ACH_AllTimeHotelPresence1=Online time I-Thunderstorm +badge_name_WH6=Virus Ooze +badge_desc_DU1=Habbowealth Games 2005. +badge_desc_DSX=Roadtrip USA Room Winner 2008. +badge_desc_ACH_AllTimeHotelPresence1=Level 1 - spending total of 1 hour in hotel. Worth 30 pixels. +badge_desc_WTM=Way too much information! +badge_desc_WH2=Habboween competition /event winner. +badge_desc_ACH_RespectEarned8=Level 8 - For earning respect a further 200 times. Worth 200 pixels. +badge_name_Z60=The Golden Tablet +badge_desc_ST5=You need Science and Maths skills for this job! +badge_name_ACH_RegistrationDuration6=60 % True Habbo +badge_name_AF1=April Fools Day 2009 +badge_desc_AC4=Used the inner Spirit Eagle to find the Lost Tribe of Bensalem +badge_name_SNW=SnowStorm HOF +badge_name_UKX=St Trinian's Quiz +badge_desc_ACH_RespectEarned4=Level 4 - For earning respect a further 50 times. Worth 50 pixels. +badge_name_UKI=Water Sign +badge_name_NWB=Silver Hobba +badge_name_UKE=Tournament King +badge_name_MD1=Meet Dave Quiz +badge_name_Z17=Hairspray Talent +badge_name_HJ2=Harajuku Lovers G +badge_desc_UKS=Winner of the St Trinians perfect prefect competition. +badge_desc_Z24=Official evil scientist! Maximum level. October 2008. +badge_name_ACH_GamePlayed6=Battle Royal VI +badge_desc_AC2=Initiated through the Totem bases of fire GREEN +badge_name_ACH_Login5=A Piece Of The Furniture +badge_name_UKG=Fire Sign +badge_remove=Clear +badge_desc_ACH_RegistrationDuration4=Level 4 - For true Habbos who have been members of the community for 16 weeks. Worth 120 pixels. +badge_desc_FAN=Official Fansite representative. Check out the Official fansite rooms on the upper floors of the Habbo Mall. +badge_name_Z15=Evil Bot Affair +badge_desc_GRR=The Gorillaz visited Habbo in 2005! +badge_desc_MD2=Awarded to winners of the Meet Dave body building competition. 2008. +badge_name_HJ6=Harajuku Lovers Lil' Angel +badge_desc_Z01=Habbo Fashion Week 2008 competition winner. +badge_name_ACH_AllTimeHotelPresence7=Online time VII- Cyclone +badge_name_XXX=Habbo eXpert +badge_name_DN3=Green Fuel Flag +badge_desc_HJ3=Harajuku Lovers Baby +badge_desc_UKW=Theme Park team competition winner. 2008 +badge_desc_ACH_HappyHour1=For spending a Happy moment in Habbo! Log in on Happy Hour to receive this achievement. Worth 100 pixels. +badge_name_HC2=HC Club membership II +badge_name_DS7=Green Tea Elemental +badge_name_HC5=HC Club membership V +badge_name_Z12=HBB Champion +badge_name_Z49=Bionicle Quiz Winner +badge_name_UKZ=Fashion Designer +badge_desc_Z49=I showed the intelligence of a Bionicle glatorian! +badge_desc_ACH_RespectEarned3=Level 3 - For earning respect a further 10 times. Worth 20 pixels. +badge_name_DN5=Red Fuel Flag +badge_name_ACH_AvatarLooks1=Looks that Kill +badge_desc_AF1=You got pranked on April Fools Day 2009 +badge_name_GLI=Eagle +badge_desc_NEB=HMF:Neon Fan Club Winner +badge_desc_EC4=Trying to make Habbo a greener place +badge_name_Z47=Bionicle Quest Winner +badge_desc_AP1=The HABprentice Boardroom Table Member +badge_desc_KO1=For creating the perfect Koala habitat. November 2008. +badge_desc_SB1=Bouncing Queens gang member on the Streets Of Bobba September 2006. +badge_name_DSX=Tourist Expert +badge_desc_ACH_RespectEarned10=Level 10 - For earning respect a further 200 times. Worth 400 pixels. +badge_desc_UKK=Fantastic Four Bronze Medallion. 2007. +badge_name_OL3=Habbolympic Bronze +badge_desc_VA5=Awarded to paired Habbos during Valentine's each year. +badge_name_YAK=Black Dragon +badge_name_AC3=Bensalem Tribe Member +badge_desc_VA8=For making a winning Bollywood Movie. 2009. +badge_desc_UKU=Theme Park entertainment winner. 2008 +badge_name_ACH_RespectEarned8=Been respected 766 times. +badge_name_ACH_GamePlayed2=Battle Royal II +badge_desc_EXH=Hobba volunteer mod until 2006. +badge_desc_RU3=SafeSid Competition Winner +badge_name_ACH_RegistrationDuration1=10 % True Habbo +badge_desc_DU2=Habbowealth Games 2005. +badge_name_Z10=Underage Festival +badge_name_ACH_MGM2=Luau +badge_desc_Z26=Road Trip USA King badge winner. Awarded to anyone who exchanged 25 Fuel Points. 2008 +badge_desc_XXX=Habbo eXperts are experienced Habbos who answer your questions on Habbo. +badge_name_SHA=Shabboline +badge_desc_GLE=Level 5 - The clever one - is swift of thought and foot. For being a Habbo guide - Here to help. Worth 285 pixels. +badge_name_EXH=Hobba Medal +badge_name_SB7=Habbo Hood Big Flame +badge_name_ACH_RoomEntry8=Sightseer +badge_name_TC1=BattleBall Champ +badge_name_CL3=Idea Agency competition winner! +badge_desc_HC5=Level 5 - For 48 months of Habbo Club membership. Worth 500 pixels. +badge_desc_TC3=SnowStorm Challenge involved being in the top 20 highscores for 15 weeks in a row! +badge_desc_SU3=Lvl3 Tiki Competition winner. Highest award. Summer 2008. +badge_desc_ACH_TraderPass1=Level 1 - Achieved by verifying your email, owning Habbo account for at least 3 days and being online at least 1 h. +badge_desc_ACH_Login5=Level 5 - For logging in 35 days in a row. Amazing. Worth 200 pixels. +badge_name_Z26=Road Trip King +badge_name_SB5=Habbo Hood Small Flame +badge_name_DU3=Bronze Habbowealth +badge_desc_SB5=Selected member of a Habbo Hood Group. September 2008 +badge_name_AC5=The Spirit Squid +badge_desc_Z47=I showed the guile of a Bionicle glatorian! +selected_badges=Currently wearing: +badge_desc_U05=Having a Course featured in a Habbo Raceway Grand Prix. +badge_desc_OL2=Awarded to members of the 2nd Habbolympic team 2008. +badge_desc_HX5=Gold Host eXpert +badge_name_SU3=High Tiki Mana +badge_desc_DS7=Elementals Vs Warriors 2007. +badge_name_DN2=Blue Fuel Flag +badge_desc_Z11=Contestant of Habbo Big Brother series1 in July 2008. +badge_desc_DS1=I built the best oldschool room. April 2020. +badge_desc_GLK=Level X - The eXperienced one with the knowledge to show the way. +badge_name_ACH_Login9=Habbo Stayer +badge_name_AP1=The HABprentice Finalist +badge_name_Z24=IGOR EVIL SCIENTIST'S COAT +badge_name_ACH_RegistrationDuration8=80 % True Habbo +badge_name_NEJ=Flynn500 Winner +badge_desc_ACH_MGM2=Level 2 - For creating your own fellowship - party of 3. For inviting one real life friend to Habbo. Worth 55 pixels. +badge_name_GLK=Head Guide (Wolf) +badge_name_Z57=CH Rare Museum +badge_desc_ACH_RoomEntry2=Level 2 - For hanging out in 15 guest rooms that you do not own. Worth 10 pixels. +badge_desc_UK7=Awarded to experts at creating their own quests. +badge_name_XM2=Xmas Elf +badge_name_DS1=OLDSCHOOL +badge_desc_GLI=Level 9 - The sharp eyed one - flying to your aid from afar. For being a Habbo guide - Here to help. Worth 920 pixels. +badge_name_TC3=SnowStorm Champ +badge_name_ACH_MGM5=Slumber Party +badge_name_CY3=High Yin Yang +badge_desc_ACH_RespectEarned1=Level 1 - For earning respect your first time. Worth 20 pixels. +badge_desc_ACH_Student1=For being guided by a Habbo Guide and to be confused no more. Worth 20 pixels. +badge_name_WH2=Evil Smile +badge_desc_DK5=Camp Rock Winner 2008 +badge_name_Z28=Silver Insider +badge_desc_GLA=Level 1 - The speedy one - simple facts and information. For being a Habbo guide - Here to help. Worth 15 pixels. +badge_desc_AP2=The HABprentice: Design Edition Boardroom Table Member +badge_desc_CL1=Idea Agency brief runner-up! +badge_name_WH4=Smelly Brain +badge_name_ACH_Graduate1=The Graduate +badge_name_ACH_AllTimeHotelPresence10=Online time X - F5 Tornado +badge_desc_HX2=Safety eXpert +badge_name_Z01=Habbo Model +badge_desc_NWB=Hobbas were volunteer moderators. +badge_name_XM4=Xmas Tree +badge_name_Z07=Gold Graffiti +badge_desc_AC6=Used the inner Angry Spirit Ape to find the Lost Tribe of Bensalem +badge_desc_Z37=Hotel For Dogs 2* Resort Owner +badge_desc_ACH_MGM4=Level 4 - For creating your own fellowship - party of 6. For inviting two more real life friends to Habbo. Worth 130 pixels. +badge_desc_LC3=Completed the quest of Lemuria 02/09 +badge_name_MB2=Madball Yellow Card +badge_desc_CL3=Idea Agency Golden brief winner! +badge_desc_XM4=Awarded to everyone who visited Habbo during December 2006. Happy Christmas! +badge_desc_UKO=Awarded to anyone who successfully collected all Dark Is Rising Badges. 2007 +badge_desc_Z07=1st place in the Step Up 2 The Streets dance competition. +badge_name_GLC=Otter +badge_name_ACH_MGM3=Block party +badge_desc_Z20=You found the murderer! +badge_name_AR2=Alhambra Sword +badge_name_ACH_GamePlayed7=Battle Royal VII +badge_desc_U01=Idea Agency brief runner-up! +badge_desc_MB2=Competition winners during Habbo Madball 2008. +badge_name_UK3=Frank Bus +badge_name_ACH_AvatarTags1=5 words of wisdom +badge_desc_HC3=Level 3 - For 24 months of Habbo Club membership. Worth 300 pixels. +badge_desc_U03=Idea Agency Golden brief winner! +badge_desc_HX3=Tech eXpert +badge_name_HWB=Evil Smile +badge_desc_ACH_RoomEntry4=Level 4 - For hanging out in 50 Guest Rooms that you do not own. Backpacker. Worth 15 pixels. +badge_desc_HC1=Level 1 - For joining the Habbo Club. Worth 100 pixels. +badge_name_VA5=Wedding Ring +badge_name_Z09=Underage Festival +badge_name_ACH_RespectEarned6=Been respected 366 times. +badge_name_Z22=IGOR HELMET +badge_desc_ACH_Login1=Level 1 - For logging in 5 days in a row. Try it if you dare. Worth 50 pixels. +badge_desc_GLC=Level 3 - The one who will not let you sink under pressure. For being a Habbo guide - Here to help. Worth 34 pixels. +badge_name_GLE=Fox +badge_desc_UKM=Fantastic Four Gold Medallion. 2007. +badge_desc_Z22=You have reached LEVEL6. October 2008. +badge_name_ACH_GamePlayed9=Battle Royal IX +badge_name_ACH_AllTimeHotelPresence8=Online time VIII- Meso Cyclone +badge_desc_Z57=I visited the Rare Museum +badge_desc_WH5=Musically gifted Habbo! +badge_name_ACH_Login4=High Roller +badge_name_HC3=HC Club membership III +badge_name_VA4=Habborella Crew +badge_desc_ACH_MGM10=Level 10 - For creating your own fellowship - party of 18. For inviting two more real life friends to Habbo. Worth 200 pixels. +badge_desc_CY2=Awarded to owners of trials that MeiLing defeated. CNY 2009 +badge_name_HX8=Habbo eXpert +badge_name_Z05=Habbo X Medal +badge_name_WAR=Peace Protest 2008 +badge_desc_Z05=Habbo eXperts were volunteer helpers between 2006 and 2008. +badge_name_UKF=Iron Sign +badge_desc_WH7=Awarded to competition winners during Habboween 2008. +badge_desc_UKG=Dark is Rising sign of fire. 2007. +badge_name_UKP=Perfect Prefect +badge_name_ST6=Climate Scientist +badge_name_AR1=Alhambra Genie +badge_desc_UKA=Battle of the Resorts Summer 2007 +badge_name_Z03=Stop Pollution +badge_name_Z51=Zac Efron Fan +badge_name_UKH=Stone Sign +badge_name_UKD=Adventure Story +badge_name_AM1=Jigoku Shoujo Butterfly +badge_name_AM2=Jigoku Shoujo Straw Doll +badge_name_AU1=Rock on! +badge_desc_AM1=Awarded to winners of Animax Girl from Hell competitions. +badge_desc_AM2=Awarded to winners of the Tooomb of Dooom room design competition. +badge_name_AM3=Jigoku Shoujo Kikuri +badge_name_AM4=Jigoku Shoujo Death Mark +badge_name_AM5=Jigoku Shoujo Enma Ai Eye +badge_desc_AM5=Awarded to Habbos who attended the Horror Anime Masquerade and chose Enma Ai as their messenger. +badge_name_AM6=Jigoku Shoujo Kikuri Flower +badge_desc_AM3=Awarded to winners of the Girl from Hell pop quizzes. +badge_desc_AM4=Awarded to winners of the Horror Anime Set Design competition. +badge_desc_AM6=Awarded to Habbos who attended the Horror Anime Masquerade and chose Kikuri as their messenger. +badge_desc_AU1=Monsters of Habbo fest 07 +badge_name_AU2=Blue Bohos +badge_desc_AU2=Streets of Bobba Campaign 07 +badge_name_AU3=Pixelmason's Union +badge_desc_AU3=Streets of Bobba Campaign 07 +badge_name_AU4=Afro Quacks +badge_desc_AU4=Streets of Bobba Campaign 07 +badge_name_AU5=Birthday Badge +badge_desc_AU5=Habbo AU's 4th Birthday +badge_name_AUW=DOH's +badge_desc_AUW=Winter Meltdown Campaign 08 +badge_name_BOT=BOT +badge_desc_BOT=I am an automated (ro)bot. Try talking to me! +badge_name_BBBH1=Old Habbo Memorial Badge +badge_desc_BBBH1=I saw the end of Old Habbo! +badge_name_CAA=InfoBus Personnel +badge_desc_CAA=Ontario Provincial Police, InfoBus +badge_name_CAD=Sasquatch Catcher +badge_desc_CAD=I helped capture the Sasquatch in the hunt of 08! +badge_name_CAE=Lest We Forget +badge_desc_CAE=Never forget! Remembrance Day. +badge_name_CHF=Chef Boyardee +badge_desc_CHF=Culinary Expert! +badge_name_CN2=Chinese New Year +badge_desc_CN2=Given to winners of Chinese New Year events and competitions during CNY 2007. +badge_name_CY1=Tao Level 1 +badge_desc_CY1=Chinese New Year 2009 +badge_name_DJ1=DJ XXXtreme - Grin +badge_desc_DJ1=Given to Habbos who answered 6-10 questions correctly in the Nokia DJ-XXXtreme Challenge. +badge_name_DE2=DJ XXXtreme - MP3 Player +badge_desc_DE2=Given to Habbos who answered 11-15 questions correctly in the Nokia DJ-XXXtreme Challenge. +badge_name_DJ3=DJ XXXtreme - XXX Bling +badge_desc_DJ3=Given to Habbos who answered 16-20 questions correctly in the Nokia DJ-XXXtreme Challenge. +badge_name_DK1=Pac-Attack: Expert Player +badge_desc_DK1=For getting 15000 points in Pac-Attack +badge_name_DK2=Pub(lic) Crawl Cider +badge_desc_DK2=St Patrick's Day 2011! +badge_name_DS0=Academy +badge_desc_DS0=Astronaut of the Habbo Space Explore 06 +badge_name_DS6=Space Shuttle +badge_desc_DS6=Astronaut of the Habbo Space Explore 06 +badge_name_DE9=Flower Power Designer +badge_desc_DE9=For drawing one of the best Flower Power images! July 2020. +badge_name_DS2=Megamecha +badge_desc_DS2=Astronaut of the Habbo Space Explore 06 +badge_name_DS3=Clones +badge_desc_DS3=Astronaut of the Habbo Space Explore 06 +badge_name_DS4=Hyperspace +badge_desc_DS4=Santini Battle Trail Hypersphere 2006 +badge_name_DS5=Bobbarians +badge_desc_DS5=Santini Bobba Trial Bobbarians 2006 +badge_name_DT1=The Gallery +badge_desc_DT1=Bill's board Gallery (Replacement) +badge_name_Z62=Doowap +badge_desc_Z62=¡La Placa más sabrosa de todo Habbo! +badge_name_AI3=Habbo American Idol Top 12 +badge_desc_AI3=For making the Top 12 in the Habbo American Idol competition. (May 2009) +badge_name_AC4=Eagle Animal Spirit +badge_desc_AC4=You are now a member of The Avian Tribe! +badge_name_AC5=Squid Animal Spirit +badge_desc_AC5=You are now a member of The Mariners Tribe!! +badge_name_AC6=Angry Ape Animal Spirit +badge_desc_AC6=You are now a member of The Sapiens Tribe!! +badge_name_E12=Touch of Pink +badge_desc_E12=Lacoste +badge_name_E11=El País +badge_desc_E11=Diario 'El País' +badge_name_ES001=Pasar Inadvertido +badge_desc_ES001=Calippo Cola +badge_name_ES1=Bus Unicef +badge_desc_ES1=Placa Unicef +badge_name_E14=Tener el control +badge_desc_E14=Calippo Lima +badge_name_AXE=AXE Mitarbeiter +badge_desc_AXE=Teilnahme an der AXE Pressekonferenz +badge_name_BR2=Emblema Giraffas +badge_desc_BR2=Hum... Deu fome? Passa no Giraffas. +badge_name_BR3=Emblema Kellogs +badge_desc_BR3=Desperte o tigre em você! +badge_name_EAB=Easter Bunny +badge_desc_EAB=I found the Bunny! +badge_name_EAR=Easter Beat +badge_desc_EAR=Awarded to winners of Easter (Island) Espionage competitions (bear supporters). +badge_name_EC1=Eco Warrior +badge_desc_EC1=The Green Scene Campaign +badge_name_CH3=Habbo Switzerland +badge_desc_CH3=Remembering my Habbo roots! +badge_name_DK4=Guitarra Dourada +badge_desc_DK4=Em comemoração ao Dia do Rock 2009 - 13 de Julho +badge_name_CH2=Experte +badge_desc_CH2= +badge_name_CH1=Habbo Sicurezza +badge_desc_CH1=La sicurezza è importante! +badge_name_CAF=Miss/Mister Romanticismo +badge_desc_CAF=Los + Románticos +badge_name_CH4=7 Jahre Habbo.ch +badge_desc_CH4=Teilnahme an der Geburtstagsfeier "7 Jahre Habbo.ch" +badge_name_DE1=Infobus +badge_desc_DE1=Infobus / PowerChild Moderatoren tragen dieses Badge +badge_name_BKE=BKE +badge_desc_BKE=BKE Moderatoren tragen dieses Badge +badge_name_DE5=Meisterschaft +badge_desc_DE5=Teilnahme an der Habbo Meisterschaft +badge_name_DE6=Habbo France 4 ans +badge_desc_DE6=Habbo France 4 ans +badge_name_DE7=Sommer 2008 +badge_desc_DE7=Für alle Fans des Sommers +badge_name_DE8=Flower Power Pixel Artist +badge_desc_DE8=For creating the best Flower Power flyers. July 2020. +badge_name_ES003=mtvmusica.es +badge_desc_ES003=Vídeos musicales y mucho más +badge_name_ES3=Entenversteck #6 +badge_desc_ES3=Die Archäologen Rätseln heute noch über diesen Fund. Könnte es ein Ducket sein? +badge_name_ES004=Latin American Idol +badge_desc_ES004=¡Viva la música! +badge_name_ES4=Habbo Habztechi +badge_desc_ES4=ShamHab - 2006 +badge_name_ES005=Placa Argentina +badge_desc_ES005=Visitando la Pampa +badge_name_ES000=Volar +badge_desc_ES000=Calippo Fresa +badge_name_ES002=Moverse Libremente +badge_desc_ES002=Calippo +badge_name_ES5=Habbo Habztechi +badge_desc_ES5=ShamHab - 2006 +badge_name_Z63=Habbo Beta Lab Rat Color +badge_desc_Z63=Given to those in the Beta group that have contributed to the testing. +badge_name_Z41=Duck Lover +badge_desc_Z41=As he/she nobody loves the ducks +badge_name_ES006=Placa Bolivia +badge_desc_ES006=Por fin he encontrado La Paz +badge_name_DK049=Umfragenbadge +badge_desc_DK049=Danke für's Mitmachen! +badge_name_ES6=Chaval +badge_desc_ES6=Experto del Bus +badge_name_ES7=Ghostly badge +badge_desc_ES7=Lucky Escape +badge_name_ES007=Placa Chile +badge_desc_ES007=Larga y estrecha +badge_name_ES008=Placa Colombia +badge_desc_ES008= +badge_name_ES8=Calippo Fresa +badge_desc_ES8=¡Lo más fresco de Habbo! +badge_name_ES009=Costa Rica +badge_desc_ES009=Lo más vistoso de Centroamérica +badge_name_ES9=Calippo Verde +badge_desc_ES9=¡Lo más fresco de Habbo! +badge_name_ES010=Placa Ecuador +badge_desc_ES010= +badge_name_ES011=Placa El Salvador +badge_desc_ES011=Nos vemos en San Salvador +badge_name_ES012=Placa España +badge_desc_ES012= +badge_name_ES013=Placa Honduras +badge_desc_ES013=No te pierdas en la selva +badge_name_ES014=México +badge_desc_ES014=Orale Compadre +badge_name_ES015=Placa Nicaragua +badge_desc_ES015=Nadando en el Lago Nicaragua +badge_name_ES016=Placa Panamá +badge_desc_ES016=¡Surcando el Canal! +badge_name_ES017=Placa Paraguay +badge_desc_ES017=Desde el corazón de América +badge_name_ES018=Placa Perú +badge_desc_ES018=Ascendiendo a Los Andes +badge_name_ES019=Placa Uruguay +badge_desc_ES019=Desde Montevideo con amor +badge_name_ES020=Placa Venezuela +badge_desc_ES020=Yo me quedo en Maracaibo +badge_name_ES029=MTV-Embarazada a los 16 +badge_desc_ES029=No te pierdas la nueva serie de MTV +badge_name_ES030=Music Aula +badge_desc_ES030=El Festival Pop-Rock del Estudiante +badge_name_ES031=Chupa Chups +badge_desc_ES031=Endulza tu Habbo Vida +badge_name_ES032=Placa U18 +badge_desc_ES032=La mejor música, a tu alcance +badge_name_ES065=Xpresa-t! +badge_desc_ES065=¡Zlango es tu nuevo idioma! +badge_name_ES075=Placa Chester +badge_desc_ES075=Cheetos Mola +badge_name_ES076=Placa Cheetos +badge_desc_ES076=Para miembros de Cheetolog +badge_name_ES078=La Niñera Mágica y el Big Bang +badge_desc_ES078=Un mundo de fantasía ante tus ojos +badge_name_ES088=Cheetos-Eclipse +badge_desc_ES088=Disfruta con Cheetos de la tercera 'peli' de la Saga Crepúsculo +badge_name_ES089=Chocapic +badge_desc_ES089=¡Celebra el cumple de tu vida! +badge_name_ES092=Grefusa-Surfmanía +badge_desc_ES092=Una Placa Tattoo +badge_name_ES099=Surfmanía +badge_desc_ES099=Grefusa apuesta por el surf +badge_name_ES100=MusicAula II +badge_desc_ES100=¡Apoyando al festival pop-rock para estudiantes! +badge_name_ES106=Placa Cheetos 1 +badge_desc_ES106=Lúcela por todo el Hotel gracias a Cheetos +badge_name_ES107=Placa Cheetos 2 +badge_desc_ES107=Lúcela por todo el Hotel gracias a Cheetos +badge_name_ES108=Placa Cheetos 3 +badge_desc_ES108=Lúcela por todo el Hotel gracias a Cheetos +badge_name_ES109=Placa Cheetos 4 +badge_desc_ES109=Lúcela por todo el Hotel gracias a Cheetos +badge_name_ES116=Universo Salmah +badge_desc_ES116=Un mundo fantástico en el que caben la diversión y el compromiso +badge_name_ES122=Placa MTV Verde +badge_desc_ES122=¡Qué bueno que MTV se emita ahora en abierto! +badge_name_ES123=MySpace +badge_desc_ES123=Para auténticos fans de la música +badge_name_ES133=El Barco +badge_desc_ES133=Enrólate en la serie de Antena3 +badge_name_ESA=Calippo Naranja-Piña +badge_desc_ESA=¡Lo más fresco de Habbo! +badge_name_ESB=Tampax Gold +badge_desc_ESB=Comodidad exclusiva +badge_name_ESC=Copa América +badge_desc_ESC=Ganadores Copa América +badge_name_ESD=Happy 4th Birthday! +badge_desc_ESD=I celebrated Habbo Canada's 4th birthday in May of 2008! +badge_name_ESE=Calippo Cola +badge_desc_ESE=¡Lo más fresco de Habbo! +badge_name_ESF=Pringles +badge_desc_ESF=¡Sabrosas y crujientes! +badge_name_ESI=Rata +badge_desc_ESI=Año Nuevo Chino 2008 +badge_name_ESJ=Caballo +badge_desc_ESJ=Año Nuevo Chino 2008 +badge_name_ESK=Cibervoluntarios +badge_desc_ESK=Placa del Bus +badge_name_ESL=Planta carnívora +badge_desc_ESL=La Habbotienda de los horrores +badge_name_ESM=Star2 +badge_desc_ESM=Placa de la revista Star2 +badge_name_ESO=Chica Tampax +badge_desc_ESO=Visted the Tampax Event 2020! +badge_name_ESP=Sunny Fresa +badge_desc_ESP=¡Bien refrescante! +badge_name_ESQ=Sunny Granizado +badge_desc_ESQ=¡Bien refrescante! +badge_name_ESR=Sunny Naranja +badge_desc_ESR=¡Bien refrescante! +badge_name_ESS=Chicas de Cuidado +badge_desc_ESS=¡Con todo el cuidado! +badge_name_EST=Indios +badge_desc_EST=Lejano Habbo Oeste +badge_name_ESU=Vaqueros +badge_desc_ESU=Lejano Habbo Oeste +badge_name_ESW=Cine +badge_desc_ESW=Maravillosos Años 70 +badge_name_ESX=Series TV +badge_desc_ESX=Maravillosos Años 70 +badge_name_ESY=Habbo TV +badge_desc_ESY=Central Musical +badge_name_ESZ=Buzz TV +badge_desc_ESZ=Buzz TV +badge_name_EXE=Executive Badge +badge_desc_EXE=You truly are Executive material! +badge_name_EXH=For loyal service on Habbo.ca! +badge_desc_EXH=For loyal service on Habbo.ca! +badge_name_EXI=Veet +badge_desc_EXI=¡La depilación más suave, a tu alcance! +badge_name_EXL=Veet for Men +badge_desc_EXL=¡La depilación más suave, a tu alcance! +badge_name_F1A=Muerte en Habbo +badge_desc_F1A=Su muerte fue la más original +badge_name_FF2=Fashion Friendly Fighters +badge_desc_FF2=Given to those who supported Luna in The Streets of Bobba. +badge_name_FI2=Du bist nicht alleine +badge_desc_FI2=Du bist nicht alleine, Aktion 2005 +badge_name_FI3=Netari +badge_desc_FI3=Netari-ohjaajan merkki +badge_name_FI4=Naturaleza Dominante +badge_desc_FI4=La naturaleza le abraza +badge_name_FID=Mainosmerkki BonBon +badge_desc_FID=BonBon-mainosryhmän jäsen +badge_name_FI6=Apuohjaaja +badge_desc_FI6=Netarin apuohjaajan merkki +badge_name_FI7=MLL-päivystäjä +badge_desc_FI7=Mannerheimin Lastensuojeluliiton päivystäjä +badge_name_FI8=Rexona Girl +badge_desc_FI8=¡Que buen olor! +badge_name_FIA=Errate das Furni 10 +badge_desc_FIA=Ich habe das Möbelstück "Verdorbene Katze" beim HabboAura Wettbewerb "Errate das Furni" richtig erraten +badge_name_FIE=Mainosmerkki Linnanmäki +badge_desc_FIE=Linnanmäki-mainosryhmän jäsen +badge_name_FIF=Mainosmerkki Kungfu Panda +badge_desc_FIF=Kungfu Panda -mainosryhmän jäsen +badge_name_FIH=Mainosmerkki Dove +badge_desc_FIH=Dove Aito Kauneus -mainosryhmän jäsen +badge_name_FII=Mainosmerkki Madagascar 2 +badge_desc_FII=Madagascar 2 -mainosryhmän jäsen +badge_name_FIJ=Mainosmerkki Spyro the Dragon +badge_desc_FIJ=Spyro the Dragon -mainosryhmän jäsen +badge_name_FR4=Badge HabboRédac' +badge_desc_FR4=Pour les écrivains en herbe! +badge_name_FR5=Badge Johno's Fan Club +badge_desc_FR5=Pour Creme ;) +badge_name_FR6=Badge Habbo Revenant +badge_desc_FR6=Pour les Habbos débannis +badge_name_FR7=Badge Habbo ORO +badge_desc_FR7=Evénement Habbo ORO +badge_name_FR8=Badge H.A.B.B.O. Enterprise +badge_desc_FR8=Evénement Mission : L.A.P.I.N. +badge_name_FR9=Badge King Rabbit +badge_desc_FR9=Evénement Mission : L.A.P.I.N. +badge_name_FRA=Crikey +badge_desc_FRA=Watch out for those teeth! +badge_name_FRB=Badge Diamant +badge_desc_FRB=Pour les Habbos qui ont du goût ;) +badge_name_FRD=Badge Recyclo +badge_desc_FRD=Pour ceux qui pensent à la planète +badge_name_FRE=Badge Tiki +badge_desc_FRE=Pour les sacrifiés au grand Tiki Crok +badge_name_FRF=Badge Fil Santé jeunes +badge_desc_FRF=Pour les animateurs du Bus Fil Santé Jeunes +badge_name_FRG=Badge Ultimate Bobba +badge_desc_FRG=Pour les combattants d' Ultimate Bobba +badge_name_FRH=Badge Ze Noob Show +badge_desc_FRH=Pour les candidats du Noob Show +badge_name_FRI=Graffeur +badge_desc_FRI=King du Graff +badge_name_FRL=Badge Pixel Hotel +badge_desc_FRL=Concours de pixel art +badge_name_FRM=Badge Soleil levant +badge_desc_FRM=Concours de pixel art +badge_name_FRN=Badge Eco +badge_desc_FRN=Concours de pixel art +badge_name_FRQ=Badge Miss Habbo +badge_desc_FRQ=Evénement Miss Habbo 2008 +badge_name_FRR=Badge 732 +badge_desc_FRR=Evénement Appart 732 +badge_name_FRS=Badge Habbo Music Festival +badge_desc_FRS=Evénement Habbo Music Festival +badge_name_FRT=Badge Nuit des Jeux +badge_desc_FRT=Pour les gagnants de la Nuit des Jeux +badge_name_FRV=Badge 100% Sécu +badge_desc_FRV=Evènement Sécu +badge_name_FV1=Badge Concours Virus 2008 n°1 +badge_desc_FV1=Créé par -Cudvi- +badge_name_FV2=Créé par Ji-Yuu +badge_desc_FV2=Badge Concours Virus 2008 n°2 +badge_name_FV3=Créé par Kartan +badge_desc_FV3=Badge Concours Virus 2008 n°3 +badge_name_FW1=Yuppie +badge_desc_FW1=Furni Wars yuppies who championed the Pura cause! +badge_name_FW2=Tattoo +badge_desc_FW2=Marks a member of the Furni Wars Indie tribe +badge_name_GA1=Golden Gamer +badge_desc_GA1=You're looking at a hardcore gamer, baby! +badge_name_GF1=Hot or Not +badge_desc_GF1=Hot or Not Competition Winner +badge_name_GM1=Diamond Jewel +badge_desc_GM1=This Diamond means you verified your email way back in the day! +badge_name_GM2=Emerald Jewel +badge_desc_GM2=This Emerald means you verified your email way back in the day! +badge_name_GM3=Sapphire +badge_desc_GM3=This Sapphire means you verified your email way back in the day! +badge_name_GM4=Ruby Jewel +badge_desc_GM4=This Ruby means you verified your email way back in the day! +badge_name_GNO=Gargen Gnome +badge_desc_GNO=You never know where you might find one of these cute Garden Gnomes! +badge_name_GWA=Global Warming Awareness +badge_desc_GWA=You were a part of the Global Warming Awareness party. +badge_name_HF2=Habbo World Cup +badge_desc_HF2=Habbo World Cup +badge_name_HF7=HabboFest 07 +badge_desc_HF7=HabboFest 07 Winner +badge_name_HF8=HabboFest 08 +badge_desc_HF8=HabboFest 08 Winner +badge_name_HG1=X Games +badge_desc_HG1=X Games +badge_name_HH1=Suosituin sivu +badge_desc_HH1=Viime viikon suosituimman Oman sivun omistaja +badge_name_HHL=Habbo Hockey League +badge_desc_HHL=I play in the Habbo Hockey League! +badge_name_HJ1=Hungry Jack's Badge +badge_desc_HJ1=The burgers are better +badge_name_IT1=Quiz Unicef HIV +badge_desc_IT1=Febbraio 2007 +badge_name_IT2=Trofeo D'oro +badge_name_IT5=Miglior Festa +badge_desc_IT5=Il Mago di Hai - 2006 +badge_name_IT6=Miglior Scambio +badge_desc_IT6=Il Mago di Hai - 2006 +badge_name_IT7=Scaltro Giocatore +badge_desc_IT7=Il Mago di Hai - 2006 +badge_name_IT8=Pop Band +badge_desc_IT8=Habbofest 08 +badge_name_IT9=Sonora +badge_desc_IT9=Visita VIP dei Sonora +badge_name_ITF=Illusionista +badge_desc_ITF=Abracadabra! +badge_name_ITG=Domatore +badge_desc_ITG=a.k.a. L'Habbo che sussurra ai cuccioli +badge_name_ITH=Giocoliere +badge_desc_ITH=Faccio volare ogni sorta di Furni +badge_name_ITI=Clown +badge_desc_ITI=*spruzza acqua* +badge_name_ITJ=Mangiafuoco +badge_desc_ITJ=Ho un carattere focoso +badge_name_ITK=Trapezista +badge_desc_ITK=Habbo Volante! +badge_name_ITL=Habbo Circus +badge_desc_ITL=Per aver organizzato uno splendido spettacolo +badge_name_ITN=Quinto Anniversario +badge_desc_ITN=Buon Compleanno Habbo.it +badge_name_ITO=Groupie +badge_desc_ITO=Capace di tutto +badge_name_ITQ=Street team +badge_desc_ITQ=*Sparge la voce* +badge_name_ITR=Hip-Hop! +badge_desc_ITR=Bir YaÅŸam Tarzı.. +badge_name_ITS=Hip Hop +badge_desc_ITS=Neon 2008 +badge_name_ITT=Fan +badge_desc_ITT=Non mi sfugge un singolo! +badge_name_ITU=Periodista Oro +badge_desc_ITU=Magia en las ondas +badge_name_JF1=Katana +badge_desc_JF1=Katana badge +badge_name_JF3=Ninja +badge_desc_JF3=Habbo Ninja 08 +badge_name_JF4=Ninja +badge_desc_JF4=Habbo Ninja 08 +badge_name_JF5=Ninja +badge_desc_JF5=Habbo Ninja 08 +badge_name_JFF=Jeffoo's Foo Fighters +badge_desc_JFF=Given to those who supported Jeffoo in The Streets of Bobba. +badge_name_JKR=The Dark Knight - Joker +badge_desc_JKR="wanna see a magic trick?" +badge_name_JPB=Smile +badge_desc_JPB=La sonrisa más sincera +badge_name_JPC=Gorro de moda +badge_desc_JPC=Es un gran modist@ en gorros +badge_name_JPD=Así nos cuentas tu historia +badge_desc_JPD=¡Vivan los Habbo Descargables! +badge_name_KH2=Kappa Habbo Gamma +badge_desc_KH2=The real Habbo fraternity. +badge_name_KIN=My castle, my rules! +badge_desc_KIN=For making it to the castle safe and sound! +badge_name_KO2=Eucalyptus Leaf +badge_desc_KO2=*nom nom nom +badge_name_KR1=100% Habbo +badge_desc_KR1=Keep It Real Campaign 08 +badge_name_LBB=Queen of Habboween +badge_desc_LBB=Habboween, October 07 +badge_name_LC1=Leviathan Badge +badge_desc_LC1=Reward for completing the Bensalem Quest! +badge_name_LLL=Habbo L +badge_desc_LLL=Habbo L +badge_name_MH1=Guitar +badge_desc_MH1=Monsters of Habbo Fest 07 +badge_name_MH2=Producer 666 +badge_desc_MH2=Monsters of Habbo Fest 07 +badge_name_MRG02=Habbo USA +badge_desc_MRG02=Remembering my Habbo roots! +badge_name_NEA=Bronze Disco Ball +badge_desc_NEA=Habbofest '09 Runner Up +badge_name_NED=Neon Bronce Microphone +badge_desc_NED=For participating in the Neon Party Competition - November 2008 +badge_name_NEE=Neon Silver Microphone +badge_desc_NEE=For participating in the Neon Party Competition - November 2008 +badge_name_NEF=Golden Microphone +badge_desc_NEF=Golden Microphone +badge_name_NEG=Party Machine +badge_desc_NEG=I am a Spring Break party machine! March 2010 +badge_name_NEH=Neon Nightclub Loudspeaker +badge_desc_NEH=Nightclub Advertising art competition winner! +badge_name_NL1=Stichting Tegen Zinloos Geweld +badge_desc_NL1=Stichting Tegen Zinloos Geweld +badge_name_NL2=ChildRight +badge_desc_NL2=ChildRight +badge_name_NL3=Pestweb +badge_desc_NL3=Pestweb +badge_name_NL4=Artsen zonder Grenzen +badge_desc_NL4=Artsen zonder Grenzen +badge_name_NL5=Zweistein Battle Ball Champion Badge +badge_desc_NL5=Zweistein Battle Ball Champion Badge +badge_name_NL6=Nintendo Batlle Ball +badge_desc_NL6=Nintendo Batlle Ball +badge_name_NL038=Flirting Diploma 2010 +badge_desc_NL038=Geslaagd! +badge_name_NL8=Fortis ASR +badge_desc_NL8=Fortis ASR +badge_name_NL9=Habbo Music Awards Badge +badge_desc_NL9=Habbo Music Awards Badge +badge_name_NLA=Warchild +badge_desc_NLA=Warchild +badge_name_NLB=ex-Habbo Radio DJ +badge_desc_NLB=Voor oud-dj's van Habbo Radio +badge_name_NLC=Bronze Trax +badge_desc_NLC=Trax Competition Winner +badge_name_NLD=Silver Trax +badge_desc_NLD=Trax Competition Winner +badge_name_NLE=Gold Trax +badge_desc_NLE=Trax Competition Winner +badge_name_NLH=ING badge +badge_desc_NLH=ING badge +badge_name_NLI=Infobus Expert +badge_desc_NLI=Infobus Expert +badge_name_PB1=Black Team Supporter +badge_desc_PB1=Pink vs Black Campaign 07 +badge_name_NO2=Aslan's Army Finalist +badge_desc_NO2=Prince Caspian Competition 08 +badge_name_NO3=TESTMAYO12bis +badge_desc_NO3=TESTMAYO12bis +badge_name_PB2=Pink Team Supporter +badge_desc_PB2=Pink vs Black Campaign 07 +badge_name_PN1=Pixel Ninja +badge_desc_PN1=Design comp winners +badge_name_POP=Safety Survey Badge +badge_desc_POP=Received for filling out a Safety survey! +badge_name_PP1=Maior Amigo de Todos +badge_desc_PP1=Emblema único para um Habbo único. +badge_name_PR1=Green Pirate +badge_desc_PR1=Pirates Campaign 08 +badge_name_PR2=Blue Pirate +badge_desc_PR2=Pirates Campaign 08 +badge_name_PR3=Treasure Chest +badge_desc_PR3=Pirates 08 Campaign Winner +badge_name_PRE=Press +badge_desc_PRE=Habbo Press Members +badge_name_PT1=Poptarts Chocolate/Vanilla +badge_desc_PT1=You are a fan of the Chocolate/Vanilla Poptarts flavor. +badge_name_PT2=Poptarts StrawBlueberry +badge_desc_PT2=You are a fan of the StrawBlueberry Poptarts flavor. +badge_name_PX0=Golden Pixel +badge_desc_PX0=Is it cheese!? *bites. Ow. x1 StrayPixels Winner +badge_name_PX1=Diamond Pixel +badge_desc_PX1=Sparkly Diamond Pixel. A Habbos best friend. x3 StrayPixels Winner +badge_name_PX2=Holy Carp! +badge_desc_PX2=Smells fishy... x5 StrayPixels Winner +badge_name_PX3=Onyx Pixel +badge_desc_PX3=It's like the Gold one.. but better. x7 StrayPixels Winner +badge_name_RE1=Reach Out! Staff +badge_desc_RE1=Official Reach Out! Staff +badge_name_RE2=Reach Out! Winner +badge_desc_RE2=Reach Out! Competition Winners +badge_name_REX=Rexona Girl 2 +badge_desc_REX=¡La mejor de las fragancias! +badge_name_RR9=WWE Badge +badge_desc_RR9=Royal Rumble 09 +badge_name_RTS=Rock The Schools +badge_desc_RTS=Rock The Schools Comp 08 +badge_name_RU1=Patriot Star +badge_desc_RU1=Star Badge +badge_name_RUG=Habbo Rugby +badge_desc_RUG=Sono un campione! +badge_name_SB6=Ultimate Streets of Bobba Elite +badge_desc_SB6=You proved you were Elite in the Ultimate Streets of Bobba games. +badge_name_SFK=Special Forces Kedo +badge_desc_SFK=Given to those who supported Kedo in The Streets of Bobba. +badge_name_SG1=test for Elkah +badge_desc_SG1=test for Elkah +badge_name_SG2=Silver Habbo of the Month +badge_desc_SG2=Given to the Habbo in second place on the Habbo Points Chart. Assigned at the end of each month. +badge_name_SG3=Gold Habbo of the Month +badge_desc_SG3=Given to the Habbo in first place as Habbo of the Month. Assigned at the end of each month. +badge_name_SG4=test for Elkah +badge_desc_SG4=test for Elkah +badge_name_SG5=Hip Hop Band +badge_desc_SG5=Habbofest 08 +badge_name_SG6=WobbSquab - Gold +badge_desc_SG6=Wobble Squabble Champion Badge +badge_name_SG7=WobbSquab - Silver +badge_desc_SG7=Wobble Squabble Champion Badge +badge_name_SG8=WobbSquab - Bronze +badge_desc_SG8=Wobble Squabble Champion Badge +badge_name_SG9=Habbo Awards Badge +badge_desc_SG9=Given to winners of the Habbo Awards held in January '07 and '08. +badge_name_SGA=Slam Dunk Basketball +badge_desc_SGA=Awarded to weekly winners of the Animax Slam Dunk BattleBall: Rebound! Challenge. Only 30 of these exist! +badge_name_SGB=Shohoku Jersey Badge +badge_desc_SGB=Awarded to weekly winners of Animax Slam Dunk Trivia Challenge. There are a total of 100 of these in Habbo! +badge_name_SGC=SG Camera +badge_desc_SGC=Habbo photographers and artists capture a slice of pixel life. Those whose work is published are awarded this! +badge_name_SGD=Mall Detective (1/2) +badge_desc_SGD=I'm hunting the clues... +badge_name_SGN=PP Commemorative Badge +badge_desc_SGN=Pixel Press Group Member +badge_name_SGQ=SG Quill +badge_desc_SGQ=This very rare badge is worn by the elite of published Habbo journalists and writers. +badge_name_SGR=I <3 Mom! +badge_desc_SGR=Happy Mother's Day! +badge_name_SHK=Shrek Badge +badge_desc_SHK=Teilnahme am Shrek Wettbewerb +badge_name_SMC=Top Chef +badge_desc_SMC=Winner of the Master Chef competition in 2007. +badge_name_SOS=SOSO Badge +badge_desc_SOS=Interstitial Design Finalists +badge_name_STA=Sound The Alarm +badge_desc_STA=Sound The Alarm Campaign 08 +badge_name_SU4=Avustava toimittaja +badge_desc_SU4=Testaa itsesi -testin ideoija +badge_name_SW1=Spiderwick +badge_desc_SW1=You helped to protect the book and keep it safe. +badge_name_TAM=Tampax +badge_desc_TAM=Comodidad total +badge_name_TEO=The Emo Oranges +badge_desc_TEO=Given to those who supported iomegadrive in The Streets of Bobba. +badge_name_TUU=Tuu +badge_desc_TUU=Tuun oma merkki +badge_name_UD1=Dag or Not +badge_desc_UD1=Dag or Not Campaign 07 +badge_name_US4=Habbon kesäkoulu - viikko 6 +badge_desc_US4=Urheilu +badge_name_US6=vNBC Olympics Badge +badge_desc_US6=NBC Olympics Badge +badge_name_US7=Seventeen Fashion +badge_desc_US7=Seventeen Fashion +badge_name_US8=Toilet Marathon +badge_desc_US8=Toilet Marathon +badge_name_US9=Cara maligna +badge_desc_US9=Ha retratado la cara más maligna del Hotel +badge_name_USA=Adidas Blue +badge_desc_USA=You sure like those Blue Adidas sneakers! +badge_name_USB=Adidas Red +badge_desc_USB=You sure like those Red Adidas sneakers! +badge_name_USC=Jets (J) +badge_desc_USC=I dressed in blue in the Bring It On: In It to Win It campaign. it on +badge_name_USD=Sharks (S) +badge_desc_USD=I dressed in red in the Bring It On: In It to Win It campaign. +badge_name_USE=Xmas Smilla Badge +badge_desc_USE=You show support to Smilla. +badge_name_USF=Xmas Larry Badge +badge_desc_USF=You show support to Larry. +badge_name_USG=Xmas Mr.Sinister Badge +badge_desc_USG=You show support to Mr. Sinister. +badge_name_USH=Xmas Santa.3000 Badge +badge_desc_USH=You show support to Santa.3000. +badge_name_USI=Royal Rumble '08 +badge_desc_USI=You took part in the Habbo Royal Rumble in 2008. +badge_name_USJ=WWE Badge +badge_desc_USJ=WWE Rocks! +badge_name_USK=Around the World +badge_desc_USK=I went around the World with Puffin and Teetoo, 08! +badge_name_USL=Chinese New Year +badge_desc_USL=The year of the Rat! +badge_name_USM=No Way Out +badge_desc_USM=There truly is No Way Out! +badge_name_USN=Big Dogs +badge_desc_USN=You love Big Dogs. +badge_name_USO=Little Dogs +badge_desc_USO=You love Little Dogs. +badge_name_USP=TRAP! +badge_desc_USP=I successfully found a staff. Nothing stops me anymore! April 2020. +badge_name_USQ=Prom of the Dead Zombies +badge_desc_USQ=You were infected at the Prom of the Dead. +badge_name_USR=Prom of the Dead Cured +badge_desc_USR=You have been cured and are no longer a Prom of the Dead Zombie. +badge_name_USS=Prom of the Dead Brains +badge_desc_USS=Brains?!? +badge_name_UST=Oldschool Amateur +badge_desc_UST=For participating in the oldschool room competition. April 2020. +badge_name_USU=Thanksgiving '08 +badge_desc_USU=Just like Mom used to make. Mmm, tastes like burning. +badge_name_VIK02=Steelscar Badge +badge_desc_VIK02=This is my Viking Clan! +badge_name_XM5=Smilla Winner +badge_desc_XM5=Christmas Campaign 07 +badge_name_XM6=Santa3.000 Winner +badge_desc_XM6=Christmas Campaign 07 +badge_name_XM7=Mr Sinister Winner +badge_desc_XM7=Christmas Campaign 07 +badge_name_XM8=Bob Winner +badge_desc_XM8=Christmas Campaign 07 +badge_name_XMA=Happy Snowball +badge_desc_XMA=Two eyes made out of coal... pixel coal +badge_name_XMB=Mr. Frosty +badge_desc_XMB=xmas08 penguin games +badge_name_XMC=Quest Tree of 2008 +badge_desc_XMC=It's like the one from 2006... just... colder. +badge_name_Z27=Prom Queen 09 +badge_desc_Z27=Prom Queen 09 +badge_name_Z34=Badge PPC 3 +badge_desc_Z34=Evènement Palace pour chiens +badge_name_EXA=Caneta Vermelha +badge_desc_EXA=Pode assinar aqui, aqui, aqui e acolá, por favor? Ah, e nessa linha também. +badge_name_EXB=Executive Pen +badge_desc_EXB=Bamaloo's Office Comp '09 +badge_desc_Z09=Competition winner at the Habbo Underage Festival 2008. +badge_desc_ACH_RegistrationDuration1=Level 1 - For true Habbos who have been members of the community for 3 days. Worth 30 pixels. +badge_desc_UK3=Frank Bus moderator. +badge_desc_Z17=Hairspray The Musical talent show competition winner! 2008 +badge_name_HX4=Habbo eXpert +badge_desc_WH3=Habboween competition /event winner. +badge_desc_ACH_GamePlayed4=Level 4 - For playing and winning Snow Storm or for the game of Battle Ball 50 times. Worth 80 pixels. +badge_desc_ACH_Login7=Level 7 - For logging in 70 days in a row. Awesome. Worth 200 pixels. +badge_desc_UKY=Awarded to Quest Guild members. You must submit a Quest to enter the guild. +badge_name_ACH_Login2=Preferred Guest +badge_name_ADM=Habbo Staff +badge_name_ACH_Login10=Phoenix +badge_desc_ACH_Login9=Level 9 - For logging in 90 days in a row. Extraordinary. Worth 200 pixels. +badge_desc_DN1=Diner Room Winner 2008. +badge_name_OL1=Habbolympic Gold +badge_desc_HJ6=Attended the Harajuku Lovers Hub launch party! +badge_name_WBL=Wobble Squabble HOF +badge_name_HM1=Mall Builder +badge_desc_HWB=Habboween competition badge. +badge_name_UK5=Comic Creator +badge_desc_WBL=Hall of Fame member. Awarded to the top 25 Wobble Squabble players. +badge_desc_HW1=Winning Director of a Habbowood movie. Habbowood ran in both 2006 and 2007. +badge_name_ST4=Cosmetics Specialist +badge_desc_CL2=Idea Agency Silver brief winner! +badge_name_NEB=Official EPIC Party Host +badge_name_UKR=St Trinian's Head Girl +badge_desc_ACH_AllTimeHotelPresence6=Level 6 - spending total of 144 hours in hotel. Worth 20 pixels. +badge_name_ACH_MGM10=Prom +badge_name_HX2=Habbo eXpert +badge_name_ACH_RoomEntry6=House Guest +badge_name_WH1=Evil Eye +badge_desc_UK5=Habbo comic creator. Comics were displayed on the homepage for 2 weeks during 2007. +badge_desc_GLG=Level 7 - The strong one - the one you can depend on. For being a Habbo guide - Here to help. Worth 660 pixels. +badge_name_GLA=Bunny +badge_name_LC3=Lemuria Adventurer +badge_desc_UK9=Japanese quest winner 2007. +badge_desc_Z03=Earth week competition winner. +badge_desc_DN3=Roadtrip USA 15 Points 2008. +badge_desc_ACH_AllTimeHotelPresence8=Level 8 - spending total of 576 hours in hotel. Worth 20 pixels. +badge_desc_Z31=Official Habbo Music Festival Artist +badge_name_UK7=Quest Builder +badge_name_ACH_MGM8=Ball +badge_name_VA3=Habborella Cruise +badge_desc_HX8=Gold Game eXpert +badges_tab_title=My badges +badge_name_AC1=Bensalem Tribe Member +badge_name_EC5=Earth Week Riddle +badge_desc_ACH_AvatarLooks1=For finally putting some fresh clothes on. Worth 50 pixels. +badge_desc_ST3=You need Science and Maths skills for this job! +badge_name_SB1=Bouncing Queens +badge_name_ST2=Digital Designer +badge_name_Z59=History Buff +badge_name_UKB=Play Writer +badge_name_HW1=Habbowood Director +badge_name_Z35=Hotel For Dogs Quest Winner +badge_desc_AC1=Initiated through the Totem bases of fire PINK +badge_desc_ACH_RoomEntry10=Level 10 - For hanging out in 200 Guest Rooms that you do not own. Time traveler. Worth 40 pixels. +badge_desc_ACH_RegistrationDuration7=Level 7 - For true Habbos who have been members of the community for 2 years. Worth 200 pixels. +badge_name_UKT=Candy Floss +badge_name_UKL=Fantastic4 Silver +badge_name_ACH_RoomEntry4=Day tripper +badge_desc_ACH_AllTimeHotelPresence4=Level 4 - spending total of 16 hours in hotel. Worth 20 pixels. +badge_name_ACH_GamePlayed5=Battle Royal V +badge_name_ACH_TraderPass2=Trader's Pass +badge_name_RU3=SafeSid Competition Winner +badge_desc_Z13=Runner Up of Habbo Big Brother series1 in July 2008. +badge_desc_ACH_GamePlayed8=Level 8 - For playing and winning Snow Storm or the game of Battle Ball 280 times. Worth 220 pixels. +badge_desc_SHA=Chinese New Year 2009 +badge_desc_ACH_RegistrationDuration5=Level 5 - For true Habbos who have been members of the community for 24 weeks. Worth 160 pixels. +badge_name_ACH_RespectEarned1=10% Respected Habbo I +badge_desc_ACH_MGM7=Level 7 - For creating your own fellowship - party of 12. For inviting two more real life friends to Habbo. Worth 160 pixels. +badge_name_Z33=It Doesn't Have To Happen +badge_desc_ACH_RoomEntry8=Level 8 - For hanging out in 140 Guest Rooms that you do not own. Orion. Worth 30 pixels. +badge_desc_XM2=Elf Vs Reindeer Christmas 2005 +badge_name_ACH_Login8=Rotten tomato +badge_desc_SB2=Bobbaschi gang member on the Streets Of Bobba September 2006. +badge_desc_SU1=Lvl1 Tiki Competition winner. Lowest award. Summer 2008. +badge_desc_BTB=Hall of Fame member. Awarded to the top 25 BattleBall players. +badge_desc_ACH_GamePlayed2=Level 2 - For playing and winning Snow Storm or for the game of Battle Ball 5 times. Worth 30 pixels +badge_desc_ACH_RespectEarned9=Level 9 - For earning respect a further 200 times. Worth 200 pixels. +badge_desc_ACH_Login3=Level 3 - For logging in 15 days in a row. Strange. Worth 120 pixels. +badges_window_title=Badges +badge_name_UK9=Japanese Statue +badge_name_JF2=Japanese Sushi +badge_desc_ACH_RoomEntry6=Level 6 - For hanging out in 80 Guest Rooms that you do not own. Out of towner. Worth 20 pixels. +badge_name_Z39=Hotel For Dogs Maze Winner +badge_desc_ACH_AllTimeHotelPresence10=Level 10 - spending total of 2304 hours in hotel. Worth 20 pixels. +badge_name_Z40=Habbo UK is 8! +badge_name_ACH_AllTimeHotelPresence2=Online time II - Drizzle +badge_name_SB3=Shabbolins +badge_name_ACH_RespectGiven1=Nice as pie! +badge_name_GLG=Buffalo +badge_name_HJ3=Designed Gwen Stefani an outfit with Harajuku Lovers +badge_desc_ACH_RespectEarned7=Level 7 - For earning respect a further 200 times. Worth 200 pixels. +badge_desc_UKC=Habbo submitted news stories. +badge_name_UKV=Gold Rollercoaster +badge_desc_VA7=For making a really good Bollywood Movie. 2009. +badge_name_BTB=BattleBall HOF +badge_name_ACH_AllTimeHotelPresence6=Online time VI- Jet Stream +badge_name_UKJ=Wood Sign +badge_desc_Z33=Play Director and Reviewer extraordinaire +badge_desc_ACH_GamePlayed6=Level 6 - For playing and winning Snow Storm or the game of Battle Ball 160 times. Worth 120 pixels. +badge_name_ACH_RespectEarned3=Been respected 16 times. +badge_desc_ACH_AllTimeHotelPresence2=Level 2 - spending total of 3 hours in hotel. Worth 20 pixels. +badge_name_VA1=Superlove Heart +badge_desc_CAC=Landscape Room Winner 2008. +badge_name_ACH_RoomEntry2=Running Room Raider +badge_name_PIR=Pirate Necklace +badge_name_ACH_RegistrationDuration3=30 % True Habbo +badge_desc_ST4=You need Science and Maths skills for this job! +badge_desc_MD1=Awarded to winners of the Meet Dave quiz competition. 2008. +badge_name_UKW=Silver Rollercoaster +badge_name_SU1=Low Tiki Mana +badge_desc_Z29=Awarded to The Insiders prank competition winners. October 2008. +badge_desc_UKE=I left everything behind and was able to win. April 2020. +badge_desc_ADM=Habbo.com Staff member +badge_name_U01=Idea Agency competition runner-up! +badge_name_ACH_EmailVerification1=True You +badge_desc_EC2=Won a Love The Earth event +badge_name_CL2=Idea Agency competition winner! +badge_name_ACH_Login6=Covered with moss +badge_desc_AC3=Initiated through the Totem bases of fire BLUE +badge_name_WH7=Virus Blood +badge_desc_Z27=Road Trip USA Queen badge winner. Awarded to anyone who exchanged 25 Fuel Points. 2008 +badge_desc_HJ2=I'm an official Harajuku Lovers girl +badge_name_Z14=Briefcase Affair +badge_name_ACH_GamePlayed3=Battle Royal III +badge_desc_Z19=You have reached LEVEL4. October 2008. +badge_name_DK5=Camp Rock Guitar Blue +badge_desc_ACH_RespectEarned5=Level 5 - For earning respect a further 100 times. Worth 100 pixels. +badge_desc_HJ4=Member of the Cool Japan Quiz winning team +badge_desc_Z60=Built a Museum room to house a replica tablet +badge_name_ACH_AllTimeHotelPresence4=Online time IV - Blizzard +badge_name_Z16=Newspaper Affair +badge_desc_ACH_Motto1=For editing your motto & letting us know how you're feeling. Worth 10 pixels. +badge_name_U03=Idea Agency competition winner! +badge_desc_Z59=Master of the history quest +badge_name_Z37=Hotel For Dogs 2* Resort Owner +badge_name_HX6=Habbo eXpert +badge_desc_ACH_RegistrationDuration3=Level 3 - For true Habbos who have been members of the community for 8 weeks. Worth 90 pixels. +badge_name_MD2=Meet Dave Body +badge_desc_WH1=Habboween competition /event winner. +badge_desc_UKR=Winner of St Trinians Head Girl competition. +badge_desc_Z15=My Spy Family quest 1 winner. +badge_name_HJ5=Harajuku Lovers Music +badge_name_U05=Habbo Raceway Course +badge_name_ACH_MGM1=Baby Shower +badge_name_GLH=Bear +bage_name_XMA=Christmas 2008 comp winner +badge_name_HF1=Golden Football Boot +badge_name_Z13=HBB Runner Up +badge_name_ACH_RoomEntry10=Pilgrim +badge_desc_UKJ=Dark is Rising sign of wood. 2007. +achievements_desc=Achievements are tasks that you can do in Habbo Hotel. For each Achievement you receive a badge and some pixels +badge_name_UKY=Quest Guild +badge_name_ACH_RegistrationDuration5=50 % True Habbo +badge_desc_VA1=Awarded to the two superlove champions Valentine's 2006. +badge_desc_UKX=Winner at the St Trinian's Quiz competiton 2008. +badge_name_Z48=Bionicle Kick Wars Winner +badge_desc_UKV=Theme Park team competition champion. 2008 +badge_name_DN4=Pink Fuel Flag +badge_desc_SNW=Hall of Fame member. Awarded to the top 25 SnowStorm players. +badge_desc_HC4=Level 4 - For 36 months of Habbo Club membership. Worth 400 pixels. +badge_desc_Z25=You have reached LEVEL1. October 2008. +badge_desc_ATW=Globetrekker competition winner. Country room is in our Globetrekker Tour Guide 2008. +badge_desc_NEC=Official HMF:Neon Best New Artist Supporter +badge_name_ACH_GamePlayed1=Battle Royal I +badge_desc_UKT=Theme Park creative competition winner. 2008 +badge_desc_UKN=Awarded to winners of the 2007 HAFTAs where rooms were built based on films. +badge_desc_ACH_Login10=Level 10 - For logging in 100 days in a row. Breathtaking. Worth 200 pixels. +badge_desc_ST6=You need Science and Maths skills for this job! +badge_desc_EC5=Found the Tree within. +badge_name_ACH_RoomEntry1=Room Raider +badge_name_AC4=The Spirit Eagle +badge_desc_HUB=For entering our Infobus Session in April 2020. +badge_name_ACH_RegistrationDuration2=20 % True Habbo +badge_name_HC1=HC Club membership I +badge_desc_DU3=Habbowealth Games 2005. +badge_name_CY2=Low Yin Yang +badge_name_XM9=Arctic Snowballers! +badge_desc_SB4=Furnihilists gang member on the Streets Of Bobba September 2006. +badge_desc_ACH_Login6=Level 6 - For logging in 60 days in a row. Phenomenal. Worth 200 pixels. +badge_desc_XM3=Reindeer Vs Elf Christmas 2005 +badge_desc_HX4=Game eXpert +badge_name_SB4=Furnihilists +badge_name_DN1=Diner Expert +badge_name_ACH_RoomEntry9=Habitué +badge_name_Z11=HBB Contestant +badge_name_Z30=Pumpkin Design +badge_desc_VA4=Habborella cruise ship staff Valentine's 2008. +badge_name_UKN=HAFTAs Award +badge_desc_UK8=NSPCC campaign badge. Stop Bullying. Full stop. +badge_desc_UKP=Winner of the St Trinians perfect prefect competition. +badge_name_ACH_RoomEntry7=Traveler +badge_name_KIR=Keep It Real +badge_desc_Z40=I celebrated Habbo UK's 8th birthday, 17/1/2009 +badge_name_Z25=IGOR GOGGLES +badge_name_ACH_RegistrationDuration7=70 % True Habbo +badge_desc_TC2=Wobble Squabble Challenge involved being in the top 20 highscores for 15 weeks in a row! +badge_desc_HBA=Hobbas were volunteer moderators. +badge_desc_VA2=Awarded to competition winners during Valentine's week each year. +badge_desc_ACH_RoomEntry5=Level 5 - For hanging out in 60 Guest Rooms that you do not own. Globetrotter. Worth 15 pixels. +badge_desc_OL3=Awarded to members of the 3rd Habbolympic team 2008. +badge_desc_Z10=Competition winner at the Habbo Underage Festival 2008. +badge_name_ACH_RespectEarned10=Been respected 1166 times. +badge_desc_Z46=HAFTAS Winner 2009 +badge_desc_Z23=You have reached LEVEL2. October 2008. +badge_desc_ACH_RegistrationDuration9=Level 9 - For true Habbos who have been members of the community for 4 years. Worth 200 pixels. +badge_name_ACH_RegistrationDuration9=90 % True Habbo +badge_desc_ACH_TraderPass2=Level 2 - Achieved if you have been busy trading your stuff. Keep it up! +badge_desc_Z48=I showed the strength of a Bionicle glatorian! +badge_desc_XM1=Rasta Santa was awarded during Christmas 2005. He visited the hotel December 2006. +badge_desc_Z04=Earth Week 2020 +badge_name_ACH_MGM6=Reunion +badge_name_WH3=Vampire Fangs +badge_name_Z02=Earth Week 2020 +badge_name_Z56=The Buzz Brain of Habbo +badge_name_Z27=Road Trip Queen +slots_full=5 badges worn! +badge_name_HUB=Infobus Session April +badge_desc_KIR=Keep It Real competition winner. Don't forget to keep it 100% Habbo! +badge_desc_U02=Idea Agency Silver brief winner! +badge_desc_AP3=A winner or runner-up in the HABprentice: Designer Edition tasks +badge_desc_ACH_GamePlayed10=Level 10 - For playing and winning Snow Storm or the game of Battle Ball 440 times. Worth 340 pixels. +badge_wear=Wear +badge_name_TC2=Wobble Squabble Champ +badge_save=Save +badge_desc_WAR=Awarded for attending the Peace Protest in 2008 or responding correctly to the Peace Poll. +badge_desc_ACH_RespectEarned2=Level 2 - For earning respect a further 5 times. Worth 20 pixels. +badge_desc_DK6=Camp Rock Winner 2008 +badge_desc_ACH_RoomEntry3=Level 3 - For hanging out in 30 guest rooms that you do not own. Worth 15 pixels. +badge_desc_UK6=Billboard design winner. Billboards were displayed in the Gallery Cafe for 2 weeks during 2007! +badge_name_GLJ=Owl +badge_desc_Z08=2nd place in the Step Up 2 The Streets dance competition. +badge_desc_OL1=Awarded to members of the 1st Habbolympic team 2008. +badge_desc_GLH=Level 8 - The friendly one - kind and always there. For being a Habbo guide - Here to help. Worth 735 pixels. +badge_desc_HX6=Gold Safety eXpert +badge_name_AP2=Official HABprentice Designer 2009 +badge_desc_DN5=Roadtrip USA 10 Points 2008. +badge_name_Z19=IGOR BUBBLING BEAKER +badge_name_ST1=Sound Engineer +badge_name_CAC=Landscape Expert +badge_desc_ACH_MGM1=Level 1 - For creating your own fellowship - party of 2. For inviting one real life friend to Habbo. Worth 50 pixels. +badge_name_AC6=The Angry Spirit Ape +badge_name_ACH_GamePlayed8=Battle Royal VIII +badge_desc_ACH_RoomEntry1=Level 1 - For hanging out in 5 guest rooms that you do not own. Worth 5 pixels. +badge_desc_GLJ=Level 10 - The old and wise one - loyal, with a heart of gold. For being a Habbo guide - Here to help. Worth 1000 pixels. +badge_desc_ACH_AvatarTags1=For tagging yourself with 5 tags. Use your words wisely. Describe yourself for a wicked match! Worth 50 pixels. +badge_desc_ACH_MGM3=Level 3 - For creating your own fellowship - party of 4. For inviting one real life friend to Habbo. Worth 60 pixels. +badge_name_WH5=Purple Guitar +badge_desc_AR1=Alhambra Prize Winner 2008 +badge_name_GRR=Gorillaz Celeb Visit +badge_desc_GLD=Level 4 - The digger one - has information you cannot find. For being a Habbo guide - Here to help. Worth 90 pixels. +badge_name_ACH_RespectEarned9=Been respected 966 times. +badge_name_Z08=Silver Graffiti +badge_desc_XM9=For Arctic Maze survivors! +badge_desc_AC5=Used the inner Spirit Squid to find the Lost Tribe of Bensalem +badge_name_DU2=Silver Habbowealth +badge_name_GLB=Bambi +badge_name_UK2=Always Salon Champ +badge_desc_ACH_MGM5=Level 5 - For creating your own fellowship - party of 8. For inviting two more real life friends to Habbo. Worth 140 pixels. +badge_name_VIP=VIP Pass +badge_desc_Z06=3rd place in the Step Up 2 The Streets dance competition. +badge_desc_GLB=Level 2 - The loving one - makes you wanna help others. For being a Habbo guide - Here to help. Worth 32 pixels. +badge_name_UK4=Habbo Council +badge_name_ACH_MGM4=Dance Party +badge_desc_HX1=Host eXpert +badge_desc_Z21=You have reached LEVEL3. October 2008. +badge_name_MB1=Madball Red Card +badge_name_ACH_RespectEarned7=Been respected 566 times. +achievements_tab_title=Achievements +badge_name_ATW=Globetrekker +badge_desc_HC2=Level 2 - For 12 months of Habbo Club membership. Worth 200 pixels. +badge_desc_Z36=Hotel For Dogs 1* Resort Owner +badge_name_VA8=Large Shalimar +badge_desc_JF2=Awarded to everyone who opened a Sushi Parlour that was visited and endorsed by Kitsune. 2008 +badge_name_ACH_RespectEarned5=Been respected 166 times. +badge_name_Z06=Bronze Graffiti +badge_desc_UKI=Dark is Rising sign of water. 2007. +badge_name_Z23=IGOR BUNSEN BURNER +badge_desc_Z12=Winner of Habbo Big Brother series1 in July 2008. +badge_desc_ACH_Login2=Level 2 - For logging in 8 days in a row. Weird. Worth 80 pixels. +badge_name_GLD=Badger +badge_desc_Z56=I've got the biggest brain in all of Habbo! +badge_name_MMC= +badge_desc_GLF=Level 6 - The hunter - stalks down the answers. For being a Habbo guide - Here to help. Worth 600 pixels. +badge_name_HC4=HC Club membership IV +badge_name_CH002=Schreibwerkstatt Badge +badge_desc_CH002=Gute Geschichte! +badge_name_CH003=Gewinner eines Habbo Ocean Events +badge_desc_CH003=Habbo Ocean Events +badge_name_DEH=Pixelolymp +badge_desc_DEH=Bezwinger einer Pixelolymp Herausforderung +badge_name_HQ005=Crime Scene Level 2 +badge_desc_HQ005=Provided Detailed Eyewitness Account 2009 +badge_name_MS3=Malign +badge_desc_MS3=Do not mess with me! Devil's Maze Top 10 +badge_name_NO007=Joulukuusi +badge_desc_NO007=Veikannut oikein joulukoristeiden määrän +badge_name_U04=Habbo 500 Race Winner +badge_desc_U04=All winners from a Habbo 500 daily event earned this badge. +badge_desc_UKL=Fantastic Four Silver Medallion. 2007. +badge_desc_MB1=Overall champions of Habbo Madball 2008. +badge_desc_ST1=You need Science and Maths skills for this job! +badge_name_Z21=IGOR PINCERS +ctlg_spaces_wall=Wall +catalog_give_trophymsg=You haven't engraved the trophy. Type \ryour inscription in the grey box. +catalog_get_credits_link=Get Credits >> +ctlg_plasto_preview=Preview +pixels=Pixels +catalog_pet_name_length=Oops, pet's name is too long (max 15 characters) +catalog_buyingSuccesfull=Buying Successful! +Alert_no_credits=You don't have enough Credits. +catalog_costs=\x1 costs \x2 Credits +ctlg_spaces_landscape=Landscape +link.format.collectibles=http://%predefined%/credits/collectibles +catalog_pixels=You have \x Pixels. +catalog_length_trophymsg=Oops, your inscription is too long, so it won't fit on the trophy. \rPlease type something shorter. +catalog_selectproduct=Select product: +catalog_typeurname=Type your greetings here\r(don't forget to put your name!): +ctlg_plasto_select=Select the colour: +catalog_credits=You have \x Credits in your purse. +shopping_costs=XX costs XX Credit(s).\rJust click 'buy' once, it'll appear shortly. +credits=Credits +catalog_give_petname=Type your pet's name in the grey box. +redeem=Redeem +buy_andwear=Buy & Wear +shopping_asagift=Buy As A Gift +catalog_costs_pixelsandcredits=\x1 costs \x3 Pixels and \x2 Credits +shopping_got=You have xx in your Purse. +catalog_get_pixels_link=How to get >> +catalog_costs_pixels=\x1 costs \x3 Pixels +catalog_creditsandpixels=You have \x Credits in your purse and \y Pixels. +shopping_nocash=You don't have enough Credits in your Purse.\r Click 'OK' to see the different ways of\rgetting Habbo Credits. +catalog_coins_amount=You have %amount% Credits +catalog_itsurs=Yay! It's being delivered now. +expiring_item_postfix=Lasts %x% hours %y% minutes. +catalog_published=The catalogue has been updated. Please reload the catalogue. +catalog_pet_unacceptable=Sorry, that name is unacceptable to Hotel Management +catalog_page=page +ctlg_plasto_choose=Choose a product: +ctlg_spaces_colour=Colour +Alert_no_credits_and_pixels=You don't have enough Credits and Pixels. +catalog_purchase_not_allowed_hc=In order to buy this item you must be a Habbo Club member! +catalog_giftfor=This is a gift for: +ctlg_spaces_floor=Floor +Alert_no_pixels=You don't have enough Pixels. +catalog_info_window=Catalog info dialog +catalog_costs_credits=\x1 costs \x2 Credits +ctlg_spaces_pattern=Pattern +ctlg_spaces_preview=Preview +fx_12_desc=Ice cold! +fx_desc_duration=%rYou have %c of these, duration %hh %mmin +fx_18=UFO in yellow +fx_4_desc=Twinkle like the star you are. +fx_btn_stop=Stop effect +object_displayer_fx=%fx (%t) +fx_19=BluesMobile +fx_5=Torch +fx_bubbles=Forever blowing bubbles! +fx_inv_window_title=My effects +fx_18_desc=Unidentified yellow flying object. +fx_17_desc=Fly away with this UFO of love. +fx_20_desc=How can I help? +fx_inv_active_title=Effects activated: +fx_16=Microphone +fx_22_desc=This is black sunshine! +fx_23_desc=You can even fly! +fx_24_desc=What a shower! +fx_25_desc=What a heat it gives off! +fx_26_desc=Do not even think of a case! +fx_11_desc=X-Rayed +fx_explosion=Explosions +fx_btn_inventory=Effects Inventory +fx15=Hover board +fx_flare=Flares! +fx_4=Twinkle +fx_20=HelpMobile +fx_12=Frozen +fx_catalog_link_text=You can get cool effects from the catalogue, go get yours! +fx_1_desc=Shine the light on me! +fx_9=Love +fx_9_desc=Love is in the air. +fx_7=Butterfly effect +fx_11=X-Ray +fx_8=Fireflies +fx_8_desc=Light my fire +fx_6=HRJP-3000 +fx_17=UFO in pink +fx_21=RebelMobile +fx.catalog.link.nodename=Special Effects +fx_3_desc=Help, I'm being abducted. +fx_btn_choose=Wear effect +fx_19_desc=We're on a mission from god. +fx_16_desc=Habbo Dragonfly microphone +fx_tab_title=My effects +fx15_desc=The future of transportation in yellow. +fx_6_desc=Habbo Rocket Jet Pack. +fx_15=Yellow hover board +fx_10_desc=Get a shower! +fx_2=Hover board +fx_21_desc=Drive like lightning, crash like thunder! +fx_13_desc=Spooky +fx14_desc=The future of transportation in pink. +fx_3=UFO +fx_10=Flies +fx_13=Ghost +fx_notinuse=Not in use +fx_14_desc=See the world on pink hover board. +fx14=Hover board +fx_btn_activate=Activate +fx_1=Spotlight +fx_inv_worn_title=Currently active effects: +fx_7_desc=Let the butterflies flap their wings. +fx_5_desc=Light the dark corners of your existence. +fx_22=BadMobile +fx_23=Radioactive +fx_24=Under rain +fx_25=Flares +fx_26=Stick of command +fx_14=Pink hover board +fx_2_desc=The future of transportation. +fx_15_desc=As yellow as a submarine. +help_choise_header=What do you need help with? +pending_cfh_title=Your old message +hobba_pickup_go=Pick Up & Go! +help_pointer_2=http://www.habbohotel.co.uk/iot/go?lang=en&country=uk +win_help=Habbo Help +chatlog.url=https://theallseeingeye.sulake.com/ase/habbo/uk/housekeeping/extra/hobba/chatlog.action?chatId= +help_txt_4=The Habbo Way +callhelp_example=Example: How do I move my Furni? +help=Habbo Help +modtool_roomalert=Room Alert +help_emergency_explanation=If you are experiencing a situation which is making you feel uncomfortable or unsafe, please give details below and a member of community staff will reply as soon as possible. +hobba_reply_cfh=Reply to: +help_txt_2=Password Reset +hobba_alert=Moderator Alert +modtool_message=Message: +modtool_header=The Tool +hobba_pickandreply=Pick & Reply +help_trouble=In Trouble? +hobba_pickblock=Block +help_option_2=My Habbo account. +help_txt_5=Safety Tips +modtool_extrainfo=Extra Info: +modtool_alertuser=Alert User +modtool_kickuser=Kick User +hobba_chatlog=See Chat Log >> +help_pointer_4=http://www.habbo.co.uk/help/86 +hobba_blockedby=Blocked by: +help_txt_1=How do I get Credits? +help_option_4=Current System Status +help_pointer_1=http://www.habbo.co.uk/help/ +help_emergency_writeyour=Give details of your emergency here: +help_txt_3=Help with Habbo Hotel +callhelp_sent=If you have questions about Habbo Hotel or your Habbo account, please write the details below and a member of community staff will respond as soon as possible. +callhelp_writeyour=Write your question about Habbo Hotel here: +hobba_cryforhelp=Automatic call for help +hobba_sent_to_helpers=Call re-assigned as emergency and sent to moderators +help_option_3=A serious issue (harassment, sexual behaviour) +modtool_banreason=Ban Reason: +modtool_banlength=Ban Length: +help_tour=Guided Tour +modtool_ban_ip=Ban IP Also +help_emergency_whathappens=A member of community staff will investigate the situation and take appropriate action. Please check Service Updates on the FAQs for known technical problems. +help_callforhelp=Get Live Help +help_topics=Help Topics: +help_pointer_3=emergency_help +help_option_1=Playing Habbo +modtool_days=Days +hobba_pickedby=Picked Up By: +hobba_mark_normal=Send To Helpers +hobba_mark_emergency=Emergency Help +hobba_sent_to_moderators=Call re-assigned non-emergency, still visible to moderators +modtool_ban_computer=Ban Computer Also +help_emergency_example=Example: A Habbo wants to see me on webcam. +modtool_roomkick=Room Kick +modtool_aa_checkbox_text=Audio alert +modtool_banuser=Ban User +modtool_hours=Hours +callhelp_allwillreceive=A member of community staff will investigate the situation and take appropriate action. Please check Service Updates on the FAQs for known technical problems. +hobba_pickup=Pick Up +hobba_im_cryforhelp=Automatic IM call for help +hobba_send_reply=Send Alert +callhelp_explanation=Thanks for reporting the problem +hobba_emergency_help=Call for emergency help +you_have_pending_cfh=Your previous call for help has not been answered yet. To make a new one you must delete the old message. +hobba_message_from=Your call has been responded to as follows: +help_emergency_sent=Thanks for your call! +help_txt_6=Contact Us +modtool_choose_length=Choose Length: +Alert_NoNameSet=Check your Habbo name. +Alert_YouAreBanned_T=A Moderator kicked you out of the room. +Alert_YouAreBanned=You have been banned for breaking the Habbo Way. This is why (if no ban reason is shown use the Contact Us form): +automute.warning.message=The language you are using is not suitable for Habbo Hotel. If you continue a Moderator will take action. +Alert_no_credits=You don´t have enough Credits for this. +ig_error_join_failed_4=The team you tried to join is full already. +win_callforhelp=Alert a Moderator +ig_error_join_failed_1=You have been kicked out of this game. You can not join the same game again. +win_error=Notice! +Alert_ChooseWhoToSentMessage=Please choose who to\rsend your message to +alert_donate_topic=SCAM ALERT! +alert_InvalidUserName=Don't use this character: \x ! +Alert_unacceptableName=Sorry, that name is unacceptable to the Hotel Management +alert_reg_t=Please check these details: +Alert_RememberSetYourPassword=Please check your password +Alert_InviteFriend=Invite your friends +ig_error_join_failed_6=The game you started is not over yet. Wait for a while and try again. +alert_reg_age=You are under 11 years old. Children under 11 can't enter Habbo Hotel. +error_ok=OK-> +landscape_no_windows=To see the Landscape add windows to the room. +Alert_ModeratorWarning=Message from a Moderator- +floodblocking=You are typing too fast - don't flood the room. +alert_donate_ok=Give away my furni +room_alert_furni_limit=This room has the maximum amount of Furni. +ig_error_join_failed_2=Only one player can play on the same computer. +alert_reg_birthday=Birthday +alert_tooLongPW=Your password is too long +alert_donate_content=The other Habbo has not put anything into the trade. Are you sure you want to give away your furni? +Alert_moderator_warning= +alert_shortenPW=Your password cannot be longer than 9 characters +Alert_ConnectionNotReady=Could not connect to the server +alert_warning=Moderator says: +ig_error_game_deleted=You barely missed it. This game has just been canceled. +error_title=Oops, error! +alert_reg_blocked=A person under 11 years of age has tried to register from this machine recently.\rRegistration is not possible for a while. +alert_needpermission=You need your parent or guardian's permission to spend time in Habbo Hotel. +Alert_NameAlreadyUse=That name is already being used +epsnotify_1001=The hotel is full at the moment. Please try again in a few minutes. +ig_error_game_cancelled=Your game has timed out and is now being canceled. +nav_error_toomanyfavrooms=You can't have more than 10 favourite rooms! Please remove an old favourite if you want to add a new one. +Alert_NameTooLong=Sorry, that username is too long! +Alert_NoNameSetForLogo=Please give a name to your logo +Alert_YouMustAgree=You must accept the Terms and Conditions before proceeding. +Alert_YourPasswordIsTooShort=Passwords must be at least 6 characters long. +queue_tile_limit=You can't fit more Habbo Rollers in this room! +Alert_purchasingerror=Buying unsuccessful +alert_reg_email=Email +ig_error_join_failed_7=You can not create a new game yet. You have to leave your current game first. +Alert_CheckBirthday=Please check your birthday +Alert_MessageFromAdmin=Message from Hotel Management- +error_room_full=Huone on täynnä. +Alert_YourNameIstooShort=Habbo names must be at least 3 characters long. +ig_error_start_failed_1=Game could not be started. There were not enough players left. +alert_too_much_furnitures=Furni limit for room is exceeded. Not all furnitures are shown. Please remove some. +alert_duplicatesession=You are already logged in on another hotel! Log out before trying again. +Alert_ConnectionDisconnected=Please reload Habbo Hotel!\r\rIf this happens again, please wait a moment before reloading. +alert_old_client=You have an old version cached. Please empty your browser cache and login again. +alert_cross_domain_download=Cross domain content download prevented +Alert_ConnectionFailure=Disconnected +Alert_WrongNameOrPassword=Wrong name or password - please try again! +Alert_BuyingOK=Buying Successful! +error_report=Error Report +Alert_ForgotSetPassword=Please check your password +error_text=Error occured, press 'OK' to restart program.\r\rPlease report bugs to:\rwww.habbohotel.com/habbo/en/help/contact/bugs/ \rSorry for the inconvenience. +automute.muted.message=Due to continuing the unsuitable language, you are muted for the next 10 minutes. +Alert_YourPasswordIstooShort=Passwords must be at least 6 characters long. +error_room_closed=Huone on suljettu. +alert_win_coppa=You are blocked +Alert_WrongPassword=Check password! +error_report_explain=An error has occurred, please see the error code above. +alert_no_category=Your room has no category. Please choose one from the drop down list. +Alert_LogoNameAlreadyUse=That name is already being used +ig_error_enter_arena_1=This game has already started. +error_report_trigger_message=Last message ID +trading_already_open=You are trading with someone and you cannot start a new trade. +trading_accept=Accept trade +trading_wait=Please wait... +trading_cancel=Cancel Trading +start=Start +trading_disabled_my=This account does not have trading in use. You can receive items from other users but cannot give them anything. Check your trading settings and make sure your email-address is activated. +trading_youoffer=You offer: +trading_confirm_info=These are the final offers. Please confirm the trade. +trading_confirm=Confirm +trading_disabled_her=This user does not have trading in use. You can give him/her items but he can't give you anything in return. +trading_disabled_both=Trading is not in use for either of you, check your trading settings. +trading=Trading +trade=Trade +human_trading=Trading +trading_title=Safe Trading +trading_offers=offers: +trading_agrees=agrees +trading_modify=Modify trade +trading_waiting_info=Waiting for other user to confirm the trade. +trading_youagree=You agree +trading_closed=Other user cancelled the trade. +trading_additems=Put items in boxes +next_onearrowed=Next > +ok=OK +win_partner_registration=Partner registration +partner_registration_title=Hey, I forgot to mention one thing.. +poll_alert_answer_missing=Please give an answer +ad_note=Clicking this advertisement will open a new window +open=Open +gen_youhave=You Have +poll_offer_title=Poll +poll_offer_window=Welcome to our poll +preview_downloading=Preview downloading... +previous=Previous +security=Security +accept=Accept +move=Move +cancel=Cancel +poll_confirm_window=Leave our poll +search=Search +send=Send +decision_cancel=Cancel +no=No +win_delete_item=Remove Item +previous_onearrowed=< Previous +poll_alert_invalid_selection=Please select fewer alternatives +partner_registration_text=Click the link to finish your registration. When you have finished the registration click OK to continue to the hotel. +modify=Modify +reject=Reject +poll_question_number=Question %number%/%count% +loading=Loading... +pick_furniture=Put Furni In Hand +move_furniture=Move Furni +closed=Closed +poll_alert_server_error=The poll isn't available anymore. Polls are only available at a certain public space for a certain duration. +loading_project=Loading Habbo Hotel... +chat.curse_word=Bobba +LoadingRoom=Loading room... +x=X +next_arrows=Next >> +close=Close +poll_thanks_window=Thanks! +done=Done +next=Next +pickup=Pick up +click=OK to continue to the hotel. +rotate=Rotate +buy=Buy +decision_ok=OK +poll_confirm_cancel=Stop answering? +partner_registration_link=Finish registration +credits=Credits +yes=Yes +GoAway=Leave The Room +no_user_for_gift=No user named %user% found. Gift not purchased. +normal_roomlayouts=<< Back to normal room layouts +back=Back +delete=Delete +remove=Remove +rotate_furniture=Rotate Furni +go=Go >> +poll_confirm_cancel_long=Are you sure you want to stop answering the poll? You can't continue later. +credit=Credit +char_welcome=Welcome! +poll_window=Question +people=People +NUH_invitation_search=Waiting for guides to arrive... +NUH_invitation_failure=Sorry, available Habbo guides were not found. +NUH_hand_topic=Where to keep my stuff? +NUH_guide_info_autoselected=This is a Guide (experienced player) who responded to your invitation. See more information about the Guide on the right. +NUH_events_topic=Looking for a place to go? +nuh_shopping=You can earn pixels if you complete achievements. You can shop with your pixels in the catalogue. +NUH_friends=Check out your friend list to see friends and friend requests. +NUH_invitation_status_header=Habbo Guidance +NUH_chat=Click here and type to chat to other Habbos. +NUH_invitation_success=Inviting completed successfully! +guide_tool_friendlist_full=You cannot start picking up invitations. Your friend list is full. +guide_tool_start_picking=Start picking up invitations from the new users? +NUH_achievements_topic=Things to do here? +guide_tool_alert_sound=Use alert sound +guide_tool_service_disabled=Habbo Guides is currently disabled. +NUH_invitation_option_1=Check out the events >> +NUH_shopping_topic=Pixels and Shopping +guide_tool_waiting=Searching for invitations... +NUH_friends_topic=Friends? +guide_tool_header=Habbo Guide Tool +NUH_achievements=If you click your character, and click "badges" you can see a list of achievements you can do from the achievements window. +NUH_invitation_guides_found=Guides found: +NUH_hand=Click the hand icon to open your inventory, You have received a gift! +NUH_events=Event board is full of parties organized by other players, jump in. +NUH_finish=Meet other players in events, rooms and lounges or play a game. +NUH_room_left_back=Go back to Your room. +NUH_ig=Join and start free multiplayer games. Throw snowballs in SnowStorm or color tiles in Battle Ball. +NUH_asktoshowhelp_decision_cancel=No, skip +NUH_asktoshowhelp_decision_ok=Yes +NUH_room_left_close=Cancel invites +NUH_navigator=Use the Navigator to move around. There are literally thousands of rooms to explore! +NUH_asktoshowhelp_text=Want us to show you some tips on how to do things here in Habbo? +NUH_own_user=This is your character. Click on floor to move around. + +Click on your character to select it and show the info stand. +NUH_games=Wanna play? Join for a game with other Habbos. +NUH_finish_topic=Have fun exploring! +NUH_messenger=Open your Console here - you might have messages or friend requests waiting. +NUH_shopping=You can earn pixels when you play Habbo and if you complete achievements. Spend your pixels in catalogue. +NUH_asktoshowhelp_title=Tutorial +NUH_invitation_option_2=Play games >> +NUH_guide_info=This is a Guide that responded to your invitation. +NUH_room_left=You have left your room. +guide_tool_max_newbies=You are currently helping 10 new users. You cannot help anymore until you have finished with your current ones. +club_thanks_title=Congratulations! You are now a member of Habbo Club. +club_isp_change=Change your subscription +club_timefull=Sorry, you can only buy up to three months of Habbo Club subscription in advance. +club_txt_changesubscr=Change subscription +club_general_infolink=More Info About Habbo Club >> +club_button_1_period=Buy 1 >>> +club_desc_2_period=3 Months (93 days) = 60 Credits +club_confirm_text2=Buy more and pay less: 3 Months (93 days) of Habbo Club cost only 60 Credits. You have %credits% credits in your Purse.\r\r After buying the membership, you will immediately be part of the Habbo VIP Community. +club_txt_renew2=You are Habbo Club member. If you want to change your subscription or leave the club, use the link below. +club_change_url=http://%predefined%/credits/club +club_intro_link=Learn more about Habbo Club! +club_button_2_period=Buy 3 >>> +habboclub_confirm_header=Subscription costs %price% credits +club_habbo.bottombar.link.notmember=Join! +club_end_title=Your Habbo Club membership has now expired. +club_txt_expired=Your Habbo Club membership has run out. You can join the club again by clicking the HC logo on the hotel view.\rMembers of Habbo Club get priority access to the hotel (so you can always get in), exclusive clothes, hair colours, rare furni and special guest room layouts. To see exactly what you'll be able to get your hands on as a Habbo Club member, take a look in the Catalogue. +club_price=One month costs 25 Habbo Credits. +club_general_elapsed=Elapsed Months +club_confirm_text1=1 Habbo Club Month (31 days) costs 25 Credits. You have %credits% Credits in your Purse.\r\r After buying the membership, you will immediately be part of the Habbo VIP Community. +club_confirm_title=You are about to subscribe to Habbo Club. Wise choice! +club_buy_url=http://%predefined%/credits/club +habboclub_confirm_body=You have %credits% credits +club_paycoins=Buy subscription +club_paybycash_url=(leave this empty if you don't want to have this link displayed) +club_expired_link=Click here to join Habbo Club +club_button_close=Close Window +habboclub_txt3=Yes, I'm over 14 years of age\rOR\rI'm under 14 years of age and I have a permission from my parent/guardian to join Habbo Club. +club_general_prepaid=Prepaid Months +club_txt_renew1=Your Habbo Club membership will be active for another %days% days. You can extend your membership by paying with Habbo Credits. +club_status_text=Here you can see your Habbo Club membership status, number of elapsed months, pre-ordered months and status of the ongoing month. +club_extend_text=If you're subscribing again to Habbo Club, you won't lose any of the advantages or ongoing furni gifts. Club membership can be extended in advance.\rRemember: one club month lasts 31 days. +habboclub_price1=30 +club_info_url=http://%predefined%//credits/habboclub +club_thanks_text=Here you can see your Habbo Club membership status, number of elapsed months, pre-ordered months and status of the ongoing month. +club_confirm_gift_text=A new club gift has arrived. Please push OK if you want to receive it now. If you click cancel you will be asked again next time you log in to the Hotel. +club_intro_text=Members of Habbo Club get LOTS of cool stuff!\rWith Habbo Club you get cool dances, access to Club Mammoth and The Blue Dragon Tavern, and a 500 limit on your friends list! +club_button_extend=Extend Membership +club_habbo.bottombar.text.notmember=Habbo Club +habboclub_txt1=You can buy Habbo Club one month at a time using Habbo Credits. +club_desc_1_period=1 Month (31 days) = 25 Credits +club_txt_intro=Welcome to Habbo Club - the members only club that all the best Habbos belong to!\r\rMembers of Habbo Club get priority access to the hotel (so you can always get in), exclusive clothes, hair colours, rare furni and special guest room layouts. To see exactly what you'll be able to get your hands on as a Habbo Club member, take a look in the Catalogue. +club_gift.message=Happy Habbo Club! Love Callie :) +club_habbo.bottombar.link.member=%days% days +club_extend_failed=Sorry, we were unable to process the purchase. No Credits were charged! +habboclub_price1.days=30 +habboclub_thanks=Yippee! You are now a member of Habbo Club! Your current email address is %email%. \r\rIf that's not the one you are using, please go to 'Update my Habbo ID' and change it now. \rThen we can contact you about your membership if need be. +habboclub_continue_button=Buy one month +club_txt_whatis=What is Habbo Club? +club_intro_header=Welcome to Habbo Club, the members-only club that all VIP Habbos belong to! +club_habbo.window.title=Habbo Club +club_general_daysleft=Number of HC days left +club_bottombar_text1=Loading +club_status_title=You are currently a member of Habbo Club. +club_confirm_gift_title=You have received a Habbo club gift! +club_confirm_text3=Buy more and pay less: 6 Months (186 days) of Habbo Club cost only 105 Credits. You have %credits% credits in your Purse.\r\r After buying the membership, you will immediately be part of the Habbo VIP Community. +club_member=Member +club_extend_title=Habbo Club membership can be extended VERY easily. +club_end_text=BUT, don't worry, you can still buy another month of Habbo Club and keep all your Habbo Club benefits,special Furni gifts and the shiny badge! +club_desc_3_period=6 Months (186 days) = 105 Credits +club_bottombar_text2=(....) +club_txt_paycash=Pay by Cash +club_habbo.bottombar.text.member=Habbo Club +club_button_3_period=Buy 6 >>> +habboclub_require_parent_permission=You need to tick the box to say that you are over 14 years or age, \ror under 14 and have your parent/guardian's permission to join Habbo Club. \rPlease go back and tick the box. +month12=December +reg_check_confirm=Please check that your information is correct, especially your birthdate and Habbo name. You CANNOT change these later. If you want make any changes now, press the back button. +reg_parentemail_moreinfo=More information: +reg_welcome3=Now the fun begins! All you need to do is register and you're ready to start. It won't take long!\rYou can change everything except your name and date of birth later. Come on! +reg_note_title=Warning! +login_welcome=Welcome +login_firstTimeHere=First time here? +reg_update_text=Never change your password or email just because somebody asks you to. He / she is most probably trying to steal your Habbo account and furni! +reg_verification_newPasswordAgain=Retype new password: +update_email_suggest=Habbo Hotel security supervisor requests you to update your email +reg_passwordContainsNoNumber=Password must contain at least one number +reg_verification_incorrectPassword=Your password was incorrect +reg_habboname_note=Now it's time to make your own Habbo character! To make your own Habbo, please start by choosing your Habbo Name. +reg_parentemail_title2=Email address of parent/guardian: +reg_day=Day +reg_check_info=CHECK YOUR INFO +emailpw=Send +reg_use_allowed_chars=Use only these characters: +month01=January +alert_reg_parent_email=The email address you provided is unacceptable. +reg_readterms_alert=You have to read the Terms and Conditions\r(scroll to the bottom of the text). +messenger.email.footer= +help_txt_5=Contact Us +registration_disabled_text=You can't create new Habbos at the moment. Please try again [some date].. +month03=March +reg_legal_header1=Now you need to ask your parents/guardian to come to the computer. Read through the text (below) with your parents. +month04=April +reg_pledgelink=Hotel rules +month08=August +login_name=Name of your Habbo +reg_age_check_note=Enter your birthday. You will need your birthday information when changing your password or email. +login_whatsHabboCalled=What's your Habbo called? +login_connecting=Connecting... +reg_termslink=Terms and Conditions +month02=February +month05=May +reg_pwd_note=Choose a password that's hard to guess! So, don't use ANYONES name, or your favorite colour! +reg_doneheader=Congratulations!\rYou're a Habbo! +reg_welcome=Welcome To Habbo Hotel! +reg_terms=Welcome to Habbo Hotel. If you are under 16, please check the Terms and Conditions with your parents/guardian before you agree to them. Get them to explain anything that you don't understand.\rIn order to use the service you have to give valid information about yourself when registering. Please email us if any of your user information changes.\rAs a user of Habbo Hotel - www.habbohotel.co.uk , you have to behave according to the Habbo Way (hotel rules) and the Terms and Conditions. Click the links below to read about them.\rNever give your password or email address to anyone. If you do, your Habbo may get stolen.\rRegistering with the hotel, making your own empty room and chatting is free of charge. For a small fee you can decorate your room with virtual furniture, play games and join the Habbo Club. If you wish to buy, you will need your parent's permission to do so. +win_figurecreator=Habbo Details +reg_note_text=Never change your password or email\rif someone else asks you to - they will\rsteal your furni and Credits! +forgottenpw_whatyou=What's your Habbo called? +reg_email_note=Please enter your e-mail address, this is important! You'll only get customer support and special offers via email, if you enter a valid email address and verify it. +reg_birthdayformat=Birthday*: [dd][mm][yyyy] +forgottenpw_email=Your email address +forgottenpw=Forgotten your password? +reg_parentemail_title=Informing your parents +retype_password=Retype Password: +log_problem_link=Read FAQ's +reg_welcome2=Create Your Own Habbo +password.email.subject=Forgotten password +reg_check_age=Age +password.email.prefix=Your password is: +month06=June +login_forgottenPassword_url=https://www.habbo.co.uk/account/password/forgot +reg_birthdayformat_update=Birthday (dd.mm.yyyy) +reg_forcedupdate=Please update your Habbo details! +help_txt_6= +login_password=Password +update_password_suggest=Habbo Hotel security supervisor requests you to update your password +reg_verification_newPassword=New password: +reg_month=Month +reg_year=Year +reg_olderage=I am 11 or older +month11=November +reg_parentemail_info=Because of your age, we need to let your parents know you are registering at Habbo Hotel. Please give the email address of one of your parents/guardians. +month10=October +url_help_3= +reg_tutorial_txt= +url_help_2= +reg_underage=I am under 11 years old +reg_verification_updateOK=Update successful +reg_girl=Girl +reg_verification_checking=Checking... +reg_verification_info=You must know the correct birthday and password before you're allowed to make these changes. +reg_retypepass=Retype Password: +reg_check_name=Name +month09=September +reg_check_mail=Email +forgottenpw_done=If the email you gave during registration was correct, your password will be sent to you now. +reg_verification_newEmail=Your new email address: +url_help_4=http://%predefined%//help/22 +reg_legal_header2=Read through the below text carefully. You must agree to the following terms before entering Habbo Hotel. +reg_habboname=Habbo name: +login_haventGotHabbo=Haven't got a Habbo yet? +reg_forcedupdate2=Update your Habbo info +reg_agree1=Yes, my parents and I agree to the above terms. I am allowed to use Habbo Hotel. +reg_update_text2=Only change them when you want to make sure that nobody can know or guess your password. +reg_agree2=Yes, I have read the Habbo Hotel Terms of Service and I accept them +url_help_6= +reg_promise=*Any personal information you supply will only be used by Habbo Ltd in accordance with the Habbo Pledge and will not be shared with third parties. +log_problem_title=Problems Connecting +month07=July +log_problem_url=http://%predefined%//help/faqs?faq_1_categoryId=14 +url_help_5= +log_problem_text=Oops.. Cannot connect to Habbo Hotel +reg_spam=Yes, I want to get the occasional email from the Hotel Manager. +login_ok=OK +reg_agree_alert=You have to agree to the terms of service\r(tick the box). +reg_boy=Boy +reg_mission=Your Mission: +messenger.email.header= +login_forgottenPassword=Forgotten your password? +reg_bday_note=Please enter your correct date of birth, this is important! You'll need this information later on, if you want to change your password or e-mail. +url_help_1=http://%predefined%//help/4 +reg_parentemail_link_text2=Privacy Pledge +reg_back=Back +reg_verification_invalidEmail=Check email address +reg_changeEmail=Change your email +password=Password: +reg_tutorial_url= +reg_parentemail_link_url1=http://%predefined%//help/parents_guide.html +reg_linkstitle=Full version of the documents: +reg_forcedupdate3=The Habbo Hotel management requires all Habbos to read and agree to the service Terms and Conditions. It won't take long.\rJust go through the registration, check your info and agree to the new terms. Thank you! +login_create1here=You can create one here. +messenger.email.subject= +reg_verification_incorrectBirthday=Your birthday was incorrect +reg_verification_currentPassword=Current password: +reg_donetext=Soon you'll see the Hotel Navigator, it shows you all the rooms you can go to -the guest rooms, clubs, cafés, swimming pools and more! +reg_nameAndPassTooSimilar=Your name and password are too similar +reg_privacypledge=Privacy Pledge +email= +reg_changePassword=Change your password +forgottenpw_explanation=If you have forgotten your password and you gave your correct email address when you registered, we can send your password to you. +reg_parentemail_link_url2=http://%predefined%//footer_pages/privacy_policy.html +reg_email=Email: +reg_parentemail_link_text1=See the letter +badges=Badges +object_displayer_show_actions=Show actions +say=Say +object_displayer_hide_actions=Hide actions +outlook=Change Clothes +object_displayer_link_badge=Edit Badge +shout=Shout +object_displayer_link_home=User's home page +room_give_respect=Give respect (%count%) +habbo_hand_prev=<<< +human_carrying=Carrying: +object_displayer_furni_expires_long=Rented item expires in %hours% hours %minutes% minutes +whisper=Whisper +dance_choose=Choose Dance +habbo_hand_next=>>> +object_displayer_hide_tags=Hide tags +object_displayer_link_looks=Change avatar looks +dance=Dance +wave=Wave +dance1=Hab-Hop +dance2=Pogo Mogo +object_displayer_furni_expires=Rented item expires in %minutes% minutes +room_ban=Kick & ban +dance_stop=Stop Dancing +dance3=Duck Funk +object_displayer_show_tags=Show tags +dance4=The Rollie +poster_47_desc=Twinkle, twinkle +poster_3_name=Fish Plaque +poster_43_name=Chains +poster_2001_name=Magic Carpet +poster_510_name=The Italian flag +poster_1006_name=Hoot Poster +poster_24_name=Three Wise Men Poster +poster_58_desc=Wishing you luck +poster_53_desc=whack that ball! +poster_1002_name=Queen Mum Poster +poster_1_desc=Is she smiling? +poster_30_name=Mistletoe +poster_2008_name=Habbo Leap Day Poster +poster_1004_desc=Celebrate with us +poster_506_name=The flag of Finland +poster_518_desc=A fiery dragon for your wall +poster_38_name=Smiling Headbangerz +poster_38_desc=For really TOUGH Habbos! +poster_25_name=Reindeer Poster +poster_511_desc=The flag of The Netherlands +poster_510_desc=The flag of Italy +poster_1000_name=Comedy Poster +poster_24_desc=Following the star +poster_32_name=Shiva Poster +poster_2002_desc=Presidentin muotokuva +poster_1004_name=Eid Mubarak Poster +poster_20_desc=A new use for carrots! +poster_42_name=Spiderweb +poster_35_desc=The Hotel's girlband. Dream on! +poster_55_name=Tree of Time +poster_2003_name=Dodgy Geezer +poster_31_desc=Pure and unbridled nu-metal +poster_58_name=Red Knots +poster_17_desc=Beautiful reproduction butterfly +poster_16_name=Bars +poster_508_desc=The flag of Spain +poster_500_desc=The UK flag +poster_10_desc=Beautiful sunset +poster_6_desc=But is it the right way up? +poster_504_desc=The German flag +poster_1003_desc=get the lovely isles on your walls +poster_23_desc=The jolly fat man himself +poster_509_name=The Jamaican flag +poster_56_desc=Serious partying going on! +poster_1001_name=Prince Charles Poster +poster_29_name=Gold Tinsel Bundle +poster_2_name=Carrot Plaque +poster_49_desc=All that glitters... +poster_21_name=Angel Poster +poster_8_desc=Habbos come in all colours +poster_1003_name=UK Map +poster_57_name=Calligraphy poster +poster_503_name=The Swiss flag +poster_2006_desc=He is the magic Habbo +poster_2007_name=The Father Of Habbo +poster_33_desc=We can't bear to lose them +poster_6_name=Abstract Poster +poster_29_desc=10 x Gold Tinsel +poster_28_name=Silver Tinsel Bundle +poster_2004_name=Rasta Poster +poster_509_desc=The flag of Jamaica +poster_2005_desc=The Special Infobus Poster +poster_32_desc=The Auspicious One +poster_54_name=Hockey Stick +poster_508_name=The Spanish flag +poster_15_name=Himalayas Poster +poster_22_name=Winter Wonderland +poster_26_desc=See that halo gleam! +poster_39_desc=The rock masters of virtual music +poster_505_name=The Maple Leaf +poster_520_name=The Rainbow Flag +poster_4_name=Bear Plaque +poster_19_desc=Trying to get in or out? +poster_523_name=India Flag +poster_501_desc=For pirates everywhere +poster_506_desc=To 'Finnish' your decor... +poster_2008_desc=Once every four Habbo years! +poster_521_desc=Ordem e progresso +poster_517_desc=Where's your kilt? +poster_41_desc=For the best music-makers +poster_5_name=Duck Poster +poster_37_desc=The Hotels girlband. Dream on! +poster_42_desc=Not something you want to run into +poster_45_desc=Needs a few more Habburgers +poster_9_desc=Do your bit for the environment +poster_55_desc=Save our trees! +poster_47_name=Small silver star +poster_48_name=Large gold star +poster_33_name=Save the Panda +poster_517_name=The Scottish flag +poster_507_desc=The French flag +poster_500_name=Union Jack +poster_7_name=Hammer Cabinet +poster_2002_name=Urho Kaleva Kekkonen +poster_4_desc=Fake of course! +poster_16_desc=Added security +poster_14_desc=A cunning painting +poster_27_desc=Deck the halls! +poster_1_name=Lady Lisa +poster_516_desc=Eng-er-land +poster_18_name=Butterfly Cabinet 2 +poster_18_desc=Beautiful reproduction butterfly +poster_2_desc=Take pride in your veg! +poster_3_desc=Smells fishy, looks cool +poster_513_name=The Australian flag +poster_514_name=The EU flag +poster_504_name=The Bundesflagge +poster_34_name=Scamme'd +poster_522_desc=Land of the rising sun +poster_502_name=The Stars and Stripes +poster_27_name=Holly Bundle 3 +poster_40_desc=The one and only. Adore her! +poster_515_desc=Waved by Swedes everywhere +poster_53_name=Hockey Stick +poster_36_desc=The Hotels girlband. Dream on! +poster_56_name=Disco Sign +poster_48_desc=All that glitters... +poster_59_desc=The eyes follow you... +poster_44_name=Mummy +poster_1006_desc=The eyes follow you... +poster_37_name=The Habbo Babes 3 +poster_83_name=Pöllö huhuilee +poster_36_name=The Habbo Babes 2 +poster_513_desc=Aussies rule! +poster_503_desc=There's no holes in this... +poster_512_desc=The flag of Ireland +poster_8_name=Habbo Colours +poster_12_name=Lapland Poster +poster_34_desc=Habbo-punk for the never-agreeing +poster_59_name=Hoot Poster +poster_19_name=Hole In The Wall +poster_1000_desc=The Noble and Silver Show +poster_54_desc=whack that ball! +poster_30_desc=Pucker up +poster_9_name=Rainforest Poster +poster_13_desc=Arty black and white +poster_522_name=Japan Flag +poster_25_desc=Doing a hard night's work +poster_11_name=Certificate +poster_20_name=Snowman Poster +poster_516_name=The English flag +poster_14_name=Fox Poster +poster_52_desc=whack that ball! +poster_2000_name=Suomen kartta +poster_518_name=The Welsh flag +poster_44_desc=Beware the curse... +poster_5_desc=Quacking good design! +poster_2000_desc=Suomen kartta +poster_1001_desc=even walls have ears +poster_10_name=Lapland Poster +poster_21_desc=See that halo gleam +poster_31_name=System of a Ban +poster_52_name=Hockey Stick +poster_2003_desc=Would you trust this man? +poster_7_desc=For emergencies only +poster_1002_desc=aw, bless... +poster_28_desc=10 x Silver Tinsel +poster_502_desc=The US flag +poster_50_desc=flap, flap, screech, screech... +poster_515_name=The Swedish flag +poster_26_name=Angel Poster +poster_50_name=Bat Poster +poster_521_name=Flag of Brazil +poster_511_name=The Dutch flag +poster_501_name=Jolly Roger +poster_83_desc=Pöllö huhuilee, huhuu! +poster_2004_desc=irie! +poster_49_name=Large silver star +poster_520_desc=Every colour for everyone +poster_41_name=Habbo Golden Record +poster_45_name=Skeleton +poster_507_name=The French Tricolore +poster_35_name=The Habbo Babes 1 +poster_51_desc=2 points for every basket +poster_2005_name=Infobus +poster_1005_desc=The muscly movie hero +poster_46_name=Small gold star +poster_43_desc=Shake, rattle and roll +poster_23_name=Santa Poster +poster_2007_desc=The legendary founder of the Hotel +poster_505_desc=The Canadian flag +poster_13_name=BW Skyline Poster +poster_57_desc=chinese calligraphy +poster_2006_name=DJ Throne +poster_523_desc=The flag of India +poster_15_desc=Marvellous mountains +poster_39_name=Screaming Furnies +poster_12_desc=a beautiful sunset +poster_40_name=Bonnie Blonde +poster_2001_desc=Former servant of a great wizard! +poster_51_name=Basketball Hoop +poster_514_desc=Be proud to be in the Union! +poster_11_desc=I obey the Habbo way! +poster_1005_name=Johnny Squabble +poster_22_desc=A chilly snowy scene +poster_512_name=The Irish flag +poster_17_name=Butterfly Cabinet 1 +poster_46_desc=Twinkle, twinkle +eco_box_card=Recycled item +recycler_furni_not_recyclable=This Furniture cannot be recycled. Please only use Furniture that has the recyclable tag in your hand. +recycler_prize_odds_2=You have %odds% chance to get one of these. +recycler_info_link=More information about Furni Recycler +recycler_info_open=Drag 5 items to the boxes below and click recycle. Recyclable items display recyclable tag in your inventory. Check out the prizes and the instructions for recycling before you recycle. +recycler_prize_category_1=Common +recycler_prize_odds_3=%odds% chances to get one of these. +recycler_prize_category_4=Phenomenal +recycler_info_link_url=http://%predefined%/help/36 +recycler_prize_odds_4=%odds% chances to get this one. Good luck! +recycler_ready_info=Your recycled Furniture is ready. Please either accept or cancel. If you accept, you will receive your recycling reward, detailed below. If you cancel, all your old Furniture will be restored to your hand. +recycler_prize_odds_1=You can always get one of these if all else fails. +recycler_prize_category_2=Uncommon +recycler_prize_category_3=Arcane +recycler_recycle=Recycle +recycler_info_closed=Recycler is closed at the moment. Please check back later to recycle your Furniture. +recycler_ready_outcome=Recycling reward: %outcome% +recycler_trader_open_alert=Recycling cannot begin while you are trading. Please close the safe trading box before recycling. +eco_box_open=Open +recycler_info_ready=Recycling is complete. You have made a great environmentally friendly decision. All the recycled items you receive have been made from old items which helps to save natural resources and reduce pollution. +recycler_status_window_title=Recycling Status +recycler_prize_category_5=Urban Legend +recycler_info_progress=Recycling is currently in progress. The recycling process takes a total of %recyclinghours% hour. You can leave the catalogue and recycling will continue in the background. +recycler_progress_timeleft=Time left: %hours% h and %minutes% min +recycler_status_info=You have Furniture in recycling. The icon will blink when recycling is complete. +recycler_info_timeout=You have to wait %minutes% minutes and %seconds% seconds before you can recycle again. +recycler_prize_odds_5=Dream on... you have only %odds% chance to get this. +if_topic_help=Help +if_message_number=Message %m% of %n% +if_btn_prev=Previous +if_topic_respect=Respect received! +catalog_info_window=Catalog Info Dialog +if_topic_newbadge=You have got a new badge! +if_title=Habbo Infofeed +if_content_pixels=You have got some Pixels!\rYour total is now: %value% Next set coming up in 15 minutes. +if_content_respect=Somebody must really respect you! %value% respect points received. +if_btn_next=Next +if_topic_pixels=Pixels received! +restart_tutorial=Restart tutorial +url_helpparents=https://classichabbo.com/help/73 +url_privacypledge=https://classichabbo.com/help/69 +url_logout_concurrent=https://classichabbo.com/account/disconnected?reason=concurrentlogin&origin=popup +url_purse_link=https://classichabbo.com/credits? +url_help_4=https://classichabbo.com/help/22 +url_nobalance=https://classichabbo.com/credits? +url_collectables_link=http://classichabbo.comcredits/collectibles +group_logo_url_template=http://www.habbohotel.co.uk/habbo-imaging/badge/%imagerdata%.gif +url_peeloscore=https://classichabbo.com//groups/56555/id +url_help_3=https://classichabbo.com/help/ +url_purse_subscribe=https://classichabbo.com/credits? +url_help_2=https://classichabbo.com/profile?tab=4 +url_helpterms=https://classichabbo.com/help/68 +url_help_6=http://www.habbohotel.co.uk/iot/go?lang=en&country=uk +url_figure_editor=https://classichabbo.com/profile/profile.action +url_logout_timeout=https://classichabbo.com/account/disconnected?reason=logout +url_logged_out=https://classichabbo.com/account/disconnected?reason=logout&origin=popup +url_help_1=https://classichabbo.com/credits +url_purselink=https://classichabbo.com/credits? +url_help_5=https://classichabbo.com/help/75 +url_helppledge=https://classichabbo.com/help/22 +queue_set.e2.info=There are %e2% Habbos in front of you in the queue. +queue_set.e1.alert=This room is currently available only to Habbos participating to the event. +dimmer_use_bg_only=Background only +room_owner=Owner: +Room=Room: +room_ignore=Shutup +item_ad_url_ads_mall_winpet=http://ads.habbogroup.com/max/adclick.php?maxparams=2__bannerid=8303__zoneid=2618__cb=a7f8c3d445__maxdest=http://www.habbo.co.uk/groups/habbomall +queue_set.na.alert=This Room is for Staff only. +queue_line=You are queuing right now... +dimmer_preset_1=Preset 1 +room_badge_choose=Modify Badge: +room_confirmDelete=Confirm +ig_arena_queue_text=There are \x games in queue before your game. +item_ad_url_ads_mall_winmus=http://ads.habbogroup.com/max/adclick.php?maxparams=2__bannerid=8303__zoneid=2618__cb=a7f8c3d445__maxdest=http://www.habbo.co.uk/groups/habbomall +room_badge_window_title=Badge +room_give_rights=Give rights +doorbell_rings=Rings the doorbell - Open the door? +room_open_package=Open The Present +room_ask_friend=Ask to be a Friend +room_info_rated=Room rating: +room_badge_hidden=Hidden +queue_set.c.alert=This room is for Habbo Club members only. In order to enter, you need to subscribe to Habbo Club. +item_ad_url_ads_mall_winchi=http://ads.habbogroup.com/max/adclick.php?maxparams=2__bannerid=8274__zoneid=2607__cb=a7f8c3d445__maxdest=http://www.habbo.co.uk/groups/theideaagency +item_ad_url_ads_mall_winspo=http://ads.habbogroup.com/max/adclick.php?maxparams=2__bannerid=8303__zoneid=2618__cb=a7f8c3d445__maxdest=http://www.habbo.co.uk/groups/habbomall +room_areYouSurePlace=Warning! If you put something down in this room you will not be able to pick it up again. +item_ad_url_ads_mall_winbea=http://ads.habbogroup.com/max/adclick.php?maxparams=2__bannerid=8303__zoneid=2618__cb=a7f8c3d445__maxdest=http://www.habbo.co.uk/groups/habbomall +room_preparing=...Preparing room +room_name=Room: +furni_active_placeholder_name=This furniture is downloading... +room_areYouSure=Are you sure you want to delete this item forever? +room_take_rights=Remove Rights +dimmer_title=Mood Light +dimmer_apply=Apply +queue_current_1=You are in the Habbo Live queue... +dimmer_preset_2=Preset 2 +room_waiting=Waiting to go in... +queue_set.s.info=There are %d% Habbos in front of you in the queue to see the Habbo Live broadcast! +room_cant_set_item=You cannot place this in someone else's room! +queue_change=Change queue +room_banner_text= +item_ad_url_ads_mall_winice=http://ads.habbogroup.com/max/adclick.php?maxparams=2__bannerid=8303__zoneid=2618__cb=a7f8c3d445__maxdest=http://www.habbo.co.uk/groups/habbomall +room_cant_trade=You cannot trade this! +queue_set.queue_reset.alert=The queue for this room has been reset, please try again. +queue_set.dc.info=Number of Habbos in default queue is %d% and in Habbo Club queue %c% +item_ad_url_ads_clwall2=http://ads.habbogroup.com/max/adclick.php?maxparams=2__bannerid=7377__zoneid=2208__cb=a7f8c3d445__maxdest=http://www.idea.me.uk +queue_set.c.info=There are %c% Habbo Club member(s) in front of you. Be patient :) +wallitem_post.it.limit=Only 50 stickies per room are allowed! +queue_set.d.info=There are %d% Habbos in front of you in the queue. +interstitial_ad_text=Advertisement +room_confirmPlace=Are you sure? +wallitem_item_placeholder_name=This furniture is downloading... +delete_furniture=Delete Furniture (permanently) +locked=Locked (visitors have to ring bell) +room_user_page=Home Page +dimmer_preset_3=Preset 3 +queue_current_2=You are in the queue for the room. +room_remove_specs=Sorry! Now it's someone else's turn to watch this event. +wallitem_item_placeholder_desc=This furniture is downloading... +dimmer_turn_on=Turn ON +room_loading=Loading room... +room_kick=Kick +queue_other_2=Room queue status +room_badge_button=Badge +room_max_pet_limit=Too many pets in the room! +win_doorbell=Doorbell +win_place=Note! +queue_set.queue_full.alert=The queue for this room is full. Please try again later. +item_ad_url_ads_clwall1=http://ads.habbogroup.com/max/adclick.php?maxparams=2__bannerid=7376__zoneid=2207__cb=a7f8c3d445__maxdest=http://www.childline.org.uk +item_ad_url_ads_clwall3=http://ads.habbogroup.com/max/adclick.php?maxparams=2__bannerid=7378__zoneid=2209__cb=a7f8c3d445__maxdest=http://www.childline.org.uk +queue_set.e1.info=There are %e1% Habbos in front of you in the queue. +item_ad_url_ads_mall_winfur=http://ads.habbogroup.com/max/adclick.php?maxparams=2__bannerid=8303__zoneid=2618__cb=a7f8c3d445__maxdest=http://www.habbo.co.uk/groups/habbomall +room_info_rate_req=Rate this room +dimmer_turn_off=Turn OFF +room_doorbell=Rings the doorbell - Open the door? +room_hold=Wait a second...\rLoading room... +predefined_room_description=%user_name% has entered the building +predefined_room_name=%user_name%'s room +item_ad_url_ads_puffet_tv=http://www.habbo.fi +ig_arena_queue_title=All game rooms are reserved, please wait a moment. +room_badge_visible=Visible +room_unignore=Listen +queue_set.e2.alert=This room is currently available only to Habbos participating to the event. +furni_active_placeholder_desc=This furniture is downloading... +queue_other_1=Habbo Live queue status +item_ad_url_ads_mall_wincin=http://ads.habbogroup.com/max/adclick.php?maxparams=2__bannerid=8303__zoneid=2618__cb=a7f8c3d445__maxdest=http://www.habbo.co.uk/groups/habbomall +friend_tip_search=Search users +send_invitation_text=Want to meet Guides who can help you getting to know Habbo? +friend_invitation_empty_alert=Write your invitation and click send. +friend_invitation_error=One or more of your friends is unavailable at the moment. Please try again later. +console_now=now: +console_follow_not_friend=The user you tried to follow is not your friend anymore. +buddyremove_hc_more_info=More Info About Habbo Club >> +instant_friend_request_header=Friend Request +buddyremove_not_now=Cancel +friend_request_declined=Declined! +friend_tip_preferences=Edit categories +friend_list_no_friends_online_category=No friends online in this category. +console_mainhelp=Habbo Console Help +console_lastvisit=Last Visit +console_messagemode_helptext=You can send an instant message to your Habbo Friends. +im_instruction=Choose a friend from your online friend list and send an instant message or an invitation. +friend_tip_remove=Remove friend +console_email=Email +friend_invitation_note=Make sure you can be followed. +console_modify=Modify +buddyremove_pleasewait=Please wait a second... +im_notification_moderation=Sharing your password or personal details online is dangerous. The moderators might monitor these conversations for your safety. +console_inprivateroom=In A Guest Room +console_accept=Accept +friend_result_other=Other Habbos (%cnt%) : +send_invitation_header=Meet Habbo guides +console_accept_selected=Accept +friend_invitation_summary=Inviting %count% people to this room. +console_habboprofile_arrowed=Habbo Profile >> +console_searchfor=Search: +console_differentmessagemodes=Different Messages +buddyremove_select_all=Select All Friends +invitation_follow_failed=Sorry, your attempt to follow an invitation failed. +buddyremove_windowheader=Your friends list is full. +friend_tip_follow=Follow to a room +friend_tip_search_field= +nuh_invitation_no=Not now +receive_invitation_text=invites you his/her room. Accept invitation? +console_deselect_all=Deselect all +console_concurrency_error=There was a concurrency error while modifying friend list +console_search_habbo_lasthere=Last time +console_noprofile=Habbo Profile Not Found +friend_request_failed=Failed! +console_myinterests=My interests: +console_profile_helptext=The Habbo Profile is a snapshot of your interests and hobbies - simply tick the things you like. +friend_result_noothersfound=No other Habbos found +friend_list_requests_dismiss_all=Dismiss all +console_report_help=If the message you received was abusive or harassing, you can report it to the Moderators by clicking the Report button below. The Habbo will be removed from your Friends' List automatically when you report. If you want to remove a Habbo from your Friends' List without reporting their message, simply use the Remove button below. +console_select_all=Select all +buddyremove_alphabetical=Alphabetical Order +friend_tip_mail=Send minimail +console_fr_declined_count=Amount to be declined +console_usersnotfound=Habbo Not Found +Message=Message +console_confirm_selected=Confirm the selections. Below are the amount of friend requests that will be accepted and declined. If you want, you can still modify the selections. +buddyremove_pagecounter=Page +im_invitation=Your friend sent you an invitation: +console_follow_prevented=Your friend has prevented others from following him/her. +buddyremove_names_ordered=Names Ordered By: +console_removefriend_2=from your Friends List? +console_youdonthavebuddies=You have no Friends on your list.\rYou can send Friend Requests using\rthe 'search' button. +console_requests=Friend Request(s) +console_approve_selected=Accept selected +console_fr_limit_exceeded_error=Too many friends selected. Please remove some first. +console_noemail=Sorry, +console_getfriendrequest_1=has asked you to become his/her Friend. +friend_list_search_category=Search +console_next_msg=Delete +console_msgs=msgs +console_follow_offline=Your friend is offline. +console_reject_selected=Reject selected +nuh_invitation_yes=Yes +friend_info_lastvisit=Last visit: +buddyremove_header=Choose %amount% friends to remove +NUH_hand=Click the hand icon to open your inventory, You have received a gift! +console_selection_invert=Invert selection +console_friend_request_error=There was an error with friend requests +friend_list_requests_accept_all=Accept all +buddyremove_accept=Remove Friends +console_invalid_message=There was a message from a user that was probably removed your friend list. Note, user is removed from your friend list if you report a message to moderators. +buddyremove_next=Next > +BuddyNotHere=Offline +friend_tip_inbox=My Messages inbox +friend_tip_compose=Write message +console_report_remove=Remove +friend_list_no_friends_offline_category=No friends offline +console_online=online: +buddyremove_confirm=Yeah, it is done... +invitation_expired=Sorry, all Welcoming Party members were busy. +friend_request_massoperation_cancel=Back to request list. +im_error_busy=Your friend is busy. +im_error_receiver_muted=Your friend is muted and cannot reply. +friend_list_no_requests=No friend requests +friend_list_friend_requests_category=Friend Requests +invitation_exists=You have already invited members of the Welcoming Party to your room. +friend_list_confirm_remove_2=Remove user: %username% +console_console=Console +im_notification_offline=Your friend went offline. +NUH_friends=Check out your friend list to see friends and friend requests. +buddyremove_messenger_updating=The console is updating, try again in a minute... Everything else is working fine! +console_target_does_not_accept=This user does not accept friend requests at the moment +friend_list_online_category=Friends +friend_request_accepted=Accepted! +friend_invitation_cannot_send=Invitation cannot be sent. +console_compose=Compose A Message +im_tooltip=Instant messenger +console_reject_all=Reject All +console_getfriendrequest_2=If you accept this invitation (s)he will be added to your Friends List. Then you can send messages to each other. +win_messenger=Habbo Console +buddyremove_lessoptions=Less Options << +nuh_bubble_close=Close +console_offline=Offline +friend_request_accept_all=Accept all requests. +console_request_massoperation_title=You have %messageCount% friend requests waiting. +friend_list_confirm_remove=Remove Friend +friend_request_decline_all=Decline all requests. +console_getmessage_sender=Sender: +console_request_massoperation_instruction=Use the options below to accept or decline ALL friend requests you have waiting. +console_creatingaprofile=Creating A Profile +buddyremove_moreoptions=More Options >> +friend_tip_search_button=Search users +console_unknown_sender=Unknown sender +buddyremove_invert=Invert Selection +buddyremove_hc_info_url=http://www.habbo.co.uk/credits/habboclub +console_friends_helptext=This screen shows a list of all your Habbo Friends. It tells you where they are in the hotel, or, if they're not checked in, when their last visit was. +reply=Reply +console_friends=Friends +im_error_not_friend=Receiver is not your friend anymore. +im_window_title=Chat +messenger=Messenger +friend_invitation_window_title=Invitation +friend_request_options=Advanced options. +frient_tip_mail=(this is not used) +buddyremove_prev=< Previous +console_recipients=Recipient(s) +buddyremove_ok_text=You have chosen enough friends to remove. +console_buddylimit_requester=Friend could not be added. The request sender can not have anymore friends. +BuddyRequesta=Friend Request(s) +im_error_sender_muted=Your message was not sent because you are muted. +nuh_invitation_never=Don't ask me again. +console_mainhelptext=You can use the Habbo Console to keep in constant contact with your friends using instant messages. +friend_tip_im=Instant Message +console_asktobecomeafriend=Ask To Become A Friend +friend_result_nofriendsfound=No friends found +friend_tip_invite=Invite friends +buddyremove_logintime=Last Login Time +BuddyNow=now: +friend_tip_addfriend=Send friend request +im_error_offline=Your friend is not online. +console_friend_request_not_found=There was an error finding the user for the friend request +friend_list_title=Friends +friend_list_search_button=Search +buddyremove_remove_text=You are about to remove %removeamount% friends from your friendlist.\r\r After removal, you'll have %amountleft% friends on your list: +console_request_1=has been sent your Friend Request. +buddyremove_continue=Remove Friend Now +console_onfrontpage=Online +buddyremove_list_full=Your friends list is full, you can't add new friends until you delete some. \r\The maximum number of friends you can have, is %mylimit% Habbos. Members of Habbo Club can have up to %clublimit% friends on their list. +console_search_habbo_profilematch=Habbo Profile match - +friend_tip_search_input=Enter search query +console_credits=Credits +console_follow_friend=Go to same room +friend_result_friends=Friends (%cnt%) : +console_request_2=(S)he will be added into your Friends List if (s)he accepts it. +console_newmessages=New Message(s) +friend_list_confirm_remove_1=Confirm remove +BuddyPrivateRoom=In A Guest Room +console_removefriend_1=Are you sure you want to remove +friend_list_offline_category=Offline Friends +console_profilematch=Habbo Profile match - +console_profile_create=Create your Habbo Profile. +Messages=Message(s) +console_follow_hotelview=Your friend is on the hotel view. +im_notification_online=Your friend came online. +console_report=Report +console_target_friend_list_full=This user's friend list is full +console_fr_accepted_count=Amount to be accepted +BuddyEntry=On Hotel View +friend_info_online=Online +console_report_header=Report Abusive Message +Unreadmessages=New Message(s) +console_select_requests=Following users have asked to be your friend. Please accept or decline. +console_lasttime=Last Time +friend_tip_home=User's home +pet.saying.play.croco.0=*Chases tail* +pet_enrg_0=Tired +pet_race_1_002=Lesser Spotted Longhair +pet.hotwords.jump=jump +pet_race_1_001=Purr-Sian +pet.saying.sleep.cat.4=Meow! +pet_hung_0=Empty +pet.saying.sniff.dog.2=*Grrruff! *Sniffs happily* +pet_enrg_10=Mad +pet.saying.angry.croco.2=*licks foot* +pet_hung_1=Hungry +pet_race_1_004=Soft-Toed Sneaker +pet.saying.sniff.dog.1=Grrruff! *Sniffs happily* +pet.saying.eat.dog.0=Woof! *wags tail excitedly* +pet.saying.sniff.dog.0=Grrruff! *Sniffs happily* +pet.saying.beg.cat.2=Meow! +pet.saying.play.dog.0=*Chases tail* +pet.saying.beg.croco.2=Snap! +pet.saying.play.croco.1=*Snaps happily* +pet.saying.generic.dog.2=*Runs happily up to Habbo* +pet_thirsty=Thirst: +pet_enrg_1=Slow +pet.saying.generic.dog.3=*Jumps on Habbo happily* +pet.saying.sniff.croco.0=*sniffs inquisitively* +pet_race_1_003=Hidden Clause +pet_race_2_001=Krazy Krokodilos +pet.saying.angry.dog.4=*Licks foot apologetically* +pet.saying.angry.dog.3=Woof! Woof! +pet_enrg_8=Lively +pet.saying.play.dog.1=*Fetches ball* +pet_race_1_016=Curiousity - The Return! +pet_enrg_9=Tireless +pet_frnd_10=Adoring +pet.hotwords.bad=bad +pet_race_1_018=Trusting Tabby +pet_hung_4=Satisfied +pet.saying.eat.cat.2=Meow! *Licks food* +pet.saying.eat.cat.1=Meow! *Sniffs food* +pet_race_0_019=Tiny Terrier +pet.saying.angry.croco.3=Snap! *innocent smile* +pet.saying.beg.croco.1=Snap! +pet_race_1_022=Matted Moggy +pet.saying.beg.cat.0=Purrrrrr *walks around legs* +pet_race_1_017=Furry Friend +pet.saying.generic.cat.4=Meow +pet_hung_5=Full +pet.saying.sleep.dog.6=Woof! Zzzzzzz +pet_enrg_7=Energetic +pet_race_0_015=Pixie Poodle +pet.saying.angry.croco.4=Snap! *innocent smile* +pet.saying.play.cat.1=*Chases mouse* +pet.saying.sleep.dog.5=Ruff! Zzzzzzzz *wags tail* +pet_thir_3=Not thirsty +pet.saying.eat.croco.4=*Smiles contently* +pet.saying.eat.cat.0=Meow! *Sniffs food* +pet_age=Age: +pet.hotwords.good=good +pet_race_1_021=Fabulous Feline +pet.hotwords.voice=speak +pet.saying.sleep.dog.3=Ruff! Zzzzzzzz *wags tail* +pet_thir_1=Parched +pet.hotwords.go_away=go away +pet_race_1_019=Bobcat Wailer +pet.saying.sleep.dog.4=Ruff! Zzzzzzzz *wags tail* +pet_race_2_005=Galled Gator +pet_race_0_014=Whiffy Woofy +pet.saying.generic.croco.0=Rrrr....Grrrrrg.... +pet_mood_6=Ecstatic +pet_hung_3=Peckish +pet.saying.eat.croco.3=Snap! *Chomps on food* +pet_race_0_016=Murmurin' Minimastiff +pet.hotwords.nest=sleep +pet_hung_2=Rumbling +pet_race_0_010=Furry McScottie +pet_frnd_9=Loyal +pet_race_2_006=Confused Croc +pet_enrg_2=Sluggish +pet_race_0_011=Lappy Lassie +pet_frnd_8=Loving +pet_race_1_011=Egyptian Angora +pet_race_0_013=Mangy Mutt +pet_race_2_004=Dirty Dundee +pet_enrg_3=Lazy +pet.hotwords.follow_me=heel +pet_race_0_012=Tawny Bleugh +pet.saying.eat.croco.1=Snap! *Swallows food whole* +pet.saying.angry.cat.2=Meow! +pet.saying.sleep.dog.2=Ruff! Zzzzzzzz *wags tail* +pet_thir_0=Gasping +pet.saying.eat.croco.2=Snap! *Swallows food whole* +pet_mood_0=Miserable +pet_enrg_4=Relaxed +pet.saying.sleep.croco.0=Zzzzzz *dreams of wilderbeast* +pet_race_2_007=Pretty Pui Pui +pet.saying.sleep.croco.1=Zzzzzz *dreams of zebra* +pet_race_0_006=Stripy Setter +pet.hotwords.sit=sit +pet.saying.sleep.croco.5=Zzzzzz *dreams of wilderbeast* +pet_race_1_013=Felis Catus Allergicus +pet_frnd_0=Hostile +pet.hotwords.beg=beg +pet.saying.sleep.dog.0=Ruff! Zzzzzzzz *wags tail* +pet_race_2_008=Indifferent +pet_race_1_024=Cat Burglar +pet_frnd_1=Angry +pet_race_1_023=Indoor Alley Cat +pet.saying.sleep.croco.3=Zzzzzz *dreams of springboekt* +pet_race_1_010=Wannabe Wildcat +pet_enrg_5=Rabied +pet.saying.angry.cat.3=Meow +pet.saying.sleep.cat.1=Purrr zzzzz +pet_race_0_007=Slobber Don +pet_race_2_010=Giggly Go-go +pet_race_1_012=Freckled Feral +pet.saying.generic.croco.1=Snap! +pet.saying.sleep.dog.1=Zzzzzz +pet_mood_4=Happy +pet.saying.angry.cat.0=Mew *sad eyes* +pet_race_0_005=Paws Forethought +pet_race_1_009=Scaredy Kat +pet.saying.sniff.croco.2=*Watches for hours until it moves* +pet_mood_3=Contented +pet_thir_2=Thirsty +pet.saying.sniff.croco.1=*Watches for hours until it moves* +pet_frnd_2=Suspicious +pet_race_1_006=Titchy Tiger +pet_hung_6=Stuffed +pet_mood_5=Joyful +pet_race_0_004=Droopy of Pawford +pet.saying.sleep.croco.2=Zzzzzz *dreams of wilderbeast* +pet_race_1_020=Caterwaul Kitty +pet_enrg_11=Nutcase +pet.hotwords.lie=lie down +pet_enrg_6=Active +pet_frnd_4=Calm +pet_race_0_009=Hound of Hull +pet.saying.angry.cat.1=Purrrrrr ... *walks around legs* +pet_frnd_7=Affectionate +pet_frnd_5=Friendly +pet_race_0_008=Springy Spaniel +pet.saying.sniff.cat.0=*sniffs inquisitively* +pet_frnd_6=Warm +pet_race_1_015=Haughty House Pet +pet_race_2_011=Petty Petsuchos +pet.saying.eat.dog.2=Woof! *chews* +pet.saying.eat.dog.1=Woof! *chews* +pet.saying.sleep.croco.6=Zzzzzz *dreams of wilderbeast* +pet_frnd_3=Cool +pet_race_1_014=Bushy Bobtail +pet_race_0_017=Speckled Sheepdog +pet_race_0_023=Dotty Dalmatian +pet.saying.eat.dog.3=Woof! *wags tail excitedly* +pet.saying.beg.croco.0=Snap! +pet.saying.play.cat.0=*Jumps at shadow puppet* +pet.saying.generic.croco.2=*Tail flip* +pet.saying.beg.dog.1=Woof! Woof! +pet.saying.generic.cat.1=Purrrr +pet_race_0_000=Yappy Yorkie +pet.saying.generic.cat.0=Purrrr +pet.saying.eat.croco.0=Snap! *Swallows food whole* +pet.saying.beg.dog.2=Woof! *Sits patiently* +pet.saying.angry.dog.1=Ruff! +pet.hotwords.come_here=come here +pet.saying.generic.cat.3=Meow +pet.saying.generic.dog.1=Woof! Woof! +pet_mood_2=Blue +pet_race_0_001=Habbo Husky +pet_status_dialog=%name% +pet_race_0_018=Bushy Woofer +pet.saying.eat.dog.4=Woof! *wags tail excitedly* +pet.saying.angry.croco.1=Snap! *innocent smile* +pet_nature=Nature: +pet_race_1_007=Burmese Buddy +pet.saying.generic.croco.3=*Walks up to Habbo excitedly* +pet_race_0_024=Black-eyed Boxer +pet.saying.angry.croco.0=Snap! +pet_race_1_008=Mad Mouser +pet.saying.angry.dog.0=*Puppy dog eyes* +pet_race_1_005=Cat Astroflea +pet_hungry=Hunger: +pet_race_0_002=Joe Cocker Spaniel +pet_race_0_003=Rescue Bernard +pet.saying.beg.dog.0=*lifts paws onto Habbos knees* +pet_race_2_000=Endangered Albino +pet_race_0_020=Patchy Pup +pet.saying.beg.cat.1=Purrrrrr *walks around legs* +pet_mood_1=Depressed +pet.saying.generic.cat.2=Purrrr +pet.hotwords.play_dead=play dead +pet_race_2_003=Silly Sobek +pet.saying.sleep.cat.3=Meow! +pet_frnd_11=Devoted +pet.saying.sleep.cat.0=Purrr zzzzz +url_pets=http://%predefined%//hotel/pets +pet.saying.generic.dog.0=Grrrrufff! +pet_race_2_002=Nile Dile +pet_race_0_022=Schnitzel Snatcher +pet.saying.sleep.croco.4=Zzzzzz *dreams of elephant burgers* +pet.saying.sleep.cat.2=Purrr zzzzz +pet_race_1_000=Sleepy Siamese +pet_race_0_021=Loyal Labrador +pet.saying.angry.dog.2=*Whines* +pet_happy=Happiness: +pet_race_2_009=Swampy Siamese +ph_tickets_title=Tickets +ph_exit=Exit In Normal Clothes +paalu_ui4=Stabilise +game_TicTacToe=Tic Tac Toe +ph_tickets_txt=Tickets can be used for BattleBall: Rebound!, SnowStorm, the Lido Diving and Wobble Squabble games. Tickets never expire.\r\rCurrently you have \x1 ticket(s). +tickets_button_info_hide=Hide Ticket Info +ph_tickets_choise1=Buy 2 Tickets for 1 Credit. +paalu_ui3=Moving +ph_ticket=Ticket +notickets_buygame=Buy a game +tickets_info_2=With 20 tickets you can play the following Games:\r10 BattleBall:Rebound!\r10 SnowStorm\r20 Wobble Squabble or\r20 Lido Diving +paalu_ui1=Balance +ph_tickets_buyfor=Buy Tickets for: +notickets_window_header=Tickets needed! +ph_goswimming=Go swimming! +ph_choosecolour=Choose Costume Colour +ph_keys_spacebar=Spacebar +ph_keys_run=Run: +notickets_text_1=Game price is 1 credit. For that you get 2 tickets. +ph_tickets_choise2=Buy 20 Tickets for 6 Credits. +play_preview=Play preview of sounds +tickets_button_info_2=Stuff you can do with these 20 tickets +score_board.text=POINTS +ph_keys_dive=Diving moves: +paalu.winner=Winner: +ph_tickets_have2=Tickets +ph_keys_jump=Jump: +tickets_button_info_1=Stuff you can do with these 2 tickets +ph_tickets_have1=You Have +tickets_info_1=With 2 tickets you can play the following Games:\r10 BattleBall:Rebound!\r10 SnowStorm\r20 Wobble Squabble or\r20 Lido Diving +notickets_store_link=Go to ticket store >>> +paalu_ui5=Balance +notickets_text_2=Buy more tickets now and get a discount. You can also buy tickets as a present. +notickets_header=Buy game tickets to play this game +paalu_ui2=Push +roomatic_intro3="My mates live miles away, but we can meet up in my room every Friday night and we don't have to worry about getting home afterwards." - PinkFruit +roommatic_hc_members_only=This Room Is For HC Members Only +roomatic_wrongpw=Oops! Sorry, your passwords don't match. Please enter them again. +roomatic_givename=Give your room a name! +roomatic_hway=Hotel guests are expected to follow the Habbo Way even if word filtering is switched off. +roomatic_namedisplayed=Do you want your name to be displayed with the room? +roomatic_roomnumber=Room number: +roomatic_nomatch=Sorry. Your passwords don't match. Please enter them again. +roomatic_canmodifysettings=(You can change these settings later) +roomatic_letmove=Let other people move your furniture and place their own. (Furniture cannot be stolen.) +roomatic_locked=Door locked - visitors have to ring doorbell +roomatic_givepwd=Password: +roomatic_owner=Owner: +roomatic_open=Door open +roomatic_roomdescription=Room description: +roomatic_goyourroom=Go to your room +roomatic_bobbafilter=Bobba filter (filters out bad language) +roommatic_modify_size=Room size: %tileCount% tiles +more_roomlayouts=Extra room layouts for Habbo Club members >> +roomatic_intro2=Here's what one Habbo says about her room: +roomatic_chooselayout=Choose the layout of your room +roomatic_congrats=Congratulations! You're now the proud owner of your own Habbo Hotel room. +roomatic_name=Room name: +roomatic_onemoment=Please wait, we are going to your room... +roomatic_security=Security +roomatic_confirm=Confirm password: +roomatic_roomname=Room name: +roomatic_pws2=24 hour access: +roomatic_roomdesc=Room description: +roomatic_namedisp=Do you want your name to be displayed with the room? +roomatic_intro1=You can decorate and furnish your room however you like and no one can tell you to tidy up or turn the music down. It's up to you if you let everyone in or just a chosen few, or lock the door and chill by yourself. Get creating and in a couple of minutes you'll have your own Habbo Hotel space. +roomatic_createyrown=Create Your Own Room +roomatic_choosecategory= +roomatic_create_error=Error in room creation process. Please try again! +roomatic_pws=Password for selected +sound_machine_jukebox_window=Jukebox +sound_machine_alert_jukebox_list_full=The play list is full. Please wait until the current song has finished playing and try again. +sound_machine_song_name=Untitled Trax +sound_machine_alert_song_saved=Song "%name%" successfully saved. +sound_machine_playlist_window=Traxmachine Playlist Editor +sound_machine_your_songs=Traxmachine Songs +jukebox_empty=Empty +sound_machine_alert_missing_packages=You need the following Traxpacks to edit this song: +sound_machine_alert_invalid_song_name=You have already burned another song with the same name. Please change the song name before trying again. +sound_machine_song_save=Save song +jukebox_now_playing=Now playing: +jukebox_song_name="%name%" +sound_machine_confirm_close=Close the editor? +sound_machine_confirm_close_long=Are you sure you want to leave the editor without saving the song? +jukebox_song_remaining=Remaining time: %time% +jukebox_disk_add=Add Disc +sound_machine_jukebox_disk_window=Insert disc +sound_machine_alert_song_not_ready=Can't save song! Song not ready yet. +sound_machine_alert_no_sound_sets=You don't have any sound sets available for song editing. \rNote that the sets need to be in your inventory (hand). +sound_machine_confirm_delete=Delete song? +sound_machine_confirm_clear=Clear the song? +jukebox_next_up=Next up: +sound_machine_turn_on=Switch On +sound_machine_window=Sound Machine Editor +sound_machine_alert_playlist_full=Could not save playlist! Playlists can have only %count% songs. +room_sound_furni_limit=You can only place one sound furni per room +sound_machine_song_info=Song Info +sound_machine_save_window=Save your Trax +sound_machine_alert_machine_full=You already have 4 Traxpacks loaded. Eject one before adding a new Traxpack. +sound_machine_song_remove=Remove song +sound_machine_insert=Add to mixer +sound_machine_confirm_save_list=Save playlist? +sound_machine_eject=Eject +sound_machine_alert_no_disks=You don't have any more discs! +sound_machine_trax_name=Trax name: +sound_machine_confirm_delete_long=Are you sure you want to delete the selected song? +sound_machine_alert_song_locked=The song you're editing can't be modified. Please save the song under another name to create a new copy. +sound_machine_playlist=Playlist +sound_machine_confirm_burn=Burn this song? +sound_machine_confirm_save_list_long=Are you sure you want to overwrite the current playlist? +sound_machine_alert_no_more_songs=Can't create new song! Traxmachine can have only %count% songs. +sound_machine_confirm_save_long=Are you sure you want to overwrite the current saved song? +sound_machine_confirm_clear_long=Are you sure you want to clear the current song? +sound_machine_time_1=%min%:%sec%min +sound_machine_time_2=%min%:%sec%min +sound_machine_turn_off=Switch Off +sound_machine_confirm_close_list_long=Are you sure you want to exit playlist editor without saving? +jukebox_song_length=Song length: %time% +sound_machine_confirm_eject=Remove cartridge? +jukebox_load_trax=Load Trax +sound_machine_confirm_burn_long=Are you sure you want to burn this song to disc? Burning costs one credit. +sound_machine_confirm_eject_long=Are you sure you want to remove the Traxpack and it's samples from the song? +song_disk_text_template="%name%" by %author% Burned %day%.%month%.%year% +jukebox_reset=Reset Jukebox +sound_machine_confirm_window=Sound Machine +sound_machine_burn=Burn Song +sound_machine_new=Create a New Song +sound_machine_confirm_close_list=Close playlist editor? +sound_machine_alert_invalid_song_length=Can't burn an empty song! +sound_machine_confirm_save=Save the song? +sound_machine_list_save=Save Playlist +sound_machine_open_editor=Trax Editor +jukebox_song_author=by: %author% +sound_machine_alert_song_name_missing=Please give your song a name. +sound_machine_edit=Edit Song +song_disk_trade_info="%name%" by %author% +group_member=Member +interface_icon_help=Help, need help? +interface_icon_hand=Hand, your inventory +int_newrequests=Friend Request(s) +int_newmessages=New Message(s) +group_logo_url_template=http://images.classichabbo.com/habbo-imaging/badge/%imagerdata%.gif +int_update_id=Update My Habbo ID >> +performer_start=Start performance +spectator_count=spectators %cnt%/%max% +group_homepage=Groups' Homepage >>> +int_howtoget=How To get? +judge_voted_no=You voted NO. +interface_icon_navigator=Navigator, navigate around +performer_info=Select a background music for your performance. +interface_icon_catalog=Catalogue, furnishing your room +group_owner=Owner +interface_icon_messenger=Messenger, friends & messages on here +openhrs_title=We are closing the hotel +opening_hours_title=Hotel Maintenance +group_homepage_url=http://%predefined%/groups/%groupid%/id +interface_icon_sound=Sound Off/On +opening_hours_text_disabled=The Hotel is shutting down really soon. To avoid confusion, purchasing of furniture, Habbo Club and game tickets have been disabled, as well as playing games and furniture trading. Try again tomorrow when the hotel is open! +int_credits=Credits +performer_song_selector=Select music +judge_waiting_performer=Wait for the next performance to begin. +interface_icon_ig=Controller, join free games +judge_voting_info=Your vote gets locked after you have given it. +judge_voted_yes=You voted YES. +interface_icon_purse=Purse, manage your coins +interface_icon_tv_close=Leave the Room and close the Habbovision mode. +group_privileges=Priviliges: +opening_hours_text_closed=The Hotel has been closed and will be open to the public again at %h%:%m%. +opening_hours_text_opening_time=The Hotel will open again at %h%:%m%. We look forward to welcoming you back! +judge_tool_title=Rate performance +tooltip_external_link=Link opened to web page +group_room_link=Group's room: %room_name% >>> +habbo_tv_title=Widescreen Habbovision +interface_icon_game_rules=Read game rules +group_admin=Administrator +group_window_title=Habbo Groups +opening_hours_text_shutdown=The Hotel will shut down in %d% minutes. To avoid confusion, purchasing of furniture, Habbo Club and game tickets will be disabled during that time, as well as playing Games and furniture trading. Thank you for visiting and welcome back tomorrow! +performer_no_song=No music +ig_info_can_start=Ready to start! +ig_title_powerups=Power-ups in game +game_chess_black=Black: +game_BattleShip=Battleships +ig_info_game_start_in_x=Game will start in \x +bb_buyTicketsButton=Buy tickets +gs_error_8=To start a Game, there must be at least two Teams of one player each! +gs_3teams=3 Teams Game +ig_rules_ss_2=2. Shift-click a tile to throw a snowball to that direction. +game_chess_start=Start Over +gs_specnum=Number of spectators: \x +gs_error_5=Tournament is only available for users living in the UK. +ig_rules_bb_1=1. Turn tiles to your team color by bouncing on them. Multiple bounces on the same tile locks it. +game_bs_toast=Toast! +gs_choose_gamefield=Choose Game Arena: +gs_error_4=You have reached your maximum number of daily Games! +ig_link_show_high_scores=Show high scores +gs_error_6=You have been removed from the Game! +gs_error_join_7=You have already joined this Game! +ig_button_start_new_cancel=Cancel +gs_button_expand=Expand Window +game_battles_turn=TURN +bb_link_tournament_highScores_url=http://%predefined%//groups/56552/id +ig_button_change_team=Change team +ig_button_prejoin_yes=Yes +ig_rules_ss_1=1. Click a player to throw her with a snowball. +ig_link_hide_high_scores=Hide high scores +gs_state_created=Waiting for players.. +ig_title_starting_games=STARTING GAMES +bb_powerup_7=Bomb +ig_rules_bb_2=2. Create a closed shape out of locked tiles to claim the whole shape for your team. +gs_timeleft=Time Left \x +bb_powerup_8=Vacuum cleaner +game_bs_ship4=Destroyer(s) +ig_button_join_this_game=Join game +game_poker_logoff=Left the game +gs_text_spectate=You can watch this game +game_bs_turn1=Your Turn +ig_title_rules2_ss=Scoring +bb_link_highScores_url=http://%predefined%//groups/56552/id +ig_button_start_game_now=Start game +game_newgame=New game +gs_lounge_skill=Level in this Lounge: \x \r (\y-\z points) +ig_tip_xp_today=Today +ig_link_start_new_game=New game +ig_join_team=Join team +ig_controls_ss_1=Strike an opponent: 1 point +ig_button_gamedetail_back=Back +ig_controls_bb_4=Get major points by creating a closed shape out of locked tiles. +bb_header_powerups=Powerups in game: +ig_game_drt_2=2 min +game_poker_changed=changed +gs_error_watch_0=All The Spectator Seats Are Taken! +gs_5min=5min +gs_lounge_skill_no_max=Infinite +ig_popup_recommended_games=Recommended games +ig_tab_highscores=High scores +sw_fieldname_7=Skull Falls Assault +object_displayer_xp=Monthly XP: \xp +gs_button_ready=Ready +ig_xp_total=Total XP +gs_lounge_skill_no_min=No minimum +game_bs_ship3=Cruiser(s) +ig_info_choose_a_level=Choose a level +game_bs_ship2=Battle Ship(s) +game_waitop=WAITING FOR THE OPPONENT +ig_controls_bb_3=Stealing opponents tiles is worth more than bouncing on free tiles. +gs_link_highscores=High Scores +ig_title_loading=Loading... +gs_button_rejoin=Play again! +ig_title_hscore_team=TEAM +sw_fieldname_6=Riverbank Siege +game_poker_waiting=Change done.\rWaiting for the other players +ig_highscore_rank1=1. +gs_button_cancel=Cancel +ig_button_leave_this_game=Leave game +game_placeship=Place your ships: +ig_controls_ss_2=Opponent falls down: 5 points +ig_button_leave_game=Leave game +ig_popup_gamelist_link=All starting games +ig_ag_flag_teamhigh_title=New team high score! +ig_highscore_rank2=2. +bb_powerup_desc_8=By using a vacuum cleaner, you can clear any tile in the field. +bb_powerup_desc_7=A bomb will clear all tiles around it. +gs_button_spectate=Watch Game! +ig_teamname_2=Blue team +ig_bubble_ag_winner_1=Red team wins! +gs_button_go_finished=Scores +ig_rules_ss_4=4. Make new snowballs by clicking the glove icon in bottom bar. +game_bs_won=WON! +gs_title_finalscores=Final Standings: +gs_score_tie=The game ended in a tie! +ig_title_rules1_bb=Rules +gs_error_start_9=Team sizes can only differ by one player. This Game cannot start! +gs_mouseover_player=\x\r\yp +gs_choose_numteams=Choose number of Teams: +ig_title_duration=Game duration +ig_tooltip_game_availability_0=PUBLIC GAME is shown in the game list and can be joined by everyone. +game_bs_hit=A Hit!: +ig_tooltip_game_availability_1=PRIVATE GAME can only be joined from the room you are in. +ig_rules_ss_3=3. Hold mouse button down longer while pressing shift to throw longer and higher arcs. +gs_state_finished=This Game is already over! +gs_title_countdown=Game Is About To Begin +bb_fieldname_1=Sky Peak +ig_info_prejoin=Join this free game? +ig_play_again_yes=Yes +game_bs_ship1=An aircraft carrier +sw_title=Snow Storm +gs_joinedplayers=Players Who Joined: \x +ig_button_start_new_ready=Ready +ig_title_rules2_bb=Scoring +gs_error_game_checkname=Please check the Game's name! +ig_teamhigh_teamscore=TEAM SCORE +ig_link_leave_game=Leave this game +ig_bubble_ag_winner_2=Blue team wins! +ig_bubble_ag_winner_3=Green team wins! +gs_error_create_0=This Lobby is full, please create a Game in another Lobby! +ig_title_choose_duration=Choose game duration +ig_error_kicked=You have been kicked from the game! +ig_teamname_4=Yellow team +gs_button_buytickets=Buy Tickets +bb_fieldname_4=Gothic Hallway +bb_link_highscores=Highscores +gs_button_start=Start Game! +game_poker_change=Choose cards to change +gs_deathmatch=Every Habbo for himself! +ig_tip_time_to_join_x=Time to join \x +gs_choose_gametime=Choose Game duration: +bb_fieldname_2=Coral Beach +ig_highscore_rank4=4. +ig_title_team_highscores=Team high scores +bb_powerup_desc_2=Bouncing on a spring locks tiles in a single jump. +ig_teamname_3=Green team +sw_user_skill=Snow Storm Skill Level: \x \r (\y points) +game_bs_miss=Miss: +ig_player_needed=-Player needed- +ig_button_owngame_back=Back +sw_link_gameRules_url=http://%predefined%//groups/56553/id +ig_highscore_rank3=3. +bb_user_skill=Skill Level: \x\rScore: \y +bb_choose_powerups=Powerup select +game_poker_ok=Change cards +ig_ag_flag_user_left=Player left! +ig_teamname_1=Red team +gs_title_nextround=Next game... +gs_choose_gamename=Enter A Name For Your Game: +ig_bubble_ag_userleft=\x left the game! +ig_controls_bb_2=Multiple jumps on same tile are worth more points. +ig_link_hide_game_rules=Hide game rules +ig_button_join_another_game=Join another game +bb_title_bouncingBall=Battle Ball +bb_powerup_desc_6=Harlequin effect makes everybody colour tiles for your team! +gs_error_join_0=The team you selected is already full. +bb_fieldname_3=Maze Park +game_chess=Chess +ig_controls_bb_1=Get score by bouncing on tiles. +gs_button_leavegame=Leave Game +gs_4teams=4 Team Game +bb_fieldname_5=Barebones Classic +gs_2min=2min +ig_tooltip_gametype_0=Join this SnowStorm game +bb_title_BBscores2=Game over! +ig_title_play_again=Play again? +bb_powerup_desc_4=A shot with a cannon locks tiles on a straight line. +gs_timetojoin=\x seconds to join +gs_skill_changed=You have advanced to the next skill level. Your level is now %1! +ig_tooltip_gametype_1=Join this Battle Ball game +bb_powerup_desc_3=Flashlight colours a straight line ahead of you. +gs_button_shrink=Minimize Window +number_2=2 +ig_bubble_ag_userrejoined=\x rejoined the game! +ig_tip_xp_value=\xp XP +gs_button_go_started=Watch +ig_tip_xp_month=This month +bb_title_gameCreation=Aloita uusi peli! +bb_powerup_desc_5=Bouncing on a box of pins will burst your Battle Ball! +ig_title_choose_powerups=Choose power-ups +ig_info_get_ready=GET READY! +ig_info_join_a_game=Join a free game +ig_button_create_game=Ready +ig_title_available_levels=AVAILABLE LEVELS +bb_info_gamePrice=Play now for just 2 tickets. +gs_link_gamerules=Game Rules +ig_ag_flag_high_title=New high score! +game_chooseside=Choose your side +gs_title_gamecreation=Game creation +ig_info_no_games=There are no starting games at the moment. But you can easily start a new game yourself! +bb_link_gameRules_url=http://%predefined%//groups/56552/id +bb_powerup_3=Flashlight +number_4=4 +ig_title_highscores=High scores +ig_highscore_rank5=5. +gs_header_page=Page +ig_game_drt_5=5 min +gs_scores_team_4=Green Team: +bb_header_teams=Teams +sw_link_tournament_highScores_url=http://%predefined%//groups/56553/id +sw_fieldname_5=Polar Labyrinth +bb_powerup_4=Cannon +number_3=3 +gs_button_creategame=Create A New Game +ig_text_time_to_join=Time to join +gs_error_join_3=You either have too much or too little skill to join. +bb_powerup_6=Harlequin +bb_text_hostInfo=Please choose a name for your Game and select the number of Teams. +ig_rules_bb_3=3. Use power-ups by clicking the icon in the bottom bar or by pressing arrow down key. +sw_fieldname_2=Algid River +ig_game_drt 5= +game_chess_email=Receive game via email +gs_scores_team_2=Blue Team: +ig_info_waiting_for_players=Waiting for players +game_poker_ready=READY +gs_2teams=2 Teams Game +game_bs_turn2=The Enemy's Turn +gs_scores_team_1=Red Team: +gs_3min=3min +gs_header_teams=Teams +sw_fieldname_4=Frosty Forest +bb_header_gameinfo=Game info +ig_play_again_no=No +ig_game_drt_3=3 min +bb_link_join=Join Team +game_poker=POKER +ig_button_prejoin_no=No +bb_powerup_desc_0=No power-ups selected for this game +ig_title_team_amount=Number of teams +bb_title_finalScores=Final standings: +ig_title_rules1_ss=Controls +bb_powerup_5=Box of pins +game_bs_congrat=Congratulations! +bb_powerup_2=Spring +gs_error_nocredits=You need Habbo Credits to play a Game! +gs_button_go_created=Join +ig_timetojoin=Time to join +bb_powerup_desc_1=Light bulb colours an area around it. +bb_powerup_1=Light bulb +sw_timeleft=Time: +gs_skill_changed_header=Congratulations! +ig_tooltip_game_joined=You are in this game +ig_ag_flag_xp_title=+ \xp XP +ig_link_show_game_rules=Show game rules +sw_gameprice=Play now for just 2 tickets! +sw_link_highScores_url=http://%predefined%//groups/56553/id +gs_error_create_3=Your skill level isn't high enough for creating Games in this Lobby. +ig_title_invitation_only=Private game +gs_state_started=This Game has already started... +bb_link_gamerules=Spelregels +sw_fieldname_3=Glacial Fort +ig_tip_xp_alltime=All time +gs_idlewarning=You will be replaced if you don't start or join a Game soon! +gs_error_game_deleted=The Game has been deleted. +chat.respect.bubble.message=%username% was respected +ig_title_open_for_everyone=Public game +ig_button_cancel=Cancel +gs_error_2=You don't have enough Tickets! +game_chess_white=White: +ig_title_hscore_players=PLAYERS +gs_error_1=You have entered invalid data! +ig_bubble_ag_winner_4=Yellow team wins! +gs_title_bestplayer=Best player: +gs_error_10=The hotel is closed or about to close. We look forward to welcoming you back tomorrow at (ADD LOCAL OPENING TIME). +sw_fieldname_1=Arctic Island +gs_scores_team_3=Yellow Team: +gs_header_gamelist=Game List +handitem1=Tea +handitem28=Sake +handitem4=Ice-cream +handitem23=Beetroot Habbo Soda +handitem29=Tomato juice +handitem34=Kipperific! Yum Yum. +handitem15=Iced +handitem35=pink champagne! +handitem26=Calippo +handitem14=Filter +handitem13=Espresso +handitem9=Decaff +handitem30=Radioactive liquid +handitem19=Habbo Cola +handitem16=Cappuccino +handitem11=Mocha +handitem25=Love potion +handitem2=Juice +handitem8=Regular +handitem3=Carrot +handitem10=Latte +handitem24=Bubble juice from 1999 +handitem21=Hamburger +handitem7=Water +handitem20=Camera +handitem31=Pink Champagne +handitem27=Tea +handitem22=Lime Habbo Soda +handitem18=Tap +handitem5=Milk +handitem17=Java +handitem6=Blackcurrant +handitem12=Macchiato +handitem36=Pear +handitem37=Yummy peach +handitem38=Orange +handitem39=Pineapple +handitem43=Chilled Soda +handitem44=Test Tube +handitem45=Excited Moodi +handitem46=Happy Moodi +handitem47=Angry Moodi +handitem50=Bubble Juice Bottle +badge_desc_UK070=For winning an officially hosted game! +badge_name_UK070=Golden Duck +badge_name_DEV=Codebreaker +badge_desc_DEV= For guessing the room password +badge_name_DEX=Codebreaker Pro +badge_desc_DEX=For guessing the room password 2x +badge_name_DEW=Codebreaker Champion +badge_desc_DEW=For guessing the room password 3x +badge_name_HO1=Room of the Week +badge_desc_HO1=Winner of the Room of the Week competition +badge_name_DET=Room of the Week +badge_desc_DET=2nd place of the Room of the Week competition +badge_name_DEU=Room of the Week +badge_desc_DEU=3nd place of the Room of the Week competition +badge_name_FR019=Pro Gamer +badge_desc_FR019=I won an officially hosted game! +badge_name_DE039=Home Of The Week +badge_desc_DE039=I know how to design an amazing Habbo Home! +badge_name_PX01=StrayPixels Honorable Mention +badge_desc_PX01=I won honorable mention and all I got was this... badge. +badge_name_PX02=StrayPixels Gold +badge_desc_PX02=I won, I actually won ...once +badge_name_PX03=StrayPixels Jade +badge_desc_PX03=Three wins! I own your pixel soul. +badge_name_PX04=StrayPixels Diamond +badge_desc_PX04=brought to you by the number 5. Which is also how many wins I have. +badge_name_PX05=StrayPixels Circuit +badge_desc_PX05=On my seventh win the heavens opened up and this magical badge floated down. +badge_name_PX06=StrayPixels Full Pixel +badge_desc_PX06=I am the most epic winner of all time. ALL TIME! +badge_name_PX07=StrayPixels Hair Cube +badge_desc_PX07=I submitted a hair design for a StrayPixels theme! +badge_name_PX00=StrayPixels Theme +badge_desc_PX00=I sent in a theme for StrayPixels and they actually used it. Suckers. +badge_name_MRG00=Opening Day +badge_desc_MRG00=I joined this hotel on opening day. +badge_name_XM19=Xmas Tree +badge_desc_XM19=Awarded to everyone who visited Habbo during December 2019. Happy Christmas! +badge_name_Z64=Back So Soon +badge_desc_Z64=I survived the Great Wipe of 2019 +badge_name_GA1=Golden Gamer +badge_desc_GA1=You're looking at a hardcore gamer, baby! +badge_name_XM3=Rasta Santa +badge_desc_XM3=Rasta Santa was awarded during Christmas 2005. He visited the hotel again in December 2006. +badge_name_XMB=Mr. Frosty +badge_desc_XMB=Christmas 2019 Penguin Games. +badge_name_MRG01=Habbo Canada +badge_desc_MRG01=Remembering my Habbo roots! +badge_name_MRG02=Habbo USA +badge_desc_MRG02=Remembering my Habbo roots! +badge_name_MRG03=Habbo UK +badge_desc_MRG03=Remembering my Habbo roots! +badge_name_MRG04=Habbo Australia +badge_desc_MRG04=Remembering my Habbo roots! +badge_name_MRG05=Habbo SG +badge_desc_MRG05=Remembering my Habbo roots! +badge_name_BR5=Habbo Portugal +badge_desc_BR5=Remembering my Habbo roots! +badge_name_NL035=Habbo NL +badge_desc_NL035=Remembering my Habbo roots! +badge_name_ES005=Argentina +badge_desc_ES005=Remembering my Habbo roots! +badge_name_ES006=Bolivia +badge_desc_ES006=Remembering my Habbo roots! +badge_name_ES007=Chile +badge_desc_ES007=Remembering my Habbo roots! +badge_name_ES008=Colombia +badge_desc_ES008=Remembering my Habbo roots! +badge_name_ES009=Costa Rica +badge_desc_ES009=Remembering my Habbo roots! +badge_name_ES010=Equador +badge_desc_ES010=Remembering my Habbo roots! +badge_name_ES011=El Salvador +badge_desc_ES011=Remembering my Habbo roots! +badge_name_ES012=España +badge_desc_ES012=Remembering my Habbo roots! +badge_name_ES013=Honduras +badge_desc_ES013=Remembering my Habbo roots! +badge_name_ES014=México +badge_desc_ES014=Remembering my Habbo roots! +badge_name_ES015=Nicaragua +badge_desc_ES015=Remembering my Habbo roots! +badge_name_ES016=Panama +badge_desc_ES016=Remembering my Habbo roots! +badge_name_ES017=Paraguay +badge_desc_ES017=Remembering my Habbo roots! +badge_name_ES018=Peru +badge_desc_ES018=Remembering my Habbo roots! +badge_name_ES019=Uruguay +badge_desc_ES019=Remembering my Habbo roots! +badge_name_ES020=Venezuela +badge_desc_ES020=Remembering my Habbo roots! +badge_name_DE4=Österreich +badge_desc_DE4=Remembering my Habbo roots! +badge_name_DE5=Deutschland +badge_desc_DE5=Remembering my Habbo roots! +badge_name_BR003=Brazil +badge_desc_BR003=Remembering my Habbo roots! +badge_name_CH010=Help Desk +badge_desc_CH010=I'm helping at the official Help Desk! +badge_name_STOUT=Stout +badge_desc_STOUT=omg hou op x +badge_name_BE=Belgium +badge_desc_BE=Remembering my Habbo roots! +badge_name_DK=Denmark +badge_desc_DK=Remembering my Habbo roots! +badge_name_FI=Finland +badge_desc_FI=Remembering my Habbo roots! +badge_name_NO=Norway +badge_desc_NO=Remembering my Habbo roots! +badge_name_RU=Russia +badge_desc_RU=Remembering my Habbo roots! +badge_name_SE=Sweden +badge_desc_SE=Remembering my Habbo roots! +badge_name_WAA00=Waasa Fan! +badge_desc_WAA00=For celebrating the release of Waasa +badge_name_COC02=Coco Coordinator +badge_desc_COC02=Thanks for sending us your resort activity! +badge_name_COC04=Coco-Maniac +badge_desc_COC04=Having a hoot at the Coco Resort! +badge_name_COC03=Coco-Nut Inspector +badge_desc_COC03=For celebrating the release of Coco +badge_name_FRH=Habbo Fashion Week +badge_desc_FRH=For being a part of the Habbo Fashion Week. February 2020. +badge_name_UK071=Habbo Raceway +badge_desc_UK071=Dino Cup Winner. February 2020. +badge_name_Z01=Habbo Model +badge_desc_Z01=Habbo Fashion Week 2020 competition winner. +badge_name_VA014=Blingtastic! +badge_desc_VA014=For celebrating the release of Bling +badge_name_VA012=Bling Master +badge_desc_VA012=Habbo Bling 2020 room competition winner. +badge_name_VA013=Bling Week +badge_desc_VA013=For being a part of the Habbo Bling week. February/March 2020. +badge_name_UK176=ChildLine Group +badge_desc_UK176=I am a member of the ChildLine group +badge_name_UK111=ChildLine Anti-Bullying Badge +badge_desc_UK111=Take action together against bullying! +badge_name_UK175=ChildLine Self-harm Awarness +badge_desc_UK175=I correctly answered the ChildLine Self-harm Awareness Quiz! +badge_name_NEC=Trax Master +badge_desc_NEC=For winning the Trax DJ Party Competition +badge_name_NEJ=Good Party Host +badge_desc_NEJ=For participating in the Trax DJ Party Competition +badge_name_LC7=Little Crab +badge_desc_LC7=For participating in the Aquarium Room Competition +badge_name_LC8=Golden Crab +badge_desc_LC8=For winning the Aquarium Room Competition +badge_name_DS6=Galaxy Maze +badge_desc_DS6=I completed the Habbo Galaxies Maze! +badge_name_ES68H=#StayInHabbo +badge_desc_ES68H=We're all in this together, and we, as a community, stand together. +badge_name_WH8=HABBOTICS Pharm. +badge_desc_WH8=You received the cure to the virus 2020 +badge_name_UK1=Infobus Session April +badge_desc_UK1=For entering our Infobus Session in April 2020. +badge_name_S10=Golden Medal +badge_desc_S10=Given to Habbos who won one of the events or tournaments during #StayInHabbo 2020. +badge_name_MAL03=Habbo Mall (3/3) +badge_desc_MAL03=Secret Mall Achievement +badge_name_MAL02=Habbo Mall (2/3) +badge_desc_MAL02=I found the Malls Hidden Room +badge_name_MAL01=Habbo Mall (1/3) +badge_desc_MAL01=I discovered the Habbo Mall +badge_name_HM1=Mall Builder +badge_desc_HM1=Built a room for the Habbo Mall +badge_name_HBX1=Habbox.CO Re-Launch +badge_desc_HBX1=I joined Habbox for their Re-Launch! +badge_name_UK824=HONK! +badge_desc_UK824=I won the Duck in Deal or No Deal! +badge_name_HBX2=Takeshi's Castle +badge_desc_HBX2=I won a round of Takeshi's Castle! +badge_name_PT737=Infobus Session April +badge_desc_PT737=For entering our Infobus Session in April 2020. +badge_name_FAN2=Fansite Values Staff +badge_desc_FAN2=I contribute to the Rare Values on a Habbo Fansite! +badge_name_FAN3=Fansite Event Staff +badge_desc_FAN3=I plan and host events for a Habbo Fansite! +badge_name_FAN4=Ex-Fansite Staff +badge_desc_FAN4=I was a Staff Member at a Habbo Fansite! +badge_name_SIM1=Yellow Team Winner +badge_desc_SIM1=I won an Official Sims Game! +badge_name_SIM2=Red Team Winner +badge_desc_SIM2=I won an Official Sims Game! +badge_name_SIM3=Green Team Winner +badge_desc_SIM3=I won an Official Sims Game! +badge_name_SIM4=Blue Team Winner +badge_desc_SIM4=I won an Official Sims Game! +badge_name_IT482=Bingo! (1/4) +badge_desc_IT482=I've won 1 game of Bingo! +badge_name_IT483=Bingo! (2/4) +badge_desc_IT483=I've won 2 games of Bingo! +badge_name_IT484=Bingo! (3/4) +badge_desc_IT484=I've won 3 games of Bingo! +badge_name_IT485=Bingo! (4/4) +badge_desc_IT485=I've won 4 games of Bingo! +badge_name_EGG20=Easter Egg Hunt 2020 +badge_desc_EGG20=Completed the Easter Egg Hunt! +badge_name_EGG22=Easter 2020 +badge_desc_EGG22=Happy Easter! +badge_name_EGG24=Easter Bunny Returns! +badge_desc_EGG24=The Easter Bunny has returned, and he brings gifts! +badge_name_EGG25=You!, Easter Eggs! +badge_desc_EGG25=I found the Bunny's Easter Eggs in a Users Room! +badge_name_EGG26=Farewell, Mr. Bunny +badge_desc_EGG26=I said goodbye to the Easter Bunny, April 2020. +badge_name_EST04=Easter Codebreaker +badge_desc_EST04=I guessed the Secret Easter Codeword! +badge_name_DE511=LGBT+ Pride +badge_desc_DE511=Celebrating equality, love, understanding and tolerance in the LGBT+ Lounge. +badge_name_TAKE1=Takeshi's Castle (1/3) +badge_desc_TAKE1=I won a round of Takeshi's Castle. +badge_name_TAKE5=Takeshi's Castle (2/3) +badge_desc_TAKE5=I won 5 games of Takeshi's Castle. +badge_name_TAKE10=Takeshi's Castle (3/3) +badge_desc_TAKE10=I won 10 games of Takeshi's Castle. +badge_name_SWISS=Switzerland +badge_desc_SWISS=Remembering my Habbo roots! +badge_name_NL249=Penguin Rescue +badge_desc_NL249=I joined Habbo during Earth Day 2020 +badge_name_DOND1=Deal or No Deal! +badge_desc_DOND1=I won the Grand Prize in Deal or No Deal! +badge_name_MAYY4=4/5 +badge_desc_MAYY4=May the Fourth be with You! +badge_name_BR075=Q&A #1 +badge_desc_BR075=Attended a Staff Q&A Session +badge_name_ES467=Earth Week Infobus +badge_desc_ES467=Joined Habbo Staff for Special Infobus session +badge_name_ES819=Earth Week Quiz +badge_desc_ES819=Completed the Earth Week Quiz! +badge_name_FFBAN=Falling Furni Winner +badge_desc_FFBAN=I won a game of Falling Furni! +badge_name_DRA6=Don't Roll a 6 +badge_desc_DRA6=I won a game of Don't Roll a 6! +badge_name_NT081=BB #EventsWeek +badge_desc_NT081=I won a Game of Battle Ball during #EventsWeek +badge_name_IT480=Bank Game +badge_desc_IT480=I won an Official Bank Game! +badge_name_ITC54=LGBT+ Infobus +badge_desc_ITC54=I attended the LGBT+ Infobus session! +badge_name_US081=Babybus +badge_desc_US081=Contributed to an Infobus debating session! +badge_name_100O=100 Peak +badge_desc_100O=I helped get 100 Users Online! +badge_name_CLUBS=Oops! +badge_desc_CLUBS=In memory of the Habbo Club Massacre. May 2020. +badge_name_ALP23=Lockdown 2020 +badge_desc_ALP23=What a bummer... +badge_name_CLUBG=Big Oops! +badge_desc_CLUBG=In memory of the Habbo Club Massacre. May 2020. +badge_name_UK037=Britney Spears +badge_desc_UK037=Joined Britney Spears for her Hotel Debut! +badge_name_DE35A=Ban Hammer +badge_desc_DE35A=Moderation makes the world go round... +badge_name_RBH=Real Bingo Hours +badge_desc_RBH=??? +badge_name_BRIT1=She visited! +badge_desc_BRIT1=Britney Spears visited my room. +badge_name_DE182=She answered! +badge_desc_DE182=Britney Spears answered my question. +badge_name_FRIDG=Elegant Carrot +badge_desc_FRIDG=I played and won at the Zana Kick memorial game. +badge_name_GAMB=Gambler +badge_desc_GAMB=Jack of all trades, master of none. +badge_name_RARE1=Gold Rare Hoarder! +badge_desc_RARE1=Still not enough rares! +badge_name_RARE2=Silver Rare Hoarder! +badge_desc_RARE2=Still not enough rares! +badge_name_RARE3=Bronze Rare Hoarder! +badge_desc_RARE3=Still not enough rares! +badge_name_TACO=Tacos Tuesday +badge_desc_TACO=We can't get enough of them! +badge_name_WRITE=King Of Writing +badge_desc_WRITE=You are an authentic writer! +badge_name_ROTW1=ROTW 1st Place +badge_desc_ROTW1=You're a winner baby! +badge_name_ROTW2=ROTW 2nd Place +badge_desc_ROTW2=So close... +badge_name_ROTW3=ROTW 3rd Place +badge_desc_ROTW3=Nearly there... +badge_name_IT021=#IDAHOBIT +badge_desc_IT021=International Day Against Homophobia, Biphobia and Transphobia +badge_name_TC054=Eid Mubarak 2020 +badge_desc_TC054=Celebrating Eid with ClassicHabbo! +badge_name_ES9=Calippo Summer +badge_desc_ES9=Joined ClassicHabbo for a Calippo Summer +badge_name_ES8=Calippo King +badge_desc_ES8=Won the Calippo Summer Giveaway +badge_name_RTS01=The BHF's +badge_desc_RTS01=Best Habbo's Forever. We're popular and we Rule the School! +badge_name_RTS02=The GN0RKS +badge_desc_RTS02=Gamers, Skaters, Geeks, Nerds and Dorks. Unite to Rule the School! +badge_name_RTS03=The Habcats +badge_desc_RTS03=Jocks, football players and cheerleaders - together we Rule the School! +badge_name_RTS04=The Punks +badge_desc_RTS04=Emos, goths, punks and wannabe poets. Anarchy Rules the School! +badge_name_RTS05=Golden Graduation Badge +badge_desc_RTS05=RTS 2020 Winning Group - %PLACEHOLDER%! +badge_name_RTS06=Pop Quiz Badge #1 +badge_desc_RTS06=Aced a Rule The School Pop Quiz about Maths! +badge_name_RTS07=Pop Quiz Badge #2 +badge_desc_RTS07=Aced a Rule The School Pop Quiz about Science! +badge_name_RTS08=Pop Quiz Badge #3 +badge_desc_RTS08=Aced a Rule The School Pop Quiz about History! +badge_name_RTS09=Basketball Champ +badge_desc_RTS09=On the Winning Team! +badge_name_RTS10=Sports Stud +badge_desc_RTS10=Root for your team! +badge_name_RTS16=Red Scholar Badge +badge_desc_RTS16=Straight A's for this Habbo Student +badge_name_RTS18=Glee Club Member +badge_desc_RTS18=I'm a Gleek, hear me sing! +badge_name_RTS19=Green Scholar Badge +badge_desc_RTS19=Straight A's for this Habbo Student +badge_name_RTS22=RTS Hideout Winner +badge_desc_RTS22=Created a perfect Hideout for their school group! +badge_name_RTS25=Not In Use +badge_desc_RTS25=Not In Use +badge_name_RTS26=Blue Scholar Badge +badge_desc_RTS26=Straight A's for this Habbo Student +badge_name_YOUN=YouNow +badge_desc_YOUN=I came from YouNow +badge_name_MLENG=Diversity & Equality! +badge_desc_MLENG=Badges are now multilingual - thanks for joining us on this journey. +badge_name_MLPT=Diversidade & Igualdade! +badge_desc_MLPT=Emblemas agora são multilíngues - Obrigado por se juntar a nós nesta jornada. +badge_name_MLES=Diversidad & Igualdad! +badge_desc_MLES=Las insignias ahora son multilingües- Gracias por acompañarnos en este viaje. +badge_name_MLIT=Awaiting Translation +badge_desc_MLIT=Awaiting Italian Translation +badge_name_BLM=#BlackLivesMatter +badge_desc_BLM=Always, and forever. Take a stand! +badge_name_EAS01=FP Maze (1/3) +badge_desc_EAS01=1 Down, 2 to go! +badge_name_EAS02=FP Maze (2/3) +badge_desc_EAS02=Almost there... +badge_name_EAS03=FP Maze (3/3) +badge_desc_EAS03=I did it! I completed all 3 Flower Power Mazes! +badge_name_EAS04=Flower Power! +badge_desc_EAS04=Discovered a whole new world of Flowers! +badge_name_EAS05=Professional Gardener +badge_desc_EAS05=A Pro Gardner? Probably... +badge_name_ES11A=Wired Tester +badge_desc_ES11A=I am a BETA Tester for Wired! Coming soon... +badge_name_PT107=Pride Month 2020 +badge_desc_PT107=Standing side by side with my brothers and sisters, during Pride Month 2020. +badge_name_UK479=Picnic Fields +badge_desc_UK479=Enjoy the great outdoors, celebrate mother nature and party! +badge_name_THE01=Theatredome +badge_desc_THE01=Perform your latest master piece, or simply catch the latest gossip. +badge_name_ITB61=Habbo Lido +badge_desc_ITB61=Splish, splash and have a bash in the Habbo pool! +badge_name_MLNL=Diversiteit & gelijkheid +badge_desc_MLNL=Badges zijn nu meertalig - bedankt om ons te volgen op deze tocht. +badge_name_NT258=Welcome to ClassicHabbo +badge_desc_NT258=What a great place to start! +badge_name_AST09=Habburgers +badge_desc_AST09=Get food here! +badge_name_SMC04=Library +badge_desc_SMC04=Books! Glorious books! Fill yourself with information and lose yourself in wonderful literary worlds. +badge_name_HLY03=Power Gym +badge_desc_HLY03=Fancy a workout? +badge_name_NL563=Mickey Duck +badge_desc_NL563=flash sino 2 is pretty neat, right? +badge_name_UK982=Juicy +badge_desc_UK982=This is eggciting! +badge_name_UK983=Peachy +badge_desc_UK983=I appeachiate you! +badge_name_MITY=Times are changing! +badge_desc_MITY=You don't have to deal with this all alone! +badge_name_500G=Five Hundred +badge_desc_500G=I counted to 500 on Discord! +badge_name_500S=Five Hundred +badge_desc_500S=Wow! Discord #counting reached 500! +badge_name_BOD1=Body Part (Common) +badge_desc_BOD1=1/3 +badge_name_BOD2=Body Part (Rare) +badge_desc_BOD2=2/3 +badge_name_BOD3=Body Part (Epic) +badge_desc_BOD3=3/3 +badge_name_BUST=BUSTED! +badge_desc_BUST=I got caught Credit Farming...but I've changed my ways! +badge_name_FAG=Smoking Hot +badge_desc_FAG=Fancy a cig buddy? +badge_name_KIDDO=Kiddo +badge_desc_KIDDO=For joining the Cult of Kiddo! +badge_name_POOH=Winnie-the-Pooh +badge_desc_POOH=At your service! +badge_name_ITB25=ITGTTS +badge_desc_ITB25=I'm too GAY to think STRAIGHT! +badge_name_ITB26=ITGTTS +badge_desc_ITB26=I'm too GAY to think STRAIGHT! +badge_name_PT960=Chromatica +badge_desc_PT960=Battle for your life! Babylon! +badge_name_TEST21=Testing Testing +badge_desc_TEST21=1 2 3 4 +badge_name_ITA06=Magnifying Glass +badge_desc_ITA06=For solving GingerBrad mystery. +badge_name_ITA53=Expert Detective +badge_desc_ITA53=I was one of the first 10 Habbo's to Solve GingerBrad's mystery! +badge_name_MDI=Cup of Coffee +badge_desc_MDI=For those Late Night Habbo's +badge_name_IT2=Battle Ball Gold +badge_desc_IT2=Congratulations Chromatica Team! (Leone, esdras90, Lucas-4 and xJoonq) +badge_name_IT3=Battle Ball Silver +badge_desc_IT3=Congratulations AbstractisMyAss! (Abstractis, crxstxnxx, Frvncisco and Punked20) +badge_name_IT4=Battle Ball Bronze +badge_desc_IT4=Congratulations Snek Klan! (devrik, Joorren, boo and EatAss) +badge_name_DEB=Botanist +badge_desc_DEB=I won the Flower Power Room Competition. June 2020. +badge_name_CO5=Gardener +badge_desc_CO5=I submitted my room to the Flower Power Room Competition! June 2020. +badge_name_ES26I=L +badge_desc_ES26I=. +badge_name_ES27I=G +badge_desc_ES27I=. +badge_name_ES29I=B +badge_desc_ES29I=. +badge_name_ES28I=T +badge_desc_ES28I=. +badge_name_ES30I=+ +badge_desc_ES30I=. +badge_name_ES32H=Avo Love +badge_desc_ES32H=You're everything I Avo wanted! +badge_name_DE26C=Gamer Gold +badge_desc_DE26C=Winner winner chicken dinner! +badge_name_DE27C=Gamer Silver +badge_desc_DE27C=Winner winner chicken dinner! +badge_name_DE28C=Gamer Bronze +badge_desc_DE28C=Winner winner chicken dinner! +badge_name_BSH11=Bet on it... +badge_desc_BSH11=I'm a Dice PRO! +badge_name_US019=Canada Day 2020 +badge_desc_US019=Celebrating all things Canadian with Habbo! +badge_name_UK827=Eh?! +badge_desc_UK827=It's a Canadian thing... +badge_name_CAK=Maple Leaf +badge_desc_CAK=A national symbol... +badge_name_IT472=Looking Forward... +badge_desc_IT472=July 2020 Infobus Session on the Future of Classic Habbo! +badge_name_DE258=I voted in 2020 Habbo Elections +badge_desc_DE258=I hope my president wins! #notmypresident +badge_name_DE640=Presidential Nominee July 2020 +badge_desc_DE640=For the tears, the glory and the bobba. +badge_name_US106=Presidential Medal of Recognition +badge_desc_US106=Awarded by President %username% +badge_name_ES35B=Habbo President +badge_desc_ES35B=President of Classic Habbo - 2020! +badge_name_HOT2=Hot +badge_desc_HOT2=One Hot Habbo - Hot/Cool 2020 +badge_name_COL2=Cool +badge_desc_COL2=One Cool Habbo - Hot/Cool 2020 +badge_name_HOT=Hot Badge +badge_desc_HOT=Hot or Cool Campaign +badge_name_COL=Cool Badge +badge_desc_COL=Hot or Cool Campaign +badge_name_ES498=Bacon Medal +badge_desc_ES498=I might not have won but I was there! +badge_name_NL712=Flower Detective +badge_desc_NL712=I solved the mystery! July 2020 +badge_name_REPF1=SAW! Player +badge_desc_REPF1=I entered the Flower Power Castle (Rep Event) +badge_name_REPF2=SAW! Winner +badge_desc_REPF2=I conquered the Flower Power Castle (Rep Event) +badge_name_SSCB=Snow Storm Bronze +badge_desc_SSCB=Congratulations to Joorren and devrik +badge_name_SSCG=Snow Storm Gold +badge_desc_SSCG=Congratulations to Big.ViuS and Kaah +badge_name_SSCS=Snow Storm Silver +badge_desc_SSCS=Congratulations to Why and $$ +badge_name_UK694=USA Independence Day +badge_desc_UK694=Happy 4th of July! +badge_name_DEA=Flower Investigator +badge_desc_DEA=I was one of the 15 best detectives! July 2020 +badge_name_DISC2=One Thousand +badge_desc_DISC2=Wow! Discord #counting reached 1000! +badge_name_VRFD=Verified +badge_desc_VRFD=My account is verified on the official CH discord! +badge_name_POKHR=Pro Gambler +badge_desc_POKHR=A gambler at Heart +badge_name_POKSP=Pro Gambler +badge_desc_POKSP=A gambler by Trade +badge_name_ALEX=Alex +badge_desc_ALEX=I love Alex +badge_name_WING2LGBT+ Punk +badge_desc_WING2=I am LGBT and PUNK! +badge_name_WING1=LGBT+ Punk +badge_desc_WING1=I am LGBT and PUNK! +badge_name_FRECK=Freck +badge_desc_FRECK=Hobo life-style +badge_name_DEVRI=Devrik +badge_desc_DEVRI=Fan of the design +badge_name_CHRIS=Chrisol +badge_desc_CHRIS=Do I look like a baby to you? :/ +badge_name_IT221=Good vs Evil +badge_desc_IT221=Only one team will win! Who will it be? July 2020. +badge_name_FRI02=Lucifer +badge_desc_FRI02=I found Luci, the cat! What a wicked boy. +badge_name_MS1=Bad +badge_desc_MS1=You are bad, but not that bad! Devil's Maze Top 30 +badge_name_MS2=Evil +badge_desc_MS2=You are more evil than most Habbos! Devil's Maze Top 20 +badge_name_KCK01=Kick Wars +badge_desc_KCK01=I trialed Kick Wars with Habbo Staff! +badge_name_BR026=Rock 'N' Roll +badge_desc_BR026=Celebrated International Day of Rock 'N' Roll with Habbo Hotel, 2020. +badge_name_DE08C=Good Angel +badge_desc_DE08C=Winner of Good vs Evil - I defeated the Evil forces. +badge_name_ES12D=Evil Angel +badge_desc_ES12D=Lost the battle between Good vs Evil. +badge_name_ES814=On Wednesdays, we wear pink! +badge_desc_ES814=Mean Girls 2020 +badge_name_US114=You can't sit with us! +badge_desc_US114=Mean Girls 2020 +badge_name_IT492=Artist +badge_desc_IT492=Official Habbo Hotel Pixel Artist +badge_name_PX4=Behind The Pixels +badge_desc_PX4=Joined Staff for the Launch of BTP, 2020. diff --git a/tools/gamedata/shockwave/external_variables.php b/tools/gamedata/shockwave/external_variables.php new file mode 100644 index 0000000..c883e2a --- /dev/null +++ b/tools/gamedata/shockwave/external_variables.php @@ -0,0 +1,34 @@ + \ No newline at end of file diff --git a/tools/gamedata/shockwave/external_variables.txt b/tools/gamedata/shockwave/external_variables.txt new file mode 100644 index 0000000..16e5a0a --- /dev/null +++ b/tools/gamedata/shockwave/external_variables.txt @@ -0,0 +1,170 @@ +cast.entry.39=hh_human_50_acc_face +cast.entry.33=hh_human_acc_face +cast.entry.11=hh_human_hair +client.fatal.error.url=http://localhost/client_error +link.format.userpage=http://localhost/home/%ID%/id +room.rating.enable=1 +interface.cmds.active.ctrl=["move","rotate"] +cast.entry.28=hh_recycler +avatar.editor.character.update.url=http://localhost/profile +cast.entry.14=hh_human_shoe +cast.entry.16=hh_pets_common +cast.entry.6=hh_human +link.format.collectibles=http://localhost/credits/collectables +room.cast.11=hh_human_fx +interstitial.max.displays=5 +room.cast.1=hh_soundmachine +interface.cmds.item.ctrl=[] +cast.entry.40=hh_human_50_acc_head +cast.entry.32=hh_human_acc_eye +cast.entry.34=hh_human_acc_head +interface.cmds.user.owner=["take_rights","give_rights","kick","friend","trade","ignore","unignore","userpage"] +cast.entry.15=hh_kiosk_room +room.recommendations=1 +room.cast.10=hh_roomdimmer +link.format.friendlist.pref=http://localhost/profile/friendsmanagement?tab=6 +cast.entry.41=hh_human_50_body +cast.entry.10=hh_human_hats +room.cast.5=hh_human_50_leg +cast.entry.30=hh_badges +cast.entry.4=hh_interface +cast.entry.31=hh_entry_init +interface.cmds.user.ctrl=["kick","friend","trade","ignore","unignore","userpage"] +cast.entry.19=hh_furni_classes +interface.cmds.photo.owner=["pick","delete"] +cast.entry.21=hh_club +displayer.tag.expiration.time=600000 +swimjump.key.list=[#run1:"A", #run2:"D", #dive1:"W", #dive2:"E", #dive3:"A", #dive4:"S", #dive5:"D", #dive6:"Z", #dive7:"X", #jump:"SPACE"] +link.format.credits=http://localhost/credits +cast.entry.17=hh_room_utils +cast.entry.46=hh_ig +cast.entry.44=hh_pets +games.tickets.hide=0 +navigator.cache.duration=30 +cast.entry.35=hh_human_50_face +cast.entry.45=hh_guide +cast.entry.47=hh_ig_interface +cast.entry.48=hh_tutorial +cast.entry.20=hh_room +room.cast.4=hh_human_50_shirt +room.cast.3=hh_human_acc_waist +interface.cmds.photo.ctrl=[] +cast.entry.18=hh_room_ui +club.subscription.disabled=1 +cast.entry.12=hh_human_shirt +interface.cmds.user.friend=["friend","trade","ignore","unignore","userpage"] +room.cast.2=hh_human_acc_chest +cast.entry.24=hh_cat_new +link.format.mailpage=http://localhost/me#mail/compose/%recipientid% +text.render.compatibility.mode=2 +interface.cmds.active.owner=["move","rotate","pick"] +cast.entry.43=hh_instant_messenger +group.badge.url=http://localhost/habbo-imaging/badge/%imagerdata%.gif +interstitial.interval=180000 +cast.entry.1=hh_entry_au +cast.entry.7=hh_human_body +cast.entry.13=hh_human_leg +client.full.refresh.period=5000 +group_logo_url_template=http://localhost/habbo-imaging/badge-fill/%imagerdata%.gif +cast.entry.42=hh_friend_list +cast.entry.2=hh_entry_base +room.cast.9=hh_human_50_acc_waist +text.crap.fixing=1 +cast.entry.26=hh_buffer +client.version.id=401 +cast.entry.27=hh_dynamic_downloader +moderator.cmds=[":alert x",":ban x",":kick x",":superban x",":shutup x",":unmute x",":transfer x",":softkick x"] +rosetta.warning.page.url=http://localhost/client_popup/rosetta_info +link.format.mail.inbox=http://localhost/me#mail +link.format.user.search=http://localhost/me#habbo-search +room.cast.6=hh_human_50_shoe +room.cast.8=hh_human_50_acc_chest +cast.entry.36=hh_human_50_hats +avatar.editor.url=%predefined%/profile +cast.entry.22=hh_photo +link.format.habboclub=http://%predefined%/credits/club +link.format.club=http://localhost/credits/club +cast.entry.23=hh_navigator +castload.retry.delay=20000 +link.format.mail.compose=http://localhost/me#mail/compose/%recipientid%/%random%/ +interface.cmds.item.owner=["pick"] +link.format.pets=http://localhost/hotel/pets +interface.cmds.user.personal=["badge","dance","wave","hcdance","userpage"] +paalu.key.list=[#bal1:"Q", #bal2:"E", #push1:"A", #push2:"D", #move1:"N", #move2:"M", #stabilise:"SPACE"] +pixels.enabled=true +link.format.tag.search=http://localhost/tag/search?tag=%tag% +room.cast.small.1=hh_pets_50 +cast.entry.25=hh_cat_gfx_all +cast.entry.5=hh_patch_uk +cast.entry.9=hh_human_item +room.cast.12=hh_human_50_fx +cast.entry.37=hh_human_50_hair +interstitial.show.time=3000 +cast.entry.38=hh_human_50_acc_eye +cast.entry.8=hh_human_face +room.cast.private=["hh_room_private", "hh_room_landscapes"] +client.flood.timeout=1 +cast.entry.29=hh_poll +room.cast.7=hh_human_50_item +cast.entry.3=hh_shared +friend_request_options=Advanced options. +char.conversion.mac=[128:219,130:226,131:196,132:227,133:201,134:160,135:224,136:246,137:228,139:220,140:206,145:212,146:213,147:210,148:211,149:165,150:208,151:209,152:247,153:170,155:221,156:207,159:217,161:193,165:180,167:164,168:172,170:187,171:199,172:194,173:208,174:168,176:161,180:171,182:166,183:225,184:252,186:188,187:200,191:192,192:203,193:231,194:229,195:204,196:128,197:129,198:174,199:130,200:233,201:131,202:230,203:232,204:237,205:234,206:235,207:236,209:132,210:241,211:238,212:239,213:205,214:133,216:175,217:244,218:242,219:243,220:134,223:167,224:136,225:135,226:137,227:139,228:138,229:140,230:190,231:141,232:143,233:142,234:144,235:145,236:147,237:146,238:148,239:149,241:150,242:152,243:151,244:153,246:154,247:214,248:191,249:157,250:156,251:158,252:159,255:216] +profile.events.enabled=false +profile.fields.enabled=false +profiler.enabled=false +profile.core.enabled=false +profile.network.enabled=false +client.use.invites=1 +external.figurepartlist.txt=http://localhost/dcr/v31/gamedata/figuredata.xml +productdata.load.url=http://localhost/dcr/v31/gamedata/productdata.txt +hotelview.banner.url=http://localhost/gamedata/banner +purse.transactions.active=1 +loading.bar.active=1 +client.textdata.utf8=1 +logout.disconnect.url=http://localhost/account/disconnected?reason=logout&origin=popup +logout.concurrent.url= +http://localhost/account/disconnected?reason=concurrentlogin&origin=popup +furnidata.load.url=http://localhost/dcr/v31/gamedata/furnidata.txt +dynamic.download.name.template=hh_furni_xx_%typeid%.cct +navigator.visible.public.root=3 +room.default.wall=201 +figure.draworder.xml.secure=http://localhost/dcr/v31/gamedata/draworder.xml +client.window.title=Habbo Hotel +navigator.private.default=4 +room.default.floor=111 +struct.font.tooltip=[#font:"v", #fontSize:9,#lineHeight:10,#color:rgb("#000000"),#ilk:#struct,#fontStyle:[#plain]] +navigator.public.default=3 +stats.tracking.javascript.template=/\TCODE +struct.font.link=[#font:"v", #fontSize:9,#lineHeight:10,#color:rgb("#000000"),#ilk:#struct,#fontStyle:[#underline]] +flash.dynamic.download.url=http://localhost/dcr/hof_furni/ +flash.dynamic.download.name.template=%revision%/%typeid%.swf +fuse.project.id=habbo_uk +figure.animation.xml=http://localhost/dcr/v31/gamedata/animation.xml +private.image.library.url=http://localhost/c_images/ +dynamic.download.url=http://localhost/dcr/hof_furni/ +figure.partsets.xml=http://localhost/dcr/v31/gamedata/partsets.xml +tutorial.name.new_user_flow=NUF_mini +external.figurepartlist.txt.secure=http://localhost/dcr/v31/gamedata/figuredata.xml +navigator.visible.private.root=4 +struct.font.italic=[#font:"v", #fontSize:9,#lineHeight:10,#color:rgb("#000000"),#ilk:#struct,#fontStyle:[#italic]] +language=en +image.library.url=http://localhost/c_images/ +struct.font.plain=[#font:"v", #fontSize:9,#lineHeight:10,#color:rgb("#000000"),#ilk:#struct,#fontStyle:[#plain]] +navigator.default.view=public +security.cast.load.url=http://localhost/dcr/v31/gamedata/sec.cct?t=%token% +logout.url=http://localhost/account/disconnected?reason=logout&origin=popup +figure.draworder.xml=http://localhost/dcr/v31/gamedata/draworder.xml +stats.tracking.javascript=google +struct.font.bold=[#font:"vb",#fontSize:9,#lineHeight:10,#color:rgb("#000000"),#ilk:#struct,#fontStyle:[#plain]] +struct.font.grey=[#font:"v", #fontSize:9,#lineHeight:10,#color:rgb("#666666"),#ilk:#struct,#fontStyle:[#italic]] +permitted.name.chars=1234567890qwertyuiopasdfghjklzxcvbnm-=?!@:., +dynamic.download.samples.template=sounds/%typeid%.cct +handitem.camera.select_handler=photo_interface +navigator.room.forward.timeout=0 +cast.entry.49=hh_tutorial_fix +client.allow.cross.domain=1 +client.notify.cross.domain=0 +handitem.right.45 = 57 +handitem.right.46 = 58 +handitem.right.47 = 59 +handitem.right.50 = 62 diff --git a/tools/gamedata/shockwave/external_variables_nossl.txt b/tools/gamedata/shockwave/external_variables_nossl.txt new file mode 100644 index 0000000..7b7c9bc --- /dev/null +++ b/tools/gamedata/shockwave/external_variables_nossl.txt @@ -0,0 +1,169 @@ +cast.entry.39=hh_human_50_acc_face +cast.entry.33=hh_human_acc_face +cast.entry.11=hh_human_hair +client.fatal.error.url=http://classichabbo.com/client_error +link.format.userpage=http://localhost/home/%ID%/id +room.rating.enable=1 +interface.cmds.active.ctrl=["move","rotate"] +cast.entry.28=hh_recycler +avatar.editor.character.update.url=http://localhost/profile +cast.entry.14=hh_human_shoe +cast.entry.16=hh_pets_common +cast.entry.6=hh_human +link.format.collectibles=http://localhost/credits/collectables +room.cast.11=hh_human_fx +interstitial.max.displays=5 +room.cast.1=hh_soundmachine +interface.cmds.item.ctrl=[] +cast.entry.40=hh_human_50_acc_head +cast.entry.32=hh_human_acc_eye +cast.entry.34=hh_human_acc_head +interface.cmds.user.owner=["take_rights","give_rights","kick","friend","trade","ignore","unignore","userpage"] +cast.entry.15=hh_kiosk_room +room.recommendations=1 +room.cast.10=hh_roomdimmer +link.format.friendlist.pref=http://localhost/profile/friendsmanagement?tab=6 +cast.entry.41=hh_human_50_body +cast.entry.10=hh_human_hats +room.cast.5=hh_human_50_leg +cast.entry.30=hh_badges +cast.entry.4=hh_interface +cast.entry.31=hh_entry_init +interface.cmds.user.ctrl=["kick","friend","trade","ignore","unignore","userpage"] +cast.entry.19=hh_furni_classes +interface.cmds.photo.owner=["pick","delete"] +cast.entry.21=hh_club +displayer.tag.expiration.time=600000 +swimjump.key.list=[#run1:"A", #run2:"D", #dive1:"W", #dive2:"E", #dive3:"A", #dive4:"S", #dive5:"D", #dive6:"Z", #dive7:"X", #jump:"SPACE"] +link.format.credits=http://localhost/credits +cast.entry.17=hh_room_utils +cast.entry.46=hh_ig +cast.entry.44=hh_pets +games.tickets.hide=0 +navigator.cache.duration=30 +cast.entry.35=hh_human_50_face +cast.entry.45=hh_guide +cast.entry.47=hh_ig_interface +cast.entry.48=hh_tutorial +cast.entry.20=hh_room +room.cast.4=hh_human_50_shirt +room.cast.3=hh_human_acc_waist +interface.cmds.photo.ctrl=[] +cast.entry.18=hh_room_ui +club.subscription.disabled=1 +cast.entry.12=hh_human_shirt +interface.cmds.user.friend=["friend","trade","ignore","unignore","userpage"] +room.cast.2=hh_human_acc_chest +cast.entry.24=hh_cat_new +link.format.mailpage=http://localhost/me#mail/compose/%recipientid% +text.render.compatibility.mode=2 +interface.cmds.active.owner=["move","rotate","pick"] +cast.entry.43=hh_instant_messenger +group.badge.url=http://localhost/habbo-imaging/badge/%imagerdata%.gif +interstitial.interval=180000 +cast.entry.1=hh_entry_au +cast.entry.7=hh_human_body +cast.entry.13=hh_human_leg +client.full.refresh.period=5000 +cast.entry.42=hh_friend_list +cast.entry.2=hh_entry_base +room.cast.9=hh_human_50_acc_waist +text.crap.fixing=1 +cast.entry.26=hh_buffer +client.version.id=401 +cast.entry.27=hh_dynamic_downloader +moderator.cmds=[":alert x",":ban x",":kick x",":superban x",":shutup x",":unmute x",":transfer x",":softkick x"] +rosetta.warning.page.url=http://localhost/client_popup/rosetta_info +link.format.mail.inbox=http://localhost/me#mail +link.format.user.search=http://localhost/me#habbo-search +room.cast.6=hh_human_50_shoe +room.cast.8=hh_human_50_acc_chest +cast.entry.36=hh_human_50_hats +avatar.editor.url=%predefined%/profile +cast.entry.22=hh_photo +link.format.habboclub=https://%predefined%/credits/club +link.format.club=http://localhost/credits/club +cast.entry.23=hh_navigator +castload.retry.delay=20000 +link.format.mail.compose=http://localhost/me#mail/compose/%recipientid%/%random%/ +interface.cmds.item.owner=["pick"] +link.format.pets=http://localhost/hotel/pets +interface.cmds.user.personal=["badge","dance","wave","hcdance","userpage"] +paalu.key.list=[#bal1:"Q", #bal2:"E", #push1:"A", #push2:"D", #move1:"N", #move2:"M", #stabilise:"SPACE"] +pixels.enabled=true +link.format.tag.search=http://localhost/tag/search?tag=%tag% +room.cast.small.1=hh_pets_50 +cast.entry.25=hh_cat_gfx_all +cast.entry.5=hh_patch_uk +cast.entry.9=hh_human_item +room.cast.12=hh_human_50_fx +cast.entry.37=hh_human_50_hair +interstitial.show.time=3000 +cast.entry.38=hh_human_50_acc_eye +cast.entry.8=hh_human_face +room.cast.private=["hh_room_private", "hh_room_landscapes"] +client.flood.timeout=1 +cast.entry.29=hh_poll +room.cast.7=hh_human_50_item +cast.entry.3=hh_shared +friend_request_options=Advanced options. +char.conversion.mac=[128:219,130:226,131:196,132:227,133:201,134:160,135:224,136:246,137:228,139:220,140:206,145:212,146:213,147:210,148:211,149:165,150:208,151:209,152:247,153:170,155:221,156:207,159:217,161:193,165:180,167:164,168:172,170:187,171:199,172:194,173:208,174:168,176:161,180:171,182:166,183:225,184:252,186:188,187:200,191:192,192:203,193:231,194:229,195:204,196:128,197:129,198:174,199:130,200:233,201:131,202:230,203:232,204:237,205:234,206:235,207:236,209:132,210:241,211:238,212:239,213:205,214:133,216:175,217:244,218:242,219:243,220:134,223:167,224:136,225:135,226:137,227:139,228:138,229:140,230:190,231:141,232:143,233:142,234:144,235:145,236:147,237:146,238:148,239:149,241:150,242:152,243:151,244:153,246:154,247:214,248:191,249:157,250:156,251:158,252:159,255:216] +profile.events.enabled=false +profile.fields.enabled=false +profiler.enabled=false +profile.core.enabled=false +profile.network.enabled=false +client.use.invites=1 +external.figurepartlist.txt=http://localhost/dcr/v31/gamedata/figuredata.xml +productdata.load.url=http://localhost/dcr/v31/gamedata/productdata.txt +hotelview.banner.url=http://localhost/gamedata/banner +purse.transactions.active=1 +loading.bar.active=1 +client.textdata.utf8=1 +logout.disconnect.url=http://classichabbo.com/account/disconnected?reason=logout&origin=popup +logout.concurrent.url= +http://classichabbo.com/account/disconnected?reason=concurrentlogin&origin=popup +furnidata.load.url=http://localhost/dcr/v31/gamedata/furnidata.txt +dynamic.download.name.template=hh_furni_xx_%typeid%.cct +navigator.visible.public.root=3 +room.default.wall=201 +figure.draworder.xml.secure=http://localhost/dcr/v31/gamedata/draworder.xml +client.window.title=Habbo Hotel +navigator.private.default=4 +room.default.floor=111 +struct.font.tooltip=[#font:"v", #fontSize:9,#lineHeight:10,#color:rgb("#000000"),#ilk:#struct,#fontStyle:[#plain]] +navigator.public.default=3 +stats.tracking.javascript.template=/\TCODE +struct.font.link=[#font:"v", #fontSize:9,#lineHeight:10,#color:rgb("#000000"),#ilk:#struct,#fontStyle:[#underline]] +flash.dynamic.download.url=http://localhost/dcr/hof_furni/ +flash.dynamic.download.name.template=%revision%/%typeid%.swf +fuse.project.id=habbo_uk +figure.animation.xml=http://localhost/dcr/v31/gamedata/animation.xml +private.image.library.url=http://localhost/c_images/ +dynamic.download.url=http://localhost/dcr/hof_furni/ +figure.partsets.xml=http://localhost/dcr/v31/gamedata/partsets.xml +tutorial.name.new_user_flow=NUF_mini +external.figurepartlist.txt.secure=http://localhost/dcr/v31/gamedata/figuredata.xml +navigator.visible.private.root=4 +struct.font.italic=[#font:"v", #fontSize:9,#lineHeight:10,#color:rgb("#000000"),#ilk:#struct,#fontStyle:[#italic]] +language=en +image.library.url=http://localhost/c_images/ +struct.font.plain=[#font:"v", #fontSize:9,#lineHeight:10,#color:rgb("#000000"),#ilk:#struct,#fontStyle:[#plain]] +navigator.default.view=public +security.cast.load.url=http://localhost/dcr/v31/gamedata/sec.cct?t=%token% +logout.url=http://localhost/account/disconnected?reason=logout&origin=popup +figure.draworder.xml=http://localhost/dcr/v31/gamedata/draworder.xml +stats.tracking.javascript=google +struct.font.bold=[#font:"vb",#fontSize:9,#lineHeight:10,#color:rgb("#000000"),#ilk:#struct,#fontStyle:[#plain]] +struct.font.grey=[#font:"v", #fontSize:9,#lineHeight:10,#color:rgb("#666666"),#ilk:#struct,#fontStyle:[#italic]] +permitted.name.chars=1234567890qwertyuiopasdfghjklzxcvbnm-=?!@:., +dynamic.download.samples.template=sounds/%typeid%.cct +handitem.camera.select_handler=photo_interface +navigator.room.forward.timeout=0 +cast.entry.49=hh_tutorial_fix +client.allow.cross.domain=1 +client.notify.cross.domain=0 +handitem.right.45 = 57 +handitem.right.46 = 58 +handitem.right.47 = 59 +handitem.right.50 = 62 diff --git a/tools/gamedata/shockwave/figuredata.txt b/tools/gamedata/shockwave/figuredata.txt new file mode 100644 index 0000000..6d23a40 --- /dev/null +++ b/tools/gamedata/shockwave/figuredata.txt @@ -0,0 +1,2 @@ + +FFCB98E3AE7DC99263AE7748945C2F6E482CFFC680F4AC54DC9B4CFFDBC1FFB696FF987FF0DCA3F5DA88DFC375EFD17DC89F56A89473B875609C543F6E392CEAEFD0E2E4B0D5D08CC4A7B3C2C4A7C5C0C2F1E5DAB3BDC34C311E644628926338A97C44B3957FBD9562C2A896CA9072CBBC90D1A78CD1BCADD7BCA9D7CBA3D8A595D8B07EE0BD91E0D0C5E2DBB9E3D38DE7C9A3EDD7BBEEE7E0EFC3B6F1D6B4F8E5DAFDDACFFFCC99FFD6A9DFA66FD1803AFFEEB9F6D059F2B11D9A5D2EAC5300783400D8D3D9918D984A4656F291599E3D3B5C4332FF8746FC610CDE3900D2FF00FFFFFFE5FF09A3FF8F3399663A7B93FFBDBCDE34A49F5699D5F9FB6699CCE71B0A95FFFA2D2D2D00FA000A0A0A1052621062621E321420B4A4234CAF248954282828292929298BB42DA5E9319CF631F6DE322F3E323235325B6A3296FA333333394194463C144A6A184B5A5A4D32234F87C0579E1F5A480A5A837B624A41625A20626262646D6C662608666666674E3B6A3910736346781414784215786D5A7B18947D5B1780557C8331418A49248B18208C694B8C967E904839926338946220947BAC948B6A94BD2994DFFF94FFD5976D3E9CF0689E3F0BA08C64A4A4A4A4DEFFA55A18A7272CA97C44B29B86B2A590B3957FB429CDB4EE29B58B5CB9A16EBD9562BD9CFFBDBD9DC21A86C29C57C2A896C2E3E8C376C4C4FFFFC54A29C59462C8D2E6C96B2FCA5A1ECA5A33CA9072CBBC90CD99C7CF6254D1A78CD1BCADD2C8CCD45B0AD4FE80D54173D5FF9CD7BCA9D7CBA3D8A595D8B07EDA945EDB7C62DCDCC8DDA934DE73DEDEDEDEDFDAB4DFDABEE0BA78E0BD91E0D0C5E1CC78E2DBB9E63139E6A4F6E7C9A3E7E92DEA5959ECFFEDEDD7BBEEE7E0EEEEEEEFC3B6F1D6B4F6AC31F73B32F8E5DAFDA61EFDDACFFE6D6DFE834DFF0000FF006AFF4814FF4C2FFF5F9BFF7329FF7383FF7BDEFF9C62FFA772FFADAEFFBC42FFBDBDFFBE73FFC53AFFCD94FFCD9BFFDC7AFFE639FFE673FFEAACFFEAADFFEEC5FFFFFFEEEEEEA4A4A4595959F6E179E7B027A86B19F8C790EB7E43C74400FFBFC2ED5C509F2B31E7D1EEAC94B37E5B90ACC9E66D80BB544A81C5EDE675B7C74F7AA2BBF3BD6BAE61456F40D2FF00EDFF9ABABB3D7A7D22F3E1AF96743D6B573BFFFFFFFFF41DFF9211FF27A6FF1300FF6D8FE993FFC600AD9B001D76FF2D1CDC00AFF20300B9A894FFEC1BD2FF1F55FF0219A53A53411E1E1E003F1D096E16105262106262121D6D1F1F1F20B4A420B9132828C8292929298BB42F2D26319CF631F6DE333333336633365E8A378BE837E8C53941943B7AC03D3D3D406A6543001A4562834A6A184C882B5A837B5CC4455F5F5F624A41625A20626262656A406666666874506A39106A405C6A4A40779FBB795E537B18947B58187C8F7D7D00047D003483314187D7CD88E0DE8B1820946220947BAC948B6A94BD2994FFD595784E983E4F98863E9FD787A4A4A4A4DEFFA88139ADD0FFAFDCDFB3FCFFB429CDB4EE29B6396DB79BFFB8E737BA9D73BAAD68BAC7FFBB2430BD9CFFBDFFC8C0B4C7C1C1C1C1D2DBC54A29C59462C6B3D6C745D9CA2221CDCDFFCDFFB3D1DFAFD1FFD4D54173D5FF9CD68C8CD7C187D9457ED97145DE73DEDEDEDEDFAFD1DFCBAFE63139E6A4F6E8B137E8FFFFEEEEEEF64C3EF6AC31F9A0A0FF006AFF1092FF45D6FF7329FF7383FF7BDEFF8516FF9C62FFB3D7FFB6DEFFBDBDFFC800FFC92BFFCD94FFCE64FFD2B3FFE639FFE673FFEDB3FFEE6DFFEEC5FFFF00FFFF66FFFFFAFFFFFF \ No newline at end of file diff --git a/tools/gamedata/shockwave/furnidata.txt b/tools/gamedata/shockwave/furnidata.txt new file mode 100644 index 0000000..440b2ee --- /dev/null +++ b/tools/gamedata/shockwave/furnidata.txt @@ -0,0 +1 @@ +[["s","1","rare_parasol*0","15444","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#9EFF1C","Green Parasol","Block those rays!"],["i","2","floor","0","","","","","",""],["i","33","wallpaper","0","","","","","",""],["s","34","nest","0","0","1","1","0,0,0","Basket","Night, night"],["s","35","nest","0","0","1","1","0,0,0","Basket","Night, night"],["s","36","nest","0","0","1","1","0,0,0","Basket","Night, night"],["s","41","petfood1","13144","2","1","1","0,0","Bones Mega Multipack","Fantastic 20% Saving!"],["s","42","petfood2","13144","2","1","1","0","Sardines Mega Multipack","Fantastic 20% Saving!"],["s","43","petfood3","13144","2","1","1","0,0,0","Cabbage Mega Multipack","Fantastic 20% Saving!"],["s","44","petfood4","13144","2","1","1","0,0","T-Bones Mega Multipack","Fantastic 20% Saving!"],["s","45","waterbowl*1","13144","2","1","1","#ff3f3f,#ffffff,#ffffff","Red Water Bowl","Aqua unlimited"],["s","46","waterbowl*2","13144","2","1","1","#3fff3f,#ffffff,#ffffff","Green Water Bowl","Aqua unlimited"],["s","47","waterbowl*3","13144","2","1","1","#ffff00,#ffffff,#ffffff","Yellow Water Bowl","Aqua unlimited"],["s","48","waterbowl*4","13144","2","1","1","#0099ff,#ffffff,#ffffff","Blue Water Bowl","Aqua unlimited"],["s","49","waterbowl*5","13144","2","1","1","#bf7f00,#ffffff,#ffffff","Brown Water Bowl","Aqua unlimited"],["s","50","goodie2","13144","2","1","1","0","Chocolate Mouse","For gourmet kittens"],["s","51","goodie1","13144","2","1","1","#ff4cbf,#ffffff","Marzipan Man","Crunchy Dog Treat"],["s","52","goodie1*1","13144","2","1","1","#3fffff,#ffffff","Marzipan Man","Crunchy Dog Treat"],["s","53","goodie1*2","13144","2","1","1","#ffbf00,#ffffff","Marzipan Man","Crunchy Dog Treat"],["s","54","toy1","13144","2","1","1","#ff0000,#ffff00,#ffffff,#ffffff","Rubber Ball","it's bouncy-tastic"],["s","55","toy1*1","13144","2","1","1","#ff7f00,#007f00,#ffffff,#ffffff","Rubber Ball","it's bouncy-tastic"],["s","56","toy1*2","13144","2","1","1","#003f7f,#ff00bf,#ffffff,#ffffff","Rubber Ball","it's bouncy-tastic"],["s","57","toy1*3","13144","2","1","1","#bf1900,#00bfbf,#ffffff,#ffffff","Rubber Ball","it's bouncy-tastic"],["s","58","toy1*4","13144","2","1","1","#000000,#ffffff,#ffffff,#ffffff","Rubber Ball","it's bouncy-tastic"],["s","59","arabian_bigtb","11385","0","3","2","","Amanjena Table","It must be Jinn-er time!"],["s","60","arabian_chair","4638","0","1","1","","Green Blossom Chair","Exotic, soft seating"],["s","61","arabian_divdr","4638","0","1","2","","Soft wooden screen","Carved Cedar Divider"],["s","62","arabian_pllw","11385","0","1","1","","Green Blossom Pillow","Exotic comfort"],["s","63","arabian_rug","11385","0","3","5","","Berber Kilim Rug","Green blossom design"],["s","64","arabian_snake","13603","0","1","1","","Ornamental Urn","Beware the snake!"],["i","65","arabian_swords","4638","","","","","Ancestral Scimitars","Not for yielding"],["s","66","arabian_teamk","13633","2","1","1","","Tea Maker","Quench that desert thirst"],["s","67","arabian_tetbl","4638","0","1","1","","Hexagonal Tea Table","Serve up a treat"],["s","68","arabian_tray1","4638","0","1","1","","Mint Tea Tray","Tea for every occasion"],["s","69","arabian_tray2","13603","0","1","1","","Candle Tray","For those Arabian nights"],["s","70","arabian_tray3","4638","0","1","1","","Sweets Tray","Indulge yourself!"],["s","71","arabian_tray4","4638","0","1","1","","Fruit Tray","Sweet, juicy and ripe"],["i","72","arabian_wndw","4638","","","","","Arabian Window Frame","Arabian days and nights"],["s","73","arabian_tray2","13603","0","1","1","","Candle Tray","For those Arabian nights"],["s","74","sound_set_62","6035","0","1","1","","Alhambra Trax 1","Music of the Arabian night!"],["s","75","sound_set_63","6035","0","1","1","","Alhambra Trax 2","Desert hits by the oasis!"],["s","76","sound_set_64","6035","0","1","1","","Alhambra Trax 3","Make a little Jinn-gle!"],["s","77","tile_marble","3438","0","1","1","","Marble Tile","Slick sophistication; now 10% off!"],["s","78","tile_brown","3438","0","1","1","","Red Tile","10% off downtown promenades & piazzas!"],["s","79","silo_studydesk","13603","0","2","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","Area Quest Desk","For the true Habbo Scholars"],["s","80","bed_silo_two","437","0","2","3","0,0,0","Double Bed","Plain and simple x2"],["s","81","bed_silo_one","11385","3","1","3","0,0,0","Single Bed","Plain and simple"],["s","82","shelves_silo","11385","0","2","1","0,0,0","Bookcase","For nic naks and art deco books"],["s","83","sofa_silo","1272","0","2","1","#ffffff,#ffffff,#ffffff,#ffffff,#ABD0D2,#ABD0D2,#ABD0D2,#ABD0D2","Two-Seater Sofa","Cushioned, understated comfort"],["s","84","sofachair_silo","11385","0","1","1","#ffffff,#ffffff,#ABD0D2,#ABD0D2","Armchair","Large, but worth it"],["s","85","table_silo_small","1272","0","1","1","#ffffff,#ABD0D2","Occasional Table","For those random moments"],["s","86","divider_silo3","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#ABD0D2","Gate (lockable)","Form following function"],["s","87","divider_silo2","3438","0","2","1","0,0,0","Screen","Stylish sectioning"],["s","88","divider_silo1","11385","0","1","1","#ffffff,#ABD0D2","Corner Shelf","Neat and natty"],["s","89","chair_silo","11385","0","1","1","#ffffff,#ffffff,#ABD0D2,#ABD0D2","Dining Chair","Keep it simple"],["s","90","safe_silo","13603","2","1","1","#FFFFFF,#ABD0D2,#ABD0D2,#FFFFFF","Safe Minibar","Totally shatter-proof!"],["s","91","barchair_silo","1272","0","1","1","#ffffff,#ABD0D2","Bar Stool","Practical and convenient"],["s","92","table_silo_med","11385","0","2","2","#ffffff,#ABD0D2","Coffee Table","Wipe clean and unobtrusive"],["i","93","habbowheel","13603","","","","","The Wheel of Destiny!","So you gotta ask yourself, 'Do I feel lucky?'"],["s","94","tv_luxus","13603","0","1","3","","Digital TV","Bang up to date"],["s","95","wood_tv","13603","0","1","2","","Large TV","HNN weatherman Kiazie"],["s","96","red_tv","13603","2","1","1","","Portable TV","Don?t miss those soaps"],["i","97","post.it","13603","0","0","0","","Pad of stickies","Pad of stickies"],["s","98","pizza","437","0","1","1","","Pizza Box","You dirty Habbo"],["s","99","drinks","437","0","1","1","","Empty Cans","Are you a slob too?"],["s","100","bottle","13603","0","1","1","","Empty Spinning Bottle","For interesting games!"],["s","101","edice","13603","0","1","1","0,0,0","Holo-dice","What's your lucky number?"],["s","102","habbocake","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF","Cake","Save me a slice!"],["s","103","menorah","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF","Menorah","Light up your room"],["s","106","wcandleset","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF","White Candle Plate","Simple but stylish"],["s","107","rcandleset","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF","Red Candle Plate","Simple but stylish"],["s","108","ham","437","0","1","1","0,0,0","Joint of Ham","Tuck in"],["s","109","hockey_light","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF","Lert","Set it off."],["s","110","barrier*1","13603","0","1","2","#FFFFFF,#FFFFFF,#FFCA28,#FFCA28,#FFFFFF","Yellow Maze Barrier","No escape this way!"],["s","111","barrier*2","13603","0","1","2","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","White Road Barrier","No trespassing, please!"],["s","112","barrier*3","13603","0","1","2","#FFFFFF,#FFFFFF,#CC3232,#CC3232,#FFFFFF","Red Road Barrier","No trespassing, please!"],["s","113","traffic_light*1","13603","2","1","1","#FFFFFF,#47738B,#FFFFFF","Classic Traffic Light","Chill and wait your turn!"],["s","114","traffic_light*2","13603","2","1","1","#FFFFFF,#2B95E5,#FFFFFF","Blue Traffic Light","Chill and wait your turn!"],["s","115","traffic_light*3","13603","2","1","1","#FFFFFF,#E0337A,#FFFFFF","Purple Traffic Light","Chill and wait your turn!"],["s","116","traffic_light*4","13603","2","1","1","#FFFFFF,#FFDD24,#FFFFFF","Yellow Traffic Light","Chill and wait your turn!"],["s","117","traffic_light*5","13603","2","1","1","#FFFFFF,#FFFFFF,#FFFFFF","White Traffic Light","Chill and wait your turn!"],["s","118","traffic_light*6","13603","2","1","1","#FFFFFF,#EF1D1D,#FFFFFF","Red Traffic Light","Chill and wait your turn!"],["s","119","wall_china","437","0","1","1","0,0,0","Dragon Screen","For your great wall"],["s","120","corner_china","437","0","1","1","0,0,0","Dragon Screen Corner","Firm, fireproof foundation"],["s","121","china_shelve","1272","0","2","1","0,0,0","Chinese Bookshelf","To hold the mind's treasures"],["s","122","china_table","437","0","1","1","0,0,0","Chinese Lacquer Table","Exotic and classy"],["s","123","chair_china","437","0","1","1","0,0,0","Chinese Lacquer Chair","The elegant beauty of tradition"],["s","126","cn_sofa","437","0","3","1","0,0,0","Chinese Sofa","Seats three with ease!"],["s","127","cn_lamp","13603","0","1","1","#FFFFFF,#FFFFFF","Lantern","Light of the East"],["s","128","bath","13603","0","1","2","","Bubble Bath","The ultimate in pampering"],["s","129","sink","13603","2","1","1","","Sink","Hot and cold thrown in for no charge"],["s","130","duck","437","0","1","1","","Rubber Duck","Every bather needs one"],["s","131","toilet","13603","0","1","1","","Loo Seat","Loo Seat"],["s","132","toilet_red","13603","0","1","1","","Loo Seat","Loo Seat"],["s","133","toilet_yell","13603","0","1","1","","Loo Seat","Loo Seat"],["s","134","tile","437","0","4","4","","Floor Tiles","In a choice of colours"],["s","135","tile_red","437","0","4","4","","Floor Tiles","In a choice of colours"],["s","136","tile_yell","437","0","4","4","","Floor Tiles","In a choice of colours"],["s","137","bardesk_polyfon*5","11385","0","2","1","#ffffff,#ffffff,#FF9BBD,#FF9BBD","Candy Bar","For cute constructions"],["s","138","bardeskcorner_polyfon*5","11385","0","1","1","#ffffff,#FF9BBD","Candy Corner","For sweet corners!"],["s","139","divider_poly3*5","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#EE7EA4,#EE7EA4","Candy Hatch (Lockable)","Keep the Pink in!"],["s","140","sofachair_polyfon_girl","1272","0","1","1","#ffffff,#ffffff,#EE7EA4,#EE7EA4","Armchair","Think pink"],["s","141","sofa_polyfon_girl","3438","0","2","1","#ffffff,#ffffff,#ffffff,#ffffff,#EE7EA4,#EE7EA4,#EE7EA4,#EE7EA4","Two-seater Sofa","Romantic pink for two"],["s","142","carpet_polar*1","10278","0","2","3","#ffbbcf,#ffbbcf,#ffddef","Pink Faux-Fur Bear Rug","Cute"],["s","143","bed_polyfon_girl_one","3987","0","1","3","#ffffff,#ffffff,#ffffff,#EE7EA4,#EE7EA4","Single Bed","Snuggle down in princess pink"],["s","144","bed_polyfon_girl","1272","0","2","3","#ffffff,#ffffff,#EE7EA4,#EE7EA4","Double Bed","Snuggle down in princess pink"],["s","145","camera","0","0","1","1","0,0,0","Camera","Smile!"],["s","215","glass_shelf","11385","0","2","1","0,0","Glass shelf","Translucent beauty"],["s","216","glass_sofa","11385","0","2","1","#ffffff,#ABD0D2,#ABD0D2,#ffffff,#ffffff,#ABD0D2,#ffffff,#ABD0D2","Glass sofa","Translucent beauty"],["s","217","glass_table","11385","0","2","2","#ffffff,#ABD0D2,#ABD0D2,#ffffff","Glass table","Translucent beauty"],["s","218","glass_chair","11385","0","1","1","#ffffff,#ABD0D2,#ABD0D2,#ffffff","Glass chair","Translucent beauty"],["s","219","glass_stool","11385","0","1","1","#ffffff,#ABD0D2,#ABD0D2,#ffffff","Glass stool","Translucent beauty"],["s","220","glass_sofa*2","11385","0","2","1","#ffffff,#525252,#525252,#ffffff,#ffffff,#525252,#ffffff,#525252","Glass sofa","Translucent beauty"],["s","221","glass_table*2","11385","0","2","2","#ffffff,#525252,#525252,#ffffff","Glass table","Translucent beauty"],["s","222","glass_chair*2","11385","0","1","1","#ffffff,#525252,#525252,#ffffff","Glass chair","Translucent beauty"],["s","223","glass_stool*2","11385","0","1","1","#ffffff,#525252,#525252,#ffffff","Glass stool","Translucent beauty"],["s","224","glass_sofa*3","11385","0","2","1","#ffffff,#bfbfbf,#bfbfbf,#ffffff,#ffffff,#bfbfbf,#ffffff,#bfbfbf","White Glass Sofa","Translucent beauty"],["s","225","glass_table*3","11385","0","2","2","#ffffff,#bfbfbf,#bfbfbf,#ffffff","White Glass Table","Translucent beauty"],["s","226","glass_chair*3","11385","0","1","1","#ffffff,#bfbfbf,#bfbfbf,#ffffff","Glass chair","Translucent beauty"],["s","227","glass_stool*3","11385","0","1","1","#ffffff,#bfbfbf,#bfbfbf,#ffffff","White Glass Stool","Translucent beauty"],["s","228","glass_sofa*4","11385","0","2","1","#ffffff,#f7ebbc,#f7ebbc,#ffffff,#ffffff,#f7ebbc,#ffffff,#f7ebbc","Glass sofa","Translucent beauty"],["s","229","glass_table*4","11385","0","2","2","#ffffff,#f7ebbc,#f7ebbc,#ffffff","Glass table","Translucent beauty"],["s","230","glass_chair*4","11385","0","1","1","#ffffff,#f7ebbc,#f7ebbc,#ffffff","Glass chair","Translucent beauty"],["s","231","glass_stool*4","11385","0","1","1","#ffffff,#f7ebbc,#f7ebbc,#ffffff","Glass stool","Translucent beauty"],["s","232","glass_sofa*5","11385","0","2","1","#ffffff,#ee7ea4,#ee7ea4,#ffffff,#ffffff,#ee7ea4,#ffffff,#ee7ea4","Candy Glass Sofa","Double glazed"],["s","233","glass_table*5","11385","0","2","2","#ffffff,#ee7ea4,#ee7ea4,#ffffff","Candy Glass Table","Translucent beauty"],["s","234","glass_chair*5","11385","0","1","1","#ffffff,#ee7ea4,#ee7ea4,#ffffff","Candy Glass Chair","A pane that you're used to"],["s","235","glass_stool*5","11385","0","1","1","#ffffff,#ee7ea4,#ee7ea4,#ffffff","Candy Glass Stool","Clear a seat"],["s","236","glass_sofa*6","11385","0","2","1","#ffffff,#5eaaf8,#5eaaf8,#ffffff,#ffffff,#5eaaf8,#ffffff,#5eaaf8","Blue Glass Sofa","Translucent beauty"],["s","237","glass_table*6","11385","0","2","2","#ffffff,#5eaaf8,#5eaaf8,#ffffff","Blue Glass Table","Translucent beauty"],["s","238","glass_chair*6","11385","0","1","1","#ffffff,#5eaaf8,#5eaaf8,#ffffff","Blue Glass Chair","Translucent beauty"],["s","239","glass_stool*6","11385","0","1","1","#ffffff,#5eaaf8,#5eaaf8,#ffffff","Blue Glass Stool","Translucent beauty"],["s","240","glass_sofa*7","11385","0","2","1","#ffffff,#7cb135,#7cb135,#ffffff,#ffffff,#7cb135,#ffffff,#7cb135","Green Glass Sofa","Habbo Club"],["s","241","glass_table*7","11385","0","2","2","#ffffff,#7cb135,#7cb135,#ffffff","Green Glass Table","Habbo Club"],["s","242","glass_chair*7","11385","0","1","1","#ffffff,#7cb135,#7cb135,#ffffff","Green Glass Chair","Habbo Club"],["s","243","glass_stool*7","11385","0","1","1","#ffffff,#7cb135,#7cb135,#ffffff","Green Glass Stool","Habbo Club"],["s","244","glass_sofa*8","11385","0","2","1","#ffffff,#ffd837,#ffd837,#ffffff,#ffffff,#ffd837,#ffffff,#ffd837","Yellow Glass Sofa","Double glazed"],["s","245","glass_table*8","11385","0","2","2","#ffffff,#ffd837,#ffd837,#ffffff","Yellow Glass Table","Translucent beauty"],["s","246","glass_chair*8","11385","0","1","1","#ffffff,#ffd837,#ffd837,#ffffff","Yellow Glass Chair","A pane that you're used to"],["s","247","glass_stool*8","11385","0","1","1","#ffffff,#ffd837,#ffd837,#ffffff","Yellow Glass Stool","Clear a seat"],["s","248","glass_sofa*9","11385","0","2","1","#ffffff,#e14218,#e14218,#ffffff,#ffffff,#e14218,#ffffff,#e14218","Glass sofa","Translucent beauty"],["s","249","glass_table*9","11385","0","2","2","#ffffff,#e14218,#e14218,#ffffff","Glass table","Translucent beauty"],["s","250","glass_chair*9","11385","0","1","1","#ffffff,#e14218,#e14218,#ffffff","Glass chair","Translucent beauty"],["s","251","glass_stool*9","11385","0","1","1","#ffffff,#e14218,#e14218,#ffffff","Glass stool","Translucent beauty"],["s","2084","gothic_chair*1","56746","0","1","1","#ffffff,#ff9999,#ffffff,#ff9999","Gothic Chair Pink","The dark side of Habbo"],["s","2085","gothic_sofa*1","56746","0","2","1","#ffffff,#ff9999,#ffffff,#ffffff,#ff9999,#ffffff","Gothic Sofa Pink","The dark side of Habbo"],["s","2086","gothic_stool*1","56746","0","1","1","#ffffff,#ff9999,#ffffff","Gothic Stool Pink","The dark side of Habbo"],["s","2087","gothic_chair*2","56746","0","1","1","#ffffff,#ff9900,#ffffff,#ff9900","Gothic Chair Saffron","The dark side of Habbo"],["s","2088","gothic_sofa*2","56746","0","2","1","#ffffff,#ff9900,#ffffff,#ffffff,#ff9900,#ffffff","Gothic Sofa Saffron","The dark side of Habbo"],["s","2089","gothic_stool*2","56746","0","1","1","#ffffff,#ff9900,#ffffff","Gothic Stool Saffron","The dark side of Habbo"],["s","2090","gothic_chair*3","56746","0","1","1","#ffffff,#dd0000,#ffffff,#dd0000","Gothic Chair Red","The dark side of Habbo"],["s","2091","gothic_sofa*3","56746","0","2","1","#ffffff,#dd0000,#ffffff,#ffffff,#dd0000,#ffffff","Gothic Sofa Red","The dark side of Habbo"],["s","2092","gothic_stool*3","56746","0","1","1","#ffffff,#dd0000,#ffffff","Gothic Stool Red","The dark side of Habbo"],["s","2093","gothic_chair*4","56746","0","1","1","#ffffff,#555555,#ffffff,#555555","Black Gothic Chair","The dark side of Habbo"],["s","2094","gothic_sofa*4","56746","0","2","1","#ffffff,#555555,#ffffff,#ffffff,#555555,#ffffff","Black Gothic Sofa","The dark side of Habbo"],["s","2095","gothic_stool*4","56746","0","1","1","#ffffff,#555555,#ffffff","Black Gothic Stool","The dark side of Habbo"],["s","2096","gothic_chair*5","56746","0","1","1","#ffffff,#666600,#ffffff,#666600","Gothic Chair Green","The dark side of Habbo"],["s","2097","gothic_sofa*5","56746","0","2","1","#ffffff,#666600,#ffffff,#ffffff,#666600,#ffffff","Gothic Sofa Green","The dark side of Habbo"],["s","2098","gothic_stool*5","56746","0","1","1","#ffffff,#666600,#ffffff","Gothic Stool Green","The dark side of Habbo"],["s","2099","gothic_chair*6","56746","0","1","1","#ffffff,#336666,#ffffff,#336666","Gothic Chair Blue","The dark side of Habbo"],["s","2100","gothic_sofa*6","56746","0","2","1","#ffffff,#336666,#ffffff,#ffffff,#336666,#ffffff","Gothic Sofa Blue","The dark side of Habbo"],["s","2101","gothic_stool*6","56746","0","1","1","#ffffff,#336666,#ffffff","Gothic Stool Blue","The dark side of Habbo"],["s","255","gothic_carpet","804","0","2","4","","Cobbled Path","The path less travelled"],["s","256","gothic_carpet2","1522","0","2","4","","Dungeon Floor","What lies beneath?"],["s","257","goth_table","437","0","1","5","0,0,0","Gothic table","The dark side of Habbo"],["s","258","gothrailing","1272","0","2","1","0,0,0","Gothic Railing","The dark side of Habbo"],["i","259","torch","13603","","","","","Gothic Torch","The dark side of Habbo"],["i","260","gothicfountain","13603","","","","","Gothic Ectoplasm Fountain","Not suitable for drinking!"],["s","261","gothiccandelabra","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF","Gothic Candelabra","The dark side of Habbo"],["s","262","gothgate","13603","0","2","1","#FFFFFF,#FFFFFF,#FFFFFF","Gothic Portcullis","The dark side of Habbo"],["i","263","industrialfan","13603","","","","","Industrial Turbine","Powerful and resilient"],["s","264","grunge_barrel","13603","0","1","1","","Flaming Barrel","Beacon of light!"],["s","265","grunge_bench","4134","0","3","1","","Bench","Laid back seating"],["s","266","grunge_candle","13603","0","1","1","","Candle Box","Late night debate"],["s","267","grunge_chair","11385","0","1","1","","Grunge Chair","Alternative chair for alternative people"],["s","268","grunge_mattress","2818","0","3","1","","Grunge Mattress","Beats sleeping on the floor!"],["s","269","grunge_radiator","2818","2","1","1","","Radiator","Started cool but now it's hot!"],["s","270","grunge_shelf","13144","0","3","1","","Grunge Bookshelf","Scrap books and photo albums"],["s","271","grunge_sign","2818","2","1","1","","Road Sign","Bought legitimately from an M1 cafe."],["s","272","grunge_table","2818","0","2","2","","Grunge Table","Students of the round table!"],["s","273","CF_1_coin_bronze","986","0","1","1","0,0,0","Bronze Coin","Worth 1 Credits"],["s","274","CF_5_coin_silver","986","0","1","1","0,0,0","Silver Coin","Worth 5 Credits"],["s","275","CF_10_coin_gold","986","0","1","1","0,0,0","Gold Coin","Worth 10 Credits"],["s","276","CF_20_moneybag","986","0","1","1","0,0,0","Sack of Credits","Worth 20 Credits"],["s","277","CF_50_goldbar","986","0","1","1","0,0,0","Gold Bar","Worth 50 Credits"],["s","278","CFC_10_coin_bronze","986","0","1","1","0,0,0","Bronze Coin (China)","Worth 10 Credits"],["s","279","CFC_50_coin_silver","986","0","1","1","0,0,0","Silver Coin (China)","Worth 50 Credits"],["s","280","CFC_100_coin_gold","986","0","1","1","0,0,0","Gold Coin (China)","Worth 100 Credits"],["s","281","CFC_200_moneybag","986","0","1","1","0,0,0","Sack of Credits (China)","Worth 200 Credits"],["s","282","CFC_500_goldbar","986","0","1","1","0,0,0","Gold Bar (China)","Worth 500 Credits"],["s","283","habbowood_chair","1821","0","1","1","","Director's Chair","Exclusively for Directors"],["s","284","rope_divider","13603","0","2","1","#FFFFFF,#FFFFFF,#FFFFFF","Rope Divider","Rope Divider"],["s","285","spotlight","13603","0","1","1","","Habbowood Spotlight","For the star of the show"],["s","286","theatre_seat","13603","2","1","1","#FFFFFF,#FFFFFF","Deluxe Theatre Chair","For Lazy boys and girls!"],["s","287","rare_icecream_campaign","13603","2","1","1","","Rare icecream white","Basic model"],["i","288","habw_mirror","13603","","","","","Habbowood Mirror","Star of the show!"],["s","289","tile_stella","3438","0","1","1","","Star Tile","10% off the walk of fame!"],["s","290","chair_norja","1272","0","1","1","#ffffff,#ffffff,#F7EBBC,#F7EBBC","Chair","Sleek and chic for each cheek"],["s","291","couch_norja","1272","0","2","1","#ffffff,#ffffff,#ffffff,#ffffff,#F7EBBC,#F7EBBC,#F7EBBC,#F7EBBC","Bench","Two can perch comfortably"],["s","292","table_norja_med","2429","0","2","2","#ffffff,#F7EBBC","Coffee Table","Elegance embodied"],["s","293","shelves_norja","1272","0","1","1","#ffffff,#F7EBBC","Bookcase","For nic naks and art deco books"],["s","294","soft_sofachair_norja","10684","0","1","1","#ffffff,#F7EBBC,#F7EBBC","iced sofachair","Soft iced sofachair"],["s","295","soft_sofa_norja","10684","0","2","1","#ffffff,#F7EBBC,#ffffff,#F7EBBC,#F7EBBC,#F7EBBC","iced sofa","A soft iced sofa"],["s","296","divider_nor2","10684","0","2","1","#ffffff,#ffffff,#F7EBBC,#F7EBBC","Ice Bar-Desk","Strong, yet soft looking"],["s","297","divider_nor1","10684","0","1","1","#ffffff,#F7EBBC","Ice Corner","Looks squishy, but isn't"],["s","298","divider_nor3","15444","0","1","1","#FFFFFF,#FFFFFF,#F7EBBC,#F7EBBC","Door (Lockable)","Do go through..."],["s","299","divider_nor4","13603","0","2","1","#FFFFFF,#FFFFFF,#F7EBBC,#F7EBBC,#F7EBBC,#F7EBBC","Plain Iced Auto Shutter","Habbos, roll out!"],["s","300","divider_nor5","13603","0","1","1","#FFFFFF,#F7EBBC,#F7EBBC","Plain Iced Angle","Cool cornering for your crib y0!"],["s","301","jp_bamboo","1821","0","2","2","","Bamboo Forest","Watch out for pandas!"],["s","302","jp_pillow","1821","0","1","1","","Pillow Chair","Comfy and classical"],["s","303","jp_irori","13603","0","2","2","","Irori","Traditional heating and eating"],["s","304","jp_tatami","1821","0","2","2","","Small Tatami Mat","Shoes off please"],["s","305","jp_tatami2","6035","0","2","4","","Large Tatami Mat","Shoes off please"],["s","306","jp_lantern","13603","0","1","1","","Japanese Lantern","For a mellow Eastern glow"],["s","307","jp_drawer","13603","0","1","1","","Japanese Drawer","Spiritual home for odds and ends"],["i","308","jp_ninjastars","2116","","","","","Ninja Stars","Not a frisbee"],["i","309","jp_sheet1","4638","","","","","Kakejiku Ziritsu","Japanese Kakejiku"],["i","310","jp_sheet2","4638","","","","","Kakejiku Ninjya","Japanese Kakejiku"],["i","311","jp_sheet3","4638","","","","","Kakejiku Hokusai","Japanese Kakejiku"],["s","312","jp_tray1","4638","0","1","1","","Sushi Maguro","Sushi made with tuna"],["s","313","jp_tray2","4638","0","1","1","","Sushi Ika","Sushi made with squid"],["s","314","jp_tray3","4638","0","1","1","","Sushi Ikura","Sushi made with caviar"],["s","315","jp_tray4","4638","0","1","1","","Sushi Uni","Sushi made with sea urchin"],["s","316","jp_tray5","4638","0","1","1","","Sushi Tamago","Sushi made with egg"],["s","317","jp_tray6","4638","0","1","1","","Sushi Kohada","Sushi made with mackerel"],["s","318","bed_armas_two","11385","0","2","3","0,0,0","Double Bed","King-sized pine comfort"],["s","319","bed_armas_one","437","0","1","3","0,0,0","Single Bed","Rustic charm for one"],["s","320","fireplace_armas","13603","0","2","1","#FFFFFF,#FFFFFF,#FFFFFF","Fireplace","Authentic, real flame fire"],["s","321","bartable_armas","11385","0","1","3","","Bardesk","Bar-Style Table - essential for extra guests"],["s","322","table_armas","11385","0","2","2","0,0,0","Dining Table","For informal dining"],["s","323","bench_armas","11385","0","2","1","0,0,0","Bench","To complete the dining set"],["s","324","divider_arm3","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF","Gate (lockable)","Knock, knock..."],["s","325","divider_arm1","437","0","1","1","0,0,0","Corner plinth","Good solid wood"],["s","326","divider_arm2","437","0","2","1","0,0,0","Room divider","I wooden go there"],["s","327","shelves_armas","437","0","2","1","0,0,0","Bookcase","For all those fire-side stories"],["s","328","bar_armas","13603","2","1","1","","Barrel Minibar","It's a barrel of laughs and a great talking point"],["s","329","bar_chair_armas","437","0","1","1","","Barrel Stool","The ultimate recycled furniture"],["s","330","lamp_armas","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF","Table Lamp","Ambient lighting is essential"],["s","331","lamp2_armas","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF","Lodge Candle","Wax lyrical with some old-world charm"],["s","332","small_table_armas","650","0","1","1","0,0,0","Occasional Table","Practical and beautiful"],["s","333","small_chair_armas","437","0","1","1","0,0,0","Stool","Rustic charm at it's best"],["s","334","bed_polyfon","1272","0","2","3","#ffffff,#ffffff,#ABD0D2,#ABD0D2","Double Bed","Give yourself space to stretch out"],["s","335","bed_polyfon_one","3987","0","1","3","#ffffff,#ffffff,#ffffff,#ABD0D2,#ABD0D2","Single Bed","Cot of the artistic"],["s","336","fireplace_polyfon","13603","2","2","1","#FFFFFF,#FFFFFF,#FFFFFF","Fireplace","Comfort in stainless steel"],["s","337","sofa_polyfon","11385","0","2","1","#ffffff,#ffffff,#ffffff,#ffffff,#ABD0D2,#ABD0D2,#ABD0D2,#ABD0D2","Two-seater Sofa","Comfort for stylish couples"],["s","338","sofachair_polyfon","1272","0","1","1","#ffffff,#ffffff,#ABD0D2,#ABD0D2","Armchair","Soft and comfortable"],["s","339","bar_polyfon","13603","2","1","1","","Mini-Bar","You naughty Habbo!"],["s","340","divider_poly3","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#ABD0D2,#ABD0D2","Hatch (Lockable)","All bars should have one"],["s","341","bardesk_polyfon","11385","0","2","1","#ffffff,#ffffff,#ABD0D2,#ABD0D2","Bar/desk","Perfect for work or play"],["s","342","bardeskcorner_polyfon","11385","0","1","1","#ffffff,#ABD0D2","Corner Cabinet/Desk","Tuck it away"],["s","343","chair_polyfon","11385","0","1","1","0,0,0","Dining Chair","Dining Chair"],["s","344","table_polyfon","11385","0","2","2","","Large Coffee Table","For larger gatherings"],["s","345","table_polyfon_med","11385","0","2","2","0,0,0","Large Coffee Table","For larger gatherings"],["s","346","table_polyfon_small","437","0","2","2","0,0,0","Small Coffee Table","For serving a stylish latte"],["s","347","smooth_table_polyfon","11385","0","2","2","","Large Dining Table","For larger gatherings"],["s","348","stand_polyfon_z","650","0","1","1","0,0,0","Shelf","Tidy up"],["s","349","shelves_polyfon","11385","0","2","1","0,0,0","Bookcase","For the arty pad"],["s","356","giftflowers","13144","2","1","1","0,0,0","Vase of Flowers","Guaranteed to stay fresh"],["s","357","plant_rose","2429","0","1","1","","Cut Roses","Sleek and chic"],["s","358","plant_sunflower","2429","0","1","1","","Cut Sunflower","For happy Habbos"],["s","359","plant_yukka","2429","0","1","1","","Yukka Plant","Easy to care for"],["s","360","plant_pineapple","437","0","1","1","","Pineapple Plant","Needs loving glances"],["s","361","plant_bonsai","2429","0","1","1","","Bonsai Tree","You can be sure it lives"],["s","362","plant_big_cactus","11385","0","1","1","","Mature Cactus","Habbo Dreams monster in hiding! Shhhh"],["s","363","plant_fruittree","2429","0","1","1","","Fruit Tree","Great yield and sweet fruit"],["s","364","plant_small_cactus","2429","0","1","1","","Small Cactus","Even less watering than the real world"],["s","365","plant_maze","13144","2","2","1","","Maze Shrubbery","Build your maze!"],["s","366","plant_mazegate","13603","2","2","1","","Maze Shrubbery Gate","Did we make it?"],["s","367","plant_bulrush","804","0","1","1","","Bulrush","Ideal for the riverside"],["s","368","chair_plasto*16","11385","0","1","1","#ffffff,#CC3399,#ffffff,#CC3399","Chair","Hip plastic furniture"],["s","369","chair_plasto*15","11385","0","1","1","#ffffff,#FF97BA,#ffffff,#FF97BA","Chair","Hip plastic furniture"],["s","370","chair_plasto*5","11385","0","1","1","#ffffff,#54ca00,#ffffff,#54ca00","Chair","Hip plastic furniture"],["s","371","chair_plasto","11385","0","1","1","0,0,0","Chair","Hip plastic furniture"],["s","372","chair_plasto*8","11385","0","1","1","#ffffff,#c38d1a,#ffffff,#c38d1a","Chair","Hip plastic furniture"],["s","373","chair_plasto*7","11385","0","1","1","#ffffff,#ff6d00,#ffffff,#ff6d00","Chair","Hip plastic furniture"],["s","374","chair_plasto*1","11385","0","1","1","#ffffff,#ff1f08,#ffffff,#ff1f08","Chair","Hip plastic furniture"],["s","375","chair_plasto*4","11385","0","1","1","#ffffff,#ccddff,#ffffff,#ccddff","Chair","Hip plastic furniture"],["s","376","chair_plasto*6","11385","0","1","1","#ffffff,#3444ff,#ffffff,#3444ff","Chair","Hip plastic furniture"],["s","377","chair_plasto*3","11385","0","1","1","#ffffff,#ffee00,#ffffff,#ffee00","Chair","Hip plastic furniture"],["s","378","chair_plasto*2","11385","0","1","1","#ffffff,#99DCCC,#ffffff,#99DCCc","Chair","Hip plastic furniture"],["s","379","table_plasto_square*15","11385","0","1","1","#ffffff,#FF97BA","Occasional Table","Hip plastic furniture"],["s","380","table_plasto_square*14","11385","0","1","1","#ffffff,#CC3399","Occasional Table","Hip plastic furniture"],["s","381","table_plasto_square*1","11385","0","1","1","#ffffff,#ff1f08","Occasional Table","Hip plastic furniture"],["s","382","table_plasto_square*7","11385","0","1","1","#ffffff,#ff6d00","Square Dining Table","Hip plastic furniture"],["s","383","table_plasto_square","11385","0","1","1","0,0,0","Occasional Table","Hip plastic furniture"],["s","384","table_plasto_square*2","11385","0","1","1","#ffffff,#99DCCC","Round Dining Table","Hip plastic furniture"],["s","385","table_plasto_square*4","11385","0","1","1","#ffffff,#ccddff","Square Dining Table","Hip plastic furniture"],["s","386","table_plasto_square*6","11385","0","1","1","#ffffff,#3444ff","Square Dining Table","Hip plastic furniture"],["s","387","table_plasto_square*3","11385","0","1","1","#ffffff,#ffee00","Square Dining Table","Hip plastic furniture"],["s","388","table_plasto_square*9","11385","0","1","1","#ffffff,#533e10","Square Dining Table","Hip plastic furniture"],["s","389","table_plasto_square*5","11385","0","1","1","#ffffff,#54ca00","Square Dining Table","Hip plastic furniture"],["s","390","table_plasto_square*8","11385","0","1","1","#ffffff,#c38d1a","Square Dining Table","Hip plastic furniture"],["s","391","table_plasto_round*15","11385","0","2","2","#ffffff,#FF97BA","Occasional Table","Hip plastic furniture"],["s","392","table_plasto_round*14","11385","0","2","2","#ffffff,#CC3399","Occasional Table","Hip plastic furniture"],["s","393","table_plasto_round*7","11385","0","2","2","#ffffff,#ff6d00","Round Dining Table","Hip plastic furniture"],["s","394","table_plasto_round*1","11385","0","2","2","#ffffff,#ff1f08","Round Dining Table","Hip plastic furniture"],["s","395","table_plasto_round*2","11385","0","2","2","#ffffff,#99DCCC","Round Dining Table","Hip plastic furniture"],["s","396","table_plasto_round*4","11385","0","2","2","#ffffff,#ccddff","Square Dining Table","Hip plastic furniture"],["s","397","table_plasto_round*6","11385","0","2","2","#ffffff,#3444ff","Round Dining Table","Hip plastic furniture"],["s","398","table_plasto_round*3","11385","0","2","2","#ffffff,#ffee00","Round Dining Table","Hip plastic furniture?"],["s","399","table_plasto_round*9","11385","0","2","2","#ffffff,#533e10","Round Dining Table","Hip plastic furniture"],["s","400","table_plasto_round","11385","0","2","2","0,0,0","Round Dining Table","Hip plastic furniture"],["s","401","table_plasto_round*5","11385","0","2","2","#ffffff,#54ca00","Round Dining Table","Hip plastic furniture"],["s","402","table_plasto_round*8","11385","0","2","2","#ffffff,#c38d1a","Round Dining Table","Hip plastic furniture"],["s","403","table_plasto_bigsquare*15","11385","0","2","2","#ffffff,#FF97BA","Occasional Table","Hip plastic furniture"],["s","404","table_plasto_bigsquare*14","11385","0","2","2","#ffffff,#CC3399","Occasional Table","Hip plastic furniture"],["s","405","table_plasto_bigsquare*7","11385","0","2","2","#ffffff,#ff6d00","Square Dining Table","Hip plastic furniture"],["s","406","table_plasto_bigsquare*1","11385","0","2","2","#ffffff,#ff1f08","Square Dining Table","Hip plastic furniture"],["s","407","table_plasto_bigsquare*2","11385","0","2","2","#ffffff,#99DCCC","Square Dining Table","Hip plastic furniture"],["s","408","table_plasto_bigsquare","11385","0","2","2","0,0,0","Square Dining Table","Hip plastic furniture"],["s","409","table_plasto_bigsquare*8","11385","0","2","2","#ffffff,#c38d1a","Square Dining Table","Hip plastic furniture"],["s","410","table_plasto_bigsquare*5","11385","0","2","2","#ffffff,#54ca00","Square Dining Table","Hip plastic furniture"],["s","411","table_plasto_bigsquare*9","11385","0","2","2","#ffffff,#533e10","Square Dining Table","Hip plastic furniture"],["s","412","table_plasto_bigsquare*3","11385","0","2","2","#ffffff,#ffee00","Square Dining Table","Hip plastic furniture"],["s","413","table_plasto_bigsquare*6","11385","0","2","2","#ffffff,#3444ff","Square Dining Table","Hip plastic furniture"],["s","414","table_plasto_bigsquare*4","11385","0","2","2","#ffffff,#ccddff","Square Dining Table","Hip plastic furniture"],["s","415","table_plasto_4leg*6","11385","0","2","2","#ffffff,#3444ff","Occasional table Table","Hip plastic furniture"],["s","416","table_plasto_4leg*1","11385","0","2","2","#ffffff,#ff1f08","Square Dining Table","Hip plastic furniture"],["s","417","table_plasto_4leg*3","11385","0","2","2","#ffffff,#ffee00","Round Dining Table","Hip plastic furniture"],["s","418","table_plasto_4leg*9","11385","0","2","2","#ffffff,#533e10","Occasional Table","Hip plastic furniture"],["s","419","table_plasto_4leg","11385","0","2","2","0,0,0","Occasional Table","Hip plastic furniture"],["s","420","table_plasto_4leg*5","11385","0","2","2","#ffffff,#54ca00","Occasional Table","Hip plastic furniture"],["s","421","table_plasto_4leg*2","11385","0","2","2","#ffffff,#99DCCC","Occasional Table","Hip plastic furniture"],["s","422","table_plasto_4leg*8","11385","0","2","2","#ffffff,#c38d1a","Occasional Table","Hip plastic furniture"],["s","423","table_plasto_4leg*7","11385","0","2","2","#ffffff,#ff6d00","Occasional table","Hip plastic furniture"],["s","424","table_plasto_4leg*10","11385","0","2","2","#ffffff,#ccddff","Occasional Table","Hip plastic furniture"],["s","425","table_plasto_4leg*15","11385","0","2","2","#ffffff,#FF97BA","Occasional Table","Hip plastic furniture"],["s","426","table_plasto_4leg*16","11385","0","2","2","#ffffff,#CC3399","Occasional Table","Hip plastic furniture"],["s","427","chair_plasty","11385","0","1","1","0,0,0","Plastic Pod Chair","Hip plastic furniture"],["s","428","chair_plasty*1","11385","0","1","1","#ffffff,#8EB5D1,#ffffff,#8EB5D1","Plastic Pod Chair","Hip plastic furniture"],["s","429","chair_plasty*2","11385","0","1","1","#ffffff,#ff9900,#ffffff,#ff9900","Plastic Pod Chair","Hip plastic furniture"],["s","430","chair_plasty*3","11385","0","1","1","#ffffff,#ff2200,#ffffff,#ff2200","Plastic Pod Chair","Hip plastic furniture"],["s","431","chair_plasty*4","11385","0","1","1","#ffffff,#00cc00,#ffffff,#00cc00","Plastic Pod Chair","Hip plastic furniture"],["s","432","chair_plasty*5","11385","0","1","1","#ffffff,#3444ff,#ffffff,#3444ff","Plastic Pod Chair","Hip plastic furniture"],["s","433","chair_plasty*6","11385","0","1","1","#ffffff,#ffee00,#ffffff,#ffee00","Plastic Pod Chair","Hip plastic furniture"],["s","434","chair_plasty*7","11385","0","1","1","#ffffff,#99DCCc,#ffffff,#99DCCc","Plastic Pod Chair","Hip plastic furniture"],["s","435","chair_plasty*8","11385","0","1","1","#ffffff,#c38d1a,#ffffff,#c38d1a","Plastic Pod Chair","Hip plastic furniture"],["s","436","chair_plasty*9","11385","0","1","1","#ffffff,#533e10,#ffffff,#533e10","Plastic Pod Chair","Hip plastic furniture"],["s","437","chair_plasty*10","11385","0","1","1","#ffffff,#CC3399,#ffffff,#CC3399","Plastic Pod Chair","Hip plastic furniture"],["s","438","chair_plasty*11","11385","0","1","1","#ffffff,#FF97BA,#ffffff,#FF97BA","Plastic Pod Chair","Hip plastic furniture"],["s","439","chair_plasto*9","11385","0","1","1","#ffffff,#533e10,#ffffff,#533e10","Chair","Hip plastic furniture"],["s","440","shelves_basic","11385","0","2","1","0,0,0","Pura Shelves","Pura series 404 shelves"],["s","441","bar_basic","13603","2","1","1","","A Pura Minibar","A pura series 300 minibar"],["s","442","fridge","13603","2","1","1","#FFFFFF,#FFFFFF","Pura Refridgerator","Keep cool with a chilled snack or drink"],["s","443","lamp_basic","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","Pura Lamp","Switch on the atmosphere with this sophisticated light"],["s","444","bed_budgetb","2116","0","2","3","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","Plain Double Bed","Sweet dreams for two"],["s","445","bed_budgetb_one","2116","0","1","3","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","Plain Single Bed","All you need for a good night's kip"],["s","446","bed_budget","9559","0","2","3","#FFFFFF,#FFFFFF,#FFFFFF,#ABD0D2,#ABD0D2,#ABD0D2","Pura Bed","Comfortable, affordable!"],["s","447","bed_budget_one","9559","0","1","3","#FFFFFF,#FFFFFF,#FFFFFF,#ABD0D2,#ABD0D2,#ABD0D2","bed_budget_one","aquamarine"],["s","448","bed_budgetb","2116","0","2","3","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","Plain Double Bed","Sweet dreams for two"],["s","449","bed_budgetb_one","2116","0","1","3","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","Plain Single Bed","All you need for a good night's kip"],["s","450","bed_budget","9559","0","2","3","#FFFFFF,#FFFFFF,#FFFFFF,#ABD0D2,#ABD0D2,#ABD0D2","Pura Bed","Comfortable, affordable!"],["s","451","bed_budget_one","9559","0","1","3","#FFFFFF,#FFFFFF,#FFFFFF,#ABD0D2,#ABD0D2,#ABD0D2","bed_budget_one","aquamarine"],["s","452","bed_budgetb","2116","0","2","3","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","Plain Double Bed","Sweet dreams for two"],["s","453","bed_budgetb_one","2116","0","1","3","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","Plain Single Bed","All you need for a good night's kip"],["s","454","bed_budget","9559","0","2","3","#FFFFFF,#FFFFFF,#FFFFFF,#ABD0D2,#ABD0D2,#ABD0D2","Pura Bed","Comfortable, affordable!"],["s","455","bed_budget_one","9559","0","1","3","#FFFFFF,#FFFFFF,#FFFFFF,#ABD0D2,#ABD0D2,#ABD0D2","bed_budget_one","aquamarine"],["s","456","bed_budgetb","2116","0","2","3","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","Plain Double Bed","Sweet dreams for two"],["s","457","bed_budgetb_one","2116","0","1","3","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","Plain Single Bed","All you need for a good night's kip"],["s","458","bed_budget","9559","0","2","3","#FFFFFF,#FFFFFF,#FFFFFF,#ABD0D2,#ABD0D2,#ABD0D2","Pura Bed","Comfortable, affordable!"],["s","459","bed_budget_one","9559","0","1","3","#FFFFFF,#FFFFFF,#FFFFFF,#ABD0D2,#ABD0D2,#ABD0D2","bed_budget_one","aquamarine"],["s","460","bed_budgetb","2116","0","2","3","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","Plain Double Bed","Sweet dreams for two"],["s","461","bed_budgetb_one","2116","0","1","3","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","Plain Single Bed","All you need for a good night's kip"],["s","462","rclr_sofa","2116","0","2","1","","Polar Sofa","Snuggle up together"],["s","463","rclr_chair","1522","0","1","1","","Palm Chair","Watch out for coconuts"],["s","464","rclr_garden","13603","0","1","3","","Water Garden","Self watering"],["s","465","queue_tile1","11385","0","1","1","#ffffff,#ffffff,#ffffff,#ffffff","White Quest Roller","The power of movement"],["s","466","queue_tile1*1","11385","0","1","1","#ffffff,#FF7C98,#ffffff,#ffffff","Pink Habbo Roller","The power of movement"],["s","467","queue_tile1*2","11385","0","1","1","#ffffff,#FF3333,#ffffff,#ffffff","Red Habbo Roller","The power of movement"],["s","468","queue_tile1*3","11385","0","1","1","#ffffff,#6ED0A7,#ffffff,#ffffff","Aqua Habbo Roller","The power of movement"],["s","469","queue_tile1*4","11385","0","1","1","#ffffff,#FFAA2B,#ffffff,#ffffff","Gold Habbo Roller","The power of movement"],["s","470","queue_tile1*5","11385","0","1","1","#ffffff,#555A37,#ffffff,#ffffff","Black Habbo Roller","The power of movement"],["s","471","queue_tile1*6","11385","0","1","1","#ffffff,#A2E8FA,#ffffff,#ffffff","Blue Habbo Roller","The power of movement"],["s","472","queue_tile1*7","11385","0","1","1","#ffffff,#FC5AFF,#ffffff,#ffffff","Purple Habbo Roller","The power of movement"],["s","473","queue_tile1*8","11385","0","1","1","#ffffff,#1E8AA5,#ffffff,#ffffff","Navy Habbo Roller","The power of movement"],["s","474","queue_tile1*9","11385","0","1","1","#ffffff,#9AFF60,#ffffff,#ffffff","Green Habbo Roller","The power of movement"],["s","475","grand_piano*1","13603","0","2","2","#FFFFFF,#FF8B8B","Rose Quartz Piano Stool","Chopin's revolutionary instrument"],["s","476","romantique_pianochair*1","13144","0","1","1","#FFFFFF,#FF8B8B,#FFFFFF","Rose Quartz Piano Stool","Here sat the legend of 1900"],["s","477","romantique_divan*1","13144","0","2","1","#FFFFFF,#FFFFFF,#FFFFFF,#FF8B8B","Chaise-Longue","Recline in continental Rose Quartz comfort"],["s","478","romantique_chair*1","13144","0","1","1","#FFFFFF,#FF8B8B,#FFFFFF","Rose Quartz Chair","Elegant seating for elegant Habbos"],["s","479","romantique_divider*1","3438","0","2","1","#FF8B8B,#FF8B8B,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","Rose Quartz Screen","Beauty lies within"],["s","480","romantique_smalltabl*1","13144","2","1","1","#FFFFFF,#FF8B8B,#FFFFFF","Rose Quartz Tray Table","Every tray needs a table..."],["i","481","wallmirror","1522","","","","","Wallmirror","Mirror, mirror on the wall..."],["s","2145","romantique_tray1","13144","2","1","1","","Romantique Tray","Breakfast is served!"],["s","482","romantique_tray2","13144","2","1","1","","Romantique Treats Tray","Time to celebrate!"],["s","483","rom_lamp","13603","0","1","1","","Crystal Lamp","Light up your life"],["s","484","romantique_mirrortabl","15444","2","1","1","","Dressing Table","Get ready for your big date"],["s","485","romantique_clock","13603","0","1","1","","Grandfather's Clock","The most Romantic tick-tock ever!"],["s","486","carpet_standard","11385","0","3","5","0,0,0","Floor rug","Available in a variety of colours"],["s","487","carpet_standard*a","11385","0","3","5","#55AC00,#55AC00,#55AC00","Floor Rug","Available in a variety of colours"],["s","488","carpet_standard*b","11385","0","3","5","#336666,#336666,#336666","Floor Rug","Available in a variety of colours"],["s","489","carpet_standard*1","11385","0","3","5","#ff1f08","Floor Rug","Available in a variety of colours"],["s","490","carpet_standard*2","11385","0","3","5","#99DCCC","Floor Rug","Available in a variety of colours"],["s","491","carpet_standard*3","11385","0","3","5","#ffee00","Floor Rug","Available in a variety of colours"],["s","492","carpet_standard*4","11385","0","3","5","#ccddff","Floor Rug","Available in a variety of colours"],["s","493","carpet_standard*5","11385","0","3","5","#ddccff","Floor Rug","Available in a variety of colours"],["s","494","carpet_standard*6","11385","0","3","5","#777777","Floor Rug","Available in a variety of colours"],["s","495","carpet_standard*7","11385","0","3","5","#99CCFF,#99CCFF,#99CCFF","Floor Rug","Available in a variety of colours"],["s","496","carpet_standard*8","11385","0","3","5","#999966,#999966,#999966","Floor Rug","Available in a variety of colours"],["s","497","carpet_soft","2818","0","2","4","","Soft Wool Rug","Soft Wool Rug"],["s","498","carpet_soft*1","2818","0","2","4","#CC3333","Soft Wool Rug","Soft Wool Rug"],["s","499","carpet_soft*2","2818","0","2","4","#66FFFF","Soft Wool Rug","Soft Wool Rug"],["s","500","carpet_soft*3","2818","0","2","4","#FFCC99","Soft Wool Rug","Soft Wool Rug"],["s","501","carpet_soft*4","2818","0","2","4","#FFCCFF","Soft Wool Rug","Soft Wool Rug"],["s","502","carpet_soft*5","2818","0","2","4","#FFFF66","Soft Wool Rug","Soft Wool Rug"],["s","503","carpet_soft*6","2818","0","2","4","#669933","Soft Wool Rug","Soft Wool Rug"],["s","504","doormat_love","650","0","1","1","0,0,0","Doormat","Welcome Habbos in style"],["s","505","doormat_plain","3438","0","1","1","0,0,0","Doormat","Available in a variety of colours"],["s","506","doormat_plain*1","3438","0","1","1","#ff1f08","Doormat","Available in a variety of colours"],["s","507","doormat_plain*2","3438","0","1","1","#99DCCC","Doormat","Available in a variety of colours"],["s","508","doormat_plain*3","3438","0","1","1","#ffee00","Doormat","Available in a variety of colours"],["s","509","doormat_plain*4","3438","0","1","1","#ccddff","Doormat","Available in a variety of colours"],["s","510","doormat_plain*5","3438","0","1","1","#ddccff","Doormat","Available in a variety of colours"],["s","511","doormat_plain*6","3438","0","1","1","#777777","Doormat","Available in a variety of colours"],["s","512","carpet_armas","437","0","2","4","0,0,0","Hand-Woven Rug","Adds instant warmth"],["s","513","carpet_polar","10278","0","2","3","#ffffff,#ffffff,#ffffff","Faux-Fur Bear Rug","For cuddling up on"],["s","514","carpet_polar*2","10278","0","2","3","#ccddff,#ccddff,#ffffff","Blue Bear Rug","Snuggle up on a Funky bear rug..."],["s","515","carpet_polar*3","10278","0","2","3","#ffee99,#ffee99,#ffffff","Yellow Bear Rug","Snuggle up on a Funky bear rug..."],["s","516","carpet_polar*4","10278","0","2","3","#ddffaa,#ddffaa,#ffffff","Green Bear Rug","Snuggle up on a Funky bear rug..."],["s","520","hockey_score","13144","2","1","1","0,0,0","Scoreboard","...for keeping your score"],["s","521","legotrophy","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF","Basketball Trophy","For the winning team"],["s","523","carpet_legocourt","437","0","3","3","0,0,0","Basketball Court","Line up your slam dunk"],["s","524","bench_lego","437","0","4","1","0,0,0","Team Bench","For your reserve players"],["s","525","footylamp","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF","Football Lamp","Can you kick it?"],["s","526","sporttrack1*1","437","0","2","2","#ffffff,#e4592d,#ffffff","Sport track straight","Let's get sporty!"],["s","527","sporttrack1*2","437","0","2","2","#ffffff,#62818b,#ffffff","Sport track straight asphalt","Let's get sporty!"],["s","528","sporttrack1*3","437","0","2","2","#ffffff,#5cb800,#ffffff","Sport track straight grass","Let's get sporty!"],["s","529","sporttrack2*1","3835","0","2","2","#ffffff,#e4592d,#ffffff","Sport corner tartan","Let's get sporty!"],["s","530","sporttrack2*2","3835","0","2","2","#ffffff,#62818b,#ffffff","Sport corner asphalt","Let's get sporty!"],["s","531","sporttrack2*3","3835","0","2","2","#ffffff,#5cb800,#ffffff","Sport corner grass","Let's get sporty!"],["s","532","sporttrack3*1","437","0","2","2","#ffffff,#e4592d,#ffffff","Sport goal tartan","Let's get sporty!"],["s","533","sporttrack3*2","437","0","2","2","#ffffff,#62818b,#ffffff","Sport goal asphalt","Let's get sporty!"],["s","534","sporttrack3*3","437","0","2","2","#ffffff,#5cb800,#ffffff","Sport goal grass","Let's get sporty!"],["s","535","door","13603","2","1","1","","Telephone Box","Dr Who?"],["s","536","doorC","13603","2","1","1","","Portaloo","In a hurry?"],["s","537","doorB","13603","2","1","1","","Wardrobe","Narnia this way!"],["s","538","teleport_door","13603","0","1","1","","Teleport Door","Magic doorway to anywhere!"],["s","539","sound_machine","1272","0","1","1","#FFFFFF,#FFFFFF,#828282,#FFFFFF","Sound Machine","Creating fancy sounds"],["s","540","sound_set_4","6035","0","1","1","","Ambient 1","Chilled out beats"],["s","541","sound_set_8","6035","0","1","1","","Ambient 2","Mellow electric grooves"],["s","542","sound_set_6","6035","0","1","1","","Ambient 3","Background ambience loops"],["s","543","sound_set_5","6035","0","1","1","","Ambient 4","The dark side of Habbo"],["s","544","sound_set_26","6035","0","1","1","","Groove 1","Bollywood Beats!"],["s","545","sound_set_27","6035","0","1","1","","Groove 2","Jingle Bells will never be the same..."],["s","546","sound_set_17","6035","0","1","1","","Groove 3","Jive's Alive!"],["s","547","sound_set_18","6035","0","1","1","","Groove 4","Listen while you tan"],["s","548","sound_set_3","6035","0","1","1","","Electronic 1","Chilled grooves"],["s","549","sound_set_9","6035","0","1","1","","Electronic 2","Mystical ambient soundscapes"],["s","550","jukebox*1","7053","2","1","1","#FFFFFF,#FFFFFF","Jukebox","For your Happy Days!"],["s","552","sound_set_46","6035","0","1","1","","Club 1","De bada bada bo!"],["s","553","sound_set_47","6035","0","1","1","","Club 2","Storm the UKCharts!"],["s","554","sound_set_48","6035","0","1","1","","Club 3","Sweet party beat"],["s","555","sound_set_49","6035","0","1","1","","Club 4","You will belong"],["s","556","sound_set_50","6035","0","1","1","","Club 5","The harder generation"],["s","557","sound_set_51","6035","0","1","1","","Club 6","Bop to the beat"],["s","2633","sound_set_52","6035","0","1","1","","Club 7","State of Trancehouse"],["s","558","sound_set_25","6035","0","1","1","","Dance 1","Actually, it's Partay!"],["s","559","sound_set_29","6035","0","1","1","","Dance 2","Electronic house"],["s","560","sound_set_31","6035","0","1","1","","Dance 3","House loops"],["s","561","sound_set_11","6035","0","1","1","","Dance 4","Music you can really sink your teeth into"],["s","562","sound_set_13","6035","0","1","1","","Dance 5","Let Music be the food of Habbo"],["s","563","sound_set_35","6035","0","1","1","","Dance 6","Groovelicious"],["s","564","jukebox*1","7053","2","1","1","#FFFFFF,#FFFFFF","Jukebox","For your Happy Days!"],["i","565","guitar_v","2818","","","","","V Guitar",""],["i","566","guitar_skull","2818","","","","","Skull Guitar",""],["s","567","sound_set_21","6035","0","1","1","","Rock 1","Headbanging riffs"],["s","568","sound_set_28","6035","0","1","1","","Rock 2","Head for the pit!"],["s","569","sound_set_33","6035","0","1","1","","Rock 3","Guitar solo set"],["s","570","sound_set_40","6035","0","1","1","","Rock 4","Dude? Cheese!"],["s","571","sound_set_34","6035","0","1","1","","Rock 5","For guitar heroes"],["s","572","sound_set_38","6035","0","1","1","","Rock 6","Rock and Roses!"],["s","573","sound_set_39","6035","0","1","1","","Rock 7","Rock with a roll"],["s","574","sound_set_41","6035","0","1","1","","Rock 8","Burning Riffs"],["s","575","jukebox*1","7053","2","1","1","#FFFFFF,#FFFFFF","Jukebox","For your Happy Days!"],["s","576","sound_set_1","6035","0","1","1","","Habbo Sounds 1","Get the party started!"],["s","577","sound_set_12","6035","0","1","1","","Habbo Sounds 2","Unusual as Standard"],["s","578","sound_set_2","6035","0","1","1","","Habbo Sounds 3","Get the party started!"],["s","579","sound_set_24","6035","0","1","1","","Habbo Sounds 4","It's all about the Pentiums, baby!"],["s","580","sound_set_43","6035","0","1","1","","SFX 1","Beware zombies!"],["s","581","sound_set_20","6035","0","1","1","","SFX 2","Musical heaven"],["s","582","sound_set_22","6035","0","1","1","","SFX 3","With a hamper full of sounds, not sarnies"],["s","583","sound_set_23","6035","0","1","1","","SFX 4","Don't be afraid of the dark"],["s","584","sound_set_7","6035","0","1","1","","SFX 5","Sound effects for Furni"],["s","585","sound_set_30","6035","0","1","1","","Instrumental 1","Moments in love"],["s","586","sound_set_32","6035","0","1","1","","Instrumental 2","Piano concert set"],["s","587","sound_set_36","6035","0","1","1","","Latin Love 1","For adult minded"],["s","588","sound_set_60","6035","0","1","1","","Latin Love 2","Love and affection!"],["s","589","sound_set_61","6035","0","1","1","","Latin Love 3","Straight from the heart"],["s","590","sound_set_55","6035","0","1","1","","RnB Grooves 1","Can you fill me in?"],["s","591","sound_set_56","6035","0","1","1","","RnB Grooves 2","Get down tonight!"],["s","592","sound_set_57","6035","0","1","1","","RnB Grooves 3","Feel the groove"],["s","593","sound_set_58","6035","0","1","1","","RnB Grooves 4","Sh-shake it!"],["s","594","sound_set_59","6035","0","1","1","","RnB Grooves 5","Urban break beats"],["s","595","sound_set_15","6035","0","1","1","","RnB Grooves 6","Unadulterated essentials"],["s","596","sound_set_10","6035","0","1","1","","Hip Hop Beats 1","Made from real Boy Bands!"],["s","597","sound_set_14","6035","0","1","1","","Hip Hop Beats 2","Rock them bodies"],["s","598","sound_set_16","6035","0","1","1","","Hip Hop Beats 3","Ferry, ferry good!"],["s","599","sound_set_19","6035","0","1","1","","Hip Hop Beats 4","Shake your body!"],["s","600","prizetrophy*1","7057","0","1","1","#ffffff,#ffffff,#FFDD3F","Classic trophy","Glittery gold"],["s","601","prizetrophy*2","7057","0","1","1","#ffffff,#ffffff,#ffffff","Classic trophy","Shiny silver"],["s","602","prizetrophy*3","7057","0","1","1","#ffffff,#ffffff,#996600","Classic trophy","Breathtaking bronze"],["s","603","prizetrophy2*1","7057","0","1","1","#ffffff,#ffffff,#FFDD3F","Duck trophy","Glittery gold"],["s","604","prizetrophy2*2","7057","0","1","1","#ffffff,#ffffff,#ffffff","Duck trophy","Shiny silver"],["s","605","prizetrophy2*3","7057","0","1","1","#ffffff,#ffffff,#996600","Duck trophy","Breathtaking bronze"],["s","606","prizetrophy3*1","7057","0","1","1","#ffffff,#ffffff,#FFDD3F","Globe trophy","Glittery gold"],["s","607","prizetrophy3*2","7057","0","1","1","#ffffff,#ffffff,#ffffff","Globe trophy","Shiny silver"],["s","608","prizetrophy3*3","7057","0","1","1","#ffffff,#ffffff,#996600","Globe trophy","Breathtaking bronze"],["s","609","prizetrophy4*1","7057","0","1","1","#ffffff,#ffffff,#FFDD3F","Fish trophy","Glittery gold"],["s","610","prizetrophy4*2","7057","0","1","1","#ffffff,#ffffff,#ffffff","Fish trophy","Shiny silver"],["s","611","prizetrophy4*3","7057","0","1","1","#ffffff,#ffffff,#996600","Fish trophy","Breathtaking bronze"],["s","612","prizetrophy5*1","7057","0","1","1","#ffffff,#ffffff,#FFDD3F","Duo trophy","Glittery gold"],["s","613","prizetrophy5*2","7057","0","1","1","#ffffff,#ffffff,#ffffff","Duo trophy","Shiny silver"],["s","614","prizetrophy5*3","7057","0","1","1","#ffffff,#ffffff,#996600","Duo trophy","Breathtaking bronze"],["s","615","prizetrophy6*1","7057","0","1","1","#ffffff,#ffffff,#FFDD3F","Champion trophy","Glittery gold"],["s","616","prizetrophy6*2","7057","0","1","1","#ffffff,#ffffff,#ffffff","Champion trophy","Shiny silver"],["s","617","prizetrophy6*3","7057","0","1","1","#ffffff,#ffffff,#996600","Champion trophy","Breathtaking bronze"],["s","618","prizetrophy8*1","7057","0","1","1","#FFFFFF,#FFFFFF,#FFDD3F","Bubble trophy","Glittery gold"],["s","619","prizetrophy9*1","7057","0","1","1","#FFFFFF,#FFFFFF,#FFDD3F","Champion trophy","Glittery gold"],["s","635","tree1","1272","0","1","1","0,0,0","Dead tree","Dead christmas tree"],["s","636","tree2","694","0","1","1","0,0,0","Dead Tree","Creates a spooky scene!"],["s","637","tree3","437","0","1","1","0,0,0","Christmas Tree 1","Any presents under it yet?"],["s","638","tree4","13603","0","1","1","#FFFFFF,#FFFFFF","Christmas Tree 2","Any presents under it yet?"],["s","639","tree5","13603","0","1","1","#FFFFFF,#FFFFFF","Christmas Tree 3","Any presents under it yet?"],["s","640","tree6","3438","0","1","1","","Flashy Christmas Tree","The future's bright!"],["s","641","triplecandle","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF","Electric Candles","No need to worry about wax drips"],["s","642","turkey","437","0","1","1","0,0,0","Roast Turkey","Where's the cranberry sauce?"],["s","643","house","437","0","1","1","0,0,0","Gingerbread House","Good enough to eat"],["s","644","house2","437","0","1","1","","Gingerbread House","Good enough to eat"],["s","645","pudding","437","0","1","1","0,0,0","Christmas Pudding","Will you get the lucky sixpence?"],["s","646","xmasduck","13144","2","1","1","0,0,0","Christmas Rubber Duck","A right Christmas quacker!"],["s","647","hyacinth1","437","2","1","1","0,0,0","Pink Hyacinth","Beautiful bulb"],["s","648","hyacinth2","437","2","1","1","0,0,0","Blue Hyacinth","Beautiful bulb"],["s","649","joulutahti","437","2","1","1","0,0,0","Poinsetta","Christmas in a pot"],["s","650","rcandle","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF","Red Candle","Xmas tea light"],["s","651","wcandle","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF","White Candle","Xmas tea light"],["s","652","easterduck","13144","2","1","1","0,0,0","Wannabe bunny","Can you tell what it is yet?"],["s","653","birdie","13603","0","1","1","#FFFFFF,#FFFFFF","Pop-up Egg","Cheep (!) and cheerful"],["s","654","basket","13144","2","1","1","0,0,0","Basket Of Eggs","Eggs-actly what you want for Easter"],["s","655","bunny","437","0","1","1","0,0,0","Squidgy Bunny","Yours to cuddle up to"],["s","656","pumpkin","13603","0","1","1","#FFFFFF,#FFFFFF","Pumpkin Lamp","Cast a spooky glow"],["s","659","skullcandle","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF","Skull Candle Holder","Alas poor Yorrick..."],["s","662","deadduck","437","0","1","1","0,0,0","Dead Duck","Blood, but no guts"],["s","663","deadduck2","437","0","1","1","0,0,0","Dead Duck 2","Someone forgot to feed me..."],["s","664","deadduck3","437","0","1","1","0,0,0","Dead Duck 3","With added ectoplasm"],["s","667","ham2","437","0","1","1","0,0,0","Eaten Ham","Looks like you're too late!"],["s","668","habboween_crypt","13603","0","1","3","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","Creepy Crypt","What lurks inside?"],["s","669","habboween_grass","2818","0","2","2","","Unholy Ground","Autumnal chills with each rotation!"],["s","670","hal_cauldron","13603","2","1","1","","Habboween Cauldron","Eye of Habbo and toe of Mod!"],["s","671","hal_grave","13603","2","1","1","","Haunted Grave","We're raising the dead!"],["s","672","heartsofa","1272","0","2","1","0,0,0","Heart Sofa","Perfect for snuggling up on"],["s","673","statue","437","0","1","1","0,0,0","Cupid Statue","Watch out for those arrows!"],["s","674","heart","13144","2","2","1","0,0,0","Giant Heart","Full of love"],["s","675","valeduck","437","0","1","1","0,0,0","Valentine's Duck","He's lovestruck"],["i","676","post.it.vd","13603","0","0","0","","Heart Stickies","Spread your love!"],["s","677","carpet_valentine","1522","0","2","7","","Red carpet","For making an appearance"],["i","678","val_heart","13758","","","","","Heart Light","Heartbroken... without your love!"],["s","679","plant_valentinerose*1","13603","0","1","1","#FFFFFF,#FF1E1E,#FFFFFF,#FFFFFF","Red Valentine's Rose","Secret admirer!"],["s","680","plant_valentinerose*2","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","White Valentine's Rose","For the purest love"],["s","681","plant_valentinerose*3","13603","0","1","1","#FFFFFF,#FFE61E,#FFFFFF,#FFFFFF","Yellow Valentine's Rose","Relight your passions"],["s","682","plant_valentinerose*4","13603","0","1","1","#FFFFFF,#FF78C8,#FFFFFF,#FFFFFF","Pink Valentine's Rose","Be mine!"],["s","683","plant_valentinerose*5","13603","0","1","1","#FFFFFF,#C828FF,#FFFFFF,#FFFFFF","Purple Valentine's Rose","Requires purple rain to flourish"],["s","684","sofa_silo*2","1272","0","2","1","#ffffff,#ffffff,#ffffff,#ffffff,#525252,#525252,#525252,#525252","Black Two-Seater Sofa","Cushioned, understated comfort"],["s","685","sofachair_silo*2","11385","0","1","1","#ffffff,#ffffff,#525252,#525252","Black Armchair","Large, but worth it"],["s","686","table_silo_small*2","1272","0","1","1","#ffffff,#525252","Black Occasional Table","For those random moments"],["s","687","divider_silo3*2","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#525252","Black Area Gate","Form following function"],["s","688","divider_silo1*2","11385","0","1","1","#ffffff,#525252","Black Corner Shelf","Neat and natty"],["s","689","chair_silo*2","11385","0","1","1","#ffffff,#ffffff,#525252,#525252","Black Dining Chair","Keep it simple"],["s","690","safe_silo*2","13603","2","1","1","#FFFFFF,#525252,#525252,#FFFFFF","Black Safe Minibar","Totally shatter-proof!"],["s","691","barchair_silo*2","1272","0","1","1","#ffffff,#525252","Black Bar Stool","Practical and convenient"],["s","692","table_silo_med*2","11385","0","2","2","#ffffff,#525252","Black Coffee Table","Wipe clean and unobtrusive"],["s","693","sofa_silo*3","1272","0","2","1","#ffffff,#ffffff,#ffffff,#ffffff,#ffffff,#ffffff,#ffffff,#ffffff","White Two-Seater Sofa","Cushioned, understated comfort"],["s","694","sofachair_silo*3","11385","0","1","1","#ffffff,#ffffff,#ffffff,#ffffff","White Armchair","Large, but worth it"],["s","695","table_silo_small*3","1272","0","1","1","#ffffff,#ffffff","White Occasional Table","For those random moments"],["s","696","divider_silo3*3","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","White Area Gate","Form following function"],["s","697","divider_silo1*3","11385","0","1","1","#ffffff,#ffffff","White Corner Shelf","Neat and natty"],["s","698","chair_silo*3","11385","0","1","1","#ffffff,#ffffff,#ffffff,#ffffff","White Dining Chair","Keep it simple"],["s","699","safe_silo*3","13603","2","1","1","#FFFFFF,#BFBFBF,#BFBFBF,#FFFFFF","White Safe Minibar","Totally shatter-proof!"],["s","700","barchair_silo*3","1272","0","1","1","#ffffff,#ffffff","White Bar Stool","Practical and convenient"],["s","701","table_silo_med*3","11385","0","2","2","#ffffff,#ffffff","White Coffee Table","Wipe clean and unobtrusive"],["s","702","sofa_silo*4","1272","0","2","1","#ffffff,#ffffff,#ffffff,#ffffff,#F7EBBC,#F7EBBC,#F7EBBC,#F7EBBC","Beige Area Sofa","Beige Area Sofa"],["s","703","sofachair_silo*4","11385","0","1","1","#ffffff,#ffffff,#F7EBBC,#F7EBBC","Beige Area Armchair","Large, but worth it"],["s","704","table_silo_small*4","1272","0","1","1","#ffffff,#F7EBBC","Beige Area Occasional Table","Beige Area Occasional Table"],["s","705","divider_silo3*4","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#F7EBBC","Beige Area Gate","Beige Area Gate"],["s","706","divider_silo1*4","11385","0","1","1","#ffffff,#F7EBBC","Beige Area Corner Shelf","Beige Area Corner Shelf"],["s","707","chair_silo*4","11385","0","1","1","#ffffff,#ffffff,#F7EBBC,#F7EBBC","Beige Silo Dining Chair","Beige Silo Dining Chair"],["s","708","safe_silo*4","13603","2","1","1","#FFFFFF,#F7EBBC,#F7EBBC,#FFFFFF","Beige Safe Minibar","Totally shatter-proof!"],["s","709","barchair_silo*4","1272","0","1","1","#ffffff,#F7EBBC","Beige Bar Stool","Practical and convenient"],["s","710","table_silo_med*4","11385","0","2","2","#ffffff,#F7EBBC","Beige Area Coffee Table","Beige Area Coffee Table"],["s","711","sofa_silo*5","1272","0","2","1","#ffffff,#ffffff,#ffffff,#ffffff,#EE7EA4,#EE7EA4,#EE7EA4,#EE7EA4","Pink Area Sofa","Cushioned, understated comfort"],["s","712","sofachair_silo*5","11385","0","1","1","#ffffff,#ffffff,#EE7EA4,#EE7EA4","Pink Area Armchair","Large, but worth it"],["s","713","table_silo_small*5","1272","0","1","1","#ffffff,#EE7EA4","Pink Area Occasional Table","Pink Area Occasional Table"],["s","714","divider_silo3*5","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#EE7EA4","Pink Area Gate","Pink Area Gate"],["s","715","divider_silo1*5","11385","0","1","1","#ffffff,#EE7EA4","Pink Area Corner Shelf","Pink Area Corner Shelf"],["s","716","chair_silo*5","11385","0","1","1","#ffffff,#ffffff,#EE7EA4,#EE7EA4","Pink Silo Dining Chair","Pink Silo Dining Chair"],["s","717","safe_silo*5","13603","2","1","1","#FFFFFF,#EE7EA4,#EE7EA4,#FFFFFF","Pink Safe Minibar","Totally shatter-proof!"],["s","718","barchair_silo*5","1272","0","1","1","#ffffff,#ee7ea4","Pink Bar Stool","Practical and convenient"],["s","719","table_silo_med*5","11385","0","2","2","#ffffff,#EE7EA4","Pink Area Coffee Table","Pink Area Coffee Table"],["s","720","sofa_silo*6","1272","0","2","1","#ffffff,#ffffff,#ffffff,#ffffff,#5EAAF8,#5EAAF8,#5EAAF8,#5EAAF8","Blue Area Sofa","Cushioned, understated comfort"],["s","721","sofachair_silo*6","11385","0","1","1","#ffffff,#ffffff,#5EAAF8,#5EAAF8","Blue Area Armchair","Large, but worth it"],["s","722","table_silo_small*6","1272","0","1","1","#ffffff,#5EAAF8","Blue Area Occasional Table","Small and elegant"],["s","723","divider_silo3*6","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#5EAAF8","Blue Area Gate","Door (lockable)"],["s","724","divider_silo1*6","11385","0","1","1","#ffffff,#5EAAF8","Blue Area Corner Shelf","Tuck it away!"],["s","725","chair_silo*6","11385","0","1","1","#ffffff,#ffffff,#5EAAF8,#5EAAF8","Blue Area Dining Chair","Wooden dining chair"],["s","726","safe_silo*6","13603","2","1","1","#FFFFFF,#5EAAF8,#5EAAF8,#FFFFFF","Blue Safe Minibar","Totally shatter-proof!"],["s","727","barchair_silo*6","1272","0","1","1","#ffffff,#5eaaf8","Blue Bar Stool","Take a perch!"],["s","728","table_silo_med*6","11385","0","2","2","#ffffff,#5EAAF8","Blue Area Coffee Table","Gather everyone round"],["s","729","sofa_silo*7","1272","0","2","1","#ffffff,#ffffff,#ffffff,#ffffff,#7CB135,#7CB135,#7CB135,#7CB135","Green Area Sofa","Cushioned, understated comfort"],["s","730","sofachair_silo*7","11385","0","1","1","#ffffff,#ffffff,#7CB135,#7CB135","Green Area Armchair","Large, but worth it"],["s","731","table_silo_small*7","1272","0","1","1","#ffffff,#7CB135","Green Area Occasional Table","Small and elegant"],["s","732","divider_silo3*7","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#7CB135","Green Area Gate","Door (lockable)"],["s","733","divider_silo1*7","11385","0","1","1","#ffffff,#7CB135","Green Area Corner Shelf","Tuck it away!"],["s","734","chair_silo*7","11385","0","1","1","#ffffff,#ffffff,#7CB135,#7CB135","Green Area Dining Chair","Wooden dining chair"],["s","735","safe_silo*7","13603","2","1","1","#FFFFFF,#7CB135,#7CB135,#FFFFFF","Green Safe Minibar","Totally shatter-proof!"],["s","736","barchair_silo*7","1272","0","1","1","#ffffff,#7cb135","Green Bar Stool","Take a perch!"],["s","737","table_silo_med*7","11385","0","2","2","#ffffff,#7CB135","Green Area Coffee Table","Gather everyone round"],["s","738","sofa_silo*8","1272","0","2","1","#ffffff,#ffffff,#ffffff,#ffffff,#FFD837,#FFD837,#FFD837,#FFD837","Yellow Two-Seater Sofa","Cushioned, understated comfort"],["s","739","sofachair_silo*8","11385","0","1","1","#ffffff,#ffffff,#FFD837,#FFD837","Yellow Armchair","Large, but worth it"],["s","740","table_silo_small*8","1272","0","1","1","#ffffff,#FFD837","Yellow Occasional Table","For those random moments"],["s","741","divider_silo3*8","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFD837","Yellow Area Gate","Form following function"],["s","742","divider_silo1*8","11385","0","1","1","#ffffff,#FFD837","Yellow Corner Shelf","Neat and natty"],["s","743","chair_silo*8","11385","0","1","1","#ffffff,#ffffff,#FFD837,#FFD837","Yellow Dining Chair","Keep it simple"],["s","744","safe_silo*8","13603","2","1","1","#FFFFFF,#FFD837,#FFD837,#FFFFFF","Yellow Safe Minibar","Totally shatter-proof!"],["s","745","barchair_silo*8","1272","0","1","1","#ffffff,#ffd837","Yellow Bar Stool","Practical and convenient"],["s","746","table_silo_med*8","11385","0","2","2","#ffffff,#FFD837","Yellow Coffee Table","Wipe clean and unobtrusive"],["s","747","sofa_silo*9","1272","0","2","1","#ffffff,#ffffff,#ffffff,#ffffff,#E14218,#E14218,#E14218,#E14218","Red Area Sofa","Cushioned, understated comfort"],["s","748","sofachair_silo*9","11385","0","1","1","#ffffff,#ffffff,#E14218,#E14218","Red Area Armchair","Large, but worth it"],["s","749","table_silo_small*9","1272","0","1","1","#ffffff,#E14218","Red Area Occasional Table","Red Area Occasional Table"],["s","750","divider_silo3*9","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#E14218","Red Area Gate","Red Area Gate"],["s","751","divider_silo1*9","11385","0","1","1","#ffffff,#E14218","Red Area Corner Shelf","Tuck it away"],["s","752","chair_silo*9","11385","0","1","1","#ffffff,#ffffff,#E14218,#E14218","Red Area Dining Chair","Wooden dining chair"],["s","753","safe_silo*9","13603","2","1","1","#FFFFFF,#E14218,#E14218,#FFFFFF","Red Safe Minibar","Totally shatter-proof!"],["s","754","barchair_silo*9","1272","0","1","1","#ffffff,#e14218","Red Bar Stool","Practical and convenient"],["s","755","table_silo_med*9","11385","0","2","2","#ffffff,#E14218","Red Area Coffee Table","Red Area Coffee Table"],["s","756","chair_norja*2","1272","0","1","1","#ffffff,#ffffff,#525252,#525252","Black Iced Chair","Sleek and chic for each cheek"],["s","757","couch_norja*2","1272","0","2","1","#ffffff,#ffffff,#ffffff,#ffffff,#525252,#525252,#525252,#525252","Black Iced Bench","Two can perch comfortably"],["s","758","table_norja_med*2","2429","0","2","2","#ffffff,#525252","Black Iced Table","For larger gatherings"],["s","759","shelves_norja*2","1272","0","1","1","#ffffff,#525252","Black Iced Bookcase","For nic naks and art deco books"],["s","760","soft_sofachair_norja*2","10684","0","1","1","#ffffff,#525252,#525252","Black Iced Sofachair","Black Iced Sofachair"],["s","761","soft_sofa_norja*2","10684","0","2","1","#ffffff,#525252,#ffffff,#525252,#525252,#525252","Black Iced Sofa","Black Iced Sofa"],["s","762","divider_nor2*2","10684","0","2","1","#ffffff,#ffffff,#525252,#525252","Black Iced Bar-Desk","Soft but sturdy"],["s","763","divider_nor1*2","10684","0","1","1","#ffffff,#525252","Black Iced Corner","Tuck it away"],["s","764","divider_nor3*2","15444","0","1","1","#FFFFFF,#FFFFFF,#525252,#525252","Black Iced Gate","No way through, or is there?"],["s","765","divider_nor4*2","13603","0","2","1","#FFFFFF,#FFFFFF,#525252,#525252,#525252,#525252","Black Iced Auto Shutter","Habbos, roll out!"],["s","766","divider_nor5*2","13603","0","1","1","#FFFFFF,#525252,#525252","Black Iced Angle","Cool cornering for your crib y0!"],["s","767","chair_norja*3","1272","0","1","1","#ffffff,#ffffff,#ffffff,#ffffff","White Iced Chair","Sleek and chic for each cheek"],["s","768","couch_norja*3","1272","0","2","1","#ffffff,#ffffff,#ffffff,#ffffff,#ffffff,#ffffff,#ffffff,#ffffff","White Iced Bench","Two can perch comfortably"],["s","769","table_norja_med*3","2429","0","2","2","#ffffff,#FFFFFF","White Iced Table","For larger gatherings"],["s","770","shelves_norja*3","1272","0","1","1","#ffffff,#ffffff","White Iced Bookcase","For nic naks and art deco books"],["s","771","soft_sofachair_norja*3","10684","0","1","1","#ffffff,#ffffff,#ffffff","White Iced Sofachair","Soft Iced sofachair"],["s","772","soft_sofa_norja*3","10684","0","2","1","#ffffff,#ffffff,#ffffff,#ffffff,#ffffff,#ffffff","White Iced Sofa","Pristine white, keep it clean!"],["s","773","divider_nor2*3","10684","0","2","1","#ffffff,#ffffff,#ffffff,#ffffff","White Iced Bar-Desk","Strong, yet soft looking"],["s","774","divider_nor1*3","10684","0","1","1","#ffffff,#ffffff","White Iced Corner","Looks squishy, but isn't!"],["s","775","divider_nor3*3","15444","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","White Iced Gate","Do go through..."],["s","776","divider_nor4*3","13603","0","2","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","White Iced Auto Shutter","Habbos, roll out!"],["s","777","divider_nor5*3","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF","White Iced Angle","Cool cornering for your crib y0!"],["s","778","chair_norja*4","1272","0","1","1","#ffffff,#ffffff,#ABD0D2,#ABD0D2","Urban Iced Chair","Sleek and chic for each cheek"],["s","779","couch_norja*4","1272","0","2","1","#ffffff,#ffffff,#ffffff,#ffffff,#ABD0D2,#ABD0D2,#ABD0D2,#ABD0D2","Urban Iced Bench","Two can perch comfortably"],["s","780","table_norja_med*4","2429","0","2","2","#ffffff,#ABD0D2","Urban Iced Coffee Table","For larger gatherings"],["s","781","shelves_norja*4","1272","0","1","1","#ffffff,#ABD0D2","Urban Iced Bookcase","For nic naks and tech books"],["s","782","soft_sofachair_norja*4","10684","0","1","1","#ffffff,#ABD0D2,#ABD0D2","Urban Iced Sofachair","Sit back and relax"],["s","783","soft_sofa_norja*4","10684","0","2","1","#ffffff,#ABD0D2,#ffffff,#ABD0D2,#ABD0D2,#ABD0D2","Urban Iced Sofa","Sit back and relax"],["s","784","divider_nor2*4","10684","0","2","1","#ffffff,#ffffff,#ABD0D2,#ABD0D2","Urban Iced Bar","No way through"],["s","785","divider_nor1*4","10684","0","1","1","#ffffff,#ABD0D2","Urban Iced Corner","The missing piece"],["s","786","divider_nor3*4","15444","0","1","1","#FFFFFF,#FFFFFF,#ABD0D2,#ABD0D2","Urban Iced Gate","Entrance or exit?"],["s","787","divider_nor4*4","13603","0","2","1","#FFFFFF,#FFFFFF,#ABD0D2,#ABD0D2,#ABD0D2,#ABD0D2","Urban Iced Shutter","Habbos, roll out!"],["s","788","divider_nor5*4","13603","0","1","1","#FFFFFF,#ABD0D2,#ABD0D2","Urban Iced Angle","Cool cornering for your crib!"],["s","789","chair_norja*5","1272","0","1","1","#ffffff,#ffffff,#EE7EA4,#EE7EA4","Pink Chair","Sleek and chic for each cheek"],["s","790","couch_norja*5","1272","0","2","1","#ffffff,#ffffff,#ffffff,#ffffff,#EE7EA4,#EE7EA4,#EE7EA4,#EE7EA4","Pink Bench","Two can perch comfortably"],["s","791","table_norja_med*5","2429","0","2","2","#ffffff,#EE7EA4","Large Coffee Table Pink","For larger gatherings"],["s","792","shelves_norja*5","1272","0","1","1","#ffffff,#EE7EA4","Pink Bookcase","For nic naks and art deco books"],["s","793","soft_sofachair_norja*5","10684","0","1","1","#ffffff,#EE7EA4,#EE7EA4","Pink Iced Sofachair","Pink Iced Sofachair"],["s","794","soft_sofa_norja*5","10684","0","2","1","#ffffff,#EE7EA4,#ffffff,#EE7EA4,#EE7EA4,#EE7EA4","Pink Iced Sofa","Pink Iced Sofa"],["s","795","divider_nor2*5","10684","0","2","1","#ffffff,#ffffff,#EE7EA4,#EE7EA4","Pink Iced bar desk","Pink Iced bar desk"],["s","796","divider_nor1*5","10684","0","1","1","#ffffff,#EE7EA4","Pink Ice corner","Pink Ice corner"],["s","797","divider_nor3*5","15444","0","1","1","#FFFFFF,#FFFFFF,#EE7EA4,#EE7EA4","Pink Iced gate","Pink Iced gate"],["s","798","divider_nor4*5","13603","0","2","1","#FFFFFF,#FFFFFF,#EE7EA4,#EE7EA4,#EE7EA4,#EE7EA4","Pink Iced Auto Shutter","Habbos, roll out!"],["s","799","divider_nor5*5","13603","0","1","1","#FFFFFF,#EE7EA4,#EE7EA4","Pink Iced Angle","Cool cornering for your crib y0!"],["s","800","chair_norja*6","1272","0","1","1","#ffffff,#ffffff,#5EAAF8,#5EAAF8","Blue Chair","Sleek and chic for each cheek"],["s","801","couch_norja*6","1272","0","2","1","#ffffff,#ffffff,#ffffff,#ffffff,#5EAAF8,#5EAAF8,#5EAAF8,#5EAAF8","Blue Bench","Two can perch comfortably"],["s","802","table_norja_med*6","2429","0","2","2","#ffffff,#5EAAF8","Large Coffee Table Blue","For larger gatherings"],["s","803","shelves_norja*6","1272","0","1","1","#ffffff,#5EAAF8","Blue Bookcase","For nic naks and art deco books"],["s","804","soft_sofachair_norja*6","10684","0","1","1","#ffffff,#5EAAF8,#5EAAF8","Blue Iced Sofachair","Blue Iced Sofachair"],["s","805","soft_sofa_norja*6","10684","0","2","1","#ffffff,#5EAAF8,#ffffff,#5EAAF8,#5EAAF8,#5EAAF8","Blue Iced Sofa","A soft leather sofa"],["s","806","divider_nor2*6","10684","0","2","1","#ffffff,#ffffff,#5EAAF8,#5EAAF8","Blue Iced bar desk","Blue Iced bar desk"],["s","807","divider_nor1*6","10684","0","1","1","#ffffff,#5EAAF8","Blue Ice corner","Blue Ice corner"],["s","808","divider_nor3*6","15444","0","1","1","#FFFFFF,#FFFFFF,#5EAAF8,#5EAAF8","Blue Iced gate","Blue Iced gate"],["s","809","divider_nor4*6","13603","0","2","1","#FFFFFF,#FFFFFF,#5EAAF8,#5EAAF8,#5EAAF8,#5EAAF8","Blue Iced Auto Shutter","Habbos, roll out!"],["s","810","divider_nor5*6","13603","0","1","1","#FFFFFF,#5EAAF8,#5EAAF8","Blue Iced Angle","Cool cornering for your crib y0!"],["s","811","chair_norja*7","1272","0","1","1","#ffffff,#ffffff,#7CB135,#7CB135","Rural Chair","Sleek and chic for each cheek"],["s","812","couch_norja*7","1272","0","2","1","#ffffff,#ffffff,#ffffff,#ffffff,#7CB135,#7CB135,#7CB135,#7CB135","Rural Iced Bench","Two can perch comfortably"],["s","813","table_norja_med*7","2429","0","2","2","#ffffff,#7CB135","Rural Iced Coffee Table","For larger gatherings"],["s","814","shelves_norja*7","1272","0","1","1","#ffffff,#7CB135","Rural Iced Bookcase","For nic naks and cookery books"],["s","815","soft_sofachair_norja*7","10684","0","1","1","#ffffff,#7CB135,#7CB135","Rural Iced Sofachair","Sit back and relax"],["s","816","soft_sofa_norja*7","10684","0","2","1","#ffffff,#7CB135,#ffffff,#7CB135,#7CB135,#7CB135","Rural Iced Sofa","Sit back and relax"],["s","817","divider_nor2*7","10684","0","2","1","#ffffff,#ffffff,#7CB135,#7CB135","Rural Iced Bar","No way through"],["s","818","divider_nor1*7","10684","0","1","1","#ffffff,#7CB135","Rural Iced Corner","The missing piece"],["s","819","divider_nor3*7","15444","0","1","1","#FFFFFF,#FFFFFF,#7CB135,#7CB135","Rural Iced gate","Entrance or exit?"],["s","820","divider_nor4*7","13603","0","2","1","#FFFFFF,#FFFFFF,#7CB135,#7CB135,#7CB135,#7CB135","Rural Iced Shutter","Habbos, roll out!"],["s","821","divider_nor5*7","13603","0","1","1","#FFFFFF,#7CB135,#7CB135","Rural Iced Angle","Cool cornering for your crib!"],["s","822","chair_norja*8","1272","0","1","1","#ffffff,#ffffff,#FFD837,#FFD837","Yellow Chair","Sleek and chic for each cheek"],["s","823","couch_norja*8","1272","0","2","1","#ffffff,#ffffff,#ffffff,#ffffff,#FFD837,#FFD837,#FFD837,#FFD837","Yellow Bench","Two can perch comfortably"],["s","824","table_norja_med*8","2429","0","2","2","#ffffff,#FFD837","Large Coffee Table Yellow","For larger gatherings"],["s","825","shelves_norja*8","1272","0","1","1","#ffffff,#FFD837","Yellow Bookcase","For nic naks and art deco books"],["s","826","soft_sofachair_norja*8","10684","0","1","1","#ffffff,#FFD837,#FFD837","Yellow Iced Sofachair","Yellow Iced Sofachair"],["s","827","soft_sofa_norja*8","10684","0","2","1","#ffffff,#FFD837,#ffffff,#FFD837,#FFD837,#FFD837","Yellow Iced Sofa","Yellow Iced Sofa"],["s","828","divider_nor2*8","10684","0","2","1","#ffffff,#ffffff,#FFD837,#FFD837","Yellow Iced bar desk","Yellow Iced bar desk"],["s","829","divider_nor1*8","10684","0","1","1","#ffffff,#FFD837","Yellow Ice corner","Yellow Ice corner"],["s","830","divider_nor3*8","15444","0","1","1","#FFFFFF,#FFFFFF,#FFD837,#FFD837","Yellow Iced gate","Yellow Iced gate"],["s","831","divider_nor4*8","13603","0","2","1","#FFFFFF,#FFFFFF,#FFD837,#FFD837,#FFD837,#FFD837","Yellow Iced Auto Shutter","Habbos, roll out!"],["s","832","divider_nor5*8","13603","0","1","1","#FFFFFF,#FFD837,#FFD837","Yellow Iced Angle","Cool cornering for your crib y0!"],["s","833","chair_norja*9","1272","0","1","1","#ffffff,#ffffff,#E14218,#E14218","Red Chair","Sleek and chic for each cheek"],["s","834","couch_norja*9","1272","0","2","1","#ffffff,#ffffff,#ffffff,#ffffff,#E14218,#E14218,#E14218,#E14218","Red Bench","Two can perch comfortably"],["s","835","table_norja_med*9","2429","0","2","2","#ffffff,#E14218","Large Coffee Table Red","For larger gatherings"],["s","836","shelves_norja*9","1272","0","1","1","#ffffff,#E14218","Red Bookcase","For nic naks and art deco books"],["s","837","soft_sofachair_norja*9","10684","0","1","1","#ffffff,#E14218,#E14218","Red Iced Sofachair","Red Iced Sofachair"],["s","838","soft_sofa_norja*9","10684","0","2","1","#ffffff,#E14218,#ffffff,#E14218,#E14218,#E14218","Red Iced Sofa","Red Iced Sofa"],["s","839","divider_nor2*9","10684","0","2","1","#ffffff,#ffffff,#E14218,#E14218","Red Iced bar desk","Red Iced bar desk"],["s","840","divider_nor1*9","10684","0","1","1","#ffffff,#E14218","Red Ice corner","Red Ice corner"],["s","841","divider_nor3*9","15444","0","1","1","#FFFFFF,#FFFFFF,#E14218,#E14218","Red Iced gate","Red Iced gate"],["s","842","divider_nor4*9","13603","0","2","1","#FFFFFF,#FFFFFF,#E14218,#E14218,#E14218,#E14218","Red Iced Auto Shutter","Habbos, roll out!"],["s","843","divider_nor5*9","13603","0","1","1","#FFFFFF,#E14218,#E14218","Red Iced Angle","Cool cornering for your crib y0!"],["s","844","bed_polyfon*2","1272","0","2","3","#ffffff,#ffffff,#525252,#525252","Black Mode Double Bed","Black Mode Double Bed"],["s","845","bed_polyfon_one*2","3987","0","1","3","#ffffff,#ffffff,#ffffff,#525252,#525252","Black Mode Single Bed","Black Mode Single Bed"],["s","846","sofa_polyfon*2","11385","0","2","1","#ffffff,#ffffff,#ffffff,#ffffff,#525252,#525252,#525252,#525252","Black Mode Sofa","Black Mode Sofa"],["s","847","sofachair_polyfon*2","1272","0","1","1","#ffffff,#ffffff,#525252,#525252","Black Mode Armchair","Black Mode Armchair"],["s","848","divider_poly3*2","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#525252,#525252","Black Mode Bardesk Gate","Black Mode Bardesk Gate"],["s","849","bardesk_polyfon*2","11385","0","2","1","#ffffff,#ffffff,#525252,#525252","Black Mode Bardesk","Black Mode Bardesk"],["s","850","bardeskcorner_polyfon*2","11385","0","1","1","#ffffff,#525252","Black Mode Bardesk Corner","Black Mode Bardesk Corner"],["s","851","bed_polyfon*3","1272","0","2","3","#ffffff,#ffffff,#ffffff,#ffffff","White Double Bed","Give yourself space to stretch out"],["s","852","bed_polyfon_one*3","3987","0","1","3","#ffffff,#ffffff,#ffffff,#ffffff,#ffffff","White Single Bed","Cot of the artistic"],["s","853","sofa_polyfon*3","11385","0","2","1","#ffffff,#ffffff,#ffffff,#ffffff,#ffffff,#ffffff,#ffffff,#ffffff","White Two-seater Sofa","Comfort for stylish couples"],["s","854","sofachair_polyfon*3","1272","0","1","1","#ffffff,#ffffff,#ffffff,#ffffff","White Armchair","Loft-style comfort"],["s","855","divider_poly3*3","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","White Hatch","Border control!"],["s","856","bardesk_polyfon*3","11385","0","2","1","#ffffff,#ffffff,#ffffff,#ffffff","White Bardesk","Perfect for work or play"],["s","857","bardeskcorner_polyfon*3","11385","0","1","1","#ffffff,#ffffff","White Corner Desk","Tuck it away"],["s","858","bed_polyfon*4","1272","0","2","3","#ffffff,#ffffff,#F7EBBC,#F7EBBC","Beige Mode Double Bed","Beige Mode Double Bed"],["s","859","bed_polyfon_one*4","3987","0","1","3","#ffffff,#ffffff,#ffffff,#F7EBBC,#F7EBBC","Beige Mode Single Bed","Beige Mode Single Bed"],["s","860","sofa_polyfon*4","11385","0","2","1","#ffffff,#ffffff,#ffffff,#ffffff,#F7EBBC,#F7EBBC,#F7EBBC,#F7EBBC","Beige Mode Sofa","Beige Mode Sofa"],["s","861","sofachair_polyfon*4","1272","0","1","1","#ffffff,#ffffff,#F7EBBC,#F7EBBC","Beige Mode Armchair","Beige Mode Armchair"],["s","862","divider_poly3*4","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#F7EBBC,#F7EBBC","Beige Mode Bardesk Gate","Beige Mode Bardesk Gate"],["s","863","bardesk_polyfon*4","11385","0","2","1","#ffffff,#ffffff,#F7EBBC,#F7EBBC","Beige Mode Bardesk","Beige Mode Bardesk"],["s","864","bardeskcorner_polyfon*4","11385","0","1","1","#ffffff,#F7EBBC","Beige Mode Bardesk Corner","Beige Mode Bardesk Corner"],["s","865","bed_polyfon*6","1272","0","2","3","#ffffff,#ffffff,#5EAAF8,#5EAAF8","Blue Mode Double Bed","Blue Mode Double Bed"],["s","866","bed_polyfon_one*6","3987","0","1","3","#ffffff,#ffffff,#ffffff,#5EAAF8,#5EAAF8","Blue Mode Single Bed","Blue Mode Single Bed"],["s","867","sofa_polyfon*6","11385","0","2","1","#ffffff,#ffffff,#ffffff,#ffffff,#5EAAF8,#5EAAF8,#5EAAF8,#5EAAF8","Blue Mode Sofa","Blue Mode Sofa"],["s","868","sofachair_polyfon*6","1272","0","1","1","#ffffff,#ffffff,#5EAAF8,#5EAAF8","Blue Mode Armchair","Blue Mode Armchair"],["s","869","divider_poly3*6","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#5EAAF8,#5EAAF8","Blue Mode Bardesk Gate","Blue Mode Bardesk Gate"],["s","870","bardesk_polyfon*6","11385","0","2","1","#ffffff,#ffffff,#5EAAF8,#5EAAF8","Blue Mode Bardesk","Blue Mode Bardesk"],["s","871","bardeskcorner_polyfon*6","11385","0","1","1","#ffffff,#5EAAF8","Blue Mode Bardesk Corner","Blue Mode Bardesk Corner"],["s","872","bed_polyfon*7","1272","0","2","3","#ffffff,#ffffff,#7CB135,#7CB135","Green Double Bed","Give yourself space to stretch out"],["s","873","bed_polyfon_one*7","3987","0","1","3","#ffffff,#ffffff,#ffffff,#7CB135,#7CB135","Green Single Bed","Cot of the artistic"],["s","874","sofa_polyfon*7","11385","0","2","1","#ffffff,#ffffff,#ffffff,#ffffff,#7CB135,#7CB135,#7CB135,#7CB135","Green Two-seater Sofa","Comfort for stylish couples"],["s","875","sofachair_polyfon*7","1272","0","1","1","#ffffff,#ffffff,#7CB135,#7CB135","Green Armchair","Loft-style comfort"],["s","876","divider_poly3*7","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#7CB135,#7CB135","Green Hatch","Border control"],["s","877","bardesk_polyfon*7","11385","0","2","1","#ffffff,#ffffff,#7CB135,#7CB135","Green Bardesk","Perfect for work or play"],["s","878","bardeskcorner_polyfon*7","11385","0","1","1","#ffffff,#7CB135","Green Corner Desk","Tuck it away"],["s","879","bed_polyfon*8","1272","0","2","3","#ffffff,#ffffff,#FFD837,#FFD837","Yellow Mode Double Bed","Yellow Mode Double Bed"],["s","880","bed_polyfon_one*8","3987","0","1","3","#ffffff,#ffffff,#ffffff,#FFD837,#FFD837","Yellow Mode Single Bed","Yellow Mode Single Bed"],["s","881","sofa_polyfon*8","11385","0","2","1","#ffffff,#ffffff,#ffffff,#ffffff,#FFD837,#FFD837,#FFD837,#FFD837","Yellow Mode Sofa","Yellow Mode Sofa"],["s","882","sofachair_polyfon*8","1272","0","1","1","#ffffff,#ffffff,#FFD837,#FFD837","Yellow Mode Armchair","Yellow Mode Armchair"],["s","883","divider_poly3*8","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFD837,#FFD837","Yellow Mode Bardesk Gate","Yellow Mode Bardesk Gate"],["s","884","bardesk_polyfon*8","11385","0","2","1","#ffffff,#ffffff,#FFD837,#FFD837","Yellow Mode Bardesk","Yellow Mode Bardesk"],["s","885","bardeskcorner_polyfon*8","11385","0","1","1","#ffffff,#FFD837","Yellow Mode Bardesk Corner","Yellow Mode Bardesk Corner"],["s","886","bed_polyfon*9","1272","0","2","3","#ffffff,#ffffff,#E14218,#E14218","Red Double Bed","Give yourself space to stretch out"],["s","887","bed_polyfon_one*9","3987","0","1","3","#ffffff,#ffffff,#ffffff,#E14218,#E14218","Red Single Bed","Cot of the artistic"],["s","888","sofa_polyfon*9","11385","0","2","1","#ffffff,#ffffff,#ffffff,#ffffff,#E14218,#E14218,#E14218,#E14218","Red Two-seater Sofa","Comfort for stylish couples"],["s","889","sofachair_polyfon*9","1272","0","1","1","#ffffff,#ffffff,#E14218,#E14218","Red Armchair","Loft-style comfort"],["s","890","divider_poly3*9","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#E14218,#E14218","Red Hatch","Border Control!"],["s","891","bardesk_polyfon*9","11385","0","2","1","#ffffff,#ffffff,#E14218,#E14218","Red Bardesk","Perfect for work or play"],["s","892","bardeskcorner_polyfon*9","11385","0","1","1","#ffffff,#E14218","Red Corner Desk","Tuck it away"],["s","893","pura_mdl1*1","11385","0","1","1","#FFFFFF,#ABD0D2,#ABD0D2,#FFFFFF","Aqua Pura Module 1","Any way you like it!"],["s","894","pura_mdl2*1","11385","0","1","1","#FFFFFF,#ABD0D2,#ABD0D2,#FFFFFF","Aqua Pura Module 2","Any way you like it!"],["s","895","pura_mdl3*1","11385","0","1","1","#FFFFFF,#ABD0D2,#ABD0D2,#FFFFFF","Aqua Pura Module 3","Any way you like it!"],["s","896","pura_mdl4*1","11385","0","1","1","#FFFFFF,#ABD0D2,#ABD0D2,#ABD0D2","Aqua Pura Module 4","Any way you like it!"],["s","897","pura_mdl5*1","7053","0","1","1","#FFFFFF,#ABD0D2,#ABD0D2,#FFFFFF","Aqua Pura Module 5","Any way you like it!"],["s","898","pura_mdl1*2","11385","0","1","1","#FFFFFF,#FF99BC,#FF99BC,#FFFFFF","Pink Pura Module 1","Any way you like it!"],["s","899","pura_mdl2*2","11385","0","1","1","#FFFFFF,#FF99BC,#FF99BC,#FFFFFF","Pink Pura Module 2","Any way you like it!"],["s","900","pura_mdl3*2","11385","0","1","1","#FFFFFF,#FF99BC,#FF99BC,#FFFFFF","Pink Pura Module 3","Any way you like it!"],["s","901","pura_mdl4*2","11385","0","1","1","#FFFFFF,#FF99BC,#FF99BC,#FF99BC","Pink Pura Module 4","Any way you like it!"],["s","902","pura_mdl5*2","7053","0","1","1","#FFFFFF,#FF99BC,#FF99BC,#FFFFFF","Pink Pura Module 5","Any way you like it!"],["s","903","pura_mdl1*3","11385","0","1","1","#FFFFFF,#525252,#525252,#FFFFFF","Black Pura Module 1","Any way you like it!"],["s","904","pura_mdl2*3","11385","0","1","1","#FFFFFF,#525252,#525252,#FFFFFF","Black Pura Module 2","Any way you like it!"],["s","905","pura_mdl3*3","11385","0","1","1","#FFFFFF,#525252,#525252,#FFFFFF","Black Pura Module 3","Any way you like it!"],["s","906","pura_mdl4*3","11385","0","1","1","#FFFFFF,#525252,#525252,#525252","Black Pura Module 4","Any way you like it!"],["s","907","pura_mdl5*3","7053","0","1","1","#FFFFFF,#525252,#525252,#FFFFFF","Black Pura Module 5","Any way you like it!"],["s","908","pura_mdl1*4","11385","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","White Pura Module 1","Any way you like it!"],["s","909","pura_mdl2*4","11385","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","White Pura Module 2","Any way you like it!"],["s","910","pura_mdl3*4","11385","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","White Pura Module 3","Any way you like it!"],["s","911","pura_mdl4*4","11385","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","White Pura Module 4","Any way you like it!"],["s","912","pura_mdl5*4","7053","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","White Pura Module 5","Any way you like it!"],["s","913","pura_mdl1*5","11385","0","1","1","#FFFFFF,#F7EBBC,#F7EBBC,#FFFFFF","Beige pura module 1",""],["s","914","pura_mdl2*5","11385","0","1","1","#FFFFFF,#F7EBBC,#F7EBBC,#FFFFFF","Beige pura module 2",""],["s","915","pura_mdl3*5","11385","0","1","1","#FFFFFF,#F7EBBC,#F7EBBC,#FFFFFF","Beige pura module 3",""],["s","916","pura_mdl4*5","11385","0","1","1","#FFFFFF,#F7EBBC,#F7EBBC,#F7EBBC","Beige pura module 4",""],["s","917","pura_mdl5*5","7053","0","1","1","#FFFFFF,#F7EBBC,#F7EBBC,#FFFFFF","Beige pura module 5",""],["s","918","pura_mdl1*6","11385","0","1","1","#FFFFFF,#5EAAF8,#5EAAF8,#FFFFFF","Blue Pura Module 1","Any way you like it!"],["s","919","pura_mdl2*6","11385","0","1","1","#FFFFFF,#5EAAF8,#5EAAF8,#FFFFFF","Blue Pura Module 2","Any way you like it!"],["s","920","pura_mdl3*6","11385","0","1","1","#FFFFFF,#5EAAF8,#5EAAF8,#FFFFFF","Blue Pura Module 3","Any way you like it!"],["s","921","pura_mdl4*6","11385","0","1","1","#FFFFFF,#5EAAF8,#5EAAF8,#5EAAF8","Blue Pura Module 4","Any way you like it!"],["s","922","pura_mdl5*6","7053","0","1","1","#FFFFFF,#5EAAF8,#5EAAF8,#FFFFFF","Blue Pura Module 5","Any way you like it!"],["s","923","pura_mdl1*7","11385","0","1","1","#FFFFFF,#92D13D,#92D13D,#FFFFFF","Green Pura Module 1","Any way you like it!"],["s","924","pura_mdl2*7","11385","0","1","1","#FFFFFF,#92D13D,#92D13D,#FFFFFF","Green Pura Module 2","Any way you like it!"],["s","925","pura_mdl3*7","11385","0","1","1","#FFFFFF,#92D13D,#92D13D,#FFFFFF","Green Pura Module 3","Any way you like it!"],["s","926","pura_mdl4*7","11385","0","1","1","#FFFFFF,#92D13D,#92D13D,#92D13D","Green Pura Module 4","Any way you like it!"],["s","927","pura_mdl5*7","7053","0","1","1","#FFFFFF,#92D13D,#92D13D,#FFFFFF","Green Pura Module 5","Any way you like it!"],["s","928","pura_mdl1*8","11385","0","1","1","#FFFFFF,#FFD837,#FFD837,#FFFFFF","Yellow pura module 1",""],["s","929","pura_mdl2*8","11385","0","1","1","#FFFFFF,#FFD837,#FFD837,#FFFFFF","Yellow pura module 2",""],["s","930","pura_mdl3*8","11385","0","1","1","#FFFFFF,#FFD837,#FFD837,#FFFFFF","Yellow pura module 3",""],["s","931","pura_mdl4*8","11385","0","1","1","#FFFFFF,#FFD837,#FFD837,#FFD837","Yellow pura module 4",""],["s","932","pura_mdl5*8","7053","0","1","1","#FFFFFF,#FFD837,#FFD837,#FFFFFF","Yellow Pura Module 5","Any way you like it!"],["s","933","pura_mdl1*9","11385","0","1","1","#FFFFFF,#E14218,#E14218,#FFFFFF","Red Pura Module 1","Any way you like it!"],["s","934","pura_mdl2*9","11385","0","1","1","#FFFFFF,#E14218,#E14218,#FFFFFF","Red Pura Module 2","Any way you like it!"],["s","935","pura_mdl3*9","11385","0","1","1","#FFFFFF,#E14218,#E14218,#FFFFFF","Red Pura Module 3","Any way you like it!"],["s","936","pura_mdl4*9","11385","0","1","1","#FFFFFF,#E14218,#E14218,#E14218","Red Pura Module 4","Any way you like it!"],["s","937","pura_mdl5*9","7053","0","1","1","#FFFFFF,#E14218,#E14218,#FFFFFF","Red Pura Module 5","Any way you like it!"],["s","938","chair_basic*1","11385","0","1","1","#FFFFFF,#ABD0D2,#FFFFFF","Aqua Pura Egg Chair","It's a cracking design!"],["s","939","chair_basic*2","11385","0","1","1","#FFFFFF,#FF99BC,#FFFFFF","Pink Pura Egg Chair","It's a cracking design!"],["s","940","chair_basic*3","11385","0","1","1","#FFFFFF,#525252,#FFFFFF","Black Pura Egg Chair","It's a cracking design!"],["s","941","chair_basic*4","11385","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF","White Pura Egg Chair","It's a cracking design!"],["s","942","chair_basic*5","11385","0","1","1","#FFFFFF,#F7EBBC,#FFFFFF","Beige Pura Egg Chair","It's a cracking design!"],["s","943","chair_basic*6","11385","0","1","1","#FFFFFF,#5EAAF8,#FFFFFF","Blue Pura Egg Chair","It's a cracking design!"],["s","944","chair_basic*7","11385","0","1","1","#FFFFFF,#92D13D,#FFFFFF","Green Pura Egg Chair","It's a cracking design!"],["s","945","chair_basic*8","11385","0","1","1","#FFFFFF,#FFD837,#FFFFFF","Yellow Pura Egg Chair","It's a cracking design!"],["s","946","chair_basic*9","11385","0","1","1","#FFFFFF,#E14218,#FFFFFF","Red Pura Egg Chair","It's a cracking design!"],["s","947","grand_piano*1","13603","0","2","2","#FFFFFF,#FF8B8B","Turquoise Grand Piano","Turquoise Grand Piano"],["s","948","romantique_pianochair*1","13144","0","1","1","#FFFFFF,#FF8B8B,#FFFFFF","Rose Quartz Piano Chair","Elegant seating for elegant Habbos"],["s","949","romantique_chair*1","13144","0","1","1","#FFFFFF,#FF8B8B,#FFFFFF","Rose Quartz Chair","Elegant seating for elegant Habbos"],["s","950","romantique_divan*1","13144","0","2","1","#FFFFFF,#FFFFFF,#FFFFFF,#FF8B8B","Chaise-Longue","Recline in continental Rose Quartz comfort"],["s","951","romantique_divider*1","3438","0","2","1","#FF8B8B,#FF8B8B,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","Rose Quartz Screen","Beauty lies within"],["s","952","romantique_smalltabl*1","13144","2","1","1","#FFFFFF,#FF8B8B,#FFFFFF","Rose Quartz Tray Table","Every tray needs a table..."],["s","953","grand_piano*2","13603","0","2","2","#FFFFFF,#A1DC67","Esmerald Piano Stool","Let the music begin"],["s","954","romantique_pianochair*2","13144","0","1","1","#FFFFFF,#A1DC67,#FFFFFF","Lime Romantique Piano Chair","Sit in traditional style"],["s","955","romantique_chair*2","13144","0","1","1","#FFFFFF,#A1DC67,#FFFFFF","Lime Romantique Chair","null"],["s","956","romantique_divan*2","13144","0","2","1","#FFFFFF,#FFFFFF,#FFFFFF,#A1DC67","Emerald Chaise-Longue","Recline in continental comfort"],["s","957","romantique_divider*2","3438","0","2","1","#A1DC67,#A1DC67,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","Green Screen","Keeping things separated"],["s","958","romantique_smalltabl*2","13144","2","1","1","#FFFFFF,#A1DC67,#FFFFFF","Lime Tray Table","Every tray needs a table..."],["s","959","grand_piano*3","13603","0","2","2","#FFFFFF,#5BD1D2","Sapphire Piano Stool","Make sure you play in key!"],["s","960","romantique_pianochair*3","13144","0","1","1","#FFFFFF,#5BD1D2,#FFFFFF","Sapphire Chair","For stately seating experiences"],["s","961","romantique_chair*3","13144","0","1","1","#FFFFFF,#5BD1D2,#FFFFFF","Turquoise Romantique Chair","null"],["s","962","romantique_divan*3","13144","0","2","1","#FFFFFF,#FFFFFF,#FFFFFF,#5BD1D2","Turquoise Romantique Divan","null"],["s","963","romantique_divider*3","3438","0","2","1","#5BD1D2,#5BD1D2,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","Turquoise Screen","Keeping things separated"],["s","964","romantique_smalltabl*3","13144","2","1","1","#FFFFFF,#5BD1D2,#FFFFFF","Turquoise Tray Table","Every tray needs a table..."],["s","965","grand_piano*4","13603","0","2","2","#FFFFFF,#FFC924","Amber Grand Piano","Why is that key green?"],["s","966","romantique_pianochair*4","13144","0","1","1","#FFFFFF,#FFC924,#FFFFFF","Amber Piano Stool","I can feel air coming through..."],["s","967","romantique_chair*4","13144","0","1","1","#FFFFFF,#FFC924,#FFFFFF","Amber Chair","What does this button do?"],["s","968","romantique_divan*4","13144","0","2","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFC924","Amber Chaise-Longue","Is that a cape hanging there?"],["s","969","romantique_divider*4","3438","0","2","1","#FFC924,#FFC924,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","Ochre Screen","Keeping things separated"],["s","4488","romantique_divider*5","3438","0","2","1","#323C46,#323C46,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","Romantique Screen Gray","Keeping Things Separated"],["s","970","romantique_smalltabl*4","13144","2","1","1","#FFFFFF,#FFC924,#FFFFFF","Amber Tray Table","Why is one leg different?"],["s","971","grand_piano*5","13603","0","2","2","#FFFFFF,#323C46","Onyx Grand Piano","Why is that key green?"],["s","972","romantique_pianochair*5","13144","0","1","1","#FFFFFF,#323C46,#FFFFFF","Onyx Piano Stool","I can feel air coming through..."],["s","973","romantique_chair*5","13144","0","1","1","#FFFFFF,#323C46,#FFFFFF","Onyx Chair","What does this button do?"],["s","974","romantique_divan*5","13144","0","2","1","#FFFFFF,#FFFFFF,#FFFFFF,#323C46","Onyx Chaise-Longue","Is that a cape hanging there?"],["s","976","romantique_smalltabl*5","13144","2","1","1","#FFFFFF,#323C46,#FFFFFF","Onyx Tray Table","Why is one leg different?"],["s","977","club_sofa","15444","0","2","1","0,0,0","Club sofa","Club sofa"],["s","978","chair_plasto*14","11385","0","1","1","#ffffff,#3CB4F0,#ffffff,#3CB4F0","HC chair","Aqua chair"],["s","979","table_plasto_4leg*14","11385","0","2","2","#ffffff,#3CB4F0","HC table","Aqua table"],["s","980","mocchamaster","13603","2","1","1","#FFFFFF","Mochamaster","Wake up and smell it!"],["s","981","edicehc","13603","0","1","1","0,0,0","Dicemaster","Click and roll!"],["s","982","hcamme","13603","0","1","2","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","Tubmaster","Time for a soak"],["s","983","doorD","13603","2","1","1","","Imperial Teleport","Let's go over tzar!"],["s","984","hcsohva","437","0","2","1","0,0,0","Throne Sofa","For royal bottoms..."],["s","985","hc_lmp","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","Oil Lamp","Be enlightened"],["s","986","hc_tbl","437","0","1","3","0,0,0","Nordic Table","Perfect for banquets"],["s","987","hc_chr","437","0","1","1","0,0,0","Majestic Chair","Royal comfort"],["s","988","hc_dsk","13603","0","1","2","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","Study Desk","For Habbo scholars"],["s","989","hc_trll","437","0","1","2","0,0,0","Drinks Trolley","For swanky dinners only"],["s","990","hc_crpt","437","0","3","5","0,0,0","Persian Carpet","Ultimate craftsmanship"],["s","991","hc_lmpst","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF","Victorian Street Light","Somber and atmospheric"],["s","992","hc_crtn","15444","0","2","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","Antique Drapery","Topnotch privacy protection"],["s","993","hc_tv","15444","2","2","1","","Mega TV Set","Forget plasma, go HC!"],["s","994","hc_btlr","13603","2","1","1","#FFFFFF,#FFFFFF","Electric Butler","Your personal caretaker"],["s","995","hc_bkshlf","437","0","1","4","0,0,0","Medieval Bookcase","For the scholarly ones"],["s","996","hc_rntgn","1272","0","2","1","0,0,0","X-Ray Divider","Believe it or not!"],["s","997","hc_machine","13603","0","1","3","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","Weird Science Machine","By and for mad inventors"],["s","998","hc_frplc","13603","0","1","3","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","Heavy Duty Fireplace","Pixel-powered for maximum heating"],["s","999","hc_djset","437","0","3","1","0,0,0","The Grammophon","Very old skool scratch'n'spin"],["s","1000","hc_rllr","15444","0","1","1","0,0,0","HC Rollers Set","Highest class transportation"],["i","1001","hc_wall_lamp","13603","","","","","Retro Wall Lamp","Tres chic!"],["i","1002","roomdimmer","13603","","","","","Mood Light","Superior lighting for your room"],["s","1003","rare_dragonlamp*0","13603","2","1","1","#FFFFFF,#FA2D00,#FA2D00,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","Fire Dragon Lamp","George and the..."],["s","1004","rare_dragonlamp*1","13603","2","1","1","#FFFFFF,#3470FF,#3470FF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","Sea Dragon Lamp","Out of the deep blue!"],["s","1005","rare_dragonlamp*2","13603","2","1","1","#FFFFFF,#02BB70,#02BB70,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","Jade Dragon Lamp","Oriental beast of legends"],["s","1006","rare_dragonlamp*3","13603","2","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","Silver Dragon Lamp","Scary and scorching!"],["s","1007","rare_dragonlamp*4","13603","2","1","1","#FFFFFF,#3E3D40,#3E3D40,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","Black Dragon Lamp","Scary and scorching!"],["s","1008","rare_dragonlamp*5","13603","2","1","1","#FFFFFF,#589A03,#589A03,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","Elf Green Dragon Lamp","Roast your chestnuts here!"],["s","1009","rare_dragonlamp*6","13603","2","1","1","#FFFFFF,#FFBC00,#FFBC00,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","Gold Dragon Lamp","Scary and scorching!"],["s","1010","rare_dragonlamp*7","13603","2","1","1","#FFFFFF,#83AEFF,#83AEFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","Sky Dragon Lamp","Scary and scorching!"],["s","1011","rare_dragonlamp*8","13603","2","1","1","#FFFFFF,#FF5F01,#FF5F01,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","Bronze Dragon Lamp","Scary and scorching!"],["s","1012","rare_dragonlamp*9","13603","2","1","1","#FFFFFF,#B357FF,#B357FF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","Purple Dragon Lamp","Scary and scorching!"],["s","1013","rare_fan*0","13603","0","1","1","#F43100,#FFFFFF,#FFFFFF,#FFFFFF","Festive Fan","As red as Rudolph's nose"],["s","1014","rare_fan*1","13603","0","1","1","#3C75FF,#FFFFFF,#FFFFFF,#FFFFFF","Birthday Fan","It'll blow your candles out!"],["s","1015","rare_fan*2","13603","0","1","1","#55CD01,#FFFFFF,#FFFFFF,#FFFFFF","Green Powered Fan","It'll blow you away!"],["s","1016","rare_fan*3","13603","0","1","1","#C05DFF,#FFFFFF,#FFFFFF,#FFFFFF","Purple Dragon Skin Fan","Keeps the heat off St George!"],["s","1017","rare_fan*4","13603","0","1","1","#FF9898,#FFFFFF,#FFFFFF,#FFFFFF","SUPERLOVE Fan","Fanning the fires of SUPERLOVE..."],["s","1018","rare_fan*5","13603","0","1","1","#E1CC00,#FFFFFF,#FFFFFF,#FFFFFF","Yellow Powered Fan","It'll blow you away!"],["s","1019","rare_fan*6","13603","0","1","1","#FF8000,#FFFFFF,#FFFFFF,#FFFFFF","Ochre Powered Fan","It'll blow you away!"],["s","1020","rare_fan*7","13603","0","1","1","#97420C,#FFFFFF,#FFFFFF,#FFFFFF","Brown Powered Fan","...it's really hit the fan!"],["s","1021","rare_fan*8","13603","0","1","1","#00E5E2,#FFFFFF,#FFFFFF,#FFFFFF","Habbo Wind Turbine","Stylish, Eco-Energy!"],["s","1022","rare_fan*9","13603","0","1","1","#FF60B0,#FFFFFF,#FFFFFF,#FFFFFF","Fucsia Powered Fan","It'll blow you away!"],["s","1023","rare_icecream*0","13603","2","1","1","#FFFFFF,#F43100,#FFFFFF,#FFFFFF,#FFFFFF","Cherry Ice Cream Machine","Virtual cherry rocks!"],["s","1024","rare_icecream*1","13603","2","1","1","#FFFFFF,#3C75FF,#FFFFFF,#FFFFFF,#FFFFFF","Blueberry Ice Cream Machine","Virtual blueberry rocks!"],["s","1025","rare_icecream*2","13603","2","1","1","#FFFFFF,#55CD01,#FFFFFF,#FFFFFF,#FFFFFF","Pistachio Ice Cream Machine","Virtual pistachio rocks!"],["s","1026","rare_icecream*3","13603","2","1","1","#FFFFFF,#C05DFF,#FFFFFF,#FFFFFF,#FFFFFF","Blackcurrant Ice Cream Machine","Virtual blackcurrant rocks!"],["s","1027","rare_icecream*4","13603","2","1","1","#FFFFFF,#FF9898,#FFFFFF,#FFFFFF,#FFFFFF","Strawberry Ice Cream Machine","Virtual strawberry rocks!"],["s","1028","rare_icecream*5","13603","2","1","1","#FFFFFF,#E1CC00,#FFFFFF,#FFFFFF,#FFFFFF","Vanilla Ice Cream Machine","Virtual vanilla rocks!"],["s","1029","rare_icecream*6","13603","2","1","1","#FFFFFF,#FF8000,#FFFFFF,#FFFFFF,#FFFFFF","Toffee Ice Cream Machine","Virtual toffee rocks!"],["s","1030","rare_icecream*7","13603","2","1","1","#FFFFFF,#97420C,#FFFFFF,#FFFFFF,#FFFFFF","Chocolate Ice Cream Machine","Virtual chocolate rocks!"],["s","1031","rare_icecream*8","13603","2","1","1","#FFFFFF,#00E5E2,#FFFFFF,#FFFFFF,#FFFFFF","Peppermint Ice Cream Machine","Virtual peppermint rocks!"],["s","1032","rare_icecream*9","13603","2","1","1","#FFFFFF,#FF60B0,#FFFFFF,#FFFFFF,#FFFFFF","Bubblegum Ice Cream Machine","Virtual bubblegum rocks!"],["s","1033","rubberchair*1","11385","0","1","1","#4193D6,#ffffff,#ffffff,#ffffff,#ffffff","Blue Inflatable Chair","Soft and stylish HC chair"],["s","1034","rubberchair*2","11385","0","1","1","#F24570,#ffffff,#ffffff,#ffffff,#ffffff","Pink Inflatable Chair","Soft and tearproof!"],["s","1035","rubberchair*3","11385","0","1","1","#F06E3B,#ffffff,#ffffff,#ffffff,#ffffff","Orange Inflatable Chair","Soft and tearproof!"],["s","1036","rubberchair*4","11385","0","1","1","#53C7D5,#ffffff,#ffffff,#ffffff,#ffffff","Ocean Inflatable Chair","Soft and tearproof!"],["s","1037","rubberchair*5","11385","0","1","1","#CBE42D,#ffffff,#ffffff,#ffffff,#ffffff","Lime Inflatable Chair","Soft and tearproof!"],["s","1038","rubberchair*6","11385","0","1","1","#DE4FAE,#ffffff,#ffffff,#ffffff,#ffffff","Violet Inflatable Chair","Soft and tearproof!"],["s","1039","rubberchair*7","11385","0","1","1","#FFFFFF,#ffffff,#ffffff,#ffffff,#ffffff","White Inflatable Chair","Soft and tearproof!"],["s","1040","rubberchair*8","11385","0","1","1","#444444,#ffffff,#ffffff,#ffffff,#ffffff","Black Inflatable Chair","Soft and tearproof for HC!"],["s","1041","scifiport*0","13603","0","1","1","#FFFFFF,#DD2D22,#FFFFFF,#FFFFFF,#FFFFFF,#DD2D22","Red Laser Door","Energy beams. No trespassers!"],["s","1042","scifiport*1","13603","0","1","1","#FFFFFF,#FFBC00,#FFFFFF,#FFFFFF,#FFFFFF,#FFBC00","Gold Laser Gate","Energy beams. No trespassers!"],["s","1043","scifiport*2","13603","0","1","1","#FFFFFF,#5599FF,#FFFFFF,#FFFFFF,#FFFFFF,#5599FF","Blue Laser Gate","Get in the ring!"],["s","1044","scifiport*3","13603","0","1","1","#FFFFFF,#02BB70,#FFFFFF,#FFFFFF,#FFFFFF,#02BB70","Jade Sci-Fi Port","Energy beams. No trespassers!"],["s","1045","scifiport*4","13603","0","1","1","#FFFFFF,#FF5577,#FFFFFF,#FFFFFF,#FFFFFF,#FF5577","Pink Sci-Fi Port","Energy beams. No trespassers!"],["s","1046","scifiport*5","13603","0","1","1","#FFFFFF,#555555,#FFFFFF,#FFFFFF,#FFFFFF,#555555","Security Fence","Recovered from Roswell"],["s","1047","scifiport*6","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","White Sci-Fi Port","Energy beams. No trespassers!"],["s","1048","scifiport*7","13603","0","1","1","#FFFFFF,#00CCCC,#FFFFFF,#FFFFFF,#FFFFFF,#00CCCC","Turquoise Sci-Fi Port","Energy beams. No trespassers!"],["s","1049","scifiport*8","13603","0","1","1","#FFFFFF,#BB55CC,#FFFFFF,#FFFFFF,#FFFFFF,#BB55CC","Purple Sci-Fi Port","Energy beams. No trespassers!"],["s","1050","scifiport*9","13603","0","1","1","#FFFFFF,#7733FF,#FFFFFF,#FFFFFF,#FFFFFF,#7733FF","Violet Sci-Fi Port","Energy beams. No trespassers!"],["s","1051","marquee*1","13603","2","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#FF798F,#FFFFFF","Pink marquee","It's both door and a shade!"],["s","1052","marquee*2","13603","2","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#C60000,#FFFFFF","Red Dragon Marquee","Dragons out and Davids in!"],["s","1053","marquee*3","13603","2","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#68DADA,#FFFFFF","Aqua Marquee","It's both door and a shade!"],["s","1054","marquee*4","13603","2","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#F8CD00,#FFFFFF","Yellow Marquee","It's both door and a shade!"],["s","1055","marquee*5","13603","2","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#707070,#FFFFFF","Graphite Marquee","It's both door and a shade!"],["s","1056","marquee*6","13603","2","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#719EFD,#FFFFFF","Blue Marquee","It's both door and a shade!"],["s","1057","marquee*7","13603","2","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#D600E2,#FFFFFF","Purple Marquee","It's both door and a shade!"],["s","1058","marquee*8","13603","2","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#004AA0,#FFFFFF","Ultramarine Marquee","It's both door and a shade!"],["s","1059","marquee*9","13603","2","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#8FD94A,#FFFFFF","Green Marquee","It's both door and a shade!"],["s","1060","scifidoor*1","13603","2","1","1","#FFFFFF,#FFAAAA,#FFAAAA,#FFAAAA,#FFFFFF","Pink Spaceship Door","There out of this world!"],["s","1061","scifidoor*2","13603","2","1","1","#FFFFFF,#FFEE66,#FFEE66,#FFEE66,#FFFFFF","Yellow Spaceship Door","There out of this world!"],["s","1062","scifidoor*3","13603","2","1","1","#FFFFFF,#AACCFF,#AACCFF,#AACCFF,#FFFFFF","Lightblue Spaceship Door","There out of this world!"],["s","1063","scifidoor*4","13603","2","1","1","#FFFFFF,#99DD77,#99DD77,#99DD77,#FFFFFF","Emerald Spaceship Door","Protect your pot of gold!"],["s","1064","scifidoor*5","13603","2","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","White Spaceship Door","There out of this world!"],["s","1065","scifidoor*6","13603","2","1","1","#FFFFFF,#333333,#333333,#333333,#FFFFFF","Black Monolith","Monolith goes up! Monolith goes down!"],["s","1066","scifidoor*7","13603","2","1","1","#FFFFFF,#AAFFFF,#AAFFFF,#AAFFFF,#FFFFFF","Aqua Spaceship Door","There out of this world!"],["s","1067","scifidoor*8","13603","2","1","1","#FFFFFF,#FF99CC,#FF99CC,#FF99CC,#FFFFFF","Purple Spaceship Door","There out of this world!"],["s","1068","scifidoor*9","13603","2","1","1","#FFFFFF,#4488FF,#4488FF,#4488FF,#FFFFFF","Blue Spaceship Door","There out of this world!"],["s","1069","scifidoor*10","13603","2","1","1","#FFFFFF,#BB99FF,#BB99FF,#BB99FF,#FFFFFF","Violet Spaceship Door","There out of this world!"],["s","1070","wooden_screen*0","2429","0","1","2","#ffffff,#ffffff,#ffffff,#ffffff,#ffffff,#ffffff","White Oriental Screen","Add an exotic touch to your room"],["s","1071","wooden_screen*1","2429","0","1","2","#ffffff,#ffffff,#FFA795,#FFA795,#ffffff,#ffffff","Pink Oriental screen","Add an exotic touch to your room"],["s","1072","wooden_screen*2","2429","0","1","2","#ffffff,#ffffff,#BD0000,#BD0000,#ffffff,#ffffff","RosewoodScreen","Add an exotic touch to your room"],["s","1073","wooden_screen*3","2429","0","1","2","#ffffff,#ffffff,#79E4B3,#79E4B3,#ffffff,#ffffff","Aqua Oriental Screen","Add an exotic touch to your room"],["s","1074","wooden_screen*4","2429","0","1","2","#ffffff,#ffffff,#F7B800,#F7B800,#ffffff,#ffffff","Golden Oriental Screen","Add an exotic touch to your room"],["s","1075","wooden_screen*5","2429","0","1","2","#ffffff,#ffffff,#778B61,#778B61,#ffffff,#ffffff","Gray Oriental Screen","Add an exotic touch to your room"],["s","1076","wooden_screen*6","2429","0","1","2","#ffffff,#ffffff,#72B6D1,#72B6D1,#ffffff,#ffffff","Blue Oriental Screen","Add an exotic touch to your room"],["s","1077","wooden_screen*7","2429","0","1","2","#ffffff,#ffffff,#DA2591,#DA2591,#ffffff,#ffffff","Purple Oriental Screen","Add an exotic touch to your room"],["s","1078","wooden_screen*8","2429","0","1","2","#ffffff,#ffffff,#004B5E,#004B5E,#ffffff,#ffffff","Night Blue Oriental Screen","Add an exotic touch to your room"],["s","1079","wooden_screen*9","2429","0","1","2","#ffffff,#ffffff,#A0BE1F,#A0BE1F,#ffffff,#ffffff","Green Oriental Screen","Add an exotic touch to your room"],["s","1080","pillar*0","2429","0","1","1","#ffffff,#ffffff,#ffffff","Greek Pillar","Classy architect, for holding up ceilings!"],["s","1081","pillar*1","2429","0","1","1","#ffffff,#FFD0D2,#FFD0D2","Pink Marble Pillar","Ancient and stately"],["s","1082","pillar*2","2429","0","1","1","#ffffff,#7B5922,#7B5922","Nordic Pillar","Ancient and stately"],["s","1083","pillar*3","2429","0","1","1","#ffffff,#BDCDEA,#BDCDEA","blue pillar","Ancient and stately"],["s","1084","pillar*4","2429","0","1","1","#ffffff,#71797C,#71797C","Dark Ages Pillar","From the time of the Kick Warz"],["s","1085","pillar*5","2429","0","1","1","#ffffff,#CEDD65,#CEDD65","Pagan Pillar","Find your natural roots"],["s","1086","pillar*6","2429","0","1","1","#ffffff,#962725,#962725","Terracotta Pillar","Ancient and stately"],["s","1087","pillar*7","2429","0","1","1","#ffffff,#E6D000,#E6D000","Atlantean Pillar","Recovered from Habblantis"],["s","1088","pillar*8","2429","0","1","1","#ffffff,#9A924B,#9A924B","Roman Pillar","All roads lead to Rome"],["s","1089","pillar*9","2429","0","1","1","#ffffff,#B2A69D,#B2A69D","Rock Pillar","Ancient and stately"],["s","1090","pillow*0","437","0","1","1","#ffffff,#ffffff,#ffffff,#ffffff","White Lace Pillow","Minimalist comfort!"],["s","1091","pillow*1","437","0","1","1","#FF8888,#FF8888,#ffffff,#ffffff","Pink Fluffy Pillow","Puffy, soft and huge"],["s","1092","pillow*2","437","0","1","1","#F00000,#F00000,#ffffff,#ffffff","Red Silk Pillow","Puffy, soft and huge"],["s","1093","pillow*3","437","0","1","1","#63C9A0,#63C9A0,#ffffff,#ffffff","Turquoise Satin Pillow","Puffy, soft and huge"],["s","1094","pillow*4","437","0","1","1","#FFBD18,#FFBD18,#ffffff,#ffffff","Gold Feather Pillow","Puffy, soft and huge"],["s","1095","pillow*5","437","0","1","1","#494D29,#494D29,#ffffff,#ffffff","Black Leather Pillow","Puffy, soft and huge"],["s","1096","pillow*6","437","0","1","1","#5DAAC9,#5DAAC9,#ffffff,#ffffff","Blue Cotton Pillow","Puffy, soft and huge"],["s","1097","pillow*7","437","0","1","1","#E532CA,#E532CA,#ffffff,#ffffff","Purple Velvet Pillow","Bonnie's pillow of choice!"],["s","1098","pillow*8","437","0","1","1","#214E68,#214E68,#ffffff,#ffffff","Navy Cord Pillow","Puffy, soft and huge"],["s","1099","pillow*9","437","0","1","1","#B9FF4B,#B9FF4B,#ffffff,#ffffff","Green Wooly Pillow","Puffy, soft and VERY fluffy!"],["s","1100","scifirocket*0","15444","0","1","1","#FFFFFF,#FFFFFF,#DD2D22,#FFFFFF","Mars Smoke Machine","See in 2007 with a bang!"],["s","1101","scifirocket*1","15444","0","1","1","#FFFFFF,#FFFFFF,#FFBC00,#FFFFFF","Saturn Smoke Machine","There is always space for this!"],["s","1102","scifirocket*2","15444","0","1","1","#FFFFFF,#FFFFFF,#5599FF,#FFFFFF","Earth Smoke Machine","A little closer to home!"],["s","1103","scifirocket*3","15444","0","1","1","#FFFFFF,#FFFFFF,#02BB70,#FFFFFF","Endor Smoke Machine","Caution! Unknown Location!"],["s","1104","scifirocket*4","15444","0","1","1","#FFFFFF,#FFFFFF,#FF5577,#FFFFFF","Venus Smoke Machine","Welcome... to planet love"],["s","1105","scifirocket*5","15444","0","1","1","#FFFFFF,#FFFFFF,#555555,#FFFFFF","Uranus Smoke Machine","From the unknown depths of space"],["s","1106","scifirocket*6","15444","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","Mercury Smoke Machine","Too hot to handle!"],["s","1107","scifirocket*7","15444","0","1","1","#FFFFFF,#FFFFFF,#00CCCC,#FFFFFF","Jupiter Smoke Machine","Larger than life!"],["s","1108","scifirocket*8","15444","0","1","1","#FFFFFF,#FFFFFF,#BB55CC,#FFFFFF","Pluto Smoke Machine","From a space far, far away!"],["s","1109","scifirocket*9","15444","0","1","1","#FFFFFF,#FFFFFF,#7733FF,#FFFFFF","Neptune Smoke Machine","Something fishy is going on..."],["s","1110","summer_pool*1","2482","0","2","2","#00C8C8,#00C8C8,#00C8C8,#00C8C8,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#00C8C8","Blue Summer Pool","Fancy a dip?"],["s","1111","summer_pool*2","2482","0","2","2","#FF3219,#FF3219,#FF3219,#FF3219,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FF3219","Red Summer Pool","Fancy a dip?"],["s","1112","summer_pool*3","2482","0","2","2","#19C819,#19C819,#19C819,#19C819,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#19C819","Green Summer Pool","Fancy a dip?"],["s","1113","summer_pool*4","2482","0","2","2","#FFD837,#FFD837,#FFD837,#FFD837,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFD837","Yellow Summer Pool","Fancy a dip?"],["s","1114","djesko_turntable","437","0","1","1","","Habbo Turntable","For the music-lovers"],["s","1115","hologram","13633","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","Holopod","As if by magic..."],["s","1116","redhologram","13633","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","Holo-girl","You're her only hope..."],["s","1117","typingmachine","437","0","1","1","0,0,0","Typewriter","Write that bestseller"],["s","1118","spyro","437","0","1","1","0,0,0","Dragon Egg","The stuff of legend"],["s","1119","rare_globe","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","Snow Globe","It's all white.."],["s","1120","rare_xmas_screen","13144","2","2","1","0,0,0","Lappland Greetings","Ho Ho Ho!"],["s","1121","valentinescreen","13144","2","2","1","0,0,0","Holiday Romance","Peep through and smile!"],["s","1122","rare_hammock","437","0","1","3","0,0,0","Hammock","Eco bed"],["s","1123","sandrug","1272","0","2","2","0,0,0","Tropical Beach Rug","Your own paradise island"],["s","1124","rare_snowrug","1272","0","2","2","0,0,0","Snow Rug","Chilled Elegance"],["s","1125","rare_moonrug","437","0","2","2","0,0,0","Moon Patch","Desolation rocks!"],["s","1126","rare_daffodil_rug","437","0","2","2","0,0,0","Petal Patch","A little bit of outdoors indoors.."],["s","1127","plant_cruddy","437","0","1","1","","Aloe Vera","Goodbye Bert..."],["s","1128","rare_mnstr","2429","0","1","1","","Venomus Habbolus","Don't get too close..."],["s","1129","prize1","437","0","1","1","0,0,0","Gold Trophy","Gorgeously glittery"],["s","1130","prize2","437","0","1","1","0,0,0","Silver Trophy","Nice and shiny"],["s","1131","prize3","437","0","1","1","0,0,0","Bronze Trophy","A weighty award"],["s","1132","rare_beehive_bulb","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#55C4DE","Blue Amber Lamp","A honey-hued glow"],["s","11118","rare_beehive_bulb*0","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","Blue Amber Lamp","A honey-hued glow"],["s","1133","rare_beehive_bulb*1","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FF4C47","Red Amber Lamp","A honey-hued glow"],["s","1134","rare_beehive_bulb*2","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFC307","Yellow Amber Lamp","A honey-hued glow"],["s","1135","rare_elephant_statue","437","0","1","1","#ffffff,#ffcf1c","Golden Elephant","Say hello to Nelly"],["s","1136","rare_elephant_statue*1","437","0","1","1","#ffffff,#bfbfbf","Silver Elephant","Say hello to Nelly"],["s","1137","rare_elephant_statue*2","437","0","1","1","#ffffff,#d46b00","Bronze Elephant","Say hello to Nelly"],["s","1138","rare_fountain","13603","0","1","1","#FFFFFF,#FFFFFF,#FF6666","Bird Bath (red)","For our feathered friends"],["s","1139","rare_fountain*1","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF","Bird Bath (grey)","For our feathered friends"],["s","1140","rare_fountain*2","13603","0","1","1","#FFFFFF,#FFFFFF,#B8CF00","Bird Bath (green)","For our feathered friends"],["s","1141","rare_fountain*3","13603","0","1","1","#FFFFFF,#FFFFFF,#59CCCC","Bird Bath (blue)","For our feathered friends"],["s","1142","samovar","13603","2","1","1","#FFFFFF","Russian Samovar","Click for a refreshing cuppa"],["s","1143","md_limukaappi","13603","2","1","1","","Habbo Cola Machine","A sparkling and refreshing pixel drink!"],["s","1144","rare_stand","437","0","1","1","0,0,0","Speaker's Corner","Stand and Deliver!"],["i","1145","poster","11385","","","","","",""],["s","1147","rare_parasol*1","15444","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFF11","Yellow Parasol","Block those rays!"],["s","1148","rare_parasol*2","15444","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#FF8F61","Orange Parasol","Block those rays!"],["s","1149","rare_parasol*3","15444","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#D47FFF","Violet Parasol","Block those rays!"],["s","1150","sleepingbag*1","437","0","1","3","#ed796b,#ffffff,#ed796b,#ffffff,#ed796b,#ffffff","Red Sleeping Bag","Ultimate coziness"],["s","1151","solarium_norja","13603","2","1","1","#FFFFFF,#FFFFFF,#FFFFFF","White Solarium","Rejuvenate your pixels!"],["s","1152","throne","437","0","1","1","0,0,0","Throne","Important Habbos only"],["s","1153","prizetrophy7*3","7057","0","1","1","#ffffff,#ffffff,#996600","Bronze Habbo trophy","Bronze Habbo trophy"],["s","1154","prizetrophy4*3","7057","0","1","1","#ffffff,#ffffff,#996600","Fish trophy","Breathtaking bronze"],["s","1155","prizetrophy3*3","7057","0","1","1","#ffffff,#ffffff,#996600","Globe trophy","Breathtaking bronze"],["s","1156","prizetrophy6*3","7057","0","1","1","#ffffff,#ffffff,#996600","Champion trophy","Breathtaking bronze"],["s","1157","prizetrophy4*2","7057","0","1","1","#ffffff,#ffffff,#ffffff","Fish trophy","Shiny silver"],["s","1158","prizetrophy7*2","7057","0","1","1","#ffffff,#ffffff,#ffffff","Silver Habbo trophy","Silver Habbo trophy"],["s","1159","prizetrophy3*2","7057","0","1","1","#ffffff,#ffffff,#ffffff","Globe trophy","Shiny silver"],["s","1160","prizetrophy6*2","7057","0","1","1","#ffffff,#ffffff,#ffffff","Champion trophy","Shiny silver"],["s","1161","prizetrophy4*1","7057","0","1","1","#ffffff,#ffffff,#FFDD3F","Fish trophy","Glittery gold"],["s","1162","prizetrophy3*1","7057","0","1","1","#ffffff,#ffffff,#FFDD3F","Globe trophy","Glittery gold"],["s","1163","prizetrophy7*1","7057","0","1","1","#ffffff,#ffffff,#FFDD3F","Gold Habbo trophy","Gold Habbo trophy"],["s","1164","prizetrophy6*1","7057","0","1","1","#ffffff,#ffffff,#FFDD3F","Champion trophy","Glittery gold"],["s","1165","noob_chair*1","11760","0","1","1","#FFFFFF,#EFE853,#EFE853,#FFFFFF,#EFE853,#EFE853","My first Habbo chair","Lightweight, practical and yellow"],["s","1166","noob_chair*2","11760","0","1","1","#FFFFFF,#4C526E,#8D92AB,#FFFFFF,#8D92AB,#4C526E","My first Habbo chair","Lightweight, practical, with dark blue stripes"],["s","1167","noob_chair*3","11760","0","1","1","#FFFFFF,#985A47,#D9AD90,#FFFFFF,#D9AD90,#985A47","My first Habbo chair","Lightweight, practical, with red stripes"],["s","1168","noob_chair*4","11760","0","1","1","#FFFFFF,#80B1BC,#DAF4FA,#FFFFFF,#DAF4FA,#80B1BC","My first Habbo chair","Lightweight, practical, with light blue stripes"],["s","1169","noob_chair*5","11760","0","1","1","#FFFFFF,#F6C0C0,#F6C0C0,#FFFFFF,#F6C0C0,#F6C0C0","My first Habbo chair","Lightweight, practical, with pink stripes"],["s","1170","noob_chair*6","11760","0","1","1","#FFFFFF,#FFD923,#B1B400,#FFFFFF,#B1B400,#FFD923","My first Habbo chair ","Lightweight, practical with dark yellow stripes"],["s","1171","noob_lamp*1","13603","0","1","1","#F0E641,#FFFFFF,#FFFFFF","My first Habbo lamp","Get the light right where you want it (yellow)"],["s","1172","noob_lamp*2","13603","0","1","1","#8D92AB,#FFFFFF,#FFFFFF","My first Habbo lamp","Get the light right where you want it (dark blue)"],["s","1173","noob_lamp*3","13603","0","1","1","#D9AD90,#FFFFFF,#FFFFFF","My first Habbo lamp","Get the light right where you want it (aubergine)"],["s","1174","noob_lamp*4","13603","0","1","1","#94CBD7,#FFFFFF,#FFFFFF","My first Habbo lamp","Get the light right where you want it (light blue)"],["s","1175","noob_lamp*5","13603","0","1","1","#F5779F,#FFFFFF,#FFFFFF","My first Habbo lamp","Get the light right where you want it (pink)"],["s","1176","noob_lamp*6","13603","0","1","1","#FFD406,#FFFFFF,#FFFFFF","My first Habbo lamp","Get the light right where you want it (canary yellow)"],["s","1177","noob_rug*1","11760","0","2","3","#FC9C45,#F4EC36","My first Habbo rug","Nice and neat sisal rug with orange edging"],["s","1178","noob_rug*2","11760","0","2","3","#4C526E,#8D92AB","My first Habbo rug","Nice and neat sisal rug with blue edging"],["s","1179","noob_rug*3","11760","0","2","3","#985A47,#D9AD90","My first Habbo rug","Nice and neat sisal rug with aubergine edging"],["s","1180","noob_rug*4","11760","0","2","3","#94CBD7,#DAF4FA","My first Habbo rug","Nice and neat sisal rug with light blue edging"],["s","1181","noob_rug*5","11760","0","2","3","#F5779F,#F6C0C0","My first Habbo rug","Nice and neat sisal rug with pink edging"],["s","1182","noob_rug*6","11760","0","2","3","#C1C400,#FFD406","My first Habbo rug","Nice and neat sisal rug with green edging"],["s","1183","noob_stool*1","11760","0","1","1","#FFFFFF,#F38420","My first Habbo stool","Unfold me and take the weight off (orange)"],["s","1184","noob_stool*2","11760","0","1","1","#FFFFFF,#4C526E","My first Habbo stool","Unfold me and take the weight off (dark blue)"],["s","1185","noob_stool*3","11760","0","1","1","#FFFFFF,#985A47","My first Habbo stool","Unfold me and take the weight off (aubergine)"],["s","1186","noob_stool*4","11760","0","1","1","#FFFFFF,#94CBD7","My first Habbo stool","Unfold me and take the weight off (light blue)"],["s","1187","noob_stool*5","11760","0","1","1","#FFFFFF,#F5779F","My first Habbo stool","Unfold me and take the weight off (pink)"],["s","1188","noob_stool*6","11760","0","1","1","#FFFFFF,#B1B400","My first Habbo stool","Unfold me and take the weight off (green)"],["s","1189","noob_table*1","11760","0","2","2","#FFFFFF,#F1E93A,#F38420","My first Habbo table","Lightweight, practical and orange"],["s","1190","noob_table*2","11760","0","2","2","#FFFFFF,#A5A9BC,#4C526E","My first Habbo table","Lightweight, practical and dark blue"],["s","1191","noob_table*3","11760","0","2","2","#FFFFFF,#D9AD90,#985A47","My first Habbo table","Lightweight, practical and aubergine"],["s","1192","noob_table*4","11760","0","2","2","#FFFFFF,#DAF4FA,#94CBD7","My first Habbo table","Lightweight, practical and light blue"],["s","1193","noob_table*5","11760","0","2","2","#FFFFFF,#F6C0C0,#F5779F","My first Habbo table","Lightweight, practical and pink"],["s","1194","noob_table*6","11760","0","2","2","#FFFFFF,#FFD406,#B1B400","My first Habbo table","Lightweight, practical and green"],["s","1195","carpet_soft_tut","3835","0","1","1","","Welcome Mat","Welcome, enjoy your stay!"],["i","1196","noob_window_double","6035","","","","","Window","Room with a view"],["i","1197","window_70s_narrow","13603","","","","","Small 70s Window","Takes you back"],["i","1198","window_70s_wide","13603","","","","","Large 70s Window","A view of the past"],["i","1199","window_basic","13603","","","","","Basic Window","Plain and simple"],["i","1200","window_chinese_narrow","7173","","","","","Small Oriental Window","Narrow wood carved frame"],["i","1201","window_chinese_wide","6303","","","","","Large Oriental Window","Dreaming of a Chinese summer"],["i","1202","window_double_default","6303","","","","","Double Window","Twice as good a view"],["i","1203","window_golden","6303","","","","","Golden Window","An expensive view"],["i","1204","window_grunge","13603","","","","","Grunge Window","Don't get too close!"],["i","1205","window_romantic_narrow","13603","","","","","Small Romantic Window","A beautiful view"],["i","1206","window_romantic_wide","13603","","","","","Large Romantic Window","Heavenly scent of flowers"],["i","1207","window_single_default","6303","","","","","Single Window","A simple view"],["i","1208","window_square","6303","","","","","Glass Square Window","Let's get creative!"],["i","1209","window_triple","6303","","","","","Bay Window","Now THAT'S a view!"],["i","1210","xmas_light","13603","","","","","Christmas Lights","Seen Rudolph's nose anywhere?"],["s","1211","christmas_poop","3438","0","1","1","","Reindeer Droppings","Bob?s magical fertilizer"],["s","1212","christmas_reindeer","15444","2","1","2","","Reindeer","Prancer becomes Rudolph in a click!"],["s","1213","christmas_sleigh","13144","2","2","2","","Winter Sleigh","Ready for your Xmas cheer"],["s","1214","tree6","3438","0","1","1","","Flashy Christmas Tree","The future's bright!"],["s","1215","tree7","3438","0","1","1","0,0,0","Snowy Christmas Tree","Walking in a winter wonderland!"],["s","1216","xmas_cstl_gate","13603","0","2","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","Ice Castle Gate","Let that icy draft out!"],["s","1217","xmas_cstl_twr","3438","0","1","1","0,0,0","Ice Castle Tower","All I see from up here is snow!"],["s","1218","xmas_cstl_wall","3438","0","2","1","0,0,0","Ice Castle Wall","Solid blocks of ice and snow"],["s","1219","xmas_icelamp","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF","Ice Block Lantern","Light up the winter nights"],["s","1220","plant_maze_snow","13144","2","2","1","","Snowy Maze Shrubbery","Labyrinths galore!"],["s","1221","plant_mazegate_snow","13603","2","2","1","","Snowy Maze Gate","There's snow way through!"],["s","1222","safe_silo_pb","13603","2","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","postbank Safe","Totally shatter-proof!"],["s","1223","exe_bardesk","3438","0","1","1","","Executive Bar Desk","Divide the profits!"],["s","1224","exe_corner","3438","0","1","1","","Executive Corner Desk","Tuck it away"],["s","1225","exe_chair","3438","0","1","1","","Executive Sofa Chair","Relaxing leather comfort"],["s","1226","exe_chair2","11385","0","1","1","","Executive Boss Chair","You're fired!"],["s","1227","exe_drinks","3438","2","1","1","","Executive Drinks Tray","Give a warm welcome"],["s","1228","exe_sofa","3438","0","3","1","","3-Seater Sofa","Relaxing leather comfort"],["s","1229","exe_table","13603","0","3","2","","Executive Desk","Take a memo, Featherstone"],["s","1230","exe_rug","11385","0","3","3","","Executive Rug","Please remove your shoes!"],["s","1231","exe_s_table","13603","0","2","2","","Executive Glass Table","Get a clear reflection!"],["s","1232","exe_globe","13603","0","1","1","","Power Globe","The power is yours!"],["s","1233","exe_plant","13603","0","1","1","","Executive Plant","Shimmering hedge trimming!"],["s","1234","fortune","13633","0","1","1","","Crystal Ball","Gaze into the future"],["s","1235","val_choco","13603","0","1","1","","Heart Shaped Chocs","One for them. Two for me!"],["s","1236","val_randomizer","13603","2","4","1","","Love Randomiser","Surprise surprise! (Cilla Black not included)"],["i","1237","hrella_poster_1","3839","","","","","Porthole","Brighten up your cabin"],["i","1238","hrella_poster_2","4134","","","","","Life Buoy","For those scary Lido moments"],["i","1239","hrella_poster_3","3839","","","","","Anchor","Don't drift away!"],["s","1240","val_teddy*1","13144","0","1","1","#BFBFBF,#FFFFFF,#BFBFBF,#BFBFBF,#FFFFFF","Grey Share Bear","The grey bear of affection"],["s","1241","val_teddy*2","13144","0","1","1","#EE7EA4,#FFFFFF,#EE7EA4,#EE7EA4,#FFFFFF","Pink Share Bear","The pink bear of passion"],["s","1242","val_teddy*3","13144","0","1","1","#7CB135,#FFFFFF,#7CB135,#7CB135,#FFFFFF","Green Share Bear","The green bear of friendship"],["s","1243","val_teddy*4","13144","0","1","1","#965014,#FFFFFF,#965014,#965014,#FFFFFF","Brown Share Bear","The brown bear of naughtiness"],["s","1244","val_teddy*5","13144","0","1","1","#FFD837,#FFFFFF,#FFD837,#FFD837,#FFFFFF","Yellow Share Bear","The yellow bear of understanding"],["s","1245","val_teddy*6","13144","0","1","1","#ABD0D2,#FFFFFF,#ABD0D2,#ABD0D2,#FFFFFF","Blue Share Bear","The blue bear of happiness"],["s","1246","sand_cstl_gate","13603","0","2","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","Sand Castle Gate","Keep the sand out!"],["s","1247","sand_cstl_twr","4134","0","1","1","0,0,0","Sand Castle Tower","Look out for sand storms!"],["s","1248","sand_cstl_wall","4134","0","2","1","0,0,0","Sand Castle Wall","Not entirely water proof!"],["s","1249","summer_chair*1","13144","2","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#ABD0D2","Aqua Deck Chair","Got your swimming trunks?"],["s","1250","summer_chair*2","13144","2","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FF99BC","Pink Deck Chair","Waterproof!"],["s","1251","summer_chair*3","13144","2","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#525252","Black Deck Chair","Rest from castle building!"],["s","1252","summer_chair*4","13144","2","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","White Deck Chair","Sit back and enjoy!"],["s","1253","summer_chair*5","13144","2","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#F7EBBC","Deck Chair","Beige"],["s","1254","summer_chair*6","13144","2","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#5EAAF8","Deck Chair","Blue"],["s","1255","summer_chair*7","13144","2","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#92D13D","Green Deck Chair","Reserved!"],["s","1256","summer_chair*8","13144","2","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFD837","Yellow Deck Chair","Got your sun cream?"],["s","1257","summer_chair*9","13144","2","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#E14218","Red Deck Chair","Got your sunglasses?"],["s","1258","summer_grill*1","13603","0","2","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#00C8C8,#00C8C8,#00C8C8,#00C8C8","Blue Barbeque Grill","Plenty of ribs on that barbie"],["s","1259","summer_grill*2","13603","0","2","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FF3219,#FF3219,#FF3219,#FF3219","Red Barbeque Grill","Plenty of shrimp on that barbie"],["s","1260","summer_grill*3","13603","0","2","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#19C819,#19C819,#19C819,#19C819","Green Barbeque Grill","Plenty of steak on that barbie"],["s","1261","summer_grill*4","13603","0","2","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFD837,#FFD837,#FFD837,#FFD837","Green Barbeque Grill","Plenty of burgers on that barbie"],["s","1262","sw_table","4134","0","1","2","","Adventure Desk","Where will you go today?"],["i","1263","sw_swords","4134","","","","","Swords","The other kind of fencing..."],["i","1264","sw_stone","4134","","","","","Mysterious Necklace","Why does the stone glow at night?"],["s","1265","sw_raven","4495","0","1","1","","Raven","Lurking... with intent"],["i","1266","sw_hole","4134","","","","","Ventilation Duct","Full of creepy crawlies"],["s","1267","sw_chest","13758","0","1","2","","Ye Olde Chest","One size fits all"],["s","1268","jp_katana1","5684","0","1","1","","HC Katana Red","Essential chopping!"],["s","1269","jp_katana2","5684","0","1","1","","Katana Blue","Let's get chopping!"],["s","1270","jp_katana3","5684","0","1","1","","Katana Green","Hurry! Chop chop!"],["s","1271","jp_table","13603","0","2","2","","Chabu Dai","Japanese coffee table"],["s","1272","jp_rare","13603","0","2","2","","Shishi Odishi","Traditional Japanese water ornament"],["s","1273","jukebox_ptv*1","7053","2","1","1","#FFFFFF,#FFFFFF","Jukebox Pacha TV","Jukebox Pacha TV"],["s","1274","calippo","13603","2","1","1","","Calippo icecream machine","Basic model"],["s","1275","nouvelle_trax","13603","2","1","1","","Nouvelle Trax",""],["i","1276","md_can","13603","","","","","Bubble Juice Can","Enough bubbling juice for one evening"],["i","1277","md_logo_wall","13603","","","","","Bubble Juice Logo","Bubble up your wall"],["s","1278","md_rug","4638","0","4","4","","Bubble Juice Floor","Bubbles under your steps"],["s","1279","rclr_lamp","13603","0","1","1","","Moon Lamp","Light your space"],["s","1280","sound_set_53","6035","0","1","1","","Snowy Surprise","Break the icy silence"],["s","1281","sound_set_54","6035","0","1","1","","Oh Blinging Tree","Tune into Christmas"],["s","1282","jp_teamaker","13603","2","1","1","","Japanese Teamaker","Makes a steaming brew!"],["s","1283","tiki_tray0","6035","0","1","1","","Empty Tray","That was tasty!"],["s","1284","tiki_tray1","6035","0","1","1","","Tiki Fruit Tray","Refreshing!"],["s","1285","tiki_tray2","6035","0","1","1","","Tiki Pineapple Plate","Fresh and juicy!"],["s","1286","tiki_tray3","6035","0","1","1","","Tiki Fish Tray","Freshly caught and BBQ'd!"],["s","1287","tiki_tray4","6035","0","1","1","","Tiki Pig Tray","Slow roastet pig head"],["s","1288","noob_plant","11760","0","1","1","","Lucky Bamboo","Starter Furni"],["i","1289","tampax_wall","13603","","","","","Tampax wall","Tampax wall"],["s","1290","tampax_rug","6035","0","3","4","","Tampax rug","Tampax rug"],["i","1291","tiki_wallplnt","6035","","","","","Jungle Wallplant","Dense jungle ahead!"],["s","1292","tiki_bardesk","6035","0","1","1","","Tiki Bar Desk","Serving up Summer"],["s","1293","tiki_bench","6035","0","1","1","","Tiki Bar Stool","Sit back and relax!"],["s","1294","tiki_bflies","13603","0","1","1","","Butterflies","Get your island beauties"],["s","1295","tiki_junglerug","6035","0","2","2","","Jungle Patch","Bring your machete"],["s","1296","tiki_parasol","13603","0","1","1","","Tiki Parasol","Funky party lighting"],["s","1297","tiki_sand","6035","0","2","2","","Island Sand Patch","Life's a beach!"],["s","1298","tiki_statue","13603","2","1","1","","Tribal Statue","Burn baby burn.. tiki inferno"],["s","1299","tiki_torch","13603","2","1","1","","Beach Torch","Lighting the way"],["s","1300","tiki_toucan","6035","0","1","1","","Toucan","Ermm... *pecks*"],["s","1301","tiki_waterfall","6035","0","3","2","","Tiki Waterfall","Fresh mountain water"],["i","1302","tiki_surfboard","13603","","","","","Surfboard","Ride the waves dude!"],["s","1303","tiki_corner","6035","0","1","1","","Tiki Bar Corner","Nothing says a bar like a corner?"],["s","1304","rare_mmmth","2116","0","2","1","","Sofa Mammut","Pre Historic Sofa"],["s","1305","bw_croc","2482","0","1","3","","Inflatable Croc","Never smile at a Crocodile."],["s","1306","holo_dragon","13603","0","1","1","","Holo Dragon","Dragon Hologram"],["s","1329","diner_shaker","13603","0","1","1","","Diner Shaker","So cool it's shaking!"],["s","1332","diner_rug","11385","0","2","2","","Diner Floor","Shiny polished finish"],["s","1333","svnr_de","13603","0","1","1","","German Gnome","October 2008, 4/6"],["s","1334","svnr_uk","8067","0","1","1","","Big Ben","September 2008, 3/6"],["s","1335","svnr_it","13144","2","2","1","","Venetian Gondola","July 2008, 1/6"],["s","1336","svnr_nl","13144","2","1","2","","Dutch Clog","August 2008, 2/6"],["s","1337","diner_tray_0","6303","0","1","1","","Empty Plate","Had your fill, or running on empty?"],["s","1338","diner_tray_1","6303","0","1","1","","Burger and Chips","99% British beef!"],["s","1339","diner_tray_2","6303","0","1","1","","Steak and Mash","Juicy sirloin with onion gravy"],["s","1340","diner_tray_3","6303","0","1","1","","Spaghetti Meatballs","Juicy tomato sauce included!"],["s","1341","diner_tray_4","6303","0","1","1","","Pancakes","Smothered in syrup and butter!"],["s","1342","diner_tray_5","6303","0","1","1","","Bacon and Eggs","Smoky bacon and free range eggs!"],["s","1343","diner_tray_6","6303","0","1","1","","Ice Cream Sundae","Vanilla, chocolate and strawberry!"],["s","1344","diner_tray_7","13603","0","1","1","","Accompaniments","Tommy and Mustard"],["i","1346","ads_sunnyd","6321","","","","","Sunny Delight","Sunny Delight"],["s","1348","sound_set_65","6035","0","1","1","","Sound set 65",""],["s","1349","sound_set_67","6035","0","1","1","","Sound set 67",""],["s","1351","sound_set_68","6035","0","1","1","","Sound set 68",""],["s","1352","sound_set_69","6035","0","1","1","","Sound set 69",""],["s","1353","sound_set_70","6035","0","1","1","","Sound set 70",""],["s","1354","sound_set_66","6035","0","1","1","","Sound set 66",""],["s","1355","song_disk","7053","0","1","1","","Traxdisc","Burn, baby burn"],["i","1358","window_diner","13603","","","","","Large Diner Window","Panoramic view of America"],["i","1359","window_diner2","13603","","","","","Small Diner Window","Good grub, good view!"],["s","1360","svnr_aus","6303","2","1","1","","Aussie Outback","November 2008, 5/6"],["s","1365","ads_dave_cns","9559","0","1","1","","Dave cns","ads Dave cns"],["i","1366","ads_dave_wall","9559","","","","","Dave Wall","ads dave wall"],["i","1367","diner_walltable","6820","","","","","Diner Side Table","Attaches to the wall"],["s","1371","present_gen","3835","0","1","1","","Gift","What's inside?"],["s","1372","present_gen1","3835","0","1","1","","Gift","What's inside?"],["s","1373","present_gen2","3835","0","1","1","","Gift","What's inside?"],["s","1374","present_gen3","3835","0","1","1","","Gift","What's inside?"],["s","1375","present_gen4","3835","0","1","1","","Gift","What's inside?"],["s","1376","present_gen5","3835","0","1","1","","Gift","What's inside?"],["s","1377","present_gen6","3835","0","1","1","","Gift","What's inside?"],["s","1378","greek_corner","7053","0","1","1","","Greek Corner","Tuck it away!"],["s","1379","greek_gate","13603","0","2","1","","Greek Gate","Enter mortal, exit immortal!"],["s","1380","greek_pillars","7053","0","2","1","","Greek Pillars","Architectural splendor!"],["s","1381","greek_seat","7053","0","1","1","","Greek Seat","Park your bot on this stone slab!"],["s","2195","greek_block","7053","0","2","1","","Greek Block","A nice stone block"],["s","1382","greektrophy*1","7235","2","1","1","#FFFFFF,#FFFFFF,#FFDD3F","Greek trophy","Glittery gold"],["s","1383","greektrophy*2","7235","2","1","1","#FFFFFF,#FFFFFF,#DDDDDD","Greek trophy","Shiny silver"],["s","1384","greektrophy*3","7235","2","1","1","#FFFFFF,#FFFFFF,#996600","Greek trophy","Breathtaking bronze"],["s","1385","easy_bowl2","7053","0","1","1","","Easy bowl2","old campaign product desc"],["s","1386","easy_carpet","7053","0","4","4","0,0,0","Easy carpet","Easy carpet"],["i","1387","easy_poster","7053","","","","","Easy poster","Easy mac promotion"],["i","1388","ads_nokia_logo","13603","","","","","Nokia Phone","Connecting People"],["i","1389","ads_nokia_phone","13603","","","","","ads_nokia_phone name","ads_nokia_phone desc"],["i","1390","window_hole","13603","","","","","Window","Window"],["i","1391","window_skyscraper","7339","","","","","Skyscraper Window","Dizzy heights!"],["i","1392","landscape","13633","","","","","",""],["i","1393","landscape","13633","","","","","",""],["i","1394","landscape","13633","","","","","",""],["i","1395","landscape","13633","","","","","",""],["i","1396","landscape","13633","","","","","",""],["i","1397","landscape","13633","","","","","",""],["s","1400","det_body","7553","0","2","3","","Chalk Outline","They were a great Habbo..."],["s","1401","det_divider","13603","0","2","1","","Police Divider","Crime scene, stay out!"],["i","1402","det_bhole","13603","","","","","Bullet Hole","That was close!"],["s","1403","hcc_chair","7553","0","1","1","","Trendy Stool","Shiny varnished finish"],["s","1404","hcc_minibar","13603","2","1","1","","Minibar","Cool look, cool drinks!"],["s","1405","hcc_shelf","7553","0","1","2","","Bookshelf","Your own Habbo archives"],["s","1406","hcc_sofa","7553","0","2","1","","Low Back Sofa","Get your friends over!"],["s","1407","hcc_sofachair","7553","0","1","1","","Reclining Chair","Put your feet up!"],["s","1408","hcc_stool","7553","0","1","1","","Antique Stool","For larger gatherings"],["s","1409","sob_carpet1","8067","0","3","5","","Street of Bobba","SOB flamer"],["s","1418","igor_seat","13603","0","1","1","","Hump Massaging Chair","My Hump, My Hump, My Hump"],["s","1419","ads_igorbrain","13603","2","1","1","","The Brain","Mwahhahahahaha brains..."],["s","1420","ads_igorraygun","13603","0","1","2","","Igor Ray Gun","Shoot down your foes!"],["s","1421","ads_igorswitch","13603","0","1","1","","Igor Switch","Nothing will work without this being on!"],["i","1422","hween08_wndwb","13603","","","","","Broken Window (small)","Was it a rock or a dictionary?"],["i","1423","hween08_wndw","13603","","","","","Broken Window (large)","Was it a bird or a parsnip?"],["i","1424","hween08_rad","9069","","","","","Nuclear Radiation Sign","Warning! Smelly cheese ahead!"],["i","1425","hween08_bio","9069","","","","","Biohazard Sign","Every sock bin needs one!"],["s","1427","hween08_bath2","15444","0","1","2","","Ooze Bath","Relax. Take it oozey!"],["s","1428","hween08_bbag","9069","0","1","3","","Body Bag","Not a nice place to catch some Zzz's"],["s","1429","hween08_bed","10278","0","1","3","","Hospital Bed (blood)","You're in safe hands..."],["s","1430","hween08_bed2","10278","0","1","3","","Hospital Bed (ooze)","I'm wicked and I'm oozey!"],["s","1431","hween08_curtain","9069","0","3","1","","Hospital Curtain (blood)","Doctors at work"],["s","1432","hween08_curtain2","9069","0","3","1","","Hospital Curtain (ooze)","Nurses at work"],["s","1433","hween08_defibs","9069","0","1","1","","Life Support (blood)","Brought back to Earth with a shock!"],["s","1434","hween08_defibs2","9069","0","1","1","","Life Support (ooze)","Brought back to Earth with a shock!"],["s","1435","hween08_manhole","13603","0","1","1","","Manhole","Watch your step..."],["s","1436","hween08_sink","13603","2","1","1","","Blood Sink","Nasty shaving accident?"],["s","1437","hween08_sink2","13603","2","1","1","","Ooze Sink","Who picked a spot?"],["s","1438","hween08_trll","9069","0","1","1","","Surgeon's Trolley","Chop, poke, ouch!"],["i","1439","hw08_xray","13603","","","","","X-Ray Poster","For viewing your bruises"],["s","1440","party_ball","13603","0","1","1","","Glitter Ball","Every party MUST have one!"],["s","1441","party_barcorn","13603","0","1","1","","Bar Corner","Every party needs one!"],["s","1442","party_bardesk","13603","0","1","1","","Bar Centre","Keep the punters at bay"],["s","1443","party_beamer","13603","2","1","1","","Dance Floor Beamer","Get some lights to match your dancing shapes!"],["s","1444","party_block","9559","0","1","1","","Small Stage","Build yourself a stage to host events!"],["s","1445","party_block2","9559","0","2","2","","Stage Block Large","Make mine a large!"],["s","1446","party_chair","13603","0","1","1","","High Class Bar Stool","Sit high and people watch on this!"],["s","1447","party_discol","13603","2","1","1","","Spotlight","Focus your attention or dance within its glow!"],["s","1448","party_djtable","9559","0","1","2","","DJ Table","Scratch it, spin it and play some banging tracks!"],["s","1449","party_floor","13603","0","2","2","","Disco Floor","The perfect place to throw some shapes"],["i","1450","party_led","13603","","","","","Big Wall Lights","Flashing Neon lights on the wall!"],["s","1451","party_mic","9559","0","1","1","","Microphone","Sing, MC, shout out to your friends!"],["i","1452","party_neon1","13603","","","","","Neon Right Arrows","Find your way right in the dark!"],["i","1453","party_neon2","13603","","","","","Neon Left Arrows","Find your way left in the dark!"],["i","1454","party_neon3","13603","","","","","Neon Pink Flamingo","Celebrate the Eighties with this!"],["i","1455","party_neon4","13603","","","","","Neon Skull Light","A dull wall be gone!"],["i","1456","party_neon5","13603","","","","","Neon Heart Light","I heart Neon!"],["s","1457","party_ravel","13603","2","1","1","","Dance Floor Laser","Meet the 22nd Century's dance floor lighting!"],["s","1458","party_seat","9559","0","1","1","","Club seat","Rest your dancing feet on this!"],["i","1459","party_shelf","13633","","","","","Bar Shelf","Line up your beverages!"],["s","1460","party_table","13603","0","1","1","","Glass High Bar Table","Chat with your friends over this!"],["s","1461","party_tray","13603","2","1","1","","Club Tray","Rest your drinks on this!"],["s","1462","party_tube_bubble","13603","0","1","1","","Bubbles Machine","Bubbles! Bubbles! Lovely bubbles!"],["s","1463","party_tube_lava","13603","0","1","1","","Lava Lamp","Despite being made a lava, it is very cool."],["i","1464","party_wc_boy","13603","","","","","Boys Toilets","Stand up or sitting down, this is for the Boys only!"],["i","1465","party_wc_girl","13603","","","","","Girls Toilets","Girls only please."],["i","1466","ads_cmusic","9559","","","","","TBD Central Musical TV","TBD Click it away"],["i","1467","party_lights","13603","","","","","Party lights","Dance dance dance!"],["s","1493","xmas08_chair","10278","0","1","1","","Ice chair","Make sure you wear trousers!"],["s","1494","xmas08_cubetree","10278","0","1","1","","Cube Tree","So ice Cubes DO grow on trees..."],["s","1495","xmas08_dvdr1","10278","0","2","1","","Ice divider","Stone and ice in one snowy wall!"],["s","1496","xmas08_dvdr2","13603","0","1","1","","Icy Divider Corner","What's a dividing wall without a corner?"],["s","1497","xmas08_geysir","10278","0","2","2","","Geyser","Nothing quite like a warm exploding water hole!"],["s","1498","xmas08_hole","13603","2","1","1","","Ice Fish Hole","What can you catch?"],["s","1499","xmas08_hottub","13144","2","2","2","","Hot Tub","Party time in the Arctic people!"],["s","1500","xmas08_icerug","13603","0","2","2","","Ice Patch","Ice, Snow or Wet Slush? All is possible with this."],["s","1501","xmas08_icetree","13603","0","1","1","","Icy Christmas Tree","It can't be Christmas without it!"],["i","1502","xmas08_icewall","13603","","","","","Icy Wall","The stuff Ice Palace's are made of!"],["s","1503","xmas08_lantern","13603","0","1","1","","Snowball Lantern Pile","No dodging this pile!"],["s","1504","xmas08_snowpl","13603","0","1","1","","Snow Seat","Take a rest and warm by a fire perhaps?"],["s","1505","xmas08_table","10278","0","2","2","","Icy table","Keeps your ice cream chilled - guaranteed!"],["s","1506","xmas08_telep","13603","2","1","1","","Icy Teleport","Travel space and time in this freeze block!"],["s","1507","xmas08_trph1","10684","0","1","1","","Arctic Penguin Trophy","Given to those who have adopted ALL 26 penguins!"],["i","1508","xmas08_wallpaper","13603","","","","","Snowy Posters","The Arctic scenery on your walls!"],["s","1509","campfire","13603","0","1","1","","Camp fire","Keep warm on those Arctic nights!"],["s","1510","sound_set_71","10278","0","1","1","","Ice cool sounds","Get your Winter Wonderland sounds for your Trax Machine!"],["s","1511","xmas_snow","10278","0","2","2","","Snow Storm","Get lost in your own blizzard!"],["s","1513","ads_cltele","13603","2","1","1","","Idea Agency Teleporter","Whatever your Idea, it's better out than in."],["s","1514","ads_cldesk","10684","0","2","2","","Idea Agency Desk","Work on your latest agency brief."],["i","1515","ads_clwall1","10684","","","","","Idea Agency Plasma 1","ChildLine"],["i","1516","ads_clwall2","10684","","","","","Idea Agency Plasma 2","Welcome to the Idea Agency"],["s","1517","ads_ob_pillow","13603","0","1","1","","Ob pillow","The perfect way to relax"],["i","1518","ads_ob_wall","10684","","","","","Ob wall","TBD ads_ob_wall"],["s","1519","lostc_merdragon","13603","0","1","3","","Leviathan","1/6 - January 2009"],["s","1520","xmas08_trph2","11202","0","1","1","","Eco Friendly Penguin","Given to Eco friendly Habbo!"],["s","1521","fx_explosion","13603","0","1","1","","The Kaboomer","Blow it up, baby!"],["s","1522","fx_bubble","13603","0","1","1","","Bubbles","Forever blowing bubbles!"],["s","1523","fx_flare","13603","0","1","1","","Firestarter","Light it up!"],["s","1524","ads_igor_flask","13603","0","1","1","","Glass Flask","Down the hatch!"],["s","1525","ads_igor_dsk","13603","0","2","1","","Inventor's Desk","Draw your evil plans"],["i","1526","ads_igorevilb","13603","","","","","Evil Bone","It's not a funny bone"],["i","1527","ads_igor_wall","11967","","","","","Monster Plan Poster","The latest model!"],["i","1528","china_light","13603","","","","","Chinese Wall Lamp","Flickers in the Eastern wind"],["s","1529","china_moongt","13603","1","1","3","","Moongate","A mysterious and eery past"],["s","1530","china_ox","11551","0","1","1","","Ox Statue","An oriental sculpture"],["i","1531","china_pstr1","11551","","","","","Ox Poster","Celebrate the year ahead"],["i","1532","china_pstr2","11551","","","","","Dragon Poster","Majestic flying beast"],["s","1533","kinkysofa","11551","0","2","1","","Kinky Sofa","Don't look at it under UV light!"],["s","1534","bolly_lotus_pool","13603","0","2","2","","Lotus Pool","Giant passionate flower"],["s","1535","bolly_corner","13603","0","1","1","","Bollywood Corner","Tuck it away"],["s","1536","bolly_desk","13603","0","2","1","","Bollywood Desk","To build and divide"],["s","1537","bolly_drapea","13603","0","3","1","","Pink Curtain","Made with the finest materials"],["s","1538","bolly_drapeb","13603","0","3","1","","Green Curtain","Made with the finest materials"],["s","1539","bolly_drapec","13603","0","3","1","","Yellow Curtain","Made with the finest materials"],["s","1540","bolly_pillow","11760","0","1","1","","Star Pillow","Don't forget to make a wish!"],["s","1541","bolly_fountain","13603","0","2","2","","Extravagant Fountain","Now that's refreshing!"],["s","1542","bolly_lamp","13603","0","1","1","","Chandelier","Turn the lights down low"],["s","1543","bolly_monkey_lamp","15444","0","1","1","","Monkey Lamp","Cast a cheeky glow"],["s","1544","bolly_phant","13603","2","1","1","","Elephant MiniBar","For he's a 'bolly' good fellow!"],["s","1545","bolly_petals","13603","0","2","2","","Petal Flurry","Lay down a bed of roses"],["s","1546","bolly_palm","11760","0","1","1","","Palm Tree","Watch for falling coconuts!"],["s","1547","bolly_swing","11760","0","2","1","","Swing","Swing low, my sweet."],["s","1548","bolly_table","11760","0","2","2","","Large Ornamental Table","Decorative granite finish"],["s","1549","bolly_tile1","11760","0","2","2","","Ornamental Tile","The floor is your canvas"],["s","1550","bolly_tile2","11760","0","2","2","","Standard Tile","The floor is your canvas"],["s","1551","bolly_vase","11760","0","1","1","","Vase of Flowers","Let off a heavenly scent"],["s","1552","bolly_tree","13603","0","1","1","","Palm Tree","Bollywood meets Hollywood"],["i","1553","bolly_wdw_wd","13603","","","","","Bolly Window","Sets the scene"],["s","1554","lc_coral_divider_hi","13144","0","2","1","","Large Coral Divider","Keep those pesky sharks out"],["s","1555","lc_coral_divider_low","13144","0","2","1","","Small Coral Divider","Perhaps you could swim over?"],["i","1556","lc_wall1","13144","","","","","Rock Wall","Depths of the ocean"],["i","1557","lc_wall2","13144","","","","","Coral Wall","There's life in the deep blue"],["i","1558","lc_window1","13603","","","","","Wooden Window","The deep blue"],["i","1559","lc_window2","13603","","","","","Aquarium Window","Creates a stunning scene"],["s","1560","lc_anemone","13603","0","1","1","","Anemone","In glorious water colour!"],["s","1561","lc_chair","13144","0","1","1","","Wooden Chair","No rusty nails, in sight"],["s","1562","lc_corner","13144","0","1","1","","Wooden Corner","Tuck it away"],["s","1563","lc_desk","13144","0","2","1","","Wooden Bar Desk","Not for sitting"],["s","1564","lc_stool","13144","0","1","1","","Wooden Stool","Watch out for splinters"],["s","1565","lc_table","13144","0","2","2","","Captain's Table","Treasure map not included"],["s","1566","lc_tile1","13144","0","2","2","","Marble Floor Tile","Elegant underwater flooring"],["s","1567","lc_tile2","13144","0","2","2","","Cobbled Stones","Rocky room foundations"],["s","1568","lc_tubes_corners","13144","0","1","1","","Water Tube Corner","Sends you round the bend"],["s","1569","lc_tubes_straight","13144","0","1","1","","Water Tube Straight","Just go with the flow"],["s","1570","lostc_teleport","13758","2","1","1","","Architeuthis","March Collectable 2009, 3/6"],["s","1571","lc_crab1","13144","0","2","2","","Crab Patch","Careful where you put your feet!"],["s","1572","lc_crab2","13144","0","1","1","","Sally Lightfoot","Careful! She'll give it 'all that'"],["s","1573","lc_glass_floor","13144","0","2","3","","Ocean Window Rug","Under the sea!"],["s","1574","lc_medusa1","13603","0","1","1","","Large Jellyfish Lamp","There's no sting in this tail"],["s","1575","lc_medusa2","13603","0","1","1","","Small Jellyfish Lamp","There's no sting in this tail"],["s","1576","ads_711shelf","13144","0","1","2","","ads 711shelf","ads_711shelf desc"],["s","1577","ads_idol_floor1","13603","0","2","2","","American Idol Floor Tile 1","Create a custom floor in your American Idol room"],["s","1578","ads_idol_desk","11967","0","1","4","","American Idol Judge Desk","No audition room is complete with out one of these!"],["s","1579","ads_idol_ch","15444","0","1","1","","American Idol Judge Chair","Sit comfortably in this American Idol Judge Chair"],["s","1580","ads_idol_floor2","13603","0","2","2","","American Idol Floor Tile 2","Make your American Idol room more unique with these tiles"],["s","1581","ads_idol_piano","13603","0","2","2","","American Idol Piano","Write a beautiful ballad for the performance of your life!"],["i","1582","ads_idol_wall","13603","","","","","American Idol Poster","Set the stage with this poster. Feels like you're really there, right?"],["i","1583","ads_idol_tv","13603","","","","","American Idol TV","TBD Click it away"],["s","1584","ads_idol_mic","12636","0","1","1","","American Idol Microphone","Sing your heart out! Well, not literally..."],["s","1585","ads_idol_drape","13603","0","3","1","","American Idol Curtain","Create the perfect American Idol set with these curtains"],["s","1586","ads_idol_audChr","13603","0","1","1","","American Idol Audience Chair","Fancy seating for your audience!"],["s","1587","ads_idol_pchair","13094","0","1","1","","American Idol Piano Chair","Sit comfortably in this chair with your Idol piano"],["s","1588","ads_idol_trax","13603","2","1","1","","American Idol Trax Machine","Everything sounds sweeter with this custom American Idol Trax Machine!"],["s","1589","ads_idol_tele","13603","0","1","1","","American Idol Star Teleport","This could be the doorway to your dreams!"],["s","1590","ads_idol_jukebox*1","13094","2","1","1","#FFFFFF,#FFFFFF","American Idol Jukebox","I sound better already!"],["s","1591","ads_idol_clRack","13571","0","3","1","","Clothes Rack","Finally! Somewhere to hang up your clothes"],["i","1592","ads_idol_mirror","13603","","","","","Makeup Mirror","Pass the lipstick please!"],["s","1593","ads_idol_voting_ch","13603","0","1","1","","Voting Chair","Do you have a good ear for music?"],["i","1594","ads_mall_winbea","13571","","","","","Mall Beauty Salon","Give yourself some red carpet glamour in the Salon"],["i","1595","ads_mall_wincin","13571","","","","","Mall Cinema Window","What movies are playing in the big silver screen?"],["s","1600","ads_idol_hotspot","13603","2","1","1","","Hot Spot Scoreboard","Stand here and await the verdict!"],["i","1601","eco_curtains1","13632","","","","","Eco Curtain 1","Help keep the heat in"],["i","1602","eco_curtains2","13632","","","","","Eco Curtain 2","Help keep the heat in"],["i","1603","eco_curtains3","13632","","","","","Eco Curtain 3","Help keep the heat in"],["s","1604","eco_cactus1","13632","0","1","1","","Potted Cactus 1","Find a place in the sun"],["s","1605","eco_cactus2","13632","0","1","1","","Potted Cactus 2","Find a place in the sun"],["s","1606","eco_cactus3","13632","0","1","1","","Potted Cactus 3","Find a place in the sun"],["s","1607","eco_chair1","13632","0","1","1","","Eco Stool 1","Green leaf design"],["s","1608","eco_chair2","13632","0","1","1","","Eco Stool 2","Brown floral design"],["s","1609","eco_chair3","13632","0","1","1","","Eco Stool 3","Black and white skull design"],["s","1610","eco_fruits1","13632","2","1","1","","Fruit Bowl 1","From tree to hand in 3 pixels!"],["s","1611","eco_fruits2","13632","2","1","1","","Fruit Bowl 2","From tree to hand in 3 pixels!"],["s","1612","eco_fruits3","13632","2","1","1","","Fruit Bowl 3","From tree to hand in 3 pixels!"],["s","1613","eco_lamp1","15444","1","1","1","","Eco Lamp 1","Energy saving bulb fitted"],["s","1614","eco_lamp2","15444","0","1","1","","Eco Lamp 2","Energy saving bulb fitted"],["s","1615","eco_lamp3","15444","0","1","1","","Eco Lamp 3","Energy saving bulb fitted"],["s","1616","eco_light1","13632","0","1","1","","Eco Light 1","Energy saving bulb fitted"],["s","1617","eco_light2","13632","0","1","1","","Eco Light 2","Energy saving bulb fitted"],["s","1618","eco_light3","13632","0","1","1","","Eco Light 3","Energy saving bulb fitted"],["s","1619","eco_sofa1","13632","0","1","1","","Eco Armchair 1","Relax! You've done your bit"],["s","1620","eco_sofa2","13632","0","1","1","","Eco Armchair 2","Relax! You've done your bit"],["s","1621","eco_sofa3","13632","0","1","1","","Eco Armchair 3","Relax! You've done your bit"],["s","1622","eco_table1","13632","0","2","2","","Eco Coffee Table 1","Recycled wood as standard"],["s","1623","eco_table2","13632","0","2","2","","Eco Coffee Table 2","Recycled wood as standard"],["s","1624","eco_table3","13632","0","2","2","","Eco Coffee Table 3","Recycled wood as standard"],["s","1625","eco_tree1","13632","2","1","1","","Orange Tree","Actually, the tree is green..."],["s","1626","eco_tree2","13632","2","1","1","","Pear Tree","You'll want a pair of these..."],["s","1627","ecotron_box","13632","0","1","1","","Ecotron prize","This item is 100 % recycled."],["s","1701","bump_lights","13603","0","1","1","","Traffic Lights","Ready. Steady. Go!"],["s","1702","bump_road","13603","0","2","2","#FFFFFF,#626D8B,#FFFFFF","Road","Get in the fast lane"],["s","1703","bump_signs","13603","0","1","1","","Road Signs","7 in 1 road sign."],["s","1704","bump_tires","13603","0","1","1","","Bumper Tyres","Gets you back on track"],["s","1705","bump_tottero","13603","0","1","1","","Safety Cone","Not a road bump!"],["s","1706","ktchn_pots","13603","0","2","1","","Hanging Pot Rack","Watch your head!"],["s","1707","ktchn_dvdr","13603","0","2","1","","Kitchel Wall Divider","A contemporary backsplash for any kitchen"],["s","1708","ktchn_light","13603","0","2","1","","Kitchen Light","The perfect lighting fixture to prep your food"],["s","1709","ktchn_countr_2","13603","0","2","1","","Kitchen Counter Large","Vibrant and shiny."],["s","1710","ktchn_cornr","13603","0","1","1","","Kitchen Wall Divider Corner","A contemporary backsplash for any kitchen"],["s","1711","ktchn_gate","13603","0","2","1","","Kitchen Swinging Door","Easy to open and close during a bustling service."],["i","1712","ktchn_knives","13603","","","","","Magnetic Knife Holder","Keeps your knives organized."],["s","1713","ktchn_plates","13603","0","1","1","","Dinner Plates","Who didn't finish their dinner?"],["i","1714","ktchn_oven","13603","","","","","Kitchen Oven","Bake me a pie!"],["i","1715","ktchn_wall","13603","","","","","Kitchen Wall","A contemporary backsplash for any kitchen"],["s","1716","ktchn_countr_1","13603","0","1","1","","Kitchen Counter Small","Vibrant and shiny"],["s","1717","ktchn_sink","13603","0","2","1","","Industrial Sink","Always full of dirty dishes"],["s","1718","ktchn_desk","13603","0","2","1","","Kitchen Work Table","Sanitary for prepping those delicate deserts."],["s","1719","ktchn_fridge","13603","0","1","1","","Kitchen Fridge","Keeps it all cold."],["s","1720","ktchn_inspctr","13603","0","1","1","","Kitchen Inspector","This kitchen needs a serious inspection"],["s","1721","ktchn_hlthNut","13603","0","1","1","","The Health Nut","Run...run.....RUN! I'm running!!!"],["s","1722","ktchn_stove","13603","0","2","1","","Industrial Stove","Keeps it simmering"],["s","1723","ktchn_bBlock","13603","0","1","1","","Butcher's Block","Sanitary for chopping any kind of food"],["s","1724","ktchn_trash","13603","0","1","1","","Trash Can","Smelly if you don't empty it."],["s","1726","hween08_bath","15444","0","1","2","","Blood Bath","Should have chosen the shower!"],["s","1820","penguin_ballet","10278","2","1","1","","Ballerina Penguin","Aptenodytes Vaganova"],["s","1821","penguin_basic","10278","2","1","1","","Emperor Penguin","Aptenodytes Forsteri"],["s","1822","penguin_boxer","10278","2","1","1","","Boxer Penguin","Aptenodytes Ali"],["s","1823","penguin_bunny","10278","2","1","1","","Bunny Penguin","Aptenodytes Euripides"],["s","1824","penguin_clown","10278","2","1","1","","Clown Penguin","Aptenodytes Pennywise"],["s","1826","penguin_elf","10278","2","1","1","","Christmas Penguin","Aptenodytes Jolly"],["s","1827","penguin_glow","10278","2","1","1","","Fluorescent Penguin","Aptenodytes Gamma"],["s","1828","penguin_hunchback","10278","2","1","1","","Beautiful Penguin","Aptenodytes Narcissus"],["s","1829","penguin_icehockey","10278","2","1","1","","Hockey Penguin","Aptenodytes Gretzsky"],["s","1830","penguin_infected","10278","2","1","1","","Infected Penguin","Aptenodytes Bacterium"],["s","1831","penguin_magician","10278","2","1","1","","Magic Penguin","Aptenodytes Houdini"],["s","1832","penguin_musketeer","10278","2","1","1","","Musketeer Penguin","Aptenodytes Aramis"],["s","1833","penguin_ninja","10278","2","1","1","","Ninja Penguin","Aptenodytes Hamburger"],["s","1834","penguin_pilot","10278","2","1","1","","Pilot Penguin","Aptenodytes Biggles"],["s","1835","penguin_pirate","10278","2","1","1","","Pirate Penguin","Aptenodytes Silver"],["s","1836","penguin_punk","10278","2","1","1","","Punk Penguin","Aptenodytes Rotter"],["s","1837","penguin_robot","10278","2","1","1","","Robot Penguin","Aptenodytes Asimov"],["s","1838","penguin_rock","10278","2","1","1","","Disco Penguin","Aptenodytes Foxy"],["s","1839","penguin_skater","10278","2","1","1","","Skater Penguin","Aptenodytes Arto"],["s","1840","penguin_ski","10278","2","1","1","","XC Penguin","Aptenodytes Swish"],["s","1841","penguin_suit","10278","2","1","1","","Executive Penguin","Aptenodytes Loman"],["s","1842","penguin_sumo","10278","2","1","1","","Sumo Penguin","Aptenodytes Musashimaru"],["s","1843","penguin_super","10278","2","1","1","","Superhero Penguin","Aptenodytes Kirby"],["s","1844","penguin_swim","10278","2","1","1","","Summer Penguin","Aptenodytes Buubar"],["s","1845","penguin_wrestler","10278","2","1","1","","Luchador Penguin","Aptenodytes Mysterioso"],["s","1894","penguin_cowboy","25824","2","1","1","","Cowboy Penguin","Aptenodytes Hickok"],["s","1846","svnr_fi","13603","0","1","1","","Finnish Sauna","December 2008, 6/6"],["i","1956","ads_mall_winmus","13571","","","","","Mall Music Shop Window","Strum, play and drum - this shop is a music lover's heaven"],["s","2000","ads_frankb","13603","2","1","1","Brain Lamp","Talk To FRANK Brain Lamp","Look after your brain - Talk To FRANK"],["s","2842","diner_bardesk_gate*1","6303","0","1","1","#FFFFFF,#ABD0D2,#FFFFFF,#ABD0D2,#FFFFFF,#ABD0D2","Aquamarine Gate","Smothered in syrup and butter!"],["s","2843","diner_bardesk_gate*2","6303","0","1","1","#FFFFFF,#FF99BC,#FFFFFF,#FF99BC,#FFFFFF,#FF99BC","Pink Gate","Smothered in syrup and butter!"],["s","2844","diner_bardesk_gate*3","6303","0","1","1","#FFFFFF,#525252,#FFFFFF,#525252,#FFFFFF,#525252","Black Gate","Smothered in syrup and butter!"],["s","2845","diner_bardesk_gate*4","6303","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","White Gate","Smothered in syrup and butter!"],["s","2846","diner_bardesk_gate*5","6303","0","1","1","#FFFFFF,#F7EBBC,#FFFFFF,#F7EBBC,#FFFFFF,#F7EBBC","Beige Gate","Smothered in syrup and butter!"],["s","2847","diner_bardesk_gate*6","6303","0","1","1","#FFFFFF,#5EAAF8,#FFFFFF,#5EAAF8,#FFFFFF,#5EAAF8","Blue Gate","Smothered in syrup and butter!"],["s","2848","diner_bardesk_gate*7","6303","0","1","1","#FFFFFF,#92D13D,#FFFFFF,#92D13D,#FFFFFF,#92D13D","Green Gate","Smothered in syrup and butter!"],["s","2849","diner_bardesk_gate*8","6303","0","1","1","#FFFFFF,#FFD837,#FFFFFF,#FFD837,#FFFFFF,#FFD837","Yellow Gate","Smothered in syrup and butter!"],["s","2850","diner_bardesk_gate*9","6303","0","1","1","#FFFFFF,#E14218,#FFFFFF,#E14218,#FFFFFF,#E14218","Red Gate","Smothered in syrup and butter!"],["s","5109","diner_bardesk_gate*10","6303","0","1","1","#FFFFFF,#99FFCC,#FFFFFF,#99FFCC,#FFFFFF,#99FFCC","Mint Gate","Smothered in syrup and butter!"],["s","2851","diner_bardesk*1","6303","0","1","1","#FFFFFF,#ABD0D2","Aquamarine Bar","Pull up a stool."],["s","2852","diner_bardesk*2","6303","0","1","1","FFFFFF,#FF99BC","Pink Bar","Pull up a stool."],["s","2853","diner_bardesk*3","6303","0","1","1","#FFFFFF,#525252","Black Bar","Pull up a stool."],["s","2854","diner_bardesk*4","6303","0","1","1","FFFFFF,#FFFFFF","White Bar","Pull up a stool."],["s","2855","diner_bardesk*5","6303","0","1","1","#FFFFFF,#F7EBBC","Beige Bar","Pull up a stool."],["s","2856","diner_bardesk*6","6303","0","1","1","#FFFFFF,#5EAAF8","Blue Bar","Pull up a stool."],["s","2857","diner_bardesk*7","6303","0","1","1","#FFFFFF,#92D13D","Green Bar","Pull up a stool."],["s","2858","diner_bardesk*8","6303","0","1","1","#FFFFFF,#FFD837","Yellow Bar","Pull up a stool."],["s","2859","diner_bardesk*9","6303","0","1","1","#FFFFFF,#E14218","Red Bar","Pull up a stool."],["s","5111","diner_bardesk*10","6303","0","1","1","#FFFFFF,#99FFCC","Mint Bar","Pull up a stool."],["s","2870","diner_bardesk_corner*1","6303","0","1","1","#FFFFFF,#ABD0D2","Aquamarine Corner","Now that's smooth."],["s","2871","diner_bardesk_corner*2","6303","0","1","1","#FFFFFF,#FF99BC","Pink Corner","Now that's smooth."],["s","2872","diner_bardesk_corner*3","6303","0","1","1","#FFFFFF,#525252","Black Corner","Now that's smooth."],["s","2873","diner_bardesk_corner*4","6303","0","1","1","#FFFFFF,#FFFFF","White Corner","Now that's smooth."],["s","2874","diner_bardesk_corner*5","6303","0","1","1","#FFFFFF,#F7EBBC","Beige Corner","Now that's smooth."],["s","2875","diner_bardesk_corner*6","6303","0","1","1","#FFFFFF,#SEAAF8","Blue Corner","Now that's smooth."],["s","2876","diner_bardesk_corner*7","6303","0","1","1","#FFFFFF,#92D13D","Green Corner","Now that's smooth."],["s","2877","diner_bardesk_corner*8","6303","0","1","1","#FFFFFF,#FFD837","Yellow Corner","Now that's smooth."],["s","2878","diner_bardesk_corner*9","6303","0","1","1","#FFFFFF,#E14218","Red Corner","Now that's smooth."],["s","5108","diner_bardesk_corner*10","6303","0","1","1","#FFFFFF,#99FFCC","Mint Corner","Now that's smooth."],["s","2816","diner_cashreg*1","6303","0","1","1","#FFFFFF,#ABD0D2,#FFFFFF","Aquamarine Register","Roll up roll up!"],["s","2817","diner_cashreg*2","6303","0","1","1","#FFFFFF,#FF99BC,#FFFFFF","Pink Register","Roll up roll up!"],["s","2818","diner_cashreg*3","6303","0","1","1","#FFFFFF,#525252,#FFFFFF","Black Register","Roll up roll up!"],["s","2819","diner_cashreg*4","6303","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF","White Register","Roll up roll up!"],["s","2820","diner_cashreg*5","6303","0","1","1","#FFFFFF,#F7EBBC,#FFFFFF","Beige Register","Roll up roll up!"],["s","2821","diner_cashreg*6","6303","0","1","1","#FFFFFF,#5EAAF8,#FFFFFF","Blue Register","Roll up roll up!"],["s","2822","diner_cashreg*7","6303","0","1","1","#FFFFFF,#92D13D,#FFFFFF","Green Register","Roll up roll up!"],["s","2823","diner_cashreg*8","6303","0","1","1","#FFFFFF,#FFD837,#FFFFFF","Yellow Register","Roll up roll up!"],["s","2824","diner_cashreg*9","6303","0","1","1","#FFFFFF,#E14218,#FFFFFF","Red Register","Roll up roll up!"],["s","5117","diner_cashreg*10","6303","0","1","1","#FFFFFF,#99FFCC,#FFFFFF","Mint Register","Roll up roll up!"],["s","2861","diner_chair*1","6303","0","1","1","#FFFFFF,#ABD0D2","Aquamarine Stool","Perch in comfort."],["s","2862","diner_chair*2","6303","0","1","1","#FFFFFF,#FF99BC","Pink Stool","Perch in comfort."],["s","2863","diner_chair*3","6303","0","1","1","#FFFFFF,#525252","Black Stool","Perch in comfort."],["s","2864","diner_chair*4","6303","0","1","1","#FFFFFF,#FFFFF","White Stool","Perch in comfort."],["s","2865","diner_chair*5","6303","0","1","1","#FFFFFF,#F7EBBC","Beige Stool","Perch in comfort."],["s","2866","diner_chair*6","6303","0","1","1","#FFFFFF,#5EAAF8","Blue Stool","Perch in comfort."],["s","2867","diner_chair*7","6303","0","1","1","#FFFFFF,#92D13D","Green Stool","Perch in comfort."],["s","2868","diner_chair*8","6303","0","1","1","#FFFFFF,#FFD837","Yellow Stool","Perch in comfort."],["s","2869","diner_chair*9","6303","0","1","1","#FFFFFF,#E14218","Red Stool","Perch in comfort."],["s","5116","diner_chair*10","6303","0","1","1","#FFFFFF,#99FFCC","Mint Stool","Perch in comfort."],["s","2827","diner_gumvendor*1","6303","0","1","1","#FFFFFF,#ABD0D2","Aquamarine Gum Machine","A chewy mouthful."],["s","2828","diner_gumvendor*2","6303","0","1","1","#FFFFFF,#FF99BC","Pink Gum Machine","A chewy mouthful."],["s","2829","diner_gumvendor*3","6303","0","1","1","#FFFFFF,#525252","Black Gum Machine","A chewy mouthful."],["s","2830","diner_gumvendor*4","6303","0","1","1","#FFFFFF,#FFFFFF","White Gum Machine","A chewy mouthful."],["s","2831","diner_gumvendor*5","6303","0","1","1","#FFFFFF,#F7EBBC","Beige Gum Machine","A chewy mouthful."],["s","2832","diner_gumvendor*6","6303","0","1","1","#FFFFFF,#5EAAF8","Blue Gum Machine","A chewy mouthful."],["s","2833","diner_gumvendor*7","6303","0","1","1","#FFFFFF,#92D13D","Green Gum Machine","A chewy mouthful."],["s","2834","diner_gumvendor*8","6303","0","1","1","#FFFFFF,#FFD837","Yellow Gum Machine","A chewy mouthful."],["s","2835","diner_gumvendor*9","6303","0","1","1","#FFFFFF,#E14218","Red Gum Machine","A chewy mouthful."],["s","5113","diner_gumvendor*10","6303","0","1","1","#FFFFFF,#99FFCC","Mint Gum Machine","A chewy mouthful."],["s","2888","diner_sofa_1*1","6303","0","1","1","#FFFFFF,#ABD0D2,#FFFFFF,#ABD0D2","Aquamarine Sofa 1","Soft leather in 50s design."],["s","2889","diner_sofa_1*2","6303","0","1","1","#FFFFFF,#FF99BC,#FFFFFF,#FF99BC","Pink Sofa 1","Soft leather in 50s design."],["s","2890","diner_sofa_1*3","6303","0","1","1","#FFFFFF,#525252,#FFFFFF,#525252","Black Sofa 1","Soft leather in 50s design."],["s","2891","diner_sofa_1*4","6303","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","White Sofa 1","Soft leather in 50s design."],["s","2892","diner_sofa_1*5","6303","0","1","1","#FFFFFF,#F7EBBC,#FFFFFF,#F7EBBC","Beige Sofa 1","Soft leather in 50s design."],["s","2893","diner_sofa_1*6","6303","0","1","1","#FFFFFF,#5EAAF8,#FFFFFF,#5EAAF8","Blue Sofa 1","Soft leather in 50s design."],["s","2894","diner_sofa_1*7","6303","0","1","1","#FFFFFF,#92D13D,#FFFFFF,#92D13D","Green Sofa 1","Soft leather in 50s design."],["s","2895","diner_sofa_1*8","6303","0","1","1","#FFFFFF,#FFD837,#FFFFFF,#FFD837","Yellow Sofa 1","Soft leather in 50s design."],["s","2896","diner_sofa_1*9","6303","0","1","1","#FFFFFF,#E14218,#FFFFFF,#E14218","Red Sofa 1","Soft leather in 50s design."],["s","5110","diner_sofa_1*10","6303","0","1","1","#FFFFFF,#99FFCC,#FFFFFF,#99FFCC","Mint Sofa 1","Soft leather in 50s design."],["s","2804","diner_sofa_2*1","6303","0","1","1","#FFFFFF,#ABD0D2,#FFFFFF,#ABD0D2","Aquamarine Sofa 2","Soft leather in 50s design."],["s","2805","diner_sofa_2*2","6303","0","1","1","#FFFFFF,#FF99BC,#FFFFFF,#FF99BC","Pink Sofa 2","Soft leather in 50s design."],["s","2806","diner_sofa_2*3","6303","0","1","1","#FFFFFF,#525252,#FFFFFF,#525252","Black Sofa 2","Soft leather in 50s design."],["s","2807","diner_sofa_2*4","6303","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","White Sofa 2","Soft leather in 50s design."],["s","2808","diner_sofa_2*5","6303","0","1","1","#FFFFFF,#F7EBBC,#FFFFFF,#F7EBBC","Beige Sofa 2","Soft leather in 50s design."],["s","2809","diner_sofa_2*6","6303","0","1","1","#FFFFFF,#5EAAF8,#FFFFFF,#5EAAF8","Blue Sofa 2","Soft leather in 50s design."],["s","2810","diner_sofa_2*7","6303","0","1","1","#FFFFFF,#92D13D,#FFFFFF,#92D13D","Green Sofa 2","Soft leather in 50s design."],["s","2811","diner_sofa_2*8","6303","0","1","1","#FFFFFF,#FFD837,#FFFFFF,#FFD837","Yellow Sofa 2","Soft leather in 50s design."],["s","2812","diner_sofa_2*9","6303","0","1","1","#FFFFFF,#E14218,#FFFFFF,#E14218","Red Sofa 2","Soft leather in 50s design."],["s","5114","diner_sofa_2*10","6303","0","1","1","#FFFFFF,#99FFCC,#FFFFFF,#99FFCC","Mint Sofa 2","Soft leather in 50s design."],["s","2897","diner_table_1*1","6303","0","2","2","#FFFFFF,#ABD0D2","Aquamarine Booth Table","Ready to order?"],["s","2898","diner_table_1*2","6303","0","2","2","#FFFFFF,#FF99BC","Pink Booth Table","Ready to order?"],["s","2899","diner_table_1*3","6303","0","2","2","#FFFFFF,#525252","Black Booth Table","Ready to order?"],["s","2900","diner_table_1*4","6303","0","2","2","#FFFFFF,#FFFFFF","White Booth Table","Ready to order?"],["s","2901","diner_table_1*5","6303","0","2","2","#FFFFFF,#F7EBBC","Beige Booth Table","Ready to order?"],["s","2902","diner_table_1*6","6303","0","2","2","#FFFFFF,#5EAAF8","Blue Booth Table","Ready to order?"],["s","2903","diner_table_1*7","6303","0","2","2","#FFFFFF,#92D13D","Green Booth Table","Ready to order?"],["s","2904","diner_table_1*8","6303","0","2","2","#FFFFFF,#FFD837","Yellow Booth Table","Ready to order?"],["s","2905","diner_table_1*9","6303","0","2","2","#FFFFFF,#E14218","Red Booth Table","Ready to order?"],["s","5112","diner_table_1*10","6303","0","2","2","#FFFFFF,#99FFCC","Mint Booth Table","Ready to order?"],["s","2879","diner_table_2*1","6303","0","3","2","#FFFFFF,#ABD0D2,#FFFFFF,#ABD0D2,#FFFFFF,#ABD0D2,#FFFFFF,#ABD0D2","Aquamarine Table","Enjoy your meal."],["s","2880","diner_table_2*2","6303","0","3","2","#FFFFFF,#FF99BC,#FFFFFF,#FF99BC,#FFFFFF,#FF99BC,#FFFFFF,#FF99BC","Pink Table","Enjoy your meal."],["s","2881","diner_table_2*3","6303","0","3","2","#FFFFFF,#525252,#FFFFFF,#525252,#FFFFFF,#525252,#FFFFFF,#525252","Black Table","Enjoy your meal."],["s","2882","diner_table_2*4","6303","0","3","2","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","White Table","Enjoy your meal."],["s","2883","diner_table_2*5","6303","0","3","2","#FFFFFF,#F7EBBC,#FFFFFF,#F7EBBC,#FFFFFF,#F7EBBC,#FFFFFF,#F7EBBC","Beige Table","Enjoy your meal."],["s","2884","diner_table_2*6","6303","0","3","2","#FFFFFF,#5EAAF8,#FFFFFF,#5EAAF8,#FFFFFF,#5EAAF8,#FFFFFF,#5EAAF8","Blue Table","Enjoy your meal."],["s","2885","diner_table_2*7","6303","0","3","2","#FFFFFF,#92D13D,#FFFFFF,#92D13D,#FFFFFF,#92D13D,#FFFFFF,#92D13D","Green Table","Enjoy your meal."],["s","2886","diner_table_2*8","6303","0","3","2","#FFFFFF,#FFD837,#FFFFFF,#FFD837,#FFFFFF,#FFD837,#FFFFFF,#FFD837","Yellow Table","Enjoy your meal."],["s","2887","diner_table_2*9","6303","0","3","2","#FFFFFF,#E14218,#FFFFFF,#FFD837,#FFFFFF,#FFD837,#FFFFFF,#FFD837","Red Table","Enjoy your meal."],["s","5115","diner_table_2*10","6303","0","3","2","#FFFFFF,#99FFCC,#FFFFFF,#99FFCC,#FFFFFF,#99FFCC,#FFFFFF,#99FFCC","Mint Table","Enjoy your meal."],["s","2978","urban_sidewalk","56746","0","2","2","","Sidewalk","Don't step on a crack."],["s","2979","urban_lamp","56746","0","1","1","","Street Lamp","Keeps a dark street brightly lit."],["s","2980","urban_bin","56746","0","1","1","","Urban Trash Can","Street trash."],["s","2981","urban_bench","56746","0","2","1","","Urban Bench","Watch out for gum before you sit."],["s","2982","urban_carsofa","56746","0","2","1","","Taxi Sofa","Seats comfortably for crazy cab drives."],["s","2983","urban_bsktbll","56746","0","1","1","","Urban Basketball Hoop","Slam dunk!"],["s","2984","urban_fence","56746","0","1","2","","Urban Fence","Keeps trouble in our out."],["s","2985","ads_gsArcade_1","56746","0","1","1","","Arcade Machine","Game over"],["s","2986","urban_wpost","56746","0","1","1","","Fire Hydrant","Sometimes used for putting out fires."],["s","2987","urban_fence_corner","56746","0","1","1","","Urban Fence Corner","Keeps trouble in or out."],["s","2988","urban_blocker","56746","0","1","1","","Road Block","Don't go any further."],["s","2989","urban_bench_plain","56746","0","2","1","","Clean Bench","Nothing feels better than sitting on a clean bench."],["i","2990","urban_wall","56746","","","","","Urban Wall","Great for graffiti art."],["s","7988","solarium_norja*1","13603","2","1","1","#FFFFFF,#525252,#FFFFFF","Black Solarium","Rejuvenate your pixels!"],["s","7989","solarium_norja*2","13603","2","1","1","#FFFFFF,#F7EBC0,#FFFFFF","Beige Solarium","Rejuvenate your pixels!"],["s","7990","solarium_norja*3","13603","2","1","1","#FFFFFF,#ABD0D2,#FFFFFF","Urban Solarium","Get the city look!"],["s","7992","solarium_norja*5","13603","2","1","1","#FFFFFF,#EE7EA4,#FFFFFF","Pink Solarium","Rejuvenate your pixels!"],["s","7993","solarium_norja*6","13603","2","1","1","#FFFFFF,#5EAAF8,#FFFFFF","Blue Solarium","Rejuvenate your pixels!"],["s","7994","solarium_norja*7","13603","2","1","1","#FFFFFF,#7CB135,#FFFFFF","Rural Solarium","Fun in the sun!"],["s","7995","solarium_norja*8","13603","2","1","1","#FFFFFF,#FFD837,#FFFFFF","Yellow Solarium","Rejuvenate your pixels!"],["s","7996","solarium_norja*9","13603","2","1","1","#FFFFFF,#E14218,#FFFFFF","Red Solarium","Rejuvenate your pixels!"],["s","9800","one_way_door*1","13603","0","1","1","#ABD0D2,#FFFFFF,#ABD0D2,#FFFFFF,#FFFFFF","Aqua One Way Gate","One at a time!"],["s","9801","one_way_door*2","13603","0","1","1","#525252,#FFFFFF,#525252,#FFFFFF,#FFFFFF","Black HC Gate","One way! The HC way!"],["s","9802","one_way_door*3","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","White HC Gate","One way! The HC way!"],["s","9803","one_way_door*4","13603","0","1","1","#F7EBBC,#FFFFFF,#F7EBBC,#FFFFFF,#FFFFFF","Beige One Way Gate","One at a time!"],["s","9804","one_way_door*5","13603","0","1","1","#EE7EA4,#FFFFFF,#EE7EA4,#FFFFFF,#FFFFFF","Pink One Way Gate","One at a time!"],["s","9805","one_way_door*6","13603","0","1","1","#5EAAF8,#FFFFFF,#5EAAF8,#FFFFFF,#FFFFFF","Blue HC Gate","One way! The HC way!"],["s","9806","one_way_door*7","13603","0","1","1","#7CB135,#FFFFFF,#7CB135,#FFFFFF,#FFFFFF","Green One Way Gate","One at a time!"],["s","9807","one_way_door*8","13603","0","1","1","#FFD837,#FFFFFF,#FFD837,#FFFFFF,#FFFFFF","Yellow One Way Gate","One at a time!"],["s","9808","one_way_door*9","13603","0","1","1","#E14218,#FFFFFF,#E14218,#FFFFFF,#FFFFFF","Red One Way Gate","One at a time!"],["s","9900","sleepingbag*2","437","0","1","3","#d3ff82,#ffffff,#d3ff82,#ffffff,#d3ff82,#ffffff","Lime Sleeping Bag","Ultimate coziness"],["s","9901","sleepingbag*3","437","0","1","3","#8aeded,#ffffff,#8aeded,#ffffff,#8aeded,#ffffff","Ocean Sleeping Bag","Ultimate coziness"],["s","9902","sleepingbag*4","437","0","1","3","#a9bc82,#ffffff,#a9bc82,#ffffff,#a9bc82,#ffffff","Safety Sleeping Bag","Ultimate coziness in SafeSid's sleeping bag!"],["s","9903","sleepingbag*5","437","0","1","3","#9f9f9f,#ffffff,#9f9f9f,#ffffff,#9f9f9f,#ffffff","Graphite Sleeping Bag","Ultimate coziness"],["s","9904","sleepingbag*6","437","0","1","3","#a78acf,#ffffff,#a78acf,#ffffff,#a78acf,#ffffff","Purple Sleeping Bag","Ultimate coziness"],["s","9905","sleepingbag*6","437","0","1","3","#a78acf,#ffffff,#a78acf,#ffffff,#a78acf,#ffffff","Purple Sleeping Bag","Ultimate coziness"],["s","9906","sleepingbag*8","437","0","1","3","#ffcc5a,#ffffff,#ffcc5a,#ffffff,#ffcc5a,#ffffff","Golden Sleeping Bag","Ultimate coziness for SnowStorm winners"],["s","9907","sleepingbag*9","437","0","1","3","#3badf7,#ffffff,#3badf7,#ffffff,#3badf7,#ffffff","eXceptional Sleeping Bag","For eXceptional comfort!"],["s","9908","ads_idol_l_carpet","15113","0","2","7","","Idol Carpet","With glamour and style"],["i","9909","ads_idol_l_logo","14223","","","","","Idol Logo","Idol logo wall"],["i","9910","ads_idol_l_tv","13603","","","","","American Idol Tv","TBD Click it away"],["s","9990","sleepingbag*7","437","0","1","3","#e49350,#ffffff,#e49350,#ffffff,#e49350,#ffffff","Orange Sleeping Bag","Ultimate coziness"],["s","10001","ads_grefusa_cactus","14055","0","1","1","","Grefusa Cactus","Grefusa Cactus promotion"],["s","10002","lostc_octopus","13603","4","1","2","","Kraken","2/6 - February 2009"],["s","10009","totem_leg","14055","2","1","1","","Totem Leg","1/3 of Totem"],["s","10050","ads_cl_jukeb","14223","2","1","1","","Idea Agency Jukebox","Shake it like a polaroid picture in the Idea agency"],["s","10051","ads_idol_cork","14223","0","3","1","","Cubicle Partition","Need privacy so you can write that story? Get this!"],["s","10052","ads_idol_ichair","14223","0","1","1","","Interview Chair","Next question please."],["i","10053","ads_idol_logo","14223","","","","","Idol Logo","Idol logo wall"],["s","10054","ads_idol_newsDsk","14223","0","2","2","","News Reporter Desk","Report all the gossip in Habbo at this desk!"],["s","10055","ads_idol_tube","14223","2","1","1","","Tube Light","Set the mood with this beautv!"],["i","10056","ads_mall_winice","14223","","","","","Mall Ice Cream Parlour Window","Get yourself a cold rock of ice creamy goodness here."],["i","10057","ads_mall_winspo","14223","","","","","Mall Sports World Window","Whatever your sporting dibble, you'll find it here"],["s","10058","env_bushes","14223","0","1","2","","Eco Hedgerow","Block out your nosey neighbours"],["s","10059","env_bushes_gate","14223","0","1","2","","Eco Hedgerows Gate","Get ready for Mother Nature's world and wait your turn"],["s","10060","env_grass","14223","0","2","2","","Grass patch","Lush green grass to lay on your Earth"],["s","10061","env_tree1","14223","0","1","1","","Forest Tree Chair","Take seat and breathe in the fresh air!"],["s","10062","env_tree2","14223","0","1","1","","Forest Tree Americana","Earth's Green Haven - ROOM 997 by EarthBoyJim"],["s","10063","env_tree3","14223","0","1","1","","Forest Trunk Seat","Earth's Green Haven - ROOM 629 by EarthBoyJim"],["s","10064","env_tree4","14223","0","2","2","","The Four Seasons Tree","Crank up some Vivaldi & give your mate a gift."],["s","10065","exe_artlamp","14223","0","1","1","","Sphere Lamp","Suitable for budding entrepreneurs"],["s","10066","exe_cubelight","14223","2","1","1","","Cubist Light","Lights up a square"],["s","10067","exe_gate","14223","0","1","1","","Executive Gate","Keeps the tax man away"],["s","10068","exe_light","14223","0","1","1","","Executive Light","Glow your business"],["i","10069","exe_map","14223","","","","","World Map","World domination imminent"],["i","10070","exe_wfall","14223","","","","","Wall Fall","Improve your cash flow"],["i","11073","landscape","13633","","","","","",""],["i","11074","landscape","13633","","","","","",""],["i","11075","landscape","13633","","","","","",""],["i","11076","landscape","13633","","","","","",""],["i","11077","landscape","13633","","","","","",""],["i","11078","landscape","13633","","","","","",""],["s","11112","hcc_dvdr","7644","0","2","1","","Glass Divider","It won't cramp your style"],["s","11113","hcc_crnr","7644","0","1","1","","Glass Corner","Adds the finishing touch"],["i","11114","ads_campguitar","9559","","","","","Red V Guitar","Awarded to some Camp Rock entrants"],["s","11115","hcc_table","7553","0","1","2","","Glass Table","Elegant centre piece"],["s","11116","netari_carpet","8067","0","3","5","","Netari carpet","Netari branded skull"],["i","11117","netari_poster","7553","","","","","Netari poster","Netari promotion"],["i","11079","ads_lin_wh_c","14684","","","","","ads_lin_wh_c name","ads_lin_wh_c text"],["i","11279","ads_lin_wh_c2","14684","","","","","ads_lin_wh_c2 name","ads_lin_wh_c2 text"],["i","11080","ads_malaco_tv","14684","","","","","Malaco TV","Malaco TV"],["i","11081","ads_puffet_tv","14684","","","","","ads_puffet_tv name","ads_puffet_tv text"],["i","11082","ads_reebok_tv","14684","","","","","ads_reebok_tv name","ads_reebok_tv text"],["i","11086","country_forestwall","14684","","","","","Forest Wall Poster","Give your walls a woodland touch"],["s","11083","ads_malaco_gu","14684","0","1","1","","malaco gu","ads_malaco_gu"],["s","11084","ads_malaco_rug","14684","0","3","3","","Malaco Rug",""],["s","11085","ads_reebok_block2","14684","0","2","2","","ads Reebok block2",""],["s","11087","tray_cake","14684","0","1","1","","tray_cake","tray_cake"],["s","11088","tray_champagne","14684","0","1","1","","tray_champagne","tray_champagne"],["s","11089","tray_glasstower","14684","2","1","1","","tray_glasstower","tray_glasstower"],["s","11119","spyro","437","0","1","1","0,0,0","Dragon Egg","The stuff of legend"],["s","11120","djesko_turntable","437","0","1","1","","Habbo Turntable","For the music-lovers"],["s","11121","ads_calip_cola*2","15444","2","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#a32300,#FFFFFF","Calippo Cola","Of the most refreshing!"],["s","11122","eco_mush1","15444","0","1","1","","Witch Mushroom","Poisonous in the wrong hands"],["s","11123","eco_mush2","15444","0","1","1","","Fairy Mushroom","Sweet and nutty."],["i","11124","country_lantern","15444","","","","","Ye Olde Lantern","Light of your Country life"],["s","11125","country_trctr","15444","0","2","2","","Tractor","Don't run over the bunny!"],["s","11126","ads_calip_cola*1","15444","2","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#d2ff00,#FFFFFF","Calippo Lima","Of the most refreshing!"],["i","11127","country_wall","15444","","","","","Country Wall","Tudor Style"],["s","11128","country_fnc3","15444","0","1","1","","Stone Pile","The work of a witch?"],["s","11129","country_fnc1","15444","0","2","1","","Stick Fence","Wooden fence"],["s","11130","country_rbw","15444","0","1","1","","Rainbow","Is there a pot of gold at the end?"],["s","11131","country_fnc2","15444","0","2","1","","Stone Wall","Keep your livestock safe"],["s","11132","country_well","15444","2","1","1","","Wishing Well","Come spend a penny"],["s","11133","ads_idol_tblCloth","15113","0","2","2","","ads_idol_tblCloth name","ads_idol_tbleCloth desc"],["s","11134","country_scarecrow","15444","0","1","1","","Country Scarecrow","Looks strangely similar"],["s","11135","country_wheat","15444","0","2","2","","Golden Wheat","Right on the brink of harvest"],["i","11136","country_fp","15444","","","","","Marble Fireplace","Keep the home fires burning"],["s","11137","ads_idol_lamp","15113","0","1","1","","ads_idol_lamp name","ads_idol_lamp desc"],["s","11138","country_soil","15444","0","2","2","","Crop Field","Grow your own!"],["s","11139","country_rain","15444","0","1","1","","Rain Shower","Made in Britain"],["s","11140","country_gate","15444","0","2","1","","Farm Gate","Livestock: Close gate behind you"],["s","11141","ads_clcake","15113","0","1","1","","ads_clcake","ads_clcake"],["s","11142","country_stage","15444","0","2","2","","Wooden Stage","Time for a barn dance"],["s","11143","country_log","15444","0","2","1","","Log bench","Stop and perch"],["s","11144","country_grass","15444","0","2","2","","Field Grass","Herding and grazing"],["s","11147","sound_set_72","15444","0","1","1","","Sound set 72",""],["s","11148","env_telep","15444","2","1","1","","The Outhouse","A place for privacy"],["s","11149","ads_idol_carpet","15113","0","2","7","","Idol Carpet","With glamour and style"],["s","11150","ads_calip_cola*3","15444","2","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#fd2c36,#FFFFFF","Calippo Strawberry","Of the most refreshing!"],["s","11151","ads_calip_cola*4","15444","2","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#00c6ff,#FFFFFF","Calippo Crazy","Of the most refreshing!"],["i","11205","dimmer_swtch","15113","0","1","1","","Large Mood Switch","Set the right MOOD!"],["i","11206","dimmer_buttn","15113","0","1","1","","Small Mood Switch","Set the right MOOD!!!"],["i","11207","dimmer_fuse2","15113","0","1","1","","Small Mood Controller","Set the right MOOD!!!"],["i","11208","dimmer_fuse6","15113","0","1","1","","Large Mood Controller","Set the right MOOD!"],["s","11180","marsrug","15113","0","2","2","","Mars Patch","Discover the red planet"],["i","11181","sf_wall2","15113","","","","","Starship Wall","Keeping space out since 1969"],["i","11182","sf_wall3","15113","","","","","Starship Corner","Streamlined for speed"],["i","11183","sf_window","15113","","","","","Starship Window","It'll put stars in your eyes"],["s","11184","sf_roof","15113","0","2","4","","Starship Roof","But it doen't rain in space..."],["s","11185","SF_crate_2","18787","1","2","1","","Large Crate","Weightless in Space"],["s","11186","SF_crate_1","18787","0","1","1","","Small Crate","Weightless in Space"],["s","11187","sf_stick","18787","0","1","1","","Light Pole","Attracts space critters."],["s","11188","SF_chair_blue","18787","0","1","1","","Medium Chair","Space captain's side kick."],["s","11189","sf_roller","18787","0","1","1","","SciFi Roller","Moving through space."],["s","11190","SF_alien","18787","0","1","1","","K-nick-4","Alien Collectible"],["s","11191","SF_floor_2","18787","0","2","2","","Spaceship Floor Dark","Space walk"],["s","11192","SF_panel3","18787","0","1","1","","Navigation Console","Steer clear of Black Holes"],["s","11193","sf_floor","18787","0","2","4","","Transparent Floor","Don't fall through!"],["s","11194","sf_tele","18787","2","1","1","","Space Teleporter","Turn into millions of atoms"],["s","11195","SF_reactor","18787","0","1","1","","Warp Reactor","Fusion reactor to heat plasma"],["s","11196","SF_chair_green","18787","0","1","1","","Small Chair","Buckle up for a space ride."],["s","11198","SF_panel1","18787","0","1","1","","Command Console","Blinking Lights but what to do"],["s","11199","SF_panel2","18787","0","2","1","","Engineering Console","All systems checked"],["s","11200","sf_pod","18787","0","1","3","","Cryogenic Bed","For those who like to sleep a long time."],["s","11201","SF_table","18787","0","2","2","","Space Table","Supplied with gravity"],["s","11202","sf_gate","18787","0","2","1","","Display-Gate","Can you see me now?"],["s","11203","SF_floor_1","18787","0","2","2","","Spaceship Floor Light","Space walk"],["s","11204","SF_chair_red","18787","0","1","1","","Captain's Chair","Master of Space"],["s","11209","SF_lamp","18787","0","1","1","","Sci fi Lamp","Bright lights in a dark space"],["s","11153","ads_calip_pool","15444","0","2","2","","Calippo Pool","Fancy a dip?"],["s","11154","saturn","15444","0","1","1","","Planet of Eternity","How many rings are there??"],["s","11152","ads_calip_tele","15444","2","1","1","","Calippo Teleporter","Get your swim outfit now!"],["s","11178","country_patio","15444","0","1","1","","Wooden Patio Tile","Build the great outdoors"],["s","11177","country_corner","15444","0","1","1","","Country Ditch Corner","Channel your irrigation"],["s","11176","country_ditch","15444","0","1","2","","Country Ditch Corner","Irrigation to irritation in one wrong step"],["s","11174","ads_calip_chair","15444","0","1","1","","Calippo Chair","Calippo Inflatable Chair"],["i","11173","flag_norway","15444","","","","","Norwegian Flag","Land of the fjord"],["i","4270","flag_algeria","15444","","","","","The Algerian Flag","Wave it proudly!"],["i","4261","flag_argentina","15444","","","","","The Argentinian Flag","Wave it proudly!"],["i","4229","flag_belgium","15444","","","","","The Belgian Flag","Wave it proudly!"],["i","4256","flag_chile","15444","","","","","The Chilean Flag","Wave it proudly!"],["i","4258","flag_columbia","15444","","","","","The Colombian Flag","Wave it proudly!"],["i","4265","flag_dominicanrepublic","15444","","","","","The Dominican Republic Flag","Wave it proudly!"],["i","4268","flag_ecuador","15444","","","","","The Ecuadorian Flag","Wave it proudly!"],["i","4253","flag_greece","15444","","","","","The Greek Flag","Wave it proudly!"],["i","4252","flag_malaysia","15444","","","","","The Malaysian Flag","Wave it proudly!"],["i","4250","flag_mexico","15444","","","","","The Mexican Flag","Wave it proudly!"],["i","4264","flag_morocco","15444","","","","","The Moroccan Flag","Wave it proudly!"],["i","4260","flag_newzealand","15444","","","","","The New Zealand Flag","Wave it proudly!"],["i","4262","flag_panama","15444","","","","","The Panama Flag","Wave it proudly!"],["i","4246","flag_peru","15444","","","","","The Peruvian Flag","Wave it proudly!"],["i","4251","flag_philippines","15444","","","","","The Philippines Flag","Wave it proudly!"],["i","4231","flag_portugal","15444","","","","","The Portuguese Flag","Wave it proudly!"],["i","4249","flag_singapore","15444","","","","","The Singapore Flag","Wave it proudly!"],["i","4248","flag_tunisia","15444","","","","","The Tunisian Flag","Wave it proudly!"],["i","4255","flag_turkey","15444","","","","","The Turkish Flag","Wave it proudly!"],["i","4254","flag_venezl","15444","","","","","The Venezuelan Flag","Wave it proudly!"],["s","11172","ads_idol_trophy","15444","0","1","1","#ffffff,#ffffff,#FFDD3F","American Idol Trophy","For the winner of American Idol"],["s","11171","totem_head","15444","2","1","1","","Totem Spirit Head","Which animal are you? 2/3 of Totem"],["s","11156","LT_throne","15444","0","1","1","","Lost Tribe Throne","Important for Tribe"],["i","11155","diner_poster","15444","","","","","Diner Poster","Have a diner!"],["i","11157","lt_jngl_wall","15444","","","","","Jungle Wall","Jungle Wall"],["s","11158","lt_patch","15444","0","2","2","","Lost Tribe Patch","Attention!"],["s","11159","lt_lavac","15444","0","1","1","","Lost Tribe Lava Corner","Very dangerous!"],["s","11160","LT_pillar","15444","0","1","1","","Lost Tribe Pillar","Lost Tribe Pillar"],["s","11161","LT_pillar2","15444","0","1","1","","Lost Tribe Pillar 2","Attention!"],["s","11162","LT_skull","15444","0","1","1","","Lost Tribe Skull","Very scary!"],["s","11163","lt_spider","15444","0","1","1","","Lost Tribe Spider","Attention!"],["s","11164","lt_stage1","15444","0","1","1","","Lost Tribe Stage","Make mine a large!"],["s","11165","lt_stage2","15444","0","2","2","","Lost Tribe Stage","Make mine a large!"],["s","11166","lt_statue","15444","0","1","1","","Lost Tribe Statue","Attention!"],["s","11167","lt_stone2","15444","0","2","1","","Lost Tribe Stone 2","Mysterious Stone"],["s","11168","lt_lava","15444","0","1","2","","Lost Tribe Lava","Very dangerous!"],["s","11169","lt_bughill","15444","0","1","1","","Lost Tribe Hill","Attention!"],["s","11170","lt_gate","15444","0","2","1","","Lost Tribe Gate","Knock, knock..."],["s","11145","ads_cl_sofa","15444","0","2","1","","Idea Agency Sofa","Take a load off - both your feet and mind!"],["i","11210","lt_wall","15444","0","0","0","","Lost Tribe Stone Wall","I wonder if this wall is safe to climb?"],["s","11211","lt_stone1","15444","0","1","1","","Stone Corner","I wonder how old this is???"],["s","11212","pix_asteroid","15444","0","1","1","","The Asteroid","A smashing rock in space!"],["s","11213","planet_of_love","15444","0","1","1","","Planet of Love","All you need is world LOVE!"],["s","11214","totem_planet","14055","2","1","1","","Totem Planet","3/3 of Totem"],["s","11215","sound_set_37","10278","0","1","1","","Habbowood Traxpack","Blockbuster hits!"],["s","11216","sound_set_42","10278","0","1","1","","Haunted Mansion","Bumps and Chills"],["s","11217","sound_set_44","10278","0","1","1","","Graveyard Portal","Haunted Dimension"],["s","11218","sound_set_45","10278","0","1","1","","Berlin Connection","The Bass? is the rhythm!"],["s","11219","carpet_soft*9","2818","0","2","4","#FFDD00,#FFDD00,#FFDD00","Soft Wool Rug","Soft Wool Rug"],["s","11220","exe_elevator","59616","0","1","1","","Elevator Teleport","Going up or down in style!"],["i","11221","photo","45508","0","0","0","","Photo","Photo from Habbo"],["s","3312","arabian_tile","25824","0","2","2","","Arabian Tile","Step in style..."],["i","4287","arabian_wall","25824","","","","","Arabian Wall","A wall built with class."],["s","1661","xm09_man_a","13603","0","1","1","","Snowman legs","What can you build?"],["s","1662","xm09_man_b","13603","0","1","1","","Snowman middle","What can you build?"],["s","1663","xm09_man_c","13603","0","1","1","","Snowman head","What can you build?"],["s","1664","xm09_table","13603","0","2","6","","Holiday Table","Enough room for an entire family"],["s","1665","xm09_bench","13603","0","6","1","","Holiday Bench","Will everyone fit?"],["i","1666","xm09_firwall","13603","","","","","Xmas Tree Wall","Don't you just love snow..."],["i","1667","xm09_forestwall","13603","","","","","Snow Forest Wall","Covered in snow..."],["i","1668","xm09_lodgewall","13603","","","","","Lodge Wall","Keep the heat in and the cold out"],["i","1669","xm09_bauble_1","13603","","","","","Red Bauble","Perfect for a tree"],["i","1670","xm09_bauble_2","13603","","","","","Blue Bauble","Perfect for a tree"],["i","1671","xm09_bauble_3","13603","","","","","Green Bauble","Perfect for a tree"],["i","1672","xm09_bauble_4","13603","","","","","Yellow Bauble","Perfect for a tree"],["i","1673","xm09_bauble_5","13603","","","","","White Bauble","Perfect for a tree"],["i","1674","xm09_bauble_6","13603","","","","","Red Striped Bauble","Perfect for the tree"],["i","1675","xm09_bauble_7","13603","","","","","Blue Striped Bauble","Perfect for the tree"],["i","1676","xm09_bauble_8","13603","","","","","Green Striped Bauble","Perfect for the tree"],["i","1677","xm09_bauble_9","13603","","","","","Yellow Striped Bauble","Perfect for the tree"],["i","1678","xm09_bauble_10","13603","","","","","White Striped Bauble","Perfect for the tree"],["i","1679","xm09_bauble_11","13603","","","","","Tall Red Bauble","Perfect for the tree"],["i","1680","xm09_bauble_12","13603","","","","","Tall Blue Bauble","Perfect for the tree"],["i","1681","xm09_bauble_13","13603","","","","","Tall Green Bauble","Perfect for the tree"],["i","1682","xm09_bauble_14","13603","","","","","Tall Yellow Bauble","Perfect for the tree"],["i","1683","xm09_bauble_15","13603","","","","","Tall White Bauble","Perfect for the tree"],["i","1684","xm09_bauble_16","13603","","","","","Purple Green Bauble","Perfect for the tree"],["i","1685","xm09_bauble_17","13603","","","","","Tall Red Striped Bauble","Perfect for the tree"],["i","1686","xm09_bauble_18","13603","","","","","White Dot Bauble","Perfect for the tree"],["i","1687","xm09_bauble_19","13603","","","","","Tall Blue Striped Bauble","Perfect for the tree"],["i","1688","xm09_bauble_20","13603","","","","","Tall Yellow Striped Bauble","Perfect for the tree"],["i","1689","xm09_bauble_21","13603","","","","","Green White Bauble","Perfect for the tree"],["i","1690","xm09_bauble_22","13603","","","","","Red Heart Bauble","To hang on your tree"],["i","1691","xm09_bauble_23","13603","","","","","Blue Heart Bauble","To hang on your tree"],["i","1692","xm09_bauble_24","13603","","","","","Green Heart Bauble","To hang on your tree"],["i","1693","xm09_bauble_25","13603","","","","","Yellow Heart Bauble","To hang on your tree"],["i","1694","xm09_bauble_26","13603","","","","","White Heart Bauble","To hang on your tree"],["i","1695","xm09_bauble_27","13603","","","","","Pink Heart Bauble","To hang on your tree"],["s","1696","xm09_candyCane","13603","0","1","1","","Candy Canes","Got Candy?"],["i","1697","xm09_stocking","13603","","","","","Holiday Stocking","Are they filled with coal?"],["i","1698","xm09_infotv","13603","","","","","Flatscreen TV","Catch the latest news of the pre-Holiday season!"],["s","1699","xm09_cocoa","13603","0","1","1","","Hot Chocolate Maker","Cocoa and Christmas. Excellent!"],["s","1700","xm09_lrgBauble","13603","0","1","1","","Large Bauble","Isn't it pretty!"],["i","4312","xm09_frplc","13603","","","","","Christmas Fireplace","Warm and cozy!"],["i","4272","ads_twi_paint","45508","","","","","Painting","Stare deep into the painting..."],["i","4273","ads_twi_dreamc","45508","","","","","Dream Catcher","Will it catch them?"],["i","4274","ads_twi_bwall1","45508","","","","","Barn Wall","Keeps the cold out.."],["i","4275","ads_twi_crest","45508","","","","","Volturi Crest","A Royal Crest."],["s","3296","ads_twi_toolbx","45508","2","1","1","","Toolbox","Good spot for some tools..."],["s","3297","ads_twi_table","45508","0","2","2","","Cake on Table with Presents","Whose name is on that present?"],["s","3298","ads_twi_tower","45508","0","1","1","","Clock Tower","What time is it?"],["s","3299","ads_twi_piano","45508","0","2","2","","Broken Piano","I wonder if it's still in tune."],["s","3300","ads_twi_chair","45508","0","1","1","","Volturi Royal Chair","A chair fit for royalty"],["s","3301","ads_twi_fountn","45508","0","2","2","","Fountain","Simply breathtaking..."],["s","3302","ads_twi_dvdr2","45508","0","2","1","","Clock Tower wall","Repel all attacks..."],["s","3303","ads_twi_dvdr1","45508","0","2","1","","Half wall","Where is the other half?"],["s","3304","ads_twi_roses","45508","0","1","1","","Standing Rose Bouquet","You shouldn't have..."],["i","4276","ads_twi_bwall2","45508","","","","","Truck and Motorcycles","Nice motorcycle"],["i","4277","ads_twi_windw","45508","","","","","Window with Candles","Watch the candle flicker"],["s","3311","ads_twi_trophy","45512","2","1","1","#ffffff,#ffffff,#FFDD3F","Twilight Trophy","Fitting for the biggest Twilight fan!"],["s","3308","ads_twi_mist","45508","0","1","1","","Fog","Sure is foggy out here..."],["s","2103","val_cauldron","45512","0","1","1","","Valentine's cauldron","Cast a loving spell"],["s","3234","rela_candles1","56746","0","1","1","","White Candles","Calming Relaxation..."],["s","3245","rela_candles2","56746","0","1","1","","Red Candles","Calming Relaxation..."],["s","3236","rela_candles3","56746","0","1","1","","Violet Candles","Calming Relaxation..."],["s","3238","rela_candle1","56746","0","1","1","","White Candle","Calming Relaxation..."],["s","3244","rela_candle2","56746","0","1","1","","Red Candle","Calming Relaxation..."],["s","3235","rela_candle3","56746","0","1","1","","Violet Candle","Calming Relaxation..."],["s","3247","rela_hchair","56746","0","1","1","","Comfort Cradle","Calming Comfort..."],["s","3239","rela_orchid","56746","0","1","1","","Orchid","Calming Fragrance..."],["s","3246","rela_plant","56746","0","1","1","","Relaxation Plant","Calming Greenery..."],["s","3240","rela_stick","56746","0","1","1","","Stick in Jar","Calming Tranquility..."],["s","3233","rela_stone","56746","0","1","1","","Relaxation Stones","Calming Stability..."],["s","3248","rela_rock","56746","0","1","1","","Rock Seat","Calming Comfort..."],["i","4232","rela_wall","56746","","","","","Relaxation Wall","Calming Serenity..."],["s","3282","hween09_organ","45512","0","2","1","","Ghostly Organ","Play a ghastly tune on the bones..."],["s","3273","sf_mbar","45512","0","1","1","","Astro-Bar","Deep space refreshment."],["s","3401","beanstalk","45512","0","1","1","","Gigantic Beanstalk","A majestic rare... but who's gonna fix my floor?!"],["s","3399","rare_ironmaiden","45512","4","1","1","","Rare Iron Maiden","So good it's torturous!"],["s","3403","rare_vdoll","45512","4","1","1","","Rare Voodoo Doll","Choose your punishment!"],["i","4269","hween09_treewall","54764","","","","","Haunted Forest","Don't enter alone..."],["i","4271","hween09_win","54764","","","","","Haunted Window","What is really outside?"],["i","4247","hween09_crnr1","54764","","","","","Creaky Corner","Perfect corner for a haunted house..."],["i","4257","hween09_wall1","54764","","","","","Creaky Wall","I wonder if there is a hidden passage here?"],["i","4259","hween09_stonewall","54764","","","","","Old Stone Wall","Looks strong enough."],["i","4263","hween09_paint","45508","","","","","Haunted Painting","Is that cat watching me?"],["i","4266","hween09_curt","54764","","","","","Floating Curtain","Is someone hiding behind??"],["s","3285","hween09_hatch","54764","0","2","2","","Creepy Trap Door","I wonder where this goes?"],["s","3286","hween09_table","54764","0","1","3","","Creepy Table","Hope there is not a head on the platter..."],["s","3287","hween09_jar","45508","0","1","1","","Strange Jar","Would you like a Duck or a Head?"],["s","3288","hween09_floor","54764","0","2","2","","Creaky Floor","Watch your step!"],["s","3290","hween09_ghost","54764","0","1","1","","Ghost-in-the-Box","Ohh haunting..."],["s","3292","hween09_tv","54764","0","2","1","","Haunted TV","Whats on Haunted TV tonight?"],["s","3293","hween09_mirror","54764","2","1","1","","Ghostly Mirror","Is that a Habbo in there?"],["s","3294","hween09_chandelier","54764","0","1","1","","Haunted Chandelier","Flickering in the night..."],["s","3295","hween09_chair","54764","0","1","1","","Haunted Chair","Was something just sitting in this??"],["s","3231","summer_icebox","48082","2","1","1","","Ice Box","Chilled surprises"],["s","3228","summer_raft1","48082","0","1","1","","Pink Raft","Float down a lazy river."],["s","3227","summer_raft2","48082","0","1","1","","Blue Raft","Float down a lazy river."],["i","4222","ads_veet","45508","","","","","ads_veet name","ads_veet desc"],["i","4226","ads_wwe_poster","45508","","","","","WWE","Bigger, Badder, Better"],["i","4322","ads_percyw","45508","","","","","ads_percyw name","ads_percyw desc"],["s","3230","ads_oc_soda","45508","2","1","1","","Orange Soda Machine","Who loves Orange Soda?!"],["s","432233","ads_oc_soda_cmp","45508","2","1","1","","Orange Soda Machine","Who loves Orange Soda?!"],["i","4122","ads_mirror","45508","","","","","Dress Up Mirror","Look the part!"],["s","3278","ads_gsArcade_2","45508","2","1","1","","Arcade Cabinet","Must...get....high....score!"],["s","3251","ads_1800tele","45508","2","1","1","","ads_1800tele",""],["s","3367","ads_chups","45508","0","1","1","","ads_chups name","ads_chups desc"],["s","3365","ads_droetker_paula","45508","2","1","1","","ads_droetker_paula name","ads_droetker_paula desc"],["s","3132","ads_reebok_block2","45508","0","2","2","","ads_reebok_block2",""],["s","313222","ads_reebok_block2cmp","45508","0","2","2","","ads_reebok_block2cmp",""],["s","3280","ads_spang_sleep","45508","0","1","3","","ads_spang_sleep","ads_spang_sleep text"],["s","45598","footylamp_campaign_ing","13603","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF","ING Trophy","We are the champions"],["i","4267","byesw_loadscreen","45508","","","","","Loading screen memorial","The old Habbo loading screen."],["s","3289","byesw_hotel","45508","2","1","1","","Hotel view memorial","3 different miniature Hotels."],["s","3291","byesw_hand","45508","0","1","1","","Big Hand seat memorial","We'll miss you Big Hand!"],["i","4278","flag_denmark","15444","","","","","The Danish Flag","Wave it proudly!"],["s","3199","transparent_floor","25824","0","2","2","","Transparent Floor","Watch your step!"],["s","3139","ads_clcake2","45508","0","1","1","","Idea Agency Super Cake","Have your cake and eat it with Idea"],["s","1596","ads_clfloor","25824","0","3","5","","Childline Rug","Keep your feet warm with the Idea Agency rug"],["s","1597","ads_cllava","25824","0","1","1","","Idea Agency Lava Lamp","It's better out than in!"],["s","1598","ads_cllava2","25824","0","1","1","","Idea Agency Lava Lamp","It's better out than in!"],["s","1599","ads_cltele_cmp","45508","2","1","1","","Idea Agency Teleporter","Whatever your Idea, it's better out than in."],["i","10071","ads_clwall3","45508","","","","","ChildLine TV","Helping to raise awareness of the great advice ChildLine can offer"],["s","10072","ads_cl_sofa_cmp","15444","0","2","1","","Idea Agency Sofa","Take a load off - both your feet and mind!"],["s","10073","ads_cl_jukeb_camp","45508","2","1","1","","Idea Agency Jukebox","Shake it like a polaroid picture in the Idea agency"],["s","3169","ads_calip_chaircmp","45508","0","1","1","","ads_calip_chair name","ads_calip_chair text"],["s","3198","ads_calip_fan","45508","0","1","1","","ads_calip_fan","ads_cali desc"],["s","3201","ads_calip_fan_cmp","45508","0","1","1","","ads_calip_fan","ads_cali desc"],["s","3197","ads_calip_lava","45508","0","1","1","","ads_calip_lava name","ads_calip_lava desc"],["s","3195","ads_calip_parasol","45508","0","1","1","","ads_calip_parasol name","ads_calip_parasol desc"],["s","3203","ads_calip_parasol_cmp","45508","0","1","1","","ads_calip_parasol name","ads_calip_parasol desc"],["s","3183","ads_calip_pool_cmp","45508","0","2","2","","ads_calip_pool name","ads_calip_pool desc"],["s","3191","ads_calip_telecmp","45508","2","1","1","","ads_calip_tele name","ads_calip_tele text"],["s","2738","calippo_cmp","45508","2","1","1","","Calippo icecream machine","Basic model"],["s","1307","ads_calip_colac*2","15444","2","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#a32300,#FFFFFF","Calippo Cola","Of the most refreshing!"],["s","1146","ads_calip_colac*1","15444","2","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#d2ff00,#FFFFFF","Calippo Lima","Of the most refreshing!"],["s","1308","ads_calip_colac*3","15444","2","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#fd2c36,#FFFFFF","Calippo Strawberry","Of the most refreshing!"],["s","1309","ads_calip_colac*4","15444","2","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#00c6ff,#FFFFFF","Calippo Crazy","Of the most refreshing!"],["s","1310","ads_calip_lava2","45508","0","1","1","","ads_calip_lava2 name","ads_calip_lava2 desc"],["s","3202","ads_mall_coffeem","45508","2","1","1","","Quick Coffee Stop","Exclusively Mall coffee and free to boot!"],["s","3306","ads_mall_elevator","45508","2","1","1","","Mall Lift","Up, up and away to the next shopping level"],["s","3216","ads_mall_kiosk","45508","0","1","2","","Mall Kiosk","Fish, fruit, sweets, sunglasses - it is all available here."],["s","3020","ads_mall_tele","47501","0","1","1","","Mall tele-door","Step inside the store and look around"],["i","4103","ads_mall_winchi","45508","","","","","ads_mall_winchi","ads_mall_winchi"],["i","4236","ads_mall_winclo","45508","","","","","ads_mall_winclo","ads_mall_winclo"],["i","4083","ads_mall_window","47501","","","","","Habbo Mall Window","Can you see that!"],["i","4092","ads_mall_winfur","47501","","","","","Habbo Mall Furni Window","Can you see that!"],["i","4230","ads_mall_wingar","45508","","","","","ads_mall_wingar","ads_mall_wingar"],["i","4091","ads_mall_winpet","45508","","","","","Habbo Mall Petshop Window",""],["s","3343","ads_cl_moodi_camp","45508","2","1","1","","The Moodi Machine","how u feelin? Express yourself with ChildLine"],["i","4225","ads_mall_wintra","45508","","","","","ads_mall_wintra","ads_mall_wintra"],["s","3582","easel_0","45508","0","1","1","","StrayPixels Winner x1","Made by our very own RollerKingdom and Fredsicle"],["s","3594","easel_1","45508","0","1","1","","StrayPixels winner x3","Made by our very own avilaman, HankMcCoy, and ,CrystalBailey"],["s","3603","easel_2","45508","0","1","1","","StrayPixels winner x5","Is that... cheese chasing that man!?"],["s","3596","easel_3","45508","0","1","1","","StrayPixels winner x7","Watching paint dry... fun"],["s","3600","easel_4","45508","0","1","1","","StrayPixels winner x10","Holy carp my watch just melted!"],["s","3225","prizetrophy_cool","45512","0","1","1","","Cool Trophy","One Cool Habbo"],["s","3229","prizetrophy_hot","45512","0","1","1","","Hot Trophy","One Hot Habbo"],["s","3901","waasa_aquarium","56746","0","2","1","","Aquarium","Finding Nemo should be pretty easy."],["s","3889","waasa_chair","56746","2","1","1","","Computer Chair","For the perfect posture"],["s","3903","waasa_chair_wood","56746","2","1","1","","Wooden Chair","A little hard on the buttocks."],["s","3896","waasa_desk","56746","2","2","1","","Wooden Study Desk","The ultimate in sophisticated studying"],["s","3899","waasa_rug1","56746","0","2","4","","Blue Waasa Rug","Sink your toes into its softness"],["s","3904","waasa_rug2","56746","0","2","4","","Yellow Waasa Rug","Sink your toes into its softness"],["s","3900","waasa_rug3","56746","0","2","4","","Orange Waasa Rug","Sink your toes into its softness"],["s","3902","waasa_rug4","56746","0","2","4","","Green Waasa Rug","Sink your toes into its softness"],["s","3898","waasa_rug5","56746","0","2","4","","Gray Waasa Rug","Sink your toes into its softness"],["s","3891","waasa_ship1","56746","2","1","1","","Small Sailing Boat","Set sail on water!"],["s","3890","waasa_ship2","56746","2","2","1","","Large Sailing Boat","Let's hope this one floats!"],["s","3895","waasa_table1","56746","0","1","1","","Small Wooden Table","No name carving allowed"],["s","3887","waasa_table2","56746","0","2","1","","Large Wooden Table","Simple, strong and sturdy"],["i","4397","waasa_wall_shelf1","56746","","","","","Book Shelf","Just a small amount of light reading"],["i","4396","waasa_wall_shelf2","56746","","","","","Wall Shelf","Smells of many leather-bound books and rich mahogany."],["s","3892","waasa_bunk_bed","56746","2","3","1","","Bunk Bed","Study or sleep? That's a tough decision!"],["s","3894","computer_old","48082","2","1","1","","Nostalgic Computer","Ahhh the good old days..."],["s","3888","computer_flatscreen","48082","2","1","1","","Desktop Computer","Downloading...."],["s","3886","tv_flat","54450","0","2","1","","Flatscreen TV","Plasma vs. LCD"],["s","3351","xm09_trophy","45512","2","1","1","#FFFFFF,#FFFFFF,#FFDD3F","2009 Habbo Trophy","Winner of a 2009 Habbo of the Year competition."],["s","3893","computer_laptop","48082","2","1","1","","Laptop","For geeks on the go!"],["s","3530","bw_water_1","48082","0","2","2","","Water Patch","Swimming in the shallow end."],["s","3541","bw_water_2","49148","0","2","2","","Deep Water Patch","Get thrown in the deep end!"],["s","4042","coco_chair","56746","0","1","1","","Blue Resort Pod","The circular edges will relax you."],["s","4053","coco_chair_c2","56746","0","1","1","","Chocolate Resort Pod","The circular edges will relax you."],["s","4059","coco_chair_c3","56746","0","1","1","","White Resort Pod","The circular edges will relax you."],["s","4058","coco_chair_c4","56746","0","1","1","","Black Resort Pod","The circular edges will relax you."],["s","4060","coco_divan","56746","2","2","1","","Blue Pool-side Lounge","Every resort needs one!"],["s","4046","coco_divan_c2","56746","2","2","1","","Chocolate Pool-side Lounge","Every resort needs one!"],["s","4061","coco_divan_c3","56746","2","2","1","","White Pool-side Lounge","Every resort needs one!"],["s","4040","coco_divan_c4","56746","2","2","1","","Black Pool-side Lounge","Every resort needs one!"],["s","4045","coco_patch","56746","0","2","3","","Resort Flooring","Luxurious under bare feet"],["s","4066","coco_sofa","56746","0","3","1","","Blue Coco Sofa","The perfect place for a massage."],["s","4062","coco_sofatable","56746","0","1","1","","Blue Drinks Table","When carrying your drink becomes hard work."],["s","4064","coco_sofatable_c2","56746","0","1","1","","Chocolate Drinks Table","When carrying your drink becomes hard work."],["s","4047","coco_sofatable_c3","56746","0","1","1","","White Drinks Table","When carrying your drink becomes hard work."],["s","4049","coco_sofatable_c4","56746","0","1","1","","Black Drinks Table","When carrying your drink becomes hard work."],["s","4057","coco_sofa_c2","56746","0","3","1","","Chocolate Coco Sofa","The perfect place for a massage."],["s","4050","coco_sofa_c3","56746","0","3","1","","White Coco Sofa","The perfect place for a massage."],["s","4063","coco_sofa_c4","56746","0","3","1","","Black Coco Sofa","The perfect place for a massage."],["s","4054","coco_stick","56746","0","1","1","","Resort Ornament","It's not dead, it's modern."],["s","4052","coco_stool","56746","0","1","1","","Blue Coco Stool","For meditation to the maximum."],["s","4039","coco_stool_c2","56746","0","1","1","","Chocolate Coco Stool","For meditation to the maximum."],["s","4048","coco_stool_c3","56746","0","1","1","","White Coco Stool","For meditation to the maximum."],["s","4044","coco_stool_c4","56746","0","1","1","","Black Coco Stool","For meditation to the maximum."],["s","4051","coco_table","56746","0","2","3","","COCOnut Table","We had to use them somewhere!"],["s","4056","coco_table2","56746","0","2","2","","Pool-side Table","Resort to this for your own resort"],["s","4055","coco_throne","56746","2","1","1","","Blue Wicker Throne","The ultimate in resort relaxation"],["s","4041","coco_throne_c3","56746","2","1","1","","White Wicker Throne","The ultimate in resort relaxation"],["s","4065","coco_throne_c4","56746","2","1","1","","Black Wicker Throne","The ultimate in resort relaxation"],["s","4043","coco_throne__c2","56746","2","1","1","","Chocolate Wicker Throne","The ultimate in resort relaxation"],["i","4379","bling11_big1","45508","","","","","Vegas Buildings","What happens in Vegas...."],["s","3801","bling11_block","56746","0","1","1","","Bling Block","A classy building block"],["s","3793","bling11_dvd","56746","0","1","2","","Bling Divider","Divide and conquer!"],["s","3798","bling11_dvn","56746","0","1","3","","Bling Daybed","Lie back in style... hand me those grapes!"],["s","3794","bling11_floor","56746","0","2","2","","Italian Marble Floor","Floor tiles that spell out class!"],["s","3802","bling11_pillar","56746","0","1","1","","Italian Marble Pillar","Will support all your bling!"],["s","3795","bling11_plant","56746","0","1","1","","Bling Plant","Classy Greenery!"],["s","3788","bling11_rug1","59643","4","2","2","","Tiger Rug","Be careful - it will bite!"],["s","3797","bling11_rug2","56746","0","3","3","","Bling Carpet","So soft your feet will sing with joy!"],["s","3800","bling11_seat1","56746","0","1","1","","Bling Seat","Silky comfort for your behind!"],["s","3799","bling11_seat2","56746","2","1","1","","Slot Chair","This could be the luckiest chair in the room!"],["s","3786","bling11_slot","56746","0","1","1","","Slot Machine","Watch out for this one-armed bandit!"],["s","3790","bling11_sofa","56746","2","3","1","","Bling Divan","Fit for classy butts!"],["s","3791","bling11_statue1","56746","0","1","1","","Eros","A God of Love"],["s","3785","bling11_statue2","56746","0","2","2","","Love Carp","Carpe Diem!"],["s","3789","bling11_tele","59643","2","1","1","","Bling Teleporter","Teleports you with great grace!"],["s","3787","bling11_towels","56746","2","1","1","","Bling Towels","Gives your bathroom that extra OUMPH!"],["i","4374","bling11_wall1","56746","","","","","Tiger Wall Cover","Rawr!"],["i","4376","bling11_wall2","56746","","","","","Zebra Wall Cover","A touch of wild life!"],["i","4377","bling11_wall3","56746","","","","","Leopard Wall Cover","Wild patterns for your walls!"],["i","4375","bling11_wall4","56746","","","","","Panther Wall Cover","Adds wild mystery to your walls!"],["s","3364","bling_bed","56746","2","2","3","","Bling Bed","No Comment..."],["i","4321","bling_cabinet","56746","","","","","Bathroom Cabinet","Now With A Mirror"],["s","3368","bling_chair_a","56746","0","1","1","","Suave Chair","Sit in style!"],["s","3360","bling_chair_b","56746","0","1","1","","Suave Chair","Sit in style!"],["s","3361","bling_chair_c","56746","0","1","1","","Suave Chair","Sit in style!"],["s","3366","bling_fridge","56746","2","1","1","","Big Purple Fridge","I wonder whats inside?"],["s","3369","bling_pool","56746","0","3","1","","Jacuzzi","Is this a time machine?"],["s","3396","bling_shwr","56746","0","1","1","","Power Shower","So fresh and so clean..."],["i","4319","bling_sink","56746","","","","","Marble Sink","Hand Wash, Baby"],["s","3371","bling_sofa","56746","2","2","1","","Leather Sofa","Perfect for two."],["s","3362","bling_toilet","56746","2","1","1","","Golden Toilet","Don't forget to flush."],["s","3363","val09_floor","57144","0","2","2","","Polished Tile","Looks all shiny..."],["s","3357","val09_floor2","57144","0","2","2","","Wooden Tile","Look closely at the grain"],["i","4318","val09_wall1","57144","","","","","Sound-proofed Wall","I wonder if it really works?"],["i","4316","val09_wall2","57144","","","","","Embroidered Wall","Isn't it pretty?"],["i","4320","val09_wdrobe_b","57144","","","","","Designer Wardrobe","I wonder if all my clothes will fit?"],["i","4317","val09_wdrobe_g","57144","","","","","Designer Wardrobe","I wonder if all my clothes will fit?"],["s","3822","limo_w_back","56746","2","2","1","","Limo Back","Ride in style!"],["s","3823","limo_w_front","56746","2","2","1","","Limo Front","Ride in style!"],["s","3819","limo_w_mid","56746","2","2","1","","Limo Middle Part 1","Build your limo and ride in style!"],["s","3820","limo_w_mid2","56746","2","2","1","","Limo Middle Part 2","Build your limo and ride in style!"],["s","3589","ktchn10_block","48478","0","1","1","","Kitchen Corner Block","Cutting this corner won't give you food poisoning."],["i","4338","ktchn10_cabnt","45508","","","","","Cabinet","Hide all your messy bits and pieces."],["s","3580","ktchn10_pot","45508","0","1","1","","Boiling Water","If you can't stand the heat."],["s","3612","ktchn10_sink","45508","0","2","1","","Kitchen Sink","Everything but..."],["s","3581","ktchn10_stove","45508","0","2","1","","Kitchen Stove","Cook up a storm!"],["s","3592","ktchn10_tea","45508","0","1","1","","Teapot","Short and stout."],["s","1312","md_limukaappi_cmp","13603","2","1","1","","Mountain Dew Machine","A sparkling and refreshing pixel drink!"],["s","3849","cine_bench","56746","0","3","1","","Red Lobby Bench","Rest your feet before the show!"],["s","3845","cine_bench_b","56746","0","3","1","","Black Lobby Bench","Rest your feet before the show!"],["s","3850","cine_bench_g","56746","0","3","1","","Green Lobby Bench","Rest your feet before the show!"],["s","5327","cine_bigcorn","56737","0","1","1","","Big Popcorn","Swimming in butter"],["s","3841","cine_curtain","56746","0","8","1","","Theater Curtains","Open them up to start the show!"],["s","4485","cine_curtain_red","45508","0","8","1","","Red Theatre Curtain","Limited Edition Rare. Grab yourself some popcorn and enjoy the show!"],["s","3856","cine_glass","56746","0","1","1","","Glass Divider","What's between you and them..."],["i","4383","cine_light1","56746","","","","","Theater Lights","Lighting up the darkness."],["i","4382","cine_light2","56746","","","","","Theater Hall Lights","Follow the lights and please make your way to the seats."],["s","5325","cine_pillarlight","56737","2","2","1","","Cine Pillar Light","For the perfect movie theatre ambiance"],["s","4444","cine_platform","55667","0","4","1","","Cinema Platform","Enjoy the show!"],["s","3848","cine_popcorn","56746","2","1","1","","Popcorn Machine","Munch & Crunch- the perfect snack for movie-goers."],["s","3852","cine_projector","57710","0","1","1","","Movie Projector","For showing home movies and Hollywood blockbusters."],["i","4519","cine_pstr_0","56737","","","","","Revenge of the Cheeps","It's a Freaking SAGA"],["i","4517","cine_pstr_1","56737","","","","","Get Frank","The fourth film by Quilting Tarantula"],["i","4529","cine_pstr_10","49452","","","","","Gnome","This holiday, discover your inner Habbo"],["i","4589","cine_pstr_14","56737","","","","","Freeze!","Let it go, let it go, I can't hold this snowball anymore!"],["i","4588","cine_pstr_15","56737","","","","","Ducknado","Almost enough said!"],["i","4584","cine_pstr_16","56737","","","","","Quacktrix","No one can be told what the Quacktrix is. You must see it for yourself."],["i","4590","cine_pstr_17","56737","","","","","Barry Bobba","A half-blood Habbo and one of the most famous role-players of all time."],["i","4583","cine_pstr_18","56737","","","","","Habbo Games","May the credits be ever in your favor!"],["i","4586","cine_pstr_19","56737","","","","","The Guardian of Habbo","All Habbos start somewhere."],["i","4522","cine_pstr_2","56737","","","","","The Rabbit","An unexpected hop."],["i","4520","cine_pstr_3","56737","","","","","The Rabbit 2","One carrot to rule them all."],["i","4514","cine_pstr_4","56737","","","","","Dark Duck Descends","He's the duck Habbo deserves"],["i","4518","cine_pstr_5","56737","","","","","Avatar Editor","From the makers of The Catalog"],["i","4513","cine_pstr_6","56737","","","","","The Ducket List","We live, we die, we rent."],["i","4515","cine_pstr_7","56737","","","","","M.O.D","I'll make him a trade he can't refuse."],["i","4516","cine_pstr_8","56737","","","","","Habbo Club","Rule Six: Nice shirt, Nice shoes."],["i","4521","cine_pstr_9","56737","","","","","Bobbaro","An adventure through the forest with a penguin spirit Bobbaro"],["s","3847","cine_roof","56746","2","3","3","","Glass roof","Put a shiny glass ceiling on your red carpet!"],["s","3842","cine_screen","56746","0","6","1","","Movie Screen","The silver screen and home to movie magic."],["s","5329","cine_soda","56737","0","1","1","","Big Soda","Soda, pop, fizz"],["s","3839","cine_star","45512","0","1","1","","Walk of Fame Tile","Go down in Habbo history!"],["s","5324","cine_starchair","48719","0","1","1","","Director's Chair","You call the shots!"],["s","5328","cine_teleport1","48187","4","1","1","","Cinema Teleport","Theatre 1"],["s","5326","cine_teleport2","48287","0","1","1","","Cinema Teleport","Theatre 2"],["s","5330","cine_teleport3","48287","4","1","1","","Cinema Teleport","Theatre 3"],["s","5323","cine_teleport4","48287","4","1","1","","Cinema Teleport","Theatre 4"],["s","3851","cine_ticket_booth","56746","2","1","1","","Ticket Vending Booth","What's showing tonight?"],["s","3844","cine_tile","56746","0","1","1","","Tile With a Halo","Lights up when walked over."],["s","3834","cine_vipsign","56746","0","1","1","","HC Sign","Who's hot... and who's not."],["s","3846","theatre_seat_b","56737","0","1","1","","Black Habbowood Chair","Try not to spill any drinks!"],["s","3843","theatre_seat_g","56737","0","1","1","","Green Habbowood Chair","Try not to spill any drinks!"],["s","3418","garden_flo1","51267","0","1","1","","Jimson Weed","Awww aren't they beautiful..."],["s","3409","garden_flo2","50156","0","1","1","","Yellow Delight","Awww aren't they beautiful..."],["s","3426","garden_flo3","51267","0","1","1","","Pink Pandemic","Awww aren't they beautiful..."],["s","3415","garden_flolamp","51267","0","1","1","","Wonder Lamp","I wonder what makes it glow..."],["s","3420","garden_flytrap","51497","2","1","1","","Snapping Teleporter","Hope this doesn't hurt.. Ouch!"],["s","3422","garden_jungle","51267","0","1","1","","Duck Grass","duck, duck, goose..."],["s","3405","garden_jyrki","51267","0","1","1","","Star Flower","Awww aren't they beautiful..."],["s","3425","garden_leaves","51267","0","1","1","","Garden Leaves","Elegant and classy at the same time"],["s","3421","garden_lupin1","51267","0","1","1","","Gold Lupine","Awww aren't they beautiful..."],["s","3416","garden_lupin2","51267","0","1","1","","Sky Blue Lupine","Awww aren't they beautiful..."],["s","3407","garden_lupin3","51267","0","1","1","","Ravishing Red Lupine","Awww aren't they beautiful..."],["s","3419","garden_lupin4","51267","0","1","1","","White Lupine","Awww aren't they beautiful..."],["s","3411","garden_lupin5","51267","0","1","1","","Princly Purple Lupine","Awww aren't they beautiful..."],["s","3404","garden_mursu","51267","0","1","1","","Perfectly Pink Rush","Watch your allergies..."],["s","3412","garden_mursu2","51267","0","1","1","","Rampaging Red Rush","Watch your allergies..."],["s","3408","garden_mursu3","51267","0","1","1","","Gallant Gold Rush","Watch your allergies..."],["s","3414","garden_mursu4","51267","0","1","1","","Wimsome White Rush","Watch your allergies..."],["s","3413","garden_orchtree","51267","0","1","1","","Bauhibia Orchid Tree","They look like upside down bells."],["s","3406","garden_seed","45508","0","1","1","","Violet blossom","All it needs is LOVE!"],["s","3417","garden_seed_cmp","45508","0","1","1","","Violet blossom","All it needs is LOVE!"],["s","3423","garden_staringbush","50156","4","1","3","","Weird Staring Bush","Ummmmm. No comment..."],["s","3424","garden_volcano","50156","4","2","2","","Volcano Flower","AHHH Run away!!!"],["i","4325","garden_wall","51267","","","","","Green Bean Vines","Wonder how far they will grow..."],["s","3436","hc2_armchair","45512","2","1","1","","Leather Armchair","Relax in style"],["s","3439","hc2_barchair","45512","2","1","1","","Leather Bar Stool","Sit up high"],["s","3446","hc2_biglamp","45512","4","1","1","","Black Lamp","Sophisticated lighting"],["s","3440","hc2_carpet","45512","4","3","5","","Trendy Rug","Luxurious comfort"],["s","3430","hc2_cart","45512","4","1","1","","Service Trolley","Butler not included"],["s","3450","hc2_coffee","45512","2","1","1","","Espresso Machine","Morning glory"],["s","3449","hc2_divider","45512","4","1","3","","Black Divider","Divide the wealth"],["s","3459","hc2_dvn","45512","2","1","3","","Leather Duvan","Stretch out"],["s","3458","hc2_frplc","45512","0","1","2","","Suave Fireplace","Roaring success"],["s","3452","hc2_sofa","45512","4","2","1","","Leather Sofa","Stylish seating"],["s","3434","hc2_sofatbl","45508","0","2","2","","Glass Table","Make a statement"],["s","3428","hc2_vase","45512","0","1","1","","Black Vase","Elegantly shaped"],["s","3445","hc3_bard","45512","0","2","1","","HC Bar Desk","Set up shop"],["s","3461","hc3_dc","45512","0","1","3","","HC Duvan","Live the life"],["s","3431","hc3_divider","45512","4","1","3","","HC Divider","Manage your space"],["s","3447","hc3_hugelamp","45512","4","1","1","","HC Lamp","Makes a huge statement"],["s","3465","hc3_light","45512","0","2","1","","HC Light","Stay in the spotlight"],["s","3438","hc3_shelf","45512","0","3","1","","HC Shelves","Store your awards"],["s","3441","hc3_sofa","45512","0","2","1","","HC Sofa","Comfort in style"],["s","3470","hc3_stereo","45512","2","3","1","","HC Stereo","Block rockin' beats"],["s","3448","hc3_stool","45512","0","1","1","","HC Stool","High and mighty"],["s","3466","hc3_table","45508","0","2","2","","HC Coffee Table","For social gatherings"],["s","3479","hc3_vase","45512","0","1","1","","HC Vase","The ultimate floral arrangement."],["i","4329","hc3_walldeco","45512","","","","","HC Wall Art","Cubism lives on"],["s","4153","school_bench","56746","0","3","1","","Cafeteria Bench","Take a load off!"],["s","4151","school_bus","56746","2","2","4","","School Bus","On the journey of learning ;)"],["s","5272","school_cafe","54386","0","2","1","","School Lunch Cart","No throwing food!"],["s","4162","school_chair","56746","0","1","1","","Desk Chair","Sit down (don't) behave."],["s","5257","school_chairgold","47123","0","1","1","","Rare Gilded Chair","Be the classiest in class!"],["s","5262","school_chair_b","54386","0","1","1","","Blue School Chair","Not to be used in association with musical chairs"],["s","5265","school_chair_g","54386","0","1","1","","Green School Chair","Not to be used in association with musical chairs"],["i","4418","school_chalkboard","56746","","","","","Chalkboard","I will not waste chalk. I will not waste chalk. I will not..."],["i","4512","school_chalkboard2","54386","","","","","School Chalkboard","Does chalk really taste like cheese?"],["i","4421","school_charts","56746","","","","","School Charts","TMI!"],["s","5260","school_coatrack_b","54386","0","2","1","","Blue Coatrack","THE place to hang out"],["s","5258","school_coatrack_g","54386","0","2","1","","Green Coatrack","THE place to hang out"],["s","5270","school_coatrack_r","54386","0","2","1","","Red Coatrack","THE place to hang out"],["s","4154","school_console","56746","0","1","1","","School Desk","Walk the path of knowledge ;)"],["s","5264","school_consolegold","47123","0","1","1","","Rare Gilded Desk","Be the classiest in class!"],["s","5269","school_console_b","54386","0","1","1","","Blue School Desk","Write on the paper, not on the desk!"],["s","5268","school_console_g","54386","0","1","1","","Green School Desk","Write on the paper, not on the desk!"],["s","4157","school_floor","56746","0","2","2","","School Flooring","Walk the path of knowledge ;)"],["s","5266","school_fountain","54386","0","1","1","","School Water Fountain","Water, water, everywhere!"],["s","5271","school_gate","47346","2","3","1","","School Gates","The gateway to a whole new education"],["s","4146","school_locker_b","45512","2","1","1","","Blue Locker Teleport","Takes you far away from here!"],["s","4158","school_locker_b_nosale","45508","2","1","1","","Blue Locker (NOT FOR SALE)","Store your stuff safely"],["s","5261","school_locker_b_notele","54386","4","1","1","","Blue School Locker","Don't forget your combination!"],["s","5263","school_locker_g","56025","4","1","1","","Teleport School Locker","Ooh, where does THIS locker go?"],["s","5259","school_locker_g_notele","54386","4","1","1","","Green School Locker","Don't forget your combination!"],["s","4150","school_locker_r","45512","2","1","1","","Red Locker Teleport","Takes you far away from here!"],["s","4147","school_locker_r_nosale","45508","2","1","1","","Red Locker (NOT FOR SALE)","Store your stuff safely"],["s","5267","school_locker_r_notele","54386","4","1","1","","Red School Locker","Don't forget your combination!"],["s","4145","school_platform","56746","0","1","1","","Auditorium Platform","Holds your school assembly"],["s","4155","school_stuff_01","56746","2","1","1","","School Books","Makes your brain grow... or something."],["s","4159","school_stuff_02","56746","0","1","1","","Chem Set","Don't blow anything up..."],["s","4161","school_stuff_03","56746","0","1","1","","Cafeteria Burger","Yum! Cafeteria Food..."],["s","4160","school_stuff_04","56746","0","1","1","","Cafeteria Meatballs","Yum! Cafeteria Food..."],["s","4156","school_stuff_05","56746","0","1","1","","Cafeteria Nuggets","Yum! Cafeteria Food..."],["s","4149","school_stuff_06","56746","0","1","1","","Cafeteria Vegetables","Yum! Cafeteria Food..."],["s","4152","school_table","56746","0","3","2","","Cafeteria Table","No food fights please!"],["s","4148","school_toilet_stall","56746","2","1","1","","Toilet Stall","Close the door please..."],["i","4422","school_toilet_wall","56746","","","","","Toilet Wall","""E&"Don't scribble on the wall!""E&""],["i","4419","school_urinal","56746","","","","","Urinal","With a sweet smell of roses!"],["i","4420","school_wall","56746","","","","","School Wall","Don't just be another brick in the wall..."],["s","4692","matic_box","45508","0","1","1","","Mystery Box","What did you get?"],["s","4965","steampunk_carpet","56737","2","3","2","","Steampunk Carpet","I like my carpet steamed"],["s","4955","steampunk_chair","56737","2","1","1","","Steampunk Chair","Don't worry we don't think it will electrocute you"],["s","4952","steampunk_chand","56746","0","1","1","","Steampunk Chandalier","Light it up (3 states)"],["s","4961","steampunk_computer","56737","2","1","1","","Steampunk Computer","The future of computing?"],["s","4953","steampunk_floor1","56737","0","2","2","","Steampunk Floor","With 6 states!"],["s","4962","steampunk_floor2","56737","2","2","2","","Steampunk Floor","Underfoot lighting"],["s","4958","steampunk_gear_1","56746","0","1","1","","Large Cog","Watch them turn"],["s","4964","steampunk_gear_2","56746","0","1","1","","Small Cog","Watch them turn"],["s","4963","steampunk_globe","56737","0","1","1","","Globe","Where in the world?"],["s","4966","steampunk_gramophone","45508","0","1","1","","Steampunk Gramophone","The future of music?"],["s","4960","steampunk_lamp","56746","0","1","1","","Steampunk Lamp","Light the way"],["i","4503","steampunk_map","56737","","","","","World Map","Where in the world?"],["s","4949","steampunk_pillar_1","56746","0","1","1","","Steampunk Pillar","Industrial Framework"],["s","4951","steampunk_pillar_2","56746","0","1","1","","Steampunk Pillar","Industrial Hydraulics"],["s","4950","steampunk_rack","56737","0","1","1","","Donnie Santini's Helmet","But where's Donnie?!?"],["s","4954","steampunk_sofachair","56746","2","1","1","","Steampunk Sofa","Somehwere to sit?"],["s","4948","steampunk_table_1","56737","0","1","2","","Steampunk Table","With a steamy finish"],["s","4957","steampunk_table_2","56737","0","2","2","","Steampunk Table","With a steamy finish"],["s","4956","steampunk_tele","49408","4","1","1","","Steampunk Tele","Steamy!"],["s","4967","steampunk_timemach","45508","2","1","1","","Time Machine","A journey to the fourth dimension"],["i","4501","steampunk_wall1","56737","","","","","Steampunk Wall","Tick, Tock."],["i","4500","steampunk_wall2","56737","","","","","Steampunk Wall","3 States!"],["i","4502","steampunk_window","56737","","","","","steampunk_window name","steampunk_window desc"],["s","4968","steampunk_zep","45508","4","2","1","","Steampunk Zeppelin","Keep away from open flames!"],["s","8217","rare_beehive_bulb*3","59424","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#9C0247","Maroon Amber Lamp","Only with these on will you be able to see the truth!"],["s","4852","rare_dragonlamp_pink","45508","4","1","1","","Pink Dragon Lamp","Breathes Fire"],["s","4859","rare_icecream*10","59424","2","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","Silver Icecream Machine","ice cold snacks"],["s","8208","pillar*10","59424","0","1","1","#FFFFFF,#9C0247,#9C0247","Maroon Classic Pillar","Ancient and stately."],["s","8209","rare_parasol*4","59424","0","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#9C0247","Maroon Parasol","Zon! Zon! Zon!"],["s","8210","scifidoor*11","59424","2","1","1","#FFFFFF,#9C0247,#9C0247,#9C0247,#FFFFFF","Maroon Spaceship Door","Beam me up."],["s","8211","sleepingbag*11","59424","0","1","3","#9C0247,#FFFFFF,#9C0247,#FFFFFF,#9C0247,#FFFFFF","Maroon Sleeping Bag","Ultimate coziness"],["s","8212","rare_fountain*4","59424","0","1","1","#FFFFFF,#FFFFFF,#9C0247","Maroon Fountain","Lounge Oasis"],["s","8213","rare_dragonlamp*10","59424","2","1","1","#FFFFFF,#9C0247,#9C0247,#FFFFFF,#FFFFFF,#FFFFFF,#FFFFFF","Maroon Dragon Lamp","Scary and scorching!"],["s","8214","rare_fan*10","59424","0","1","1","#9C0247,#FFFFFF,#FFFFFF,#FFFFFF","Maroon Powered Fan","Turn it on and enjoy the cool breeze"],["s","8215","rare_icecream*11","59424","2","1","1","#FFFFFF,#9C0247,#FFFFFF,#FFFFFF,#FFFFFF","Maroon Ice Cream Maker","Virtual chocolate rocks!"],["s","8216","wooden_screen*10","59424","0","1","2","#FFFFFF,#FFFFFF,#9C0247,#9C0247,#FFFFFF,#FFFFFF","Maroon Oriental Door","Adds an exotic vibe to any room"],["s","8218","pillow*10","59424","0","1","1","#9C0247,#9C0247,#FFFFFF,#FFFFFF","Maroon Pillow","Rest your head after a long day of partying."],["s","8219","scifiport*10","59424","0","1","1","#FFFFFF,#9C0247,#FFFFFF,#FFFFFF,#FFFFFF,#9C0247","Maroon Laser Portal","Energy beams. No trespassers!"],["s","8220","rare_elephant_statue*3","59424","0","1","1","#FFFFFF,#9C0247","Maroon Elephant","Imported Handicrafts"],["s","8221","marquee*11","59424","2","1","1","#FFFFFF,#FFFFFF,#FFFFFF,#9C0247,#FFFFFF","Maroon Marquee","A door and a sunshade in one furni!"],["s","8222","scifirocket*10","59424","0","1","1","#FFFFFF,#FFFFFF,#9C0247,#FFFFFF","Maroon Smoke Machine","Retro-mystification"],["i","4499","dimmer_steampunk","49408","","","","","Steampunk Dimmer Switch","Set the right mood."],["s","3805","qt_val11_discoball","45512","0","1","1","","Disco Hearts","A slow dance never felt more romantic..."],["s","3809","qt_val11_duckformer","45512","0","1","1","","Duck-o-Heart","It's like magic! Is it a duck.. is it a heart?"],["i","4378","qt_val11_heartlights","45512","","","","","Heart Lights","Brightens up your room with romance!"],["s","3803","qt_val11_holoduck","45512","0","1","1","","Holo-Duck","Lights up your day!"],["s","3813","qt_val11_holoheart","45512","0","1","1","","Holo-Heart","Lights up your heart!"],["s","3810","qt_val11_jellychair","45508","2","1","1","","Jelly Chair","Squishy like your heart!"],["s","3811","qt_val11_jellyheart","45508","2","1","1","","Jelly Heart","Get jiggly with it!"],["s","4487","dark_merdragon","45508","0","1","3","","Black Leviathan","Limited Edition Rare. Found in the darkest depths of the abyss."],["s","2928","sob_carpet","45508","0","3","5","","Bobba Carpet","Walk the walk..."],["s","204","door_event","45512","2","1","1","","Hire-A-Room","Room hire service on the fly"],["s","10674","rainbow_ltd_parasol","65046","0","1","1","","Rainbow Parasol","Very cute and proud!"],["s","4361","snst_fireplace","45508","2","3","3","","Epic Fireplace","With a fire big enough to keep the entire room warm"],["s","4380","xmas11_balloon","45508","0","1","1","","Rare Balloon Machine","Double click to pick up a Balloon and some festive cheer!"],["s","4370","xmas11_balloon1","55667","0","1","1","","Single Balloon","A party on a string!"],["s","4368","xmas11_balloon2","55667","0","1","1","","Double Balloon","A party on a string!"],["s","4381","xmas11_balloon3","55667","0","1","1","","Triple Balloons","A party on a string!"],["s","4323","xmas11_btlr","54031","2","1","1","#FFFFFF,#FFFFFF","The Santa Butler","Spreading cheer and good times!"],["s","4303","xmas11_chair","55667","4","1","1","","Red Wooden Cabin Chair","Cushioned for comfort"],["s","4324","xmas11_chair_2","55667","4","1","1","","Green Wooden Cabin Chair","Cushioned for comfort"],["s","4328","xmas11_chair_3","55667","4","1","1","","Beige Wooden Cabin Chair","Cushioned for comfort"],["s","4326","xmas11_chair_4","55667","4","1","1","","Wooden Cabin Chair with Fur Cover","Cushioned for comfort"],["s","4297","xmas11_comfy_bench","55667","4","2","1","","Red Wooden Cabin Bench","Fits more than one"],["s","4327","xmas11_comfy_bench_2","55667","4","2","1","","Green Wooden Cabin Bench","Fits more than one"],["s","4330","xmas11_comfy_bench_3","55667","4","2","1","","Beige Wooden Cabin Bench","Fits more than one"],["s","4331","xmas11_comfy_bench_4","55667","4","2","1","","Wooden Cabin Bench with Fur Cover","Fits more than one"],["s","4283","xmas11_comfy_chair","55667","2","1","1","","Red Cozy Cabin Chair","Sit down and relax"],["s","4332","xmas11_comfy_chair_2","55667","2","1","1","","Green Cozy Cabin Chair","Sit down and relax"],["s","4315","xmas11_comfy_chair_3","55667","2","1","1","","Beige Cozy Cabin Chair","Sit down and relax"],["s","4333","xmas11_comfy_chair_4","55667","2","1","1","","Cozy Cabin Fur Chair","Sit down and relax"],["i","4443","xmas11_cuckoo","55667","","","","","Cuckoo's Clock","Let's you know when the clock strikes midnight..."],["s","4309","xmas11_elewood","55667","0","1","1","","Cabin Stone and Wood Tiles","Change the height by clicking"],["s","4292","xmas11_firewood","55667","0","1","1","","Cabin Firewood","Click to change the size of the pile"],["s","4290","xmas11_flag","45508","0","1","1","","Flag","For marking an area"],["s","4289","xmas11_footstool","55667","0","1","1","","Red Cabin Footstool","Put your feet up and take it easy"],["s","4334","xmas11_footstool_2","55667","0","1","1","","Green Cabin Footstool","Put your feet up and take it easy"],["s","4335","xmas11_footstool_3","55667","0","1","1","","Beige Cabin Footstool","Put your feet up and take it easy"],["s","4336","xmas11_footstool_4","55667","0","1","1","","Cabin Footstool with Fur Cover","Put your feet up and take it easy"],["i","4440","xmas11_hd1","55667","","","","","Moose Head","I'd be a lot happier out in the woods!"],["i","4437","xmas11_hd2","55667","","","","","Arctic Bear Head","How did I end up here on the wall?"],["i","4439","xmas11_hd3","55667","","","","","Wild Boar Head","At least they didn't put an apple in my mouth..."],["i","4435","xmas11_hd4","55667","","","","","Crocodile Head","Someone take this thing off of my head please!"],["i","4438","xmas11_hd5","55667","","","","","Ghost Pet Head","I don't give a sheet..."],["i","4441","xmas11_hd6","55667","","","","","Deer Head","Oh deer what have they done with me..."],["s","4384","xmas11_luxchair1","55667","2","1","1","","White Chesterfield Armchair","Swank seating for your delicate behinds."],["s","4386","xmas11_luxchair2","55667","2","1","1","","Red Chesterfield Armchair","Swank seating for your delicate behinds."],["s","4385","xmas11_luxchair3","55667","2","1","1","","Black Chesterfield Armchair","Swank seating for your delicate behinds."],["s","4388","xmas11_luxdish1","61013","0","1","1","","Chocolate Fountain","Sweet, sweet heaven!"],["s","4387","xmas11_luxdish2","55667","0","1","1","","Strawberries","Little pieces of loveliness!"],["s","4389","xmas11_luxdish3","55667","0","1","1","","Porcelain","Tea's served!"],["s","4390","xmas11_luxfloor1","55667","0","2","2","","Parquet","Luxury Flooring"],["s","4369","xmas11_luxfloor2","55667","0","2","2","","Polished Stone Floor","Luxury Flooring"],["s","4391","xmas11_luxsofa1","55667","2","2","1","","White Chesterfield Sofa","Swank seating for your delicate behinds."],["s","4392","xmas11_luxsofa2","55667","2","2","1","","Red Chesterfield Sofa","Swank seating for your delicate behinds."],["s","4393","xmas11_luxsofa3","55667","2","2","1","","Black Chesterfield Sofa","Swank seating for your delicate behinds."],["s","4372","xmas11_luxtable","55667","0","1","2","","Serving Table","Serves up a delicate meal."],["s","4302","xmas11_nghtstnd","55667","0","1","1","","Cabin Nightstand","With a small lamp to light up your evenings"],["s","4300","xmas11_petfood","55667","2","1","1","","Cheese","Does not smell like old socks"],["s","4282","xmas11_sofatable","55667","0","2","2","","Cabin Sofa Table","Put down your hot choc and chill"],["s","4285","xmas11_stonedivider","55667","0","2","1","","Cabin Divider","Divide the space and make it stylish"],["s","4296","xmas11_stonefloor","55667","2","2","2","","Cabin Stone Floor","Cold under your bare feet"],["s","4293","xmas11_stool","55667","0","1","1","","Red Wooden Cabin Stool","Cushioned for comfort"],["s","4337","xmas11_stool_2","55667","0","1","1","","Green Wooden Cabin Stool","Cushioned for comfort"],["s","4339","xmas11_stool_3","55667","0","1","1","","Beige Wooden Cabin Stool","Cushioned for comfort"],["s","4340","xmas11_stool_4","55667","0","1","1","","Wooden Cabin Stool with Fur Cover","Cushioned for comfort"],["s","4294","xmas11_stove","55667","0","1","1","","Cabin Stove","Click it to turn up the heat"],["s","4299","xmas11_throne","45508","2","1","1","","Xmas Throne","A kingly seat"],["i","4436","xmas11_wall","55667","","","","","Cabin Wall","Keeps your cabin warm and cozy"],["s","4288","xmas11_woodfloor","55667","2","2","2","","Cabin Wooden Floor","Doesn't creak under your feet"],["s","4286","xmas11_yetifeet","45508","0","1","1","","xmas11_yetifeet name","xmas11_yetifeet desc"],["s","3724","qt_xm10_elephant","45512","2","1","1","","Elephant Minibar","Now serving icy cool drinks!"],["s","3726","qt_xm10_gnome","45512","0","1","1","","Garden Gnome","Someone left him out in the cold for too long!"],["s","3718","qt_xm10_iceclubsofa","45512","0","2","1","","Cool Club Sofa","The pillows should keep you warm."],["s","3746","qt_xm10_icedragon","45512","4","1","1","","Blizzard Dragon","With a fiery breath."],["s","3727","qt_xm10_iceduck","45512","0","1","1","","Plain Icy Duck","It's quack-tastic!"],["s","3755","qt_xm10_iceelephant","45512","0","1","1","","Woah Nelly!","So cool it's freezing!"],["s","3737","qt_xm10_icepillar","45512","0","1","1","","Frozen Pillar","Won't crumble... might melt though."],["s","3734","qt_xm10_iceteddy","45508","4","1","1","","Frozen Ted","Cold yet cuddly."],["s","5534","xmas13_icecream","48938","2","1","1","","Icy Ice Cream Maker","Virtual Ice Cream Rocks!"],["s","3151","ads_goldtabl","45508","0","1","1","","The Golden Tablet","What every Museum resident craves"],["s","350","easter_2021_box","45531","","1","1","","Easter Egg 2021","What did you get beneath that chocolate?"],["s","3923","kuurna_chair","45508","4","1","1","","Pixel Sofa Chair","Cool and comfortable!"],["s","3928","kuurna_chair1","45508","4","1","1","","Pixel Dining Chair","Pixel dining at its best."],["s","3922","kuurna_lamp","45508","0","1","1","","Pixel Lamp","Shed some light on your room."],["s","3924","kuurna_mat","45508","2","3","2","","Pixel Shag Rug","Design and comfort in one great rug!"],["s","4618","kuurna_red_chair","45508","4","1","1","","Pixel Sofa Chair","Sit on it"],["s","4619","kuurna_red_chair1","45508","4","1","1","","Pixel Dining Chair","Take a load off"],["s","4622","kuurna_red_lamp","45508","0","1","1","","Pixel Lamp","Shed some light on your room"],["s","4617","kuurna_red_sofa","45508","4","2","1","","Pixel Sofa","Make room for your friends!"],["s","4620","kuurna_red_table","45508","0","2","2","","Pixel Dining Table","Did someone say dinner party?"],["s","4621","kuurna_red_table1","45508","0","1","1","","Pixel Side Table","Small but functional"],["s","3919","kuurna_sofa","45508","4","2","1","","Pixel Sofa","Make room for your friends!"],["s","3926","kuurna_table","45508","0","2","2","","Pixel Dining Table","Invite your friends over for a cool dining experience!"],["s","3925","kuurna_table1","45508","0","1","1","","Pixel Side Table","Small but functional."],["s","4663","track12_ujack_sofa","45508","0","2","1","","Union Jack Sofa","Jolly good rumpus machine, innit??"]] \ No newline at end of file diff --git a/tools/gamedata/shockwave/hh_furni_xx_nest.cct b/tools/gamedata/shockwave/hh_furni_xx_nest.cct new file mode 100644 index 0000000..3720e7c Binary files /dev/null and b/tools/gamedata/shockwave/hh_furni_xx_nest.cct differ diff --git a/tools/gamedata/shockwave/hh_furni_xx_photo.cct b/tools/gamedata/shockwave/hh_furni_xx_photo.cct new file mode 100644 index 0000000..3720e7c Binary files /dev/null and b/tools/gamedata/shockwave/hh_furni_xx_photo.cct differ diff --git a/tools/gamedata/shockwave/hh_furni_xx_post.it.cct b/tools/gamedata/shockwave/hh_furni_xx_post.it.cct new file mode 100644 index 0000000..3720e7c Binary files /dev/null and b/tools/gamedata/shockwave/hh_furni_xx_post.it.cct differ diff --git a/tools/gamedata/shockwave/partsets.txt b/tools/gamedata/shockwave/partsets.txt new file mode 100644 index 0000000..0d1c15c --- /dev/null +++ b/tools/gamedata/shockwave/partsets.txt @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tools/gamedata/shockwave/partsets.xml b/tools/gamedata/shockwave/partsets.xml new file mode 100644 index 0000000..ade7b82 --- /dev/null +++ b/tools/gamedata/shockwave/partsets.xml @@ -0,0 +1,117 @@ + +- + + + + + + + + + + + + + + + + + + + + + + + +- + + + + + + + + + + + + + + + + + + + + + +- + + + + + + + + + + + +- + + + + + + + + +- + + + + +- + + + +- + + + + + +- + + + + + +- + + + + + + + + + +- + + + + + +- + + + +- + + + + + + + \ No newline at end of file diff --git a/tools/gamedata/shockwave/productdata.txt b/tools/gamedata/shockwave/productdata.txt new file mode 100644 index 0000000..2c80c61 --- /dev/null +++ b/tools/gamedata/shockwave/productdata.txt @@ -0,0 +1,30 @@ +[["wallpaper 2","wallpaper","Wallpaper",""],["diner_gumvendor*6","Blue Gum Machine","Fruity bubbly goodness!",""],["ads_elisa_gnome","ads_elisa_gnome name","ads_elisa_gnome desc",""],["svnr_uk","Big Ben","September 2008, 3/6",""],["dimmer_swtch","Large Mood Switch","Set the right MOOD!",""],["dimmer_buttn","Small Mood Switch","Set the right MOOD!!!",""],["dimmer_fuse2","Small Mood Controller","Set the right MOOD!!!",""],["dimmer_fuse6","Large Mood Controller","Set the right MOOD!",""],["stand_polyfon_z","Shelf","Tidy up",""],["hcc_crnr","Glass Corner","Adds the finishing touch",""],["poster 18","Butterfly Cabinet 2","Beautiful reproduction butterfly",""],["party_shelf","Bar Shelf","Line up your beverages!",""],["china_ox","Ox Statue","An oriental sculpture",""],["DEV bed_budget_one5","Beige Pura Bed","Prince sized comfort!",""],["safe_silo*6","Blue Safe Minibar","Totally shatter-proof!","Special Offer!"],["chair_plasto","Chair","Hip plastic furniture",""],["glass_sofa*5","Candy Glass Sofa","Double glazed",""],["bardeskcorner_polyfon*2","Black Mode Bardesk Corner","Black Mode Bardesk Corner",""],["sf_roof","Starship Roof","But it doesn't rain in space...",""],["chair_silo*4","Beige Silo Dining Chair","Beige Silo Dining Chair",""],["eco_light2","Eco Light 2","Energy saving bulb fitted",""],["noob_table*1","My first Habbo table","Lightweight, practical and orange",""],["deal_catfood","Sardines Mega Multipack","Fantastic 20% Saving!",""],["deadduck3","Dead Duck 3","With added ectoplasm",""],["poster 41","Gold Record","You sold 500,000!",""],["fx_bubble","Bubbles","Forever blowing bubbles!",""],["chair_silo","Dining Chair","Keep it simple",""],["glass_chair*3","White Glass Chair","Translucent beauty",""],["hockey_score","Scoreboard","...for keeping your score",""],["wallpaper 30","wallpaper","Wallpaper",""],["jp_tatami","Small Tatami Mat","Shoes off please",""],["sofa_silo*8","Yellow Two-Seater Sofa","Cushioned, understated comfort",""],["deal_tp3","Easter Park Bundle","",""],["glass_table*2","Glass table","Translucent beauty",""],["avatar_effect12","Frozen","Ice cold!",""],["chair_norja*8","Yellow Chair","Sleek and chic for each cheek",""],["penguin_magician","Magic Penguin","Aptenodytes Houdini",""],["lblue_mode_jan08_deal","Light Blue Mode Bedroom Deal","Light Blue Single and Double Mode Bed, Mode Bookcase",""],["SF_table","Starship Table","Star charts and mission briefs",""],["a0 deal118","Pink Habbo Roller","The power of movement","2: 5 Pink Habbo Rollers in a convenient Pack"],["sofachair_polyfon*8","Yellow Mode Armchair","Yellow Mode Armchair",""],["diner_chair*7","Green Stool","Perch in comfort",""],["safe_silo*8","Yellow Safe Minibar","Totally shatter-proof!",""],["table_silo_small","Occasional Table","Hip plastic furniture",""],["deal_uk_junglewall1","Jungle Wall","","Save 25%"],["soft_sofachair_norja","Black Iced Sofachair","Black Iced Sofachair",""],["deal_sport2","Player Deal","",""],["divider_nor2*3","White Iced Bar-Desk","Strong, yet soft looking",""],["grunge_sign","Road Sign","Bought legitimately from an M1 cafe.",""],["xmas_cstl_twr","Ice Castle Tower","All I see from up here is snow!",""],["country_forestwall","Forest Wall Poster","Give your walls a woodland touch",""],["gothic_carpet","Cobbled Path","The route less travelled",""],["deal_uk_floor9b","Standard Tile","The floor is your canvas",""],["pet0","Pet and Basket","Night, night",""],["xmas08_cubetree","Cube Tree","So ice Cubes DO grow on trees...",""],["divider_silo1","Corner Shelf","Neat and natty",""],["barchair_silo*7","Green Bar Stool","Take a perch!",""],["fx_explosion","The Kaboomer","Blow it up, baby!",""],["ads_cldesk","Idea Agency Desk","Work on your latest agency brief.",""],["table_norja_med*4","Urban Iced Coffee Table","For larger gatherings",""],["pura_mdl1*4","White Pura Module 1","Any way you like it!",""],["tiki_bench","Tiki Bar Stool","Sit back and relax!",""],["bed_budget","Pura Bed","Comfortable, affordable!",""],["ads_mall_window","Mall Window","Take a peek - what's inside?",""],["tree4","Christmas Tree 2","Any presents under it yet?",""],["a0 deal108","Green Habbo Roller","The power of movement","2: 3 Green Habbo Rollers in a convenient Pack"],["a0 marquee","White Marquee","It's both door and a shade!",""],["hw_08_xray","X-Ray Light Box","Check for breaks and sprains",""],["house","Gingerbread House","Good enough to eat",""],["landscape 8","landscape","Rolling hills of chocolate!",""],["summer_chair*4","White Deck Chair","Sit back and enjoy!",""],["safe_silo*4","Beige Safe Minibar","Totally shatter-proof!",""],["DEV bed_budget1","Aqua Pura Double Bed","King sized comfort!",""],["carpet_valentine","Red Carpet","For making an entrance.",""],["ads_idol_voting_ch","Voting Chair","Do you have a good ear for music?",""],["poster 518","The Welsh flag","A fiery dragon for your wall",""],["deal_swapit1","Mode Bundle","",""],["ads_nokia_phone","Nokia Phone","Nokia Phone",""],["soft_sofa_norja","Black Iced Sofa","Black Iced Sofa",""],["sound_set_57","RnB Grooves 3","Feel the groove",""],["lt_spider","Tarantula","It'll make you jump",""],["carpet_standard*b","Floor Rug","Available in a variety of colours",""],["rclr_sofa","Polar Sofa","Snuggle up together",""],["rare_mmmth","Sofa Mammut","Pre Historic Sofa",""],["a2 poletti","Jump ticket","Jump ticket",""],["sofachair_silo","Armchair","Large, but worth it",""],["jukebox*1","Jukebox","For your Happy Days!",""],["A1 D8P","Square Dining Table","Hip plastic furniture",""],["summer_raft2","summer_raft2","",""],["tiki_parasol","Parasol","Funky party lighting while getting out of the sun!",""],["ads_calip_chair","Calippo Chair","Calippo Inflatable Chair",""],["doormat_love","Doormat","Welcome Habbos in style",""],["prizetrophy2*1","Duck trophy","Glittery gold",""],["wallpaper 27","wallpaper","Wallpaper",""],["guitar_v","V Guitar","",""],["ads_idol_hotspot","Hot Spot Scoreboard","Stand here and await the verdict!",""],["diner_cashreg*4","White Register","Roll up roll up!",""],["svnr_it","Venetian Gondola","July 2008, 1/6",""],["pura_mdl3*6","Blue Pura Module 3","Any way you like it!",""],["a0 deal208","Sport corner grass","Let's get sporty!","Eight corner grass tracks"],["bump_tires_deal3","Bumper Tyres 3","Gets you back on track",""]] +[["glass_table","Glass table","Translucent beauty",""],["greek_gate","Greek Gate","Enter mortal, exit immortal!",""],["divider_poly3*8","Yellow Mode Bardesk Gate","Yellow Mode Bardesk Gate",""],["poster 1","Lady Lisa","Is she smiling?",""],["sf_stick","Light Pole","Get in the swing of things!",""],["christmas_poop","Reindeer Droppings","Bob?s magical fertilizer",""],["ads_cl_jukeb","Idea Agency Jukebox","Shake it like a polaroid picture in the Idea agency",""],["poster 58","Red Knots","Wishing you luck",""],["bardesk_polyfon*7","Green Bardesk","Perfect for work or play",""],["bolly_tile1","Ornamental Tile","The floor is your canvas",""],["lc_glass_floor","Ocean Window Rug","Under the sea!",""],["deals_habbowood_spot ","Spotlight Bundle","Five for the price of four!",""],["candy_bm_jan07_deal","Candy Bardesk Bundle","Great value bundle!",""],["sound_set_13","Dance 5","Let Music be the food of Habbo",""],["carpet_soft*5","Soft Wool Rug","Soft Wool Rug",""],["sofachair_polyfon*9","Red Armchair","Loft-style comfort",""],["chair_norja*4","Urban Iced Chair","Sleek and chic for each cheek",""],["a2 gothicsofa","Golden Gothic Sofa","Stylish seating for two",""],["deal_stars","Silver Star Bundle","Selection of silver stars",""],["sporttrack1*1","Sport track straight grass","Let's get sporty!","Eight straight grass tracks"],["a2 sporttrackstraight asp","Sport track straight asphalt","Let's get sporty!",""],["wallpaper 31","Gothic Wallpaper","The dark side of Habbo",""],["summer_chair*6","Blue Deck Chair","Got your bucket and spade?",""],["ads_idol_cork","Cubicle Partition","Need privacy so you can write that story?",""],["wooden_screen*9","Green Oriental Screen","Add an exotic touch to your room",""],["ads_idol_tele","American Idol Star Teleport","This could be the doorway to your dreams!","ads_idol_tele"],["diner_bardesk_corner*3","Black Corner","Now that's smooth...",""],["area_cm_jan07_deal","Area Corner Bundle","5 corner shelves",""],["a0 deal207","Sport corner grass","Let's get sporty!","Four corner grass tracks"],["CFC_50_coin_silver","Silver Coin (China)","Worth 50 Credits",""],["xmas_cstl_gate","Ice Castle Gate","Let that icy draft out!",""],["xmas_cstl_wall","Ice Castle Wall","Solid blocks of ice and snow",""],["plant_maze_snow","Snowy Maze Shrubbery","Labyrinths galore!",""],["ads_clwall3","Idea Agency Plasma 3","Whistle while you work!",""],["pura_mdl1*6","Blue Pura Module 1","Any way you like it!",""],["deal_tikisand","Island Sand Bundle","","Save 50%!"],["deal_uk_lctubes","Bensalem Tubes Deal","Tube until your heart is content with this deal.",""],["divider_silo1*7","Green Area Corner Shelf","Tuck it away!",""],["carpet_standard*1","Floor Rug","Available in a variety of colours",""],["party_barcorn","Bar Corner","Every party needs one!",""],["DEV bed_budget4","White Pura Double Bed","King sized comfort!",""],["queue_tile1","White Quest Roller","The power of movement",""],["wallpaper 28","wallpaper","Wallpaper",""],["DEV plant_bulrush","Bulrush","Ideal for the riverside",""],["croc_green_deal","Croc Starter Pack (green)","",""],["bolly_phant","Elephant MiniBar","For he's a 'bolly' good fellow!",""],["DEV bed_budget3","Black Pura Double Bed","King sized comfort!",""],["DEV bed_budget9","Red Pura Double Bed","King sized comfort!",""],["divider_nor1*6","Blue Ice corner","Blue Ice corner",""],["ads_711_2","ads_711","",""],["poster 2005","Infobus","The Special Infobus Poster",""],["party_block","Small Stage","Build yourself a stage to host events!",""],["country_grass","Field Grass","Herding and grazing",""],["table_plasto_square","Occasional Table","Hip plastic furniture",""],["scifidoor*5","White Monolith","They're out of this world!",""],["one_way_door*2","Black HC Gate","One way! The HC way!",""],["tile_stella","Star Tile","Take a walk of fame",""],["soft_sofachair_norja*5","Pink Iced Sofachair","Pink Iced Sofachair",""],["a2 gothicstool","Golden Gothic Stool","Be seated please..",""],["deal06","Stool","Rustic charm at it's best",""],["ads_puffet_tv","Ads Puffet TV","Ads Puffet TV",""],["red_mode_jan08_deal","Red Mode Bedroom Deal","Red Single and Double Mode Bed, Mode Bookcase",""],["lt_patch","Moss Patch","The ground less trodden",""],["lt_lavac","Lost Tribe Lava Corner","Very Dangerous!",""],["lt_lava","Lost Tribe Lava","Very Dangerous!",""],["eco_tree2","Pear Tree","You'll want a pair of these...",""],["divider_poly3*5","Candy Hatch (Lockable)","Keep the Pink in!",""],["val_teddy*2","Pink Share Bear","The pink bear of passion",""],["toy1*4","Rubber Ball","it's bouncy-tastic",""],["deal_skyscraper2","Skyscraper Window","Dizzy heights!",""],["party_table","Glass High Bar Table","Chat with your friends over this!",""],["VALENTINE_07_02","Valentine Deal","Signs of Love","Signs of Love"],["wooden_screen*8","Night Blue Oriental Screen","Add an exotic touch to your room",""],["sound_set_56","RnB Grooves 2","Get down tonight!",""],["deal_plant3","Sunflower","","Save 33%"],["bed_polyfon*4","Beige Mode Double Bed","Beige Mode Double Bed",""],["exe_plant","Executive Plant","Shimmering hedge trimming!",""],["scifirocket*9","Neptune Smoke Machine","Something fishy is going on...",""],["table_plasto_square*1","Occasional Table","Hip plastic furniture",""],["prizetrophy2*3","Duck trophy","Breathtaking bronze",""],["deal_uk_stone2","Tribal Stone Wall","","Great saving!"],["deal_tp4","Winter Wonderland Bundle","",""],["deal09","Queen Mum Poster","aw, bless...",""],["landscape 4","landscapes","Watch out for bears!",""],["penguin_suit","Executive Penguin","Aptenodytes Loman",""],["sound_set_65","Tiki anthems","Tiki drums go boom!",""],["CF_1_coin_bronze","Bronze Coin","Worth 1 Credit",""],["dog_red_deal","Dog Starter Pack (red)","",""],["sound_set_2","Habbo Sounds 3","Get the party started!",""],["divider_nor3","Door (Lockable)","Do go through...",""],["sound_machine7","Red Traxmachine","Red alert. Red alert. It's a party!",""],["prizetrophy3*2","Globe trophy","Shiny silver",""],["jp_irori","Irori","Traditional heating and eating",""],["deal_det_bhole","Bullet Hole","That was close!","Save 50%"],["divider_arm1","Corner plinth","Good solid wood",""],["env_tree3","Forest Trunk Seat","Earth's Green Haven - ROOM 629 by EarthBoyJim",""],["poster 19","Hole In The Wall","Trying to get in or out?",""],["poster 28","Tinsel (silver)","A touch of festive sparkle",""],["sporttrack2*3","Sport corner tartan","Let's get sporty!","Four corner tartan tracks"],["queue_tile1*9","Green Habbo Roller","The power of movement",""],["glass_stool*7","Green Glass Stool","Habbo Club",""]] +[["poster 45","Skeleton","Needs a few more Habburgers",""],["deal_movie5","Horror Bundle","Is it really a quiet Village?",""],["sound_set_66","Tiki trax","Spin some island tunes",""],["prize1","Gold Trophy","Gorgeously glittery",""],["ads_711_4","ads_711","",""],["rare_beehive_bulb*2","Yellow Amber Lamp","A honey-hued glow",""],["blue_mode_jan08_deal","Blue Mode Bedroom Deal","Blue Single and Double Mode Bed, Mode Bookcase",""],["pink_mode_jan08_deal","Candy Bedroom Deal (pink mode)","Single and Double Candy Bed, Mode Bookcase",""],["val_heart","Heart Light","Heartbroken... without your love!",""],["a2 sportcorner asphalt","Sport corner asphalt","Let's get sporty!",""],["arabian_tray4","Fruit Tray","Sweet, juicy and ripe",""],["rare_fan*9","Fucsia Powered Fan","It'll blow you away!",""],["a0 deal203","Aqua Habbo Roller","The power of movement","2: 5 Aqua Habbo Rollers in a convenient Pack"],["a0 deal210","Aqua Habbo Roller","The power of movement","2: 3 Aqua Habbo Rollers in a convenient Pack"],["queue_tile1*3","Aqua Habbo Roller","The power of movement",""],["scifidoor*4","Emerald Spaceship Door","Protect your pot of gold!",""],["doorC","Portaloo","In a hurry?",""],["poster 66","allSTARS poster","The fab five from STARstreet",""],["ads_idol_lamp","Function Lamp","Add some glamour to your party",""],["divider_nor4*9","Red Iced Auto Shutter","Habbos, roll out!",""],["pura_mdl4*8","Yellow Pura Module 4","Any way you like it!",""],["ads_mirror","ads_mirror name","ads_mirror desc",""],["table_norja_med*6","Large Coffee Table Blue","For larger gatherings",""],["eco_lamp3","Eco Lamp 3","Energy saving bulb fitted",""],["diner_sofa_1*6","Blue Sofa 1","Soft leather in 50s design",""],["sound_set_58","RnB Grooves 4","Sh-shake it!",""],["diner_table_2*5","Beige Table","Enjoy your meal!",""],["couch_norja","Bench","Two can perch comfortably",""],["hwn_deal_4","Skull Candle Holder","Alas poor Yorrick...","The 3rd one is FREE!"],["A2 OLYMPIA","Doormat","Welcome Habbos in style",""],["jp_ninjastars","Ninja Stars","Not a frisbee",""],["prizetrophy3*1","Globe trophy","Glittery gold",""],["party_seat","Club seat","Rest your dancing feet on this!",""],["diner_table_2*1","Aquamarine Table","Enjoy your meal!",""],["ads_idol_ch","American Idol Judge Chair","Sit comfortably in this American Idol Judge Chair",""],["bed_silo_two","Double Bed","Plain and simple x2",""],["jp_katana1","HC Katana Red","Essential chopping!",""],["deal_uk_lava","Lava Ditch","","Save 25%"],["table_plasto_square*2","Occasional Table","Hip plastic furniture",""],["deal_uk_hafta4","A&E Props","Emergency room in a box!","The sink is free!"],["A1 CHP","Round Dining Table","Hip plastic furniture",""],["scifiport*6","White Sci-Fi Port","Energy beams. No trespassers!",""],["party_block2","Stage Block Large","Make mine a large!",""],["rare_fan*4","SUPERLOVE Fan","Fanning the fires of SUPERLOVE...",""],["diner_chair*1","Aquamarine Stool","Perch in comfort",""],["divider_silo2","Screen","Stylish sectioning",""],["sleepingbag*6","Purple Sleeping Bag","Ultimate coziness",""],["romantique_pianochair*2","Esmerald Chair","Sit in traditional style",""],["deal_icebc3","10,000 BC Bundle 3","",""],["noob_rug*4","My first Habbo rug","Nice and neat sisal rug with light blue edging",""],["a1 sportcorner tartan","Sport corner tartan","Let's get sporty!",""],["window_diner","Large Diner Window","Panoramic view of America","NEW Aug 08"],["basket","Basket Of Eggs","Eggs-actly what you want for Easter",""],["poster 22","Winter Wonderland","A chilly snowy scene",""],["glass_chair*7","Green Glass Chair","Habbo Club",""],["bardeskcorner_polyfon*9","Red Corner Desk","Tuck it away",""],["barchair_silo*4","Beige Bar Stool","Practical and convenient",""],["grunge_mattress","Grunge Mattress","Beats sleeping on the floor!",""],["prizetrophy_cool","prizetrophy_cool","prizetrophy_cool",""],["cat_brown_deal","Cat Starter Pack (brown)","",""],["sound_set_49","Club 4","You will belong",""],["wallpaper 25","wallpaper","Wallpaper",""],["glass_stool*4","Glass stool","Translucent beauty",""],["country wheat","Golden Wheat","Right on the brink of harvest",""],["noob_stool*4","My first Habbo stool","Unfold me and take the weight off (light blue)",""],["carpet_polar*1","Pink Faux-Fur Bear Rug","Cute",""],["poster 78","Small gold star","Twinkle, twinkle",""],["mode_sp_jan07_deal","Mode Starter Pack","Hatch, Bardesk Corner and 2 Bardesks",""],["SF_lamp","Sci Fi Lamp","The future's bright...",""],["rare_icecream*8","Peppermint Ice Cream Machine","Virtual peppermint rocks!",""],["doormat_plain","Doormat","Available in a variety of colours",""],["noob_chair_tradeable_1","starter chair","beginniner set",""],["exe_rug","Executive Rug","Please remove your shoes!",""],["jp_tray4","Sushi Uni","Sushi made with sea urchin",""],["divider_nor2*5","Pink Iced bar desk","Pink Iced bar desk",""],["soft_sofachair_norja*4","Urban Iced Sofachair","Sit back and relax",""],["sw_hole","Ventilation Duct","Full of creepy crawlies",""],["deal_uk_junglewall2","Jungle Wall","","Save nearly 50%"],["bed_polyfon_one*2","Black Mode Single Bed","Black Mode Single Bed",""],["arabian_chair","Green Blossom Chair","Exotic, soft seating",""],["rubberchair*6","Violet Inflatable Chair","Soft and tearproof!",""],["sound_set_32","Instrumental 2","Piano concert set",""],["A1 C3P","Round Dining Table","Hip plastic furniture",""],["summer_grill*1","Blue Barbeque Grill","Plenty of ribs on that barbie",""],["wooden_screen*4","Golden Oriental Screen","Add an exotic touch to your room",""],["landscape 2","landscape","Glorious coastline and beach",""],["a1 sportcorner grass","Sport corner grass","Let's get sporty!",""],["diner_tray_0","Empty Plate","Had your fill, or running on empty?",""],["table_silo_med*5","Pink Area Coffee Table","Pink Area Coffee Table",""],["deal_floor_neon","Dance Floor Deal","Dance your socks off with this pack of 4","How cheap is this!"],["ads_mall_wintra","Travel Agency Mall Window","Fly me to the moon, or anywhere else on the Globetrekkers Guide.",""],["eco_mush1","Witch Mushroom","Poisonous in the wrong hands",""],["diner_rug","Diner Floor","Shiny polished finish",""],["wallpaper 20","wallpaper","Wallpaper",""],["a0 stick2","Hockey Stick","Hockey Stick",""],["sofa_polyfon*7","Green Two-seater Sofa","Comfort for stylish couples",""],["xmas08_hole","Ice Fish Hole","What can you catch?",""],["ads_mall_winbea","Mall Beauty Salon","Give yourself some red carpet glamour in the Salon",""],["deal_arab2","Alhambra Deal 2","",""],["noob_window","Window","Room with a view",""],["carpet_standard*2","Floor Rug","Available in a variety of colours",""]] +[["DEV bed_budget7","Green Pura Double Bed","King sized comfort!",""],["poster 1000","Comedy Poster","The Noble and Silver Show",""],["hween08_bath","Blood Bath","Should have chosen the shower!",""],["a0 deal110","Ice Habbo Roller","The power of movement","2: 3 Ice Habbo Rollers in a convenient Pack"],["deal_camera_offer1","Paparazzi Starter Pack","Just Click and Go!","This weekend only!"],["lc_coral_divider_low","Small Coral Divider","Perhaps you could swim over?",""],["tampax_wall","Tampax wall","Tampax wall",""],["ads_mall_tele","Mall tele-door","Step inside the store and look around","ads_mall_tele"],["hcsohva","Throne Sofa","For royal bottoms...",""],["diner_bardesk_corner*4","White Corner","Now that's smooth...",""],["xmas08_trph1","Arctic Penguin Trophy","Given to those who have adopted ALL 26 penguins!",""],["eco_sofa2","Eco Armchair 2","Relax! You've done your bit",""],["hween08_bath2","Ooze Bath","Relax. Take it oozey!",""],["wallpaper","Wallpaper","Add some color to your walls",""],["floor","Floor Pattern","A great floor pattern for your room",""],["divider_poly3*3","White Hatch","Border control!",""],["soft_sofachair_norja*2","iced sofachair","Soft iced sofachair",""],["landscape 7","landscape","Stunning view of Alhambra and the palace",""],["bump_lights","Traffic Lights","Ready. Steady. Go!",""],["bump_tires","Bumper Tyres","Gets you back on track",""],["country_wall","Farmhouse Wall","Tudor decor for your home",""],["DEV bed_budget_one9","Red Pura Bed","Prince sized comfort!",""],["bardeskcorner_polyfon*6","Blue Mode Bardesk Corner","Blue Mode Bardesk Corner",""],["diner_gumvendor*1","Aquamarine Gum Machine","Fruity bubbly goodness!",""],["deal08","Doormat","Welcome Habbos in style",""],["divider_nor3*2","Black Iced Gate","No way through, or is there?",""],["sound_set_30","Instrumental 1","Moments in love",""],["bardesk_polyfon*3","White Bardesk","Perfect for work or play",""],["DEV chair_basic7","Green Pura Egg Chair","It's a cracking design!",""],["sf_gate","Display Gate","Get out! (of this world)",""],["bardeskcorner_polyfon","Corner Cabinet/Desk","Tuck it away",""],["wallpaper 6","wallpaper","Wallpaper",""],["lt_statue","Stone Statue","The temple's guardian force",""],["sound_set_44","Graveyard Portal","Haunted Dimension",""],["rare_dragonlamp*7","Sky Dragon Lamp","Scary and scorching!",""],["bed_polyfon*2","Black Mode Double Bed","Black Mode Double Bed",""],["divider_poly3*2","Black Mode Bardesk Gate","Black Mode Bardesk Gate",""],["glass_sofa*6","Blue Glass Sofa","Translucent beauty",""],["window_70s_wide","Large 70s Window","A view of the past",""],["deal_lantern2","Lantern Bundle 2","20 lanterns for the price of 6!",""],["deal_earthday1","Mood Light","","Save 40 Credits!"],["deal_eas07_rare","BirdBath Bundle","Keep your feathered friends Chirpy this Easter!","Easter Weekend Only!"],["pillow*6","Blue Cotton Pillow","Puffy, soft and huge",""],["sound_machine_deal","Sound machine starter pack","Standard Traxmachine pack",""],["diner_chair*6","Blue Stool","Perch in comfort",""],["xmas08_dvdr2","Icy Divider Corner","What's a dividing wall without a corner?",""],["deal_eas07_1","Wannabe bunny","Can you tell what it is yet?",""],["ads_igor_wall","Monster Plan Poster","The latest model!",""],["eco_cactus1","Potted Cactus 1","Find a place in the sun",""],["deal_xmas9","Xmas Poster Selection","Festive cheer for your walls!","5 for the price of 4!"],["ads_mall_winfur","Mall Furni Showroom","Want to know different ways of decorating? Take a peek inside.",""],["ads_idol_wall","American Idol Poster","Set the stage with this poster. Feels like you're really there, right?",""],["poster 31","System of a Ban","Pure and unbridled nu-metal",""],["deal_tikistatue","Tribal Statue Bundle","",""],["tree7","Snowy Christmas Tree","Walking in a winter wonderland!",""],["hween08_bio","Biohazard Sign","Every sock bin needs one!",""],["grand_piano*4","Amber Piano Stool","I can feel air coming through...",""],["hwn_deal_6","Haunted Grave","We're raising the dead!","Huge saving!"],["chair_plasty","Plastic Pod Chair","Hip plastic furniture",""],["noob_stool*5","My first Habbo stool","Unfold me and take the weight off (pink)",""],["bed_polyfon*7","Green Double Bed","Give yourself space to stretch out",""],["xmasduck","Christmas Rubber Duck","A right Christmas quacker!",""],["diner_table_1*7","Green Booth Table","Ready to order?",""],["greektrophy*1","Greek trophy","Glittery gold",""],["yellow_pura_jan08_deal","Yellow Pura Bedroom Deal","Yellow Single and Double Pura Bed, Pura Lamp",""],["svnr_de","German Gnome","October 2008, 4/6",""],["country_fnc2","Stone Wall","Keep your livestock safe",""],["bed_polyfon*6","Blue Mode Double Bed","Blue Mode Double Bed",""],["xmas08_storms10_deal","Snow Storm Deal x10","Half price offer on Snow Storms!",""],["pura_mdl3*8","Yellow Pura Module 3","Any way you like it!",""],["country_soil","Crop Field","Grow your own!",""],["bolly_tile2","Standard Tile","The floor is your canvas",""],["A1 S1BVALKO","Plain Single Bed","All you need for a good night's kip",""],["avatar_effect14","Pink Hover Board","The future of transportation in pink.",""],["avatar_effect20","HelpMobile effect","I'll help you if I can.",""],["sofa_polyfon*9","Red Two-seater Sofa","Comfort for stylish couples",""],["hcc_sofa","Low Back Sofa","Get your friends over!",""],["easy_poster","Easy poster","Easy mac promotion",""],["hween08_curtain2","Hospital Curtain (ooze)","Nurses at work",""],["poster 79","Small silver star","Twinkle, twinkle",""],["deal_swapit3","Romantique Bundle","",""],["sound_set_4","Ambient 1","Chilled out beats",""],["deal_uk_stage2","Large Tribal Block","","Save 25%"],["noob_lamp*3","My first Habbo lamp","Get the light right where you want it (aubergine)",""],["DEV bed_budget8","Yellow Pura Double Bed","King sized comfort!",""],["ads_calip_fan","ads_calip_fan","ads_cali desc",""],["solarium_norja*6","Blue Solarium","Rejuvenate your pixels!",""],["poster 82","Basketball Hoop","2 points for every basket",""],["val_cauldron","Valentine's Cauldron","Cast a loving spell!",""],["sofa_silo*5","Pink Area Sofa","Pink Area Sofa",""],["pura_mdl2*8","Yellow Pura Module 2","Any way you like it!",""],["lc_tubes_corners","Water Tube Corner","Sends you round the bend",""],["SF_chair_blue","Space Crew Chair","Time to man your position",""],["deal_christmas1","New Year Deal 1","The perfect NYE party deal!",""],["poster 56","Disco Sign","Serious partying going on!",""],["summer_chair*8","Yellow Deck Chair","Got your sun cream?",""],["heartsofa","Heart Sofa","Perfect for snuggling up on",""],["country_patio","Wooden Patio Tile","Build the great outdoors",""],["det_bhole","Bullet Hole","That was close!",""],["doormat_plain*1","Doormat","Available in a variety of colours",""],["scifirocket*4","Venus Smoke Machine","Welcome... to planet love",""]] +[["deal_sport4","Luxury Team Hotel Deal","",""],["toilet","Loo Seat","Loo Seat",""],["landscape 3","landscape","Snow capped mountains above the clouds",""],["a5 gothicsofa","Green Gothic Sofa","The dark side of Habbo",""],["window_single_default","Single Window","A simple view",""],["couch_norja*9","Red Bench","Two can perch comfortably",""],["eco_table1","Eco Coffee Table 1","Recycled wood as standard",""],["exe_globe","Power Globe","The power is yours!",""],["det_divider","Police Divider","Crime scene, stay out!",""],["ticketbundle5","Small Ticket Bundle","A bundle of 5 gaming tickets",""],["carpet_standard*3","Floor Rug","Available in a variety of colours",""],["table_plasto_4leg","Occasional table Table","Hip plastic furniture",""],["table_plasto_4leg*1","Occasional Table table","Hip plastic furniture",""],["table_plasto_4leg*2","Occasional Table table","Hip plastic furniture",""],["table_plasto_4leg*3","Occasional Table table","Hip plastic furniture",""],["table_plasto_4leg*5","Occasional Table table","Hip plastic furniture",""],["table_plasto_4leg*6","Occasional Table table","Hip plastic furniture",""],["table_plasto_4leg*7","Occasional Table table","Hip plastic furniture",""],["table_plasto_4leg*8","Occasional Table table","Hip plastic furniture",""],["table_plasto_4leg*9","Occasional Table table","Hip plastic furniture",""],["table_plasto_4leg*10","Occasional Table table","Hip plastic furniture",""],["table_plasto_4leg*14","Occasional Table table","Hip plastic furniture",""],["table_plasto_4leg*15","Occasional Table table","Hip plastic furniture",""],["table_plasto_4leg*16","Occasional Table table","Hip plastic furniture",""],["trax_electro_jan08_deal","Electronic / Latin Deal","Latino Grooves","Save over 25%"],["A1 C7P","Round Dining Table","Hip plastic furniture",""],["prizetrophy*1","Classic trophy","Glittery gold",""],["rare_moonrug","Moon Patch","Desolation rocks!",""],["gothrailing","Gothic Railing","Keep out!",""],["xmas08_icetree","Icy Christmas Tree","It can't be Christmas without it!",""],["lt_stone1","Tribal Stone Corner","This path is blocked",""],["divider_arm3","Gate (lockable)","Knock, knock...",""],["a0 sleepingbag10","Khaki Sleeping Bag","Ultimate coziness",""],["diner_bardesk_corner*1","Aquamarine Corner","Now that's smooth...",""],["wooden_screen*2","Rosewood Screen","Add an exotic touch to your room",""],["avatar_effect10","Flies","Time to take a bath?",""],["diner_table_2*2","Pink Table","Enjoy your meal!",""],["deadduck2","Dead Duck 2","Someone forgot to feed me...",""],["eco_light1","Eco Light 1","Energy saving bulb fitted",""],["landscape 9","Eastern Skyline","Landscape 9",""],["diner_bardesk_gate*8","Yellow Gate","Working 9 to 5",""],["hween08_wndw","Broken Window (large)","Was it a bird or a parsnip?",""],["footylamp_campaign","footylamp_campaign","",""],["penguin_super","Superhero Penguin","Aptenodytes Kirby",""],["a0 pet1","Pet and Basket","Night, night",""],["noob_rug_tradeable_1","starter rug","beginner set",""],["scifirocket*6","Mercury Smoke Machine","Too hot to handle!",""],["eco_mush2","Fairy Mushroom","Sweet and nutty.",""],["sob_carpet","Street of Bobba","SOB flamer",""],["SF_floor_1","Starship Floor 1","Dec out the decks!",""],["spyro","Dragon Egg","The stuff of legend",""],["pillow*0","White Lace Pillow","Minimalist comfort!",""],["deal_christmas5","Tinsel (gold)","A touch of festive sparkle",""],["divider_poly3*7","Green Hatch","Border control",""],["kinkysofa","kinkysofa","",""],["poster 48","The Spanish flag","The flag of Spain",""],["sleepingbag*3","Ocean Sleeping Bag","Ultimate coziness",""],["pura_mdl3*4","White Pura Module 3","Any way you like it!",""],["table_polyfon_med","Large Coffee Table","For larger gatherings",""],["lc_wall2","Coral Wall","There's life in the deep blue",""],["poster 80","Large gold star","All that glitters...",""],["cat_blue_deal","Cat Starter Pack (blue)","",""],["deal_blocks_neon","Ready Made Stage Large","Get 10 blocks at 2.5 credits per block!",""],["lc_wall1","Rock Wall","Depths of the ocean",""],["jp_katana2","Katana Blue","Let's get chopping!",""],["prizetrophy7*2","Silver Habbo trophy","Silver Habbo trophy",""],["ads_calip_parasol","ads_calip_parasol name","ads_calip_parasol desc",""],["deal_sport1","Manager Deal","",""],["12_Month_Subscription_8","Endor Smoke Machine and 80 Credits","",""],["landscape 10","Landscape 10 - Lost city ocean","landscape 10 desc",""],["deal_icebc2","10,000 BC Bundle 2","",""],["dog_yellow_deal","Dog Starter Pack (yellow)","",""],["a2 tree1","Dead tree","Dead christmas tree",""],["deal_tatami_s","Small Tatami Mat","Shoes off please","4 for 3!"],["diner_bardesk_gate*9","Red Gate","Working 9 to 5",""],["diner_bardesk_gate*10","Mint Gate","Working 9 to 5",""],["sleepingbag*1","Rose Sleeping Bag","Bed of roses",""],["A1 C4P","Round Dining Table","Hip plastic furniture",""],["glass_sofa*4","Glass sofa","Translucent beauty",""],["divider_silo3","Gate (lockable)","Form following function",""],["party_wc_boy","Boys Toilets","Stand up or sitting down, this is for the Boys only!",""],["noob_rug*2","My first Habbo rug","Nice and neat sisal rug with blue edging",""],["lt lava","Lava Ditch","Mind the gap",""],["ads_nokia_logo","Nokia phone","Connecting People",""],["valeduck","Valentine's Duck","He's lovestruck",""],["hween08_sink2","Ooze Sink","Who picked a spot?",""],["bench_armas","Bench","To complete the dining set",""],["val_teddy*5","Yellow Share Bear","The yellow bear of understanding",""],["avatar_effect25","Flares","What a heat it gives off!",""],["country_rbw","Rainbow","Find your pot of gold",""],["12_Month_Subscription_4","Aqua Spaceship Door and 80 Credits","",""],["hc_dsk","Study Desk","For Habbo scholars",""],["ads_campguitar","Red V Guitar","Awarded to some Camp Rock entrants",""],["ads_calip_cola*3","Calippo Strawberry","Of the most refreshing!",""],["carpet_standard*4","Floor Rug","Available in a variety of colours",""],["bolly_table","Large Ornamental Table","Decorative granite finish",""],["12_Month_Subscription_3","Love Cauldron and 80 Credits","",""],["sound_set_11","Dance 4","Music you can really sink your teeth into",""],["deal_trax3","Trax Pack: Rock","You will, you will, rock out!",""],["pura_mdl2*2","Pink Pura Module 2","Any way you like it!",""],["window_romantic_narrow","Small Romantic Window","A beautiful view",""]] +[["trax_rock2_jan08_deal","Metal Deal","Heavy metal!","Save 25%"],["ads_ob_pillow","Ob pillow","The perfect way to relax",""],["ads_igorraygun","Igor Ray Gun","Shoot down your foes!",""],["A1 OSB","Doormat","Welcome Habbos in style",""],["noob_chair_tradeable_2","starter chair","beginner set",""],["sleepingbag*7","Orange Sleeping Bag","Ultimate coziness",""],["xmas_icewall","xmas_icewall name","xmas_icewall desc",""],["prizetrophy6*1","Champion trophy","Glittery gold",""],["rclr_chair","Palm Chair","Watch out for coconuts",""],["table_silo_small*5","Pink Area Occasional Table","Pink Area Occasional Table",""],["glass_shelf","Glass shelf","Translucent beauty",""],["deal_habbowood_100","The Mega Sale bundle!","Habbowood Glamour for less","Fantastic Furni at insane prices!"],["eco_table3","Eco Coffee Table 3","Recycled wood as standard",""],["md_can","Bubble Juice Can","Enough bubbling juice for one evening",""],["diner_sofa_2*3","Black Sofa 2","Soft leather in 50s design",""],["glass_sofa","Glass sofa","Translucent beauty",""],["sound_machine5","Brown Traxmachine","Heard the Habbo Bands new singles?",""],["avatar_effect3","Blue UFO","Help, I'm being abducted.",""],["A1 LTP","Shelf","Tidy up",""],["eco_lamp2","Eco Lamp 2","Energy saving bulb fitted",""],["shelves_norja*5","Pink Bookcase","For nic naks and art deco books",""],["dog_blue_deal","Dog Starter Pack (blue)","",""],["sound_set_5","Ambient 4","The dark side of Habbo",""],["table_norja_med","Coffee Table","Elegance embodied",""],["pura_mdl1*5","Beige Pura Module 1","Any way you like it!",""],["deal_uk_grass4","Field Grass","Herding and grazing",""],["guitar_skull","Skull Guitar","",""],["poster 3","Fish Plaque","Smells fishy, looks cool",""],["prizetrophy4*2","Fish trophy","Breathtaking bronze",""],["lc_corner","Wooden Corner","Tuck it away",""],["carpet_polar*4","Green Bear Rug","Snuggle up on a Funky bear rug...",""],["rare_fan*3","Summer Fan","Be cool!",""],["scifiport*2","Blue Laser Gate","Get in the ring!",""],["bardesk_polyfon","Bar/desk","Perfect for work or play",""],["A1 C5P","Round Dining Table","Hip plastic furniture?",""],["diner_bardesk*9","Red Bar","Pull up a stool!",""],["diner_bardesk*10","Mint Bar","Pull up a stool!",""],["sporttrack1*2","Sport track straight grass","Let's get sporty!","Four straight grass tracks"],["bardesk_polyfon*8","Yellow Mode Bardesk","Yellow Mode Bardesk",""],["xmas_light","Christmas Lights","Seen Rudolph's nose anywhere?",""],["lc_medusa2","Small Jellyfish Lamp","There's no sting in this tail",""],["queue_tile1*4","Gold Habbo Roller","The power of movement",""],["one_way_door*7","Green One Way Gate","One at a time!",""],["SF_panel1","Command Console","Ready. Aim. Reboot!",""],["poster 27","Holly Garland","Deck the halls!",""],["A1 B6P","Square Dining Table","Hip plastic furniture",""],["poster 522","Japan Flag","Land of the rising sun",""],["rare_fan*7","Brown Powered Fan","...it's really hit the fan!",""],["table_polyfon_small","Small Coffee Table","For serving a stylish latte",""],["arabian_tray1","Mint Tea Tray","Tea for every occasion",""],["diner_tray_6","Ice Cream Sundae","Vanilla, chocolate and strawberry!",""],["scifirocket*3","Endor Smoke Machine","Caution! Unknown Location!",""],["traffic_light*4","Yellow Traffic Light","Chill and wait your turn!",""],["sound_set_43","SFX 1","Beware zombies!",""],["grunge_radiator","Radiator","Started cool but now it's hot!",""],["diner_chair*3","Black Stool","Perch in comfort",""],["ads_oc_soda","ads_oc_soda","ads_oc_soda desc",""],["fx_flare","Firestarter","Light it up!",""],["A1 D9P","Square Dining Table","Hip plastic furniture",""],["small_table_armas","Occasional Table","Practical and beautiful",""],["chair_silo*5","Pink Silo Dining Chair","Pink Silo Dining Chair",""],["A1 D6P","Square Dining Table","Hip plastic furniture",""],["wall_china","Dragon Screen","For your great wall",""],["soft_sofa_norja*8","Yellow Iced Sofa","Yellow Iced Sofa",""],["window_70s_narrow","Small 70s Window","Takes you back",""],["yellow_bathroom_jan08_deal","Yellow Bathroom Deal","Duck, Sink, Bath, Yellow Floor Tiles, Yellow Loo Seat",""],["divider_nor4*2","Black Iced Auto Shutter","Habbos, roll out!",""],["area_sm_jan07_deal","Area Screen Multipack","5 screens",""],["sleepingbag*8","Golden Sleeping Bag","Ultimate coziness for SnowStorm winners",""],["sofa_polyfon*8","Yellow Mode Sofa","Yellow Mode Sofa",""],["deal_sport3","Hooligan Deal","",""],["summer_pool*1","Blue Summer Pool","Fancy a dip?",""],["A1 B3P","Square Dining Table","Hip plastic furniture",""],["christmas_sleigh","Winter Sleigh","Ready for your Xmas cheer",""],["queue_tile1*8","Navy Habbo Roller","The power of movement",""],["exe_chair2","Executive Boss Chair","You're fired!",""],["bed_polyfon_one","Single Bed","Cot of the artistic",""],["window_chinese_narrow","Small Oriental Window","Narrow wood carved frame",""],["DEV bed_budget_one8","Yellow Pura Bed","Prince sized comfort!",""],["deal_jpillow","Pillow Chair","Comfy and classical","4 for 3!"],["glass_chair*8","Yellow Glass Chair","A pane that you're used to",""],["tiki_wallplnt","Jungle Wallplant","Dense jungle ahead!",""],["bar_armas","Barrel Minibar","It's a barrel of laughs and a great talking point",""],["window_skyscraper","Skyscraper Window","Dizzy heights!","NEW Aug 08"],["bolly_drapeb","Green Curtain","Made with the finest materials",""],["diner_bardesk_gate*7","Green Gate","Working 9 to 5",""],["deal_fair2","HabboValley.com Roundabout","",""],["chair_norja","Chair","Sleek and chic for each cheek",""],["md_logo_wall","Bubble Juice Logo","Bubble up your wall",""],["traffic_light*6","Red Traffic Light","Chill and wait your turn!",""],["diner_tray_4","Pancakes","Smothered in syrup and butter!",""],["hcc_dvdr","Glass Divider","It won't cramp your style",""],["DEV chair_basic8","Yellow Pura Egg Chair","It's a cracking design!",""],["DEV chair_basic6","Blue Pura Egg Chair","It's a cracking design!",""],["sound_set_52","Club 7","State of Trancehouse",""],["couch_norja*5","Pink Bench","Two can perch comfortably",""],["SF_alien","Alien Lifeform","Name and origin currently unknown",""],["diner_bardesk_gate*1","Aquamarine Gate","Working 9 to 5",""],["table_silo_med*7","Green Area Coffee Table","Gather everyone round",""],["bar_chair_armas","Barrel Stool","The ultimate recycled furniture",""],["chair_plasty*1","Plastic Pod Chair","Hip plastic furniture",""]] +[["deal_xmaseve","Christmas Eve Bundle","Xmas Eve in a box!",""],["summer_pool*3","Green Summer Pool","Fancy a dip?",""],["romantique_clock","Grandfather's Clock","The most Romantic tick-tock ever!",""],["prizetrophy8*1","Bubble trophy","Glittery gold",""],["pink_pura_jan08_deal","Pink Pura Bedroom Deal","Pink Single and Double Pura Bed, Pura Lamp",""],["greektrophy*3","Greek trophy","Breathtaking bronze",""],["A1 A5P","Round Dining Table","Hip plastic furniture",""],["deal_rom_window_big","Large Romantic Window","Heavenly scent of flowers","2 FREE Windows!"],["table_plasto_square*3","Occasional Table","Hip plastic furniture",""],["couch_norja*8","Yellow Bench","Two can perch comfortably",""],["window_basic","Basic Window","Plain and simple",""],["jp_teamaker","Japanese Teamaker","Makes a steaming brew!",""],["deal_dogs_2","Doggy Bumper Deal","Special deal with over a 1/3 off the normal price!",""],["solarium_norja*5","Pink Solarium","Rejuvenate your pixels!",""],["pura_mdl3*2","Pink Pura Module 3","Any way you like it!",""],["industrialfan","Industrial Turbine","Powerful and resilient",""],["pura_mdl5*6","Blue Pura Module 5","Any way you like it!",""],["poster 72","Habbo Golden Record","For the best music-makers",""],["bed_polyfon_one*9","Red Single Bed","Cot of the artistic",""],["romantique_pianochair*3","Sapphire Chair","For stately seating experiences",""],["3_Month_Subscription_1","Blue Cotton Pillow and 80 Credits","",""],["Christmas maze shrubbery","Snowy Maze Shrubbery","Snow end in sight!",""],["poster_mistletoe","Mistletoe","Pucker up",""],["small_chair_armas","Stool","Rustic charm at it's best",""],["poster 30","Mistletoe","Pucker up",""],["lostc_teleport","Architeuthis","3/6 - March 2009",""],["CFC_500_goldbar","Gold Bar (China)","Worth 500 Credits",""],["a0 pet2","Pet and Basket","Night, night",""],["poster 71","Bonnie Blonde","The one and only. Adore her!","Straight from the Habbowood set!"],["romantique_pianochair*4","Amber Chair","What does this button do?",""],["diner_table_2*4","White Table","Enjoy your meal!",""],["sound_set_63","AlhambraTrax 2","Desert hits by the oasis!",""],["DEV chair_basic2","Pink Pura Egg Chair","It's a cracking design!",""],["ham","Joint of Ham","Tuck in",""],["deal_uk_soil4","Crop Field","Grow your own!",""],["trax_club1_jan08_deal","Trance Deal","Trance anthems!","Save over 25%"],["sofachair_silo*3","White Armchair","Large, but worth it",""],["trax_party","Trax Pack: Red Party","You here to partyyy?","Limited Edition!"],["soft_sofa_norja*5","Pink Iced Sofa","Pink Iced Sofa",""],["avatar_effect9","Love","Exciting and new!",""],["pura_mdl1*8","Yellow Pura Module 1","Any way you like it!",""],["ads_ob_wall","Ob wall","TBD ads_ob_wall",""],["sf_floor","Transparent Floor","I can see Uranus through here!",""],["bolly_fountain","Extravagant Fountain","Now that's refreshing!",""],["toy1*2","Rubber Ball","it's bouncy-tastic",""],["toy1","Rubber Ball","it's bouncy-tastic",""],["12_Month_Subscription_5","Khaki Sleeping Bag and 80 Credits","",""],["poster 17","Butterfly Cabinet 1","Beautiful reproduction butterfly",""],["noob_rug_tradeable_5","starter rug","beginner set",""],["poster 46","The flag of Finland","To 'Finnish' your decor...",""],["deal_uk_scififloor10b","Starship Floor 1","Dec out the decks!",""],["rare_dragonlamp*0","Fire Dragon Lamp","George and the...",""],["poster 49","The Jamaican flag","The flag of Jamaica",""],["diner_tray_1","Burger and Chips","99% British beef!",""],["shelves_polyfon","Bookcase","For the arty pad",""],["romantique_divan*3","Sapphire Chaise-Longue","Relax and recline!",""],["poster 24","Three Wise Men Poster","Following the star",""],["plant_valentinerose*5","Purple Valentine's Rose","Requires purple rain to flourish","New item 2009!"],["scifidoor*6","Black Monolith","Monolith goes up! Monolith goes down!",""],["env_bushes_gate","Eco Hedgerows Gate","Get ready for Mother Nature's world and wait your turn",""],["trax_disco_jan08_deal","Disco Deal","Night fever!",""],["deal_uk_lavac","Lava Corner","","Saver bundle!"],["white_mode_jan08_deal","White Mode Bedroom Deal","White Single and Double Mode Bed, Mode Bookcase",""],["tile_marble","Marble Tile","Slick sophistication, don't slip!",""],["rare_fountain*2","Bird Bath (green)"," For our feathered friends",""],["A1 PPS","Occasional Table","For those random moments",""],["diner_bardesk_corner*9","Red Corner","Now that's smooth...",""],["diner_bardesk_corner*10","Mint Corner","Now that's smooth...",""],["safe_silo*7","Green Safe Minibar","Totally shatter-proof!",""],["pillow*2","Red Silk Pillow","Puffy, soft and huge",""],["diner_cashreg*2","Pink Register","Roll up roll up!",""],["diner_sofa_2*2","Pink Sofa 2","Soft leather in 50s design",""],["svnr_aus","Aussie Outback","November 2008, 5/6",""],["ads_idol_mirror","Makeup Mirror","Pass the lipstick please!",""],["hockey_light","Lert","Set it off.",""],["deal_uk_grass10","Mega Grass Deal","10 (yes 10!) patches for 45 Credits - over 50% off!",""],["a6 gothicsofa","Gothic Sofa Blue","The dark side of Habbo",""],["hcc_stool","Antique Stool","For larger gatherings",""],["arabian_rug","Berber Kilim Rug","Green blossom design",""],["lodge_sp_jan07_deal","Lodge Starter Pack","Gate, Corner Plinth and 2 Room Dividers",""],["hwn_deal_7","Haunted Grave","We're raising the dead!","The 3rd one is FREE!"],["sound_set_10","Hip Hop Beats 1","Made from real Boy Bands!",""],["sleepingbag*2","Lime Sleeping Bag","Ultimate coziness",""],["poster 52","The Irish flag","The flag of Ireland",""],["divider_nor3*7","Rural Iced gate","Entrance or exit?",""],["lc_medusa1","Large Jellyfish Lamp","There's no sting in this tail",""],["plant_fruittree","Fruit Tree","Great yield and sweet fruit",""],["greek_pillars","Greek Pillars","Architectural splendor!",""],["safe_silo*3","White Safe Minibar","Totally shatter-proof!",""],["deal_uk_scififloor10","Transparent Floor","I can see Uranus through here!",""],["croc_red_deal","Croc Starter Pack (red)","",""],["plant_mazegate","Maze Shrubbery Gate","Did we make it?",""],["soft_sofa_norja*6","Blue Iced Sofa","Blue Iced Sofa",""],["12_Month_Subscription_2","Rose Powered Fan and 80 Credits","",""],["a0 deal106","Blue Habbo Roller","The power of movement","2: 3 Blue Habbo Rollers in a convenient Pack"],["divider_nor5*6","Blue Iced Angle","Cool cornering for your crib y0!",""],["marquee*6","Blue Marquee","It's both door and a shade!",""],["safe_silo*2","Black Safe Minibar","Totally shatter-proof!",""],["lc_tile2","Cobbled Stones","Rocky room foundations",""],["sound_set_35","Dance 6","Groovelicious",""],["poster 36","Habbo Babes 2","The Hotels girlband. Dream on!",""]] +[["drinks","Empty Cans","Are you a slob too?",""],["deal_christmas4","Mistletoe","Pucker up",""],["sound_set_1","Habbo Sounds 1","Get the party started!",""],["tray_glasstower","Champagne Tower","To the Bride and Groom",""],["penguin_bunny","Bunny Penguin","Aptenodytes Euripides",""],["a0 deal114","Navy Habbo Roller","The power of movement","2: 3 Navy Habbo Rollers in a convenient Pack"],["rare_dragonlamp*1","Sea Dragon Lamp","Out of the deep blue!",""],["poster 6","Abstract Poster","But is it the right way up?",""],["doorD","Imperial Teleport","Let's go over tzar!",""],["hc_chr","Majestic Chair","Royal comfort",""],["HW XMAS_HC_RIBBON","HW XMAS_HC_RIBBON","HW XMAS_HC_RIBBON",""],["sw_swords","Swords","The other kind of fencing...",""],["deal_uk_floor9a","Ornamental Tile","The floor is your canvas",""],["deal_trax2","Trax Pack: Pop","Lets all bop til' we drop!",""],["env_bushes","Eco Hedgerow","Block out your nosey neighbours",""],["A1 C8P","Square Dining Table","Hip plastic furniture",""],["party_wc_girl","Girls Toilets","Girls only please.",""],["party_lights","Party Lights","Dance dance dance!",""],["diner_table_2*6","Blue Table","Enjoy your meal!",""],["hc_trll","Drinks Trolley","For swanky dinners only",""],["a0 deal209","Sport track straight asphalt","Let's get sporty!","Four straight asphalt tracks"],["summer_grill*4","Yellow Barbeque Grill","Plenty of burgers on that barbie",""],["deal_pop","Abstract Poster","But is it the right way up?",""],["ads_idol_trax","American Idol Trax Machine","Everything sounds sweeter with this custom American Idol Trax Machine!",""],["plant_rose","Cut Roses","Sleek and chic",""],["rare_hammock","Hammock","Eco bed",""],["china_pstr2","Dragon Poster","Majestic flying beast",""],["chair_plasty*2","Plastic Pod Chair","Hip plastic furniture",""],["sound_set_64","AlhambraTrax 3","Make a little Jinn-gle!",""],["divider_nor5*8","Yellow Iced Angle","Cool cornering for your crib y0!",""],["chair_plasto*1","Chair","Hip plastic furniture",""],["deal_dogs_1","Dog Accessories Deal","Get a basic starter kit worth 8 credits for 5!",""],["glass_stool*5","Candy Glass Stool","Clear a seat",""],["divider_nor4*3","White Iced Auto Shutter","Habbos, roll out!",""],["carpet_standard*5","Floor rug","Available in a variety of colours",""],["deal_uk_patch1","Moss Patch","","Save 60%!"],["g0 group_product","group product","A group product",""],["noob_lamp*4","My first Habbo lamp","Get the light right where you want it (light blue)",""],["deal_tile4","Star Tile","Take a walk of fame",""],["cat_yellow_deal","Cat Starter Pack (yellow)","",""],["deal_movie2","Comedy Bundle","Your very own dodgeball court",""],["rare_icecream*6","Toffee Ice Cream Machine","Virtual toffee rocks!",""],["lt lava corner","Lava Corner","Curb that hot flush",""],["divider_nor2","Ice Bar-Desk","Strong, yet soft looking",""],["rubberchair*3","Orange Inflatable Chair","Soft and tearproof!",""],["summer_pool*2","Red Summer Pool","Fancy a dip?",""],["tiki_tray1","Tiki Fruit Tray","Refreshing!",""],["avatar_effect4","Twinkle","Twinkle like the star you are.",""],["wallpaper 26","wallpaper","Wallpaper",""],["romantique_smalltabl*3","Sapphire Tray Table","Every tray needs a table...",""],["rare_beehive_bulb","Blue Amber Lamp","A honey-hued glow",""],["rare_beehive_bulb*0","Grey Amber Lamp","A honey-hued glow",""],["deal_snowhedge1","Snowy Maze Bundle 1","10 x Snowy Maze Shrubbery","Super saver bundle!"],["lc_coral_divider_hi","Large Coral Divider","Keep those pesky sharks out",""],["pillar*6","Terracotta Pillar","Ancient and stately",""],["wallpaper 3","wallpaper","Wallpaper",""],["hal_cauldron","Habboween Cauldron","Eye of Habbo and toe of Mod!",""],["a0 deal102","Red Habbo Roller","The power of movement","2: 5 Red Habbo Rollers in a convenient Pack"],["Test Deal","Test Deal","Seeing how many items I can get in it...",""],["CF_20_moneybag","Sack of Credits","Worth 20 Credits",""],["noob_chair_tradeable_3","starter chair","beginner set",""],["diner_table_1*1","Aquamarine Booth Table","Ready to order?",""],["divider_silo1*8","Yellow Corner Shelf","Neat and natty",""],["sound_set_8","Ambient 2","Mellow electric grooves",""],["deal_Igor","Igor Package","Igor furnitures",""],["rare_xmas_screen","Lappland Greetings","Ho Ho Ho!",""],["trax_ambient_jan08_deal","Ambient Deal","Ultimate in ambiance","Save 25%"],["wallpaper 4","wallpaper","Wallpaper",""],["sofa_polyfon_girl","Two-seater Sofa","Romantic pink for two",""],["hc_machine","Weird Science Machine","By and for mad inventors",""],["avatar_effect16","Microphone","One mic - one MC!",""],["romantique_tray2","Romantique Treats Tray","Time to celebrate!",""],["deal_tp1","Ghost Train Bundle","",""],["sound_machine1","Traxmachine","Let the party begin!",""],["ads_idol_newsDsk","New Reporter Desk","Report all the gossip in Habbo at this desk!",""],["habboween_crypt","Creepy Crypt","What lurks inside?",""],["sleepingbag*9","eXceptional Sleeping Bag","For eXceptional comfort!",""],["house2","Gingerbread House","Good enough to eat",""],["bolly_petals","Petal Flurry","Lay down a bed of roses",""],["diner_table_1*4","White Booth Table","Ready to order?",""],["ads_mall_winchi","Mall Idea Agency Window","Come inside and become a part of Idea",""],["scifirocket*2","Earth Smoke Machine","A little closer to home!",""],["chair_plasto*2","Chair","Hip plastic furniture",""],["bed_budgetb","Plain Double Bed","Sweet dreams for two",""],["pura_mdl4*6","Blue Pura Module 4","Any way you like it!",""],["waterbowl*3","Yellow Water Bowl","Aqua unlimited",""],["mode_bm_jan07_deal","Mode Bardesk Multipack","5 bardesks",""],["deal_uk_wallie2","Beach BBQ Set","",""],["bed_polyfon*9","Red Double Bed","Give yourself space to stretch out",""],["plant_mazegate_snow","Snowy Maze Gate","There's snow way through!",""],["poster 33","Save the Panda","We can't bear to lose them",""],["deal_uk_wall10","Starship Wall","Keeping space out since 1969",""],["joulutahti","Poinsetta","Christmas in a pot",""],["chair_silo*3","White Dining Chair","Keep it simple",""],["testi","","",""],["arabian_tray2","Candle Tray","For those Arabian nights",""],["legotrophy","Basketball Trophy","For the winning team",""],["poster 502","The Stars and Stripes","The US flag",""],["deal_spotlights_neon","Spotlight Deal","5 spotlights for just 13 Credits!",""],["a6 gothicstool","Gothic Stool","The dark side of Habbo",""],["deal_uk_soil9","Crop Field","Grow your own!",""]] +[["arabian_tetbl","Hexagonal Tea Table","Serve up a treat",""],["country_stage","Wooden Stage","Time for a barn dance",""],["queue_tile1*2","Red Habbo Roller","The power of movement",""],["xmas08_telep","Icy Teleport","Travel space and time in this freeze block!",""],["shelves_norja*2","Black Iced Bookcase","For nic naks and art deco books",""],["hween08_bbag","Body Bag","Not a nice place to catch some Zzz's",""],["deal_lava_neon","Lava Lamp Deal","15 Credits get you 5 Lamps!",""],["poster 1003","UK Map","get the lovely isles on your walls",""],["wooden_screen*3","Aqua Oriental Screen","Add an exotic touch to your room",""],["prizetrophy2*2","Duck trophy","Shiny silver",""],["poster 51","The Dutch flag","The flag of The Netherlands",""],["a0 deal116","Purple Habbo Roller","The power of movement","2: 3 Purple Habbo Rollers in a convenient Pack"],["greek_block","Greek Block","A nice stone block",""],["SF_panel3","Navigation Panel","Don't get lost in space",""],["rclr_lamp","Moon Lamp","Light your space",""],["pura_mdl2*9","Red Pura Module 2","Any way you like it!",""],["country_rain","Rain Shower","Made in Britain",""],["scifidoor*9","Blue Spaceship Door","It's blue, da ba dee...",""],["diner_sofa_2*5","Beige Sofa 2","Soft leather in 50s design",""],["jp_drawer","Japanese Drawer","Spiritual home for odds and ends",""],["poster 53","The Australian flag","Aussies rule!",""],["country_scarecrow","Scarecrow","Looks strangely familiar",""],["avatar_effect1","Spotlight","Shine the light on me!",""],["diner_bardesk*8","Yellow Bar","Pull up a stool!",""],["noob_lamp_tradeable_4","starter lamp","beginner set",""],["lc_anemone","Anemone","In glorious water colour!",""],["deal_sport6","Supporter Deal","",""],["avatar_effect15","Yellow Hover Board","As yellow as a submarine.",""],["chair_norja*3","White Iced Chair","Sleek and chic for each cheek",""],["eco_chair2","Eco Stool 2","Brown floral design",""],["jp_rare","Shishi Odishi","Traditional Japanese water ornament",""],["penguin_cowboy","Cowboy Penguin","Aptenodytes Hickok",""],["xmas08_icewall25_deal","Ice Wall Deal x25","Get 25 walls at half price - that is just 50 Credits!",""],["hc_lmpst","Victorian Street Light","Somber and atmospheric",""],["barchair_silo*3","White Bar Stool","Practical and convenient",""],["carpet_soft*6","Soft Wool Rug","Soft Wool Rug",""],["ads_mall_winpet","Mall Pet Shop Window","Which exotic animals can you see inside?",""],["ads_idol_floor1","American Idol Floor Tile 1","Create a custom floor in your American Idol room",""],["sw_chest","Ye Olde Chest","One size fits all",""],["a6 gothicchair","Gothic Chair Blue","The dark side of Habbo",""],["penguin_boxer","Boxer Penguin","Aptenodytes Ali",""],["deal_bubbles_neon","Bubble Lamp Deal","5 bubble lamps for 15 credits",""],["table_plasto_square*4","Occasional Table","Hip plastic furniture",""],["table_plasto_square*5","Occasional Table","Hip plastic furniture",""],["deal_urban","Urban Hangout","Chilled Streetz style",""],["poster 521","Flag of Brazil","Ordem e progresso",""],["poster 1004","Eid Mubarak Poster","Celebrate with us",""],["sf_pod","Cryogenic Bed","For those who like to sleep a long time.",""],["sofachair_silo*5","Pink Area Armchair","Large, but worth it",""],["bolly_lamp","Chandelier","Turn the lights down low",""],["hc_tbl","Nordic Table","Perfect for banquets",""],["table_silo_med*9","Red Area Coffee Table","Red Area Coffee Table",""],["wallpaper 14","wallpaper","Wallpaper",""],["rare_fountain*1","Bird Bath (grey)","For our feathered friends",""],["hween08_rad","Nuclear Radiation Sign","Warning! Smelly cheese ahead!",""],["sound_set_19","Hip Hop Beats 4","Shake your body!",""],["pura_mdl5*3","Black Pura Module 5","Any way you like it!",""],["table_silo_small*9","Red Area Occasional Table","Red Area Occasional Table",""],["table_norja_med*2","Black Iced Table","For larger gatherings",""],["heart","Giant Heart","Full of love",""],["ads_idol_floor2","American Idol Floor Tile 2","Make your American Idol room more unique with these tiles",""],["avatar_effect11","X-Ray","X-rayed",""],["lamp_basic","Pura Lamp","Switch on the atmosphere with this sophisticated light",""],["A2 pumpkin","Pumpkin Lamp","Cast a spooky glow",""],["diner_chair*9","Red Stool","Perch in comfort",""],["diner_chair*10","Mint Stool","Perch in comfort",""],["sound_set_40","Rock 4","Dude? Cheese!",""],["ads_goldtabl","The Golden Tablet","What every Museum resident craves",""],["xmas08_icewall5_deal","Ice Wall Deal x5","Get 5 Ice Walls for the price of 3!",""],["xmas08_icewall","Icy Wall","The stuff Ice Palace's are made of!",""],["doorB","Wardrobe","Narnia this way!",""],["toy1*5","Rubber Ball","it's bouncy-tastic",""],["deal_tile2","Marble Tile","Slick sophistication, don't slip!",""],["cn_lamp","Lantern","Light of the East",""],["divider_arm2","Room divider","I wooden go there",""],["grunge_candle","Candle Box","Late night debate",""],["scifidoor*8","Habbowood Security","To keep the rif raf out!",""],["poster 516","The English Flag","Eng-er-land",""],["prizetrophy9*1","Champion trophy","Glittery gold",""],["pura_mdl5*5","Beige Pura Module 5","Any way you like it!",""],["romantique_pianochair*1","Rose Quartz Chair","Elegant seating for elegant Habbos",""],["chair_plasto*3","Chair","Hip plastic furniture",""],["romantique_chair*1","Rose Quartz Chair","Elegant seating for elegant Habbos",""],["romantique_chair*2","Lime Quartz Chair","Elegant seating for elegant Habbos",""],["romantique_chair*3","Turquoise Romantique Chair","Elegant seating for elegant Habbos",""],["romantique_chair*4","Amber Chair","Elegant seating for elegant Habbos",""],["romantique_chair*5","Onyx Chair","What does this button do?",""],["party_beamer","Dance Floor Beamer","Get some lights to match your dancing shapes!",""],["md_rug","Bubble Juice Floor","Bubbles under your steps",""],["carpet_standard*6","Floor Rug","Available in a variety of colours",""],["deal_uk_gate4","Display Gate","Get out! (of this world)",""],["diner_chair*2","Pink Stool","Perch in comfort",""],["chair_silo*9","Red Area Dining Chair","Wooden dining chair",""],["table_norja_med*9","Large Coffee Table Red","For larger gatherings",""],["poster 35","Habbo Babes","Pop stars from heaven",""],["hc_djset","The Grammophon","Very old skool scratch'n'spin",""],["a0 deal211","Sport corner asphalt","Let's get sporty!","Four corner asphalt tracks"],["country_fp","Marble Fireplace","Keep the home fires burning",""],["lc_crab2","Sally Lightfoot","Careful! She'll give it 'all that'",""],["wallpaper 5","wallpaper","Wallpaper",""],["eco_fruits2","Fruit Bowl 2","From tree to hand in 3 pixels!",""]] +[["waterbowl*1","Red Water Bowl","Aqua unlimited",""],["deal98","Sardines","Fresh catch of the day",""],["poster 7","Hammer Cabinet","For emergencies only",""],["svnr_nl","Dutch Clog","August 2008, 2/6",""],["edice","Holo-dice","What's your lucky number?",""],["deal_rock","Rock da Room","For Metalheads, Moshers and more!",""],["black_pura_jan08_deal","Black Pura Bedroom Deal","Black Single and Double Pura Bed, Pura Lamp",""],["window_chinese_wide","Large Oriental Window","Dreaming of a Chinese summer...",""],["barrier*2","White Road Barrier","No trespassing, please!",""],["bolly_vase","Vase of Flowers","Let off a heavenly scent",""],["shelves_norja*6","Blue Bookcase","For nic naks and art deco books",""],["toy1*3","Rubber Ball","it's bouncy-tastic",""],["chair_plasto*4","Chair","Hip plastic furniture",""],["tiki_statue","Tribal Statue","Burn baby burn.. tiki inferno",""],["a1 sporttrackstraight","Sport track straight","Let's get sporty!",""],["deal_holly3","Holly Bundle 3","Deck the halls!","Super Saver Bundle!"],["12_Month_Subscription_10","Navy Marquee and 80 Credits","",""],["noob_lamp_tradeable_5","starter lamp","beginner set",""],["a0 deal100","Black Habbo Roller","The power of movement","2: 3 Black Habbo Rollers in a convenient Pack"],["poster 508","The Spanish flag","The flag of Spain",""],["ads_dave_wall","Dave Wall","ads dave wall",""],["bench_puffet","bench_puffet","bench_puffet",""],["rare_beehive_bulb*1","Red Amber Lamp","A honey-hued glow",""],["deal_arab1","Alhambra Deal 1","",""],["glass_table*6","Blue Glass Table","Translucent beauty",""],["pura_mdl4*9","Red Pura Module 4","Any way you like it!",""],["glass_stool","Glass stool","Translucent beauty",""],["table_norja_med*8","Large Coffee Table Yellow","For larger gatherings",""],["lc_window2","Aquarium Window","Creates a stunning scene",""],["pillow*5","Black Leather Pillow","Puffy, soft and huge",""],["prizetrophy_hot","prizetrophy_hot","prizetrophy_hot",""],["bottle","Empty Spinning Bottle","For interesting games!","!"],["deal_movie4","Adventure Bundle","Sail the seas of the Caribbean",""],["china_pstr1","Ox Poster","Celebrate the year ahead",""],["diner_tray_3","Spaghetti Meatballs","Juicy tomato sauce included!",""],["romantique_divan*4","Amber Chaise-Longue","Is that a cape hanging there?",""],["rare_icecream*0","Cherry Ice Cream Machine","Virtual cherry rocks!",""],["jp_tray1","Sushi Maguro","Sushi made with tuna",""],["romantique_smalltabl*5","Onyx Tray Table","Why is one leg different?",""],["sound_set_3","Electronic 1","Chilled grooves",""],["sink","Sink","Hot and cold thrown in for no charge",""],["diner_bardesk_gate*5","Beige Gate","Working 9 to 5",""],["rare_fan*6","Orange Arabian Fan","Blowing up a sandstorm!",""],["DEV bed_budget_one4","White Pura Bed","Prince sized comfort!",""],["a2 kamera","Camera","Smile!",""],["lostc_octopus","Kraken","2/6 - February 2009",""],["romantique_smalltabl*4","Amber Tray Table","Why is one leg different?",""],["penguin_pirate","Pirate Penguin","Aptenodytes Silver",""],["poster 12","Skyline Poster","Darling harbour by night",""],["hrella_poster_3","Anchor","Don't drift away!",""],["wallpaper 21","wallpaper","Wallpaper",""],["diner_tray_2","Steak and Mash","Juicy sirloin with onion gravy",""],["country_fnc3","Stone Pile","The work of a witch?",""],["poster 514","The EU flag","Be proud to be in the Union!",""],["table_silo_small*4","Beige Area Occasional Table","Beige Area Occasional Table",""],["chair_plasto*5","Chair","Hip plastic furniture",""],["glass_table*9","Habbowood Glass Table","Empty glasses welcome!",""],["noob_rug_tradeable_4","starter rug","beginner set",""],["diner_gumvendor*3","Black Gum Machine","Fruity bubbly goodness!",""],["deal_uk_lccrab2","Sally Lightfoot","Careful! She'll give it 'all that'","Great value bundle"],["area_bedroom_jan08_deal","Area Bedroom Deal","Area Single and Double Bed, Area Bookcase",""],["chair_plasto*6","Chair","Hip plastic furniture",""],["sound_set_69","Referee Rhythm","Football Sounds 2",""],["party_neon2","Neon Left Arrows","Find your way left in the dark!",""],["teleport_door","Teleport Door","Magic doorway to anywhere!","New!"],["sofachair_polyfon*2","Black Mode Armchair","Black Mode Armchair",""],["noob_set_4","Beginner Set 4","Beginner Furni Set 4",""],["Deal_tst","Chinese Lacquer Sofa","Oriental seating for three",""],["xmas08_icepatch_deal","Ice Patch Deal","Get 6 Ice Patches (that can turn to snow) for just 35 Credits!",""],["hyacinth1","Pink Hyacinth","Beautiful bulb",""],["sound_set_14","Hip Hop Beats 2","Rock them bodies",""],["tampax_rug","Tampax rug","Tampax rug",""],["12_Month_Subscription_1","Blue Cotton Pillow and 80 Credits","",""],["sf_wall","sf_wall","sf_wall",""],["sound_set_59","RnB Grooves 5","Urban break beats",""],["chair_norja*9","Red Chair","Sleek and chic for each cheek",""],["ads_grefusa_cactus","Grefusa Cactus","Grefusa cactus promotion",""],["edicehc","Dicemaster","Click and roll!",""],["romantique_divan*2","Emerald Chaise-Longue","Recline in continental comfort",""],["rcandle","Red Candle","Xmas tea light",""],["deal_rocker","Rock da Room","For metalheads, moshers and more!",""],["ads_711shelf","ads 711shelf","ads_711shelf desc",""],["bardesk_polyfon*5","Candy Bar","For cute constructions",""],["plant_small_cactus","Small Cactus","Even less watering than the real world",""],["divider_nor4*5","Pink Iced Auto Shutter","Habbos, roll out!",""],["poster 39","Screaming Furnies","The rock masters of virtual music",""],["penguin_wrestler","Luchador Penguin","Aptenodytes Mysterioso",""],["hwn_deal_2","Pumpkin Lamp","Cast a spooky glow","The 3rd one is FREE!"],["poster 81","Large silver star","Twinkle, twinkle",""],["croc_blue_deal","Croc Starter Pack (blue)","",""],["greek_seat_bundle","Greek Seat","Park your bot on this stone slab!","10 for the price of 6! Bargain!"],["barrier*1","Yellow Maze Barrier","No escape this way!",""],["penguin_skater","Skater Penguin","Aptenodytes Arto",""],["shelves_norja*4","Urban Iced Bookcase","For nic naks and tech books",""],["sofa_silo*4","Beige Area Sofa","Cushioned, understated comfort",""],["couch_norja*2","Black Iced Bench","Two can perch comfortably",""],["","Roast Turkey","Where's the cranberry sauce?",""],["poster 65","The Habbo Babes 2","The Hotels girlband. Dream on!",""],["a5 gothicchair","Green Gothic Chair","The dark side of Habbo",""],["shelves_norja*3","White Iced Bookcase","For nic naks and art deco books",""],["sofa_polyfon","Two-seater Sofa","Comfort for stylish couples",""]] +[["glass_stool*3","White Glass Stool","Translucent beauty",""],["avatar_effect19","BluesMobile effect","We'got a show tonite.",""],["prizetrophy7*3","Bronze Habbo trophy","Bronze Habbo trophy",""],["diner_shaker","Diner Shaker","So cool it's shaking!",""],["easy_bowl2","Easy bowl2","old campaign product desc",""],["xmas08_snowpl","Snow Seat","Take a rest and warm by a fire perhaps?",""],["wallpaper 16","wallpaper","Wallpaper",""],["jp_tatami2","Large Tatami Mat","Shoes off please",""],["poster 40","Bonnie Blonde poster","Princess of Pop",""],["divider_nor3*3","White Iced Gate","Do go through...",""],["tiki_tray3","Tiki Fish Tray","Freshly caught and BBQ'd!",""],["cat_red_deal","Cat Starter Pack (red)","",""],["sf_roller","Sci Fi Roller","They work against gravity",""],["pillar*1","Pink Marble Pillar","Ancient and stately",""],["flag_norway","Norwegian Flag","Land of the fjord",""],["flag_algeria","The Algerian Flag","Wave it proudly!",""],["flag_argentina","The Argentinian Flag","Wave it proudly!",""],["flag_belgium","The Belgian Flag","Wave it proudly!",""],["flag_columbia","The Colombian Flag","Wave it proudly!",""],["flag_dominicanrepublic","The Dominican Republic Flag","Wave it proudly!",""],["flag_ecuador","The Ecuadorian Flag","Wave it proudly!",""],["flag_greece","The Greek Flag","Wave it proudly!",""],["flag_malaysia","The Malaysian Flag","Wave it proudly!",""],["flag_mexico","The Mexican Flag","Wave it proudly!",""],["flag_morocco","The Moroccan Flag","Wave it proudly!",""],["flag_newzealand","The New Zealand Flag","Wave it proudly!",""],["flag_panama","The Panama Flag","Wave it proudly!",""],["flag_peru","The Peruvian Flag","Wave it proudly!",""],["flag_philippines","The Philippines Flag","Wave it proudly!",""],["flag_portugal","The Portugal Flag","Wave it proudly!",""],["flag_singapore","The Singapore Flag","Wave it proudly!",""],["flag_tunisia","The Tunisian Flag","Wave it proudly!",""],["flag_turkey","The Turkish Flag","Wave it proudly!",""],["flag_venezl","The Venezuelan Flag","Wave it proudly!",""],["pura_mdl4*2","Pink Pura Module 4","Any way you like it!",""],["netari_poster","Netari poster","Netari promotion",""],["ads_idol_tv","American Idol TV","TBD Click it away",""],["a0 throne","Throne","Important Habbos only",""],["habbowheel","The Wheel of Destiny!","So you gotta ask yourself, 'Do I feel lucky?'",""],["glass_sofa*3","White Glass Sofa","Translucent beauty",""],["deal_uk_sfroller5","Sci Fi Roller","They work against gravity",""],["romantique_smalltabl*2","Emerald Tray Table","Every tray needs a table...",""],["scifirocket*1","Saturn Smoke Machine","There is always space for this!",""],["rare_icecream*7","Chocolate Ice Cream Machine","Virtual chocolate rocks!",""],["chair_norja*5","Pink Chair","Sleek and chic for each cheek",""],["spotlight","Habbowood Spotlight","For the star of the show",""],["sound_machine_freebie_deal","Monsters of Habbo freebie","Free gift for Monsters of Habbo",""],["deal_trax1","Trax Pack: Dance","Get the dancefloor pumping",""],["glass_table*3","White Glass Table","Translucent beauty",""],["diner_cashreg*9","Red Register","Roll up roll up!",""],["diner_cashreg*10","Mint Register","Roll up roll up!",""],["diner_bardesk*2","Pink Bar","Pull up a stool!",""],["pillar*5","Pagan Pillar","Find your natural roots",""],["a0 deal115","Purple Habbo Roller","The power of movement","2: 5 Purple Habbo Rollers in a convenient Pack"],["prizetrophy5*1","Duo trophy","Glittery gold",""],["jp_tray3","Sushi Ikura","Sushi made with caviar",""],["sound_set_71","Ice cool sounds","Get your Winter Wonderland sounds for your Trax Machine!",""],["romantique_divider*3","Turquoise Screen","Stylish Separation",""],["chair_plasto*7","Chair","Hip plastic furniture",""],["totem_head","Totem Spirit Head","Which animal are you? 2/3 of Totem",""],["eco_sofa1","Eco Armchair 1","Relax! You've done your bit",""],["lodge_mm_jan07_deal","Lodge Mixed Multipack","3 room dividers, 2 corner plinths",""],["poster 68","dmac poster","The soul-meister himself",""],["ads_reebok_block2","ads Reebok block2","",""],["DEV grand_piano2","Emerald Grand Piano","Beethoven's Preferred Piano",""],["green_mode_jan08_deal","Green Mode Bedroom Deal","Green Single and Double Mode Bed, Mode Bookcase",""],["sound_set_60","Latin Love 2","Love and affection!",""],["party_ravel","Dance Floor Laser","Meet the 22nd Century's dance floor lighting!",""],["chair_plasto*8","Chair","Hip plastic furniture","January Sale - Save 33%"],["ads_idol_mic","American Idol Microphone","Sing your heart out! Well not literally...",""],["divider_nor5","Plain Iced Angle","Cool cornering for your crib y0!",""],["a0 deal103","White Quest Roller","The power of movement","2: 3 White Quest Rollers in a convenient Pack"],["hween08_defibs2","Life Support (ooze)","Brought back to Earth with a shock!",""],["rare_snowrug","Snow Rug","Chilled Elegance",""],["tiki_torch","Beach Torch","Lighting the way",""],["DEV door","Telephone Box","Dr Who?",""],["deal01","Dining Chair","Keep it simple",""],["diner_bardesk_corner*7","Green Corner","Now that's smooth...",""],["DEV bed_budget_one3","Black Pura Bed","Prince sized comfort!",""],["giftflowers","Vase of Flowers","Guaranteed to stay fresh",""],["sound_set_70","Squad Synth","Football Sounds 3",""],["diner_sofa_2*4","White Sofa 2","Soft leather in 50s design",""],["poster 1001","Prince Charles Poster","Even walls have ears",""],["poster 1002","Queen Mum Poster","Aw, bles...",""],["poster 2000","Suomen kartta","Suomen kartta",""],["poster 2002","Urho Kaleva Kekkonen","Presidentin moutokuva",""],["poster 2003","Dodgy Geezer","Would you trust this man?",""],["poster 2004","Rasta Poster","Irie!",""],["pillar*4","Dark Ages Pillar","From the time of the Kick Warz",""],["safe_silo","Safe Minibar","Totally shatter-proof!",""],["bardeskcorner_polyfon*7","Green Corner Desk","Tuck it away",""],["penguin_rock","Disco Penguin","Aptenodytes Foxy",""],["xmas08_wallpaper","Snowy Posters","The Arctic scenery on your walls!",""],["A2 tlp 20","Pad of stickies","Pad of stickies",""],["chair_plasto*9","Chair","Hip plastic furniture","January Sale - Save 20%"],["glass_stool*2","Glass stool","Translucent beauty",""],["deal_fair9","Fairground Queue","",""],["a4 gothicstool","Black Gothic Stool","Witches and Warlocks",""],["ads_cllava2","Idea Agency Lava Lamp","It's better out than in!",""],["deal_xmastrax","Red Traxmachine Bundle","Includes all the new Traxpacks!",""],["hc_btlr","Electric Butler","Your personal caretaker",""]] +[["marquee*2","Red Dragon Marquee","Dragons out and Davids in!",""],["hc_lmp","Oil Lamp","Be enlightened",""],["ads_calip_lava","ads_calip_lava name","ads_calip_lava desc",""],["wallpaper 29","wallpaper","Wallpaper",""],["poster 57","Calligraphy Poster","Chinese calligraphy",""],["carpet_soft","Soft Wool Rug","Soft Wool Rug",""],["sound_set_23","SFX 4","Don't be afraid of the dark",""],["pura_mdl5*8","Yellow Pura Module 5","Any way you like it!",""],["lc_window1","Wooden Window","The deep blue",""],["sound_set_72","Country Trax","The working farm",""],["pillow*1","Pink Fluffy Pillow","Puffy, soft and huge",""],["one_way_door*9","Red One Way Gate","One at a time!",""],["safe_silo_pb","postbank Safe","Totally shatter-proof!",""],["DEV grand_piano3","Sapphire Grand Piano","Mozart's weapon in the war on silence",""],["plant_valentinerose*1","Red Valentine's Rose","Secret admirer!",""],["red_bathroom_jan08_deal","Pink Bathroom Deal","Duck, Sink, Bath, Pink Floor Tiles, Pink Loo Seat",""],["prize2","Silver Trophy","Nice and shiny",""],["hcporttele","Imperial Teleport","Let's go over tzar!",""],["summer_grill*2","Red Barbeque Grill","Plenty of shrimp on that barbie",""],["ads_idol_tube","Tube Light","Set the mood with this beautv!",""],["deal_eng1","England Supporters","RWC Final 2007",""],["ads_mall_winice","Mall Ice Cream Parlour Window","Get yourself a cold rock of ice creamy goodness here.",""],["iced_bm_jan07_deal","Iced Bar-desk Multipack","5 bar-desks",""],["sw_stone","Mysterious Necklace","Why does the stone glow at night?",""],["deal_arab3","Alhambra Deal 3","",""],["noob_set_5","Beginner Set 5","Beginner Furni Set 5",""],["chair_plasty*3","Plastic Pod Chair","Hip plastic furniture",""],["diner_chair*8","Yellow Stool","Perch in comfort",""],["bed_silo_one","Single Bed","Plain and simple",""],["sound_set_9","Electronic 2","Mystical ambient soundscapes",""],["rare_dragonlamp*9","Purple Dragon Lamp","Scary and scorching!",""],["poster 70","Flag of Brazil","The flag of Brazil",""],["DEV grand_piano5","Onyx Grand Piano","Why is that key green?",""],["divider_silo1*2","Black Corner Shelf","Neat and natty",""],["eco_fruits1","Fruit Bowl 1","From tree to hand in 3 pixels!",""],["table_silo_med*4","Beige Area Coffee Table","Beige Area Coffee Table",""],["glass_chair*4","Glass chair","Translucent beauty",""],["divider_nor3*4","Urban Iced Gate","Entrance or exit?",""],["pura_mdl4*4","White Pura Module 4","Any way you like it!",""],["arabian_divdr","Carved Cedar Divider","Soft wooden screen",""],["noob_plant","Plant","beginner set",""],["wallpaper 24","wallpaper","Wallpaper",""],["china_light","Chinese Wall Lamp","Flickers in the Eastern wind",""],["deal_rocks","Hole In The Wall","Trying to get in or out?",""],["table_plasto_square*5","Occasional table","Hip plastic furniture",""],["divider_nor3*5","Pink Iced gate","Pink Iced gate",""],["carpet_soft*1","Soft Wool Rug","Soft Wool Rug",""],["DEV grand_piano4","Amber Grand Piano","Why is that key green?",""],["prize3","Bronze Trophy","A weighty award",""],["sleepingbag*4","Safety Sleeping Bag","Ultimate coziness in SafeSid's sleeping bag!",""],["bed_polyfon_one*4","Beige Mode Single Bed","Beige Mode Single Bed",""],["sofa_silo*7","Green Area Sofa","Put your feet up!",""],["deal_tatami_l","Large Tatami Mat","Shoes off please","4 for 3!"],["deal_sa1","Springbok Supporters","RWC Final 2007",""],["diner_sofa_1*7","Green Sofa 1","Soft leather in 50s design",""],["tiki_bflies","Butterflies","Get your island beauties",""],["glass_stool*6","Blue Glass Stool","Translucent beauty",""],["jp_tray2","Sushi Ika","Sushi made with squid",""],["ads_idol_tblCloth","Function Table","Complete with beautiful tablecloth",""],["window_golden","Golden Window","An expensive view",""],["wallpaper 19","wallpaper","Wallpaper",""],["ads_idol_drape","American Idol Curtain","Create the perfect American Idol set with these curtains",""],["poster 500","Union Jack","The UK flag",""],["rubberchair*1","Blue Inflatable Chair","Soft and stylish HC chair",""],["DEV bed_budget_one7","Green Pura Bed","Prince sized comfort!",""],["SF_reactor","Warp Reactor","Don't worry, you'll warm to it",""],["DEV doorB","Wardrobe","Narnia this way!",""],["deal_plant4","Bonsai Tree","","Save 33%"],["A1 A1P","Square Dining Table","Hip plastic furniture",""],["romantique_smalltabl*1","Rose Quartz Tray Table","Every tray needs a table...",""],["table_silo_small*8","Yellow Occasional Table","For those random moments",""],["penguin_basic","Emperor Penguin","Aptenodytes Forsteri",""],["deal_maze","Maze Pack","Ultimate maze pack",""],["sound_set_21","Rock 1","Headbanging riffs",""],["pura_mdl3*9","Red Pura Module 3","Any way you like it!",""],["hween08_manhole","Manhole","Watch your step...",""],["noob_rug*6","My first Habbo rug","Nice and neat sisal rug with green edging",""],["ads_idol_desk","American Idol Judge Desk","No audition room is complete with out one of these!",""],["red_tv","Portable TV","Don?t miss those soaps",""],["soft_sofachair_norja*6","Blue Iced Sofachair","Blue Iced Sofachair",""],["ads_idol_logo","Idol logo","Idol logo wall",""],["ads_idol_l_carpet","Idol Carpet","With glamour and style",""],["ads_idol_l_logo","Idol logo","Idol logo wall",""],["ads_idol_l_tv","Latin American Idol TV","TBD Click it away",""],["a0 deal109","Navy Habbo Roller","The power of movement","2: 5 Navy Habbo Rollers in a convenient Pack"],["avatar_effect24","Under rain","What a shower!",""],["iced_cm_jan07_deal","Iced Corner Multipack","5 corners",""],["ads_calip_tele","Calippo Teleporter","Get your swim outfit now!",""],["rubberchair*2","Pink Inflatable Chair","Soft and tearproof!",""],["exe_table","Executive Desk","Take a memo, Featherstone",""],["bump_road_deal15","Road Deal 15","Get in the fast lane",""],["sleepingbag*5","Graphite Sleeping Bag","Ultimate outdoor coziness",""],["bolly_pillow","Star Pillow","Don't forget to make a wish!",""],["table_norja_med*5","Large Coffee Table Pink","For larger gatherings",""],["hcc_shelf","Bookshelf","Your own Habbo archives",""],["wcandleset","White Candle Plate","Simple but stylish",""],["chair_plasto*14","Chair","Hip plastic furniture",""],["chair_plasto*15","Chair","Hip plastic furniture",""],["diner_sofa_1*1","Aquamarine Sofa 1","Soft leather in 50s design",""],["country_lantern","Ye Olde Lantern","Light of your country life",""],["a1 gothicsofa","Gothic Sofa","The dark side of Habbo",""]] +[["a2 giftflowers","Vase of Flowers","Guaranteed to stay fresh",""],["tiki_tray0","Empty Tray","That was tasty!",""],["deal_swapit2","Trax Bundle","",""],["chair_plasty*4","Plastic Pod Chair","Hip plastic furniture",""],["table_plasto_square*6","Occasional Table","Hip plastic furniture",""],["couch_norja*7","Rural Iced Bench","Two can perch comfortably",""],["sound_set_27","Groove 2","Jingle Bells will never be the same...",""],["a1 gothicchair","Gothic Chair","The dark side of Habbo",""],["sporttrack3*1","Sport goal tartan","Let's get sporty!",""],["samovar","Russian Samovar","Click for a refreshing cuppa",""],["A1 B9P","Square Dining Table","Hip plastic furniture",""],["exe_sofa","3-Seater Sofa","Relaxing leather comfort",""],["noob_table*2","My first Habbo table","Lightweight, practical and dark blue",""],["planet_of_love","Planet of Love","A place of hope and liberty",""],["pix_asteroid","The Asteroid","A smashing rock in space!",""],["bump_tires_deal5","Bumper Tyres 5","Gets you back on track",""],["ticketbundle17","Big Ticket Bundle","A bundle of 17 gaming tickets",""],["pizza","Pizza Box","You dirty Habbo",""],["bed_polyfon_girl","Double Bed","Snuggle down in princess pink",""],["ads_calip_cola*2","Calippo Cola","Of the most refreshing!",""],["lt_gate","Tribal Gate","Tomb raid or not tomb raid",""],["divider_nor2*8","Yellow Iced bar desk","Yellow Iced bar desk",""],["DEV chair_basic4","White Pura Egg Chair","It's a cracking design!",""],["noob_stool*6","My first Habbo stool","Unfold me and take the weight off (green)",""],["A1 LAT","Floor Tile","In Variety of Colours",""],["wallpaper 9","wallpaper","Wallpaper",""],["poster 21","Angel Poster","See that halo gleam",""],["grunge_table","Grunge Table","Students of the round table!",""],["ads_veet","ads_veet name","ads_veet desc",""],["poster 504","The Bundesflagge","The German flag",""],["tv_luxus","Digital TV","Bang up to date",""],["party_bardesk","Bar Centre","Keep the punters at bay",""],["ads_idol_ichair","Interview Chair","Next question please.",""],["pura_mdl4*1","Aqua Pura Module 4","Any way you like it!",""],["ads_wwe_poster","ads_wwe_poster name","ads_wwe_poster text",""],["sound_set_6","Ambient 3","Background ambience loops",""],["rare_dragonlamp*3","Silver Dragon Lamp","Scary and scorching!",""],["chair_silo*2","Black Dining Chair","Keep it simple",""],["china_moongt","Moongate","A mysterious and eery past",""],["shelves_silo","Bookcase","For nic naks and art deco books",""],["eco_cactus3","Potted Cactus 3","Find a place in the sun",""],["diner_cashreg*3","Black Register","Roll up roll up!",""],["poster 55","Tree of Time","Save our trees!",""],["divider_silo1*5","Pink Area Corner Shelf","Pink Area Corner Shelf",""],["A2 POJAT","Occasional Table","For those random moments",""],["glass_table*7","Green Glass Table","Habbo Club",""],["chair_silo*6","Blue Area Dining Chair","Wooden dining chair",""],["noob_table*4","My first Habbo table","Lightweight, practical and light blue",""],["chair_norja*2","Black Iced Chair","Sleek and chic for each cheek",""],["bed_polyfon*8","Yellow Mode Double Bed","Yellow Mode Double Bed",""],["wood_tv","Large TV","HNN weatherman Kiazie",""],["shelves_norja","Bookcase","For nic naks and art deco books",""],["chair_plasty*5","Plastic Pod Chair","Hip plastic furniture",""],["summer_chair*3","Black Deck Chair","Rest from castle building!",""],["chair_norja*6","Blue Chair","Sleek and chic for each cheek",""],["bardesk_polyfon*2","Black Mode Bardesk","Black Mode Bardesk",""],["petfood1","Doggy Bones","Natural nutrition for the barking one",""],["divider_poly3*4","Beige Mode Bardesk Gate","Beige Mode Bardesk Gate",""],["ads_idol_pchair","American Idol Piano Chair","Sit comfortably in this chair with your Idol piano",""],["divider_silo3*5","Pink Area Gate","Pink Area Gate",""],["poster 506","The flag of Finland","To 'Finnish' your decor...",""],["deal_plant6","Mature Cactus","","Save 33%"],["rare_icecream*4","Strawberry Ice Cream Machine","Virtual strawberry rocks!",""],["poster 520","The Rainbow Flag","Every colour for everyone",""],["blue_bathroom_jan08_deal","Blue Bathroom Deal","Duck, Sink, Bath, Blue Floor Tiles, Blue Loo Seat",""],["scifirocket*5","Uranus Smoke Machine","From the unknown depths of space",""],["deal_crocfood","T-Bones Mega Multipack","Fantastic 20% Saving!",""],["soft_sofa_norja*9","Red Iced Sofa","Red Iced Sofa",""],["a0 stick3","Hockey Stick","Hockey Stick",""],["A1 DHP","Square Dining Table","Hip plastic furniture",""],["penguin_pilot","Pilot Penguin","Aptenodytes Biggles",""],["diner_table_2*7","Green Table","Enjoy your meal!",""],["habboween_grass","Unholy Ground","Autumnal chills with each rotation!",""],["sound_set_46","Club 1","De bada bada bo!",""],["3_Month_Subscription_3","Love Cauldron and 80 Credits","",""],["poster 11","Certificate","I obey the Habbo way!",""],["rom_lamp","Crystal Lamp","Light up your life",""],["pura_mdl5*2","Pink Pura Module 5","Any way you like it!",""],["window_triple","Bay Window","Now THAT'S a view!",""],["yellow_mode_jan08_deal","Yellow Mode Bedroom Deal","Yellow Single and Double Mode Bed, Mode Bookcase",""],["prizetrophy6*3","Champion trophy","Breathtaking bronze",""],["deal_uk_patch2","Moss Patch","","Save over 50%"],["prizetrophy5*3","Duo trophy","Breathtaking bronze",""],["avatar_effect2","Blue Hover Board","The future of transportation",""],["party_neon4","Neon Skull Light","A dull wall be gone!",""],["pudding","Christmas Pudding","Will you get the lucky sixpence?",""],["ads_malaco_gu","malaco gu","ads_malaco_gu",""],["diner_tray_5","Bacon and Eggs","Smoky bacon and free range eggs!",""],["glass_chair*2","Glass chair","Translucent beauty",""],["a0 deal201","Sport track straight","Let's get sporty!",""],["a4 gothicchair","Black Gothic Chair","Vampires and Wizards",""],["bolly_corner","Bollywood Corner","Tuck it away",""],["A1 B7P","Square Dining Table","Hip plastic furniture",""],["glass_stool*8","Yellow Glass Stool","Clear a seat",""],["deal_fair7","Habbo-Works.com Spring Coaster","",""],["glass_chair*9","Habbowood Glass Chair","For celebrity divas",""],["pillar*2","Nordic Pillar","Ancient and stately",""],["country_trctr","Tractor","Don't run over the bunny!",""],["deal_maze_mega","Mega Maze Pack","Complete with barriers",""],["scifidoor*3","Lightblue Spaceship Door","There out of this world!",""],["voting_ch","voting_ch name","voting_ch desc",""]] +[["deal_sushi","Sushi Deal","","ALL Sushi - Save 33%"],["env_grass","Grass patch","Lush green grass to lay on your Earth",""],["grand_piano*1","Rose Quartz Piano Stool","Here sat the legend of 1900",""],["exe_gate","Executive Gate","Keeps the tax man away",""],["eco_lamp1","Eco Lamp 1","Energy saving bulb fitted",""],["rare_icecream*5","Vanilla Ice Cream Machine","Virtual vanilla rocks!",""],["soft_sofachair_norja*8","Yellow Iced Sofachair","Yellow Iced Sofachair",""],["ads_clwall2","Idea Agency Plasma 2","Welcome to the Idea Agency",""],["queue_tile1*7","Purple Habbo Roller","The power of movement",""],["pura_mdl3*5","Beige Pura Module 3","Any way you like it!",""],["pura_mdl4*7","Green Pura Module 4","Any way you like it!",""],["poster 4","Bear Plaque","Fake of course!",""],["deal_tinsels","Silver Tinsel Bundle","10 x Silver Tinsel",""],["traffic_light*2","Blue Traffic Light","Chill and wait your turn!",""],["pura_mdl1*7","Green Pura Module 1","Any way you like it!",""],["table_plasto_square*7","Occasional Table","Hip plastic furniture",""],["noob_stool*1","My first Habbo stool","Unfold me and take the weight off (orange)",""],["deal_dance","Dance Destination","Everything but the dancers!",""],["shelves_norja*7","Rural Iced Bookcase","For nic naks and cookery books",""],["fireplace_polyfon","Fireplace","Comfort in stainless steel",""],["hw08_xray","X-Ray Poster","For viewing your bruises",""],["bolly_monkey_lamp","Monkey Lamp","Cast a cheeky glow",""],["carpet_soft_tut","Welcome Mat","Welcome, enjoy your stay!",""],["noob_stool*2","My first Habbo stool","Unfold me and take the weight off (dark blue)",""],["ads_igorevilb","Evil Bone","It's not a funny bone",""],["rare_elephant_statue","Golden Elephant","Say hello to Nelly",""],["wallpaper 15","wallpaper","Wallpaper",""],["chair_plasty*6","Plastic Pod Chair","Hip plastic furniture",""],["scifirocket*0","Mars Smoke Machine","See in 2007 with a bang!",""],["noob_rug_tradeable_3","starter rug","beginner set",""],["diner_sofa_1*8","Yellow Sofa 1","Soft leather in 50s design",""],["ads_711_1","ads_711","",""],["env_telep","Porta-House","Keep up with the neighbours",""],["diner_gumvendor*8","Yellow Gum Machine","Fruity bubbly goodness!",""],["glass_sofa*2","Glass sofa","Translucent beauty",""],["glass_sofa*7","Green Glass Sofa","Habbo Club",""],["table_silo_small*6","Blue Area Occasional Table","Small and elegant",""],["arabian_pllw","Green Blossom Pillow","Exotic comfort",""],["ads_calip_cola*4","Calippo Crazy","Of the most refreshing!",""],["diner_bardesk_gate*4","White Gate","Working 9 to 5",""],["hween08_wndwb","Broken Window (small)","Was it a rock or a dictionary?",""],["sofa_silo*6","Blue Area Sofa","Cushioned, understated comfort",""],["bones mega deal","testing","",""],["deal_trax5","Trax Pack: Purple SFX","Groovin' Purple Traxmachine!",""],["noob_rug*1","My first Habbo rug","Nice and neat sisal rug with orange edging",""],["saturn","Planet of Eternity","How many rings are there??",""],["solarium_norja","White Solarium","Rejuvenate your pixels!",""],["netari_carpet","Netari carpet","Netari branded skull",""],["diner_sofa_1*5","Beige Sofa 1","Soft leather in 50s design",""],["rare_fan*1","Birthday Fan","It'll blow your candles out!",""],["rare_fan*2","Green Powered Fan","It'll blow you away!",""],["lt_stage2","Large Tribal Block","Ancient ruins a plenty",""],["queue_tile1*6","Blue Habbo Roller","The power of movement",""],["ads_igor_dsk","Inventor's Desk","Draw your evil plans",""],["duck","Rubber Duck","Every bather needs one",""],["bump_tottero","Safety Cone","Not a road bump!",""],["sofa_silo*9","Red Area Sofa","Cushioned, understated comfort",""],["deal_christmas2","New Year Deal 2","Candles and cake to see in the new year!",""],["jp_katana3","Katana Green","Hurry! Chop chop!",""],["hwn_deal_3","Skull Candle","Alas poor Yorrick...","Huge saving!"],["summer_pool*4","Yellow Summer Pool","Chance to cool off",""],["party_floor","Disco Floor","The perfect place to throw some shapes",""],["candy_cm_jan07_deal","Candy Bardesk Bundle","Great value bundle!",""],["DEV bed_budget_one1","Aqua Pura Bed","Prince sized comfort!",""],["hween08_defibs","Life Support (blood)","Brought back to Earth with a shock!",""],["sofa_polyfon*2","Black Mode Sofa","Black Mode Sofa",""],["rare_fountain","Bird Bath (red)","For our feathered friends",""],["diner_bardesk_corner*5","Beige Corner","Now that's smooth...",""],["divider_nor1*9","Red Ice corner","Red Ice corner",""],["SF_crate_1","Small Crate","Pack up your space wares!",""],["A1 C9P","Round Dining Table","Hip plastic furniture",""],["rare_fan*8","Habbo Wind Turbine","Stylish, Eco-Energy!",""],["solarium_norja*7","Rural Solarium","Fun in the sun!",""],["sound_set_36","Latin Love 1","For adult minded",""],["carpet_standard*7","Floor Rug","Available in a variety of colours",""],["clrack","Clothes Rack","Fancy a new look? You can get it here.",""],["ads_calip_pool","Calippo Pool","Fancy a dip?",""],["bolly_desk","Bollywood Desk","To build and divide",""],["deal_tile1","Red Tile","Ideal for your downtown promenades & piazzas",""],["solarium_norja*3","Urban Solarium","Get the city look!",""],["poster 25","Reindeer Poster","Doing a hard night's work",""],["poster 59","Hoot Poster","The eyes follow you...",""],["poster 501","Jolly Roger","For pirates everywhere",""],["deal_skyscraper1","Skyscraper Window","Dizzy heights!",""],["pura_mdl2*5","Beige Pura Module 2","Any way you like it!",""],["gothic_carpet2","Dungeon Floor","What lies beneath?",""],["noob_chair_tradeable_6","starter chair","beginner set",""],["scifirocket*7","Jupiter Smoke Machine","Larger than life!",""],["wooden_screen*5","Shadow Screen","From deep inside the dragon caves",""],["deal_uk_corn9","Golden Wheat","Right on the brink of harvest",""],["a2 l","floor","Floor",""],["deal_winter_blues2","Winter Blues Bundle 2","Blue Summer Pool, 2 Aqua Deck Chairs and 2 Yukka Plants",""],["sand_cstl_wall","Sand Castle Wall","Not entirely water proof!",""],["diner_bardesk*4","White Bar","Pull up a stool!",""],["poster 503","The Swiss flag","There's no holes in this...",""],["wooden_screen*6","Blue Oriental Screen","Add an exotic touch to your room",""],["exe_s_table","Executive Glass Table","Get a clear reflection!",""],["campfire","Camp fire","Keep warm on those Arctic nights!",""],["deal_movie6","Drama Bundle","Can you escape Shawshank?",""],["eco_light3","Eco Light 3","Energy saving bulb fitted",""],["greek_seat","Greek Seat","Park your bot on this stone slab!",""]] +[["traffic_light*5","White Traffic Light","Chill and wait your turn!",""],["diner_poster","Diner Poster","Diner officially approved!",""],["ads igor_brain","The Brain","Brains of the operation",""],["arabian_bigtb","Amanjena Table","It must be Jinn-er time!",""],["goodie2","Chocolate Mouse","For gourmet kittens",""],["lodge_bedroom_jan08_deal","Lodge Bedroom Deal","Lodge Single and Double Bed, Lodge Floor lamp",""],["poster 67","Reel poster","These five lads are Reel-y great",""],["ticketbundle20","Big Ticket Bundle","A bundle of 17 gaming tickets",""],["pura_mdl4*5","Beige Pura Module 4","Any way you like it!",""],["diner_table_1*3","Black Booth Table","Ready to order?",""],["deal_uk_pillar2","Small Tribal Torch","","Save 25%"],["deal_uk_sfroller10","Sci Fi Roller","They work against gravity",""],["barchair_silo*5","Pink Bar Stool","Practical and convenient",""],["country_log","Log Bench","Stop and perch",""],["traxbronze","traxbronze","",""],["china_shelve","Chinese Bookshelf","To hold the mind's treasures",""],["penguin_elf","Christmas Penguin","Aptenodytes Jolly",""],["divider_nor2*9","Red Iced bar desk","Red Iced bar desk",""],["divider_silo3*7","Green Area Gate","Door (lockable)",""],["rare_dragonlamp*6","Gold Dragon Lamp","Scary and scorching!",""],["typingmachine","Typewriter","Write that bestseller",""],["barchair_silo*2","Black Bar Stool","Practical and convenient",""],["one_way_door*3","White HC Gate","One way! The HC way!",""],["tiki_corner","Tiki Bar Corner","Nothing says a bar like a corner?",""],["env_tree2","Forest Tree Americana","Earth's Green Haven - ROOM 997 by EarthBoyJim",""],["a0 deal111","Ice Habbo Roller","The power of movement","2: 5 Ice Habbo Rollers in a convenient Pack"],["ads_malaco_tv","Malaco TV","Malaco TV",""],["one_way_door*5","Pink One Way Gate","One at a time!",""],["prizetrophy7*1","Gold Habbo trophy","Gold Habbo trophy",""],["marsrug","Mars Patch","Discover the red planet",""],["summer_chair*5","Deck Chair","Beige",""],["diner_chair*4","White Stool","Perch in comfort",""],["eco_tree1","Orange Tree","Actually, the tree is green...",""],["summer_chair*1","Aqua Deck Chair","Got your swimming trunks?",""],["sofachair_polyfon","Armchair","Soft and comfortable",""],["bunny","Squidgy Bunny","Yours to cuddle up to",""],["deal_tile11","Red Tile","10% off downtown promenades & piazzas!",""],["glass_sofa*9","Habbowood Glass Sofa","For comedy duos",""],["val_teddy*4","Brown Share Bear","The brown bear of naughtiness",""],["glass_chair*5","Candy Glass Chair","A pane that you're used to",""],["habbocake","Cake","Save me a slice!",""],["diner_bardesk*3","Black Bar","Pull up a stool!",""],["diner_gumvendor*4","White Gum Machine","Fruity bubbly goodness!",""],["divider_nor5*3","White Iced Angle","Cool cornering for your crib y0!",""],["penguin_robot","Robot Penguin","Aptenodytes Asimov",""],["ads_reebok_tv","ads Reebok TV","ads Reebok tv",""],["marquee*8","Ultramarine Marquee","It's both door and a shade!",""],["deal_movie3","Crime Bundle","Are you one of Ocean's Eleven?",""],["noob_table*6","My first Habbo table","Lightweight, practical and green",""],["deal_uk_curtainpink3","Pink Curtain","Made with the finest materials",""],["blue_pura_jan08_deal","Blue Pura Bedroom Deal","Blue Single and Double Pura Bed, Pura Lamp",""],["poster 513","The Australian flag","Aussies rule!",""],["ads_mall_winmus","Mall Music Shop Window","Strum, play and drum - this shop is a music lover's heaven",""],["divider_nor2*6","Blue Iced bar desk","Blue Iced bar desk",""],["triplecandle","Electric Candles","No need to worry about wax drips",""],["pillar*0","Greek Pillar","Classy architect, for holding up ceilings!",""],["one_way_door*1","Aqua One Way Gate","One at a time!",""],["divider_nor5*7","Rural Iced Angle","Cool cornering for your crib!",""],["clickable_poster_test","Skyscraper Window","",""],["rare_fan*0"," Festive Fan","As red as Rudolph's nose",""],["hc_crtn","Antique Drapery","Topnotch privacy protection",""],["marquee*4","Yellow Marquee","It's both door and a shade!",""],["sofa_polyfon*4","Beige Mode Sofa","Beige Mode Sofa",""],["table_silo_small*7","Green Area Occasional Table","Small and elegant",""],["solarium_norja*2","Beige Solarium","Rejuvenate your pixels!",""],["poster 42","Spiderweb","Not something you want to run into",""],["plant_maze","Maze Shrubbery","Build your maze!",""],["diner_bardesk_gate*3","Black Gate","Working 9 to 5",""],["chair_plasto*16","Chair","Hip plastic furniture",""],["tile","Floor Tiles","In a choice of colours",""],["table_plasto_square*8","Occasional Table","Hip plastic furniture",""],["bed_polyfon_one*7","Green Single Bed","Cot of the artistic",""],["doormat_plain*2","Doormat","Available in a variety of colours",""],["prizetrophy6*2","Champion trophy","Shiny silver",""],["noob_rug*5","My first Habbo rug","Nice and neat sisal rug with pink edging",""],["a0 deal101","White Quest Roller","The power of movement","2: 5 White Quest Rollers in a convenient Pack"],["ticketbundle2","Big Ticket Bundle","A bundle of 17 gaming tickets",""],["bartable_armas","Bardesk","Bar-Style Table - essential for extra guests",""],["sound_machine4","Blue Traxmachine","For Funky, Funky Fridays!",""],["diner_table_1*2","Pink Booth Table","Ready to order?",""],["petfood2","Sardines","Fresh catch of the day",""],["DEV doorC","Portaloo","In a hurry?",""],["chair_plasty*7","Plastic Pod Chair","Hip plastic furniture",""],["noob_lamp*6","My first Habbo lamp","Get the light right where you want it (canary yellow)",""],["jukebox_ptv*1","Jukebox Pacha TV","Jukebox Pacha TV",""],["deal_uk_corn4","Golden Wheat","Right on the brink of harvest",""],["deal_holly2","Holly Bundle 2","Deck the halls!","Super Saver Bundle!"],["smooth_table_polyfon","Large Dining Table","For larger gatherings",""],["ads_calip_cola*1","Calippo Lima","Of the most refreshing!",""],["torch","Gothic Torch","Keeping dungeons light",""],["deal_uk_floor4a","Ornamental Tile","The floor is your canvas",""],["divider_nor5*2","Black Iced Angle","Cool cornering for your crib y0!",""],["nouvelle_trax","Nouvelle Trax","",""],["bed_armas_one","Single Bed","Rustic charm for one",""],["sound_set_55","RnB Grooves 1","Can you fill me in?",""],["gothic_chair*1","Gothic Chair Pink","The dark side of Habbo",""],["gothic_chair*2","Gothic Chair Saffron","The dark side of Habbo",""],["gothic_chair*3","Gothic Chair Red","The dark side of Habbo",""],["gothic_chair*4","Black Gothic Chair","The dark side of Habbo",""],["gothic_chair*5","Gothic Chair Green","The dark side of Habbo",""],["gothic_chair*6","Gothic Chair Blue","The dark side of Habbo",""]] +[["hc_bkshlf","Medieval Bookcase","For the scholarly ones",""],["deal_uk_rock5","Stone Wall","Keep your livestock safe",""],["eco_chair1","Eco Stool 1","Green leaf design",""],["avatar_effect18","Yellow UFO","Unidentified yellow flying object.",""],["landscape 6","landscapes","You're better in than out!",""],["penguin_glow","Fluorescent Penguin","Aptenodytes Gamma",""],["hw_08_xray","X-Ray Light","Check for breaks and sprains",""],["wooden_screen*7","Purple Oriental Screen","Add an exotic touch to your room",""],["lt_jngl_wall","Jungle Wall","Thick jungle scenery",""],["jp_pillow","Pillow Chair","Comfy and classical",""],["rare_mnstr","Venomus Habbolus","Don't get too close...",""],["rubberchair*4","Ocean Inflatable Chair","Soft and tearproof!",""],["prizetrophy4*2","Fish trophy","Shiny silver",""],["poster 2001","Magic Carpet","Former servant of a great wizard!",""],["pura_mdl3*7","Green Pura Module 3","Any way you like it!",""],["DEV bed_budget2","Pink Pura Double Bed","Queen sized comfort!",""],["diner_tray_7","Accompaniments","Tommy and Mustard",""],["sofachair_polyfon_girl","Armchair","Think pink",""],["ads_mall_kiosk","Mall Kiosk","Fish, fruit, sweets, sunglasses - it is all available here.",""],["fortune","Crystal Ball","Gaze into the future",""],["a0 deal119","Pink Habbo Roller","The power of movement","2: 3 Pink Habbo Rollers in a convenient Pack"],["lc_tubes_straight","Water Tube Straight","Just go with the flow",""],["noob_table*5","My first Habbo table","Lightweight, practical and pink",""],["tile_red","Floor Tiles","In a choice of colours",""],["wallpaper 12","wallpaper","Wallpaper",""],["DEV grand_piano1","Rose Quartz Grand Piano","Chopin's revolutionary instrument",""],["deal_sport5","Referee Deal","",""],["penguin_musketeer","Musketeer Penguin","Aptenodytes Aramis",""],["bardeskcorner_polyfon*8","Yellow Mode Bardesk Corner","Yellow Mode Bardesk Corner",""],["poster 510","The Italian flag","The flag of Italy",""],["det_body","Chalk Outline","They were a great Habbo...",""],["A1 PYS","Coffee Table","Wipe clean and unobtrusive",""],["landscape 5","landscapes","Above the little fluffy clouds",""],["rare_fan*5","Yellow Powered Fan","It'll blow you away!",""],["couch_norja*4","Urban Iced Bench","Two can perch comfortably",""],["glass_chair","Glass chair","Translucent beauty",""],["deal_tp2","Summer Beach Bundle","",""],["divider_silo3*8","Yellow Area Gate","Form following function",""],["sound_set_48","Club 3","Sweet party beat",""],["exe_wfall","Wall Fall","Improve your cash flow",""],["ads_idol_clRack","Clothes Rack","Finally! Somewhere to hang up your clothes",""],["deal_movie1","Fantasy Bundle","Spend an evening at Hogwarts",""],["poster 1006","Hoot Poster","The eyes follow you...",""],["hween08_bed2","Hospital Bed (ooze)","I'm wicked and I'm oozey!",""],["sound_set_29","Dance 2","Electronic house",""],["sporttrack1*3","Sport track straight grass","Let's get sporty!",""],["redhologram","Holo-girl","You're her only hope...",""],["dog_brown_deal","Dog Starter Pack (brown)","",""],["deal_uk_rock3","Stone Wall","Keep your livestock safe",""],["ads_idol_trophy","American Idol Trophy","For the winner of American Idol",""],["sofachair_polyfon*4","Beige Mode Armchair","Beige Mode Armchair",""],["ham2","Eaten Ham","Looks like you're too late!",""],["yellow diner_table_2","Yellow Diner Table","Enjoy your meal!",""],["poster 26","Stocking","Hung yours up yet?",""],["grunge_chair","Grunge Chair","Alternative chair for alternative people",""],["hcc_chair","Trendy Stool","Shiny varnished finish",""],["deal_uk_marsrug20","Mars Patch","Discover the red planet",""],["party_mic","Microphone","Sing, MC, shout out to your friends!",""],["prizetrophy4*1","Fish trophy","Glittery gold",""],["couch_norja*3","White Iced Bench","Two can perch comfortably",""],["sf_wall3","Starship Corner","Streamlined for speed",""],["diner_bardesk*7","Green Bar","Pull up a stool!",""],["sound_set_47","Club 2","Storm the UKCharts!",""],["easy_carpet","Easy carpet","Easy carpet",""],["diner_table_2*3","Black Table","Enjoy your meal!",""],["bar_basic","A Pura Minibar","A pura series 300 minibar",""],["party_led","Big Wall Lights","Flashing Neon lights on the wall!",""],["white_pura_jan08_deal","White Pura Bedroom Deal","White Single and Double Pura Bed, Pura Lamp",""],["carpet_legocourt","Basketball Court","Line up your slam dunk",""],["deal_tikiwallplant","Jungle Wallplant","",""],["A1 E6P","Chair","Hip plastic furniture",""],["noob_table*3","My first Habbo table","Lightweight, practical and aubergine",""],["party_tube_bubble","Bubbles Machine","Bubbles! Bubbles! Lovely bubbles!",""],["deal_verifyflags","Flag Bundle","",""],["poster 523","India Flag","The flag of India",""],["tiki_junglerug","Jungle Patch","Bring your machete",""],["A1 C2P","Round Dining Table","Hip plastic furniture",""],["ads_idol_jukebox*1","American Idol Jukebox","I sound better already!",""],["diner_sofa_2*9","Red Sofa 2","Soft leather in 50s design",""],["diner_sofa_2*10","Mint Sofa 2","Soft leather in 50s design",""],["a2 t","wallpaper","Wallpaper",""],["soft_sofa_norja*2","iced sofa","A soft iced sofa",""],["solarium_norja*1","Black Solarium","Rejuvenate your pixels!",""],["one_way_door*8","Yellow One Way Gate","One at a time!",""],["table_silo_small*2","Black Occasional Table","For those random moments",""],["plant_pineapple","Pineapple Plant","","Save 33%"],["DEV bed_budget_one2","Pink Pura Bed","Princess sized comfort!",""],["party_discol","Spotlight","Focus your attention or dance within its glow!",""],["sound_set_45","Berlin Connection","The Bass? is the rhythm!",""],["country_well","Wishing Well","Come spend a penny",""],["poster 54","The EU flag","Be proud to be in the Union!",""],["totem_planet","Totem Planet","Mysterious powers lie in wait...",""],["laptopdesk","laptopdesk name","laptopdesk desc",""],["scifiport*1","Gold Laser Gate","Energy beams. No trespassers!",""],["deal_tinselg","Gold Tinsel Bundle","10 x Gold Tinsel",""],["a2 film","Film","Film for five photos",""],["sofa_silo","Two-Seater Sofa","Cushioned, understated comfort",""],["deal_uk_hafta1","Crime Props","Create the perfect crime scene","Great value!"],["exe_light","Executive Light","Glow your business",""],["lc_tile1","Marble Floor Tile","Elegant underwater flooring",""],["poster 74","Chains","Shake, rattle and roll",""]] +[["noob_chair*1","My first Habbo chair","Lightweight, practical and yellow",""],["noob_lamp_tradeable_3","starter lamp","beginner set",""],["carpet_standard*8","Floor Rug","Available in a variety of colours",""],["soft_sofachair_norja*9","Red Iced Sofachair","Red Iced Sofachair",""],["rare_icecream*1","Blueberry Ice Cream Machine","Virtual blueberry rocks!",""],["pura_mdl3*3","Black Pura Module 3","Any way you like it!",""],["deal_fair5","HabboHut.com Bumper Cars","",""],["party_ball","Glitter Ball","Every party MUST have one!",""],["diner_sofa_2*6","Blue Sofa 2","Soft leather in 50s design",""],["avatar_effect22","Bad bad BadMobile effect","Get all evil with this BadMobile.",""],["pura_mdl2*6","Blue Pura Module 2","Any way you like it!",""],["prizetrophy*2","Classic trophy","Shiny silver",""],["rare_icecream*3","Blackcurrant Ice Cream Machine","Virtual blackcurrant rocks!",""],["A2 MAJAHARJU","Occasional Table","Practical and beautiful",""],["waterbowl*4","Blue Water Bowl","Aqua unlimited",""],["bed_polyfon_girl_one","Single Bed","Snuggle down in princess pink",""],["sound_set_18","Groove 4","Listen while you tan",""],["deal_tikidesk","Tiki Bar Desk Bundle","","Super saver pack!"],["rare_fan*3","Purple Dragon Skin Fan","Keeps the heat off St George!","Happy St George's Day!"],["eco_sofa3","Eco Armchair 3","Relax! You've done your bit",""],["wallpaper 7","wallpaper","Wallpaper",""],["CFC_200_moneybag","Sack of Credits (China)","Worth 200 Credits",""],["xmas08_dvdr1","Ice divider","Stone and ice in one snowy wall!",""],["noob_rug*3","My first Habbo rug","Nice and neat sisal rug with aubergine edging",""],["sound_machine6","Purple Traxmachine","Add some effects to your room!",""],["xmas08_icerug","Ice Patch","Ice, Snow or Wet Slush? All is possible with this.",""],["A2 KIIHTELYS","Shelf","Shelf",""],["romantique_divan*1","Rose Quartz Chaise-Longue","Recline in continental Rose Quartz comfort",""],["grunge_bench","Bench","Laid back seating",""],["silo_studydesk","Area Quest Desk","For the true Habbo Scholars",""],["poster 29","Tinsel (gold)","A touch of festive sparkle",""],["arabian_swords","Ancestral Scimitars","Not for yielding",""],["soft_sofachair_norja*3","White Iced Sofachair","Soft Iced sofachair",""],["diner_table_2*9","Red Table","Enjoy your meal!",""],["diner_table_2*10","Mint Table","Enjoy your meal!",""],["bardeskcorner_polyfon*5","Candy Corner","For sweet corners!",""],["noob_lamp*5","My first Habbo lamp","Get the light right where you want it (pink)",""],["a5 gothicstool","Green Gothic Stool","The dark side of Habbo",""],["deal_walllight_neon","Neon Lights Deal","Get all wall lights for 15 credits!",""],["sound_set_42","Haunted Mansion","Bumps and Chills",""],["deal_uk_sflamp","Sci Fi Lamp","The future's bright...",""],["country_gate","Farm Gate","Livestock: Close gate behind you",""],["val_choco","Heart Shaped Chocs","One for them. Two for me!",""],["bardesk_polyfon*6","Blue Mode Bardesk","Blue Mode Bardesk",""],["country_fnc1","Stick Fence","It's brown and sticky",""],["avatar_effect13","Ghost","Spooky",""],["tiki_surfboard","Surfboard","Ride the waves dude!",""],["wallpaper 13","wallpaper","Wallpaper",""],["romantique_mirrortabl","Dressing Table","Get ready for your big date",""],["chair_basic*1","Aqua Pura Egg Chair","It's a cracking design!",""],["chair_basic*2","Pink Pura Egg Chair","It's a cracking design!",""],["chair_basic*3","Black Pura Egg Chair","It's a cracking design!",""],["chair_basic*4","White Pura Egg Chair","It's a cracking design!",""],["chair_basic*5","Beige Pura Egg Chair","It's a cracking design!",""],["chair_basic*6","Blue Pura Egg Chair","It's a cracking design!",""],["chair_basic*7","Green Pura Egg Chair","It's a cracking design!",""],["chair_basic*8","Yellow Pura Egg Chair","It's a cracking design!",""],["chair_basic*9","Red Pura Egg Chair","It's a cracking design!",""],["sound_set_41","Rock 8","Burning Riffs",""],["candy_sp_jan07_deal","Candy Starter Pack","Hatch, Corner and 2 Bars",""],["a1 newplch2","Chair","Hip plastic furniture",""],["eco_cactus2","Potted Cactus 2","Find a place in the sun",""],["tile_yell","Floor Tiles","In a choice of colours",""],["sound_set_68","Pitchside Pro","Football Sounds 1",""],["sofachair_silo*6","Blue Area Armchair","Large, but worth it",""],["deal_starg","Gold Star Bundle","Selection of gold stars",""],["SF_chair_red","Captain's Chair","You're their only hope",""],["ads_igorbrain","The Brain","Mwahhahahahaha brains...",""],["12_Month_Subscription_11","Pink Pillar and 80 Credits","",""],["ads_sunnyd","Sunny Delight","Sunny Delight",""],["shelves_norja*8","Yellow Bookcase","For nic naks and art deco books",""],["eco_curtains2","Eco Curtain 2","Help keep the heat in",""],["lc_table","Captain's Table","Treasure map not included",""],["sound_machine_pro","Sound Machine Pro","creating fancy sounds",""],["env_tree1","Forest Tree Chair","Go to ""E&"Earth's Green Haven Room 321""E&" of EarthboyJim for quest!",""],["barrier*3","Red Road Barrier","No trespassing, please!",""],["table_silo_med*8","Yellow Coffee Table","Wipe clean and unobtrusive",""],["eco_curtains3","Eco Curtain 3","Help keep the heat in",""],["poster 16","Bars","Added security",""],["deal_earthday2","Mood Light","","Save 10 Credits!"],["noob_set_2","Beginner Set 2","Beginner Furni Set 2",""],["TEST","","",""],["barchair_silo","Bar Stool","Practical and convenient",""],["audChr","audChr name","audChr desc",""],["wallpaper 18","wallpaper","Wallpaper",""],["poster 515","The Swedish flag","Waved by Swedes everywhere",""],["xmas08_table","Icy table","Keeps your ice cream chilled - guaranteed!",""],["chair_china","Chinese Lacquer Chair","The elegant beauty of tradition",""],["ads_clcake","Idea Agency Super Cake","Have your cake and eat it with Idea",""],["pura_mdl5*7","Green Pura Module 5","Any way you like it!",""],["pumpkin","Pumpkin Lamp","Cast a spooky glow","Huge saving!"],["gothic_stool*1","Gothic Stool Pink","The dark side of Habbo",""],["gothic_stool*2","Gothic Stool Saffron","The dark side of Habbo",""],["gothic_stool*3","Gothic Stool Red","The dark side of Habbo",""],["gothic_stool*4","Black Gothic Stool","The dark side of Habbo",""],["gothic_stool*5","Gothic Stool Green","The dark side of Habbo",""],["gothic_stool*6","Gothic Stool Blue","The dark side of Habbo",""],["poster 512","The Irish flag","The flag of Ireland",""],["penguin_sumo","Sumo Penguin","Aptenodytes Musashimaru",""],["tree5","Christmas Tree 3","Any presents under it yet?",""],["A1 D5P","Square Dining Table","Hip plastic furniture",""]] +[["avatar_effect26","Stick of command","Do not even think of a case!",""],["sound_set_15","RnB Grooves 6","Unadulterated essentials",""],["wooden_screen*0","White Oriental Screen","Add an exotic touch to your room",""],["lc_desk","Wooden Bar Desk","Not for sitting",""],["window_hole","Window","Window",""],["bardeskcorner_polyfon*4","Beige Mode Bardesk Corner","Beige Mode Bardesk Corner",""],["A1 BM4","Floor Rug","Available in a variety of colours",""],["lt_stage1","Small Tribal Block","Ancient ruins a plenty",""],["avatar_effect17","Pink UFO","Fly away with this UFO of love.",""],["sofa_silo*2","Black Two-Seater Sofa","Cushioned, understated comfort",""],["poster 47","The French Tricolore","The French flag",""],["diner_gumvendor*2","Pink Gum Machine","Fruity bubbly goodness!",""],["eco_fruits3","Fruit Bowl 3","From tree to hand in 3 pixels!",""],["avatar_effect23","Radioactive","You can even fly!",""],["A1 E5P","Chair","Hip plastic furniture",""],["divider_nor1*4","Urban Iced Corner","The missing piece",""],["jp_bamboo","Bamboo Forest","Watch out for pandas!",""],["pillow*8","Navy Cord Pillow","Puffy, soft and huge",""],["svnr_fi","Finnish Sauna","December 2008, 6/6",""],["diner_bardesk_gate*6","Blue Gate","Working 9 to 5",""],["pura_mdl5*1","Aqua Pura Module 5","Any way you like it!",""],["sporttrack3*2","Sport goal tartan","Let's get sporty!",""],["sound_set_22","SFX 3","With a hamper full of sounds, not sarnies",""],["romantique_divider*1","Rose Quartz Screen","Beauty lies within",""],["divider_silo3*9","Red Area Gate","Red Area Gate",""],["sofachair_silo*7","Green Area Armchair","Large, but worth it",""],["mode_cm_jan07_deal","Mode Bardesk Corner Multipack","5 bardesk corners",""],["poster 75","Mummy","Beware the curse...",""],["rare_elephant_statue*2","Bronze Elephant","Say hello to Nelly",""],["sporttrack2*1","Sport corner tartan","Let's get sporty!","Eight corner tartan tracks"],["deal_plant8","Small Cactus","","2 for free!"],["wallpaper 22","wallpaper","Wallpaper",""],["deal_bones_mega","Bones Mega Multipack","Fantastic 20% Saving!",""],["plant_valentinerose*3","Yellow Valentine's Rose","special pixel character","Special text - very special"],["plant_valentinerose*4","Pink Valentine's Rose","Be mine!",""],["glass_table*5","Candy Glass Table","Translucent beauty",""],["deal_uk_lava2","Lava Bundle","","HUGE Saving!"],["poster 76","Skeleton","Needs a few more Habburgers",""],["divider_silo1*6","Blue Area Corner Shelf","Tuck it away!",""],["table_silo_small*3","White Occasional Table","For those random moments",""],["sound_set_54","Oh Blinging Tree","Tune into Christmas",""],["deal_fair3","Habbos.net Bumper Cars","",""],["avatar_effect7","Butterflies","Not only in your stomach",""],["greek_corner","Greek Corner","Tuck it away!",""],["deal_camera_offer2","Paparazzi Pro Pack","Never miss that perfect shot.","This weekend only - 5 for price of 4!"],["rope_divider","Rope Divider","If your name's not down you're not coming in!",""],["deal10","Prince Charles Poster","Even walls have ears",""],["tiki_tray4","Tiki Pig Tray","Slow roastet pig head",""],["avatar_effect6","HRJP-3000","Habbo Rocket Jet Pack.",""],["eco_curtains1","Eco Curtain 1","Help keep the heat in",""],["romantique_tray1","Romantique Tray","Breakfast is served!",""],["rclr_garden","Water Garden","Self watering",""],["noob_rug_tradeable_6","starter rug","beginner set",""],["penguin_ski","XC Penguin","Aptenodytes Swish",""],["tree6","Flashy Christmas Tree","The future's bright!",""],["divider_nor2*2","Black Iced Bar-Desk","Soft but sturdy",""],["prizetrophy5*2","Duo trophy","Shiny silver",""],["scifiport*5","Security Fence"," Recovered from Roswell",""],["LT_pillar","Large Tribal Torch","Sacrificial flame",""],["pillar*9","Rock Pillar","Ancient and stately",""],["deal_christmas8","Mistletoe","Pucker up",""],["chair_plasty*8","Plastic Pod Chair","Hip plastic furniture",""],["prizetrophy*3","Classic trophy","Breathtaking bronze",""],["a0 clubplastos","HC chair","Aqua chair",""],["hwn_deal_8","Dead Tree","Creates a spooky scene!",""],["deal_arab4","Alhambra Deal 4","",""],["jp_sheet3","Kakejiku Hokusai","Japanese Kakejiku",""],["A1 D1P","Square Dining Table","Hip plastic furniture",""],["tray_cake","Wedding Cake","Share the love around",""],["couch_norja*6","Blue Bench","Two can perch comfortably",""],["rare_parasol*1","Yellow Parasol","Block those rays!",""],["hcc_sofachair","Reclining Chair","Put your feet up!",""],["exe_corner","Executive Corner Desk","Tuck it away",""],["croc_brown_deal","Croc Starter Pack (brown)","",""],["deal_uk_floor4b","Standard Tile","The floor is your canvas",""],["ads_mall_winspo","Mall Sports World Window","Whatever your sporting dibble, you'll find it here",""],["song_disk","Traxdisc","Burn, baby burn",""],["sound_set_53","Snowy Surprise","Break the icy silence",""],["a2 slp","Heart Stickies","Spread your love!",""],["jp_tray5","Sushi Tamago","Sushi made with egg",""],["diner_table_1*5","Beige Booth Table","Ready to order?",""],["penguin_icehockey","Hockey Penguin","Aptenodytes Gretzsky",""],["solarium_norja*9","Red Solarium","Rejuvenate your pixels!",""],["scifidoor*1","Pink Spaceship Door","There out of this world!",""],["shelves_basic","Pura Shelves","Pura series 404 shelves",""],["deal_uk_sfroller30","Sci Fi Roller","They work against gravity",""],["poster 20","Snowman Poster","A new use for carrots!",""],["summer_raft1","Pink Inflatable Raft","Ride the rapids in style",""],["deal_uk_wallie1","BBQ Set","",""],["sporttrack2*2","Sport corner asphalt","Let's get sporty!","Eight corner asphalt tracks"],["divider_nor5*5","Pink Iced Angle","Cool cornering for your crib y0!",""],["diner_gumvendor*9","Red Gum Machine","Fruity bubbly goodness!",""],["diner_gumvendor*10","Mint Gum Machine","Fruity bubbly goodness!",""],["divider_nor1*7","Rural Iced Corner","The missing piece",""],["barchair_silo*8","Yellow Bar Stool","Practical and convenient",""],["goodie1","Marzipan Man","Crunchy Dog Treat",""],["deal_arab5","Ornamental Urn","","Value Bundle: Voted most popular item!"],["mode_mm_jan07_deal","Mode Mixed Multipack","3 bardesks, 2 bardesk corners",""],["A1 D3P","Square Dining Table","Hip plastic furniture",""],["sound_set_28","Rock 2","Head for the pit!",""],["a0 stick1","Hockey Stick","Hockey Stick",""]] +[["bed_polyfon","Double Bed","Give yourself space to stretch out",""],["hween08_trll","Surgeon's Trolley","Chop, poke, ouch!",""],["party_tube_lava","Lava Lamp","Despite being made a lava, it is very cool.",""],["xmas08_lantern","Snowball Lantern Pile","No dodging this pile!",""],["deal_plant5","Fruit Tree","","Save 33%"],["christmas_reindeer","Reindeer","Prancer becomes Rudolph in a click!",""],["divider_nor5*9","Red Iced Angle","Cool cornering for your crib y0!",""],["a4 gothicsofa","Black Gothic Sofa","Ghosts and Ghouls",""],["ads_lin_wh_c","ads_lin_wh_c name","ads_lin_wh_c text",""],["ads_lin_wh_c2","ads_lin_wh_c2 name","ads_lin_wh_c2 text",""],["party_neon3","Neon Pink Flamingo","Celebrate the Eighties with this!",""],["poster 69","Jimmy Eat World poster","Don't eat this though!",""],["area_sp_jan07_deal","Area Starter Pack","Gate, corner and 2 screens",""],["divider_nor5*4","Urban Iced Angle","Cool cornering for your crib!",""],["noob_rug_tradeable_2","starter rug","beginner set",""],["noob_window_double","Double Window","Twice as good a view",""],["diner_cashreg*7","Green Register","Roll up roll up!",""],["carpet_standard","Floor Rug","Available in a variety of colours",""],["roomdimmer","Mood Light","Superior lighting for your room",""],["pura_mdl2*7","Green Pura Module 2","Any way you like it!",""],["waterbowl*5","Brown Water Bowl","Aqua unlimited",""],["bolly_palm","Palm Tree","Watch for falling coconuts!",""],["landscape 1","landscape","For the perfect urban hangout",""],["sofachair_silo*2","Black Armchair","Large, but worth it",""],["deal_icebc1","10,000 BC Bundle 1","",""],["12_Month_Subscription_6","Violet Laser Gate and 80 Credits","",""],["party_chair","High Class Bar Stool","Sit high and people watch on this!",""],["grunge_shelf","Grunge Bookshelf","Scrap books and photo albums",""],["black_mode_jan08_deal","Black Mode Bedroom Deal","Black Single and Double Mode Bed, Mode Bookcase",""],["jp_sheet2","Kakejiku Ninjya","Japanese Kakejiku",""],["exe_bardesk","Executive Bar Desk","Divide the profits!",""],["tiki_bardesk","Tiki Bar Desk","Serving up Summer",""],["divider_nor2*7","Rural Iced Bar","No way through",""],["party_neon1","Neon Right Arrows","Find your way right in the dark!",""],["hc_rllr","HC Roller","Highest class transportation",""],["arabian_tray3","Sweets Tray","Indulge yourself!",""],["one_way_door*6","Blue HC Gate","One way! The HC way!",""],["ads_cmusic","TBD Central Musical TV","TBD Click it away",""],["divider_nor4*8","Yellow Iced Auto Shutter","Habbos, roll out!",""],["china_table","Chinese Lacquer Table","Exotic and classy",""],["SF_crate_2","Large Crate","Pack all you want, we'll still travel light!",""],["fridge","Pura Refrigerator","Keep cool with a chilled snack or drink",""],["wallmirror","Wall Mirror","Mirror, mirror on the wall",""],["pura_mdl2*1","Aqua Pura Module 2","Any way you like it!",""],["glass_chair*6","Blue Glass Chair","Translucent beauty",""],["ads_711_3","ads_711","",""],["soft_sofachair_norja*7","Rural Iced Sofachair","Sit back and relax",""],["divider_silo1*3","White Corner Shelf","Neat and natty",""],["xmas08_storms5_deal","Snow Storm Deal x5","Buy 5 storms for the price of 3!",""],["sound_set_17","Groove 3","Jive's Alive!",""],["SF_panel2","Engineering Console","The computer says no",""],["sand_cstl_twr","Sand Castle Tower","Look out for sand storms!",""],["deal_uk_curtainyellow3","Yellow Curtain","Made with the finest materials",""],["wallpaper 8","wallpaper","Wallpaper",""],["a0 gothicfountain 2","Red Gothic Fountain","The life blood of Habbo",""],["pillar*7","Atlantean Pillar","Recovered from Habblantis",""],["arabian_wndw","Arabian Window Frame","Arabian days and nights",""],["A1 E3P","Chair","Hip plastic furniture",""],["rare_elephant_statue*1","Silver Elephant","Say hello to Nelly",""],["hween08_bed","Hospital Bed (blood)","You're in safe hands...",""],["ads_malaco_rug","Malaco Rug","",""],["divider_silo3*2","Black Area Gate","Form following function",""],["JUKKA","Yukka Plant","Easy to care for",""],["divider_nor1*8","Yellow Ice corner","Yellow Ice corner",""],["divider_poly3","Hatch (Lockable)","All bars should have one",""],["a0 deal107","Green Habbo Roller","The power of movement","2: 5 Green Habbo Rollers in a convenient Pack"],["scifidoor*10","Violet Starship Door","Awarded to honourary Space Cadets",""],["croc_yellow_deal","Croc Starter Pack (yellow)","",""],["ads_idol_carpet","Idol Carpet","With glamour and style",""],["tile_brown","Red Tile","Ideal for your downtown promenades & piazzas",""],["table_plasto_square*9","Occasional Table","Hip plastic furniture",""],["CF_5_coin_silver","Silver Coin","Worth 5 Credits",""],["igor_seat","Hump Massaging Chair","My Hump, My Hump, My Hump",""],["val_teddy*6","Blue Share Bear","The blue bear of happiness",""],["window_square","Glass Square Window","Create your own view!",""],["diner_bardesk*5","Beige Bar","Pull up a stool!",""],["lodge_dm_jan07_deal","Lodge Room Divider Multipack","5 room dividers",""],["grand_piano*2","Esmerald Piano Stool","Let the music begin",""],["rare_icecream_campaign","Rare icecream white","Basic model",""],["diner_bardesk_gate*2","Pink Gate","Working 9 to 5",""],["sporttrack3*3","Sport goal tartan","Let's get sporty!","Eight straight asphalt tracks"],["grand_piano*3","Sapphire Piano Stool","The pianist's preferred perch!",""],["scifiport*9","Violet Sci-Fi Port","Energy beams. No trespassers!",""],["lt_stone2","Tribal Stone Wall","Blocks from ancient ruins",""],["avatar_effect5","Torch","Light the dark corners of your existence.",""],["shelves_norja*9","Red Bookcase","For nic naks and art deco books",""],["hc_wall_lamp","Retro Wall Lamp","Tres chic!",""],["arabian_teamk","Tea Maker","Quench that desert thirst",""],["table_silo_med*2","Coffee Table","Wipe clean and unobtrusive",""],["hcc_minibar","Minibar","Cool look, cool drinks!",""],["deal_uk_hafta6","Sport Props","Time to get sporty!","Save 25%!"],["scifiport*7","Aqua Laser Gate","Impenetrable force field",""],["table_silo_med","Black Coffee Table","Wipe clean and unobtrusive",""],["summer_chair*9","Red Deck Chair","Got your sunglasses?",""],["xmas_snow","Snow Storm","Get lost in your own blizzard!",""],["rare_daffodil_rug","Petal Patch","A little bit of outdoors indoors..",""],["bump_road","Road","Get in the fast lane",""],["safe_silo*9","Red Safe Minibar","Totally shatter-proof!",""],["queue_tile1*1","Pink Habbo Roller","The power of movement",""],["sofachair_silo*4","Beige Area Armchair","Large, but worth it",""],["bump_signs","Road Signs","7 in 1 road sign.",""]] +[["pillow*3","Turquoise Satin Pillow","Puffy, soft and huge",""],["marquee*1","Pink marquee","It's both door and a shade!",""],["divider_nor4*7","Rural Iced Shutter","Habbos, roll out!",""],["table_plasto_square*14","Occasional Table","Hip plastic furniture",""],["window_diner2","Small Diner Window","Good grub, good view!","NEW Aug 08"],["goodie1*1","Marzipan Man","Crunchy Dog Treat",""],["a2 gothicchair","Golden Gothic Chair","The prince of Habbo",""],["rcandleset","Red Candle Plate","Simple but stylish",""],["deal_tile44","Star Tile","10% off the walk of fame!",""],["beige_mode_jan08_deal","Beige Mode Bedroom Deal","Beige Single and Double Mode Bed, Mode Bookcase",""],["deal_icebc","10,000 BC Bundle","",""],["A1 TUP","Dining Chair","Metallic seating experience",""],["lamp2_armas","Lodge Candle","Wax lyrical with some old-world charm",""],["deal_winter_blues1","Winter Blues Bundle 1","Blue BBQ, 2 Blue Deck Chairs and 2 Yukka Plants",""],["deal_uk_lcfloor6","Bensalem Floor Deal","Get a load more Floora!",""],["hal_grave","Haunted Grave","We're raising the dead!",""],["noob_set_6","Beginner Set 6","Beginner Furni Set 6",""],["scifidoor*2","Yellow Spaceship Door","There out of this world!",""],["DEV bed_budget5","Beige Pura Double Bed","King sized comfort!",""],["poster 73","Spiderweb","Not something you want to run into",""],["landscape 12","Landscape 12 - Space","landscape 12 desc",""],["goodie1*2","Marzipan Man","Crunchy Dog Treat",""],["statue","Cupid Statue","Watch out for those arrows!",""],["deal_uk_lcglassfloor","Bensalem Glass Floor Deal","Get more Glass in this top deal.",""],["A1 ANANAS","Pineapple Plant","Needs loving glances",""],["marquee*5","Graphite Marquee","It's both door and a shade!",""],["credits","Credits","",""],["sound_set_67","The trax of Tiki","Appease the great Habboa with party songs",""],["theatre_seat","Deluxe Theatre Chair","For Lazy boys and girls!",""],["summer_chair*2","Pink Deck Chair","Waterproof!",""],["tree1","Dead tree","Dead christmas tree",""],["carpet_polar","Faux-Fur Bear Rug","For cuddling up on",""],["ads_mall_coffeem","Quick Coffee Stop","Exclusively Mall coffee and free to boot!",""],["hc_tv","Mega TV Set","Forget plasma, go HC!",""],["habw_mirror","Habbowood Mirror","Star of the show!",""],["carpet_polar*3","Yellow Bear Rug","Snuggle up on a Funky bear rug...",""],["bed_budgetb_one","Plain Single Bed","All you need for a good night?s kip",""],["party_neon5","Neon Heart Light","I heart Neon!",""],["CFC_10_coin_bronze","Bronze Coin (China)","Worth 10 Credits",""],["divider_nor4","Plain Iced Auto Shutter","Habbos, roll out!",""],["table_silo_med*6","Blue Area Coffee Table","Gather everyone round",""],["deal_christmas7","Christmas Rubber Duck","A right Christmas quacker!",""],["table_norja_med*3","White Iced Table","For larger gatherings",""],["sound_machine","Sound Machine","creating fancy sounds",""],["poster 2008","Habbo Leap Day Poster","Once every four Habbo years!",""],["xmas08_trph2","Eco Friendly Penguin","Given to Eco friendly Habbo!",""],["window_grunge","Grunge Window","Don't get too close!",""],["deal_uk_grass9","Field Grass","Herding and grazing",""],["poster 511","The Dutch flag","The flag of The Netherlands",""],["divider_nor4*4","Urban Iced Shutter","Habbos, roll out!",""],["chair_silo*7","Green Area Dining Chair","Wooden dining chair",""],["noob_lamp_tradeable_6","starter lamp","beginner set",""],["pillar*8","Roman Pillar","All roads lead to Rome",""],["LT_skull","Skull","Tribal trophies",""],["lodge_cm_jan07_deal","Lodge Corner Multipack","5 corner plinths",""],["eco_table2","Eco Coffee Table 2","Recycled wood as standard",""],["ads_igor_flask","Glass Flask","Down the hatch!",""],["window_romantic_wide","Large Romantic Window","Heavenly scent of flowers",""],["bardesk_polyfon*4","Beige Mode Bardesk","Beige Mode Bardesk",""],["a0 deal104","Red Habbo Roller","The power of movement","2: 3 Red Habbo Rollers in a convenient Pack"],["scifirocket*8","Pluto Smoke Machine","From a space far, far away!",""],["valentinescreen","Holiday Romance","Peep through and smile!",""],["iced_sp_jan07_deal","Iced Starter Pack","Door, Corner and 2 Bar-desks",""],["jp_sheet1","Kakejiku Ziritsu","Japanese Kakejiku",""],["sandrug","Arabian Sand Patch","Your own empty wilderness",""],["CF_50_goldbar","Gold Bar","Worth 50 Credits",""],["chair_plasty*9","Plastic Pod Chair","Hip plastic furniture",""],["poster 505","The Maple Leaf","The Canadian flag",""],["12_Month_Subscription_7","Cherry Ice Cream Machine and 80 Credits","",""],["A1 B8P","Square Dining Table","Hip plastic furniture",""],["val_teddy*1","Grey Share Bear","The grey bear of affection",""],["diner_sofa_1*2","Pink Sofa 1","Soft leather in 50s design",""],["3_Month_Subscription_2","Rose Powered Fan and 80 Credits","",""],["chair_plasty*10","Plastic Pod Chair","Hip plastic furniture",""],["A1 PMP","Large Coffee Table","For larger gatherings",""],["divider_nor3*8","Yellow Iced gate","Yellow Iced gate",""],["summer_grill*3","Green Barbeque Grill","Plenty of steak on that barbie",""],["penguin_ballet","Ballerina Penguin","Aptenodytes Vaganova",""],["table_plasto_square*15","Occasional Table","Hip plastic furniture",""],["diner_sofa_2*8","Yellow Sofa 2","Soft leather in 50s design",""],["diner_table_1*6","Blue Booth Table","Ready to order?",""],["bench_lego","Team Bench","For your reserve players",""],["diner_bardesk_corner*2","Pink Corner","Now that's smooth...",""],["12_Month_Subscription_9","Industrial Turbine and 80 Credits","",""],["scifiport*0","Red Laser Door","Energy beams. No trespassers!",""],["diner_sofa_2*1","Aquamarine Sofa 2","Soft leather in 50s design",""],["diner_bardesk_corner*6","Blue Corner","Now that's smooth...",""],["sound_set_20","SFX 2","Musical heaven",""],["marquee*9","Green Marquee","Keep the mob out",""],["poster 50","Bat Poster","flap, flap, screech, screech...",""],["sofa_polyfon*3","White Two-seater Sofa","Comfort for stylish couples",""],["VALENTINE_07_01","Giant Heart","Full of love",""],["toilet_red","Loo Seat","Loo Seat",""],["goth_table","Gothic Table","A table with two heads",""],["romantique_divider*4","Amber Screen","Busy keeping things separated",""],["romantique_divider*5","Romantique Screen Gray","Keeping Things Separated",""],["A1 B2P","Square Dining Table","Hip plastic furniture",""],["a0 deal202","Sport track straight","Let's get sporty!",""],["noob_lamp*1","My first Habbo lamp","Get the light right where you want it (yellow)",""],["DEV bed_budget6","Blue Pura Double Bed","King sized comfort!",""],["menorah","Menorah","Light up your room",""]] +[["greektrophy*2","Greek trophy","Shiny silver",""],["habbowood_chair","Director's Chair","Exclusively for Directors",""],["bolly_wdw_wd","Bolly Window","Sets the scene",""],["sound_set_62","AlhambraTrax 1","Music of the Arabian night!",""],["chair_norja*7","Rural Chair","Sleek and chic for each cheek",""],["lc_stool","Wooden Stool","Watch out for splinters",""],["hrella_poster_2","Life Buoy","For those scary Lido moments",""],["one_way_door*4","Beige One Way Gate","One at a time!",""],["LT_pillar2","Small Tribal Torch","Light at the end of the jungle",""],["penguin_punk","Punk Penguin","Aptenodytes Rotter",""],["penguin_infected","Infected Penguin","Aptenodytes Bacterium",""],["plant_cruddy","Aloe Vera","Goodbye Bert...",""],["poster 64","The Habbo Babes 1","The Hotel's girlband. Dream on!",""],["chair_polyfon","Dining Chair","Dining Chair",""],["carpet_polar*2","Blue Bear Rug","Snuggle up on a Funky bear rug...",""],["xmas08_hottub","Hot Tub","Party time in the Arctic people!",""],["noob_chair*6","My first Habbo chair","Lightweight, practical with dark yellow stripes",""],["hologram","Holopod","As if by magic...",""],["aquamarine diner_cashreg*1","Aquamarine Register","Roll up roll up!",""],["plant_valentinerose*2","White Valentine's Rose","For the purest love","New item 2009!"],["pura_mdl2*4","White Pura Module 2","Any way you like it!",""],["plant_bonsai","Bonsai Tree","You can be sure it lives",""],["ads_frankb","Brain Lamp","Look after your brain - Talk To FRANK",""],["urban_sidewalk","Sidewalk","Don't step on a crack.",""],["urban_lamp","Street Lamp","Keeps a dark street brightly lit.",""],["urban_bin","Urban Trash Can","Street trash.",""],["urban_bench","Urban Bench","Watch out for gum before you sit.",""],["urban_carsofa","Taxi Sofa","Seats comfortably for crazy cab drives.",""],["urbanbsktbll_","Urban Basketball Hoop","Slam dunk!",""],["urban_fence","Urban Fence","Keeps trouble in or out.",""],["ads_gsArcade_1","Arcade Machine","Game over",""],["urban_wpost","Fire Hydrant","Sometimes used for putting out fires.",""],["urban_fence_corner","Urban Fence Corner","Keeps trouble in or out.",""],["urban_blocker","Road Block","Don't go any further.",""],["urban_bench_plain","Clean Bench","Nothing feels better than sitting on a clean bench.",""],["urban_wall","Urban Wall","Great for graffiti art.",""],["penguin_ninja","Ninja Penguin","Aptenodytes Hamburger",""],["bed_armas_two","Double Bed","King-sized pine comfort",""],["a0 deal117","Black Habbo Roller","The power of movement","2: 5 Black Habbo Rollers in a convenient Pack"],["noob_chair_tradeable_5","starter chair","beginner chair",""],["queue_tile1*5","Black Habbo Roller","The power of movement",""],["chair_silo*8","Yellow Dining Chair","Keep it simple",""],["noob_set_1","Beginner Set 1","Beginner Furni Set 1",""],["noticeboard","noticeboard name","noticeboard desc",""],["SF_chair_green","Space Cadet Chair","Welcome aboard, rookie",""],["traffic_light*1","Classic Traffic Light","Chill and wait your turn!",""],["sofachair_polyfon*3","White Armchair","Loft-style comfort",""],["deal_xmasday","Christmas Day Bundle","Xmas Day in a box!",""],["deal_uk_pillar","Large Tribal Torch","","Large saving!"],["chair_plasty*11","Plastic Pod Chair","Hip plastic furniture",""],["trax_sound_jan08_deal","Habbo Sounds Deal","Many sounds of Habbo","Save 25%"],["SF_floor_2","Starship Floor 2","Dec out the decks!",""],["sf_wall2","Starship Wall","Keeping space out since 1969",""],["pura_mdl4*3","Black Pura Module 4","Any way you like it!",""],["arabian_tile","Arabian Tile","Step in style...",""],["arabian_wall","Arabian Wall","A wall built with class.",""],["ads_clwall1","Idea Agency Plasma 1","ChildLine",""],["hc_roller_deal","HC Roller","Highest class transportation","Club gift, not for sale!"],["arabian_snake","Ornamental Urn","Beware the snake!",""],["door","Telephone Box","Dr Who?",""],["bolly_drapea","Pink Curtain","Made with the finest materials",""],["romantique_pianochair*5","Onyx Chair","What does this button do?",""],["deal_dancefloor9_neon","Dance Floor Mega Deal","30 Credits gets you 9 Dance Floor pieces!",""],["exe_map","World Map","World domination imminent",""],["tray_champagne","Champagne Bucket","Poised and ready to pop",""],["calippo","Calippo icecream machine","Basic model",""],["jp_table","Chabu Dai","Japanese coffee table",""],["diner_cashreg*8","Yellow Register","Roll up roll up!",""],["traxsilver","traxsilver","",""],["marquee*7","Purple Marquee","It's both door and a shade!",""],["poster 44","Mummy","Beware the curse...",""],["a0 deal113","Gold Habbo Roller","The power of movement","2: 5 Gold Habbo Rollers in a convenient Pack"],["pura_mdl5*9","Red Pura Module 5","Any way you like it!",""],["barchair_silo*6","Blue Bar Stool","Take a perch!",""],["bardeskcorner_polyfon*3","White Corner Desk","Tuck it away",""],["bed_polyfon_one*8","Yellow Mode Single Bed","Yellow Mode Single Bed",""],["divider_silo3*3","White Area Gate","Form following function",""],["A1 D7P","Square Dining Table","Hip plastic furniture",""],["env_tree4","The Four Seasons Tree","Crank up some Vivaldi & give your mate a gift.",""],["diner_gumvendor*6","Green Gum Machine","Fruity bubbly goodness!",""],["toilet_yell","Loo Seat","Loo Seat",""],["sw_table","Adventure Desk","Where will you go today?",""],["deal_trax4","Trax Pack: Urban","Sounds of the streets of bobba",""],["diner_table_1*9","Red Booth Table","Ready to order?",""],["diner_table_1*10","Mint Booth Table","Ready to order?",""],["hcc_table","Glass Table","Elegant centre piece",""],["sofa_silo*3","White Two-Seater Sofa","Cushioned, understated comfort",""],["pura_mdl1*9","Red Pura Module 1","Any way you like it!",""],["deal_lantern1","Lantern Bundle 1","10 lanterns for the price of 4!",""],["sound_set_31","Dance 3","House loops",""],["a2 juliste 83","Hoot Poster","The eyes follow you...",""],["table_plasto_round","Occasional Table","Hip plastic furniture",""],["xmas08_chair","Ice chair","Make sure you wear trousers!",""],["divider_nor1*2","Black Iced Corner","Tuck it away",""],["rare_icecream*9","Bubblegum Ice Cream Machine","Virtual bubblegum rocks!",""],["soft_sofa_norja*7","Rural Iced Sofa","Sit back and relax",""],["plant_sunflower","Cut Sunflower","For happy Habbos",""],["divider_nor2*4","Urban Iced Bar","No way through",""],["deal_cabbage","Cabbage Mega Multipack","Fantastic 20% Saving!",""],["rare_dragonlamp*5","Elf Green Dragon Lamp","Roast your chestnuts here!",""],["sofachair_silo*8","Yellow Armchair","Large, but worth it",""]] +[["deal_tile22","Marble Tile","Slick sophistication; now 10% off!",""],["deal_dogfood","Doggy Bones","Fantastic 20% Saving!",""],["djesko_turntable","Habbo Turntable","For the music-lovers",""],["summer_icebox","summer_icebox","",""],["rare_dragonlamp*2","Jade Dragon Lamp","Oriental beast of legends",""],["romantique_divider*2","Sapphire Screen","Divided lovers never had it so good!",""],["trax_effect_jan08_deal","Sound Effects Deal","SFX bundle","Save 24%"],["fireplace_armas","Fireplace","Authentic, real flame fire",""],["divider_silo3*4","Beige Area Gate","Beige Area Gate",""],["rare_dragonlamp*4","Black Dragon Lamp","Scary and scorching!",""],["doormat_plain*3","Doormat","Available in a variety of colours",""],["A1 C6P","Round Dining Table","Hip plastic furniture",""],["sound_machine_monster_deal","Sound Machine Monster Deal","Purple Traxmachine, plus Moshy Metal",""],["birdie","Pop-up Egg","Cheep (!) and cheerful",""],["deal_uk_pillow5","Star Pillow","Don't forget to make a wish!",""],["noob_set_3","Beginner Set 3","Beginner Furni Set 3",""],["a1 gothicstool","Gothic Stool","The dark side of Habbo",""],["mocchamaster","Mochamaster","Wake up and smell it!",""],["poster 2006","DJ Throne","He is the magic Habbo",""],["trax_club2_jan08_deal","Club Deal","Dancefloor burners!","Save 25%"],["xmas08_geysir","Geyser","Nothing quite like a warm exploding water hole!",""],["poster 43","Chains","Shake, rattle and roll",""],["easterduck","Wannabe bunny","Can you tell what it is yet?",""],["glass_sofa*8","Yellow Glass Sofa","Double glazed",""],["marquee*3","Aqua Marquee","It's both door and a shade!",""],["deal_uk_hafta2","Food Props","What will your stars feast on?","Two free plates!"],["deal_club_furni1","Chilled Bling","",""],["bed_polyfon_one*3","White Single Bed","Cot of the artistic",""],["rare_stand","Speaker's Corner","Stand and Deliver!",""],["trax_dance_jan08_deal","Dance Deal","Ready for the launch?","Save over 25%"],["wooden_screen*1","Pink Oriental screen","Add an exotic touch to your room",""],["poster 63","Scamme'd","Habbo-punk for the never-agreeing",""],["table_norja_med*7","Rural Iced Coffee Table","For larger gatherings",""],["exe_chair","Executive Sofa Chair","Relaxing leather comfort",""],["deal_window_small","Glass Square Window","Create your own view!","Half price windows!"],["sound_set_24","Habbo Sounds 4","It's all about the Pentiums, baby!",""],["summer_chair*7","Green Deck Chair","Reserved!",""],["ads_cltele","Idea Agency Teleporter","Whatever your Idea, it's better out than in.",""],["club_sofa","Club sofa","Club sofa",""],["hcamme","Tubmaster","Time for a soak",""],["pillow*4","Gold Feather Pillow","Puffy, soft and elegant",""],["cn_sofa","Chinese Sofa","Seats three with ease!",""],["bed_polyfon_one*6","Blue Mode Single Bed","Blue Mode Single Bed",""],["noob_lamp_tradeable_1","starter lamp","beginner set",""],["gothgate","Gothic Portcullis","Don't get caught beneath!",""],["bolly_lotus_pool","Lotus Pool","Giant passionate flower",""],["tree2","Dead Tree","Creates a spooky scene!",""],["diner_bardesk*6","Blue Bar","Pull up a stool!",""],["skullcandle","Skull Candle Holder","Alas poor Yorrick...",""],["md_limukaappi","Habbo Cola Machine","Proud sponsor of Habbo Football 2006",""],["sw_raven","Raven","Lurking... with intent",""],["sound_set_39","Rock 7","Rock with a roll",""],["noob_chair*2","My first Habbo chair","Lightweight, practical, with dark blue stripes",""],["poster 14","Fox Poster","A cunning painting",""],["deal_fair1","YourHabbo.co.uk Bumper Cars","",""],["rare_parasol*3","Violet Parasol","Block those rays!",""],["val_teddy*3","Green Share Bear","The green bear of friendship ",""],["deal_tile3","20 Mixed Tiles","Bundled for your convenience",""],["waterbowl*2","Green Water Bowl","Aqua unlimited",""],["rare_parasol*0","Green Parasol","Sun! Sun! Sun!",""],["divider_nor1","Ice Corner","Looks squishy, but isn't",""],["diner_table_1*8","Yellow Booth Table","Ready to order?",""],["exe_artlamp","Sphere Lamp","Suitable for budding entrepreneurs",""],["pura_mdl3*1","Aqua Pura Module 3","Any way you like it!",""],["country corner","Country Ditch Corner","Channel your irrigation",""],["deal_uk_lcplants","Bensalem Plant Deal","Flora, Fauna and all those plant you wanna!",""],["poster 34","Scamme´d poster","punk as a duck",""],["diner_walltable","Diner Side Table","Attaches to the wall",""],["pura_mdl5*4","White Pura Module 5","Any way you like it!",""],["deal_uk_petal5","Petal Flurry","Lay down a bed of roses",""],["noob_stool*3","My first Habbo stool","Unfold me and take the weight off (aubergine)",""],["wcandle","White Candle","Xmas tea light",""],["CF_10_coin_gold","Gold Coin","Worth 10 Credits",""],["divider_silo1*9","Red Area Corner Shelf","Tuck it away",""],["sound_set_26","Groove 1","Bollywood Beats!",""],["carpet_standard*a","Floor Rug","Available in a variety of colours",""],["doormat_plain*4","Doormat","Available in a variety of colours",""],["grunge_barrel","Flaming Barrel","Beacon of light!",""],["diner_sofa_1*3","Black Sofa 1","Soft leather in 50s design",""],["carpet_armas","Hand-Woven Rug","Adds instant warmth",""],["toy1*1","Rubber Ball","it's bouncy-tastic",""],["avatar_effect21","RebelMobile effect","Rebel without a cause.",""],["hween08_curtain","Hospital Curtain (blood)","Doctors at work",""],["plant_big_cactus","Mature Cactus","Habbo Dreams monster in hiding! Shhhh",""],["safe_silo*5","Pink Safe Minibar","Totally shatter-proof!",""],["poster 23","Santa Poster","The jolly fat man himself",""],["table_plasto_round*1","Occasional Table","Hip plastic furniture",""],["deal_blocksSMALL_neon","Small Blocks Deal","Get 10 blocks for 18 credits!",""],["petfood4","T-Bones","For the croc!",""],["noob_lamp*2","My first Habbo lamp","Get the light right where you want it (dark blue)",""],["12_Month_Subscription_12","Monster Plant and 80 Credits","",""],["tree3","Christmas Tree 1","Any presents under it yet?",""],["rare_dragonlamp*8","Bronze Dragon Lamp","Scary and scorching!",""],["DEV chair_basic9","Red Pura Egg Chair","It's a cracking design!",""],["poster 10","Lapland Poster","Beautiful sunset",""],["ads_dave_cns","Dave cns","Meet Dave in cinemas July 18th",""],["plant_bulrush","Bulrush","","Save 33%"],["divider_poly3*6","Blue Mode Bardesk Gate","Blue Mode Bardesk Gate",""],["deal_uk_bughill","Ant Hill","","Save 25%"],["red_pura_jan08_deal","Red Pura Bedroom Deal","Red Single and Double Pura Bed, Pura Lamp",""],["rare_parasol*2","Orange Parasol","Block those rays!",""]] +[["gothic_sofa*1","Gothic Sofa Pink","The dark side of Habbo",""],["gothic_sofa*2","Gothic Sofa Saffron","The dark side of Habbo",""],["gothic_sofa*3","Gothic Sofa Red","The dark side of Habbo",""],["gothic_sofa*4","Black Gothic Sofa","The dark side of Habbo",""],["gothic_sofa*5","Gothic Sofa Green","The dark side of Habbo",""],["gothic_sofa*6","Gothic Sofa Blue","The dark side of Habbo",""],["sf_tele","Futuristic Teleport","Beam me up!",""],["poster 37","The Habbo Babes 3","The Hotels girlband. Dream on!",""],["table_polyfon","Large Coffee Table","For larger gatherings",""],["penguin_swim","Summer Penguin","Aptenodytes Buubar",""],["doormat_plain*5","Doormat","Available in a variety of colours",""],["bardesk_polyfon*9","Red Bardesk","Perfect for work or play",""],["traxgold","traxgold","",""],["diner_chair*5","Beige Stool","Perch in comfort",""],["deal_christmas6","Tinsel (silver)","A touch of festive sparkle",""],["divider_nor1*5","Pink Ice corner","Pink Ice corner",""],["jp_lantern","Japanese Lantern","For a mellow Eastern glow",""],["glass_table*4","Glass table","Translucent beauty",""],["divider_silo1*4","Beige Area Corner Shelf","Beige Area Corner Shelf",""],["pura_mdl1*1","Aqua Pura Module 1","Any way you like it!",""],["deal_uk_hafta3","Dressing Room","Treat your stars in style","Special Offer!"],["glass_stool*9","Habbowood Glass Stool","For laid back stunt men",""],["scifiport*3","Jade Sci-Fi Port","Energy beams. No trespassers!",""],["A1 B4P","Round Dining Table","Hip plastic furniture",""],["turkey","Roast Turkey","Where's the cranberry sauce?",""],["hc_crpt","Persian Carpet","Ultimate craftsmanship",""],["sound_set_12","Habbo Sounds 2","Unusual as Standard",""],["rubberchair*8","Black Inflatable Chair","Soft and tearproof for HC!",""],["soft_sofa_norja*3","White Iced Sofa","Pristine white, keep it clean!",""],["noob_chair*5","My first Habbo chair","Lightweight, practical, with pink stripes",""],["barchair_silo*9","Red Bar Stool","Practical and convenient",""],["DEV chair_basic3","Black Pura Egg Chair","It's a cracking design!",""],["ads_idol_audChr","American Idol Audience Chair","Fancy seating for your audience!",""],["wallpaper 1","wallpaper","Wallpaper",""],["deadduck","Dead Duck","Blood, but no guts",""],["table_plasto_round*2","Occasional Table","Hip plastic furniture",""],["table_plasto_round*3","Occasional Table","Hip plastic furniture",""],["divider_silo3*6","Blue Area Gate","Door (lockable)",""],["tiki_tray2","Tiki Pineapple Plate","Fresh and juicy!",""],["solarium_norja*8","Yellow Solarium","Rejuvenate your pixels!",""],["bath","Bubble Bath","The ultimate in pampering",""],["corner_china","Dragon Screen Corner","Firm, fireproof foundation",""],["green_pura_jan08_deal","Green Pura Bedroom Deal","Green Single and Double Pura Bed, Pura Lamp",""],["scifiport*8","Purple Sci-Fi Port","Energy beams. No trespassers!",""],["pillow*7","Purple Velvet Pillow","Bonnie's pillow of choice!",""],["deal_crocfud","T-Bones","For the croc!",""],["pillar*3","blue pillar","Ancient and stately",""],["sound_set_34","Rock 5","For guitar heroes",""],["trax_groove_jan08_deal","Disco / Groove Deal","Step into the groove!","Save 25%"],["doormat_plain*6","Doormat","Available in a variety of colours",""],["carpet_soft*2","Soft Wool Rug","Soft Wool Rug",""],["deal_uk_hafta5","Musical Props","Let's make some noise","Half price Piano!"],["exe_cubelight","Cubist Light","Lights up a square",""],["sound_set_61","Latin Love 3","Straight from the heart",""],["lt_bughill","Ant Hill","Working 9 to 5",""],["country_wheat","Country Wheat","Right on the brink harvest",""],["country_corner","Country Ditch Corner","Channel your irrigation",""],["country_ditch","Country Ditch","Irrigation to irritation in one wrong step",""],["a1 newpl4lg1","HC table","Aqua table",""],["sound_set_16","Hip Hop Beats 3","Ferry, ferry good!",""],["dog_green_deal","Dog Starter Pack (green)","",""],["ads_igorswitch","Igor Switch","Nothing will work without this being on!",""],["gothicfountain","Gothic Ectoplasm Fountain","Not suitable for drinking!",""],["sofachair_polyfon*7","Green Armchair","Loft-style comfort",""],["bump_road_deal10","Road Deal 10","Get in the fast lane",""],["traffic_light*3","Purple Traffic Light","Chill and wait your turn!",""],["jp_tray6","Sushi Kohada","Sushi made with mackerel",""],["diner_sofa_2*7","Green Sofa 2","Soft leather in 50s design",""],["carpet_soft*3","Soft Wool Rug","Soft Wool Rug",""],["ads_clfloor","Childline Rug","Keep your feet warm with the Idea Agency rug",""],["wallpaper 17","wallpaper","Wallpaper",""],["exe_drinks","Executive Drinks Tray","Give a warm welcome",""],["sound_machine2","Ocean Traxmachine","Dance to the Habbo Club beat!",""],["sound_set_25","Dance 1","Actually, it's Partay!",""],["beige_pura_jan08_deal","Beige Pura Bedroom Deal","Beige Single and Double Pura Bed, Pura Lamp",""],["bed_polyfon*3","White Double Bed","Give yourself space to stretch out",""],["totem_leg","Totem Leg","1/3 of Totem",""],["poster 2007","The Father Of Habbo","The legendary founder of the Hotel",""],["sound_machine3","Green Traxmachine","Top the Habbo Charts!",""],["poster 509","The Jamaican flag","The flag of Jamaica",""],["sound_set_51","Club 6","Bop to the beat",""],["transparent_floor","transparent_floor name","transparent_floor desc",""],["party_djtable","DJ Table","Scratch it, spin it and play some banging tracks!",""],["cat_green_deal","Cat Starter Pack (green)","",""],["iced_mm_jan07_deal","Iced Mixed Multipack","3 bar-desks, 2 corners",""],["trax_rock1_jan08_deal","Rock Deal","Rock with a roll!","Save 25%"],["ads_mall_wincin","Mall Cinema Window","What movies are playing in the big silver screen?",""],["sofachair_silo*9","Red Area Armchair","Large, but worth it",""],["scifidoor*7","Aqua Spaceship Door","They're out of this world!",""],["deal_trax0","Traxmachine","Trax starter pack",""],["A1 C1P","Round Dining Table","Hip plastic furniture",""],["deal_eas07_3","Easter Flowers Deal","Let the Spring in this Easter",""],["carpet_soft*4","Soft Wool Rug","Soft Wool Rug",""],["diner_cashreg*5","Beige Register","Roll up roll up!",""],["deal_uk_scififloor10c","Starship Floor 2","Dec out the decks!",""],["sound_set_33","Rock 3","Guitar solo set",""],["eco_chair3","Eco Stool 3","Black and white skull design",""],["deal_uk_forestwall","Forest Poster Deal","Get 5 forest posters at a discounted price",""],["poster 13","BW Skyline Poster","Arty black and white",""],["rubberchair*5","Lime Inflatable Chair","Soft and tearproof!",""],["poster 8","Habbo Colours","Habbos come in all colours",""]] +[["poster 2","Carrot Plaque","Take pride in your veg!",""],["bump_road_deal20","Road Deal 20","Get in the fast lane",""],["divider_nor4*6","Blue Iced Auto Shutter","Habbos, roll out!",""],["table_plasto_round*4","Occasional Table","Hip plastic furniture",""],["table_plasto_round*5","Occasional Table","Hip plastic furniture",""],["table_plasto_round*6","Occasional Table","Hip plastic furniture",""],["table_plasto_round*7","Occasional Table","Hip plastic furniture",""],["table_plasto_round*8","Occasional Table","Hip plastic furniture",""],["table_plasto_round*9","Occasional Table","Hip plastic furniture",""],["table_plasto_round*14","Occasional Table","Hip plastic furniture",""],["table_plasto_round*15","Occasional Table","Hip plastic furniture",""],["table_plasto_bigsquare","Occasional Table","Hip plastic furniture",""],["table_plasto_bigsquare*1","Occasional Table","Hip plastic furniture",""],["table_plasto_bigsquare*2","Occasional Table","Hip plastic furniture",""],["table_plasto_bigsquare*3","Occasional Table","Hip plastic furniture",""],["table_plasto_bigsquare*4","Occasional Table","Hip plastic furniture",""],["table_plasto_bigsquare*5","Occasional Table","Hip plastic furniture",""],["table_plasto_bigsquare*6","Occasional Table","Hip plastic furniture",""],["table_plasto_bigsquare*7","Occasional Table","Hip plastic furniture",""],["table_plasto_bigsquare*8","Occasional Table","Hip plastic furniture",""],["table_plasto_bigsquare*9","Occasional Table","Hip plastic furniture",""],["table_plasto_bigsquare*14","Occasional Table","Hip plastic furniture",""],["table_plasto_bigsquare*15","Occasional Table","Hip plastic furniture",""],["poster 517","The Scottish flag","Where's your kilt?",""],["deal_uk_curtaingreen3","Green Curtain","Made with the finest materials",""],["lblue_pura_jan08_deal","Light Blue Pura Bedroom Deal","Light Blue Single and Double Pura Bed, Pura Lamp",""],["table_armas","Dining Table","For informal dining",""],["grand_piano*5","Onyx Piano Stool","I can feel air coming through...",""],["tiki_waterfall","Tiki Waterfall","Fresh mountain water",""],["sound_set_7","SFX 5","Sound effects for Furni",""],["poster 32","Shiva Poster","The Auspicious One",""],["tiki_sand","Island Sand Patch","Life's a beach!",""],["bar_polyfon","Mini-Bar","You naughty Habbo!",""],["sofachair_polyfon*6","Blue Mode Armchair","Blue Mode Armchair",""],["lc_chair","Wooden Chair","No rusty nails, in sight",""],["ads_cl_sofa","Idea Agency Sofa","Take a load off - both your feet and mind!",""],["diner_bardesk*1","Aquamarine Bar","Pull up a stool!",""],["deal_tile33","40 Mixed Tiles","Now with 10% off!",""],["CFC_100_coin_gold","Gold Coin (China)","Worth 100 Credits",""],["sand_cstl_gate","Sand Castle Gate","Keep the sand out!",""],["penguin_hunchback","Beautiful Penguin","Aptenodytes Narcissus",""],["glass_table*8","Yellow Glass Table","Translucent beauty",""],["footylamp","Football Lamp","Can you kick it?",""],["hyacinth2","Blue Hyacinth","Beautiful bulb",""],["area_mm_jan07_deal","Area Mixed Bundle","3 screens, 2 corner shelves",""],["avatar_effect8","Fireflies","Light my fire",""],["prizetrophy3*3","Globe trophy","Breathtaking bronze",""],["diner_sofa_1*9","Red Sofa 1","Soft leather in 50s design",""],["diner_sofa_1*10","Mint Sofa 1","Soft leather in 50s design",""],["A1 D4P","Square Dining Table","Hip plastic furniture",""],["table_silo_med*3","White Coffee Table","Wipe clean and unobtrusive",""],["noob_lamp_tradeable_2","starter lamp","beginner set",""],["poster 1005","Johnny Squabble","The muscly movie hero","Straight from the Habbowood set!"],["trax_hiphop_jan08_deal","Hip Hop Deal","Hip Hop beats","Save 24%"],["diner_cashreg*6","Blue Register","Roll up roll up!",""],["a0 deal112","Gold Habbo Roller","The power of movement","2: 3 Gold Habbo Rollers in a convenient Pack"],["pillow*9","Green Wooly Pillow","Puffy, soft and VERY fluffy!",""],["plant_yukka","Yukka Plant","","Save 33%"],["xmas_icelamp","Ice Block Lantern","Light up the winter nights",""],["hc_rntgn","X-Ray Divider","Believe it or not!",""],["deal_holly1","Holly Bundle 1","Deck the halls!","Super Saver Bundle!"],["hc_frplc","Heavy Duty Fireplace","Pixel-powered for maximum heating",""],["penguin_clown","Clown Penguin","Aptenodytes Pennywise",""],["noob_chair*3","My first Habbo chair","Lightweight, practical, with red stripes",""],["party_tray","Club Tray","Rest your drinks on this!",""],["A1 D2P","Square Dining Table","Hip plastic furniture",""],["bolly_swing","Swing","Swing low, my sweet.",""],["rare_fountain*3","Bird Bath (blue)","For our feathered friends",""],["poster 15","Himalayas Poster","Marvellous mountains",""],["A2 3000rpm","Habbo Turntable","For the retro music-lover",""],["petfood3","Cabbage","Health food for pets",""],["diner_bardesk_corner*8","Yellow Corner","Now that's smooth...",""],["landscape 11","Landscape 11 - Audience","landscape 11 desc",""],["poster 5","Duck Poster","Quacking good design!",""],["ads_idol_piano","American Idol Piano","Write a beautiful ballad for the performance of your life!",""],["wallpaper 11","wallpaper","Wallpaper",""],["shelves_armas","Bookcase","For all those fire-side stories",""],["wallpaper 10","wallpaper","Wallpaper",""],["bolly_tree","Palm Tree","Bollywood meets Hollywood",""],["val_randomizer","Love Randomiser","Surprise surprise! (Cilla Black not included)","We love it!"],["poster 38","Smiling Headbangerz","For really TOUGH Habbos!",""],["rare_icecream*2","Pistachio Ice Cream Machine","Virtual pistachio rocks!",""],["HW_stickerwarchild","War Child","Show your support for peace with this sticker!",""],["noob_chair*4","My first Habbo chair","Lightweight, practical, with light blue stripes",""],["LT_throne","Tribal Seat","Are you the chosen one?",""],["divider_nor3*6","Blue Iced gate","Blue Iced gate",""],["deal_eas07_2","Egg-tastic Deal","Easter goodness, in a box!",""],["divider_nor1*3","White Iced Corner","Looks squishy, but isn't!",""],["rubberchair*7","White Inflatable Chair","Soft and tearproof!",""],["scifiport*4","Pink Sci-Fi Port","Energy beams. No trespassers!",""],["pura_mdl1*3","Black Pura Module 1","Any way you like it!",""],["diner_gumvendor*5","Beige Gum Machine","Fruity bubbly goodness!",""],["noob_chair_tradeable_4","starter chair","beginner set",""],["pura_mdl2*3","Black Pura Module 2","Any way you like it!",""],["divider_nor3*9","Red Iced gate","Red Iced gate",""],["rare_parasol","Green Parasol","Block those rays!",""],["sofa_polyfon*6","Blue Mode Sofa","Blue Mode Sofa",""],["DEV chair_basic5","Beige Pura Egg Chair","Not just the shape of an egg...",""],["lt_wall","Lost Tribe Stone Wall","I wonder if this wall is safe to climb?",""],["poster 507","The French Tricolore","The French flag",""],["pura_mdl1*2","Pink Pura Module 1","Any way you like it!",""]] +[["sound_set_38","Rock 6","Rock and Roses!",""],["sound_set_50","Club 5","The harder generation",""],["deal_tikirug","Jungle Patch Bundle","",""],["lamp_armas","Table Lamp","Ambient lighting is essential",""],["hwn_deal_5","Dead Duck","","6 ducks total - image is wrong."],["lc_crab1","Crab Patch","Careful where you put your feet!",""],["a2 sportgoal asphalt","Sport goal asphalt","Let's get sporty!",""],["diner_sofa_1*4","White Sofa 1","Soft leather in 50s design",""],["gothiccandelabra","Gothic Candelabra","Through darkness came light",""],["sf_window","Starship Window","It'll put stars in your eyes",""],["hween08_sink","Blood Sink","Nasty shaving accident?",""],["a0 deal105","Blue Habbo Roller","The power of movement","2: 5 Blue Habbo Rollers in a convenient Pack"],["a1 newplch1","HC chair","Aqua chair",""],["A1 B5P","Square Dining Table","Hip plastic furniture",""],["rare_globe","Snow Globe","It's all white..",""],["hrella_poster_1","Porthole","Brighten up your cabin",""],["bolly_drapec","Yellow Curtain","Made with the finest materials",""],["romantique_divan*5","Onyx Chaise-Longue","Is that a cape hanging there?",""],["lostc_merdragon","Leviathan","1/6 - January 2009",""],["DEV bed_budget_one6","Blue Pura Bed","Prince sized comfort!",""],["poster 9","Rainforest Poster","Do your bit for the environment",""],["deal_fair6","Habbucks.com Ghost Train","",""],["sound_set_37","Habbowood Traxpack","Blockbuster hits!",""],["divider_poly3*9","Red Hatch","Border Control!",""],["soft_sofa_norja*4","Urban Iced Sofa","Sit back and relax",""],["candy_mm_jan07_deal","Candy Mixed Multipack","3 bars, 2 corners",""],["tiki_toucan","Toucan","Ermm... *pecks*",""],["deal_fair4","HabboHarmony.net Tea Cups","",""],["window_double_default","Double Window","It all started with a window..",""],["exe_elevator","Elevator Teleport","Going up or down in style!",""],["ktchn_pots","Hanging Pot Rack","Watch your head!",""],["ktchn_dvdr","Kitchel Wall Divider","A contemporary backsplash for any kitchen",""],["ktchn_light","Kitchen Light","The perfect lighting fixture to prep your food",""],["ktchn_countr_2","Kitchen Counter Large","Vibrant and shiny.",""],["ktchn_cornr","Kitchen Wall Divider Corner","A contemporary backsplash for any kitchen",""],["ktchn_gate","Kitchen Swinging Door","Easy to open and close during a bustling service.",""],["ktchn_knives","Magnetic Knife Holder","Keeps your knives organized.",""],["ktchn_plates","Dinner Plates","Who didn't finish their dinner?",""],["ktchn_oven","Kitchen Oven","Bake me a pie!",""],["ktchn_wall","Kitchen Wall","A contemporary backsplash for any kitchen",""],["ktchn_countr_1","Kitchen Counter Small","Vibrant and shiny.",""],["ktchn_sink","Industrial Sink","Always full of dirty dishes.",""],["ktchn_desk","Kitchen Work Table","Sanitary for prepping those delicate deserts.",""],["ktchn_fridge","Kitchen Fridge","Keeps it all cold.",""],["ktchn_inspctr","Kitchen Inspector","This kitchen needs a serious inspection",""],["ktchn_hlthNut","The Health Nut","Run...run.....RUN! I'm running!!!",""],["ktchn_stove","Industrial Stove","Keeps it simmering",""],["ktchn_bBlock","Butcher's Block","Sanitary for chopping any kind of food",""],["ktchn_trash","Trash Can","Smelly if you don't empty it.",""],["bw_croc","Inflatable Croc","Never smile at a Crocodile.",""],["holo_dragon","Holo Dragon","Dragon Hologram",""],["xm09_man_a","Snowman legs","What can you build?",""],["xm09_man_b","Snowman middle","What can you build?",""],["xm09_man_c","Snowman head","What can you build?",""],["xm09_forestwall","Snow Forest Wall","Covered in snow...",""],["xm09_lodgewall","Lodge Wall","Keep the heat in and the cold out",""],["xm09_bauble_1","Red Bauble","Perfect for a tree",""],["xm09_bauble_2","Blue Bauble","Perfect for a tree",""],["xm09_bauble_3","Green Bauble","Perfect for a tree",""],["xm09_bauble_4","Yellow Bauble","Perfect for a tree",""],["xm09_bauble_5","White Bauble","Perfect for a tree",""],["xm09_bauble_6","Red Striped Bauble","Perfect for the tree",""],["xm09_bauble_7","Blue Striped Bauble","Perfect for the tree",""],["xm09_bauble_8","Green Striped Bauble","Perfect for the tree",""],["xm09_bauble_9","Yellow Striped Bauble","Perfect for the tree",""],["xm09_bauble_10","White Striped Bauble","Perfect for the tree",""],["xm09_bauble_11","Tall Red Bauble","Perfect for the tree",""],["xm09_bauble_12","Tall Blue Bauble","Perfect for the tree",""],["xm09_bauble_13","Tall Green Bauble","Perfect for the tree",""],["xm09_bauble_14","Tall Yellow Bauble","Perfect for the tree",""],["xm09_bauble_15","Tall White Bauble","Perfect for the tree",""],["xm09_bauble_16","Purple Green Bauble","Perfect for the tree",""],["xm09_bauble_17","Tall Red Striped Bauble","Perfect for the tree",""],["xm09_bauble_18","White Dot Bauble","Perfect for the tree",""],["xm09_bauble_19","Tall Blue Striped Bauble","Perfect for the tree",""],["xm09_bauble_20","Tall Yellow Striped Bauble","Perfect for the tree",""],["xm09_bauble_21","Green White Bauble","Perfect for the tree",""],["xm09_bauble_22","Red Heart Bauble","To hang on your tree",""],["xm09_bauble_23","Blue Heart Bauble","To hang on your tree",""],["xm09_bauble_24","Green Heart Bauble","To hang on your tree",""],["xm09_bauble_25","Yellow Heart Bauble","To hang on your tree",""],["xm09_bauble_26","White Heart Bauble","To hang on your tree",""],["xm09_bauble_27","Pink Heart Bauble","To hang on your tree",""],["xm09_candyCane","Candy Canes","Got Candy?",""],["xm09_stocking","Holiday Stocking","Are they filled with coal?",""],["xm09_infotv","Flatscreen TV","Catch the latest news of the pre-Holiday season!",""],["xm09_cocoa","Hot Chocolate Maker","Cocoa and Christmas. Excellent!",""],["xm09_lrgBauble","Large Bauble","Isn't it pretty!",""],["xm09_frplc","Christmas Fireplace","Warm and cozy!",""],["xm09_table","Holiday Table","Enough Room for an entire family",""],["xm09_bench","Holiday Bench","Will everyone fit?",""],["ads_twi_paint","Painting","Stare deep into the painting...",""],["ads_twi_dreamc","Dream Catcher","Will it catch them?",""],["ads_twi_bwall1","Barn Wall","Keeps the cold out..",""],["ads_twi_crest","Volturi Crest","A Royal Crest.",""],["ads_twi_toolbx","Toolbox","Good spot for some tools...",""],["ads_twi_table","Cake on Table with Presents","Whose name is on that present?",""],["ads_twi_tower","Clock Tower","What time is it?",""],["ads_twi_piano","Broken Piano","I wonder if it's still in tune.",""],["ads_twi_chair","Volturi Royal Chair","A chair fit for royalty",""],["ads_twi_fountn","Fountain","Simply breathtaking...",""]] +[["ads_twi_dvdr2","Clock Tower wall","Repel all attacks...",""],["ads_twi_dvdr1","Half wall","Where is the other half?",""],["ads_twi_roses","Standing Rose Bouquet","You shouldn't have...",""],["ads_twi_bwall2","Truck and Motorcycles","Nice motorcycle",""],["ads_twi_windw","Window with Candles","Watch the candle flicker",""],["ads_twi_trophy","Twilight Trophy","Fitting for the biggest Twilight fan!",""],["ads_twi_mist","Fog","Sure is foggy out here...",""],["rela_candles1","White Candles","Calming Relaxation...",""],["rela_candles2","Red Candles","Calming Relaxation...",""],["rela_candles3","Violet Candles","Calming Relaxation...",""],["rela_candle1","White Candle","Calming Relaxation...",""],["rela_candle2","Red Candle","Calming Relaxation...",""],["rela_candle3","Violet Candle","Calming Relaxation...",""],["rela_hchair","Comfort Cradle","Calming Comfort...",""],["rela_orchid","Orchid","Calming Fragrance...",""],["rela_plant","Relaxation Plant","Calming Greenery...",""],["rela_stick","Stick in Jar","Calming Tranquility...",""],["rela_stone","Relaxation Stones","Calming Stability...",""],["rela_rock","Rock Seat","Calming Comfort...",""],["rela_wall","Relaxation Wall","Calming Serenity...",""],["hween09_organ","Ghostly Organ","Play a ghastly tune on the bones...",""],["sf_mbar","Astro-Bar","Deep space refreshment.",""],["beanstalk","Gigantic Beanstalk","A majestic rare...but who's gonna fix my floor?!",""],["rare_ironmaiden","Rare Iron Maiden","So good it's torturous!",""],["rare_vdoll","Rare Voodoo Doll","Choose your punishment!",""],["hween09_treewall","Haunted Forest","Don't enter alone...",""],["hween09_win","Haunted Window","What is really outside?",""],["hween09_crnr1","Creaky Corner","Perfect corner for a haunted house...",""],["hween09_wall1","Creaky Wall","I wonder if there is a hidden passage here?",""],["hween09_stonewall","Old Stone Wall","Looks strong enough.",""],["hween09_paint","Haunted Painting","Is that cat watching me?",""],["hween09_curt","Floating Curtain","Is someone hiding behind??",""],["hween09_hatch","Creepy Trap Door","I wonder where this goes?",""],["hween09_table","Creepy Table","Hope there is not a head on the platter...",""],["hween09_jar","Strange Jar","Would you like a Duck or a Head?",""],["hween09_floor","Creaky Floor","Watch your step!",""],["hween09_ghost","Ghost-in-the-Box","Ohh haunting...",""],["hween09_tv","Haunted TV","Whats on Haunted TV tonight?",""],["hween09_mirror","Ghostly Mirror","Is that a Habbo in there?",""],["hween09_chandelier","Haunted Chandelier","Flickering in the night...",""],["hween09_chair","Haunted Chair","Was something just sitting in this??",""],["summer_icebox","Ice Box","Chilled surprises",""],["summer_raft2","Blue Inflatable Raft","Ride the rapids in style",""],["ads_veet","ads_veet name","ads_veet desc",""],["ads_wwe_poster","WWE","Bigger, Badder, Better",""],["ads_percyw","ads_percyw name","ads_percyw desc",""],["ads_oc_soda","Orange Soda Machine","Who loves Orange Soda?!",""],["ads_oc_soda_cmp","Orange Soda Machine","Who loves Orange Soda?!",""],["ads_mirror","Dress Up Mirror","Look the part!",""],["ads_gsArcade_2","Arcade Cabinet","Must...get....high....score!",""],["ads_1800tele","ads_1800tele","",""],["ads_chups","ads_chups name","ads_chups desc",""],["ads_droetker_paula","ads_droetker_paula name","ads_droetker_paula desc",""],["ads_reebok_block2","ads_reebok_block2","",""],["ads_spang_sleep","ads_spang_sleep","ads_spang_sleep text",""],["ads_cl_moodi_camp","The Moodi Machine","how u feelin? Express yourself with ChildLine",""],["footylamp_campaign_ing","ING Trophy","We are the champions",""],["byesw_loadscreen","Loading screen memorial","The old Habbo loading screen.",""],["byesw_hotel","Hotel view memorial","3 different miniature Hotels.",""],["byesw_hand","Big Hand seat memorial","We'll miss you Big Hand!",""],["flag_denmark","The Danish Flag","Wave it proudly!",""],["transparent_floor","Transparent Floor","Watch your step!",""],["easel_0","StrayPixels Winner x1","Made by our very own RollerKingdom and Fredsicle",""],["easel_1","StrayPixels winner x3","Made by our very own avilaman, HankMcCoy, and ,CrystalBailey",""],["easel_2","StrayPixels winner x5","Is that... cheese chasing that man!?",""],["easel_3","StrayPixels winner x7","Watching paint dry... fun",""],["easel_4","StrayPixels winner x10","Holy carp my watch just melted!",""],["computer_flatscreen","Desktop Computer","Downloading....",""],["computer_old","Nostalgic Computer","Ahhh the good old days...",""],["computer_laptop","Laptop","For geeks on the go!",""],["tv_flat","Flatscreen TV","Plasma vs. LCD",""],["waasa_aquarium","Aquarium","Finding Nemo should be pretty easy.",""],["waasa_bunk_bed","Bunk Bed","Study or sleep? That's a tough decision!",""],["waasa_chair","Computer Chair","For the perfect posture",""],["waasa_chair_wood","Wooden Chair","A little hard on the buttocks.",""],["waasa_desk","Wooden Study Desk","The ultimate in sophisticated studying",""],["waasa_rug1","Blue Waasa Rug","Sink your toes into its softness",""],["waasa_rug2","Yellow Waasa Rug","Sink your toes into its softness",""],["waasa_rug3","Orange Waasa Rug","Sink your toes into its softness",""],["waasa_rug4","Green Waasa Rug","Sink your toes into its softness",""],["waasa_rug5","Gray Waasa Rug","Sink your toes into its softness",""],["waasa_ship1","Small Sailing Boat","Set sail on water!",""],["waasa_ship2","Large Sailing Boat","Let's hope this one floats!",""],["waasa_table1","Small Wooden Table","No name carving allowed",""],["waasa_table2","Large Wooden Table","Simple, strong and sturdy",""],["waasa_wall_shelf1","Book Shelf","Just a small amount of light reading",""],["waasa_wall_shelf2","Wall Shelf","Smells of many leather-bound books and rich mahogany.",""],["bw_water_1","Water Patch","Swimming in the shallow end.",""],["bw_water_2","Deep Water Patch","Get thrown in the deep end!",""],["coco_chair","Blue Resort Pod","The circular edges will relax you.",""],["coco_chair_c2","Chocolate Resort Pod","The circular edges will relax you.",""],["coco_chair_c3","White Resort Pod","The circular edges will relax you.",""],["coco_chair_c4","Black Resort Pod","The circular edges will relax you.",""],["coco_divan","Blue Pool-side Lounge","Every resort needs one!",""],["coco_divan_c2","Chocolate Pool-side Lounge","Every resort needs one!",""],["coco_divan_c3","White Pool-side Lounge","Every resort needs one!",""],["coco_divan_c4","Black Pool-side Lounge","Every resort needs one!",""],["coco_patch","Resort Flooring","Luxurious under bare feet",""],["coco_sofa","Blue Coco Sofa","The perfect place for a massage.",""],["coco_sofatable","Blue Drinks Table","When carrying your drink becomes hard work.",""],["coco_sofatable_c2","Chocolate Drinks Table","When carrying your drink becomes hard work.",""]] +[["coco_sofatable_c3","White Drinks Table","When carrying your drink becomes hard work.",""],["coco_sofatable_c4","Black Drinks Table","When carrying your drink becomes hard work.",""],["coco_sofa_c2","Chocolate Coco Sofa","The perfect place for a massage.",""],["coco_sofa_c3","White Coco Sofa","The perfect place for a massage.",""],["coco_sofa_c4","Black Coco Sofa","The perfect place for a massage.",""],["coco_stick","Resort Ornament","It's not dead, it's modern.",""],["coco_stool","Blue Coco Stool","For meditation to the maximum.",""],["coco_stool_c2","Chocolate Coco Stool","For meditation to the maximum.",""],["coco_stool_c3","White Coco Stool","For meditation to the maximum.",""],["coco_stool_c4","Black Coco Stool","For meditation to the maximum.",""],["coco_table","COCOnut Table","We had to use them somewhere!",""],["coco_table2","Pool-side Table","Resort to this for your own resort",""],["coco_throne","Blue Wicker Throne","The ultimate in resort relaxation",""],["coco_throne_c3","White Wicker Throne","The ultimate in resort relaxation",""],["coco_throne_c4","Black Wicker Throne","The ultimate in resort relaxation",""],["coco_throne__c2","Chocolate Wicker Throne","The ultimate in resort relaxation",""],["bling11_big1","Vegas Buildings","What happens in Vegas....",""],["bling11_block","Bling Block","A classy building block",""],["bling11_dvd","Bling Divider","Divide and conquer!",""],["bling11_dvn","Bling Daybed","Lie back in style... hand me those grapes!",""],["bling11_floor","Italian Marble Floor","Floor tiles that spell out class!",""],["bling11_pillar","Italian Marble Pillar","Will support all your bling!",""],["bling11_plant","Bling Plant","Classy Greenery!",""],["bling11_rug1","Tiger Rug","Be careful - it will bite!",""],["bling11_rug2","Bling Carpet","So soft your feet will sing with joy!",""],["bling11_seat1","Bling Seat","Silky comfort for your behind!",""],["bling11_seat2","Slot Chair","This could be the luckiest chair in the room!",""],["bling11_slot","Slot Machine","Watch out for this one-armed bandit!",""],["bling11_sofa","Bling Divan","Fit for classy butts!",""],["bling11_statue1","Eros","A God of Love",""],["bling11_statue2","Love Carp","Carpe Diem!",""],["bling11_tele","Bling Teleporter","Teleports you with great grace!",""],["bling11_towels","Bling Towels","Gives your bathroom that extra OUMPH!",""],["bling11_wall1","Tiger Wall Cover","Rawr!",""],["bling11_wall2","Zebra Wall Cover","A touch of wild life!",""],["bling11_wall3","Leopard Wall Cover","Wild patterns for your walls!",""],["bling11_wall4","Panther Wall Cover","Adds wild mystery to your walls!",""],["bling_bed","Bling Bed","No Comment...",""],["bling_cabinet","Bathroom Cabinet","Now With A Mirror",""],["bling_chair_a","Suave Chair","Sit in style!",""],["bling_chair_b","Suave Chair","Sit in style!",""],["bling_chair_c","Suave Chair","Sit in style!",""],["bling_fridge","Big Purple Fridge","I wonder whats inside?",""],["bling_pool","Jacuzzi","Is this a time machine?",""],["bling_shwr","Power Shower","So fresh and so clean...",""],["bling_sink","Marble Sink","Hand Wash, Baby",""],["bling_sofa","Leather Sofa","Perfect for two.",""],["bling_toilet","Golden Toilet","Don't forget to flush.",""],["val09_floor","Polished Tile","Looks all shiny...",""],["val09_floor2","Wooden Tile","Look closely at the grain",""],["val09_wall1","Sound-proofed Wall","I wonder if it really works?",""],["val09_wall2","Embroidered Wall","Isn't it pretty?",""],["val09_wdrobe_b","Designer Wardrobe","I wonder if all my clothes will fit?",""],["val09_wdrobe_g","Designer Wardrobe","I wonder if all my clothes will fit?",""],["bling11_floor_deal5","Italian Marble Floor","Floor tiles that spell out class!",""],["bling11_floor_deal10","Italian Marble Floor","Floor tiles that spell out class!",""],["val09_floor_deal5","Polished Tile","Looks all shiny...",""],["val09_floor_deal10","Polished Tile","Looks all shiny...",""],["val09_floor2_deal5","Wooden Tile","Look closely at the grain",""],["val09_floor2_deal10","Wooden Tile","Look closely at the grain",""],["limo_w_back","Limo Back","Ride in style!",""],["limo_w_front","Limo Front","Ride in style!",""],["limo_w_mid","Limo Middle Part 1","Build your limo and ride in style!",""],["limo_w_mid2","Limo Middle Part 2","Build your limo and ride in style!",""],["ktchn10_block","Kitchen Corner Block","Cutting this corner won't give you food poisoning.",""],["ktchn10_cabnt","Cabinet","Hide all your messy bits and pieces.",""],["ktchn10_pot","Boiling Water","If you can't stand the heat.",""],["ktchn10_sink","Kitchen Sink","Everything but...",""],["ktchn10_stove","Kitchen Stove","Cook up a storm!",""],["ktchn10_tea","Teapot","Short and stout.",""],["ktchn10_block_deal5","Kitchen Corner Block","Cutting this corner won't give you food poisoning.",""],["ktchn10_block_deal10","Kitchen Corner Block","Cutting this corner won't give you food poisoning.",""],["md_limukaappi_cmp","Mountain Dew Machine","A sparkling and refreshing pixel drink!",""],["cine_bench","Red Lobby Bench","Rest your feet before the show!",""],["cine_bench_b","Black Lobby Bench","Rest your feet before the show!",""],["cine_bench_g","Green Lobby Bench","Rest your feet before the show!",""],["cine_bigcorn","Big Popcorn","Swimming in butter",""],["cine_curtain","Theater Curtains","Open them up to start the show!",""],["cine_curtain_red","Red Theatre Curtain","Limited Edition Rare. Grab yourself some popcorn and enjoy the show!",""],["cine_glass","Glass Divider","What's between you and them...",""],["cine_light1","Theater Lights","Lighting up the darkness.",""],["cine_light2","Theater Hall Lights","Follow the lights and please make your way to the seats.",""],["cine_pillarlight","Cine Pillar Light","For the perfect movie theatre ambiance",""],["cine_platform","Cinema Platform","Enjoy the show!",""],["cine_popcorn","Popcorn Machine","Munch & Crunch- the perfect snack for movie-goers.",""],["cine_projector","Movie Projector","For showing home movies and Hollywood blockbusters.",""],["cine_pstr_0","Revenge of the Cheeps","It's a Freaking SAGA",""],["cine_pstr_1","Get Frank","The fourth film by Quilting Tarantula",""],["cine_pstr_10","Gnome","This holiday, discover your inner Habbo",""],["cine_pstr_14","Freeze!","Let it go, let it go, I can't hold this snowball anymore!",""],["cine_pstr_15","Ducknado","Almost enough said!",""],["cine_pstr_16","Quacktrix","No one can be told what the Quacktrix is. You must see it for yourself.",""],["cine_pstr_17","Barry Bobba","A half-blood Habbo and one of the most famous role-players of all time.",""],["cine_pstr_18","Habbo Games","May the credits be ever in your favor!",""],["cine_pstr_19","The Guardian of Habbo","All Habbos start somewhere.",""],["cine_pstr_2","The Rabbit","An unexpected hop.",""],["cine_pstr_3","The Rabbit 2","One carrot to rule them all.",""],["cine_pstr_4","Dark Duck Descends","He's the duck Habbo deserves",""],["cine_pstr_5","Avatar Editor","From the makers of The Catalog",""],["cine_pstr_6","The Ducket List","We live, we die, we rent.",""],["cine_pstr_7","M.O.D","I'll make him a trade he can't refuse.",""]] +[["cine_pstr_8","Habbo Club","Rule Six: Nice shirt, Nice shoes.",""],["cine_pstr_9","Bobbaro","An adventure through the forest with a penguin spirit Bobbaro",""],["cine_roof","Glass roof","Put a shiny glass ceiling on your red carpet!",""],["cine_screen","Movie Screen","The silver screen and home to movie magic.",""],["cine_soda","Big Soda","Soda, pop, fizz",""],["cine_star","Walk of Fame Tile","Go down in Habbo history!",""],["cine_starchair","Director's Chair","You call the shots!",""],["cine_teleport1","Cinema Teleport","Theatre 1",""],["cine_teleport2","Cinema Teleport","Theatre 2",""],["cine_teleport3","Cinema Teleport","Theatre 3",""],["cine_teleport4","Cinema Teleport","Theatre 4",""],["cine_ticket_booth","Ticket Vending Booth","What's showing tonight?",""],["cine_tile","Tile With a Halo","Lights up when walked over.",""],["cine_vipsign","HC Sign","Who's hot... and who's not.",""],["theatre_seat_b","Black Habbowood Chair","Try not to spill any drinks!",""],["theatre_seat_g","Green Habbowood Chair","Try not to spill any drinks!",""],["garden_flo1","Jimson Weed","Awww aren't they beautiful...",""],["garden_flo2","Yellow Delight","Awww aren't they beautiful...",""],["garden_flo3","Pink Pandemic","Awww aren't they beautiful...",""],["garden_flolamp","Wonder Lamp","I wonder what makes it glow...",""],["garden_flytrap","Snapping Teleporter","Hope this doesn't hurt.. Ouch!",""],["garden_jungle","Duck Grass","duck, duck, goose...",""],["garden_jyrki","Star Flower","Awww aren't they beautiful...",""],["garden_leaves","Garden Leaves","Elegant and classy at the same time",""],["garden_lupin1","Gold Lupine","Awww aren't they beautiful...",""],["garden_lupin2","Sky Blue Lupine","Awww aren't they beautiful...",""],["garden_lupin3","Ravishing Red Lupine","Awww aren't they beautiful...",""],["garden_lupin4","White Lupine","Awww aren't they beautiful...",""],["garden_lupin5","Princly Purple Lupine","Awww aren't they beautiful...",""],["garden_mursu","Perfectly Pink Rush","Watch your allergies...",""],["garden_mursu2","Rampaging Red Rush","Watch your allergies...",""],["garden_mursu3","Gallant Gold Rush","Watch your allergies...",""],["garden_mursu4","Wimsome White Rush","Watch your allergies...",""],["garden_orchtree","Bauhibia Orchid Tree","They look like upside down bells.",""],["garden_seed","Violet blossom","All it needs is LOVE!",""],["garden_seed_cmp","Violet blossom","All it needs is LOVE!",""],["garden_staringbush","Weird Staring Bush","Ummmmm. No comment...",""],["garden_volcano","Volcano Flower","AHHH Run away!!!",""],["garden_wall","Green Bean Vines","Wonder how far they will grow...",""],["hc2_armchair","Leather Armchair","Relax in style",""],["hc2_barchair","Leather Bar Stool","Sit up high",""],["hc2_biglamp","Black Lamp","Sophisticated lighting",""],["hc2_carpet","Trendy Rug","Luxurious comfort",""],["hc2_cart","Service Trolley","Butler not included",""],["hc2_coffee","Espresso Machine","Morning glory",""],["hc2_divider","Black Divider","Divide the wealth",""],["hc2_dvn","Leather Duvan","Stretch out",""],["hc2_frplc","Suave Fireplace","Roaring success",""],["hc2_sofa","Leather Sofa","Stylish seating",""],["hc2_sofatbl","Glass Table","Make a statement",""],["hc2_vase","Black Vase","Elegantly shaped",""],["hc3_bard","HC Bar Desk","Set up shop",""],["hc3_dc","HC Duvan","Live the life",""],["hc3_divider","HC Divider","Manage your space",""],["hc3_hugelamp","HC Lamp","Makes a huge statement",""],["hc3_light","HC Light","Stay in the spotlight",""],["hc3_shelf","HC Shelves","Store your awards",""],["hc3_sofa","HC Sofa","Comfort in style",""],["hc3_stereo","HC Stereo","Block rockin' beats",""],["hc3_stool","HC Stool","High and mighty",""],["hc3_table","HC Coffee Table","For social gatherings",""],["hc3_vase","HC Vase","The ultimate floral arrangement.",""],["hc3_walldeco","HC Wall Art","Cubism lives on",""],["school_bench","Cafeteria Bench","Take a load off!",""],["school_bus","School Bus","On the journey of learning ;)",""],["school_cafe","School Lunch Cart","No throwing food!",""],["school_chair","Desk Chair","Sit down (don't) behave.",""],["school_chairgold","Rare Gilded Chair","Be the classiest in class!",""],["school_chair_b","Blue School Chair","Not to be used in association with musical chairs",""],["school_chair_g","Green School Chair","Not to be used in association with musical chairs",""],["school_chalkboard","Chalkboard","I will not waste chalk. I will not waste chalk. I will not...",""],["school_chalkboard2","School Chalkboard","Does chalk really taste like cheese?",""],["school_charts","School Charts","TMI!",""],["school_coatrack_b","Blue Coatrack","THE place to hang out",""],["school_coatrack_g","Green Coatrack","THE place to hang out",""],["school_coatrack_r","Red Coatrack","THE place to hang out",""],["school_console","School Desk","Walk the path of knowledge ;)",""],["school_consolegold","Rare Gilded Desk","Be the classiest in class!",""],["school_console_b","Blue School Desk","Write on the paper, not on the desk!",""],["school_console_g","Green School Desk","Write on the paper, not on the desk!",""],["school_floor","School Flooring","Walk the path of knowledge ;)",""],["school_fountain","School Water Fountain","Water, water, everywhere!",""],["school_gate","School Gates","The gateway to a whole new education",""],["school_locker_b","Blue Locker Teleport","Takes you far away from here!",""],["school_locker_b_nosale","Blue Locker (NOT FOR SALE)","Store your stuff safely",""],["school_locker_b_notele","Blue School Locker","Don't forget your combination!",""],["school_locker_g","Teleport School Locker","Ooh, where does THIS locker go?",""],["school_locker_g_notele","Green School Locker","Don't forget your combination!",""],["school_locker_r","Red Locker Teleport","Takes you far away from here!",""],["school_locker_r_nosale","Red Locker (NOT FOR SALE)","Store your stuff safely",""],["school_locker_r_notele","Red School Locker","Don't forget your combination!",""],["school_platform","Auditorium Platform","Holds your school assembly",""],["school_stuff_01","School Books","Makes your brain grow... or something.",""],["school_stuff_02","Chem Set","Don't blow anything up...",""],["school_stuff_03","Cafeteria Burger","Yum! Cafeteria Food...",""],["school_stuff_04","Cafeteria Meatballs","Yum! Cafeteria Food...",""],["school_stuff_05","Cafeteria Nuggets","Yum! Cafeteria Food...",""],["school_stuff_06","Cafeteria Vegetables","Yum! Cafeteria Food...",""],["school_table","Cafeteria Table","No food fights please!",""],["school_toilet_stall","Toilet Stall","Close the door please...",""],["school_toilet_wall","Toilet Wall","Don't scribble on the wall!",""]] +[["school_urinal","Urinal","With a sweet smell of roses!",""],["school_wall","School Wall","Don't just be another brick in the wall...",""],["matic_box","Mystery Box","What did you get",""],["steampunk_carpet","Steampunk Carpet","I like my carpet steamed",""],["steampunk_chair","Steampunk Chair","Don't worry we don't think it will electrocute you",""],["steampunk_chand","Steampunk Chandalier","Light it up (3 states)",""],["steampunk_computer","Steampunk Computer","The future of computing?",""],["steampunk_floor1","Steampunk Floor","With 6 states!",""],["steampunk_floor2","Steampunk Floor","Underfoot lighting",""],["steampunk_gear_1","Large Cog","Watch them turn",""],["steampunk_gear_2","Small Cog","Watch them turn",""],["steampunk_globe","Globe","Where in the world?",""],["steampunk_gramophone","Steampunk Gramophone","The future of music?",""],["steampunk_lamp","Steampunk Lamp","Light the way",""],["steampunk_map","World Map","Where in the world?",""],["steampunk_pillar_1","Steampunk Pillar","Industrial Framework",""],["steampunk_pillar_2","Steampunk Pillar","Industrial Hydraulics",""],["steampunk_rack","Donnie Santini's Helmet","But where's Donnie?!?",""],["steampunk_sofachair","Steampunk Sofa","Somehwere to sit?",""],["steampunk_table_1","Steampunk Table","With a steamy finish",""],["steampunk_table_2","Steampunk Table","With a steamy finish",""],["steampunk_tele","Steampunk Tele","Steamy!",""],["steampunk_timemach","Time Machine","A journey to the fourth dimension",""],["steampunk_wall1","Steampunk Wall","Tick, Tock.",""],["steampunk_wall2","Steampunk Wall","3 States!",""],["steampunk_window","steampunk_window name","steampunk_window desc",""],["steampunk_zep","Steampunk Zeppelin","Keep away from open flames!",""],["dimmer_steampunk","Steampunk Dimmer Switch","Set the right mood.",""],["qt_val11_discoball","Disco Hearts","A slow dance never felt more romantic...",""],["qt_val11_duckformer","Duck-o-Heart","It's like magic! Is it a duck.. is it a heart?",""],["qt_val11_heartlights","Heart Lights","Brightens up your room with romance!",""],["qt_val11_holoduck","Holo-Duck","Lights up your day!",""],["qt_val11_holoheart","Holo-Heart","Lights up your heart!",""],["qt_val11_jellychair","Jelly Chair","Squishy like your heart!",""],["qt_val11_jellyheart","Jelly Heart","Get jiggly with it!",""],["dark_merdragon","Black Leviathan","Limited Edition Rare. Found in the darkest depths of the abyss.",""],["door_event","Hire-A-Room","Room hire service on the fly",""],["rainbow_ltd_parasol","Rainbow Parasol","Very cute and proud!",""],["snst_fireplace","Epic Fireplace","With a fire big enough to keep the entire room warm",""],["xmas11_balloon","Rare Balloon Machine","Double click to pick up a Balloon and some festive cheer!",""],["xmas11_balloon1","Single Balloon","A party on a string!",""],["xmas11_balloon2","Double Balloon","A party on a string!",""],["xmas11_balloon3","Triple Balloons","A party on a string!",""],["xmas11_btlr","The Santa Butler","Spreading cheer and good times!",""],["xmas11_chair","Red Wooden Cabin Chair","Cushioned for comfort",""],["xmas11_chair_2","Green Wooden Cabin Chair","Cushioned for comfort",""],["xmas11_chair_3","Beige Wooden Cabin Chair","Cushioned for comfort",""],["xmas11_chair_4","Wooden Cabin Chair with Fur Cover","Cushioned for comfort",""],["xmas11_comfy_bench","Red Wooden Cabin Bench","Fits more than one",""],["xmas11_comfy_bench_2","Green Wooden Cabin Bench","Fits more than one",""],["xmas11_comfy_bench_3","Beige Wooden Cabin Bench","Fits more than one",""],["xmas11_comfy_bench_4","Wooden Cabin Bench with Fur Cover","Fits more than one",""],["xmas11_comfy_chair","Red Cozy Cabin Chair","Sit down and relax",""],["xmas11_comfy_chair_2","Green Cozy Cabin Chair","Sit down and relax",""],["xmas11_comfy_chair_3","Beige Cozy Cabin Chair","Sit down and relax",""],["xmas11_comfy_chair_4","Cozy Cabin Fur Chair","Sit down and relax",""],["xmas11_cuckoo","Cuckoo's Clock","Let's you know when the clock strikes midnight...",""],["xmas11_elewood","Cabin Stone and Wood Tiles","Change the height by clicking",""],["xmas11_firewood","Cabin Firewood","Click to change the size of the pile",""],["xmas11_flag","Flag","For marking an area",""],["xmas11_footstool","Red Cabin Footstool","Put your feet up and take it easy",""],["xmas11_footstool_2","Green Cabin Footstool","Put your feet up and take it easy",""],["xmas11_footstool_3","Beige Cabin Footstool","Put your feet up and take it easy",""],["xmas11_footstool_4","Cabin Footstool with Fur Cover","Put your feet up and take it easy",""],["xmas11_hd1","Moose Head","I'd be a lot happier out in the woods!",""],["xmas11_hd2","Arctic Bear Head","How did I end up here on the wall?",""],["xmas11_hd3","Wild Boar Head","At least they didn't put an apple in my mouth...",""],["xmas11_hd4","Crocodile Head","Someone take this thing off of my head please!",""],["xmas11_hd5","Ghost Pet Head","I don't give a sheet...",""],["xmas11_hd6","Deer Head","Oh deer what have they done with me...",""],["xmas11_luxchair1","White Chesterfield Armchair","Swank seating for your delicate behinds.",""],["xmas11_luxchair2","Red Chesterfield Armchair","Swank seating for your delicate behinds.",""],["xmas11_luxchair3","Black Chesterfield Armchair","Swank seating for your delicate behinds.",""],["xmas11_luxdish1","Chocolate Fountain","Sweet, sweet heaven!",""],["xmas11_luxdish2","Strawberries","Little pieces of loveliness!",""],["xmas11_luxdish3","Porcelain","Tea's served!",""],["xmas11_luxfloor1","Parquet","Luxury Flooring",""],["xmas11_luxfloor2","Polished Stone Floor","Luxury Flooring",""],["xmas11_luxsofa1","White Chesterfield Sofa","Swank seating for your delicate behinds.",""],["xmas11_luxsofa2","Red Chesterfield Sofa","Swank seating for your delicate behinds.",""],["xmas11_luxsofa3","Black Chesterfield Sofa","Swank seating for your delicate behinds.",""],["xmas11_luxtable","Serving Table","Serves up a delicate meal.",""],["xmas11_nghtstnd","Cabin Nightstand","With a small lamp to light up your evenings",""],["xmas11_petfood","Cheese","Does not smell like old socks",""],["xmas11_sofatable","Cabin Sofa Table","Put down your hot choc and chill",""],["xmas11_stonedivider","Cabin Divider","Divide the space and make it stylish",""],["xmas11_stonefloor","Cabin Stone Floor","Cold under your bare feet",""],["xmas11_stool","Red Wooden Cabin Stool","Cushioned for comfort",""],["xmas11_stool_2","Green Wooden Cabin Stool","Cushioned for comfort",""],["xmas11_stool_3","Beige Wooden Cabin Stool","Cushioned for comfort",""],["xmas11_stool_4","Wooden Cabin Stool with Fur Cover","Cushioned for comfort",""],["xmas11_stove","Cabin Stove","Click it to turn up the heat",""],["xmas11_throne","Xmas Throne","A kingly seat",""],["xmas11_wall","Cabin Wall","Keeps your cabin warm and cozy",""],["xmas11_woodfloor","Cabin Wooden Floor","Doesn't creak under your feet",""],["xmas11_yetifeet","xmas11_yetifeet name","xmas11_yetifeet desc",""],["qt_xm10_elephant","Elephant Minibar","Now serving icy cool drinks!",""],["qt_xm10_gnome","Garden Gnome","Someone left him out in the cold for too long!",""],["qt_xm10_iceclubsofa","Cool Club Sofa","The pillows should keep you warm.",""],["qt_xm10_icedragon","Blizzard Dragon","With a fiery breath.",""],["qt_xm10_iceduck","Plain Icy Duck","It's quack-tastic!",""]] +[["qt_xm10_iceelephant","Woah Nelly!","So cool it's freezing!",""],["qt_xm10_icepillar","Frozen Pillar","Won't crumble... might melt though.",""],["qt_xm10_iceteddy","Frozen Ted","Cold yet cuddly.",""],["xmas13_icecream","Icy Ice Cream Maker","Virtual Ice Cream Rocks!",""],["easter_2021_box","Easter Egg 2021","What did you get beneath that chocolate?",""],["kuurna_chair","Pixel Sofa Chair","Cool and comfortable!",""],["kuurna_chair1","Pixel Dining Chair","Pixel dining at its best.",""],["kuurna_lamp","Pixel Lamp","Shed some light on your room.",""],["kuurna_mat","Pixel Shag Rug","Design and comfort in one great rug!",""],["kuurna_red_chair","Pixel Sofa Chair","Sit on it",""],["kuurna_red_chair1","Pixel Dining Chair","Take a load off",""],["kuurna_red_lamp","Pixel Lamp","Shed some light on your room",""],["kuurna_red_sofa","Pixel Sofa","Make room for your friends!",""],["kuurna_red_table","Pixel Dining Table","Did someone say dinner party?",""],["kuurna_red_table1","Pixel Side Table","Small but functional",""],["kuurna_sofa","Pixel Sofa","Make room for your friends!",""],["kuurna_table","Pixel Dining Table","Invite your friends over for a cool dining experience!",""],["kuurna_table1","Pixel Side Table","Small but functional.",""],["track12_ujack_sofa","Union Jack Sofa","Jolly good rumpus machine, innit??",""]] diff --git a/tools/gamedata/shockwave/sec.cct b/tools/gamedata/shockwave/sec.cct new file mode 100644 index 0000000..456b12d Binary files /dev/null and b/tools/gamedata/shockwave/sec.cct differ diff --git a/tools/gamedata/shockwave/template_variables.txt b/tools/gamedata/shockwave/template_variables.txt new file mode 100644 index 0000000..8a60782 --- /dev/null +++ b/tools/gamedata/shockwave/template_variables.txt @@ -0,0 +1,170 @@ +cast.entry.39=hh_human_50_acc_face +cast.entry.33=hh_human_acc_face +cast.entry.11=hh_human_hair +client.fatal.error.url=[HTTP_TAG]://classichabbo.com/client_error +link.format.userpage=[HTTP_TAG]://classichabbo.com/home/%ID%/id +room.rating.enable=1 +interface.cmds.active.ctrl=["move","rotate"] +cast.entry.28=hh_recycler +avatar.editor.character.update.url=[HTTP_TAG]://[SSL_DOMAIN]/profile +cast.entry.14=hh_human_shoe +cast.entry.16=hh_pets_common +cast.entry.6=hh_human +link.format.collectibles=[HTTP_TAG]://[SSL_DOMAIN]/credits/collectables +room.cast.11=hh_human_fx +interstitial.max.displays=5 +room.cast.1=hh_soundmachine +interface.cmds.item.ctrl=[] +cast.entry.40=hh_human_50_acc_head +cast.entry.32=hh_human_acc_eye +cast.entry.34=hh_human_acc_head +interface.cmds.user.owner=["take_rights","give_rights","kick","friend","trade","ignore","unignore","userpage"] +cast.entry.15=hh_kiosk_room +room.recommendations=1 +room.cast.10=hh_roomdimmer +link.format.friendlist.pref=[HTTP_TAG]://classichabbo.com/profile/friendsmanagement?tab=6 +cast.entry.41=hh_human_50_body +cast.entry.10=hh_human_hats +room.cast.5=hh_human_50_leg +cast.entry.30=hh_badges +cast.entry.4=hh_interface +cast.entry.31=hh_entry_init +interface.cmds.user.ctrl=["kick","friend","trade","ignore","unignore","userpage"] +cast.entry.19=hh_furni_classes +interface.cmds.photo.owner=["pick","delete"] +cast.entry.21=hh_club +displayer.tag.expiration.time=600000 +swimjump.key.list=[#run1:"A", #run2:"D", #dive1:"W", #dive2:"E", #dive3:"A", #dive4:"S", #dive5:"D", #dive6:"Z", #dive7:"X", #jump:"SPACE"] +link.format.credits=[HTTP_TAG]://classichabbo.com/credits +cast.entry.17=hh_room_utils +cast.entry.46=hh_ig +cast.entry.44=hh_pets +games.tickets.hide=0 +navigator.cache.duration=30 +cast.entry.35=hh_human_50_face +cast.entry.45=hh_guide +cast.entry.47=hh_ig_interface +cast.entry.48=hh_tutorial +cast.entry.20=hh_room +room.cast.4=hh_human_50_shirt +room.cast.3=hh_human_acc_waist +interface.cmds.photo.ctrl=[] +cast.entry.18=hh_room_ui +club.subscription.disabled=1 +cast.entry.12=hh_human_shirt +interface.cmds.user.friend=["friend","trade","ignore","unignore","userpage"] +room.cast.2=hh_human_acc_chest +cast.entry.24=hh_cat_new +link.format.mailpage=[HTTP_TAG]://classichabbo.com/me#mail/compose/%recipientid% +text.render.compatibility.mode=2 +interface.cmds.active.owner=["move","rotate","pick"] +cast.entry.43=hh_instant_messenger +group.badge.url=[HTTP_TAG]://[SSL_DOMAIN]/habbo-imaging/badge/%imagerdata%.gif +interstitial.interval=180000 +cast.entry.1=hh_entry_[HOTEL_VIEW_TAG] +cast.entry.7=hh_human_body +cast.entry.13=hh_human_leg +client.full.refresh.period=5000 +group_logo_url_template=[HTTP_TAG]://[SSL_DOMAIN]/habbo-imaging/badge-fill/%imagerdata%.gif +cast.entry.42=hh_friend_list +cast.entry.2=hh_entry_base +room.cast.9=hh_human_50_acc_waist +text.crap.fixing=1 +cast.entry.26=hh_buffer +client.version.id=401 +cast.entry.27=hh_dynamic_downloader +moderator.cmds=[":alert x",":ban x",":kick x",":superban x",":shutup x",":unmute x",":transfer x",":softkick x"] +rosetta.warning.page.url=[HTTP_TAG]://classichabbo.com/client_popup/rosetta_info +link.format.mail.inbox=[HTTP_TAG]://classichabbo.com/me#mail +link.format.user.search=[HTTP_TAG]://classichabbo.com/me#habbo-search +room.cast.6=hh_human_50_shoe +room.cast.8=hh_human_50_acc_chest +cast.entry.36=hh_human_50_hats +avatar.editor.url=%predefined%/profile +cast.entry.22=hh_photo +link.format.habboclub=[HTTP_TAG]://%predefined%/credits/club +link.format.club=[HTTP_TAG]://classichabbo.com/credits/club +cast.entry.23=hh_navigator +castload.retry.delay=20000 +link.format.mail.compose=[HTTP_TAG]://classichabbo.com/me#mail/compose/%recipientid%/%random%/ +interface.cmds.item.owner=["pick"] +link.format.pets=[HTTP_TAG]://classichabbo.com/hotel/pets +interface.cmds.user.personal=["badge","dance","wave","hcdance","userpage"] +paalu.key.list=[#bal1:"Q", #bal2:"E", #push1:"A", #push2:"D", #move1:"N", #move2:"M", #stabilise:"SPACE"] +pixels.enabled=true +link.format.tag.search=[HTTP_TAG]://classichabbo.com/tag/search?tag=%tag% +room.cast.small.1=hh_pets_50 +cast.entry.25=hh_cat_gfx_all +cast.entry.5=hh_patch_uk +cast.entry.9=hh_human_item +room.cast.12=hh_human_50_fx +cast.entry.37=hh_human_50_hair +interstitial.show.time=3000 +cast.entry.38=hh_human_50_acc_eye +cast.entry.8=hh_human_face +room.cast.private=["hh_room_private", "hh_room_landscapes"] +client.flood.timeout=1 +cast.entry.29=hh_poll +room.cast.7=hh_human_50_item +cast.entry.3=hh_shared +friend_request_options=Advanced options. +char.conversion.mac=[128:219,130:226,131:196,132:227,133:201,134:160,135:224,136:246,137:228,139:220,140:206,145:212,146:213,147:210,148:211,149:165,150:208,151:209,152:247,153:170,155:221,156:207,159:217,161:193,165:180,167:164,168:172,170:187,171:199,172:194,173:208,174:168,176:161,180:171,182:166,183:225,184:252,186:188,187:200,191:192,192:203,193:231,194:229,195:204,196:128,197:129,198:174,199:130,200:233,201:131,202:230,203:232,204:237,205:234,206:235,207:236,209:132,210:241,211:238,212:239,213:205,214:133,216:175,217:244,218:242,219:243,220:134,223:167,224:136,225:135,226:137,227:139,228:138,229:140,230:190,231:141,232:143,233:142,234:144,235:145,236:147,237:146,238:148,239:149,241:150,242:152,243:151,244:153,246:154,247:214,248:191,249:157,250:156,251:158,252:159,255:216] +profile.events.enabled=false +profile.fields.enabled=false +profiler.enabled=false +profile.core.enabled=false +profile.network.enabled=false +client.use.invites=1 +external.figurepartlist.txt=[HTTP_TAG]://[SSL_DOMAIN]/dcr/v31/gamedata/figuredata.xml +productdata.load.url=[HTTP_TAG]://[SSL_DOMAIN]/dcr/v31/gamedata/productdata.txt +hotelview.banner.url=[HTTP_TAG]://[SSL_DOMAIN]/gamedata/banner +purse.transactions.active=1 +loading.bar.active=1 +client.textdata.utf8=1 +logout.disconnect.url=[HTTP_TAG]://classichabbo.com/account/disconnected?reason=logout&origin=popup +logout.concurrent.url= +[HTTP_TAG]://classichabbo.com/account/disconnected?reason=concurrentlogin&origin=popup +furnidata.load.url=[HTTP_TAG]://[SSL_DOMAIN]/dcr/v31/gamedata/furnidata.txt +dynamic.download.name.template=hh_furni_xx_%typeid%.cct +navigator.visible.public.root=3 +room.default.wall=201 +figure.draworder.xml.secure=[HTTP_TAG]://[SSL_DOMAIN]/dcr/v31/gamedata/draworder.xml +client.window.title=Habbo Hotel +navigator.private.default=4 +room.default.floor=111 +struct.font.tooltip=[#font:"v", #fontSize:9,#lineHeight:10,#color:rgb("#000000"),#ilk:#struct,#fontStyle:[#plain]] +navigator.public.default=3 +stats.tracking.javascript.template=/\TCODE +struct.font.link=[#font:"v", #fontSize:9,#lineHeight:10,#color:rgb("#000000"),#ilk:#struct,#fontStyle:[#underline]] +flash.dynamic.download.url=[HTTP_TAG]://[SSL_DOMAIN]/dcr/hof_furni/ +flash.dynamic.download.name.template=%revision%/%typeid%.swf +fuse.project.id=habbo_uk +figure.animation.xml=[HTTP_TAG]://[SSL_DOMAIN]/dcr/v31/gamedata/animation.xml +private.image.library.url=[CDN_IMAGES] +dynamic.download.url=[HTTP_TAG]://[SSL_DOMAIN]/dcr/hof_furni/ +figure.partsets.xml=[HTTP_TAG]://[SSL_DOMAIN]/dcr/v31/gamedata/partsets.xml +tutorial.name.new_user_flow=NUF_mini +external.figurepartlist.txt.secure=[HTTP_TAG]://[SSL_DOMAIN]/dcr/v31/gamedata/figuredata.xml +navigator.visible.private.root=4 +struct.font.italic=[#font:"v", #fontSize:9,#lineHeight:10,#color:rgb("#000000"),#ilk:#struct,#fontStyle:[#italic]] +language=en +image.library.url=[CDN_IMAGES] +struct.font.plain=[#font:"v", #fontSize:9,#lineHeight:10,#color:rgb("#000000"),#ilk:#struct,#fontStyle:[#plain]] +navigator.default.view=public +security.cast.load.url=[HTTP_TAG]://[SSL_DOMAIN]/dcr/v31/gamedata/sec.cct?t=%token% +logout.url=[HTTP_TAG]://[SSL_DOMAIN]/account/disconnected?reason=logout&origin=popup +figure.draworder.xml=[HTTP_TAG]://[SSL_DOMAIN]/dcr/v31/gamedata/draworder.xml +stats.tracking.javascript=google +struct.font.bold=[#font:"vb",#fontSize:9,#lineHeight:10,#color:rgb("#000000"),#ilk:#struct,#fontStyle:[#plain]] +struct.font.grey=[#font:"v", #fontSize:9,#lineHeight:10,#color:rgb("#666666"),#ilk:#struct,#fontStyle:[#italic]] +permitted.name.chars=1234567890qwertyuiopasdfghjklzxcvbnm-=?!@:., +dynamic.download.samples.template=sounds/%typeid%.cct +handitem.camera.select_handler=photo_interface +navigator.room.forward.timeout=0 +cast.entry.49=hh_tutorial_fix +client.allow.cross.domain=1 +client.notify.cross.domain=0 +handitem.right.45 = 57 +handitem.right.46 = 58 +handitem.right.47 = 59 +handitem.right.50 = 62 diff --git a/tools/gamedata/shockwave/template_variables2.txt b/tools/gamedata/shockwave/template_variables2.txt new file mode 100644 index 0000000..24082d9 --- /dev/null +++ b/tools/gamedata/shockwave/template_variables2.txt @@ -0,0 +1,170 @@ +cast.entry.39=hh_human_50_acc_face +cast.entry.33=hh_human_acc_face +cast.entry.11=hh_human_hair +client.fatal.error.url=[HTTP_TAG]://classichabbo.com/client_error +link.format.userpage=[HTTP_TAG]://classichabbo.com/home/%ID%/id +room.rating.enable=1 +interface.cmds.active.ctrl=["move","rotate"] +cast.entry.28=hh_recycler +avatar.editor.character.update.url=[HTTP_TAG]://cdn.classichabbo.com/profile +cast.entry.14=hh_human_shoe +cast.entry.16=hh_pets_common +cast.entry.6=hh_human +link.format.collectibles=[HTTP_TAG]://cdn.classichabbo.com/credits/collectables +room.cast.11=hh_human_fx +interstitial.max.displays=5 +room.cast.1=hh_soundmachine +interface.cmds.item.ctrl=[] +cast.entry.40=hh_human_50_acc_head +cast.entry.32=hh_human_acc_eye +cast.entry.34=hh_human_acc_head +interface.cmds.user.owner=["take_rights","give_rights","kick","friend","trade","ignore","unignore","userpage"] +cast.entry.15=hh_kiosk_room +room.recommendations=1 +room.cast.10=hh_roomdimmer +link.format.friendlist.pref=[HTTP_TAG]://classichabbo.com/profile/friendsmanagement?tab=6 +cast.entry.41=hh_human_50_body +cast.entry.10=hh_human_hats +room.cast.5=hh_human_50_leg +cast.entry.30=hh_badges +cast.entry.4=hh_interface +cast.entry.31=hh_entry_init +interface.cmds.user.ctrl=["kick","friend","trade","ignore","unignore","userpage"] +cast.entry.19=hh_furni_classes +interface.cmds.photo.owner=["pick","delete"] +cast.entry.21=hh_club +displayer.tag.expiration.time=600000 +swimjump.key.list=[#run1:"A", #run2:"D", #dive1:"W", #dive2:"E", #dive3:"A", #dive4:"S", #dive5:"D", #dive6:"Z", #dive7:"X", #jump:"SPACE"] +link.format.credits=[HTTP_TAG]://classichabbo.com/credits +cast.entry.17=hh_room_utils +cast.entry.46=hh_ig +cast.entry.44=hh_pets +games.tickets.hide=0 +navigator.cache.duration=30 +cast.entry.35=hh_human_50_face +cast.entry.45=hh_guide +cast.entry.47=hh_ig_interface +cast.entry.48=hh_tutorial +cast.entry.20=hh_room +room.cast.4=hh_human_50_shirt +room.cast.3=hh_human_acc_waist +interface.cmds.photo.ctrl=[] +cast.entry.18=hh_room_ui +club.subscription.disabled=1 +cast.entry.12=hh_human_shirt +interface.cmds.user.friend=["friend","trade","ignore","unignore","userpage"] +room.cast.2=hh_human_acc_chest +cast.entry.24=hh_cat_new +link.format.mailpage=[HTTP_TAG]://classichabbo.com/me#mail/compose/%recipientid% +text.render.compatibility.mode=2 +interface.cmds.active.owner=["move","rotate","pick"] +cast.entry.43=hh_instant_messenger +group.badge.url=http://cdn.classichabbo.com/habbo-imaging/badge/%imagerdata%.gif +interstitial.interval=180000 +cast.entry.1=hh_entry_[HOTEL_VIEW_TAG] +cast.entry.7=hh_human_body +cast.entry.13=hh_human_leg +client.full.refresh.period=5000 +group_logo_url_template=http://cdn.classichabbo.com/habbo-imaging/badge-fill/%imagerdata%.gif +cast.entry.42=hh_friend_list +cast.entry.2=hh_entry_base +room.cast.9=hh_human_50_acc_waist +text.crap.fixing=1 +cast.entry.26=hh_buffer +client.version.id=401 +cast.entry.27=hh_dynamic_downloader +moderator.cmds=[":alert x",":ban x",":kick x",":superban x",":shutup x",":unmute x",":transfer x",":softkick x"] +rosetta.warning.page.url=[HTTP_TAG]://classichabbo.com/client_popup/rosetta_info +link.format.mail.inbox=[HTTP_TAG]://classichabbo.com/me#mail +link.format.user.search=[HTTP_TAG]://classichabbo.com/me#habbo-search +room.cast.6=hh_human_50_shoe +room.cast.8=hh_human_50_acc_chest +cast.entry.36=hh_human_50_hats +avatar.editor.url=%predefined%/profile +cast.entry.22=hh_photo +link.format.habboclub=http://%predefined%/credits/club +link.format.club=[HTTP_TAG]://classichabbo.com/credits/club +cast.entry.23=hh_navigator +castload.retry.delay=20000 +link.format.mail.compose=[HTTP_TAG]://classichabbo.com/me#mail/compose/%recipientid%/%random%/ +interface.cmds.item.owner=["pick"] +link.format.pets=[HTTP_TAG]://classichabbo.com/hotel/pets +interface.cmds.user.personal=["badge","dance","wave","hcdance","userpage"] +paalu.key.list=[#bal1:"Q", #bal2:"E", #push1:"A", #push2:"D", #move1:"N", #move2:"M", #stabilise:"SPACE"] +pixels.enabled=true +link.format.tag.search=[HTTP_TAG]://classichabbo.com/tag/search?tag=%tag% +room.cast.small.1=hh_pets_50 +cast.entry.25=hh_cat_gfx_all +cast.entry.5=hh_patch_uk +cast.entry.9=hh_human_item +room.cast.12=hh_human_50_fx +cast.entry.37=hh_human_50_hair +interstitial.show.time=3000 +cast.entry.38=hh_human_50_acc_eye +cast.entry.8=hh_human_face +room.cast.private=["hh_room_private", "hh_room_landscapes"] +client.flood.timeout=1 +cast.entry.29=hh_poll +room.cast.7=hh_human_50_item +cast.entry.3=hh_shared +friend_request_options=Advanced options. +char.conversion.mac=[128:219,130:226,131:196,132:227,133:201,134:160,135:224,136:246,137:228,139:220,140:206,145:212,146:213,147:210,148:211,149:165,150:208,151:209,152:247,153:170,155:221,156:207,159:217,161:193,165:180,167:164,168:172,170:187,171:199,172:194,173:208,174:168,176:161,180:171,182:166,183:225,184:252,186:188,187:200,191:192,192:203,193:231,194:229,195:204,196:128,197:129,198:174,199:130,200:233,201:131,202:230,203:232,204:237,205:234,206:235,207:236,209:132,210:241,211:238,212:239,213:205,214:133,216:175,217:244,218:242,219:243,220:134,223:167,224:136,225:135,226:137,227:139,228:138,229:140,230:190,231:141,232:143,233:142,234:144,235:145,236:147,237:146,238:148,239:149,241:150,242:152,243:151,244:153,246:154,247:214,248:191,249:157,250:156,251:158,252:159,255:216] +profile.events.enabled=false +profile.fields.enabled=false +profiler.enabled=false +profile.core.enabled=false +profile.network.enabled=false +client.use.invites=1 +external.figurepartlist.txt=[HTTP_TAG]://cdn.classichabbo.com/dcr/v31/gamedata/figuredata.xml +productdata.load.url=[HTTP_TAG]://cdn.classichabbo.com/dcr/v31/gamedata/productdata.txt +hotelview.banner.url=[HTTP_TAG]://cdn.classichabbo.com/gamedata/banner +purse.transactions.active=1 +loading.bar.active=1 +client.textdata.utf8=1 +logout.disconnect.url=[HTTP_TAG]://classichabbo.com/account/disconnected?reason=logout&origin=popup +logout.concurrent.url= +[HTTP_TAG]://classichabbo.com/account/disconnected?reason=concurrentlogin&origin=popup +furnidata.load.url=[HTTP_TAG]://cdn.classichabbo.com/dcr/v31/gamedata/furnidata.txt +dynamic.download.name.template=hh_furni_xx_%typeid%.cct +navigator.visible.public.root=3 +room.default.wall=201 +figure.draworder.xml.secure=[HTTP_TAG]://cdn.classichabbo.com/dcr/v31/gamedata/draworder.xml +client.window.title=Habbo Hotel +navigator.private.default=4 +room.default.floor=111 +struct.font.tooltip=[#font:"v", #fontSize:9,#lineHeight:10,#color:rgb("#000000"),#ilk:#struct,#fontStyle:[#plain]] +navigator.public.default=3 +stats.tracking.javascript.template=/\TCODE +struct.font.link=[#font:"v", #fontSize:9,#lineHeight:10,#color:rgb("#000000"),#ilk:#struct,#fontStyle:[#underline]] +flash.dynamic.download.url=[HTTP_TAG]://cdn.classichabbo.com/dcr/hof_furni/ +flash.dynamic.download.name.template=%revision%/%typeid%.swf +fuse.project.id=habbo_uk +figure.animation.xml=[HTTP_TAG]://cdn.classichabbo.com/dcr/v31/gamedata/animation.xml +private.image.library.url=[HTTP_TAG]://cdn.classichabbo.com/c_images/ +dynamic.download.url=[HTTP_TAG]://cdn.classichabbo.com/dcr/hof_furni/ +figure.partsets.xml=[HTTP_TAG]://cdn.classichabbo.com/dcr/v31/gamedata/partsets.xml +tutorial.name.new_user_flow=NUF_mini +external.figurepartlist.txt.secure=[HTTP_TAG]://cdn.classichabbo.com/dcr/v31/gamedata/figuredata.xml +navigator.visible.private.root=4 +struct.font.italic=[#font:"v", #fontSize:9,#lineHeight:10,#color:rgb("#000000"),#ilk:#struct,#fontStyle:[#italic]] +language=en +image.library.url=[HTTP_TAG]://cdn.classichabbo.com/c_images/ +struct.font.plain=[#font:"v", #fontSize:9,#lineHeight:10,#color:rgb("#000000"),#ilk:#struct,#fontStyle:[#plain]] +navigator.default.view=public +security.cast.load.url=[HTTP_TAG]://cdn.classichabbo.com/dcr/v31/gamedata/sec.cct?t=%token% +logout.url=[HTTP_TAG]://cdn.classichabbo.com/account/disconnected?reason=logout&origin=popup +figure.draworder.xml=[HTTP_TAG]://cdn.classichabbo.com/dcr/v31/gamedata/draworder.xml +stats.tracking.javascript=google +struct.font.bold=[#font:"vb",#fontSize:9,#lineHeight:10,#color:rgb("#000000"),#ilk:#struct,#fontStyle:[#plain]] +struct.font.grey=[#font:"v", #fontSize:9,#lineHeight:10,#color:rgb("#666666"),#ilk:#struct,#fontStyle:[#italic]] +permitted.name.chars=1234567890qwertyuiopasdfghjklzxcvbnm-=?!@:., +dynamic.download.samples.template=sounds/%typeid%.cct +handitem.camera.select_handler=photo_interface +navigator.room.forward.timeout=0 +cast.entry.49=hh_tutorial_fix +client.allow.cross.domain=1 +client.notify.cross.domain=0 +handitem.right.45 = 57 +handitem.right.46 = 58 +handitem.right.47 = 59 +handitem.right.50 = 62 diff --git a/tools/gamedata/temp-furni.7z b/tools/gamedata/temp-furni.7z new file mode 100644 index 0000000..6bda108 Binary files /dev/null and b/tools/gamedata/temp-furni.7z differ diff --git a/tools/groups.sql b/tools/groups.sql new file mode 100644 index 0000000..091a550 --- /dev/null +++ b/tools/groups.sql @@ -0,0 +1,199 @@ +-- -------------------------------------------------------- +-- Host: 127.0.0.1 +-- Server version: 10.4.7-MariaDB - mariadb.org binary distribution +-- Server OS: Win64 +-- HeidiSQL Version: 10.2.0.5599 +-- -------------------------------------------------------- + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET NAMES utf8 */; +/*!50503 SET NAMES utf8mb4 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; + +-- Dumping structure for table hotel.cms_recommended +CREATE TABLE IF NOT EXISTS `cms_recommended` ( + `recommended_id` int(11) NOT NULL, + `type` enum('GROUP','ROOM') NOT NULL, + `is_staff_pick` tinyint(1) NOT NULL DEFAULT 0 +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table hotel.cms_recommended: ~5 rows (approximately) +DELETE FROM `cms_recommended`; +/*!40000 ALTER TABLE `cms_recommended` DISABLE KEYS */; +INSERT INTO `cms_recommended` (`recommended_id`, `type`, `is_staff_pick`) VALUES + (1, 'GROUP', 1), + (2, 'GROUP', 0), + (3, 'GROUP', 0), + (4, 'GROUP', 0), + (5, 'GROUP', 0); +/*!40000 ALTER TABLE `cms_recommended` ENABLE KEYS */; + +-- Dumping structure for table hotel.cms_stickers +CREATE TABLE IF NOT EXISTS `cms_stickers` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `user_id` int(11) NOT NULL, + `x` varchar(6) NOT NULL DEFAULT '0' COMMENT 'left', + `y` varchar(6) NOT NULL DEFAULT '0' COMMENT 'top', + `z` varchar(6) NOT NULL DEFAULT '0' COMMENT 'z-index', + `sticker_id` int(11) NOT NULL, + `skin_id` int(11) NOT NULL DEFAULT 0, + `group_id` int(11) NOT NULL DEFAULT -1, + `text` longtext NOT NULL DEFAULT '', + `is_placed` tinyint(1) NOT NULL DEFAULT 0, + `extra_data` varchar(11) NOT NULL DEFAULT '', + PRIMARY KEY (`id`), + KEY `user_id` (`user_id`), + KEY `group_id` (`group_id`), + KEY `id` (`id`) +) ENGINE=MyISAM AUTO_INCREMENT=109 DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table hotel.cms_stickers: 108 rows +DELETE FROM `cms_stickers`; +/*!40000 ALTER TABLE `cms_stickers` DISABLE KEYS */; +INSERT INTO `cms_stickers` (`id`, `user_id`, `x`, `y`, `z`, `sticker_id`, `skin_id`, `group_id`, `text`, `is_placed`, `extra_data`) VALUES + (1, 0, '0', '0', '0', 11100, 1, 1, '', 0, ''), + (2, 0, '570', '1078', '42', 11000, 2, 1, '', 1, ''), + (3, 0, '0', '0', '0', 11200, 1, 1, '', 0, ''), + (4, 0, '0', '0', '0', 11300, 1, 1, '', 0, ''), + (5, 1, '109', '795', '10', 13, 9, 1, '[color=white][b]Owl[/b]\rThe old and wise one - loyal owl \rwith a heart of gold.\rLevel 10[/color]', 1, ''), + (6, 1, '189', '1069', '12', 13, 2, 1, 'Well of course I can. Because I am a Habbo Guide!', 1, ''), + (7, 1, '109', '197', '2', 13, 9, 1, '[color=white][b]Bunny[/b]\rThe fast one - catch one if \ryou can.\rLevel 1[/color]', 1, ''), + (8, 1, '109', '331', '1', 13, 9, 1, '[color=white][b]Otter[/b]\rThe one who does not let \ryou sink.\rLevel 3[/color]', 1, ''), + (9, 1, '110', '728', '9', 13, 9, 1, '[color=white][b]Eagle[/b]\rThe sharp eyed one - flying to \ryour aid.\rLevel 9[/color]', 1, ''), + (10, 1, '109', '528', '6', 13, 9, 1, '[color=white][b]Lynx[/b]\rThe hunter one - stalks down \ranswers.\rLevel 6[/color]', 1, ''), + (11, 1, '108', '396', '3', 13, 9, 1, '[color=white][b]Badger[/b]\rThe digger one - has information \ryou cannot find.\rLevel 4[/color]', 1, ''), + (12, 1, '383', '488', '32', 13, 9, 1, '[color=white][b]Who are Habbo guides?[/b]\r\rHabbo Guides are experienced players \rwho like to share their knowledge of \rHabbo and welcome new players.\r\rHabbo Guides meet and greet new \rHabbos, guide them around and\rgenerally making them feel at home.\r\r[b]I\'m new. How do I find a Guide?[/b]\r\rThe first time you enter your room in\rthe hotel you will be asked if you would\rlike to meet a Habbo Guide. You can also \ridentify Guides by their animal badge. \r\r[b]What\'s in it for me?[/b]\r\rA warm fuzzy feeling at the end of the \rday, and hopefully the start of many new \rfriendships :)\r\r[b]Can I join?[/b]\r\rYes, just join this Group. Anyone who\'s\rinterested in being nice to newcomers is\rwelcome to join - the more the merrier![/color]', 1, ''), + (13, 1, '107', '864', '33', 13, 9, 1, '[color=white][b]Wolf[/b]\rThe eXperienced one with \rthe knowledge to show the way. \rLevel X[/color]', 1, ''), + (14, 1, '109', '667', '8', 13, 9, 1, '[color=white][b]Bear[/b]\rThe friendly one - kind and soft.\rLevel 8[/color]', 1, ''), + (15, 1, '639', '489', '31', 13, 9, 1, '[color=white][b]How do we find the new people?[/b]\r\rWhen new people join Habbo we\'ll ask \rthem if they\'d like to meet a Guide \rfrom Habbo. If they say yes, we\'ll\rsend alerts to members of this group \rwho are in the Hotel at the same time. \rAccept the invitation and you\'ll be \rwhisked off to meet the new person. \rYou can guide them around Habbo and \rshow them what it\'s about.\r\r[b]Can I get as many invites as I want?[/b]\r\rSure, with the Guide tool, You can \rdecide when You want to receive the \rinvites. After helping someone, you can \rpick up the next invite. The Guide tool is \rshown on your screen (in the hotel),\rin the top left corner.\r\r[b]What do I get for guiding?[/b]\r\rHabbo Guides receive badges to \rreward their good work. There are 10 \rlevels to achieve. If you successfully \rguide a Habbo, who stays in Habbo as a \rplayer, is your friend and has spent \renough time online, you will be rewarded.\r\rThe more Habbos you help, the \rcooler the badge! These badges are not \ravailable anywhere else.[/color]', 1, ''), + (16, 1, '109', '461', '5', 13, 9, 1, '[color=white][b]Fox[/b]\rThe clever one - is swift of \rthought and foot.\rLevel 5[/color]', 1, ''), + (17, 1, '108', '264', '4', 13, 9, 1, '[color=white][b]Bambi[/b]\rThe cutest one - makes you \rwanna hug.\rLevel 2[/color]', 1, ''), + (18, 1, '110', '596', '7', 13, 9, 1, '[color=white][b]Buffalo[/b]\rThe strong one - the one you \rcan depend on.\rLevel 7[/color]', 1, ''), + (19, 1, '25', '1164', '11', 13, 2, 1, 'Hey, I\'m confused. Can you help me?', 1, ''), + (20, 1, '515', '412', '23', 2198, 0, 1, '', 1, ''), + (21, 1, '180', '122', '17', 2206, 0, 1, '', 1, ''), + (22, 1, '630', '411', '25', 2206, 0, 1, '', 1, ''), + (23, 1, '137', '122', '16', 2201, 0, 1, '', 1, ''), + (24, 1, '560', '412', '24', 2214, 0, 1, '', 1, ''), + (25, 1, '786', '411', '29', 2203, 0, 1, '', 1, ''), + (26, 1, '830', '411', '30', 2220, 0, 1, '', 1, ''), + (27, 1, '674', '411', '26', 2222, 0, 1, '', 1, ''), + (28, 1, '471', '412', '22', 2198, 0, 1, '', 1, ''), + (29, 1, '426', '412', '21', 2193, 0, 1, '', 1, ''), + (30, 1, '263', '121', '19', 2220, 0, 1, '', 1, ''), + (31, 1, '720', '411', '27', 2208, 0, 1, '', 1, ''), + (32, 1, '94', '122', '15', 2193, 0, 1, '', 1, ''), + (33, 1, '222', '122', '18', 2203, 0, 1, '', 1, ''), + (34, 1, '50', '121', '14', 2198, 0, 1, '', 1, ''), + (35, 1, '741', '411', '28', 2201, 0, 1, '', 1, ''), + (36, 1, '381', '413', '20', 2207, 0, 1, '', 1, ''), + (37, 0, '0', '0', '0', 11100, 1, 2, '', 0, ''), + (38, 0, '628', '741', '23', 11000, 3, 2, '', 1, ''), + (39, 0, '0', '0', '0', 11200, 1, 2, '', 0, ''), + (40, 0, '0', '0', '0', 11300, 1, 2, '', 0, ''), + (41, 1, '667', '611', '35', 13, 0, 2, '[b]Tip 5:[/b] Bouncing on your tile three\rtimes locks the square- make shapes\rout of locked tiles to lock all the\rtiles within.', 1, ''), + (42, 1, '85', '383', '94', 13, 0, 2, '[b][color=#ffce00]Power Drill: [/color][/b][color=#fe6301]Bounce on any tile in \rthe field to clear it. [/color]', 1, ''), + (43, 1, '369', '317', '20', 13, 4, 2, '[b]Free Battleball[/b]\r\rYes until further notice we\'re letting you play both SnowStorm and Battleball for free - no tickets required.\r\r[b]Please note:[/b]\r* skill levels don\'t apply for the free games - everyone can play everyone', 1, ''), + (44, 1, '86', '318', '100', 13, 0, 2, '[b][color=#ffce00]Battle Bomb: [/color][/b][color=#fe6301]Clears all tiles \raround it- even yours![/color]', 1, ''), + (45, 1, '30', '30', '16', 13, 2, 2, '[b]Want to know how to play?\r\rRead the instructions in our [url=https://classichabbo.com/groups/1/id/discussions]discussion forum[/url][/b]', 1, ''), + (46, 1, '84', '452', '83', 13, 0, 2, '[b][color=#ffce00]Light Bulb: [/color][/b][color=#fe6301]Turns all the tiles in a \rsmall area your colour.[/color]', 1, ''), + (47, 1, '84', '584', '96', 13, 0, 2, '[b][color=#ffce00]Flashlight: [/color][/b][color=#fe6301]Colours all the tiles in a\r straight line in front of you[/color]', 1, ''), + (48, 1, '85', '255', '89', 13, 0, 2, '[b][color=#ffce00]Box of pins: [/color][/b][color=#fe6301]Bouncing on these\rwill burst your ball![/color]', 1, ''), + (49, 1, '697', '414', '43', 13, 0, 2, '[b]Tip 3:[/b] Distract your opponent by\rcalling him or her strange names like\r"llama feet".', 1, ''), + (50, 1, '682', '309', '49', 13, 0, 2, '[b]Tip 2:[/b] Bounce on your own squares multiple times to gain extra points, rather than on empty squares.', 1, ''), + (51, 1, '84', '714', '104', 13, 0, 2, '[b][color=#ffce00]Random: [/color][/b][color=#fe6301]Gives you a power-up\rchosen at random![/color]', 1, ''), + (52, 1, '683', '254', '47', 13, 0, 2, '[b]Tip 1:[/b] Bouncing over your opponents squares earns you more points than bouncing on empty squares.', 1, ''), + (53, 1, '84', '650', '102', 13, 0, 2, '[b][color=#ffce00]Harlequin: [/color][/b][color=#fe6301]Makes all other players\rcolour tiles for your team.[/color]', 1, ''), + (54, 1, '683', '222', '108', 13, 0, 2, '[size=large][b]Tips & Tactics[/b][/size]', 1, ''), + (55, 1, '669', '532', '31', 13, 0, 2, '[b]Tip 4:[/b] The best power-up is the \rHarlequin, while the worse is the\rbox of pins which can harm you\rmost of all!', 1, ''), + (56, 1, '85', '519', '98', 13, 0, 2, '[b][color=#ffce00]Spring: [/color][/b][color=#fe6301]Locks tiles to your colour\rwith a single bounce.[/color]', 1, ''), + (57, 1, '256', '391', '2', 1129, 0, 2, '', 1, ''), + (58, 1, '627', '370', '39', 1129, 0, 2, '', 1, ''), + (59, 1, '799', '211', '1', 212, 0, 2, '', 1, ''), + (60, 0, '0', '0', '0', 11100, 1, 3, '', 0, ''), + (61, 0, '476', '492', '34', 11000, 2, 3, '', 1, ''), + (62, 0, '0', '0', '0', 11200, 1, 3, '', 0, ''), + (63, 0, '0', '0', '0', 11300, 1, 3, '', 0, ''), + (64, 1, '56', '333', '8', 46, 0, 3, '', 1, ''), + (65, 1, '210', '1257', '22', 141, 0, 3, '', 1, ''), + (66, 1, '153', '337', '10', 49, 0, 3, '', 1, ''), + (67, 1, '462', '344', '12', 1308, 0, 3, '', 1, ''), + (68, 1, '59', '414', '19', 56, 0, 3, '', 1, ''), + (69, 1, '215', '321', '11', 52, 0, 3, '', 1, ''), + (70, 1, '222', '410', '14', 47, 0, 3, '', 1, ''), + (71, 1, '171', '439', '16', 39, 0, 3, '', 1, ''), + (72, 1, '273', '416', '13', 45, 0, 3, '', 1, ''), + (73, 1, '141', '238', '7', 54, 0, 3, '', 1, ''), + (74, 1, '271', '470', '15', 1226, 0, 3, '', 1, ''), + (75, 1, '189', '256', '4', 57, 0, 3, '', 1, ''), + (76, 1, '672', '228', '3', 1914, 0, 3, '', 1, ''), + (77, 1, '146', '410', '17', 45, 0, 3, '', 1, ''), + (78, 1, '238', '243', '5', 50, 0, 3, '', 1, ''), + (79, 1, '94', '321', '9', 57, 0, 3, '', 1, ''), + (80, 1, '222', '1267', '6', 1309, 0, 3, '', 1, ''), + (81, 1, '101', '436', '18', 54, 0, 3, '', 1, ''), + (82, 1, '425', '1223', '25', 170, 0, 3, '', 1, ''), + (83, 0, '0', '0', '0', 11100, 1, 4, '', 0, ''), + (84, 0, '618', '44', '58', 11000, 4, 4, '', 1, ''), + (85, 0, '0', '0', '0', 11200, 1, 4, '', 0, ''), + (86, 0, '0', '0', '0', 11300, 1, 4, '', 0, ''), + (87, 1, '63', '613', '55', 13, 0, 4, 'Space', 1, ''), + (88, 1, '85', '713', '23', 13, 0, 4, '[b]Tips & Tactics[/b]', 1, ''), + (89, 1, '40', '542', '53', 13, 0, 4, 'Moving', 1, ''), + (90, 1, '54', '958', '33', 13, 0, 4, '[color=#d80000][b]Tip 2:[/b][/color] If you are wobbling all over \rthe place, you can get your \rbalance back once during \rthe game using the \'stabilise\' button \r(space bar).', 1, ''), + (91, 1, '90', '742', '31', 13, 9, 4, '[color=#d80000][b]Tip 1:[/b][/color] When the game starts, you\rwill see a pop up window.\rOn the right is a balance meter. \r\rWhen the hand points straight up,\ryou\'re perfectly balanced. When it \rpoints to the right, you need to \rbalance to the left, and vice versa. \r\rIf the hand drops too far either side\ryou have lost your balance and will\rfall into the water and lose.', 1, ''), + (92, 1, '56', '1034', '29', 13, 0, 4, '[color=#d80000][b]Tip 3:[/b][/color] Moving away from your \ropponent during a game \rwill allow you time to balance.', 1, ''), + (93, 1, '334', '955', '14', 13, 4, 4, '[color=#d80000][b]The Queue System[/b][/color]\r\rWhen you have a ticket, get into the pool, swim over and climb on the inflatables to queue for your turn. \r\rThe game starts when two players are ready.', 1, ''), + (94, 1, '178', '468', '35', 13, 0, 4, 'Balance', 1, ''), + (95, 1, '43', '488', '51', 13, 0, 4, 'Push', 1, ''), + (96, 1, '336', '745', '25', 13, 4, 4, '[color=#d80000][b]Buying Tickets[/b][/color]\r\rTo play Wobble Squabble, you need tickets. You can get tickets by clicking on the inflatables, or by clicking on the ticket machine beside the pool.\r\rTickets cost [b][color=#fe6301]6 Credits for 20[/color][/b] or [b][color=#fe6301]1 Credit for 2[/color][/b]. \r\rIn Wobble Squabble the winner stays on, so if you win a game stay on the inflatables and the next one is free!', 1, ''), + (97, 1, '28', '438', '47', 13, 0, 4, 'Balance', 1, ''), + (98, 1, '760', '248', '3', 1129, 0, 4, '', 1, ''), + (99, 1, '330', '207', '1', 150, 0, 4, '', 1, ''), + (100, 1, '329', '145', '2', 150, 0, 4, '', 1, ''), + (101, 1, '162', '387', '2', 13, 2, 5, '[b]Eeek, collision course![/b]', 1, ''), + (102, 0, '0', '0', '0', 11100, 1, 5, '', 0, ''), + (103, 0, '644', '11', '19', 11000, 5, 5, '', 1, ''), + (104, 0, '0', '0', '0', 11200, 1, 5, '', 0, ''), + (105, 0, '0', '0', '0', 11300, 1, 5, '', 0, ''), + (106, 1, '69', '194', '6', 13, 2, 5, '[b]Hey dude! Don\'t you know the rules? Check out the How to Play thread in the [url=https://classichabbo.com/groups/snowstorm/discussions]discussion forum[/url][/b]', 1, ''), + (107, 1, '516', '1083', '1', 13, 2, 5, '[b]Not again...[/b]', 1, ''), + (108, 1, '556', '317', '4', 183, 0, 5, '', 1, ''); +/*!40000 ALTER TABLE `cms_stickers` ENABLE KEYS */; + +-- Dumping structure for table hotel.groups_details +CREATE TABLE IF NOT EXISTS `groups_details` ( + `id` int(10) NOT NULL AUTO_INCREMENT, + `name` varchar(45) NOT NULL, + `description` mediumtext NOT NULL, + `owner_id` int(10) NOT NULL, + `room_id` int(10) NOT NULL DEFAULT 0, + `badge` mediumtext NOT NULL DEFAULT 'b0503Xs09114s05013s05015', + `recommended` int(1) NOT NULL DEFAULT 0, + `background` varchar(255) NOT NULL DEFAULT 'bg_colour_08', + `views` int(15) NOT NULL DEFAULT 0, + `topics` smallint(1) NOT NULL DEFAULT 0, + `group_type` tinyint(3) unsigned NOT NULL DEFAULT 0, + `forum_type` tinyint(1) unsigned NOT NULL DEFAULT 0, + `forum_premission` tinyint(1) unsigned NOT NULL DEFAULT 0, + `alias` varchar(30) DEFAULT NULL, + `created_at` datetime NOT NULL DEFAULT current_timestamp(), + PRIMARY KEY (`id`), + UNIQUE KEY `alias` (`alias`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table hotel.groups_details: ~5 rows (approximately) +DELETE FROM `groups_details`; +/*!40000 ALTER TABLE `groups_details` DISABLE KEYS */; +INSERT INTO `groups_details` (`id`, `name`, `description`, `owner_id`, `room_id`, `badge`, `recommended`, `background`, `views`, `topics`, `group_type`, `forum_type`, `forum_premission`, `alias`, `created_at`) VALUES + (1, 'Habbo Guides (Official)', 'The official Habbo Guides Group.', 1, 0, 'b1205Xs43104s38114', 0, 'guidesgroup_bg', 0, 0, 0, 0, 0, 'officialhabboguides', '2019-12-11 18:55:51'), + (2, 'BattleBall: Rebound!', 'Learn all about BattleBall here!', 1, 0, 'b1013Xs04038s04064s04100', 0, 'BB_Group2', 0, 0, 0, 0, 0, 'battleball_rebound', '2019-12-19 08:27:31'), + (3, 'Lido Diving', 'Official Lido Diving group', 1, 0, 'b0816Xs58111s58063s58065', 0, 'bg_lido_flat', 0, 0, 0, 0, 0, 'lido', '2019-12-19 08:43:58'), + (4, 'Wobble Squabble', 'Learn about Wobble Squabble here!', 1, 0, 'b1201Xs58164s47023s46025', 0, 'WS_Group2', 0, 0, 0, 0, 0, 'wobble_squabble', '2019-12-19 08:51:23'), + (5, 'SnowStorm', 'Learn all about SnowStorm here!', 1, 0, 'b1216Xs04116s05118s05110s04112', 0, 'snowstorm_bg', 0, 0, 0, 0, 0, 'snow_storm', '2019-12-21 04:23:46'); +/*!40000 ALTER TABLE `groups_details` ENABLE KEYS */; + +/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */; +/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; diff --git a/tools/havana.sql b/tools/havana.sql new file mode 100644 index 0000000..b95c2b4 --- /dev/null +++ b/tools/havana.sql @@ -0,0 +1,57086 @@ +-- -------------------------------------------------------- +-- Host: 127.0.0.1 +-- Server version: 10.4.7-MariaDB - mariadb.org binary distribution +-- Server OS: Win64 +-- HeidiSQL Version: 10.2.0.5599 +-- -------------------------------------------------------- + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET NAMES utf8 */; +/*!50503 SET NAMES utf8mb4 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; + +-- Dumping structure for table havana.achievements +CREATE TABLE IF NOT EXISTS `achievements` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `achievement` varchar(64) NOT NULL, + `level` int(11) NOT NULL DEFAULT 1, + `reward_pixels` int(11) NOT NULL DEFAULT 0, + `progress_needed` int(11) NOT NULL DEFAULT 1, + `disabled` int(11) NOT NULL DEFAULT 0, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=116 DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.achievements: ~106 rows (approximately) +DELETE FROM `achievements`; +/*!40000 ALTER TABLE `achievements` DISABLE KEYS */; +INSERT INTO `achievements` (`id`, `achievement`, `level`, `reward_pixels`, `progress_needed`, `disabled`) VALUES + (1, 'ACH_Motto', 1, 10, 1, 0), + (2, 'ACH_AvatarLooks', 1, 50, 1, 0), + (3, 'ACH_MGM', 1, 50, 1, 0), + (4, 'ACH_MGM', 2, 55, 2, 0), + (5, 'ACH_MGM', 3, 60, 3, 0), + (6, 'ACH_MGM', 4, 130, 5, 0), + (7, 'ACH_MGM', 5, 140, 7, 0), + (8, 'ACH_MGM', 6, 150, 9, 0), + (9, 'ACH_MGM', 7, 160, 11, 0), + (10, 'ACH_MGM', 8, 170, 13, 0), + (11, 'ACH_MGM', 9, 180, 15, 0), + (12, 'ACH_MGM', 10, 200, 17, 0), + (13, 'ACH_Student', 1, 20, 1, 1), + (14, 'ACH_RespectGiven', 1, 20, 100, 0), + (15, 'ACH_AvatarTags', 1, 50, 5, 0), + (16, 'ACH_EmailVerification', 1, 200, 1, 1), + (17, 'ACH_Graduate', 1, 20, 1, 0), + (18, 'ACH_HappyHour', 1, 100, 1, 0), + (19, 'HC', 1, 100, 1, 0), + (20, 'HC', 2, 200, 12, 0), + (21, 'HC', 3, 300, 24, 0), + (22, 'ACH_Login', 1, 50, 5, 0), + (23, 'ACH_Login', 2, 80, 8, 0), + (24, 'ACH_Login', 3, 120, 15, 0), + (25, 'ACH_Login', 4, 150, 28, 0), + (26, 'ACH_Login', 5, 200, 35, 0), + (27, 'ACH_Login', 6, 200, 60, 0), + (28, 'ACH_Login', 7, 200, 70, 0), + (29, 'ACH_Login', 8, 200, 80, 0), + (30, 'ACH_Login', 9, 200, 90, 0), + (31, 'ACH_Login', 10, 200, 100, 0), + (32, 'ACH_RegistrationDuration', 1, 30, 3, 0), + (33, 'ACH_RegistrationDuration', 2, 60, 21, 0), + (34, 'ACH_RegistrationDuration', 3, 90, 56, 0), + (35, 'ACH_RegistrationDuration', 4, 120, 112, 0), + (36, 'ACH_RegistrationDuration', 5, 160, 168, 0), + (37, 'ACH_RegistrationDuration', 6, 200, 365, 0), + (38, 'ACH_RegistrationDuration', 7, 200, 730, 0), + (39, 'ACH_RegistrationDuration', 8, 200, 1095, 0), + (40, 'ACH_RegistrationDuration', 9, 200, 1461, 0), + (41, 'ACH_RegistrationDuration', 10, 200, 1826, 0), + (42, 'ACH_RespectEarned', 1, 20, 1, 0), + (43, 'ACH_RespectEarned', 2, 20, 5, 0), + (44, 'ACH_RespectEarned', 3, 20, 10, 0), + (45, 'ACH_RespectEarned', 4, 50, 50, 0), + (46, 'ACH_RespectEarned', 5, 100, 100, 0), + (47, 'ACH_RespectEarned', 6, 200, 200, 0), + (48, 'ACH_RespectEarned', 7, 200, 200, 0), + (49, 'ACH_RespectEarned', 8, 200, 200, 0), + (50, 'ACH_RespectEarned', 9, 200, 200, 0), + (51, 'ACH_RespectEarned', 10, 200, 400, 0), + (52, 'ACH_RoomEntry', 1, 10, 5, 0), + (53, 'ACH_RoomEntry', 2, 10, 15, 0), + (54, 'ACH_RoomEntry', 3, 15, 30, 0), + (55, 'ACH_RoomEntry', 4, 15, 50, 0), + (56, 'ACH_RoomEntry', 5, 15, 60, 0), + (57, 'ACH_RoomEntry', 6, 20, 80, 0), + (58, 'ACH_RoomEntry', 7, 20, 120, 0), + (59, 'ACH_RoomEntry', 8, 30, 140, 0), + (60, 'ACH_RoomEntry', 9, 30, 160, 0), + (61, 'ACH_RoomEntry', 10, 40, 200, 0), + (62, 'ACH_TraderPass', 1, 0, 0, 0), + (72, 'ACH_AIPerformanceVote', 1, 20, 1, 0), + (73, 'ACH_AIPerformanceVote', 2, 20, 20, 0), + (74, 'ACH_AIPerformanceVote', 3, 20, 50, 0), + (75, 'ACH_AIPerformanceVote', 4, 20, 100, 0), + (76, 'ACH_AIPerformanceVote', 5, 40, 180, 0), + (77, 'ACH_AIPerformanceVote', 6, 40, 200, 0), + (78, 'ACH_AIPerformanceVote', 7, 40, 200, 0), + (79, 'ACH_AIPerformanceVote', 8, 60, 300, 0), + (80, 'ACH_AIPerformanceVote', 9, 60, 300, 0), + (81, 'ACH_AIPerformanceVote', 10, 100, 1, 0), + (82, 'HC', 4, 400, 36, 0), + (83, 'HC', 5, 500, 48, 0), + (84, 'ACH_AllTimeHotelPresence', 1, 30, 1, 0), + (85, 'ACH_AllTimeHotelPresence', 2, 20, 3, 0), + (86, 'ACH_AllTimeHotelPresence', 3, 20, 8, 0), + (87, 'ACH_AllTimeHotelPresence', 4, 20, 16, 0), + (88, 'ACH_AllTimeHotelPresence', 5, 20, 48, 0), + (89, 'ACH_AllTimeHotelPresence', 6, 20, 144, 0), + (90, 'ACH_AllTimeHotelPresence', 7, 20, 288, 0), + (91, 'ACH_AllTimeHotelPresence', 8, 20, 576, 0), + (92, 'ACH_AllTimeHotelPresence', 9, 20, 1152, 0), + (93, 'ACH_AllTimeHotelPresence', 10, 20, 2304, 0), + (94, 'ACH_GamePlayed', 1, 10, 1, 0), + (95, 'ACH_GamePlayed', 2, 30, 5, 0), + (96, 'ACH_GamePlayed', 3, 50, 20, 0), + (97, 'ACH_GamePlayed', 4, 80, 50, 0), + (98, 'ACH_GamePlayed', 5, 100, 100, 0), + (99, 'ACH_GamePlayed', 6, 120, 160, 0), + (100, 'ACH_GamePlayed', 7, 160, 200, 0), + (101, 'ACH_GamePlayed', 8, 220, 280, 0), + (102, 'ACH_GamePlayed', 9, 280, 360, 0), + (103, 'ACH_GamePlayed', 10, 340, 440, 0), + (104, 'GL', 1, 15, 1, 0), + (105, 'GL', 2, 32, 4, 0), + (106, 'GL', 3, 34, 10, 0), + (107, 'GL', 4, 90, 20, 0), + (108, 'GL', 5, 285, 35, 0), + (109, 'GL', 6, 600, 56, 0), + (110, 'GL', 7, 660, 77, 0), + (111, 'GL', 8, 735, 96, 0), + (112, 'GL', 9, 920, 132, 0), + (113, 'GL', 10, 1000, 177, 0), + (114, 'ACH_Student', 1, 20, 1, 0), + (115, 'ACH_EmailVerification', 1, 200, 1, 0); +/*!40000 ALTER TABLE `achievements` ENABLE KEYS */; + +-- Dumping structure for table havana.article_categories +CREATE TABLE IF NOT EXISTS `article_categories` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `label` varchar(50) NOT NULL, + `category_index` varchar(50) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8; + +-- Dumping data for table havana.article_categories: ~11 rows (approximately) +DELETE FROM `article_categories`; +/*!40000 ALTER TABLE `article_categories` DISABLE KEYS */; +INSERT INTO `article_categories` (`id`, `label`, `category_index`) VALUES + (1, 'Fansites', 'fansites'), + (2, 'Events', 'events'), + (3, 'Competitions & Polls', 'competitions'), + (4, 'Staff Picks', 'staff_picks'), + (5, 'Celebrity Visits', 'celebrity_visits'), + (6, 'Safety & Security', 'safety'), + (7, 'Technical Updates', 'technical_updates'), + (8, 'Furniture News', 'furniture_news'), + (9, 'Special Offers', 'credit_promo'), + (10, 'Sponsored', 'sponsored'), + (11, 'Other', 'other'); +/*!40000 ALTER TABLE `article_categories` ENABLE KEYS */; + +-- Dumping structure for table havana.catalogue_collectables +CREATE TABLE IF NOT EXISTS `catalogue_collectables` ( + `store_page` int(11) NOT NULL, + `admin_page` int(11) NOT NULL, + `expiry` bigint(11) NOT NULL, + `lifetime` bigint(11) NOT NULL DEFAULT 2678400, + `current_position` int(11) NOT NULL, + `class_names` text NOT NULL, + PRIMARY KEY (`store_page`), + UNIQUE KEY `store_page` (`store_page`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.catalogue_collectables: ~3 rows (approximately) +DELETE FROM `catalogue_collectables`; +/*!40000 ALTER TABLE `catalogue_collectables` DISABLE KEYS */; +INSERT INTO `catalogue_collectables` (`store_page`, `admin_page`, `expiry`, `lifetime`, `current_position`, `class_names`) VALUES + (51, 83, -1, 1209600, 0, 'svnr_de,SF_alien,svnr_uk,lostc_merdragon,svnr_it,totem_leg,svnr_nl,totem_planet,svnr_aus,svnr_fi,lostc_octopus,totem_head,sf_pod,hween09_organ,sf_mbar,lostc_teleport'), + (93, 94, -1, 2678400, 0, 'planet_of_love,saturn,pix_asteroid'), + (51999, 121999, 1662543224, 432000, 1, 'xmas11_btlr,xmas11_throne'); +/*!40000 ALTER TABLE `catalogue_collectables` ENABLE KEYS */; + +-- Dumping structure for table havana.catalogue_items +CREATE TABLE IF NOT EXISTS `catalogue_items` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `sale_code` varchar(255) DEFAULT NULL, + `page_id` tinytext DEFAULT NULL, + `order_id` int(11) NOT NULL DEFAULT 0, + `price_coins` int(11) NOT NULL DEFAULT 3, + `price_pixels` int(11) NOT NULL DEFAULT 0, + `seasonal_coins` int(11) NOT NULL DEFAULT 0, + `seasonal_pixels` int(11) NOT NULL DEFAULT 0, + `hidden` tinyint(1) NOT NULL DEFAULT 0, + `amount` int(11) NOT NULL DEFAULT 1, + `definition_id` int(11) DEFAULT NULL, + `item_specialspriteid` varchar(25) NOT NULL DEFAULT '', + `is_package` tinyint(1) NOT NULL DEFAULT 0, + `active_at` varchar(50) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `id` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=2104 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT; + +-- Dumping data for table havana.catalogue_items: ~2,103 rows (approximately) +DELETE FROM `catalogue_items`; +/*!40000 ALTER TABLE `catalogue_items` DISABLE KEYS */; +INSERT INTO `catalogue_items` (`id`, `sale_code`, `page_id`, `order_id`, `price_coins`, `price_pixels`, `seasonal_coins`, `seasonal_pixels`, `hidden`, `amount`, `definition_id`, `item_specialspriteid`, `is_package`, `active_at`) VALUES + (1, 'floor', '3', 1, 2, 0, 0, 0, 0, 1, 249, '', 0, NULL), + (2, 'CF_50_goldbar', '4', 5, 50, 0, 0, 0, 0, 1, 212, '', 0, NULL), + (3, 'CF_20_moneybag', '4', 4, 20, 0, 0, 0, 0, 1, 211, '', 0, NULL), + (4, 'CF_10_coin_gold', '4', 3, 10, 0, 0, 0, 0, 1, 209, '', 0, NULL), + (5, 'CF_5_coin_silver', '4', 2, 5, 0, 0, 0, 0, 1, 213, '', 0, NULL), + (6, 'CF_1_coin_bronze', '4', 1, 1, 0, 0, 0, 0, 1, 210, '', 0, NULL), + (7, 'a0 deal102', '5', 13, 25, 0, 0, 0, 0, 5, 184, '', 0, NULL), + (8, 'a0 deal104', '5', 14, 15, 0, 0, 0, 0, 3, 184, '', 0, NULL), + (9, 'queue_tile1*2', '5', 15, 7, 0, 0, 0, 0, 1, 184, '', 0, NULL), + (10, 'a0 deal105', '111', 4, 25, 0, 0, 0, 0, 5, 180, '', 0, NULL), + (11, 'a0 deal106', '111', 5, 15, 0, 0, 0, 0, 3, 180, '', 0, NULL), + (12, 'queue_tile1*6', '111', 6, 7, 0, 0, 0, 0, 1, 180, '', 0, NULL), + (13, 'a0 deal107', '111', 7, 25, 0, 0, 0, 0, 5, 181, '', 0, NULL), + (14, 'a0 deal108', '111', 8, 15, 0, 0, 0, 0, 3, 181, '', 0, NULL), + (15, 'queue_tile1*9', '111', 9, 7, 0, 0, 0, 0, 1, 181, '', 0, NULL), + (16, 'a0 deal109', '5', 10, 25, 0, 0, 0, 0, 5, 182, '', 0, NULL), + (17, 'a0 deal114', '5', 11, 15, 0, 0, 0, 0, 3, 182, '', 0, NULL), + (18, 'queue_tile1*8', '5', 12, 7, 0, 0, 0, 0, 1, 182, '', 0, NULL), + (19, 'a0 deal115', '111', 14, 25, 0, 0, 0, 0, 5, 183, '', 0, NULL), + (20, 'queue_tile1*7', '111', 16, 7, 0, 0, 0, 0, 1, 183, '', 0, NULL), + (21, 'a0 deal116', '111', 15, 15, 0, 0, 0, 0, 3, 183, '', 0, NULL), + (22, 'door', '6', 1, 3, 0, 0, 0, 0, 1, 100, '', 0, NULL), + (23, 'doorC', '6', 2, 4, 0, 0, 0, 0, 1, 102, '', 0, NULL), + (24, 'doorB', '6', 3, 3, 0, 0, 0, 0, 1, 101, '', 0, NULL), + (25, 'pets0', '7', 1, 20, 0, 0, 0, 0, 1, 154, '', 0, NULL), + (26, 'pets1', '7', 2, 20, 0, 0, 0, 0, 1, 564, '', 0, NULL), + (27, 'pets2', '7', 3, 20, 0, 0, 0, 0, 1, 565, '', 0, NULL), + (28, 'deal_dogfood', '8', 1, 2, 0, 0, 0, 0, 1, 0, '', 1, NULL), + (29, 'deal_catfood', '8', 2, 2, 0, 0, 0, 0, 1, 0, '', 1, NULL), + (30, 'deal_crocfood', '8', 3, 2, 0, 0, 0, 0, 1, 0, '', 1, NULL), + (31, 'deal_cabbage', '8', 4, 2, 0, 0, 0, 0, 1, 0, '', 1, NULL), + (32, 'petfood1', '8', 5, 1, 0, 0, 0, 0, 1, 155, '', 0, NULL), + (33, 'petfood2', '8', 6, 1, 0, 0, 0, 0, 1, 156, '', 0, NULL), + (34, 'petfood4', '8', 7, 1, 0, 0, 0, 0, 1, 236, '', 0, NULL), + (35, 'petfood3', '8', 8, 1, 0, 0, 0, 0, 1, 157, '', 0, NULL), + (36, 'waterbowl*4', '8', 9, 2, 0, 0, 0, 0, 1, 158, '', 0, NULL), + (37, 'waterbowl*5', '8', 10, 2, 0, 0, 0, 0, 1, 159, '', 0, NULL), + (38, 'waterbowl*2', '8', 11, 2, 0, 0, 0, 0, 1, 160, '', 0, NULL), + (39, 'waterbowl*1', '8', 12, 2, 0, 0, 0, 0, 1, 161, '', 0, NULL), + (40, 'waterbowl*3', '8', 13, 2, 0, 0, 0, 0, 1, 162, '', 0, NULL), + (41, 'goodie2', '8', 14, 1, 0, 0, 0, 0, 1, 169, '', 0, NULL), + (42, 'goodie1', '8', 15, 1, 0, 0, 0, 0, 1, 168, '', 0, NULL), + (43, 'toy1', '8', 16, 2, 0, 0, 0, 0, 1, 163, '', 0, NULL), + (44, 'toy1*1', '8', 17, 2, 0, 0, 0, 0, 1, 164, '', 0, NULL), + (45, 'toy1*2', '8', 18, 2, 0, 0, 0, 0, 1, 165, '', 0, NULL), + (46, 'toy1*3', '8', 19, 2, 0, 0, 0, 0, 1, 166, '', 0, NULL), + (47, 'toy1*4', '8', 20, 2, 0, 0, 0, 0, 1, 167, '', 0, NULL), + (48, 'bed_silo_two', '9', 11, 3, 0, 0, 0, 0, 1, 20, '', 0, NULL), + (49, 'bed_silo_one', '9', 10, 3, 0, 0, 0, 0, 1, 19, '', 0, NULL), + (50, 'shelves_silo', '9', 15, 3, 0, 0, 0, 0, 1, 3, '', 0, NULL), + (51, 'sofa_silo', '9', 1, 3, 0, 0, 0, 0, 1, 9, '', 0, NULL), + (52, 'sofachair_silo', '9', 1, 3, 0, 0, 0, 0, 1, 16, '', 0, NULL), + (53, 'table_silo_small', '9', 1, 1, 0, 0, 0, 0, 1, 21, '', 0, NULL), + (54, 'divider_silo3', '9', 1, 6, 0, 0, 0, 0, 1, 122, '', 0, NULL), + (55, 'divider_silo2', '9', 20, 3, 0, 0, 0, 0, 1, 120, '', 0, NULL), + (56, 'divider_silo1', '9', 1, 3, 0, 0, 0, 0, 1, 118, '', 0, NULL), + (57, 'chair_silo', '9', 1, 3, 0, 0, 0, 0, 1, 8, '', 0, NULL), + (58, 'safe_silo', '9', 1, 3, 0, 0, 0, 0, 1, 203, '', 0, NULL), + (59, 'barchair_silo', '9', 1, 3, 0, 0, 0, 0, 1, 197, '', 0, NULL), + (60, 'table_silo_med', '9', 1, 3, 0, 0, 0, 0, 1, 6, '', 0, NULL), + (61, 'gothic_chair*3', '10', 7, 10, 0, 0, 0, 0, 1, 229, '', 0, NULL), + (62, 'gothic_sofa*3', '10', 8, 7, 0, 0, 0, 0, 1, 230, '', 0, NULL), + (63, 'gothic_stool*3', '10', 9, 5, 0, 0, 0, 0, 1, 231, '', 0, NULL), + (64, 'gothic_carpet', '10', 25, 5, 0, 0, 0, 0, 1, 237, '', 0, NULL), + (65, 'gothic_carpet2', '10', 24, 5, 0, 0, 0, 0, 1, 238, '', 0, NULL), + (66, 'goth_table', '10', 19, 15, 0, 0, 0, 0, 1, 218, '', 0, NULL), + (67, 'gothrailing', '10', 23, 8, 0, 0, 0, 0, 1, 217, '', 0, NULL), + (68, 'gothgate', '10', 20, 10, 0, 0, 0, 0, 1, 215, '', 0, NULL), + (69, 'torch', '10', 24, 7, 0, 0, 0, 0, 1, 248, '', 0, NULL), + (70, 'gothicfountain', '10', 22, 7, 0, 0, 0, 0, 1, 245, '', 0, NULL), + (71, 'gothiccandelabra', '10', 21, 8, 0, 0, 0, 0, 1, 216, '', 0, NULL), + (72, 'industrialfan', '10', 25, 5, 0, 0, 0, 0, 1, 247, '', 0, NULL), + (73, 'sound_machine_deal', '11', 1, 10, 0, 0, 0, 0, 1, 0, '', 1, NULL), + (74, 'sound_set_1', '88', 9, 3, 0, 0, 0, 0, 1, 239, '', 0, NULL), + (75, 'sound_set_2', '88', 9, 3, 0, 0, 0, 0, 1, 357, '', 0, NULL), + (76, 'sound_set_4', '85', 9, 3, 0, 0, 0, 0, 1, 358, '', 0, NULL), + (77, 'sound_set_5', '85', 9, 3, 0, 0, 0, 0, 1, 359, '', 0, NULL), + (78, 'sound_set_3', '85', 4, 3, 0, 0, 0, 0, 1, 240, '', 0, NULL), + (79, 'sound_set_6', '85', 9, 3, 0, 0, 0, 0, 1, 241, '', 0, NULL), + (80, 'sound_set_7', '88', 9, 3, 0, 0, 0, 0, 1, 242, '', 0, NULL), + (81, 'sound_set_9', '85', 9, 3, 0, 0, 0, 0, 1, 355, '', 0, NULL), + (82, 'sound_set_8', '85', 9, 3, 0, 0, 0, 0, 1, 243, '', 0, NULL), + (83, 'bardesk_polyfon*5', '12', 1, 3, 0, 0, 0, 0, 1, 198, '', 0, NULL), + (84, 'bardeskcorner_polyfon*5', '12', 2, 3, 0, 0, 0, 0, 1, 199, '', 0, NULL), + (85, 'divider_poly3*5', '12', 3, 6, 0, 0, 0, 0, 1, 200, '', 0, NULL), + (86, 'sofachair_polyfon_girl', '12', 4, 3, 0, 0, 0, 0, 1, 64, '', 0, NULL), + (87, 'sofa_polyfon_girl', '12', 5, 4, 0, 0, 0, 0, 1, 67, '', 0, NULL), + (88, 'carpet_polar*1', '12,99,100', 6, 4, 0, 0, 0, 0, 1, 62, '', 0, NULL), + (89, 'bed_polyfon_girl_one', '12', 7, 3, 0, 0, 0, 0, 1, 65, '', 0, NULL), + (90, 'bed_polyfon_girl', '12', 8, 4, 0, 0, 0, 0, 1, 66, '', 0, NULL), + (91, 'wall_china', '13', 1, 8, 0, 0, 0, 0, 1, 207, '', 0, NULL), + (92, 'corner_china', '13', 2, 8, 0, 0, 0, 0, 1, 208, '', 0, NULL), + (93, 'china_shelve', '13', 3, 8, 0, 0, 0, 0, 1, 204, '', 0, NULL), + (94, 'chair_china', '13', 4, 5, 0, 0, 0, 0, 1, 201, '', 0, NULL), + (95, 'china_table', '13', 5, 6, 0, 0, 0, 0, 1, 202, '', 0, NULL), + (96, 'cn_sofa', '13', 6, 9, 0, 0, 0, 0, 1, 186, '', 0, NULL), + (97, 'poster_57', '13', 7, 3, 0, 0, 0, 0, 1, 251, '57', 0, NULL), + (98, 'poster_58', '13', 8, 5, 0, 0, 0, 0, 1, 251, '58', 0, NULL), + (99, 'cn_lamp', '13', 9, 9, 0, 0, 0, 0, 1, 185, '', 0, NULL), + (100, 'chair_norja', '14', 1, 3, 0, 0, 0, 0, 1, 11, '', 0, NULL), + (101, 'couch_norja', '14', 2, 3, 0, 0, 0, 0, 1, 10, '', 0, NULL), + (102, 'table_norja_med', '14', 3, 3, 0, 0, 0, 0, 1, 252, '', 0, NULL), + (103, 'shelves_norja', '14', 4, 3, 0, 0, 0, 0, 1, 1, '', 0, NULL), + (104, 'soft_sofachair_norja', '14', 5, 3, 0, 0, 0, 0, 1, 95, '', 0, NULL), + (105, 'soft_sofa_norja', '14', 6, 4, 0, 0, 0, 0, 1, 96, '', 0, NULL), + (106, 'divider_nor2', '14', 7, 3, 0, 0, 0, 0, 1, 119, '', 0, NULL), + (107, 'divider_nor1', '14', 8, 3, 0, 0, 0, 0, 1, 117, '', 0, NULL), + (108, 'divider_nor3', '14', 9, 6, 0, 0, 0, 0, 1, 121, '', 0, NULL), + (109, 'divider_nor4', '14', 10, 5, 0, 0, 0, 0, 1, 206, '', 0, NULL), + (110, 'divider_nor5', '14', 11, 4, 0, 0, 0, 0, 1, 205, '', 0, NULL), + (111, 'bed_armas_two', '15', 1, 3, 0, 0, 0, 0, 1, 22, '', 0, NULL), + (112, 'bed_armas_one', '15', 2, 3, 0, 0, 0, 0, 1, 30, '', 0, NULL), + (113, 'fireplace_armas', '15', 3, 4, 0, 0, 0, 0, 1, 28, '', 0, NULL), + (114, 'bartable_armas', '15', 4, 3, 0, 0, 0, 0, 1, 51, '', 0, NULL), + (115, 'table_armas', '15', 5, 3, 0, 0, 0, 0, 1, 25, '', 0, NULL), + (116, 'bench_armas', '15', 6, 3, 0, 0, 0, 0, 1, 24, '', 0, NULL), + (117, 'divider_arm2', '15', 7, 3, 0, 0, 0, 0, 1, 115, '', 0, NULL), + (118, 'divider_arm1', '15', 8, 3, 0, 0, 0, 0, 1, 114, '', 0, NULL), + (119, 'divider_arm3', '15', 9, 6, 0, 0, 0, 0, 1, 116, '', 0, NULL), + (120, 'shelves_armas', '15', 10, 3, 0, 0, 0, 0, 1, 23, '', 0, NULL), + (121, 'bar_armas', '15', 11, 4, 0, 0, 0, 0, 1, 50, '', 0, NULL), + (122, 'bar_chair_armas', '15', 12, 1, 0, 0, 0, 0, 1, 52, '', 0, NULL), + (123, 'lamp_armas', '15', 13, 3, 0, 0, 0, 0, 1, 29, '', 0, NULL), + (124, 'lamp2_armas', '15', 14, 3, 0, 0, 0, 0, 1, 98, '', 0, NULL), + (125, 'small_table_armas', '15', 15, 2, 0, 0, 0, 0, 1, 26, '', 0, NULL), + (126, 'small_chair_armas', '15', 16, 1, 0, 0, 0, 0, 1, 27, '', 0, NULL), + (127, 'bed_budgetb_one', '17', 10, 3, 0, 0, 0, 0, 1, 68, '', 0, NULL), + (128, 'bed_budgetb', '17', 10, 3, 0, 0, 0, 0, 1, 69, '', 0, NULL), + (129, 'shelves_basic', '17', 10, 3, 0, 0, 0, 0, 1, 94, '', 0, NULL), + (130, 'bar_basic', '17', 10, 4, 0, 0, 0, 0, 1, 93, '', 0, NULL), + (131, 'fridge', '17', 10, 6, 0, 0, 0, 0, 1, 99, '', 0, NULL), + (132, 'lamp_basic', '17', 10, 3, 0, 0, 0, 0, 1, 97, '', 0, NULL), + (133, 'bed_polyfon', '18', 0, 4, 0, 0, 0, 0, 1, 17, '', 0, NULL), + (134, 'bed_polyfon_one', '18', 0, 3, 0, 0, 0, 0, 1, 18, '', 0, NULL), + (135, 'fireplace_polyfon', '18', 200, 5, 0, 0, 0, 0, 1, 34, '', 0, NULL), + (136, 'sofachair_polyfon', '18', 0, 3, 0, 0, 0, 0, 1, 15, '', 0, NULL), + (137, 'bar_polyfon', '18', 200, 5, 0, 0, 0, 0, 1, 45, '', 0, NULL), + (138, 'bardesk_polyfon', '18', 0, 3, 0, 0, 0, 0, 1, 48, '', 0, NULL), + (139, 'bardeskcorner_polyfon', '18', 0, 3, 0, 0, 0, 0, 1, 49, '', 0, NULL), + (140, 'divider_poly3', '18', 200, 6, 0, 0, 0, 0, 1, 113, '', 0, NULL), + (141, 'chair_polyfon', '18', 200, 3, 0, 0, 0, 0, 1, 5, '', 0, NULL), + (142, 'smooth_table_polyfon', '18', 200, 4, 0, 0, 0, 0, 1, 63, '', 0, NULL), + (143, 'table_polyfon_med', '18', 200, 3, 0, 0, 0, 0, 1, 12, '', 0, NULL), + (144, 'table_polyfon_small', '18', 200, 1, 0, 0, 0, 0, 1, 4, '', 0, NULL), + (145, 'shelves_polyfon', '18', 200, 4, 0, 0, 0, 0, 1, 2, '', 0, NULL), + (146, 'stand_polyfon_z', '18', 200, 1, 0, 0, 0, 0, 1, 7, '', 0, NULL), + (147, 'tv_luxus', '19', 1, 6, 0, 0, 0, 0, 1, 83, '', 0, NULL), + (148, 'wood_tv', '19', 2, 4, 0, 0, 0, 0, 1, 61, '', 0, NULL), + (149, 'red_tv', '19', 3, 3, 0, 0, 0, 0, 1, 60, '', 0, NULL), + (150, 'A2 tlp 20', '19', 4, 3, 0, 0, 0, 0, 1, 244, '', 0, NULL), + (151, 'pizza', '19', 5, 3, 0, 0, 0, 0, 1, 43, '', 0, NULL), + (152, 'drinks', '19', 6, 3, 0, 0, 0, 0, 1, 44, '', 0, NULL), + (153, 'bottle', '99,100', 7, 3, 0, 0, 0, 0, 1, 47, '', 0, NULL), + (154, 'edice', '19', 8, 6, 0, 0, 0, 0, 1, 111, '', 0, NULL), + (155, 'habbocake', '19', 9, 4, 0, 0, 0, 0, 1, 109, '', 0, NULL), + (156, 'menorah', '19', 10, 3, 0, 0, 0, 0, 1, 103, '', 0, NULL), + (157, 'bunny', '99,100,136', 11, 3, 0, 0, 0, 0, 1, 110, '', 0, NULL), + (158, 'poster_44', '101', 10, 3, 0, 0, 0, 0, 1, 251, '44', 0, NULL), + (159, 'wcandleset', '100', 13, 3, 0, 0, 0, 0, 1, 105, '', 0, NULL), + (160, 'rcandleset', '100', 14, 3, 0, 0, 0, 0, 1, 106, '', 0, NULL), + (161, 'ham', '19', 15, 3, 0, 0, 0, 0, 1, 104, '', 0, NULL), + (162, 'hockey_light', '19', 16, 5, 0, 0, 0, 0, 1, 131, '', 0, NULL), + (163, 'bath', '20', 1, 6, 0, 0, 0, 0, 1, 84, '', 0, NULL), + (164, 'sink', '20', 2, 3, 0, 0, 0, 0, 1, 85, '', 0, NULL), + (165, 'duck', '20', 3, 1, 0, 0, 0, 0, 1, 87, '', 0, NULL), + (166, 'toilet', '20', 4, 4, 0, 0, 0, 0, 1, 86, '', 0, NULL), + (167, 'toilet_red', '20', 5, 4, 0, 0, 0, 0, 1, 89, '', 0, NULL), + (168, 'toilet_yell', '20', 6, 4, 0, 0, 0, 0, 1, 90, '', 0, NULL), + (169, 'tile', '20', 7, 3, 0, 0, 0, 0, 1, 88, '', 0, NULL), + (170, 'tile_red', '20', 8, 3, 0, 0, 0, 0, 1, 91, '', 0, NULL), + (171, 'tile_yell', '20', 9, 3, 0, 0, 0, 0, 1, 92, '', 0, NULL), + (172, 'giftflowers', '99', 7, 4, 0, 0, 0, 0, 1, 108, '', 0, NULL), + (173, 'plant_rose', '99', 3, 3, 0, 0, 0, 0, 1, 82, '', 0, NULL), + (174, 'plant_sunflower', '21', 3, 3, 0, 0, 0, 0, 1, 81, '', 0, NULL), + (175, 'plant_yukka', '21', 4, 3, 0, 0, 0, 0, 1, 75, '', 0, NULL), + (176, 'plant_pineapple', '21', 5, 3, 0, 0, 0, 0, 1, 70, '', 0, NULL), + (177, 'plant_bonsai', '21', 6, 3, 0, 0, 0, 0, 1, 73, '', 0, NULL), + (178, 'plant_big_cactus', '21', 7, 3, 0, 0, 0, 0, 1, 74, '', 0, NULL), + (179, 'plant_small_cactus', '21', 8, 1, 0, 0, 0, 0, 1, 72, '', 0, NULL), + (180, 'plant_fruittree', '21', 9, 3, 0, 0, 0, 0, 1, 71, '', 0, NULL), + (181, 'plant_bulrush', '21', 10, 3, 0, 0, 0, 0, 1, 235, '', 0, NULL), + (182, 'plant_cruddy', '44', 11, 6, 0, 0, 0, 0, 1, 46, '', 0, NULL), + (183, 'plant_maze', '21', 12, 5, 0, 0, 0, 0, 1, 234, '', 0, NULL), + (184, 'plant_mazegate', '21', 13, 6, 0, 0, 0, 0, 1, 233, '', 0, NULL), + (185, 'poster_1004', '121', 1, 250, 180, 0, 0, 0, 1, 251, '1004', 0, NULL), + (186, 'poster_52', '22', 1, 3, 0, 0, 0, 0, 1, 251, '52', 0, NULL), + (187, 'poster_53', '22', 2, 3, 0, 0, 0, 0, 1, 251, '53', 0, NULL), + (188, 'poster_54', '22', 3, 3, 0, 0, 0, 0, 1, 251, '54', 0, NULL), + (189, 'hockey_score', '22', 4, 6, 0, 0, 0, 0, 1, 130, '', 0, NULL), + (190, 'legotrophy', '22', 5, 6, 0, 0, 0, 0, 1, 126, '', 0, NULL), + (191, 'poster_51', '22', 6, 3, 0, 0, 0, 0, 1, 251, '51', 0, NULL), + (192, 'carpet_legocourt', '22', 7, 3, 0, 0, 0, 0, 1, 124, '', 0, NULL), + (193, 'bench_lego', '22', 8, 6, 0, 0, 0, 0, 1, 125, '', 0, NULL), + (194, 'sporttrack1*1', '22', 9, 3, 0, 0, 0, 0, 1, 187, '', 0, NULL), + (195, 'sporttrack1*2', '22', 12, 3, 0, 0, 0, 0, 1, 189, '', 0, NULL), + (196, 'sporttrack1*3', '22', 15, 3, 0, 0, 0, 0, 1, 188, '', 0, NULL), + (197, 'sporttrack2*1', '22', 10, 3, 0, 0, 0, 0, 1, 190, '', 0, NULL), + (198, 'sporttrack2*2', '22', 13, 3, 0, 0, 0, 0, 1, 191, '', 0, NULL), + (199, 'sporttrack2*3', '22', 16, 3, 0, 0, 0, 0, 1, 192, '', 0, NULL), + (200, 'sporttrack3*1', '22', 11, 3, 0, 0, 0, 0, 1, 193, '', 0, NULL), + (201, 'sporttrack3*2', '22', 14, 3, 0, 0, 0, 0, 1, 194, '', 0, NULL), + (202, 'sporttrack3*3', '22', 17, 3, 0, 0, 0, 0, 1, 195, '', 0, NULL), + (203, 'footylamp', '22', 18, 4, 0, 0, 0, 0, 1, 196, '', 0, NULL), + (204, 'carpet_standard*4', '23', 1, 3, 0, 0, 0, 0, 1, 39, '', 0, NULL), + (205, 'carpet_standard*5', '23', 2, 3, 0, 0, 0, 0, 1, 41, '', 0, NULL), + (206, 'carpet_standard', '23', 3, 3, 0, 0, 0, 0, 1, 31, '', 0, NULL), + (207, 'carpet_standard*b', '23', 4, 3, 0, 0, 0, 0, 1, 80, '', 0, NULL), + (208, 'carpet_standard*a', '23', 5, 3, 0, 0, 0, 0, 1, 79, '', 0, NULL), + (209, 'carpet_standard*3', '23', 6, 3, 0, 0, 0, 0, 1, 38, '', 0, NULL), + (210, 'carpet_standard*2', '23', 7, 3, 0, 0, 0, 0, 1, 37, '', 0, NULL), + (211, 'carpet_standard*8', '23', 8, 3, 0, 0, 0, 0, 1, 77, '', 0, NULL), + (212, 'carpet_standard*7', '23', 9, 3, 0, 0, 0, 0, 1, 76, '', 0, NULL), + (213, 'carpet_standard*1', '23', 10, 3, 0, 0, 0, 0, 1, 35, '', 0, NULL), + (214, 'carpet_standard*6', '23', 11, 3, 0, 0, 0, 0, 1, 42, '', 0, NULL), + (215, 'carpet_standard*9', '23', 12, 3, 0, 0, 0, 0, 1, 78, '', 0, NULL), + (216, 'carpet_soft', '23', 13, 3, 0, 0, 0, 0, 1, 53, '', 0, NULL), + (217, 'carpet_soft*1', '23', 14, 3, 0, 0, 0, 0, 1, 54, '', 0, NULL), + (218, 'carpet_soft*2', '23', 15, 3, 0, 0, 0, 0, 1, 55, '', 0, NULL), + (219, 'carpet_soft*3', '23', 16, 3, 0, 0, 0, 0, 1, 56, '', 0, NULL), + (220, 'carpet_soft*4', '23', 17, 3, 0, 0, 0, 0, 1, 57, '', 0, NULL), + (221, 'carpet_soft*5', '23', 18, 3, 0, 0, 0, 0, 1, 58, '', 0, NULL), + (222, 'carpet_soft*6', '23', 19, 3, 0, 0, 0, 0, 1, 59, '', 0, NULL), + (223, 'doormat_love', '23', 20, 1, 0, 0, 0, 0, 1, 13, '', 0, NULL), + (224, 'doormat_plain', '23', 21, 1, 0, 0, 0, 0, 1, 14, '', 0, NULL), + (225, 'doormat_plain*1', '23', 22, 1, 0, 0, 0, 0, 1, 36, '', 0, NULL), + (226, 'doormat_plain*2', '23', 23, 1, 0, 0, 0, 0, 1, 254, '', 0, NULL), + (227, 'doormat_plain*3', '23', 24, 1, 0, 0, 0, 0, 1, 255, '', 0, NULL), + (228, 'doormat_plain*4', '23', 25, 1, 0, 0, 0, 0, 1, 253, '', 0, NULL), + (229, 'doormat_plain*5', '23', 26, 1, 0, 0, 0, 0, 1, 256, '', 0, NULL), + (230, 'doormat_plain*6', '23', 27, 1, 0, 0, 0, 0, 1, 40, '', 0, NULL), + (231, 'carpet_armas', '23', 28, 3, 0, 0, 0, 0, 1, 32, '', 0, NULL), + (232, 'carpet_polar', '23', 29, 4, 0, 0, 0, 0, 1, 33, '', 0, NULL), + (233, 'prizetrophy2*3', '26', 5, 8, 0, 0, 0, 0, 1, 133, '', 0, NULL), + (234, 'prizetrophy3*3', '26', 8, 8, 0, 0, 0, 0, 1, 134, '', 0, NULL), + (235, 'prizetrophy4*3', '26', 11, 8, 0, 0, 0, 0, 1, 135, '', 0, NULL), + (236, 'prizetrophy5*3', '26', 14, 8, 0, 0, 0, 0, 1, 136, '', 0, NULL), + (237, 'prizetrophy6*3', '26', 17, 8, 0, 0, 0, 0, 1, 137, '', 0, NULL), + (238, 'prizetrophy*3', '26', 2, 8, 0, 0, 0, 0, 1, 149, '', 0, NULL), + (239, 'prizetrophy2*2', '26', 4, 10, 0, 0, 0, 0, 1, 144, '', 0, NULL), + (240, 'prizetrophy3*2', '26', 7, 10, 0, 0, 0, 0, 1, 145, '', 0, NULL), + (241, 'prizetrophy4*2', '26', 10, 10, 0, 0, 0, 0, 1, 146, '', 0, NULL), + (242, 'prizetrophy5*2', '26', 13, 10, 0, 0, 0, 0, 1, 147, '', 0, NULL), + (243, 'prizetrophy6*2', '26', 16, 10, 0, 0, 0, 0, 1, 148, '', 0, NULL), + (244, 'prizetrophy*2', '26', 1, 10, 0, 0, 0, 0, 1, 143, '', 0, NULL), + (245, 'prizetrophy2*1', '26', 6, 12, 0, 0, 0, 0, 1, 138, '', 0, NULL), + (246, 'prizetrophy3*1', '26', 9, 12, 0, 0, 0, 0, 1, 139, '', 0, NULL), + (247, 'prizetrophy4*1', '26', 12, 12, 0, 0, 0, 0, 1, 140, '', 0, NULL), + (248, 'prizetrophy5*1', '26', 15, 12, 0, 0, 0, 0, 1, 141, '', 0, NULL), + (249, 'prizetrophy*1', '26', 3, 12, 0, 0, 0, 0, 1, 1383, '', 0, NULL), + (250, 'prizetrophy6*1', '26', 18, 12, 0, 0, 0, 0, 1, 142, '', 0, NULL), + (251, 'wallpaper', '3', 2, 2, 0, 0, 0, 0, 1, 250, '1', 0, NULL), + (252, 'wallpaper', '3', 3, 2, 0, 0, 0, 0, 1, 250, '2', 0, NULL), + (253, 'wallpaper', '3', 4, 2, 0, 0, 0, 0, 1, 250, '3', 0, NULL), + (254, 'wallpaper', '3', 5, 2, 0, 0, 0, 0, 1, 250, '4', 0, NULL), + (255, 'wallpaper', '3', 6, 2, 0, 0, 0, 0, 1, 250, '5', 0, NULL), + (256, 'wallpaper', '3', 7, 2, 0, 0, 0, 0, 1, 250, '6', 0, NULL), + (257, 'wallpaper', '3', 8, 2, 0, 0, 0, 0, 1, 250, '7', 0, NULL), + (258, 'wallpaper', '3', 9, 2, 0, 0, 0, 0, 1, 250, '8', 0, NULL), + (259, 'wallpaper', '3', 10, 2, 0, 0, 0, 0, 1, 250, '9', 0, NULL), + (260, 'wallpaper', '3', 11, 2, 0, 0, 0, 0, 1, 250, '10', 0, NULL), + (261, 'wallpaper', '3', 12, 3, 0, 0, 0, 0, 1, 250, '11', 0, NULL), + (262, 'wallpaper', '3', 13, 3, 0, 0, 0, 0, 1, 250, '12', 0, NULL), + (263, 'wallpaper', '3', 14, 3, 0, 0, 0, 0, 1, 250, '13', 0, NULL), + (264, 'wallpaper', '3', 15, 3, 0, 0, 0, 0, 1, 250, '14', 0, NULL), + (265, 'wallpaper', '3', 16, 3, 0, 0, 0, 0, 1, 250, '15', 0, NULL), + (266, 'wallpaper', '3', 17, 3, 0, 0, 0, 0, 1, 250, '16', 0, NULL), + (267, 'wallpaper', '3', 18, 3, 0, 0, 0, 0, 1, 250, '17', 0, NULL), + (268, 'wallpaper', '3', 19, 3, 0, 0, 0, 0, 1, 250, '18', 0, NULL), + (269, 'wallpaper', '3', 20, 3, 0, 0, 0, 0, 1, 250, '19', 0, NULL), + (270, 'wallpaper', '3', 21, 3, 0, 0, 0, 0, 1, 250, '20', 0, NULL), + (271, 'wallpaper', '3', 22, 3, 0, 0, 0, 0, 1, 250, '21', 0, NULL), + (272, 'wallpaper', '3', 23, 3, 0, 0, 0, 0, 1, 250, '22', 0, NULL), + (273, 'wallpaper', '3', 24, 3, 0, 0, 0, 0, 1, 250, '23', 0, NULL), + (274, 'wallpaper', '3', 25, 3, 0, 0, 0, 0, 1, 250, '24', 0, NULL), + (275, 'wallpaper', '3', 26, 3, 0, 0, 0, 0, 1, 250, '25', 0, NULL), + (276, 'wallpaper', '3', 27, 3, 0, 0, 0, 0, 1, 250, '26', 0, NULL), + (277, 'wallpaper', '3', 28, 3, 0, 0, 0, 0, 1, 250, '27', 0, NULL), + (278, 'wallpaper', '3', 29, 3, 0, 0, 0, 0, 1, 250, '28', 0, NULL), + (279, 'wallpaper', '3', 30, 3, 0, 0, 0, 0, 1, 250, '29', 0, NULL), + (280, 'wallpaper', '3', 31, 3, 0, 0, 0, 0, 1, 250, '30', 0, NULL), + (281, 'wallpaper', '3', 32, 3, 0, 0, 0, 0, 1, 250, '31', 0, NULL), + (282, 'poster_7', '24', 1, 3, 0, 0, 0, 0, 1, 251, '7', 0, NULL), + (283, 'poster_18', '24', 2, 3, 0, 0, 0, 0, 1, 251, '18', 0, NULL), + (284, 'poster_17', '24', 3, 3, 0, 0, 0, 0, 1, 251, '17', 0, NULL), + (285, 'poster_4', '24', 4, 3, 0, 0, 0, 0, 1, 251, '4', 0, NULL), + (286, 'poster_3', '24', 5, 3, 0, 0, 0, 0, 1, 251, '3', 0, NULL), + (287, 'poster_2', '24', 6, 3, 0, 0, 0, 0, 1, 251, '2', 0, NULL), + (288, 'poster_10', '24', 7, 3, 0, 0, 0, 0, 1, 251, '10', 0, NULL), + (289, 'poster_15', '24', 8, 3, 0, 0, 0, 0, 1, 251, '15', 0, NULL), + (290, 'poster_9', '24', 9, 3, 0, 0, 0, 0, 1, 251, '9', 0, NULL), + (291, 'poster_8', '24', 10, 3, 0, 0, 0, 0, 1, 251, '8', 0, NULL), + (292, 'poster_19', '24', 11, 3, 0, 0, 0, 0, 1, 251, '19', 0, NULL), + (293, 'poster_16', '24', 12, 3, 0, 0, 0, 0, 1, 251, '16', 0, NULL), + (294, 'poster_5', '24', 13, 3, 0, 0, 0, 0, 1, 251, '5', 0, NULL), + (295, 'poster_6', '24', 14, 3, 0, 0, 0, 0, 1, 251, '6', 0, NULL), + (296, 'poster_32', '24', 15, 3, 0, 0, 0, 0, 1, 251, '32', 0, NULL), + (297, 'poster_1', '24', 16, 3, 0, 0, 0, 0, 1, 251, '1', 0, NULL), + (298, 'poster_14', '24', 17, 3, 0, 0, 0, 0, 1, 251, '14', 0, NULL), + (299, 'poster_55', '24', 18, 3, 0, 0, 0, 0, 1, 251, '55', 0, NULL), + (300, 'poster_33', '24', 19, 3, 0, 0, 0, 0, 1, 251, '33', 0, NULL), + (301, 'poster_11', '24', 20, 3, 0, 0, 0, 0, 1, 251, '11', 0, NULL), + (302, 'poster_511', '25', 1, 3, 0, 0, 0, 0, 1, 251, '511', 0, NULL), + (303, 'poster_502', '25', 2, 3, 0, 0, 0, 0, 1, 251, '502', 0, NULL), + (304, 'poster_513', '25', 3, 3, 0, 0, 0, 0, 1, 251, '513', 0, NULL), + (305, 'poster_521', '25', 4, 3, 0, 0, 0, 0, 1, 251, '521', 0, NULL), + (306, 'poster_505', '25', 5, 3, 0, 0, 0, 0, 1, 251, '505', 0, NULL), + (307, 'poster_504', '25', 6, 3, 0, 0, 0, 0, 1, 251, '504', 0, NULL), + (308, 'poster_516', '25', 7, 3, 0, 0, 0, 0, 1, 251, '516', 0, NULL), + (309, 'poster_507', '25', 8, 3, 0, 0, 0, 0, 1, 251, '507', 0, NULL), + (310, 'poster_512', '25', 9, 3, 0, 0, 0, 0, 1, 251, '512', 0, NULL), + (311, 'poster_523', '25', 10, 3, 0, 0, 0, 0, 1, 251, '523', 0, NULL), + (312, 'poster_509', '25', 11, 3, 0, 0, 0, 0, 1, 251, '509', 0, NULL), + (313, 'poster_522', '25', 12, 3, 0, 0, 0, 0, 1, 251, '522', 0, NULL), + (314, 'poster_520', '25', 13, 3, 0, 0, 0, 0, 1, 251, '520', 0, NULL), + (315, 'poster_517', '25', 14, 3, 0, 0, 0, 0, 1, 251, '517', 0, NULL), + (316, 'poster_508', '25', 15, 3, 0, 0, 0, 0, 1, 251, '508', 0, NULL), + (317, 'poster_514', '25', 16, 3, 0, 0, 0, 0, 1, 251, '514', 0, NULL), + (318, 'poster_506', '25', 17, 3, 0, 0, 0, 0, 1, 251, '506', 0, NULL), + (319, 'poster_510', '25', 18, 3, 0, 0, 0, 0, 1, 251, '510', 0, NULL), + (320, 'poster_518', '25', 19, 3, 0, 0, 0, 0, 1, 251, '518', 0, NULL), + (321, 'poster_515', '25', 20, 3, 0, 0, 0, 0, 1, 251, '515', 0, NULL), + (322, 'poster_503', '25', 21, 3, 0, 0, 0, 0, 1, 251, '503', 0, NULL), + (323, 'poster_500', '25', 22, 3, 0, 0, 0, 0, 1, 251, '500', 0, NULL), + (324, 'poster_501', '25', 23, 3, 0, 0, 0, 0, 1, 251, '501', 0, NULL), + (325, 'club_sofa', '27', 1, 5, 0, 0, 0, 0, 1, 112, '', 0, NULL), + (326, 'mocchamaster', '27', 2, 5, 0, 0, 0, 0, 1, 123, '', 0, NULL), + (327, 'edicehc', '27', 3, 5, 0, 0, 0, 0, 1, 127, '', 0, NULL), + (328, 'hcamme', '27', 4, 5, 0, 0, 0, 0, 1, 129, '', 0, NULL), + (329, 'doorD', '27', 5, 5, 0, 0, 0, 0, 1, 132, '', 0, NULL), + (330, 'hcsohva', '27', 6, 5, 0, 0, 0, 0, 1, 128, '', 0, NULL), + (331, 'hc_lmp', '27', 7, 5, 0, 0, 0, 0, 1, 150, '', 0, NULL), + (332, 'hc_tbl', '27', 8, 5, 0, 0, 0, 0, 1, 151, '', 0, NULL), + (333, 'hc_chr', '27', 9, 5, 0, 0, 0, 0, 1, 152, '', 0, NULL), + (334, 'hc_dsk', '27', 10, 5, 0, 0, 0, 0, 1, 153, '', 0, NULL), + (335, 'hc_trll', '27', 11, 5, 0, 0, 0, 0, 1, 228, '', 0, NULL), + (336, 'hc_lmpst', '27', 12, 5, 0, 0, 0, 0, 1, 224, '', 0, NULL), + (337, 'hc_crtn', '27', 13, 5, 0, 0, 0, 0, 1, 221, '', 0, NULL), + (338, 'hc_tv', '27', 14, 5, 0, 0, 0, 0, 1, 214, '', 0, NULL), + (339, 'hc_btlr', '27', 15, 5, 0, 0, 0, 0, 1, 220, '', 0, NULL), + (340, 'hc_bkshlf', '27', 16, 5, 0, 0, 0, 0, 1, 219, '', 0, NULL), + (341, 'hc_rntgn', '27', 17, 5, 0, 0, 0, 0, 1, 227, '', 0, NULL), + (342, 'hc_frplc', '27', 18, 5, 0, 0, 0, 0, 1, 223, '', 0, NULL), + (343, 'hc_djset', '27', 19, 5, 0, 0, 0, 0, 1, 222, '', 0, NULL), + (344, 'hc_wall_lamp', '27', 20, 5, 0, 0, 0, 0, 1, 246, '', 0, NULL), + (345, 'hc_machine', '27', 21, 5, 0, 0, 0, 0, 1, 225, '', 0, NULL), + (346, 'deal_hcrollers', '27', 22, 5, 0, 0, 0, 0, 1, 0, '', 1, NULL), + (347, 'deal_throne', '27', 23, 5, 0, 0, 0, 0, 1, 0, '', 1, NULL), + (348, 'rare_dragonlamp*4', '28', 1, 5, 0, 0, 0, 0, 1, 170, '', 0, NULL), + (349, 'rare_dragonlamp*0', '28', 2, 5, 0, 0, 0, 0, 1, 171, '', 0, NULL), + (350, 'rare_dragonlamp*5', '28', 0, 3, 0, 0, 0, 0, 1, 172, '', 0, NULL), + (351, 'rare_dragonlamp*2', '28', 4, 5, 0, 0, 0, 0, 1, 173, '', 0, NULL), + (352, 'rare_dragonlamp*8', '121', 5, 5, 0, 0, 0, 0, 1, 174, '', 0, NULL), + (353, 'rare_dragonlamp*9', '28', 6, 5, 0, 0, 0, 0, 1, 175, '', 0, NULL), + (354, 'rare_dragonlamp*7', '28', 7, 5, 0, 0, 0, 0, 1, 176, '', 0, NULL), + (355, 'rare_dragonlamp*6', '121', 8, 5, 0, 0, 0, 0, 1, 177, '', 0, NULL), + (356, 'rare_dragonlamp*1', '28', 9, 5, 0, 0, 0, 0, 1, 178, '', 0, NULL), + (357, 'rare_dragonlamp*3', '121', 10, 5, 0, 0, 0, 0, 1, 179, '', 0, NULL), + (358, 'scifidoor*1', '29', 0, 5, 0, 0, 0, 0, 1, 270, '', 0, NULL), + (359, 'scifidoor*10', '29', 0, 5, 0, 0, 0, 0, 1, 261, '', 0, NULL), + (360, 'scifidoor*2', '29', 0, 5, 0, 0, 0, 0, 1, 269, '', 0, NULL), + (361, 'scifidoor*3', '29', 0, 5, 0, 0, 0, 0, 1, 268, '', 0, NULL), + (362, 'scifidoor*4', '29', 0, 5, 0, 0, 0, 0, 1, 267, '', 0, NULL), + (363, 'scifidoor*5', '29', 0, 5, 0, 0, 0, 0, 1, 266, '', 0, NULL), + (364, 'scifidoor*6', '29', 0, 5, 0, 0, 0, 0, 1, 265, '', 0, NULL), + (365, 'scifidoor*7', '29', 0, 5, 0, 0, 0, 0, 1, 264, '', 0, NULL), + (366, 'scifidoor*8', '29', 0, 5, 0, 0, 0, 0, 1, 263, '', 0, NULL), + (367, 'scifidoor*9', '29', 0, 5, 0, 0, 0, 0, 1, 262, '', 0, NULL), + (368, 'rare_parasol*0', '30', 0, 5, 0, 0, 0, 0, 1, 260, '', 0, NULL), + (369, 'rare_parasol*1', '30', 0, 5, 0, 0, 0, 0, 1, 257, '', 0, NULL), + (370, 'rare_parasol*2', '30', 0, 5, 0, 0, 0, 0, 1, 258, '', 0, NULL), + (371, 'rare_parasol*3', '30', 0, 5, 0, 0, 0, 0, 1, 259, '', 0, NULL), + (372, 'wooden_screen*0', '31', 0, 5, 0, 0, 0, 0, 1, 316, '', 0, NULL), + (373, 'wooden_screen*1', '31', 0, 5, 0, 0, 0, 0, 1, 313, '', 0, NULL), + (374, 'wooden_screen*2', '31', 0, 5, 0, 0, 0, 0, 1, 314, '', 0, NULL), + (375, 'wooden_screen*3', '31', 0, 5, 0, 0, 0, 0, 1, 322, '', 0, NULL), + (376, 'wooden_screen*4', '31', 0, 5, 0, 0, 0, 0, 1, 320, '', 0, NULL), + (377, 'wooden_screen*5', '31', 0, 5, 0, 0, 0, 0, 1, 318, '', 0, NULL), + (378, 'wooden_screen*6', '31', 0, 5, 0, 0, 0, 0, 1, 321, '', 0, NULL), + (379, 'wooden_screen*7', '31', 0, 5, 0, 0, 0, 0, 1, 315, '', 0, NULL), + (380, 'wooden_screen*8', '31', 0, 5, 0, 0, 0, 0, 1, 317, '', 0, NULL), + (381, 'wooden_screen*9', '31', 0, 5, 0, 0, 0, 0, 1, 319, '', 0, NULL), + (382, 'marquee*1', '32', 0, 5, 0, 0, 0, 0, 1, 304, '', 0, NULL), + (383, 'marquee*2', '32', 0, 5, 0, 0, 0, 0, 1, 305, '', 0, NULL), + (384, 'marquee*3', '32', 0, 5, 0, 0, 0, 0, 1, 312, '', 0, NULL), + (385, 'marquee*4', '32', 0, 5, 0, 0, 0, 0, 1, 310, '', 0, NULL), + (386, 'marquee*5', '32', 0, 5, 0, 0, 0, 0, 1, 309, '', 0, NULL), + (387, 'marquee*6', '32', 0, 5, 0, 0, 0, 0, 1, 311, '', 0, NULL), + (388, 'marquee*7', '32', 0, 5, 0, 0, 0, 0, 1, 306, '', 0, NULL), + (389, 'marquee*8', '32', 0, 5, 0, 0, 0, 0, 1, 307, '', 0, NULL), + (390, 'marquee*9', '32', 0, 5, 0, 0, 0, 0, 1, 308, '', 0, NULL), + (391, 'pillow*5', '33', 0, 5, 0, 0, 0, 0, 1, 294, '', 0, NULL), + (392, 'pillow*8', '33', 0, 5, 0, 0, 0, 0, 1, 295, '', 0, NULL), + (393, 'pillow*0', '33', 0, 5, 0, 0, 0, 0, 1, 296, '', 0, NULL), + (394, 'pillow*1', '33', 0, 5, 0, 0, 0, 0, 1, 297, '', 0, NULL), + (395, 'pillow*2', '33', 0, 5, 0, 0, 0, 0, 1, 298, '', 0, NULL), + (396, 'pillow*7', '33', 0, 5, 0, 0, 0, 0, 1, 299, '', 0, NULL), + (397, 'pillow*9', '33', 0, 5, 0, 0, 0, 0, 1, 300, '', 0, NULL), + (398, 'pillow*4', '33', 0, 5, 0, 0, 0, 0, 1, 301, '', 0, NULL), + (399, 'pillow*6', '33', 0, 5, 0, 0, 0, 0, 1, 302, '', 0, NULL), + (400, 'pillow*3', '33', 0, 5, 0, 0, 0, 0, 1, 303, '', 0, NULL), + (401, 'rare_icecream*0', '34', 0, 5, 0, 0, 0, 0, 1, 330, '', 0, NULL), + (402, 'rare_icecream*1', '34', 0, 5, 0, 0, 0, 0, 1, 323, '', 0, NULL), + (403, 'rare_icecream*2', '34', 0, 5, 0, 0, 0, 0, 1, 326, '', 0, NULL), + (404, 'rare_icecream*3', '34', 0, 5, 0, 0, 0, 0, 1, 329, '', 0, NULL), + (405, 'rare_icecream*4', '34', 0, 5, 0, 0, 0, 0, 1, 331, '', 0, NULL), + (406, 'rare_icecream*5', '34', 0, 5, 0, 0, 0, 0, 1, 332, '', 0, NULL), + (407, 'rare_icecream*6', '34', 0, 5, 0, 0, 0, 0, 1, 327, '', 0, NULL), + (408, 'rare_icecream*7', '34', 0, 5, 0, 0, 0, 0, 1, 324, '', 0, NULL), + (409, 'rare_icecream*8', '34', 0, 5, 0, 0, 0, 0, 1, 325, '', 0, NULL), + (410, 'rare_icecream*9', '34', 0, 5, 0, 0, 0, 0, 1, 328, '', 0, NULL), + (411, 'scifirocket*0', '35', 0, 5, 0, 0, 0, 0, 1, 293, '', 0, NULL), + (412, 'scifirocket*1', '35', 0, 5, 0, 0, 0, 0, 1, 292, '', 0, NULL), + (413, 'scifirocket*2', '35', 0, 5, 0, 0, 0, 0, 1, 291, '', 0, NULL), + (414, 'scifirocket*3', '35', 0, 5, 0, 0, 0, 0, 1, 290, '', 0, NULL), + (415, 'scifirocket*4', '35', 0, 5, 0, 0, 0, 0, 1, 289, '', 0, NULL), + (416, 'scifirocket*5', '35', 0, 5, 0, 0, 0, 0, 1, 288, '', 0, NULL), + (417, 'scifirocket*6', '35', 0, 5, 0, 0, 0, 0, 1, 287, '', 0, NULL), + (418, 'scifirocket*7', '35', 0, 5, 0, 0, 0, 0, 1, 286, '', 0, NULL), + (419, 'scifirocket*8', '35', 0, 5, 0, 0, 0, 0, 1, 285, '', 0, NULL), + (420, 'scifirocket*9', '35', 0, 5, 0, 0, 0, 0, 1, 284, '', 0, NULL), + (421, 'scifiport*0', '36', 0, 5, 0, 0, 0, 0, 1, 274, '', 0, NULL), + (422, 'scifiport*1', '36', 0, 5, 0, 0, 0, 0, 1, 283, '', 0, NULL), + (423, 'scifiport*2', '36', 0, 5, 0, 0, 0, 0, 1, 282, '', 0, NULL), + (424, 'scifiport*3', '36', 0, 5, 0, 0, 0, 0, 1, 281, '', 0, NULL), + (425, 'scifiport*4', '36', 0, 5, 0, 0, 0, 0, 1, 280, '', 0, NULL), + (426, 'scifiport*5', '36', 0, 5, 0, 0, 0, 0, 1, 279, '', 0, NULL), + (427, 'scifiport*6', '36', 0, 5, 0, 0, 0, 0, 1, 278, '', 0, NULL), + (428, 'scifiport*7', '36', 0, 5, 0, 0, 0, 0, 1, 277, '', 0, NULL), + (429, 'scifiport*8', '36', 0, 5, 0, 0, 0, 0, 1, 276, '', 0, NULL), + (430, 'scifiport*9', '36', 0, 5, 0, 0, 0, 0, 1, 275, '', 0, NULL), + (431, 'rare_beehive_bulb', '37', 53, 5, 0, 0, 0, 0, 1, 271, '', 0, NULL), + (432, 'rare_beehive_bulb*1', '37', 53, 5, 0, 0, 0, 0, 1, 272, '', 0, NULL), + (433, 'rare_beehive_bulb*2', '37', 53, 5, 0, 0, 0, 0, 1, 273, '', 0, NULL), + (434, 'rare_fountain', '38', 54, 5, 0, 0, 0, 0, 1, 333, '', 0, NULL), + (435, 'rare_fountain*1', '38', 54, 5, 0, 0, 0, 0, 1, 334, '', 0, NULL), + (436, 'rare_fountain*2', '38', 54, 5, 0, 0, 0, 0, 1, 335, '', 0, NULL), + (437, 'rare_fountain*3', '38', 54, 5, 0, 0, 0, 0, 1, 336, '', 0, NULL), + (438, 'rare_elephant_statue', '39', 55, 5, 0, 0, 0, 0, 1, 337, '', 0, NULL), + (439, 'rare_elephant_statue*1', '39', 0, 5, 0, 0, 0, 0, 1, 338, '', 0, NULL), + (440, 'rare_elephant_statue*2', '39', 0, 5, 0, 0, 0, 0, 1, 339, '', 0, NULL), + (441, 'rare_fan*0', '40', 0, 5, 0, 0, 0, 0, 1, 344, '', 0, NULL), + (442, 'rare_fan*1', '40', 0, 5, 0, 0, 0, 0, 1, 347, '', 0, NULL), + (443, 'rare_fan*2', '40', 0, 5, 0, 0, 0, 0, 1, 349, '', 0, NULL), + (444, 'rare_fan*3', '40', 0, 5, 0, 0, 0, 0, 1, 343, '', 0, NULL), + (445, 'rare_fan*4', '40', 0, 5, 0, 0, 0, 0, 1, 345, '', 0, NULL), + (446, 'rare_fan*5', '40', 0, 5, 0, 0, 0, 0, 1, 346, '', 0, NULL), + (447, 'rare_fan*6', '40', 0, 5, 0, 0, 0, 0, 1, 341, '', 0, NULL), + (448, 'rare_fan*7', '40', 0, 5, 0, 0, 0, 0, 1, 340, '', 0, NULL), + (449, 'rare_fan*8', '40', 0, 5, 0, 0, 0, 0, 1, 348, '', 0, NULL), + (450, 'rare_fan*9', '40', 0, 5, 0, 0, 0, 0, 1, 342, '', 0, NULL), + (451, 'habbowheel', '19', 0, 8, 0, 0, 0, 0, 1, 350, '', 0, NULL), + (452, 'roomdimmer', '19,100,108', 0, 12, 0, 0, 0, 0, 1, 351, '', 0, NULL), + (453, 'jukebox*1', '11,84,85,86,87,88,89', 2, 3, 0, 0, 0, 0, 1, 352, '', 0, NULL), + (454, 'jukebox_ptv*1', '11', 0, 8, 0, 0, 0, 1, 1, 353, '', 0, NULL), + (455, 'carpet_soft_tut', '23', 0, 1, 0, 0, 0, 0, 1, 354, '', 0, NULL), + (456, 'sound_set_10', '89', 9, 3, 0, 0, 0, 0, 1, 356, '', 0, NULL), + (457, 'sound_set_11', '86', 9, 3, 0, 0, 0, 0, 1, 360, '', 0, NULL), + (458, 'sound_set_12', '88', 9, 3, 0, 0, 0, 0, 1, 361, '', 0, NULL), + (459, 'sound_set_13', '86', 9, 3, 0, 0, 0, 0, 1, 362, '', 0, NULL), + (460, 'sound_set_14', '89', 9, 3, 0, 0, 0, 0, 1, 363, '', 0, NULL), + (461, 'sound_set_15', '89', 9, 3, 0, 0, 0, 0, 1, 364, '', 0, NULL), + (462, 'sound_set_16', '89', 9, 3, 0, 0, 0, 0, 1, 365, '', 0, NULL), + (463, 'sound_set_17', '85', 9, 3, 0, 0, 0, 0, 1, 366, '', 0, NULL), + (464, 'sound_set_18', '85', 9, 3, 0, 0, 0, 0, 1, 367, '', 0, NULL), + (465, 'sound_set_19', '89', 9, 3, 0, 0, 0, 0, 1, 368, '', 0, NULL), + (466, 'sound_set_20', '88', 9, 3, 0, 0, 0, 0, 1, 369, '', 0, NULL), + (467, 'sound_set_21', '87', 9, 3, 0, 0, 0, 0, 1, 370, '', 0, NULL), + (468, 'sound_set_22', '88', 9, 3, 0, 0, 0, 0, 1, 371, '', 0, NULL), + (469, 'sound_set_23', '88', 9, 3, 0, 0, 0, 0, 1, 372, '', 0, NULL), + (470, 'sound_set_24', '88', 9, 3, 0, 0, 0, 0, 1, 373, '', 0, NULL), + (471, 'sound_set_25', '86', 9, 3, 0, 0, 0, 0, 1, 374, '', 0, NULL), + (472, 'sound_set_26', '85', 9, 3, 0, 0, 0, 0, 1, 375, '', 0, NULL), + (473, 'sound_set_27', '85', 9, 3, 0, 0, 0, 0, 1, 376, '', 0, NULL), + (474, 'sound_set_28', '87', 9, 3, 0, 0, 0, 0, 1, 377, '', 0, NULL), + (475, 'sound_set_29', '86', 9, 3, 0, 0, 0, 0, 1, 378, '', 0, NULL), + (476, 'sound_set_30', '88', 9, 3, 0, 0, 0, 0, 1, 379, '', 0, NULL), + (477, 'sound_set_31', '86', 9, 3, 0, 0, 0, 0, 1, 380, '', 0, NULL), + (478, 'sound_set_32', '88', 9, 3, 0, 0, 0, 0, 1, 381, '', 0, NULL), + (479, 'sound_set_33', '87', 9, 3, 0, 0, 0, 0, 1, 382, '', 0, NULL), + (480, 'sound_set_34', '87', 9, 3, 0, 0, 0, 0, 1, 383, '', 0, NULL), + (481, 'sound_set_35', '85', 9, 3, 0, 0, 0, 0, 1, 384, '', 0, NULL), + (482, 'sound_set_36', '89', 9, 3, 0, 0, 0, 0, 1, 385, '', 0, NULL), + (483, 'sound_set_37', '88', 9, 3, 0, 0, 0, 0, 1, 386, '', 0, NULL), + (484, 'sound_set_38', '87', 9, 3, 0, 0, 0, 0, 1, 387, '', 0, NULL), + (485, 'sound_set_39', '87', 9, 3, 0, 0, 0, 0, 1, 388, '', 0, NULL), + (486, 'sound_set_40', '87', 9, 3, 0, 0, 0, 0, 1, 389, '', 0, NULL), + (487, 'sound_set_41', '87', 9, 3, 0, 0, 0, 0, 1, 390, '', 0, NULL), + (488, 'sound_set_42', '85', 9, 3, 0, 0, 0, 0, 1, 391, '', 0, NULL), + (489, 'sound_set_43', '88', 9, 3, 0, 0, 0, 0, 1, 392, '', 0, NULL), + (490, 'sound_set_44', '85', 9, 3, 0, 0, 0, 0, 1, 393, '', 0, NULL), + (491, 'sound_set_45', '89', 9, 3, 0, 0, 0, 0, 1, 394, '', 0, NULL), + (492, 'sound_set_46', '86', 9, 3, 0, 0, 0, 0, 1, 395, '', 0, NULL), + (493, 'sound_set_47', '86', 9, 3, 0, 0, 0, 0, 1, 396, '', 0, NULL), + (494, 'sound_set_48', '86', 9, 3, 0, 0, 0, 0, 1, 397, '', 0, NULL), + (495, 'sound_set_49', '86', 9, 3, 0, 0, 0, 0, 1, 398, '', 0, NULL), + (496, 'sound_set_50', '86', 9, 3, 0, 0, 0, 0, 1, 399, '', 0, NULL), + (497, 'sound_set_51', '86', 9, 3, 0, 0, 0, 0, 1, 400, '', 0, NULL), + (498, 'sound_set_52', '86', 9, 3, 0, 0, 0, 0, 1, 401, '', 0, NULL), + (499, 'sound_set_53', '69', 0, 3, 0, 0, 0, 0, 1, 402, '', 0, NULL), + (500, 'sound_set_54', '69', 0, 3, 0, 0, 0, 0, 1, 403, '', 0, NULL), + (501, 'sound_set_55', '89', 9, 3, 0, 0, 0, 0, 1, 404, '', 0, NULL), + (502, 'sound_set_56', '89', 9, 3, 0, 0, 0, 0, 1, 405, '', 0, NULL), + (503, 'sound_set_57', '89', 9, 3, 0, 0, 0, 0, 1, 406, '', 0, NULL), + (504, 'sound_set_58', '89', 9, 3, 0, 0, 0, 0, 1, 407, '', 0, NULL), + (505, 'sound_set_59', '89', 9, 3, 0, 0, 0, 0, 1, 408, '', 0, NULL), + (506, 'sound_set_60', '89', 9, 3, 0, 0, 0, 0, 1, 409, '', 0, NULL), + (507, 'sound_set_61', '89', 9, 3, 0, 0, 0, 0, 1, 410, '', 0, NULL), + (508, 'sound_set_62', '46', 0, 3, 0, 0, 0, 0, 1, 411, '', 0, NULL), + (509, 'sound_set_63', '46', 0, 3, 0, 0, 0, 0, 1, 412, '', 0, NULL), + (510, 'sound_set_64', '46', 0, 3, 0, 0, 0, 0, 1, 413, '', 0, NULL), + (511, 'camera', '41', 0, 10, 0, 0, 0, 0, 1, 420, '', 0, NULL), + (512, 'film', '41', 1, 6, 0, 0, 0, 0, 1, 422, '', 0, NULL), + (513, 'chair_plasto*1', '16', 1, 3, 0, 0, 0, 0, 1, 427, '', 0, NULL), + (514, 'chair_plasto', '16', 1, 3, 0, 0, 0, 0, 1, 433, '', 0, NULL), + (515, 'chair_plasto*10', '16', 1, 3, 0, 0, 0, 0, 1, 481, '', 0, NULL), + (516, 'chair_plasto*11', '16', 1, 3, 0, 0, 0, 0, 1, 482, '', 0, NULL), + (517, 'chair_plasto*2', '16', 1, 3, 0, 0, 0, 0, 1, 438, '', 0, NULL), + (518, 'chair_plasto*3', '16', 1, 3, 0, 0, 0, 0, 1, 443, '', 0, NULL), + (519, 'chair_plasto*4', '16', 1, 3, 0, 0, 0, 0, 1, 448, '', 0, NULL), + (520, 'chair_plasto*5', '16', 1, 3, 0, 0, 0, 0, 1, 453, '', 0, NULL), + (521, 'chair_plasto*6', '16', 1, 3, 0, 0, 0, 0, 1, 458, '', 0, NULL), + (522, 'chair_plasto*7', '16', 1, 3, 0, 0, 0, 0, 1, 463, '', 0, NULL), + (523, 'chair_plasto*8', '16', 1, 3, 0, 0, 0, 0, 1, 468, '', 0, NULL), + (524, 'chair_plasto*9', '16', 1, 3, 0, 0, 0, 0, 1, 473, '', 0, NULL), + (525, 'chair_plasty', '16', 1, 3, 0, 0, 0, 0, 1, 426, '', 0, NULL), + (526, 'chair_plasty*1', '16', 1, 3, 0, 0, 0, 0, 1, 475, '', 0, NULL), + (527, 'chair_plasty*10', '16', 1, 3, 0, 0, 0, 0, 1, 494, '', 0, NULL), + (528, 'chair_plasty*11', '16', 1, 3, 0, 0, 0, 0, 1, 495, '', 0, NULL), + (529, 'chair_plasty*2', '16', 1, 3, 0, 0, 0, 0, 1, 476, '', 0, NULL), + (530, 'chair_plasty*3', '16', 1, 3, 0, 0, 0, 0, 1, 477, '', 0, NULL), + (531, 'chair_plasty*4', '16', 1, 3, 0, 0, 0, 0, 1, 478, '', 0, NULL), + (532, 'chair_plasty*5', '16', 1, 3, 0, 0, 0, 0, 1, 479, '', 0, NULL), + (533, 'chair_plasty*6', '16', 1, 3, 0, 0, 0, 0, 1, 480, '', 0, NULL), + (534, 'chair_plasty*7', '16', 1, 3, 0, 0, 0, 0, 1, 491, '', 0, NULL), + (535, 'chair_plasty*8', '16', 1, 3, 0, 0, 0, 0, 1, 492, '', 0, NULL), + (536, 'chair_plasty*9', '16', 1, 3, 0, 0, 0, 0, 1, 493, '', 0, NULL), + (537, 'table_plasto_4leg', '16', 1, 3, 0, 0, 0, 0, 1, 423, '', 0, NULL), + (538, 'table_plasto_4leg*1', '16', 1, 3, 0, 0, 0, 0, 1, 429, '', 0, NULL), + (539, 'table_plasto_4leg*10', '16', 1, 3, 0, 0, 0, 0, 1, 484, '', 0, NULL), + (540, 'table_plasto_4leg*14', '16', 1, 3, 0, 0, 0, 0, 1, 483, '', 0, NULL), + (541, 'table_plasto_4leg*2', '16', 1, 3, 0, 0, 0, 0, 1, 434, '', 0, NULL), + (542, 'table_plasto_4leg*3', '16', 1, 3, 0, 0, 0, 0, 1, 439, '', 0, NULL), + (543, 'table_plasto_4leg*4', '16', 1, 3, 0, 0, 0, 0, 1, 444, '', 0, NULL), + (544, 'table_plasto_4leg*5', '16', 1, 3, 0, 0, 0, 0, 1, 449, '', 0, NULL), + (545, 'table_plasto_4leg*6', '16', 1, 3, 0, 0, 0, 0, 1, 454, '', 0, NULL), + (546, 'table_plasto_4leg*7', '16', 1, 3, 0, 0, 0, 0, 1, 459, '', 0, NULL), + (547, 'table_plasto_4leg*8', '16', 1, 3, 0, 0, 0, 0, 1, 464, '', 0, NULL), + (548, 'table_plasto_4leg*9', '16', 1, 3, 0, 0, 0, 0, 1, 469, '', 0, NULL), + (549, 'table_plasto_bigsquare', '16', 1, 3, 0, 0, 0, 0, 1, 425, '', 0, NULL), + (550, 'table_plasto_bigsquare*1', '16', 1, 3, 0, 0, 0, 0, 1, 430, '', 0, NULL), + (551, 'table_plasto_bigsquare*14', '16', 1, 3, 0, 0, 0, 0, 1, 485, '', 0, NULL), + (552, 'table_plasto_bigsquare*15', '16', 1, 3, 0, 0, 0, 0, 1, 486, '', 0, NULL), + (553, 'table_plasto_bigsquare*2', '16', 1, 3, 0, 0, 0, 0, 1, 435, '', 0, NULL), + (554, 'table_plasto_bigsquare*3', '16', 1, 3, 0, 0, 0, 0, 1, 440, '', 0, NULL), + (555, 'table_plasto_bigsquare*4', '16', 1, 3, 0, 0, 0, 0, 1, 445, '', 0, NULL), + (556, 'table_plasto_bigsquare*5', '16', 1, 3, 0, 0, 0, 0, 1, 450, '', 0, NULL), + (557, 'table_plasto_bigsquare*6', '16', 1, 3, 0, 0, 0, 0, 1, 455, '', 0, NULL), + (558, 'table_plasto_bigsquare*7', '16', 1, 3, 0, 0, 0, 0, 1, 460, '', 0, NULL), + (559, 'table_plasto_bigsquare*8', '16', 1, 3, 0, 0, 0, 0, 1, 465, '', 0, NULL), + (560, 'table_plasto_bigsquare*9', '16', 1, 3, 0, 0, 0, 0, 1, 470, '', 0, NULL), + (561, 'table_plasto_round', '16', 1, 3, 0, 0, 0, 0, 1, 424, '', 0, NULL), + (562, 'table_plasto_round*1', '16', 1, 3, 0, 0, 0, 0, 1, 431, '', 0, NULL), + (563, 'table_plasto_round*14', '16', 1, 3, 0, 0, 0, 0, 1, 487, '', 0, NULL), + (564, 'table_plasto_round*15', '16', 1, 3, 0, 0, 0, 0, 1, 488, '', 0, NULL), + (565, 'table_plasto_round*2', '16', 1, 3, 0, 0, 0, 0, 1, 436, '', 0, NULL), + (566, 'table_plasto_round*3', '16', 1, 3, 0, 0, 0, 0, 1, 441, '', 0, NULL), + (567, 'table_plasto_round*4', '16', 1, 3, 0, 0, 0, 0, 1, 446, '', 0, NULL), + (568, 'table_plasto_round*5', '16', 1, 3, 0, 0, 0, 0, 1, 451, '', 0, NULL), + (569, 'table_plasto_round*6', '16', 1, 3, 0, 0, 0, 0, 1, 456, '', 0, NULL), + (570, 'table_plasto_round*7', '16', 1, 3, 0, 0, 0, 0, 1, 461, '', 0, NULL), + (571, 'table_plasto_round*8', '16', 1, 3, 0, 0, 0, 0, 1, 466, '', 0, NULL), + (572, 'table_plasto_round*9', '16', 1, 3, 0, 0, 0, 0, 1, 471, '', 0, NULL), + (573, 'table_plasto_square', '16', 1, 3, 0, 0, 0, 0, 1, 428, '', 0, NULL), + (574, 'table_plasto_square*1', '16', 1, 3, 0, 0, 0, 0, 1, 432, '', 0, NULL), + (575, 'table_plasto_square*14', '16', 1, 3, 0, 0, 0, 0, 1, 489, '', 0, NULL), + (576, 'table_plasto_square*15', '16', 1, 3, 0, 0, 0, 0, 1, 490, '', 0, NULL), + (577, 'table_plasto_square*2', '16', 1, 3, 0, 0, 0, 0, 1, 437, '', 0, NULL), + (578, 'table_plasto_square*3', '16', 1, 3, 0, 0, 0, 0, 1, 442, '', 0, NULL), + (579, 'table_plasto_square*4', '16', 1, 3, 0, 0, 0, 0, 1, 447, '', 0, NULL), + (580, 'table_plasto_square*5', '16', 1, 3, 0, 0, 0, 0, 1, 452, '', 0, NULL), + (581, 'table_plasto_square*6', '16', 1, 3, 0, 0, 0, 0, 1, 457, '', 0, NULL), + (582, 'table_plasto_square*7', '16', 1, 3, 0, 0, 0, 0, 1, 462, '', 0, NULL), + (583, 'table_plasto_square*8', '16', 1, 3, 0, 0, 0, 0, 1, 467, '', 0, NULL), + (584, 'table_plasto_square*9', '16', 1, 3, 0, 0, 0, 0, 1, 472, '', 0, NULL), + (585, 'rubberchair*1', '43', 0, 25, 0, 0, 0, 0, 1, 496, '', 0, NULL), + (586, 'rubberchair*2', '43', 0, 25, 0, 0, 0, 0, 1, 497, '', 0, NULL), + (587, 'rubberchair*3', '43', 0, 25, 0, 0, 0, 0, 1, 498, '', 0, NULL), + (588, 'rubberchair*4', '43', 0, 25, 0, 0, 0, 0, 1, 499, '', 0, NULL), + (589, 'rubberchair*5', '43', 0, 25, 0, 0, 0, 0, 1, 500, '', 0, NULL), + (590, 'rubberchair*6', '43', 0, 25, 0, 0, 0, 0, 1, 501, '', 0, NULL), + (591, 'rubberchair*7', '43', 0, 25, 0, 0, 0, 0, 1, 502, '', 0, NULL), + (592, 'rubberchair*8', '43', 0, 25, 0, 0, 0, 0, 1, 503, '', 0, NULL), + (593, 'spyro', '132', 0, 25, 0, 0, 0, 0, 1, 504, '', 0, NULL), + (594, 'throne', '122', 0, 50, 0, 0, 0, 0, 1, 107, '', 0, NULL), + (595, 'rare_daffodil_rug', '132', 0, 25, 0, 0, 0, 0, 3, 505, '', 0, NULL), + (596, 'md_limukaappi', '132', 0, 25, 0, 0, 0, 0, 1, 506, '', 0, NULL), + (597, 'samovar', '44', 0, 30, 0, 0, 0, 0, 1, 507, '', 0, NULL), + (598, 'redhologram', '132', 0, 20, 0, 0, 0, 0, 1, 508, '', 0, NULL), + (599, 'typingmachine', '132', 0, 20, 0, 0, 0, 0, 1, 509, '', 0, NULL), + (600, 'hologram', '132', 0, 20, 0, 0, 0, 0, 1, 510, '', 0, NULL), + (601, 'prize1', '121', 0, 15, 0, 0, 0, 0, 1, 511, '', 0, NULL), + (602, 'prize2', '121', 0, 15, 0, 0, 0, 0, 1, 512, '', 0, NULL), + (603, 'prize3', '121', 0, 15, 0, 0, 0, 0, 1, 513, '', 0, NULL), + (604, 'rare_snowrug', '44', 0, 25, 0, 0, 0, 0, 1, 514, '', 0, NULL), + (605, 'poster_1004', '44', 1, 5, 0, 0, 0, 0, 1, 251, '1004', 0, NULL), + (606, 'exe_rug', '45', 0, 1, 0, 0, 0, 0, 1, 515, '', 0, NULL), + (607, 'exe_s_table', '45', 0, 2, 0, 0, 0, 0, 1, 516, '', 0, NULL), + (608, 'exe_bardesk', '45', 0, 3, 0, 0, 0, 0, 1, 517, '', 0, NULL), + (609, 'exe_chair', '45', 0, 2, 0, 0, 0, 0, 1, 518, '', 0, NULL), + (610, 'exe_chair2', '45', 0, 3, 0, 0, 0, 0, 1, 519, '', 0, NULL), + (611, 'exe_corner', '45', 0, 2, 0, 0, 0, 0, 1, 520, '', 0, NULL), + (612, 'exe_drinks', '45', 0, 2, 0, 0, 0, 0, 1, 521, '', 0, NULL), + (613, 'exe_sofa', '45', 0, 5, 0, 0, 0, 0, 1, 522, '', 0, NULL), + (614, 'exe_table', '45', 0, 5, 0, 0, 0, 0, 1, 523, '', 0, NULL), + (615, 'exe_plant', '45', 0, 5, 0, 0, 0, 0, 1, 524, '', 0, NULL), + (616, 'exe_light', '45', 0, 5, 0, 0, 0, 0, 1, 525, '', 0, NULL), + (617, 'exe_cubelight', '45', 0, 5, 0, 0, 0, 0, 1, 527, '', 0, NULL), + (618, 'exe_artlamp', '45', 0, 5, 0, 0, 0, 0, 1, 528, '', 0, NULL), + (619, 'exe_map', '45', 0, 5, 0, 0, 0, 0, 1, 529, '', 0, NULL), + (620, 'exe_wfall', '45', 0, 5, 0, 0, 0, 0, 1, 530, '', 0, NULL), + (621, 'exe_globe', '45', 0, 5, 0, 0, 0, 0, 1, 531, '', 0, NULL), + (622, 'exe_elevator', '45', 0, 7, 0, 0, 0, 0, 1, 532, '', 0, NULL), + (623, 'arabian_bigtb', '46', 1, 5, 0, 0, 0, 0, 1, 533, '', 0, NULL), + (624, 'arabian_chair', '46', 1, 2, 0, 0, 0, 0, 1, 534, '', 0, NULL), + (625, 'arabian_divdr', '46', 1, 5, 0, 0, 0, 0, 1, 535, '', 0, NULL), + (626, 'arabian_pllw', '46', 1, 2, 0, 0, 0, 0, 1, 536, '', 0, NULL), + (627, 'arabian_rug', '46', 1, 3, 0, 0, 0, 0, 1, 537, '', 0, NULL), + (628, 'arabian_snake', '46', 1, 3, 0, 0, 0, 0, 1, 538, '', 0, NULL), + (629, 'arabian_swords', '46', 1, 4, 0, 0, 0, 0, 1, 539, '', 0, NULL), + (630, 'arabian_teamk', '46', 1, 6, 0, 0, 0, 0, 1, 540, '', 0, NULL), + (631, 'arabian_tetbl', '46', 1, 3, 0, 0, 0, 0, 1, 541, '', 0, NULL), + (632, 'arabian_tray1', '46', 1, 3, 0, 0, 0, 0, 1, 542, '', 0, NULL), + (633, 'arabian_tray2', '46', 1, 3, 0, 0, 0, 0, 1, 543, '', 0, NULL), + (634, 'arabian_tray3', '46', 1, 3, 0, 0, 0, 0, 1, 544, '', 0, NULL), + (635, 'arabian_tray4', '46', 1, 3, 0, 0, 0, 0, 1, 545, '', 0, NULL), + (636, 'arabian_wndw', '46', 1, 4, 0, 0, 0, 0, 1, 546, '', 0, NULL), + (637, 'arabian_wall', '46', 1, 3, 0, 0, 0, 0, 1, 547, '', 0, NULL), + (638, 'arabian_tile', '46', 1, 3, 0, 0, 0, 0, 1, 548, '', 0, NULL), + (639, 'landscape', '3', 1, 2, 0, 0, 0, 0, 1, 474, '5', 0, NULL), + (640, 'landscape', '3', 1, 2, 0, 0, 0, 0, 1, 474, '3', 0, NULL), + (641, 'landscape', '3', 1, 2, 0, 0, 0, 0, 1, 474, '9', 0, NULL), + (642, 'landscape', '3', 1, 2, 0, 0, 0, 0, 1, 474, '10', 0, NULL), + (643, 'landscape', '3', 1, 2, 0, 0, 0, 0, 1, 474, '6', 0, NULL), + (644, 'landscape', '3', 1, 2, 0, 0, 0, 0, 1, 474, '5', 0, NULL), + (645, 'landscape', '3', 1, 2, 0, 0, 0, 0, 1, 474, '1', 0, NULL), + (646, 'landscape', '3', 1, 2, 0, 0, 0, 0, 1, 474, '12', 0, NULL), + (647, 'landscape', '3', 1, 2, 0, 0, 0, 0, 1, 474, '11', 0, NULL), + (648, 'landscape', '3', 1, 2, 0, 0, 0, 0, 1, 474, '8', 0, NULL), + (649, 'landscape', '3', 1, 2, 0, 0, 0, 0, 1, 474, '4', 0, NULL), + (650, 'landscape', '3', 1, 2, 0, 0, 0, 0, 1, 474, '2', 0, NULL), + (651, 'landscape 3', '3', 1, 2, 0, 0, 0, 0, 1, 474, '7', 0, NULL), + (652, 'noob_window_double', '53', 0, 3, 0, 0, 0, 1, 1, 549, '', 0, NULL), + (653, 'window_70s_narrow', '53', 0, 3, 0, 0, 0, 0, 1, 550, '', 0, NULL), + (654, 'window_70s_wide', '53', 0, 3, 0, 0, 0, 0, 1, 551, '', 0, NULL), + (655, 'window_basic', '53', 0, 3, 0, 0, 0, 0, 1, 552, '', 0, NULL), + (656, 'window_chinese_narrow', '53', 0, 3, 0, 0, 0, 0, 1, 553, '', 0, NULL), + (657, 'window_chinese_wide', '53', 0, 3, 0, 0, 0, 0, 1, 554, '', 0, NULL), + (658, 'window_double_default', '53', 0, 3, 0, 0, 0, 0, 1, 555, '', 0, NULL), + (659, 'window_golden', '53', 0, 3, 0, 0, 0, 0, 1, 556, '', 0, NULL), + (660, 'window_grunge', '53', 0, 3, 0, 0, 0, 0, 1, 557, '', 0, NULL), + (661, 'window_romantic_narrow', '53', 0, 3, 0, 0, 0, 0, 1, 558, '', 0, NULL), + (662, 'window_romantic_wide', '53', 0, 3, 0, 0, 0, 0, 1, 559, '', 0, NULL), + (663, 'window_single_default', '53', 0, 3, 0, 0, 0, 0, 1, 560, '', 0, NULL), + (664, 'window_square', '53', 0, 3, 0, 0, 0, 0, 1, 561, '', 0, NULL), + (665, 'window_triple', '53', 0, 3, 0, 0, 0, 0, 1, 562, '', 0, NULL), + (666, 'window_skyscraper', '53', 0, 3, 0, 0, 0, 0, 1, 563, '', 0, NULL), + (667, 'teleport_door', '6', 3, 4, 0, 0, 0, 0, 1, 566, '', 0, NULL), + (668, 'noob_plant', '57', 1, 0, 60, 0, 0, 0, 1, 567, '', 0, NULL), + (669, 'noob_table*1', '57', 1, 0, 120, 0, 0, 0, 1, 568, '', 0, NULL), + (670, 'noob_table*2', '57', 1, 0, 120, 0, 0, 0, 1, 569, '', 0, NULL), + (671, 'noob_table*3', '57', 1, 0, 120, 0, 0, 0, 1, 570, '', 0, NULL), + (672, 'noob_table*4', '57', 1, 0, 120, 0, 0, 0, 1, 571, '', 0, NULL), + (673, 'noob_table*5', '57', 1, 0, 120, 0, 0, 0, 1, 572, '', 0, NULL), + (674, 'noob_table*6', '57', 1, 0, 120, 0, 0, 0, 1, 573, '', 0, NULL), + (675, 'noob_stool*1', '57', 1, 0, 120, 0, 0, 0, 1, 574, '', 0, NULL), + (676, 'noob_stool*2', '57', 1, 0, 120, 0, 0, 0, 1, 575, '', 0, NULL), + (677, 'noob_stool*3', '57', 1, 0, 120, 0, 0, 0, 1, 576, '', 0, NULL), + (678, 'noob_stool*4', '57', 1, 0, 120, 0, 0, 0, 1, 577, '', 0, NULL), + (679, 'noob_stool*5', '57', 1, 0, 120, 0, 0, 0, 1, 578, '', 0, NULL), + (680, 'noob_stool*6', '57', 1, 0, 120, 0, 0, 0, 1, 579, '', 0, NULL), + (681, 'noob_lamp*1', '57', 1, 0, 120, 0, 0, 0, 1, 586, '', 0, NULL), + (682, 'noob_lamp*2', '57', 1, 0, 120, 0, 0, 0, 1, 587, '', 0, NULL), + (683, 'noob_lamp*3', '57', 1, 0, 120, 0, 0, 0, 1, 588, '', 0, NULL), + (684, 'noob_lamp*4', '57', 1, 0, 120, 0, 0, 0, 1, 589, '', 0, NULL), + (685, 'noob_lamp*5', '57', 1, 0, 120, 0, 0, 0, 1, 590, '', 0, NULL), + (686, 'noob_lamp*6', '57', 1, 0, 120, 0, 0, 0, 1, 591, '', 0, NULL), + (687, 'noob_rug*1', '57', 1, 0, 120, 0, 0, 0, 1, 580, '', 0, NULL), + (688, 'noob_rug*2', '57', 1, 0, 120, 0, 0, 0, 1, 581, '', 0, NULL), + (689, 'noob_rug*3', '57', 1, 0, 120, 0, 0, 0, 1, 582, '', 0, NULL), + (690, 'noob_rug*4', '57', 1, 0, 120, 0, 0, 0, 1, 583, '', 0, NULL), + (691, 'noob_rug*5', '57', 1, 0, 120, 0, 0, 0, 1, 584, '', 0, NULL), + (692, 'noob_rug*6', '57', 1, 0, 120, 0, 0, 0, 1, 585, '', 0, NULL), + (693, 'noob_chair*1', '57', 1, 0, 120, 0, 0, 0, 1, 592, '', 0, NULL), + (694, 'noob_chair*2', '57', 1, 0, 120, 0, 0, 0, 1, 593, '', 0, NULL), + (695, 'noob_chair*3', '57', 1, 0, 120, 0, 0, 0, 1, 594, '', 0, NULL), + (696, 'noob_chair*4', '57', 1, 0, 120, 0, 0, 0, 1, 595, '', 0, NULL), + (697, 'noob_chair*5', '57', 1, 0, 120, 0, 0, 0, 1, 596, '', 0, NULL), + (698, 'noob_chair*6', '57', 1, 0, 120, 0, 0, 0, 1, 597, '', 0, NULL), + (699, 'exe_gate', '45', 0, 3, 0, 0, 0, 0, 1, 526, '', 0, NULL), + (700, 'country_rain', '59', 1, 3, 0, 0, 0, 0, 1, 598, '', 0, NULL), + (701, 'country_scarecrow', '59', 1, 3, 0, 0, 0, 0, 1, 599, '', 0, NULL), + (702, 'country_soil', '59', 1, 3, 0, 0, 0, 0, 1, 600, '', 0, NULL), + (703, 'country_grass', '59', 1, 3, 0, 0, 0, 0, 1, 601, '', 0, NULL), + (704, 'country_trctr', '59', 1, 3, 0, 0, 0, 0, 1, 602, '', 0, NULL), + (705, 'country_fnc2', '59', 1, 3, 0, 0, 0, 0, 1, 603, '', 0, NULL), + (706, 'country_fnc1', '59', 1, 3, 0, 0, 0, 0, 1, 604, '', 0, NULL), + (707, 'country_well', '59', 1, 3, 0, 0, 0, 0, 1, 605, '', 0, NULL), + (708, 'country_rbw', '59', 1, 3, 0, 0, 0, 0, 1, 606, '', 0, NULL), + (709, 'country_wheat', '59', 1, 3, 0, 0, 0, 0, 1, 607, '', 0, NULL), + (710, 'country_gate', '59', 1, 3, 0, 0, 0, 0, 1, 608, '', 0, NULL), + (711, 'country_stage', '59', 1, 3, 0, 0, 0, 0, 1, 609, '', 0, NULL), + (712, 'country_log', '59', 1, 3, 0, 0, 0, 0, 1, 610, '', 0, NULL), + (713, 'country_fnc3', '59', 1, 3, 0, 0, 0, 0, 1, 611, '', 0, NULL), + (714, 'country_patio', '59', 1, 3, 0, 0, 0, 0, 1, 612, '', 0, NULL), + (715, 'country_corner', '59', 1, 3, 0, 0, 0, 0, 1, 613, '', 0, NULL), + (716, 'country_ditch', '59', 1, 3, 0, 0, 0, 0, 1, 614, '', 0, NULL), + (717, 'country_forestwall', '59', 1, 3, 0, 0, 0, 0, 1, 615, '', 0, NULL), + (718, 'country_fp', '59', 1, 3, 0, 0, 0, 0, 1, 616, '', 0, NULL), + (719, 'country_wall', '59', 1, 3, 0, 0, 0, 0, 3, 617, '', 0, NULL), + (720, 'country_lantern', '59', 1, 3, 0, 0, 0, 0, 1, 618, '', 0, NULL), + (721, 'env_bushes', '59', 1, 3, 0, 0, 0, 0, 1, 619, '', 0, NULL), + (722, 'env_bushes_gate', '59', 1, 3, 0, 0, 0, 0, 1, 620, '', 0, NULL), + (723, 'env_grass', '59', 1, 3, 0, 0, 0, 0, 1, 621, '', 0, NULL), + (724, 'env_telep', '59,6', 1, 3, 0, 0, 0, 0, 1, 622, '', 0, NULL), + (725, 'env_tree1', '59', 1, 3, 0, 0, 0, 0, 1, 623, '', 0, NULL), + (726, 'env_tree2', '59', 1, 3, 0, 0, 0, 0, 1, 624, '', 0, NULL), + (727, 'env_tree3', '59', 1, 3, 0, 0, 0, 0, 1, 625, '', 0, NULL), + (728, 'env_tree4', '59', 1, 3, 0, 0, 0, 0, 1, 626, '', 0, NULL), + (729, 'avatar_effect1', '60', 1, 0, 89, 0, 0, 0, 1, 627, '1', 0, NULL), + (730, 'avatar_effect2', '60', 1, 0, 139, 0, 0, 0, 1, 627, '2', 0, NULL), + (731, 'avatar_effect3', '60', 1, 0, 139, 0, 0, 0, 1, 627, '3', 0, NULL), + (732, 'avatar_effect4', '60', 1, 0, 89, 0, 0, 0, 1, 627, '4', 0, NULL), + (733, 'avatar_effect5', '60', 1, 0, 89, 0, 0, 0, 1, 627, '5', 0, NULL), + (734, 'avatar_effect6', '60', 1, 0, 139, 0, 0, 0, 1, 627, '6', 0, NULL), + (735, 'avatar_effect7', '60', 1, 0, 89, 0, 0, 0, 1, 627, '7', 0, NULL), + (736, 'avatar_effect8', '60', 1, 0, 89, 0, 0, 0, 1, 627, '8', 0, NULL), + (737, 'avatar_effect9', '60', 1, 0, 89, 0, 0, 0, 1, 627, '9', 0, NULL), + (738, 'avatar_effect10', '60', 1, 0, 89, 0, 0, 0, 1, 627, '10', 0, NULL), + (739, 'avatar_effect11', '60', 1, 0, 89, 0, 0, 0, 1, 627, '11', 0, NULL), + (740, 'avatar_effect12', '60', 1, 0, 89, 0, 0, 0, 1, 627, '12', 0, NULL), + (741, 'avatar_effect13', '60', 1, 0, 89, 0, 0, 0, 1, 627, '13', 0, NULL), + (742, 'avatar_effect14', '60', 1, 0, 139, 0, 0, 0, 1, 627, '14', 0, NULL), + (743, 'avatar_effect15', '60', 1, 0, 139, 0, 0, 0, 1, 627, '15', 0, NULL), + (744, 'avatar_effect16', '60', 1, 0, 89, 0, 0, 0, 1, 627, '16', 0, NULL), + (745, 'avatar_effect17', '60', 1, 0, 139, 0, 0, 0, 1, 627, '17', 0, NULL), + (746, 'avatar_effect18', '60', 1, 0, 139, 0, 0, 0, 1, 627, '18', 0, NULL), + (747, 'avatar_effect23', '60', 1, 0, 89, 0, 0, 1, 1, 627, '23', 0, NULL), + (748, 'avatar_effect24', '60', 1, 0, 89, 0, 0, 1, 1, 627, '24', 0, NULL), + (749, 'avatar_effect25', '60', 1, 0, 89, 0, 0, 1, 1, 627, '25', 0, NULL), + (750, 'avatar_effect26', '60', 1, 0, 89, 0, 0, 1, 1, 627, '26', 0, NULL), + (751, 'bump_road', '61', 7, 1, 89, 0, 0, 0, 1, 628, '', 0, NULL), + (752, 'bump_lights', '61', 6, 1, 89, 0, 0, 0, 1, 629, '', 0, NULL), + (753, 'bump_signs', '61', 2, 2, 89, 0, 0, 0, 1, 630, '', 0, NULL), + (754, 'bump_tires', '61', 3, 1, 89, 0, 0, 0, 1, 631, '', 0, NULL), + (755, 'bump_tottero', '61', 1, 1, 89, 0, 0, 0, 1, 632, '', 0, NULL), + (756, 'bump_tires_deal3', '61', 4, 2, 89, 0, 0, 0, 3, 631, '', 0, NULL), + (757, 'bump_tires_deal5', '61', 5, 4, 89, 0, 0, 0, 5, 631, '', 0, NULL), + (758, 'bump_road_deal10', '61', 8, 9, 89, 0, 0, 0, 10, 628, '', 0, NULL), + (759, 'bump_road_deal15', '61', 9, 12, 89, 0, 0, 0, 15, 628, '', 0, NULL), + (760, 'bump_road_deal20', '61', 10, 15, 89, 0, 0, 0, 20, 628, '', 0, NULL), + (761, 'avatar_effect19', '61', 11, 1, 139, 0, 0, 0, 1, 627, '19', 0, NULL), + (762, 'avatar_effect20', '61', 12, 1, 139, 0, 0, 0, 1, 627, '20', 0, NULL), + (763, 'avatar_effect21', '61', 13, 1, 139, 0, 0, 0, 1, 627, '21', 0, NULL), + (764, 'avatar_effect22', '61', 14, 1, 139, 0, 0, 0, 1, 627, '22', 0, NULL), + (765, 'chair_norja*2', '14', 1, 3, 0, 0, 0, 0, 1, 633, '', 0, NULL), + (766, 'chair_norja*3', '14', 1, 3, 0, 0, 0, 0, 1, 634, '', 0, NULL), + (767, 'chair_norja*4', '14', 1, 3, 0, 0, 0, 0, 1, 635, '', 0, NULL), + (768, 'chair_norja*5', '14', 1, 3, 0, 0, 0, 0, 1, 636, '', 0, NULL), + (769, 'chair_norja*6', '14', 1, 3, 0, 0, 0, 0, 1, 637, '', 0, NULL), + (770, 'chair_norja*7', '14', 1, 3, 0, 0, 0, 0, 1, 638, '', 0, NULL), + (771, 'chair_norja*8', '14', 1, 3, 0, 0, 0, 0, 1, 639, '', 0, NULL), + (772, 'chair_norja*9', '14', 1, 3, 0, 0, 0, 0, 1, 640, '', 0, NULL), + (773, 'couch_norja*2', '14', 2, 3, 0, 0, 0, 0, 1, 641, '', 0, NULL), + (774, 'couch_norja*3', '14', 2, 3, 0, 0, 0, 0, 1, 642, '', 0, NULL), + (775, 'couch_norja*4', '14', 2, 3, 0, 0, 0, 0, 1, 643, '', 0, NULL), + (776, 'couch_norja*5', '14', 2, 3, 0, 0, 0, 0, 1, 644, '', 0, NULL), + (777, 'couch_norja*6', '14', 2, 3, 0, 0, 0, 0, 1, 645, '', 0, NULL), + (778, 'couch_norja*7', '14', 2, 3, 0, 0, 0, 0, 1, 646, '', 0, NULL), + (779, 'couch_norja*8', '14', 2, 3, 0, 0, 0, 0, 1, 647, '', 0, NULL), + (780, 'couch_norja*9', '14', 2, 3, 0, 0, 0, 0, 1, 648, '', 0, NULL), + (781, 'table_norja_med*2', '14', 3, 3, 0, 0, 0, 0, 1, 649, '', 0, NULL), + (782, 'table_norja_med*3', '14', 3, 3, 0, 0, 0, 0, 1, 650, '', 0, NULL), + (783, 'table_norja_med*4', '14', 3, 3, 0, 0, 0, 0, 1, 651, '', 0, NULL), + (784, 'table_norja_med*5', '14', 3, 3, 0, 0, 0, 0, 1, 652, '', 0, NULL), + (785, 'table_norja_med*6', '14', 3, 3, 0, 0, 0, 0, 1, 653, '', 0, NULL), + (786, 'table_norja_med*7', '14', 3, 3, 0, 0, 0, 0, 1, 654, '', 0, NULL), + (787, 'table_norja_med*8', '14', 3, 3, 0, 0, 0, 0, 1, 655, '', 0, NULL), + (788, 'table_norja_med*9', '14', 3, 3, 0, 0, 0, 0, 1, 656, '', 0, NULL), + (789, 'shelves_norja*2', '14', 4, 3, 0, 0, 0, 0, 1, 657, '', 0, NULL), + (790, 'shelves_norja*3', '14', 4, 3, 0, 0, 0, 0, 1, 658, '', 0, NULL), + (791, 'shelves_norja*4', '14', 4, 3, 0, 0, 0, 0, 1, 659, '', 0, NULL), + (792, 'shelves_norja*5', '14', 4, 3, 0, 0, 0, 0, 1, 660, '', 0, NULL), + (793, 'shelves_norja*6', '14', 4, 3, 0, 0, 0, 0, 1, 661, '', 0, NULL), + (794, 'shelves_norja*7', '14', 4, 3, 0, 0, 0, 0, 1, 662, '', 0, NULL), + (795, 'shelves_norja*8', '14', 4, 3, 0, 0, 0, 0, 1, 663, '', 0, NULL), + (796, 'shelves_norja*9', '14', 4, 3, 0, 0, 0, 0, 1, 664, '', 0, NULL), + (797, 'soft_sofachair_norja*2', '14', 5, 3, 0, 0, 0, 0, 1, 665, '', 0, NULL), + (798, 'soft_sofachair_norja*3', '14', 5, 3, 0, 0, 0, 0, 1, 666, '', 0, NULL), + (799, 'soft_sofachair_norja*4', '14', 5, 3, 0, 0, 0, 0, 1, 667, '', 0, NULL), + (800, 'soft_sofachair_norja*5', '14', 5, 3, 0, 0, 0, 0, 1, 668, '', 0, NULL), + (801, 'soft_sofachair_norja*6', '14', 5, 3, 0, 0, 0, 0, 1, 669, '', 0, NULL), + (802, 'soft_sofachair_norja*7', '14', 5, 3, 0, 0, 0, 0, 1, 670, '', 0, NULL), + (803, 'soft_sofachair_norja*8', '14', 5, 3, 0, 0, 0, 0, 1, 671, '', 0, NULL), + (804, 'soft_sofachair_norja*9', '14', 5, 3, 0, 0, 0, 0, 1, 672, '', 0, NULL), + (805, 'soft_sofa_norja*2', '14', 6, 4, 0, 0, 0, 0, 1, 673, '', 0, NULL), + (806, 'soft_sofa_norja*3', '14', 6, 4, 0, 0, 0, 0, 1, 674, '', 0, NULL), + (807, 'soft_sofa_norja*4', '14', 6, 4, 0, 0, 0, 0, 1, 675, '', 0, NULL), + (808, 'soft_sofa_norja*5', '14', 6, 4, 0, 0, 0, 0, 1, 676, '', 0, NULL), + (809, 'soft_sofa_norja*6', '14', 6, 4, 0, 0, 0, 0, 1, 677, '', 0, NULL), + (810, 'soft_sofa_norja*7', '14', 6, 4, 0, 0, 0, 0, 1, 678, '', 0, NULL), + (811, 'soft_sofa_norja*8', '14', 6, 4, 0, 0, 0, 0, 1, 679, '', 0, NULL), + (812, 'soft_sofa_norja*9', '14', 6, 4, 0, 0, 0, 0, 1, 680, '', 0, NULL), + (813, 'divider_nor2*2', '14', 7, 3, 0, 0, 0, 0, 1, 681, '', 0, NULL), + (814, 'divider_nor2*3', '14', 7, 3, 0, 0, 0, 0, 1, 682, '', 0, NULL), + (815, 'divider_nor2*4', '14', 7, 3, 0, 0, 0, 0, 1, 683, '', 0, NULL), + (816, 'divider_nor2*5', '14', 7, 3, 0, 0, 0, 0, 1, 684, '', 0, NULL), + (817, 'divider_nor2*6', '14', 7, 3, 0, 0, 0, 0, 1, 685, '', 0, NULL), + (818, 'divider_nor2*7', '14', 7, 3, 0, 0, 0, 0, 1, 686, '', 0, NULL), + (819, 'divider_nor2*8', '14', 7, 3, 0, 0, 0, 0, 1, 687, '', 0, NULL), + (820, 'divider_nor2*9', '14', 7, 3, 0, 0, 0, 0, 1, 688, '', 0, NULL), + (821, 'divider_nor1*2', '14', 8, 3, 0, 0, 0, 0, 1, 689, '', 0, NULL), + (822, 'divider_nor1*3', '14', 8, 3, 0, 0, 0, 0, 1, 690, '', 0, NULL), + (823, 'divider_nor1*4', '14', 8, 3, 0, 0, 0, 0, 1, 691, '', 0, NULL), + (824, 'divider_nor1*5', '14', 8, 3, 0, 0, 0, 0, 1, 692, '', 0, NULL), + (825, 'divider_nor1*6', '14', 8, 3, 0, 0, 0, 0, 1, 693, '', 0, NULL), + (826, 'divider_nor1*7', '14', 8, 3, 0, 0, 0, 0, 1, 694, '', 0, NULL), + (827, 'divider_nor1*8', '14', 8, 3, 0, 0, 0, 0, 1, 695, '', 0, NULL), + (828, 'divider_nor1*9', '14', 8, 3, 0, 0, 0, 0, 1, 696, '', 0, NULL), + (829, 'divider_nor3*2', '14', 9, 6, 0, 0, 0, 0, 1, 697, '', 0, NULL), + (830, 'divider_nor3*3', '14', 9, 6, 0, 0, 0, 0, 1, 698, '', 0, NULL), + (831, 'divider_nor3*4', '14', 9, 6, 0, 0, 0, 0, 1, 699, '', 0, NULL), + (832, 'divider_nor3*5', '14', 9, 6, 0, 0, 0, 0, 1, 700, '', 0, NULL), + (833, 'divider_nor3*6', '14', 9, 6, 0, 0, 0, 0, 1, 701, '', 0, NULL), + (834, 'divider_nor3*7', '14', 9, 6, 0, 0, 0, 0, 1, 702, '', 0, NULL), + (835, 'divider_nor3*8', '14', 9, 6, 0, 0, 0, 0, 1, 703, '', 0, NULL), + (836, 'divider_nor3*9', '14', 9, 6, 0, 0, 0, 0, 1, 704, '', 0, NULL), + (837, 'divider_nor4*2', '14', 10, 5, 0, 0, 0, 0, 1, 705, '', 0, NULL), + (838, 'divider_nor4*3', '14', 10, 5, 0, 0, 0, 0, 1, 706, '', 0, NULL), + (839, 'divider_nor4*4', '14', 10, 5, 0, 0, 0, 0, 1, 707, '', 0, NULL), + (840, 'divider_nor4*5', '14', 10, 5, 0, 0, 0, 0, 1, 708, '', 0, NULL), + (841, 'divider_nor4*6', '14', 10, 5, 0, 0, 0, 0, 1, 709, '', 0, NULL), + (842, 'divider_nor4*7', '14', 10, 5, 0, 0, 0, 0, 1, 710, '', 0, NULL), + (843, 'divider_nor4*8', '14', 10, 5, 0, 0, 0, 0, 1, 711, '', 0, NULL), + (844, 'divider_nor4*9', '14', 10, 5, 0, 0, 0, 0, 1, 712, '', 0, NULL), + (845, 'divider_nor5*2', '14', 11, 4, 0, 0, 0, 0, 1, 713, '', 0, NULL), + (846, 'divider_nor5*3', '14', 11, 4, 0, 0, 0, 0, 1, 714, '', 0, NULL), + (847, 'divider_nor5*4', '14', 11, 4, 0, 0, 0, 0, 1, 715, '', 0, NULL), + (848, 'divider_nor5*5', '14', 11, 4, 0, 0, 0, 0, 1, 716, '', 0, NULL), + (849, 'divider_nor5*6', '14', 11, 4, 0, 0, 0, 0, 1, 717, '', 0, NULL), + (850, 'divider_nor5*7', '14', 11, 4, 0, 0, 0, 0, 1, 718, '', 0, NULL), + (851, 'divider_nor5*8', '14', 11, 4, 0, 0, 0, 0, 1, 719, '', 0, NULL), + (852, 'divider_nor5*9', '14', 11, 4, 0, 0, 0, 0, 1, 720, '', 0, NULL), + (853, 'sofa_silo*2', '9', 2, 3, 0, 0, 0, 0, 1, 721, '', 0, NULL), + (854, 'sofa_silo*3', '9', 3, 3, 0, 0, 0, 0, 1, 722, '', 0, NULL), + (855, 'sofa_silo*4', '9', 4, 3, 0, 0, 0, 0, 1, 723, '', 0, NULL), + (856, 'sofa_silo*5', '9', 5, 3, 0, 0, 0, 0, 1, 724, '', 0, NULL), + (857, 'sofa_silo*6', '9', 6, 3, 0, 0, 0, 0, 1, 725, '', 0, NULL), + (858, 'sofa_silo*7', '9', 7, 3, 0, 0, 0, 0, 1, 726, '', 0, NULL), + (859, 'sofa_silo*8', '9', 8, 3, 0, 0, 0, 0, 1, 727, '', 0, NULL), + (860, 'sofa_silo*9', '9', 9, 3, 0, 0, 0, 0, 1, 728, '', 0, NULL), + (861, 'sofachair_silo*2', '9', 2, 3, 0, 0, 0, 0, 1, 729, '', 0, NULL), + (862, 'sofachair_silo*3', '9', 3, 3, 0, 0, 0, 0, 1, 730, '', 0, NULL), + (863, 'sofachair_silo*4', '9', 4, 3, 0, 0, 0, 0, 1, 731, '', 0, NULL), + (864, 'sofachair_silo*5', '9', 5, 3, 0, 0, 0, 0, 1, 732, '', 0, NULL), + (865, 'sofachair_silo*6', '9', 6, 3, 0, 0, 0, 0, 1, 733, '', 0, NULL), + (866, 'sofachair_silo*7', '9', 7, 3, 0, 0, 0, 0, 1, 734, '', 0, NULL), + (867, 'sofachair_silo*8', '9', 8, 3, 0, 0, 0, 0, 1, 735, '', 0, NULL), + (868, 'sofachair_silo*9', '9', 9, 3, 0, 0, 0, 0, 1, 736, '', 0, NULL), + (869, 'table_silo_small*2', '9', 2, 1, 0, 0, 0, 0, 1, 737, '', 0, NULL), + (870, 'table_silo_small*3', '9', 3, 1, 0, 0, 0, 0, 1, 738, '', 0, NULL), + (871, 'table_silo_small*4', '9', 4, 1, 0, 0, 0, 0, 1, 739, '', 0, NULL), + (872, 'table_silo_small*5', '9', 5, 1, 0, 0, 0, 0, 1, 740, '', 0, NULL), + (873, 'table_silo_small*6', '9', 6, 1, 0, 0, 0, 0, 1, 741, '', 0, NULL), + (874, 'table_silo_small*7', '9', 7, 1, 0, 0, 0, 0, 1, 742, '', 0, NULL), + (875, 'table_silo_small*8', '9', 8, 1, 0, 0, 0, 0, 1, 743, '', 0, NULL), + (876, 'table_silo_small*9', '9', 9, 1, 0, 0, 0, 0, 1, 744, '', 0, NULL), + (877, 'divider_silo3*2', '9', 2, 6, 0, 0, 0, 0, 1, 745, '', 0, NULL), + (878, 'divider_silo3*3', '9', 3, 6, 0, 0, 0, 0, 1, 746, '', 0, NULL), + (879, 'divider_silo3*4', '9', 4, 6, 0, 0, 0, 0, 1, 747, '', 0, NULL), + (880, 'divider_silo3*5', '9', 5, 6, 0, 0, 0, 0, 1, 748, '', 0, NULL), + (881, 'divider_silo3*6', '9', 6, 6, 0, 0, 0, 0, 1, 749, '', 0, NULL), + (882, 'divider_silo3*7', '9', 7, 6, 0, 0, 0, 0, 1, 750, '', 0, NULL), + (883, 'divider_silo3*8', '9', 8, 6, 0, 0, 0, 0, 1, 751, '', 0, NULL), + (884, 'divider_silo3*9', '9', 9, 6, 0, 0, 0, 0, 1, 752, '', 0, NULL), + (885, 'divider_silo1*2', '9', 2, 3, 0, 0, 0, 0, 1, 753, '', 0, NULL), + (886, 'divider_silo1*3', '9', 3, 3, 0, 0, 0, 0, 1, 754, '', 0, NULL), + (887, 'divider_silo1*4', '9', 4, 3, 0, 0, 0, 0, 1, 755, '', 0, NULL), + (888, 'divider_silo1*5', '9', 5, 3, 0, 0, 0, 0, 1, 756, '', 0, NULL), + (889, 'divider_silo1*6', '9', 6, 3, 0, 0, 0, 0, 1, 757, '', 0, NULL), + (890, 'divider_silo1*7', '9', 7, 3, 0, 0, 0, 0, 1, 758, '', 0, NULL), + (891, 'divider_silo1*8', '9', 8, 3, 0, 0, 0, 0, 1, 759, '', 0, NULL), + (892, 'divider_silo1*9', '9', 9, 3, 0, 0, 0, 0, 1, 760, '', 0, NULL), + (893, 'chair_silo*2', '9', 2, 3, 0, 0, 0, 0, 1, 761, '', 0, NULL), + (894, 'chair_silo*3', '9', 3, 3, 0, 0, 0, 0, 1, 762, '', 0, NULL), + (895, 'chair_silo*4', '9', 4, 3, 0, 0, 0, 0, 1, 763, '', 0, NULL), + (896, 'chair_silo*5', '9', 5, 3, 0, 0, 0, 0, 1, 764, '', 0, NULL), + (897, 'chair_silo*6', '9', 6, 3, 0, 0, 0, 0, 1, 765, '', 0, NULL), + (898, 'chair_silo*7', '9', 7, 3, 0, 0, 0, 0, 1, 766, '', 0, NULL), + (899, 'chair_silo*8', '9', 8, 3, 0, 0, 0, 0, 1, 767, '', 0, NULL), + (900, 'chair_silo*9', '9', 9, 3, 0, 0, 0, 0, 1, 768, '', 0, NULL), + (901, 'safe_silo*2', '9', 2, 3, 0, 0, 0, 0, 1, 769, '', 0, NULL), + (902, 'safe_silo*3', '9', 3, 3, 0, 0, 0, 0, 1, 770, '', 0, NULL), + (903, 'safe_silo*4', '9', 4, 3, 0, 0, 0, 0, 1, 771, '', 0, NULL), + (904, 'safe_silo*5', '9', 5, 3, 0, 0, 0, 0, 1, 772, '', 0, NULL), + (905, 'safe_silo*6', '9', 6, 3, 0, 0, 0, 0, 1, 773, '', 0, NULL), + (906, 'safe_silo*7', '9', 7, 3, 0, 0, 0, 0, 1, 774, '', 0, NULL), + (907, 'safe_silo*8', '9', 8, 3, 0, 0, 0, 0, 1, 775, '', 0, NULL), + (908, 'safe_silo*9', '9', 9, 3, 0, 0, 0, 0, 1, 776, '', 0, NULL), + (909, 'barchair_silo*2', '9', 2, 3, 0, 0, 0, 0, 1, 777, '', 0, NULL), + (910, 'barchair_silo*3', '9', 3, 3, 0, 0, 0, 0, 1, 778, '', 0, NULL), + (911, 'barchair_silo*4', '9', 4, 3, 0, 0, 0, 0, 1, 779, '', 0, NULL), + (912, 'barchair_silo*5', '9', 5, 3, 0, 0, 0, 0, 1, 780, '', 0, NULL), + (913, 'barchair_silo*6', '9', 6, 3, 0, 0, 0, 0, 1, 781, '', 0, NULL), + (914, 'barchair_silo*7', '9', 7, 3, 0, 0, 0, 0, 1, 782, '', 0, NULL), + (915, 'barchair_silo*8', '9', 8, 3, 0, 0, 0, 0, 1, 783, '', 0, NULL), + (916, 'barchair_silo*9', '9', 9, 3, 0, 0, 0, 0, 1, 784, '', 0, NULL), + (917, 'table_silo_med*2', '9', 2, 3, 0, 0, 0, 0, 1, 785, '', 0, NULL), + (918, 'table_silo_med*3', '9', 3, 3, 0, 0, 0, 0, 1, 786, '', 0, NULL), + (919, 'table_silo_med*4', '9', 4, 3, 0, 0, 0, 0, 1, 787, '', 0, NULL), + (920, 'table_silo_med*5', '9', 5, 3, 0, 0, 0, 0, 1, 788, '', 0, NULL), + (921, 'table_silo_med*6', '9', 6, 3, 0, 0, 0, 0, 1, 789, '', 0, NULL), + (922, 'table_silo_med*7', '9', 7, 3, 0, 0, 0, 0, 1, 790, '', 0, NULL), + (923, 'table_silo_med*8', '9', 8, 3, 0, 0, 0, 0, 1, 791, '', 0, NULL), + (924, 'table_silo_med*9', '9', 9, 3, 0, 0, 0, 0, 1, 792, '', 0, NULL), + (925, 'pura_mdl1*1', '17', 1, 3, 0, 0, 0, 0, 1, 793, '', 0, NULL), + (926, 'pura_mdl2*1', '17', 1, 3, 0, 0, 0, 0, 1, 794, '', 0, NULL), + (927, 'pura_mdl3*1', '17', 1, 3, 0, 0, 0, 0, 1, 795, '', 0, NULL), + (928, 'pura_mdl4*1', '17', 1, 3, 0, 0, 0, 0, 1, 796, '', 0, NULL), + (929, 'pura_mdl5*1', '17', 1, 3, 0, 0, 0, 0, 1, 797, '', 0, NULL), + (930, 'chair_basic*1', '17', 1, 3, 0, 0, 0, 0, 1, 798, '', 0, NULL), + (931, 'pura_mdl1*2', '17', 2, 3, 0, 0, 0, 0, 1, 799, '', 0, NULL), + (932, 'pura_mdl1*3', '17', 3, 3, 0, 0, 0, 0, 1, 800, '', 0, NULL), + (933, 'pura_mdl1*4', '17', 4, 3, 0, 0, 0, 0, 1, 801, '', 0, NULL), + (934, 'pura_mdl1*5', '17', 5, 3, 0, 0, 0, 0, 1, 802, '', 0, NULL), + (935, 'pura_mdl1*6', '17', 6, 3, 0, 0, 0, 0, 1, 803, '', 0, NULL), + (936, 'pura_mdl1*7', '17', 7, 3, 0, 0, 0, 0, 1, 804, '', 0, NULL), + (937, 'pura_mdl1*8', '17', 8, 3, 0, 0, 0, 0, 1, 805, '', 0, NULL), + (938, 'pura_mdl1*9', '17', 9, 3, 0, 0, 0, 0, 1, 806, '', 0, NULL), + (939, 'pura_mdl2*2', '17', 2, 3, 0, 0, 0, 0, 1, 807, '', 0, NULL), + (940, 'pura_mdl2*3', '17', 3, 3, 0, 0, 0, 0, 1, 808, '', 0, NULL), + (941, 'pura_mdl2*4', '17', 4, 3, 0, 0, 0, 0, 1, 809, '', 0, NULL), + (942, 'pura_mdl2*5', '17', 5, 3, 0, 0, 0, 0, 1, 810, '', 0, NULL), + (943, 'pura_mdl2*6', '17', 6, 3, 0, 0, 0, 0, 1, 811, '', 0, NULL), + (944, 'pura_mdl2*7', '17', 7, 3, 0, 0, 0, 0, 1, 812, '', 0, NULL), + (945, 'pura_mdl2*8', '17', 8, 3, 0, 0, 0, 0, 1, 813, '', 0, NULL), + (946, 'pura_mdl2*9', '17', 9, 3, 0, 0, 0, 0, 1, 814, '', 0, NULL), + (947, 'pura_mdl3*2', '17', 2, 3, 0, 0, 0, 0, 1, 815, '', 0, NULL), + (948, 'pura_mdl3*3', '17', 3, 3, 0, 0, 0, 0, 1, 816, '', 0, NULL), + (949, 'pura_mdl3*4', '17', 4, 3, 0, 0, 0, 0, 1, 817, '', 0, NULL), + (950, 'pura_mdl3*5', '17', 5, 3, 0, 0, 0, 0, 1, 818, '', 0, NULL), + (951, 'pura_mdl3*6', '17', 6, 3, 0, 0, 0, 0, 1, 819, '', 0, NULL), + (952, 'pura_mdl3*7', '17', 7, 3, 0, 0, 0, 0, 1, 820, '', 0, NULL), + (953, 'pura_mdl3*8', '17', 8, 3, 0, 0, 0, 0, 1, 821, '', 0, NULL), + (954, 'pura_mdl3*9', '17', 9, 3, 0, 0, 0, 0, 1, 822, '', 0, NULL), + (955, 'pura_mdl4*2', '17', 2, 3, 0, 0, 0, 0, 1, 823, '', 0, NULL), + (956, 'pura_mdl4*3', '17', 3, 3, 0, 0, 0, 0, 1, 824, '', 0, NULL), + (957, 'pura_mdl4*4', '17', 4, 3, 0, 0, 0, 0, 1, 825, '', 0, NULL), + (958, 'pura_mdl4*5', '17', 5, 3, 0, 0, 0, 0, 1, 826, '', 0, NULL), + (959, 'pura_mdl4*6', '17', 6, 3, 0, 0, 0, 0, 1, 827, '', 0, NULL), + (960, 'pura_mdl4*7', '17', 7, 3, 0, 0, 0, 0, 1, 828, '', 0, NULL), + (961, 'pura_mdl4*8', '17', 8, 3, 0, 0, 0, 0, 1, 829, '', 0, NULL), + (962, 'pura_mdl4*9', '17', 9, 3, 0, 0, 0, 0, 1, 830, '', 0, NULL), + (963, 'pura_mdl5*2', '17', 2, 3, 0, 0, 0, 0, 1, 831, '', 0, NULL), + (964, 'pura_mdl5*3', '17', 3, 3, 0, 0, 0, 0, 1, 832, '', 0, NULL), + (965, 'pura_mdl5*4', '17', 4, 3, 0, 0, 0, 0, 1, 833, '', 0, NULL), + (966, 'pura_mdl5*5', '17', 5, 3, 0, 0, 0, 0, 1, 834, '', 0, NULL), + (967, 'pura_mdl5*6', '17', 6, 3, 0, 0, 0, 0, 1, 835, '', 0, NULL), + (968, 'pura_mdl5*7', '17', 7, 3, 0, 0, 0, 0, 1, 836, '', 0, NULL), + (969, 'pura_mdl5*8', '17', 8, 3, 0, 0, 0, 0, 1, 837, '', 0, NULL), + (970, 'pura_mdl5*9', '17', 9, 3, 0, 0, 0, 0, 1, 838, '', 0, NULL), + (971, 'chair_basic*2', '17', 2, 3, 0, 0, 0, 0, 1, 839, '', 0, NULL), + (972, 'chair_basic*3', '17', 3, 3, 0, 0, 0, 0, 1, 840, '', 0, NULL), + (973, 'chair_basic*4', '17', 4, 3, 0, 0, 0, 0, 1, 841, '', 0, NULL), + (974, 'chair_basic*5', '17', 5, 3, 0, 0, 0, 0, 1, 842, '', 0, NULL), + (975, 'chair_basic*6', '17', 6, 3, 0, 0, 0, 0, 1, 843, '', 0, NULL), + (976, 'chair_basic*7', '17', 7, 3, 0, 0, 0, 0, 1, 844, '', 0, NULL), + (977, 'chair_basic*8', '17', 8, 3, 0, 0, 0, 0, 1, 845, '', 0, NULL), + (978, 'chair_basic*9', '17', 9, 3, 0, 0, 0, 0, 1, 846, '', 0, NULL), + (979, 'hcc_chair', '64', 1, 8, 0, 0, 0, 0, 1, 848, '', 0, NULL), + (980, 'hcc_shelf', '64', 6, 8, 0, 0, 0, 0, 1, 849, '', 0, NULL), + (981, 'hcc_stool', '64', 2, 8, 0, 0, 0, 0, 1, 850, '', 0, NULL), + (982, 'hcc_dvdr', '64', 8, 8, 0, 0, 0, 0, 1, 851, '', 0, NULL), + (983, 'hcc_sofa', '64', 4, 8, 0, 0, 0, 0, 1, 856, '', 0, NULL), + (984, 'hcc_crnr', '64', 9, 8, 0, 0, 0, 0, 1, 853, '', 0, NULL), + (985, 'hcc_sofachair', '64', 3, 8, 0, 0, 0, 0, 1, 852, '', 0, NULL), + (986, 'hcc_table', '64', 5, 8, 0, 0, 0, 0, 1, 854, '', 0, NULL), + (987, 'hcc_minibar', '64', 7, 8, 0, 0, 0, 0, 1, 855, '', 0, NULL), + (988, 'glass_shelf', '66', 1, 8, 0, 0, 0, 0, 1, 857, '', 0, NULL), + (989, 'glass_sofa', '66', 2, 8, 0, 0, 0, 0, 1, 858, '', 0, NULL), + (990, 'glass_table', '66', 3, 8, 0, 0, 0, 0, 1, 859, '', 0, NULL), + (991, 'glass_chair', '66', 4, 8, 0, 0, 0, 0, 1, 860, '', 0, NULL), + (992, 'glass_stool', '66', 5, 8, 0, 0, 0, 0, 1, 861, '', 0, NULL), + (993, 'glass_sofa*2', '66', 2, 8, 0, 0, 0, 0, 1, 862, '', 0, NULL), + (994, 'glass_sofa*3', '66', 2, 8, 0, 0, 0, 0, 1, 863, '', 0, NULL), + (995, 'glass_sofa*4', '66', 2, 8, 0, 0, 0, 0, 1, 864, '', 0, NULL), + (996, 'glass_sofa*5', '66', 2, 8, 0, 0, 0, 0, 1, 865, '', 0, NULL), + (997, 'glass_table*2', '66', 3, 8, 0, 0, 0, 0, 1, 866, '', 0, NULL), + (998, 'glass_table*3', '66', 3, 8, 0, 0, 0, 0, 1, 867, '', 0, NULL), + (999, 'glass_table*4', '66', 3, 8, 0, 0, 0, 0, 1, 868, '', 0, NULL), + (1000, 'glass_table*5', '66', 3, 8, 0, 0, 0, 0, 1, 869, '', 0, NULL), + (1001, 'glass_chair*2', '66', 4, 8, 0, 0, 0, 0, 1, 870, '', 0, NULL), + (1002, 'glass_chair*3', '66', 4, 8, 0, 0, 0, 0, 1, 871, '', 0, NULL), + (1003, 'glass_chair*4', '66', 4, 8, 0, 0, 0, 0, 1, 872, '', 0, NULL), + (1004, 'glass_stool*2', '66', 5, 8, 0, 0, 0, 0, 1, 874, '', 0, NULL), + (1005, 'glass_stool*3', '66', 5, 8, 0, 0, 0, 0, 1, 875, '', 0, NULL), + (1006, 'glass_stool*4', '66', 5, 8, 0, 0, 0, 0, 1, 876, '', 0, NULL), + (1007, 'glass_stool*5', '66', 5, 8, 0, 0, 0, 0, 1, 877, '', 0, NULL), + (1008, 'glass_sofa*6', '66', 2, 8, 0, 0, 0, 0, 1, 878, '', 0, NULL), + (1009, 'glass_sofa*7', '66', 2, 8, 0, 0, 0, 0, 1, 879, '', 0, NULL), + (1010, 'glass_sofa*8', '66', 2, 8, 0, 0, 0, 0, 1, 880, '', 0, NULL), + (1011, 'glass_sofa*9', '66', 2, 8, 0, 0, 0, 0, 1, 881, '', 0, NULL), + (1012, 'glass_table*6', '66', 3, 8, 0, 0, 0, 0, 1, 882, '', 0, NULL), + (1013, 'glass_table*7', '66', 3, 8, 0, 0, 0, 0, 1, 883, '', 0, NULL), + (1014, 'glass_table*8', '66', 3, 8, 0, 0, 0, 0, 1, 884, '', 0, NULL), + (1015, 'glass_table*9', '66', 3, 8, 0, 0, 0, 0, 1, 885, '', 0, NULL), + (1016, 'glass_chair*5', '66', 4, 8, 0, 0, 0, 0, 1, 873, '', 0, NULL), + (1017, 'glass_chair*6', '66', 4, 8, 0, 0, 0, 0, 1, 886, '', 0, NULL), + (1018, 'glass_chair*7', '66', 4, 8, 0, 0, 0, 0, 1, 887, '', 0, NULL), + (1019, 'glass_chair*8', '66', 4, 8, 0, 0, 0, 0, 1, 888, '', 0, NULL), + (1020, 'glass_stool*6', '66', 5, 8, 0, 0, 0, 0, 1, 890, '', 0, NULL), + (1021, 'glass_stool*7', '66', 5, 8, 0, 0, 0, 0, 1, 891, '', 0, NULL), + (1022, 'glass_stool*8', '66', 5, 8, 0, 0, 0, 0, 1, 892, '', 0, NULL), + (1023, 'glass_stool*9', '66', 5, 8, 0, 0, 0, 0, 1, 893, '', 0, NULL), + (1024, 'glass_chair*9', '66', 4, 8, 0, 0, 0, 0, 1, 889, '', 0, NULL), + (1025, 'greek_gate', '67', 1, 3, 0, 0, 0, 0, 1, 894, '', 0, NULL), + (1026, 'greek_seat', '67', 1, 2, 0, 0, 0, 0, 1, 895, '', 0, NULL), + (1027, 'greek_pillars', '67', 1, 2, 0, 0, 0, 0, 1, 896, '', 0, NULL), + (1028, 'greek_corner', '67', 1, 2, 0, 0, 0, 0, 1, 897, '', 0, NULL), + (1029, 'greek_block', '67', 1, 4, 0, 0, 0, 0, 1, 898, '', 0, NULL), + (1030, 'romantique_pianochair*1', '68', 2, 3, 0, 0, 0, 0, 1, 899, '', 0, NULL), + (1031, 'romantique_divan*1', '68', 3, 3, 0, 0, 0, 0, 1, 900, '', 0, NULL), + (1032, 'romantique_chair*1', '68', 4, 3, 0, 0, 0, 0, 1, 901, '', 0, NULL), + (1033, 'romantique_divider*1', '68', 5, 3, 0, 0, 0, 0, 1, 902, '', 0, NULL), + (1034, 'romantique_smalltabl*1', '68', 6, 3, 0, 0, 0, 0, 1, 903, '', 0, NULL), + (1035, 'romantique_mirrortabl', '68', 1, 3, 0, 0, 0, 0, 1, 904, '', 0, NULL), + (1036, 'wallmirror', '68', 1, 3, 0, 0, 0, 0, 1, 905, '', 0, NULL), + (1037, 'romantique_tray1', '68', 1, 3, 0, 0, 0, 0, 1, 906, '', 0, NULL), + (1038, 'romantique_tray2', '68', 1, 3, 0, 0, 0, 0, 1, 907, '', 0, NULL), + (1039, 'rom_lamp', '68', 1, 3, 0, 0, 0, 0, 1, 908, '', 0, NULL), + (1040, 'romantique_clock', '68', 1, 3, 0, 0, 0, 0, 1, 909, '', 0, NULL), + (1041, 'romantique_pianochair*2', '68', 2, 3, 0, 0, 0, 0, 1, 910, '', 0, NULL), + (1042, 'romantique_divan*2', '68', 3, 3, 0, 0, 0, 0, 1, 911, '', 0, NULL), + (1043, 'romantique_chair*2', '68', 4, 3, 0, 0, 0, 0, 1, 912, '', 0, NULL), + (1044, 'romantique_divider*2', '68', 5, 3, 0, 0, 0, 0, 1, 913, '', 0, NULL), + (1045, 'romantique_smalltabl*2', '68', 6, 3, 0, 0, 0, 0, 1, 914, '', 0, NULL), + (1046, 'romantique_pianochair*3', '68', 2, 3, 0, 0, 0, 0, 1, 915, '', 0, NULL), + (1047, 'romantique_divan*3', '68', 3, 3, 0, 0, 0, 0, 1, 916, '', 0, NULL), + (1048, 'romantique_chair*3', '68', 4, 3, 0, 0, 0, 0, 1, 917, '', 0, NULL), + (1049, 'romantique_divider*3', '68', 5, 3, 0, 0, 0, 0, 1, 918, '', 0, NULL), + (1050, 'romantique_smalltabl*3', '68', 6, 3, 0, 0, 0, 0, 1, 919, '', 0, NULL), + (1051, 'romantique_pianochair*4', '68', 2, 3, 0, 0, 0, 0, 1, 920, '', 0, NULL), + (1052, 'romantique_divan*4', '68', 3, 3, 0, 0, 0, 0, 1, 921, '', 0, NULL), + (1053, 'romantique_chair*4', '68', 4, 3, 0, 0, 0, 0, 1, 922, '', 0, NULL), + (1054, 'romantique_divider*4', '68', 5, 3, 0, 0, 0, 0, 1, 923, '', 0, NULL), + (1055, 'romantique_smalltabl*4', '68', 6, 3, 0, 0, 0, 0, 1, 924, '', 0, NULL), + (1056, 'romantique_pianochair*5', '68', 2, 3, 0, 0, 0, 0, 1, 925, '', 0, NULL), + (1057, 'romantique_divan*5', '68', 3, 3, 0, 0, 0, 0, 1, 926, '', 0, NULL), + (1058, 'romantique_chair*5', '68', 4, 3, 0, 0, 0, 0, 1, 927, '', 0, NULL), + (1059, 'romantique_divider*5', '68', 5, 3, 0, 0, 0, 0, 1, 928, '', 0, NULL), + (1060, 'romantique_smalltabl*6', '68', 6, 3, 0, 0, 0, 0, 1, 929, '', 0, NULL), + (1061, 'grand_piano*1', '68', 7, 3, 0, 0, 0, 0, 1, 930, '', 0, NULL), + (1062, 'grand_piano*2', '68', 7, 3, 0, 0, 0, 0, 1, 931, '', 0, NULL), + (1063, 'grand_piano*3', '68', 7, 3, 0, 0, 0, 0, 1, 932, '', 0, NULL), + (1064, 'grand_piano*4', '68', 7, 3, 0, 0, 0, 0, 1, 933, '', 0, NULL), + (1065, 'grand_piano*5', '68', 7, 3, 0, 0, 0, 0, 1, 934, '', 0, NULL), + (1066, 'xmas08_chair', '69', 1, 2, 0, 0, 0, 0, 1, 935, '', 0, NULL), + (1067, 'xmas08_cubetree', '69', 2, 2, 0, 0, 0, 0, 1, 936, '', 0, NULL), + (1068, 'xmas08_dvdr1', '69', 3, 2, 0, 0, 0, 0, 1, 937, '', 0, NULL), + (1069, 'xmas08_dvdr2', '69', 4, 2, 0, 0, 0, 0, 1, 938, '', 0, NULL), + (1070, 'xmas08_geysir', '69', 5, 3, 0, 0, 0, 0, 1, 939, '', 0, NULL), + (1071, 'xmas08_hole', '69', 6, 1, 0, 0, 0, 0, 1, 940, '', 0, NULL), + (1072, 'xmas08_hottub', '69', 7, 3, 0, 0, 0, 0, 1, 941, '', 0, NULL), + (1073, 'xmas08_icerug', '69', 8, 3, 0, 0, 0, 0, 1, 942, '', 0, NULL), + (1074, 'xmas08_icetree', '69', 9, 2, 0, 0, 0, 0, 1, 943, '', 0, NULL), + (1075, 'xmas08_icewall', '69', 10, 2, 0, 0, 0, 0, 1, 944, '', 0, NULL), + (1076, 'xmas08_lantern', '69', 11, 1, 0, 0, 0, 0, 1, 945, '', 0, NULL), + (1077, 'xmas08_snowpl', '69', 12, 1, 0, 0, 0, 0, 1, 946, '', 0, NULL), + (1078, 'xmas08_table', '69', 13, 3, 0, 0, 0, 0, 1, 947, '', 0, NULL), + (1079, 'xmas08_telep', '69,6', 14, 5, 0, 0, 0, 0, 1, 948, '', 0, NULL), + (1080, 'xmas08_trph1', '118', 15, 3, 0, 0, 0, 0, 1, 949, '', 0, NULL), + (1081, 'xmas08_wallpaper', '69', 16, 2, 0, 0, 0, 0, 1, 950, '', 0, NULL), + (1082, 'campfire', '69', 17, 1, 0, 0, 0, 0, 1, 951, '', 0, NULL), + (1083, 'xmas_snow', '69', 18, 2, 0, 0, 0, 0, 1, 952, '', 0, NULL), + (1084, 'lc_coral_divider_hi', '70', 1, 3, 0, 0, 0, 0, 1, 953, '', 0, NULL), + (1085, 'lc_coral_divider_low', '70', 2, 2, 0, 0, 0, 0, 1, 954, '', 0, NULL), + (1086, 'lc_wall1', '70', 3, 3, 0, 0, 0, 0, 1, 955, '', 0, NULL), + (1087, 'lc_wall2', '70', 4, 3, 0, 0, 0, 0, 1, 956, '', 0, NULL), + (1088, 'lc_window1', '70', 5, 3, 0, 0, 0, 0, 1, 957, '', 0, NULL), + (1089, 'lc_window2', '70', 6, 5, 0, 0, 0, 0, 1, 958, '', 0, NULL), + (1090, 'lc_anemone', '70', 7, 2, 0, 0, 0, 0, 1, 959, '', 0, NULL), + (1091, 'lc_chair', '70', 8, 2, 0, 0, 0, 0, 1, 960, '', 0, NULL), + (1092, 'lc_corner', '70', 9, 2, 0, 0, 0, 0, 1, 961, '', 0, NULL), + (1093, 'lc_desk', '70', 10, 3, 0, 0, 0, 0, 1, 962, '', 0, NULL), + (1094, 'lc_stool', '70', 11, 1, 0, 0, 0, 0, 1, 963, '', 0, NULL), + (1095, 'lc_table', '70', 12, 4, 0, 0, 0, 0, 1, 964, '', 0, NULL), + (1096, 'lc_tile1', '70', 13, 4, 0, 0, 0, 0, 1, 965, '', 0, NULL), + (1097, 'lc_tile2', '70', 14, 4, 0, 0, 0, 0, 1, 966, '', 0, NULL), + (1098, 'lc_tubes_corners', '70', 15, 1, 0, 0, 0, 0, 1, 967, '', 0, NULL), + (1099, 'lc_tubes_straight', '70', 16, 1, 0, 0, 0, 0, 1, 968, '', 0, NULL), + (1100, 'lostc_teleport', '83', 17, 200, 100, 0, 0, 0, 1, 969, '', 0, NULL), + (1101, 'lc_crab1', '70', 18, 1, 0, 0, 0, 0, 1, 970, '', 0, NULL), + (1102, 'lc_crab2', '70', 19, 2, 0, 0, 0, 0, 1, 971, '', 0, NULL), + (1103, 'lc_glass_floor', '70', 20, 3, 0, 0, 0, 0, 1, 972, '', 0, NULL), + (1104, 'lc_medusa1', '70', 21, 3, 0, 0, 0, 0, 1, 973, '', 0, NULL), + (1105, 'lc_medusa2', '70', 22, 2, 0, 0, 0, 0, 1, 974, '', 0, NULL), + (1106, 'party_ball', '71', 1, 3, 0, 0, 0, 0, 1, 975, '', 0, NULL), + (1107, 'party_barcorn', '71', 2, 1, 0, 0, 0, 0, 1, 976, '', 0, NULL), + (1108, 'party_bardesk', '71', 3, 3, 0, 0, 0, 0, 1, 977, '', 0, NULL), + (1109, 'party_beamer', '71', 4, 4, 0, 0, 0, 0, 1, 978, '', 0, NULL), + (1110, 'party_block', '71', 5, 2, 0, 0, 0, 0, 1, 979, '', 0, NULL), + (1111, 'party_block2', '71', 6, 3, 0, 0, 0, 0, 1, 980, '', 0, NULL), + (1112, 'party_chair', '71', 7, 2, 0, 0, 0, 0, 1, 981, '', 0, NULL), + (1113, 'party_discol', '71', 8, 2, 0, 0, 0, 0, 1, 982, '', 0, NULL), + (1114, 'party_djtable', '71', 9, 3, 0, 0, 0, 0, 1, 983, '', 0, NULL), + (1115, 'party_floor', '71', 10, 5, 0, 0, 0, 0, 1, 984, '', 0, NULL), + (1116, 'party_led', '71', 11, 5, 0, 0, 0, 0, 1, 985, '', 0, NULL), + (1117, 'party_mic', '71', 12, 2, 0, 0, 0, 0, 1, 986, '', 0, NULL), + (1118, 'party_neon1', '71', 13, 3, 0, 0, 0, 0, 1, 987, '', 0, NULL), + (1119, 'party_neon2', '71', 14, 3, 0, 0, 0, 0, 1, 988, '', 0, NULL), + (1120, 'party_neon3', '71', 15, 3, 0, 0, 0, 0, 1, 989, '', 0, NULL), + (1121, 'party_neon4', '71', 16, 3, 0, 0, 0, 0, 1, 990, '', 0, NULL), + (1122, 'party_neon5', '71', 17, 3, 0, 0, 0, 0, 1, 991, '', 0, NULL), + (1123, 'party_ravel', '71', 18, 4, 0, 0, 0, 0, 1, 992, '', 0, NULL), + (1124, 'party_seat', '71', 19, 2, 0, 0, 0, 0, 1, 993, '', 0, NULL), + (1125, 'party_shelf', '71', 20, 2, 0, 0, 0, 0, 1, 994, '', 0, NULL), + (1126, 'party_table', '71', 21, 3, 0, 0, 0, 0, 1, 995, '', 0, NULL), + (1127, 'party_tray', '71', 22, 2, 0, 0, 0, 0, 1, 996, '', 0, NULL), + (1128, 'party_tube_bubble', '71', 23, 3, 0, 0, 0, 0, 1, 997, '', 0, NULL), + (1129, 'party_tube_lava', '71', 24, 3, 0, 0, 0, 0, 1, 998, '', 0, NULL), + (1130, 'party_wc_boy', '71', 25, 2, 0, 0, 0, 0, 1, 999, '', 0, NULL), + (1131, 'party_wc_girl', '71', 26, 2, 0, 0, 0, 0, 1, 1000, '', 0, NULL), + (1132, 'LT_throne', '72', 1, 6, 0, 0, 0, 0, 1, 1001, '', 0, NULL), + (1133, 'lt_jngl_wall', '72', 2, 4, 0, 0, 0, 0, 1, 1002, '', 0, NULL), + (1134, 'lt_patch', '72', 3, 4, 0, 0, 0, 0, 1, 1003, '', 0, NULL), + (1135, 'lt_lavac', '72', 4, 2, 0, 0, 0, 0, 1, 1004, '', 0, NULL), + (1136, 'LT_pillar', '72', 5, 2, 0, 0, 0, 0, 1, 1005, '', 0, NULL), + (1137, 'LT_pillar2', '72', 6, 3, 0, 0, 0, 0, 1, 1006, '', 0, NULL), + (1138, 'LT_skull', '72', 7, 1, 0, 0, 0, 0, 1, 1007, '', 0, NULL), + (1139, 'lt_spider', '72', 8, 1, 0, 0, 0, 0, 1, 1008, '', 0, NULL), + (1140, 'lt_stage1', '72', 9, 2, 0, 0, 0, 0, 1, 1009, '', 0, NULL), + (1141, 'lt_stage2', '72', 10, 3, 0, 0, 0, 0, 1, 1010, '', 0, NULL), + (1142, 'lt_statue', '72', 11, 4, 0, 0, 0, 0, 1, 1011, '', 0, NULL), + (1143, 'lt_stone2', '72', 12, 3, 0, 0, 0, 0, 1, 1012, '', 0, NULL), + (1144, 'lt_lava', '72', 13, 3, 0, 0, 0, 0, 1, 1013, '', 0, NULL), + (1145, 'lt_bughill', '72', 14, 3, 0, 0, 0, 0, 1, 1014, '', 0, NULL), + (1146, 'lt_gate', '72', 15, 5, 0, 0, 0, 0, 1, 1015, '', 0, NULL), + (1147, 'lt_wall', '72', 16, 4, 0, 0, 0, 0, 1, 1016, '', 0, NULL), + (1148, 'lt_stone1', '72', 17, 2, 0, 0, 0, 0, 1, 1017, '', 0, NULL), + (1149, 'hween08_bath', '73', 1, 4, 0, 0, 0, 0, 1, 1018, '', 0, NULL), + (1150, 'hween08_wndwb', '73', 2, 2, 0, 0, 0, 0, 1, 1019, '', 0, NULL), + (1151, 'hween08_wndw', '73', 3, 4, 0, 0, 0, 0, 1, 1020, '', 0, NULL), + (1152, 'hween08_rad', '73', 4, 3, 0, 0, 0, 0, 1, 1021, '', 0, NULL), + (1153, 'hween08_bio', '73', 5, 3, 0, 0, 0, 0, 1, 1022, '', 0, NULL), + (1154, 'hween08_bath2', '73', 6, 4, 0, 0, 0, 0, 1, 1023, '', 0, NULL), + (1155, 'hween08_bbag', '73', 7, 3, 0, 0, 0, 0, 1, 1024, '', 0, NULL), + (1156, 'hween08_bed', '73', 8, 3, 0, 0, 0, 0, 1, 1025, '', 0, NULL), + (1157, 'hween08_bed2', '73', 9, 3, 0, 0, 0, 0, 1, 1026, '', 0, NULL), + (1158, 'hween08_curtain', '73', 10, 3, 0, 0, 0, 0, 1, 1027, '', 0, NULL), + (1159, 'hween08_curtain2', '73', 11, 3, 0, 0, 0, 0, 1, 1028, '', 0, NULL), + (1160, 'hween08_defibs', '73', 12, 3, 0, 0, 0, 0, 1, 1029, '', 0, NULL), + (1161, 'hween08_defibs2', '73', 13, 3, 0, 0, 0, 0, 1, 1030, '', 0, NULL), + (1162, 'hween08_manhole', '73', 14, 2, 0, 0, 0, 0, 1, 1031, '', 0, NULL), + (1163, 'hween08_sink', '73', 15, 3, 0, 0, 0, 0, 1, 1032, '', 0, NULL), + (1164, 'hween08_sink2', '73', 16, 3, 0, 0, 0, 0, 1, 1033, '', 0, NULL), + (1165, 'hween08_trll', '73', 17, 2, 0, 0, 0, 0, 1, 1034, '', 0, NULL), + (1166, 'hw08_xray', '73', 18, 3, 0, 0, 0, 0, 1, 1035, '', 0, NULL), + (1167, 'eco_chair1', '76', 1, 5, 0, 0, 0, 0, 1, 1036, '', 0, NULL), + (1168, 'eco_chair2', '76', 1, 3, 0, 0, 0, 0, 1, 1037, '', 0, NULL), + (1169, 'eco_chair3', '76', 1, 5, 0, 0, 0, 0, 1, 1038, '', 0, NULL), + (1170, 'eco_fruits1', '76', 1, 5, 0, 0, 0, 0, 1, 1042, '', 0, NULL), + (1171, 'eco_fruits2', '76', 1, 5, 0, 0, 0, 0, 1, 1043, '', 0, NULL), + (1172, 'eco_fruits3', '76', 1, 5, 0, 0, 0, 0, 1, 1044, '', 0, NULL), + (1173, 'eco_lamp3', '76', 1, 5, 0, 0, 0, 0, 1, 1047, '', 0, NULL), + (1174, 'eco_light1', '76', 1, 5, 0, 0, 0, 0, 1, 1048, '', 0, NULL), + (1175, 'eco_light2', '76', 1, 5, 0, 0, 0, 0, 1, 1049, '', 0, NULL), + (1176, 'eco_light3', '76', 1, 5, 0, 0, 0, 0, 1, 1050, '', 0, NULL), + (1177, 'eco_lamp2', '76', 1, 5, 0, 0, 0, 0, 1, 1046, '', 0, NULL), + (1178, 'eco_table1', '76', 1, 5, 0, 0, 0, 0, 1, 1051, '', 0, NULL), + (1179, 'eco_lamp1', '76', 1, 5, 0, 0, 0, 0, 1, 1045, '', 0, NULL), + (1180, 'eco_table2', '76', 1, 5, 0, 0, 0, 0, 1, 1052, '', 0, NULL), + (1181, 'eco_table3', '76', 1, 5, 0, 0, 0, 0, 1, 1053, '', 0, NULL), + (1182, 'eco_tree1', '76', 1, 5, 0, 0, 0, 0, 1, 1054, '', 0, NULL), + (1183, 'eco_tree2', '76', 1, 5, 0, 0, 0, 0, 1, 1055, '', 0, NULL), + (1184, 'eco_mush1', '76', 1, 5, 0, 0, 0, 0, 1, 1057, '', 0, NULL), + (1185, 'eco_mush2', '76', 1, 5, 0, 0, 0, 0, 1, 1058, '', 0, NULL), + (1186, 'eco_sofa1', '76', 1, 5, 0, 0, 0, 0, 1, 1059, '', 0, NULL), + (1187, 'eco_sofa2', '76', 1, 5, 0, 0, 0, 0, 1, 1060, '', 0, NULL), + (1188, 'eco_sofa3', '76', 1, 5, 0, 0, 0, 0, 1, 1061, '', 0, NULL), + (1189, 'eco_curtains1', '76', 1, 5, 0, 0, 0, 0, 1, 1062, '', 0, NULL), + (1190, 'eco_curtains2', '76', 1, 5, 0, 0, 0, 0, 1, 1063, '', 0, NULL), + (1191, 'eco_curtains3', '76', 1, 5, 0, 0, 0, 0, 1, 1064, '', 0, NULL), + (1192, 'eco_cactus1', '76', 1, 5, 0, 0, 0, 0, 1, 1066, '', 0, NULL), + (1193, 'eco_cactus2', '76', 1, 5, 0, 0, 0, 0, 1, 1067, '', 0, NULL), + (1194, 'eco_cactus3', '76', 1, 5, 0, 0, 0, 0, 1, 1068, '', 0, NULL), + (1195, 'ktchn_pots', '78', 1, 2, 0, 0, 0, 0, 1, 1069, '', 0, NULL), + (1196, 'ktchn_dvdr', '78', 2, 3, 0, 0, 0, 0, 1, 1070, '', 0, NULL), + (1197, 'ktchn_light', '78', 3, 2, 0, 0, 0, 0, 1, 1071, '', 0, NULL), + (1198, 'ktchn_countr_2', '78', 4, 2, 0, 0, 0, 0, 1, 1072, '', 0, NULL), + (1199, 'ktchn_cornr', '78', 5, 2, 0, 0, 0, 0, 1, 1073, '', 0, NULL), + (1200, 'ktchn_gate', '78', 6, 4, 0, 0, 0, 0, 1, 1074, '', 0, NULL), + (1201, 'ktchn_knives', '78', 7, 2, 0, 0, 0, 0, 1, 1075, '', 0, NULL), + (1202, 'ktchn_plates', '78', 8, 2, 0, 0, 0, 0, 1, 1076, '', 0, NULL), + (1203, 'ktchn_oven', '78', 9, 2, 0, 0, 0, 0, 1, 1077, '', 0, NULL), + (1204, 'ktchn_wall', '78', 10, 2, 0, 0, 0, 0, 1, 1078, '', 0, NULL), + (1205, 'ktchn_countr_1', '78', 11, 1, 0, 0, 0, 0, 1, 1079, '', 0, NULL), + (1206, 'ktchn_sink', '78', 12, 2, 0, 0, 0, 0, 1, 1080, '', 0, NULL), + (1207, 'ktchn_desk', '78', 13, 1, 0, 0, 0, 0, 1, 1081, '', 0, NULL), + (1208, 'ktchn_fridge', '78', 14, 5, 0, 0, 0, 0, 1, 1082, '', 0, NULL), + (1209, 'ktchn_inspctr', '78', 15, 15, 0, 0, 0, 0, 1, 1083, '', 0, NULL), + (1210, 'ktchn_hlthNut', '78', 16, 15, 0, 0, 0, 0, 1, 1084, '', 0, NULL), + (1211, 'ktchn_stove', '78', 17, 2, 0, 0, 0, 0, 1, 1085, '', 0, NULL), + (1212, 'ktchn_bBlock', '78', 18, 3, 0, 0, 0, 0, 1, 1086, '', 0, NULL), + (1213, 'ktchn_trash', '78', 19, 1, 0, 0, 0, 0, 1, 1087, '', 0, NULL), + (1214, 'xm09_man_a', '79', 1, 3, 0, 0, 0, 0, 1, 1088, '', 0, NULL), + (1215, 'xm09_man_b', '79', 2, 3, 0, 0, 0, 0, 1, 1089, '', 0, NULL), + (1216, 'xm09_man_c', '79', 3, 3, 0, 0, 0, 0, 1, 1090, '', 0, NULL), + (1217, 'xm09_table', '79', 4, 5, 0, 0, 0, 0, 1, 1091, '', 0, NULL), + (1218, 'xm09_bench', '79', 5, 5, 0, 0, 0, 0, 1, 1092, '', 0, NULL), + (1219, 'xm09_firwall', '79', 6, 3, 0, 0, 0, 0, 1, 1093, '', 0, NULL), + (1220, 'xm09_forestwall', '79', 7, 3, 0, 0, 0, 0, 1, 1094, '', 0, NULL), + (1221, 'xm09_lodgewall', '79', 8, 3, 0, 0, 0, 0, 1, 1095, '', 0, NULL), + (1222, 'xm09_bauble_1', '79', 9, 1, 0, 0, 0, 0, 1, 1096, '', 0, NULL), + (1223, 'xm09_bauble_2', '79', 10, 1, 0, 0, 0, 0, 1, 1097, '', 0, NULL), + (1224, 'xm09_bauble_3', '79', 11, 1, 0, 0, 0, 0, 1, 1098, '', 0, NULL), + (1225, 'xm09_bauble_4', '79', 12, 1, 0, 0, 0, 0, 1, 1099, '', 0, NULL), + (1226, 'xm09_bauble_5', '79', 13, 1, 0, 0, 0, 0, 1, 1100, '', 0, NULL), + (1227, 'xm09_bauble_6', '79', 14, 1, 0, 0, 0, 0, 1, 1101, '', 0, NULL), + (1228, 'xm09_bauble_7', '79', 15, 1, 0, 0, 0, 0, 1, 1102, '', 0, NULL), + (1229, 'xm09_bauble_8', '79', 16, 1, 0, 0, 0, 0, 1, 1103, '', 0, NULL), + (1230, 'xm09_bauble_9', '79', 17, 1, 0, 0, 0, 0, 1, 1104, '', 0, NULL), + (1231, 'xm09_bauble_10', '79', 18, 1, 0, 0, 0, 0, 1, 1105, '', 0, NULL), + (1232, 'xm09_bauble_11', '79', 19, 1, 0, 0, 0, 0, 1, 1106, '', 0, NULL), + (1233, 'xm09_bauble_12', '79', 20, 1, 0, 0, 0, 0, 1, 1107, '', 0, NULL), + (1234, 'xm09_bauble_13', '79', 21, 1, 0, 0, 0, 0, 1, 1108, '', 0, NULL), + (1235, 'xm09_bauble_14', '79', 22, 1, 0, 0, 0, 0, 1, 1109, '', 0, NULL), + (1236, 'xm09_bauble_15', '79', 23, 1, 0, 0, 0, 0, 1, 1110, '', 0, NULL), + (1237, 'xm09_bauble_16', '79', 24, 1, 0, 0, 0, 0, 1, 1111, '', 0, NULL), + (1238, 'xm09_bauble_17', '79', 25, 1, 0, 0, 0, 0, 1, 1112, '', 0, NULL), + (1239, 'xm09_bauble_18', '79', 26, 1, 0, 0, 0, 0, 1, 1113, '', 0, NULL), + (1240, 'xm09_bauble_19', '79', 27, 1, 0, 0, 0, 0, 1, 1114, '', 0, NULL), + (1241, 'xm09_bauble_20', '79', 28, 1, 0, 0, 0, 0, 1, 1115, '', 0, NULL), + (1242, 'xm09_bauble_21', '79', 29, 1, 0, 0, 0, 0, 1, 1116, '', 0, NULL), + (1243, 'xm09_bauble_22', '79', 30, 1, 0, 0, 0, 0, 1, 1117, '', 0, NULL), + (1244, 'xm09_bauble_23', '79', 31, 1, 0, 0, 0, 0, 1, 1118, '', 0, NULL), + (1245, 'xm09_bauble_24', '79', 32, 1, 0, 0, 0, 0, 1, 1119, '', 0, NULL), + (1246, 'xm09_bauble_25', '79', 33, 1, 0, 0, 0, 0, 1, 1120, '', 0, NULL), + (1247, 'xm09_bauble_26', '79', 34, 1, 0, 0, 0, 0, 1, 1121, '', 0, NULL), + (1248, 'xm09_bauble_27', '79', 35, 1, 0, 0, 0, 0, 1, 1122, '', 0, NULL), + (1249, 'xm09_candyCane', '79', 36, 2, 0, 0, 0, 0, 1, 1123, '', 0, NULL), + (1250, 'xm09_stocking', '79', 37, 1, 0, 0, 0, 0, 1, 1124, '', 0, NULL), + (1251, 'xm09_infotv', '79', 38, 5, 0, 0, 0, 0, 1, 1125, '', 0, NULL), + (1252, 'xm09_cocoa', '79', 39, 6, 0, 0, 0, 0, 1, 1126, '', 0, NULL), + (1253, 'xm09_lrgBauble', '79', 40, 5, 0, 0, 0, 0, 1, 1127, '', 0, NULL), + (1254, 'xm09_frplc', '79', 41, 4, 0, 0, 0, 0, 1, 1128, '', 0, NULL), + (1255, 'urban_sidewalk', '80', 1, 3, 0, 0, 0, 0, 1, 1129, '', 0, NULL), + (1256, 'urban_lamp', '80', 2, 3, 0, 0, 0, 0, 1, 1130, '', 0, NULL), + (1257, 'urban_bin', '80', 3, 3, 0, 0, 0, 0, 1, 1131, '', 0, NULL), + (1258, 'urban_bench', '80', 4, 3, 0, 0, 0, 0, 1, 1132, '', 0, NULL), + (1259, 'urban_carsofa', '80', 5, 3, 0, 0, 0, 0, 1, 1133, '', 0, NULL), + (1260, 'urban_bsktbll', '80', 6, 3, 0, 0, 0, 0, 1, 1134, '', 0, NULL), + (1261, 'urban_fence', '80', 7, 3, 0, 0, 0, 0, 1, 1135, '', 0, NULL), + (1262, 'urban_wpost', '80', 8, 3, 0, 0, 0, 0, 1, 1136, '', 0, NULL), + (1263, 'urban_fence_corner', '80', 9, 3, 0, 0, 0, 0, 1, 1137, '', 0, NULL), + (1264, 'urban_blocker', '80', 10, 3, 0, 0, 0, 0, 1, 1138, '', 0, NULL), + (1265, 'urban_bench_plain', '80', 11, 3, 0, 0, 0, 0, 1, 1139, '', 0, NULL), + (1266, 'urban_wall', '80', 12, 3, 0, 0, 0, 0, 1, 1140, '', 0, NULL), + (1267, 'grunge_barrel', '81', 1, 3, 0, 0, 0, 0, 1, 1141, '', 0, NULL), + (1268, 'grunge_bench', '81', 2, 3, 0, 0, 0, 0, 1, 1142, '', 0, NULL), + (1269, 'grunge_candle', '81', 3, 3, 0, 0, 0, 0, 1, 1143, '', 0, NULL), + (1270, 'grunge_chair', '81', 4, 3, 0, 0, 0, 0, 1, 1144, '', 0, NULL), + (1271, 'grunge_mattress', '81', 5, 3, 0, 0, 0, 0, 1, 1145, '', 0, NULL), + (1272, 'grunge_radiator', '81', 6, 3, 0, 0, 0, 0, 1, 1146, '', 0, NULL), + (1273, 'grunge_shelf', '81', 7, 3, 0, 0, 0, 0, 1, 1147, '', 0, NULL), + (1274, 'grunge_sign', '81', 8, 3, 0, 0, 0, 0, 1, 1148, '', 0, NULL), + (1275, 'grunge_table', '81', 9, 3, 0, 0, 0, 0, 1, 1149, '', 0, NULL), + (1276, 'hc_crpt', '27', 2, 5, 0, 0, 0, 0, 1, 1150, '', 0, NULL), + (1277, 'poster_12', '24', 21, 3, 0, 0, 0, 0, 1, 251, '12', 0, NULL), + (1278, 'poster_35', '24', 23, 3, 0, 0, 0, 0, 1, 251, '35', 0, NULL), + (1279, 'poster_36', '24', 24, 3, 0, 0, 0, 0, 1, 251, '36', 0, NULL), + (1280, 'poster_37', '24', 25, 3, 0, 0, 0, 0, 1, 251, '37', 0, NULL), + (1281, 'poster_2006', '24', 26, 3, 0, 0, 0, 0, 1, 251, '2006', 0, NULL), + (1282, 'poster_13', '24', 22, 3, 0, 0, 0, 0, 1, 251, '13', 0, NULL), + (1283, 'poster_39', '24', 27, 3, 0, 0, 0, 0, 1, 251, '39', 0, NULL), + (1284, 'poster_41', '24', 28, 3, 0, 0, 0, 0, 1, 251, '41', 0, NULL), + (1285, 'poster_34', '24', 29, 3, 0, 0, 0, 0, 1, 251, '34', 0, NULL), + (1286, 'poster_1005', '24', 30, 3, 0, 0, 0, 0, 1, 251, '1005', 0, NULL), + (1287, 'poster_2001', '24', 31, 3, 0, 0, 0, 0, 1, 251, '2001', 0, NULL), + (1288, 'poster_20', '24', 32, 3, 0, 0, 0, 0, 1, 251, '20', 0, NULL), + (1289, 'poster_24', '24', 33, 3, 0, 0, 0, 0, 1, 251, '24', 0, NULL), + (1290, 'poster_1003', '24', 34, 3, 0, 0, 0, 0, 1, 251, '1003', 0, NULL), + (1291, 'poster_31', '24', 35, 3, 0, 0, 0, 0, 1, 251, '31', 0, NULL), + (1292, 'poster_38', '24', 36, 3, 0, 0, 0, 0, 1, 251, '38', 0, NULL), + (1293, 'poster_40', '24', 37, 3, 0, 0, 0, 0, 1, 251, '40', 0, NULL), + (1294, 'poster_1001', '24', 38, 3, 0, 0, 0, 0, 1, 251, '1001', 0, NULL), + (1295, 'poster_1002', '24', 39, 3, 0, 0, 0, 0, 1, 251, '1002', 0, NULL), + (1296, 'poster_2000', '24', 40, 3, 0, 0, 0, 0, 1, 251, '2000', 0, NULL), + (1297, 'poster_2002', '24', 41, 3, 0, 0, 0, 0, 1, 251, '2002', 0, NULL), + (1298, 'poster_2003', '24', 42, 3, 0, 0, 0, 0, 1, 251, '2003', 0, NULL), + (1299, 'poster_2004', '24', 43, 3, 0, 0, 0, 0, 1, 251, '2004', 0, NULL), + (1300, 'poster_2007', '24', 44, 3, 0, 0, 0, 0, 1, 251, '2007', 0, NULL), + (1301, 'bolly_lotus_pool', '82', 1, 3, 0, 0, 0, 0, 1, 1151, '', 0, NULL), + (1302, 'bolly_corner', '82', 2, 3, 0, 0, 0, 0, 1, 1152, '', 0, NULL), + (1303, 'bolly_desk', '82', 3, 4, 0, 0, 0, 0, 1, 1153, '', 0, NULL), + (1304, 'bolly_drapea', '82', 4, 8, 0, 0, 0, 0, 1, 1154, '', 0, NULL), + (1305, 'bolly_drapeb', '82', 5, 8, 0, 0, 0, 0, 1, 1155, '', 0, NULL), + (1306, 'bolly_drapec', '82', 6, 8, 0, 0, 0, 0, 1, 1156, '', 0, NULL), + (1307, 'bolly_pillow', '82', 7, 4, 0, 0, 0, 0, 1, 1157, '', 0, NULL), + (1308, 'bolly_fountain', '82', 8, 10, 0, 0, 0, 0, 1, 1158, '', 0, NULL), + (1309, 'bolly_lamp', '82', 9, 7, 0, 0, 0, 0, 1, 1159, '', 0, NULL), + (1310, 'bolly_monkey_lamp', '82', 10, 7, 0, 0, 0, 0, 1, 1160, '', 0, NULL), + (1311, 'bolly_phant', '82', 11, 8, 0, 0, 0, 0, 1, 1161, '', 0, NULL), + (1312, 'bolly_petals', '82', 12, 5, 0, 0, 0, 0, 1, 1162, '', 0, NULL), + (1313, 'bolly_palm', '82', 13, 4, 0, 0, 0, 0, 1, 1163, '', 0, NULL), + (1314, 'bolly_swing', '82', 14, 10, 0, 0, 0, 0, 1, 1164, '', 0, NULL), + (1315, 'bolly_table', '82', 15, 6, 0, 0, 0, 0, 1, 1165, '', 0, NULL), + (1316, 'bolly_tile1', '82', 16, 4, 0, 0, 0, 0, 1, 1166, '', 0, NULL), + (1317, 'bolly_tile2', '82', 17, 4, 0, 0, 0, 0, 1, 1167, '', 0, NULL), + (1318, 'bolly_vase', '82', 18, 3, 0, 0, 0, 0, 1, 1168, '', 0, NULL), + (1319, 'bolly_wdw_wd', '82', 19, 5, 0, 0, 0, 0, 1, 1169, '', 0, NULL), + (1320, 'svnr_de', '83', 1, 200, 100, 0, 0, 0, 1, 1170, '', 0, NULL), + (1321, 'svnr_uk', '83', 2, 200, 100, 0, 0, 0, 1, 1171, '', 0, NULL), + (1322, 'svnr_it', '83', 3, 200, 100, 0, 0, 0, 1, 1172, '', 0, NULL), + (1323, 'svnr_nl', '83', 4, 200, 100, 0, 0, 0, 1, 1173, '', 0, NULL), + (1324, 'svnr_aus', '83', 5, 200, 100, 0, 0, 0, 1, 1174, '', 0, NULL), + (1325, 'svnr_fi', '83', 6, 200, 100, 0, 0, 0, 1, 1175, '', 0, NULL), + (1326, 'lostc_merdragon', '83', 1, 200, 100, 0, 0, 0, 1, 1176, '', 0, NULL), + (1327, 'lostc_octopus', '83', 2, 200, 100, 0, 0, 0, 1, 1177, '', 0, NULL), + (1328, 'totem_leg', '83', 3, 200, 100, 0, 0, 0, 1, 1178, '', 0, NULL), + (1329, 'totem_head', '83', 4, 200, 100, 0, 0, 0, 1, 1179, '', 0, NULL), + (1330, 'totem_planet', '83', 5, 200, 100, 0, 0, 0, 1, 1180, '', 0, NULL), + (1331, 'fortune', '19,100', 5, 10, 0, 0, 0, 0, 1, 1181, '', 0, NULL), + (1332, 'sound_machine', '84,85,86,87,88,89', 1, 8, 0, 0, 0, 0, 1, 232, '', 0, NULL), + (1333, 'sound_set_65', '96', 1, 3, 0, 0, 0, 0, 1, 1182, '', 0, NULL), + (1334, 'sound_set_66', '96', 1, 3, 0, 0, 0, 0, 1, 1183, '', 0, NULL), + (1335, 'sound_set_67', '96', 1, 3, 0, 0, 0, 0, 1, 1184, '', 0, NULL), + (1336, 'sound_set_68', '88', 9, 3, 0, 0, 0, 0, 1, 1185, '', 0, NULL), + (1337, 'sound_set_69', '88', 9, 3, 0, 0, 0, 0, 1, 1186, '', 0, NULL), + (1338, 'sound_set_70', '88', 9, 3, 0, 0, 0, 0, 1, 1187, '', 0, NULL), + (1339, 'bolly_tree', '82', 13, 4, 0, 0, 0, 0, 1, 1189, '', 0, NULL), + (1340, 'party_lights', '71', 26, 2, 0, 0, 0, 0, 1, 1188, '', 0, NULL), + (1341, 'sf_roof', '90', 1, 5, 0, 0, 0, 0, 1, 1191, '', 0, NULL), + (1342, 'SF_crate_2', '90', 2, 3, 0, 0, 0, 0, 1, 1192, '', 0, NULL), + (1343, 'SF_crate_1', '90', 3, 2, 0, 0, 0, 0, 1, 1193, '', 0, NULL), + (1344, 'sf_stick', '90', 4, 3, 0, 0, 0, 0, 1, 1194, '', 0, NULL), + (1345, 'SF_chair_blue', '90', 5, 3, 0, 0, 0, 0, 1, 1195, '', 0, NULL), + (1346, 'sf_roller', '90', 6, 7, 0, 0, 0, 0, 1, 1196, '', 0, NULL), + (1347, 'SF_alien', '83', 7, 200, 100, 0, 0, 0, 1, 1197, '', 0, NULL), + (1348, 'SF_floor_2', '90', 8, 3, 0, 0, 0, 0, 1, 1198, '', 0, NULL), + (1349, 'SF_panel3', '90', 9, 5, 0, 0, 0, 0, 1, 1199, '', 0, NULL), + (1350, 'sf_floor', '90', 10, 3, 0, 0, 0, 0, 1, 1200, '', 0, NULL), + (1351, 'sf_tele', '90,6', 11, 5, 0, 0, 0, 0, 1, 1201, '', 0, NULL), + (1352, 'SF_reactor', '90', 12, 5, 0, 0, 0, 0, 1, 1202, '', 0, NULL), + (1353, 'SF_chair_green', '90', 13, 3, 0, 0, 0, 0, 1, 1203, '', 0, NULL), + (1354, 'SF_panel1', '90', 14, 3, 0, 0, 0, 0, 1, 1204, '', 0, NULL), + (1355, 'SF_panel2', '90', 15, 3, 0, 0, 0, 0, 1, 1205, '', 0, NULL), + (1356, 'sf_pod', '83', 16, 200, 100, 0, 0, 0, 1, 1206, '', 0, NULL), + (1357, 'SF_table', '90', 17, 3, 0, 0, 0, 0, 1, 1207, '', 0, NULL), + (1358, 'sf_gate', '90', 18, 6, 0, 0, 0, 0, 1, 1208, '', 0, NULL), + (1359, 'SF_floor_1', '90', 19, 3, 0, 0, 0, 0, 1, 1209, '', 0, NULL), + (1360, 'SF_chair_red', '90', 20, 3, 0, 0, 0, 0, 1, 1210, '', 0, NULL), + (1361, 'SF_lamp', '90', 21, 3, 0, 0, 0, 0, 1, 1211, '', 0, NULL), + (1362, 'ads_idol_floor1', '91', 1, 4, 0, 0, 0, 0, 1, 1212, '', 0, NULL), + (1363, 'ads_idol_desk', '91', 2, 5, 0, 0, 0, 0, 1, 1213, '', 0, NULL), + (1364, 'ads_idol_ch', '91', 3, 3, 0, 0, 0, 0, 1, 1214, '', 0, NULL), + (1365, 'ads_idol_floor2', '91', 4, 4, 0, 0, 0, 0, 1, 1215, '', 0, NULL), + (1366, 'ads_idol_piano', '91', 5, 15, 0, 0, 0, 0, 1, 1216, '', 0, NULL), + (1367, 'ads_idol_wall', '91', 6, 5, 0, 0, 0, 0, 1, 1217, '', 0, NULL), + (1368, 'ads_idol_tv', '91', 7, 8, 0, 0, 0, 0, 1, 1218, '', 0, NULL), + (1369, 'ads_idol_mic', '91', 8, 4, 0, 0, 0, 0, 1, 1219, '', 0, NULL), + (1370, 'ads_idol_drape', '91', 9, 2, 0, 0, 0, 0, 1, 1220, '', 0, NULL), + (1371, 'ads_idol_audChr', '91', 10, 4, 0, 0, 0, 0, 1, 1221, '', 0, NULL), + (1372, 'ads_idol_pchair', '91', 11, 5, 0, 0, 0, 0, 1, 1222, '', 0, NULL), + (1373, 'ads_idol_trax', '91', 12, 15, 0, 0, 0, 0, 1, 1223, '', 0, NULL), + (1374, 'ads_idol_tele', '91,6', 13, 5, 0, 0, 0, 0, 1, 1224, '', 0, NULL), + (1375, 'ads_idol_jukebox*1', '91', 14, 10, 0, 0, 0, 0, 1, 1225, '', 0, NULL), + (1376, 'ads_idol_clRack', '91', 15, 2, 0, 0, 0, 0, 1, 1226, '', 0, NULL), + (1377, 'ads_idol_mirror', '91', 16, 5, 0, 0, 0, 0, 1, 1227, '', 0, NULL), + (1378, 'ads_idol_voting_ch', '91', 17, 2, 0, 0, 0, 0, 1, 1228, '', 0, NULL), + (1379, 'ads_idol_hotspot', '91', 18, 1, 0, 0, 0, 0, 1, 1229, '', 0, NULL), + (1380, 'ads_idol_cork', '91', 19, 4, 0, 0, 0, 0, 1, 1230, '', 0, NULL), + (1381, 'ads_idol_ichair', '91', 20, 2, 0, 0, 0, 0, 1, 1231, '', 0, NULL), + (1382, 'ads_idol_logo', '91', 21, 5, 0, 0, 0, 0, 1, 1232, '', 0, NULL), + (1383, 'ads_idol_newsDsk', '91', 22, 4, 0, 0, 0, 0, 1, 1233, '', 0, NULL), + (1384, 'ads_idol_tube', '91', 23, 2, 0, 0, 0, 0, 1, 1234, '', 0, NULL), + (1385, 'ads_idol_tblCloth', '91', 24, 7, 0, 0, 0, 0, 1, 1235, '', 0, NULL), + (1386, 'ads_idol_lamp', '91', 25, 6, 0, 0, 0, 0, 1, 1236, '', 0, NULL), + (1387, 'ads_idol_carpet', '91', 26, 15, 0, 0, 0, 0, 1, 1237, '', 0, NULL), + (1388, 'ads_idol_l_carpet', '91', 27, 15, 0, 0, 0, 0, 1, 1238, '', 0, NULL), + (1389, 'ads_idol_l_logo', '91', 28, 5, 0, 0, 0, 0, 1, 1239, '', 0, NULL), + (1390, 'ads_idol_l_tv', '91', 29, 8, 0, 0, 0, 0, 1, 1240, '', 0, NULL), + (1391, 'ads_idol_trophy', '128', 30, 15, 0, 0, 0, 0, 1, 1241, '', 0, NULL), + (1392, 'flag_algeria', '25', 23, 3, 0, 0, 0, 0, 1, 1242, '', 0, NULL), + (1393, 'flag_argentina', '25', 23, 3, 0, 0, 0, 0, 1, 1243, '', 0, NULL), + (1394, 'flag_belgium', '25', 23, 3, 0, 0, 0, 0, 1, 1244, '', 0, NULL), + (1395, 'flag_chile', '25', 23, 3, 0, 0, 0, 0, 1, 1245, '', 0, NULL), + (1396, 'flag_columbia', '25', 23, 3, 0, 0, 0, 0, 1, 1246, '', 0, NULL), + (1397, 'flag_dominicanrepublic', '25', 23, 3, 0, 0, 0, 0, 1, 1247, '', 0, NULL), + (1398, 'flag_ecuador', '25', 23, 3, 0, 0, 0, 0, 1, 1248, '', 0, NULL), + (1399, 'flag_greece', '25', 23, 3, 0, 0, 0, 0, 1, 1249, '', 0, NULL), + (1400, 'flag_malaysia', '25', 23, 3, 0, 0, 0, 0, 1, 1250, '', 0, NULL), + (1401, 'flag_mexico', '25', 23, 3, 0, 0, 0, 0, 1, 1251, '', 0, NULL), + (1402, 'flag_morocco', '25', 23, 3, 0, 0, 0, 0, 1, 1252, '', 0, NULL), + (1403, 'flag_newzealand', '25', 23, 3, 0, 0, 0, 0, 1, 1253, '', 0, NULL), + (1404, 'flag_norway', '25', 23, 3, 0, 0, 0, 0, 1, 1254, '', 0, NULL), + (1405, 'flag_panama', '25', 23, 3, 0, 0, 0, 0, 1, 1255, '', 0, NULL), + (1406, 'flag_peru', '25', 23, 3, 0, 0, 0, 0, 1, 1256, '', 0, NULL), + (1407, 'flag_philippines', '25', 23, 3, 0, 0, 0, 0, 1, 1257, '', 0, NULL), + (1408, 'flag_portugal', '25', 23, 3, 0, 0, 0, 0, 1, 1258, '', 0, NULL), + (1409, 'flag_singapore', '25', 23, 3, 0, 0, 0, 0, 1, 1259, '', 0, NULL), + (1410, 'flag_tunisia', '25', 23, 3, 0, 0, 0, 0, 1, 1260, '', 0, NULL), + (1411, 'flag_turkey', '25', 23, 3, 0, 0, 0, 0, 1, 1261, '', 0, NULL), + (1412, 'flag_venezl', '25', 23, 3, 0, 0, 0, 0, 1, 1262, '', 0, NULL), + (1413, 'marsrug', '132', 21, 15, 0, 0, 0, 0, 3, 1263, '', 0, NULL), + (1414, 'sf_wall2', '90', 21, 2, 0, 0, 0, 0, 1, 1264, '', 0, NULL), + (1415, 'sf_wall3', '90', 21, 1, 0, 0, 0, 0, 1, 1265, '', 0, NULL), + (1416, 'sf_window', '90', 21, 2, 0, 0, 0, 0, 1, 1266, '', 0, NULL), + (1417, 'fx_explosion', '92', 1, 0, 139, 0, 0, 0, 1, 1267, '', 0, NULL), + (1418, 'fx_bubble', '92', 1, 0, 139, 0, 0, 0, 1, 1268, '', 0, NULL), + (1419, 'fx_flare', '92', 1, 0, 139, 0, 0, 0, 1, 1269, '', 0, NULL), + (1420, 'planet_of_love', '94', 1, 1, 2000, 0, 0, 0, 1, 1270, '', 0, NULL), + (1421, 'saturn', '94', 1, 1, 2000, 0, 0, 0, 1, 1271, '', 0, NULL), + (1422, 'pix_asteroid', '94', 1, 1, 2000, 0, 0, 0, 1, 1272, '', 0, NULL), + (1423, 'one_way_door*1', '95', 1, 15, 30, 0, 0, 0, 1, 1273, '', 0, NULL), + (1424, 'one_way_door*2', '95', 1, 15, 30, 0, 0, 0, 1, 1274, '', 0, NULL), + (1425, 'one_way_door*3', '95', 1, 15, 30, 0, 0, 0, 1, 1275, '', 0, NULL), + (1426, 'one_way_door*4', '95', 1, 15, 30, 0, 0, 0, 1, 1276, '', 0, NULL), + (1427, 'one_way_door*5', '95', 1, 15, 30, 0, 0, 0, 1, 1277, '', 0, NULL), + (1428, 'one_way_door*6', '95', 1, 15, 30, 0, 0, 0, 1, 1278, '', 0, NULL), + (1429, 'one_way_door*7', '95', 1, 15, 30, 0, 0, 0, 1, 1279, '', 0, NULL), + (1430, 'one_way_door*8', '95', 1, 15, 30, 0, 0, 0, 1, 1280, '', 0, NULL), + (1431, 'one_way_door*9', '95', 1, 15, 30, 0, 0, 0, 1, 1281, '', 0, NULL), + (1432, 'tiki_tray0', '96', 1, 1, 0, 0, 0, 0, 1, 1282, '', 0, NULL), + (1433, 'tiki_tray1', '96', 2, 1, 0, 0, 0, 0, 1, 1283, '', 0, NULL), + (1434, 'tiki_tray2', '96', 3, 2, 0, 0, 0, 0, 1, 1284, '', 0, NULL), + (1435, 'tiki_tray3', '96', 4, 1, 0, 0, 0, 0, 1, 1285, '', 0, NULL), + (1436, 'tiki_tray4', '96', 5, 1, 0, 0, 0, 0, 1, 1286, '', 0, NULL), + (1437, 'tiki_wallplnt', '96', 6, 2, 0, 0, 0, 0, 1, 1287, '', 0, NULL), + (1438, 'tiki_bardesk', '96', 7, 2, 0, 0, 0, 0, 1, 1288, '', 0, NULL), + (1439, 'tiki_bench', '96', 8, 1, 0, 0, 0, 0, 1, 1289, '', 0, NULL), + (1440, 'tiki_bflies', '96', 9, 2, 0, 0, 0, 0, 1, 1290, '', 0, NULL), + (1441, 'tiki_junglerug', '96', 10, 4, 0, 0, 0, 0, 1, 1291, '', 0, NULL), + (1442, 'tiki_parasol', '96', 11, 3, 0, 0, 0, 0, 1, 1292, '', 0, NULL), + (1443, 'tiki_sand', '96', 12, 3, 0, 0, 0, 0, 1, 1293, '', 0, NULL), + (1444, 'tiki_statue', '96', 13, 4, 0, 0, 0, 0, 1, 1294, '', 0, NULL), + (1445, 'tiki_torch', '96', 14, 1, 0, 0, 0, 0, 1, 1295, '', 0, NULL), + (1446, 'tiki_toucan', '96', 15, 4, 0, 0, 0, 0, 1, 1296, '', 0, NULL), + (1447, 'tiki_waterfall', '96', 16, 3, 0, 0, 0, 0, 1, 1297, '', 0, NULL), + (1448, 'tiki_surfboard', '96', 17, 1, 0, 0, 0, 0, 1, 1298, '', 0, NULL), + (1449, 'tiki_corner', '96', 18, 1, 0, 0, 0, 0, 1, 1299, '', 0, NULL), + (1450, 'ads_twi_paint', '97', 1, 1, 0, 0, 0, 0, 1, 1300, '', 0, NULL), + (1451, 'ads_twi_dreamc', '97', 1, 5, 0, 0, 0, 0, 1, 1301, '', 0, NULL), + (1452, 'ads_twi_bwall1', '97', 1, 6, 0, 0, 0, 0, 1, 1302, '', 0, NULL), + (1453, 'ads_twi_crest', '97', 1, 6, 0, 0, 0, 0, 1, 1303, '', 0, NULL), + (1454, 'ads_twi_toolbx', '97', 1, 4, 0, 0, 0, 0, 1, 1304, '', 0, NULL), + (1455, 'ads_twi_table', '97', 1, 8, 0, 0, 0, 0, 1, 1305, '', 0, NULL), + (1456, 'ads_twi_tower', '97', 1, 8, 0, 0, 0, 0, 1, 1306, '', 0, NULL), + (1457, 'ads_twi_piano', '97', 1, 8, 0, 0, 0, 0, 1, 1307, '', 0, NULL), + (1458, 'ads_twi_chair', '97', 1, 8, 0, 0, 0, 0, 1, 1308, '', 0, NULL), + (1459, 'ads_twi_fountn', '97', 1, 10, 0, 0, 0, 0, 1, 1309, '', 0, NULL), + (1460, 'ads_twi_dvdr2', '97', 1, 5, 0, 0, 0, 0, 1, 1310, '', 0, NULL), + (1461, 'ads_twi_dvdr1', '97', 1, 4, 0, 0, 0, 0, 1, 1311, '', 0, NULL), + (1462, 'ads_twi_bwall2', '97', 1, 6, 0, 0, 0, 0, 1, 1312, '', 0, NULL), + (1463, 'ads_twi_roses', '97', 1, 5, 0, 0, 0, 0, 1, 1313, '', 0, NULL), + (1464, 'ads_twi_windw', '97', 1, 3, 0, 0, 0, 0, 1, 1314, '', 0, NULL), + (1465, 'ads_twi_trophy', '128', 19, 15, 0, 0, 0, 0, 1, 1315, '', 0, NULL), + (1466, 'ads_twi_mist', '97', 1, 6, 0, 0, 0, 0, 1, 1316, '', 0, NULL), + (1467, 'habbowood_chair', '121', 1, 5, 0, 0, 0, 0, 1, 1325, '', 0, NULL), + (1468, 'tile_brown', '98', 2, 2, 0, 0, 0, 0, 1, 1320, '', 0, NULL), + (1469, 'tile_marble', '98', 3, 2, 0, 0, 0, 0, 1, 1321, '', 0, NULL), + (1470, 'tile_stella', '98', 4, 2, 0, 0, 0, 0, 1, 1322, '', 0, NULL), + (1471, 'theatre_seat', '121', 5, 10, 0, 0, 0, 0, 1, 1317, '', 0, NULL), + (1472, 'spotlight', '98', 6, 15, 0, 0, 0, 0, 1, 1318, '', 0, NULL), + (1473, 'rope_divider', '98', 7, 5, 0, 0, 0, 0, 1, 1319, '', 0, NULL), + (1474, 'habw_mirror', '98', 8, 10, 0, 0, 0, 0, 1, 1323, '', 0, NULL), + (1475, 'carpet_valentine', '98', 9, 6, 0, 0, 0, 0, 1, 1324, '', 0, NULL), + (1476, 'gothic_chair*1', '10', 1, 10, 0, 0, 0, 0, 1, 1326, '', 0, NULL), + (1477, 'gothic_sofa*1', '10', 2, 7, 0, 0, 0, 0, 1, 1327, '', 0, NULL), + (1478, 'gothic_stool*1', '10', 3, 5, 0, 0, 0, 0, 1, 1328, '', 0, NULL), + (1479, 'gothic_chair*2', '10', 4, 10, 0, 0, 0, 0, 1, 1329, '', 0, NULL), + (1480, 'gothic_sofa*2', '10', 5, 7, 0, 0, 0, 0, 1, 1330, '', 0, NULL), + (1481, 'gothic_stool*2', '10', 6, 5, 0, 0, 0, 0, 1, 1331, '', 0, NULL), + (1482, 'gothic_chair*4', '10', 10, 10, 0, 0, 0, 0, 1, 1332, '', 0, NULL), + (1483, 'gothic_sofa*4', '10', 11, 7, 0, 0, 0, 0, 1, 1333, '', 0, NULL), + (1484, 'gothic_stool*4', '10', 12, 5, 0, 0, 0, 0, 1, 1334, '', 0, NULL), + (1485, 'gothic_chair*5', '10', 13, 10, 0, 0, 0, 0, 1, 1335, '', 0, NULL), + (1486, 'gothic_sofa*5', '10', 14, 7, 0, 0, 0, 0, 1, 1336, '', 0, NULL), + (1487, 'gothic_stool*5', '10', 15, 5, 0, 0, 0, 0, 1, 1337, '', 0, NULL), + (1488, 'gothic_chair*6', '10', 16, 10, 0, 0, 0, 0, 1, 1338, '', 0, NULL), + (1489, 'gothic_sofa*6', '10', 17, 7, 0, 0, 0, 0, 1, 1339, '', 0, NULL), + (1490, 'gothic_stool*6', '10', 18, 5, 0, 0, 0, 0, 1, 1340, '', 0, NULL), + (1491, 'bed_polyfon*2', '18', 2, 4, 0, 0, 0, 0, 1, 1342, '', 0, NULL), + (1492, 'bed_polyfon_one*2', '18', 2, 3, 0, 0, 0, 0, 1, 1343, '', 0, NULL), + (1493, 'sofachair_polyfon*2', '18', 2, 3, 0, 0, 0, 0, 1, 1341, '', 0, NULL), + (1494, 'bardesk_polyfon*2', '18', 2, 3, 0, 0, 0, 0, 1, 1344, '', 0, NULL), + (1495, 'bardeskcorner_polyfon*2', '18', 2, 3, 0, 0, 0, 0, 1, 1345, '', 0, NULL), + (1496, 'bed_polyfon*3', '18', 3, 4, 0, 0, 0, 0, 1, 1347, '', 0, NULL), + (1497, 'bed_polyfon_one*3', '18', 3, 3, 0, 0, 0, 0, 1, 1348, '', 0, NULL), + (1498, 'sofachair_polyfon*3', '18', 3, 3, 0, 0, 0, 0, 1, 1346, '', 0, NULL), + (1499, 'bardesk_polyfon*3', '18', 3, 3, 0, 0, 0, 0, 1, 1349, '', 0, NULL), + (1500, 'bardeskcorner_polyfon*3', '18', 3, 3, 0, 0, 0, 0, 1, 1350, '', 0, NULL), + (1501, 'bed_polyfon*4', '18', 4, 4, 0, 0, 0, 0, 1, 1352, '', 0, NULL), + (1502, 'bed_polyfon_one*4', '18', 4, 3, 0, 0, 0, 0, 1, 1353, '', 0, NULL), + (1503, 'sofachair_polyfon*4', '18', 4, 3, 0, 0, 0, 0, 1, 1351, '', 0, NULL), + (1504, 'bardesk_polyfon*4', '18', 4, 3, 0, 0, 0, 0, 1, 1354, '', 0, NULL), + (1505, 'bardeskcorner_polyfon*4', '18', 4, 3, 0, 0, 0, 0, 1, 1355, '', 0, NULL), + (1506, 'bed_polyfon*6', '18', 6, 4, 0, 0, 0, 0, 1, 1357, '', 0, NULL), + (1507, 'bed_polyfon_one*6', '18', 6, 3, 0, 0, 0, 0, 1, 1358, '', 0, NULL), + (1508, 'sofachair_polyfon*6', '18', 6, 3, 0, 0, 0, 0, 1, 1356, '', 0, NULL), + (1509, 'bardesk_polyfon*6', '18', 6, 3, 0, 0, 0, 0, 1, 1359, '', 0, NULL), + (1510, 'bardeskcorner_polyfon*6', '18', 6, 3, 0, 0, 0, 0, 1, 1360, '', 0, NULL), + (1511, 'bed_polyfon*7', '18', 7, 4, 0, 0, 0, 0, 1, 1362, '', 0, NULL), + (1512, 'bed_polyfon*7', '18', 7, 4, 0, 0, 0, 0, 1, 1362, '', 0, NULL), + (1513, 'sofachair_polyfon*7', '18', 7, 3, 0, 0, 0, 0, 1, 1361, '', 0, NULL), + (1514, 'bardesk_polyfon*7', '18', 7, 3, 0, 0, 0, 0, 1, 1364, '', 0, NULL), + (1515, 'bardeskcorner_polyfon*7', '18', 7, 3, 0, 0, 0, 0, 1, 1365, '', 0, NULL), + (1516, 'bed_polyfon*8', '18', 8, 4, 0, 0, 0, 0, 1, 1367, '', 0, NULL), + (1517, 'bed_polyfon_one*8', '18', 8, 3, 0, 0, 0, 0, 1, 1368, '', 0, NULL), + (1518, 'sofachair_polyfon*8', '18', 8, 3, 0, 0, 0, 0, 1, 1366, '', 0, NULL), + (1519, 'bardesk_polyfon*8', '18', 8, 3, 0, 0, 0, 0, 1, 1369, '', 0, NULL), + (1520, 'bardeskcorner_polyfon*8', '18', 8, 3, 0, 0, 0, 0, 1, 1370, '', 0, NULL), + (1521, 'bed_polyfon*9', '18', 9, 4, 0, 0, 0, 0, 1, 1372, '', 0, NULL), + (1522, 'bed_polyfon_one*9', '18', 9, 3, 0, 0, 0, 0, 1, 1373, '', 0, NULL), + (1523, 'sofachair_polyfon*9', '18', 9, 3, 0, 0, 0, 0, 1, 1371, '', 0, NULL), + (1524, 'bardesk_polyfon*9', '18', 9, 3, 0, 0, 0, 0, 1, 1374, '', 0, NULL), + (1525, 'bardeskcorner_polyfon*9', '18', 9, 3, 0, 0, 0, 0, 1, 1375, '', 0, NULL), + (1526, 'divider_poly3*2', '18', 200, 6, 0, 0, 0, 0, 1, 1376, '', 0, NULL), + (1527, 'divider_poly3*3', '18', 200, 6, 0, 0, 0, 0, 1, 1377, '', 0, NULL), + (1528, 'divider_poly3*4', '18', 200, 6, 0, 0, 0, 0, 1, 1378, '', 0, NULL), + (1529, 'divider_poly3*6', '18', 200, 6, 0, 0, 0, 0, 1, 1379, '', 0, NULL), + (1530, 'divider_poly3*7', '18', 200, 6, 0, 0, 0, 0, 1, 1380, '', 0, NULL), + (1531, 'divider_poly3*8', '18', 200, 6, 0, 0, 0, 0, 1, 1381, '', 0, NULL), + (1532, 'divider_poly3*9', '18', 200, 6, 0, 0, 0, 0, 1, 1382, '', 0, NULL), + (1533, 'a2 slp', '99,100', 1, 6, 0, 0, 0, 0, 1, 1384, '', 0, NULL), + (1534, 'heartsofa', '100', 1, 5, 0, 0, 0, 0, 1, 1385, '', 0, NULL), + (1535, 'heart', '99,100', 1, 6, 0, 0, 0, 0, 1, 1386, '', 0, NULL), + (1536, 'statue', '99,100', 1, 6, 0, 0, 0, 0, 1, 1387, '', 0, NULL), + (1537, 'valeduck', '99,100,136', 1, 6, 0, 0, 0, 0, 1, 1388, '', 0, NULL), + (1538, 'val_cauldron', '99', 1, 25, 0, 0, 0, 0, 1, 1389, '', 0, NULL), + (1539, 'val_choco', '99', 1, 3, 0, 0, 0, 0, 1, 1390, '', 0, NULL), + (1540, 'val_teddy*1', '100', 6, 7, 0, 0, 0, 0, 1, 1391, '', 0, NULL), + (1541, 'val_teddy*2', '100', 6, 7, 0, 0, 0, 0, 1, 1392, '', 0, NULL), + (1542, 'val_teddy*3', '100', 6, 7, 0, 0, 0, 0, 1, 1393, '', 0, NULL), + (1543, 'val_teddy*4', '100', 6, 7, 0, 0, 0, 0, 1, 1394, '', 0, NULL), + (1544, 'val_teddy*5', '100', 6, 7, 0, 0, 0, 0, 1, 1395, '', 0, NULL), + (1545, 'val_teddy*6', '100', 6, 7, 0, 0, 0, 0, 1, 1396, '', 0, NULL), + (1546, 'val_heart', '100', 7, 10, 0, 0, 0, 0, 1, 1397, '', 0, NULL), + (1547, 'plant_valentinerose*1', '100', 7, 8, 0, 0, 0, 0, 1, 1398, '', 0, NULL), + (1548, 'plant_valentinerose*2', '100', 7, 8, 0, 0, 0, 0, 1, 1399, '', 0, NULL), + (1549, 'plant_valentinerose*3', '100', 7, 8, 0, 0, 0, 0, 1, 1400, '', 0, NULL), + (1550, 'plant_valentinerose*4', '100', 7, 8, 0, 0, 0, 0, 1, 1401, '', 0, NULL), + (1551, 'plant_valentinerose*5', '100', 7, 8, 0, 0, 0, 0, 1, 1402, '', 0, NULL), + (1552, 'poster_59', '24', 45, 6, 0, 0, 0, 0, 1, 251, '59', 0, NULL), + (1553, 'poster_1006', '101', 0, 6, 0, 0, 0, 0, 1, 251, '1006', 0, NULL), + (1554, 'pumpkin', '101', 1, 6, 0, 0, 0, 0, 1, 1403, '', 0, NULL), + (1555, 'habboween_grass', '101', 2, 6, 0, 0, 0, 0, 1, 1404, '', 0, NULL), + (1556, 'deadduck', '101', 3, 6, 0, 0, 0, 0, 1, 1405, '', 0, NULL), + (1557, 'deadduck2', '101', 4, 6, 0, 0, 0, 0, 1, 1406, '', 0, NULL), + (1558, 'deadduck3', '101', 5, 6, 0, 0, 0, 0, 1, 1407, '', 0, NULL), + (1559, 'skullcandle', '101', 6, 6, 0, 0, 0, 0, 1, 1408, '', 0, NULL), + (1560, 'habboween_crypt', '101', 7, 6, 0, 0, 0, 0, 1, 1409, '', 0, NULL), + (1561, 'hal_cauldron', '101', 8, 6, 0, 0, 0, 0, 1, 1410, '', 0, NULL), + (1562, 'hal_grave', '101', 9, 6, 0, 0, 0, 0, 1, 1411, '', 0, NULL), + (1563, 'poster_45', '101', 11, 3, 0, 0, 0, 0, 1, 251, '45', 0, NULL), + (1564, 'poster_42', '101', 12, 3, 0, 0, 0, 0, 1, 251, '42', 0, NULL), + (1565, 'poster_43', '101', 13, 3, 0, 0, 0, 0, 1, 251, '43', 0, NULL), + (1566, 'poster_50', '101', 14, 3, 0, 0, 0, 0, 1, 251, '50', 0, NULL), + (1567, 'rela_candles1', '102', 1, 2, 0, 0, 0, 0, 1, 1412, '', 0, NULL), + (1568, 'rela_candles2', '102', 2, 2, 0, 0, 0, 0, 1, 1413, '', 0, NULL), + (1569, 'rela_candles3', '102', 3, 2, 0, 0, 0, 0, 1, 1414, '', 0, NULL), + (1570, 'rela_candle1', '102', 4, 2, 0, 0, 0, 0, 1, 1415, '', 0, NULL), + (1571, 'rela_candle2', '102', 5, 2, 0, 0, 0, 0, 1, 1416, '', 0, NULL), + (1572, 'rela_candle3', '102', 6, 2, 0, 0, 0, 0, 1, 1417, '', 0, NULL), + (1573, 'rela_hchair', '102', 7, 3, 0, 0, 0, 0, 1, 1418, '', 0, NULL), + (1574, 'rela_orchid', '102', 8, 2, 0, 0, 0, 0, 1, 1419, '', 0, NULL), + (1575, 'rela_plant', '102', 9, 1, 0, 0, 0, 0, 1, 1420, '', 0, NULL), + (1576, 'rela_stick', '102', 10, 1, 0, 0, 0, 0, 1, 1421, '', 0, NULL), + (1577, 'rela_stone', '102', 11, 1, 0, 0, 0, 0, 1, 1422, '', 0, NULL), + (1578, 'rela_rock', '102', 12, 1, 0, 0, 0, 0, 1, 1423, '', 0, NULL), + (1579, 'rela_wall', '102', 13, 1, 0, 0, 0, 0, 1, 1424, '', 0, NULL), + (1580, 'jp_lantern', '103', 1, 2, 0, 0, 0, 0, 1, 1425, '', 0, NULL), + (1581, 'jp_pillow', '103', 1, 3, 0, 0, 0, 0, 1, 1426, '', 0, NULL), + (1582, 'jp_irori', '103', 1, 5, 0, 0, 0, 0, 1, 1427, '', 0, NULL), + (1583, 'jp_ninjastars', '103', 1, 2, 0, 0, 0, 0, 1, 1428, '', 0, NULL), + (1584, 'jp_tatami', '103', 1, 1, 0, 0, 0, 0, 1, 1429, '', 0, NULL), + (1585, 'jp_tatami2', '103', 1, 2, 0, 0, 0, 0, 1, 1430, '', 0, NULL), + (1586, 'jp_drawer', '103', 1, 2, 0, 0, 0, 0, 1, 1431, '', 0, NULL), + (1587, 'jp_bamboo', '103', 1, 15, 0, 0, 0, 0, 1, 1432, '', 0, NULL), + (1588, 'jp_rare', '103', 1, 18, 0, 0, 0, 0, 1, 1433, '', 0, NULL), + (1589, 'jp_sheet1', '103', 1, 2, 0, 0, 0, 0, 1, 1434, '', 0, NULL), + (1590, 'jp_sheet2', '103', 1, 3, 0, 0, 0, 0, 1, 1435, '', 0, NULL), + (1591, 'jp_sheet3', '103', 1, 5, 0, 0, 0, 0, 1, 1436, '', 0, NULL), + (1592, 'jp_tray1', '103', 1, 2, 0, 0, 0, 0, 1, 1437, '', 0, NULL), + (1593, 'jp_tray2', '103', 1, 2, 0, 0, 0, 0, 1, 1438, '', 0, NULL), + (1594, 'jp_tray3', '103', 1, 1, 0, 0, 0, 0, 1, 1439, '', 0, NULL), + (1595, 'jp_tray4', '103', 1, 1, 0, 0, 0, 0, 1, 1440, '', 0, NULL), + (1596, 'jp_tray5', '103', 1, 1, 0, 0, 0, 0, 1, 1441, '', 0, NULL), + (1597, 'jp_tray6', '103', 1, 1, 0, 0, 0, 0, 1, 1442, '', 0, NULL), + (1598, 'jp_katana1', '103', 1, 8, 0, 0, 0, 0, 1, 1443, '', 0, NULL), + (1599, 'jp_katana2', '103', 1, 6, 0, 0, 0, 0, 1, 1444, '', 0, NULL), + (1600, 'jp_katana3', '103', 1, 8, 0, 0, 0, 0, 1, 1445, '', 0, NULL), + (1601, 'jp_table', '103', 1, 8, 0, 0, 0, 0, 1, 1446, '', 0, NULL), + (1602, 'jp_teamaker', '103', 1, 4, 0, 0, 0, 0, 1, 1447, '', 0, NULL), + (1603, 'hween09_organ', '83', 0, 200, 100, 0, 0, 0, 1, 1448, '', 0, NULL), + (1604, 'sf_mbar', '83', 0, 200, 100, 0, 0, 0, 1, 1449, '', 0, NULL), + (1605, 'rare_xmas_screen', '44', 0, 3, 0, 0, 0, 0, 1, 1458, '', 0, NULL), + (1606, 'valentinescreen', '44', 0, 3, 0, 0, 0, 0, 1, 1459, '', 0, NULL), + (1607, 'beanstalk', '44', 0, 3, 0, 0, 0, 0, 1, 1450, '', 0, NULL), + (1608, 'djesko_turntable', '121', 0, 3, 0, 0, 0, 0, 1, 1451, '', 0, NULL), + (1609, 'rare_globe', '44', 0, 3, 0, 0, 0, 0, 1, 1452, '', 0, NULL), + (1610, 'rare_hammock', '44', 0, 3, 0, 0, 0, 0, 1, 1453, '', 0, NULL), + (1611, 'rare_ironmaiden', '44', 0, 3, 0, 0, 0, 0, 1, 1454, '', 0, NULL), + (1612, 'rare_mmmth', '44', 0, 3, 0, 0, 0, 0, 1, 1455, '', 0, NULL), + (1613, 'rare_stand', '44', 0, 3, 0, 0, 0, 0, 1, 1456, '', 0, NULL), + (1614, 'rare_vdoll', '44', 0, 3, 0, 0, 0, 0, 1, 1457, '', 0, NULL), + (1615, 'hween09_wall1', '104', 0, 2, 0, 0, 0, 0, 1, 1474, '', 0, NULL), + (1616, 'hween09_win', '104', 0, 2, 0, 0, 0, 0, 1, 1475, '', 0, NULL), + (1617, 'hween09_chair', '104', 0, 2, 0, 0, 0, 0, 1, 1460, '', 0, NULL), + (1618, 'hween09_chandelier', '104', 0, 3, 0, 0, 0, 0, 1, 1461, '', 0, NULL), + (1619, 'hween09_crnr1', '104', 0, 2, 0, 0, 0, 0, 1, 1462, '', 0, NULL), + (1620, 'hween09_curt', '104', 0, 3, 0, 0, 0, 0, 1, 1463, '', 0, NULL), + (1621, 'hween09_floor', '104', 0, 3, 0, 0, 0, 0, 1, 1464, '', 0, NULL), + (1622, 'hween09_ghost', '104', 0, 2, 0, 0, 0, 0, 1, 1465, '', 0, NULL), + (1623, 'hween09_hatch', '104', 0, 2, 0, 0, 0, 0, 1, 1466, '', 0, NULL), + (1624, 'hween09_jar', '104', 0, 2, 0, 0, 0, 0, 1, 1467, '', 0, NULL), + (1625, 'hween09_mirror', '104', 0, 5, 0, 0, 0, 0, 1, 1468, '', 0, NULL), + (1626, 'hween09_paint', '104', 0, 13, 0, 0, 0, 0, 1, 1469, '', 0, NULL), + (1627, 'hween09_stonewall', '104', 0, 2, 0, 0, 0, 0, 1, 1470, '', 0, NULL), + (1628, 'hween09_table', '104', 0, 2, 0, 0, 0, 0, 1, 1471, '', 0, NULL), + (1629, 'hween09_treewall', '104', 0, 3, 0, 0, 0, 0, 1, 1472, '', 0, NULL), + (1630, 'hween09_tv', '104', 0, 2, 0, 0, 0, 0, 1, 1473, '', 0, NULL), + (1631, 'igor_seat', '105', 1, 6, 0, 0, 0, 0, 1, 1476, '', 0, NULL), + (1632, 'ads_igorbrain', '105', 2, 4, 0, 0, 0, 0, 1, 1477, '', 0, NULL), + (1633, 'ads_igorraygun', '105', 3, 6, 0, 0, 0, 0, 1, 1478, '', 0, NULL), + (1634, 'ads_igorswitch', '105', 4, 4, 0, 0, 0, 0, 1, 1479, '', 0, NULL), + (1635, 'ads_igor_flask', '105', 5, 5, 0, 0, 0, 0, 1, 1480, '', 0, NULL), + (1636, 'ads_igor_dsk', '105', 6, 5, 0, 0, 0, 0, 1, 1481, '', 0, NULL), + (1637, 'ads_igorevilb', '105', 7, 5, 0, 0, 0, 0, 1, 1482, '', 0, NULL), + (1638, 'ads_igor_wall', '105', 8, 5, 0, 0, 0, 0, 1, 1483, '', 0, NULL), + (1639, 'sw_table', '106', 1, 4, 0, 0, 0, 0, 1, 1484, '', 0, NULL), + (1640, 'sw_swords', '106', 2, 2, 0, 0, 0, 0, 1, 1485, '', 0, NULL), + (1641, 'sw_stone', '106', 3, 2, 0, 0, 0, 0, 1, 1486, '', 0, NULL), + (1642, 'sw_raven', '106', 4, 3, 0, 0, 0, 0, 1, 1487, '', 0, NULL), + (1643, 'sw_hole', '106', 5, 2, 0, 0, 0, 0, 1, 1488, '', 0, NULL), + (1644, 'sw_chest', '106', 6, 3, 0, 0, 0, 0, 1, 1489, '', 0, NULL), + (1645, 'silo_studydesk', '9', 21, 4, 0, 0, 0, 0, 1, 1490, '', 0, NULL), + (1646, 'summer_chair*1', '107', 1, 2, 0, 0, 0, 0, 1, 1491, '', 0, NULL), + (1647, 'summer_chair*2', '107', 1, 1, 0, 0, 0, 0, 1, 1492, '', 0, NULL), + (1648, 'summer_chair*3', '107', 1, 4, 0, 0, 0, 0, 1, 1493, '', 0, NULL), + (1649, 'summer_chair*4', '107', 1, 2, 0, 0, 0, 0, 1, 1494, '', 0, NULL), + (1650, 'summer_chair*5', '107', 1, 1, 0, 0, 0, 0, 1, 1495, '', 0, NULL), + (1651, 'summer_chair*6', '107', 1, 1, 0, 0, 0, 0, 1, 1496, '', 0, NULL), + (1652, 'summer_chair*7', '107', 1, 2, 0, 0, 0, 0, 1, 1497, '', 0, NULL), + (1653, 'summer_chair*8', '107', 1, 1, 0, 0, 0, 0, 1, 1498, '', 0, NULL), + (1654, 'summer_chair*9', '107', 1, 1, 0, 0, 0, 0, 1, 1499, '', 0, NULL), + (1655, 'summer_grill*1', '107', 1, 2, 0, 0, 0, 0, 1, 1500, '', 0, NULL), + (1656, 'summer_grill*2', '107', 1, 1, 0, 0, 0, 0, 1, 1501, '', 0, NULL), + (1657, 'summer_grill*3', '107', 1, 1, 0, 0, 0, 0, 1, 1502, '', 0, NULL), + (1658, 'summer_grill*4', '107', 1, 1, 0, 0, 0, 0, 1, 1503, '', 0, NULL), + (1659, 'summer_pool*1', '107', 1, 1, 0, 0, 0, 0, 1, 1504, '', 0, NULL), + (1660, 'summer_pool*2', '107', 1, 1, 0, 0, 0, 0, 1, 1505, '', 0, NULL), + (1661, 'summer_pool*3', '107', 1, 1, 0, 0, 0, 0, 1, 1506, '', 0, NULL), + (1662, 'summer_pool*4', '107', 1, 2, 0, 0, 0, 0, 1, 1507, '', 0, NULL), + (1663, 'sand_cstl_gate', '107', 1, 2, 0, 0, 0, 0, 1, 1508, '', 0, NULL), + (1664, 'sand_cstl_twr', '107', 2, 1, 0, 0, 0, 0, 1, 1509, '', 0, NULL), + (1665, 'sand_cstl_wall', '107', 3, 1, 0, 0, 0, 0, 1, 1510, '', 0, NULL), + (1666, 'bw_croc', '107', 1, 7, 0, 0, 0, 0, 1, 1511, '', 0, NULL), + (1667, 'summer_icebox', '107', 2, 3, 0, 0, 0, 0, 1, 1512, '', 0, NULL), + (1668, 'summer_raft1', '107', 3, 4, 0, 0, 0, 0, 1, 1513, '', 0, NULL), + (1669, 'summer_raft2', '107', 4, 4, 0, 0, 0, 0, 1, 1514, '', 0, NULL), + (1670, 'dimmer_buttn', '108', 1, 3, 0, 0, 0, 0, 1, 1515, '', 0, NULL), + (1671, 'dimmer_fuse2', '108', 2, 3, 0, 0, 0, 0, 1, 1516, '', 0, NULL), + (1672, 'dimmer_fuse6', '108', 3, 3, 0, 0, 0, 0, 1, 1517, '', 0, NULL), + (1673, 'dimmer_swtch', '108', 4, 3, 0, 0, 0, 0, 1, 1518, '', 0, NULL), + (1674, 'ads_1800tele', '109', 1, 3, 0, 0, 0, 0, 1, 1519, '', 0, NULL), + (1675, 'ads_campguitar', '109', 2, 3, 0, 0, 0, 0, 1, 1520, '', 0, NULL), + (1676, 'ads_chups', '109', 3, 3, 0, 0, 0, 0, 1, 1521, '', 0, NULL), + (1677, 'ads_cmusic', '109', 4, 3, 0, 0, 0, 0, 1, 1522, '', 0, NULL), + (1678, 'ads_dave_cns', '109', 5, 3, 0, 0, 0, 0, 1, 1523, '', 0, NULL), + (1679, 'ads_dave_wall', '109', 6, 3, 0, 0, 0, 0, 1, 1524, '', 0, NULL), + (1680, 'ads_droetker_paula', '109', 7, 3, 0, 0, 0, 0, 1, 1525, '', 0, NULL), + (1681, 'ads_goldtabl', '109', 8, 3, 0, 0, 0, 0, 1, 1526, '', 0, NULL), + (1682, 'ads_grefusa_cactus', '109', 9, 3, 0, 0, 0, 0, 1, 1527, '', 0, NULL), + (1683, 'ads_gsArcade_1', '109', 10, 3, 0, 0, 0, 0, 1, 1528, '', 0, NULL), + (1684, 'ads_gsArcade_2', '109', 11, 3, 0, 0, 0, 0, 1, 1529, '', 0, NULL), + (1685, 'ads_lin_wh_c', '109', 12, 3, 0, 0, 0, 0, 1, 1530, '', 0, NULL), + (1686, 'ads_mirror', '109', 13, 3, 0, 0, 0, 0, 1, 1531, '', 0, NULL), + (1687, 'ads_nokia_logo', '109', 14, 3, 0, 0, 0, 0, 1, 1532, '', 0, NULL), + (1688, 'ads_nokia_phone', '109', 15, 3, 0, 0, 0, 0, 1, 1533, '', 0, NULL), + (1689, 'ads_oc_soda', '109', 16, 3, 0, 0, 0, 0, 1, 1534, '', 0, NULL), + (1690, 'ads_oc_soda_cmp', '109', 17, 3, 0, 0, 0, 0, 1, 1535, '', 0, NULL), + (1691, 'ads_percyw', '109', 18, 3, 0, 0, 0, 0, 1, 1536, '', 0, NULL), + (1692, 'ads_puffet_tv', '109', 19, 3, 0, 0, 0, 0, 1, 1537, '', 0, NULL), + (1693, 'ads_reebok_block2', '109', 20, 3, 0, 0, 0, 0, 1, 1538, '', 0, NULL), + (1694, 'ads_reebok_block2cmp', '109', 21, 3, 0, 0, 0, 0, 1, 1539, '', 0, NULL), + (1695, 'ads_reebok_tv', '109', 22, 3, 0, 0, 0, 0, 1, 1540, '', 0, NULL), + (1696, 'ads_spang_sleep', '109', 23, 3, 0, 0, 0, 0, 1, 1541, '', 0, NULL), + (1697, 'ads_sunnyd', '109', 24, 3, 0, 0, 0, 0, 1, 1542, '', 0, NULL), + (1698, 'ads_veet', '109', 25, 3, 0, 0, 0, 0, 1, 1543, '', 0, NULL), + (1699, 'ads_wwe_poster', '109', 26, 3, 0, 0, 0, 0, 1, 1544, '', 0, NULL), + (1700, 'det_bhole', '142', 27, 3, 0, 0, 0, 0, 1, 1545, '', 0, NULL), + (1701, 'det_body', '142', 28, 3, 0, 0, 0, 0, 1, 1546, '', 0, NULL), + (1702, 'det_divider', '142', 29, 3, 0, 0, 0, 0, 1, 1547, '', 0, NULL), + (1703, 'easy_bowl2', '109', 30, 3, 0, 0, 0, 0, 1, 1548, '', 0, NULL), + (1704, 'easy_carpet', '109', 31, 3, 0, 0, 0, 0, 1, 1549, '', 0, NULL), + (1705, 'easy_poster', '109', 32, 3, 0, 0, 0, 0, 1, 1550, '', 0, NULL), + (1706, 'md_can', '109', 34, 3, 0, 0, 0, 0, 1, 1551, '', 0, NULL), + (1707, 'md_logo_wall', '109', 35, 3, 0, 0, 0, 0, 1, 1552, '', 0, NULL), + (1708, 'md_rug', '109', 36, 3, 0, 0, 0, 0, 1, 1553, '', 0, NULL), + (1709, 'netari_carpet', '109', 37, 3, 0, 0, 0, 0, 1, 1554, '', 0, NULL), + (1710, 'netari_poster', '109', 38, 3, 0, 0, 0, 0, 1, 1555, '', 0, NULL), + (1711, 'nouvelle_trax', '109', 39, 3, 0, 0, 0, 0, 1, 1556, '', 0, NULL), + (1712, 'safe_silo_pb', '109', 40, 3, 0, 0, 0, 0, 1, 1557, '', 0, NULL), + (1713, 'tampax_rug', '109', 41, 3, 0, 0, 0, 0, 1, 1558, '', 0, NULL), + (1714, 'tampax_wall', '109', 42, 3, 0, 0, 0, 0, 1, 1559, '', 0, NULL), + (1715, 'window_hole', '109', 43, 3, 0, 0, 0, 0, 1, 1560, '', 0, NULL), + (1716, 'ads_lin_wh_c2', '109', 12, 3, 0, 0, 0, 0, 1, 1561, '', 0, NULL), + (1717, 'footylamp_campaign_ing', '109', 1, 3, 0, 0, 0, 0, 1, 1562, '', 0, NULL), + (1718, 'byesw_loadscreen', '110', 1, 5, 0, 0, 0, 0, 1, 1563, '', 0, NULL), + (1719, 'byesw_hotel', '110', 1, 5, 0, 0, 0, 0, 1, 1564, '', 0, NULL), + (1720, 'byesw_hand', '110', 1, 5, 0, 0, 0, 0, 1, 1565, '', 0, NULL), + (1721, 'a0 deal101', '5', 4, 25, 0, 0, 0, 0, 5, 1566, '', 0, NULL), + (1722, 'a0 deal103', '5', 5, 15, 0, 0, 0, 0, 3, 1566, '', 0, NULL), + (1723, 'queue_tile1', '5', 6, 7, 0, 0, 0, 0, 1, 1566, '', 0, NULL), + (1724, 'a0 deal118', '5', 1, 25, 0, 0, 0, 0, 5, 1567, '', 0, NULL), + (1725, 'a0 deal119', '5', 2, 15, 0, 0, 0, 0, 3, 1567, '', 0, NULL), + (1726, 'queue_tile1*1', '5', 3, 7, 0, 0, 0, 0, 1, 1567, '', 0, NULL), + (1727, 'a0 deal203', '5', 7, 25, 0, 0, 0, 0, 5, 1568, '', 0, NULL), + (1728, 'a0 deal210', '5', 8, 15, 0, 0, 0, 0, 3, 1568, '', 0, NULL), + (1729, 'queue_tile1*3', '5', 9, 7, 0, 0, 0, 0, 1, 1568, '', 0, NULL), + (1730, 'a0 deal113', '111', 26, 7, 0, 0, 0, 0, 5, 1569, '', 0, NULL), + (1731, 'a0 deal112', '111', 27, 7, 0, 0, 0, 0, 3, 1569, '', 0, NULL), + (1732, 'queue_tile1*4', '111', 28, 7, 0, 0, 0, 0, 1, 1569, '', 0, NULL), + (1733, 'a0 deal117', '111', 28, 7, 0, 0, 0, 0, 5, 1570, '', 0, NULL), + (1734, 'a0 deal100', '111', 28, 7, 0, 0, 0, 0, 3, 1570, '', 0, NULL), + (1735, 'queue_tile1*5', '111', 28, 7, 0, 0, 0, 0, 1, 1570, '', 0, NULL), + (1736, 'guitar_v', '87', 10, 7, 0, 0, 0, 0, 1, 1571, '', 0, NULL), + (1737, 'guitar_skull', '87', 11, 7, 0, 0, 0, 0, 1, 1572, '', 0, NULL), + (1738, 'poster_56', '44', 12, 3, 0, 0, 0, 0, 1, 251, '56', 0, NULL), + (1739, 'diner_shaker', '112', 1, 6, 0, 0, 0, 0, 1, 1573, '', 0, NULL), + (1740, 'diner_rug', '112', 2, 3, 0, 0, 0, 0, 1, 1574, '', 0, NULL), + (1741, 'diner_tray_0', '112', 3, 1, 0, 0, 0, 0, 1, 1575, '', 0, NULL), + (1742, 'diner_tray_1', '112', 4, 2, 0, 0, 0, 0, 1, 1576, '', 0, NULL), + (1743, 'diner_tray_2', '112', 5, 2, 0, 0, 0, 0, 1, 1577, '', 0, NULL), + (1744, 'diner_tray_3', '112', 6, 2, 0, 0, 0, 0, 1, 1578, '', 0, NULL), + (1745, 'diner_tray_4', '112', 7, 2, 0, 0, 0, 0, 1, 1579, '', 0, NULL), + (1746, 'diner_tray_5', '112', 8, 2, 0, 0, 0, 0, 1, 1580, '', 0, NULL), + (1747, 'diner_tray_6', '112', 9, 2, 0, 0, 0, 0, 1, 1581, '', 0, NULL), + (1748, 'diner_tray_7', '112', 10, 2, 0, 0, 0, 0, 1, 1582, '', 0, NULL), + (1749, 'window_diner', '112', 11, 4, 0, 0, 0, 0, 1, 1583, '', 0, NULL), + (1750, 'window_diner2', '112', 12, 3, 0, 0, 0, 0, 1, 1584, '', 0, NULL), + (1751, 'diner_walltable', '112', 13, 3, 0, 0, 0, 0, 1, 1585, '', 0, NULL), + (1752, 'diner_bardesk_gate*1', '112', 14, 3, 0, 0, 0, 0, 1, 1586, '', 0, NULL), + (1753, 'diner_bardesk_gate*2', '112', 15, 3, 0, 0, 0, 0, 1, 1587, '', 0, NULL), + (1754, 'diner_bardesk_gate*3', '112', 16, 3, 0, 0, 0, 0, 1, 1588, '', 0, NULL), + (1755, 'diner_bardesk_gate*4', '112', 17, 3, 0, 0, 0, 0, 1, 1589, '', 0, NULL), + (1756, 'diner_bardesk_gate*5', '112', 18, 3, 0, 0, 0, 0, 1, 1590, '', 0, NULL), + (1757, 'diner_bardesk_gate*6', '112', 19, 3, 0, 0, 0, 0, 1, 1591, '', 0, NULL), + (1758, 'diner_bardesk_gate*7', '112', 20, 3, 0, 0, 0, 0, 1, 1592, '', 0, NULL), + (1759, 'diner_bardesk_gate*8', '112', 21, 3, 0, 0, 0, 0, 1, 1593, '', 0, NULL), + (1760, 'diner_bardesk_gate*9', '112', 22, 3, 0, 0, 0, 0, 1, 1594, '', 0, NULL), + (1761, 'diner_bardesk_gate*10', '112', 23, 3, 0, 0, 0, 0, 1, 1595, '', 0, NULL), + (1762, 'diner_bardesk*1', '112', 24, 3, 0, 0, 0, 0, 1, 1596, '', 0, NULL), + (1763, 'diner_bardesk*2', '112', 25, 3, 0, 0, 0, 0, 1, 1597, '', 0, NULL), + (1764, 'diner_bardesk*3', '112', 26, 3, 0, 0, 0, 0, 1, 1598, '', 0, NULL), + (1765, 'diner_bardesk*4', '112', 27, 3, 0, 0, 0, 0, 1, 1599, '', 0, NULL), + (1766, 'diner_bardesk*5', '112', 28, 3, 0, 0, 0, 0, 1, 1600, '', 0, NULL), + (1767, 'diner_bardesk*6', '112', 29, 3, 0, 0, 0, 0, 1, 1601, '', 0, NULL), + (1768, 'diner_bardesk*7', '112', 30, 3, 0, 0, 0, 0, 1, 1602, '', 0, NULL), + (1769, 'diner_bardesk*8', '112', 31, 3, 0, 0, 0, 0, 1, 1603, '', 0, NULL), + (1770, 'diner_bardesk*9', '112', 32, 3, 0, 0, 0, 0, 1, 1604, '', 0, NULL), + (1771, 'diner_bardesk*10', '112', 33, 3, 0, 0, 0, 0, 1, 1605, '', 0, NULL), + (1772, 'diner_bardesk_corner*1', '112', 34, 3, 0, 0, 0, 0, 1, 1606, '', 0, NULL), + (1773, 'diner_bardesk_corner*2', '112', 35, 3, 0, 0, 0, 0, 1, 1607, '', 0, NULL), + (1774, 'diner_bardesk_corner*3', '112', 36, 3, 0, 0, 0, 0, 1, 1608, '', 0, NULL), + (1775, 'diner_bardesk_corner*4', '112', 37, 3, 0, 0, 0, 0, 1, 1609, '', 0, NULL), + (1776, 'diner_bardesk_corner*5', '112', 38, 3, 0, 0, 0, 0, 1, 1610, '', 0, NULL), + (1777, 'diner_bardesk_corner*6', '112', 39, 3, 0, 0, 0, 0, 1, 1611, '', 0, NULL), + (1778, 'diner_bardesk_corner*7', '112', 40, 3, 0, 0, 0, 0, 1, 1612, '', 0, NULL), + (1779, 'diner_bardesk_corner*8', '112', 41, 3, 0, 0, 0, 0, 1, 1613, '', 0, NULL), + (1780, 'diner_bardesk_corner*9', '112', 42, 3, 0, 0, 0, 0, 1, 1614, '', 0, NULL), + (1781, 'diner_bardesk_corner*10', '112', 43, 3, 0, 0, 0, 0, 1, 1615, '', 0, NULL), + (1782, 'diner_cashreg*1', '112', 44, 5, 0, 0, 0, 0, 1, 1616, '', 0, NULL), + (1783, 'diner_cashreg*2', '112', 45, 5, 0, 0, 0, 0, 1, 1617, '', 0, NULL), + (1784, 'diner_cashreg*3', '112', 46, 5, 0, 0, 0, 0, 1, 1618, '', 0, NULL), + (1785, 'diner_cashreg*4', '112', 47, 5, 0, 0, 0, 0, 1, 1619, '', 0, NULL), + (1786, 'diner_cashreg*5', '112', 48, 5, 0, 0, 0, 0, 1, 1620, '', 0, NULL), + (1787, 'diner_cashreg*6', '112', 49, 5, 0, 0, 0, 0, 1, 1621, '', 0, NULL), + (1788, 'diner_cashreg*7', '112', 50, 5, 0, 0, 0, 0, 1, 1622, '', 0, NULL), + (1789, 'diner_cashreg*8', '112', 51, 5, 0, 0, 0, 0, 1, 1623, '', 0, NULL), + (1790, 'diner_cashreg*9', '112', 52, 5, 0, 0, 0, 0, 1, 1624, '', 0, NULL), + (1791, 'diner_cashreg*10', '112', 53, 5, 0, 0, 0, 0, 1, 1625, '', 0, NULL), + (1792, 'diner_chair*1', '112', 54, 3, 0, 0, 0, 0, 1, 1626, '', 0, NULL), + (1793, 'diner_chair*2', '112', 55, 3, 0, 0, 0, 0, 1, 1627, '', 0, NULL), + (1794, 'diner_chair*3', '112', 56, 3, 0, 0, 0, 0, 1, 1628, '', 0, NULL), + (1795, 'diner_chair*4', '112', 57, 3, 0, 0, 0, 0, 1, 1629, '', 0, NULL), + (1796, 'diner_chair*5', '112', 58, 3, 0, 0, 0, 0, 1, 1630, '', 0, NULL), + (1797, 'diner_chair*6', '112', 59, 3, 0, 0, 0, 0, 1, 1631, '', 0, NULL), + (1798, 'diner_chair*7', '112', 60, 3, 0, 0, 0, 0, 1, 1632, '', 0, NULL), + (1799, 'diner_chair*8', '112', 61, 3, 0, 0, 0, 0, 1, 1633, '', 0, NULL), + (1800, 'diner_chair*9', '112', 62, 3, 0, 0, 0, 0, 1, 1634, '', 0, NULL), + (1801, 'diner_chair*10', '112', 63, 3, 0, 0, 0, 0, 1, 1635, '', 0, NULL), + (1802, 'diner_gumvendor*1', '112', 64, 3, 0, 0, 0, 0, 1, 1636, '', 0, NULL), + (1803, 'diner_gumvendor*2', '112', 65, 3, 0, 0, 0, 0, 1, 1637, '', 0, NULL), + (1804, 'diner_gumvendor*3', '112', 66, 3, 0, 0, 0, 0, 1, 1638, '', 0, NULL), + (1805, 'diner_gumvendor*4', '112', 67, 3, 0, 0, 0, 0, 1, 1639, '', 0, NULL), + (1806, 'diner_gumvendor*5', '112', 68, 3, 0, 0, 0, 0, 1, 1640, '', 0, NULL), + (1807, 'diner_gumvendor*6', '112', 69, 3, 0, 0, 0, 0, 1, 1641, '', 0, NULL), + (1808, 'diner_gumvendor*7', '112', 70, 3, 0, 0, 0, 0, 1, 1642, '', 0, NULL), + (1809, 'diner_gumvendor*8', '112', 71, 3, 0, 0, 0, 0, 1, 1643, '', 0, NULL), + (1810, 'diner_gumvendor*9', '112', 72, 3, 0, 0, 0, 0, 1, 1644, '', 0, NULL), + (1811, 'diner_gumvendor*10', '112', 73, 3, 0, 0, 0, 0, 1, 1645, '', 0, NULL), + (1812, 'diner_sofa_1*1', '112', 74, 3, 0, 0, 0, 0, 1, 1646, '', 0, NULL), + (1813, 'diner_sofa_1*2', '112', 75, 3, 0, 0, 0, 0, 1, 1647, '', 0, NULL), + (1814, 'diner_sofa_1*3', '112', 76, 3, 0, 0, 0, 0, 1, 1648, '', 0, NULL), + (1815, 'diner_sofa_1*4', '112', 77, 3, 0, 0, 0, 0, 1, 1649, '', 0, NULL), + (1816, 'diner_sofa_1*5', '112', 78, 3, 0, 0, 0, 0, 1, 1650, '', 0, NULL), + (1817, 'diner_sofa_1*6', '112', 79, 3, 0, 0, 0, 0, 1, 1651, '', 0, NULL), + (1818, 'diner_sofa_1*7', '112', 80, 3, 0, 0, 0, 0, 1, 1652, '', 0, NULL), + (1819, 'diner_sofa_1*8', '112', 81, 3, 0, 0, 0, 0, 1, 1653, '', 0, NULL), + (1820, 'diner_sofa_1*9', '112', 82, 3, 0, 0, 0, 0, 1, 1654, '', 0, NULL), + (1821, 'diner_sofa_1*10', '112', 83, 3, 0, 0, 0, 0, 1, 1655, '', 0, NULL), + (1822, 'diner_sofa_2*1', '112', 84, 3, 0, 0, 0, 0, 1, 1656, '', 0, NULL), + (1823, 'diner_sofa_2*2', '112', 85, 3, 0, 0, 0, 0, 1, 1657, '', 0, NULL), + (1824, 'diner_sofa_2*3', '112', 86, 3, 0, 0, 0, 0, 1, 1658, '', 0, NULL), + (1825, 'diner_sofa_2*4', '112', 87, 3, 0, 0, 0, 0, 1, 1659, '', 0, NULL), + (1826, 'diner_sofa_2*5', '112', 88, 3, 0, 0, 0, 0, 1, 1660, '', 0, NULL), + (1827, 'diner_sofa_2*6', '112', 89, 3, 0, 0, 0, 0, 1, 1661, '', 0, NULL), + (1828, 'diner_sofa_2*7', '112', 90, 3, 0, 0, 0, 0, 1, 1662, '', 0, NULL), + (1829, 'diner_sofa_2*8', '112', 91, 3, 0, 0, 0, 0, 1, 1663, '', 0, NULL), + (1830, 'diner_sofa_2*9', '112', 92, 3, 0, 0, 0, 0, 1, 1664, '', 0, NULL), + (1831, 'diner_sofa_2*10', '112', 93, 3, 0, 0, 0, 0, 1, 1665, '', 0, NULL), + (1832, 'diner_table_1*1', '112', 94, 3, 0, 0, 0, 0, 1, 1666, '', 0, NULL), + (1833, 'diner_table_1*2', '112', 95, 3, 0, 0, 0, 0, 1, 1667, '', 0, NULL), + (1834, 'diner_table_1*3', '112', 96, 3, 0, 0, 0, 0, 1, 1668, '', 0, NULL), + (1835, 'diner_table_1*4', '112', 97, 3, 0, 0, 0, 0, 1, 1669, '', 0, NULL), + (1836, 'diner_table_1*5', '112', 98, 3, 0, 0, 0, 0, 1, 1670, '', 0, NULL), + (1837, 'diner_table_1*6', '112', 99, 3, 0, 0, 0, 0, 1, 1671, '', 0, NULL), + (1838, 'diner_table_1*7', '112', 100, 3, 0, 0, 0, 0, 1, 1672, '', 0, NULL), + (1839, 'diner_table_1*8', '112', 101, 3, 0, 0, 0, 0, 1, 1673, '', 0, NULL), + (1840, 'diner_table_1*9', '112', 102, 3, 0, 0, 0, 0, 1, 1674, '', 0, NULL), + (1841, 'diner_table_1*10', '112', 103, 3, 0, 0, 0, 0, 1, 1675, '', 0, NULL), + (1842, 'diner_table_2*1', '112', 104, 4, 0, 0, 0, 0, 1, 1676, '', 0, NULL), + (1843, 'diner_table_2*2', '112', 105, 4, 0, 0, 0, 0, 1, 1677, '', 0, NULL), + (1844, 'diner_table_2*3', '112', 106, 4, 0, 0, 0, 0, 1, 1678, '', 0, NULL), + (1845, 'diner_table_2*4', '112', 107, 4, 0, 0, 0, 0, 1, 1679, '', 0, NULL), + (1846, 'diner_table_2*5', '112', 108, 4, 0, 0, 0, 0, 1, 1680, '', 0, NULL), + (1847, 'diner_table_2*6', '112', 109, 4, 0, 0, 0, 0, 1, 1681, '', 0, NULL), + (1848, 'diner_table_2*7', '112', 110, 4, 0, 0, 0, 0, 1, 1682, '', 0, NULL), + (1849, 'diner_table_2*8', '112', 111, 4, 0, 0, 0, 0, 1, 1683, '', 0, NULL), + (1850, 'diner_table_2*9', '112', 112, 4, 0, 0, 0, 0, 1, 1684, '', 0, NULL), + (1851, 'diner_table_2*10', '112', 113, 4, 0, 0, 0, 0, 1, 1685, '', 0, NULL), + (1852, 'diner_poster', '44', 114, 25, 0, 0, 0, 0, 1, 1686, '', 0, NULL), + (1853, 'sleepingbag*1', '113', 1, 5, 0, 0, 0, 0, 1, 1687, '', 0, NULL), + (1854, 'sleepingbag*2', '113', 1, 5, 0, 0, 0, 0, 1, 1688, '', 0, NULL), + (1855, 'sleepingbag*3', '113', 1, 5, 0, 0, 0, 0, 1, 1689, '', 0, NULL), + (1856, 'sleepingbag*4', '113', 1, 5, 0, 0, 0, 0, 1, 1690, '', 0, NULL), + (1857, 'sleepingbag*5', '113', 1, 5, 0, 0, 0, 0, 1, 1691, '', 0, NULL), + (1858, 'sleepingbag*6', '113', 1, 5, 0, 0, 0, 0, 1, 1692, '', 0, NULL), + (1859, 'sleepingbag*7', '113', 1, 5, 0, 0, 0, 0, 1, 1693, '', 0, NULL), + (1860, 'sleepingbag*8', '113', 1, 5, 0, 0, 0, 0, 1, 1694, '', 0, NULL), + (1861, 'sleepingbag*9', '113', 1, 5, 0, 0, 0, 0, 1, 1695, '', 0, NULL), + (1862, 'pillar*1', '114', 1, 5, 0, 0, 0, 0, 1, 1696, '', 0, NULL), + (1863, 'pillar*2', '114', 1, 5, 0, 0, 0, 0, 1, 1697, '', 0, NULL), + (1864, 'pillar*3', '114', 1, 5, 0, 0, 0, 0, 1, 1698, '', 0, NULL), + (1865, 'pillar*4', '114', 1, 5, 0, 0, 0, 0, 1, 1699, '', 0, NULL), + (1866, 'pillar*5', '114', 1, 5, 0, 0, 0, 0, 1, 1700, '', 0, NULL), + (1867, 'pillar*6', '114', 1, 5, 0, 0, 0, 0, 1, 1701, '', 0, NULL), + (1868, 'pillar*7', '114', 1, 5, 0, 0, 0, 0, 1, 1702, '', 0, NULL), + (1869, 'pillar*8', '114', 1, 5, 0, 0, 0, 0, 1, 1703, '', 0, NULL), + (1870, 'pillar*9', '114', 1, 5, 0, 0, 0, 0, 1, 1704, '', 0, NULL), + (1871, 'penguin_ballet', '116', 1, 1, 0, 0, 0, 0, 1, 1705, '', 0, NULL), + (1872, 'penguin_basic', '116', 2, 1, 0, 0, 0, 0, 1, 1706, '', 0, NULL), + (1873, 'penguin_boxer', '116', 3, 1, 0, 0, 0, 0, 1, 1707, '', 0, NULL), + (1874, 'penguin_bunny', '116', 4, 1, 0, 0, 0, 0, 1, 1708, '', 0, NULL), + (1875, 'penguin_clown', '116', 5, 1, 0, 0, 0, 0, 1, 1709, '', 0, NULL), + (1876, 'penguin_elf', '116', 6, 1, 0, 0, 0, 0, 1, 1710, '', 0, NULL), + (1877, 'penguin_glow', '116', 7, 1, 0, 0, 0, 0, 1, 1711, '', 0, NULL), + (1878, 'penguin_hunchback', '116', 8, 1, 0, 0, 0, 0, 1, 1712, '', 0, NULL), + (1879, 'penguin_icehockey', '116', 8, 1, 0, 0, 0, 0, 1, 1713, '', 0, NULL), + (1880, 'penguin_infected', '116', 9, 1, 0, 0, 0, 0, 1, 1714, '', 0, NULL), + (1881, 'penguin_magician', '116', 10, 1, 0, 0, 0, 0, 1, 1715, '', 0, NULL), + (1882, 'penguin_musketeer', '116', 11, 1, 0, 0, 0, 0, 1, 1716, '', 0, NULL), + (1883, 'penguin_ninja', '116', 11, 1, 0, 0, 0, 0, 1, 1717, '', 0, NULL), + (1884, 'penguin_pilot', '116', 12, 1, 0, 0, 0, 0, 1, 1718, '', 0, NULL), + (1885, 'penguin_pirate', '116', 13, 1, 0, 0, 0, 0, 1, 1719, '', 0, NULL), + (1886, 'penguin_punk', '116', 14, 1, 0, 0, 0, 0, 1, 1720, '', 0, NULL), + (1887, 'penguin_robot', '116', 15, 1, 0, 0, 0, 0, 1, 1721, '', 0, NULL), + (1888, 'penguin_rock', '116', 16, 1, 0, 0, 0, 0, 1, 1722, '', 0, NULL), + (1889, 'penguin_skater', '116', 17, 1, 0, 0, 0, 0, 1, 1723, '', 0, NULL), + (1890, 'penguin_ski', '116', 18, 1, 0, 0, 0, 0, 1, 1724, '', 0, NULL), + (1891, 'penguin_suit', '116', 18, 1, 0, 0, 0, 0, 1, 1725, '', 0, NULL), + (1892, 'penguin_sumo', '116', 18, 1, 0, 0, 0, 0, 1, 1726, '', 0, NULL), + (1893, 'penguin_super', '116', 18, 1, 0, 0, 0, 0, 1, 1727, '', 0, NULL), + (1894, 'penguin_swim', '116', 18, 1, 0, 0, 0, 0, 1, 1728, '', 0, NULL), + (1895, 'penguin_wrestler', '116', 18, 1, 0, 0, 0, 0, 1, 1729, '', 0, NULL), + (1896, 'penguin_cowboy', '116', 18, 1, 0, 0, 0, 0, 1, 1730, '', 0, NULL), + (1897, 'sandrug', '132', 2, 1, 0, 0, 0, 0, 3, 1731, '', 0, NULL), + (1898, 'rare_moonrug', '132', 2, 1, 0, 0, 0, 0, 3, 1732, '', 0, NULL), + (1899, 'tree3', '117', 1, 6, 0, 0, 0, 0, 1, 1735, '', 0, NULL), + (1900, 'tree4', '117', 2, 6, 0, 0, 0, 0, 1, 1736, '', 0, NULL), + (1901, 'tree5', '117', 3, 6, 0, 0, 0, 0, 1, 1737, '', 0, NULL), + (1902, 'tree6', '117,119', 4, 6, 0, 0, 0, 0, 1, 1738, '', 0, NULL), + (1903, 'tree1', '117', 5, 6, 0, 0, 0, 0, 1, 1733, '', 0, NULL), + (1904, 'tree2', '117', 6, 6, 0, 0, 0, 0, 1, 1734, '', 0, NULL), + (1905, 'triplecandle', '117', 7, 3, 0, 0, 0, 0, 1, 1739, '', 0, NULL), + (1906, 'turkey', '117', 8, 3, 0, 0, 0, 0, 1, 1740, '', 0, NULL), + (1907, 'house', '117', 9, 3, 0, 0, 0, 0, 1, 1741, '', 0, NULL), + (1908, 'house2', '117', 10, 3, 0, 0, 0, 0, 1, 1742, '', 0, NULL), + (1909, 'pudding', '117', 11, 3, 0, 0, 0, 0, 1, 1743, '', 0, NULL), + (1910, 'xmasduck', '117', 12, 1, 0, 0, 0, 0, 1, 1744, '', 0, NULL), + (1911, 'hyacinth1', '117', 13, 3, 0, 0, 0, 0, 1, 1745, '', 0, NULL), + (1912, 'hyacinth2', '117', 14, 3, 0, 0, 0, 0, 1, 1746, '', 0, NULL), + (1913, 'joulutahti', '117', 15, 3, 0, 0, 0, 0, 1, 1747, '', 0, NULL), + (1914, 'rcandle', '117', 16, 1, 0, 0, 0, 0, 1, 1748, '', 0, NULL), + (1915, 'wcandle', '117', 17, 1, 0, 0, 0, 0, 1, 1749, '', 0, NULL), + (1916, 'poster_27', '117', 18, 1, 0, 0, 0, 0, 1, 251, '27', 0, NULL), + (1917, 'poster_30', '117', 19, 1, 0, 0, 0, 0, 1, 251, '30', 0, NULL), + (1918, 'poster_48', '117', 20, 2, 0, 0, 0, 0, 1, 251, '48', 0, NULL), + (1919, 'poster_49', '117', 21, 2, 0, 0, 0, 0, 1, 251, '49', 0, NULL), + (1920, 'poster_46', '117', 22, 1, 0, 0, 0, 0, 1, 251, '46', 0, NULL), + (1921, 'poster_47', '117', 23, 1, 0, 0, 0, 0, 1, 251, '47', 0, NULL), + (1922, 'poster_28', '117', 24, 1, 0, 0, 0, 0, 1, 251, '28', 0, NULL), + (1923, 'poster_29', '117', 25, 1, 0, 0, 0, 0, 1, 251, '29', 0, NULL), + (1924, 'poster_23', '117', 26, 2, 0, 0, 0, 0, 1, 251, '23', 0, NULL), + (1925, 'poster_25', '117', 27, 3, 0, 0, 0, 0, 1, 251, '25', 0, NULL), + (1926, 'poster_24', '117', 28, 3, 0, 0, 0, 0, 1, 251, '24', 0, NULL), + (1927, 'poster_26', '117', 29, 3, 0, 0, 0, 0, 1, 251, '26', 0, NULL), + (1928, 'poster_22', '117', 30, 3, 0, 0, 0, 0, 1, 251, '22', 0, NULL), + (1929, 'poster_20', '117', 31, 3, 0, 0, 0, 0, 1, 251, '20', 0, NULL), + (1930, 'poster_21', '117', 32, 3, 0, 0, 0, 0, 1, 251, '21', 0, NULL), + (1931, 'sofachair', '18', 201, 3, 0, 0, 0, 0, 1, 1750, '', 0, NULL), + (1932, 'sofachair*2', '18', 202, 3, 0, 0, 0, 0, 1, 1751, '', 0, NULL), + (1933, 'sofachair*3', '18', 203, 3, 0, 0, 0, 0, 1, 1752, '', 0, NULL), + (1934, 'sofachair*4', '18', 204, 3, 0, 0, 0, 0, 1, 1753, '', 0, NULL), + (1935, 'sofachair*6', '18', 205, 3, 0, 0, 0, 0, 1, 1754, '', 0, NULL), + (1936, 'sofachair*7', '18', 206, 3, 0, 0, 0, 0, 1, 1755, '', 0, NULL), + (1937, 'sofachair*8', '18', 207, 3, 0, 0, 0, 0, 1, 1756, '', 0, NULL), + (1938, 'sofachair*9', '18', 208, 3, 0, 0, 0, 0, 1, 1757, '', 0, NULL), + (1939, 'tree7', '119', 11, 6, 0, 0, 0, 0, 1, 1759, '', 0, NULL), + (1940, 'christmas_poop', '119', 11, 1, 0, 0, 0, 0, 1, 1760, '', 0, NULL), + (1941, 'xmas_icelamp', '119', 11, 5, 0, 0, 0, 0, 1, 1761, '', 0, NULL), + (1942, 'plant_mazegate_snow', '119', 11, 3, 0, 0, 0, 0, 1, 1762, '', 0, NULL), + (1943, 'plant_maze_snow', '119', 11, 3, 0, 0, 0, 0, 1, 1763, '', 0, NULL), + (1944, 'xmas_cstl_gate', '119', 11, 6, 0, 0, 0, 0, 1, 1764, '', 0, NULL), + (1945, 'xmas_cstl_twr', '119', 11, 5, 0, 0, 0, 0, 1, 1765, '', 0, NULL), + (1946, 'xmas_cstl_wall', '119', 11, 5, 0, 0, 0, 0, 1, 1766, '', 0, NULL), + (1947, 'christmas_sleigh', '119', 11, 5, 0, 0, 0, 0, 1, 1767, '', 0, NULL), + (1948, 'christmas_reindeer', '44', 11, 3, 0, 0, 0, 0, 1, 1768, '', 0, NULL), + (1949, 'rclr_chair', '120', 1, 3, 0, 0, 0, 0, 1, 1769, '', 0, NULL), + (1950, 'rclr_garden', '120', 2, 3, 0, 0, 0, 0, 1, 1770, '', 0, NULL), + (1951, 'rclr_sofa', '120', 2, 3, 0, 0, 0, 0, 1, 1771, '', 0, NULL), + (1952, 'rclr_lamp', '120', 2, 3, 0, 0, 0, 0, 1, 1772, '', 0, NULL), + (1953, 'flag_denmark', '25', 23, 3, 0, 0, 0, 0, 1, 1773, '', 0, NULL), + (1954, 'transparent_floor', '91', 2, 3, 0, 0, 0, 0, 1, 1774, '', 0, NULL), + (1955, 'ads_clcake', '123', 2, 2, 0, 0, 0, 0, 1, 1775, '', 0, NULL), + (1956, 'ads_clcake2', '123', 2, 2, 0, 0, 0, 0, 1, 1776, '', 0, NULL), + (1957, 'ads_cldesk', '123', 2, 2, 0, 0, 0, 0, 1, 1777, '', 0, NULL), + (1958, 'ads_clfloor', '123', 2, 2, 0, 0, 0, 0, 1, 1778, '', 0, NULL), + (1959, 'ads_cllava', '123', 2, 2, 0, 0, 0, 0, 1, 1779, '', 0, NULL), + (1960, 'ads_cllava2', '123', 2, 2, 0, 0, 0, 0, 1, 1780, '', 0, NULL), + (1961, 'ads_cltele', '123', 2, 2, 0, 0, 0, 0, 1, 1781, '', 0, NULL), + (1962, 'ads_cltele_cmp', '123', 2, 2, 0, 0, 0, 0, 1, 1782, '', 0, NULL), + (1963, 'ads_clwall1', '123', 2, 2, 0, 0, 0, 0, 1, 1783, '', 0, NULL), + (1964, 'ads_clwall2', '123', 2, 2, 0, 0, 0, 0, 1, 1784, '', 0, NULL), + (1965, 'ads_clwall3', '123', 2, 2, 0, 0, 0, 0, 1, 1785, '', 0, NULL), + (1966, 'ads_cl_jukeb', '123', 2, 2, 0, 0, 0, 0, 1, 1786, '', 0, NULL), + (1967, 'ads_cl_jukeb_camp', '123', 2, 2, 0, 0, 0, 0, 1, 1787, '', 0, NULL), + (1968, 'ads_cl_sofa', '123', 2, 2, 0, 0, 0, 0, 1, 1788, '', 0, NULL), + (1969, 'ads_cl_sofa_cmp', '123', 2, 2, 0, 0, 0, 0, 1, 1789, '', 0, NULL), + (1970, 'sound_set_71', '88', 2, 3, 0, 0, 0, 0, 1, 1790, '', 0, NULL), + (1971, 'ads_calip_chair', '125', 2, 2, 0, 0, 0, 0, 1, 1791, '', 0, NULL), + (1972, 'ads_calip_chaircmp', '125', 2, 2, 0, 0, 0, 0, 1, 1792, '', 0, NULL), + (1973, 'ads_calip_fan', '125', 2, 2, 0, 0, 0, 0, 1, 1793, '', 0, NULL), + (1974, 'ads_calip_fan_cmp', '125', 2, 2, 0, 0, 0, 0, 1, 1794, '', 0, NULL), + (1975, 'ads_calip_lava', '125', 2, 2, 0, 0, 0, 0, 1, 1795, '', 0, NULL), + (1976, 'ads_calip_parasol', '125', 4, 2, 0, 0, 0, 0, 1, 1796, '', 0, NULL), + (1977, 'ads_calip_parasol_cmp', '125', 5, 2, 0, 0, 0, 0, 1, 1797, '', 0, NULL), + (1978, 'ads_calip_pool', '125', 6, 2, 0, 0, 0, 0, 1, 1798, '', 0, NULL), + (1979, 'ads_calip_pool_cmp', '125', 7, 2, 0, 0, 0, 0, 1, 1799, '', 0, NULL), + (1980, 'ads_calip_tele', '125', 8, 2, 0, 0, 0, 0, 1, 1800, '', 0, NULL), + (1981, 'ads_calip_telecmp', '125', 9, 2, 0, 0, 0, 0, 1, 1801, '', 0, NULL), + (1982, 'calippo', '125', 10, 2, 0, 0, 0, 0, 1, 1802, '', 0, NULL), + (1983, 'calippo_cmp', '125', 11, 2, 0, 0, 0, 0, 1, 1803, '', 0, NULL), + (1984, 'ads_calip_cola*1', '125', 12, 2, 0, 0, 0, 0, 1, 1804, '', 0, NULL), + (1985, 'ads_calip_cola*2', '125', 13, 2, 0, 0, 0, 0, 1, 1805, '', 0, NULL), + (1986, 'ads_calip_cola*3', '125', 14, 2, 0, 0, 0, 0, 1, 1806, '', 0, NULL), + (1987, 'ads_calip_cola*4', '125', 15, 2, 0, 0, 0, 0, 1, 1807, '', 0, NULL), + (1988, 'ads_calip_colac*1', '125', 16, 2, 0, 0, 0, 0, 1, 1808, '', 0, NULL), + (1989, 'ads_calip_colac*2', '125', 17, 2, 0, 0, 0, 0, 1, 1809, '', 0, NULL), + (1990, 'ads_calip_colac*3', '125', 18, 2, 0, 0, 0, 0, 1, 1810, '', 0, NULL), + (1991, 'ads_calip_colac*4', '125', 19, 2, 0, 0, 0, 0, 1, 1811, '', 0, NULL), + (1992, 'ads_calip_lava2', '125', 3, 2, 0, 0, 0, 0, 1, 1812, '', 0, NULL), + (1993, 'ads_mall_coffeem', '126', 2, 2, 0, 0, 0, 0, 1, 1813, '', 0, NULL), + (1994, 'ads_mall_elevator', '126', 2, 2, 0, 0, 0, 0, 1, 1814, '', 0, NULL), + (1995, 'ads_mall_kiosk', '126', 2, 2, 0, 0, 0, 0, 1, 1815, '', 0, NULL), + (1996, 'ads_mall_tele', '126', 2, 2, 0, 0, 0, 0, 1, 1816, '', 0, NULL), + (1997, 'ads_mall_winbea', '126', 2, 2, 0, 0, 0, 0, 1, 1817, '', 0, NULL), + (1998, 'ads_mall_winchi', '126', 2, 2, 0, 0, 0, 0, 1, 1818, '', 0, NULL), + (1999, 'ads_mall_wincin', '126', 2, 2, 0, 0, 0, 0, 1, 1819, '', 0, NULL), + (2000, 'ads_mall_winclo', '126', 2, 2, 0, 0, 0, 0, 1, 1820, '', 0, NULL), + (2001, 'ads_mall_window', '126', 2, 2, 0, 0, 0, 0, 1, 1821, '', 0, NULL), + (2002, 'ads_mall_winfur', '126', 2, 2, 0, 0, 0, 0, 1, 1822, '', 0, NULL), + (2003, 'ads_mall_wingar', '126', 2, 2, 0, 0, 0, 0, 1, 1823, '', 0, NULL), + (2004, 'ads_mall_winice', '126', 2, 2, 0, 0, 0, 0, 1, 1824, '', 0, NULL), + (2005, 'ads_mall_winmus', '126', 2, 2, 0, 0, 0, 0, 1, 1825, '', 0, NULL), + (2006, 'ads_mall_winpet', '126', 2, 2, 0, 0, 0, 0, 1, 1826, '', 0, NULL), + (2007, 'ads_mall_winspo', '126', 2, 2, 0, 0, 0, 0, 1, 1827, '', 0, NULL), + (2008, 'ads_mall_wintra', '126', 2, 2, 0, 0, 0, 0, 1, 1828, '', 0, NULL), + (2009, 'easel_0', '127', 2, 2, 0, 0, 0, 0, 1, 1829, '', 0, NULL), + (2010, 'easel_1', '127', 2, 2, 0, 0, 0, 0, 1, 1830, '', 0, NULL), + (2011, 'easel_2', '127', 2, 2, 0, 0, 0, 0, 1, 1831, '', 0, NULL), + (2012, 'easel_3', '127', 2, 2, 0, 0, 0, 0, 1, 1832, '', 0, NULL), + (2013, 'easel_4', '127', 2, 2, 0, 0, 0, 0, 1, 1833, '', 0, NULL), + (2014, 'prizetrophy7*1', '128', 2, 2, 0, 0, 0, 0, 1, 1834, '', 0, NULL), + (2015, 'prizetrophy7*2', '128', 2, 2, 0, 0, 0, 0, 1, 1835, '', 0, NULL), + (2016, 'prizetrophy7*3', '128', 2, 2, 0, 0, 0, 0, 1, 1836, '', 0, NULL), + (2017, 'prizetrophy8*1', '128', 2, 2, 0, 0, 0, 0, 1, 1837, '', 0, NULL), + (2018, 'prizetrophy9*1', '128', 2, 2, 0, 0, 0, 0, 1, 1838, '', 0, NULL), + (2019, 'prizetrophy_cool', '128', 2, 2, 0, 0, 0, 0, 1, 1839, '', 0, NULL), + (2020, 'prizetrophy_hot', '128', 2, 2, 0, 0, 0, 0, 1, 1840, '', 0, NULL), + (2021, 'hrella_poster_1', '100', 2, 2, 0, 0, 0, 0, 1, 1841, '', 0, NULL), + (2022, 'hrella_poster_2', '100', 2, 2, 0, 0, 0, 0, 1, 1842, '', 0, NULL), + (2023, 'hrella_poster_3', '100', 2, 2, 0, 0, 0, 0, 1, 1843, '', 0, NULL), + (2024, 'xm09_trophy', '128', 2, 2, 0, 0, 0, 0, 1, 1844, '', 0, NULL), + (2025, 'computer_laptop', '129', 2, 2, 0, 0, 0, 0, 1, 1845, '', 0, NULL), + (2026, 'bw_water_1', '107', 2, 2, 0, 0, 0, 0, 1, 1846, '', 0, NULL), + (2027, 'bw_water_2', '107', 2, 2, 0, 0, 0, 0, 1, 1847, '', 0, NULL), + (2028, 'val_randomizer', '121', 2, 5, 0, 300, 200, 0, 1, 1848, '', 0, '02-14'), + (2029, 'val09_floor', '131', 32, 2, 0, 0, 0, 0, 1, 1849, '', 0, NULL), + (2030, 'val09_floor2', '131', 33, 2, 0, 0, 0, 0, 1, 1850, '', 0, NULL), + (2031, 'val09_wall1', '131', 34, 2, 0, 0, 0, 0, 1, 1851, '', 0, NULL), + (2032, 'val09_wall2', '131', 35, 2, 0, 0, 0, 0, 1, 1852, '', 0, NULL), + (2033, 'val09_wdrobe_b', '131', 36, 2, 0, 0, 0, 0, 1, 1853, '', 0, NULL), + (2034, 'val09_wdrobe_g', '131', 37, 2, 0, 0, 0, 0, 1, 1854, '', 0, NULL), + (2035, 'bling11_floor_deal5', '131', 38, 5, 0, 0, 0, 0, 1, 0, '', 1, NULL), + (2036, 'bling11_floor_deal10', '131', 39, 13, 0, 0, 0, 0, 1, 0, '', 1, NULL), + (2037, 'val09_floor_deal5', '131', 40, 6, 0, 0, 0, 0, 1, 0, '', 1, NULL), + (2038, 'val09_floor_deal10', '131', 41, 14, 0, 0, 0, 0, 1, 0, '', 1, NULL), + (2039, 'val09_floor2_deal5', '131', 42, 5, 0, 0, 0, 0, 1, 0, '', 1, NULL), + (2040, 'val09_floor2_deal10', '131', 43, 15, 0, 0, 0, 0, 1, 0, '', 1, NULL), + (2041, 'ktchn10_block', '78', 26, 2, 0, 0, 0, 0, 1, 1855, '', 0, NULL), + (2042, 'ktchn10_cabnt', '78', 27, 2, 0, 0, 0, 0, 1, 1856, '', 0, NULL), + (2043, 'ktchn10_pot', '78', 28, 2, 0, 0, 0, 0, 1, 1857, '', 0, NULL), + (2044, 'ktchn10_sink', '78', 29, 2, 0, 0, 0, 0, 1, 1858, '', 0, NULL), + (2045, 'ktchn10_stove', '78', 30, 2, 0, 0, 0, 0, 1, 1859, '', 0, NULL), + (2046, 'ktchn10_tea', '78', 31, 2, 0, 0, 0, 0, 1, 1860, '', 0, NULL), + (2047, 'ktchn10_block_deal5', '78', 32, 15, 0, 0, 0, 0, 1, 0, '', 1, NULL), + (2048, 'ktchn10_block_deal10', '78', 33, 30, 0, 0, 0, 0, 1, 0, '', 1, NULL), + (2049, 'md_limukaappi_cmp', '132', 2, 2, 0, 0, 0, 0, 1, 1861, '', 0, NULL), + (2050, 'kinkysofa', '121', 2, 2, 0, 0, 0, 0, 1, 1862, '', 0, NULL), + (2051, 'poster_2008', '109', 8, 3, 0, 0, 0, 0, 1, 251, '2008', 0, NULL), + (2052, 'poster_2005', '121', 8, 3, 0, 0, 0, 0, 1, 251, '2005', 0, NULL), + (2053, 'ads_cl_moodi_camp', '109', 0, 2, 0, 0, 0, 0, 1, 1863, '', 0, NULL), + (2054, 'window_skyscraper_deal5', '53', 2, 6, 0, 0, 0, 0, 1, 0, '', 1, NULL), + (2055, 'country_soil_deal5', '59', -2, 5, 0, 0, 0, 0, 1, 0, '', 1, NULL), + (2056, 'country_grass_deal5', '59', -1, 5, 0, 0, 0, 0, 1, 0, '', 1, NULL), + (2057, 'country_ditch_deal5', '59', -2, 7, 0, 0, 0, 0, 1, 0, '', 1, NULL), + (2058, 'garden_wall_deal5', '134', 23, 4, 0, 0, 0, 0, 1, 0, '', 1, NULL), + (2059, 'hc2_armchair', '135', 0, 2, 0, 0, 0, 0, 1, 1864, '', 0, NULL), + (2060, 'hc2_barchair', '135', 1, 2, 0, 0, 0, 0, 1, 1865, '', 0, NULL), + (2061, 'hc2_biglamp', '135', 2, 2, 0, 0, 0, 0, 1, 1866, '', 0, NULL), + (2062, 'hc2_carpet', '135', 3, 2, 0, 0, 0, 0, 1, 1867, '', 0, NULL), + (2063, 'hc2_cart', '135', 4, 2, 0, 0, 0, 0, 1, 1868, '', 0, NULL), + (2064, 'hc2_coffee', '135', 5, 2, 0, 0, 0, 0, 1, 1869, '', 0, NULL), + (2065, 'hc2_divider', '135', 6, 2, 0, 0, 0, 0, 1, 1870, '', 0, NULL), + (2066, 'hc2_dvn', '135', 7, 2, 0, 0, 0, 0, 1, 1871, '', 0, NULL), + (2067, 'hc2_frplc', '135', 8, 2, 0, 0, 0, 0, 1, 1872, '', 0, NULL), + (2068, 'hc2_sofa', '135', 9, 2, 0, 0, 0, 0, 1, 1873, '', 0, NULL), + (2069, 'hc2_sofatbl', '135', 10, 2, 0, 0, 0, 0, 1, 1874, '', 0, NULL), + (2070, 'hc2_vase', '135', 11, 2, 0, 0, 0, 0, 1, 1875, '', 0, NULL), + (2071, 'hc3_bard', '135', 12, 2, 0, 0, 0, 0, 1, 1876, '', 0, NULL), + (2072, 'hc3_dc', '135', 13, 2, 0, 0, 0, 0, 1, 1877, '', 0, NULL), + (2073, 'hc3_divider', '135', 14, 2, 0, 0, 0, 0, 1, 1878, '', 0, NULL), + (2074, 'hc3_hugelamp', '135', 15, 2, 0, 0, 0, 0, 1, 1879, '', 0, NULL), + (2075, 'hc3_light', '135', 16, 2, 0, 0, 0, 0, 1, 1880, '', 0, NULL), + (2076, 'hc3_shelf', '135', 17, 2, 0, 0, 0, 0, 1, 1881, '', 0, NULL), + (2077, 'hc3_sofa', '135', 18, 2, 0, 0, 0, 0, 1, 1882, '', 0, NULL), + (2078, 'hc3_stereo', '135', 19, 2, 0, 0, 0, 0, 1, 1883, '', 0, NULL), + (2079, 'hc3_stool', '135', 20, 2, 0, 0, 0, 0, 1, 1884, '', 0, NULL), + (2080, 'hc3_table', '135', 21, 2, 0, 0, 0, 0, 1, 1885, '', 0, NULL), + (2081, 'hc3_vase', '135', 22, 2, 0, 0, 0, 0, 1, 1886, '', 0, NULL), + (2082, 'hc3_walldeco', '135', 23, 2, 0, 0, 0, 0, 1, 1887, '', 0, NULL), + (2083, 'basket', '136', 0, 2, 0, 0, 0, 0, 1, 1888, '', 0, NULL), + (2084, 'birdie', '136', 1, 2, 0, 0, 0, 0, 1, 1889, '', 0, NULL), + (2085, 'easterduck', '136', 2, 2, 0, 0, 0, 0, 1, 1890, '', 0, NULL), + (2086, 'rare_mnstr', '121', 0, 2, 0, 0, 0, 0, 1, 1891, '', 0, NULL), + (2087, 'rare_beehive_bulb*3', '139', 0, 2, 0, 0, 0, 0, 1, 1892, '', 0, NULL), + (2088, 'rare_dragonlamp_pink', '139', 1, 2, 0, 0, 0, 0, 1, 1893, '', 0, NULL), + (2089, 'rare_icecream*10', '139', 2, 2, 0, 0, 0, 0, 1, 1894, '', 0, NULL), + (2090, 'pillar*10', '139', 3, 2, 0, 0, 0, 0, 1, 1895, '', 0, NULL), + (2091, 'rare_parasol*4', '139', 4, 2, 0, 0, 0, 0, 1, 1896, '', 0, NULL), + (2092, 'scifidoor*11', '139', 5, 2, 0, 0, 0, 0, 1, 1897, '', 0, NULL), + (2093, 'sleepingbag*11', '139', 6, 2, 0, 0, 0, 0, 1, 1898, '', 0, NULL), + (2094, 'rare_fountain*4', '139', 7, 2, 0, 0, 0, 0, 1, 1899, '', 0, NULL), + (2095, 'rare_dragonlamp*10', '139', 8, 2, 0, 0, 0, 0, 1, 1900, '', 0, NULL), + (2096, 'rare_fan*10', '139', 9, 2, 0, 0, 0, 0, 1, 1901, '', 0, NULL), + (2097, 'rare_icecream*11', '139', 10, 2, 0, 0, 0, 0, 1, 1902, '', 0, NULL), + (2098, 'wooden_screen*10', '139', 11, 2, 0, 0, 0, 0, 1, 1903, '', 0, NULL), + (2099, 'pillow*10', '139', 12, 2, 0, 0, 0, 0, 1, 1904, '', 0, NULL), + (2100, 'scifiport*10', '139', 13, 2, 0, 0, 0, 0, 1, 1905, '', 0, NULL), + (2101, 'rare_elephant_statue*3', '139', 14, 2, 0, 0, 0, 0, 1, 1906, '', 0, NULL), + (2102, 'marquee*11', '139', 15, 2, 0, 0, 0, 0, 1, 1907, '', 0, NULL), + (2103, 'scifirocket*10', '139', 16, 2, 0, 0, 0, 0, 1, 1908, '', 0, NULL); +/*!40000 ALTER TABLE `catalogue_items` ENABLE KEYS */; + +-- Dumping structure for table havana.catalogue_packages +CREATE TABLE IF NOT EXISTS `catalogue_packages` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `salecode` varchar(255) DEFAULT NULL, + `definition_id` int(11) DEFAULT NULL, + `special_sprite_id` int(11) DEFAULT NULL, + `amount` int(11) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `id` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.catalogue_packages: ~31 rows (approximately) +DELETE FROM `catalogue_packages`; +/*!40000 ALTER TABLE `catalogue_packages` DISABLE KEYS */; +INSERT INTO `catalogue_packages` (`id`, `salecode`, `definition_id`, `special_sprite_id`, `amount`) VALUES + (1, 'a0 deal102', 184, 0, 5), + (2, 'a0 deal104', 184, 0, 3), + (3, 'a0 deal105', 180, 0, 5), + (4, 'a0 deal106', 180, 0, 3), + (5, 'a0 deal107', 181, 0, 5), + (6, 'a0 deal108', 181, 0, 3), + (7, 'a0 deal109', 182, 0, 5), + (8, 'a0 deal114', 182, 0, 3), + (9, 'a0 deal115', 183, 0, 5), + (10, 'a0 deal116', 183, 0, 3), + (11, 'deal_dogfood', 155, 0, 6), + (12, 'deal_catfood', 156, 0, 6), + (13, 'deal_crocfood', 236, 0, 6), + (14, 'deal_cabbage', 157, 0, 6), + (15, 'sound_machine_deal', 232, 0, 1), + (16, 'sound_machine_deal', 239, 0, 1), + (17, 'deal_hcrollers', 226, 0, 5), + (18, 'deal_throne', 107, 0, 10), + (19, 'bling11_floor_deal5', 2133, 0, 5), + (20, 'bling11_floor_deal10', 2133, 0, 10), + (21, 'val09_floor_deal5', 2161, 0, 5), + (22, 'val09_floor_deal10', 2161, 0, 10), + (23, 'val09_floor2_deal5', 2162, 0, 5), + (24, 'val09_floor2_deal10', 2162, 0, 10), + (25, 'ktchn10_block_deal5', 2171, 0, 5), + (26, 'ktchn10_block_deal10', 2171, 0, 10), + (31, 'window_skyscraper_deal5', 775, 0, 5), + (32, 'country_soil_deal5', 812, 0, 5), + (33, 'country_grass_deal5', 813, 0, 5), + (34, 'country_ditch_deal5', 826, 0, 5), + (35, 'garden_wall_deal5', 2248, 0, 5); +/*!40000 ALTER TABLE `catalogue_packages` ENABLE KEYS */; + +-- Dumping structure for table havana.catalogue_pages +CREATE TABLE IF NOT EXISTS `catalogue_pages` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `old_id` int(11) NOT NULL, + `parent_id` int(11) NOT NULL DEFAULT -1, + `order_id` int(11) NOT NULL DEFAULT 1, + `min_role` int(11) NOT NULL DEFAULT 1, + `is_navigatable` tinyint(1) NOT NULL DEFAULT 0, + `is_club_only` tinyint(11) NOT NULL DEFAULT 0, + `name` text NOT NULL, + `icon` int(11) NOT NULL DEFAULT 0, + `colour` int(11) NOT NULL DEFAULT 0, + `layout` text NOT NULL DEFAULT '', + `images` text NOT NULL, + `texts` text NOT NULL, + `seasonal_start` varchar(200) DEFAULT NULL, + `seasonal_length` int(11) NOT NULL DEFAULT 0, + PRIMARY KEY (`id`), + KEY `id` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=143 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT; + +-- Dumping data for table havana.catalogue_pages: ~126 rows (approximately) +DELETE FROM `catalogue_pages`; +/*!40000 ALTER TABLE `catalogue_pages` DISABLE KEYS */; +INSERT INTO `catalogue_pages` (`id`, `old_id`, `parent_id`, `order_id`, `min_role`, `is_navigatable`, `is_club_only`, `name`, `icon`, `colour`, `layout`, `images`, `texts`, `seasonal_start`, `seasonal_length`) VALUES + (1, 0, -1, 1, 1, 1, 0, 'Frontpage', 1, 6, 'frontpage3', '["catalog_frontpage_headline2_en","{input1}"]', '["{input2}","{input3}","{input4}","How do I get Credits easily?","1. Always ask permission from the bill payer first.\\r\\n2. Send HABBO in a UK SMS to 78881. You\'\'ll get an SMS back with a voucher code and will be charged £3 plus your standard UK SMS rate, normally 10p.\\r\\n3. Enter the code below to redeem 35 Credits. For Habbo Credit options or to redeem a Wallie Voucher Card, simply click \\"Get Credits >>\\" below.","Redeem a Habbo Voucher code here:","","#FAF8CC","#FAF8CC","scifi"]', NULL, 0), + (2, 0, -1, 3, 1, 0, 0, 'Furni Shop', 2, 3, '', '[]', '[]', NULL, 0), + (3, 0, 2, 2, 1, 1, 0, 'Spaces', 0, 0, 'spaces', '["catalog_spaces_headline1"]', '["Floors, wallpapers, landscapes - get a groovy combination to your room. Use our virtual room preview below to test out the combinations before you buy. Select the design and color you like and click Buy."]', NULL, 0), + (4, 0, -1, 7, 1, 1, 0, 'Habbo Exchange', 6, 11, 'default_3x3', '["catalog_bank_headline1","catalog_bank_teaser","catalog_special_txtbg1"]', '["The Habbo Exchange is where you can convert your Habbo Credits into a tradable currency. You can use this tradable currency to exchange Habbo Credits for Furni!","Click on the item you want for more information","Refundable Goods!"]', NULL, 0), + (5, 0, 2, 5, 1, 1, 0, 'Rollers', 0, 0, 'default_3x3', '["catalog_roller_headline1","","catalog_special_txtbg1"]', '["Move your imagination, while you move your Habbo! Perfect for mazes, games, for keeping your queue moving or making your pet go round in circles for hours. Available in multi-packs - the more you buy the cheaper the Roller! Pink Rollers out now!","Click on a Roller to see more information!","You can fit 30 Rollers in a user flat!"]', NULL, 0), + (6, 0, 2, 5, 1, 1, 0, 'Teleporters', 0, 0, 'default_3x3', '["catalog_doors_headline1","catalog_teleports_teaser2_en","catalog_special_txtbg1"]', '["Beam your user from one room to another with one of our cunningly disguised, space age teleports. Now you can link any two rooms together! Teleports are sold in pairs, so if you trade for them, check you\'re getting a linked pair.","Click on the item you want for more information","New Door Teleport!"]', NULL, 0), + (7, 0, 54, 10, 1, 1, 0, 'Pets', 0, 0, 'pets', '["catalog_pet_headline1"]', '["Fluff and whiskers, meows and woofs! You\'\'re about to enter the world of small creatures with furry features. Find a new friend from our ever-changing selection. From faithful servants to playful playmates - here\'s where you\'\'ll find them all.","Find your own pet!"]', NULL, 0), + (8, 0, 54, 10, 1, 1, 0, 'Pet Accessories', 0, 0, 'default_3x3', '["catalog_pet_headline2","ctlg_pet_teaser1","catalog_special_txtbg2"]', '["You\'\'ll need to take care of your pet to keep it happy and healthy. This section of the Catalogue has EVERYTHING you\'ll need to satisfy your pet\'s needs.","Click on the item you want for more information","You\'ll have to share it!"]', NULL, 0), + (9, 0, 2, 6, 1, 1, 0, 'Area', 0, 0, 'default_3x3', '["catalog_area_headline1","catalog_area_teaser1","catalog_special_txtbg2"]', '["Introducing the Area Collection... Clean, chunky lines set this collection apart as a preserve of the down-to-earth person. It\'s beautiful in its simplicity, and welcoming to everyone.","Click on the item you want for more information","Beautiful in it\'s simplicity!"]', NULL, 0), + (10, 0, 2, 7, 1, 1, 0, 'Gothic', 0, 0, 'default_3x3', '["catalog_gothic_headline1","catalog_gothic_teaser1"]', '["The Gothic section is full of medieval looking items. Create your own Gothic castle!","Click on the item you want for more information",""]', NULL, 0), + (11, 0, -1, 5, 1, 0, 0, 'Trax', 4, 4, 'default_3x3', '[]', '[]', NULL, 0), + (12, 0, 2, 8, 1, 1, 0, 'Candy', 0, 0, 'default_3x3', '["catalog_candy_headline1","catalog_candy_teaser1","catalog_special_txtbg2"]', '["Candy combines the cool, clean lines of the Mode collection with a softer, more soothing style. It\'\'s urban sharpness with a hint of the feminine.","Click on the item you want for more information","Relax! It\'s faux-fur."]', NULL, 0), + (13, 0, 2, 9, 1, 1, 0, 'Asian', 0, 0, 'default_3x3', '["catalog_asian_headline1","catalog_asian_teaser1"]', '["Introducing the Asian collection... These handcrafted items are the result of years of child slavery, some mixture of Ying and Yang and a mass-shipping from China. These authentic items fit in every oriental themed user flat.","Click on the item you want for more information",""]', NULL, 0), + (14, 0, 2, 10, 1, 1, 0, 'Iced', 0, 0, 'default_3x3', '["catalog_iced_headline1","catalog_iced_teaser1","catalog_special_txtbg2"]', '["Introducing the Iced Collection... For the person who needs no introduction. It\'s so chic, it says everything and nothing. It\'s a blank canvas, let your imagination to run wild!","Click on the item you want for more information"," These chairs are so comfy."]', NULL, 0), + (15, 0, 2, 11, 1, 1, 0, 'Lodge', 0, 0, 'default_3x3', '["catalog_lodge_headline1","catalog_lodge_teaser1","catalog_special_txtbg2"]', '["Introducing the Lodge Collection... Do you appreciate the beauty of wood? For that ski lodge effect, or to match that open fire... Lodge is the Furni of choice for people with that no frills approach to decorating.","Click on the item you want for more information"," I LOVE this wood Furni!"]', NULL, 0), + (16, 0, 2, 12, 1, 1, 0, 'Plasto', 0, 0, 'plasto', '["catalog_plasto_headline1",""]', '["Introducing The Plasto Collection... Can you feel that 1970s vibe? Decorate with Plasto and add some colour to your life. Choose a colour that reflect your mood, or just pick your favourite shade.","Select an item and a colour and buy!"]', NULL, 0), + (17, 0, 2, 13, 1, 1, 0, 'Pura', 0, 0, 'default_3x3', '["catalog_pura_headline1","catalog_pura_teaser1"]', '["Introducing the Pura Collection... This collection breathes fresh, clean air and cool tranquillity. Use it to create a special haven away from the hullabaloo of life outside the Hotel.","Click on the item you want for more information",""]', NULL, 0), + (18, 0, 2, 14, 1, 1, 0, 'Mode', 0, 0, 'default_3x3', '["catalog_mode_headline1","catalog_mode_teaser1","catalog_special_txtbg2"]', '["Introducing the Mode Collection... Steely grey functionality combined with sleek designer upholstery. The person that chooses this furniture is a cool urban cat - streetwise, sassy and so slightly untouchable.","Click on the item you want for more information","So shiny and new..."]', NULL, 0), + (19, 0, 2, 15, 1, 1, 0, 'Accessories', 0, 0, 'default_3x3', '["catalog_extra_headline1","catalog_extra_teaser1","catalog_special_txtbg2"]', '["Is your room missing something? Well, now you can add the finishing touches that express your true personality. And don\'t forget, like everything else, these accessories can be moved about to suit your mood.","Click on the item you want for more information","I love my rabbit..."]', NULL, 0), + (20, 0, 2, 16, 1, 1, 0, 'Bathroom', 0, 0, 'default_3x3', '["catalog_bath_headline1","catalog_bath_teaser1","catalog_special_txtbg2"]', '["Introducing the Bathroom Collection... Have some fun with the cheerful bathroom collection. Give yourself and your guests somewhere to freshen up - vital if you want to avoid nasty niffs. Put your loo in a corner though...","Click on the item you want for more information"," Every Habbo needs one!"]', NULL, 0), + (21, 0, 2, 18, 1, 1, 0, 'Plants', 0, 0, 'default_3x3', '["catalog_plants_headline1","catalog_plants_teaser1"]', '["Introducing the Plant Collection... Every room needs a plant! Not only do they bring a bit of the outside inside, they also enhance the air quality! Do we give a fuck? Up to you!","Click on the item you want for more information",""]', NULL, 0), + (22, 0, 2, 17, 1, 1, 0, 'Sports', 0, 0, 'default_3x3', '["catalog_sports_headline1","catalog_sports_teaser1"]', '["For the sporty people, here is the Sports section! Create your own hockey stadium!","Click on the item you want for more information",""]', NULL, 0), + (23, 0, 2, 19, 1, 1, 0, 'Rugs', 0, 0, 'default_3x3', '["catalog_rugs_headline1","catalog_rugs_teaser1","catalog_special_txtbg2"]', '["We have rugs for all occasions. All rugs are non-slip and washable.","Click on the item you want for more information","We have rugs for ANY room!"]', NULL, 0), + (24, 0, 2, 20, 1, 1, 0, 'Gallery', 0, 0, 'default_3x3', '["catalog_gallery_headline1","catalog_posters_teaser1","catalog_special_txtbg2"]', '["Adorn your walls with wondrous works of art, posters, plaques and wall hangings. We have items to suit all tastes, from kitsch to cool, traditional to modern.","Click on the item you want for more information","Brighten up your walls!"]', NULL, 0), + (25, 0, 2, 21, 1, 1, 0, 'Flags', 0, 0, 'default_3x3', '["catalog_flags_headline1","catalog_flags_teaser1","catalog_special_txtbg2"]', '["If you\'re feeling patriotic, get a flag to prove it. Our finest cloth flags will brighten up the dullest walls.","Click on the item you want for more information"," Flag this section for later!"]', NULL, 0), + (26, 0, 2, 22, 1, 1, 0, 'Trophies', 0, 0, 'trophies', '["catalog_trophies_headline1",""]', '["Reward your friends, or yourself with one of our fabulous glittering array of bronze, silver and gold trophies.\r\nFirst choose the trophy model (click on the arrows to see all the different styles) and then the metal (click on the seal below the trop",""]', NULL, 0), + (27, 0, 63, 3, 6, 1, 0, 'Club Gifts', 0, 0, 'default_3x3', '["catalog_club_headline1","catalog_hc_teaser"]', '["Welcome to the Club Shop! All \'Habbo Club membership gifts\' are available here, use them wisely you greedy cunt! We have sofas, butlers and all the happy stuff.","Click on the item you want for more information",""]', NULL, 0), + (28, 0, 62, 1, 6, 1, 0, 'Dragons', 0, 0, 'default_3x3', '["catalog_rares_headline1",""]', '["The Dragon page contains all of the Dragon Lamps.","Click on the item you want for more information",""]', NULL, 0), + (29, 0, 62, 1, 6, 1, 0, 'Sci-fi Doors', 0, 0, 'default_3x3', '["catalog_rares_headline1",""]', '["Yet another rares page.","Click on the item you want for more information",""]', NULL, 0), + (30, 0, 62, 1, 6, 1, 0, 'Parasols', 0, 0, 'default_3x3', '["catalog_rares_headline1",""]', '["Yet another rares page.","Click on the item you want for more information",""]', NULL, 0), + (31, 0, 62, 1, 6, 1, 0, 'Screens', 0, 0, 'default_3x3', '["catalog_rares_headline1",""]', '["Yet another rares page.","Click on the item you want for more information",""]', NULL, 0), + (32, 0, 62, 1, 6, 1, 0, 'Marquees', 0, 0, 'default_3x3', '["catalog_rares_headline1",""]', '["Yet another rares page.","Click on the item you want for more information",""]', NULL, 0), + (33, 0, 62, 1, 6, 1, 0, 'Pillows', 0, 0, 'default_3x3', '["catalog_rares_headline1",""]', '["Yet another rares page.","Click on the item you want for more information",""]', NULL, 0), + (34, 0, 62, 1, 6, 1, 0, 'Icecream', 0, 0, 'default_3x3', '["catalog_rares_headline1",""]', '["Yet another rares page.","Click on the item you want for more information",""]', NULL, 0), + (35, 0, 62, 1, 6, 1, 0, 'Smoke machines', 0, 0, 'default_3x3', '["catalog_rares_headline1",""]', '["Yet another rares page.","Click on the item you want for more information",""]', NULL, 0), + (36, 0, 62, 1, 6, 1, 0, 'Sci-Fi Ports', 0, 0, 'default_3x3', '["catalog_rares_headline1",""]', '["Yet another rares page.","Click on the item you want for more information",""]', NULL, 0), + (37, 0, 62, 1, 6, 1, 0, 'Amber Lamp', 0, 0, 'default_3x3', '["catalog_rares_headline1",""]', '["Yet another rares page.","Click on the item you want for more information",""]', NULL, 0), + (38, 0, 62, 1, 6, 1, 0, 'Fountains', 0, 0, 'default_3x3', '["catalog_rares_headline1",""]', '["Yet another rares page.","Click on the item you want for more information",""]', NULL, 0), + (39, 0, 62, 1, 6, 1, 0, 'Elephants', 0, 0, 'default_3x3', '["catalog_rares_headline1",""]', '["Yet another rares page.","Click on the item you want for more information",""]', NULL, 0), + (40, 0, 62, 1, 6, 1, 0, 'Fans', 0, 0, 'default_3x3', '["catalog_rares_headline1",""]', '["Yet another rares page.","Click on the item you want for more information",""]', NULL, 0), + (41, 0, 2, 4, 1, 1, 0, 'Camera', 0, 0, 'camera1', '["catalog_camera_headline1","campic_cam","","campic_film"]', '["With your Camera you can take pictures of just about anything in the hotel - your friend on the loo (hehe), your best dive in the Lido, or your room when you\'ve got it just right!\\r\\nA camera costs 10 Credits (two free photos included).","When you\'ve used your free photos, you\'ll need to buy more. Each roll of film takes five photos. Your Camera will show how much film you have left and loads the next roll automatically.\\r\\nEach Film (5 photos) costs: 6 Credits"]', NULL, 0), + (42, 0, 1000, 1, 1, 1, 0, 'Camera How-To', 0, 0, 'camera2', '["catalog_camera_headline1","campic_help"]', '["CAMERA FUNCTIONS\\r\\n1. Press this button to take a photo. 2. Photo cancel - for when you\'ve chopped off your friend\'s head! 3. Zoom in and out. 4. Photo counter - shows how much film you have left 5. Caption Box - write your caption before saving the photo. 6. Save - this moves the photo to your giant.\\r\\nYou can give photos to your friends, or put them on the wall like posters.",""]', NULL, 0), + (43, 0, 62, 1, 6, 1, 0, 'Inflatable Chairs', 0, 0, 'default_3x3', '["catalog_rares_headline1",""]', '["Yet another rares page.","Click on the item you want for more information",""]', NULL, 0), + (44, 0, 62, 1, 6, 1, 0, 'Rares Mixed', 0, 0, 'default_3x3', '["catalog_rares_headline1",""]', '["Yet another rares page.","Click on the item you want for more information",""]', NULL, 0), + (45, 0, 2, 23, 1, 1, 0, 'Executive', 0, 0, 'default_3x3', '["catalog_exe_headline1_en","catalog_exe_teaser_en"]', '["The Executive Furni is ideal for creating a sophisticated working environment, whether it be an office, a mafia headquarters or study!","Click on the item you want for more information",""]', NULL, 0), + (46, 0, 2, 24, 1, 1, 0, 'Alhambra', 0, 0, 'soundmachine', '["catalog_alh_headline2","catalog_alh_teaser2","catalog_special_txtbg1"]', '["The Palace of Alhambra has appeared and with it this exotic and beautifully crafted range of Arabian Furni. Luxury seating and gourmet food combine to make your room sparkle with riches.","Click on the item you want for more information","Get your Alhambrian goodies now!"]', NULL, 0), + (51, 0, -1, 2, 1, 1, 0, 'Collectables', 3, 2, 'default_3x3', '["catalog_cltbs_header1_uk","catalog_cltbs_teaser_en"]', '["Collect your way to the riches! Collectables are special furniture sold only for a limited period of time. They cost a wee bit more, but make up with an amazing trade value.",""," Collect your way to riches!"]', NULL, 0), + (53, 0, 2, 3, 1, 1, 0, 'Windows', 0, 0, 'default_3x3', '["ctlg_windows_headline1_en","ctlg_windows_teaser1_en","catalog_special_txtbg2"]', '["Let some sunshine in! Our windows come in many styles to give a unique look to your room. Who said your room can\'t have a view?","Click on the item you want for more information","Ooh, new view!"]', NULL, 0), + (54, 0, -1, 4, 1, 0, 0, 'Pets Shop', 8, 7, '', '[]', '[]', NULL, 0), + (55, 0, 54, 11, 1, 1, 0, 'Pets Info', 0, 0, 'pets2', '["catalog_pet_headline1","ctlg_pet_note"]', '["Pets are inhabitants of Habbo Hotel too, so each pet owner needs to know a bit about them. Look after your pet by looking through our key points below.","A few things you should know:","- You can only put it down in one of your rooms.\\r\\n- There can be 3 pets in each room.\\r\\n- The basket is your pet\'s home. If you pick it up, the pet will go back in your hand.\\r\\n- Every time you visit this page, you will go back to a different selection of pets.\\r\\n- Your pet will sleep more when it gets old\\r\\n- You cannot trade your pet"]', NULL, 0), + (56, 0, -1, 6, 1, 0, 0, 'Pixel Shop', 5, 5, '', '[]', '[]', NULL, 0), + (57, 0, 56, 3, 1, 1, 0, 'Hello Furni', 0, 0, 'pixelrent', '["catalog_hello_header1_en","catalog_hello_teaser1_en"]', '["Hello Furni is available with Pixels and is perfect if you are decorating your room for the very first time. The Furni is yours to keep and therefore cannot be traded.","Click on the item you want for more information"," "]', NULL, 0), + (58, 0, -1, 9, 1, 0, 0, 'Ecotron', 7, 3, '', '[]', '[]', NULL, 0), + (59, 0, 2, 27, 1, 1, 0, 'Country', 0, 0, 'default_3x3', '["catalog_country_header1_en","catalog_country_teaser1_en","catalog_special_txtbg2"]', '["Let\'s leave the busy city streets and head over to the wide abyss of golden wheat, emerald fields and home grown, organic vegetables. Everything you need to create a farm!","Click on the item you want for more information","Who\'d be a crow, eh?"]', NULL, 0), + (60, 0, 56, 2, 1, 1, 0, 'Special Effects', 0, 0, 'pixeleffects', '["catalog_pixeleffects_headline1_en","catalog_pxl_teaser1_en"]', '["Tune your character with cool effects that fit the occasion. Do you want to fly away with the red carpet or be in the spotlight? Now is your chance!\\r\\n\\r\\nThe effects can be activated in your badge dialog under effects tab.",""," "]', NULL, 0), + (61, 0, 56, 4, 1, 1, 0, 'Automobile', 0, 0, 'cars', '["catalog_automobile_header1_en","catalog_automobile_teaser1_en"]', '["Every Habbo needs a car effect! Not only do they bring a bit of the outside inside, they also enhance the air quality! And what better gift for a friend than a beautiful traffic sign or elegant pile of tires...","Click on the item you want for more information."," "]', NULL, 0), + (62, 0, -1, 11, 6, 0, 0, 'Admin Shop', 1, 6, '', '[]', '[]', NULL, 0), + (63, 0, -1, 8, 1, 1, 0, 'Habbo Club', 9, 7, 'club1', '["catalog_club_headline1","clubcat_pic"]', '["Welcome to Habbo Club - the members only club that all the best Habbos belong to!","Every member of Habbo Club gets priority access to the hotel. So, if the hotel\'s full up, you\'ll get to the front of the queue automatically - no waiting around! And you\'ll get exclusive clothes, hair colours, furni, special guest room layouts and more besides. Normal Habbos will not have any of these.","How do I join? Use the Navigator to go to \'Hotel View\' and click on the Habbo Club icon. Habbo Club costs 20 Credits a month. We\'ll remind you when your membership is about to run out.","Well, what are you waiting for? Join Habbo Club today!"]', NULL, 0), + (64, 0, 63, 2, 1, 1, 1, 'Club Shop', 0, 0, 'default_3x3', '["catalog_club_headline1","catalog_hc_teaser","catalog_special_txtbg1"]', '["NEW Habbo Club Furni range. Allow these elegant delights to make your room sophisticated and humble. They look great placed with your monthly gifts!","Click on the item you want for more information","For Habbo Club members only!"]', NULL, 0), + (65, 0, 63, 1, 1, 1, 0, 'Club Info', 0, 0, 'club2', '["catalog_club_headline1","club_pos","","club_neg"]', '["What happens when my Habbo Club runs out?","If your Habbo Club runs out, you WILL be able to keep any rooms you made with a Club layout and the Habbo Club Furni is yours to keep.","If your Habbo Club runs out you WON\'T be able to wander around with a cool HC badge, the funky clothes and your hair will vanish from your Habbo, you won\'t be able to do chose HC rooms layouts in the Room-O-Matics, you\'ll receive no new HC Furni and worst all, you won\'t be able to jump the queue if the Hotel\'s Full!","Stay in Habbo Club for more than a year and you\'ll get a special sparkly BADGE!"]', NULL, 0), + (66, 0, 2, 28, 1, 1, 0, 'Glass', 0, 0, 'default_3x3', '["catalog_glass_headline1","catalog_glass_teaser1"]', '["You can really open up a space with this stylish glass furniture, just don\'t walk into it!","Click on the item you want for more information",""]', NULL, 0), + (67, 0, 2, 29, 1, 1, 0, 'Greek', 0, 0, 'default_3x3', '["catalog_greek_header1","catalog_greek_teaser1"]', '["Be transported back to ancient Greece with a couple of thousand pounds and British Airways. Until then, build your own panthenon with our realist Greek range!","Click on the item you want for more information",""]', NULL, 0), + (68, 0, 2, 30, 1, 1, 0, 'Romantique', 0, 0, 'default_3x3', '["catalog_romantique_headline1","catalog_romantique_teaser1"]', '["The Romantique range features Grand Pianos, old antique lamps and tables. It is the ideal range for setting a warm and loving mood in your room. Spruce up your room and invite that special someone over. Now featuring the extra special COLOUR edition.","Click on the item you want for more information",""]', '12-01', 2592000), + (69, 0, 2, 31, 1, 1, 0, 'Arctic', 0, 0, 'soundmachine', '["catalog_arc_header1_en","catalog_arc_teaser1_en"]', '["Stay cool (or warm with our campfire!) and create your own Winter Wonderland or Humble Homeland for your penguins.","Click on the item you want for more information",""]', NULL, 0), + (70, 0, 2, 32, 1, 1, 0, 'Bensalem', 0, 0, 'default_3x3', '["catalog_header_bensalem","catalog_teaser_bensalem"]', '["The Lost City of Bensalem has been located beneath the sea. We have worked hard to salvage all kinds of fantastic furni, which is now all available below.","Click on the item you want for more information",""]', NULL, 0), + (71, 0, 2, 33, 1, 1, 0, 'Neon', 0, 0, 'default_3x3', '["catalog_neon_header1_en","catalog_neon_teaser1_en"]', '["New years eve, birthdays and every other day of the year, there\'s always an excuse for a party! So, why don\'t you buy some Neon furni!?","Click on the item you want for more information",""]', NULL, 0), + (72, 0, 2, 34, 1, 1, 0, 'Lost Tribe', 0, 0, 'default_3x3', '["catalog_header_lost_tribe","LT_teaser_en"]', '["Start your own tribal village with our ancient furniture, all carved from hard wearing stone. NOTE: Lava is hot, get an adult to help you.","Click on the item you want for more information",""]', NULL, 0), + (73, 0, 2, 35, 1, 1, 0, 'Virus', 0, 0, 'default_3x3', '["catalog_vir_header1_en","catalog_vir_teaser_en","catalog_special_txtbg1"]', '["A virus is spreading through Habbo Hotel. Many casualties reported and it could get much worse! Whether you are hoping to help infected Habbos or look after number one, get your clean hands on our terrifying Infection Furni.","Click on the item you want for more information","Latest virus news on TV now!"]', NULL, 0), + (74, 0, 58, 9, 1, 1, 0, 'Ecotron', 0, 0, 'recycler', '["catalog_recycler_headline3_en"]', '["Become an Eco-warrior\\\\r\\\\nRecycle your worthless stuff and be rewarded with a random prize. Check out the prizes and the instructions for recycling.\\\\r\\\\nDrag 5 items to the boxes below and click recycle!"]', NULL, 0), + (75, 0, 58, 9, 1, 1, 0, 'Rewards', 0, 0, 'recycler_prizes', '["catalog_recycler_headline3_en","",""]', '["What are the prizes? Ecotron box may contain one of these:","","What are the prizes? Ecotron box may contain one of these:"]', NULL, 0), + (76, 0, 58, 11, 6, 1, 0, 'Ecotron Shop', 0, 0, 'default_3x3', '["catalog_recycler_headline4_en",""]', '["Yet another Ecotron page!","",""]', NULL, 0), + (77, 0, 58, 10, 1, 1, 0, 'Instructions', 0, 0, 'pets2', '["catalog_recycler_headline5_en","ctlg_ecotron_box2"]', '["The Ecotron is a furni recycler. Get rid of old furni... what will you get in return? It\'s a surprise! Become a Habbo eco-warrior. No refunds!","How to use the Ecotron?","1. Just drag 5 items from your hand to the Ecotron. One item / square. Recyclable items are marked in your inventory with an image. When you have 5 items in the boxes, click the \\"Recycle\\" button. You can now find the Ecotron prize box from your hand.\\r\\n\\r\\n2. Click the box to see its tag. Open the box, or trade it unopened. The timer shows you how long you have to wait before you can recycle more items. Check the prizes before you recycle- don\'t be surprised by the surprise!"]', NULL, 0), + (78, 0, 2, 36, 1, 1, 0, 'Kitchen', 0, 0, 'default_3x3', '["catalog_header_kitchen","catalog_teaser_kitchen"]', '["Create your dream kitchen with this exquisite range of matured pine and marble furniture.","Click on the item you want for more information",""]', NULL, 0), + (79, 0, 2, 37, 1, 1, 0, 'Christmas 09', 0, 0, 'default_3x3', '["catalog_xmas_headline1","catalog_xmas_teaser"]', '["Get yourself into the Christmas spirit with our selection of festive furni! From baubles to reindeer poo, we\'ve got it all!","Click on the item you want for more information",""]', '12-01', 2592000), + (80, 0, 2, 39, 1, 1, 0, 'Urban', 0, 0, 'default_3x3', '["urban_header_en","urban_teaser_en"]', '["New York City styled furni range, Urban is perfect for any street, alleyway or road. Rubbish bins, street lights and benches, all the Urban furniture you need!","Click on the item you want for more information",""]', NULL, 0), + (81, 0, 2, 39, 1, 1, 0, 'Grunge', 0, 0, 'default_3x3', '["catalog_grunge_headline1","catalog_grunge_teaser"]', '["The Grunge range will get your bedroom looking just the way you like it - organised, neat and tidy!","Click on the item you want for more information",""]', NULL, 0), + (82, 0, 2, 40, 1, 1, 0, 'Shalimar', 0, 0, 'default_3x3', '["catalog_shal_header1_en","catalog_shal_teaser_en"]', '["Everyone loves Bollywood! Watch out for rose petals!","Click on the item you want for more information",""]', NULL, 0), + (83, 0, 51, 2, 6, 1, 0, 'Collectables Shop', 0, 0, 'default_3x3', '["catalog_cltbs_header1_uk","catalog_cltbs_teaser_en"]', '["Collect your way to the riches! Collectables are special furniture sold only for a limited period of time. They cost a wee bit more, but make up with an amazing trade value.",""," Collect your way to riches!"]', NULL, 0), + (84, 0, 11, 5, 1, 1, 0, 'How to make music?', 0, 0, 'default_3x3', '["catalog_djshop_headline1","catalog_djshop_teaser1"]', '["You must own a trax machine and at least one trax pax. Place the trax machine in your room and the trax pax in your hand. Double click the trax machine, click \\"Trax editor\\" and start editing music. When ready, save, select the tune, turn on the trax machine and enjoy.","Cool, my own music!",""]', NULL, 0), + (85, 0, 11, 5, 1, 1, 0, 'Ambient', 0, 0, 'soundmachine', '["catalog_trx_header1_en","catalog_trx_teaser1"]', '["Welcome to the Ambient Trax Store! With groovy beats and chilled out melodies, this is the section for some cool and relaxing tunes.",""]', NULL, 0), + (86, 0, 11, 5, 1, 1, 0, 'Dance', 0, 0, 'soundmachine', '["catalog_trx_header2_en","catalog_trx_teaser2"]', '["Welcome to the Dance Trax Store! With funky beats and catchy melodies, this is the section for every clubber to indulge in.",""]', NULL, 0), + (87, 0, 11, 5, 1, 1, 0, 'Rock', 0, 0, 'soundmachine', '["catalog_trx_header3_en","catalog_trx_teaser3"]', '["Welcome to the Rock Trax Store! With heavy beats and rockin\' riffs, this is the section for every rock fan to experiment with.",""]', NULL, 0), + (88, 0, 11, 5, 1, 1, 0, 'SFX', 0, 0, 'soundmachine', '["catalog_trx_header4_en","catalog_trx_teaser4"]', '["Welcome to the SFX Trax Store! With crazy sounds and weird noises, this is the section for every creative room builder to indulge in.",""]', NULL, 0), + (89, 0, 11, 5, 1, 1, 0, 'Urban', 0, 0, 'soundmachine', '["catalog_trx_header5_en","catalog_trx_teaser5"]', '["Welcome to the Urban Trax Store! With hip hop beats and RnB vocals, this is the section for every city bopper to indulge in.",""]', NULL, 0), + (90, 0, 2, 40, 1, 1, 0, 'Sci-Fi', 0, 0, 'default_3x3', '["sf_header_en","sf_teaser_en"]', '["Blipblop blip blip blip.. Oooh.. what\\\'s this button do?.. You can find out exactly what it does with our new Scifi range, batteries included!","Click on the item you want for more information",""]', NULL, 0), + (91, 0, 2, 40, 1, 1, 0, 'American Idol', 0, 0, 'default_3x3', '["catalog_idol_header1","catalog_idol_teaser1"]', '["Create your own American Idol world in Habbo with this exclusive AI furniture set.","Click on the item you want for more information",""]', NULL, 0), + (92, 0, 56, 1, 1, 1, 0, 'Rentals', 0, 0, 'pixelrent', '["catalog_pixelrentals_header_en","catalog_pxl_teaser3_en"]', '["Crate a cool room, with these rocking room effects you can expand your friends experience.","",""]', NULL, 0), + (93, 0, 56, 1, 1, 1, 0, 'Pixel Collectable', 0, 0, 'cars', '["catalog_pixeldeals_headline1_en","catalog_pxl_teaser2_en"]', '["The Pixel Collectable is the ultimate collectors item requiring a mammoth 2000 pixels to purchase.","",""]', NULL, 0), + (94, 0, 62, 1, 6, 1, 0, 'Pixel Collectables', 0, 0, 'cars', '["catalog_pixeldeals_headline1_en","catalog_pxl_teaser2_en"]', '["The admin page for all the pixel collectables.","",""]', NULL, 0), + (95, 0, 63, 4, 1, 1, 1, 'One Way Gates', 0, 0, 'cars', '["catalog_onewaygates_en",""]', '["As a token of gratitude for Habbo Club members, you can now purchase One Way Gates without having to wait for them to appear in the catalogue!","Click on the item you want for more information",""]', NULL, 0), + (96, 0, 2, 41, 1, 1, 0, 'Tiki', 0, 0, 'soundmachine', '["catalog_tiki_header1_en","tiki_teaser"]', '["Go a little bit exotic with your food choices with these items from our much-loved Tiki range!","Click on the item you want for more information",""]', NULL, 0), + (97, 0, 2, 42, 1, 1, 0, 'Twilight', 0, 0, 'default_3x3', '["catalog_twilight_header_en","catalog_teaser_twilight"]', '["The Twilight Saga - New Moon is here! To celebrate the arrival of the Cullens, some special furniture has been made so you can create your own Twilight rooms.","Click on the item you want for more information",""]', NULL, 0), + (98, 0, 2, 43, 1, 1, 0, 'Habbowood', 0, 0, 'default_3x3', '["ctlg_habbowood_headline1_en","ctlg_habbowood_teaser1_en"]', '["Presenting the all new Habbowood Furni range! Whether it\'s a boulevard of stars, a cinema, a theatre, a dressing room or an entire film studio - the Habbowood Furni ticks all the stage exit right boxes!","Click on the item you want for more information",""]', '02-01', 2419200), + (99, 0, 2, 44, 1, 1, 0, 'Love', 0, 0, 'default_3x3', '["catalog_love_headline1","catalog_love_teaser1"]', '["It is Valentine\'s Day and time to express your love and affection for your friends. Go wild and leave anonymous Heart Stickies all over the hotel!","Click on the item you want for more information",""]', '02-01', 2419200), + (100, 0, 2, 44, 1, 1, 0, 'Valentines', 0, 0, 'default_3x3', '["catalog_va2_headline1_en","catalog_va2_teaser_en","catalog_special_txtbg2"]', '["Valentine\'s Love Furni will set the right mood in your room this week. Avaliable until Monday so don\'t miss out on the Heart Sofa - one of the most popular items in Habbo - and Heart Stickies","Mood Light - Turn the lights down low this Valentine\'s","I prefer White and Purple Roses :o"]', NULL, 0), + (101, 0, 2, 44, 1, 1, 0, 'Habboween', 0, 0, 'default_3x3', '["catalog_halloween_headline1","catalog_halloween_teaser","catalog_special_txtbg2"]', '["Yes, it\'\'s a spookfest! Get your boney hands on our creepy collection of ghoulish goodies. But be quick - they\'\'\'ll be gone from the Catalogue after two weeks!","Click an item for more information","Halloween is My day!"]', '10-01', 2592000), + (102, 0, 2, 44, 1, 1, 0, 'Relax', 0, 0, 'default_3x3', '["catalog_relax_headline1_en","catalog_relax_teaser1_en",""]', '["Relax after a busy day in the Welcome Lounge. Light a few candles, and chill out with a good read in a wicker chair. We understand the needs of a Habbo with a hectic lifestyle!","Click an item for more information",""]', NULL, 0), + (103, 0, 2, 44, 1, 1, 0, 'Japanese', 0, 0, 'default_3x3', '["catalog_jap_headline2_en","catalog_jap_teaser3_en",""]', '["We have sushi, tatami and katana\\\'s! I have no idea what the difference is, but I sure know its Japanese! Fulfil your fantasies and buy some today!","Click an item for more information",""]', NULL, 0), + (104, 0, 2, 44, 1, 1, 0, 'Haunted House', 0, 0, 'default_3x3', '["catalog_halloween_headline2","catalog_halloween_teaser2_en",""]', '["The creepy house on top of the hill has swung open its haunted doors to let you inside. With creaky floors and even creakier doors, you better watch your step in this eerie haunted mansion.","Click an item for more information",""]', '10-01', 2592000), + (105, 0, 2, 44, 1, 1, 0, 'Igor', 0, 0, 'default_3x3', '["catalog_igor_headine2_en","catalog_igor_teaser1_en",""]', '["Igor\'s back and he means business. Celebrating the release of IGOR on DVD, he\'s Introducing FOUR new additions to the IGOR furni line. These include a Flask, Science Desk, Wall Poster and Evil Bone!","Click an item for more information",""]', NULL, 0), + (106, 0, 2, 44, 1, 1, 0, 'Spiderwick', 0, 0, 'default_3x3', '["catalog_spw_header1_en","catalog_spw_teaser2_en",""]', '["The Spiderwick Exhibition has arrived at the \\"Museum of Invention\\" in Habbo Hotel. Grab yourself a limited edition souvenir item of Furni below before it\'s too late!","Click an item for more information",""]', NULL, 0), + (107, 0, 2, 44, 1, 1, 0, 'Summer', 0, 0, 'default_3x3', '["catalog_sum_headline1_en","catalog_sum_teaser1_en",""]', '["Phwoar! Start up the barbie! This range has everything you need for the perfect summer garden!","Click an item for more information",""]', NULL, 0), + (108, 0, 2, 44, 1, 1, 0, 'Moodlights', 0, 0, 'default_3x3', '["catalog_dimmers_header1_en","catalog_dimmer_teaser_en",""]', '["Our range of moodlights allow you to control the atmosphere and transform your room in just a click. What will your room look like? Click the switch and find out now!","Click an item for more information",""]', NULL, 0), + (109, 0, 62, 1, 6, 1, 0, 'Various Ads', 0, 0, 'default_3x3', '["catalog_rares_headline1","",""]', '["Miscelaneous advertisement furniture","Click an item for more information",""]', NULL, 0), + (110, 0, 2, 45, 1, 1, 0, 'Memorial', 0, 0, 'default_3x3', '["catalog_limited_headline1_en","catalog_limited_teaser_en","catalog_special_txtbg2"]', '["Available this week only and NEVER to be sold again, special Memorial Furni. As we have a fond farewell to Old Habbo and welcome New Habbo, bag yourself a highly collectible momento.","Click an item for more details","Habbo Memorial"]', NULL, 0), + (111, 0, 62, 1, 6, 1, 0, 'Extra Rollers', 0, 0, 'default_3x3', '["catalog_rares_headline1",""]', '["Yet another rares page.","Click on the item you want for more information",""]', NULL, 0), + (112, 0, 2, 44, 1, 1, 0, 'Diner', 0, 0, 'default_3x3', '["catalog_diner_header_en","catalog_diner_teaser_en",""]', '["Get cookin\' with Diner Furni! Serve up your eggs \'n\' grits on new Yellow or Aquamarine Diner Furni, avaliable for a limited time only!","Click an item for more information",""]', NULL, 0), + (113, 0, 62, 1, 6, 1, 0, 'Sleeping Bags', 0, 0, 'default_3x3', '["catalog_rares_headline1",""]', '["Yet another rares page.","Click on the item you want for more information",""]', NULL, 0), + (114, 0, 62, 1, 6, 1, 0, 'Pillars', 0, 0, 'default_3x3', '["catalog_rares_headline1",""]', '["Yet another rares page.","Click on the item you want for more information",""]', NULL, 0), + (116, 0, 62, 1, 6, 1, 0, 'Penguins', 0, 0, 'default_3x3', '["catalog_rares_headline1",""]', '["Yet another rares page.","Click on the item you want for more information",""]', NULL, 0), + (117, 0, 2, 36, 1, 1, 0, 'Christmas 06', 0, 0, 'default_3x3', '["catalog_xmas_headline1","catalog_xmas_teaser"]', '["Get yourself into the Christmas spirit with our selection of festive furni! From baubles to reindeer poo, we\'ve got it all!","Click on the item you want for more information",""]', '12-01', 2592000), + (118, 0, 62, 1, 6, 1, 0, 'Various Misc', 0, 0, 'default_3x3', '["catalog_rares_headline1",""]', '["Yet another rares page.","Click on the item you want for more information",""]', NULL, 0), + (119, 0, 2, 36, 1, 1, 0, 'Christmas 07', 0, 0, 'default_3x3', '["catalog_xmas_headline1","catalog_xmas_teaser"]', '["Get yourself into the Christmas spirit with our selection of festive furni! From baubles to reindeer poo, we\'ve got it all!","Click on the item you want for more information",""]', '12-01', 2592000), + (120, 0, 62, 1, 6, 1, 0, 'Recycler (Old)', 0, 0, 'default_3x3', '["catalog_rares_headline1",""]', '["Yet another rares page.","Click on the item you want for more information",""]', NULL, 0), + (121, 0, 62, 1, 6, 1, 0, 'Super Rares', 0, 0, 'default_3x3', '["catalog_rares_headline1",""]', '["Yet another rares page.","Click on the item you want for more information",""]', NULL, 0), + (122, 0, 62, 1, 6, 1, 0, 'Expensive Rares', 0, 0, 'default_3x3', '["catalog_rares_headline1",""]', '["Yet another rares page.","Click on the item you want for more information",""]', NULL, 0), + (123, 0, 124, 1, 6, 1, 0, 'Child Line', 0, 0, 'default_3x3', '["catalog_rares_headline1",""]', '["Yet another rares page.","Click on the item you want for more information",""]', NULL, 0), + (124, 0, -1, 12, 6, 0, 0, 'Advertisements', 6, 3, '', '[]', '[]', NULL, 0), + (125, 0, 124, 2, 6, 1, 0, 'Calippo', 0, 0, 'default_3x3', '["catalog_rares_headline1",""]', '["Yet another rares page.","Click on the item you want for more information",""]', NULL, 0), + (126, 0, 124, 2, 6, 1, 0, 'Habbo Mall', 0, 0, 'default_3x3', '["catalog_rares_headline1",""]', '["Yet another rares page.","Click on the item you want for more information",""]', NULL, 0), + (127, 0, 62, 2, 6, 1, 0, 'StrayPixels', 0, 0, 'default_3x3', '["catalog_rares_headline1",""]', '["Yet another rares page.","Click on the item you want for more information",""]', NULL, 0), + (128, 0, 62, 0, 6, 1, 0, 'Super Trophies', 0, 0, 'trophies', '["catalog_trophies_headline1",""]', '["Reward your friends, or yourself with one of our fabulous glittering array of bronze, silver and gold trophies.\r\nFirst choose the trophy model (click on the arrows to see all the different styles) and then the metal (click on the seal below the trop",""]', NULL, 0), + (132, 0, 62, 1, 6, 1, 0, 'Premium Rares', 0, 0, 'default_3x3', '["catalog_rares_headline1",""]', '["Yet another rares page.","Click on the item you want for more information",""]', NULL, 0), + (133, 0, 124, 2, 6, 1, 0, 'Mountain Dew', 0, 0, 'default_3x3', '["catalog_rares_headline1",""]', '["Yet another rares page.","Click on the item you want for more information",""]', NULL, 0), + (136, 0, 2, -10, 1, 1, 0, 'Easter', 0, 0, 'default_3x3', '["catalog_easter_headline1","catalog_easter_teaser1",""]', '["\'Egg\'cellent furni - Bouncing bunnies, fluffy chicks, choccy eggs... Yep, it\'s Easter!\\rCelebrate with something \'eggs\'tra special from our Easter range. But hurry - it\'s not here for long this year!","Click on the item you want for more information","\'"]', NULL, 0), + (142, 0, 62, 3, 6, 1, 0, 'Streets of Bobba', 0, 0, 'default_3x3', '["catalog_rares_headline1",""]', '["Yet another rares page.","Click on the item you want for more information",""]', NULL, 0); +/*!40000 ALTER TABLE `catalogue_pages` ENABLE KEYS */; + +-- Dumping structure for table havana.catalogue_sale_badges +CREATE TABLE IF NOT EXISTS `catalogue_sale_badges` ( + `sale_code` varchar(250) NOT NULL, + `badge_code` varchar(250) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- Dumping data for table havana.catalogue_sale_badges: ~0 rows (approximately) +DELETE FROM `catalogue_sale_badges`; +/*!40000 ALTER TABLE `catalogue_sale_badges` DISABLE KEYS */; +INSERT INTO `catalogue_sale_badges` (`sale_code`, `badge_code`) VALUES + ('garden_seed_cmp', 'EAS02'); +/*!40000 ALTER TABLE `catalogue_sale_badges` ENABLE KEYS */; + +-- Dumping structure for table havana.cms_alerts +CREATE TABLE IF NOT EXISTS `cms_alerts` ( + `id` bigint(11) NOT NULL AUTO_INCREMENT, + `user_id` int(11) NOT NULL, + `alert_type` enum('HC_EXPIRED','PRESENT','TUTOR_SCORE','CREDIT_DONATION') NOT NULL, + `message` text DEFAULT '', + `is_disabled` tinyint(11) NOT NULL DEFAULT 0, + `created_at` datetime DEFAULT current_timestamp(), + PRIMARY KEY (`id`), + KEY `user_id` (`user_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.cms_alerts: ~0 rows (approximately) +DELETE FROM `cms_alerts`; +/*!40000 ALTER TABLE `cms_alerts` DISABLE KEYS */; +/*!40000 ALTER TABLE `cms_alerts` ENABLE KEYS */; + +-- Dumping structure for table havana.cms_forums_read_replies +CREATE TABLE IF NOT EXISTS `cms_forums_read_replies` ( + `user_id` int(11) NOT NULL, + `reply_id` int(11) NOT NULL, + KEY `user_id` (`user_id`), + KEY `reply_id` (`reply_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.cms_forums_read_replies: ~0 rows (approximately) +DELETE FROM `cms_forums_read_replies`; +/*!40000 ALTER TABLE `cms_forums_read_replies` DISABLE KEYS */; +/*!40000 ALTER TABLE `cms_forums_read_replies` ENABLE KEYS */; + +-- Dumping structure for table havana.cms_forum_replies +CREATE TABLE IF NOT EXISTS `cms_forum_replies` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `thread_id` int(11) NOT NULL, + `message` text NOT NULL, + `poster_id` int(11) NOT NULL, + `is_edited` tinyint(1) NOT NULL DEFAULT 0, + `is_deleted` tinyint(1) NOT NULL DEFAULT 0, + `created_at` datetime NOT NULL DEFAULT current_timestamp(), + `modified_at` datetime NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), + PRIMARY KEY (`id`), + KEY `thread_id` (`thread_id`), + KEY `poster_id` (`poster_id`), + KEY `created_at` (`created_at`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.cms_forum_replies: ~0 rows (approximately) +DELETE FROM `cms_forum_replies`; +/*!40000 ALTER TABLE `cms_forum_replies` DISABLE KEYS */; +/*!40000 ALTER TABLE `cms_forum_replies` ENABLE KEYS */; + +-- Dumping structure for table havana.cms_forum_threads +CREATE TABLE IF NOT EXISTS `cms_forum_threads` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `topic_title` varchar(32) NOT NULL, + `poster_id` int(11) NOT NULL, + `is_open` int(1) NOT NULL DEFAULT 1, + `is_stickied` int(1) NOT NULL DEFAULT 0, + `views` int(11) NOT NULL DEFAULT 0, + `group_id` int(11) NOT NULL, + `created_at` datetime NOT NULL DEFAULT current_timestamp(), + `modified_at` datetime NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), + PRIMARY KEY (`id`), + KEY `group_id` (`group_id`), + KEY `poster_id` (`poster_id`), + KEY `created_at` (`created_at`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.cms_forum_threads: ~0 rows (approximately) +DELETE FROM `cms_forum_threads`; +/*!40000 ALTER TABLE `cms_forum_threads` DISABLE KEYS */; +/*!40000 ALTER TABLE `cms_forum_threads` ENABLE KEYS */; + +-- Dumping structure for table havana.cms_guestbook_entries +CREATE TABLE IF NOT EXISTS `cms_guestbook_entries` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `user_id` int(11) NOT NULL DEFAULT 0, + `home_id` int(11) NOT NULL DEFAULT 0, + `group_id` int(11) NOT NULL DEFAULT 0, + `message` longtext NOT NULL, + `created_at` datetime NOT NULL DEFAULT current_timestamp(), + KEY `id` (`id`), + KEY `group_id` (`group_id`), + KEY `user_id` (`user_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.cms_guestbook_entries: ~0 rows (approximately) +DELETE FROM `cms_guestbook_entries`; +/*!40000 ALTER TABLE `cms_guestbook_entries` DISABLE KEYS */; +/*!40000 ALTER TABLE `cms_guestbook_entries` ENABLE KEYS */; + +-- Dumping structure for table havana.cms_minimail +CREATE TABLE IF NOT EXISTS `cms_minimail` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `target_id` int(11) NOT NULL, + `sender_id` int(11) NOT NULL, + `to_id` int(11) NOT NULL, + `is_read` tinyint(1) NOT NULL DEFAULT 0, + `subject` varchar(100) NOT NULL DEFAULT '', + `message` text NOT NULL, + `date_sent` datetime NOT NULL DEFAULT current_timestamp(), + `conversation_id` int(11) NOT NULL DEFAULT 0, + `is_trash` tinyint(1) NOT NULL DEFAULT 0, + `is_deleted` tinyint(1) NOT NULL DEFAULT 0, + PRIMARY KEY (`id`), + KEY `sender_id` (`sender_id`), + KEY `to_id` (`to_id`), + KEY `conversation_id` (`conversation_id`), + KEY `is_trash` (`is_trash`), + KEY `is_deleted` (`is_deleted`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.cms_minimail: ~0 rows (approximately) +DELETE FROM `cms_minimail`; +/*!40000 ALTER TABLE `cms_minimail` DISABLE KEYS */; +/*!40000 ALTER TABLE `cms_minimail` ENABLE KEYS */; + +-- Dumping structure for table havana.cms_recommended +CREATE TABLE IF NOT EXISTS `cms_recommended` ( + `recommended_id` int(11) NOT NULL, + `type` enum('GROUP','ROOM') NOT NULL, + `is_staff_pick` tinyint(1) NOT NULL DEFAULT 0 +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.cms_recommended: ~0 rows (approximately) +DELETE FROM `cms_recommended`; +/*!40000 ALTER TABLE `cms_recommended` DISABLE KEYS */; +/*!40000 ALTER TABLE `cms_recommended` ENABLE KEYS */; + +-- Dumping structure for table havana.cms_stickers +CREATE TABLE IF NOT EXISTS `cms_stickers` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `user_id` int(11) NOT NULL, + `x` varchar(6) NOT NULL DEFAULT '0' COMMENT 'left', + `y` varchar(6) NOT NULL DEFAULT '0' COMMENT 'top', + `z` varchar(6) NOT NULL DEFAULT '0' COMMENT 'z-index', + `sticker_id` int(11) NOT NULL, + `skin_id` int(11) NOT NULL DEFAULT 0, + `group_id` int(11) NOT NULL DEFAULT -1, + `text` longtext NOT NULL DEFAULT '', + `is_placed` tinyint(1) NOT NULL DEFAULT 0, + `extra_data` varchar(11) NOT NULL DEFAULT '', + PRIMARY KEY (`id`), + KEY `user_id` (`user_id`), + KEY `group_id` (`group_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.cms_stickers: 0 rows +DELETE FROM `cms_stickers`; +/*!40000 ALTER TABLE `cms_stickers` DISABLE KEYS */; +/*!40000 ALTER TABLE `cms_stickers` ENABLE KEYS */; + +-- Dumping structure for table havana.cms_stickers_catalogue +CREATE TABLE IF NOT EXISTS `cms_stickers_catalogue` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` mediumtext NOT NULL, + `description` varchar(255) NOT NULL, + `type` varchar(1) NOT NULL, + `data` mediumtext NOT NULL, + `price` int(11) NOT NULL, + `amount` int(11) NOT NULL DEFAULT 1, + `category_id` int(11) NOT NULL, + `min_rank` int(11) NOT NULL DEFAULT 1, + `widget_type` int(11) DEFAULT 0, + PRIMARY KEY (`id`) +) ENGINE=MyISAM AUTO_INCREMENT=11338 DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.cms_stickers_catalogue: 1,488 rows +DELETE FROM `cms_stickers_catalogue`; +/*!40000 ALTER TABLE `cms_stickers_catalogue` DISABLE KEYS */; +INSERT INTO `cms_stickers_catalogue` (`id`, `name`, `description`, `type`, `data`, `price`, `amount`, `category_id`, `min_rank`, `widget_type`) VALUES + (2, 'Trax Sfx', 'desc', '1', 'trax_sfx', 1, 1, 102, 1, 0), + (3, 'Trax Disco', 'desc', '1', 'trax_disco', 1, 1, 102, 1, 0), + (4, 'Trax 8 bit', 'desc', '1', 'trax_8_bit', 1, 1, 102, 1, 0), + (5, 'Trax Electro', 'desc', '1', 'trax_electro', 1, 1, 102, 1, 0), + (6, 'Trax Reggae', 'desc', '1', 'trax_reggae', 1, 1, 102, 1, 0), + (7, 'Trax Ambient', 'desc', '1', 'trax_ambient', 1, 1, 102, 1, 0), + (8, 'Trax Bling', 'desc', '1', 'trax_bling', 1, 1, 102, 1, 0), + (9, 'Trax Heavy', 'desc', '1', 'trax_heavy', 1, 1, 102, 1, 0), + (10, 'Trax Latin', 'desc', '1', 'trax_latin', 1, 1, 102, 1, 0), + (11, 'Trax Rock', 'desc', '1', 'trax_rock', 1, 1, 102, 1, 0), + (12, 'Rain Background', 'desc', '4', 'bg_rain', 3, 1, 104, 1, 0), + (13, 'Notes', 'desc', '3', 'stickienote', 2, 5, 101, 1, 0), + (14, 'Serpentine Darkblue Background', 'desc', '4', 'bg_serpentine_darkblue', 3, 1, 104, 1, 0), + (15, 'Serpentine Darkred Background', 'desc', '4', 'bg_serpentine_darkred', 3, 1, 104, 1, 0), + (16, 'Serpentine Background', 'desc', '4', 'bg_serpentine_1', 3, 1, 104, 1, 0), + (17, 'Serpentine Background 2', 'desc', '4', 'bg_serpentine_2', 3, 1, 104, 1, 0), + (18, 'Denim Background', 'desc', '4', 'bg_denim', 3, 1, 104, 1, 0), + (19, 'Lace Background', 'desc', '4', 'bg_lace', 3, 1, 104, 1, 0), + (20, 'Stitched Background', 'desc', '4', 'bg_stitched', 3, 1, 104, 1, 0), + (21, 'Wood Background', 'desc', '4', 'bg_wood', 3, 1, 104, 1, 0), + (22, 'Cork Background', 'desc', '4', 'bg_cork', 3, 1, 104, 1, 0), + (23, 'Stone Background', 'desc', '4', 'bg_stone', 3, 1, 104, 1, 0), + (24, 'Pattern Bricks Background', 'desc', '4', 'bg_pattern_bricks', 3, 1, 104, 1, 0), + (25, 'Ruled Paper Background', 'desc', '4', 'bg_ruled_paper', 3, 1, 104, 1, 0), + (26, 'Grass Background', 'desc', '4', 'bg_grass', 3, 1, 104, 1, 0), + (28, 'Bubble Background', 'desc', '4', 'bg_bubble', 3, 1, 104, 1, 0), + (29, 'Pattern Bobbaskulls Background', 'desc', '4', 'bg_pattern_bobbaskulls1', 3, 1, 104, 1, 0), + (30, 'Pattern Space Background', 'desc', '4', 'bg_pattern_space', 3, 1, 104, 1, 0), + (31, 'Image Submarine Background', 'desc', '4', 'bg_image_submarine', 3, 1, 104, 1, 0), + (32, 'Metal Background 2', 'desc', '4', 'bg_metal2', 3, 1, 104, 1, 0), + (33, 'Broken Glass Background', 'desc', '4', 'bg_broken_glass', 3, 1, 104, 1, 0), + (34, 'Pattern Clouds Background', 'desc', '4', 'bg_pattern_clouds', 3, 1, 104, 1, 0), + (36, 'Pattern Floral Background 1', 'desc', '4', 'bg_pattern_floral_01', 3, 1, 104, 1, 0), + (37, 'A', 'desc', '1', 'a', 1, 1, 394, 1, 0), + (38, 'B', 'desc', '1', 'b', 1, 1, 394, 1, 0), + (39, 'C', 'desc', '1', 'c', 1, 1, 394, 1, 0), + (40, 'D', 'desc', '1', 'd', 1, 1, 394, 1, 0), + (41, 'E', 'desc', '1', 'e', 1, 1, 394, 1, 0), + (42, 'F', 'desc', '1', 'f', 1, 1, 394, 1, 0), + (43, 'G', 'desc', '1', 'g', 1, 1, 394, 1, 0), + (44, 'H', 'desc', '1', 'h', 1, 1, 394, 1, 0), + (45, 'I', 'desc', '1', 'i', 1, 1, 394, 1, 0), + (46, 'J', 'desc', '1', 'j', 1, 1, 394, 1, 0), + (47, 'K', 'desc', '1', 'k', 1, 1, 394, 1, 0), + (48, 'L', 'desc', '1', 'l', 1, 1, 394, 1, 0), + (49, 'M', 'desc', '1', 'm', 1, 1, 394, 1, 0), + (50, 'N', 'desc', '1', 'n', 1, 1, 394, 1, 0), + (51, 'O', 'desc', '1', 'o', 1, 1, 394, 1, 0), + (52, 'P', 'desc', '1', 'p', 1, 1, 394, 1, 0), + (53, 'Q', 'desc', '1', 'q', 1, 1, 394, 1, 0), + (54, 'R', 'desc', '1', 'r', 1, 1, 394, 1, 0), + (55, 'S', 'desc', '1', 's', 1, 1, 394, 1, 0), + (56, 'T', 'desc', '1', 't', 1, 1, 394, 1, 0), + (57, 'U', 'desc', '1', 'u', 1, 1, 394, 1, 0), + (58, 'V', 'desc', '1', 'v', 1, 1, 394, 1, 0), + (59, 'W', 'desc', '1', 'w', 1, 1, 394, 1, 0), + (60, 'X', 'desc', '1', 'x', 1, 1, 394, 1, 0), + (62, 'Z', 'desc', '1', 'z', 1, 1, 394, 1, 0), + (63, 'Bling Star', 'desc', '1', 'bling_star', 1, 1, 182, 1, 0), + (64, 'Bling a', 'desc', '1', 'bling_a', 1, 1, 182, 1, 0), + (65, 'Bling b', 'desc', '1', 'bling_b', 1, 1, 182, 1, 0), + (66, 'Bling c', 'desc', '1', 'bling_c', 1, 1, 182, 1, 0), + (67, 'Bling d', 'desc', '1', 'bling_d', 1, 1, 182, 1, 0), + (68, 'Bling e', 'desc', '1', 'bling_e', 1, 1, 182, 1, 0), + (69, 'Bling f', 'desc', '1', 'bling_f', 1, 1, 182, 1, 0), + (70, 'Bling g', 'desc', '1', 'bling_g', 1, 1, 182, 1, 0), + (71, 'Bling h', 'desc', '1', 'bling_h', 1, 1, 182, 1, 0), + (72, 'Bling i', 'desc', '1', 'bling_i', 1, 1, 182, 1, 0), + (73, 'Bling j', 'desc', '1', 'bling_j', 1, 1, 182, 1, 0), + (74, 'Bling k', 'desc', '1', 'bling_k', 1, 1, 182, 1, 0), + (75, 'Bling l', 'desc', '1', 'bling_l', 1, 1, 182, 1, 0), + (76, 'Bling m', 'desc', '1', 'bling_m', 1, 1, 182, 1, 0), + (77, 'Bling n', 'desc', '1', 'bling_n', 1, 1, 182, 1, 0), + (78, 'Bling o', 'desc', '1', 'bling_o', 1, 1, 182, 1, 0), + (79, 'Bling p', 'desc', '1', 'bling_p', 1, 1, 182, 1, 0), + (80, 'Bling q', 'desc', '1', 'bling_q', 1, 1, 182, 1, 0), + (81, 'Bling r', 'desc', '1', 'bling_r', 1, 1, 182, 1, 0), + (82, 'Bling s', 'desc', '1', 'bling_s', 1, 1, 182, 1, 0), + (83, 'Bling t', 'desc', '1', 'bling_t', 1, 1, 182, 1, 0), + (84, 'Bling u', 'desc', '1', 'bling_u', 1, 1, 182, 1, 0), + (85, 'Bling v', 'desc', '1', 'bling_v', 1, 1, 182, 1, 0), + (86, 'Bling w', 'desc', '1', 'bling_w', 1, 1, 182, 1, 0), + (87, 'Bling x', 'desc', '1', 'bling_x', 1, 1, 182, 1, 0), + (88, 'Bling y', 'desc', '1', 'bling_y', 1, 1, 182, 1, 0), + (89, 'Bling z', 'desc', '1', 'bling_z', 1, 1, 182, 1, 0), + (90, 'Bling Underscore', 'desc', '1', 'bling_underscore', 1, 1, 182, 1, 0), + (91, 'Bling Comma', 'desc', '1', 'bling_comma', 1, 1, 182, 1, 0), + (92, 'Bling Dot', 'desc', '1', 'bling_dot', 1, 1, 182, 1, 0), + (93, 'Bling Exclamation', 'desc', '1', 'bling_exclamation', 1, 1, 182, 1, 0), + (94, 'Bling Question', 'desc', '1', 'bling_question', 1, 1, 182, 1, 0), + (95, 'A with Circle', 'desc', '1', 'a_with_circle', 1, 1, 394, 1, 0), + (96, 'A with Dots', 'desc', '1', 'a_with_dots', 1, 1, 394, 1, 0), + (97, 'O with Dots', 'desc', '1', 'o_with_dots', 1, 1, 394, 1, 0), + (99, 'Acsent 1', 'desc', '1', 'acsent1', 1, 1, 394, 1, 0), + (100, 'Acsent 2', 'desc', '1', 'acsent2', 1, 1, 394, 1, 0), + (101, 'Underscore', 'desc', '1', 'underscore', 1, 1, 394, 1, 0), + (104, 'Chain Vertical', 'desc', '1', 'chain_vertical', 1, 1, 138, 1, 0), + (105, 'Ruler Horizontal', 'desc', '1', 'ruler_horizontal', 1, 1, 138, 1, 0), + (106, 'Ruler Vertical', 'desc', '1', 'ruler_vertical', 1, 1, 138, 1, 0), + (107, 'Vine', 'desc', '1', 'vine', 1, 1, 138, 1, 0), + (108, 'Vine 2', 'desc', '1', 'vine2', 1, 1, 138, 1, 0), + (109, 'Leafs 1', 'desc', '1', 'leafs1', 1, 1, 138, 1, 0), + (110, 'Leafs 2', 'desc', '1', 'leafs2', 1, 1, 138, 1, 0), + (111, 'Sticker Zipper V Tile', 'desc', '1', 'sticker_zipper_v_tile', 1, 1, 138, 1, 0), + (112, 'Sticker Zipper H Tile', 'desc', '1', 'sticker_zipper_h_tile', 1, 1, 138, 1, 0), + (113, 'Sticker Zipper H Normal Lock', 'desc', '1', 'sticker_zipper_h_normal_lock', 1, 1, 138, 1, 0), + (114, 'Sticker Zipper H Bobba Lock', 'desc', '1', 'sticker_zipper_h_bobba_lock', 1, 1, 138, 1, 0), + (115, 'Sticker Zipper H End', 'desc', '1', 'sticker_zipper_h_end', 1, 1, 138, 1, 0), + (116, 'Sticker Zipper V End', 'desc', '1', 'sticker_zipper_v_end', 1, 1, 138, 1, 0), + (117, 'Sticker Zipper V Bobba Lock', 'desc', '1', 'sticker_zipper_v_bobba_lock', 1, 1, 138, 1, 0), + (118, 'Sticker Zipper V Normal Lock', 'desc', '1', 'sticker_zipper_v_normal_lock', 1, 1, 138, 1, 0), + (119, 'Wormhand', 'desc', '1', 'wormhand', 5, 1, 488, 1, 0), + (121, 'Chewed Bubblegum', 'desc', '1', 'chewed_bubblegum', 1, 1, 130, 1, 0), + (122, 'Cactus', 'desc', '1', 'sticker_cactus_anim', 2, 1, 130, 1, 0), + (123, 'Sticker Spaceduck', 'desc', '1', 'sticker_spaceduck', 1, 1, 130, 1, 0), + (124, 'Sticker Moonpig', 'desc', '1', 'sticker_moonpig', 2, 1, 130, 1, 0), + (125, 'Swimming Fish', 'desc', '1', 'swimming_fish', 2, 1, 130, 1, 0), + (127, 'Wunder Frank', 'desc', '1', 'wunderfrank', 1, 1, 130, 1, 0), + (128, 'Sticker Submarine', 'desc', '1', 'sticker_submarine', 2, 1, 130, 1, 0), + (132, 'Sticker Heartbeat', 'desc', '1', 'sticker_heartbeat', 2, 1, 171, 1, 0), + (133, 'Sticker Catinabox', 'desc', '1', 'sticker_catinabox', 2, 1, 171, 1, 0), + (134, 'Bear', 'desc', '1', 'bear', 2, 1, 171, 1, 0), + (136, 'Evil Giant Bunny', 'desc', '1', 'evil_giant_bunny', 2, 1, 488, 1, 0), + (137, 'Zombie Pupu', 'desc', '1', 'zombiepupu', 2, 1, 488, 1, 0), + (138, 'Skeletor 1', 'desc', '1', 'skeletor_001', 2, 1, 488, 1, 0), + (139, 'Skull', 'desc', '1', 'skull', 2, 1, 488, 1, 0), + (140, 'Skull 2', 'desc', '1', 'skull2', 2, 1, 488, 1, 0), + (141, 'Scubacapsule Anim', 'desc', '1', 'scubacapsule_anim', 2, 1, 130, 1, 0), + (142, 'Bobbaskull', 'desc', '1', 'sticker_bobbaskull', 2, 1, 488, 1, 0), + (143, 'Sticker Flower', 'desc', '1', 'sticker_flower1', 3, 5, 444, 1, 0), + (144, 'Icecube Big', 'desc', '1', 'icecube_big', 3, 10, 444, 1, 0), + (145, 'Leafs 2', 'desc', '1', 'leafs2', 5, 7, 444, 1, 0), + (146, 'Vine 2', 'desc', '1', 'vine2', 3, 5, 444, 1, 0), + (147, 'Chain Horizontal', 'desc', '1', 'chain_horizontal', 3, 5, 444, 1, 0), + (148, 'Icecube Small', 'desc', '1', 'icecube_small', 3, 10, 444, 1, 0), + (149, 'Sticker Arrow Up', 'desc', '1', 'sticker_arrow_up', 2, 1, 270, 1, 0), + (150, 'Sticker Arrow Down', 'desc', '1', 'sticker_arrow_down', 2, 1, 270, 1, 0), + (151, 'Sticker Arrow Left', 'desc', '1', 'sticker_arrow_left', 2, 1, 270, 1, 0), + (152, 'Sticker Arrow Right', 'desc', '1', 'sticker_arrow_right', 2, 1, 270, 1, 0), + (153, 'Sticker Pointing Hand 1', 'desc', '1', 'sticker_pointing_hand_1', 2, 1, 270, 1, 0), + (154, 'Sticker Pointing Hand 2', 'desc', '1', 'sticker_pointing_hand_2', 2, 1, 270, 1, 0), + (155, 'Sticker Pointing Hand 3', 'desc', '1', 'sticker_pointing_hand_3', 2, 1, 270, 1, 0), + (156, 'Sticker Pointing Hand 4', 'desc', '1', 'sticker_pointing_hand_4', 2, 1, 270, 1, 0), + (157, 'Nail 2', 'desc', '1', 'nail2', 2, 1, 270, 1, 0), + (158, 'Nail 3', 'desc', '1', 'nail3', 2, 1, 270, 1, 0), + (159, 'Needle 1', 'desc', '1', 'needle_1', 1, 1, 270, 1, 0), + (160, 'Needle 2', 'desc', '1', 'needle_2', 1, 1, 270, 1, 0), + (161, 'Needle 3', 'desc', '1', 'needle_3', 1, 1, 270, 1, 0), + (162, 'Needle 4', 'desc', '1', 'needle_4', 1, 1, 270, 1, 0), + (163, 'Needle 5', 'desc', '1', 'needle_5', 1, 1, 270, 1, 0), + (164, 'Grass Meadow', 'desc', '1', 'grass', 2, 1, 442, 1, 0), + (165, 'Sticker Flower', 'desc', '1', 'sticker_flower1', 1, 1, 442, 1, 0), + (166, 'Sticker Flower Big Yellow', 'desc', '1', 'sticker_flower_big_yellow', 1, 1, 442, 1, 0), + (167, 'Sticker Flower Pink', 'desc', '1', 'sticker_flower_pink', 1, 1, 442, 1, 0), + (169, 'I love Coffee', 'desc', '1', 'i_love_coffee', 1, 1, 443, 1, 0), + (170, 'Sticker Effect Bam', 'desc', '1', 'sticker_effect_bam', 1, 1, 443, 1, 0), + (171, 'Sticker Effect Burp', 'desc', '1', 'sticker_effect_burp', 1, 1, 443, 1, 0), + (172, 'Sticker Effect Woosh', 'desc', '1', 'sticker_effect_woosh', 1, 1, 443, 1, 0), + (173, 'Sticker Effect Zap', 'desc', '1', 'sticker_effect_zap', 1, 1, 443, 1, 0), + (174, 'Sticker Effect Whoosh 2', 'desc', '1', 'sticker_effect_whoosh2', 1, 1, 443, 1, 0), + (175, 'Icecube Small', 'desc', '1', 'icecube_small', 1, 1, 445, 1, 0), + (176, 'Snowball Machine', 'desc', '1', 'ss_snowballmachine', 1, 1, 445, 1, 0), + (177, 'Icecube Big', 'desc', '1', 'icecube_big', 1, 1, 445, 1, 0), + (178, 'Bootsitjalapaset Red', 'desc', '1', 'bootsitjalapaset_red', 2, 1, 445, 1, 0), + (179, 'Boots and Gloves', 'desc', '1', 'ss_bootsitjalapaset_blue', 2, 1, 445, 1, 0), + (180, 'Red SnowStorm Costume', 'desc', '1', 'ss_costume_red', 2, 1, 445, 1, 0), + (181, 'Snowstorm Blue Costume', 'desc', '1', 'ss_costume_blue', 2, 1, 445, 1, 0), + (182, 'Splash!', 'desc', '1', 'ss_hits_by_snowball', 1, 1, 445, 1, 0), + (183, 'SnowStorm Duck!', 'desc', '1', 'extra_ss_duck_left', 1, 1, 445, 1, 0), + (184, 'Snowtree', 'desc', '1', 'ss_snowtree', 2, 1, 445, 1, 0), + (185, 'SnowStorm Duck!', 'desc', '1', 'extra_ss_duck_right', 1, 1, 445, 1, 0), + (186, 'Snowman', 'desc', '1', 'ss_snowman', 2, 1, 445, 1, 0), + (187, 'Lumihiutale 2', 'desc', '1', 'ss_snowflake2', 1, 1, 445, 1, 0), + (188, 'Snow Queen', 'desc', '1', 'ss_snowqueen', 2, 1, 445, 1, 0), + (189, 'Battle 1', 'desc', '1', 'battle1', 1, 1, 446, 1, 0), + (190, 'Battle 3', 'desc', '1', 'battle3', 1, 1, 446, 1, 0), + (192, 'Eye Left', 'desc', '1', 'eyeleft', 2, 1, 488, 1, 0), + (193, 'Eye Right', 'desc', '1', 'eyeright', 2, 1, 488, 1, 0), + (194, 'Angel Wings', 'desc', '1', 'angelwings_anim', 3, 1, 459, 1, 0), + (195, 'Sticker Gurubeard Gray', 'desc', '1', 'sticker_gurubeard_gray', 1, 1, 459, 1, 0), + (196, 'Sticker Gurubeard Brown', 'desc', '1', 'sticker_gurubeard_brown', 1, 1, 459, 1, 0), + (197, 'Supernerd', 'desc', '1', 'sticker_glasses_supernerd', 1, 1, 459, 1, 0), + (198, 'Goofy Glasses', 'desc', '1', 'sticker_glasses_elton', 1, 1, 459, 1, 0), + (199, 'Blue Eyes', 'desc', '1', 'sticker_eyes_blue', 1, 1, 459, 1, 0), + (200, 'Sticker Eye Anim', 'desc', '1', 'sticker_eye_anim', 2, 1, 459, 1, 0), + (201, 'Sticker Eye Evil Anim', 'desc', '1', 'sticker_eye_evil_anim', 2, 1, 459, 1, 0), + (203, 'Star', 'desc', '1', 'star', 1, 1, 130, 1, 0), + (204, 'Sticker Pencil', 'desc', '1', 'sticker_pencil', 1, 1, 130, 1, 0), + (206, 'Sticker Pencil 2', 'desc', '1', 'sticker_pencil_2', 1, 1, 130, 1, 0), + (208, 'Sticker Prankster', 'desc', '1', 'sticker_prankster', 3, 1, 130, 1, 0), + (210, 'Sticker Romantic', 'desc', '1', 'sticker_romantic', 3, 1, 130, 1, 0), + (212, 'Lightbulb', 'desc', '1', 'lightbulb', 2, 1, 130, 1, 0), + (213, 'Bullet 1', 'desc', '1', 'bullet1', 2, 1, 130, 1, 0), + (220, 'Paper Clip 1', 'desc', '1', 'paper_clip_1', 1, 1, 270, 1, 0), + (221, 'Paper Clip 2', 'desc', '1', 'paper_clip_2', 1, 1, 270, 1, 0), + (222, 'Paper Clip 3', 'desc', '1', 'paper_clip_3', 1, 1, 270, 1, 0), + (231, 'Plaster', 'desc', '1', 'plaster', 1, 1, 130, 1, 0), + (232, 'Plaster 2', 'desc', '1', 'plaster2', 1, 1, 130, 1, 0), + (235, 'Parrot', 'desc', '1', 'parrot', 1, 1, 130, 1, 0), + (237, 'Burger', 'desc', '1', 'burger', 1, 1, 130, 1, 0), + (246, 'Pattern Floral Background 2', 'desc', '4', 'bg_pattern_floral_02', 2, 1, 104, 1, 0), + (247, 'Pattern Floral Background 3', 'desc', '4', 'bg_pattern_floral_03', 2, 1, 104, 1, 0), + (248, 'Pattern Cars Background', 'desc', '4', 'bg_pattern_cars', 2, 1, 104, 1, 0), + (250, 'Pattern Plasto Background', 'desc', '4', 'bg_pattern_plasto', 2, 1, 104, 1, 0), + (251, 'Pattern Tinyroom Background', 'desc', '4', 'bg_pattern_tinyroom', 2, 1, 104, 1, 0), + (252, 'Pattern Hearts Background', 'desc', '4', 'bg_pattern_hearts', 2, 1, 104, 1, 0), + (253, 'Pattern Abstract Background', 'desc', '4', 'bg_pattern_abstract1', 2, 1, 104, 1, 0), + (254, 'Bathroom Tile Background', 'desc', '4', 'bg_bathroom_tile', 2, 1, 104, 1, 0), + (255, 'Pattern Fish Background', 'desc', '4', 'bg_pattern_fish', 2, 1, 104, 1, 0), + (256, 'Pattern Deepred Background', 'desc', '4', 'bg_pattern_deepred', 2, 1, 104, 1, 0), + (257, 'Colour 02 Background', 'desc', '4', 'bg_colour_02', 2, 1, 104, 1, 0), + (258, 'Colour 03 Background', 'desc', '4', 'bg_colour_03', 2, 1, 104, 1, 0), + (259, 'Colour 04 Background', 'desc', '4', 'bg_colour_04', 2, 1, 104, 1, 0), + (260, 'Colour 05 Background', 'desc', '4', 'bg_colour_05', 2, 1, 104, 1, 0), + (261, 'Colour 06 Background', 'desc', '4', 'bg_colour_06', 2, 1, 104, 1, 0), + (262, 'Colour 07 Background', 'desc', '4', 'bg_colour_07', 2, 1, 104, 1, 0), + (263, 'Colour 08 Background', 'desc', '4', 'bg_colour_08', 2, 1, 104, 1, 0), + (264, 'Colour 09 Background', 'desc', '4', 'bg_colour_09', 2, 1, 104, 1, 0), + (265, 'Colour 10 Background', 'desc', '4', 'bg_colour_10', 2, 1, 104, 1, 0), + (266, 'Colour 11 Background', 'desc', '4', 'bg_colour_11', 2, 1, 104, 1, 0), + (267, 'Colour 12 Background', 'desc', '4', 'bg_colour_12', 2, 1, 104, 1, 0), + (268, 'Colour 13 Background', 'desc', '4', 'bg_colour_13', 2, 1, 104, 1, 0), + (269, 'Colour 14 Background', 'desc', '4', 'bg_colour_14', 2, 1, 104, 1, 0), + (270, 'Colour 15 Background', 'desc', '4', 'bg_colour_15', 2, 1, 104, 1, 0), + (271, 'Colour 17 Background', 'desc', '4', 'bg_colour_17', 2, 1, 104, 1, 0), + (272, 'Tonga Background', 'desc', '4', 'bg_tonga', 2, 1, 104, 1, 0), + (2591, 'Happy net', 'desc', '4', 'back_happyhnet', 2, 1, 104, 1, 0), + (276, 'Themepark Background 1', 'desc', '4', 'themepark_bg_01', 0, 1, 104, 1, 0), + (277, 'Themepark Background 2', 'desc', '4', 'themepark_bg_02', 0, 1, 104, 1, 0), + (283, 'Penelope', 'desc', '4', 'penelope', 0, 1, 104, 1, 0), + (299, 'Infobus Yellow Background', 'desc', '4', 'bg_infobus_yellow', 0, 1, 104, 1, 0), + (300, 'Infobus White Background', 'desc', '4', 'bg_infobus_white', 0, 1, 104, 1, 0), + (301, 'Infobus Blue Background', 'desc', '4', 'bg_infobus_blue', 0, 1, 104, 1, 0), + (303, 'Grunge Background', 'desc', '4', 'grungewall', 0, 1, 104, 1, 0), + (1001, 'OB Clubber', 'desc', '1', 'ob_clubber_146x146', 2, 1, 449, 1, 0), + (1002, 'OB Devil', 'desc', '1', 'ob_devil_146x146', 2, 1, 449, 1, 0), + (1003, 'OB Doctor', 'desc', '1', 'ob_doctor_146x146', 2, 1, 449, 1, 0), + (1004, 'OB Fairy', 'desc', '1', 'ob_fairy_146x146', 2, 1, 449, 1, 0), + (1005, 'OB Jetsetter', 'desc', '1', 'ob_jetsetter_146x146', 2, 1, 449, 1, 0), + (1007, 'OB Shopaholic', 'desc', '1', 'ob_shopaholic_146x146', 2, 1, 449, 1, 0), + (1008, 'OB Sport', 'desc', '1', 'ob_sporty_146x146', 2, 1, 449, 1, 0), + (1011, 'Sticker Themepark', 'desc', '1', '27224_sticker_themepark_001', 2, 1, 130, 1, 0), + (1017, 'Acento', 'desc', '1', 'acento', 2, 1, 394, 1, 0), + (1028, 'Ad Cats', 'desc', '1', 'adcats', 2, 1, 451, 1, 0), + (1029, 'Ad Dogs', 'desc', '1', 'addogs', 2, 1, 451, 1, 0), + (1030, 'Ad Holiday', 'desc', '1', 'adholiday', 2, 1, 451, 1, 0), + (1032, 'Ad Party', 'desc', '1', 'adparty', 2, 1, 451, 1, 0), + (1033, 'Ad Skating', 'desc', '1', 'adskating', 2, 1, 451, 1, 0), + (1034, 'Agudo', 'desc', '1', 'agudo', 2, 1, 394, 1, 0), + (1035, 'Alhambra Sticker', 'desc', '1', 'alhambra_sticker', 2, 1, 452, 1, 0), + (1036, 'Alhambra Wallsticker', 'desc', '1', 'alhambra_wallsticker', 2, 1, 452, 1, 0), + (1037, 'Alhambra Logo', 'desc', '1', 'alhambralogo', 2, 1, 452, 1, 0), + (1039, 'Ametrin', 'desc', '1', 'ametrin', 2, 1, 453, 1, 0), + (1040, 'Angel', 'desc', '1', 'angel_146x146', 2, 1, 449, 1, 0), + (1043, 'Anim Appart 732', 'desc', '1', 'anim_appart_732', 2, 1, 454, 1, 0), + (1044, 'Anim Boule Cristal', 'desc', '1', 'anim_boule_cristal', 2, 1, 454, 1, 0), + (1045, 'Anim Brasero', 'desc', '1', 'anim_brasero', 2, 1, 454, 1, 0), + (1046, 'Anim Cook', 'desc', '1', 'anim_cook', 2, 1, 453, 1, 0), + (1047, 'Anim Elvis', 'desc', '1', 'anim_elvis', 2, 1, 453, 1, 0), + (1048, 'Anim Enseigne', 'desc', '1', 'anim_enseigne', 2, 1, 454, 1, 0), + (1049, 'Anim Hockey', 'desc', '1', 'anim_hockey', 2, 1, 491, 1, 0), + (1051, 'Anim Oeil', 'desc', '1', 'anim_oeil', 2, 1, 454, 1, 0), + (1052, 'Anim Ventilo', 'desc', '1', 'anim_ventilo', 2, 1, 454, 1, 0), + (1053, 'Anim Viking Hole', 'desc', '1', 'anim_viking_hole', 2, 1, 453, 1, 0), + (1054, 'Anti Eco', 'desc', '1', 'anti_eco', 2, 1, 130, 1, 0), + (1057, 'Argentina', 'desc', '1', 'argentina', 2, 1, 456, 1, 0), + (1058, 'Asterisco 1', 'desc', '1', 'asterisco1', 2, 1, 394, 1, 0), + (1059, 'AU 3rd Bday 1', 'desc', '1', 'au_3rdbday_01', 2, 1, 130, 1, 0), + (1060, 'AU 3rd Bday 2', 'desc', '1', 'au_3rdbday_02', 2, 1, 130, 1, 0), + (1061, 'AU 3rd Bday 3', 'desc', '1', 'au_3rdbday_03', 2, 1, 130, 1, 0), + (1062, 'AU Greengold', 'desc', '1', 'au_greengold', 2, 1, 451, 1, 0), + (1063, 'AU Lifesaver', 'desc', '1', 'au_lifesaver', 2, 1, 130, 1, 0), + (1064, 'AU Surfing', 'desc', '1', 'au_surfing', 2, 1, 451, 1, 0), + (1067, 'Ballsma Honey', 'desc', '1', 'ballsmahoney', 2, 1, 453, 1, 0), + (1068, 'Baltasar', 'desc', '1', 'baltasar', 2, 1, 453, 1, 0), + (1069, 'Banks Bobby', 'desc', '1', 'banksbobby', 2, 1, 457, 1, 0), + (1070, 'Banks Can', 'desc', '1', 'bankscan', 2, 1, 457, 1, 0), + (1071, 'Banks Door', 'desc', '1', 'banksdoor', 2, 1, 457, 1, 0), + (1072, 'Banks Heater', 'desc', '1', 'banksheater', 2, 1, 457, 1, 0), + (1073, 'Barbequeset', 'desc', '1', 'barbequeset', 2, 1, 458, 1, 0), + (1074, 'Barra', 'desc', '1', 'barra', 2, 1, 394, 1, 0), + (1076, 'Batista', 'desc', '1', 'batista', 2, 1, 460, 1, 0), + (1079, 'Beachbunny Beachball', 'desc', '1', 'beachbunny_beachball', 2, 1, 461, 1, 0), + (1080, 'Beachbunny Beachball Bouncing', 'desc', '1', 'beachbunny_beachball_bouncing', 2, 1, 461, 1, 0), + (1081, 'Beachbunny Bmovie Poster', 'desc', '1', 'beachbunny_bmovieposter', 2, 1, 461, 1, 0), + (1082, 'Beachbunny Bunny Suit', 'desc', '1', 'beachbunny_bunny_suit', 2, 1, 461, 1, 0), + (1083, 'Beachbunny Peep', 'desc', '1', 'beachbunny_peep', 2, 1, 461, 1, 0), + (1084, 'Beachbunny Roaster Bunny', 'desc', '1', 'beachbunny_roaster_bunny', 2, 1, 461, 1, 0), + (1085, 'Beachgirl', 'desc', '1', 'beachgirl_146x146', 2, 1, 449, 1, 0), + (1087, 'Bellydancer', 'desc', '1', 'bellydancer', 2, 1, 452, 1, 0), + (1088, 'Beth Phoenix', 'desc', '1', 'bethphoenix', 2, 1, 460, 1, 0), + (1089, 'Beth Phoenix Skinny', 'desc', '1', 'bethphoenixskinny', 2, 1, 460, 1, 0), + (1092, 'Big Daddy V', 'desc', '1', 'bigdaddyv', 2, 1, 460, 1, 0), + (1093, 'Big Show', 'desc', '1', 'bigshow', 2, 1, 460, 1, 0), + (1094, 'Billy Graham', 'desc', '1', 'billygraham', 2, 1, 460, 1, 0), + (1095, 'Bird Suit', 'desc', '1', 'bird_suit', 2, 1, 462, 1, 0), + (1129, 'Bling Bling Stars', 'desc', '1', 'blingblingstars', 2, 1, 479, 1, 0), + (1130, 'Bling Hearts', 'desc', '1', 'blinghearts', 2, 1, 479, 1, 0), + (1132, 'Blue Hockey Stick', 'desc', '1', 'bluehockeystick', 2, 1, 491, 1, 0), + (1133, 'Blue Starfish', 'desc', '1', 'bluestarfish', 2, 1, 130, 1, 0), + (1136, 'Boborton', 'desc', '1', 'boborton', 2, 1, 460, 1, 0), + (1137, 'Bonbon Duck', 'desc', '1', 'bonbon_duck_146x146', 2, 1, 470, 1, 0), + (1138, 'Bonbon Mouse', 'desc', '1', 'bonbon_mouse_146x146', 2, 1, 470, 1, 0), + (1139, 'Bonbon Rat', 'desc', '1', 'bonbon_rat_146x146', 2, 1, 470, 1, 0), + (1140, 'Boogeyman', 'desc', '1', 'boogeyman', 2, 1, 460, 1, 0), + (1144, 'Bowser Sticker v1', 'desc', '1', 'bowser_sticker_v1', 2, 1, 465, 1, 0), + (1145, 'Bozzanova', 'desc', '1', 'bozzanova', 2, 1, 453, 1, 0), + (1146, 'BRA Football Guest 2', 'desc', '1', 'bra_football_guest2', 2, 1, 456, 1, 0), + (1147, 'Bratz Featured Clique', 'desc', '1', 'bratz_featuredclique', 2, 1, 470, 1, 0), + (1148, 'Brian Kendrick', 'desc', '1', 'briankendrick', 2, 1, 460, 1, 0), + (1149, 'British Legion', 'desc', '1', 'britishlegion', 2, 1, 130, 1, 0), + (1150, 'Britney', 'desc', '1', 'britney', 2, 1, 130, 1, 0), + (1153, 'Bullybuster', 'desc', '1', 'bullybuster', 2, 1, 130, 1, 0), + (1156, 'Businesswoman', 'desc', '1', 'businesswoman_146x146', 2, 1, 449, 1, 0), + (1157, 'Butterfly', 'desc', '1', 'butterfly_01', 2, 1, 462, 1, 0), + (1159, 'CA Hockeygoalie 2', 'desc', '1', 'ca_hockeygoalie2', 2, 1, 491, 1, 0), + (1160, 'Camel', 'desc', '1', 'camel', 2, 1, 130, 1, 0), + (1162, 'Candice Michelle', 'desc', '1', 'candicemichelle', 2, 1, 460, 1, 0), + (1163, 'Candycorn', 'desc', '1', 'candycorn', 2, 1, 130, 1, 0), + (1164, 'Carlito', 'desc', '1', 'carlito', 2, 1, 460, 1, 0), + (1165, 'Cassette 1', 'desc', '1', 'cassette1', 2, 1, 130, 1, 0), + (1166, 'Cassette 2', 'desc', '1', 'cassette2', 2, 1, 130, 1, 0), + (1167, 'Cassette 3', 'desc', '1', 'cassette3', 2, 1, 130, 1, 0), + (1168, 'Cassette 4', 'desc', '1', 'cassette4', 2, 1, 130, 1, 0), + (1170, 'Celeb Ticket Veronicas', 'desc', '1', 'celebticket_veronicas', 2, 1, 470, 1, 0), + (1171, 'Cena', 'desc', '1', 'cena', 2, 1, 460, 1, 0), + (1174, 'Cheerleader', 'desc', '1', 'cheerleader_146x146', 2, 1, 449, 1, 0), + (1175, 'Cheese Badge', 'desc', '1', 'cheese_badge', 2, 1, 451, 1, 0), + (1177, 'Cheese Suit Sticker', 'desc', '1', 'cheese_suit_sticker', 2, 1, 459, 1, 0), + (1178, 'Cheshirecat', 'desc', '1', 'cheshirecat', 2, 1, 453, 1, 0), + (1180, 'Chile', 'desc', '1', 'chile', 2, 1, 456, 1, 0), + (1181, 'Chocolates', 'desc', '1', 'chocolates', 2, 1, 130, 1, 0), + (1183, 'Chris Jericho', 'desc', '1', 'chrisjericho', 2, 1, 460, 1, 0), + (1184, 'Chuck Palumbo', 'desc', '1', 'chuckpalumbo', 2, 1, 460, 1, 0), + (1185, 'Clothes line', 'desc', '1', 'clothesline', 2, 1, 130, 1, 0), + (1187, 'CM Punk', 'desc', '1', 'cmpunk', 2, 1, 460, 1, 0), + (1188, 'CN Teleskull', 'desc', '1', 'cn_teleskull', 2, 1, 488, 1, 0), + (1190, 'CNY Dragon Body L', 'desc', '1', 'cny_dragon_body_l', 2, 1, 466, 1, 0), + (1191, 'CNY Dragon Body R', 'desc', '1', 'cny_dragon_body_r', 2, 1, 466, 1, 0), + (1192, 'CNY Dragon Head L', 'desc', '1', 'cny_dragon_head_l', 2, 1, 466, 1, 0), + (1193, 'CNY Dragon Head R', 'desc', '1', 'cny_dragon_head_r', 2, 1, 466, 1, 0), + (1195, 'CNY Kunfu Dude', 'desc', '1', 'cny_kunfu_dude', 2, 1, 466, 1, 0), + (1197, 'CNY Kunfu Girl', 'desc', '1', 'cny_kungfu_girl', 2, 1, 466, 1, 0), + (1198, 'Colombia', 'desc', '1', 'colombia', 2, 1, 456, 1, 0), + (1199, 'Comma', 'desc', '1', 'comma', 2, 1, 394, 1, 0), + (1202, 'Crase', 'desc', '1', 'crase', 2, 1, 394, 1, 0), + (1206, 'Curt Hawkins', 'desc', '1', 'curthawkins', 2, 1, 460, 1, 0), + (1208, 'Dag of Habbo Trophy', 'desc', '1', 'dagofhabbo_trophy', 2, 1, 130, 1, 0), + (1209, 'DagorNot', 'desc', '1', 'dagornot', 2, 1, 130, 1, 0), + (1210, 'DE 4th Bday', 'desc', '1', 'de_bday_4', 2, 1, 130, 1, 0), + (1214, 'Deal easter 6', 'desc', '1', 'deal_eas07_6', 2, 1, 462, 1, 0), + (1215, 'Deal easter 7', 'desc', '1', 'deal_eas07_7', 2, 1, 462, 1, 0), + (1216, 'Deal easter 8', 'desc', '1', 'deal_eas07_8', 2, 1, 462, 1, 0), + (1217, 'Deal goth border Horizontale', 'desc', '1', 'deal_goth_border_hor', 2, 1, 488, 1, 0), + (1218, 'deal goth border Verticale', 'desc', '1', 'deal_goth_border_ver', 2, 1, 488, 1, 0), + (1219, 'DH Smith', 'desc', '1', 'dhsmith', 2, 1, 460, 1, 0), + (1220, 'Dia de Internetsticker 2008', 'desc', '1', 'diadeinternetsticker2008_001', 2, 1, 470, 1, 0), + (1221, 'Diamond Reward', 'desc', '1', 'diamond_reward', 2, 1, 479, 1, 0), + (1222, 'Dim Sims', 'desc', '1', 'dimsims', 2, 1, 130, 1, 0), + (1223, 'DK Bobbacurse 2', 'desc', '1', 'dk_bobbacurse_2', 2, 1, 130, 1, 0), + (1224, 'Doelee', 'desc', '1', 'doelee', 2, 1, 453, 1, 0), + (1225, 'Donk', 'desc', '1', 'donk', 2, 1, 453, 1, 0), + (1226, 'Dot', 'desc', '1', 'dot', 2, 1, 394, 1, 0), + (1227, 'Dudesons', 'desc', '1', 'dudesons', 2, 1, 470, 1, 0), + (1228, 'Durian', 'desc', '1', 'durian', 2, 1, 130, 1, 0), + (1231, 'Easter Bird', 'desc', '1', 'easter_bird', 2, 1, 462, 1, 0), + (1236, 'Easter Broomstick_001', 'desc', '1', 'easter_broomstick_001', 2, 1, 462, 1, 0), + (1238, 'Easter Bunnymoped', 'desc', '1', 'easter_bunnymoped', 2, 1, 462, 1, 0), + (1240, 'Easter Carrot_rocket', 'desc', '1', 'easter_carrot_rocket', 2, 1, 462, 1, 0), + (1251, 'Easter Pointyhat', 'desc', '1', 'easter_pointyhat', 2, 1, 462, 1, 0), + (1253, 'Easter Rabbit_in_hole', 'desc', '1', 'easter_rabbit_in_hole', 2, 1, 462, 1, 0), + (1255, 'Easter Egg Costume', 'desc', '1', 'easteregg_costume', 2, 1, 462, 1, 0), + (1258, 'Edge', 'desc', '1', 'edge', 2, 1, 460, 1, 0), + (1259, 'Edito Fisherman Bait', 'desc', '1', 'edito_fisherman_bait', 2, 1, 130, 1, 0), + (1260, 'Edito Logo', 'desc', '1', 'edito_logo', 2, 1, 130, 1, 0), + (1263, 'Eggs', 'desc', '1', 'eggs', 2, 1, 488, 1, 0), + (1264, 'Elegant Bling', 'desc', '1', 'elegant_bling', 2, 1, 479, 1, 0), + (1265, 'Elijah Burke', 'desc', '1', 'elijahburke', 2, 1, 460, 1, 0), + (1270, 'Exclamation', 'desc', '1', 'exclamation', 2, 1, 394, 1, 0), + (1271, 'Executive Cheappen', 'desc', '1', 'exe_sticker_cheappen', 2, 1, 130, 1, 0), + (1272, 'Executive Luxurypen', 'desc', '1', 'exe_sticker_luxurypen', 2, 1, 130, 1, 0), + (1276, 'Extreme Dudesons', 'desc', '1', 'extreme_dudesons', 2, 1, 470, 1, 0), + (1280, 'Fantastic Four Logo', 'desc', '1', 'fantasticfourlogo', 2, 1, 470, 1, 0), + (1281, 'Featuredgroup', 'desc', '1', 'featuredgroup', 2, 1, 130, 1, 0), + (1283, 'Featuredgroup Sticker', 'desc', '1', 'featuredgroup_sticker', 2, 1, 130, 1, 0), + (1284, 'Felix 1', 'desc', '1', 'felix01', 2, 1, 470, 1, 0), + (1285, 'Felix 2', 'desc', '1', 'felix02', 2, 1, 470, 1, 0), + (1286, 'Felix 3', 'desc', '1', 'felix03b', 2, 1, 470, 1, 0), + (1289, 'Festus', 'desc', '1', 'festus', 2, 1, 460, 1, 0), + (1291, 'FI Golden Snake', 'desc', '1', 'fi_golden_snake', 2, 1, 130, 1, 0), + (1292, 'FI Koirakisu 2', 'desc', '1', 'fi_koirakisu2', 2, 1, 453, 1, 0), + (1293, 'FI Mino', 'desc', '1', 'fi_mino', 2, 1, 453, 1, 0), + (1294, 'FI Posti Box', 'desc', '1', 'fi_posti_box', 2, 1, 453, 1, 0), + (1295, 'FI Posti Girl', 'desc', '1', 'fi_posti_girl', 2, 1, 453, 1, 0), + (1297, 'Fieldberries', 'desc', '1', 'fieldberries', 2, 1, 470, 1, 0), + (1298, 'Fiesta Chica Tampax', 'desc', '1', 'fiesta_chica_tampax', 2, 1, 470, 1, 0), + (1299, 'Fiesta Minifalda 1', 'desc', '1', 'fiesta_minifalda_1', 2, 1, 470, 1, 0), + (1300, 'Fiesta Minifalda 2', 'desc', '1', 'fiesta_minifalda_2', 2, 1, 470, 1, 0), + (1301, 'Fiesta Welcome', 'desc', '1', 'fiesta_welcome', 2, 1, 470, 1, 0), + (1302, 'Filmstrip Corner Botleft', 'desc', '1', 'filmstrip_corner_botleft', 2, 1, 467, 1, 0), + (1303, 'Filmstrip Corner Botright', 'desc', '1', 'filmstrip_corner_botright', 2, 1, 467, 1, 0), + (1304, 'Filmstrip Corner Topleft', 'desc', '1', 'filmstrip_corner_topleft', 2, 1, 467, 1, 0), + (1305, 'Filmstrip Corner Topright', 'desc', '1', 'filmstrip_corner_topright', 2, 1, 467, 1, 0), + (1306, 'Filmstrip Horiz', 'desc', '1', 'filmstrip_horiz', 2, 1, 467, 1, 0), + (1307, 'Filmstrip Vert', 'desc', '1', 'filmstrip_vert', 2, 1, 467, 1, 0), + (1308, 'Finger Push', 'desc', '1', 'finger_push', 2, 1, 270, 1, 0), + (1309, 'Fish', 'desc', '1', 'fish', 2, 1, 130, 1, 0), + (1311, 'Flower 1', 'desc', '1', 'flower1png', 2, 1, 470, 1, 0), + (1312, 'Xmas SnowCone', 'desc', '1', 'Xmas_Snowcone_costume', 2, 1, 445, 1, 0), + (1313, 'Football', 'desc', '1', 'football', 2, 1, 456, 1, 0), + (1314, 'Free Hugs', 'desc', '1', 'free_hugs', 2, 1, 453, 1, 0), + (1317, 'Funaki', 'desc', '1', 'funaki', 2, 1, 460, 1, 0), + (1318, 'FWRK Blue', 'desc', '1', 'fwrk_blue', 2, 1, 468, 1, 0), + (1319, 'FWRK Pink', 'desc', '1', 'fwrk_pink', 2, 1, 468, 1, 0), + (1320, 'FWRK Yellow', 'desc', '1', 'fwrk_yellow', 2, 1, 468, 1, 0), + (1324, 'Gaspar', 'desc', '1', 'gaspar', 2, 1, 453, 1, 0), + (1327, 'Gaursticker 3', 'desc', '1', 'gaursticker3', 2, 1, 470, 1, 0), + (1330, 'Girlfriend Blue', 'desc', '1', 'gf_hotornot_blue', 2, 1, 470, 1, 0), + (1331, 'Girlfriend Pink', 'desc', '1', 'gf_hotornot_pink', 2, 1, 470, 1, 0), + (1332, 'Global World Sticker', 'desc', '1', 'globalw_sticker', 2, 1, 445, 1, 0), + (1337, 'Gorilla Hand 1', 'desc', '1', 'gorillahand1', 2, 1, 130, 1, 0), + (1338, 'Gorilla Hand 2', 'desc', '1', 'gorillahand2', 2, 1, 130, 1, 0), + (1344, 'Gothic Draculacape', 'desc', '1', 'gothic_draculacape', 2, 1, 488, 1, 0), + (1346, 'Gothic Scienceplatform', 'desc', '1', 'gothic_scienceplatform', 2, 1, 488, 1, 0), + (1352, 'Grave Sticker', 'desc', '1', 'gravesticker', 2, 1, 130, 1, 0), + (1353, 'Grave Sticker 2', 'desc', '1', 'gravesticker2', 2, 1, 130, 1, 0), + (1354, 'Green Hockey Stick', 'desc', '1', 'greenhockeystick', 2, 1, 491, 1, 0), + (1357, 'Greenpeace White', 'desc', '1', 'greenpeacewhite', 2, 1, 130, 1, 0), + (1360, 'Grunge Polaroid 1', 'desc', '1', 'grunge_polaroid_1', 2, 1, 453, 1, 0), + (1361, 'Grunge Polaroid 2', 'desc', '1', 'grunge_polaroid_2', 2, 1, 453, 1, 0), + (1362, 'Grunge Polaroid 3', 'desc', '1', 'grunge_polaroid_3', 2, 1, 453, 1, 0), + (1363, 'Grunge Polaroid 4', 'desc', '1', 'grunge_polaroid_4', 2, 1, 453, 1, 0), + (1364, 'Grunge Polaroid 5', 'desc', '1', 'grunge_polaroid_5', 2, 1, 453, 1, 0), + (1365, 'Guard 1', 'desc', '1', 'guard1', 2, 1, 453, 1, 0), + (1366, 'Guard 2', 'desc', '1', 'guard2', 2, 1, 453, 1, 0), + (1367, 'Guccimama', 'desc', '1', 'guccimama', 2, 1, 453, 1, 0), + (1370, 'Habbo Island', 'desc', '1', 'habbo_island', 2, 1, 461, 1, 0), + (1372, 'Habbo By Night-sticker', 'desc', '1', 'habbobynightsticker', 2, 1, 130, 1, 0), + (1373, 'Habbohome Of The Month', 'desc', '1', 'habbohome_of_the_month', 2, 1, 130, 1, 0), + (1375, 'Habborella Logo', 'desc', '1', 'habborella_logo', 2, 1, 130, 1, 0), + (1376, 'Habboween Background', 'desc', '4', 'habboween_bg', 2, 1, 104, 1, 0), + (1377, 'Hacksaw', 'desc', '1', 'hacksaw', 2, 1, 460, 1, 0), + (1378, 'Hat Clown 2', 'desc', '1', 'hat_clown2', 2, 1, 459, 1, 0), + (1379, 'HC Hat', 'desc', '1', 'hc_hat', 2, 1, 459, 1, 0), + (1380, 'Highlighter 1', 'desc', '1', 'highlighter_1', 2, 1, 469, 1, 0), + (1381, 'Highlighter 2', 'desc', '1', 'highlighter_2', 2, 1, 469, 1, 0), + (1382, 'Highlighter Mark 1', 'desc', '1', 'highlighter_mark1', 2, 1, 469, 1, 0), + (1383, 'Highlighter Mark 2', 'desc', '1', 'highlighter_mark2', 2, 1, 469, 1, 0), + (1384, 'Highlighter Mark 3', 'desc', '1', 'highlighter_mark3', 2, 1, 469, 1, 0), + (1385, 'Highlighter Mark 4', 'desc', '1', 'highlighter_mark4b', 2, 1, 469, 1, 0), + (1386, 'Highlighter Mark 5', 'desc', '1', 'highlighter_mark5', 2, 1, 469, 1, 0), + (1387, 'Highlighter Mark 6', 'desc', '1', 'highlighter_mark6', 2, 1, 469, 1, 0), + (1388, 'Hockey Habbo', 'desc', '1', 'hockey_habbo', 2, 1, 491, 1, 0), + (1389, 'Hockeyref', 'desc', '1', 'hockeyref', 2, 1, 491, 1, 0), + (1390, 'Holycarp', 'desc', '1', 'holycarp', 2, 1, 130, 1, 0), + (1391, 'Homer', 'desc', '1', 'homer', 2, 1, 453, 1, 0), + (1392, 'Horizontalink', 'desc', '1', 'horizontalink', 2, 1, 469, 1, 0), + (1393, 'Hornswoggle', 'desc', '1', 'hornswoggle', 2, 1, 460, 1, 0), + (1394, 'HP Guest', 'desc', '1', 'hp_guest', 2, 1, 453, 1, 0), + (1429, '3d Glasses', 'desc', '1', 'hw_3d_glasses', 2, 1, 459, 1, 0), + (1430, 'Actionstar', 'desc', '1', 'hw_actionstar', 2, 1, 467, 1, 0), + (1431, 'Amp Big', 'desc', '1', 'hw_amp_big', 2, 1, 467, 1, 0), + (1432, 'Amp Small', 'desc', '1', 'hw_amp_small', 2, 1, 467, 1, 0), + (1433, 'Bartender Costume', 'desc', '1', 'hw_bartender_costume', 2, 1, 459, 1, 0), + (1434, 'Bassplayer Boy', 'desc', '1', 'hw_bassplayer_boy', 2, 1, 492, 1, 0), + (1435, 'Bassplayer Girl', 'desc', '1', 'hw_bassplayer_girl', 2, 1, 492, 1, 0), + (1438, 'Bigcamera', 'desc', '1', 'hw_bigcamera', 2, 1, 467, 1, 0), + (1439, 'Bouncers', 'desc', '1', 'hw_bouncers', 2, 1, 467, 1, 0), + (1440, 'Camera L', 'desc', '1', 'hw_camera_l', 2, 1, 467, 1, 0), + (1441, 'Camera R', 'desc', '1', 'hw_camera_r', 2, 1, 467, 1, 0), + (1445, 'Carpet Corner Down', 'desc', '1', 'hw_carpet_corner_down', 2, 1, 467, 1, 0), + (1446, 'Carpet Corner Up', 'desc', '1', 'hw_carpet_corner_up', 2, 1, 467, 1, 0), + (1447, 'Carpet End Ldown', 'desc', '1', 'hw_carpet_end_ldown', 2, 1, 467, 1, 0), + (1448, 'Carpet End Lup', 'desc', '1', 'hw_carpet_end_lup', 2, 1, 467, 1, 0), + (1449, 'Carpet End Rdown', 'desc', '1', 'hw_carpet_end_rdown', 2, 1, 467, 1, 0), + (1450, 'Carpet End Rup', 'desc', '1', 'hw_carpet_end_rup', 2, 1, 467, 1, 0), + (1451, 'Carpet L', 'desc', '1', 'hw_carpet_l', 2, 1, 467, 1, 0), + (1452, 'Carpet R', 'desc', '1', 'hw_carpet_r', 2, 1, 467, 1, 0), + (1453, 'Drummer Boy', 'desc', '1', 'hw_drummer_boy', 2, 1, 492, 1, 0), + (1454, 'Drummer Girl', 'desc', '1', 'hw_drummer_girl', 2, 1, 492, 1, 0), + (1456, 'Guitarplayer Black', 'desc', '1', 'hw_guitarplayer_black', 2, 1, 492, 1, 0), + (1457, 'Guitarplayer White', 'desc', '1', 'hw_guitarplayer_white', 2, 1, 492, 1, 0), + (1458, 'Hairspray', 'desc', '1', 'hw_hairspray', 2, 1, 467, 1, 0), + (1459, 'Hippie', 'desc', '1', 'hw_hippie', 2, 1, 467, 1, 0), + (1460, 'Hitcher', 'desc', '1', 'hw_hitcher', 2, 1, 467, 1, 0), + (1461, 'Inmate', 'desc', '1', 'hw_inmate', 2, 1, 467, 1, 0), + (1462, 'Kenny Burger', 'desc', '1', 'hw_kenny_burger', 2, 1, 467, 1, 0), + (1463, 'Kenny Fight', 'desc', '1', 'hw_kenny_fight', 2, 1, 467, 1, 0), + (1464, 'Kenny Shock', 'desc', '1', 'hw_kenny_shock', 2, 1, 467, 1, 0), + (1465, 'Keyboards', 'desc', '1', 'hw_keyboards', 2, 1, 467, 1, 0), + (1468, 'Logoanim', 'desc', '1', 'hw_logoanim', 2, 1, 467, 1, 0), + (1469, 'Mega Afro', 'desc', '1', 'hw_mega_afro', 2, 1, 459, 1, 0), + (1470, 'Microphone', 'desc', '1', 'hw_microphone', 2, 1, 467, 1, 0), + (1471, 'Moh Logo', 'desc', '1', 'hw_moh_logo', 2, 1, 467, 1, 0), + (1472, 'Shades', 'desc', '1', 'hw_shades', 2, 1, 459, 1, 0), + (1473, 'Speedobunny', 'desc', '1', 'hw_speedobunny', 2, 1, 130, 1, 0), + (1477, 'Habbowood Klaffi 2', 'desc', '1', 'hwood07_klaffi2', 2, 1, 467, 1, 0), + (1511, 'Jenkki Monster Sticker', 'desc', '1', 'jenkki_monster_sticker', 2, 1, 470, 1, 0), + (1510, 'Jeff Hardy', 'desc', '1', 'jeffhardy', 2, 1, 460, 1, 0), + (1509, 'JBL', 'desc', '1', 'jbl', 2, 1, 460, 1, 0), + (1508, 'Jarppi Guest 2', 'desc', '1', 'jarppi_guest2', 2, 1, 453, 1, 0), + (1507, 'Jarppi Guest', 'desc', '1', 'jarppi_guest', 2, 1, 453, 1, 0), + (1506, 'Jarno Guest', 'desc', '1', 'jarno_guest', 2, 1, 453, 1, 0), + (1505, 'Jared', 'desc', '1', 'jared', 2, 1, 453, 1, 0), + (1504, 'James Curtis', 'desc', '1', 'jamescurtis', 2, 1, 460, 1, 0), + (1502, 'IT Toilet', 'desc', '1', 'it_toilet', 2, 1, 453, 1, 0), + (1501, 'IT Stickerpodio', 'desc', '1', 'it_stickerpodio', 2, 1, 130, 1, 0), + (1500, 'IT Habbohome', 'desc', '1', 'it_habbohome', 2, 1, 472, 1, 0), + (1499, 'Island', 'desc', '1', 'island', 2, 1, 461, 1, 0), + (1497, 'Inked Squidpants', 'desc', '1', 'inked_squidpants', 2, 1, 471, 1, 0), + (1498, 'Inked Suidpatrol', 'desc', '1', 'inked_suidpatrol', 2, 1, 471, 1, 0), + (1496, 'Inked Spit', 'desc', '1', 'inked_spit', 2, 1, 471, 1, 0), + (1495, 'Inked Ship', 'desc', '1', 'inked_ship', 2, 1, 471, 1, 0), + (1494, 'Inked Poster', 'desc', '1', 'inked_poster', 2, 1, 471, 1, 0), + (1493, 'Inked Love', 'desc', '1', 'inked_love', 2, 1, 471, 1, 0), + (1491, 'Inked Inkedblink', 'desc', '1', 'inked_inkedblink', 2, 1, 471, 1, 0), + (1492, 'Inked Lamp', 'desc', '1', 'inked_lamp', 2, 1, 471, 1, 0), + (1490, 'Inked Antisquidrank', 'desc', '1', 'inked_antisquidrank', 2, 1, 471, 1, 0), + (1488, 'Inked Antisquidf', 'desc', '1', 'inked_antisquidf', 2, 1, 471, 1, 0), + (1489, 'Inked Antisquidm', 'desc', '1', 'inked_antisquidm', 2, 1, 471, 1, 0), + (1480, 'I love Bobba', 'desc', '1', 'i_love_bobba', 2, 1, 451, 1, 0), + (1481, 'I love Coffee', 'desc', '1', 'i_love_coffee', 2, 1, 451, 1, 0), + (1516, 'Jimmyhart', 'desc', '1', 'jimmyhart', 2, 1, 460, 1, 0), + (1515, 'Jigoku Shojo 2', 'desc', '1', 'jigoku_shojo_2', 2, 1, 470, 1, 0), + (1514, 'Jigoku Shojo 1', 'desc', '1', 'jigoku_shojo_1', 2, 1, 470, 1, 0), + (1513, 'Jesse', 'desc', '1', 'jesse', 2, 1, 460, 1, 0), + (1517, 'Jimmysnuka', 'desc', '1', 'jimmysnuka', 2, 1, 460, 1, 0), + (1518, 'Johnmorrison', 'desc', '1', 'johnmorrison', 2, 1, 460, 1, 0), + (1519, 'JP 5 Uears', 'desc', '1', 'jp_5years', 2, 1, 130, 1, 0), + (1520, 'JP Godzilla', 'desc', '1', 'jp_godzilla', 2, 1, 451, 1, 0), + (1521, 'JP Sushi', 'desc', '1', 'jp_sushi', 2, 1, 451, 1, 0), + (1522, 'Juice', 'desc', '1', 'juice', 2, 1, 130, 1, 0), + (1523, 'Jukka Guest', 'desc', '1', 'jukka_guest', 2, 1, 453, 1, 0), + (1524, 'Jukka Guest2', 'desc', '1', 'jukka_guest2', 2, 1, 453, 1, 0), + (1525, 'July0408 Boom 1', 'desc', '1', 'july0408_boom_1', 2, 1, 468, 1, 0), + (1526, 'July408 Auntsamantha', 'desc', '1', 'july408_auntsamantha', 2, 1, 468, 1, 0), + (1527, 'July408 Boom 2', 'desc', '1', 'july408_boom_2', 2, 1, 468, 1, 0), + (1529, 'July408 Boom 4', 'desc', '1', 'july408_boom_4', 2, 1, 468, 1, 0), + (1530, 'July408 Border', 'desc', '1', 'july408_border', 2, 1, 468, 1, 0), + (1531, 'July408 July4th', 'desc', '1', 'july408_july4th', 2, 1, 468, 1, 0), + (1532, 'July408 Unclesam', 'desc', '1', 'july408_unclesam', 2, 1, 468, 1, 0), + (1534, 'Karigrandi Sticker', 'desc', '1', 'karigrandi_sticker', 2, 1, 470, 1, 0), + (1535, 'Kennydy Kstra', 'desc', '1', 'kennydykstra', 2, 1, 460, 1, 0), + (1536, 'Ketupat', 'desc', '1', 'ketupat', 2, 1, 130, 1, 0), + (1537, 'Kevinthorn', 'desc', '1', 'kevinthorn', 2, 1, 460, 1, 0), + (1538, 'KFP Sticker 1', 'desc', '1', 'kfp_sticker_01', 2, 1, 470, 1, 0), + (1539, 'KFP Sticker 2', 'desc', '1', 'kfp_sticker_02', 2, 1, 470, 1, 0), + (1540, 'KFP Sticker 3', 'desc', '1', 'kfp_sticker_03', 2, 1, 470, 1, 0), + (1541, 'KFP Sticker 4', 'desc', '1', 'kfp_sticker_04', 2, 1, 470, 1, 0), + (1542, 'KFP Sticker 5', 'desc', '1', 'kfp_sticker_05', 2, 1, 470, 1, 0), + (1543, 'KFP Sticker 6', 'desc', '1', 'kfp_sticker_06', 2, 1, 470, 1, 0), + (1544, 'KFP Sticker 7', 'desc', '1', 'kfp_sticker_07', 2, 1, 470, 1, 0), + (1545, 'KIP Partnerbtn', 'desc', '1', 'kip_partnerbtn', 2, 1, 470, 1, 0), + (1546, 'KIR Stamp 1', 'desc', '1', 'kir-stamp1', 2, 1, 475, 1, 0), + (1547, 'KIR Bam Sticker', 'desc', '1', 'kir_bam_sticker', 2, 1, 475, 1, 0), + (1548, 'KIR Elkah Sticker', 'desc', '1', 'kir_elkah_sticker', 2, 1, 475, 1, 0), + (1549, 'KIR Foz Sticker', 'desc', '1', 'kir_foz_sticker', 2, 1, 475, 1, 0), + (1550, 'KIR Fushi Sticker', 'desc', '1', 'kir_fushi_sticker', 2, 1, 475, 1, 0), + (1551, 'KIR Stamp 1', 'desc', '1', 'kir_stamp1', 2, 1, 475, 1, 0), + (1552, 'KIR Stamp 2', 'desc', '1', 'kir_stamp2', 2, 1, 475, 1, 0), + (1553, 'KIR Stamp 3', 'desc', '1', 'kir_stamp3', 2, 1, 475, 1, 0), + (1555, 'Kir Stamp', 'desc', '1', 'kir_stamp4', 2, 1, 475, 1, 0), + (1557, 'KIR Stamp 5', 'desc', '1', 'kir_stamp5', 2, 1, 475, 1, 0), + (1558, 'KIR Stamp 6', 'desc', '1', 'kir_stamp6', 2, 1, 475, 1, 0), + (1559, 'KIR Stamp 7', 'desc', '1', 'kir_stamp6_002', 2, 1, 475, 1, 0), + (1561, 'KIR Sticker', 'desc', '1', 'kir_sticker', 2, 1, 475, 1, 0), + (1562, 'KIR Winner 1', 'desc', '1', 'kir_winner_01', 2, 1, 475, 1, 0), + (1563, 'KIR Winner 2', 'desc', '1', 'kir_winner_02', 2, 1, 475, 1, 0), + (1564, 'KIR Winner 3', 'desc', '1', 'kir_winner_03', 2, 1, 475, 1, 0), + (1565, 'KIR Winner 4', 'desc', '1', 'kir_winner_04', 2, 1, 475, 1, 0), + (1566, 'KIR Winner 5', 'desc', '1', 'kir_winner_05', 2, 1, 475, 1, 0), + (1567, 'KIR Winner 6', 'desc', '1', 'kir_winner_06', 2, 1, 475, 1, 0), + (1568, 'KIR Winner 7', 'desc', '1', 'kir_winner_07', 2, 1, 475, 1, 0), + (1569, 'KIR Winner 8', 'desc', '1', 'kir_winner_08', 2, 1, 475, 1, 0), + (1570, 'KIR Winner 9', 'desc', '1', 'kir_winner_09', 2, 1, 475, 1, 0), + (1571, 'KIR Winner 10', 'desc', '1', 'kir_winner_10', 2, 1, 475, 1, 0), + (1572, 'KIR Winner 11', 'desc', '1', 'kir_winner_11', 2, 1, 475, 1, 0), + (1573, 'KIR Yobbo Sticker', 'desc', '1', 'kir_yobbo_sticker', 2, 1, 475, 1, 0), + (1574, 'Kitsune Wonders', 'desc', '1', 'kitsune_wonders', 2, 1, 476, 1, 0), + (1575, 'Kitsune Yelling', 'desc', '1', 'kitsune_yelling', 2, 1, 476, 1, 0), + (1576, 'Kitune Fighting', 'desc', '1', 'kitune_fighting', 2, 1, 476, 1, 0), + (1580, 'Krans', 'desc', '1', 'krans', 2, 1, 130, 1, 0), + (1582, 'Lamp 1', 'desc', '1', 'lamp_1', 2, 1, 130, 1, 0), + (1583, 'Lamp 2', 'desc', '1', 'lamp_2', 2, 1, 130, 1, 0), + (1584, 'Lamp 3', 'desc', '1', 'lamp_3', 2, 1, 130, 1, 0), + (1585, 'Lamp 4', 'desc', '1', 'lamp_4', 2, 1, 130, 1, 0), + (1586, 'Lamp Group', 'desc', '1', 'lamp_group', 2, 1, 130, 1, 0), + (1588, 'Lapanen Blue', 'desc', '1', 'lapanen_blue', 2, 1, 445, 1, 0), + (1593, 'Lapanen Purple', 'desc', '1', 'lapanen_purple', 2, 1, 445, 1, 0), + (1594, 'Lapanen Red', 'desc', '1', 'lapanen_red', 2, 1, 445, 1, 0), + (1596, 'Lapanen Yellow', 'desc', '1', 'lapanen_yellow', 2, 1, 445, 1, 0), + (1597, 'Lashey', 'desc', '1', 'lashey', 2, 1, 460, 1, 0), + (1599, 'Leafs 1', 'desc', '1', 'leafs1', 5, 7, 444, 1, 0), + (1600, 'Leapday', 'desc', '1', 'leapday', 2, 1, 130, 1, 0), + (1605, 'Limo Back', 'desc', '1', 'limo_back', 2, 1, 467, 1, 0), + (1606, 'Limo Doorpiece', 'desc', '1', 'limo_doorpiece', 2, 1, 467, 1, 0), + (1607, 'Limo Front', 'desc', '1', 'limo_front', 2, 1, 467, 1, 0), + (1608, 'Limo Windowpiece', 'desc', '1', 'limo_windowpiece', 2, 1, 467, 1, 0), + (1610, 'Linnsticker', 'desc', '1', 'linnsticker', 2, 1, 470, 1, 0), + (1614, 'Loderse', 'desc', '1', 'loderse', 2, 1, 470, 1, 0), + (1616, 'Lovebed', 'desc', '1', 'lovebed', 2, 1, 489, 1, 0), + (1622, 'Mansikka Tarra', 'desc', '1', 'mansikka_tarra', 2, 1, 470, 1, 0), + (1623, 'Maria', 'desc', '1', 'maria', 2, 1, 460, 1, 0), + (1624, 'Mark Henry', 'desc', '1', 'markhenry', 2, 1, 460, 1, 0), + (1625, 'Matt Hardy', 'desc', '1', 'matthardy', 2, 1, 460, 1, 0), + (1626, 'Matt Striker', 'desc', '1', 'mattstriker', 2, 1, 460, 1, 0), + (1627, 'May Weather', 'desc', '1', 'mayweather', 2, 1, 460, 1, 0), + (1628, 'Melchor', 'desc', '1', 'melchor', 2, 1, 453, 1, 0), + (1629, 'Melina', 'desc', '1', 'melina', 2, 1, 460, 1, 0), + (1631, 'Mexico', 'desc', '1', 'mexico', 2, 1, 456, 1, 0), + (1633, 'Mid Sommar 1', 'desc', '1', 'midsommar_1', 2, 1, 130, 1, 0), + (1634, 'Mike Knoxx', 'desc', '1', 'mikeknoxx', 2, 1, 460, 1, 0), + (1635, 'Miss J', 'desc', '1', 'missj', 2, 1, 453, 1, 0), + (1636, 'Money Low', 'desc', '1', 'money_o', 2, 1, 490, 1, 0), + (1637, 'Money Stash', 'desc', '1', 'money_stash', 2, 1, 490, 1, 0), + (1638, 'Money High', 'desc', '1', 'money_v', 2, 1, 490, 1, 0), + (1639, 'Mooncake Dark', 'desc', '1', 'mooncake_dark', 2, 1, 452, 1, 0), + (1640, 'Mooncake Light', 'desc', '1', 'mooncake_light', 2, 1, 452, 1, 0), + (1641, 'Mr Kennedy', 'desc', '1', 'mrkennedy', 2, 1, 460, 1, 0), + (1642, 'Mummimor', 'desc', '1', 'mummimor', 2, 1, 453, 1, 0), + (1652, 'Newyear 2007', 'desc', '1', 'newyear_2007_anim', 2, 1, 468, 1, 0), + (1655, 'Newyear Sparkler', 'desc', '1', 'newyear_sparkler', 2, 1, 468, 1, 0), + (1656, 'Nigiri Sushi', 'desc', '1', 'nigirisushi', 2, 1, 476, 1, 0), + (1657, 'NL Coinguy Animated', 'desc', '1', 'nl_coinguy_animated', 2, 1, 490, 1, 0), + (1658, 'NL Cupido', 'desc', '1', 'nl_cupido', 2, 1, 489, 1, 0), + (1659, 'NL Downtown Costume', 'desc', '1', 'nl_downtown_costume', 2, 1, 459, 1, 0), + (1660, 'NL Firecracker', 'desc', '1', 'nl_firecracker', 2, 1, 466, 1, 0), + (1661, 'NL Football Guest', 'desc', '1', 'nl_football_guest', 2, 1, 456, 1, 0), + (1662, 'NL Football Guest 2', 'desc', '1', 'nl_football_guest2', 2, 1, 456, 1, 0), + (1663, 'NL Limo', 'desc', '1', 'nl_limo', 2, 1, 467, 1, 0), + (1664, 'NL Wanted Costume', 'desc', '1', 'nl_wanted_costume', 2, 1, 459, 1, 0), + (1665, 'No Space Sticker', 'desc', '1', 'no_space_sticker', 2, 1, 451, 1, 0), + (1666, 'No Way Out Slanted', 'desc', '1', 'nowayout_slanted', 2, 1, 470, 1, 0), + (1670, 'Nunzio', 'desc', '1', 'nunzio', 2, 1, 460, 1, 0), + (1671, 'NZ Heart', 'desc', '1', 'nz_heart', 2, 1, 451, 1, 0), + (1672, 'NZ Tiki', 'desc', '1', 'nz_tiki', 2, 1, 451, 1, 0), + (1675, 'Ogopogo 1', 'desc', '1', 'ogopogo1', 2, 1, 466, 1, 0), + (1676, 'Oldfence Left', 'desc', '1', 'oldfence_left', 2, 1, 130, 1, 0), + (1677, 'Oldfence Right', 'desc', '1', 'oldfence_right', 2, 1, 130, 1, 0), + (1678, 'Orca Ideal Home', 'desc', '1', 'orca_ideal_home', 2, 1, 130, 1, 0), + (1684, 'Patsday Claddagh', 'desc', '1', 'patsday_claddagh', 2, 1, 484, 1, 0), + (1685, 'Patsday Kissme', 'desc', '1', 'patsday_kissme', 2, 1, 484, 1, 0), + (1687, 'Patsday Potogold', 'desc', '1', 'patsday_potogold', 2, 1, 484, 1, 0), + (1688, 'Patsday Shamborderh', 'desc', '1', 'patsday_shamborderh', 2, 1, 484, 1, 0), + (1689, 'Patsday Shamborderv', 'desc', '1', 'patsday_shamborderv', 2, 1, 484, 1, 0), + (1690, 'Patsday Shamrock', 'desc', '1', 'patsday_shamrock', 2, 1, 484, 1, 0), + (1691, 'Paul London', 'desc', '1', 'paullondon', 2, 1, 460, 1, 0), + (1692, 'Paul Orndorff', 'desc', '1', 'paulorndorff', 2, 1, 460, 1, 0), + (1704, 'HWSTICKER', 'desc', '1', 'HW_STICKER1_50000', 2, 1, 130, 1, 0), + (1707, 'Poppy', 'desc', '1', 'poppy', 2, 1, 130, 1, 0), + (1714, 'Pro Eco', 'desc', '1', 'pro_eco', 2, 1, 130, 1, 0), + (1717, 'Prom of the Dead Sticker Brains', 'desc', '1', 'promofthedead_sticker_brains', 2, 1, 488, 1, 0), + (1718, 'Prom of the Dead Sticker Dress', 'desc', '1', 'promofthedead_sticker_dress', 2, 1, 488, 1, 0), + (1719, 'Prom of the Dead Sticker Duck', 'desc', '1', 'promofthedead_sticker_duck', 2, 1, 488, 1, 0), + (1720, 'Prom of the Dead Sticker Poster', 'desc', '1', 'promofthedead_sticker_poster', 2, 1, 488, 1, 0), + (1721, 'Prom of the Dead Sticker Suit', 'desc', '1', 'promofthedead_sticker_suit', 2, 1, 488, 1, 0), + (1722, 'Prom of the Dead Sticker Zombie', 'desc', '1', 'promofthedead_sticker_zombie', 2, 1, 488, 1, 0), + (1724, 'Queensibidi', 'desc', '1', 'queensibidi', 2, 1, 453, 1, 0), + (1727, 'Radar', 'desc', '1', 'radar', 2, 1, 453, 1, 0), + (1728, 'Randy Orton', 'desc', '1', 'randyorton', 2, 1, 460, 1, 0), + (1729, 'Rasta', 'desc', '1', 'rasta', 2, 1, 453, 1, 0), + (1730, 'Ratv 2', 'desc', '1', 'ratv2', 2, 1, 466, 1, 0), + (1731, 'Red Hockeystick', 'desc', '1', 'redhockeystick', 2, 1, 491, 1, 0), + (1732, 'Redlamp', 'desc', '1', 'redlamp', 2, 1, 130, 1, 0), + (1733, 'Red Starfish', 'desc', '1', 'redstarfish', 2, 1, 130, 1, 0), + (1734, 'Referee 1 Guest', 'desc', '1', 'referee_01_guest', 2, 1, 453, 1, 0), + (1736, 'Referee 3 Guest', 'desc', '1', 'referee_03_guest', 2, 1, 453, 1, 0), + (1737, 'Reymysterio', 'desc', '1', 'reymysterio', 2, 1, 460, 1, 0), + (1738, 'Ricflair', 'desc', '1', 'ricflair', 2, 1, 460, 1, 0), + (1739, 'Roddypiper', 'desc', '1', 'roddypiper', 2, 1, 460, 1, 0), + (1740, 'Ronsimmons', 'desc', '1', 'ronsimmons', 2, 1, 460, 1, 0), + (1741, 'Room of the Week', 'desc', '1', 'room_of_the_week', 2, 1, 472, 1, 0), + (1748, 'Sack Costume', 'desc', '1', 'sackcostume', 2, 1, 459, 1, 0), + (1749, 'Safer Internet 2008', 'desc', '1', 'saferinternet2008', 2, 1, 130, 1, 0), + (1750, 'Samsung 1', 'desc', '1', 'samsung1', 2, 1, 470, 1, 0), + (1751, 'Samsung 2', 'desc', '1', 'samsung2', 2, 1, 470, 1, 0), + (1752, 'Samsung 3', 'desc', '1', 'samsung3', 2, 1, 470, 1, 0), + (1753, 'Samsung 4', 'desc', '1', 'samsung4', 2, 1, 470, 1, 0), + (1754, 'Samsung 5', 'desc', '1', 'samsung5', 2, 1, 470, 1, 0), + (1756, 'Santinoma Rella', 'desc', '1', 'santinomarella', 2, 1, 460, 1, 0), + (1758, 'Sasquatch', 'desc', '1', 'sasquatch7', 2, 1, 130, 1, 0), + (1759, 'Sasquatch Hands', 'desc', '1', 'sasquatch_hands', 2, 1, 459, 1, 0), + (1760, 'Satay', 'desc', '1', 'satay', 2, 1, 130, 1, 0), + (1762, 'SE Sticker Competition', 'desc', '1', 'se_sticker_competition', 2, 1, 459, 1, 0), + (1763, 'Seagull 1', 'desc', '1', 'seagull_01', 2, 1, 487, 1, 0), + (1764, 'Seagull 2', 'desc', '1', 'seagull_02', 2, 1, 487, 1, 0), + (1767, 'Sea Shell', 'desc', '1', 'seashell', 2, 1, 487, 1, 0), + (1768, 'Sergeant Slaughter', 'desc', '1', 'sergeantslaughter', 2, 1, 460, 1, 0), + (1769, 'MTV Sticker 1', 'desc', '1', 'sg_mtv_sticker_01', 2, 1, 470, 1, 0), + (1770, 'MTV Sticker 2', 'desc', '1', 'sg_mtv_sticker_02', 2, 1, 470, 1, 0), + (1771, 'MTV Sticker 3', 'desc', '1', 'sg_mtv_sticker_03', 2, 1, 470, 1, 0), + (1772, 'Claws', 'desc', '1', 'claws_lostc_twitchyanim', 2, 1, 487, 1, 0), + (1773, 'Shelton Benjamin', 'desc', '1', 'sheltonbenjamin', 2, 1, 460, 1, 0), + (1774, 'Shrubbery', 'desc', '1', 'shrubbery', 2, 1, 130, 1, 0), + (1780, 'Smichaels', 'desc', '1', 'smichaels', 2, 1, 460, 1, 0), + (1781, 'Snitsky', 'desc', '1', 'snitsky', 2, 1, 460, 1, 0), + (1782, 'Snowball', 'desc', '1', 'snowball', 2, 1, 445, 1, 0), + (1783, 'Snowball Bumpy', 'desc', '1', 'snowball_bumpy', 2, 1, 445, 1, 0), + (1785, 'Soccer Dude 1', 'desc', '1', 'soccer_dude_1', 2, 1, 456, 1, 0), + (1786, 'Soccer Dude 2', 'desc', '1', 'soccer_dude_2', 2, 1, 456, 1, 0), + (1787, 'Soccer Dude 3', 'desc', '1', 'soccer_dude_3', 2, 1, 456, 1, 0), + (1788, 'Soccer Dude 4', 'desc', '1', 'soccer_dude_4', 2, 1, 456, 1, 0), + (1789, 'Soccer Dude 5', 'desc', '1', 'soccer_dude_5', 2, 1, 456, 1, 0), + (1830, 'Sofresh', 'desc', '1', 'sofresh', 2, 1, 451, 1, 0), + (1831, 'spiderwick Goblin 1 L', 'desc', '1', 'spiderwick_goblin1_l', 2, 1, 470, 1, 0), + (1832, 'spiderwick Goblin 1 R', 'desc', '1', 'spiderwick_goblin1_r', 2, 1, 470, 1, 0), + (1833, 'spiderwick Goblin 2 L', 'desc', '1', 'spiderwick_goblin2_l', 2, 1, 470, 1, 0), + (1834, 'spiderwick Goblin 2 R', 'desc', '1', 'spiderwick_goblin2_r', 2, 1, 470, 1, 0), + (1835, 'spiderwick Goblin Anim L', 'desc', '1', 'spiderwick_goblin_anim_l', 2, 1, 470, 1, 0), + (1836, 'spiderwick Goblin Anim R', 'desc', '1', 'spiderwick_goblin_anim_r', 2, 1, 470, 1, 0), + (1837, 'spiderwick Griffin L', 'desc', '1', 'spiderwick_griffin_l', 2, 1, 470, 1, 0), + (1838, 'spiderwick Griffin R', 'desc', '1', 'spiderwick_griffin_r', 2, 1, 470, 1, 0), + (1839, 'spiderwick Sprite 1 L', 'desc', '1', 'spiderwick_sprite1_l', 2, 1, 470, 1, 0), + (1840, 'spiderwick Sprite 1 R', 'desc', '1', 'spiderwick_sprite1_r', 2, 1, 470, 1, 0), + (1841, 'spiderwick Sprite 2 L', 'desc', '1', 'spiderwick_sprite2_l', 2, 1, 470, 1, 0), + (1842, 'spiderwick Sprite 2 R', 'desc', '1', 'spiderwick_sprite2_r', 2, 1, 470, 1, 0), + (1845, 'Spill 1', 'desc', '1', 'spill1', 2, 1, 130, 1, 0), + (1846, 'Spill 2', 'desc', '1', 'spill2', 2, 1, 130, 1, 0), + (1847, 'Spill 3', 'desc', '1', 'spill3', 2, 1, 130, 1, 0), + (1848, 'Spotlight Sticker', 'desc', '1', 'spotlight_sticker', 2, 1, 130, 1, 0), + (1849, 'Spotlight Sticker 2', 'desc', '1', 'spotlight_sticker2_001', 2, 1, 130, 1, 0), + (1852, 'Spray', 'desc', '1', 'spray1', 2, 1, 130, 1, 0), + (1853, 'Spray 2', 'desc', '1', 'spray2', 2, 1, 130, 1, 0), + (1854, 'Squib', 'desc', '1', 'squib', 2, 1, 488, 1, 0), + (1869, 'Stanley Cup Sticker', 'desc', '1', 'stanleycupsticker', 2, 1, 130, 1, 0), + (1872, 'Starburst', 'desc', '1', 'starburst', 2, 1, 470, 1, 0), + (1873, 'Stevie Richards', 'desc', '1', 'stevierichards', 2, 1, 460, 1, 0), + (1877, 'Sticker 3 Years', 'desc', '1', 'sticker_3years', 2, 1, 130, 1, 0), + (1883, 'Sticker Award Bronze', 'desc', '1', 'sticker_award_bronze', 2, 1, 472, 1, 0), + (1884, 'Sticker Award Gold', 'desc', '1', 'sticker_award_gold', 2, 1, 472, 1, 0), + (1886, 'Sticker Award Silver', 'desc', '1', 'sticker_award_silver', 2, 1, 472, 1, 0), + (1888, 'Sticker Bonsai Ninjaf', 'desc', '1', 'sticker_bonsai_ninjaf', 2, 1, 476, 1, 0), + (1889, 'Sticker Bonsai Ninjafa', 'desc', '1', 'sticker_bonsai_ninjafa', 2, 1, 476, 1, 0), + (1890, 'Sticker Bonsai Ninjam', 'desc', '1', 'sticker_bonsai_ninjam', 2, 1, 476, 1, 0), + (1891, 'Sticker Bonsai Ninjama', 'desc', '1', 'sticker_bonsai_ninjama', 2, 1, 476, 1, 0), + (1892, 'Sticker Bonsai Samuraif', 'desc', '1', 'sticker_bonsai_samuraif', 2, 1, 476, 1, 0), + (1893, 'Sticker Bonsai Samuraifa', 'desc', '1', 'sticker_bonsai_samuraifa', 2, 1, 476, 1, 0), + (1894, 'Sticker Bonsai Samuraim', 'desc', '1', 'sticker_bonsai_samuraim', 2, 1, 476, 1, 0), + (1895, 'Sticker Bonsai Samuraima', 'desc', '1', 'sticker_bonsai_samuraima', 2, 1, 476, 1, 0), + (1897, 'Sticker Boxer', 'desc', '1', 'sticker_boxer', 2, 1, 453, 1, 0), + (1898, 'Sticker Caballoons', 'desc', '1', 'sticker_caballoons', 2, 1, 130, 1, 0), + (1899, 'Sticker Cabin', 'desc', '1', 'sticker_cabin', 2, 1, 130, 1, 0), + (1901, 'Sticker Cais 4', 'desc', '1', 'sticker_cais4', 2, 1, 130, 1, 0), + (1902, 'sticker_Cape', 'desc', '1', 'sticker_cape', 2, 1, 459, 1, 0), + (1906, 'Sticker Chica_Tampax', 'desc', '1', 'sticker_chica_tampax', 2, 1, 470, 1, 0), + (1907, 'Sticker Chica_Tampax 1', 'desc', '1', 'sticker_chica_tampax1', 2, 1, 470, 1, 0), + (1908, 'Sticker Chica Tampax 2', 'desc', '1', 'sticker_chica_tampax2', 2, 1, 470, 1, 0), + (1909, 'Sticker Chips', 'desc', '1', 'sticker_chips', 2, 1, 130, 1, 0), + (1910, 'Sticker Clown Anim', 'desc', '1', 'sticker_clown_anim', 2, 1, 453, 1, 0), + (1911, 'Sticker Coffee Stain', 'desc', '1', 'sticker_coffee_stain', 2, 1, 130, 1, 0), + (1912, 'Sticker Coffee Steam Blue', 'desc', '1', 'sticker_coffee_steam_blue', 2, 1, 130, 1, 0), + (1913, 'Sticker Coffee Steam Grey', 'desc', '1', 'sticker_coffee_steam_grey', 2, 1, 130, 1, 0), + (1914, 'Sticker Croco', 'desc', '1', 'sticker_croco', 2, 1, 130, 1, 0), + (1915, 'Sticker DA Blingclock', 'desc', '1', 'sticker_da_blingclock', 2, 1, 130, 1, 0), + (1916, 'Sticker Dreamer', 'desc', '1', 'sticker_dreamer', 2, 1, 130, 1, 0), + (1922, 'Sticker Eraser', 'desc', '1', 'sticker_eraser', 2, 1, 130, 1, 0), + (1926, 'Sticker Fireworkboom 3', 'desc', '1', 'sticker_fireworkboom3', 2, 1, 468, 1, 0), + (1927, 'Sticker Flames', 'desc', '1', 'sticker_flames', 2, 1, 130, 1, 0), + (1932, 'Sticker Gala', 'desc', '1', 'sticker_gala', 2, 1, 467, 1, 0), + (1934, 'Sticker Gentleman', 'desc', '1', 'sticker_gentleman', 2, 1, 453, 1, 0), + (1949, 'Sticker Hole', 'desc', '1', 'sticker_hole', 2, 1, 130, 1, 0), + (1950, 'Sticker Hulkhogan', 'desc', '1', 'sticker_hulkhogan', 2, 1, 459, 1, 0), + (1951, 'Sticker Iheartfools', 'desc', '1', 'sticker_iheartfools', 2, 1, 451, 1, 0), + (1952, 'Sticker Koopa', 'desc', '1', 'sticker_koopa', 2, 1, 465, 1, 0), + (1953, 'Sticker Lonewolf', 'desc', '1', 'sticker_lonewolf', 2, 1, 130, 1, 0), + (1954, 'Sticker Luigi', 'desc', '1', 'sticker_luigi', 2, 1, 465, 1, 0), + (1955, 'Sticker Mamasboy', 'desc', '1', 'sticker_mamasboy', 2, 1, 130, 1, 0), + (1956, 'Sticker Maquillage', 'desc', '1', 'sticker_maquillage', 2, 1, 459, 1, 0), + (1957, 'Sticker Mario', 'desc', '1', 'sticker_mario', 2, 1, 465, 1, 0), + (1958, 'Sticker Masque', 'desc', '1', 'sticker_masque_01', 2, 1, 459, 1, 0), + (1959, 'Sticker Masque 2', 'desc', '1', 'sticker_masque_02', 2, 1, 459, 1, 0), + (1960, 'Sticker Masque 3', 'desc', '1', 'sticker_masque_03', 2, 1, 459, 1, 0), + (1961, 'sticker_Masque 4', 'desc', '1', 'sticker_masque_04', 2, 1, 459, 1, 0), + (1962, 'Sticker Masque 5', 'desc', '1', 'sticker_masque_05', 2, 1, 459, 1, 0), + (1963, 'Sticker Masque Or', 'desc', '1', 'sticker_masque_or', 2, 1, 459, 1, 0), + (1964, 'Sticker Mathoffman', 'desc', '1', 'sticker_mathoffman', 2, 1, 470, 1, 0), + (1965, 'Sticker Mineur', 'desc', '1', 'sticker_mineur', 2, 1, 453, 1, 0), + (1966, 'Sticker Monolithe', 'desc', '1', 'sticker_monolithe', 2, 1, 130, 1, 0), + (1972, 'Sticker Peach', 'desc', '1', 'sticker_peach', 2, 1, 465, 1, 0), + (1986, 'Sticker Sboard 2', 'desc', '1', 'sticker_sboard2', 2, 1, 487, 1, 0), + (1987, 'Sticker Sboard 3', 'desc', '1', 'sticker_sboard3', 2, 1, 487, 1, 0), + (1990, 'Sticker Sleeping Habbo', 'desc', '1', 'sticker_sleeping_habbo', 2, 1, 453, 1, 0), + (1992, 'Sticker Spiky Wristband', 'desc', '1', 'sticker_spiky_wristband', 2, 1, 130, 1, 0), + (1997, 'Sticker Squelette', 'desc', '1', 'sticker_squelette', 2, 1, 488, 1, 0), + (2000, 'Sticker Themepark 2', 'desc', '1', 'sticker_themepark_002', 2, 1, 130, 1, 0), + (2001, 'Sticker Themepark 3', 'desc', '1', 'sticker_themepark_003', 2, 1, 130, 1, 0), + (2002, 'Sticker Tiki Flamesboard', 'desc', '1', 'sticker_tiki_flamesboard', 2, 1, 473, 1, 0), + (2006, 'Sticker Tour', 'desc', '1', 'sticker_tour', 2, 1, 470, 1, 0), + (2010, 'Sticker Trophy Award', 'desc', '1', 'sticker_trophy_award', 2, 1, 130, 1, 0), + (2011, 'Sticker Unclesam', 'desc', '1', 'sticker_unclesam', 2, 1, 468, 1, 0), + (2012, 'Sticker Woodboard', 'desc', '1', 'sticker_woodboard', 2, 1, 487, 1, 0), + (2022, 'Stonecold', 'desc', '1', 'stonecold', 2, 1, 460, 1, 0), + (2023, 'Stray Pixels Winner', 'desc', '1', 'straypixelswinner', 2, 1, 130, 1, 0), + (2024, 'Streaker', 'desc', '1', 'streaker', 2, 1, 453, 1, 0), + (2026, 'Summer Beachballafro', 'desc', '1', 'summer_beachballafro', 2, 1, 459, 1, 0), + (2027, 'Summer Blueberry Left', 'desc', '1', 'summer_blueberry_left', 2, 1, 130, 1, 0), + (2031, 'Summer Blueberry Right', 'desc', '1', 'summer_blueberry_right', 2, 1, 130, 1, 0), + (2033, 'Summer Cloud 1', 'desc', '1', 'summer_cloud1', 2, 1, 130, 1, 0), + (2035, 'Summer Cloud 2', 'desc', '1', 'summer_cloud2', 2, 1, 130, 1, 0), + (2037, 'Summer Cloud 3', 'desc', '1', 'summer_cloud3', 2, 1, 130, 1, 0), + (2039, 'Summer Flowerwreath 2', 'desc', '1', 'summer_flowerwreath', 2, 1, 130, 1, 0), + (2040, 'Summer Kite', 'desc', '1', 'summer_kite', 2, 1, 130, 1, 0), + (2043, 'Summer Rollerblades', 'desc', '1', 'summer_rollerblades', 2, 1, 130, 1, 0), + (2044, 'Summer Rowingboat', 'desc', '1', 'summer_rowingboat', 2, 1, 130, 1, 0), + (2045, 'Summer Skateboard', 'desc', '1', 'summer_skateboard', 2, 1, 130, 1, 0), + (2046, 'Summer Swim Trunk', 'desc', '1', 'summer_swim_trunk', 2, 1, 459, 1, 0), + (2047, 'Summer sticker_Strawberry', 'desc', '1', 'summersticker_strawberry', 2, 1, 130, 1, 0), + (2048, 'Sunflower', 'desc', '1', 'sunflower', 2, 1, 442, 1, 0), + (2050, 'Supercrazy', 'desc', '1', 'supercrazy', 2, 1, 460, 1, 0), + (2053, 'Sushi Ika Squid', 'desc', '1', 'sushi_ika_squid', 2, 1, 476, 1, 0), + (2054, 'Sushi Ikura Caviar', 'desc', '1', 'sushi_ikura_caviar', 2, 1, 476, 1, 0), + (2055, 'Sushi Kohada Mackerel', 'desc', '1', 'sushi_kohada_mackerel', 2, 1, 476, 1, 0), + (2056, 'Sushi Maguro', 'desc', '1', 'sushi_maguro', 2, 1, 476, 1, 0), + (2057, 'Sushi Tamago Egg', 'desc', '1', 'sushi_tamago_egg', 2, 1, 476, 1, 0), + (2058, 'Sushi Uni Sea Urchin', 'desc', '1', 'sushi_uni_sea_urchin', 2, 1, 476, 1, 0), + (2061, 'Tahti', 'desc', '1', 'tahti', 2, 1, 479, 1, 0), + (2062, 'Tall Ship', 'desc', '1', 'tall_ship', 2, 1, 489, 1, 0), + (2064, 'Tampax Signboard', 'desc', '1', 'tampax_signboard', 2, 1, 470, 1, 0), + (2069, 'Thanksgiving 07', 'desc', '1', 'thanksgiving07', 2, 1, 130, 1, 0), + (2070, 'The Great Khali', 'desc', '1', 'thegreatkhali', 2, 1, 460, 1, 0), + (2071, 'The Miz', 'desc', '1', 'themiz', 2, 1, 460, 1, 0), + (2072, 'The Safety Box', 'desc', '1', 'thesafetybox', 2, 1, 130, 1, 0), + (2073, 'Tiki Cloudtiki L', 'desc', '1', 'tiki_cloudtiki_l', 2, 1, 473, 1, 0), + (2074, 'Tiki Cloudtiki R', 'desc', '1', 'tiki_cloudtiki_r', 2, 1, 473, 1, 0), + (2075, 'Tiki Flowersboard', 'desc', '1', 'tiki_flowersboard', 2, 1, 473, 1, 0), + (2076, 'Tiki Greenboard', 'desc', '1', 'tiki_greenboard', 2, 1, 473, 1, 0), + (2077, 'Tiki Moarider F', 'desc', '1', 'tiki_moarider_f', 2, 1, 473, 1, 0), + (2078, 'Tiki Moarider M', 'desc', '1', 'tiki_moarider_m', 2, 1, 473, 1, 0), + (2079, 'Tiki Planttiki L', 'desc', '1', 'tiki_planttiki_l', 2, 1, 473, 1, 0), + (2080, 'Tiki Planttiki R', 'desc', '1', 'tiki_planttiki_r', 2, 1, 473, 1, 0), + (2081, 'Tiki Skulltiki L', 'desc', '1', 'tiki_skulltiki_l', 2, 1, 473, 1, 0), + (2082, 'Tiki Skulltiki R', 'desc', '1', 'tiki_skulltiki_r', 2, 1, 473, 1, 0), + (2083, 'Tiki Watertiki L', 'desc', '1', 'tiki_watertiki_l', 2, 1, 473, 1, 0), + (2084, 'Tiki Watertiki R', 'desc', '1', 'tiki_watertiki_r', 2, 1, 473, 1, 0), + (2085, 'Tiki Woodboard', 'desc', '1', 'tiki_woodboard', 2, 1, 473, 1, 0), + (2086, 'Toffee Tarra', 'desc', '1', 'toffee_tarra', 2, 1, 470, 1, 0), + (2087, 'Tokfia', 'desc', '1', 'tokfia', 2, 1, 453, 1, 0), + (2088, 'Tommy Dreamer', 'desc', '1', 'tommydreamer', 2, 1, 460, 1, 0), + (2089, 'Tomo', 'desc', '1', 'tomo', 2, 1, 453, 1, 0), + (2091, 'Torrie Wilson', 'desc', '1', 'torriewilson', 2, 1, 460, 1, 0), + (2092, 'Tproll', 'desc', '1', 'tproll', 2, 1, 488, 1, 0), + (2116, 'Trax Goldrecord', 'desc', '1', 'traxgoldrecord', 2, 1, 130, 1, 0), + (2118, 'Tree Owl', 'desc', '1', 'tree_owl', 2, 1, 130, 1, 0), + (2119, 'Treestump', 'desc', '1', 'treestump', 2, 1, 445, 1, 0), + (2120, 'Tripleh', 'desc', '1', 'tripleh', 2, 1, 460, 1, 0), + (2122, 'UK Childline', 'desc', '1', 'uk_childline_sticker', 2, 1, 451, 1, 0), + (2123, 'UK Habbo X', 'desc', '1', 'uk_habbo_x_sticker', 2, 1, 130, 1, 0), + (2124, 'UK Pixel Maze', 'desc', '1', 'uk_pixel_maze_sticker', 2, 1, 451, 1, 0), + (2126, 'Umaga', 'desc', '1', 'umaga', 2, 1, 460, 1, 0), + (2128, 'Undertaker', 'desc', '1', 'undertaker', 2, 1, 460, 1, 0), + (2134, 'Valentine Cupido', 'desc', '1', 'val_cupido_anim', 2, 1, 489, 1, 0), + (2136, 'Valentine Costume 3', 'desc', '1', 'val_lovecostume3', 2, 1, 489, 1, 0), + (2139, 'Valentine Lovedice', 'desc', '1', 'val_lovedice', 2, 1, 489, 1, 0), + (2141, 'Valentine Barbwire Horis', 'desc', '1', 'val_sticker_barbwire_horis', 2, 1, 489, 1, 0), + (2143, 'Valentine Barbwire Vert', 'desc', '1', 'val_sticker_barbwire_vert', 2, 1, 489, 1, 0), + (2146, 'Valentine Bartender', 'desc', '1', 'val_sticker_bartender', 2, 1, 489, 1, 0), + (2147, 'Valentine Bartender2', 'desc', '1', 'val_sticker_bartender2', 2, 1, 489, 1, 0), + (2150, 'Valentine Crew', 'desc', '1', 'val_sticker_crew', 2, 1, 489, 1, 0), + (2151, 'Valentine Croco', 'desc', '1', 'val_sticker_croco', 2, 1, 489, 1, 0), + (2152, 'Valentine Cupid Arrow', 'desc', '1', 'val_sticker_cupid_arrow', 2, 1, 489, 1, 0), + (2153, 'Valentine Femalecaptain', 'desc', '1', 'val_sticker_femalecaptain', 2, 1, 489, 1, 0), + (2157, 'Valentine Malecaptain', 'desc', '1', 'val_sticker_malecaptain', 2, 1, 489, 1, 0), + (2158, 'Valentine Malecrew', 'desc', '1', 'val_sticker_malecrew', 2, 1, 489, 1, 0), + (2159, 'Valentine Rosewire Corner', 'desc', '1', 'val_sticker_rosewire_corner', 2, 1, 489, 1, 0), + (2162, 'Valentine Rosewire Horis', 'desc', '1', 'val_sticker_rosewire_horis', 2, 1, 489, 1, 0), + (2163, 'Valentine Rosewire Vert', 'desc', '1', 'val_sticker_rosewire_vert', 2, 1, 489, 1, 0), + (2165, 'Valentine Skull 360', 'desc', '1', 'val_sticker_skull360', 2, 1, 489, 1, 0), + (2166, 'Valentine Skull 360 Circle', 'desc', '1', 'val_sticker_skull360_circle', 2, 1, 489, 1, 0), + (2167, 'Valentine Stewardess', 'desc', '1', 'val_sticker_stewardess', 2, 1, 489, 1, 0), + (2168, 'Valentine Stewardess 2', 'desc', '1', 'val_sticker_stewardess2', 2, 1, 489, 1, 0), + (2169, 'Valentine Storm Costume', 'desc', '1', 'val_sticker_storm-costume', 2, 1, 489, 1, 0), + (2171, 'Valentine Voodoo Suit', 'desc', '1', 'val_sticker_voodoo_suit', 2, 1, 489, 1, 0), + (2172, 'Valentine Captain', 'desc', '1', 'valcaptain', 2, 1, 489, 1, 0), + (2174, 'Valentine Welcome Sticker', 'desc', '1', 'valentine_welcome_sticker', 2, 1, 489, 1, 0), + (2177, 'Valvenis', 'desc', '1', 'valvenis', 2, 1, 460, 1, 0), + (2178, 'Vanilja Tarra', 'desc', '1', 'vanilja_tarra', 2, 1, 470, 1, 0), + (2179, 'Venezuela', 'desc', '1', 'venezuela', 2, 1, 456, 1, 0), + (2180, 'Venti', 'desc', '1', 'venti', 2, 1, 130, 1, 0), + (2181, 'Veronicas', 'desc', '1', 'veronicas', 2, 1, 453, 1, 0), + (2182, 'Vertical Ink', 'desc', '1', 'verticalink', 2, 1, 469, 1, 0), + (2184, 'Victoria', 'desc', '1', 'victoria', 2, 1, 460, 1, 0), + (2185, 'Vincent Viga', 'desc', '1', 'vincentviga', 2, 1, 453, 1, 0), + (2188, 'VIP Pin', 'desc', '1', 'vip_pin', 2, 1, 472, 1, 0), + (2193, 'Wood A', 'desc', '1', 'wood_a', 2, 1, 486, 1, 0), + (2194, 'Wood Acircle', 'desc', '1', 'wood_acircle', 2, 1, 486, 1, 0), + (2195, 'Wood Acsent', 'desc', '1', 'wood_acsent', 2, 1, 486, 1, 0), + (2196, 'Wood Acsent 2', 'desc', '1', 'wood_acsent2', 2, 1, 486, 1, 0), + (2197, 'Wood Adots', 'desc', '1', 'wood_adots', 2, 1, 486, 1, 0), + (2198, 'Wood B', 'desc', '1', 'wood_b', 2, 1, 486, 1, 0), + (2199, 'Wood C', 'desc', '1', 'wood_c', 2, 1, 486, 1, 0), + (2200, 'Wood Comma', 'desc', '1', 'wood_comma', 2, 1, 486, 1, 0), + (2201, 'Wood D', 'desc', '1', 'wood_d', 2, 1, 486, 1, 0), + (2202, 'Wood Dot', 'desc', '1', 'wood_dot', 2, 1, 486, 1, 0), + (2203, 'Wood E', 'desc', '1', 'wood_e', 2, 1, 486, 1, 0), + (2204, 'Wood Exclamation', 'desc', '1', 'wood_exclamation', 2, 1, 486, 1, 0), + (2205, 'Wood F', 'desc', '1', 'wood_f', 2, 1, 486, 1, 0), + (2206, 'Wood G', 'desc', '1', 'wood_g', 2, 1, 486, 1, 0), + (2207, 'Wood H', 'desc', '1', 'wood_h', 2, 1, 486, 1, 0), + (2208, 'Wood I', 'desc', '1', 'wood_i', 2, 1, 486, 1, 0), + (2209, 'Wood J', 'desc', '1', 'wood_j', 2, 1, 486, 1, 0), + (2210, 'Wood K', 'desc', '1', 'wood_k', 2, 1, 486, 1, 0), + (2211, 'Wood L', 'desc', '1', 'wood_l', 2, 1, 486, 1, 0), + (2212, 'Wood M', 'desc', '1', 'wood_m', 2, 1, 486, 1, 0), + (2213, 'Wood N', 'desc', '1', 'wood_n', 2, 1, 486, 1, 0), + (2214, 'Wood O', 'desc', '1', 'wood_o', 2, 1, 486, 1, 0), + (2215, 'Wood Odots', 'desc', '1', 'wood_odots', 2, 1, 486, 1, 0), + (2216, 'Wood P', 'desc', '1', 'wood_p', 2, 1, 486, 1, 0), + (2217, 'Wood Q', 'desc', '1', 'wood_q', 2, 1, 486, 1, 0), + (2218, 'Wood Question', 'desc', '1', 'wood_question', 2, 1, 486, 1, 0), + (2219, 'Wood R', 'desc', '1', 'wood_r', 2, 1, 486, 1, 0), + (2220, 'Wood S', 'desc', '1', 'wood_s', 2, 1, 486, 1, 0), + (2221, 'Wood T', 'desc', '1', 'wood_t', 2, 1, 486, 1, 0), + (2222, 'Wood U', 'desc', '1', 'wood_u', 2, 1, 486, 1, 0), + (2223, 'Wood Undermark', 'desc', '1', 'wood_undermark', 2, 1, 486, 1, 0), + (2224, 'Wood V', 'desc', '1', 'wood_v', 2, 1, 486, 1, 0), + (2225, 'Wood W', 'desc', '1', 'wood_w', 2, 1, 486, 1, 0), + (2226, 'Wood X', 'desc', '1', 'wood_x', 2, 1, 486, 1, 0), + (2227, 'Wood Y', 'desc', '1', 'wood_y', 2, 1, 486, 1, 0), + (2228, 'Wood Z', 'desc', '1', 'wood_z', 2, 1, 486, 1, 0), + (2231, 'Wordwrestling', 'desc', '1', 'wwemvp', 2, 1, 460, 1, 0), + (2286, 'Xmas 3000 Animated Sticker', 'desc', '1', 'xmassticker_anim_3000', 2, 1, 445, 1, 0), + (2288, 'Yearbook Ribbon Sticker', 'desc', '1', 'yearbook_ribbon_sticker', 2, 1, 472, 1, 0), + (2289, 'Yellow Starfish', 'desc', '1', 'yellowstarfish', 2, 1, 130, 1, 0), + (2291, 'Zack Ryder', 'desc', '1', 'zackryder', 2, 1, 460, 1, 0), + (2294, 'Kaatissakki Tausta', 'desc', '4', '27368_kaatissakki_tausta', 2, 1, 104, 1, 0), + (2295, 'Appart. 723 Scene', 'desc', '4', '27419_appart732_scene', 2, 1, 104, 1, 0), + (2296, 'Get it Card Background', 'desc', '4', '27835_getitcard_bg', 2, 1, 104, 1, 0), + (2297, 'GSOK', 'desc', '4', '27857_gsok_928x1360', 2, 1, 104, 1, 0), + (2302, 'Productboard', 'desc', '4', '928x1360_productboard', 2, 1, 104, 1, 0), + (2304, 'Abrinq Infobus G', 'desc', '4', 'abrinq_infobusg', 2, 1, 104, 1, 0), + (2305, 'Acma Cork Background', 'desc', '4', 'acma_cork_bg', 2, 1, 104, 1, 0), + (2595, 'Scifi Space Background', 'desc', '4', 'groupbg_scifi_space2', 2, 1, 104, 1, 0), + (2308, 'Amango Background', 'desc', '4', 'amango_bg', 2, 1, 104, 1, 0), + (2310, 'Armin van Buren Background', 'desc', '4', 'arminvanbuuren_928x1360', 2, 1, 104, 1, 0), + (2312, 'AU Rock The Schools Background', 'desc', '4', 'au_rocktheschools_bg', 2, 1, 104, 1, 0), + (2313, 'AU Rock The Schools Background 2', 'desc', '4', 'au_rocktheschools_bg_v2', 2, 1, 104, 1, 0), + (2314, 'Background Tour', 'desc', '4', 'background_tour', 2, 1, 104, 1, 0), + (2316, 'Beachbunny Wallpaper', 'desc', '4', 'beachbunny_wallpaper', 2, 1, 104, 1, 0), + (2317, 'SPI Japaneese Petit', 'desc', '4', 'bg_27372_spi_jap_petit_03', 2, 1, 104, 1, 0), + (2318, 'Comic Style Orange Background', 'desc', '4', 'bg_28221_comic_style_orange_001', 2, 1, 104, 1, 0), + (2320, 'Background EF', 'desc', '4', 'bg_background_ef', 2, 1, 104, 1, 0), + (2330, 'Colour 01 Background', 'desc', '4', 'bg_colour_01', 2, 1, 104, 1, 0), + (2345, 'Colour 16 Background', 'desc', '4', 'bg_colour_16', 2, 1, 104, 1, 0), + (2348, 'Comic Sisters Background', 'desc', '4', 'bg_comic_sisters', 2, 1, 104, 1, 0), + (2350, 'Dark Floors Background', 'desc', '4', 'bg_dark_floors', 2, 1, 104, 1, 0), + (2598, 'Hotel background', 'desc', '4', 'hotel', 2, 1, 104, 1, 0), + (2353, 'Fansites Background', 'desc', '4', 'bg_fansites', 2, 1, 104, 1, 0), + (2354, 'Goth Pattern Background', 'desc', '4', 'bg_goth_pattern', 2, 1, 104, 1, 0), + (2356, 'Habbo Lido Background', 'desc', '4', 'bg_habbolido', 2, 1, 104, 1, 0), + (2364, 'Kerrang', 'desc', '4', 'bg_kerrang2', 2, 1, 104, 1, 0), + (2370, 'Lido Flat Background', 'desc', '4', 'bg_lido_flat', 2, 1, 104, 1, 0), + (2371, 'Lido Background', 'desc', '4', 'bg_lidoo', 2, 1, 104, 1, 0), + (2374, 'Natasha Bedingfield Background', 'desc', '4', 'bg_natashabedingfield', 2, 1, 104, 1, 0), + (2377, 'Official Fansites Background', 'desc', '4', 'bg_official_fansites2', 2, 1, 104, 1, 0), + (2379, 'Pattern Abstract Background 2', 'desc', '4', 'bg_pattern_abstract2', 2, 1, 104, 1, 0), + (2382, 'Pattern Bulb Background', 'desc', '4', 'bg_pattern_bulb', 2, 1, 104, 1, 0), + (2383, 'Pattern Carpants Background', 'desc', '4', 'bg_pattern_carpants', 2, 1, 104, 1, 0), + (11300, 'Traxplayer', 'Play Trax on your homepage.', '5', 'traxplayerwidget', 0, 1, 100, 1, -1), + (2391, 'Pattern Floral Background', 'desc', '4', 'bg_pattern_floral_test', 2, 1, 104, 1, 0), + (10600, 'My groups widget', 'Displays all your groups', '2', 'groupswidget', 0, 1, 100, 1, 1), + (10400, 'My Badges', 'Show your badges on your page.', '2', 'badgeswidget', 0, 1, 100, 1, 1), + (10300, 'High scores widget', 'Display your high scores', '2', 'highscoreswidget', 0, 1, 100, 1, 1), + (2396, 'Poptarts CV Background', 'desc', '4', 'bg_poptarts_cv', 2, 1, 104, 1, 0), + (2397, 'Poptarts SB Background', 'desc', '4', 'bg_poptarts_sb', 2, 1, 104, 1, 0), + (11100, 'Guestbook', 'Guestbook Widget', '5', 'guestbookwidget', 0, 1, 100, 1, -1), + (11000, 'Groups Info widget', 'Displays infomation about the group.', '5', 'groupinfowidget', 0, 1, 100, 1, -1), + (10900, 'Rating widget', 'Allows members to vote on your page. You cannot vote for yourself.', '2', 'ratingwidget', 0, 1, 100, 2, 1), + (10500, 'My friends widget', 'Displays all your friends', '2', 'friendswidget', 0, 1, 100, 1, 1), + (2406, 'Sexy Dance Background', 'desc', '4', 'bg_sexy_dance_2_group_opt2', 2, 1, 104, 1, 0), + (2408, 'Solid Black Background', 'desc', '4', 'bg_solid_black', 2, 1, 104, 1, 0), + (2409, 'Solid White Background', 'desc', '4', 'bg_solid_white', 2, 1, 104, 1, 0), + (2410, 'Bobbaheart', 'desc', '4', 'bg_bobbaheart', 2, 1, 104, 1, 0), + (2414, 'Unofficial Fansites Background', 'desc', '4', 'bg_unofficial_fansites', 2, 1, 104, 1, 0), + (2423, 'Bionicle 2', 'desc', '4', 'bionicle2', 2, 1, 104, 1, 0), + (2424, 'Bubblejuice Background', 'desc', '4', 'bubblejuice_bg', 2, 1, 104, 1, 0), + (2601, 'Wallpaper Inked', 'desc', '4', 'wallpaper_inked', 2, 1, 104, 1, 0), + (2427, 'Cheesewedge Background', 'desc', '4', 'cheesewedge_wallpaper', 2, 1, 104, 1, 0), + (2429, 'Christmas Background 2 ', 'desc', '4', 'christmas2007bg_001', 2, 1, 104, 1, 0), + (2430, 'CN Background', 'desc', '4', 'cn_mgpam_bg', 2, 1, 104, 1, 0), + (2431, 'CN Background 2', 'desc', '4', 'cn_mgpam_bg_v2', 2, 1, 104, 1, 0), + (2432, 'CN Background 3', 'desc', '4', 'cn_mgpam_bg_v3', 2, 1, 104, 1, 0), + (2434, 'Comic Style', 'desc', '4', 'comic_style', 2, 1, 104, 1, 0), + (2435, 'Dia de Internet 2008', 'desc', '4', 'diadeinternet2008', 2, 1, 104, 1, 0), + (2437, 'Donnas Background', 'desc', '4', 'donnas_wallpaper', 2, 1, 104, 1, 0), + (2438, 'Earthday Background', 'desc', '4', 'earthday_bk', 2, 1, 104, 1, 0), + (2448, 'ES Calandar Background', 'desc', '4', 'es_calendarbg', 2, 1, 104, 1, 0), + (2449, 'ES Italia Background', 'desc', '4', 'es_wallpaper_italia', 2, 1, 104, 1, 0), + (2450, 'ES Obrero Background', 'desc', '4', 'es_wallpaper_obrero', 2, 1, 104, 1, 0), + (2451, 'ES Sralim Background', 'desc', '4', 'es_wallpaper_sralim', 2, 1, 104, 1, 0), + (2452, 'Executive Background', 'desc', '4', 'exe_background', 2, 1, 104, 1, 0), + (2453, 'Executive Wood Background', 'desc', '4', 'exe_wood_background', 2, 1, 104, 1, 0), + (2604, 'Xmas Starsky ', 'desc', '4', 'xmas_bgpattern_starsky', 2, 1, 104, 1, 0), + (2457, 'Fantastic Four 1', 'desc', '4', 'fantastic42', 2, 1, 104, 1, 0), + (2459, 'Fantastic Four', 'desc', '4', 'fantasticfour', 2, 1, 104, 1, 0), + (2462, 'Felix Ryhmasivutaustakuva', 'desc', '4', 'felix_ryhmasivutaustakuva', 2, 1, 104, 1, 0), + (2464, 'FI Linnamaki Background', 'desc', '4', 'fi_linnanmaki_bg', 2, 1, 104, 1, 0), + (2465, 'FI Puffet Background', 'desc', '4', 'fi_puffet_bg', 2, 1, 104, 1, 0), + (2466, 'Fondo Habbo Cibervoluntarios', 'desc', '4', 'fondo_habbo_cibervoluntarios', 2, 1, 104, 1, 0), + (2467, 'FR Spiderwick', 'desc', '4', 'fr_spiderwick', 2, 1, 104, 1, 0), + (2468, 'Global World Background', 'desc', '4', 'globalw_background', 2, 1, 104, 1, 0), + (2599, 'Tiki Firehead Background', 'desc', '4', 'tiki_firehead', 3, 1, 104, 1, 0), + (2600, 'Wallpaper 4th', 'desc', '4', 'wallpaper_4th', 2, 1, 104, 1, 0), + (2471, 'Grandi Habbo Ryhma', 'desc', '4', 'grandi_habbo_ryhma', 2, 1, 104, 1, 0), + (2472, 'Snowbattle Background 2', 'desc', '4', 'grouppage_snowbattle2', 2, 1, 104, 1, 0), + (2594, 'Cheetos Background 2', 'desc', '4', 'fondo_habbo_02', 2, 1, 104, 1, 0), + (2475, 'Guidesgroup Background', 'desc', '4', 'guidesgroup_bg', 2, 1, 104, 1, 0), + (2478, 'Habbo Ryhmatausta', 'desc', '4', 'habbo_ryhmatausta', 2, 1, 104, 1, 0), + (2479, 'Habbo Social Game', 'desc', '4', 'habbo_social_game_001_opt', 2, 1, 104, 1, 0), + (2480, 'Habbo Social Game 2', 'desc', '4', 'habbo_social_game_002', 2, 1, 104, 1, 0), + (2482, 'Habbo Classifieds Background', 'desc', '4', 'habboclassifieds', 2, 1, 104, 1, 0), + (2483, 'Habbo Fest 2008 Background', 'desc', '4', 'habbofest2008_bg', 2, 1, 104, 1, 0), + (2485, 'Habboguide Background', 'desc', '4', 'habboguide', 2, 1, 104, 1, 0), + (2486, 'Habborella Sea Background', 'desc', '4', 'habborella_sea_bg', 2, 1, 104, 1, 0), + (2487, 'Habborella Background', 'desc', '4', 'habborellabg', 2, 1, 104, 1, 0), + (2488, 'Habbos Background', 'desc', '4', 'habbos_group', 2, 1, 104, 1, 0), + (2491, 'Habbox Background', 'desc', '4', 'habbox', 2, 1, 104, 1, 0), + (2493, 'Hanna Montana Background', 'desc', '4', 'hannamontanawp', 2, 1, 104, 1, 0), + (2494, 'HC Machine Background', 'desc', '4', 'hc_bg_machine', 2, 1, 104, 1, 0), + (2495, 'HC Pillow Background', 'desc', '4', 'hc_bg_pillow', 2, 1, 104, 1, 0), + (2496, 'HC Royal Background', 'desc', '4', 'hc_bg_royal', 2, 1, 104, 1, 0), + (2497, 'Dediee', 'desc', '4', 'hmf_928x1360_dediee', 2, 1, 104, 1, 0), + (2498, 'Principale', 'desc', '4', 'hmf_928x1360_principale', 2, 1, 104, 1, 0), + (2499, 'Principale 2', 'desc', '4', 'hmf_928x1360_principale_b', 2, 1, 104, 1, 0), + (2501, 'Hundredmillion Background', 'desc', '4', 'hundredmillion_bg', 2, 1, 104, 1, 0), + (2508, 'Infobus SEM Logo', 'desc', '4', 'infobus_abrinq_sem_logo', 2, 1, 104, 1, 0), + (2511, 'Jordin Parks', 'desc', '4', 'jordinparks', 2, 1, 104, 1, 0), + (2513, 'Japaneese Background', 'desc', '4', 'jp_prom_bg', 2, 1, 104, 1, 0), + (2514, 'Japaneese Valentine', 'desc', '4', 'jp_valentine', 2, 1, 104, 1, 0), + (2515, 'July Wallpaper', 'desc', '4', 'july408_wallpaper', 2, 1, 104, 1, 0), + (2516, 'Kerrang', 'desc', '4', 'kerrang2', 2, 1, 104, 1, 0), + (2517, 'KFP Background', 'desc', '4', 'kfp_grouppage_bg', 2, 1, 104, 1, 0), + (2603, 'Xmas 2009 Snowing', 'desc', '4', 'xmas2009_bg_snowing', 2, 1, 104, 1, 0), + (2520, 'Kir Background', 'desc', '4', 'kir_grouppage_bg', 2, 1, 104, 1, 0), + (2522, 'Kungfu Background', 'desc', '4', 'kungfu_bg', 2, 1, 104, 1, 0), + (2525, 'Makeover Background', 'desc', '4', 'makeover', 2, 1, 104, 1, 0), + (2526, 'Manteli Background', 'desc', '4', 'manteli_bg', 2, 1, 104, 1, 0), + (2527, 'Meet Dave Background', 'desc', '4', 'meet_dave_groupbg_01', 2, 1, 104, 1, 0), + (2528, 'Meet Dave Background 2', 'desc', '4', 'meet_dave_groupbg_02', 2, 1, 104, 1, 0), + (2529, 'Misshabbo Scene', 'desc', '4', 'misshabbo_scene', 2, 1, 104, 1, 0), + (2530, 'Mmoore Wallpaper', 'desc', '4', 'mmoorewallpaper', 2, 1, 104, 1, 0), + (2531, 'MMS', 'desc', '4', 'mms', 2, 1, 104, 1, 0), + (2532, 'Netari Background', 'desc', '4', 'netaribg', 2, 1, 104, 1, 0), + (2536, 'Newyear Fireworks Background 2', 'desc', '4', 'newyear_bg_fireworks2', 2, 1, 104, 1, 0), + (2537, 'Green Background', 'desc', '4', 'nl_green_bg', 2, 1, 104, 1, 0), + (2538, 'NS France', 'desc', '4', 'nsfrance', 2, 1, 104, 1, 0), + (2539, 'NS France 2', 'desc', '4', 'nsfrance2', 2, 1, 104, 1, 0), + (2540, 'OB', 'desc', '4', 'ob1', 2, 1, 104, 1, 0), + (2541, 'OB 2', 'desc', '4', 'ob2', 2, 1, 104, 1, 0), + (2542, 'Orca', 'desc', '4', 'orca', 2, 1, 104, 1, 0), + (2544, 'Poptarts CV', 'desc', '4', 'poptarts_cv', 2, 1, 104, 1, 0), + (2546, 'Promofthedead Wallpaper', 'desc', '4', 'promofthedead_wallpaper', 2, 1, 104, 1, 0), + (2547, 'Random Habbos', 'desc', '4', 'random_habbos', 2, 1, 104, 1, 0), + (2548, 'Robojam Wallpaper', 'desc', '4', 'robojam_wallpaper', 2, 1, 104, 1, 0), + (2549, 'Room of the Week Background', 'desc', '4', 'wallpaper_rotw', 2, 1, 104, 1, 0), + (2552, 'Safetyweek Background 3', 'desc', '4', 'safetyweek2008_bg', 2, 1, 104, 1, 0), + (2553, 'Samsungclouds', 'desc', '4', 'samsungclouds', 2, 1, 104, 1, 0), + (2554, 'Samsunlight', 'desc', '4', 'samsungnight', 2, 1, 104, 1, 0), + (2555, 'Sasquatch Background', 'desc', '4', 'sasquatch_hhbg3', 2, 1, 104, 1, 0), + (2556, 'Scarecrow Background', 'desc', '4', 'scarecrowbg', 2, 1, 104, 1, 0), + (2557, 'Animax Keroro', 'desc', '4', 'animax_keroro', 2, 1, 104, 1, 0), + (2558, 'MTV Background', 'desc', '4', 'sg_mtv_grouppage_bg_v1', 2, 1, 104, 1, 0), + (2559, 'MTV Background 2', 'desc', '4', 'sg_mtv_grouppage_bg_v2', 2, 1, 104, 1, 0), + (2560, 'Shabbo Line', 'desc', '4', 'shabboline', 2, 1, 104, 1, 0), + (2564, 'Simpleplan Background', 'desc', '4', 'simpleplan_bg', 2, 1, 104, 1, 0), + (2566, 'Slamdunk', 'desc', '4', 'slamdunk', 2, 1, 104, 1, 0), + (2567, 'Snowstorm Background', 'desc', '4', 'snowstorm_bg', 2, 1, 104, 1, 0), + (2568, 'Sofresh Background', 'desc', '4', 'sofresh_bg', 2, 1, 104, 1, 0), + (2569, 'Solid Background Black', 'desc', '4', 'solid_bg_black', 2, 1, 104, 1, 0), + (2570, 'Solid Background White', 'desc', '4', 'solid_bg_white', 2, 1, 104, 1, 0), + (2571, 'Spiderwick Beware', 'desc', '4', 'spiderwick_beware', 2, 1, 104, 1, 0), + (2572, 'Spiderwick Fairy', 'desc', '4', 'spiderwick_fairy', 2, 1, 104, 1, 0), + (2573, 'Spiderwick Goblin', 'desc', '4', 'spiderwick_goblin', 2, 1, 104, 1, 0), + (2574, 'Battleball Background', 'desc', '4', 'BB_Group2', 2, 1, 104, 1, 0), + (2583, 'Stray Pixel Background', 'desc', '4', 'straypixelsbg', 2, 1, 104, 1, 0), + (2584, 'Streaming 1', 'desc', '4', 'streaming001', 2, 1, 104, 1, 0), + (2585, 'Streaming 2', 'desc', '4', 'streaming002', 2, 1, 104, 1, 0), + (2586, 'Streaming 3', 'desc', '4', 'streaming003', 2, 1, 104, 1, 0), + (2587, 'Sttrinians Blackboard', 'desc', '4', 'sttriniansblackboard', 2, 1, 104, 1, 0), + (2588, 'Sttrinians Group', 'desc', '4', 'sttriniansgroup', 2, 1, 104, 1, 0), + (2590, 'Summer Background Optimal', 'desc', '4', 'summer_bg_optimal', 2, 1, 104, 1, 0), + (2592, 'Fisica o Quimica Background', 'desc', '4', 'bg_Fondo_FoQB', 2, 1, 104, 1, 0), + (2593, 'Cheetos Background 1', 'desc', '4', 'Cheetos_ES_bg_v1', 2, 1, 104, 1, 0), + (1985, 'Surf', 'desc', '1', 'sticker_tiki_flamesboard', 2, 1, 487, 1, 0), + (2596, 'Tokiohotel Wallpaper', 'desc', '4', 'tokiohotel2', 2, 1, 104, 1, 0), + (2597, 'Tokiohotel Scream Wallpaper', 'desc', '4', 'tokiohotel_scream_wallpaper', 2, 1, 104, 1, 0), + (2609, 'VIP Group', 'desc', '4', 'vip_group', 2, 1, 104, 1, 0), + (2612, 'Wallepixar Background', 'desc', '4', 'wallepixar_bg', 2, 1, 104, 1, 0), + (2613, 'Wallpaper 1', 'desc', '4', 'wallpaper1', 2, 1, 104, 1, 0), + (2618, 'Wallpaper Bonsai', 'desc', '4', 'wallpaper_bonsai', 2, 1, 104, 1, 0), + (2619, 'Wallpaper Cais', 'desc', '4', 'wallpaper_cais4', 2, 1, 104, 1, 0), + (2602, 'Wobble squabble Background', 'desc', '4', 'WS_Group2', 3, 1, 104, 1, 0), + (2621, 'Wallpaper Mshepard', 'desc', '4', 'wallpaper_mshepard', 2, 1, 104, 1, 0), + (2622, 'Wallpaper Newsiesca', 'desc', '4', 'wallpaper_newsiesca', 2, 1, 104, 1, 0), + (2623, 'Wallpaper Veronicas', 'desc', '4', 'wallpaper_veronicas', 2, 1, 104, 1, 0), + (2624, 'Wallpaper Victoriaday', 'desc', '4', 'wallpaper_victoriaday', 2, 1, 104, 1, 0), + (2625, 'Welcoming Party', 'desc', '4', 'welcoming_party', 2, 1, 104, 1, 0), + (2626, 'Wrestlemania Nowayout Wallpaper', 'desc', '4', 'wwe_nowayout_wallpaper', 2, 1, 104, 1, 0), + (2627, 'Wrestlemania Wallpaper', 'desc', '4', 'wwe_wallpaper', 2, 1, 104, 1, 0), + (2628, 'Wrestlemania Big Battle', 'desc', '4', 'wwe_wrestlemania_big_battle', 2, 1, 104, 1, 0), + (2629, 'Wrestlemania Bunnymania', 'desc', '4', 'wwe_wrestlemania_bunnymania', 2, 1, 104, 1, 0), + (2630, 'Wrestlemania Ladder Match', 'desc', '4', 'wwe_wrestlemania_ladder_match', 2, 1, 104, 1, 0), + (2631, 'Wrestlemania Main', 'desc', '4', 'wwe_wrestlemania_main', 2, 1, 104, 1, 0), + (2632, 'Wrestlemania Triple Champ', 'desc', '4', 'wwe_wrestlemania_triple_champ', 2, 1, 104, 1, 0), + (2633, 'Wrestlemania World Champ', 'desc', '4', 'wwe_wrestlemania_world_champ', 2, 1, 104, 1, 0), + (2645, 'Xmas Gifts Background 2', 'desc', '4', 'xmas_gifts_gb', 2, 1, 104, 1, 0), + (2649, 'Yearbook Wallpaper', 'desc', '4', 'yearbook_wallpaper', 2, 1, 104, 1, 0), + (1, 'Genie Fire Head', 'desc', '1', 'geniefirehead', 2, 1, 459, 1, 0), + (2781, 'blue_diner_a', 'desc', '1', 'blue_diner_a', 2, 1, 480, 1, 0), + (2782, 'blue_diner_a_umlaut', 'desc', '1', 'blue_diner_a_umlaut', 2, 1, 480, 1, 0), + (2783, 'blue_diner_ae', 'desc', '1', 'blue_diner_ae', 2, 1, 480, 1, 0), + (2784, 'blue_diner_b', 'desc', '1', 'blue_diner_b', 2, 1, 480, 1, 0), + (2785, 'blue_diner_c', 'desc', '1', 'blue_diner_c', 2, 1, 480, 1, 0), + (2786, 'blue_diner_c_cedilla', 'desc', '1', 'blue_diner_c_cedilla', 2, 1, 480, 1, 0), + (2787, 'blue_diner_d', 'desc', '1', 'blue_diner_d', 2, 1, 480, 1, 0), + (2788, 'blue_diner_e', 'desc', '1', 'blue_diner_e', 2, 1, 480, 1, 0), + (2789, 'blue_diner_e_acc', 'desc', '1', 'blue_diner_e_acc', 2, 1, 480, 1, 0), + (2790, 'blue_diner_e_acc_grave', 'desc', '1', 'blue_diner_e_acc_grave', 2, 1, 480, 1, 0), + (2791, 'blue_diner_eight', 'desc', '1', 'blue_diner_eight', 2, 1, 480, 1, 0), + (2792, 'blue_diner_exclamation', 'desc', '1', 'blue_diner_exclamation', 2, 1, 480, 1, 0), + (2793, 'blue_diner_f', 'desc', '1', 'blue_diner_f', 2, 1, 480, 1, 0), + (2794, 'blue_diner_five', 'desc', '1', 'blue_diner_five', 2, 1, 480, 1, 0), + (2795, 'blue_diner_four', 'desc', '1', 'blue_diner_four', 2, 1, 480, 1, 0), + (2796, 'blue_diner_g', 'desc', '1', 'blue_diner_g', 2, 1, 480, 1, 0), + (2797, 'blue_diner_h', 'desc', '1', 'blue_diner_h', 2, 1, 480, 1, 0), + (2798, 'blue_diner_i', 'desc', '1', 'blue_diner_i', 2, 1, 480, 1, 0), + (2799, 'blue_diner_j', 'desc', '1', 'blue_diner_j', 2, 1, 480, 1, 0), + (2800, 'blue_diner_k', 'desc', '1', 'blue_diner_k', 2, 1, 480, 1, 0), + (2801, 'blue_diner_l', 'desc', '1', 'blue_diner_l', 2, 1, 480, 1, 0), + (2802, 'blue_diner_m', 'desc', '1', 'blue_diner_m', 2, 1, 480, 1, 0), + (2803, 'blue_diner_n', 'desc', '1', 'blue_diner_n', 2, 1, 480, 1, 0), + (2804, 'blue_diner_nine', 'desc', '1', 'blue_diner_nine', 2, 1, 480, 1, 0), + (2805, 'blue_diner_o', 'desc', '1', 'blue_diner_o', 2, 1, 480, 1, 0), + (2806, 'blue_diner_o_accute', 'desc', '1', 'blue_diner_o_accute', 2, 1, 480, 1, 0), + (2807, 'blue_diner_o_cc_grave', 'desc', '1', 'blue_diner_o_cc_grave', 2, 1, 480, 1, 0), + (2808, 'blue_diner_o_umlaut', 'desc', '1', 'blue_diner_o_umlaut', 2, 1, 480, 1, 0), + (2809, 'blue_diner_one', 'desc', '1', 'blue_diner_one', 2, 1, 480, 1, 0), + (2810, 'blue_diner_p', 'desc', '1', 'blue_diner_p', 2, 1, 480, 1, 0), + (2811, 'blue_diner_q', 'desc', '1', 'blue_diner_q', 2, 1, 480, 1, 0), + (2812, 'blue_diner_question', 'desc', '1', 'blue_diner_question', 2, 1, 480, 1, 0), + (2813, 'blue_diner_r', 'desc', '1', 'blue_diner_r', 2, 1, 480, 1, 0), + (2814, 'blue_diner_s', 'desc', '1', 'blue_diner_s', 2, 1, 480, 1, 0), + (2815, 'blue_diner_seven', 'desc', '1', 'blue_diner_seven', 2, 1, 480, 1, 0), + (2816, 'blue_diner_six', 'desc', '1', 'blue_diner_six', 2, 1, 480, 1, 0), + (2817, 'blue_diner_t', 'desc', '1', 'blue_diner_t', 2, 1, 480, 1, 0), + (2818, 'blue_diner_three', 'desc', '1', 'blue_diner_three', 2, 1, 480, 1, 0), + (2819, 'blue_diner_two', 'desc', '1', 'blue_diner_two', 2, 1, 480, 1, 0), + (2820, 'blue_diner_u', 'desc', '1', 'blue_diner_u', 2, 1, 480, 1, 0), + (2821, 'blue_diner_u_acc', 'desc', '1', 'blue_diner_u_acc', 2, 1, 480, 1, 0), + (2822, 'blue_diner_u_acc_grave', 'desc', '1', 'blue_diner_u_acc_grave', 2, 1, 480, 1, 0), + (2823, 'blue_diner_u_umlaut', 'desc', '1', 'blue_diner_u_umlaut', 2, 1, 480, 1, 0), + (2824, 'blue_diner_upsidedown', 'desc', '1', 'blue_diner_upsidedown', 2, 1, 480, 1, 0), + (2825, 'blue_diner_v', 'desc', '1', 'blue_diner_v', 2, 1, 480, 1, 0), + (2826, 'blue_diner_w', 'desc', '1', 'blue_diner_w', 2, 1, 480, 1, 0), + (2827, 'blue_diner_x', 'desc', '1', 'blue_diner_x', 2, 1, 480, 1, 0), + (2828, 'blue_diner_y', 'desc', '1', 'blue_diner_y', 2, 1, 480, 1, 0), + (2829, 'blue_diner_z', 'desc', '1', 'blue_diner_z', 2, 1, 480, 1, 0), + (2830, 'blue_diner_zero', 'desc', '1', 'blue_diner_zero', 2, 1, 480, 1, 0), + (2930, 'diner_belair', 'desc', '1', 'diner_belair', 2, 1, 482, 1, 0), + (2933, 'diner_gaspump_blue', 'desc', '1', 'diner_gaspump_blue', 2, 1, 482, 1, 0), + (2934, 'diner_gaspump_green', 'desc', '1', 'diner_gaspump_green', 2, 1, 482, 1, 0), + (2935, 'diner_gaspump_red', 'desc', '1', 'diner_gaspump_red', 2, 1, 482, 1, 0), + (2941, 'diner_hotrod', 'desc', '1', 'diner_hotrod', 2, 1, 482, 1, 0), + (2943, 'diner_plymouth', 'desc', '1', 'diner_plymouth', 2, 1, 482, 1, 0), + (2944, 'diner_poster', 'desc', '1', 'diner_poster', 2, 1, 482, 1, 0), + (2945, 'diner_sign', 'desc', '1', 'diner_sign', 2, 1, 482, 1, 0), + (2947, 'diner_trophy_bronze', 'desc', '1', 'diner_trophy_bronze', 2, 1, 482, 1, 0), + (2948, 'diner_trophy_gold', 'desc', '1', 'diner_trophy_gold', 2, 1, 482, 1, 0), + (2949, 'diner_trophy_silver', 'desc', '1', 'diner_trophy_silver', 2, 1, 482, 1, 0), + (3080, 'green_diner_a', 'desc', '1', 'green_diner_a', 2, 1, 483, 1, 0), + (3081, 'green_diner_a_umlaut', 'desc', '1', 'green_diner_a_umlaut', 2, 1, 483, 1, 0), + (3082, 'green_diner_ae', 'desc', '1', 'green_diner_ae', 2, 1, 483, 1, 0), + (3083, 'green_diner_b', 'desc', '1', 'green_diner_b', 2, 1, 483, 1, 0), + (3084, 'green_diner_c', 'desc', '1', 'green_diner_c', 2, 1, 483, 1, 0), + (3085, 'green_diner_c_cedilla', 'desc', '1', 'green_diner_c_cedilla', 2, 1, 483, 1, 0), + (3086, 'green_diner_d', 'desc', '1', 'green_diner_d', 2, 1, 483, 1, 0), + (3087, 'green_diner_e', 'desc', '1', 'green_diner_e', 2, 1, 483, 1, 0), + (3088, 'green_diner_e_acc', 'desc', '1', 'green_diner_e_acc', 2, 1, 483, 1, 0), + (3089, 'green_diner_e_cc_grave', 'desc', '1', 'green_diner_e_cc_grave', 2, 1, 483, 1, 0), + (3090, 'green_diner_eight', 'desc', '1', 'green_diner_eight', 2, 1, 483, 1, 0), + (3091, 'green_diner_exclamation', 'desc', '1', 'green_diner_exclamation', 2, 1, 483, 1, 0), + (3092, 'green_diner_f', 'desc', '1', 'green_diner_f', 2, 1, 483, 1, 0), + (3093, 'green_diner_five', 'desc', '1', 'green_diner_five', 2, 1, 483, 1, 0), + (3094, 'green_diner_four', 'desc', '1', 'green_diner_four', 2, 1, 483, 1, 0), + (3095, 'green_diner_g', 'desc', '1', 'green_diner_g', 2, 1, 483, 1, 0), + (3096, 'green_diner_h', 'desc', '1', 'green_diner_h', 2, 1, 483, 1, 0), + (3097, 'green_diner_i', 'desc', '1', 'green_diner_i', 2, 1, 483, 1, 0), + (3098, 'green_diner_j', 'desc', '1', 'green_diner_j', 2, 1, 483, 1, 0), + (3099, 'green_diner_k', 'desc', '1', 'green_diner_k', 2, 1, 483, 1, 0), + (3100, 'green_diner_l', 'desc', '1', 'green_diner_l', 2, 1, 483, 1, 0), + (3101, 'green_diner_m', 'desc', '1', 'green_diner_m', 2, 1, 483, 1, 0), + (3102, 'green_diner_n', 'desc', '1', 'green_diner_n', 2, 1, 483, 1, 0), + (3103, 'green_diner_nine', 'desc', '1', 'green_diner_nine', 2, 1, 483, 1, 0), + (3104, 'green_diner_o', 'desc', '1', 'green_diner_o', 2, 1, 483, 1, 0), + (3105, 'green_diner_o_accute', 'desc', '1', 'green_diner_o_accute', 2, 1, 483, 1, 0), + (3106, 'green_diner_o_cc_grave', 'desc', '1', 'green_diner_o_cc_grave', 2, 1, 483, 1, 0), + (3107, 'green_diner_o_umlaut', 'desc', '1', 'green_diner_o_umlaut', 2, 1, 483, 1, 0), + (3108, 'green_diner_one', 'desc', '1', 'green_diner_one', 2, 1, 483, 1, 0), + (3109, 'green_diner_p', 'desc', '1', 'green_diner_p', 2, 1, 483, 1, 0), + (3110, 'green_diner_q', 'desc', '1', 'green_diner_q', 2, 1, 483, 1, 0), + (3111, 'green_diner_question', 'desc', '1', 'green_diner_question', 2, 1, 483, 1, 0), + (3112, 'green_diner_r', 'desc', '1', 'green_diner_r', 2, 1, 483, 1, 0), + (3113, 'green_diner_s', 'desc', '1', 'green_diner_s', 2, 1, 483, 1, 0), + (3114, 'green_diner_seven', 'desc', '1', 'green_diner_seven', 2, 1, 483, 1, 0), + (3115, 'green_diner_six', 'desc', '1', 'green_diner_six', 2, 1, 483, 1, 0), + (3116, 'green_diner_t', 'desc', '1', 'green_diner_t', 2, 1, 483, 1, 0), + (3117, 'green_diner_three', 'desc', '1', 'green_diner_three', 2, 1, 483, 1, 0), + (3118, 'green_diner_two', 'desc', '1', 'green_diner_two', 2, 1, 483, 1, 0), + (3119, 'green_diner_u', 'desc', '1', 'green_diner_u', 2, 1, 483, 1, 0), + (3120, 'green_diner_u_acc', 'desc', '1', 'green_diner_u_acc', 2, 1, 483, 1, 0), + (3121, 'green_diner_u_acc_grave', 'desc', '1', 'green_diner_u_acc_grave', 2, 1, 483, 1, 0), + (3122, 'green_diner_u_umlaut', 'desc', '1', 'green_diner_u_umlaut', 2, 1, 483, 1, 0), + (3123, 'green_diner_upsidedown', 'desc', '1', 'green_diner_upsidedown', 2, 1, 483, 1, 0), + (3124, 'green_diner_v', 'desc', '1', 'green_diner_v', 2, 1, 483, 1, 0), + (3125, 'green_diner_w', 'desc', '1', 'green_diner_w', 2, 1, 483, 1, 0), + (3126, 'green_diner_x', 'desc', '1', 'green_diner_x', 2, 1, 483, 1, 0), + (3127, 'green_diner_y', 'desc', '1', 'green_diner_y', 2, 1, 483, 1, 0), + (3128, 'green_diner_z', 'desc', '1', 'green_diner_z', 2, 1, 483, 1, 0), + (2911, 'darkknight_batman_suit', 'desc', '1', 'darkknight_batman_suit', 2, 1, 481, 1, 0), + (2912, 'darkknight_clownface', 'desc', '1', 'darkknight_clownface', 2, 1, 481, 1, 0), + (2913, 'darkknight_dentbutton', 'desc', '1', 'darkknight_dentbutton', 2, 1, 481, 1, 0), + (2914, 'darkknight_jokercard', 'desc', '1', 'darkknight_jokercard', 2, 1, 481, 1, 0), + (2915, 'darkknight_jokerface', 'desc', '1', 'darkknight_jokerface', 2, 1, 481, 1, 0), + (2916, 'darkknight_logo', 'desc', '1', 'darkknight_logo', 2, 1, 481, 1, 0), + (4324, 'darkknight_wallpaper', 'desc', '4', 'darkknight_wallpaper', 2, 1, 104, 1, 0), + (3530, 'red_diner_a', 'desc', '1', 'red_diner_a', 2, 1, 485, 1, 0), + (3531, 'red_diner_a_umlaut', 'desc', '1', 'red_diner_a_umlaut', 2, 1, 485, 1, 0), + (3532, 'red_diner_ae', 'desc', '1', 'red_diner_ae', 2, 1, 485, 1, 0), + (3533, 'red_diner_b', 'desc', '1', 'red_diner_b', 2, 1, 485, 1, 0), + (3534, 'red_diner_c', 'desc', '1', 'red_diner_c', 2, 1, 485, 1, 0), + (3535, 'red_diner_c_cedilla', 'desc', '1', 'red_diner_c_cedilla', 2, 1, 485, 1, 0), + (3536, 'red_diner_d', 'desc', '1', 'red_diner_d', 2, 1, 485, 1, 0), + (3537, 'red_diner_e', 'desc', '1', 'red_diner_e', 2, 1, 485, 1, 0), + (3538, 'red_diner_e_acc', 'desc', '1', 'red_diner_e_acc', 2, 1, 485, 1, 0), + (3539, 'red_diner_e_cc_grave', 'desc', '1', 'red_diner_e_cc_grave', 2, 1, 485, 1, 0), + (3540, 'red_diner_eight', 'desc', '1', 'red_diner_eight', 2, 1, 485, 1, 0), + (3541, 'red_diner_exclamation', 'desc', '1', 'red_diner_exclamation', 2, 1, 485, 1, 0), + (3542, 'red_diner_f', 'desc', '1', 'red_diner_f', 2, 1, 485, 1, 0), + (3543, 'red_diner_five', 'desc', '1', 'red_diner_five', 2, 1, 485, 1, 0), + (3544, 'red_diner_four', 'desc', '1', 'red_diner_four', 2, 1, 485, 1, 0), + (3545, 'red_diner_g', 'desc', '1', 'red_diner_g', 2, 1, 485, 1, 0), + (3546, 'red_diner_h', 'desc', '1', 'red_diner_h', 2, 1, 485, 1, 0), + (3547, 'red_diner_i', 'desc', '1', 'red_diner_i', 2, 1, 485, 1, 0), + (3548, 'red_diner_j', 'desc', '1', 'red_diner_j', 2, 1, 485, 1, 0), + (3549, 'red_diner_k', 'desc', '1', 'red_diner_k', 2, 1, 485, 1, 0), + (3550, 'red_diner_l', 'desc', '1', 'red_diner_l', 2, 1, 485, 1, 0), + (3551, 'red_diner_m', 'desc', '1', 'red_diner_m', 2, 1, 485, 1, 0), + (3552, 'red_diner_n', 'desc', '1', 'red_diner_n', 2, 1, 485, 1, 0), + (3553, 'red_diner_nine', 'desc', '1', 'red_diner_nine', 2, 1, 485, 1, 0), + (3554, 'red_diner_o', 'desc', '1', 'red_diner_o', 2, 1, 485, 1, 0), + (3555, 'red_diner_o_accute', 'desc', '1', 'red_diner_o_accute', 2, 1, 485, 1, 0), + (3556, 'red_diner_o_cc_grave', 'desc', '1', 'red_diner_o_cc_grave', 2, 1, 485, 1, 0), + (3557, 'red_diner_o_umlaut', 'desc', '1', 'red_diner_o_umlaut', 2, 1, 485, 1, 0), + (3558, 'red_diner_one', 'desc', '1', 'red_diner_one', 2, 1, 485, 1, 0), + (3559, 'red_diner_p', 'desc', '1', 'red_diner_p', 2, 1, 485, 1, 0), + (3560, 'red_diner_q', 'desc', '1', 'red_diner_q', 2, 1, 485, 1, 0), + (3561, 'red_diner_question', 'desc', '1', 'red_diner_question', 2, 1, 485, 1, 0), + (3562, 'red_diner_r', 'desc', '1', 'red_diner_r', 2, 1, 485, 1, 0), + (3563, 'red_diner_s', 'desc', '1', 'red_diner_s', 2, 1, 485, 1, 0), + (3564, 'red_diner_seven', 'desc', '1', 'red_diner_seven', 2, 1, 485, 1, 0), + (3565, 'red_diner_six', 'desc', '1', 'red_diner_six', 2, 1, 485, 1, 0), + (3566, 'red_diner_t', 'desc', '1', 'red_diner_t', 2, 1, 485, 1, 0), + (3567, 'red_diner_three', 'desc', '1', 'red_diner_three', 2, 1, 485, 1, 0), + (3568, 'red_diner_two', 'desc', '1', 'red_diner_two', 2, 1, 485, 1, 0), + (3569, 'red_diner_u', 'desc', '1', 'red_diner_u', 2, 1, 485, 1, 0), + (3570, 'red_diner_u_acc', 'desc', '1', 'red_diner_u_acc', 2, 1, 485, 1, 0), + (3571, 'red_diner_u_acc_grave', 'desc', '1', 'red_diner_u_acc_grave', 2, 1, 485, 1, 0), + (3572, 'red_diner_u_umlaut', 'desc', '1', 'red_diner_u_umlaut', 2, 1, 485, 1, 0), + (3573, 'red_diner_upsidedown', 'desc', '1', 'red_diner_upsidedown', 2, 1, 485, 1, 0), + (3574, 'red_diner_v', 'desc', '1', 'red_diner_v', 2, 1, 485, 1, 0), + (3575, 'red_diner_w', 'desc', '1', 'red_diner_w', 2, 1, 485, 1, 0), + (3576, 'red_diner_x', 'desc', '1', 'red_diner_x', 2, 1, 485, 1, 0), + (3577, 'red_diner_y', 'desc', '1', 'red_diner_y', 2, 1, 485, 1, 0), + (3578, 'red_diner_z', 'desc', '1', 'red_diner_z', 2, 1, 485, 1, 0), + (3464, 'olym_carson', 'desc', '1', 'olym_carson', 2, 1, 453, 1, 0), + (3465, 'olym_cresthawk', 'desc', '1', 'olym_cresthawk', 2, 1, 453, 1, 0), + (3466, 'olym_inari', 'desc', '1', 'olym_inari', 2, 1, 453, 1, 0), + (3467, 'olym_jandelee', 'desc', '1', 'olym_jandelee', 2, 1, 453, 1, 0), + (3468, 'olym_lady', 'desc', '1', 'olym_lady', 2, 1, 453, 1, 0), + (3469, 'olym_loderse', 'desc', '1', 'olym_loderse', 2, 1, 453, 1, 0), + (3470, 'olym_moiraine', 'desc', '1', 'olym_moiraine', 2, 1, 453, 1, 0), + (3471, 'olym_nme', 'desc', '1', 'olym_nme', 2, 1, 453, 1, 0), + (3472, 'olym_smoothcriminal', 'desc', '1', 'olym_smoothcriminal', 2, 1, 453, 1, 0), + (3473, 'olym_spartan', 'desc', '1', 'olym_spartan', 2, 1, 453, 1, 0), + (3474, 'olym_squib', 'desc', '1', 'olym_squib', 2, 1, 453, 1, 0), + (3475, 'olym_thegirls', 'desc', '1', 'olym_thegirls', 2, 1, 453, 1, 0), + (2655, '25_146x146_habbo_sticker_fi', 'desc', '1', '25_146x146_habbo_sticker_fi', 2, 1, 470, 1, 0), + (2713, 'backtoschool_badapple', 'desc', '1', 'backtoschool_badapple', 2, 1, 488, 1, 0), + (2715, 'backtoschool_trophy', 'desc', '1', 'backtoschool_trophy', 2, 1, 130, 1, 0), + (2873, 'checker_border_h', 'desc', '1', 'checker_border_h', 2, 1, 482, 1, 0), + (2874, 'checker_border_v', 'desc', '1', 'checker_border_v', 2, 1, 482, 1, 0), + (3148, 'habbo_x_home_sticker', 'desc', '1', 'habbo_x_home_sticker', 2, 1, 130, 1, 0), + (3180, 'hw_bassplayer_girl2', 'desc', '1', 'hw_bassplayer_girl2', 2, 1, 459, 1, 0), + (3210, 'hw_keyboards1', 'desc', '1', 'hw_keyboards1', 2, 1, 467, 1, 0), + (3211, 'hw_keyboards2', 'desc', '1', 'hw_keyboards2', 2, 1, 467, 1, 0), + (3512, 'pretzel', 'desc', '1', 'pretzel', 2, 1, 453, 1, 0), + (3927, 'teensbear', 'desc', '1', 'teensbear', 2, 1, 445, 1, 0), + (3945, 'tiki_volcano', 'desc', '1', 'tiki_volcano', 2, 1, 473, 1, 0), + (4160, '10kbc_habbo_grouppage_bg_2b', 'desc', '4', '10kbc_habbo_grouppage_bg_2b', 2, 1, 104, 1, 0), + (4161, '10kbc_habbo_grouppage_bg_3b', 'desc', '4', '10kbc_habbo_grouppage_bg_3b', 2, 1, 104, 1, 0), + (4162, '26_habbo_background_fi', 'desc', '4', '26_habbo_background_fi', 2, 1, 104, 1, 0), + (4182, 'au_iflyvampwasp_bg_v1', 'desc', '4', 'au_iflyvampwasp_bg_v1', 2, 1, 104, 1, 0), + (4183, 'au_iflyvampwasp_bg_v2', 'desc', '4', 'au_iflyvampwasp_bg_v2', 2, 1, 104, 1, 0), + (4186, 'au_spiderwick_bg', 'desc', '4', 'au_spiderwick_bg', 2, 1, 104, 1, 0), + (4187, 'background_momie3_928x1360', 'desc', '4', 'background_momie3_928x1360', 2, 1, 104, 1, 0), + (4189, 'backtoschool_wallpaper', 'desc', '4', 'backtoschool_wallpaper', 2, 1, 104, 1, 0), + (4194, 'bg_alhambra', 'desc', '4', 'bg_alhambra', 2, 1, 104, 1, 0), + (4195, 'bg_animegroup', 'desc', '4', 'bg_animegroup', 2, 1, 104, 1, 0), + (4251, 'bg_moviesgroup', 'desc', '4', 'bg_moviesgroup', 2, 1, 104, 1, 0), + (4252, 'bg_musicgroup', 'desc', '4', 'bg_musicgroup', 2, 1, 104, 1, 0), + (4296, 'bg_videogamesgroup', 'desc', '4', 'bg_videogamesgroup', 2, 1, 104, 1, 0), + (4309, 'camocheese_wallpaper', 'desc', '4', 'camocheese_wallpaper', 2, 1, 104, 1, 0), + (4319, 'cw_group_1', 'desc', '4', 'cw_group_1', 2, 1, 104, 1, 0), + (4321, 'cw_group_2', 'desc', '4', 'cw_group_2', 2, 1, 104, 1, 0), + (4323, 'cw_poster', 'desc', '4', 'cw_poster', 2, 1, 104, 1, 0), + (4328, 'diner_global', 'desc', '4', 'diner_global', 2, 1, 104, 1, 0), + (4337, 'easter_eggs_wallpaper', 'desc', '4', 'easter_eggs_wallpaper', 2, 1, 104, 1, 0), + (4371, 'guitarhero', 'desc', '4', 'guitarhero', 2, 1, 104, 1, 0), + (4372, 'gyroscope_grouppage_bg_v1', 'desc', '4', 'gyroscope_grouppage_bg_v1', 2, 1, 104, 1, 0), + (4374, 'habbo_bmx_foot_jam_tailwhip_bg', 'desc', '4', 'habbo_bmx_foot_jam_tailwhip_bg', 2, 1, 104, 1, 0), + (4376, 'habbo_group_tutorial_bg', 'desc', '4', 'habbo_group_tutorial_bg', 2, 1, 104, 1, 0), + (4385, 'habbolympics_bg_final', 'desc', '4', 'habbolympics_bg_final', 2, 1, 104, 1, 0), + (4392, 'hannah_montana_background', 'desc', '4', 'hannah_montana_background', 2, 1, 104, 1, 0), + (4397, 'head_guides_germany', 'desc', '4', 'head_guides_germany', 2, 1, 104, 1, 0), + (4398, 'head_guides_switserland', 'desc', '4', 'head_guides_switserland', 2, 1, 104, 1, 0), + (4419, 'kerli_wallpaper', 'desc', '4', 'kerli_wallpaper', 2, 1, 104, 1, 0), + (4427, 'landing_page_comp', 'desc', '4', 'landing_page_comp', 2, 1, 104, 1, 0), + (4429, 'madball_2008_bg_001', 'desc', '4', 'madball_2008_bg_001', 2, 1, 104, 1, 0), + (4438, 'myspy_group', 'desc', '4', 'myspy_group', 2, 1, 104, 1, 0), + (4444, 'nicolajrasted_vip', 'desc', '4', 'nicolajrasted_vip', 2, 1, 104, 1, 0), + (4456, 'rexona_bg', 'desc', '4', 'rexona_bg', 2, 1, 104, 1, 0), + (4471, 'silversurfer', 'desc', '4', 'silversurfer', 2, 1, 104, 1, 0), + (4472, 'silversurfer 2', 'desc', '4', 'silversurfer2', 2, 1, 104, 1, 0), + (4477, 'skulls_wallpaper', 'desc', '4', 'skulls_wallpaper', 2, 1, 104, 1, 0), + (4513, 'toolbar_bg2', 'desc', '4', 'toolbar_bg2', 2, 1, 104, 1, 0), + (4514, 'top_gamers_bg', 'desc', '4', 'top_gamers_bg', 2, 1, 104, 1, 0), + (4517, 'tutorial_bg', 'desc', '4', 'tutorial_bg', 2, 1, 104, 1, 0), + (4519, 'val_bgpattern_love', 'desc', '4', 'val_bgpattern_love', 2, 1, 104, 1, 0), + (4520, 'val_bgpattern_skull', 'desc', '4', 'val_bgpattern_skull', 2, 1, 104, 1, 0), + (4529, 'wallpaper_alkalinetrio', 'desc', '4', 'wallpaper_alkalinetrio', 2, 1, 104, 1, 0), + (4532, 'wallpaper_dinerduck', 'desc', '4', 'wallpaper_dinerduck', 2, 1, 104, 1, 0), + (4533, 'wallpaper_dinergeeks', 'desc', '4', 'wallpaper_dinergeeks', 2, 1, 104, 1, 0), + (4534, 'wallpaper_dinergreasers', 'desc', '4', 'wallpaper_dinergreasers', 2, 1, 104, 1, 0), + (4535, 'wallpaper_dinerjocks', 'desc', '4', 'wallpaper_dinerjocks', 2, 1, 104, 1, 0), + (4536, 'wallpaper_dinerglobal', 'desc', '4', 'diner_global', 2, 1, 104, 1, 0), + (4538, 'wallpaper_dinerus', 'desc', '4', 'wallpaper_dinerus', 2, 1, 104, 1, 0), + (4539, 'wallpaper_droney', 'desc', '4', 'wallpaper_droney', 2, 1, 104, 1, 0), + (4541, 'wallpaper_katiestill', 'desc', '4', 'wallpaper_katiestill', 2, 1, 104, 1, 0), + (4542, 'wallpaper_lauraduncan', 'desc', '4', 'wallpaper_lauraduncan', 2, 1, 104, 1, 0), + (4543, 'wallpaper_lenka', 'desc', '4', 'wallpaper_lenka', 2, 1, 104, 1, 0), + (4544, 'wallpaper_monet', 'desc', '4', 'wallpaper_monet', 2, 1, 104, 1, 0), + (4547, 'wallpaper_sprousebrothers', 'desc', '4', 'wallpaper_sprousebrothers', 2, 1, 104, 1, 0), + (4548, 'wallpaper_submarines', 'desc', '4', 'wallpaper_submarines', 2, 1, 104, 1, 0), + (4549, 'wallpaper_tmobile', 'desc', '4', 'wallpaper_tmobile', 2, 1, 104, 1, 0), + (4574, 'Xmas 2009 xmasfun', 'desc', '4', 'xmas2009_bg_xmasfun', 2, 1, 104, 1, 0), + (10200, 'Guestbook widget', 'Guestbook', '2', 'guestbookwidget', 0, 1, 100, 1, 1), + (11200, 'Member List', 'Member List', '5', 'memberwidget', 0, 1, 100, 1, -1), + (10800, 'Traxplayer', 'Play Trax on your homepage.', '2', 'traxplayerwidget', 0, 1, 100, 1, 1), + (10700, 'Rooms Widget', 'Show your rooms in your page', '2', 'roomswidget', 0, 1, 100, 1, 1), + (10100, 'Profile widget', 'Displays infomation about yourself.', '2', 'profilewidget', 0, 1, 100, 1, 1), + (1395, 'SnowShake', 'desc', '1', 'xmas2009_snowshake', 2, 1, 105, 1, 0), + (1396, 'Bubbledrink', 'desc', '1', 'xmas2009_bubbledrink', 2, 1, 105, 1, 0), + (1397, 'Bauble', 'desc', '1', 'xmas2009_bauble', 2, 1, 105, 1, 0), + (1398, 'Cakes', 'desc', '1', 'xmas2009_cakes', 2, 1, 105, 1, 0), + (1399, 'Reindeerpin', 'desc', '1', 'xmas2009_reindeerpin', 2, 1, 105, 1, 0), + (1400, 'Elfbadge', 'desc', '1', 'xmas2009_elfbadge', 2, 1, 105, 1, 0), + (1403, 'Chile', 'desc', '1', 'stickers_chile', 2, 1, 106, 1, 0), + (1412, 'Panama', 'desc', '1', 'stickers_panama', 2, 1, 106, 1, 0), + (1401, 'Argentina', 'desc', '1', 'stickers_argentina', 2, 1, 106, 1, 0), + (1404, 'Colombia', 'desc', '1', 'stickers_colombia', 2, 1, 106, 1, 0), + (1405, 'Costa Rica', 'desc', '1', 'stickers_costarica', 2, 1, 106, 1, 0), + (1406, 'Ecuador', 'desc', '1', 'stickers_ecuador', 2, 1, 106, 1, 0), + (1407, 'ElSalvador', 'desc', '1', 'stickers_elsalvador', 2, 1, 106, 1, 0), + (1408, 'Spain', 'desc', '1', 'stickers_espain', 2, 1, 106, 1, 0), + (1409, 'Honduras', 'desc', '1', 'stickers_honduras', 2, 1, 106, 1, 0), + (1410, 'Mexico', 'desc', '1', 'stickers_mexico', 2, 1, 106, 1, 0), + (1411, 'Nicaragua', 'desc', '1', 'stickers_nicaragua', 2, 1, 106, 1, 0), + (1402, 'Bolivia', 'desc', '1', 'stickers_bolivia', 2, 1, 106, 1, 0), + (1414, 'Peru', 'desc', '1', 'stickers_peru', 2, 1, 106, 1, 0), + (1413, 'Paraguay', 'desc', '1', 'stickers_paraguay', 2, 1, 106, 1, 0), + (1415, 'Uruguay', 'desc', '1', 'stickers_uruguay', 2, 1, 106, 1, 0), + (1416, 'Venezuela', 'desc', '1', 'stickers_venezuela', 2, 1, 106, 1, 0), + (1418, 'Cheetos Rizo', 'desc', '1', 'Cheetos_Rizo_sticker_v1', 2, 1, 107, 1, 0), + (1417, 'Cheetos Pandilla', 'desc', '1', 'Cheetos_Pandilla_sticker_v1_002', 2, 1, 107, 1, 0), + (1419, 'Cheetos HotDog', 'desc', '1', 'Cheetos_HotDog_sticker_v2', 2, 1, 107, 1, 0), + (1420, 'Cheetos AfroDJ', 'desc', '1', 'Cheetos_AfroDJ_sticker_v1', 2, 1, 107, 1, 0), + (1421, 'Cheetos Tshirt', 'desc', '1', 'Cheetos_Tshirt_sticker_v1', 2, 1, 107, 1, 0), + (1422, 'Cheetos Hat', 'desc', '1', 'Cheetos_Hat_sticker_v1', 2, 1, 107, 1, 0), + (1423, 'Cheetos Chester 1', 'desc', '1', 'Cheetos_Chester1_sticker_v1', 2, 1, 107, 1, 0), + (1424, 'Cheetos Chester 2', 'desc', '1', 'Cheetos_Chester2_sticker_v1', 2, 1, 107, 1, 0), + (1425, 'Cheetos Chester 3', 'desc', '1', 'Cheetos_Chester3_sticker_v1', 2, 1, 107, 1, 0), + (1426, 'Cheetos Chester 4', 'desc', '1', 'Cheetos_Chester4_sticker_v1', 2, 1, 107, 1, 0), + (1427, 'Cheetos Orange', 'desc', '1', 'Cheetos_orange_v1', 2, 1, 107, 1, 0), + (1428, 'Cheetos Purple', 'desc', '1', 'Cheetos_purple_v1', 2, 1, 107, 1, 0), + (2013, 'Minion 1', 'desc', '1', 'sticker_despme_1', 1, 1, 107, 1, 0), + (2014, 'Minion 2', 'desc', '1', 'sticker_despme_2', 1, 1, 107, 1, 0), + (2015, 'Minion 3', 'desc', '1', 'sticker_despMe_3', 1, 1, 107, 1, 0), + (2016, 'Minion 4', 'desc', '1', 'sticker_despMe_4', 1, 1, 107, 1, 0), + (2017, 'Minion 5', 'desc', '1', 'sticker_despMe_5', 1, 1, 107, 1, 0), + (2018, 'Fins', 'desc', '1', 'sticker_bw_fins', 2, 1, 458, 1, 0), + (2019, 'Shark', 'desc', '1', 'sticker_bw_sharkOver', 2, 1, 458, 1, 0), + (2020, 'Rock in Rio', 'desc', '1', 'pins_rockinrio', 2, 1, 451, 1, 0), + (2021, 'Crepusculo Cheetos Eclipse', 'desc', '1', 'stick_crepusculo_v03', 2, 1, 107, 1, 0), + (2093, 'Hw Card Back', 'desc', '1', 'hween10_card_back', 2, 1, 488, 1, 0), + (2094, 'Hw Card 1', 'desc', '1', 'hween10card1', 2, 1, 488, 1, 0), + (2095, 'Hw Card 2', 'desc', '1', 'hween10card2', 2, 1, 488, 1, 0), + (2096, 'Hw Card 3', 'desc', '1', 'hween10card3', 2, 1, 488, 1, 0), + (2097, 'Hw Card 4', 'desc', '1', 'hween10card4', 2, 1, 488, 1, 0), + (2098, 'Hw Card 5', 'desc', '1', 'hween10card5', 2, 1, 488, 1, 0), + (2099, 'Hw Card 6', 'desc', '1', 'hween10card6', 2, 1, 488, 1, 0), + (2115, 'Snow Lantern', 'desc', '1', 'xmas_snowlantern_anim', 5, 1, 445, 1, 0), + (2100, 'Chauves Souris', 'desc', '1', 'sticker_chauves_souris', 2, 1, 488, 1, 0), + (2101, 'Zombie', 'desc', '1', 'zombie', 2, 1, 488, 1, 0), + (2102, 'Zombie 2', 'desc', '1', 'zombie_violet', 2, 1, 488, 1, 0), + (2103, 'Zombie 3', 'desc', '1', 'zombieBoy2', 2, 1, 488, 1, 0), + (2104, 'War Child', 'desc', '1', 'warchild', 2, 1, 451, 1, 0), + (2105, 'Stick Telepizza', 'desc', '1', 'stick_telepizza_scooter', 2, 1, 107, 1, 0), + (2106, 'Grefusa', 'desc', '1', 'sticker_es_grefusa_1', 1, 1, 107, 1, 0), + (2107, 'Grefusa 2', 'desc', '1', 'sticker_es_grefusa_2', 1, 1, 107, 1, 0), + (2109, 'Easter eggs horizontal', 'desc', '1', 'easter_eggs_horizontal', 2, 1, 462, 1, 0), + (2110, 'Easter eggs vertical', 'desc', '1', 'easter_eggs_vertical_001', 2, 1, 462, 1, 0), + (2111, 'H4D 1', 'desc', '1', 'H4D_Sticker_01', 2, 1, 107, 1, 0), + (2112, 'H4D 2', 'desc', '1', 'H4D_Sticker_02', 2, 1, 107, 1, 0), + (2113, 'H4D 3', 'desc', '1', 'H4D_Sticker_04', 2, 1, 107, 1, 0), + (2114, 'Videocam', 'desc', '1', 'stick_hween09_videocam2', 5, 1, 488, 1, 0), + (2716, 'Candle', 'desc', '1', 'sticker_littleCandle', 2, 1, 130, 1, 0), + (2717, 'Plate Border', 'desc', '1', 'sticker_plateBorder_v1', 3, 1, 130, 1, 0), + (2718, 'Lumihiutale', 'desc', '1', 'ss_snowflake1', 1, 1, 445, 1, 0), + (2719, 'Spain Winner 2010', 'desc', '1', 'HW_sticker_football_win_2010_2', 2, 1, 456, 1, 0), + (2720, 'Penalty', 'desc', '1', 'chossy_maal', 2, 1, 456, 1, 0), + (2721, 'Football 1', 'desc', '1', 'Chossy', 2, 1, 456, 1, 0), + (2722, '1GOAL Sticker', 'desc', '1', '1goal_sticker', 2, 1, 456, 1, 0), + (2723, 'St 1', 'desc', '1', 'st_day1', 2, 1, 109, 1, 0), + (2724, 'St 2', 'desc', '1', 'st_day2', 2, 1, 109, 1, 0), + (2725, 'St 3', 'desc', '1', 'st_day3', 2, 1, 109, 1, 0), + (2726, 'St 4', 'desc', '1', 'st_day4', 2, 1, 109, 1, 0), + (2727, 'St 5', 'desc', '1', 'st_day5', 2, 1, 109, 1, 0), + (2728, 'Safer Internet 2008', 'desc', '1', 'SaferInternet2008', 2, 1, 109, 1, 0), + (2729, 'Sheep', 'desc', '1', 'stick_country_sheep1', 2, 1, 130, 1, 0), + (2730, 'Trophy Award', 'desc', '1', 'sticker_trophy_award', 2, 1, 130, 1, 0), + (2731, 'Dragon Sticker', 'desc', '1', 'suosikki_sticker_dragon', 3, 1, 130, 1, 0), + (2732, 'Habbolympics', 'desc', '1', 'habbolympics_teamsticker', 3, 1, 130, 1, 0), + (2733, 'Earth Our', 'desc', '1', 'earthhour_wwf_sticker', 2, 1, 130, 1, 0), + (2734, 'Trax Record Sticker', 'desc', '1', 'traxRecord_sticker', 4, 1, 130, 1, 0), + (2735, 'sticker Superheroes Cape', 'desc', '1', 'superheroes_sticker_capa_me', 2, 1, 459, 1, 0), + (2736, 'sticker Superheroes laser eye', 'desc', '1', 'superheroes_sticker_laser_eye', 2, 1, 459, 1, 0), + (2737, 'Sticker ArgHook', 'desc', '1', 'sticker_argHook', 2, 1, 459, 1, 0), + (2738, 'Sticker Piratehat ', 'desc', '1', 'sticker_pirateHat_1', 2, 1, 459, 1, 0), + (2739, 'Sticker Piratehat 2', 'desc', '1', 'sticker_pirateHat_2', 2, 1, 459, 1, 0), + (2108, 'Grefusa 3', 'desc', '1', 'stick_grefusa_remarca', 1, 1, 107, 1, 0), + (3147, 'Twilight Wolf', 'desc', '1', 'stick_twil_ww', 2, 1, 130, 1, 0), + (61, 'Y', 'desc', '1', 'y', 1, 1, 394, 1, 0), + (11301, 'Angelwings Anim', 'desc', '1', 'custom_angelwings_anim', 2, 1, 493, 1, 0), + (11302, 'Jeff Donkey', 'desc', '1', 'custom_jeff_donkey', 2, 1, 493, 1, 0), + (11303, 'Xmaslights Anim', 'desc', '1', 'custom_xmaslights_anim', 2, 1, 493, 1, 0), + (11304, 'Xmas Boxs', 'desc', '1', 'custom_xmas_boxs', 2, 1, 493, 1, 0), + (11305, 'Xmas Box Darkred2', 'desc', '1', 'custom_xmas_box_darkred2', 2, 1, 493, 1, 0), + (11306, 'Xmas Box Green', 'desc', '1', 'custom_xmas_box_green', 2, 1, 493, 1, 0), + (11307, 'Xmas Box Lime', 'desc', '1', 'custom_xmas_box_lime', 2, 1, 493, 1, 0), + (11308, 'Xmas Box Orange', 'desc', '1', 'custom_xmas_box_orange', 2, 1, 493, 1, 0), + (11309, 'Xmas Box Red', 'desc', '1', 'custom_xmas_box_red', 2, 1, 493, 1, 0), + (11310, 'Xmas Box Suit Blue', 'desc', '1', 'custom_xmas_box_suit_blue', 2, 1, 493, 1, 0), + (11311, 'Xmas Box Suit Mint', 'desc', '1', 'custom_xmas_box_suit_mint', 2, 1, 493, 1, 0), + (11312, 'Xmas Box Suit Orange', 'desc', '1', 'custom_xmas_box_suit_orange', 2, 1, 493, 1, 0), + (11313, 'Xmas Box Suit Pink', 'desc', '1', 'custom_xmas_box_suit_pink', 2, 1, 493, 1, 0), + (11314, 'Xmas Box Violet', 'desc', '1', 'custom_xmas_box_violet', 2, 1, 493, 1, 0), + (11315, 'Xmas Dogi Animated', 'desc', '1', 'custom_xmas_dogi_animated', 2, 1, 493, 1, 0), + (11316, 'Xmas Dograindeer Sticker', 'desc', '1', 'custom_xmas_dograindeer_sticker', 2, 1, 493, 1, 0), + (11317, 'Xmas Gift Afro', 'desc', '1', 'custom_xmas_gift_afro', 2, 1, 493, 1, 0), + (11318, 'Xmas Gift Strap Corner L', 'desc', '1', 'custom_xmas_gift_strap_corner_l', 2, 1, 493, 1, 0), + (11319, 'Xmas Gift Strap Corner R', 'desc', '1', 'custom_xmas_gift_strap_corner_r', 2, 1, 493, 1, 0), + (11320, 'Xmas Gift Strap H', 'desc', '1', 'custom_xmas_gift_strap_h', 2, 1, 493, 1, 0), + (11321, 'Xmas Gift Strap V', 'desc', '1', 'custom_xmas_gift_strap_v', 2, 1, 493, 1, 0), + (11322, 'Xmas Icicles', 'desc', '1', 'custom_xmas_icicles', 2, 1, 493, 1, 0), + (11323, 'Xmas Rastasanta', 'desc', '1', 'custom_xmas_rastasanta', 2, 1, 493, 1, 0), + (11324, 'Xmas Santa Typical', 'desc', '1', 'custom_xmas_santa_typical', 2, 1, 493, 1, 0), + (11325, 'Xmas Skater Costume', 'desc', '1', 'custom_xmas_skater_costume', 2, 1, 493, 1, 0), + (11326, 'Xmas Smilla Snowboard', 'desc', '1', 'custom_xmas_smilla_snowboard', 2, 1, 493, 1, 0), + (11327, 'Xmas Snowcone Costume', 'desc', '1', 'custom_xmas_snowcone_costume', 2, 1, 493, 1, 0), + (11328, 'Xmas Strap Horiz Gold', 'desc', '1', 'custom_xmas_strap_horiz_gold', 2, 1, 493, 1, 0), + (11329, 'Xmas Strap Vertical Gold', 'desc', '1', 'custom_xmas_strap_vertical_gold', 2, 1, 493, 1, 0), + (11330, 'Xmas Strap Vertical Silver', 'desc', '1', 'custom_xmas_strap_vertical_silver', 2, 1, 493, 1, 0), + (11331, 'Xmas Tree01 Animated', 'desc', '1', 'custom_xmas_tree01_animated', 2, 1, 493, 1, 0), + (11332, 'Xmas Tree Costume', 'desc', '1', 'custom_xmas_tree_costume', 2, 1, 493, 1, 0), + (11333, 'Xmas Xtree Sticker', 'desc', '1', 'custom_xmas_xtree_sticker', 2, 1, 493, 1, 0), + (11334, 'Childline Background 1', 'desc', '4', 'bg_NSPCC_parkscene_bg', 3, 1, 104, 1, 0), + (11335, 'Childline Background 2', 'desc', '4', 'bg_NSPCC_num2_bg', 3, 1, 104, 1, 0), + (11336, 'Childline Background 3', 'desc', '4', 'group_nspcc2_928x136_bg', 3, 1, 104, 1, 0), + (11337, 'Childline Background 4', 'desc', '4', 'bg_nspcc_birthday_bg', 3, 1, 104, 1, 0); +/*!40000 ALTER TABLE `cms_stickers_catalogue` ENABLE KEYS */; + +-- Dumping structure for table havana.cms_stickers_categories +CREATE TABLE IF NOT EXISTS `cms_stickers_categories` ( + `id` int(11) NOT NULL, + `name` varchar(50) NOT NULL, + `min_rank` int(11) DEFAULT 1, + `category_type` tinyint(4) DEFAULT 1, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.cms_stickers_categories: ~56 rows (approximately) +DELETE FROM `cms_stickers_categories`; +/*!40000 ALTER TABLE `cms_stickers_categories` DISABLE KEYS */; +INSERT INTO `cms_stickers_categories` (`id`, `name`, `min_rank`, `category_type`) VALUES + (101, 'Notes', 1, 3), + (102, 'Trax', 1, 1), + (104, 'Backgrounds', 1, 2), + (105, 'Christmas 09', 1, 1), + (106, 'Flags', 1, 1), + (107, 'Promos', 1, 1), + (109, 'Safe Internet Day', 1, 1), + (130, 'Others', 1, 1), + (138, 'Borders', 1, 1), + (171, 'Cute', 1, 1), + (182, 'Alphabet Bling', 1, 1), + (270, 'Pointers', 1, 1), + (394, 'Alphabet Plastic', 1, 1), + (442, 'Spring', 1, 1), + (443, 'Special Effects', 1, 1), + (444, 'Deals', 1, 1), + (445, 'Winter', 1, 1), + (446, 'Battle Ball', 1, 1), + (449, 'OB', 1, 1), + (451, 'Buttons', 1, 1), + (452, 'Alhambra', 1, 1), + (453, 'Avatars', 1, 1), + (454, 'Apartment 732', 1, 1), + (456, 'Football', 1, 1), + (457, 'Banks', 1, 1), + (458, 'Summer', 1, 1), + (459, 'Costume', 1, 1), + (460, 'WWE', 1, 1), + (461, 'Beach', 1, 1), + (462, 'Easter', 1, 1), + (465, 'Paper Mario', 1, 1), + (466, 'China', 1, 1), + (467, 'Habbowood', 1, 1), + (468, 'Celebration', 1, 1), + (469, 'Highlighter', 1, 1), + (470, 'Advertisments', 1, 1), + (471, 'Inked', 1, 1), + (472, 'Prices', 1, 1), + (473, 'Tiki', 1, 1), + (475, 'Keep It Real (NOT!)', 1, 1), + (476, 'Japanese', 1, 1), + (479, 'Sparkle', 1, 1), + (480, 'Alphabet Diner Blue', 1, 1), + (481, 'Batman Darknight', 1, 1), + (482, 'Diner', 1, 1), + (483, 'Alphabet Diner Green', 1, 1), + (484, 'St Patrick', 1, 1), + (485, 'Alphabet Diner Red', 1, 1), + (486, 'Alphabet Wood', 1, 1), + (487, 'Sea', 1, 1), + (488, 'Halloween', 1, 1), + (489, 'Valentine', 1, 1), + (490, 'Money', 1, 1), + (491, 'Hockey', 1, 1), + (492, 'Rock', 1, 1), + (493, 'Christmas 07', 1, 1); +/*!40000 ALTER TABLE `cms_stickers_categories` ENABLE KEYS */; + +-- Dumping structure for table havana.external_texts +CREATE TABLE IF NOT EXISTS `external_texts` ( + `entry` varchar(255) NOT NULL, + `text` text NOT NULL, + KEY `entry` (`entry`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.external_texts: ~45,662 rows (approximately) +DELETE FROM `external_texts`; +/*!40000 ALTER TABLE `external_texts` DISABLE KEYS */; +INSERT INTO `external_texts` (`entry`, `text`) VALUES + ('furni_sound_machine_desc', 'Creating fancy sounds'), + ('cancel', 'Cancel'), + ('furni_hyacinth2_desc', 'Beautiful bulb'), + ('nav_venue_library/0_name', 'Habbo Library'), + ('furni_waterbowl*1_desc', 'Aqua unlimited'), + ('furni_grand_piano*5_desc', 'Why is that key green?'), + ('furni_table_plasto_bigsquare*8_name', 'Square Dining Table'), + ('furni_nouvelle_trax_name', 'nouvelle_trax'), + ('help_choise_header', 'What do you need help with?'), + ('furni_bardeskcorner_polyfon*7_name', 'Green Mode Bardesk Corner'), + ('furni_pillar*4_name', 'Dark Ages Pillar'), + ('furni_queue_tile1*6_desc', 'The power of movement'), + ('club_intro_link', 'Learn more about Habbo Club!'), + ('furni_sandrug_desc', 'Your own paradise island'), + ('poster_10_desc', 'Beautiful sunset'), + ('furni_divider_nor1_name', 'Ice Corner'), + ('nav_venue_bb_lobby_tournament_6_name', 'Competitie Battle Ball 7'), + ('furni_redhologram_desc', 'You\'re her only hope...'), + ('poster_38_name', 'Smiling Headbangerz'), + ('furni_hc_crtn_name', 'Antique Drapery'), + ('furni_barchair_silo*9_name', 'Red Bar Stool'), + ('room_badge_visible', 'Visible'), + ('furni_sleepingbag*8_name', 'Golden Sleeping Bag'), + ('roomevent_invalid_input', 'You must give your event a name and a description.'), + ('furni_chair_plasto*14_name', 'HC chair'), + ('poster_522_desc', 'The flag of Japan'), + ('furni_shelves_norja*2_name', 'Black Bookcase'), + ('nav_venue_dusty_lounge_name', 'Dusty Lounge'), + ('furni_sound_set_53_desc', 'Break the icy silence'), + ('nav_venue_ice_cafe_name', 'Ice Cafe'), + ('click', 'OK to continue to the hotel.'), + ('nav_venue_sw_lobby_free_2/0_desc', ''), + ('furni_rare_dragonlamp*9_name', 'Purple Dragon Lamp'), + ('furni_statue_desc', 'Watch out for those arrows!'), + ('game_battles_turn', 'TURN'), + ('wallitem_jp_sheet3_desc', 'jp_sheet3'), + ('furni_edicehc_desc', 'Click and roll!'), + ('furni_bed_budget*6_name', 'Blue Pura Double Bed'), + ('furni_gothic_sofa*5_desc', 'The dark side of Habbo'), + ('furni_scifirocket*5_desc', 'From the unknown depths of space'), + ('game_poker_ready', 'READY'), + ('furni_queue_tile1*2_name', 'Red Habbo Roller'), + ('furni_rare_parasol_desc', 'Zon! Zon! Zon!'), + ('transaction_system_sms_dna', 'DNA'), + ('furni_bar_polyfon_name', 'Mini-Bar'), + ('furni_grand_piano*1_name', 'Turquoise Grand Piano'), + ('nav_venue_bb_lobby_expert_4_name', 'Experts Battle Ball 5'), + ('bb_link_highscores', 'Highscores'), + ('summer_chair_8_desc', 'The summer winds are creeping in'), + ('reg_parentemail_title2', 'Email address of parent/guardian:'), + ('error_report_explain', 'An error has occurred, please see the error code above.'), + ('console_noprofile', 'Habbo Profile Not Found'), + ('furni_glass_sofa*3_desc', 'Translucent beauty'), + ('furni_romantique_smalltabl*4_desc', 'Why is one leg different?'), + ('furni_table_plasto_4leg*14_name', 'HC table'), + ('nav_venue_bb_lobby_intermediate_2_name', 'Semi-profs Battle Ball 3'), + ('NUF_playing_games_gamerooms_tutor', 'Click the \'Go\' button to go to the Game Lounge.'), + ('habboclub_require_parent_permission', 'You need to tick the box to say that you are over 14 years or age, \\ror under 14 and have your parent/guardian\'s permission to join Habbo Club. \\rPlease go back and tick the box.'), + ('furni_wooden_screen*1_desc', 'Add an exotic touch to your room'), + ('nav_venue_bb_lobby_intermediate_4/0_desc', ''), + ('furni_glass_sofa*6_name', 'Blue Glass Sofa'), + ('furni_bench_armas_desc', 'To complete the dining set'), + ('furni_barchair_silo*2_name', 'Black Bar Stool'), + ('nav_venue_bb_lobby_expert_6/0_desc', ''), + ('furni_jp_tray2_desc', 'jp_tray2'), + ('furni_val_teddy*3_desc', 'The green bear of friendship'), + ('transaction_system_sms_win_vodafone', 'Vodafone SMS'), + ('furni_glass_sofa_name', 'Glass sofa'), + ('console_online', 'online:'), + ('poster_2004_desc', 'irie!'), + ('x', 'X'), + ('nav_venue_habbo_lido/0_desc', 'Pool is open for swimming and diving!'), + ('furni_soft_sofachair_norja_name', 'iced sofachair'), + ('furni_xmas_cstl_twr_name', 'Ice Castle Tower'), + ('nav_venue_park_name', 'Habbo Gardens'), + ('recycler_info_open', 'Ecotron is the place to visit if you want to recycle your old Furniture. Simply drag the old Furni from your hand to the empty slots below. Recyclable items display the green recyclable tag in your hand. Please note that you must own the Furniture for at least %quarantine_hours% hour before they can be recycled. Recycling takes a total of %total_hours% hours.'), + ('group_window_title', 'Habbo Groups'), + ('pet.saying.eat.dog.4', 'Mmmmm..'), + ('game_chess', 'Chess'), + ('pet.saying.eat.dog.2', 'slurp, slurp, slurp'), + ('roomatic_roomdesc', 'Room description:'), + ('furni_sofa_polyfon*7_desc', 'Green Mode Sofa'), + ('pet.saying.eat.dog.3', 'hrum, umm, umm grrr'), + ('pet.saying.eat.dog.0', 'hrum, hrum, crunch!'), + ('preview_downloading', 'Preview downloading...'), + ('sound_machine_confirm_close_long', 'Are you sure you want to leave the editor without saving the song?'), + ('partner_registration_title', 'Hey, I forgot to mention one thing..'), + ('pet.saying.eat.dog.1', 'crunch, crunch mmmm'), + ('nav_venue_bb_lobby_tournament_12/0_desc', ''), + ('furni_carpet_soft*3_name', 'Soft Wool Rug'), + ('furni_sound_set_56_name', 'RnB Grooves 2'), + ('reg_termslink', 'Terms and Conditions'), + ('wallitem_sw_swords_desc', 'Z for Zorro'), + ('furni_sleepingbag*10_name', 'Khaki Sleeping Bag'), + ('furni_hc_dsk_name', 'Study Desk'), + ('furni_chair_silo*8_desc', 'Keep it simple'), + ('furni_glass_chair*8_name', 'Glass chair'), + ('nav_venue_cafe_ole_name', 'Cafe ole'), + ('furni_sleepingbag*5_desc', 'Ultimate coziness'), + ('opening_hours_text_closed', 'The Hotel has been closed and will be open to the public again at %h%:%m%.'), + ('furni_grunge_bench_desc', 'Laid back seating'), + ('BuddyNotHere', 'Offline'), + ('furni_noob_lamp*5_desc', 'Get the light right where you want it (pink)'), + ('NUH_navigator', 'Use the Navigator to move around. There are literally thousands of rooms to explore!'), + ('poster_1338_name', 'Pedobear Seal of Approval'), + ('furni_queue_tile1*9_name', 'Green Habbo Roller'), + ('furni_habboween_crypt_desc', 'What lurks inside?'), + ('furni_sofachair_silo*9_name', 'Red Area Armchair'), + ('furni_exe_chair_name', 'Executive Sofa Chair'), + ('furni_rare_dragonlamp*6_desc', 'Scary and scorching!'), + ('furni_divider_nor2*3_desc', 'Strong, yet soft looking'), + ('furni_tile_yell_name', 'Floor Tiles'), + ('furni_plant_yukka_name', 'Yukka Plant'), + ('furni_wooden_screen*8_desc', 'Add an exotic touch to your room'), + ('furni_pillar*8_desc', 'All roads lead to Rome'), + ('trading_youoffer', 'You offer:'), + ('furni_marquee*8_desc', 'It\'s both door and a shade!'), + ('furni_pura_mdl4*9_name', 'Red Pura Module 4'), + ('roomatic_congrats', 'Congratulations! You\'re now the proud owner of your own Habbo Hotel room.'), + ('furni_tile_marble_name', 'Marble Tile'), + ('furni_bed_budget*3_desc', 'King sized comfort!'), + ('furni_sound_machine*3_desc', 'Top the Habbo Charts!'), + ('nav_venue_bb_lobby_beginner_10_name', 'Beginners Battle Ball 11'), + ('nav_venue_bb_lobby_tournament_1/0_desc', ''), + ('poster_2000_name', 'Suomen kartta'), + ('furni_solarium_norja*3_name', 'Urban Solarium'), + ('furni_present_gen3_desc', 'What\'s inside?'), + ('furni_glass_stool*4_desc', 'Translucent beauty'), + ('int_update_id', 'Update My Habbo ID >>'), + ('nav_venue_bb_lobby_beginner_8/0_desc', ''), + ('furni_carpet_standard*8_desc', 'Available in a variety of colours'), + ('furni_pillar*1_desc', 'Ancient and stately'), + ('receive_invitation_text', 'invites you his/her room. Accept invitation?'), + ('poll_offer_window', 'Welcome to our poll'), + ('furni_table_plasto_bigsquare*5_desc', 'Hip plastic furniture'), + ('furni_carpet_standard*1_desc', 'Available in a variety of colours'), + ('furni_hologram_name', 'Holopod'), + ('nav_venue_bb_lobby_amateur_desc', 'Amateur battle ball!'), + ('furni_barchair_silo*6_desc', 'Practical and convenient'), + ('furni_divider_nor5_desc', 'Cool cornering for your crib y0!'), + ('purse_vouchers_helpbutton', 'More about vouchers >>'), + ('furni_shelves_norja*6_desc', 'For nic naks and art deco books'), + ('nav_venue_sw_lobby_tournament_5/0_desc', ''), + ('furni_chair_basic*4_desc', 'It\'s a cracking design!'), + ('nav_hidefull', 'Hide Full Rooms'), + ('modtool_ban_computer', 'Ban Computer Also'), + ('furni_gothic_sofa*1_name', 'Gothic Sofa Pink'), + ('furni_carpet_standard*b_name', 'Floor Rug'), + ('queue_line', 'You are queueing right now...'), + ('furni_divider_nor1*6_desc', 'Blue Ice corner'), + ('nav_search_helptext', 'Looking for something? Here you can search other Habbo\'s rooms. Type the room name or the name of the Habbo to search for a room.'), + ('furni_marquee*1_desc', 'It\'s both door and a shade!'), + ('furni_rcandleset_desc', 'Simple but stylish'), + ('nav_room_banned', 'You are banned from this room.'), + ('furni_lamp_armas_name', 'Table Lamp'), + ('catalog_costs', '\\x1 costs \\x2 Credits'), + ('furni_drinks_desc', 'Are you a slob too?'), + ('furni_pura_mdl5*6_name', 'Blue Pura Module 5'), + ('summer_chair_1_desc', 'Gotta get up early to get one!'), + ('furni_prize3_desc', 'A weighty award'), + ('furni_soft_sofa_norja*7_name', 'Rural Iced Sofa'), + ('poster_518_name', 'The Welsh flag'), + ('furni_sofachair_polyfon*8_name', 'Yellow Mode Armchair'), + ('furni_prizetrophy3*3_desc', 'Breathtaking bronze'), + ('nav_venue_sw_lobby_amateur_6_name', 'Snow Slingers Lobby'), + ('furni_stand_polyfon_z_desc', 'Tidy up'), + ('furni_carpet_soft_tut_name', 'Welcome Mat'), + ('console_reject_all', 'Reject All'), + ('month12', 'December'), + ('month11', 'November'), + ('help_topics', 'Help Topics:'), + ('nav_venue_sw_lobby_beginner_8/0_desc', ''), + ('nav_rooms_own', 'Own Room(s)'), + ('reg_pwd_note', 'Choose a password that\'s hard to guess! So, don\'t use ANYONES name, or your favorite colour!'), + ('furni_wooden_screen*4_name', 'Golden Oriental Screen'), + ('nav_venue_sw_lobby_beginner_2/0_desc', ''), + ('furni_pillow*6_desc', 'Puffy, soft and huge'), + ('furni_bed_polyfon_one*4_desc', 'Beige Mode Single Bed'), + ('reg_email_note', 'Please enter your e-mail address, this is important! You\'ll only get customer support and special offers via email, if you enter a valid email address and verify it.'), + ('group_admin', 'Administrator'), + ('furni_scifirocket*8_name', 'Pluto Smoke Machine'), + ('furni_chair_plasto*11_desc', 'Hip plastic furniture'), + ('month10', 'October'), + ('furni_goth_table_name', 'Gothic table'), + ('month05', 'May'), + ('month04', 'April'), + ('nav_modify_maxvisitors', 'Choose maximum number of visitors'), + ('nav_venue_bb_lobby_amateur_2_name', 'Gevorderden Battle Ball 3'), + ('month07', 'July'), + ('habboclub_price1', '30'), + ('month06', 'June'), + ('month01', 'January'), + ('month03', 'March'), + ('month02', 'February'), + ('furni_summer_chair*2_desc', 'Pink'), + ('month09', 'September'), + ('month08', 'August'), + ('furni_bardeskcorner_polyfon*4_desc', 'Beige Mode Bardesk Corner'), + ('furni_tree6_name', 'Flashy Christmas Tree'), + ('furni_arabian_snake_name', 'Ornamental Urn'), + ('reg_verification_incorrectPassword', 'Your password was incorrect'), + ('NUF_visting_rooms_hotelview_tutor', 'Here we go again. This time we are learning how to visit another Habbos room.'), + ('furni_summer_chair*9_desc', 'Got your sunglasses?'), + ('furni_safe_silo_name', 'Safe Minibar'), + ('furni_throne_name', 'Throne'), + ('furni_soft_sofachair_norja*8_desc', 'Yellow Iced Sofachair'), + ('NUF_console_ready_tutor', 'You can now use the Console to find some of your friends, or you can continue the tutorial.'), + ('nav_venue_picnic/0_desc', 'Don\'t forget to grab a carrot or two!'), + ('furni_bardeskcorner_polyfon_name', 'Corner Cabinet/Desk'), + ('game_placeship', 'Place your ships:'), + ('furni_glass_table*7_desc', 'Habbo Club'), + ('poster_13_name', 'BW Skyline Poster'), + ('furni_jp_bamboo_name', 'Bamboo Forest'), + ('furni_plant_bulrush_name', 'Bulrush'), + ('furni_deadduck3_desc', 'With added ectoplasm'), + ('win_purse', 'Habbo Purse'), + ('furni_jp_tray5_name', 'jp_tray5'), + ('furni_hc_tbl_desc', 'Perfect for banquets'), + ('furni_shelves_norja_desc', 'For nic naks and art deco books'), + ('club_desc_3_period', '6 Months (186 days) = 105 Credits'), + ('furni_bed_budget_one*3_name', 'Black Pura Bed'), + ('poster_2_name', 'Carrot Plaque'), + ('furni_solarium_norja*7_desc', 'Fun in the sun!'), + ('poster_2007_name', 'The Father Of Habbo'), + ('gs_header_teams', 'Teams'), + ('furni_divider_poly3*9_desc', 'Border Control!'), + ('gs_button_creategame', 'Create A New Game'), + ('furni_sound_set_42_name', 'Haunted Mansion'), + ('poll_alert_invalid_selection', 'Please select fewer alternatives'), + ('furni_scifirocket*1_name', 'Saturn Smoke Machine'), + ('furni_scifidoor*10_name', 'Violet Spaceship Door'), + ('furni_sound_set_5_desc', 'The dark side of Habbo'), + ('club_confirm_gift_title', 'You have received a Habbo club gift!'), + ('bb_info_gamePrice', 'Play now for just 2 tickets.'), + ('furni_sound_machine*6_name', 'Purple Traxmachine'), + ('wallitem_arabian_swords_desc', 'Not for yielding'), + ('furni_divider_nor2*6_name', 'Blue Iced bar desk'), + ('nav_venue_sw_lobby_expert_0/0_desc', ''), + ('furni_noob_chair*1_name', 'My first Habbo chair'), + ('group_room_link', 'Group\'s room: %room_name% >>>'), + ('sound_machine_playlist', 'Playlist'), + ('nav_venue_bb_arena_2_name', 'Battle Ball Amatöörit'), + ('roomatic_create_error', 'Error in room creation process. Please try again!'), + ('furni_couch_norja*7_desc', 'Two can perch comfortably'), + ('gs_button_spectate', 'Watch Game!'), + ('furni_sofachair_silo*6_desc', 'Blue Area Armchair'), + ('credit_redeem_button', 'Redeem'), + ('furni_valentinescreen_desc', 'Peep through and smile!'), + ('poster_511_name', 'The Dutch flag'), + ('furni_shelves_armas_name', 'Bookcase'), + ('nav_venue_habbo_lido_name', 'Habbo Lido'), + ('furni_bed_polyfon*9_name', 'Red Double Bed'), + ('furni_sofa_silo*9_name', 'Red Area Sofa'), + ('furni_pura_mdl4*6_desc', 'Any way you like it!'), + ('console_mainhelptext', 'You can use the Habbo Console to keep in constant contact with your friends using instant messages.'), + ('wallitem_jp_ninjastars_name', 'Ninja Stars'), + ('ad_note', 'Clicking this advertisement will open a new window'), + ('ph_tickets_choise2', 'Buy 20 Tickets for 6 Credits.'), + ('ph_tickets_choise1', 'Buy 2 Tickets for 1 Credit.'), + ('reg_day', 'Day'), + ('nav_venue_cunning_fox_gamehall/2_name', 'Noughts&Crosses'), + ('nav_venue_sw_lobby_tournament_6_name', 'Tournament Lobby'), + ('furni_noob_lamp*1_name', 'My first Habbo lamp'), + ('furni_petfood1_name', 'Bones Mega Multipack'), + ('furni_table_silo_med*3_name', 'White Coffee Table'), + ('pet.hotwords.jump', 'jump'), + ('furni_sleepingbag*1_name', 'Red Sleeping Bag'), + ('nav_venue_main_lobby/0_desc', 'The heart of Habbo Hotel'), + ('pet_hungry', 'Hunger:'), + ('furni_rare_fan*4_name', 'SUPERLOVE Fan'), + ('furni_sw_table_name', 'sw_table'), + ('furni_CFC_200_moneybag_name', 'Sack of Credits (China)'), + ('room_ask_friend', 'Ask to be a Friend'), + ('furni_bed_polyfon*2_name', 'Black Mode Double Bed'), + ('furni_table_norja_med_desc', 'Elegance embodied'), + ('nav_removerights', 'Reset'), + ('wallitem_hrella_poster_1_name', 'Porthole'), + ('NUF_getting_items_purse_', 'Click this link to open the Habbo Credits page in the website window.'), + ('poster_31_name', 'System of a Ban'), + ('furni_sound_set_24_name', 'Habbo Sounds 4'), + ('furni_chair_basic*7_name', 'chair_basic'), + ('poster_56_name', 'Disco Sign'), + ('furni_rare_dragonlamp*2_name', 'Jade Dragon Lamp'), + ('furni_gothic_stool*4_desc', 'Witches and Warlocks'), + ('furni_sofa_silo*2_name', 'Black Two-Seater Sofa'), + ('furni_grunge_radiator_name', 'Radiator'), + ('nav_venue_bb_lobby_amateur_9_name', 'Gevorderden Battle Ball 10'), + ('summer_chair_4_name', 'White Deck Chair'), + ('furni_sound_set_49_name', 'Club 4'), + ('messenger.email.subject', ''), + ('furni_romantique_chair*3_name', 'Turquoise Romantique Chair'), + ('furni_s_sound_machine*7_desc', 'Sound Machine Red'), + ('furni_table_plasto_round*9_desc', 'Hip plastic furniture'), + ('furni_table_plasto_4leg*7_name', 'Occasional table'), + ('club_confirm_title', 'You are about to subscribe to Habbo Club. Wise choice!'), + ('furni_romantique_pianochair*1_desc', 'Here sat the legend of 1900'), + ('furni_sofa_silo*6_desc', 'Blue Area Sofa'), + ('nav_venue_bb_lobby_tournament_11_name', 'Competitie Battle Ball 12'), + ('furni_rare_icecream*9_desc', 'Virtual bubblegum rocks!'), + ('furni_romantique_divider*1_name', 'Rose Quartz Screen'), + ('NUF_playing_games_room_ruleslink', 'Click me! But only if you want to read the game FAQs in the website.'), + ('furni_chair_silo_name', 'Dining Chair'), + ('furni_sound_set_17_desc', 'Jive\'s Alive!'), + ('dance_choose', 'Choose Dance'), + ('wallitem_industrialfan_name', 'Industrial Turbine'), + ('sound_machine_alert_invalid_song_length', 'Can\'t burn an empty song!'), + ('furni_pura_mdl1*4_desc', 'Any way you like it!'), + ('wallitem_post.it.vd_desc', 'Heart Stickies'), + ('catalog_give_petname', 'Type your pet\'s name in the grey box.'), + ('furni_pura_mdl2*1_name', 'Aqua Pura Module 2'), + ('poster_24_name', 'Hole In The Wall'), + ('win_error', 'Notice!'), + ('furni_chair_plasto*2_desc', 'Hip plastic furniture'), + ('wallitem_xmas_light_desc', 'Xmas light'), + ('furni_rubberchair*1_name', 'Blue Inflatable Chair'), + ('NUF_getting_room_roommatic_details_tutor', 'Give a name to your room, choose a category and add a description. Don\'t worry, you can change it all later.'), + ('furni_divider_poly3*2_desc', 'Black Mode Bardesk Gate'), + ('furni_plant_valentinerose*2_desc', 'Your secret love'), + ('furni_table_norja_med*7_desc', 'For larger gatherings'), + ('furni_carpet_polar_desc', 'For cuddling up on'), + ('nav_venue_sw_lobby_free_8/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('furni_summer_grill*1_name', 'Blue Barbeque Grill'), + ('furni_chair_norja*7_desc', 'Sleek and chic for each cheek'), + ('furni_joulutahti_name', 'Poinsetta'), + ('furni_exe_table_name', 'Executive Desk'), + ('furni_divider_silo3*8_desc', 'Form following function'), + ('furni_gothiccandelabra_name', 'Gothic Candelabra'), + ('transaction_system_bibit', 'Credit card'), + ('nav_venue_tv_studio/0_desc', 'Sponsored by Bobbanet.com'), + ('furni_noob_table*4_desc', 'Lightweight, practical and light blue'), + ('furni_bardesk_polyfon*3_desc', 'Perfect for work or play'), + ('room_info_rated', 'Room rating:'), + ('nav_venue_bb_lobby_beginner_2/0_desc', ''), + ('help_emergency_explanation', 'If you are experiencing a situation which is making you feel uncomfortable or unsafe, please give details below and a member of community staff will reply as soon as possible.'), + ('furni_divider_nor5*8_desc', 'Cool cornering for your crib y0!'), + ('poster_507_name', 'The French Tricolore'), + ('nav_privateRooms', 'Rooms'), + ('furni_pura_mdl2*5_desc', ''), + ('furni_sporttrack3*3_name', 'Sport goal grass'), + ('furni_sound_set_10_desc', 'Made from real Boy Bands!'), + ('furni_chair_plasto*9_desc', 'Hip plastic furniture'), + ('furni_soft_sofa_norja*4_desc', 'Sit back and relax'), + ('furni_s_sound_machine*3_name', 'Sound Machine Green'), + ('reg_spam', 'Yes, I want to get the occasional email from the Hotel Manager.'), + ('shout', 'Shout'), + ('NUF_mini_use_console_read_link', 'Click here to view the message.'), + ('furni_scifidoor*2_desc', 'There out of this world!'), + ('furni_divider_nor3*3_name', 'White Iced Gate'), + ('pet_hung_0', 'Empty'), + ('furni_table_plasto_square*1_name', 'Occasional Table'), + ('pet_hung_6', 'Stuffed'), + ('pet_hung_5', 'Full'), + ('bb_user_skill', 'Skill Level: \\x\\rScore: \\y'), + ('login_welcome', 'Welcome'), + ('pet_hung_2', 'Rumbling'), + ('pet_hung_1', 'Hungry'), + ('poster_20_name', 'Bars'), + ('pet_hung_4', 'Satisfied'), + ('pet_hung_3', 'Peckish'), + ('Alert_WrongNameOrPassword', 'Wrong name or password - please try again!'), + ('furni_romantique_pianochair*5_desc', 'I can feel air coming through...'), + ('furni_carpet_armas_desc', 'Adds instant warmth'), + ('console_removefriend_2', 'from your Friends List?'), + ('console_removefriend_1', 'Are you sure you want to remove'), + ('furni_rare_parasol*0_name', 'Green Parasol'), + ('furni_sound_set_38_name', 'Rock 6'), + ('NUF_mini_meet_people_room_wave', 'These buttons let you wave and dance. Click on your Habbo at anytime to see these buttons.'), + ('gs_skill_changed_header', 'Congratulations!'), + ('furni_chair_plasty*7_name', 'Plastic Pod Chair'), + ('furni_safe_silo*5_desc', 'Totally shatter-proof!'), + ('furni_divider_silo1*3_name', 'White Corner Shelf'), + ('nav_venue_hallway_ii_name', 'Hallway II'), + ('cam_release.help', 'Cancel Photo'), + ('nav_venue_bb_lobby_amateur_14/0_desc', ''), + ('habbo_tv_title', 'Widescreen Habbovision'), + ('purse_noevents', 'You haven\'t made any transactions yet. Click the button below to find out how to get Habbo Credits.\\rRemember: you must ask your parents permission before you buy Habbo Credits.'), + ('furni_pura_mdl2*8_name', 'yellow pura module 2'), + ('furni_CFC_10_coin_bronze_name', 'Bronze Coin (China)'), + ('sound_machine_song_remove', 'Remove song'), + ('modtool_choose_length', 'Choose Length:'), + ('sound_machine_turn_off', 'Switch Off'), + ('furni_pura_mdl1*8_desc', ''), + ('furni_spyro_desc', 'The stuff of legend'), + ('furni_pillow*2_name', 'Red Silk Pillow'), + ('furni_table_armas_desc', 'For informal dining'), + ('furni_tree3_desc', 'Any presents under it yet?'), + ('object_displayer_link_looks', 'Change avatar looks'), + ('furni_barrier*2_name', 'White Road Barrier'), + ('furni_gothic_chair*5_desc', 'The dark side of Habbo'), + ('furni_divider_nor4*4_name', 'Urban Iced Shutter'), + ('furni_camera_name', 'Camera'), + ('next_arrows', 'Next >>'), + ('furni_sound_set_60_desc', 'Love and affection!'), + ('furni_bed_polyfon_girl_one_name', 'Single Bed'), + ('NUF_mini_meet_people_user_chatfield', 'Start typing here and press \'Enter\' to chat with others.'), + ('successfully_purchase_gift_for', 'Successfully purchased gift for user %user%!'), + ('poster_49_desc', 'All that glitters...'), + ('furni_glass_table*3_name', 'Glass table'), + ('furni_divider_silo3*5_desc', 'Pink Area Gate'), + ('furni_divider_arm3_name', 'Gate (lockable)'), + ('furni_table_plasto_4leg*3_name', 'Round Dining Table'), + ('roomatic_roomnumber', 'Room number:'), + ('nav_venue_bb_lobby_beginner_5_name', 'Beginners Battle Ball 6'), + ('reg_nameAndPassTooSimilar', 'Your name and password are too similar'), + ('nav_venue_theatredrome_easter_name', 'Theatredrome Easter'), + ('nav_venue_bb_lobby_beginner_11/0_desc', ''), + ('furni_fireplace_polyfon_name', 'Fireplace'), + ('queue_set.e1.info', 'There are %e1% Habbos in front of you in the queue.'), + ('more_info_link', 'Redeem Now'), + ('furni_bed_polyfon*6_desc', 'Blue Mode Double Bed'), + ('furni_rare_icecream*5_name', 'Vanilla Ice Cream Machine'), + ('poster_500_name', 'Union Jack'), + ('furni_chair_norja*3_name', 'White Iced Chair'), + ('furni_sound_set_31_name', 'Dance 3'), + ('furni_pura_mdl3*5_name', 'beige pura module 3'), + ('furni_sporttrack2*3_desc', 'null'), + ('furni_sound_set_46_desc', 'De bada bada bo!'), + ('poster_9_name', 'Rainforest Poster'), + ('furni_romantique_pianochair*4_name', 'Amber Piano Stool'), + ('poster_515_desc', 'Waved by Swedes everywhere'), + ('furni_scifidoor*9_desc', 'There out of this world!'), + ('furni_chair_plasty*3_name', 'Plastic Pod Chair'), + ('furni_table_plasto_round*5_name', 'Round Dining Table'), + ('furni_one_way_door*9_desc', 'One at a time!'), + ('furni_calippo_desc', 'Basic model'), + ('furni_footylamp_desc', 'Can you kick it?'), + ('furni_one_way_door*2_desc', 'One way! The HC way!'), + ('furni_arabian_tray4_desc', 'Sweet, juicy and ripe'), + ('furni_divider_nor3*7_name', 'Rural Iced gate'), + ('furni_couch_norja*3_name', 'White Iced Bench'), + ('furni_pillow*9_name', 'Green Wooly Pillow'), + ('game_chooseside', 'Choose your side'), + ('start', 'Start'), + ('furni_toy1*4_desc', 'it\'s bouncy-tastic'), + ('roomevent_host', 'Host:'), + ('nav_venue_rooftop_rumble_name', 'Rooftop Rumble'), + ('nav_venue_bb_lobby_expert_0/0_desc', ''), + ('nav_venue_rooftop_rumble_ii/0_desc', 'Are you ready?'), + ('error_report_trigger_message', 'Last message ID'), + ('furni_sofachair_silo*2_name', 'Black Armchair'), + ('furni_noob_chair*5_desc', 'Lightweight, practical, with pink stripes'), + ('pet_frnd_0', 'Hostile'), + ('furni_noob_rug*3_name', 'My first Habbo rug'), + ('pet_frnd_2', 'Suspicious'), + ('pet_frnd_1', 'Angry'), + ('furni_scifiport*6_desc', 'Energy beams. No trespassers!'), + ('pet_frnd_4', 'Calm'), + ('pet_frnd_3', 'Cool'), + ('pet_frnd_6', 'Warm'), + ('pet_frnd_5', 'Friendly'), + ('pet_frnd_8', 'Loving'), + ('credit_trade_value', 'Includes credit furnis worth %value% credits.'), + ('pet_frnd_7', 'Affectionate'), + ('pet_frnd_9', 'Loyal'), + ('NUF_getting_items_purse_tutor', 'Your Purse tells you how many Habbo Credits you have. If you have a voucher code you can redeem it here by clicking the \'Vouchers\' button.'), + ('furni_chair_norja*6_name', 'Blue Chair'), + ('sound_machine_alert_machine_full', 'You already have 4 Traxpacks loaded. Eject one before adding a new Traxpack.'), + ('nav_venue_club_mammoth/0_desc', 'Monumental and magnificent. For Habbo Club members only.'), + ('NUF_getting_room_hand_tutor', 'This is your hand. It contains all your furniture. I have given you a rug so that you can place it in your room- click and drag it to set it down.'), + ('reg_check_name', 'Name'), + ('furni_glass_stool*7_name', 'Green Glass Stool'), + ('poster_504_name', 'The Bundesflagge'), + ('poster_42_desc', 'Not something you want to run into'), + ('pet.saying.sleep.dog.6', '*dreaming*'), + ('pet.saying.sleep.dog.5', 'Zzzzz wuff! zzzzz'), + ('pet.saying.sleep.dog.4', 'hrrrrr...murrmm..'), + ('furni_pura_mdl4*2_desc', 'Any way you like it!'), + ('pet.saying.sleep.dog.3', 'bzz.. oof oof'), + ('furni_sofa_silo*5_name', 'Pink Area Sofa'), + ('pet.saying.sleep.dog.2', 'hrrr.. hrrr'), + ('pet.saying.sleep.dog.1', 'bzz.. bzzzzz'), + ('furni_petfood4_name', 'T-Bones Mega Multipack'), + ('nav_venue_club_mammoth_name', 'Club Mammoth'), + ('ph_keys_dive', 'Diving moves:'), + ('furni_noob_table*3_name', 'My first Habbo table'), + ('furni_romantique_divan*5_desc', 'Is that a cape hanging there?'), + ('furni_table_plasto_round*8_name', 'Round Dining Table'), + ('furni_rare_fan*1_name', 'Blue Powered Fan'), + ('reg_forcedupdate2', 'Update your Habbo info'), + ('furni_table_plasto_square*4_name', 'Square Dining Table'), + ('NUF_playing_games', 'Playing games'), + ('furni_prizetrophy2*2_name', 'Duck trophy'), + ('reg_forcedupdate3', 'The Habbo Hotel management requires all Habbos to read and agree to the service Terms and Conditions. It won\'t take long.\\rJust go through the registration, check your info and agree to the new terms. Thank you!'), + ('nav_venue_sw_lobby_tournament_2_name', 'Tournament Lobby'), + ('furni_carpet_standard*4_name', 'Floor Rug'), + ('furni_s_sound_machine*6_name', 'Sound Machine Purple'), + ('furni_prizetrophy5*1_desc', 'Glittery gold'), + ('furni_table_plasto_square_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_beginner_2_name', 'Beginners Battle Ball 3'), + ('furni_rubberchair*4_name', 'Ocean Inflatable Chair'), + ('furni_divider_poly3*5_desc', 'Keep the Pink in!'), + ('furni_arabian_teamk_name', 'Tea Maker'), + ('room_name', 'Room:'), + ('nav_venue_chill/0_desc', 'Come chill in the Zen Garden!'), + ('furni_summer_grill*4_name', 'Green Barbeque Grill'), + ('poster_1001_desc', 'even walls have ears'), + ('furni_rare_icecream*8_name', 'Peppermint Ice Cream Machine'), + ('furni_safe_silo*9_desc', 'Totally shatter-proof!'), + ('sound_machine_song_save', 'Save song'), + ('NUF_getting_room_navigator_ownrooms', 'Click the \'Own Room(s)\' tab to see your rooms.'), + ('furni_gothic_chair*1_desc', 'The dark side of Habbo'), + ('furni_table_plasto_square*8_name', 'Square Dining Table'), + ('furni_safe_silo*2_desc', 'Totally shatter-proof!'), + ('roomevent_create_description', 'Describe your event'), + ('purse_vouchers_success', 'Voucher was successfully redeemed. You have the Credits.'), + ('furni_gothic_carpet2_name', 'Dungeon Floor'), + ('furni_sofa_polyfon*3_name', 'White Two-seater Sofa'), + ('furni_romantique_tray2_name', 'Treats Tray'), + ('nav_modify_doorstatus_locked', 'Locked (visitors have to ring the bell)'), + ('NUF_visiting_rooms_categorylist_open', 'Click the \'Open\' button to open a category.'), + ('room_doorbell', 'Rings the doorbell - Open the door?'), + ('furni_sound_set_45_name', 'Lost_Beatness'), + ('nav_deleteroom', 'Delete'), + ('furni_barchair_silo_name', 'Bar Stool'), + ('furni_chair_plasto*5_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_tournament_14_name', 'Competitie Battle Ball 15'), + ('furni_pura_mdl1*1_desc', 'Any way you like it!'), + ('furni_rare_snowrug_desc', 'Chilled Elegance'), + ('poster_35_desc', 'The Hotel\'s girlband. Dream on!'), + ('furni_glass_stool_desc', 'Translucent beauty'), + ('furni_rare_fan*8_name', 'Habbo Wind Turbine'), + ('furni_menorah_desc', 'Light up your room'), + ('furni_table_silo_small*7_desc', 'Green Area Occasional Table'), + ('furni_divider_silo1*7_name', 'Green Area Corner Shelf'), + ('furni_romantique_divan*1_desc', 'null'), + ('furni_table_plasto_round*1_name', 'Round Dining Table'), + ('reg_changeEmail', 'Change your email'), + ('hobba_mark_normal', 'Send To Helpers'), + ('nav_venue_bb_lobby_tournament_8/0_desc', ''), + ('ph_tickets_have2', 'Tickets'), + ('nav_venue_sw_lobby_intermediate_0/0_desc', ''), + ('ph_tickets_have1', 'You Have'), + ('furni_bardesk_polyfon*7_desc', 'Green Mode Bardesk'), + ('console_inprivateroom', 'In A Guest Room'), + ('furni_sound_set_35_name', 'Dance 6'), + ('GoAway', 'Leave The Room'), + ('room_kick', 'Kick'), + ('furni_rubberchair*8_name', 'Black Inflatable Chair'), + ('poster_6_name', 'Abstract Poster'), + ('hubu_t1_3', ''), + ('NUF_meeting_people', 'Meeting people'), + ('nav_venue_bb_lobby_amateur_4/0_desc', ''), + ('nav_venue_bb_game/0_name', 'Battle Ball Arena'), + ('furni_pudding_name', 'Christmas Pudding'), + ('furni_tile_red_name', 'Floor Tiles'), + ('catalog_typeurname', 'Type your greetings here\\r(don\'t forget to put your name!):'), + ('furni_house2_name', 'Gingerbread House'), + ('hubu_t1_1', 'Kaupunkien pu_t2_2=Katso onko kotisi l_1=Tietoa Hubusta'), + ('furni_glass_table*4_desc', 'Translucent beauty'), + ('hubu_t1_2', ''), + ('nav_venue_club_massiva/1_name', 'Chill-out Room'), + ('furni_scifiport*2_desc', 'Get in the ring!'), + ('furni_traffic_light*4_name', 'Yellow Traffic Light'), + ('furni_tree2_name', 'Old Christmas Tree'), + ('furni_noob_stool*4_name', 'My first Habbo stool'), + ('done', 'Done'), + ('furni_goodie1*1_name', 'Marzipan Man'), + ('nav_venue_bb_lobby_tournament_18/0_desc', ''), + ('poster_17_name', 'Butterfly Cabinet 1'), + ('furni_summer_chair*5_name', 'Deck Chair'), + ('furni_prizetrophy*1_name', 'Classic trophy'), + ('furni_easterduck_desc', 'Can you tell what it is yet?'), + ('furni_barrier*3_desc', 'No trespassing, please!'), + ('furni_table_plasto_bigsquare*1_name', 'Square Dining Table'), + ('club_general_infolink', 'More Info About Habbo Club >>'), + ('furni_chair_silo*4_name', 'Beige Silo Dining Chair'), + ('roomatic_givename', 'Give your room a name!'), + ('furni_rare_icecream*1_name', 'Blueberry Ice Cream Machine'), + ('roomatic_open', 'Door open'), + ('NUF_getting_items_catalogue_tutor', 'Big! You can browse the products by clicking on the categories. There are loads of different types of furniture to decorate your room.'), + ('furni_marquee*4_name', 'Yellow Marquee'), + ('furni_bed_polyfon_one*7_name', 'Green Mode Single Bed'), + ('gs_button_go_started', 'Watch'), + ('poster_27_name', 'Holly Bundle 3'), + ('furni_divider_nor2*7_desc', 'No way through'), + ('furni_glass_chair*5_desc', 'Translucent beauty'), + ('nav_venue_basement_lobby_name', 'Basement Lobby'), + ('pick_furniture', 'Put Furni In Hand'), + ('nav_venue_bb_lobby_beginner_18/0_desc', ''), + ('furni_pura_mdl2*4_name', 'White Pura Module 2'), + ('club_status_title', 'You are currently a member of Habbo Club.'), + ('furni_rare_elephant_statue_name', 'Golden Elephant'), + ('furni_toy1*1_desc', 'it\'s bouncy-tastic'), + ('reg_doneheader', 'Congratulations!\\rYou\'re a Habbo!'), + ('furni_present_gen6_name', 'Gift'), + ('furni_noob_chair*2_desc', 'Lightweight, practical, with dark blue stripes'), + ('furni_sofachair_silo*5_name', 'Pink Area Armchair'), + ('BuddyNow', 'now:'), + ('furni_pura_mdl5*3_desc', 'Any way you like it!'), + ('furni_prizetrophy6*1_name', 'Champion trophy'), + ('BuddyEntry', 'On Hotel View'), + ('furni_scifiport*9_desc', 'Energy beams. No trespassers!'), + ('furni_table_polyfon_small_desc', 'For serving a stylish latte'), + ('furni_exe_rug_name', 'Executive Rug'), + ('nav_venue_the_dirty_duck_pub_name', 'The Dirty Duck Pub'), + ('nav_venue_bb_lobby_beginner_9_name', 'Beginners Battle Ball 10'), + ('nav_venue_sw_lobby_beginner_5_name', 'Snow Rookies Lobby'), + ('furni_pura_mdl5*2_name', 'Pink Pura Module 5'), + ('furni_bardeskcorner_polyfon*7_desc', 'Green Mode Bardesk Corner'), + ('alert_donate_content', 'The other Habbo has not put anything into the trade. Are you sure you want to give away your furni?'), + ('furni_hc_rllr_name', 'HC Rollers Set'), + ('furni_divider_nor1_desc', 'Looks squishy, but isn\'t'), + ('furni_nouvelle_trax_desc', ''), + ('wallitem_jp_sheet3_name', 'jp_sheet3'), + ('furni_hyacinth2_name', 'Blue Hyacinth'), + ('furni_sound_machine_name', 'Sound Machine'), + ('console_getmessage_sender', 'Sender:'), + ('furni_sandrug_name', 'Tropical Beach Rug'), + ('nav_updatenote_header', 'Note!'), + ('furni_pillar*4_desc', 'From the time of the Kick Warz'), + ('furni_waterbowl*1_name', 'Red Water Bowl'), + ('furni_grand_piano*5_name', 'Onyx Grand Piano'), + ('furni_redhologram_name', 'Holo-girl'), + ('sound_machine_alert_playlist_full', 'Could not save playlist! Playlists can have only %count% songs.'), + ('nav_rooms_search', 'Search'), + ('nav_venue_cunning_fox_gamehall/5_name', 'Poker'), + ('nav_venue_habbo_lido_ii_name', 'Habbo Lido II'), + ('furni_barchair_silo*9_desc', 'Practical and convenient'), + ('pet_nature', 'Nature:'), + ('furni_wood_tv_name', 'Large TV'), + ('poster_2008_desc', 'Once every four Habbo years!'), + ('poster_38_desc', 'For really TOUGH Habbos!'), + ('nav_venue_bb_lobby_expert_0_name', 'Expert'), + ('furni_chair_plasto*14_desc', 'Aqua chair'), + ('furni_queue_tile1*6_name', 'Blue Habbo Roller'), + ('poster_522_name', 'The flag of Japan'), + ('furni_chair_basic*3_name', 'Black Pura Egg Chair'), + ('nav_venue_pizza_desc', 'Tunnelmallinen pizzapaikka kiireettömään nautiskeluun.'), + ('furni_jp_tray6_desc', 'jp_tray6'), + ('furni_hc_btlr_desc', 'Your personal caretaker'), + ('furni_song_disk_desc', 'Burn, baby burn'), + ('furni_deadduck2_name', 'Dead Duck 2'), + ('furni_statue_name', 'Cupid Statue'), + ('furni_scifirocket*5_name', 'Uranus Smoke Machine'), + ('nav_gobutton', 'Go'), + ('recycler_furni_not_recyclable', 'This Furniture cannot be recycled. Please only use Furniture that has the recyclable tag in your hand.'), + ('furni_gothic_sofa*5_name', 'Green Gothic Sofa'), + ('furni_sound_set_32_desc', 'Piano concert set'), + ('furni_chair_plasto*10_name', 'Chair'), + ('nav_venue_bb_lobby_tournament_2_name', 'Competitie Battle Ball 3'), + ('furni_grand_piano*1_desc', 'Turquoise Grand Piano'), + ('buddyremove_windowheader', 'Your friends list is full.'), + ('furni_pillar*0_name', 'Greek Pillar'), + ('gs_title_countdown', 'Game Is About To Begin'), + ('furni_glass_sofa*3_name', 'Glass sofa'), + ('furni_hc_crtn_desc', 'Topnotch privacy protection'), + ('furni_waterbowl*5_desc', 'Aqua unlimited'), + ('furni_table_silo_small*4_desc', 'Beige Area Occasional Table'), + ('furni_jp_tray2_name', 'jp_tray2'), + ('furni_rare_moonrug_desc', 'Desolation rocks!'), + ('furni_val_teddy*3_name', 'Green Share Bear'), + ('furni_sleepingbag*10_desc', 'Ultimate coziness'), + ('furni_bar_polyfon_desc', 'You naughty Habbo!'), + ('furni_sofachair_polyfon*2_desc', 'Black Mode Armchair'), + ('furni_exe_sofa_name', 'Executive 3-Seater Sofa'), + ('furni_divider_silo1*4_desc', 'Beige Area Corner Shelf'), + ('poster_2004_name', 'Rasta Poster'), + ('furni_bench_armas_name', 'Bench'), + ('furni_soft_sofachair_norja_desc', 'Soft iced sofachair'), + ('nav_venue_bb_lobby_beginner_14_name', 'Beginners Battle Ball 15'), + ('gs_button_rejoin', 'Play again!'), + ('furni_marquee*8_name', 'Ultramarine Marquee'), + ('furni_tile_marble_desc', 'Slick sophistication; now 10% off!'), + ('hubu_info_url_1', 'http://www.habbohotel.co.uk/habbo/en/help/12'), + ('console_requests', 'Friend Request(s)'), + ('furni_sleepingbag*4_name', 'Army Sleeping Bag'), + ('furni_plant_yukka_desc', 'Easy to care for'), + ('NUF_getting_room_own_rooms_createroom', 'Empty? That\'s because you don\'t have any rooms yet. If it isn\'t empty then you already have made a room, which makes me wonder...'), + ('furni_glass_sofa*6_desc', 'Translucent beauty'), + ('ph_exit', 'Exit In Normal Clothes'), + ('pet_race_0_024', 'Black-eyed Boxer'), + ('furni_marquee*7_name', 'Purple Marquee'), + ('pet_race_0_023', 'Dotty Dalmatian'), + ('recycler_info_timeout', 'Your recycling was completed, but you did not accept it in time. Please press the cancel button below to have your recyclable items restored to your hand. To recycle these items you will need to begin the process again.'), + ('pet_race_0_022', 'Schnitzel Snatcher'), + ('hubu_info_url_2', 'http://www.talktofrank.com/'), + ('pet_race_0_021', 'Loyal Labrador'), + ('nav_venue_snowwar_lobby/0_desc', 'Snow Storm LobbyCome and be a Snow Stormer!'), + ('pet_race_0_020', 'Patchy Pup'), + ('furni_chair_plasto*8_name', 'Chair'), + ('furni_sofachair_silo*9_desc', 'Red Area Armchair'), + ('nav_venue_bb_lobby_beginner_17/0_desc', ''), + ('furni_hc_dsk_desc', 'For Habbo scholars'), + ('furni_wooden_screen*8_name', 'Night Blue Oriental Screen'), + ('gs_lounge_skill_no_min', 'No minimum'), + ('summer_chair_8_name', 'Yellow Deck Chair'), + ('gs_score_tie', 'The game ended in a tie!'), + ('nav_people', 'Who\'s in here?'), + ('furni_gothic_sofa*2_desc', 'Stylish seating for two'), + ('furni_summer_chair*8_name', 'Yellow Deck Chair'), + ('roomatic_roomname', 'Room name:'), + ('furni_ham_desc', 'Tuck in'), + ('nav_venue_star_lounge_desc', 'Is there a VIP visitor in the hotel?'), + ('furni_bardeskcorner_polyfon*3_name', 'White Corner Desk'), + ('gs_specnum', 'Number of spectators: \\x'), + ('furni_bed_budget*3_name', 'Black Pura Double Bed'), + ('furni_shelves_norja*6_name', 'Blue Bookcase'), + ('partner_registration_link', 'Finish registration'), + ('furni_pillar*1_name', 'Pink Marble Pillar'), + ('reg_olderage', 'I am 11 or older'), + ('furni_glass_stool*4_name', 'Glass stool'), + ('back', 'Back'), + ('furni_tile_yell_desc', 'In a choice of colours'), + ('club_confirm_text3', 'Buy more and pay less: 6 Months (186 days) of Habbo Club cost only 105 Credits. You have %credits% credits in your Purse.\\r\\r After buying the membership, you will immediately be part of the Habbo VIP Community.'), + ('furni_sofa_silo_desc', 'Cushioned, understated comfort'), + ('club_confirm_text1', '1 Habbo Club Month (31 days) costs 25 Credits. You have %credits% Credits in your Purse.\\r\\r After buying the membership, you will immediately be part of the Habbo VIP Community.'), + ('club_confirm_text2', 'Buy more and pay less: 3 Months (93 days) of Habbo Club cost only 60 Credits. You have %credits% credits in your Purse.\\r\\r After buying the membership, you will immediately be part of the Habbo VIP Community.'), + ('furni_carpet_legocourt_name', 'Basketball Court'), + ('furni_present_gen3_name', 'Gift'), + ('furni_sound_set_2_desc', 'Get the party started!'), + ('furni_barchair_silo*6_name', 'Blue Bar Stool'), + ('furni_arabian_bigtb_name', 'Amanjena Table'), + ('interface_icon_catalog', 'Catalogue, furnishing your room'), + ('furni_hologram_desc', 'As if by magic...'), + ('nav_venue_sw_lobby_expert_1/0_desc', ''), + ('furni_carpet_standard*1_name', 'Floor Rug'), + ('nav_owner', 'Owner'), + ('furni_glass_chair*2_desc', 'Translucent beauty'), + ('furni_rcandleset_name', 'Red Candle Plate'), + ('furni_divider_nor1*6_name', 'Blue Ice corner'), + ('nav_private_helptext_hd', 'Rooms'), + ('furni_sound_set_27_name', 'Groove 2'), + ('furni_drinks_name', 'Empty Cans'), + ('pet.saying.eat.cat.0', 'mmm...thumm, thumm'), + ('gs_title_nextround', 'Next game...'), + ('pet.saying.eat.cat.1', 'lap, lap, lap, lap'), + ('furni_scifirocket*9_desc', 'Something fishy is going on...'), + ('pet.saying.eat.cat.2', '*munch, munch*'), + ('pet.saying.sleep.dog.0', 'zzZZZzzz'), + ('furni_noob_lamp*4_name', 'My first Habbo lamp'), + ('nav_venue_sw_lobby_beginner_8_name', 'Snow Rookies Lobby'), + ('nav_venue_library/0_desc', 'Time to catch up on some studying'), + ('camera_dialog_open', 'Shoot'), + ('furni_lamp_armas_desc', 'Ambient lighting is essential'), + ('buddyremove_pleasewait', 'Please wait a second...'), + ('friend_request_options', 'Advanced options.'), + ('transaction_system_web_internal', 'Housekeeping purchase'), + ('furni_rare_dragonlamp*5_name', 'Elf Green Dragon Lamp'), + ('furni_bar_chair_armas_desc', 'The ultimate recycled furniture'), + ('room_ignore', 'Shutup'), + ('poster_518_desc', 'A fiery dragon for your wall'), + ('furni_soft_sofa_norja*7_desc', 'Sit back and relax'), + ('object_displayer_show_tags', 'Show tags'), + ('furni_goth_table_desc', 'The dark side of Habbo'), + ('club_txt_changesubscr', 'Change subscription'), + ('Alert_RememberSetYourPassword', 'Please check your password'), + ('reg_verification_checking', 'Checking...'), + ('furni_silo_studydesk_desc', 'For the true Habbo Scholars'), + ('room_give_rights', 'Give rights'), + ('furni_CF_50_goldbar_name', 'Gold Bar'), + ('furni_rom_lamp_name', 'Crystal Lamp'), + ('furni_sofachair_polyfon*8_desc', 'Yellow Mode Armchair'), + ('furni_deadduck3_name', 'Dead Duck 3'), + ('furni_bed_polyfon_one*4_name', 'Beige Mode Single Bed'), + ('furni_noob_stool*1_desc', 'Unfold me and take the weight off (orange)'), + ('furni_stand_polyfon_z_name', 'Shelf'), + ('furni_prize3_name', 'Bronze Trophy'), + ('club_status_text', 'Here you can see your Habbo Club membership status, number of elapsed months, pre-ordered months and status of the ongoing month.'), + ('furni_table_plasto_bigsquare*9_desc', 'Hip plastic furniture'), + ('furni_wooden_screen*4_desc', 'Add an exotic touch to your room'), + ('furni_sound_set_52_name', 'Christmas Party'), + ('furni_CF_1_coin_bronze_name', 'Bronze Coin'), + ('furni_tile_brown_name', 'Red Tile'), + ('nav_venue_bb_lobby_intermediate_5/0_desc', ''), + ('nav_venue_picnic/0_name', 'Picnic Garden'), + ('furni_sound_set_50_desc', 'The harder generation'), + ('furni_lamp2_armas_name', 'Lodge Candle'), + ('registration_disabled_text', 'You can\'t create new Habbos at the moment. Please try again [some date]..'), + ('catalog_selectproduct', 'Select product:'), + ('transaction_system_sms_telia', 'Telia'), + ('nav_venue_bb_lobby_intermediate_5_name', 'Semi-profs Battle Ball 6'), + ('furni_christmas_sleigh_name', 'Winter Sleigh'), + ('furni_scifirocket*8_desc', 'From a space far, far away!'), + ('furni_bed_budget*9_name', 'Red Pura Double Bed'), + ('poster_2000_desc', 'Suomen kartta'), + ('help_emergency_whathappens', 'A member of community staff will investigate the situation and take appropriate action. This may include sending you a response with advice on dealing with your issue.'), + ('purse_coins', 'Habbo Credits'), + ('furni_marquee*5_desc', 'It\'s both door and a shade!'), + ('club_txt_whatis', 'What is Habbo Club?'), + ('furni_present_gen2_name', 'Gift'), + ('trading', 'Trading'), + ('furni_sofa_silo*9_desc', 'Red Area Sofa'), + ('furni_summer_chair*9_name', 'Red Deck Chair'), + ('furni_shelves_armas_desc', 'For all those fire-side stories'), + ('purse_buy_coins', 'Buy Credits'), + ('room_confirmPlace', 'Are you sure?'), + ('furni_queue_tile1*3_desc', 'The power of movement'), + ('furni_soft_sofachair_norja*8_name', 'Yellow Iced Sofachair'), + ('furni_arabian_snake_desc', 'Beware the snake!'), + ('nav_venue_sw_lobby_tournament_6/0_desc', ''), + ('NUF_about_hotel', 'What\'s Habbo about?'), + ('furni_bardeskcorner_polyfon_desc', 'Tuck it away'), + ('furni_bardeskcorner_polyfon*4_name', 'Beige Mode Bardesk Corner'), + ('poster_13_desc', 'Arty black and white'), + ('nav_venue_bb_lobby_beginner_9/0_desc', ''), + ('nav_modify_nameshow', 'Show your name in the room info'), + ('NUF_mini_use_console_read_next', 'Click \'OK\' to mark message as read.'), + ('poster_1005_desc', 'The muscly movie hero'), + ('wallitem_jp_sheet2_name', 'jp_sheet2'), + ('furni_xmas_cstl_gate_desc', 'Let that icy draft out!'), + ('NUF_groups_url', 'http://d16-1.web.varoke.net/home/group-tutorial'), + ('furni_jp_irori_name', 'Irori'), + ('furni_jp_bamboo_desc', 'Watch out for pandas!'), + ('furni_christmas_reindeer_name', 'Reindeer'), + ('furni_glass_chair*4_name', 'Glass chair'), + ('furni_jp_tray5_desc', 'jp_tray5'), + ('furni_table_plasto_4leg*4_desc', 'Hip plastic furniture'), + ('NUF_getting_items_catalogue_purse', 'Click to open your Purse and find out how to get some Habbo Credits . You can use these to buy stuff!'), + ('furni_hc_tbl_name', 'Nordic Table'), + ('furni_bed_budget_one*6_name', 'Blue Pura Bed'), + ('furni_solarium_norja*7_name', 'Rural Solarium'), + ('console_newmessages', 'New Message(s)'), + ('poster_2_desc', 'Take pride in your veg!'), + ('furni_xmas_cstl_twr_desc', 'All I see from up here is snow!'), + ('hubu_info', 'Welcome to the FRANK Infobus! For the next three months FRANK advisors who know a lot about drugs, their effects and the risks involved, will be stepping aboard the Infobus to offer advice and support to any Habbo that wants to visit the bus. For more information click the link below:'), + ('furni_bardesk_polyfon*6_name', 'Blue Mode Bardesk'), + ('furni_summer_pool*3_name', 'Green Summer Pool'), + ('furni_pura_mdl3*8_name', 'yellow pura module 3'), + ('furni_valentinescreen_name', 'Holiday Romance'), + ('furni_rare_beehive_bulb*1_desc', 'A honey-hued glow'), + ('gs_link_gamerules', 'Game Rules'), + ('nav_venue_bb_lobby_tournament_11/0_desc', ''), + ('sound_machine_song_info', 'Song Info'), + ('wallitem_arabian_swords_name', 'Ancestral Scimitars'), + ('furni_one_way_door*6_desc', 'One way! The HC way!'), + ('furni_table_plasto_round*2_desc', 'Hip plastic furniture'), + ('credit', 'Credit'), + ('gs_lounge_skill_no_max', 'Infinite'), + ('furni_wall_china_desc', 'For your great wall'), + ('NUF_visiting_rooms_roomlist_add to fav', 'After clicking on a room you can click this button here to add it to favourites.'), + ('furni_carpet_polar*3_name', 'Yellow Bear Rug'), + ('poster_46_desc', 'Twinkle, twinkle'), + ('furni_petfood1_desc', 'Fantastic 20% Saving!'), + ('url_nobalance', 'http://%predefined%/credits?'), + ('furni_sofachair_silo*6_name', 'Blue Area Armchair'), + ('furni_noob_chair*1_desc', 'Lightweight, practical and yellow'), + ('nav_venue_bb_lobby_expert_7/0_desc', ''), + ('furni_pura_mdl1*7_name', 'Green Pura Module 1'), + ('furni_table_silo_small*6_name', 'Blue Area Occasional Table'), + ('club_thanks_title', 'Congratulations! You are now a member of Habbo Club.'), + ('furni_legotrophy_name', 'Basketball Trophy'), + ('roomatic_createyrown', 'Create Your Own Room'), + ('console_report_remove', 'Remove'), + ('furni_sound_set_42_desc', 'Bumps and Chills'), + ('furni_divider_nor5*5_desc', 'Cool cornering for your crib y0!'), + ('furni_rare_icecream*2_desc', 'Virtual pistachio rocks!'), + ('furni_pura_mdl4*6_name', 'Blue Pura Module 4'), + ('club_button_close', 'Close Window'), + ('wallitem_md_can_name', 'Bubble Juice Can'), + ('furni_prizetrophy7_desc', 'Palkinto'), + ('nav_venue_cunning_fox_gamehall/2_desc', 'Keep your head down, it\'s bombs away'), + ('poster_28_desc', '10 x Silver Tinsel'), + ('furni_rare_dragonlamp*2_desc', 'Oriental beast of legends'), + ('furni_glass_sofa*2_name', 'Glass sofa'), + ('modtool_hours', 'Hours'), + ('nav_venue_emperors_name', 'Emperor\'s hall'), + ('catalog_buyingSuccesfull', 'Buying Successful!'), + ('console_concurrency_error', 'There was a concurrency error while modifying friend list'), + ('furni_table_silo_med*3_desc', 'Wipe clean and unobtrusive'), + ('furni_sleepingbag*8_desc', 'Ultimate coziness for SnowStorm winners'), + ('poster_508_desc', 'The flag of Spain'), + ('furni_goodie1*2_desc', 'Crunchy Dog Treat'), + ('nav_venue_sw_lobby_free_3/0_desc', ''), + ('furni_chair_basic*7_desc', ''), + ('room_take_rights', 'Remove Rights'), + ('furni_hc_bkshlf_desc', 'For the scholarly ones'), + ('furni_bed_polyfon*2_desc', 'Black Mode Double Bed'), + ('furni_table_plasto_4leg_name', 'Occasional Table'), + ('furni_bed_budget*7_desc', 'King sized comfort!'), + ('win_partner_registration', 'Partner registration'), + ('summer_chair_4_desc', 'Please tan responsably'), + ('furni_table_norja_med_name', 'Coffee Table'), + ('nav_venue_club_massiva/2_desc', 'Make all the right moves'), + ('furni_divider_silo1_desc', 'Neat and natty'), + ('hobba_send_reply', 'Send Alert'), + ('shopping_nocash', 'You don\'t have enough Credits in your Purse.\\r Click \'OK\' to see the different ways of\\rgetting Habbo Credits.'), + ('furni_divider_poly3*9_name', 'Red Hatch'), + ('furni_rare_fountain*1_desc', 'For our feathered friends'), + ('poster_56_desc', 'Serious partying going on!'), + ('furni_scifiport*6_name', 'White Sci-Fi Port'), + ('furni_rclr_garden_desc', 'Self watering'), + ('furni_arabian_tray1_desc', 'Tea for every occasion'), + ('furni_rare_fountain*3_name', 'Bird Bath (blue)'), + ('furni_romantique_pianochair*1_name', 'Rose Quartz Piano Stool'), + ('furni_romantique_divider*1_desc', 'Beauty lies within'), + ('wallitem_post.it.vd_name', 'Heart Stickies'), + ('wallitem_torch_desc', 'The dark side of Habbo'), + ('roomatic_namedisplayed', 'Do you want your name to be displayed with the room?'), + ('furni_grunge_candle_name', 'Candle Box'), + ('furni_sound_set_17_name', 'Groove 3'), + ('furni_prizetrophy3*2_name', 'Globe trophy'), + ('furni_chair_silo_desc', 'Keep it simple'), + ('nav_venue_sw_lobby_beginner_7/0_desc', ''), + ('nav_venue_sw_lobby_beginner_3/0_desc', ''), + ('furni_hc_trll_name', 'Drinks Trolley'), + ('furni_bed_polyfon_one*7_desc', 'Green Mode Single Bed'), + ('furni_chair_plasto*2_name', 'Chair'), + ('furni_pura_mdl1*4_name', 'White Pura Module 1'), + ('furni_gothiccandelabra_desc', 'The dark side of Habbo'), + ('NUH_chat', 'Click here and type to chat to other Habbos.'), + ('furni_plant_valentinerose*2_name', 'White Valentine Rose'), + ('reg_privacypledge', 'Privacy Pledge'), + ('furni_exe_table_desc', 'Take a memo, Featherstone'), + ('hubu_info_link2', 'FRANK Website'), + ('furni_prizetrophy4*3_name', 'Fish trophy'), + ('furni_hc_chr_desc', 'Royal comfort'), + ('hubu_info_link1', 'FRANK Infobus Information'), + ('sound_machine_your_songs', 'Traxmachine Songs'), + ('furni_active_placeholder_name', 'This furniture is downloading...'), + ('furni_divider_silo3*8_name', 'Yellow Area Gate'), + ('NUF_visiting_rooms_categorylist_tutor', 'There are so many Guest Rooms we thought it would be a "hoot" to divide them into categories. Select a category to view its contents.'), + ('furni_sofa_silo*6_name', 'Blue Area Sofa'), + ('club_extend_failed', 'Sorry, we were unable to process the purchase. No Credits were charged!'), + ('furni_soft_sofa_norja*4_name', 'Urban Iced Sofa'), + ('furni_sporttrack3*3_desc', 'null'), + ('furni_sound_set_1_name', 'Habbo Sounds 1'), + ('furni_pura_mdl2*5_name', 'beige pura module 2'), + ('nav_venue_sw_lobby_intermediate_1/0_desc', ''), + ('furni_safe_silo*8_name', 'Yellow Safe Minibar'), + ('trading_agrees', 'agrees'), + ('alert_needpermission', 'You need your parent or guardian\'s permission to spend time in Habbo Hotel.'), + ('nav_modify', 'Modify'), + ('furni_noob_stool*4_desc', 'Unfold me and take the weight off (light blue)'), + ('catalog_length_trophymsg', 'Oops, your inscription is too long, so it won\'t fit on the trophy. \\rPlease type something shorter.'), + ('furni_s_sound_machine*3_desc', 'Sound Machine Green Desc'), + ('club_member', 'Member'), + ('modtool_ban_ip', 'Ban IP Also'), + ('bb_link_gamerules', 'Spelregels'), + ('furni_carpet_armas_name', 'Hand-Woven Rug'), + ('furni_rubberchair*5_desc', 'Soft and tearproof!'), + ('furni_table_plasto_square*1_desc', 'Hip plastic furniture'), + ('furni_divider_nor3*3_desc', 'Do go through...'), + ('nav_venue_habburger\'s/0_desc', 'Get food here!'), + ('reg_linkstitle', 'Full version of the documents:'), + ('roomevent_browser_title', 'Events'), + ('roomatic_security', 'Security'), + ('furni_table_plasto_4leg*7_desc', 'Hip plastic furniture'), + ('furni_table_plasto_round*14_desc', 'Hip plastic furniture'), + ('furni_sound_set_38_desc', 'Rock and Roses!'), + ('furni_rare_parasol*0_desc', 'Block those rays!'), + ('furni_pura_mdl3*6_desc', 'Any way you like it!'), + ('NUF_console', 'Learn about messaging'), + ('poster_45_name', 'Skeleton'), + ('furni_pura_mdl3*9_desc', 'Any way you like it!'), + ('pet_age', 'Age:'), + ('poster_48_name', 'Large gold star'), + ('open', 'Open'), + ('gs_3min', '3min'), + ('wallitem_habw_mirror_name', 'Habbowood Mirror'), + ('furni_carpet_polar*4_desc', 'Snuggle up on a Funky bear rug...'), + ('furni_table_armas_name', 'Dining Table'), + ('sw_gameprice', 'Play now for just 2 tickets!'), + ('furni_divider_nor5*4_name', 'Urban Iced Angle'), + ('navigator', 'Hotel Navigator'), + ('furni_pillow*2_desc', 'Puffy, soft and huge'), + ('purse_vouchers_checking', 'Checking code, please wait...'), + ('furni_noob_rug*4_desc', 'Nice and neat sisal rug with light blue edging'), + ('furni_safe_silo*5_name', 'Pink Safe Minibar'), + ('nav_venue_the_dirty_duck_pub/0_desc', 'The perfect place to chill!'), + ('furni_CFC_10_coin_bronze_desc', 'Worth 10 Credits'), + ('furni_teleport_door_desc', 'Magic doorway to anywhere!'), + ('furni_bardesk_polyfon_name', 'Bar/desk'), + ('login_password', 'Password'), + ('furni_pura_mdl2*8_desc', ''), + ('furni_divider_nor4*4_desc', 'Habbos, roll out!'), + ('furni_rare_fan*7_name', 'Brown Powered Fan'), + ('furni_bed_polyfon_girl_one_desc', 'Snuggle down in princess pink'), + ('club_general_elapsed', 'Elapsed Months'), + ('nav_venue_sw_lobby_free_1_name', 'Free Game Lobby'), + ('furni_gothic_chair*5_name', 'Green Gothic Chair'), + ('furni_sink_name', 'Sink'), + ('furni_bed_budget_one*4_desc', 'Prince sized comfort!'), + ('Alert_ForgotSetPassword', 'Please check your password'), + ('furni_chair_plasto*6_desc', 'Hip plastic furniture'), + ('furni_carpet_standard_desc', 'Available in a variety of colours'), + ('reg_update_text2', 'Only change them when you want to make sure that nobody can know or guess your password.'), + ('furni_arabian_swords_desc', 'Not for yielding'), + ('furni_divider_silo3*5_name', 'Pink Area Gate'), + ('furni_fireplace_polyfon_desc', 'Comfort in stainless steel'), + ('furni_glass_table*3_desc', 'Translucent beauty'), + ('furni_summer_pool*4_desc', 'Fancy a dip?'), + ('poster_500_desc', 'The UK flag'), + ('poster_1004_name', 'Eid Mubarak Poster'), + ('furni_rare_icecream*5_desc', 'Virtual vanilla rocks!'), + ('furni_one_way_door*2_name', 'Black HC Gate'), + ('furni_chair_plasty*3_desc', 'Hip plastic furniture'), + ('club_end_title', 'Your Habbo Club membership has now expired.'), + ('furni_table_polyfon_desc', 'For larger gatherings'), + ('furni_romantique_pianochair*4_desc', 'I can feel air coming through...'), + ('furni_bardesk_polyfon*3_name', 'White Bardesk'), + ('predefined_room_description', '%user_name% has entered the building'), + ('poster_53_desc', 'whack that ball!'), + ('poster_515_name', 'The Swedish flag'), + ('furni_rope_divider_desc', 'Rope Divider'), + ('furni_chair_norja*3_desc', 'Sleek and chic for each cheek'), + ('furni_scifidoor*9_name', 'Blue Spaceship Door'), + ('furni_goodie2_name', 'Chocolate Mouse'), + ('game_poker_logoff', 'Left the game'), + ('furni_bed_polyfon_desc', 'Give yourself space to stretch out'), + ('furni_table_plasto_round*5_desc', 'Hip plastic furniture'), + ('furni_couch_norja*3_desc', 'Two can perch comfortably'), + ('pet.saying.sleep.cat.2', 'Purrr... rrrr'), + ('pet.saying.sleep.cat.1', 'mrrrr..rrrr..'), + ('pet.saying.sleep.cat.0', 'hrrrrr....Mrrrrr'), + ('login_ok', 'OK'), + ('gs_button_expand', 'Expand Window'), + ('pet.saying.sleep.cat.4', 'mrrrr...muew..mrr'), + ('tutorial_next', 'Next:'), + ('pet.saying.sleep.cat.3', 'hurrr..hurrr'), + ('furni_jp_tatami_desc', 'Shoes off please'), + ('hobba_sent_to_moderators', 'Call re-assigned non-emergency, still visible to moderators'), + ('roomatic_choosecategory', ''), + ('wallitem_guitar_v_desc', 'tilulilulii'), + ('NUF_groups', 'Groups'), + ('bb_link_gameRules_url', 'http://%predefined%/groups/56552/id'), + ('nav_venue_theatredrome_halloween_name', 'Theatredrome Habboween'), + ('bb_buyTicketsButton', 'Buy tickets'), + ('furni_gothgate_desc', 'The dark side of Habbo'), + ('game_poker_waiting', 'Change done.\\rWaiting for the other players'), + ('furni_glass_stool*7_desc', 'Habbo Club'), + ('club_end_text', 'BUT, don\'t worry, you can still buy another month of Habbo Club and keep all your Habbo Club benefits,special Furni gifts and the shiny badge!'), + ('furni_sound_set_18_desc', 'Listen while you tan'), + ('furni_sound_set_35_desc', 'Groovelicious'), + ('furni_prizetrophy2*2_desc', 'Shiny silver'), + ('furni_plant_valentinerose*3_desc', 'Relight your passions'), + ('furni_romantique_divan*5_name', 'Onyx Chaise-Longue'), + ('furni_chair_norja*6_desc', 'Sleek and chic for each cheek'), + ('wallitem_hrella_poster_2_desc', 'For those scary Lido moments'), + ('furni_s_sound_machine*6_desc', 'Sound Machine Purple'), + ('game_bs_miss', 'Miss:'), + ('furni_carpet_standard*4_desc', 'Available in a variety of colours'), + ('furni_pura_mdl1*1_name', 'Aqua Pura Module 1'), + ('furni_rare_icecream*8_desc', 'Virtual peppermint rocks!'), + ('furni_petfood4_desc', 'Fantastic 20% Saving!'), + ('furni_table_silo_small*3_name', 'White Occasional Table'), + ('furni_table_plasto_round*8_desc', 'Hip plastic furniture'), + ('furni_chair_polyfon_desc', 'Metallic seating experience'), + ('furni_exe_drinks_desc', 'Give a warm welcome'), + ('nav_createroom', 'Create Own Room'), + ('furni_table_plasto_bigsquare*14_desc', 'Hip plastic furniture'), + ('poster_1001_name', 'Prince Charles Poster'), + ('furni_CF_20_moneybag_name', 'Sack of Credits'), + ('furni_prizetrophy5*1_name', 'Duo trophy'), + ('alert_reg_email', 'Email'), + ('pet_thirsty', 'Thirst:'), + ('nav_error_passwordtooshort', 'The password is too short.'), + ('nav_venue_sw_lobby_free_7_name', 'Free Game Lobby'), + ('furni_plant_valentinerose*5_name', 'Purple Valentine Rose'), + ('recycler_status_info', 'You have Furniture in recycling. The icon will blink when recycling is complete.'), + ('poster_52_name', 'Hockey Stick'), + ('win_doorbell', 'Doorbell'), + ('Unreadmessages', 'New Message(s)'), + ('furni_queue_tile1*9_desc', 'The power of movement'), + ('furni_rare_snowrug_name', 'Snow Rug'), + ('console_approve_selected', 'Accept selected'), + ('pet_race_0_009', 'Hound of Hull'), + ('poster_35_name', 'The Habbo Babes 1'), + ('pet_race_0_008', 'Springy Spaniel'), + ('furni_sofa_polyfon*3_desc', 'Comfort for stylish couples'), + ('furni_basket_name', 'Basket Of Eggs'), + ('pet_race_0_007', 'Slobber Don'), + ('pet_race_0_006', 'Stripy Setter'), + ('pet_race_0_005', 'Paws Forethought'), + ('pet_race_0_004', 'Droopy of Pawford'), + ('furni_barchair_silo_desc', 'Practical and convenient'), + ('furni_noob_lamp*2_desc', 'Get the light right where you want it (dark blue)'), + ('pet_race_0_003', 'Rescue Bernard'), + ('furni_glass_stool_name', 'Glass stool'), + ('pet_race_0_002', 'Joe Cocker Spaniel'), + ('pet_race_0_001', 'Habbo Husky'), + ('pet_race_0_000', 'Yappy Yorkie'), + ('NUF_mini_endtopic_step1_questionmark', 'Click to see our help menu and find our FAQs!'), + ('furni_sound_set_28_desc', 'Head for the pit!'), + ('nav_private_norooms', 'You dont have any rooms - create one?'), + ('furni_table_plasto_square*4_desc', 'Hip plastic furniture'), + ('furni_val_teddy*6_name', 'Blue Share Bear'), + ('furni_noob_table*3_desc', 'Lightweight, practical and aubergine'), + ('gs_state_finished', 'This Game is already over!'), + ('furni_rare_fan*8_desc', 'Stylish, Eco-Energy!'), + ('reg_parentemail_link_url1', 'http://%predefined%//help/parents_guide.html'), + ('furni_gothic_carpet2_desc', 'What lies beneath?'), + ('furni_rare_fan*5_desc', 'It\'ll blow you away!'), + ('modtool_kickuser', 'Kick User'), + ('furni_divider_silo1*7_desc', 'Green Area Corner Shelf'), + ('reg_parentemail_link_url2', 'http://%predefined%//footer_pages/privacy_policy.html'), + ('pet_race_0_019', 'Tiny Terrier'), + ('pet_race_0_018', 'Bushy Woofer'), + ('pet_race_0_017', 'Speckled Sheepdog'), + ('furni_rubberchair*8_desc', 'Soft and tearproof for HC!'), + ('pet_race_0_016', 'Murmurin\' Minimastiff'), + ('poster_42_name', 'Spiderweb'), + ('pet_race_0_015', 'Pixie Poodle'), + ('furni_safe_silo*2_name', 'Black Safe Minibar'), + ('pet_race_0_014', 'Whiffy Woofy'), + ('pet_race_0_013', 'Mangy Mutt'), + ('nav_publicRooms', 'Public Spaces'), + ('pet_race_0_012', 'Tawny Bleugh'), + ('pet_race_0_011', 'Lappy Lassie'), + ('pet_race_0_010', 'Furry McScottie'), + ('game_bs_toast', 'Toast!'), + ('furni_prizetrophy6_name', 'Pokaali'), + ('furni_pudding_desc', 'Will you get the lucky sixpence?'), + ('furni_tile_red_desc', 'In a choice of colours'), + ('nav_venue_sw_arena_expert_name', 'Playing expert game'), + ('pet.saying.sleep.croco.0', 'Zzzz... zzzzz...'), + ('poster_50_desc', 'flap, flap, screech, screech...'), + ('furni_shelves_norja*9_name', 'Red Bookcase'), + ('furni_sound_set_4_name', 'Ambient 1'), + ('furni_exe_s_table_desc', 'Get a clear reflection!'), + ('furni_present_gen6_desc', 'What\'s inside?'), + ('furni_one_way_door*5_name', 'Pink One Way Gate'), + ('nav_search_hd', 'Search rooms by Habbo name or room name.'), + ('poster_20_desc', 'high security for your room'), + ('buddyremove_messenger_updating', 'The console is updating, try again in a minute... Everything else is working fine!'), + ('pet.saying.sleep.croco.3', ':)'), + ('furni_house2_desc', 'Good enough to eat'), + ('pet.saying.sleep.croco.4', '*Snuh snuh*'), + ('tutorial_offtopic', 'Oops! You got off the topic. Please restart or select a new topic.'), + ('pet.saying.sleep.croco.1', 'Yrgh... Yrgh...'), + ('jukebox_now_playing', 'Now playing:'), + ('pet.saying.sleep.croco.2', 'Frgh... Frgh...'), + ('furni_sound_set_25_desc', 'Actually, it\'s Partay!'), + ('club_intro_header', 'Welcome to Habbo Club, the members-only club that all VIP Habbos belong to!'), + ('nav_venue_sw_lobby_amateur_3/0_desc', 'Astetta rankempaa lumisotaa.'), + ('pet.saying.sleep.croco.5', 'Rawwwwwwwwrrrm...'), + ('pet.saying.sleep.croco.6', 'Mmmm... Hooks...'), + ('furni_table_plasto_bigsquare*1_desc', 'Hip plastic furniture'), + ('nav_venue_sw_lobby_free_4_name', 'Free Game Lobby'), + ('alert_warning', 'Moderator says:'), + ('furni_barrier*3_name', 'Red Road Barrier'), + ('nav_venue_floatinggarden_name', 'Floating Garden'), + ('gs_error_nocredits', 'You need Habbo Credits to play a Game!'), + ('furni_chair_plasto*5_name', 'Chair'), + ('furni_tree2_desc', 'Old Christmas Tree'), + ('furni_bed_budget_one*7_desc', 'Prince sized comfort!'), + ('furni_romantique_clock_name', 'romantique_clock'), + ('room_banner_text', ''), + ('furni_sleepingbag*2_desc', 'Ultimate coziness'), + ('furni_divider_nor4*3_name', 'White Iced Auto Shutter'), + ('jukebox_song_remaining', 'Remaining time: %time%'), + ('reg_note_text', 'Never change your password or email\\rif someone else asks you to - they will\\rsteal your furni and Credits!'), + ('habbo_hand_next', '>>>'), + ('nav_venue_orient/0_desc', 'Tres chic with an Eastern twist. For Habbo Club members only.'), + ('furni_easterduck_name', 'Wannabe bunny'), + ('login_forgottenPassword', 'Forgotten your password?'), + ('furni_prizetrophy*1_desc', 'Glittery gold'), + ('hubu_t2_2', ''), + ('hubu_t2_3', 'Vapaa-ajan linkkejä'), + ('decision_cancel', 'Cancel'), + ('nav_venue_bb_lobby_tournament_2/0_desc', ''), + ('furni_samovar_desc', 'Click for a refreshing cuppa'), + ('furni_rcandle_name', 'Red Candle'), + ('furni_waterbowl*4_name', 'Blue Water Bowl'), + ('furni_table_norja_med*7_name', 'Rural Iced Coffee Table'), + ('NUF_playing_games_room_tutor', 'See some people wandering around? They are psyching themselves up for a game. Game Tickets are usually 2 Habbo Credits, but in this room the games are free.'), + ('furni_doormat_love_name', 'Doormat'), + ('bb_link_tournament_highScores_url', 'http://%predefined%//groups/56552/id'), + ('furni_sofachair_polyfon*4_name', 'Beige Mode Armchair'), + ('error_room_full', 'Huone on täynnä.'), + ('furni_chair_silo*4_desc', 'Beige Silo Dining Chair'), + ('furni_divider_nor2*7_name', 'Rural Iced Bar'), + ('hubu_t2_1', ''), + ('furni_divider_nor1*9_name', 'Red Ice corner'), + ('furni_wooden_screen*0_name', 'White Oriental Screen'), + ('furni_chair_basic*1_desc', ''), + ('gs_choose_gamename', 'Enter A Name For Your Game:'), + ('poll_question_number', 'Question %number%/%count%'), + ('furni_hc_rllr_desc', 'Highest class transportation'), + ('furni_table_plasto_4leg*15_desc', 'Hip plastic furniture'), + ('furni_scifiport*9_name', 'Violet Sci-Fi Port'), + ('furni_jukebox*1_desc', 'For your Happy Days!'), + ('furni_red_tv_desc', 'Don?t miss those soaps'), + ('furni_song_disk_name', 'Traxdisc'), + ('reg_agree_alert', 'You have to agree to the terms of service\\r(tick the box).'), + ('furni_summer_chair*1_desc', 'Got your swimming trunks?'), + ('poster_2008_name', 'Habbo Leap Day Poster'), + ('poster_505_desc', 'The Canadian flag'), + ('group_homepage', 'Groups\' Homepage >>>'), + ('furni_table_silo_med*6_desc', 'Blue Area Coffee Table'), + ('nav_venue_tearoom/0_name', 'Chinese Tea Room'), + ('dimmer_use_bg_only', 'Background only'), + ('furni_divider_poly3*4_name', 'Beige Mode Bardesk Gate'), + ('nav_venue_hotel_kitchen/0_desc', 'Beware the flying knives!'), + ('furni_divider_silo1*8_desc', 'Neat and natty'), + ('furni_hc_btlr_name', 'Electric Butler'), + ('furni_wooden_screen*5_name', 'Gray Oriental Screen'), + ('furni_scifiport*8_name', 'Purple Sci-Fi Port'), + ('furni_carpet_standard*5_name', 'Floor Rug'), + ('trading_offers', 'offers:'), + ('furni_prizetrophy2*3_name', 'Duck trophy'), + ('transaction_system_club_habbo', 'Habbo Club payment'), + ('nav_venue_bb_lobby_tournament_9/0_desc', ''), + ('poster_517_name', 'The Scottish flag'), + ('furni_wood_tv_desc', 'For family viewing'), + ('furni_deadduck2_desc', 'Someone forgot to feed me...'), + ('furni_sound_set_20_desc', 'Musical heaven'), + ('sound_machine_new', 'Create a New Song'), + ('nav_venue_the_chromide_club/0_desc', 'Ghetto Fabulous'), + ('nav_modify_doorstatus_pwagain', 'pw again:'), + ('furni_chair_plasto*10_desc', 'Hip plastic furniture'), + ('gs_idlewarning', 'You will be replaced if you don\'t start or join a Game soon!'), + ('purse_vouchers_entercode', 'Enter code here:'), + ('sound_machine_song_name', 'Untitled Trax'), + ('furni_sofa_polyfon*4_name', 'Beige Mode Sofa'), + ('furni_carpet_standard*a_name', 'Floor Rug'), + ('poster_510_name', 'The Italian flag'), + ('furni_table_plasto_square*7_name', 'Square Dining Table'), + ('furni_noob_chair*6_desc', 'Lightweight, practical with dark yellow stripes'), + ('forgottenpw_whatyou', 'What\'s your Habbo called?'), + ('nav_venue_bb_lobby_amateur_1_name', 'Gevorderden Battle Ball 2'), + ('furni_noob_table*6_name', 'My first Habbo table'), + ('furni_pillar*0_desc', 'Classy architect, for holding up ceilings!'), + ('poster_1002_desc', 'aw, bless...'), + ('furni_divider_arm1_desc', 'Good solid wood'), + ('furni_glass_stool*8_name', 'Glass stool'), + ('furni_rare_moonrug_name', 'Moon Patch'), + ('nav_venue_rooftop_rumble/0_desc', 'Are you ready?'), + ('transaction_system_sms_sonera', 'Sonera'), + ('furni_waterbowl*5_name', 'Brown Water Bowl'), + ('furni_sound_set_32_name', 'Instrumental 2'), + ('furni_table_silo_small*4_name', 'Beige Area Occasional Table'), + ('furni_prizetrophy8*1_name', 'Duo trophy'), + ('tutorial_menu', 'Get help with...'), + ('gs_2teams', '2 Teams Game'), + ('furni_sound_machine*4_desc', 'For Funky, Funky Fridays!'), + ('furni_romantique_divan*4_desc', 'Is that a cape hanging there?'), + ('furni_couch_norja*8_desc', 'Two can perch comfortably'), + ('console_usersnotfound', 'Habbo Not Found'), + ('nav_venue_bb_lobby_amateur_2/0_desc', ''), + ('furni_sleepingbag*4_desc', 'Ultimate coziness'), + ('furni_bed_budget_one*6_desc', 'Prince sized comfort!'), + ('furni_sw_chest_desc', ''), + ('nav_venue_bb_lobby_amateur_5/0_desc', ''), + ('NUF_visiting_rooms_room_tutor', 'This is a Guest Room. You can either quit the tutorial and start meeting people, or select the next topic.'), + ('furni_jp_pillow_name', 'Pillow Chair'), + ('url_logged_out', 'http://%predefined%/account/disconnected?reason=logout&origin=popup'), + ('furni_romantique_smalltabl*1_name', 'Rose Quartz Tray Table'), + ('friend_request_declined', 'Declined!'), + ('furni_grunge_shelf_desc', 'Scrap books and photo albums'), + ('furni_gothic_stool*6_name', 'Gothic Stool Blue'), + ('wallitem_gothicfountain_desc', 'Not suitable for drinking!'), + ('furni_scifiport*1_name', 'Gold Laser Gate'), + ('furni_sound_set_41_name', 'Rock 8'), + ('furni_toilet_yell_name', 'Loo Seat'), + ('console_fr_limit_exceeded_error', 'Too many friends selected. Please remove some first.'), + ('console_asktobecomeafriend', 'Ask To Become A Friend'), + ('console_friends', 'Friends'), + ('furni_table_plasto_bigsquare*4_desc', 'Hip plastic furniture'), + ('poster_2005_desc', 'The Special Infobus Poster'), + ('furni_summer_chair*8_desc', 'Got your sun cream?'), + ('furni_s_sound_machine*2_name', 'Sound Machine Ocean'), + ('nav_ringbell', 'The door is locked. Ringing the bell, and waiting...'), + ('console_profilematch', 'Habbo Profile match -'), + ('poster_14_name', 'Fox Poster'), + ('furni_bardeskcorner_polyfon*3_desc', 'Tuck it away'), + ('furni_carpet_soft*2_name', 'Soft Wool Rug'), + ('furni_ham_name', 'Joint of Ham'), + ('nav_venue_star_lounge_name', 'Star Lounge'), + ('nav_venue_bb_lobby_beginner_desc', 'Beginner battle ball'), + ('furni_doormat_plain*3_desc', 'Available in a variety of colours'), + ('furni_habbowood_chair_desc', 'Exclusively for Directors'), + ('nav_venue_bb_lobby_beginner_3/0_desc', ''), + ('furni_CF_20_moneybag_desc', 'Worth 20 Credits'), + ('furni_edice_desc', 'What\'s your lucky number?'), + ('furni_scifirocket*9_name', 'Neptune Smoke Machine'), + ('furni_bardesk_polyfon*9_name', 'Red Bardesk'), + ('furni_glass_table*8_desc', 'Translucent beauty'), + ('NUF_mini_endtopic', 'Find out more'), + ('pending_cfh_title', 'Your old message'), + ('nav_venue_sw_arena_tournament_name', 'Playing a tournament game!'), + ('furni_arabian_bigtb_desc', 'It must be Jinn-er time!'), + ('nav_venue_bb_lobby_beginner_0/0_desc', ''), + ('furni_pillow*3_name', 'Turquoise Satin Pillow'), + ('interface_icon_help', 'Help, need help?'), + ('nav_roomnfo_hd_src', 'Search Rooms'), + ('pet.saying.generic.dog.0', 'woof..woof'), + ('furni_chair_norja*9_name', 'Red Chair'), + ('NUF_getting_room_roommatic_start_tutor', 'This is the Room-O-Matic! Green! You use this to make your room.'), + ('furni_sound_set_2_name', 'Habbo Sounds 3'), + ('nav_venue_netcafe_name', 'My Habbo Home Netcafe'), + ('purse_voucherbutton', 'Vouchers'), + ('console_console', 'Console'), + ('game_poker_changed', 'changed'), + ('transaction_system_splashplastic', 'SplashPlastic'), + ('nav_venue_sw_lobby_free_7/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('furni_sporttrack3*1_desc', 'null'), + ('buddyremove_prev', '< Previous'), + ('roomatic_chooselayout', 'Choose the layout of your room'), + ('wallitem_item_placeholder_desc', 'This furniture is downloading...'), + ('purse_note', 'NOTE : The transactions are updated at 6 am every day.'), + ('poster_34_desc', 'Habbo-punk for the never-agreeing'), + ('furni_sound_set_27_desc', 'Jingle Bells will never be the same...'), + ('game_chess_start', 'Start Over'), + ('summer_chair_7_desc', 'A green deck chair'), + ('nav_venue_bb_lobby_beginner_6_name', 'Beginners Battle Ball 7'), + ('purse_link', 'Click here to see how to get Credits.'), + ('poster_59_desc', 'Torch - it gives you some light'), + ('room_info_rate_req', 'Rate this room'), + ('furni_rare_dragonlamp*5_desc', 'Roast your chestnuts here!'), + ('furni_divider_silo3*9_desc', 'Red Area Gate'), + ('more_roomlayouts', 'Extra room layouts for Habbo Club members >>'), + ('furni_grunge_chair_desc', 'Alternative chair for alternative people'), + ('furni_bed_budget*9_desc', 'King sized comfort!'), + ('furni_christmas_sleigh_desc', 'Ready for your Xmas cheer'), + ('furni_table_plasto_4leg*8_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_tournament_5_name', 'Competitie Battle Ball 6'), + ('furni_table_norja_med*4_name', 'Urban Iced Coffee Table'), + ('instant_friend_request_header', 'Friend Request'), + ('furni_marquee*3_name', 'Aqua Marquee'), + ('furni_noob_stool*1_name', 'My first Habbo stool'), + ('furni_rare_mnstr_desc', 'Don\'t get too close...'), + ('furni_safe_silo_pb_desc', 'Totally shatter-proof!'), + ('NUF_meeting_people_user_chatfield', 'Start typing here and press \'Enter\' to chat with others.'), + ('furni_prizetrophy6*2_desc', 'Shiny silver'), + ('furni_table_plasto_bigsquare*9_name', 'Square Dining Table'), + ('club_habbo.window.title', 'Habbo Club'), + ('recycler_info_ready', 'Recycling is complete. You have made a great environmentally friendly decision. All the recycled items you receive have been made from old items which helps to save natural resources and reduce pollution.'), + ('furni_shelves_norja*5_desc', 'For nic naks and art deco books'), + ('furni_table_silo_med_name', 'Coffee Table'), + ('furni_grunge_sign_desc', 'Bought legitimately from an M1 cafe.'), + ('roomevent_type_9', 'Group Events'), + ('roomevent_type_7', 'Dating'), + ('pet.saying.generic.dog.1', 'woof woof woof!!!'), + ('roomevent_type_8', 'Jobs'), + ('pet.saying.generic.dog.2', 'wooooof!'), + ('roomevent_type_5', 'Debates & Discussion'), + ('pet.saying.generic.dog.3', 'hooooowl'), + ('roomevent_type_6', 'Grand Openings'), + ('furni_solarium_norja*2_name', 'Beige Solarium'), + ('nav_venue_bb_lobby_intermediate_3_name', 'Semi-profs Battle Ball 4'), + ('console_searchfor', 'Search:'), + ('wallitem_arabian_wndw_desc', 'Arabian days and nights'), + ('furni_queue_tile1*3_name', 'Ice Habbo Roller'), + ('furni_lamp2_armas_desc', 'Wax lyrical with some old-world charm'), + ('furni_jp_tray3_desc', 'jp_tray3'), + ('wallitem_guitar_skull_name', 'skull guitar'), + ('roomevent_type_3', 'Games'), + ('furni_romantique_divider*2_desc', 'Keeping things separated'), + ('roomatic_owner', 'Owner:'), + ('url_helpterms', 'http://%predefined%//help/68'), + ('roomevent_type_4', 'Welcoming Party Events'), + ('furni_glass_chair*6_desc', 'Translucent beauty'), + ('furni_pillar*5_name', 'Pagan Pillar'), + ('roomevent_type_1', 'Parties & Music'), + ('roomevent_type_2', 'Trading'), + ('furni_present_gen2_desc', 'What\'s inside?'), + ('ph_tickets_title', 'Tickets'), + ('furni_table_norja_med*8_desc', 'For larger gatherings'), + ('furni_sound_set_54_desc', 'Tune into Christmas'), + ('poster_61_desc', 'The Auspicious One'), + ('furni_divider_silo3_name', 'Gate (lockable)'), + ('furni_scifirocket*4_desc', 'Welcome... to planet love'), + ('furni_plant_valentinerose*1_name', 'Red Valentine\'s Rose'), + ('furni_exe_chair2_name', 'Executive Boss Chair'), + ('alert_donate_ok', 'Give away my furni'), + ('furni_bardesk_polyfon*4_desc', 'Beige Mode Bardesk'), + ('furni_pura_mdl1*5_desc', ''), + ('hubu_close', 'Sulje kioski'), + ('gs_deathmatch', 'Every Habbo for himself!'), + ('summer_chair_9_desc', 'Sunbathing, why not?'), + ('furni_barchair_silo*8_name', 'Yellow Bar Stool'), + ('console_differentmessagemodes', 'Different Messages'), + ('furni_chair_silo*5_name', 'Pink Silo Dining Chair'), + ('callhelp_explanation', 'Thanks for reporting the problem'), + ('furni_chair_plasty*1_desc', 'Hip plastic furniture'), + ('furni_bed_budget*2_desc', 'Queen sized comfort!'), + ('furni_summer_grill*2_desc', 'Plenty of shrimp on that barbie'), + ('furni_heart_desc', 'Full of love'), + ('reg_donetext', 'Soon you\'ll see the Hotel Navigator, it shows you all the rooms you can go to -the guest rooms, clubs, caf�s, swimming pools and more!'), + ('poster_523_desc', 'The flag of India'), + ('furni_one_way_door*1_name', 'Aqua One Way Gate'), + ('furni_bardeskcorner_polyfon*13_desc', 'Tuck it away'), + ('nav_venue_sw_lobby_amateur_5/0_desc', 'Astetta rankempaa lumisotaa.'), + ('furni_gothic_chair*4_desc', 'Vampires and Wizards'), + ('furni_bardesk_polyfon*6_desc', 'Blue Mode Bardesk'), + ('transaction_system_sms_sra', 'Sonera'), + ('dimmer_turn_off', 'Turn OFF'), + ('furni_fireplace_armas_desc', 'Authentic, real flame fire'), + ('furni_chair_plasty*6_name', 'Plastic Pod Chair'), + ('furni_scifidoor*6_name', 'Black Monolith'), + ('furni_summer_pool*3_desc', 'Fancy a dip?'), + ('furni_christmas_reindeer_desc', 'Prancer becomes Rudolph in a click!'), + ('furni_chair_norja_name', 'Chair'), + ('furni_barchair_silo*3_name', 'White Bar Stool'), + ('nav_venue_bb_lobby_tournament_desc', 'Play battle ball tournament!'), + ('transaction_system_bank_sampo', 'Sampo'), + ('furni_sound_set_39_name', 'Rock 7'), + ('furni_pura_mdl3*8_desc', ''), + ('console_follow_prevented', 'Your friend has prevented others from following him/her.'), + ('poster_46_name', 'Small gold star'), + ('furni_sofa_polyfon_girl_name', 'Two-seater Sofa'), + ('furni_carpet_polar*3_desc', 'Snuggle up on a Funky bear rug...'), + ('modtool_rankerror', 'You do not have the rights for this action on this user!'), + ('furni_divider_nor3*4_name', 'Urban Iced Gate'), + ('nav_venue_theatredrome_valentine/0_desc', 'Hug A Friend, Its Valentines! Home Of Ralph (Wannabe Panda In Training)'), + ('furni_one_way_door*6_name', 'Blue HC Gate'), + ('poster_7_desc', 'For emergencies only'), + ('wallitem_hc_wall_lamp_name', 'Retro Wall Lamp'), + ('poster_508_name', 'The Spanish flag'), + ('help_emergency_example', 'Example: A Habbo wants to see me on webcam.'), + ('nav_venue_bb_lobby_expert_1/0_desc', ''), + ('furni_pura_mdl1*7_desc', 'Any way you like it!'), + ('wallitem_post.it_desc', 'Pad of stickies'), + ('nav_modify_doorstatus_passwordprotected', 'Let other people move and leave furniture in the room.'), + ('queue_set.queue_full.alert', 'The queue for this room is full. Please try again later.'), + ('nav_venue_bb_lobby_beginner_8_name', 'Beginners Battle Ball 9'), + ('nav_venue_sw_arena_amateur_name(0)', 'Playing amateur game'), + ('url_figure_editor', 'http://%predefined%//profile/profile.action'), + ('furni_noob_lamp*6_desc', 'Get the light right where you want it (canary yellow)'), + ('furni_divider_nor5*5_name', 'Pink Iced Angle'), + ('nav_venue_sw_lobby_free_desc', 'Come and play. It\'s free!'), + ('furni_table_silo_small*6_desc', 'Blue Area Occasional Table'), + ('NUF_getting_items_navigator_tutor', 'You need to be in a Habbo\'s room to access the Catalogue.'), + ('furni_safe_silo*6_desc', 'Totally shatter-proof!'), + ('furni_glass_sofa*7_name', 'Green Glass Sofa'), + ('wallitem_md_can_desc', 'Enough bubbling juice for one evening'), + ('furni_rare_fan*9_desc', 'It\'ll blow you away!'), + ('furni_prizetrophy7_name', 'Pokaali'), + ('furni_noob_stool*3_name', 'My first Habbo stool'), + ('furni_glass_sofa*2_desc', 'Translucent beauty'), + ('pet_frnd_10', 'Adoring'), + ('furni_turkey_desc', 'Where\'s the cranberry sauce?'), + ('pet_frnd_11', 'Devoted'), + ('Alert_ConnectionNotReady', 'Could not connect to the server'), + ('console_search_habbo_profilematch', 'Habbo Profile match -'), + ('furni_sound_set_59_desc', 'Urban break beats'), + ('poster_21_name', 'Butterfly Cabinet'), + ('credits', 'Credits'), + ('furni_sound_set_14_name', 'Hip Hop Beats 2'), + ('NUH_hand', 'Click here to open your inventory (aka the Big Hand). Drag and drop furniture to and from here to move it.'), + ('furni_pura_mdl3*1_desc', 'Any way you like it!'), + ('nav_modify_doorstatus_pwprotected', 'Password protected:'), + ('shopping_costs', 'XX costs XX Credit(s).\\rJust click \'buy\' once, it\'ll appear shortly.'), + ('NUF_mini_meet_people', 'Meet some people'), + ('furni_divider_nor1*3_name', 'White Iced Corner'), + ('furni_bed_budget*7_name', 'Green Pura Double Bed'), + ('furni_pura_mdl5*9_desc', 'Any way you like it!'), + ('nav_venue_club_massiva/2_name', 'Dancefloor'), + ('furni_scifiport*3_desc', 'Energy beams. No trespassers!'), + ('whisper', 'Whisper'), + ('furni_chair_plasto*4_name', 'Chair'), + ('furni_hc_bkshlf_name', 'Medieval Bookcase'), + ('furni_goodie1*2_name', 'Marzipan Man'), + ('furni_rare_fountain*1_name', 'Bird Bath (grey)'), + ('bb_text_hostInfo', 'Please choose a name for your Game and select the number of Teams.'), + ('hubu_t3_1', ''), + ('hubu_t3_2', 'Hubun kiertuekalenteri 2002'), + ('furni_sound_set_34_name', 'Rock 5'), + ('furni_rare_fountain*3_desc', 'For our feathered friends'), + ('nav_venue_sw_lobby_amateur_5_name', 'Snow Slingers Lobby'), + ('furni_pura_mdl3*2_name', 'Pink Pura Module 3'), + ('furni_xmas_cstl_wall_desc', 'Solid blocks of ice and snow'), + ('furni_arabian_tray1_name', 'Mint Tea Tray'), + ('furni_jp_tray4_name', 'jp_tray4'), + ('furni_grunge_candle_desc', 'Late night debate'), + ('furni_rclr_garden_name', 'Water Garden'), + ('furni_CFC_100_coin_gold_name', 'Gold Coin (China)'), + ('nav_venue_gate_park_name', 'Imperial Park'), + ('shopping_asagift', 'Buy As A Gift'), + ('furni_soft_sofachair_norja*7_desc', 'Sit back and relax'), + ('dance', 'Dance'), + ('roomatic_wrongpw', 'Oops! Sorry, your passwords don\'t match. Please enter them again.'), + ('furni_hc_trll_desc', 'For swanky dinners only'), + ('furni_prizetrophy3*2_desc', 'Shiny silver'), + ('modtool_roomkick', 'Room Kick'), + ('roomatic_letmove', 'Let other people move your furniture and place their own. (Furniture cannot be stolen.)'), + ('roomevent_default_description', ''), + ('nav_venue_sw_lobby_free_4/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('console_invalid_message', 'There was a message from a user that was probably removed your friend list. Note, user is removed from your friend list if you report a message to moderators.'), + ('poster_503_name', 'The Swiss flag'), + ('nav_venue_sw_arena_expert_name(0)', 'Playing expert game'), + ('poster_41_desc', 'For the best music-makers'), + ('furni_tile_name', 'Floor Tiles'), + ('furni_val_randomizer_name', 'Love Randomiser'), + ('nav_modify_doorstatus_open', 'Open'), + ('furni_plant_big_cactus_desc', 'Habbo Dreams monster in hiding! Shhhh'), + ('furni_safe_silo*8_desc', 'Totally shatter-proof!'), + ('wallitem_sw_hole_name', 'sw_hole'), + ('play_preview', 'Play preview of sounds'), + ('furni_table_plasto_round*14_name', 'Occasional Table'), + ('poll_thanks_window', 'Thanks!'), + ('wallitem_habbowheel_desc', 'So you gotta ask yourself "Do I feel lucky?"'), + ('furni_carpet_standard_name', 'Floor rug'), + ('furni_divider_nor1*8_name', 'Yellow Ice corner'), + ('nav_venue_bb_lobby_tournament_3/0_desc', ''), + ('buddyremove_ok_text', 'You have chosen enough friends to remove.'), + ('nav_venue_sw_lobby_intermediate_5/0_desc', 'Lumisota sen kuin vain kovenee.'), + ('furni_divider_nor4*7_desc', 'Habbos, roll out!'), + ('furni_summer_chair*3_desc', 'Black'), + ('furni_table_plasto_bigsquare*6_desc', 'Hip plastic furniture'), + ('gs_link_highscores', 'High Scores'), + ('Alert_purchasingerror', 'Buying unsuccessful'), + ('poster_5_desc', 'Quacking good design!'), + ('help_emergency_sent', 'A member of community staff will investigate the situation and take appropriate action. This may include sending you a response with advice on dealing with your issue.'), + ('room_user_page', 'Home Page'), + ('room_badge_window_title', 'Badge'), + ('login_name', 'Name of your Habbo'), + ('furni_divider_nor2*5_name', 'Pink Iced bar desk'), + ('nav_venue_habbo_lido_ii/0_desc', 'Dive right in!'), + ('furni_sporttrack2*2_name', 'Sport corner asphalt'), + ('roommatic_modify_size', 'Room size: %tileCount% tiles'), + ('pet.saying.sniff.croco.2', '*Sighs*'), + ('furni_prize2_name', 'Silver Trophy'), + ('Now you can find out how to get more cool Furniture for your room, or select another topic.', ''), + ('pet.saying.sniff.croco.0', 'Ewwwww....'), + ('pet.saying.sniff.croco.1', '*Sniff sniff*'), + ('furni_pura_mdl3*6_name', 'Blue Pura Module 3'), + ('poster_48_desc', 'All that glitters...'), + ('furni_wcandle_desc', 'Xmas tea light'), + ('nav_venue_bb_arena_3_name', 'Battle Ball Keskitaso'), + ('sound_machine_confirm_save_long', 'Are you sure you want to overwrite the current saved song?'), + ('purse_vouchers_helpurl', 'http://%predefined%/help/4'), + ('nav_venue_bouncer_room_2_name', 'Gevorderden Battle Ball Arena'), + ('furni_sand_cstl_gate_desc', 'sand_cstl_gate desc'), + ('furni_barrier*1_name', 'Yellow Maze Barrier'), + ('nav_venue_bb_lobby_tournament_0_name', 'Tournament'), + ('NUF_getting_room_roommatic_layout_tutor', 'Select what you want your room to look like. Use the arrows to cycle through different room layouts. Almost there, almost there...'), + ('poll_confirm_cancel', 'Stop answering?'), + ('furni_carpet_soft*4_desc', 'Soft Wool Rug'), + ('furni_rare_icecream_campaign_desc', 'Basic model'), + ('club_habbo.bottombar.text.notmember', 'Habbo Club'), + ('recycler_info_closed', 'Recycler is closed at the moment. Please check back later to recycle your Furniture.'), + ('furni_solarium_norja*8_desc', 'Rejuvenate your pixels!'), + ('callhelp_example', 'Example: How do I move my Furni?'), + ('furni_bed_budget_one*4_name', 'White Pura Bed'), + ('roomatic_givepwd', 'Password:'), + ('furni_teleport_door_name', 'Teleport Door'), + ('furni_table_silo_small*9_name', 'Red Area Occasional Table'), + ('furni_noob_chair*4_name', 'My first Habbo chair'), + ('furni_table_plasto_square*2_desc', 'Hip plastic furniture'), + ('room_waiting', 'Waiting to go in...'), + ('furni_sink_desc', 'Hot and cold thrown in for no charge'), + ('furni_doormat_plain_name', 'Doormat'), + ('nav_venue_eric\'s_eaterie_name', 'Eric\'s Eaterie'), + ('nav_venue_pizzeria_name', 'Slice of Life'), + ('poster_1004_desc', 'Celebrate with us'), + ('next', 'Next'), + ('furni_solarium_norja*9_name', 'Red Solarium'), + ('tutorial_quit_confirmation', 'You want to leave? Well I hope you learned something... something useful!'), + ('furni_val_teddy*2_desc', 'The pink bear of passion'), + ('poster_1003_name', 'UK Map'), + ('furni_glass_table*2_name', 'Glass table'), + ('NUF_habbo_home_url', 'http://d15-1.web.varoke.net/home/home-tutorial'), + ('furni_bed_silo_one_name', 'Single Bed'), + ('transaction_system_sms_win_btcellnet', 'O2 SMS'), + ('pet.hotwords.go_away', 'go away'), + ('furni_table_plasto_square*9_desc', 'Hip plastic furniture'), + ('furni_doormat_plain*4_name', 'Doormat'), + ('nav_venue_cunning_fox_gamehall_name', 'Cunning Fox Gamehall'), + ('furni_sound_machine*2_name', 'Ocean Traxmachine'), + ('furni_table_polyfon_name', 'Large Coffee Table'), + ('furni_hc_frplc_desc', 'Pixel-powered for maximum heating'), + ('console_request_massoperation_instruction', 'Use the options below to accept or decline ALL friend requests you have waiting.'), + ('nav_venue_bb_lobby_tournament_6/0_desc', ''), + ('furni_table_plasto_round*6_desc', 'Hip plastic furniture'), + ('trading_cancel', 'Cancel Trading'), + ('furni_glass_stool*3_name', 'Glass stool'), + ('furni_plant_mazegate_snow_name', 'Snowy Maze Gate'), + ('nav_venue_tv_studio_name', 'MuchMusic HQ'), + ('furni_table_norja_med*3_desc', 'For larger gatherings'), + ('furni_chair_plasty*8_desc', 'Hip plastic furniture'), + ('furni_bed_polyfon_name', 'Double Bed'), + ('gs_4teams', '4 Team Game'), + ('furni_sound_set_8_desc', 'Mellow electric grooves'), + ('ph_keys_jump', 'Jump:'), + ('reg_welcome', 'Welcome To Habbo Hotel!'), + ('purse_head', 'HABBO ACCOUNT ACTIVITY'), + ('nav_venue_bb_lobby_tournament_7_name', 'Competitie Battle Ball 8'), + ('reg_verification_newPasswordAgain', 'Retype new password:'), + ('furni_bardeskcorner_polyfon*8_desc', 'Yellow Mode Bardesk Corner'), + ('furni_sound_set_21_name', 'Rock 1'), + ('furni_gothic_stool*1_desc', 'The dark side of Habbo'), + ('furni_rope_divider_name', 'Rope Divider'), + ('poster_53_name', 'Hockey Stick'), + ('roomevent_default_desc', 'Event description..'), + ('nav_refresh_recoms', 'Refresh recommendations'), + ('nav_venue_sw_lobby_beginner_2_name', 'Snow Rookies Lobby'), + ('furni_divider_silo3*4_desc', 'Beige Area Gate'), + ('furni_divider_poly3*6_name', 'Blue Mode Bardesk Gate'), + ('reg_parentemail_title', 'Informing your parents'), + ('furni_gothgate_name', 'Gothic Portcullis'), + ('furni_mocchamaster_name', 'Mochamaster'), + ('modtool_message', 'Message:'), + ('furni_tree4_desc', 'Any presents under it yet?'), + ('furni_marquee*a_name', 'White Marquee'), + ('furni_queue_tile1*5_name', 'Knight Roller'), + ('furni_chair_polyfon_name', 'Dining Chair'), + ('furni_sleepingbag*9_name', 'Blue Sleeping Bag'), + ('furni_sound_set_9_name', 'Electronic 2'), + ('poster_39_desc', 'The rock masters of virtual music'), + ('furni_arabian_tetbl_desc', 'Serve up a treat'), + ('nav_venue_sw_lobby_free_9_name', 'Free Game Lobby'), + ('nav_venue_sw_arena_free_name(0)', 'Playing free for all game'), + ('furni_grand_piano*4_desc', 'Why is that key green?'), + ('furni_doorD_desc', 'Let\'s go over tzar!'), + ('purse_date', 'DATE'), + ('nav_venue_sw_lobby_beginner_6/0_desc', ''), + ('nav_venue_sw_lobby_beginner_4/0_desc', ''), + ('nav_venue_sw_lobby_intermediate_1_name', 'Snow Bombardiers Lobby'), + ('alert_reg_age', 'You are under 11 years old. Children under 11 can\'t enter Habbo Hotel.'), + ('nav_venue_bb_lobby_intermediate_9/0_desc', ''), + ('queue_set.c.alert', 'This room is for Habbo Club members only. In order to enter, you need to subscribe to Habbo Club.'), + ('sound_machine_confirm_clear_long', 'Are you sure you want to clear the current song?'), + ('furni_exe_drinks_name', 'Executive Drinks Tray'), + ('reg_bday_note', 'Please enter your correct date of birth, this is important! You\'ll need this information later on, if you want to change your password or e-mail.'), + ('modtool_roomalert', 'Room Alert'), + ('furni_rare_parasol*1_name', 'Yellow Parasol'), + ('furni_sound_set_18_name', 'Groove 4'), + ('sound_machine_window', 'Sound Machine Editor'), + ('furni_traffic_light*1_name', 'Classic Traffic Light'), + ('furni_chair_norja*4_desc', 'Sleek and chic for each cheek'), + ('furni_divider_nor1*2_desc', 'Black Ice corner'), + ('nav_venue_median_lobby_name', 'Median Lobby'), + ('furni_sofa_silo*3_desc', 'Cushioned, understated comfort'), + ('furni_bed_budget_desc', 'Comfortable, affordable!'), + ('furni_divider_nor4_name', 'Plain Iced Auto Shutter'), + ('furni_rare_icecream*6_desc', 'Virtual toffee rocks!'), + ('habboclub_txt1', 'You can buy Habbo Club one month at a time using Habbo Credits.'), + ('habboclub_txt3', 'Yes, I\'m over 14 years of age\\rOR\\rI\'m under 14 years of age and I have a permission from my parent/guardian to join Habbo Club.'), + ('furni_rare_dragonlamp*3_desc', 'Scary and scorching!'), + ('furni_noob_lamp*5_name', 'My first Habbo lamp'), + ('club_bottombar_text2', '(....)'), + ('furni_CFC_500_goldbar_name', 'Gold Bar (China)'), + ('club_bottombar_text1', 'Loading'), + ('furni_rare_elephant_statue*1_desc', 'Say hello to Nelly'), + ('furni_table_silo_med*7_name', 'Green Area Coffee Table'), + ('nav_venue_sw_lobby_free_1/0_desc', ''), + ('furni_bottle_desc', 'For interesting games!'), + ('furni_romantique_pianochair*2_desc', 'Let the music begin'), + ('furni_table_norja_med*2_name', 'Large Coffee Table Black'), + ('queue_set.e2.alert', 'This room is currently available only to Habbos participating to the event.'), + ('furni_solarium_norja_desc', 'Rejuvenate your pixels!'), + ('furni_table_plasto_square*14_desc', 'Hip plastic furniture'), + ('cam_save.help', 'Save & Print Photo'), + ('furni_sound_set_4_desc', 'Chilled out beats'), + ('furni_couch_norja*6_name', 'Blue Bench'), + ('poster_2003_desc', 'Would you trust this man?'), + ('hobba_cryforhelp', 'Call For Help:'), + ('furni_marquee*9_desc', 'It\'s both door and a shade!'), + ('nav_venue_bb_lobby_tournament_13/0_desc', ''), + ('poster_512_desc', 'The flag of Ireland'), + ('handitem12', 'Macchiato'), + ('object_displayer_hide_actions', 'Hide actions'), + ('furni_sound_set_25_name', 'Dance 1'), + ('handitem11', 'Mocha'), + ('handitem10', 'Latte'), + ('furni_sound_set_13_desc', 'Let Music be the food of Habbo'), + ('handitem16', 'Cappuccino'), + ('handitem15', 'Iced'), + ('handitem14', 'Filter'), + ('handitem13', 'Espresso'), + ('nav_venue_sw_lobby_free_2_name', 'Free Game Lobby'), + ('handitem19', 'Habbo Cola'), + ('nav_venue_sw_lobby_amateur_2/0_desc', ''), + ('handitem18', 'Tap'), + ('handitem17', 'Java'), + ('console_next_msg', 'Delete'), + ('furni_bardesk_polyfon*5_name', 'Candy Bar'), + ('furni_scifidoor*5_desc', 'There out of this world!'), + ('nav_roomispwprotected', 'The room is password protected.'), + ('furni_sleepingbag*2_name', 'Lime Sleeping Bag'), + ('furni_glass_table*6_name', 'Blue Glass Table'), + ('furni_divider_nor4*3_desc', 'Habbos, roll out!'), + ('furni_sound_set_61_name', 'Latin Love 3'), + ('nav_venue_pizza/0_desc', 'Pizza Palace'), + ('furni_romantique_clock_desc', ''), + ('furni_queue_tile1*0_desc', 'The power of movement'), + ('furni_pura_mdl2*9_desc', 'Any way you like it!'), + ('nav_venue_orient/0_name', 'Club Golden Dragon'), + ('furni_noob_table*1_desc', 'Lightweight, practical and orange'), + ('poster_22_desc', 'beautiful reproduction butterfly'), + ('furni_carpet_soft_name', 'Soft Wool Rug'), + ('Message', 'Message'), + ('furni_bed_trad_one_desc', 'All you need for a good night\'s kip'), + ('console_report_help', 'If the message you received was abusive or harassing, you can report it to the Moderators by clicking the Report button below. The Habbo will be removed from your Friends\' List automatically when you report. If you want to remove a Habbo from your Friends\' List without reporting their message, simply use the Remove button below.'), + ('furni_rcandle_desc', 'Xmas tea light'), + ('furni_sofa_silo*8_name', 'Yellow Two-Seater Sofa'), + ('furni_pura_mdl4*5_desc', ''), + ('NUF_mini_use_console_ready_tutor', 'You can now use the Console to find some of your friends, or you can continue the tutorial.'), + ('log_problem_link', 'Read FAQ\'s'), + ('furni_shelves_silo_name', 'Bookcase'), + ('gs_timetojoin', '\\x seconds to join'), + ('nav_venue_cunning_fox_gamehall/1_name', 'Gamehall Lobby'), + ('furni_safe_silo*7_name', 'Green Safe Minibar'), + ('NUF_mini_meet_people_hotelview_tutor', 'The Navigator lets you move between rooms in the Hotel. Open it up to get started!'), + ('purse_vouchers_sendbutton', 'Get Credits!'), + ('furni_gothic_sofa*4_name', 'Black Gothic Sofa'), + ('furni_wooden_screen*0_desc', 'Add an exotic touch to your room'), + ('catalog_give_trophymsg', 'You haven\'t engraved the trophy. Type \\ryour inscription in the grey box.'), + ('furni_prizetrophy5*3_name', 'Duo trophy'), + ('handitem23', 'Beetroot Habbo Soda'), + ('furni_rare_dragonlamp*8_name', 'Bronze Dragon Lamp'), + ('furni_divider_nor4*8_name', 'Yellow Iced Auto Shutter'), + ('handitem22', 'Lime Habbo Soda'), + ('furni_soft_sofa_norja*6_name', 'Blue Iced Sofa'), + ('handitem21', 'Hamburger'), + ('handitem20', 'Camera'), + ('furni_divider_nor1*9_desc', 'Red Ice corner'), + ('help_trouble', 'In Trouble?'), + ('handitem25', 'Love potion'), + ('handitem24', 'Bubble juice from 1999'), + ('furni_ham2_desc', 'Looks like you\'re too late!'), + ('nav_venue_bb_lobby_amateur_3_name', 'Gevorderden Battle Ball 4'), + ('furni_chair_plasto*15_name', 'Chair'), + ('furni_hyacinth1_desc', 'Beautiful bulb'), + ('furni_shelves_basic_desc', 'Pura series 404 shelves'), + ('furni_pura_mdl1*6_name', 'Blue Pura Module 1'), + ('nav_venue_cafe_gold/0_desc', 'Get the latest safety tips and tricks from Safety eXperts.'), + ('nav_venue_snowwar_lobby_name', 'Snow Storm Lobby'), + ('transaction_system_sms_slahti', 'Saunalahti'), + ('alert_tooLongPW', 'Your password is too long'), + ('furni_carpet_standard*5_desc', 'Available in a variety of colours'), + ('furni_deadduck_desc', 'Blood, but no guts'), + ('password.email.subject', 'Forgotten password'), + ('furni_prizetrophy2*3_desc', 'Breathtaking bronze'), + ('NUF_playing_games_hotelview_nav', 'Just click me to open the Navigator and get it over with...'), + ('furni_summer_chair*1_name', 'Aqua Deck Chair'), + ('furni_rubberchair*3_name', 'Orange Inflatable Chair'), + ('furni_exe_plant_desc', ''), + ('nav_venue_tearoom/0_desc', 'Chat with the people of Aoralia and meet a sprite or two!'), + ('nav_venue_sw_lobby_beginner_9/0_desc', ''), + ('furni_table_silo_med*6_name', 'Blue Area Coffee Table'), + ('nav_venue_sw_lobby_beginner_1/0_desc', ''), + ('furni_noob_stool*2_desc', 'Unfold me and take the weight off (dark blue)'), + ('camera_dialog_place', 'Move'), + ('furni_scifiport*8_desc', 'Energy beams. No trespassers!'), + ('url_peeloscore', 'http://%predefined%///groups/56555/id'), + ('console_follow_friend', 'Go to same room'), + ('sound_machine_alert_jukebox_list_full', 'The play list is full. Please wait until the current song has finished playing and try again.'), + ('poster_517_desc', 'Where\'s your kilt?'), + ('roomevent_type_11', 'Helpdesk'), + ('roomevent_type_10', 'Performance'), + ('furni_rare_dragonlamp*9_desc', 'Scary and scorching!'), + ('furni_pura_mdl2*3_name', 'Black Pura Module 2'), + ('url_help_1', 'http://%predefined%//credits'), + ('furni_edicehc_name', 'Dicemaster'), + ('furni_divider_silo1*8_name', 'Yellow Corner Shelf'), + ('furni_wooden_screen*5_desc', 'Add an exotic touch to your room'), + ('url_help_5', 'http://%predefined%/help/75'), + ('roomatic_intro2', 'Here\'s what one Habbo says about her room:'), + ('url_help_4', 'http://%predefined%//help/22'), + ('roomatic_intro1', 'You can decorate and furnish your room however you like and no one can tell you to tidy up or turn the music down. It\'s up to you if you let everyone in or just a chosen few, or lock the door and chill by yourself. Get creating and in a couple of minutes you\'ll have your own Habbo Hotel space.'), + ('url_help_3', 'http://%predefined%//help/'), + ('roomatic_intro3', 'My mates live miles away, but we can meet up in my room every Friday night and we don\'t have to worry about getting home afterwards.'), + ('url_help_2', 'http://%predefined%//profile?tab=4'), + ('furni_romantique_chair*5_name', 'Onyx Chair'), + ('url_help_6', 'http://www.habbohotel.co.uk/iot/go?lang=en&country=uk'), + ('furni_sound_set_20_name', 'SFX 2'), + ('furni_sofa_polyfon*4_desc', 'Beige Mode Sofa'), + ('sound_machine_alert_no_more_songs', 'Can\'t create new song! Traxmachine can have only %count% songs.'), + ('search', 'Search'), + ('room_preparing', '...Preparing room'), + ('nav_venue_bb_lobby_intermediate_0/0_desc', ''), + ('club_txt_renew2', 'You are Habbo Club member. If you want to change your subscription or leave the club, use the link below.'), + ('poster_1002_name', 'Queen Mum Poster'), + ('furni_barchair_silo*2_desc', 'Practical and convenient'), + ('reg_month', 'Month'), + ('club_txt_renew1', 'Your Habbo Club membership will be active for another %days% days. You can extend your membership by paying with Habbo Credits.'), + ('furni_rare_icecream*0_name', 'Cherry Ice Cream Machine'), + ('furni_sound_set_41_desc', 'Burning Riffs'), + ('nav_venue_beauty_salon_loreal_name', 'Beauty salon'), + ('poster_26_name', 'Angel Poster'), + ('furni_sound_set_19_name', 'Hip Hop Beats 4'), + ('furni_romantique_divan*4_name', 'Amber Chaise-Longue'), + ('furni_one_way_door*7_desc', 'One at a time!'), + ('sound_machine_confirm_eject_long', 'Are you sure you want to remove the Traxpack and it\'s samples from the song?'), + ('furni_glass_stool*8_desc', 'Translucent beauty'), + ('buddyremove_not_now', 'Cancel'), + ('no_user_for_gift', 'No user named %user% found. Gift not purchased.'), + ('buddyremove_lessoptions', 'Less Options <<'), + ('reg_legal_header1', 'Now you need to ask your parents/guardian to come to the computer. Read through the text (below) with your parents.'), + ('furni_carpet_soft*3_desc', 'Soft Wool Rug'), + ('reg_legal_header2', 'Read through the below text carefully. You must agree to the following terms before entering Habbo Hotel.'), + ('furni_sw_chest_name', 'sw_chest'), + ('nav_venue_sw_lobby_tournament_9_name', 'Tournament Lobby'), + ('messenger.email.footer', ''), + ('nav_venue_bb_arena_4_name', 'Battle Ball Expertit'), + ('club_change_url', 'http://%predefined%//credits/habboclub'), + ('furni_table_plasto_4leg*2_name', 'Occasional Table'), + ('ph_choosecolour', 'Choose Costume Colour'), + ('buddyremove_hc_more_info', 'More Info About Habbo Club >>'), + ('furni_romantique_smalltabl*1_desc', 'Every tray needs a table...'), + ('nav_venue_sw_lobby_tournament_8_name', 'Tournament Lobby'), + ('furni_divider_nor5_name', 'Plain Iced Angle'), + ('wallitem_roomdimmer_name', 'Mood Light'), + ('furni_bed_budget_one*5_name', 'Beige Pura Bed'), + ('furni_table_norja_med*9_name', 'Large Coffee Table Red'), + ('furni_pillow*3_desc', 'Puffy, soft and huge'), + ('furni_noob_rug*2_name', 'My first Habbo rug'), + ('nav_venue_sw_lobby_beginner_7_name', 'Snow Rookies Lobby'), + ('furni_exe_chair_desc', 'Relaxing leather comfort'), + ('furni_s_sound_machine*2_desc', 'Sound Machine Ocean Desc'), + ('nav_venue_dusty_lounge/0_desc', 'A dignified lounge for sitting back and enjoying a licorice pipe'), + ('game_bs_ship4', 'Destroyer(s)'), + ('game_bs_ship3', 'Cruiser(s)'), + ('game_bs_ship2', 'Battle Ship(s)'), + ('game_bs_ship1', 'An aircraft carrier'), + ('furni_table_plasto_bigsquare*4_name', 'Square Dining Table'), + ('openhrs_title', 'We are closing the hotel'), + ('furni_habbowood_chair_name', 'Director\'s Chair'), + ('roomatic_confirm', 'Confirm password:'), + ('poster_14_desc', 'A cunning painting'), + ('furni_doormat_plain*3_name', 'Doormat'), + ('furni_sound_set_3_desc', 'Chilled grooves'), + ('win_messenger', 'Habbo Console'), + ('summer_chair_7_name', 'Green Deck Chair'), + ('notickets_window_header', 'Tickets needed!'), + ('nav_updatenote', 'Updating your room properties may take a while. The changes have been made, but it\'ll take a few minutes until all Habbos can see them.'), + ('furni_table_plasto_bigsquare*5_name', 'Square Dining Table'), + ('url_purselink', 'http://%predefined%//credits?'), + ('console_follow_hotelview', 'Your friend is on the hotel view.'), + ('furni_solarium_norja*3_desc', 'Get the city look!'), + ('sound_machine_alert_song_name_missing', 'Please give your song a name.'), + ('furni_sound_machine*3_name', 'Green Traxmachine'), + ('jukebox_next_up', 'Next up:'), + ('trading_additems', 'Put items in boxes'), + ('furni_sporttrack3*1_name', 'Sport goal tartan'), + ('club_button_3_period', 'Buy 6 >>>'), + ('nav_delroom3', 'Room deleted!'), + ('nav_delroom2', 'Are you sure you want to delete this room? All the furniture left in it will also be deleted.'), + ('poster_34_name', 'Scamme\'d'), + ('go', 'Go >>'), + ('nav_delroom1', 'If you want to save the furniture in this room, move it to the giant hand before you continue.'), + ('console_habboprofile_arrowed', 'Habbo Profile >>'), + ('furni_chair_plasty*10_desc', 'Hip plastic furniture'), + ('cam_txtscreen.help', 'Caption'), + ('wallitem_item_placeholder_name', 'This furniture is downloading...'), + ('furni_carpet_standard*b_desc', 'Available in a variety of colours'), + ('poster_59_name', 'Torch'), + ('furni_chair_basic*4_name', 'White Pura Egg Chair'), + ('summer_chair_1_name', 'Aquamarine Deck Chair'), + ('nav_venue_space_cafe_name', 'Ten Forward'), + ('log_problem_url', 'http://%predefined%//help/faqs?faq_1_categoryId=14'), + ('group_homepage_url', 'http://%predefined%/groups/%groupid%/id'), + ('furni_heart_name', 'Giant Heart'), + ('nav_venue_sw_arena_beginner_name', 'Playing beginner game'), + ('furni_grunge_chair_name', 'Grunge Chair'), + ('nav_dooropens', 'Door opens! Go on in...'), + ('modtool_banuser', 'Ban User'), + ('furni_carpet_soft_tut_desc', 'Welcome, enjoy your stay!'), + ('furni_rare_mnstr_name', 'Venomus Habbolus'), + ('furni_divider_silo3*9_name', 'Red Area Gate'), + ('furni_pura_mdl3*1_name', 'Aqua Pura Module 3'), + ('Messages', 'Message(s)'), + ('wallitem_arabian_wndw_name', 'Arabian Window Frame'), + ('furni_prizetrophy3*1_desc', 'Glittery gold'), + ('furni_sound_set_47_desc', 'Storm the UKCharts!'), + ('poster_54_desc', 'whack that ball!'), + ('url_logout_concurrent', 'http://%predefined%//account/disconnected?reason=concurrentlogin&origin=popup'), + ('nav_venue_sw_lobby_beginner_1_name', 'Snow Rookies Lobby'), + ('furni_table_plasto_4leg*8_name', 'Occasional Table'), + ('sound_machine_turn_on', 'Switch On'), + ('furni_table_norja_med*4_desc', 'For larger gatherings'), + ('buddyremove_hc_info_url', 'http://www.habbo.co.uk/credits/habboclub'), + ('furni_romantique_divider*2_name', 'Green Screen'), + ('furni_pillar*5_desc', 'Find your natural roots'), + ('furni_table_silo_med_desc', 'Wipe clean and unobtrusive'), + ('furni_pillow*8_name', 'Navy Cord Pillow'), + ('room_owner', 'Owner:'), + ('furni_shelves_norja*5_name', 'Pink Bookcase'), + ('queue_set.d.info', 'There are %d% Habbos in front of you in the queue.'), + ('reg_retypepass', 'Retype Password:'), + ('furni_jp_tray3_name', 'jp_tray3'), + ('dance_stop', 'Stop Dancing'), + ('buddyremove_remove_text', 'You are about to remove %removeamount% friends from your friendlist.\\r\\r After removal, you\'ll have %amountleft% friends on your list:'), + ('nav_venue_bb_lobby_tournament_12_name', 'Competitie Battle Ball 13'), + ('furni_summer_chair*2_name', 'Deck Chair'), + ('furni_plant_valentinerose*1_desc', 'Secret admirer!'), + ('furni_sofachair_silo*4_name', 'Beige Area Armchair'), + ('poster_523_name', 'The flag of India'), + ('furni_scifirocket*4_name', 'Venus Smoke Machine'), + ('nav_venue_tearoom_name', 'Chinese Tea Room'), + ('furni_pura_mdl1*5_name', 'beige pura module 1'), + ('nav_venue_bb_lobby_tournament_0/0_desc', ''), + ('furni_chair_silo*5_desc', 'Pink Silo Dining Chair'), + ('club_txt_expired', 'Your Habbo Club membership has run out. You can join the club again by clicking the HC logo on the hotel view.\\rMembers of Habbo Club get priority access to the hotel (so you can always get in), exclusive clothes, hair colours, rare furni and special guest room layouts. To see exactly what you\'ll be able to get your hands on as a Habbo Club member, take a look in the Catalogue.'), + ('furni_glass_table*7_name', 'Green Glass Table'), + ('nav_prvrooms_notfound', 'Your search did not match any rooms'), + ('bb_title_BBscores2', 'Game over!'), + ('wallitem_gothicfountain_name', 'Gothic Ectoplasm Fountain'), + ('furni_one_way_door*1_desc', 'One at a time!'), + ('furni_chair_plasty*1_name', 'Plastic Pod Chair'), + ('furni_divider_nor3*9_name', 'Red Iced gate'), + ('sound_machine_time_2', '%min%:%sec%min'), + ('sound_machine_time_1', '%min%:%sec%min'), + ('furni_bardesk_polyfon*4_name', 'Beige Mode Bardesk'), + ('queue_set.queue_reset.alert', 'The queue for this room has been reset, please try again.'), + ('furni_jp_pillow_desc', 'Comfy and classical'), + ('nav_venue_sw_lobby_free_9/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('furni_barchair_silo*8_desc', 'Practical and convenient'), + ('delete_furniture', 'Delete Furniture (permanently)'), + ('furni_plant_bulrush_desc', 'Ideal for the riverside'), + ('poster_61_name', 'Siva Poster'), + ('furni_bed_silo_two_name', 'Double Bed'), + ('furni_plant_pineapple_desc', 'Needs loving glances'), + ('furni_bed_polyfon_girl_desc', 'Snuggle down in princess pink'), + ('furni_pillow*4_desc', 'Puffy, soft and huge'), + ('furni_table_norja_med*8_name', 'Large Coffee Table Yellow'), + ('transaction_system_tsms_win_tmobile', 'T-Mobile SMS'), + ('furni_scifidoor*10_desc', 'There out of this world!'), + ('furni_bed_polyfon*7_desc', 'Green Mode Double Bed'), + ('furni_toy1*2_desc', 'it\'s bouncy-tastic'), + ('transaction_system_sms_radiolinja', 'Elisa'), + ('furni_gothic_chair*4_name', 'Black Gothic Chair'), + ('furni_scifidoor*6_desc', 'Monolith goes up! Monolith goes down!'), + ('nav_venue_sw_lobby_free_3_name', 'Free Game Lobby'), + ('console_friend_request_not_found', 'There was an error finding the user for the friend request'), + ('furni_romantique_smalltabl*2_desc', 'Every tray needs a table...'), + ('furni_bed_budget*2_name', 'Pink Pura Double Bed'), + ('wallitem_post.it_name', 'Pad of stickies'), + ('gs_state_created', 'Waiting for players..'), + ('furni_divider_nor3*4_desc', 'Entrance or exit?'), + ('furni_sofa_polyfon_girl_desc', 'Romantic pink for two'), + ('locked', 'Locked (visitors have to ring bell)'), + ('alert_reg_birthday', 'Birthday'), + ('club_thanks_text', 'Here you can see your Habbo Club membership status, number of elapsed months, pre-ordered months and status of the ongoing month.'), + ('furni_sound_set_39_desc', 'Rock with a roll'), + ('nav_venue_old_skool/0_desc', 'A set of rooms inspired by the original and legendary Mobiles Disco, the progenitor of Habbo'), + ('poster_511_desc', 'The flag of The Netherlands'), + ('furni_couch_norja*7_name', 'Rural Iced Bench'), + ('furni_safe_silo*6_name', 'Blue Safe Minibar'), + ('furni_table_plasto_4leg*14_desc', 'Aqua table'), + ('room_sound_furni_limit', 'You can only place one sound furni per room'), + ('nav_venue_bb_lobby_beginner_15/0_desc', ''), + ('furni_glass_shelf_name', 'Glass shelf'), + ('furni_divider_nor2*6_desc', 'Blue Iced bar desk'), + ('furni_turkey_name', 'Roast Turkey'), + ('nav_venue_bb_lobby_tournament_16/0_desc', ''), + ('sw_timeleft', 'Time:'), + ('furni_rare_parasol_name', 'Parasol'), + ('furni_glass_sofa*7_desc', 'Habbo Club'), + ('furni_bardeskcorner_polyfon*13_name', 'Corner Cabinet/Desk'), + ('furni_rare_fan*9_name', 'Fucsia Powered Fan'), + ('furni_chair_plasto*4_desc', 'Hip plastic furniture'), + ('no', 'No'), + ('furni_rare_fan*4_desc', 'Fanning the fires of SUPERLOVE...'), + ('nav_venue_median_lobby/0_desc', 'A Mean place to hang'), + ('nav_venue_sw_lobby_intermediate_2/0_desc', ''), + ('furni_md_sofa_name', 'MD Sofa'), + ('furni_noob_lamp*1_desc', 'Get the light right where you want it (yellow)'), + ('login_connecting', 'Connecting...'), + ('furni_divider_nor1*3_desc', 'Looks squishy, but isn\'t!'), + ('furni_sound_set_14_desc', 'Rock them bodies'), + ('furni_sound_set_59_name', 'RnB Grooves 5'), + ('poster_21_desc', 'beautiful reproduction butterfly'), + ('wallitem_hc_wall_lamp_desc', 'Tres chic!'), + ('ok', 'OK'), + ('nav_venue_sw_lobby_tournament_1/0_desc', ''), + ('pet_happy', 'Happiness:'), + ('sound_machine_edit', 'Edit Song'), + ('furni_rare_elephant_statue*2_desc', 'Say hello to Nelly'), + ('furni_CFC_200_moneybag_desc', 'Worth 200 Credits'), + ('nav_venue_bb_lobby_intermediate_6/0_desc', ''), + ('console_buddylimit_requester', 'Friend could not be added. The request sender can not have anymore friends.'), + ('furni_sofa_silo*2_desc', 'Cushioned, understated comfort'), + ('sound_machine_alert_invalid_song_name', 'You have already burned another song with the same name. Please change the song name before trying again.'), + ('furni_fireplace_armas_name', 'Fireplace'), + ('furni_barchair_silo*3_desc', 'Practical and convenient'), + ('ph_ticket', 'Ticket'), + ('furni_arabian_divdr_desc', 'Carved Cedar Divider'), + ('wallitem_jp_ninjastars_desc', 'Not a frisbee'), + ('wallitem_hrella_poster_1_desc', 'Brighten up your cabin'), + ('furni_noob_stool*3_desc', 'Unfold me and take the weight off (aubergine)'), + ('furni_pura_mdl5*9_name', 'Red Pura Module 5'), + ('furni_divider_nor4*2_desc', 'Habbos, roll out!'), + ('NUF_mini_meet_people_roomlist_tutor', 'Click \'Open\' to open up a category and see what rooms are within. When you have found an interesting room, press \'Go\' to visit it.'), + ('poster_41_name', 'Habbo Golden Record'), + ('furni_jp_tray4_desc', 'jp_tray4'), + ('buddyremove_confirm', 'Yeah, it is done...'), + ('tutorial_topic_list_F', 'Choose a topic from the list below:'), + ('purse_time', 'TIME'), + ('nav_venue_sw_lobby_free_8_name', 'Free Game Lobby'), + ('tutorial_topic_list_M', 'Choose a topic from the list below:'), + ('furni_s_sound_machine*7_name', 'Sound Machine Red'), + ('interface_icon_navigator', 'Navigator, navigate around'), + ('furni_xmas_cstl_wall_name', 'Ice Castle Wall'), + ('nav_own_hd', 'Your Rooms.'), + ('modtool_aa_checkbox_text', 'Audio alert'), + ('wallitem_industrialfan_desc', 'Powerful and resilient'), + ('furni_bed_budget*8_desc', 'King sized comfort!'), + ('sound_machine_burn', 'Burn Song'), + ('nav_venue_sw_lobby_intermediate_0_name', 'Snow Bombardiers Lobby'), + ('nav_venue_bb_lobby_beginner_1_name', 'Beginners Battle Ball 2'), + ('furni_chair_basic*5_desc', ''), + ('password.email.prefix', 'Your password is:'), + ('furni_pura_mdl5*4_desc', 'Any way you like it!'), + ('furni_table_norja_med*3_name', 'White Iced Table'), + ('furni_pura_mdl3*2_desc', 'Any way you like it!'), + ('nav_venue_sw_lobby_tournament_3_name', 'Tournament Lobby'), + ('furni_sound_set_34_desc', 'For guitar heroes'), + ('furni_summer_grill*1_desc', 'Plenty of ribs on that barbie'), + ('hubu_t4_1', 'Anna palautetta Hubusta'), + ('furni_divider_nor1*8_desc', 'Yellow Ice corner'), + ('hubu_t4_2', 'Tsekkaa heebelin jorinat'), + ('poll_offer_title', 'Poll'), + ('summer_chair_2_desc', 'Leave your towel early'), + ('wallitem_habbowheel_name', 'The Wheel of Destiny!'), + ('reg_mission', 'Your Mission:'), + ('furni_sofa_polyfon*9_name', 'Red Two-seater Sofa'), + ('furni_bed_budget_one_desc', 'aquamarine'), + ('nav_venue_sw_lobby_tournament_7/0_desc', ''), + ('furni_gothic_sofa*3_name', 'Gothic Sofa Red'), + ('furni_chair_plasto*9_name', 'Chair'), + ('nav_venue_sw_arena_beginner_name(0)', 'Playing beginner game'), + ('notickets_text_2', 'Buy more tickets now and get a discount. You can also buy tickets as a present.'), + ('wallitem_sw_hole_desc', 'sw_hole'), + ('furni_plant_big_cactus_name', 'Mature Cactus'), + ('notickets_text_1', 'Game price is 1 credit. For that you get 2 tickets.'), + ('poster_19_name', 'Hole In The Wall'), + ('furni_divider_nor4*7_name', 'Rural Iced Shutter'), + ('email', ''), + ('furni_sound_set_13_name', 'Dance 5'), + ('furni_present_gen1_name', 'Gift'), + ('nav_venue_bb_lobby_tournament_19/0_desc', ''), + ('furni_chair_norja_desc', 'Sleek and chic for each cheek'), + ('furni_marquee*9_name', 'Green Marquee'), + ('sound_machine_alert_song_locked', 'The song you\'re editing can\'t be modified. Please save the song under another name to create a new copy.'), + ('furni_glass_stool*2_name', 'Glass stool'), + ('nav_venue_theatredrome_xmas/0_desc', ''), + ('poster_5_name', 'Duck Poster'), + ('furni_prize2_desc', 'Nice and shiny'), + ('furni_valeduck_desc', 'He\'s lovestruck'), + ('furni_chair_plasty*7_desc', 'Hip plastic furniture'), + ('closed', 'Closed'), + ('furni_wcandleset_name', 'White Candle Plate'), + ('furni_sleepingbag*3_name', 'Ocean Sleeping Bag'), + ('furni_tree3_name', 'Christmas Tree 1'), + ('furni_sound_set_26_name', 'Groove 1'), + ('furni_barrier*2_desc', 'No trespassing, please!'), + ('game_bs_turn1', 'Your Turn'), + ('nav_venue_bb_lobby_expert_desc', 'Expert battle ball!'), + ('alert_donate_topic', 'SCAM ALERT!'), + ('game_bs_turn2', 'The Enemy\'s Turn'), + ('furni_sand_cstl_gate_name', 'sand castle gate'), + ('furni_rare_dragonlamp*4_desc', 'Scary and scorching!'), + ('furni_camera_desc', 'Smile!'), + ('pet.hotwords.lie', 'lie down'), + ('furni_sound_set_60_name', 'Latin Love 2'), + ('console_accept_selected', 'Accept'), + ('furni_divider_silo1*3_desc', 'Neat and natty'), + ('furni_summer_chair*7_name', 'Green Deck Chair'), + ('furni_pumpkin_desc', 'Cast a spooky glow'), + ('reg_habboname_note', 'Now it\'s time to make your own Habbo character! To make your own Habbo, please start by choosing your Habbo Name.'), + ('furni_rare_icecream_campaign_name', 'Rare icecream white'), + ('furni_doormat_plain_desc', 'Available in a variety of colours'), + ('room_areYouSure', 'Are you sure you want to delete this item forever?'), + ('sound_machine_confirm_burn', 'Burn this song?'), + ('predefined_room_name', '%user_name%\'s room'), + ('furni_divider_silo1*2_name', 'Black Corner Shelf'), + ('furni_table_plasto_4leg*3_desc', 'Hip plastic furniture'), + ('furni_solarium_norja*8_name', 'Yellow Solarium'), + ('furni_exe_globe_desc', 'The power is yours!'), + ('furni_bed_polyfon*6_name', 'Blue Mode Double Bed'), + ('notickets_store_link', 'Go to ticket store >>>'), + ('NUF_habbo_home', 'Habbo Home'), + ('nav_venue_the_den_name', 'The Den'), + ('furni_table_plasto_square*2_name', 'Round Dining Table'), + ('modtool_header', 'The Tool'), + ('pet_enrg_7', 'Energetic'), + ('nav_noanswer', 'No answer'), + ('roommatic_hc_members_only', 'This Room Is For HC Members Only'), + ('furni_xmasduck_desc', 'A right Christmas quacker!'), + ('pet_enrg_8', 'Lively'), + ('NUF_getting_room_own_rooms_tutor', 'Click the \'Create own room\' button to start building your room. Don\'t worry, making your room is completely free.'), + ('pet_enrg_5', 'Sprightly'), + ('pet_enrg_6', 'Active'), + ('furni_doormat_plain*4_desc', 'Available in a variety of colours'), + ('pet_enrg_3', 'Lazy'), + ('pet_enrg_4', 'Relaxed'), + ('furni_divider_poly3*6_desc', 'Blue Mode Bardesk Gate'), + ('pet_enrg_1', 'Slow'), + ('furni_glass_table*2_desc', 'Translucent beauty'), + ('pet_enrg_2', 'Sluggish'), + ('poster_1003_desc', 'get the lovely isles on your walls'), + ('furni_hc_djset_name', 'The Grammophon'), + ('pet_enrg_9', 'Tireless'), + ('furni_table_plasto_round*6_name', 'Round Dining Table'), + ('furni_sporttrack2*3_name', 'Sport corner grass'), + ('furni_footylamp_name', 'Football Lamp'), + ('furni_bed_silo_one_desc', 'Plain and simple'), + ('pet_enrg_0', 'Tired'), + ('furni_soft_sofachair_norja*7_name', 'Rural Iced Sofachair'), + ('furni_solarium_norja*9_desc', 'Rejuvenate your pixels!'), + ('furni_pillow*9_desc', 'Puffy, soft and VERY fluffy!'), + ('furni_plant_mazegate_snow_desc', 'There\'s snow way through!'), + ('furni_sound_set_8_name', 'Ambient 2'), + ('furni_divider_silo3*4_name', 'Beige Area Gate'), + ('previous', 'Previous'), + ('furni_glass_stool*3_desc', 'Translucent beauty'), + ('furni_bardeskcorner_polyfon*8_name', 'Yellow Mode Bardesk Corner'), + ('next_onearrowed', 'Next >'), + ('nav_venue_sw_lobby_expert_desc', 'For the William Tells and Robin Hoods of Snow Storming.'), + ('furni_bardeskcorner_polyfon*2_name', 'Black Mode Bardesk Corner'), + ('catalog_pet_unacceptable', 'Sorry, that name is unacceptable to Hotel Management'), + ('furni_sound_set_46_name', 'Club 1'), + ('nav_error_room_full', 'The room is full.'), + ('furni_queue_tile1*4_name', 'Gold Habbo Roller'), + ('furni_mocchamaster_desc', 'Wake up and smell it!'), + ('furni_gothic_stool*1_name', 'Gothic Stool Pink'), + ('furni_noob_chair*5_name', 'My first Habbo chair'), + ('furni_noob_rug*3_desc', 'Nice and neat sisal rug with aubergine edging'), + ('nav_venue_club_mammoth/0_name', 'Club Mammoth'), + ('pet_race_1_024', 'Cat Burglar'), + ('pet_race_1_022', 'Matted Moggy'), + ('poster_39_name', 'Screaming Furnies'), + ('pet_race_1_023', 'Indoor Alley Cat'), + ('furni_prizetrophy5*3_desc', 'Breathtaking bronze'), + ('pet_race_1_020', 'Caterwaul Kitty'), + ('NUF_mini_meet_people_room_tutor', 'The people wandering around are Habbos just like you.\\nClick on one of them to learn more about them- or on yourself to look in the mirror.'), + ('pet_race_1_021', 'Fabulous Feline'), + ('furni_arabian_tetbl_name', 'Hexagonal Tea Table'), + ('furni_grand_piano*4_name', 'Amber Grand Piano'), + ('poster_504_desc', 'The German flag'), + ('roomatic_name', 'Room name:'), + ('furni_sound_set_21_desc', 'Headbanging riffs'), + ('credit_redeem_info', 'More info about credit furni >>'), + ('furni_marquee*a_desc', 'It\'s both door and a shade!'), + ('furni_sound_set_33_name', 'Rock 3'), + ('furni_queue_tile1*5_desc', 'The power of movement'), + ('furni_doorD_name', 'Imperial Teleport'), + ('furni_rare_parasol*1_desc', 'Block those rays!'), + ('purse_youhave', 'You Have'), + ('nav_fullbutton', 'Full'), + ('furni_rare_fountain*2_desc', 'For our feathered friends'), + ('friend_request_accepted', 'Accepted!'), + ('tutorial_help_button_bubble', 'Click the blue question mark to open up the help menu to restart the tutorial.'), + ('furni_rubberchair*4_desc', 'Soft and tearproof!'), + ('furni_sound_set_9_desc', 'Mystical ambient soundscapes'), + ('furni_rare_fan*3_name', 'Purple Dragon Skin Fan'), + ('furni_table_plasto_square*8_desc', 'Hip plastic furniture'), + ('gs_choose_gametime', 'Choose Game duration:'), + ('furni_traffic_light*1_desc', 'Chill and wait your turn!'), + ('furni_sofachair_polyfon*6_desc', 'Blue Mode Armchair'), + ('furni_chair_norja*4_name', 'Urban Iced Chair'), + ('furni_val_teddy*2_name', 'Pink Share Bear'), + ('nav_venue_chill/0_name', 'Zen Garden'), + ('furni_table_plasto_square_name', 'Occasional Table'), + ('furni_bed_budget_name', 'Pura Bed'), + ('furni_solarium_norja_name', 'White Solarium'), + ('furni_noob_table*1_name', 'My first Habbo table'), + ('gs_5min', '5min'), + ('purse_credits', 'You have \\x1 Habbo Credit(s) in your purse.'), + ('furni_divider_poly3*5_name', 'Candy Hatch (Lockable)'), + ('furni_rare_icecream*6_name', 'Toffee Ice Cream Machine'), + ('furni_table_polyfon_med_name', 'Large Coffee Table'), + ('console_deselect_all', 'Deselect all'), + ('nav_venue_bb_lobby_amateur_8_name', 'Gevorderden Battle Ball 9'), + ('transaction_system_sms_win_kpn', 'KPN SMS'), + ('nav_venue_bb_lobby_intermediate_3/0_desc', ''), + ('furni_CFC_500_goldbar_desc', 'Worth 500 Credits'), + ('NUF_visiting_rooms', 'Visiting other players\' rooms'), + ('url_logout_timeout', 'http://%predefined%//account/disconnected?reason=logout'), + ('furni_table_silo_med*7_desc', 'Green Area Coffee Table'), + ('player_commands_no_args', 'You have not supplied any arguments!'), + ('furni_romantique_pianochair*2_name', 'Lime Romantique Piano Chair'), + ('pickup', 'Pick up'), + ('reg_tutorial_url', ''), + ('habboclub_confirm_body', 'You have %credits% credits'), + ('nav_venue_bb_lobby_beginner_12/0_desc', ''), + ('furni_rare_elephant_statue*1_name', 'Silver Elephant'), + ('help', 'Habbo Help'), + ('furni_soft_sofachair_norja*2_desc', 'Black Iced Sofachair'), + ('furni_table_plasto_round*1_desc', 'Hip plastic furniture'), + ('furni_sleepingbag*9_desc', 'Ultimate coziness'), + ('furni_arabian_tray2_desc', 'For those Arabian nights'), + ('NUF_visiting_rooms_hotelview_tutor', 'Hello. This time we are learning how to visit another user\'s room.'), + ('furni_traffic_light*6_name', 'Red Traffic Light'), + ('Alert_ChooseWhoToSentMessage', 'Please choose who to\\rsend your message to'), + ('poster_47_desc', 'Twinkle, twinkle'), + ('bb_title_finalScores', 'Final standings:'), + ('jukebox_song_author', 'by: %author%'), + ('poster_2003_name', 'Dodgy Geezer'), + ('poster_509_name', 'The Jamaican flag'), + ('poster_6_desc', 'But is it the right way up?'), + ('furni_toy1*1_name', 'Rubber Ball'), + ('nav_venue_bb_lobby_beginner_13_name', 'Beginners Battle Ball 14'), + ('furni_scifidoor*5_name', 'White Spaceship Door'), + ('credit_redeem_text', 'You are going to change Furni to %value% credits.'), + ('nav_venue_sw_lobby_amateur_0_name', 'Snow Slingers Lobby'), + ('club_txt_intro', 'Welcome to Habbo Club - the members only club that all the best Habbos belong to!\\r\\rMembers of Habbo Club get priority access to the hotel (so you can always get in), exclusive clothes, hair colours, rare furni and special guest room layouts. To see exactly what you\'ll be able to get your hands on as a Habbo Club member, take a look in the Catalogue.'), + ('nav_venue_bouncer_room_1_name', 'Beginners Battle Ball Arena'), + ('update_email_suggest', 'Habbo Hotel security supervisor requests you to update your email'), + ('furni_rare_dragonlamp*3_name', 'Silver Dragon Lamp'), + ('furni_scifiport*2_name', 'Blue Laser Gate'), + ('club_button_extend', 'Extend Membership'), + ('wallitem_val_heart_name', 'Heart Light'), + ('furni_pura_mdl3*7_name', 'Green Pura Module 3'), + ('furni_sound_set_61_desc', 'Straight from the heart'), + ('nav_venue_bb_lobby_expert_9/0_desc', ''), + ('furni_pura_mdl2*9_name', 'Red Pura Module 2'), + ('furni_hal_cauldron_name', 'Habboween Cauldron'), + ('furni_divider_nor1*2_name', 'Black Ice corner'), + ('send', 'Send'), + ('furni_couch_norja_desc', 'Two can perch comfortably'), + ('furni_pura_mdl4*5_name', 'beige pura module 4'), + ('pet_race_1_008', 'Mad Mouser'), + ('pet_race_1_009', 'Scaredy Kat'), + ('pet_race_1_006', 'Titchy Tiger'), + ('pet_race_1_007', 'Burmese Buddy'), + ('pet_race_1_004', 'Soft-Toed Sneaker'), + ('furni_divider_nor4*8_desc', 'Habbos, roll out!'), + ('furni_tile_desc', 'In a choice of colours'), + ('pet_race_1_005', 'Cat Astroflea'), + ('pet_race_1_002', 'Lesser Spotted Longhair'), + ('pet_race_1_003', 'Hidden Clause'), + ('pet_race_1_000', 'Sleepy Siamese'), + ('pet_race_1_001', 'Purr-Sian'), + ('furni_sound_set_53_name', 'Snowy Surprise'), + ('furni_rare_icecream*1_desc', 'Virtual blueberry rocks!'), + ('furni_table_plasto_round*15_name', 'Occasional Table'), + ('security', 'Security'), + ('furni_glass_chair*5_name', 'Glass chair'), + ('nav_venue_cunning_fox_gamehall/1_desc', 'It\'s one-on-one for five in a row'), + ('nav_venue_sw_lobby_tournament_4/0_desc', ''), + ('furni_carpet_soft_desc', 'Soft Wool Rug'), + ('poster_27_desc', 'Deck the halls!'), + ('furni_safe_silo*7_desc', 'Totally shatter-proof!'), + ('furni_table_silo_small*5_desc', 'Pink Area Occasional Table'), + ('furni_marquee*4_desc', 'It\'s both door and a shade!'), + ('furni_gothic_sofa*4_desc', 'Ghosts and Ghouls'), + ('furni_prizetrophy6*1_desc', 'Glittery gold'), + ('pet_race_1_019', 'Bobcat Wailer'), + ('furni_bardesk_polyfon*5_desc', 'For cute constructions'), + ('furni_carpet_polar*2_name', 'Blue Bear Rug'), + ('pet_race_1_017', 'Furry Friend'), + ('furni_soft_sofa_norja*6_desc', 'Blue Iced Sofa'), + ('furni_pura_mdl2*4_desc', 'Any way you like it!'), + ('pet_race_1_018', 'Trusting Tabby'), + ('pet_race_1_015', 'Haughty House Pet'), + ('chatlog.url', 'https://theallseeingeye.sulake.com/ase/habbo/uk/housekeeping/extra/hobba/chatlog.action?chatId='), + ('furni_ham2_name', 'Eaten Ham'), + ('pet_race_1_016', 'Curiousity - The Return!'), + ('pet_race_1_013', 'Felis Catus Allergicus'), + ('pet_race_1_014', 'Bushy Bobtail'), + ('pet_race_1_011', 'Egyptian Angora'), + ('pet_race_1_012', 'Freckled Feral'), + ('gs_choose_gamefield', 'Choose Game Arena:'), + ('furni_divider_nor5*6_desc', 'Cool cornering for your crib y0!'), + ('furni_summer_pool*2_name', 'Red Summer Pool'), + ('pet_race_1_010', 'Wannabe Wildcat'), + ('furni_rare_elephant_statue_desc', 'Say hello to Nelly'), + ('furni_sofa_silo*8_desc', 'Cushioned, understated comfort'), + ('furni_exe_rug_desc', 'Please remove your shoes!'), + ('NUF_meeting_people_roomlist_tutor', 'Let\'s visit one of the rooms and find out how to meet other users.'), + ('furni_chair_plasto*15_desc', 'Hip plastic furniture'), + ('nav_venue_habburger\'s_name', 'Habburgers'), + ('queue_current_2', 'You are in queue for the room.'), + ('queue_current_1', 'You are in Habbo Live queue...'), + ('furni_pura_mdl5*3_name', 'Black Pura Module 5'), + ('furni_hockey_score_name', 'Scoreboard'), + ('furni_sofachair_silo*5_desc', 'Pink Area Armchair'), + ('furni_hyacinth1_name', 'Pink Hyacinth'), + ('furni_pura_mdl1*6_desc', 'Any way you like it!'), + ('camera_open_dialog_heading', 'Camera'), + ('furni_prizetrophy5*2_name', 'Duo trophy'), + ('furni_glass_chair_desc', 'Translucent beauty'), + ('furni_rubberchair*3_desc', 'Soft and tearproof!'), + ('furni_exe_plant_name', 'Executive Plant'), + ('furni_pura_mdl2*3_desc', 'Any way you like it!'), + ('furni_pura_mdl1*2_name', 'Pink Pura Module 1'), + ('furni_plant_bonsai_desc', 'You can be sure it lives'), + ('furni_plant_valentinerose*4_desc', 'Be mine!'), + ('wallitem_hrella_poster_3_desc', 'Don\'t drift away!'), + ('furni_deadduck_name', 'Dead Duck'), + ('furni_summer_grill*3_desc', 'Plenty of steak on that barbie'), + ('modtool_extrainfo', 'Extra Info:'), + ('sound_machine_jukebox_window', 'Jukebox'), + ('gs_button_start', 'Start Game!'), + ('nav_venue_sw_lobby_beginner_5/0_desc', ''), + ('furni_romantique_chair*5_desc', 'What does this button do?'), + ('furni_table_plasto_4leg*9_desc', 'Hip plastic furniture'), + ('furni_soft_sofa_norja_desc', 'A soft iced sofa'), + ('furni_divider_nor4*9_name', 'Red Iced Auto Shutter'), + ('login_haventGotHabbo', 'Haven\'t got a Habbo yet?'), + ('furni_noob_stool*2_name', 'My first Habbo stool'), + ('furni_s_sound_machine*5_desc', 'Sound Machine Brown Desc'), + ('credit_redeem_window', 'Redeem credit furni'), + ('send_invitation_text', 'Want to meet someone from our Welcoming Party?'), + ('purse_vouchers_exitbutton', 'Cancel'), + ('furni_prizetrophy6*3_desc', 'Breathtaking bronze'), + ('nav_venue_cafe_gold/0_name', 'Kultakahvila'), + ('furni_fortune_name', 'Crystal Ball'), + ('poster_22_name', 'Butterfly Cabinet (blue)'), + ('object_displayer_link_badge', 'Edit Badge'), + ('furni_sound_set_15_name', 'RnB Grooves 6'), + ('Alert_NoNameSet', 'Check your Habbo name.'), + ('furni_hc_crpt_name', 'Persian Carpet'), + ('error_ok', 'OK->'), + ('game_chess_email', 'Receive game via email'), + ('sound_machine_confirm_save_list', 'Save playlist?'), + ('furni_noob_rug*2_desc', 'Nice and neat sisal rug with blue edging'), + ('queue_set.e1.alert', 'This room is currently available only to Habbos participating to the event.'), + ('furni_rare_icecream*0_desc', 'Virtual cherry rocks!'), + ('furni_arabian_chair_name', 'Green Blossom Chair'), + ('furni_divider_silo3*6_name', 'Blue Area Gate'), + ('furni_scifiport*4_desc', 'Energy beams. No trespassers!'), + ('furni_sofa_silo*4_desc', 'Beige Area Sofa'), + ('furni_one_way_door*4_desc', 'One at a time!'), + ('furni_chair_norja*5_desc', 'Sleek and chic for each cheek'), + ('furni_sound_set_19_desc', 'Shake your body!'), + ('poster_26_desc', 'See that halo gleam!'), + ('furni_doormat_plain*2_desc', 'Available in a variety of colours'), + ('furni_romantique_chair*1_name', 'Rose Quartz Chair'), + ('furni_hc_tv_name', 'Mega TV Set'), + ('pet.hotwords.follow_me', 'heel'), + ('furni_petfood3_desc', 'Fantastic 20% Saving!'), + ('furni_couch_norja*5_name', 'Pink Bench'), + ('furni_table_plasto_round*7_desc', 'Hip plastic furniture'), + ('furni_bed_armas_two_desc', 'King-sized pine comfort'), + ('modtool_days', 'Days'), + ('furni_one_way_door*7_name', 'Green One Way Gate'), + ('furni_table_norja_med*5_name', 'Large Coffee Table Pink'), + ('furni_sand_cstl_wall_name', 'sand_cstl_wall'), + ('nav_modify_doorstatus_givepw', 'Password for the room'), + ('NUF_getting_items_room_tutor', 'Nice room. Reminds me of a chic Parisian cafe in Slough. Open the Catalogue.'), + ('habbo_hand_prev', '<<<'), + ('pet.saying.generic.croco.3', 'Tick tock tick....'), + ('invitation_follow_failed', 'Sorry, your attempt to follow an invitation failed.'), + ('furni_sound_set_12_desc', 'Unusual as Standard'), + ('pet.saying.generic.croco.1', '*Mellow*'), + ('error_text', 'Error occured, press \'OK\' to restart program.\\r\\rPlease report bugs to:\\rwww.habbohotel.com/habbo/en/help/contact/bugs/ \\rSorry for the inconvenience.'), + ('pet.saying.generic.croco.2', 'I\'m so hungry I could eat you!'), + ('furni_divider_silo3*3_desc', 'Form following function'), + ('furni_table_plasto_4leg*2_desc', 'Hip plastic furniture'), + ('int_newmessages', 'New Message(s)'), + ('furni_rare_icecream*3_name', 'Blackcurrant Ice Cream Machine'), + ('bb_header_gameinfo', 'Game info'), + ('furni_scifiport*0_name', 'Red Laser Door'), + ('nav_venue_bb_lobby_beginner_7_name', 'Beginners Battle Ball 8'), + ('tx_history.description.bank_wallie', 'Wallie-card'), + ('nav_venue_hallway_name', 'Hallway'), + ('nav_venue_bb_lobby_amateur_11/0_desc', ''), + ('furni_bed_budget_one*5_desc', 'Prince sized comfort!'), + ('pet.saying.generic.croco.0', 'Rrrr....Grrrrrg....'), + ('nav_popup_go', '>>'), + ('furni_safe_silo*3_name', 'White Safe Minibar'), + ('furni_table_silo_small_name', 'Occasional Table'), + ('poll_confirm_window', 'Leave our poll'), + ('furni_table_norja_med*9_desc', 'For larger gatherings'), + ('furni_divider_nor4*6_desc', 'Habbos, roll out!'), + ('gs_3teams', '3 Teams Game'), + ('wallitem_post.it.limit', 'Only 50 stickies per room are allowed!'), + ('furni_scifidoor*4_desc', 'Protect your pot of gold!'), + ('furni_bed_polyfon_one*9_name', 'Red Single Bed'), + ('furni_soft_sofa_norja*2_desc', 'Black Iced Sofa'), + ('furni_corner_china_desc', 'Firm, fireproof foundation'), + ('hobba_pickup_go', 'Pick Up & Go!'), + ('furni_sporttrack3*2_desc', 'null'), + ('furni_rare_fan*6_name', 'Ochre Powered Fan'), + ('furni_sound_set_3_name', 'Electronic 1'), + ('NUF_mini_meet_people_user_tutor', 'Here you can chat to users directly. Ask a Habbo to be your friend by clicking on their Habbo and the button.\\nIf this is your first time, check your Hand to see a present to decorate your own room with, later.'), + ('furni_pura_mdl2*6_name', 'Blue Pura Module 2'), + ('furni_couch_norja*9_desc', 'Two can perch comfortably'), + ('furni_chair_plasty*9_desc', 'Hip plastic furniture'), + ('game_chess_white', 'White:'), + ('nav_venue_sw_lobby_intermediate_3/0_desc', 'Lumisota sen kuin vain kovenee.'), + ('furni_table_plasto_square*3_desc', 'Hip plastic furniture'), + ('nav_venue_theatredrome/0_desc', 'Perform your latest masterpiece!'), + ('nav_venue_the_den/0_desc', 'Has anyone seen my map?'), + ('furni_sound_set_40_name', 'Rock 4'), + ('remove', 'Remove'), + ('friend_request_decline_all', 'Decline all requests.'), + ('furni_rare_globe_name', 'Snow Globe'), + ('furni_bardesk_polyfon*8_name', 'Yellow Mode Bardesk'), + ('nav_venue_sw_lobby_free_6_name', 'Free Game Lobby'), + ('queue_change', 'Change queue'), + ('reg_parentemail_link_text2', 'Privacy Pledge'), + ('furni_rare_parasol*2_desc', 'Block those rays!'), + ('furni_romantique_pianochair*3_desc', 'null'), + ('reg_parentemail_link_text1', 'See the letter'), + ('sound_machine_list_save', 'Save Playlist'), + ('nav_public_helptext_hd', 'Public Spaces'), + ('furni_chair_plasty*2_desc', 'Hip plastic furniture'), + ('spectator_count', 'spectators %cnt%/%max%'), + ('reg_welcome2', 'Create Your Own Habbo'), + ('wallitem_roomdimmer_desc', 'Superior lighting for your room'), + ('furni_prizetrophy*3_name', 'Classic trophy'), + ('furni_plant_rose_name', 'Cut Roses'), + ('reg_welcome3', 'Now the fun begins! All you need to do is register and you\'re ready to start. It won\'t take long!\\rYou can change everything except your name and date of birth later. Come on!'), + ('furni_noob_table*5_name', 'My first Habbo table'), + ('nav_error_room_closed', 'The room is closed.'), + ('reg_changePassword', 'Change your password'), + ('furni_divider_nor5*3_desc', 'Cool cornering for your crib y0!'), + ('furni_doorC_name', 'Portaloo'), + ('furni_chair_plasty*10_name', 'Plastic Pod Chair'), + ('furni_pura_mdl1*9_name', 'Red Pura Module 1'), + ('furni_rare_stand_name', 'Speaker\'s Corner'), + ('furni_grunge_table_name', 'Grunge Table'), + ('furni_traffic_light*2_name', 'Blue Traffic Light'), + ('pet.saying.angry.croco.2', 'You have displeased me.'), + ('human_trading', 'Trading'), + ('furni_noob_stool*6_desc', 'Unfold me and take the weight off (green)'), + ('pet.saying.angry.croco.1', 'Rawwwr...rrr'), + ('nav_venue_sw_lobby_intermediate_5_name', 'Snow Bombardiers Lobby'), + ('gs_button_leavegame', 'Leave Game'), + ('pet.saying.angry.croco.0', 'Grrrrr...rrr'), + ('furni_s_sound_machine*1_name', 'Sound Machine Grey'), + ('pet.saying.angry.croco.4', 'Buuuuurrr..rrrrr'), + ('furni_chair_plasto*7_desc', 'Hip plastic furniture'), + ('pet.saying.angry.croco.3', 'Rowrrrr...rrrr'), + ('furni_soft_sofa_norja*9_desc', 'Red Iced Sofa'), + ('nav_venue_skylight_lobby_name', 'Skylight Lobby'), + ('furni_bed_polyfon_one*6_desc', 'Blue Mode Single Bed'), + ('furni_pillow*8_desc', 'Puffy, soft and huge'), + ('furni_hc_rntgn_name', 'X-Ray Divider'), + ('furni_table_silo_med*5_desc', 'Pink Area Coffee Table'), + ('furni_gothic_stool*2_desc', 'Be seated please..'), + ('furni_typingmachine_desc', 'Write that bestseller'), + ('furni_fridge_desc', 'Keep cool with a chilled snack or drink'), + ('nav_venue_cunning_fox_gamehall/4_desc', 'Get a hand like a foot? Keep a straight face and bluff it out'), + ('doorbell_rings', 'Rings the doorbell - Open the door?'), + ('furni_divider_silo1*9_desc', 'Red Area Small Table'), + ('nav_venue_bb_lobby_intermediate_7/0_desc', ''), + ('furni_prize1_name', 'Gold Trophy'), + ('poster_54_name', 'Hockey Stick'), + ('furni_sound_set_47_name', 'Club 2'), + ('furni_prizetrophy3*1_name', 'Globe trophy'), + ('purse_head2', 'ACCOUNT TRANSACTIONS'), + ('furni_soft_sofa_norja*5_name', 'Pink Iced Sofa'), + ('furni_prizetrophy9*1_desc', 'Glittery gold'), + ('buddyremove_next', 'Next >'), + ('reg_girl', 'Girl'), + ('furni_bed_budget_one*1_name', 'Aqua Pura Bed'), + ('NUF_visiting_rooms_roomlist_go', 'Click \'Go\' to go to a room.'), + ('poster_506_desc', 'To \'Finnish\' your decor...'), + ('furni_toy1_name', 'Rubber Ball'), + ('furni_sound_set_7_desc', 'Sound effects for Furni'), + ('sw_fieldname_6', 'Riverbank Siege'), + ('sw_fieldname_5', 'Polar Labyrinth'), + ('furni_bed_polyfon*4_desc', 'Beige Mode Double Bed'), + ('furni_pillow*4_name', 'Gold Feather Pillow'), + ('alert_duplicatesession', 'You are already logged in on another hotel! Log out before trying again.'), + ('sw_fieldname_7', 'Skull Falls Assault'), + ('sound_machine_alert_song_not_ready', 'Can\'t save song! Song not ready yet.'), + ('nav_venue_bb_lobby_beginner_5/0_desc', ''), + ('nav_venue_bb_lobby_tournament_4/0_desc', ''), + ('pet.saying.play.dog.1', 'woofWOOFwoofWOOFwoof'), + ('pet.saying.play.dog.0', 'rrr.. WOOF .rrr..'), + ('furni_cn_lamp_name', 'Lantern'), + ('furni_arabian_rug_name', 'Berber Kilim Rug'), + ('NUF_groups_hotelview_tutor', 'You have now opened the Group tutorial in the website window. Special!'), + ('gs_error_start_9', 'Team sizes can only differ by one player. This Game cannot start!'), + ('furni_divider_poly3*7_desc', 'Green Mode Bardesk Gate'), + ('furni_sofachair_silo*4_desc', 'Beige Area Armchair'), + ('poster_58_desc', 'whish you luck'), + ('furni_chair_basic*2_desc', 'It\'s a cracking design!'), + ('poster_516_name', 'The English flag'), + ('nav_venue_sw_lobby_tournament_2/0_desc', ''), + ('furni_gothic_carpet_name', 'Cobbled Path'), + ('sw_title', 'Snow Storm'), + ('furni_doormat_plain*5_name', 'Doormat'), + ('furni_pura_mdl4*4_desc', 'Any way you like it!'), + ('furni_sound_machine*1_name', 'Sound Machine'), + ('furni_sofa_silo*7_name', 'Green Area Sofa'), + ('nav_venue_sw_lobby_tournament_4_name', 'Tournament Lobby'), + ('gs_title_gamecreation', 'Game creation'), + ('furni_couch_norja*2_desc', 'Two can perch comfortably'), + ('furni_prizetrophy5_desc', 'Palkinto'), + ('furni_divider_nor3*9_desc', 'Red Iced gate'), + ('furni_present_gen_name', 'Gift'), + ('furni_prizetrophy7*3_name', 'Bronze Habbo trophy'), + ('alert_reg_parent_email', 'The email address you provided is unacceptable.'), + ('furni_bed_polyfon_girl_name', 'Double Bed'), + ('furni_rare_fountain_name', 'Bird Bath (red)'), + ('furni_pura_mdl3*3_name', 'Black Pura Module 3'), + ('furni_plant_pineapple_name', 'Pineapple Plant'), + ('furni_divider_nor2*8_name', 'Yellow Iced bar desk'), + ('messenger', 'Messenger'), + ('nav_venue_bb_arena_0_name', 'Battle Ball kaikille'), + ('sw_fieldname_2', 'Algid River'), + ('furni_bed_silo_two_desc', 'Plain and simple x2'), + ('sw_fieldname_1', 'Arctic Island'), + ('furni_pillow*1_desc', 'Puffy, soft and huge'), + ('sw_fieldname_4', 'Frosty Forest'), + ('sw_fieldname_3', 'Glacial Fort'), + ('furni_bar_basic_desc', 'A pura series 300 minibar'), + ('tutorial_welcome_M', 'Hi! I am your guide to Habbo Hotel. Please pick a topic to start.'), + ('tutorial_welcome_F', 'Hi there! I\'m your guide to Habbo Hotel. What would you like to learn today?'), + ('Alert_NoNameSetForLogo', 'Please give a name to your logo'), + ('furni_glass_table*5_name', 'Glass table'), + ('group_owner', 'Owner'), + ('console_target_friend_list_full', 'This user\'s friend list is full'), + ('furni_romantique_smalltabl*2_name', 'Lime Tray Table'), + ('ph_keys_spacebar', 'Spacebar'), + ('furni_noob_chair*3_name', 'My first Habbo chair'), + ('NUF_meeting_people_roomlist_publicTab', 'Click the Public Spaces tab to see the list of public rooms. To go to the room click the \'Go\' button.'), + ('furni_bed_polyfon*7_name', 'Green Mode Double Bed'), + ('furni_jukebox_ptv*1_name', 'Jukebox Pacha TV'), + ('poster_513_desc', 'Aussies rule!'), + ('poster_51_desc', '2 points for every basket'), + ('furni_toy1*2_name', 'Rubber Ball'), + ('furni_bartable_armas_name', 'Bardesk'), + ('nav_venue_sw_lobby_amateur_0/0_desc', ''), + ('NUF_mini_use_console_read_tutor', 'The Habbo Console lets you message with people you have added to your friends list.'), + ('nav_venue_bb_lobby_beginner_12_name', 'Beginners Battle Ball 13'), + ('poster_2002_name', 'Urho Kaleva Kekkonen'), + ('furni_sound_set_44_desc', 'Haunted Dimension'), + ('pet.saying.beg.dog.1', 'Oouh..oouh..snuh..ooo'), + ('furni_sporttrack2*1_name', 'Sport corner tartan'), + ('pet.saying.beg.dog.0', 'Oooo...Ouuu...oo...OUUU'), + ('furni_solarium_norja*5_desc', 'Rejuvenate your pixels!'), + ('pet.saying.beg.dog.2', '*whimpers *'), + ('reg_pledgelink', 'Hotel rules'), + ('habboclub_price1.days', '30'), + ('furni_glass_shelf_desc', 'Translucent beauty'), + ('furni_sofachair_polyfon*3_name', 'White Armchair'), + ('reg_verification_info', 'You must know the correct birthday and password before you\'re allowed to make these changes.'), + ('furni_carpet_soft*5_desc', 'Soft Wool Rug'), + ('furni_grunge_mattress_name', 'Grunge Mattress'), + ('furni_bed_polyfon_one_name', 'Single Bed'), + ('furni_sound_machine_pro_name', 'Sound Machine Pro'), + ('furni_chair_china_desc', 'The elegant beauty of tradition'), + ('furni_rare_icecream*7_desc', 'Virtual chocolate rocks!'), + ('furni_table_silo_med*8_name', 'Yellow Coffee Table'), + ('club_gift.message', 'Happy Habbo Club! Love Callie :)'), + ('furni_sw_raven_desc', 'My name is Otter'), + ('furni_noob_table*2_desc', 'Lightweight, practical and dark blue'), + ('furni_soft_sofachair_norja*3_desc', 'Soft Iced sofachair'), + ('sound_machine_confirm_delete', 'Delete song?'), + ('furni_plant_fruittree_name', 'Fruit Tree'), + ('nav_venue_bb_lobby_intermediate_1/0_desc', ''), + ('furni_heartsofa_name', 'Heart Sofa'), + ('furni_bed_budget_one*8_name', 'Yellow Pura Bed'), + ('NUF_getting_room', 'Making your own room'), + ('furni_rare_elephant_statue*2_name', 'Bronze Elephant'), + ('nav_venue_ballroom/0_desc', 'Come play ball!'), + ('nav_venue_sw_lobby_amateur_1_name', 'Snow Slingers Lobby'), + ('console_lasttime', 'Last Time'), + ('furni_md_sofa_desc', 'A decent recliner'), + ('furni_wooden_screen*6_name', 'Blue Oriental Screen'), + ('partner_registration_text', 'Click the link to finish your registration. When you have finished the registration click OK to continue to the hotel.'), + ('furni_sound_set_62_desc', 'Music of the Arabian night!'), + ('furni_arabian_divdr_name', 'Soft wooden screen'), + ('furni_tree1_desc', 'Dead christmas tree'), + ('furni_grand_piano*3_name', 'Pink Grand Piano'), + ('console_select_requests', 'Following users have asked to be your friend. Please accept or decline.'), + ('furni_divider_nor4*2_name', 'Black Iced Auto Shutter'), + ('furni_glass_chair*3_name', 'Glass chair'), + ('reg_passwordContainsNoNumber', 'Password must contain at least one number'), + ('buddyremove_invert', 'Invert Selection'), + ('furni_val_teddy*5_desc', 'The yellow bear of understanding'), + ('furni_sound_set_51_name', 'Club 6'), + ('poster_1_desc', 'The Noble and Silver Show'), + ('roomevent_create_name', 'Type the name of your event'), + ('Alert_unacceptableName', 'Sorry, that name is unacceptable to the Hotel Management'), + ('NUF_getting_room_go_tutor', 'Your room is now ready. Let\'s go see! I hope you have a bed...'), + ('poster_520_name', 'The Rainbow Flag'), + ('password', 'Password:'), + ('furni_bed_budget*8_name', 'Yellow Pura Double Bed'), + ('gs_header_gamelist', 'Game List'), + ('furni_chair_plasty_desc', 'Hip plastic furniture'), + ('url_purse_subscribe', 'http://%predefined%//credits?'), + ('furni_table_plasto_bigsquare*15_desc', 'Hip plastic furniture'), + ('furni_glass_stool*6_desc', 'Translucent beauty'), + ('error_report', 'Error Report'), + ('summer_chair_6_desc', 'Get decked'), + ('furni_chair_basic*5_name', 'chair_basic'), + ('room_remove_specs', 'Sorry! Now it\'s someone else\'s turn to watch this event.'), + ('furni_bunny_desc', 'Yours to cuddle up to'), + ('invitation_exists', 'You have already invited members of the Welcoming Party to your room.'), + ('purse_vouchers_furni_success', 'Voucher was successfully redeemed. You have been given the following furniture:'), + ('nav_rooms_popular', 'Popular rooms'), + ('nav_cancel', 'Cancel'), + ('alert_cross_domain_download', 'Cross domain content download prevented'), + ('furni_table_plasto_4leg*16_desc', 'Hip plastic furniture'), + ('url_pets', 'http://%predefined%//hotel/pets'), + ('furni_bardeskcorner_polyfon*9_desc', 'Tuck it away'), + ('gs_button_cancel', 'Cancel'), + ('furni_barchair_silo*7_name', 'Green Bar Stool'), + ('catalog_credits', 'You have \\x Credits in your purse.'), + ('furni_divider_nor3_name', 'Door (Lockable)'), + ('nav_modify_name', 'Name of the room'), + ('nav_venue_bb_lobby_amateur_7_name', 'Gevorderden Battle Ball 8'), + ('nav_venue_club_massiva/0_desc', 'Rest your dancing feet!'), + ('furni_gothrailing_desc', 'The dark side of Habbo'), + ('queue_set.na.alert', 'This Room is for Staff only.'), + ('nav_venue_bb_lobby_tournament_8_name', 'Competitie Battle Ball 9'), + ('furni_sound_set_29_name', 'Dance 2'), + ('console_msgs', 'msgs'), + ('furni_noob_lamp*6_name', 'My first Habbo lamp'), + ('furni_marquee*6_desc', 'It\'s both door and a shade!'), + ('furni_chair_plasto*16_desc', 'Hip plastic furniture'), + ('furni_chair_basic*9_desc', 'It\'s a cracking design!'), + ('summer_chair_2_name', 'Pink Deck Chair'), + ('alert_too_much_furnitures', 'Furni limit for room is exceeded. Not all furnitures are shown. Please remove some.'), + ('furni_pura_mdl5*4_name', 'White Pura Module 5'), + ('bus.full_msg', 'The FRANK bus is full at the moment, please come back later or visit the FRANK page below for more information.'), + ('furni_sound_set_22_name', 'SFX 3'), + ('furni_gothic_sofa*3_desc', 'The dark side of Habbo'), + ('furni_md_limukaappi_name', 'Habbo Cola Machine'), + ('poster_19_desc', 'Trying to get in or out?'), + ('gs_2min', '2min'), + ('poster_8_desc', 'Habbos come in all colours'), + ('furni_pillar*6_desc', 'Ancient and stately'), + ('furni_carpet_standard*3_desc', 'Available in a variety of colours'), + ('purse_vouchers_info', 'When you buy Habbo Credits with a mobile phone, you will receive a special voucher code. Enter the code in the box above, click \'Get Credits!\' and they\'ll be added to your purse.'), + ('furni_valeduck_name', 'Valentine\'s Duck'), + ('Alert_MessageFromAdmin', 'Message from Hotel Management:'), + ('furni_present_gen1_desc', 'What\'s inside?'), + ('reg_tutorial_txt', ''), + ('furni_tile_stella_name', 'Star Tile'), + ('furni_shelves_norja*4_name', 'Urban Iced Bookcase'), + ('transaction_system_creditcards_is', 'Creditcard'), + ('furni_shelves_polyfon_desc', 'For the arty pad'), + ('furni_tv_luxus_name', 'Digital TV'), + ('recycler_status_window_title', 'Recycling Status'), + ('furni_sleepingbag*6_name', 'Purple Sleeping Bag'), + ('gs_button_shrink', 'Minimize Window'), + ('furni_wcandleset_desc', 'Simple but stylish'), + ('furni_sleepingbag*3_desc', 'Ultimate coziness'), + ('object_displayer_show_actions', 'Show actions'), + ('hubu_t5_1', 'Lisetoa huumeista'), + ('song_disk_text_template', '%name%'), + ('hubu_t5_2', 'Huumeista-esite'), + ('queue_other_1', 'Habbo Live queue status'), + ('poster_33_name', 'Save the Panda'), + ('hubu_t5_3', 'Yleistietoa EOPH ry:st--------------'), + ('queue_other_2', 'Room queue status'), + ('furni_hcsohva_name', 'Throne Sofa'), + ('furni_sound_set_26_desc', 'Bollywood Beats!'), + ('furni_christmas_poop_name', 'Reindeer Droppings'), + ('furni_rare_dragonlamp*4_name', 'Serpent of Doom'), + ('nav_venue_bb_lobby_amateur_7/0_desc', ''), + ('purse_value', 'VALUE'), + ('furni_glass_sofa*5_desc', 'Translucent beauty'), + ('nav_venue_bb_lobby_tournament_15/0_desc', ''), + ('furni_glass_stool*2_desc', 'Translucent beauty'), + ('pet.saying.play.cat.1', 'Purrrr.. oo..Purrr'), + ('furni_pura_mdl4*7_name', 'Green Pura Module 4'), + ('nav_venue_cafe_ole/0_desc', 'Relax with friends over one of Marias specialty coffees'), + ('pet.saying.play.cat.0', 'Mew..MEOW..meow'), + ('furni_pumpkin_name', 'Pumpkin Lamp'), + ('furni_summer_chair*7_desc', 'Reserved!'), + ('ph_tickets_txt', 'Tickets can be used for BattleBall: Rebound!, SnowStorm, the Lido Diving and Wobble Squabble games. Tickets never expire.\\r\\rCurrently you have \\x1 ticket(s).'), + ('roomatic_onemoment', 'Please wait, we are going to your room...'), + ('furni_small_table_armas_name', 'Occasional Table'), + ('furni_table_polyfon_med_desc', 'For larger gatherings'), + ('nav_venue_bb_lobby_expert_3/0_desc', ''), + ('furni_chair_silo*6_desc', 'Blue Silo Dining Chair'), + ('furni_exe_globe_name', 'Power Globe'), + ('furni_bed_budget_one_name', 'bed_budget_one'), + ('furni_divider_silo1*2_desc', 'Neat and natty'), + ('nav_venue_bb_lobby_intermediate_0_name', 'Intermediate'), + ('furni_sofa_polyfon*9_desc', 'Comfort for stylish couples'), + ('furni_noob_lamp*3_desc', 'Get the light right where you want it (aubergine)'), + ('nav_showfull', 'Show Full Rooms'), + ('furni_divider_nor3*2_desc', 'Black Iced gate'), + ('reg_note_title', 'Warning!'), + ('hubu_answ_count', 'Replies'), + ('nav_recommended_rooms', 'Recommended Rooms'), + ('transaction_system_bank_nordea', 'Nordea'), + ('furni_sound_set_37_desc', ''), + ('poster_2006_desc', 'He is the magic Habbo'), + ('sw_link_gameRules_url', 'http://%predefined%//groups/56553/id'), + ('wave', 'Wave'), + ('furni_hc_djset_desc', 'Very old skool scratch\'n\'spin'), + ('furni_plant_maze_name', 'Maze Shrubbery'), + ('furni_scifirocket*3_name', 'Endor Smoke Machine'), + ('furni_val_teddy*1_name', 'Grey Share Bear'), + ('recycler_ready_outcome', 'Recycling reward: %outcome%'), + ('poster_4_desc', 'Fake of course!'), + ('poster_62_desc', 'We can\'t bear to lose them!'), + ('furni_glass_stool*9_desc', 'Translucent beauty'), + ('furni_goodie1_name', 'Marzipan Man'), + ('nav_modify_choosecategory', 'Choose a category for your room'), + ('object_displayer_link_home', 'User\'s home page'), + ('nav_venue_sw_lobby_tournament_8/0_desc', ''), + ('furni_xmasduck_name', 'Christmas Rubber Duck'), + ('help_txt_2', 'Password Reset'), + ('pet_mood_2', 'Blue'), + ('furni_queue_tile1*4_desc', 'The power of movement'), + ('help_txt_1', 'How do I get Credits?'), + ('pet_mood_3', 'Contented'), + ('nav_venue_bb_lobby_tournament_1_name', 'Competitie Battle Ball 2'), + ('furni_rare_daffodil_rug_name', 'Petal Patch'), + ('help_txt_4', 'The Habbo Way'), + ('pet_mood_0', 'Miserable'), + ('help_txt_3', 'Help with Habbo Hotel'), + ('pet_mood_1', 'Depressed'), + ('pet_mood_6', 'Ecstatic'), + ('furni_bed_budget*4_name', 'White Pura Double Bed'), + ('nav_venue_bb_lobby_amateur_0_name', 'Amateur'), + ('furni_sofachair_polyfon*7_desc', 'Green Mode Armchair'), + ('yes', 'Yes'), + ('pet_mood_4', 'Happy'), + ('pet_mood_5', 'Joyful'), + ('furni_sound_set_30_desc', 'Moments in love'), + ('furni_prizetrophy2*1_desc', 'Glittery gold'), + ('furni_wooden_screen*3_desc', 'Add an exotic touch to your room'), + ('transaction_system_bank_op', 'Osuuspankki'), + ('help_txt_6', 'Contact Us'), + ('help_txt_5', 'Safety Tips'), + ('furni_bardeskcorner_polyfon*2_desc', 'Black Mode Bardesk Corner'), + ('poster_15_desc', 'Marvellous mountains'), + ('room_areYouSurePlace', 'Warning! If you put something down in this room you will not be able to pick it up again.'), + ('nav_venue_bouncer_room_3_name', 'Semi-profs Battle Ball Arena'), + ('furni_chair_plasto*12_name', 'Chair'), + ('furni_gothic_chair*6_name', 'Gothic Chair Blue'), + ('furni_sofa_polyfon*2_desc', 'Black Mode Sofa'), + ('modtool_alertuser', 'Alert User'), + ('furni_toilet_desc', 'Loo Seat'), + ('furni_plant_cruddy_name', 'Aloe Vera'), + ('nav_venue_space_cafe/0_desc', 'In this space noone can see you ask for a soda!'), + ('nav_incorrectflatpw', 'Incorrect, try again.'), + ('furni_chair_plasto*13_desc', 'Hip plastic furniture'), + ('login_firstTimeHere', 'First time here?'), + ('furni_skullcandle_desc', 'Alas poor Yorrick...'), + ('NUF_mini_endtopic_step1_tutor', 'Well that\'s all from me. If you have any problems just click the little blue question mark to restart the tutorial and find our FAQs.\\nTo start exploring by yourself, click Close guide from the upper left corner.'), + ('furni_divider_poly3*3_name', 'White Hatch'), + ('help_callforhelp', 'Get Live Help'), + ('furni_rare_fountain*2_name', 'Bird Bath (green)'), + ('nav_venue_rooftop_name', 'Rooftop Cafe'), + ('furni_scifiport*7_name', 'Turquoise Sci-Fi Port'), + ('purse_back_to_credits', 'Back To Purse'), + ('room_ban', 'Kick & ban'), + ('furni_pura_mdl5*1_name', 'Aqua Pura Module 5'), + ('furni_val_teddy*4_name', 'Brown Share Bear'), + ('poster_40_name', 'Bonnie Blonde'), + ('NUF_getting_room_navigator_tutor', 'You want to click it real good. The \'Own room(s)\' tab I mean. Don\'t click yourself. It\'s unhygienic.'), + ('summer_chair_3_desc', 'Relax and enjoy the sun'), + ('furni_wooden_screen*2_name', 'RosewoodScreen'), + ('nav_venue_sun_terrace_name', 'Sun Terrace'), + ('furni_rare_fan*3_desc', 'Keeps the heat off St George!'), + ('nav_venue_sport_name', 'Power Gym'), + ('furni_toilet_red_desc', 'Loo Seat'), + ('retype_password', 'Retype Password:'), + ('furni_chair_basic*6_desc', 'It\'s a cracking design!'), + ('console_friends_helptext', 'This screen shows a list of all your Habbo Friends. It tells you where they are in the hotel, or, if they\'re not checked in, when their last visit was.'), + ('NUF_getting_items_room_', 'This is the Catalogue icon. Click to open it.'), + ('furni_grunge_barrel_desc', 'Beacon of light!'), + ('furni_soft_sofachair_norja*6_name', 'Blue Iced Sofachair'), + ('int_howtoget', 'How To get?'), + ('furni_sound_set_23_desc', 'Don\'t be afraid of the dark'), + ('nav_ok', 'OK'), + ('furni_sofachair_polyfon*6_name', 'Blue Mode Armchair'), + ('nav_venue_theatredrome_valentine_name', 'Theatredrome Valentine'), + ('furni_sofachair_polyfon_desc', 'Loft-style comfort'), + ('poster_83_name', 'Pöllö huhuilee'), + ('furni_soft_sofachair_norja*2_name', 'Black Iced Sofachair'), + ('roomdimmer_furni_limit', 'You can only have one roomdimmer per room'), + ('recycler_progress_timeleft', 'Time left: %hours% h and %minutes% min'), + ('furni_chair_plasto*3_name', 'Chair'), + ('NUF_getting_room_hotelview_tutor', 'Now you will learn how to make your own room. First go to the Guest Rooms area of the Navigator.'), + ('roomevent_create', 'Create'), + ('reg_year', 'Year'), + ('furni_divider_poly3_name', 'Hatch (Lockable)'), + ('furni_divider_nor1*7_name', 'Rural Iced Corner'), + ('furni_rare_beehive_bulb_name', 'Blue Amber Lamp'), + ('furni_waterbowl*2_name', 'Green Water Bowl'), + ('NUF_getting_room_room_hand', 'Open your hand!'), + ('furni_carpet_standard*6_desc', 'Available in a variety of colours'), + ('furni_CF_5_coin_silver_name', 'Silver Coin'), + ('furni_shelves_norja*7_name', 'Rural Iced Bookcase'), + ('opening_hours_text_disabled', 'The Hotel is shutting down really soon. To avoid confusion, purchasing of furniture, Habbo Club and game tickets have been disabled, as well as playing games and furniture trading. Try again tomorrow when the hotel is open!'), + ('nav_venue_bb_lobby_5_name', 'Battle Ball Kaikille'), + ('game_bs_congrat', 'Congratulations!'), + ('furni_arabian_tray2_name', 'Candle Tray'), + ('furni_giftflowers_desc', 'Guaranteed to stay fresh'), + ('club_button_1_period', 'Buy 1 >>>'), + ('furni_bed_polyfon_one*2_desc', 'Black Mode Single Bed'), + ('poster_47_name', 'Small silver star'), + ('furni_divider_nor3*5_desc', 'Pink Iced gate'), + ('furni_sofachair_polyfon_girl_desc', 'Think pink'), + ('furni_pura_mdl5*8_name', 'Yellow Pura Module 5'), + ('furni_hal_cauldron_desc', 'Eye of Habbo and toe of Mod!'), + ('poster_1006_name', 'Hoot Poster'), + ('furni_carpet_valentine_name', 'Red carpet'), + ('furni_floortile_name', 'Floor Tile'), + ('furni_divider_nor1*4_name', 'Urban Iced Corner'), + ('furni_bardeskcorner_polyfon*12_desc', 'Tuck it away'), + ('furni_table_plasto_bigsquare*3_desc', 'Hip plastic furniture'), + ('furni_traffic_light*6_desc', 'Chill and wait your turn!'), + ('club_general_prepaid', 'Prepaid Months'), + ('wallitem_val_heart_desc', 'Heartbroken... without your love!'), + ('furni_pura_mdl3*7_desc', 'Any way you like it!'), + ('furni_sound_set_58_name', 'RnB Grooves 4'), + ('furni_china_shelve_name', 'Chinese Lacquer Bookshelf'), + ('furni_divider_silo1*5_desc', 'Pink Area Corner Shelf'), + ('nav_venue_sw_lobby_tournament_desc', 'For stand-alone Tournaments.'), + ('furni_divider_silo2_name', 'Screen'), + ('furni_plant_mazegate_name', 'Maze Shrubbery Gate'), + ('poster_509_desc', 'The flag of Jamaica'), + ('furni_soft_sofachair_norja*9_name', 'Red Iced Sofachair'), + ('nav_venue_sw_arena_intermediate_name(0)', 'Playing intermediate game'), + ('furni_barchair_silo*4_name', 'Beige Bar Stool'), + ('furni_scifidoor*7_name', 'Aqua Spaceship Door'), + ('furni_CF_10_coin_gold_desc', 'Worth 10 Credits'), + ('furni_glass_sofa*8_desc', 'Translucent beauty'), + ('jukebox_reset', 'Reset Jukebox'), + ('nav_venue_sw_lobby_intermediate_desc', 'For the accomplished Snow Stormers.'), + ('furni_spotlight_desc', 'For the star of the show'), + ('furni_couch_norja_name', 'Bench'), + ('furni_romantique_divan*3_name', 'Turquoise Romantique Divan'), + ('furni_sleepingbag*7_desc', 'Ultimate coziness'), + ('roomatic_pws2', '24 hour access:'), + ('wallitem_jp_sheet1_desc', 'jp_sheet1'), + ('furni_table_silo_med*2_desc', 'Wipe clean and unobtrusive'), + ('furni_glass_table_desc', 'Translucent beauty'), + ('poster_502_desc', 'The US flag'), + ('pet_enrg_10', 'Mad'), + ('gs_scores_team_2', 'Blue Team:'), + ('pet_enrg_11', 'Nutcase'), + ('gs_scores_team_1', 'Red Team:'), + ('furni_cn_sofa_desc', 'Seating,Oriental style!'), + ('gs_scores_team_4', 'Green Team:'), + ('gs_scores_team_3', 'Yellow Team:'), + ('furni_table_silo_med*9_desc', 'Red Area Coffee Table'), + ('furni_hc_machine_name', 'Weird Science Machine'), + ('callhelp_writeyour', 'Write your question about Habbo Hotel here:'), + ('furni_table_silo_small*5_name', 'Pink Area Occasional Table'), + ('nav_addtofavourites', 'Add to favourites'), + ('furni_table_plasto_round*15_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_tournament_4_name', 'Competitie Battle Ball 5'), + ('furni_birdie_name', 'Pop-up Egg'), + ('furni_table_plasto_bigsquare_desc', 'Hip plastic furniture'), + ('furni_sound_set_33_desc', 'Guitar solo set'), + ('furni_romantique_divider*3_desc', 'Keeping things separated'), + ('furni_bed_budget*1_name', 'Aqua Pura Double Bed'), + ('furni_rare_beehive_bulb*2_desc', 'A honey-hued glow'), + ('furni_theatre_seat_desc', 'For Lazy boys and girls!'), + ('furni_hc_lmpst_desc', 'Somber and atmospheric'), + ('furni_divider_nor5*6_name', 'Blue Iced Angle'), + ('furni_summer_pool*2_desc', 'Fancy a dip?'), + ('poster_12_desc', 'a beautiful sunset'), + ('furni_carpet_polar*2_desc', 'Snuggle up on a Funky bear rug...'), + ('furni_md_rug_desc', 'Bubbles under your steps'), + ('Alert_InviteFriend', 'Invite your friends'), + ('nav_venue_bb_lobby_intermediate_4_name', 'Semi-profs Battle Ball 5'), + ('furni_hockey_score_desc', '...for keeping your score'), + ('furni_gothic_chair*3_name', 'Red Gothic Chair'), + ('wallitem_sw_stone_name', 'sw_stone'), + ('furni_pillow*7_name', 'Purple Velvet Pillow'), + ('nav_popup_header', 'Recommended rooms'), + ('nav_venue_sw_lobby_beginner_0_name', 'Snow Rookies Lobby'), + ('furni_table_norja_med*5_desc', 'For larger gatherings'), + ('furni_red_tv_name', 'Portable TV'), + ('reg_promise', '*Any personal information you supply will only be used by Habbo Ltd in accordance with the Habbo Pledge and will not be shared with third parties.'), + ('room_badge_choose', 'Modify Badge:'), + ('furni_table_plasto_square*15_desc', 'Hip plastic furniture'), + ('furni_sound_set_48_desc', 'Sweet party beat'), + ('nav_venue_ballroom_name', 'Ballroom'), + ('pet.hotwords.bad', 'bad'), + ('poster_55_desc', 'Save our trees!'), + ('furni_glass_chair_name', 'Glass chair'), + ('furni_prizetrophy5*2_desc', 'Shiny silver'), + ('furni_divider_poly3*4_desc', 'Beige Mode Bardesk Gate'), + ('tutorial_console_sample_message', 'Hello! This is a message sent to you from the Habbo Tutorial. To close and delete this message click delete. Sadly you cannot reply to this message as it is automated. Normally you can reply to messages by clicking the reply button.'), + ('furni_s_sound_machine*5_name', 'Sound Machine Brown'), + ('furni_divider_nor4*9_desc', 'Habbos, roll out!'), + ('furni_pura_mdl3*4_desc', 'Any way you like it!'), + ('NUF_getting_room_room_tutor', 'Tada! Nice room, although it\'s a little empty. Hey! Let\'s furnish it with something./nOpen your hand to check what you have, (if you have done this step before then you won\'t receive anything).'), + ('furni_fortune_desc', 'Gaze into the future'), + ('furni_soft_sofa_norja_name', 'iced sofa'), + ('furni_pura_mdl1*2_desc', 'Any way you like it!'), + ('nav_venue_sw_lobby_free_6/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('furni_divider_nor3*8_name', 'Yellow Iced gate'), + ('gs_title_finalscores', 'Final Standings:'), + ('gs_error_10', 'The hotel is closed or about to close. We look forward to welcoming you back tomorrow at (ADD LOCAL OPENING TIME).'), + ('furni_plant_bonsai_name', 'Bonsai Tree'), + ('furni_jukebox*1_name', 'Jukebox'), + ('room_loading', 'Loading room...'), + ('furni_hc_crpt_desc', 'Ultimate craftsmanship'), + ('furni_rare_hammock_desc', 'Eco bed'), + ('NUF_mini_use_console', 'Learn about messaging'), + ('furni_romantique_chair*1_desc', 'Elegant seating for elegant Habbos'), + ('transaction_system_bank_digiraha', 'Digiraha'), + ('NUH_messenger', 'Open your Console here - you might have messages or friend requests waiting.'), + ('furni_arabian_chair_desc', 'Exotic, soft seating'), + ('furni_noob_chair*6_name', 'My first Habbo chair'), + ('poster_510_desc', 'The flag of Italy'), + ('furni_carpet_standard*a_desc', 'Available in a variety of colours'), + ('queue_set.c.info', 'There are %c% Habbo Club member(s) in front of you. Be patient :)'), + ('furni_scifiport*4_name', 'Pink Sci-Fi Port'), + ('furni_sound_set_44_name', 'Graveyard Portal'), + ('furni_pura_mdl4*1_desc', 'Any way you like it!'), + ('furni_divider_silo3*6_desc', 'Blue Area Gate'), + ('furni_sound_machine*4_name', 'Blue Traxmachine'), + ('send_invitation_header', 'Get a warm welcome'), + ('game_TicTacToe', 'Boter kaas en eieren'), + ('nav_venue_sw_lobby_tournament_1_name', 'Tournament Lobby'), + ('furni_rare_fan*2_name', 'Green Powered Fan'), + ('furni_doormat_plain*2_name', 'Doormat'), + ('furni_table_plasto_square*7_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_intermediate_8/0_desc', ''), + ('furni_noob_table*6_desc', 'Lightweight, practical and green'), + ('win_callforhelp', 'Alert a Moderator'), + ('furni_prizetrophy8*1_desc', 'Glittery gold'), + ('furni_chair_norja*5_name', 'Pink Chair'), + ('furni_hc_tv_desc', 'Forget plasma, go HC!'), + ('furni_divider_arm1_name', 'Corner plinth'), + ('furni_table_plasto_round*7_name', 'Round Dining Table'), + ('furni_petfood3_name', 'Cabbage Mega Multipack'), + ('furni_carpet_standard*9_name', 'Floor Rug'), + ('opening_hours_title', 'Hotel Maintenance'), + ('console_noemail', 'Sorry,'), + ('furni_couch_norja*8_name', 'Yellow Bench'), + ('furni_s_sound_machine*1_desc', 'Sound Machine Grey Desc'), + ('furni_noob_stool*6_name', 'My first Habbo stool'), + ('purse_event', 'ACTIVITY'), + ('reg_readterms_alert', 'You have to read the Terms and Conditions\\r(scroll to the bottom of the text).'), + ('pet.hotwords.beg', 'beg'), + ('furni_jp_drawer_name', 'Japanese Drawer'), + ('gs_state_started', 'This Game has already started...'), + ('furni_sound_set_11_name', 'Dance 4'), + ('furni_divider_nor2*4_name', 'Urban Iced Bar'), + ('queue_set.e2.info', 'There are %e2% Habbos in front of you in the queue.'), + ('furni_bath_name', 'Bubble Bath'), + ('furni_rare_icecream*3_desc', 'Virtual blackcurrant rocks!'), + ('nav_modify_nameoftheroom', 'Name Of The Room'), + ('furni_scifiport*1_desc', 'Energy beams. No trespassers!'), + ('nav_venue_bb_lobby_amateur_12/0_desc', ''), + ('furni_table_silo_small*8_name', 'Yellow Occasional Table'), + ('furni_divider_silo3*3_name', 'White Area Gate'), + ('nav_venue_sw_lobby_amateur_7/0_desc', 'Astetta rankempaa lumisotaa.'), + ('reply', 'Reply'), + ('furni_toilet_yell_desc', 'Loo Seat'), + ('hobba_alert', 'Moderator Alert'), + ('You can play a bunch of exciting games, visit your friends\' rooms or even make your own place and decorate it to your heart\'s delight.', ''), + ('pet.saying.eat.croco.4', '*Buurrrrp*'), + ('furni_tree5_desc', 'Any presents under it yet?'), + ('pet.saying.eat.croco.2', '*Chomp chomp*'), + ('pet.saying.eat.croco.3', 'Mmmm mmmmm....'), + ('furni_divider_poly3*7_name', 'Green Mode Bardesk Gate'), + ('pet.saying.eat.croco.0', 'Mmmm yum yum'), + ('pet.saying.eat.croco.1', 'Ruff ruff ruff'), + ('furni_scifidoor*4_name', 'Emerald Spaceship Door'), + ('furni_edice_name', 'Holo-dice'), + ('furni_divider_nor4*6_name', 'Blue Iced Auto Shutter'), + ('furni_safe_silo*3_desc', 'Totally shatter-proof!'), + ('furni_table_silo_small_desc', 'For those random moments'), + ('gs_header_page', 'Page'), + ('furni_sporttrack3*2_name', 'Sport goal asphalt'), + ('furni_pura_mdl2*6_desc', 'Any way you like it!'), + ('furni_hcamme_name', 'Tubmaster'), + ('furni_carpet_soft*2_desc', 'Soft Wool Rug'), + ('furni_sound_set_12_name', 'Habbo Sounds 2'), + ('forgottenpw_done', 'If the email you gave during registration was correct, your password will be sent to you now.'), + ('navigator.no_category', 'No Category'), + ('login_whatsHabboCalled', 'What\'s your Habbo called?'), + ('furni_scifidoor*3_name', 'Lightblue Spaceship Door'), + ('game_poker', 'POKER'), + ('roomatic_pws', 'Password for selected'), + ('furni_glass_table*8_name', 'Glass table'), + ('furni_one_way_door*8_desc', 'One at a time!'), + ('furni_bardesk_polyfon*9_desc', 'Perfect for work or play'), + ('nav_venue_bb_lobby_tournament_13_name', 'Competitie Battle Ball 14'), + ('pet.hotwords.sit', 'sit'), + ('furni_arabian_tray3_desc', 'Indulge yourself!'), + ('furni_sound_set_40_desc', 'Dude? Cheese!'), + ('console_compose', 'Compose A Message'), + ('furni_table_plasto_square*3_name', 'Square Dining Table'), + ('furni_rclr_sofa_name', 'Polar Sofa'), + ('poster_2005_name', 'Infobus'), + ('furni_table_plasto_4leg*9_name', 'Occasional Table'), + ('furni_chair_norja*9_desc', 'Sleek and chic for each cheek'), + ('Room', 'Room:'), + ('furni_chair_plasty*2_name', 'Plastic Pod Chair'), + ('furni_romantique_pianochair*3_name', 'Turquoise Romantique Piano Chair'), + ('furni_rare_parasol*2_name', 'Orange Parasol'), + ('loading_project', 'Loading Habbo Hotel...'), + ('poster_505_name', 'The Maple Leaf'), + ('furni_traffic_light*2_desc', 'Chill and wait your turn!'), + ('nav_venue_sw_lobby_amateur_4_name', 'Snow Slingers Lobby'), + ('furni_grunge_shelf_name', 'Grunge Bookshelf'), + ('furni_sofa_polyfon*8_name', 'Yellow Mode Sofa'), + ('furni_doorC_desc', 'In a hurry?'), + ('roomatic_nomatch', 'Sorry. Your passwords don\'t match. Please enter them again.'), + ('furni_soft_sofa_norja*9_name', 'Red Iced Sofa'), + ('nav_venue_tv_studio_general/0_desc', 'Suosikki rules! Musaa, leffoja ja staroja!'), + ('nav_venue_sw_arena_amateur_name', 'Playing amateur game'), + ('interface_icon_events', 'Open the room event browser'), + ('furni_grunge_table_desc', 'Students of the round table!'), + ('furni_wooden_screen*9_name', 'Green Oriental Screen'), + ('NUF_getting_room_hotelview_nav', 'Click to open the Navigator.'), + ('furni_table_silo_med*5_name', 'Pink Area Coffee Table'), + ('furni_divider_silo1*9_name', 'Red Area Small Table'), + ('nav_venue_bb_lobby_amateur_4_name', 'Gevorderden Battle Ball 5'), + ('room_badge_hidden', 'Hidden'), + ('pet.saying.generic.cat.0', 'meow'), + ('furni_marquee*3_desc', 'It\'s both door and a shade!'), + ('pet.saying.generic.cat.1', 'meow...meOW'), + ('nav_venue_cunning_fox_gamehall/4_name', 'Chess'), + ('furni_present_gen_desc', 'What\'s inside?'), + ('pet.saying.generic.cat.2', 'muew..muew'), + ('pet.saying.generic.cat.3', 'Purrrrrrrrrr'), + ('furni_scifidoor*1_desc', 'There out of this world!'), + ('pet.saying.generic.cat.4', 'Purrrrr oow'), + ('furni_fridge_name', 'Pura Refridgerator'), + ('furni_rubberchair*2_name', 'Pink Inflatable Chair'), + ('furni_romantique_chair*4_name', 'Amber Chair'), + ('bb_fieldname_5', 'Barebones Classic'), + ('furni_sofa_silo*7_desc', 'Green Area Sofa'), + ('bb_fieldname_4', 'Gothic Hallway'), + ('furni_prizetrophy6*2_name', 'Champion trophy'), + ('bb_fieldname_3', 'Maze Park'), + ('bb_fieldname_2', 'Coral Beach'), + ('bb_fieldname_1', 'Sky Peak'), + ('furni_safe_silo_pb_name', 'postbank Safe'), + ('furni_solarium_norja*2_desc', 'Rejuvenate your pixels!'), + ('furni_table_plasto_bigsquare*7_desc', 'Hip plastic furniture'), + ('reg_check_age', 'Age'), + ('furni_exe_chair2_desc', 'You\'re fired!'), + ('furni_typingmachine_name', 'Typewriter'), + ('human_carrying', 'Carrying:'), + ('furni_grunge_sign_name', 'Road Sign'), + ('loading', 'Loading...'), + ('furni_bed_polyfon_one*6_name', 'Blue Mode Single Bed'), + ('furni_bed_budget_one*1_desc', 'Prince sized comfort!'), + ('furni_sofa_polyfon_name', 'Two-seater Sofa'), + ('furni_jp_lantern_desc', 'For a mellow Eastern glow'), + ('furni_gothic_stool*2_name', 'Golden Gothic Stool'), + ('roomevent_starttime', 'Started at:'), + ('furni_prize1_desc', 'Gorgeously glittery'), + ('furni_prizetrophy9*1_name', 'Champion trophy'), + ('wallitem_guitar_skull_desc', 'tilulilulaa'), + ('gs_title_bestplayer', 'Best player:'), + ('nav_removefavourites', 'Remove from favourites'), + ('furni_toy1_desc', 'it\'s bouncy-tastic'), + ('alert_shortenPW', 'Your password cannot be longer than 9 characters'), + ('normal_roomlayouts', '<< Back to normal room layouts'), + ('furni_noob_rug*1_name', 'My first Habbo rug'), + ('poster_58_name', 'Red knots poster'), + ('furni_divider_nor2*8_desc', 'Yellow Iced bar desk'), + ('furni_carpet_polar*1_name', 'Pink Faux-Fur Bear Rug'), + ('habboclub_continue_button', 'Buy one month'), + ('furni_divider_silo3_desc', 'Form following function'), + ('furni_sound_set_7_name', 'SFX 5'), + ('furni_soft_sofa_norja*5_desc', 'Pink Iced Sofa'), + ('furni_arabian_rug_desc', 'Green blossom design'), + ('restart_tutorial', 'Restart tutorial'), + ('gs_choose_numteams', 'Choose number of Teams:'), + ('hubu_info_t', 'The big FRANK Infobus'), + ('furni_divider_nor5*7_desc', 'Cool cornering for your crib!'), + ('furni_bed_polyfon*4_name', 'Beige Mode Double Bed'), + ('callhelp_allwillreceive', 'A member of community staff will investigate the situation and take appropriate action. This may include sending you a response with advice on dealing with your issue.'), + ('furni_pura_mdl4*4_name', 'White Pura Module 4'), + ('hubu_odotetaan', 'Waiting for replies from others...'), + ('furni_door_name', 'Telephone Box'), + ('furni_doormat_plain*5_desc', 'Available in a variety of colours'), + ('furni_gothic_carpet_desc', 'The path less travelled'), + ('poster_516_desc', 'Eng-er-land'), + ('furni_gothic_stool*6_desc', 'The dark side of Habbo'), + ('furni_traffic_light*3_desc', 'Chill and wait your turn!'), + ('furni_bartable_armas_desc', 'Bar-Style Table - essential for extra guests'), + ('club_isp_change', 'Change your subscription'), + ('furni_summer_grill*2_name', 'Red Barbeque Grill'), + ('poster_23_desc', 'flap, flap, screech, screech...'), + ('furni_prizetrophy7*3_desc', 'Bronze Habbo trophy'), + ('furni_couch_norja*2_name', 'Black Bench'), + ('nav_venue_cunning_fox_gamehall/0_desc', 'Pit your wits on the battlefield, the board or the baize - choose what to play here'), + ('furni_jp_tatami2_name', 'Large Tatami Mat'), + ('furni_pura_mdl3*3_desc', 'Any way you like it!'), + ('furni_house_name', 'Gingerbread House'), + ('furni_sound_set_54_name', 'Oh Blinging Tree'), + ('furni_table_plasto_4leg*1_name', 'Square Dining Table'), + ('furni_pillow*1_name', 'Pink Fluffy Pillow'), + ('NUF_console_hotelview_tutor', 'Oh! You have a message on your Habbo Console. Let\'s see who it is.'), + ('LoadingRoom', 'Loading room...'), + ('rotate', 'Rotate'), + ('nav_venue_sw_lobby_beginner_6_name', 'Snow Rookies Lobby'), + ('nav_venue_bb_lobby_amateur_1/0_desc', ''), + ('furni_jukebox_ptv*1_desc', 'Jukebox Pacha TV'), + ('nav_venue_star_lounge/0_desc', 'Chat with Sean Kingston here!'), + ('furni_chair_plasty*6_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_tournament_10/0_desc', ''), + ('NUF_mini_use_console_hotelview_tutor', 'Ah! You have a message on your Habbo Console. Let\'s see who it is.'), + ('furni_rare_xmas_screen_name', 'Lappland Greetings'), + ('summer_chair_9_name', 'Red Deck Chair'), + ('club_timefull', 'Sorry, you can only buy up to three months of Habbo Club subscription in advance.'), + ('poster_2002_desc', 'Presidentin muotokuva'), + ('poster_7_name', 'Hammer Cabinet'), + ('furni_gothic_chair*2_name', 'Golden Gothic Chair'), + ('bb_header_powerups', 'Powerups in game:'), + ('credit_redeem_url', 'http://%predefined%//help/19'), + ('furni_divider_silo3*2_name', 'Black Area Gate'), + ('furni_chair_plasto*16_name', 'Chair'), + ('catalog_itsurs', 'Yay! It\'s being delivered now..'), + ('hobba_pickandreply', 'Pick & Reply'), + ('reg_terms', 'Welcome to Habbo Hotel. If you are under 16, please check the Terms and Conditions with your parents/guardian before you agree to them. Get them to explain anything that you don\'t understand.\\rIn order to use the service you have to give valid information about yourself when registering. Please email us if any of your user information changes.\\rAs a user of Habbo Hotel - www.habbohotel.co.uk , you have to behave according to the Habbo Way (hotel rules) and the Terms and Conditions. Click the links below to read about them.\\rNever give your password or email address to anyone. If you do, your Habbo may get stolen.\\rRegistering with the hotel, making your own empty room and chatting is free of charge. For a small fee you can decorate your room with virtual furniture, play games and join the Habbo Club. If you wish to buy, you will need your parent\'s permission to do so.'), + ('furni_summer_pool*1_name', 'Blue Summer Pool'), + ('furni_heartsofa_desc', 'Perfect for snuggling up on'), + ('furni_scifiport*3_name', 'Jade Sci-Fi Port'), + ('furni_glass_chair*6_name', 'Blue Glass Chair'), + ('furni_sound_set_62_name', 'Alhambra Trax 1'), + ('win_voucher', 'Habbo Credit Code'), + ('furni_summer_chair*4_desc', 'White'), + ('furni_bed_polyfon_one_desc', 'Cot of the artistic'), + ('nav_venue_bb_lobby_tournament_5/0_desc', ''), + ('nav_venue_bb_lobby_beginner_3_name', 'Beginners Battle Ball 4'), + ('console_follow_not_friend', 'The user you tried to follow is not your friend anymore.'), + ('delete', 'Delete'), + ('furni_grunge_mattress_desc', 'Beats sleeping on the floor!'), + ('furni_rare_icecream*7_name', 'Chocolate Ice Cream Machine'), + ('sound_machine_alert_no_disks', 'You don\'t have any more discs!'), + ('furni_sofachair_silo_name', 'Armchair'), + ('nav_venue_sw_lobby_expert_0_name', 'Snow Marksmen Lobby'), + ('game_waitop', 'WAITING FOR THE OPPONENT'), + ('Alert_NameAlreadyUse', 'That name is already being used'), + ('furni_queue_tile1*1_desc', 'The power of movement'), + ('poster_18_name', 'Butterfly Cabinet 2'), + ('furni_wooden_screen*6_desc', 'Add an exotic touch to your room'), + ('furni_noob_table*2_name', 'My first Habbo table'), + ('furni_tree1_name', 'Dead tree'), + ('nav_venue_bouncer_room_0_name', 'Battle Ball Competitie Arena'), + ('furni_traffic_light*5_name', 'White Traffic Light'), + ('furni_sw_raven_name', 'Mrs Raven'), + ('cam_shoot.help', 'Shutter Release'), + ('furni_grand_piano*3_desc', 'Make sure you play in key!'), + ('nav_venue_sw_lobby_intermediate_2_name', 'Snow Bombardiers Lobby'), + ('interface_icon_purse', 'Purse, manage your coins'), + ('poll_alert_server_error', 'The poll isn\'t available anymore. Polls are only available at a certain public space for a certain duration.'), + ('sound_machine_confirm_delete_long', 'Are you sure you want to delete the selected song?'), + ('reg_check_confirm', 'Please check that your information is correct, especially your birthdate and Habbo name. You CANNOT change these later. If you want make any changes now, press the back button.'), + ('Alert_CheckBirthday', 'Please check your birthday'), + ('furni_shelves_norja*4_desc', 'For nic naks and tech books'), + ('club_expired_link', 'Click here to join Habbo Club'), + ('poster_520_desc', 'Every colour for everyone'), + ('nav_venue_bb_lobby_intermediate_desc', 'Intermediate battle ball!'), + ('tutorial_restart_button_bubble', 'Remember! Anytime you want to relive the fun click here to restart the tutorial!'), + ('poster_1_name', 'Comedy Poster'), + ('reg_verification_incorrectBirthday', 'Your birthday was incorrect'), + ('furni_glass_stool*6_name', 'Blue Glass Stool'), + ('furni_CFC_100_coin_gold_desc', 'Worth 100 Credits'), + ('buddyremove_list_full', 'Your friends list is full, you can\'t add new friends until you delete some. \\r\\The maximum number of friends you can have, is %mylimit% Habbos. Members of Habbo Club can have up to %clublimit% friends on their list.'), + ('furni_bunny_name', 'Squidgy Bunny'), + ('furni_small_chair_armas_name', 'Stool'), + ('nav_venue_sw_lobby_free_0/0_desc', ''), + ('furni_sofachair_silo*3_name', 'White Armchair'), + ('furni_sound_machine*2_desc', 'Dance to the Habbo Club beat!'), + ('nav_venue_gate_park/0_desc', 'Follow your path...'), + ('NUF_mini_use_console_hotelview_icon', 'Click the icon to open your Habbo Console.'), + ('nav_venue_eric\'s_eaterie/0_desc', 'Join Eric for a bite to eat'), + ('furni_table_silo_med*8_desc', 'Wipe clean and unobtrusive'), + ('poster_503_desc', 'There\'s no holes in this...'), + ('furni_bardeskcorner_polyfon*9_name', 'Red Corner Desk'), + ('furni_val_randomizer_desc', 'Surprise surprise! (Cilla Black not included)'), + ('furni_marquee*2_name', 'Red Dragon Marquee'), + ('furni_table_plasto_round_name', 'Round Dining Table'), + ('furni_summer_chair*3_name', 'Deck Chair'), + ('club_paycoins', 'Buy subscription'), + ('nav_venue_beauty_salon_general/0_desc', 'Join in the fun of Fashion Week! Check the homepage now for details.'), + ('furni_rare_dragonlamp*7_name', 'Sky Dragon Lamp'), + ('nav_venue_bb_lobby_beginner_6/0_desc', ''), + ('roomevent_quit', 'End event'), + ('console_search_habbo_lasthere', 'Last time'), + ('trading_title', 'Safe Trading'), + ('furni_glass_chair*7_desc', 'Habbo Club'), + ('gs_error_game_deleted', 'The Game has been deleted.'), + ('recycler_info_link_url', 'http://%predefined%/help/36'), + ('furni_pillar*6_name', 'Terracotta Pillar'), + ('furni_tile_stella_desc', '10% off the walk of fame!'), + ('transaction_system_sms_win_tmobile', 'T-Mobile SMS'), + ('buddyremove_names_ordered', 'Names Ordered By:'), + ('pet_race_2_010', 'Giggly Go-go'), + ('furni_table_plasto_bigsquare*6_name', 'Square Dining Table'), + ('pet_race_2_011', 'Petty Petsuchos'), + ('summer_chair_6_name', 'Blue Deck Chair'), + ('console_now', 'now:'), + ('gs_skill_changed', 'You have advanced to the next skill level. Your level is now %1!'), + ('roomatic_goyourroom', 'Go to your room'), + ('furni_carpet_soft*4_name', 'Soft Wool Rug'), + ('sound_machine_confirm_close_list', 'Close playlist editor?'), + ('pet.hotwords.good', 'good'), + ('furni_pura_mdl4*7_desc', 'Any way you like it!'), + ('furni_carpet_soft*1_name', 'Soft Wool Rug'), + ('furni_sound_set_22_desc', 'With a hamper full of sounds, not sarnies'), + ('nav_venue_sw_lobby_tournament_7_name', 'Tournament Lobby'), + ('furni_divider_nor3*6_desc', 'Blue Iced gate'), + ('furni_carpet_standard*3_name', 'Floor Rug'), + ('people', 'People'), + ('pet_race_2_007', 'Pretty Pui Pui'), + ('pet_race_2_008', 'Indifferent'), + ('pet_race_2_009', 'Swampy Siamese'), + ('furni_wcandle_name', 'White Candle'), + ('furni_sporttrack1*1_desc', 'null'), + ('furni_solarium_norja*1_name', 'Black Solarium'), + ('NUF_playing_games_gamecategories_tutor', 'Click the Beginner category to open it wide open. Like a melon!'), + ('pet_race_2_003', 'Silly Sobek'), + ('pet_race_2_004', 'Dirty Dundee'), + ('pet_race_2_005', 'Galled Gator'), + ('int_credits', 'Credits'), + ('furni_gothrailing_name', 'Gothic Railing'), + ('furni_sporttrack2*2_desc', 'null'), + ('pet_race_2_006', 'Confused Croc'), + ('furni_shelves_polyfon_name', 'Bookcase'), + ('pet_race_2_000', 'Endangered Albino'), + ('pet_race_2_001', 'Krazy Krokodilos'), + ('pet_race_2_002', 'Nile Dile'), + ('furni_divider_nor2*2_desc', 'Black Iced bar desk'), + ('log_problem_text', 'Oops.. Cannot connect to Habbo Hotel'), + ('furni_divider_nor2*5_desc', 'Pink Iced bar desk'), + ('nav_venue_sw_lobby_amateur_6/0_desc', 'Astetta rankempaa lumisotaa.'), + ('furni_rare_fountain_desc', 'For our feathered friends'), + ('furni_glass_sofa*5_name', 'Glass sofa'), + ('poster_33_desc', 'We can\'t bear to lose them'), + ('nav_venue_bb_lobby_tournament_14/0_desc', ''), + ('furni_summer_chair*6_name', 'Deck Chair'), + ('furni_hcsohva_desc', 'For royal bottoms...'), + ('furni_bed_budget*4_desc', 'King sized comfort!'), + ('furni_christmas_poop_desc', 'Bob?s magical fertilizer'), + ('furni_pura_mdl5*7_name', 'Green Pura Module 5'), + ('furni_barrier*1_desc', 'No escape this way!'), + ('nav_venue_bb_lobby_amateur_8/0_desc', ''), + ('furni_divider_arm2_desc', 'I wooden go there'), + ('furni_chair_plasty*11_desc', 'Hip plastic furniture'), + ('furni_small_table_armas_desc', 'Practical and beautiful'), + ('nav_venue_theatredrome_xmas_name', 'Theatredrome Xmas'), + ('poster_62_name', 'Save The Panda'), + ('reg_verification_currentPassword', 'Current password:'), + ('game_poker_change', 'Choose cards to change'), + ('NUF_getting_items_hotelview_nav', 'Click here to open the Navigator'), + ('furni_chair_basic*9_name', 'Red Pura Egg Chair'), + ('friend_request_failed', 'Failed!'), + ('furni_noob_chair*4_desc', 'Lightweight, practical, with light blue stripes'), + ('furni_table_silo_small*9_desc', 'Red Area Occasional Table'), + ('nav_hotelview', 'Hotel view'), + ('furni_toy1*3_desc', 'it\'s bouncy-tastic'), + ('furni_divider_nor3*2_name', 'Black Iced gate'), + ('furni_chair_silo*6_name', 'Blue Silo Dining Chair'), + ('update_password_suggest', 'Habbo Hotel security supervisor requests you to update your password'), + ('nav_venue_orient_name', 'Club Orient'), + ('Alert_NameTooLong', 'Sorry, that username is too long!'), + ('furni_sound_set_37_name', 'Sound set 37'), + ('furni_barchair_silo*7_desc', 'Practical and convenient'), + ('wallitem_wallmirror_name', 'Wallmirror'), + ('furni_chair_plasty*8_name', 'Plastic Pod Chair'), + ('sound_machine_confirm_close_list_long', 'Are you sure you want to exit playlist editor without saving?'), + ('furni_hc_frplc_name', 'Heavy Duty Fireplace'), + ('dance4', 'The Rollie'), + ('dance3', 'Duck Funk'), + ('furni_glass_stool*9_name', 'Glass stool'), + ('furni_sound_set_55_desc', 'Can you fill me in?'), + ('furni_carpet_standard*7_desc', 'Available in a variety of colours'), + ('poster_4_name', 'Bear Plaque'), + ('cam_zoom_out.help', 'Zoom Out'), + ('furni_sofa_polyfon*2_name', 'Black Mode Sofa'), + ('furni_prizetrophy2*1_name', 'Duck trophy'), + ('furni_scifirocket*3_desc', 'Caution! Unknown Location!'), + ('NUF_getting_items', 'Getting items'), + ('furni_val_teddy*1_desc', 'The grey bear of affection'), + ('furni_sofachair_polyfon*7_name', 'Green Mode Armchair'), + ('club_habbo.bottombar.link.member', '%days% days'), + ('habboclub_confirm_header', 'Subscription costs %price% credits'), + ('furni_rare_daffodil_rug_desc', 'A little bit of outdoors indoors..'), + ('poster_15_name', 'Himalayas Poster'), + ('furni_smooth_table_polyfon_desc', 'For larger gatherings'), + ('dance2', 'Pogo Mogo'), + ('furni_wooden_screen*3_name', 'Aqua Oriental Screen'), + ('furni_plant_cruddy_desc', 'Goodbye Bert...'), + ('dance1', 'Hab-Hop'), + ('furni_gothic_chair*6_desc', 'The dark side of Habbo'), + ('furni_table_plasto_square*9_name', 'Square Dining Table'), + ('nav_venue_bb_lobby_beginner_14/0_desc', ''), + ('furni_club_sofa_desc', 'Club sofa'), + ('roomevent_default_name', 'Event name..'), + ('game_poker_ok', 'Change cards'), + ('nav_venue_picnic_dudesons/0_desc', 'Duudsoneiden sponssaama oma Ranchi - www.extremeduudsonit.com'), + ('nav_venue_hallway/0_desc', 'Beware the ghosts and ghouls!'), + ('nav_venue_park/0_desc', 'Go for a stroll outdoors'), + ('console_fr_declined_count', 'Amount to be declined'), + ('furni_tree4_name', 'Christmas Tree 2'), + ('NUF_console_read_link', 'Click the link to open the message.'), + ('win_figurecreator', 'Habbo Details'), + ('furni_table_plasto_square*14_name', 'Occasional Table'), + ('furni_soft_sofachair_norja*6_desc', 'Blue Iced Sofachair'), + ('nav_venue_bb_lobby_beginner_0_name', 'Beginner'), + ('Alert_LogoNameAlreadyUse', 'That name is already being used'), + ('poster_25_name', 'Snowman Poster'), + ('furni_pura_mdl2*2_name', 'Pink Pura Module 2'), + ('furni_chair_plasto*13_name', 'Chair'), + ('furni_ticket_name', 'Small Ticket Bundle'), + ('furni_hc_lmpst_name', 'Victorian Street Light'), + ('furni_scifiport*7_desc', 'Energy beams. No trespassers!'), + ('jukebox_load_trax', 'Load Trax'), + ('furni_val_teddy*4_desc', 'The brown bear of naughtiness'), + ('reg_birthdayformat_update', 'Birthday (dd.mm.yyyy)'), + ('nav_venue_the_chromide_club_name', 'The Chromide Club'), + ('roomevent_not_available', 'Sorry, no events available'), + ('nav_venue_sw_lobby_beginner_0/0_desc', ''), + ('summer_chair_3_name', 'Black Deck Chair'), + ('int_newrequests', 'Friend Request(s)'), + ('console_profile_helptext', 'The Habbo Profile is a snapshot of your interests and hobbies - simply tick the things you like.'), + ('nav_roomnfo_hd_fav', 'Favourite Rooms'), + ('furni_chair_plasto*3_desc', 'Hip plastic furniture'), + ('furni_chair_basic*6_name', 'Blue Pura Egg Chair'), + ('number_4', '4'), + ('number_3', '3'), + ('number_2', '2'), + ('room_open_package', 'Open The Present'), + ('furni_grunge_barrel_name', 'Flaming Barrel'), + ('wallitem_photo_desc', 'Photo from Habbo'), + ('poster_30_desc', 'Pucker up'), + ('furni_glass_table*9_desc', 'Translucent beauty'), + ('nav_venue_sw_lobby_beginner_3_name', 'Snow Rookies Lobby'), + ('Alert_YouAreBanned', 'You have been banned for breaking the Habbo Way. This is why (if no ban reason is shown use the Contact Us form):'), + ('furni_gothic_sofa*2_name', 'Golden Gothic Sofa'), + ('NUF_getting_items_hotelview_tutor', 'Let us find out how to purchase items from the Hotel Catalogue. The Catalogue contains loads of cool stuff to decorate your Habbo room with. To begin open the Navigator.'), + ('furni_table_norja_med*2_desc', 'For larger gatherings'), + ('furni_sofa_silo*3_name', 'White Two-Seater Sofa'), + ('furni_pura_mdl5*5_desc', ''), + ('nav_venue_sw_lobby_beginner_desc', 'Yes, take a load of snowballs and hit the enemy Teams. Easy, isn\'t it?'), + ('furni_romantique_smalltabl*5_name', 'Onyx Tray Table'), + ('furni_divider_nor4_desc', 'Habbos, roll out!'), + ('furni_shelves_norja*7_desc', 'For nic naks and cookery books'), + ('nav_venue_sw_lobby_intermediate_4/0_desc', 'Lumisota sen kuin vain kovenee.'), + ('gs_text_spectate', 'You can watch this game'), + ('recycler_info_link', 'More information about Furni Recycler'), + ('furni_sofachair_polyfon_name', 'Armchair'), + ('club_intro_text', 'Members of Habbo Club get LOTS of cool stuff!\\rWith Habbo Club you get cool dances, access to Club Mammoth and The Blue Dragon Tavern, and a 500 limit on your friends list!'), + ('furni_divider_nor1*7_desc', 'The missing piece'), + ('url_helppledge', 'http://%predefined%//help/22'), + ('jukebox_song_name', '%name%'), + ('game_bs_won', 'WON!'), + ('furni_soft_jaggara_norja_name', 'Iced Sofachair'), + ('furni_rare_beehive_bulb_desc', 'A honey-hued glow'), + ('furni_chair_norja*8_name', 'Yellow Chair'), + ('poster_83_desc', 'Pöllö huhuilee, huhuu!'), + ('floodblocking', 'You are typing too fast - don\'t flood the room.'), + ('furni_CF_5_coin_silver_desc', 'Worth 5 Credits'), + ('sound_machine_confirm_clear', 'Clear the song?'), + ('furni_carpet_standard*6_name', 'Floor Rug'), + ('furni_waterbowl*2_desc', 'Aqua unlimited'), + ('sw_link_tournament_highScores_url', 'http://%predefined%//groups/56553/id'), + ('NUF_meeting_people_room_tutor', 'This is a Public Room. Your Habbo is in the doorway beneath the orange arrow. Click on another user to find out more about them.'), + ('furni_bottle_name', 'Empty Spinning Bottle'), + ('poster_512_name', 'The Irish flag'), + ('club_info_url', 'http://%predefined%//credits/habboclub'), + ('nav_venue_tv_studio_nike/0_desc', ''), + ('furni_couch_norja*6_desc', 'Two can perch comfortably'), + ('furni_pura_mdl5*8_desc', 'Any way you like it!'), + ('furni_carpet_valentine_desc', 'For making an appearance'), + ('furni_floortile_desc', 'In Variety of Colours'), + ('furni_pillar*9_name', 'Rock Pillar'), + ('furni_table_plasto_bigsquare*3_name', 'Square Dining Table'), + ('furni_bardeskcorner_polyfon*12_name', 'Corner Cabinet/Desk'), + ('furni_divider_nor1*4_desc', 'The missing piece'), + ('furni_chair_plasty*5_name', 'Plastic Pod Chair'), + ('furni_scifirocket*0_desc', 'See in 2007 with a bang!'), + ('poster_32_name', 'Siva Poster'), + ('club_button_2_period', 'Buy 3 >>>'), + ('furni_sound_set_58_desc', 'Sh-shake it!'), + ('furni_china_shelve_desc', 'To hold the mind\'s treasures'), + ('furni_scifidoor*7_desc', 'There out of this world!'), + ('furni_chair_silo*9_name', 'Red Silo Dining Chair'), + ('furni_gothic_stool*5_name', 'Green Gothic Stool'), + ('friend_request_massoperation_cancel', 'Back to request list.'), + ('furni_queue_tile1*0_name', 'White Quest Roller'), + ('furni_divider_nor3*5_name', 'Pink Iced gate'), + ('furni_sound_machine*5_desc', 'Heard the Habbo Bands new singles?'), + ('furni_glass_table*6_desc', 'Translucent beauty'), + ('furni_soft_sofachair_norja*9_desc', 'Red Iced Sofachair'), + ('furni_plant_mazegate_desc', 'Did we make it?'), + ('tickets_info_1', 'With 2 tickets you can play the following Games:\\r10 BattleBall:Rebound!\\r10 SnowStorm\\r20 Wobble Squabble or\\r20 Lido Diving'), + ('furni_barchair_silo*4_desc', 'Practical and convenient'), + ('furni_CF_10_coin_gold_name', 'Gold Coin'), + ('tickets_info_2', 'With 20 tickets you can play the following Games:\\r10 BattleBall:Rebound!\\r10 SnowStorm\\r20 Wobble Squabble or\\r20 Lido Diving'), + ('furni_sound_set_15_desc', 'Unadulterated essentials'), + ('handitem1', 'Tea'), + ('furni_romantique_divan*3_desc', 'null'), + ('furni_glass_sofa*8_name', 'Glass sofa'), + ('epsnotify_1001', 'The hotel is full at the moment. Please try again in a few minutes.'), + ('furni_table_silo_med*2_name', 'Black Coffee Table'), + ('furni_sleepingbag*7_name', 'Orange Sleeping Bag'), + ('furni_pillow*5_desc', 'Puffy, soft and huge'), + ('furni_bed_budget*1_desc', 'King sized comfort!'), + ('furni_bed_trad_one_name', 'Plain Single Bed'), + ('catalog_giftfor', 'This is a gift for:'), + ('furni_theatre_seat_name', 'Deluxe Theatre Chair'), + ('furni_romantique_divider*3_name', 'Turquoise Screen'), + ('furni_shelves_silo_desc', 'For nic naks and art deco books'), + ('handitem9', 'Decaff'), + ('handitem8', 'Regular'), + ('handitem7', 'Water'), + ('furni_glass_table_name', 'Glass table'), + ('console_selection_invert', 'Invert selection'), + ('handitem6', 'Blackcurrant'), + ('furni_hc_machine_desc', 'By and for mad inventors'), + ('handitem5', 'Milk'), + ('handitem4', 'Ice-cream'), + ('poster_40_desc', 'The one and only. Adore her!'), + ('nav_venue_sw_lobby_tournament_9/0_desc', ''), + ('handitem3', 'Carrot'), + ('handitem2', 'Juice'), + ('furni_cn_sofa_name', 'Chinese Sofa'), + ('nav_venue_bb_lobby_expert_4/0_desc', ''), + ('poster_502_name', 'The Stars and Stripes'), + ('furni_md_rug_name', 'Bubble Juice Floor'), + ('furni_table_plasto_bigsquare_name', 'Square Dining Table'), + ('furni_bed_polyfon*8_desc', 'Yellow Mode Double Bed'), + ('nav_venue_sw_lobby_amateur_7_name', 'Snow Slingers Lobby'), + ('furni_birdie_desc', 'Cheep (!) and cheerful'), + ('poster_12_name', 'Lapland Poster'), + ('club_desc_1_period', '1 Month (31 days) = 25 Credits'), + ('hobba_emergency_help', 'Call For Emergency Help:'), + ('reg_age_check_note', 'Enter your birthday. You will need your birthday information when changing your password or email.'), + ('furni_table_plasto_square*6_name', 'Square Dining Table'), + ('trade', 'Trade'), + ('furni_romantique_smalltabl*3_desc', 'Every tray needs a table...'), + ('reg_back', 'Back'), + ('furni_tree7_name', 'Snowy Christmas Tree'), + ('recycler_trader_open_alert', 'Recycling cannot begin while you are trading. Please close the safe trading box before recycling.'), + ('furni_rare_dragonlamp*8_desc', 'Scary and scorching!'), + ('furni_gothic_chair*3_desc', 'The head of the table'), + ('Alert_YourNameIstooShort', 'Habbo names must be at least 3 characters long.'), + ('furni_bed_budgetb_desc', 'Sweet dreams for two'), + ('furni_shelves_basic_name', 'Pura Shelves'), + ('console_messagemode_helptext', 'You can send an instant message to your Habbo Friends.'), + ('nav_venue_cunning_fox_gamehall/5_desc', 'Get a hand like a foot? Keep a straight face and bluff it out'), + ('furni_table_polyfon_small_name', 'Small Coffee Table'), + ('move_furniture', 'Move Furni'), + ('nav_searchbutton', 'Search'), + ('furni_habboween_grass_desc', 'Autumnal chills with each rotation!'), + ('furni_pura_mdl5*2_desc', 'Any way you like it!'), + ('NUF_meeting_people_user_tutor', 'The user you clicked on is shown in the corner of your screen. The buttons beneath the Habbo let you visit their Habbo Home, send them a Friend Request or ignore them if they look or act like a moron.'), + ('poster_55_name', 'Tree of Time'), + ('furni_soft_sofachair_norja*5_name', 'Pink Iced Sofachair'), + ('furni_sound_set_48_name', 'Club 3'), + ('furni_table_plasto_4leg_desc', 'Hip plastic furniture'), + ('furni_pura_mdl4*1_name', 'Aqua Pura Module 4'), + ('login_forgottenPassword_url', 'https://www.habbo.co.uk/account/password/forgot'), + ('nav_venue_floatinggarden/0_desc', 'Peace, tranquility and still waters'), + ('furni_sound_set_36_desc', 'For adult minded'), + ('poster_43_desc', 'Shake, rattle and roll'), + ('furni_gothic_stool*3_desc', 'The dark side of Habbo'), + ('room_alert_furni_limit', 'This room has the maximum amount of Furni.'), + ('furni_table_plasto_square*15_name', 'Occasional Table'), + ('furni_rare_hammock_name', 'Hammock'), + ('sound_machine_confirm_burn_long', 'Are you sure you want to burn this song to disc? Burning costs one credit.'), + ('furni_rclr_chair_desc', 'Watch out for coconuts'), + ('furni_chair_basic*3_desc', 'It\'s a cracking design!'), + ('furni_doormat_plain*6_name', 'Doormat'), + ('furni_sofachair_polyfon*9_name', 'Red Armchair'), + ('furni_jp_tray6_name', 'jp_tray6'), + ('furni_habbocake_name', 'Cake'), + ('poster_501_name', 'Jolly Roger'), + ('nav_goingprivate', 'Going to Guest room'), + ('furni_bed_budget_one*9_name', 'Red Pura Bed'), + ('alert_no_category', 'Your room has no category. Select one from the list.'), + ('nav_venue_theatredrome_easter/0_desc', ''), + ('gs_button_buytickets', 'Buy Tickets'), + ('nav_venue_bouncer_room_4_name', 'Experts Battle Ball Arena'), + ('close', 'Close'), + ('furni_carpet_standard*9_desc', 'Available in a variety of colours'), + ('furni_prizetrophy4*1_desc', 'Glittery gold'), + ('help_pointer_1', 'http://www.habbo.co.uk/help/'), + ('help_pointer_3', 'emergency_help'), + ('furni_rclr_lamp_name', 'Moon Lamp'), + ('help_pointer_2', 'http://www.habbohotel.co.uk/iot/go?lang=en&country=uk'), + ('furni_exe_sofa_desc', 'Relaxing leather comfort'), + ('furni_divider_silo1*4_name', 'Beige Area Corner Shelf'), + ('poster_2001_name', 'SeinNightitititititdiskotappaja'), + ('interface_icon_tv_close', 'Leave the Room and close the Habbovision mode.'), + ('furni_sound_machine*7_name', 'Red Traxmachine'), + ('game_bs_hit', 'A Hit!:'), + ('furni_rare_fan*2_desc', 'It\'ll blow you away!'), + ('win_place', 'Note!'), + ('nav_venue_bb_lobby_beginner_11_name', 'Beginners Battle Ball 12'), + ('furni_pillow*7_desc', 'Bonnie\'s pillow of choice!'), + ('furni_table_silo_small*8_desc', 'For those random moments'), + ('furni_divider_nor4*5_desc', 'Habbos, roll out!'), + ('hubu_vastaa', 'Answer the question'), + ('furni_pura_mdl4*8_name', 'yellow pura module 4'), + ('furni_glass_chair*9_name', 'Glass chair'), + ('furni_chair_silo*7_desc', 'Green Silo Dining Chair'), + ('furni_jp_drawer_desc', 'Spiritual home for odds and ends'), + ('tutorial_select_another_topic', 'Select another topic'), + ('furni_noob_lamp*4_desc', 'Get the light right where you want it (light blue)'), + ('nav_venue_beauty_salon_general_name', 'Beauty salon'), + ('furni_sofachair_polyfon*2_name', 'Black Mode Armchair'), + ('console_report_header', 'Report Abusive Message'), + ('club_buy_url', 'http://%predefined%//credits/habboclub'), + ('furni_prizetrophy*2_name', 'Classic trophy'), + ('furni_rare_icecream*4_name', 'Strawberry Ice Cream Machine'), + ('furni_barchair_silo*5_desc', 'Practical and convenient'), + ('furni_divider_nor2*4_desc', 'No way through'), + ('furni_xmas_cstl_gate_name', 'Ice Castle Gate'), + ('furni_noob_stool*5_desc', 'Unfold me and take the weight off (pink)'), + ('furni_bed_budgetb_one_name', 'Plain Single Bed'), + ('friend_request_accept_all', 'Accept all requests.'), + ('furni_val_choco_name', 'Heart Shaped Box'), + ('poster_514_desc', 'Be proud to be in the Union!'), + ('furni_carpet_legocourt_desc', 'Line up your slam dunk'), + ('furni_sofa_silo_name', 'Two-Seater Sofa'), + ('furni_chair_plasto*8_desc', 'Hip plastic furniture'), + ('furni_tree5_name', 'Christmas Tree 3'), + ('nav_venue_habbo_cinema/0_desc', 'Now showing: Kick Warz II - The revenge of Donnie Santini!'), + ('furni_couch_norja*4_name', 'Urban Iced Bench'), + ('poster_52_desc', 'whack that ball!'), + ('furni_sound_set_45_desc', 'The Bass? is the rhythm!'), + ('nav_venue_sun_terrace/0_name', 'Sun Terrace'), + ('queue_tile_limit', 'You can\'t fit more Habbo Rollers in this room!'), + ('BuddyRequesta', 'Friend Request(s)'), + ('transaction_system_sms_rl', 'Elisa'), + ('furni_prizetrophy4_desc', 'Palkinto'), + ('furni_hcamme_desc', 'Time for a soak'), + ('furni_scifirocket*2_name', 'Earth Smoke Machine'), + ('furni_divider_nor5*2_desc', 'Cool cornering for your crib y0!'), + ('forgottenpw', 'Forgotten your password?'), + ('furni_rclr_sofa_desc', 'Snuggle up together'), + ('furni_val_cauldron_desc', 'Cast a loving spell!'), + ('poster_3_name', 'Fish Plaque'), + ('furni_one_way_door*8_name', 'Yellow One Way Gate'), + ('furni_divider_nor3*8_desc', 'Yellow Iced gate'), + ('sw_link_highScores_url', 'http://%predefined%//groups/56553/id'), + ('furni_carpet_standard*2_desc', 'Available in a variety of colours'), + ('nav_venue_sport/0_name', 'The Power Gym'), + ('furni_scifidoor*3_desc', 'There out of this world!'), + ('furni_pillar*7_desc', 'Recovered from Habblantis'), + ('furni_arabian_tray3_name', 'Sweets Tray'), + ('furni_chair_plasto_name', 'Chair'), + ('nav_venue_pizza_name', 'Slice of Life'), + ('url_privacypledge', 'http://%predefined%//help/69'), + ('furni_one_way_door*3_desc', 'One way! The HC way!'), + ('catalog_purchase_not_allowed_hc', 'In order to buy this item you must be a Habbo Club member!'), + ('furni_pura_mdl3*4_name', 'White Pura Module 3'), + ('room_confirmDelete', 'Confirm'), + ('BuddyPrivateRoom', 'In A Guest Room'), + ('furni_marquee*7_desc', 'It\'s both door and a shade!'), + ('furni_bath_desc', 'The ultimate in pampering'), + ('furni_soft_sofa_norja*3_desc', 'Pristine white, keep it clean!'), + ('game_BattleShip', 'Battleships'), + ('furni_sound_set_11_desc', 'Music you can really sink your teeth into'), + ('furni_glass_chair*2_name', 'Glass chair'), + ('furni_sofa_silo*5_desc', 'Pink Area Sofa'), + ('furni_pura_mdl2*7_name', 'Green Pura Module 2'), + ('cam_film.help', 'Number Of Photos Left'), + ('nav_venue_bb_lobby_tournament_17/0_desc', ''), + ('roomatic_hway', 'Hotel guests are expected to follow the Habbo Way even if word filtering is switched off.'), + ('modify', 'Modify'), + ('furni_sofachair_silo*8_name', 'Yellow Armchair'), + ('alert_reg_blocked', 'A person under 11 years of age has tried to register from this machine recently.\\rRegistration is not possible for a while.'), + ('furni_sofa_polyfon*8_desc', 'Yellow Mode Sofa'), + ('furni_wooden_screen*9_desc', 'Add an exotic touch to your room'), + ('hobba_message_from', 'Your call has been responded to as follows:'), + ('win_help', 'Habbo Help'), + ('pet.saying.sniff.dog.1', 'snuh...SNUUUUUH'), + ('pet.saying.sniff.dog.0', 'snuuh..snuuh'), + ('sw_user_skill', 'Snow Storm Skill Level: \\x \\r (\\y points)'), + ('furni_rom_lamp_desc', 'Light up your life'), + ('console_profile_create', 'Create your Habbo Profile.'), + ('furni_CF_50_goldbar_desc', 'Worth 50 Credits'), + ('furni_romantique_chair*4_desc', 'What does this button do?'), + ('reg_use_allowed_chars', 'Use only these characters:'), + ('furni_bar_chair_armas_name', 'Barrel Stool'), + ('pet.saying.sniff.dog.2', '*sighs*'), + ('furni_sound_set_64_name', 'Alhambra Trax 3'), + ('furni_pillar*3_name', 'blue pillar'), + ('furni_glass_chair*4_desc', 'Translucent beauty'), + ('furni_pizza_desc', 'You dirty Habbo'), + ('opening_hours_text_shutdown', 'The Hotel will shut down in %d% minutes. To avoid confusion, purchasing of furniture, Habbo Club and game tickets will be disabled during that time, as well as playing Games and furniture trading. Thank you for visiting and welcome back tomorrow!'), + ('nav_venue_bb_lobby_tournament_10_name', 'Competitie Battle Ball 11'), + ('poster_521_desc', 'Ordem e progresso'), + ('furni_sound_set_52_desc', 'Under the mistletoe!'), + ('furni_shelves_norja*3_name', 'White Iced Bookcase'), + ('furni_scifiport*5_desc', 'Recovered from Roswell'), + ('help_emergency_writeyour', 'Give details of your emergency here:'), + ('furni_table_norja_med*6_name', 'Large Coffee Table Blue'), + ('nav_venue_bb_lobby_expert_3_name', 'Experts Battle Ball 4'), + ('photo_legend', 'Caption'), + ('furni_sofachair_silo_desc', 'Large, but worth it'), + ('console_youdonthavebuddies', 'You have no Friends on your list.\\rYou can send Friend Requests using\\rthe \'search\' button.'), + ('furni_table_plasto_4leg*6_name', 'Occasional table Table'), + ('furni_scifidoor*1_name', 'Pink Spaceship Door'), + ('furni_tile_brown_desc', '10% off downtown promenades & piazzas!'), + ('NUF_getting_room_go_button', 'Click here to go to your just created room!'), + ('dimmer_turn_on', 'Turn ON'), + ('furni_sofa_polyfon_desc', 'Comfort for stylish couples'), + ('furni_sound_set_50_name', 'Club 5'), + ('furni_doorB_name', 'Wardrobe'), + ('reg_agree1', 'Yes, my parents and I agree to the above terms. I am allowed to use Habbo Hotel.'), + ('furni_chair_silo*3_name', 'White Dining Chair'), + ('furni_CF_1_coin_bronze_desc', 'Worth 1 Credits'), + ('reg_agree2', 'Yes, I have read the Habbo Hotel Terms of Service and I accept them'), + ('you_have_pending_cfh', 'Your previous call for help has not been answered yet. To make a new one you must delete the old message.'), + ('furni_table_plasto_bigsquare*7_name', 'Square Dining Table'), + ('console_accept', 'Accept'), + ('furni_lamp_basic_name', 'Pura Lamp'), + ('console_friend_request_error', 'There was an error with friend requests'), + ('poster_11_desc', 'I obey the Habbo way!'), + ('furni_bardeskcorner_polyfon*6_name', 'Blue Mode Bardesk Corner'), + ('furni_plant_sunflower_name', 'Cut Sunflower'), + ('furni_traffic_light*3_name', 'Purple Traffic Light'), + ('furni_bed_polyfon_one*8_name', 'Yellow Mode Single Bed'), + ('furni_carpet_polar*1_desc', 'Cute'), + ('furni_noob_rug*1_desc', 'Nice and neat sisal rug with orange edging'), + ('furni_exe_bardesk_desc', 'Divide the profits!'), + ('furni_romantique_divider*4_desc', 'Keeping things separated'), + ('pet_status_dialog', '%name%'), + ('furni_jp_lantern_name', 'Japanese Lantern'), + ('furni_chair_norja*2_name', 'Black Chair'), + ('furni_jp_irori_desc', 'Traditional heating and eating'), + ('furni_bed_budget*5_name', 'Beige Pura Double Bed'), + ('furni_scifidoor*8_name', 'Purple Spaceship Door'), + ('nav_venue_sw_lobby_free_5_name', 'Free Game Lobby'), + ('wallitem_jp_sheet2_desc', 'jp_sheet2'), + ('furni_glass_sofa*9_desc', 'Translucent beauty'), + ('furni_divider_nor5*7_name', 'Rural Iced Angle'), + ('sound_machine_open_editor', 'Trax Editor'), + ('furni_jp_tatami2_desc', 'Shoes off please'), + ('furni_sound_set_16_name', 'Hip Hop Beats 3'), + ('console_recipients', 'Recipient(s)'), + ('catalog_page', 'page'), + ('poster_23_name', 'Bat Poster'), + ('furni_table_plasto_round*4_name', 'Square Dining Table'), + ('furni_rubberchair*2_desc', 'Soft and tearproof!'), + ('nav_venue_bb_lobby_beginner_16/0_desc', ''), + ('poster_1005_name', 'Johnny Squabble'), + ('furni_silo_studydesk_name', 'Area Quest Desk'), + ('furni_table_plasto_4leg*1_desc', 'Hip plastic furniture'), + ('nav_venue_basement_lobby/0_desc', 'For low level hanging'), + ('furni_rare_parasol*3_desc', 'Block those rays!'), + ('furni_arabian_wndw_name', 'Arabian Window Frame'), + ('Alert_ConnectionFailure', 'Disconnected'), + ('furni_house_desc', 'Good enough to eat'), + ('console_confirm_selected', 'Confirm the selections. Below are the amount of friend requests that will be accepted and declined. If you want, you can still modify the selections.'), + ('furni_table_plasto_4leg*4_name', 'Square Dining Table'), + ('furni_sound_set_57_name', 'RnB Grooves 3'), + ('hubu_h3', 'Huumetietobussi'), + ('furni_table_plasto_bigsquare*2_name', 'Square Dining Table'), + ('hubu_h4', 'Anna palautetta'), + ('hubu_h1', 'Puhelintuki'), + ('roomatic_bobbafilter', 'Bobba filter (filters out bad language)'), + ('hubu_h2', 'Harrastamaan!'), + ('furni_tv_luxus_desc', 'Bang up to date'), + ('hubu_h5', 'Huumetietoa'), + ('NUF_console_hotelview_icon', 'Click the button to open your Habbo Console.'), + ('modtool_banlength', 'Ban Length:'), + ('NUF_visiting_rooms_roomlist_tutor', 'Just pick any room you like. Click on the room to see a description of the room. ROOM!'), + ('reg_verification_newPassword', 'New password:'), + ('furni_wall_china_name', 'Dragon Screen'), + ('nav_venue_hallway_ii/0_desc', 'Beware witches and warlocks'), + ('jukebox_disk_add', 'Add Disc'), + ('furni_rare_xmas_screen_desc', 'Ho Ho Ho!'), + ('furni_table_plasto_round*2_name', 'Round Dining Table'), + ('furni_rubberchair*7_name', 'White Inflatable Chair'), + ('nav_favourites_helptext', 'These are your favourite rooms. Nice selection you have here...'), + ('nav_venue_sw_lobby_beginner_4_name', 'Snow Rookies Lobby'), + ('furni_gothic_chair*2_desc', 'The prince of Habbo'), + ('cam_save_nofilm', 'You have run out of film.\\rGet a roll (5 photos) from\\rthe Catalogue for 6 Credits.'), + ('furni_sofa_polyfon*6_desc', 'Blue Mode Sofa'), + ('furni_divider_silo3*2_desc', 'Form following function'), + ('furni_rare_beehive_bulb*1_name', 'Red Amber Lamp'), + ('furni_plant_small_cactus_desc', 'Even less watering than the real world'), + ('furni_triplecandle_name', 'Electric Candles'), + ('help_option_1', 'Playing Habbo'), + ('help_option_3', 'A serious issue (harassment, sexual behaviour)'), + ('furni_present_gen5_name', 'Gift'), + ('help_option_2', 'My Habbo account.'), + ('furni_shelves_norja*8_name', 'Yellow Bookcase'), + ('furni_legotrophy_desc', 'For the winning team'), + ('furni_rare_icecream*2_name', 'Pistachio Ice Cream Machine'), + ('furni_summer_pool*1_desc', 'Fancy a dip?'), + ('nav_venue_theatredrome_deli/0_desc', 'Join in all the fun of the fair!'), + ('game_newgame', 'New game'), + ('help_tour', 'Guided Tour'), + ('purse_vouchers_error3_url', 'http://%predefined%//credits'), + ('furni_marquee*5_name', 'Graphite Marquee'), + ('forgottenpw_explanation', 'If you have forgotten your password and you gave your correct email address when you registered, we can send your password to you.'), + ('furni_waterbowl*3_name', 'Yellow Water Bowl'), + ('roomatic_namedisp', 'Do you want your name to be displayed with the room?'), + ('poster_28_name', 'Silver Tinsel Bundle'), + ('Alert_BuyingOK', 'Buying Successful!'), + ('furni_summer_chair*4_name', 'Deck Chair'), + ('nav_venue_welcome_lounge_ii/0_desc', 'New? Lost? Get a warm welcome here from Habbo eXperts.'), + ('bb_title_gameCreation', 'Aloita uusi peli!'), + ('furni_sporttrack1*3_name', 'Sport track straight grass'), + ('furni_romantique_divan*2_name', 'Emerald Chaise-Longue'), + ('furni_divider_silo1*6_name', 'Blue Area Corner Shelf'), + ('NUF_about_hotel_about_tutor', 'Habbo is both a virtual world and an online community.'), + ('url_helpparents', 'http://%predefined%//help/73'), + ('furni_divider_silo3*7_name', 'Green Area Gate'), + ('poster_18_desc', 'Beautiful reproduction butterfly'), + ('furni_traffic_light*5_desc', 'Chill and wait your turn!'), + ('furni_scifirocket*6_desc', 'Too hot to handle!'), + ('pet.saying.angry.cat.0', 'Sssppp!'), + ('furni_bed_armas_one_desc', 'Rustic charm for one'), + ('pet.saying.angry.cat.3', '*hiss*'), + ('pet.saying.angry.cat.1', 'MrrRRRR'), + ('pet.saying.angry.cat.2', 'Tssssss!'), + ('furni_noob_rug*6_name', 'My first Habbo rug'), + ('club_habbo.bottombar.text.member', 'Habbo Club'), + ('furni_divider_silo1_name', 'Corner Shelf'), + ('nav_venue_bb_lobby_beginner_10/0_desc', ''), + ('recycler_info_progress', 'Recycling is currently in progress. The recycling process takes a total of %recyclinghours% hour. You can leave the catalogue and recycling will continue in the background.'), + ('furni_queue_tile1*1_name', 'Pink Habbo Roller'), + ('notickets_header', 'Buy game tickets to play this game'), + ('reg_underage', 'I am under 11 years old'), + ('nav_venue_sw_arena_intermediate_name', 'Playing intermediate game'), + ('furni_table_plasto_square*5_name', 'Square Dining Table'), + ('Alert_YouAreBanned_T', 'A Moderator kicked you out of the room.'), + ('buddyremove_moreoptions', 'More Options >>'), + ('furni_prizetrophy4*3_desc', 'Breathtaking bronze'), + ('furni_chair_silo*2_desc', 'Keep it simple'), + ('club_habbo.bottombar.link.notmember', 'Join!'), + ('poster_1000_name', 'Comedy Poster'), + ('room_badge_button', 'Badge'), + ('furni_soft_sofa_norja*8_desc', 'Yellow Iced Sofa'), + ('wallitem_torch_name', 'Gothic Torch'), + ('furni_scifirocket*7_name', 'Jupiter Smoke Machine'), + ('furni_romantique_tray1_desc', 'For a fast break'), + ('furni_rare_dragonlamp*0_desc', 'George and the...'), + ('furni_nest_desc', 'Night, night'), + ('furni_table_silo_small*2_name', 'Black Occasional Table'), + ('furni_prizetrophy7*2_name', 'Silver Habbo trophy'), + ('furni_sofachair_silo*3_desc', 'Large, but worth it'), + ('furni_divider_nor2*9_name', 'Red Iced bar desk'), + ('club_extend_title', 'Habbo Club membership can be extended VERY easily.'), + ('furni_rare_fan*0_desc', 'As red as Rudolph\'s nose'), + ('club_paybycash_url', '(leave this empty if you don\'t want to have this link displayed)'), + ('poster_57_name', 'Calligraphy poster'), + ('furni_CFC_50_coin_silver_desc', 'Worth 50 Credits'), + ('furni_pillow*5_name', 'Black Leather Pillow'), + ('furni_hc_chr_name', 'Majestic Chair'), + ('nav_venue_sw_arena_free_name', 'Playing free for all game'), + ('furni_active_placeholder_desc', 'This furniture is downloading...'), + ('nav_venue_welcome_lounge_name', 'Welcome Lounge'), + ('furni_soft_sofachair_norja*3_name', 'White Iced Sofachair'), + ('furni_bed_polyfon*3_desc', 'Give yourself space to stretch out'), + ('furni_pura_mdl4*3_name', 'Black Pura Module 4'), + ('furni_pillar*2_desc', 'Ancient and stately'), + ('furni_small_chair_armas_desc', 'Rustic charm at it\'s best'), + ('furni_table_plasto_round_desc', 'Hip plastic furniture'), + ('furni_marquee*2_desc', 'Dragons out and Davids in!'), + ('furni_wooden_screen*7_desc', 'Add an exotic touch to your room'), + ('furni_queue_tile1*8_name', 'Navy Habbo Roller'), + ('furni_arabian_pllw_desc', 'Exotic comfort'), + ('furni_sound_set_1_desc', 'Get the party started!'), + ('furni_gothic_stool*5_desc', 'The dark side of Habbo'), + ('furni_china_table_desc', 'Exotic and classy'), + ('song_disk_trade_info', '%name%'), + ('nav_venue_sw_lobby_beginner_9_name', 'Snow Rookies Lobby'), + ('console_modify', 'Modify'), + ('poster_36_desc', 'The Hotels girlband. Dream on!'), + ('furni_rare_dragonlamp*7_desc', 'Scary and scorching!'), + ('furni_sound_set_63_desc', 'Desert hits by the oasis!'), + ('nav_venue_cafe_gold_name', 'The Oasis'), + ('nav_venue_sw_lobby_tournament_3/0_desc', ''), + ('nav_venue_habbo_cinema_name', 'Habbo Cinema'), + ('furni_chair_plasty*4_name', 'Plastic Pod Chair'), + ('nav_venue_welcome_lounge_iii/0_desc', 'New? Lost? Get a warm welcome here from Habbo eXperts.'), + ('furni_carpet_soft*1_desc', 'Soft Wool Rug'), + ('furni_sporttrack1*1_name', 'Sport track straight'), + ('furni_divider_nor3*6_name', 'Blue Iced gate'), + ('furni_glass_chair*7_name', 'Green Glass Chair'), + ('club_confirm_gift_text', 'A new club gift has arrived. Please push OK if you want to receive it now. If you click cancel you will be asked again next time you log in to the Hotel.'), + ('furni_rubberchair*5_name', 'Lime Inflatable Chair'), + ('furni_plant_maze_snow_name', 'Snowy Maze Bundle 2'), + ('furni_table_silo_med*4_name', 'Beige Area Coffee Table'), + ('furni_solarium_norja*1_desc', 'Rejuvenate your pixels!'), + ('furni_divider_nor2*2_name', 'Black Iced bar desk'), + ('poster_45_desc', 'Needs a few more Habburgers'), + ('wallitem_habw_mirror_desc', 'Star of the show!'), + ('furni_pura_mdl3*9_name', 'Red Pura Module 3'), + ('furni_exe_corner_name', 'Executive Corner Desk'), + ('nav_venue_cunning_fox_gamehall/3_desc', 'Are you the new Deep Blue?'), + ('furni_rare_fan*7_desc', 'It\'ll blow you away!'), + ('furni_divider_nor1*5_desc', 'Pink Ice corner'), + ('wallitem_md_logo_wall_name', 'Bubble Juice Logo'), + ('furni_bardesk_polyfon_desc', 'Perfect for work or play'), + ('console_target_does_not_accept', 'This user does not accept friend requests at the moment'), + ('pet.saying.beg.croco.0', 'Mmmmmrrr'), + ('pet.saying.beg.croco.1', '*Emo tear*'), + ('messenger.email.header', ''), + ('pet.saying.beg.croco.2', 'Waarrrr...rrr'), + ('furni_carpet_polar*4_name', 'Green Bear Rug'), + ('furni_chair_plasto*6_name', 'Chair'), + ('furni_noob_rug*4_name', 'My first Habbo rug'), + ('furni_summer_chair*6_desc', 'Blue'), + ('rotate_furniture', 'Rotate Furni'), + ('poster_16_desc', 'Added security'), + ('furni_sofachair_silo*7_desc', 'Green Area Armchair'), + ('furni_divider_nor5*4_desc', 'Cool cornering for your crib!'), + ('furni_sand_cstl_twr_name', 'sand_cstl_twr'), + ('furni_safe_silo*4_name', 'Beige Safe Minibar'), + ('furni_chair_plasty*11_name', 'Plastic Pod Chair'), + ('furni_divider_arm2_name', 'Room divider'), + ('furni_sound_set_55_name', 'RnB Grooves 1'), + ('nav_venue_sw_lobby_intermediate_4_name', 'Snow Bombardiers Lobby'), + ('roomatic_canmodifysettings', '(You can change these settings later)'), + ('furni_pura_mdl5*7_desc', 'Any way you like it!'), + ('catalog_pet_name_length', 'Oops, pet\'s name is too long (max 15 characters)'), + ('furni_toy1*3_name', 'Rubber Ball'), + ('nav_venue_beauty_salon_loreal/0_desc', 'No Pixel Surgery, only natural make-ups!'), + ('furni_arabian_swords_name', 'Ancestral Scimitars'), + ('furni_summer_pool*4_name', 'Yellow Summer Pool'), + ('gs_error_create_0', 'This Lobby is full, please create a Game in another Lobby!'), + ('nav_venue_pizzeria/0_desc', 'Pizza; food of the hungry!'), + ('nav_roomnfo_hd_own', 'Own Rooms'), + ('furni_glass_sofa*4_desc', 'Translucent beauty'), + ('buddyremove_accept', 'Remove Friends'), + ('transaction_system_sms_win_orange', 'Orange SMS'), + ('gs_error_create_3', 'Your skill level isn\'t high enough for creating Games in this Lobby.'), + ('furni_goodie2_desc', 'For gourmet kittens'), + ('trading_youagree', 'You agree'), + ('furni_bench_lego_name', 'Team Bench'), + ('reg_verification_updateOK', 'Update successful'), + ('transaction_system_refunds', 'Refund'), + ('furni_carpet_standard*7_name', 'Floor Rug'), + ('poster_44_name', 'Mummy'), + ('furni_bed_polyfon_one*3_name', 'White Single Bed'), + ('furni_jp_tray1_name', 'jp_tray1'), + ('furni_jp_tatami_name', 'Small Tatami Mat'), + ('furni_bardesk_polyfon*2_name', 'Black Mode Bardesk'), + ('furni_hockey_light_desc', 'Set it off.'), + ('nav_venue_bb_lobby_intermediate_2/0_desc', ''), + ('wallitem_guitar_v_name', 'v guitar'), + ('reg_email', 'Email:'), + ('nav_venue_sw_lobby_tournament_0/0_desc', ''), + ('furni_club_sofa_name', 'Club sofa'), + ('furni_duck_name', 'Rubber Duck'), + ('furni_divider_nor5*9_name', 'Red Iced Angle'), + ('furni_smooth_table_polyfon_name', 'Large Dining Table'), + ('reg_forcedupdate', 'Please update your Habbo details!'), + ('transaction_system_stuff_store', 'Catalogue purchase'), + ('console_request_massoperation_title', 'You have %messageCount% friend requests waiting.'), + ('nav_venue_bb_lobby_expert_8/0_desc', ''), + ('roomatic_roomdescription', 'Room description:'), + ('reg_verification_invalidEmail', 'Check email address'), + ('furni_xmas_icelamp_desc', '20 lanterns for the price of 6!'), + ('wallitem_wallmirror_desc', 'Mirror, mirror on the wall...'), + ('furni_pura_mdl1*3_name', 'Black Pura Module 1'), + ('pet.saying.play.croco.1', 'Squeh Squeeeeh...'), + ('pet.saying.play.croco.0', ':)'), + ('nav_venue_theatredrome_halloween/0_desc', 'Warm welcome to Bullet For My Valentine!'), + ('nav_venue_bb_lobby_amateur_6_name', 'Gevorderden Battle Ball 7'), + ('cam_savetxt', 'Saving Photo...'), + ('nav_venue_bb_lobby_intermediate_1_name', 'Semi-profs Battle Ball 2'), + ('nav_modify_doorstatus', 'Door status'), + ('callhelp_sent', 'If you have questions about Habbo Hotel or your Habbo account, please write the details below and a member of community staff will respond as soon as possible.'), + ('wallitem_photo_name', 'Photo'), + ('poster_25_desc', 'A new use for carrots!'), + ('furni_chair_plasto*1_desc', 'Hip plastic furniture'), + ('furni_prizetrophy4*2_name', 'Fish trophy'), + ('furni_bar_armas_name', 'Barrel Minibar'), + ('nav_rooms_favourite', 'Favourites'), + ('furni_table_plasto_square*6_desc', 'Hip plastic furniture'), + ('furni_gothic_sofa*6_desc', 'The dark side of Habbo'), + ('jukebox_song_length', 'Song length: %time%'), + ('buddyremove_header', 'Choose %amount% friends to remove'), + ('furni_romantique_mirrortabl_desc', 'Get ready for your big date'), + ('wallitem_hrella_poster_2_name', 'Life Buoy'), + ('reg_boy', 'Boy'), + ('sound_machine_trax_name', 'Trax name:'), + ('purse_vouchers_error0', 'Technical error! Cannot redeem voucher.'), + ('furni_plant_valentinerose*3_name', 'Yellow Valentine Rose'), + ('purse_vouchers_error1', 'Invalid voucher code.'), + ('nav_venue_bb_lobby_expert_1_name', 'Experts Battle Ball 2'), + ('purse_vouchers_error2', 'Product delivery failed, please contact Customer Service'), + ('purse_vouchers_error3', 'This voucher must be redeemed on the Habbo website'), + ('furni_romantique_chair*2_desc', 'null'), + ('furni_prizetrophy7*1_desc', 'Gold Habbo trophy'), + ('furni_table_plasto_bigsquare*14_name', 'Occasional Table'), + ('furni_ticket_desc', 'A bundle of 5 gaming tickets'), + ('nav_venue_club_massiva_name', 'Club Massiva'), + ('roomatic_locked', 'Door locked - visitors have to ring doorbell'), + ('furni_table_silo_small*3_desc', 'For those random moments'), + ('furni_bed_trad_name', 'Plain Double Bed'), + ('summer_chair_5_name', 'Beige Deck Chair'), + ('buddyremove_select_all', 'Select All Friends'), + ('furni_plant_valentinerose*5_desc', 'For that special pixel'), + ('furni_glass_table*9_name', 'Glass table'), + ('furni_romantique_smalltabl*5_desc', 'Why is one leg different?'), + ('furni_pura_mdl5*5_name', 'beige pura module 5'), + ('poster_30_name', 'Mistletoe'), + ('furni_chair_basic*8_name', 'chair_basic'), + ('nav_venue_sw_lobby_amateur_2_name', 'Snow Slingers Lobby'), + ('Alert_ConnectionDisconnected', 'Please reload Habbo Hotel!\\r\\rIf this happens again, please wait a moment before reloading.'), + ('Alert_WrongPassword', 'Check password!'), + ('nav_modify_letothersmove', 'Let other people move and leave furniture in the room.'), + ('furni_rare_dragonlamp*1_name', 'Sea Dragon Lamp'), + ('furni_table_plasto_4leg*10_desc', 'Hip plastic furniture'), + ('furni_sound_set_28_name', 'Rock 2'), + ('furni_grand_piano*2_name', 'Black Grand Piano'), + ('furni_basket_desc', 'Eggs-actly what you want for Easter'), + ('furni_rare_fan*5_name', 'Yellow Powered Fan'), + ('furni_noob_lamp*2_name', 'My first Habbo lamp'), + ('furni_present_gen4_desc', 'What\'s inside?'), + ('furni_pillar*9_desc', 'Ancient and stately'), + ('furni_chair_norja*8_desc', 'Sleek and chic for each cheek'), + ('furni_pura_mdl2*2_desc', 'Any way you like it!'), + ('furni_glass_stool*5_desc', 'Translucent beauty'), + ('furni_hc_lmp_name', 'Oil Lamp'), + ('console_myinterests', 'My interests:'), + ('furni_val_teddy*6_desc', 'The blue bear of happiness'), + ('room_cant_set_item', 'You cannot place this in someone else\'s room!'), + ('poster_29_desc', '10 x Gold Tinsel'), + ('club_general_daysleft', 'Number of HC days left'), + ('nav_popup_nav_link', 'Open the Navigator'), + ('furni_sound_set_43_desc', 'Beware zombies!'), + ('furni_solarium_norja*6_name', 'Blue Solarium'), + ('furni_doormat_plain*1_name', 'Doormat'), + ('nav_venue_chill_name', 'Zen Garden'), + ('furni_one_way_door*5_desc', 'One at a time!'), + ('furni_table_plasto_round*3_desc', 'Hip plastic furniture?'), + ('furni_prizetrophy6_desc', 'Palkinto'), + ('furni_exe_s_table_name', 'Executive Glass Table'), + ('furni_noob_rug*5_desc', 'Nice and neat sisal rug with pink edging'), + ('furni_scifirocket*0_name', 'Mars Smoke Machine'), + ('furni_soft_jaggara_norja_desc', 'Soft Iced sofachair'), + ('nav_venue_bb_lobby_amateur_9/0_desc', ''), + ('furni_chair_plasty*5_desc', 'Hip plastic furniture'), + ('hobba_mark_emergency', 'Emergency Help'), + ('furni_djesko_turntable_name', 'Habbo Turntable'), + ('furni_shelves_norja*9_desc', 'For nic naks and art deco books'), + ('poll_confirm_cancel_long', 'Are you sure you want to stop answering the poll? You can\'t continue later.'), + ('poster_32_desc', 'The Auspicious One'), + ('opening_hours_text_opening_time', 'The Hotel will open again at %h%:%m%. We look forward to welcoming you back!'), + ('furni_bed_budget_one*7_name', 'Green Pura Bed'), + ('furni_pillow*0_desc', 'Minimalist comfort!'), + ('furni_divider_poly3*8_desc', 'Yellow Mode Bardesk Gate'), + ('nav_venue_bb_lobby_beginner_13/0_desc', ''), + ('furni_sound_set_6_name', 'Ambient 3'), + ('hubu_win', 'Bus - Info'), + ('furni_sound_machine*5_name', 'Brown Traxmachine'), + ('furni_sporttrack1*2_desc', 'null'), + ('bb_title_bouncingBall', 'Battle Ball'), + ('nav_venue_rooftop/0_desc', 'Hang out on the very rooftop of Habbo Hotel!'), + ('modtool_banreason', 'Ban Reason:'), + ('furni_chair_silo*9_desc', 'Red Silo Dining Chair'), + ('furni_bed_budget*6_desc', 'King sized comfort!'), + ('furni_s_sound_machine*4_desc', 'Sound Machine Blue Desc'), + ('furni_rubberchair*6_desc', 'Soft and tearproof!'), + ('nav_venue_sw_lobby_expert_1_name', 'Snow Marksmen Lobby'), + ('nav_venue_bb_lobby_beginner_7/0_desc', ''), + ('furni_table_plasto_4leg*5_desc', 'Hip plastic furniture'), + ('gen_youhave', 'You Have'), + ('furni_carpet_soft*6_name', 'Soft Wool Rug'), + ('furni_petfood2_desc', 'Fantastic 20% Saving!'), + ('group_privileges', 'Priviliges:'), + ('furni_samovar_name', 'Russian Samovar'), + ('furni_hal_grave_name', 'Haunted Grave'), + ('furni_bed_budget_one*2_desc', 'Princess sized comfort!'), + ('gs_error_1', 'You have entered invalid data!'), + ('reject', 'Reject'), + ('gs_error_4', 'You have reached your maximum number of daily Games!'), + ('nav_venue_sw_lobby_tournament_5_name', 'Tournament Lobby'), + ('gs_error_5', 'Tournament is only available for users living in the UK.'), + ('gs_error_2', 'You don\'t have enough Tickets!'), + ('gs_error_8', 'To start a Game, there must be at least two Teams of one player each!'), + ('sound_machine_alert_no_sound_sets', 'You don\'t have any sound sets available for song editing. \\rNote that the sets need to be in your inventory (hand).'), + ('furni_waterbowl*4_desc', 'Aqua unlimited'), + ('furni_doormat_love_desc', 'Welcome Habbos in style'), + ('gs_error_6', 'You have been removed from the Game!'), + ('furni_soft_sofachair_norja*4_desc', 'Sit back and relax'), + ('bb_powerup_desc_8', 'By using a vacuum cleaner, you can clear any tile in the field.'), + ('move', 'Move'), + ('furni_romantique_smalltabl*3_name', 'Turquoise Tray Table'), + ('furni_bed_polyfon*8_name', 'Yellow Mode Double Bed'), + ('furni_sofachair_polyfon*4_desc', 'Beige Mode Armchair'), + ('forgottenpw_email', 'Your email address'), + ('console_email', 'Email'), + ('bb_powerup_desc_1', 'Light bulb colours an area around it.'), + ('furni_divider_nor2_desc', 'Strong, yet soft looking'), + ('furni_bardeskcorner_polyfon*5_desc', 'For sweet corners!'), + ('say', 'Say'), + ('bb_powerup_desc_3', 'Flashlight colours a straight line ahead of you.'), + ('bb_powerup_desc_2', 'Bouncing on a spring locks tiles in a single jump.'), + ('bb_powerup_desc_5', 'Bouncing on a box of pins will burst your Battle Ball!'), + ('bb_powerup_desc_4', 'A shot with a cannon locks tiles on a straight line.'), + ('furni_chair_basic*1_name', 'chair_basic'), + ('bb_powerup_desc_7', 'A bomb will clear all tiles around it.'), + ('bb_powerup_desc_6', 'Harlequin effect makes everybody colour tiles for your team!'), + ('NUF_console_read_next', 'Click \'OK\' to mark message as read.'), + ('poster_50_name', 'Bat Poster'), + ('furni_table_plasto_4leg*15_name', 'Occasional Table'), + ('furni_tree7_desc', 'Walking in a winter wonderland!'), + ('poster_37_name', 'The Habbo Babes 3'), + ('furni_queue_tile1*7_desc', 'The power of movement'), + ('furni_bed_budgetb_name', 'Plain Double Bed'), + ('interface_icon_sound', 'Sound Off/On'), + ('pet.hotwords.come_here', 'come here'), + ('poster_10_name', 'Lapland Poster'), + ('win_delete_item', 'Remove Item'), + ('wallitem_hrella_poster_3_name', 'Anchor'), + ('furni_table_plasto_bigsquare*8_desc', 'Hip plastic furniture'), + ('furni_habboween_grass_name', 'Unholy Ground'), + ('furni_plant_valentinerose*4_name', 'Pink Valentine\'s Rose'), + ('nav_venue_skylight_lobby/0_desc', 'Lift your spirits on the top floor'), + ('buddyremove_alphabetical', 'Alphabetical Order'), + ('alert_win_coppa', 'You are blocked'), + ('nav_venue_bb_lobby_amateur_5_name', 'Gevorderden Battle Ball 6'), + ('reg_update_text', 'Never change your password or email just because somebody asks you to. He / she is most probably trying to steal your Habbo account and furni!'), + ('decision_ok', 'OK'), + ('furni_summer_grill*3_name', 'Yellow Barbeque Grill'), + ('nav_public_helptext', 'These are hotel\'s public rooms. What are you waiting for? Go and meet other Habbos!'), + ('tickets_button_info_2', 'Stuff you can do with these 20 tickets'), + ('furni_rclr_chair_name', 'Palm Chair'), + ('login_create1here', 'You can create one here.'), + ('tickets_button_info_1', 'Stuff you can do with these 2 tickets'), + ('furni_prizetrophy6*3_name', 'Champion trophy'), + ('furni_shelves_norja*2_desc', 'For nic naks and art deco books'), + ('purse_info', 'DESCRIPTION'), + ('bb_choose_powerups', 'Powerup select'), + ('purse_transaction', 'View Transactions'), + ('reg_birthdayformat', 'Birthday*: [dd][mm][yyyy]'), + ('Alert_YouMustAgree', 'You must accept the Terms and Conditions before proceeding.'), + ('jukebox_empty', 'Empty'), + ('purse_info_film', 'Films For Camera'), + ('furni_sofachair_polyfon*9_desc', 'Loft-style comfort'), + ('furni_habbocake_desc', 'Save me a slice!'), + ('furni_doormat_plain*6_desc', 'Available in a variety of colours'), + ('nav_venue_sun_terrace/0_desc', 'For lazy afternoons and super tan treatment!'), + ('poster_501_desc', 'For pirates everywhere'), + ('pet_thir_2', 'Thirsty'), + ('gs_error_watch_0', 'All The Spectator Seats Are Taken!'), + ('pet_thir_3', 'Not thirsty'), + ('camera_open_dialog_text', 'Would you like to take some photos\\ror put your camera in your room?'), + ('furni_bed_budget_one*9_desc', 'Prince sized comfort!'), + ('ph_goswimming', 'Go swimming!'), + ('furni_habboween_crypt_name', 'Creepy Crypt'), + ('gs_error_join_7', 'You have already joined this Game!'), + ('nav_venue_sw_lobby_amateur_3_name', 'Snow Slingers Lobby'), + ('furni_romantique_smalltabl*4_name', 'Amber Tray Table'), + ('gs_error_join_3', 'You either have too much or too little skill to join.'), + ('pet_thir_0', 'Gasping'), + ('gs_error_join_0', 'The team you selected is already full.'), + ('pet_thir_1', 'Parched'), + ('furni_gothic_stool*3_name', 'Gothic Stool Red'), + ('furni_wooden_screen*1_name', 'Pink Oriental screen'), + ('furni_sofa_silo*4_name', 'Beige Area Sofa'), + ('furni_queue_tile1*2_desc', 'The power of movement'), + ('buddyremove_continue', 'Remove Friend Now'), + ('nav_venue_bb_lobby_expert_2/0_desc', ''), + ('nav_loading', 'Loading...'), + ('furni_bed_armas_two_name', 'Double Bed'), + ('furni_prizetrophy4*1_name', 'Fish trophy'), + ('furni_sound_machine*7_desc', 'Red alert. Red alert. It\'s a party!'), + ('furni_glass_sofa_desc', 'Translucent beauty'), + ('furni_barchair_silo*5_name', 'Pink Bar Stool'), + ('furni_soft_sofachair_norja*5_desc', 'Pink Iced Sofachair'), + ('console_fr_accepted_count', 'Amount to be accepted'), + ('poster_2001_desc', 'Perinteinen ryijy,'), + ('furni_couch_norja*5_desc', 'Two can perch comfortably'), + ('furni_rclr_lamp_desc', 'Light your space'), + ('furni_sand_cstl_wall_desc', 'sand_cstl_wall'), + ('furni_one_way_door*4_name', 'Beige One Way Gate'), + ('furni_corner_china_name', 'Dragon Screen'), + ('nav_venue_sw_lobby_amateur_4/0_desc', 'Astetta rankempaa lumisotaa.'), + ('furni_chair_silo*7_name', 'Green Silo Dining Chair'), + ('transaction_system_messenger', 'Console SMS'), + ('furni_pura_mdl4*8_desc', ''), + ('console_reject_selected', 'Reject selected'), + ('furni_rare_icecream*4_desc', 'Virtual strawberry rocks!'), + ('furni_prizetrophy*2_desc', 'Shiny silver'), + ('furni_scifiport*0_desc', 'Energy beams. No trespassers!'), + ('paalu_ui2', 'Push'), + ('paalu_ui3', 'Moving'), + ('paalu_ui4', 'Stabilise'), + ('paalu_ui5', 'Balance'), + ('furni_sofa_polyfon*7_name', 'Green Mode Sofa'), + ('nav_error_toomanyfavrooms', 'You can\'t have more than 10 favourite rooms! Please remove an old favourite if you want to add a new one.'), + ('furni_noob_stool*5_name', 'My first Habbo stool'), + ('sound_machine_alert_missing_packages', 'You need the following Traxpacks to edit this song:'), + ('furni_grunge_bench_name', 'Bench'), + ('paalu_ui1', 'Balance'), + ('furni_sleepingbag*5_name', 'Graphite Sleeping Bag'), + ('furni_divider_nor2*3_name', 'White Iced Bar-Desk'), + ('bb_header_teams', 'Teams'), + ('wallitem_sw_swords_name', 'Swords'), + ('furni_val_choco_desc', 'One for them. Two for me!'), + ('nav_venue_bb_lobby_expert_5/0_desc', ''), + ('furni_soft_sofa_norja*2_name', 'Black Iced Sofa'), + ('furni_bed_budgetb_one_desc', 'All you need for a good night\'s kip'), + ('furni_carpet_standard*8_name', 'Floor Rug'), + ('furni_rare_dragonlamp*6_name', 'Gold Dragon Lamp'), + ('furni_sound_set_56_desc', 'Get down tonight!'), + ('furni_divider_nor5*2_name', 'Black Iced Angle'), + ('chat.curse_word', 'Bobba'), + ('furni_couch_norja*4_desc', 'Two can perch comfortably'), + ('furni_scifirocket*2_desc', 'A little closer to home!'), + ('furni_rare_fan*6_desc', 'It\'ll blow you away!'), + ('poster_514_name', 'The EU flag'), + ('club_desc_2_period', '3 Months (93 days) = 60 Credits'), + ('furni_glass_chair*9_desc', 'Translucent beauty'), + ('poster_1338_desc', 'If her age on the clock, she ready for the cock'), + ('nav_src_hd', 'Search Results.'), + ('console_unknown_sender', 'Unknown sender'), + ('furni_prizetrophy4_name', 'Pokaali'), + ('nav_venue_sunset_cafe/0_desc', 'Come and chat about Official Fansites and meet their staff!'), + ('furni_pura_mdl4*9_desc', 'Any way you like it!'), + ('furni_pillar*8_name', 'Roman Pillar'), + ('nav_venue_sport/0_desc', 'St Trinian\'s is out on DVD April 14th!'), + ('furni_pillar*7_name', 'Atlantean Pillar'), + ('club_extend_text', 'If you\'re subscribing again to Habbo Club, you won\'t lose any of the advantages or ongoing furni gifts. Club membership can be extended in advance.\\rRemember: one club month lasts 31 days.'), + ('sound_machine_confirm_eject', 'Remove cartridge?'), + ('shopping_got', 'You have xx in your Purse.'), + ('furni_rare_stand_desc', 'Stand and Deliver!'), + ('furni_chair_plasto_desc', 'Hip plastic furniture'), + ('furni_bed_polyfon_one*9_desc', 'Cot of the artistic'), + ('furni_couch_norja*9_name', 'Red Bench'), + ('poster_3_desc', 'Smells fishy, looks cool'), + ('paalu.winner', 'Winner:'), + ('NUF_meeting_people_room_wave', 'These buttons let you wave and dance. Click on your Habbo at anytime to see these buttons.'), + ('sound_machine_confirm_window', 'Sound Machine'), + ('furni_one_way_door*3_name', 'White HC Gate'), + ('furni_chair_plasty*9_name', 'Plastic Pod Chair'), + ('gs_timeleft', 'Time Left \\x'), + ('hobba_pickup', 'Pick Up'), + ('console_lastvisit', 'Last Visit'), + ('furni_rare_globe_desc', 'It\'s all white..'), + ('furni_val_cauldron_name', 'Valentine\'s Cauldron'), + ('poster_43_name', 'Chains'), + ('furni_bardesk_polyfon*8_desc', 'Yellow Mode Bardesk'), + ('furni_sound_set_36_name', 'Latin Love 1'), + ('dimmer_apply', 'Apply'), + ('furni_glass_chair*8_desc', 'Translucent beauty'), + ('furni_pura_mdl2*7_desc', 'Any way you like it!'), + ('furni_prizetrophy*3_desc', 'Breathtaking bronze'), + ('furni_marquee*1_name', 'Pink marquee'), + ('NUH_own_user', 'This is your Habbo. Click on the floor to move around.'), + ('furni_gothic_sofa*1_desc', 'The dark side of Habbo'), + ('furni_divider_nor5*3_name', 'White Iced Angle'), + ('furni_divider_nor4*5_name', 'Pink Iced Auto Shutter'), + ('furni_soft_sofa_norja*3_name', 'White Iced Sofa'), + ('furni_sofachair_silo*8_desc', 'Large, but worth it'), + ('furni_pura_mdl1*9_desc', 'Any way you like it!'), + ('furni_chair_plasto*7_name', 'Chair'), + ('furni_pura_mdl5*6_desc', 'Any way you like it!'), + ('emailpw', 'Send'), + ('sound_machine_playlist_window', 'Traxmachine Playlist Editor'), + ('furni_pura_mdl1*3_desc', 'Any way you like it!'), + ('furni_noob_table*5_desc', 'Lightweight, practical and pink'), + ('furni_scifirocket*6_name', 'Mercury Smoke Machine'), + ('furni_shelves_norja_name', 'Bookcase'), + ('poster_521_name', 'Flag of Brazil'), + ('sound_machine_jukebox_disk_window', 'Insert disc'), + ('furni_table_norja_med*6_desc', 'For larger gatherings'), + ('furni_pillow*6_name', 'Blue Cotton Pillow'), + ('furni_shelves_norja*3_desc', 'For nic naks and art deco books'), + ('queue_set.s.info', 'There are %d% Habbos in front of you in the queue to see the Habbo Live broadcast!'), + ('reg_parentemail_info', 'Because of your age, we need to let your parents know you are registering at Habbo Hotel. Please give the email address of one of your parents/guardians.'), + ('club_txt_paycash', 'Pay by Cash'), + ('furni_chair_plasto*11_name', 'Chair'), + ('furni_pizza_name', 'Pizza Box'), + ('furni_table_plasto_4leg*6_desc', 'Hip plastic furniture'), + ('furni_chair_silo*3_desc', 'Keep it simple'), + ('alert_reg_t', 'Please check these details:'), + ('nav_venue_theatredrome_name', 'Theatredrome'), + ('furni_hc_rntgn_desc', 'Believe it or not!'), + ('nav_venue_main_lobby_name', 'Main Lobby'), + ('furni_sound_set_64_desc', 'Make a little Jinn-gle!'), + ('nav_venue_sw_lobby_amateur_desc', 'Practice improves a Snow Stormer\'s aim... Ops, missed!'), + ('furni_scifiport*5_name', 'Security Fence'), + ('furni_lamp_basic_desc', 'Switch on the atmosphere with this sophisticated light'), + ('pet.saying.sniff.cat.0', 'snuh..snuh'), + ('poster_506_name', 'The flag of Finland'), + ('furni_bardeskcorner_polyfon*6_desc', 'Blue Mode Bardesk Corner'), + ('nav_venue_hotel_kitchen_name', 'Hotel Kitchen'), + ('furni_doorB_desc', 'Narnia this way!'), + ('poster_11_name', 'Certificate'), + ('furni_safe_silo_desc', 'Totally shatter-proof!'), + ('furni_bed_budget_one*3_desc', 'Prince sized comfort!'), + ('furni_romantique_divider*4_name', 'Ochre Screen'), + ('previous_onearrowed', '< Previous'), + ('nav_venue_bb_lobby_tournament_3_name', 'Competitie Battle Ball 4'), + ('furni_plant_sunflower_desc', 'For happy Habbos'), + ('furni_throne_desc', 'Important Habbos only'), + ('furni_exe_bardesk_name', 'Executive Bar Desk'), + ('furni_tree6_desc', 'The future\'s bright!'), + ('log_problem_title', 'Problems Connecting'), + ('furni_chair_basic*2_name', 'Pink Pura Egg Chair'), + ('game_chess_black', 'Black:'), + ('furni_glass_sofa*9_name', 'Glass sofa'), + ('furni_chair_norja*2_desc', 'Sleek and chic for each cheek'), + ('furni_pillar*3_desc', 'Ancient and stately'), + ('furni_scifidoor*8_desc', 'There out of this world!'), + ('alert_InvalidUserName', 'Don\'t use this character: \\x !'), + ('furni_rare_parasol*3_name', 'Violet Parasol'), + ('furni_bed_budget*5_desc', 'King sized comfort!'), + ('furni_chair_silo*8_name', 'Yellow Dining Chair'), + ('nav_tryingpw', 'Trying the password...'), + ('furni_cn_lamp_desc', 'Light of the East'), + ('furni_prizetrophy3*3_name', 'Globe trophy'), + ('furni_sound_set_16_desc', 'Ferry, ferry good!'), + ('furni_table_plasto_round*4_desc', 'Hip plastic furniture'), + ('poster_2007_desc', 'The legendary founder of the Hotel'), + ('sound_machine_insert', 'Add to mixer'), + ('furni_sound_machine*1_desc', 'Let the party begin!'), + ('furni_bed_polyfon_one*8_desc', 'Yellow Mode Single Bed'), + ('error_room_closed', 'Huone on suljettu.'), + ('pet.hotwords.play_dead', 'play dead'), + ('gs_button_go_finished', 'Scores'), + ('group_member', 'Member'), + ('sound_machine_confirm_save', 'Save the song?'), + ('furni_arabian_wndw_desc', 'Arabian days and nights'), + ('nav_venue_sw_lobby_expert_2_name', 'Snow Marksmen Lobby'), + ('furni_sound_set_57_desc', 'Feel the groove'), + ('furni_triplecandle_desc', 'No need to worry about wax drips'), + ('char_welcome', 'Welcome!'), + ('furni_sound_machine*6_desc', 'Add some effects to your room!'), + ('furni_sofachair_polyfon*3_desc', 'Loft-style comfort'), + ('nav_venue_bb_lobby_amateur_6/0_desc', ''), + ('group_logo_url_template', 'http://www.habbohotel.co.uk/habbo-imaging/badge-fill/%imagerdata%.gif'), + ('furni_table_plasto_bigsquare*2_desc', 'Hip plastic furniture'), + ('furni_glass_table*5_desc', 'Translucent beauty'), + ('url_purse_link', 'http://%predefined%//credits?'), + ('buddyremove_logintime', 'Last Login Time'), + ('NUF_meeting_people_hotelview_tutor', 'The Navigator lets you move between rooms in the Hotel, so open it up to get started!'), + ('furni_sofa_polyfon*6_name', 'Blue Mode Sofa'), + ('furni_scifirocket*1_desc', 'There is always space for this!'), + ('nav_venue_bb_lobby_amateur_10/0_desc', ''), + ('furni_prizetrophy5_name', 'Pokaali'), + ('purse_info_tickets', 'Gaming Tickets'), + ('poster_513_name', 'The Australian flag'), + ('furni_noob_chair*3_desc', 'Lightweight, practical, with red stripes'), + ('alert_old_client', 'You have an old version cached. Please empty your browser cache and login again.'), + ('furni_bar_basic_name', 'A Pura Minibar'), + ('furni_shelves_norja*8_desc', 'For nic naks and art deco books'), + ('sound_machine_save_window', 'Save your Trax'), + ('poster_51_name', 'Basketball Hoop'), + ('Alert_moderator_warning', ''), + ('furni_solarium_norja*5_name', 'Pink Solarium'), + ('furni_sporttrack2*1_desc', 'null'), + ('furni_rubberchair*7_desc', 'Soft and tearproof!'), + ('reg_parentemail_moreinfo', 'More information:'), + ('furni_present_gen5_desc', 'What\'s inside?'), + ('furni_bed_polyfon*9_desc', 'Give yourself space to stretch out'), + ('sound_machine_confirm_save_list_long', 'Are you sure you want to overwrite the current playlist?'), + ('cam_zoom_in.help', 'Zoom In'), + ('furni_carpet_soft*5_name', 'Soft Wool Rug'), + ('furni_plant_small_cactus_name', 'Small Cactus'), + ('console_creatingaprofile', 'Creating A Profile'), + ('console_select_all', 'Select all'), + ('hobba_reply_cfh', 'Reply to:'), + ('notickets_buygame', 'Buy a game'), + ('furni_sporttrack1*3_desc', 'null'), + ('furni_sleepingbag*1_desc', 'Ultimate coziness'), + ('furni_gothic_stool*4_name', 'Black Gothic Stool'), + ('nav_venue_bb_lobby_beginner_4/0_desc', ''), + ('nav_venue_netcafe/0_desc', 'Learn a foreign language and win Habbo Credits in our quests!'), + ('poster_31_desc', 'Pure and unbridled nu-metal'), + ('furni_sound_set_24_desc', 'It\'s all about the Pentiums, baby!'), + ('pet.saying.angry.dog.3', 'dog.1=Oouh..oouh..snuh..ooo'), + ('furni_bed_budget_one*8_desc', 'Prince sized comfort!'), + ('pet.saying.angry.dog.4', 'ARRR Grrr.. woof woof woof'), + ('pet.saying.angry.dog.1', 'Woof! Grrrr..woof woof'), + ('furni_sw_table_desc', ''), + ('pet.saying.angry.dog.2', 'grRRRRrr.r...r'), + ('pet.saying.angry.dog.0', 'Rrrr..woof.. Rrr'), + ('furni_chair_china_name', 'Chinese Lacquer Chair'), + ('furni_romantique_divan*2_desc', 'Recline in continental comfort'), + ('furni_divider_silo1*6_desc', 'Blue Area Corner Shelf'), + ('furni_sound_set_5_name', 'Ambient 4'), + ('roomevent_browser_create', 'Host an event'), + ('furni_noob_rug*6_desc', 'Nice and neat sisal rug with green edging'), + ('transaction_system_bank_luottokunta', 'Luottokortti'), + ('furni_bed_armas_one_name', 'Single Bed'), + ('furni_plant_fruittree_desc', 'Great yield and sweet fruit'), + ('furni_sound_machine_pro_desc', 'creating fancy sounds'), + ('nav_ownrooms_helptext', 'If you didn\'t know, these are your rooms. Here you can modify your rooms or create new ones if you feel like it.'), + ('furni_grunge_radiator_desc', 'Started cool but now it\'s hot!'), + ('furni_divider_silo3*7_desc', 'Green Area Gate'), + ('room_hold', 'Wait a second...\\rLoading room...'), + ('furni_sound_set_49_desc', 'You will belong'), + ('nav_venue_emperors/0_desc', 'Even the smallest of light... shines in the darkness'), + ('furni_nest_name', 'Basket'), + ('furni_noob_table*4_name', 'My first Habbo table'), + ('furni_sound_set_51_desc', 'Bop to the beat'), + ('furni_plant_maze_snow_desc', '20 x Snowy Maze Shrubbery'), + ('NUF_meeting_people_hotelview_icon', 'Click the Navigator button to start visiting the rooms!'), + ('furni_scifirocket*7_desc', 'Larger than life!'), + ('furni_table_plasto_round*9_name', 'Round Dining Table'), + ('furni_val_teddy*5_name', 'Yellow Share Bear'), + ('nav_venue_bb_lobby_expert_2_name', 'Experts Battle Ball 3'), + ('console_onfrontpage', 'Online'), + ('poster_1000_desc', 'The Noble and Silver Show'), + ('furni_rare_icecream*9_name', 'Bubblegum Ice Cream Machine'), + ('furni_rare_fan*0_name', 'Festive Fan'), + ('furni_carpet_polar_name', 'Faux-Fur Bear Rug'), + ('hobba_chatlog', 'See Chat Log >>'), + ('furni_romantique_chair*3_desc', 'null'), + ('hobba_pickedby', 'Picked Up By:'), + ('poster_24_desc', 'Trying to get in or out?'), + ('furni_table_silo_small*2_desc', 'For those random moments'), + ('furni_table_plasto_bigsquare*15_name', 'Occasional Table'), + ('furni_prizetrophy7*2_desc', 'Silver Habbo trophy'), + ('ph_keys_run', 'Run:'), + ('error_title', 'Oops, error!'), + ('furni_rare_dragonlamp*0_name', 'Fire Dragon Lamp'), + ('furni_CFC_50_coin_silver_name', 'Silver Coin (China)'), + ('furni_chair_plasty_name', 'Plastic Pod Chair'), + ('nav_roomInfo', 'Room info'), + ('furni_sound_set_63_name', 'Alhambra Trax 2'), + ('furni_divider_nor2*9_desc', 'Red Iced bar desk'), + ('furni_soft_sofa_norja*8_name', 'Yellow Iced Sofa'), + ('poster_57_desc', 'chinese calligraphy'), + ('furni_table_plasto_4leg*16_name', 'Occasional Table'), + ('accept', 'Accept'), + ('pet.saying.beg.cat.2', 'MEOW, MEOW, MEOW..'), + ('furni_waterbowl*3_desc', 'Aqua unlimited'), + ('furni_divider_poly3*2_name', 'Black Mode Bardesk Gate'), + ('furni_divider_nor3_desc', 'Do go through...'), + ('furni_table_plasto_square*5_desc', 'Hip plastic furniture'), + ('furni_rubberchair*1_desc', 'Soft and stylish HC chair'), + ('furni_divider_nor5*8_name', 'Yellow Iced Angle'), + ('furni_pura_mdl4*3_desc', 'Any way you like it!'), + ('nav_removerights_desc', 'Remove all rights to this room from other users.'), + ('furni_chair_norja*7_name', 'Rural Chair'), + ('furni_pillar*2_name', 'Nordic Pillar'), + ('furni_bed_polyfon*3_name', 'White Double Bed'), + ('furni_glass_chair*3_desc', 'Translucent beauty'), + ('wallitem_xmas_light_name', 'Xmas light'), + ('pet.saying.beg.cat.0', 'MaUUU...MEOW...meow'), + ('pet.saying.beg.cat.1', '*looks up with sad eyes*'), + ('reg_verification_newEmail', 'Your new email address:'), + ('furni_sound_set_29_desc', 'Electronic house'), + ('furni_joulutahti_desc', 'Christmas in a pot'), + ('furni_china_table_name', 'Chinese Lacquer Table'), + ('poster_507_desc', 'The French flag'), + ('NUF_visiting_rooms_hotelview_nav', 'Click the icon to open the Navigator.'), + ('dimmer_preset_1', 'Preset 1'), + ('nav_private_helptext', 'These are the rooms owned by Habbos. Select a category first and then browse some rooms and meet some people!'), + ('furni_queue_tile1*8_desc', 'The power of movement'), + ('dimmer_preset_2', 'Preset 2'), + ('furni_arabian_pllw_name', 'Green Blossom Pillow'), + ('nav_venue_bb_lobby_tournament_7/0_desc', ''), + ('furni_goodie1*1_desc', 'Crunchy Dog Treat'), + ('poster_36_name', 'The Habbo Babes 2'), + ('poll_window', 'Question'), + ('furni_md_limukaappi_desc', 'A sparkling and refreshing pixel drink!'), + ('nav_venue_rooftop_rumble_ii_name', 'Rooftop Rumble II'), + ('furni_wooden_screen*7_name', 'Purple Oriental Screen'), + ('furni_scifidoor*2_name', 'Yellow Spaceship Door'), + ('room_max_pet_limit', 'Too many pets in the room!'), + ('hobba_sent_to_helpers', 'Call re-assigned as emergency and sent to moderators'), + ('furni_table_silo_med*4_desc', 'Beige Area Coffee Table'), + ('furni_romantique_pianochair*5_name', 'Onyx Piano Stool'), + ('nav_modify_roomdescription', 'Room Description'), + ('furni_sound_set_10_name', 'Hip Hop Beats 1'), + ('furni_chair_silo*2_name', 'Black Dining Chair'), + ('furni_marquee*6_name', 'Blue Marquee'), + ('poster_8_name', 'Habbo Colours'), + ('transaction_system_htk_singledrop', 'Landline'), + ('furni_chair_plasty*4_desc', 'Hip plastic furniture'), + ('dimmer_preset_3', 'Preset 3'), + ('furni_exe_corner_desc', 'Tuck it away'), + ('nav_venue_welcome_lounge/0_desc', 'New? Lost? Get a warm welcome here from Habbo eXperts.'), + ('furni_sleepingbag*6_desc', 'Ultimate coziness'), + ('nav_venue_cunning_fox_gamehall/3_name', 'Batleships'), + ('console_mainhelp', 'Habbo Console Help'), + ('tickets_button_info_hide', 'Hide Ticket Info'), + ('furni_xmas_icelamp_name', 'Lantern Bundle 2'), + ('nav_venue_bb_lobby_amateur_0/0_desc', ''), + ('purse_header', 'Habbo Purse'), + ('furni_noob_lamp*3_name', 'My first Habbo lamp'), + ('nav_help_title', 'Want a room of your own?'), + ('buy', 'Buy'), + ('furni_pura_mdl1*8_name', 'yellow pura module 1'), + ('dimmer_title', 'Mood Light'), + ('NUF_mini_meet_people_hotelview_icon', 'Click the Navigator button to start visiting the rooms!'), + ('console_credits', 'Credits'), + ('bb_link_highScores_url', 'http://%predefined%/groups/56552/id'), + ('wallitem_md_logo_wall_desc', 'Bubble up your wall'), + ('furni_safe_silo*4_desc', 'Totally shatter-proof!'), + ('room_unignore', 'Listen'), + ('nav_venue_sw_lobby_amateur_1/0_desc', ''), + ('poster_16_name', 'Bars'), + ('furni_sofachair_silo*7_name', 'Green Area Armchair'), + ('furni_spyro_name', 'Dragon Egg'), + ('nav_venue_bb_lobby_beginner_19/0_desc', ''), + ('Alert_YourPasswordIsTooShort', 'Passwords must be at least 6 characters long.'), + ('room_cant_trade', 'You cannot trade this!'), + ('furni_door_desc', 'Dr Who?'), + ('gs_button_go_created', 'Join'), + ('poster_49_name', 'Large silver star'), + ('furni_glass_sofa*4_name', 'Glass sofa'), + ('furni_divider_arm3_desc', 'Knock, knock...'), + ('furni_sound_set_31_desc', 'House loops'), + ('reg_habboname', 'Habbo name:'), + ('habboclub_thanks', 'Yippee! You are now a member of Habbo Club! Your current email address is %email%. \\r\\rIf that\'s not the one you are using, please go to \'Update my Habbo ID\' and change it now. \\rThen we can contact you about your membership if need be.'), + ('console_follow_offline', 'Your friend is offline.'), + ('furni_divider_nor1*5_name', 'Pink Ice corner'), + ('nav_openbutton', 'Open'), + ('nav_venue_theatredrome_habbowood/0_desc', 'Home to the Habbowood Gala and HAFTA Awards!'), + ('nav_venue_ice_cafe/0_desc', 'Come here. And chill out.'), + ('furni_calippo_name', 'Calippo icecream machine'), + ('furni_bench_lego_desc', 'For your reserve players'), + ('poster_9_desc', 'Do your bit for the environment'), + ('furni_bed_polyfon_one*3_desc', 'Cot of the artistic'), + ('poster_44_desc', 'Beware the curse...'), + ('poster_2006_name', 'DJ Throne'), + ('furni_pura_mdl3*5_desc', ''), + ('furni_arabian_tray4_name', 'Fruit Tray'), + ('furni_divider_nor3*7_desc', 'Entrance or exit?'), + ('furni_sound_set_30_name', 'Instrumental 1'), + ('furni_romantique_tray1_name', 'Breakfast Tray'), + ('furni_jp_tray1_desc', 'jp_tray1'), + ('furni_plant_maze_desc', 'Build your maze!'), + ('console_getfriendrequest_2', 'If you accept this invitation (s)he will be added to your Friends List. Then you can send messages to each other.'), + ('furni_hockey_light_name', 'Lert'), + ('furni_goodie1_desc', 'Crunchy Dog Treat'), + ('console_getfriendrequest_1', 'has asked you to become his/her Friend.'), + ('furni_pura_mdl2*1_desc', 'Any way you like it!'), + ('score_board.text', 'POINTS'), + ('furni_one_way_door*9_name', 'Red One Way Gate'), + ('furni_sand_cstl_twr_desc', 'sand_cstl_twr desc'), + ('furni_divider_nor5*9_desc', 'Cool cornering for your crib y0!'), + ('furni_duck_desc', 'Every bather needs one'), + ('furni_bardesk_polyfon*2_desc', 'Black Mode Bardesk'), + ('console_request_2', '(S)he will be added into your Friends List if (s)he accepts it.'), + ('bb_link_join', 'Join Team'), + ('nav_createroom_hd', 'Here you can create your own room!'), + ('console_request_1', 'has been sent your Friend Request.'), + ('reg_check_info', 'CHECK YOUR INFO'), + ('furni_toy1*4_name', 'Rubber Ball'), + ('nav_venue_sw_lobby_free_0_name', 'Free Game Lobby'), + ('furni_chair_plasto*1_name', 'Chair'), + ('furni_toilet_name', 'Loo Seat'), + ('queue_set.dc.info', 'Number of Habbos in default queue is %d% and in Habbo Club queue %c%'), + ('furni_sofachair_silo*2_desc', 'Large, but worth it'), + ('furni_chair_plasto*12_desc', 'Hip plastic furniture'), + ('ph_tickets_buyfor', 'Buy Tickets for:'), + ('sound_machine_confirm_close', 'Close the editor?'), + ('furni_rare_fan*1_desc', 'It\'ll blow you away!'), + ('furni_divider_poly3*3_desc', 'Border control!'), + ('nav_venue_kattoterassi/0_desc', 'When push comes to shove...'), + ('furni_summer_grill*4_desc', 'Plenty of burgers on that barbie'), + ('furni_bar_armas_desc', 'It\'s a barrel of laughs and a great talking point'), + ('furni_toilet_red_name', 'Loo Seat'), + ('furni_hc_lmp_desc', 'Be enlightened'), + ('furni_romantique_mirrortabl_name', 'Dressing Table'), + ('furni_pura_mdl4*2_name', 'Pink Pura Module 4'), + ('summer_chair_5_desc', 'Enjoy the summer air'), + ('furni_plant_rose_desc', 'Sleek and chic'), + ('furni_skullcandle_name', 'Skull Candle Holder'), + ('Alert_no_credits', 'You don�t have enough Credits for this.'), + ('pet.hotwords.voice', 'speak'), + ('furni_prizetrophy4*2_desc', 'Shiny silver'), + ('furni_soft_sofachair_norja*4_name', 'Urban Iced Sofachair'), + ('furni_pura_mdl5*1_desc', 'Any way you like it!'), + ('furni_safe_silo*9_name', 'Red Safe Minibar'), + ('furni_bed_trad_desc', 'Sweet dreams for two'), + ('nav_venue_club_massiva_desc', 'Strut your funky stuff!'), + ('furni_rare_dragonlamp*1_desc', 'Out of the deep blue!'), + ('furni_wooden_screen*2_desc', 'Add an exotic touch to your room'), + ('furni_prizetrophy7*1_name', 'Gold Habbo trophy'), + ('furni_carpet_standard*2_name', 'Floor Rug'), + ('furni_arabian_teamk_desc', 'Quench that desert thirst'), + ('furni_romantique_chair*2_name', 'Lime Romantique Chair'), + ('nav_venue_sw_lobby_tournament_0_name', 'Tournament Lobby'), + ('invitation_expired', 'Sorry, all Welcoming Party members were busy.'), + ('gs_error_game_checkname', 'Please check the Game\'s name!'), + ('furni_sound_set_23_name', 'SFX 4'), + ('furni_grand_piano*2_desc', 'Black Grand Piano'), + ('tutorial_quit', 'Close guide'), + ('furni_chair_basic*8_desc', ''), + ('NUF_getting_room_roommatic_security_tutor', 'Finally you can choose the security settings to your room and whether other users can move your furniture.'), + ('nav_venue_bb_lobby_beginner_1/0_desc', ''), + ('nav_private_helptext_hd_main', 'Habbo Guest Rooms'), + ('club_price', 'One month costs 25 Habbo Credits.'), + ('NUF_playing_games_navigator_tutor', 'Click either SnowStorm or BattleBall to open up a list of the game lounges.'), + ('nav_venue_old_skool_name', 'Old Skool Habbo'), + ('nav_venue_bb_lobby_beginner_4_name', 'Beginners Battle Ball 5'), + ('nav_venue_bb_lobby_tournament_9_name', 'Competitie Battle Ball 10'), + ('sound_machine_alert_song_saved', 'Song "%name%" successfully saved.'), + ('nav_venue_sw_lobby_intermediate_3_name', 'Snow Bombardiers Lobby'), + ('nav_venue_club_massiva/1_desc', 'Strut your funky stuff'), + ('furni_gothic_chair*1_name', 'Gothic Chair Pink'), + ('furni_divider_poly3_desc', 'All bars should have one'), + ('furni_romantique_divan*1_name', 'Pink Romantique Divan'), + ('NUF_playing_games_hotelview_tutor', 'Now we find out where to locate the Habbo Games!'), + ('poster_29_name', 'Gold Tinsel Bundle'), + ('furni_present_gen4_name', 'Gift'), + ('furni_bardesk_polyfon*7_name', 'Green Mode Bardesk'), + ('furni_gothic_sofa*6_name', 'Gothic Sofa Blue'), + ('furni_glass_stool*5_name', 'Glass stool'), + ('nav_venue_sw_lobby_free_5/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('nav_fav_hd', 'Your Favourite Rooms.'), + ('NUF_console_read_tutor', 'The Habbo Console lets you message your Habbo friends, and check whether they are online.'), + ('furni_romantique_tray2_desc', 'Spoil Yourself'), + ('Alert_ModeratorWarning', 'Message from a Moderator:'), + ('furni_giftflowers_name', 'Vase of Flowers'), + ('furni_table_silo_small*7_name', 'Green Area Occasional Table'), + ('furni_menorah_name', 'Menorah'), + ('furni_bed_polyfon_one*2_name', 'Black Mode Single Bed'), + ('console_offline', 'Offline'), + ('gs_mouseover_player', '\\x\\r\\yp'), + ('nav_venue_bb_lobby_amateur_3/0_desc', ''), + ('nav_venue_bb_lobby_amateur_13/0_desc', ''), + ('furni_noob_chair*2_name', 'My first Habbo chair'), + ('furni_doormat_plain*1_desc', 'Available in a variety of colours'), + ('object_displayer_hide_tags', 'Hide tags'), + ('poster_17_desc', 'Beautiful reproduction butterfly'), + ('gs_joinedplayers', 'Players Who Joined: \\x'), + ('furni_table_plasto_round*3_name', 'Round Dining Table'), + ('furni_divider_poly3*8_name', 'Yellow Mode Bardesk Gate'), + ('furni_glass_table*4_name', 'Glass table'), + ('furni_solarium_norja*6_desc', 'Rejuvenate your pixels!'), + ('poster_1006_desc', 'The eyes follow you...'), + ('furni_noob_rug*5_name', 'My first Habbo rug'), + ('buddyremove_pagecounter', 'Page'), + ('poll_alert_answer_missing', 'Please give an answer'), + ('furni_summer_chair*5_desc', 'Beige'), + ('furni_table_plasto_4leg*10_name', 'Occasional Table'), + ('furni_divider_silo2_desc', 'Stylish sectioning'), + ('furni_djesko_turntable_desc', 'For the music-lovers'), + ('nav_remrightsconf', 'You are about to remove all rights from your room. This means that only you will have rights to move and place furni in the room.'), + ('furni_pillow*0_name', 'White Lace Pillow'), + ('sound_machine_eject', 'Eject'), + ('gs_button_ready', 'Ready'), + ('furni_divider_silo1*5_name', 'Pink Area Corner Shelf'), + ('NUF_habbo_home_hotelview_tutor', 'You have now opened a page on the Habbo Website that will give you plenty of information about how to make yourself a Habbo Home.'), + ('furni_traffic_light*4_desc', 'Chill and wait your turn!'), + ('nav_venue_$unit.name$/0_desc', 'Roam more of the hotel\'s corridors'), + ('furni_sporttrack1*2_name', 'Sport track straight asphalt'), + ('furni_sofachair_polyfon_girl_name', 'Armchair'), + ('furni_sound_set_6_desc', 'Background ambience loops'), + ('furni_hal_grave_desc', 'We\'re raising the dead!'), + ('recycler_ready_info', 'Your recycled Furniture is ready. Please either accept or cancel. If you accept, you will receive your recycling reward, detailed below. If you cancel, all your old Furniture will be restored to your hand.'), + ('wallitem_jp_sheet1_name', 'jp_sheet1'), + ('furni_petfood2_name', 'Sardines Mega Multipack'), + ('furni_spotlight_name', 'Habbowood Spotlight'), + ('furni_carpet_soft*6_desc', 'Soft Wool Rug'), + ('gs_lounge_skill', 'Level in this Lounge: \\x \\r (\\y-\\z points)'), + ('nav_help_text', 'Click the Public Spaces tab on the top left of this navigator to find gaming rooms!'), + ('furni_table_plasto_4leg*5_name', 'Occasional Table'), + ('nav_venue_bb_arena_1_name', 'Battle Ball Aloittelijat'), + ('furni_table_silo_med*9_name', 'Red Area Coffee Table'), + ('furni_bed_budget_one*2_name', 'Pink Pura Bed'), + ('nav_venue_sw_lobby_expert_2/0_desc', 'Todellisille lumisotureille.'), + ('furni_rubberchair*6_name', 'Violet Inflatable Chair'), + ('furni_bardeskcorner_polyfon*5_name', 'Candy Corner'), + ('bb_powerup_8', 'Vacuum cleaner'), + ('bb_powerup_6', 'Harlequin'), + ('furni_rare_beehive_bulb*2_name', 'Yellow Amber Lamp'), + ('bb_powerup_7', 'Bomb'), + ('furni_divider_nor2_name', 'Ice Bar-Desk'), + ('bb_powerup_4', 'Cannon'), + ('bb_powerup_5', 'Box of pins'), + ('bb_powerup_2', 'Spring'), + ('bb_powerup_3', 'Flashlight'), + ('console_report', 'Report'), + ('bb_powerup_1', 'Light bulb'), + ('furni_sound_set_43_name', 'SFX 1'), + ('poster_37_desc', 'The Hotels girlband. Dream on!'), + ('interface_icon_messenger', 'Messenger, friends & messages on here'), + ('interface_icon_hand', 'Hand, your inventory'), + ('furni_s_sound_machine*4_name', 'Sound Machine Blue'), + ('nav_venue_sunset_cafe_name', 'Sunset Cafe'), + ('wallitem_sw_stone_desc', 'sw_stone'), + ('reg_check_mail', 'Email'), + ('furni_queue_tile1*7_name', 'Purple Habbo Roller'), + ('pet.hotwords.nest', 'sleep'), + ('furni_sound_machine_desc', 'Creating fancy sounds'), + ('cancel', 'Cancel'), + ('furni_hyacinth2_desc', 'Beautiful bulb'), + ('nav_venue_library/0_name', 'Habbo Library'), + ('furni_waterbowl*1_desc', 'Aqua unlimited'), + ('furni_grand_piano*5_desc', 'Why is that key green?'), + ('furni_table_plasto_bigsquare*8_name', 'Square Dining Table'), + ('furni_nouvelle_trax_name', 'nouvelle_trax'), + ('help_choise_header', 'What do you need help with?'), + ('furni_bardeskcorner_polyfon*7_name', 'Green Mode Bardesk Corner'), + ('furni_pillar*4_name', 'Dark Ages Pillar'), + ('furni_queue_tile1*6_desc', 'The power of movement'), + ('club_intro_link', 'Learn more about Habbo Club!'), + ('furni_sandrug_desc', 'Your own paradise island'), + ('poster_10_desc', 'Beautiful sunset'), + ('furni_divider_nor1_name', 'Ice Corner'), + ('nav_venue_bb_lobby_tournament_6_name', 'Competitie Battle Ball 7'), + ('furni_redhologram_desc', 'You\'re her only hope...'), + ('poster_38_name', 'Smiling Headbangerz'), + ('furni_hc_crtn_name', 'Antique Drapery'), + ('furni_barchair_silo*9_name', 'Red Bar Stool'), + ('room_badge_visible', 'Visible'), + ('furni_sleepingbag*8_name', 'Golden Sleeping Bag'), + ('roomevent_invalid_input', 'You must give your event a name and a description.'), + ('furni_chair_plasto*14_name', 'HC chair'), + ('poster_522_desc', 'The flag of Japan'), + ('furni_shelves_norja*2_name', 'Black Bookcase'), + ('nav_venue_dusty_lounge_name', 'Dusty Lounge'), + ('furni_sound_set_53_desc', 'Break the icy silence'), + ('nav_venue_ice_cafe_name', 'Ice Cafe'), + ('click', 'OK to continue to the hotel.'), + ('nav_venue_sw_lobby_free_2/0_desc', ''), + ('furni_rare_dragonlamp*9_name', 'Purple Dragon Lamp'), + ('furni_statue_desc', 'Watch out for those arrows!'), + ('game_battles_turn', 'TURN'), + ('wallitem_jp_sheet3_desc', 'jp_sheet3'), + ('furni_edicehc_desc', 'Click and roll!'), + ('furni_bed_budget*6_name', 'Blue Pura Double Bed'), + ('furni_gothic_sofa*5_desc', 'The dark side of Habbo'), + ('furni_scifirocket*5_desc', 'From the unknown depths of space'), + ('game_poker_ready', 'READY'), + ('furni_queue_tile1*2_name', 'Red Habbo Roller'), + ('furni_rare_parasol_desc', 'Zon! Zon! Zon!'), + ('transaction_system_sms_dna', 'DNA'), + ('furni_bar_polyfon_name', 'Mini-Bar'), + ('furni_grand_piano*1_name', 'Turquoise Grand Piano'), + ('nav_venue_bb_lobby_expert_4_name', 'Experts Battle Ball 5'), + ('bb_link_highscores', 'Highscores'), + ('summer_chair_8_desc', 'The summer winds are creeping in'), + ('reg_parentemail_title2', 'Email address of parent/guardian:'), + ('error_report_explain', 'An error has occurred, please see the error code above.'), + ('console_noprofile', 'Habbo Profile Not Found'), + ('furni_glass_sofa*3_desc', 'Translucent beauty'), + ('furni_romantique_smalltabl*4_desc', 'Why is one leg different?'), + ('furni_table_plasto_4leg*14_name', 'HC table'), + ('nav_venue_bb_lobby_intermediate_2_name', 'Semi-profs Battle Ball 3'), + ('NUF_playing_games_gamerooms_tutor', 'Click the \'Go\' button to go to the Game Lounge.'), + ('habboclub_require_parent_permission', 'You need to tick the box to say that you are over 14 years or age, \\ror under 14 and have your parent/guardian\'s permission to join Habbo Club. \\rPlease go back and tick the box.'), + ('furni_wooden_screen*1_desc', 'Add an exotic touch to your room'), + ('nav_venue_bb_lobby_intermediate_4/0_desc', ''), + ('furni_glass_sofa*6_name', 'Blue Glass Sofa'), + ('furni_bench_armas_desc', 'To complete the dining set'), + ('furni_barchair_silo*2_name', 'Black Bar Stool'), + ('nav_venue_bb_lobby_expert_6/0_desc', ''), + ('furni_jp_tray2_desc', 'jp_tray2'), + ('furni_val_teddy*3_desc', 'The green bear of friendship'), + ('transaction_system_sms_win_vodafone', 'Vodafone SMS'), + ('furni_glass_sofa_name', 'Glass sofa'), + ('console_online', 'online:'), + ('poster_2004_desc', 'irie!'), + ('x', 'X'), + ('nav_venue_habbo_lido/0_desc', 'Pool is open for swimming and diving!'), + ('furni_soft_sofachair_norja_name', 'iced sofachair'), + ('furni_xmas_cstl_twr_name', 'Ice Castle Tower'), + ('nav_venue_park_name', 'Habbo Gardens'), + ('recycler_info_open', 'Ecotron is the place to visit if you want to recycle your old Furniture. Simply drag the old Furni from your hand to the empty slots below. Recyclable items display the green recyclable tag in your hand. Please note that you must own the Furniture for at least %quarantine_hours% hour before they can be recycled. Recycling takes a total of %total_hours% hours.'), + ('group_window_title', 'Habbo Groups'), + ('pet.saying.eat.dog.4', 'Mmmmm..'), + ('game_chess', 'Chess'), + ('pet.saying.eat.dog.2', 'slurp, slurp, slurp'), + ('roomatic_roomdesc', 'Room description:'), + ('furni_sofa_polyfon*7_desc', 'Green Mode Sofa'), + ('pet.saying.eat.dog.3', 'hrum, umm, umm grrr'), + ('pet.saying.eat.dog.0', 'hrum, hrum, crunch!'), + ('preview_downloading', 'Preview downloading...'), + ('sound_machine_confirm_close_long', 'Are you sure you want to leave the editor without saving the song?'), + ('partner_registration_title', 'Hey, I forgot to mention one thing..'), + ('pet.saying.eat.dog.1', 'crunch, crunch mmmm'), + ('nav_venue_bb_lobby_tournament_12/0_desc', ''), + ('furni_carpet_soft*3_name', 'Soft Wool Rug'), + ('furni_sound_set_56_name', 'RnB Grooves 2'), + ('reg_termslink', 'Terms and Conditions'), + ('wallitem_sw_swords_desc', 'Z for Zorro'), + ('furni_sleepingbag*10_name', 'Khaki Sleeping Bag'), + ('furni_hc_dsk_name', 'Study Desk'), + ('furni_chair_silo*8_desc', 'Keep it simple'), + ('furni_glass_chair*8_name', 'Glass chair'), + ('nav_venue_cafe_ole_name', 'Cafe ole'), + ('furni_sleepingbag*5_desc', 'Ultimate coziness'), + ('opening_hours_text_closed', 'The Hotel has been closed and will be open to the public again at %h%:%m%.'), + ('furni_grunge_bench_desc', 'Laid back seating'), + ('BuddyNotHere', 'Offline'), + ('furni_noob_lamp*5_desc', 'Get the light right where you want it (pink)'), + ('NUH_navigator', 'Use the Navigator to move around. There are literally thousands of rooms to explore!'), + ('poster_1338_name', 'Pedobear Seal of Approval'), + ('furni_queue_tile1*9_name', 'Green Habbo Roller'), + ('furni_habboween_crypt_desc', 'What lurks inside?'), + ('furni_sofachair_silo*9_name', 'Red Area Armchair'), + ('furni_exe_chair_name', 'Executive Sofa Chair'), + ('furni_rare_dragonlamp*6_desc', 'Scary and scorching!'), + ('furni_divider_nor2*3_desc', 'Strong, yet soft looking'), + ('furni_tile_yell_name', 'Floor Tiles'), + ('furni_plant_yukka_name', 'Yukka Plant'), + ('furni_wooden_screen*8_desc', 'Add an exotic touch to your room'), + ('furni_pillar*8_desc', 'All roads lead to Rome'), + ('trading_youoffer', 'You offer:'), + ('furni_marquee*8_desc', 'It\'s both door and a shade!'), + ('furni_pura_mdl4*9_name', 'Red Pura Module 4'), + ('roomatic_congrats', 'Congratulations! You\'re now the proud owner of your own Habbo Hotel room.'), + ('furni_tile_marble_name', 'Marble Tile'), + ('furni_bed_budget*3_desc', 'King sized comfort!'), + ('furni_sound_machine*3_desc', 'Top the Habbo Charts!'), + ('nav_venue_bb_lobby_beginner_10_name', 'Beginners Battle Ball 11'), + ('nav_venue_bb_lobby_tournament_1/0_desc', ''), + ('poster_2000_name', 'Suomen kartta'), + ('furni_solarium_norja*3_name', 'Urban Solarium'), + ('furni_present_gen3_desc', 'What\'s inside?'), + ('furni_glass_stool*4_desc', 'Translucent beauty'), + ('int_update_id', 'Update My Habbo ID >>'), + ('nav_venue_bb_lobby_beginner_8/0_desc', ''), + ('furni_carpet_standard*8_desc', 'Available in a variety of colours'), + ('furni_pillar*1_desc', 'Ancient and stately'), + ('receive_invitation_text', 'invites you his/her room. Accept invitation?'), + ('poll_offer_window', 'Welcome to our poll'), + ('furni_table_plasto_bigsquare*5_desc', 'Hip plastic furniture'), + ('furni_carpet_standard*1_desc', 'Available in a variety of colours'), + ('furni_hologram_name', 'Holopod'), + ('nav_venue_bb_lobby_amateur_desc', 'Amateur battle ball!'), + ('furni_barchair_silo*6_desc', 'Practical and convenient'), + ('furni_divider_nor5_desc', 'Cool cornering for your crib y0!'), + ('purse_vouchers_helpbutton', 'More about vouchers >>'), + ('furni_shelves_norja*6_desc', 'For nic naks and art deco books'), + ('nav_venue_sw_lobby_tournament_5/0_desc', ''), + ('furni_chair_basic*4_desc', 'It\'s a cracking design!'), + ('nav_hidefull', 'Hide Full Rooms'), + ('modtool_ban_computer', 'Ban Computer Also'), + ('furni_gothic_sofa*1_name', 'Gothic Sofa Pink'), + ('furni_carpet_standard*b_name', 'Floor Rug'), + ('queue_line', 'You are queueing right now...'), + ('furni_divider_nor1*6_desc', 'Blue Ice corner'), + ('nav_search_helptext', 'Looking for something? Here you can search other Habbo\'s rooms. Type the room name or the name of the Habbo to search for a room.'), + ('furni_marquee*1_desc', 'It\'s both door and a shade!'), + ('furni_rcandleset_desc', 'Simple but stylish'), + ('nav_room_banned', 'You are banned from this room.'), + ('furni_lamp_armas_name', 'Table Lamp'), + ('catalog_costs', '\\x1 costs \\x2 Credits'), + ('furni_drinks_desc', 'Are you a slob too?'), + ('furni_pura_mdl5*6_name', 'Blue Pura Module 5'), + ('summer_chair_1_desc', 'Gotta get up early to get one!'), + ('furni_prize3_desc', 'A weighty award'), + ('furni_soft_sofa_norja*7_name', 'Rural Iced Sofa'), + ('poster_518_name', 'The Welsh flag'), + ('furni_sofachair_polyfon*8_name', 'Yellow Mode Armchair'), + ('furni_prizetrophy3*3_desc', 'Breathtaking bronze'), + ('nav_venue_sw_lobby_amateur_6_name', 'Snow Slingers Lobby'), + ('furni_stand_polyfon_z_desc', 'Tidy up'), + ('furni_carpet_soft_tut_name', 'Welcome Mat'), + ('console_reject_all', 'Reject All'), + ('month12', 'December'), + ('month11', 'November'), + ('help_topics', 'Help Topics:'), + ('nav_venue_sw_lobby_beginner_8/0_desc', ''), + ('nav_rooms_own', 'Own Room(s)'), + ('reg_pwd_note', 'Choose a password that\'s hard to guess! So, don\'t use ANYONES name, or your favorite colour!'), + ('furni_wooden_screen*4_name', 'Golden Oriental Screen'), + ('nav_venue_sw_lobby_beginner_2/0_desc', ''), + ('furni_pillow*6_desc', 'Puffy, soft and huge'), + ('furni_bed_polyfon_one*4_desc', 'Beige Mode Single Bed'), + ('reg_email_note', 'Please enter your e-mail address, this is important! You\'ll only get customer support and special offers via email, if you enter a valid email address and verify it.'), + ('group_admin', 'Administrator'), + ('furni_scifirocket*8_name', 'Pluto Smoke Machine'), + ('furni_chair_plasto*11_desc', 'Hip plastic furniture'), + ('month10', 'October'), + ('furni_goth_table_name', 'Gothic table'), + ('month05', 'May'), + ('month04', 'April'), + ('nav_modify_maxvisitors', 'Choose maximum number of visitors'), + ('nav_venue_bb_lobby_amateur_2_name', 'Gevorderden Battle Ball 3'), + ('month07', 'July'), + ('habboclub_price1', '30'), + ('month06', 'June'), + ('month01', 'January'), + ('month03', 'March'), + ('month02', 'February'), + ('furni_summer_chair*2_desc', 'Pink'), + ('month09', 'September'), + ('month08', 'August'), + ('furni_bardeskcorner_polyfon*4_desc', 'Beige Mode Bardesk Corner'), + ('furni_tree6_name', 'Flashy Christmas Tree'), + ('furni_arabian_snake_name', 'Ornamental Urn'), + ('reg_verification_incorrectPassword', 'Your password was incorrect'), + ('NUF_visting_rooms_hotelview_tutor', 'Here we go again. This time we are learning how to visit another Habbos room.'), + ('furni_summer_chair*9_desc', 'Got your sunglasses?'), + ('furni_safe_silo_name', 'Safe Minibar'), + ('furni_throne_name', 'Throne'), + ('furni_soft_sofachair_norja*8_desc', 'Yellow Iced Sofachair'), + ('NUF_console_ready_tutor', 'You can now use the Console to find some of your friends, or you can continue the tutorial.'), + ('nav_venue_picnic/0_desc', 'Don\'t forget to grab a carrot or two!'), + ('furni_bardeskcorner_polyfon_name', 'Corner Cabinet/Desk'), + ('game_placeship', 'Place your ships:'), + ('furni_glass_table*7_desc', 'Habbo Club'), + ('poster_13_name', 'BW Skyline Poster'), + ('furni_jp_bamboo_name', 'Bamboo Forest'), + ('furni_plant_bulrush_name', 'Bulrush'), + ('furni_deadduck3_desc', 'With added ectoplasm'), + ('win_purse', 'Habbo Purse'), + ('furni_jp_tray5_name', 'jp_tray5'), + ('furni_hc_tbl_desc', 'Perfect for banquets'), + ('furni_shelves_norja_desc', 'For nic naks and art deco books'), + ('club_desc_3_period', '6 Months (186 days) = 105 Credits'), + ('furni_bed_budget_one*3_name', 'Black Pura Bed'), + ('poster_2_name', 'Carrot Plaque'), + ('furni_solarium_norja*7_desc', 'Fun in the sun!'), + ('poster_2007_name', 'The Father Of Habbo'), + ('gs_header_teams', 'Teams'), + ('furni_divider_poly3*9_desc', 'Border Control!'), + ('gs_button_creategame', 'Create A New Game'), + ('furni_sound_set_42_name', 'Haunted Mansion'), + ('poll_alert_invalid_selection', 'Please select fewer alternatives'), + ('furni_scifirocket*1_name', 'Saturn Smoke Machine'), + ('furni_scifidoor*10_name', 'Violet Spaceship Door'), + ('furni_sound_set_5_desc', 'The dark side of Habbo'), + ('club_confirm_gift_title', 'You have received a Habbo club gift!'), + ('bb_info_gamePrice', 'Play now for just 2 tickets.'), + ('furni_sound_machine*6_name', 'Purple Traxmachine'), + ('wallitem_arabian_swords_desc', 'Not for yielding'), + ('furni_divider_nor2*6_name', 'Blue Iced bar desk'), + ('nav_venue_sw_lobby_expert_0/0_desc', ''), + ('furni_noob_chair*1_name', 'My first Habbo chair'), + ('group_room_link', 'Group\'s room: %room_name% >>>'), + ('sound_machine_playlist', 'Playlist'), + ('nav_venue_bb_arena_2_name', 'Battle Ball Amatöörit'), + ('roomatic_create_error', 'Error in room creation process. Please try again!'), + ('furni_couch_norja*7_desc', 'Two can perch comfortably'), + ('gs_button_spectate', 'Watch Game!'), + ('furni_sofachair_silo*6_desc', 'Blue Area Armchair'), + ('credit_redeem_button', 'Redeem'), + ('furni_valentinescreen_desc', 'Peep through and smile!'), + ('poster_511_name', 'The Dutch flag'), + ('furni_shelves_armas_name', 'Bookcase'), + ('nav_venue_habbo_lido_name', 'Habbo Lido'), + ('furni_bed_polyfon*9_name', 'Red Double Bed'), + ('furni_sofa_silo*9_name', 'Red Area Sofa'), + ('furni_pura_mdl4*6_desc', 'Any way you like it!'), + ('console_mainhelptext', 'You can use the Habbo Console to keep in constant contact with your friends using instant messages.'), + ('wallitem_jp_ninjastars_name', 'Ninja Stars'), + ('ad_note', 'Clicking this advertisement will open a new window'), + ('ph_tickets_choise2', 'Buy 20 Tickets for 6 Credits.'), + ('ph_tickets_choise1', 'Buy 2 Tickets for 1 Credit.'), + ('reg_day', 'Day'), + ('nav_venue_cunning_fox_gamehall/2_name', 'Noughts&Crosses'), + ('nav_venue_sw_lobby_tournament_6_name', 'Tournament Lobby'), + ('furni_noob_lamp*1_name', 'My first Habbo lamp'), + ('furni_petfood1_name', 'Bones Mega Multipack'), + ('furni_table_silo_med*3_name', 'White Coffee Table'), + ('pet.hotwords.jump', 'jump'), + ('furni_sleepingbag*1_name', 'Red Sleeping Bag'), + ('nav_venue_main_lobby/0_desc', 'The heart of Habbo Hotel'), + ('pet_hungry', 'Hunger:'), + ('furni_rare_fan*4_name', 'SUPERLOVE Fan'), + ('furni_sw_table_name', 'sw_table'), + ('furni_CFC_200_moneybag_name', 'Sack of Credits (China)'), + ('room_ask_friend', 'Ask to be a Friend'), + ('furni_bed_polyfon*2_name', 'Black Mode Double Bed'), + ('furni_table_norja_med_desc', 'Elegance embodied'), + ('nav_removerights', 'Reset'), + ('wallitem_hrella_poster_1_name', 'Porthole'), + ('NUF_getting_items_purse_', 'Click this link to open the Habbo Credits page in the website window.'), + ('poster_31_name', 'System of a Ban'), + ('furni_sound_set_24_name', 'Habbo Sounds 4'), + ('furni_chair_basic*7_name', 'chair_basic'), + ('poster_56_name', 'Disco Sign'), + ('furni_rare_dragonlamp*2_name', 'Jade Dragon Lamp'), + ('furni_gothic_stool*4_desc', 'Witches and Warlocks'), + ('furni_sofa_silo*2_name', 'Black Two-Seater Sofa'), + ('furni_grunge_radiator_name', 'Radiator'), + ('nav_venue_bb_lobby_amateur_9_name', 'Gevorderden Battle Ball 10'), + ('summer_chair_4_name', 'White Deck Chair'), + ('furni_sound_set_49_name', 'Club 4'), + ('messenger.email.subject', ''), + ('furni_romantique_chair*3_name', 'Turquoise Romantique Chair'), + ('furni_s_sound_machine*7_desc', 'Sound Machine Red'), + ('furni_table_plasto_round*9_desc', 'Hip plastic furniture'), + ('furni_table_plasto_4leg*7_name', 'Occasional table'), + ('club_confirm_title', 'You are about to subscribe to Habbo Club. Wise choice!'), + ('furni_romantique_pianochair*1_desc', 'Here sat the legend of 1900'), + ('furni_sofa_silo*6_desc', 'Blue Area Sofa'), + ('nav_venue_bb_lobby_tournament_11_name', 'Competitie Battle Ball 12'), + ('furni_rare_icecream*9_desc', 'Virtual bubblegum rocks!'), + ('furni_romantique_divider*1_name', 'Rose Quartz Screen'), + ('NUF_playing_games_room_ruleslink', 'Click me! But only if you want to read the game FAQs in the website.'), + ('furni_chair_silo_name', 'Dining Chair'), + ('furni_sound_set_17_desc', 'Jive\'s Alive!'), + ('dance_choose', 'Choose Dance'), + ('wallitem_industrialfan_name', 'Industrial Turbine'), + ('sound_machine_alert_invalid_song_length', 'Can\'t burn an empty song!'), + ('furni_pura_mdl1*4_desc', 'Any way you like it!'), + ('wallitem_post.it.vd_desc', 'Heart Stickies'), + ('catalog_give_petname', 'Type your pet\'s name in the grey box.'), + ('furni_pura_mdl2*1_name', 'Aqua Pura Module 2'), + ('poster_24_name', 'Hole In The Wall'), + ('win_error', 'Notice!'), + ('furni_chair_plasto*2_desc', 'Hip plastic furniture'), + ('wallitem_xmas_light_desc', 'Xmas light'), + ('furni_rubberchair*1_name', 'Blue Inflatable Chair'), + ('NUF_getting_room_roommatic_details_tutor', 'Give a name to your room, choose a category and add a description. Don\'t worry, you can change it all later.'), + ('furni_divider_poly3*2_desc', 'Black Mode Bardesk Gate'), + ('furni_plant_valentinerose*2_desc', 'Your secret love'), + ('furni_table_norja_med*7_desc', 'For larger gatherings'), + ('furni_carpet_polar_desc', 'For cuddling up on'), + ('nav_venue_sw_lobby_free_8/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('furni_summer_grill*1_name', 'Blue Barbeque Grill'), + ('furni_chair_norja*7_desc', 'Sleek and chic for each cheek'), + ('furni_joulutahti_name', 'Poinsetta'), + ('furni_exe_table_name', 'Executive Desk'), + ('furni_divider_silo3*8_desc', 'Form following function'), + ('furni_gothiccandelabra_name', 'Gothic Candelabra'), + ('transaction_system_bibit', 'Credit card'), + ('nav_venue_tv_studio/0_desc', 'Sponsored by Bobbanet.com'), + ('furni_noob_table*4_desc', 'Lightweight, practical and light blue'), + ('furni_bardesk_polyfon*3_desc', 'Perfect for work or play'), + ('room_info_rated', 'Room rating:'), + ('nav_venue_bb_lobby_beginner_2/0_desc', ''), + ('help_emergency_explanation', 'If you are experiencing a situation which is making you feel uncomfortable or unsafe, please give details below and a member of community staff will reply as soon as possible.'), + ('furni_divider_nor5*8_desc', 'Cool cornering for your crib y0!'), + ('poster_507_name', 'The French Tricolore'), + ('nav_privateRooms', 'Rooms'), + ('furni_pura_mdl2*5_desc', ''), + ('furni_sporttrack3*3_name', 'Sport goal grass'), + ('furni_sound_set_10_desc', 'Made from real Boy Bands!'), + ('furni_chair_plasto*9_desc', 'Hip plastic furniture'), + ('furni_soft_sofa_norja*4_desc', 'Sit back and relax'), + ('furni_s_sound_machine*3_name', 'Sound Machine Green'), + ('reg_spam', 'Yes, I want to get the occasional email from the Hotel Manager.'), + ('shout', 'Shout'), + ('NUF_mini_use_console_read_link', 'Click here to view the message.'), + ('furni_scifidoor*2_desc', 'There out of this world!'), + ('furni_divider_nor3*3_name', 'White Iced Gate'), + ('pet_hung_0', 'Empty'), + ('furni_table_plasto_square*1_name', 'Occasional Table'), + ('pet_hung_6', 'Stuffed'), + ('pet_hung_5', 'Full'), + ('bb_user_skill', 'Skill Level: \\x\\rScore: \\y'), + ('login_welcome', 'Welcome'), + ('pet_hung_2', 'Rumbling'), + ('pet_hung_1', 'Hungry'), + ('poster_20_name', 'Bars'), + ('pet_hung_4', 'Satisfied'), + ('pet_hung_3', 'Peckish'), + ('Alert_WrongNameOrPassword', 'Wrong name or password - please try again!'), + ('furni_romantique_pianochair*5_desc', 'I can feel air coming through...'), + ('furni_carpet_armas_desc', 'Adds instant warmth'), + ('console_removefriend_2', 'from your Friends List?'), + ('console_removefriend_1', 'Are you sure you want to remove'), + ('furni_rare_parasol*0_name', 'Green Parasol'), + ('furni_sound_set_38_name', 'Rock 6'), + ('NUF_mini_meet_people_room_wave', 'These buttons let you wave and dance. Click on your Habbo at anytime to see these buttons.'), + ('gs_skill_changed_header', 'Congratulations!'), + ('furni_chair_plasty*7_name', 'Plastic Pod Chair'), + ('furni_safe_silo*5_desc', 'Totally shatter-proof!'), + ('furni_divider_silo1*3_name', 'White Corner Shelf'), + ('nav_venue_hallway_ii_name', 'Hallway II'), + ('cam_release.help', 'Cancel Photo'), + ('nav_venue_bb_lobby_amateur_14/0_desc', ''), + ('habbo_tv_title', 'Widescreen Habbovision'), + ('purse_noevents', 'You haven\'t made any transactions yet. Click the button below to find out how to get Habbo Credits.\\rRemember: you must ask your parents permission before you buy Habbo Credits.'), + ('furni_pura_mdl2*8_name', 'yellow pura module 2'), + ('furni_CFC_10_coin_bronze_name', 'Bronze Coin (China)'), + ('sound_machine_song_remove', 'Remove song'), + ('modtool_choose_length', 'Choose Length:'), + ('sound_machine_turn_off', 'Switch Off'), + ('furni_pura_mdl1*8_desc', ''), + ('furni_spyro_desc', 'The stuff of legend'), + ('furni_pillow*2_name', 'Red Silk Pillow'), + ('furni_table_armas_desc', 'For informal dining'), + ('furni_tree3_desc', 'Any presents under it yet?'), + ('object_displayer_link_looks', 'Change avatar looks'), + ('furni_barrier*2_name', 'White Road Barrier'), + ('furni_gothic_chair*5_desc', 'The dark side of Habbo'), + ('furni_divider_nor4*4_name', 'Urban Iced Shutter'), + ('furni_camera_name', 'Camera'), + ('next_arrows', 'Next >>'), + ('furni_sound_set_60_desc', 'Love and affection!'), + ('furni_bed_polyfon_girl_one_name', 'Single Bed'), + ('NUF_mini_meet_people_user_chatfield', 'Start typing here and press \'Enter\' to chat with others.'), + ('successfully_purchase_gift_for', 'Successfully purchased gift for user %user%!'), + ('poster_49_desc', 'All that glitters...'), + ('furni_glass_table*3_name', 'Glass table'), + ('furni_divider_silo3*5_desc', 'Pink Area Gate'), + ('furni_divider_arm3_name', 'Gate (lockable)'), + ('furni_table_plasto_4leg*3_name', 'Round Dining Table'), + ('roomatic_roomnumber', 'Room number:'), + ('nav_venue_bb_lobby_beginner_5_name', 'Beginners Battle Ball 6'), + ('reg_nameAndPassTooSimilar', 'Your name and password are too similar'), + ('nav_venue_theatredrome_easter_name', 'Theatredrome Easter'), + ('nav_venue_bb_lobby_beginner_11/0_desc', ''), + ('furni_fireplace_polyfon_name', 'Fireplace'), + ('queue_set.e1.info', 'There are %e1% Habbos in front of you in the queue.'), + ('more_info_link', 'Redeem Now'), + ('furni_bed_polyfon*6_desc', 'Blue Mode Double Bed'), + ('furni_rare_icecream*5_name', 'Vanilla Ice Cream Machine'), + ('poster_500_name', 'Union Jack'), + ('furni_chair_norja*3_name', 'White Iced Chair'), + ('furni_sound_set_31_name', 'Dance 3'), + ('furni_pura_mdl3*5_name', 'beige pura module 3'), + ('furni_sporttrack2*3_desc', 'null'), + ('furni_sound_set_46_desc', 'De bada bada bo!'), + ('poster_9_name', 'Rainforest Poster'), + ('furni_romantique_pianochair*4_name', 'Amber Piano Stool'), + ('poster_515_desc', 'Waved by Swedes everywhere'), + ('furni_scifidoor*9_desc', 'There out of this world!'), + ('furni_chair_plasty*3_name', 'Plastic Pod Chair'), + ('furni_table_plasto_round*5_name', 'Round Dining Table'), + ('furni_one_way_door*9_desc', 'One at a time!'), + ('furni_calippo_desc', 'Basic model'), + ('furni_footylamp_desc', 'Can you kick it?'), + ('furni_one_way_door*2_desc', 'One way! The HC way!'), + ('furni_arabian_tray4_desc', 'Sweet, juicy and ripe'), + ('furni_divider_nor3*7_name', 'Rural Iced gate'), + ('furni_couch_norja*3_name', 'White Iced Bench'), + ('furni_pillow*9_name', 'Green Wooly Pillow'), + ('game_chooseside', 'Choose your side'), + ('start', 'Start'), + ('furni_toy1*4_desc', 'it\'s bouncy-tastic'), + ('roomevent_host', 'Host:'), + ('nav_venue_rooftop_rumble_name', 'Rooftop Rumble'), + ('nav_venue_bb_lobby_expert_0/0_desc', ''), + ('nav_venue_rooftop_rumble_ii/0_desc', 'Are you ready?'), + ('error_report_trigger_message', 'Last message ID'), + ('furni_sofachair_silo*2_name', 'Black Armchair'), + ('furni_noob_chair*5_desc', 'Lightweight, practical, with pink stripes'), + ('pet_frnd_0', 'Hostile'), + ('furni_noob_rug*3_name', 'My first Habbo rug'), + ('pet_frnd_2', 'Suspicious'), + ('pet_frnd_1', 'Angry'), + ('furni_scifiport*6_desc', 'Energy beams. No trespassers!'), + ('pet_frnd_4', 'Calm'), + ('pet_frnd_3', 'Cool'), + ('pet_frnd_6', 'Warm'), + ('pet_frnd_5', 'Friendly'), + ('pet_frnd_8', 'Loving'), + ('credit_trade_value', 'Includes credit furnis worth %value% credits.'), + ('pet_frnd_7', 'Affectionate'), + ('pet_frnd_9', 'Loyal'), + ('NUF_getting_items_purse_tutor', 'Your Purse tells you how many Habbo Credits you have. If you have a voucher code you can redeem it here by clicking the \'Vouchers\' button.'), + ('furni_chair_norja*6_name', 'Blue Chair'), + ('sound_machine_alert_machine_full', 'You already have 4 Traxpacks loaded. Eject one before adding a new Traxpack.'), + ('nav_venue_club_mammoth/0_desc', 'Monumental and magnificent. For Habbo Club members only.'), + ('NUF_getting_room_hand_tutor', 'This is your hand. It contains all your furniture. I have given you a rug so that you can place it in your room- click and drag it to set it down.'), + ('reg_check_name', 'Name'), + ('furni_glass_stool*7_name', 'Green Glass Stool'), + ('poster_504_name', 'The Bundesflagge'), + ('poster_42_desc', 'Not something you want to run into'), + ('pet.saying.sleep.dog.6', '*dreaming*'), + ('pet.saying.sleep.dog.5', 'Zzzzz wuff! zzzzz'), + ('pet.saying.sleep.dog.4', 'hrrrrr...murrmm..'), + ('furni_pura_mdl4*2_desc', 'Any way you like it!'), + ('pet.saying.sleep.dog.3', 'bzz.. oof oof'), + ('furni_sofa_silo*5_name', 'Pink Area Sofa'), + ('pet.saying.sleep.dog.2', 'hrrr.. hrrr'), + ('pet.saying.sleep.dog.1', 'bzz.. bzzzzz'), + ('furni_petfood4_name', 'T-Bones Mega Multipack'), + ('nav_venue_club_mammoth_name', 'Club Mammoth'), + ('ph_keys_dive', 'Diving moves:'), + ('furni_noob_table*3_name', 'My first Habbo table'), + ('furni_romantique_divan*5_desc', 'Is that a cape hanging there?'), + ('furni_table_plasto_round*8_name', 'Round Dining Table'), + ('furni_rare_fan*1_name', 'Blue Powered Fan'), + ('reg_forcedupdate2', 'Update your Habbo info'), + ('furni_table_plasto_square*4_name', 'Square Dining Table'), + ('NUF_playing_games', 'Playing games'), + ('furni_prizetrophy2*2_name', 'Duck trophy'), + ('reg_forcedupdate3', 'The Habbo Hotel management requires all Habbos to read and agree to the service Terms and Conditions. It won\'t take long.\\rJust go through the registration, check your info and agree to the new terms. Thank you!'), + ('nav_venue_sw_lobby_tournament_2_name', 'Tournament Lobby'), + ('furni_carpet_standard*4_name', 'Floor Rug'), + ('furni_s_sound_machine*6_name', 'Sound Machine Purple'), + ('furni_prizetrophy5*1_desc', 'Glittery gold'), + ('furni_table_plasto_square_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_beginner_2_name', 'Beginners Battle Ball 3'), + ('furni_rubberchair*4_name', 'Ocean Inflatable Chair'), + ('furni_divider_poly3*5_desc', 'Keep the Pink in!'), + ('furni_arabian_teamk_name', 'Tea Maker'), + ('room_name', 'Room:'), + ('nav_venue_chill/0_desc', 'Come chill in the Zen Garden!'), + ('furni_summer_grill*4_name', 'Green Barbeque Grill'), + ('poster_1001_desc', 'even walls have ears'), + ('furni_rare_icecream*8_name', 'Peppermint Ice Cream Machine'), + ('furni_safe_silo*9_desc', 'Totally shatter-proof!'), + ('sound_machine_song_save', 'Save song'), + ('NUF_getting_room_navigator_ownrooms', 'Click the \'Own Room(s)\' tab to see your rooms.'), + ('furni_gothic_chair*1_desc', 'The dark side of Habbo'), + ('furni_table_plasto_square*8_name', 'Square Dining Table'), + ('furni_safe_silo*2_desc', 'Totally shatter-proof!'), + ('roomevent_create_description', 'Describe your event'), + ('purse_vouchers_success', 'Voucher was successfully redeemed. You have the Credits.'), + ('furni_gothic_carpet2_name', 'Dungeon Floor'), + ('furni_sofa_polyfon*3_name', 'White Two-seater Sofa'), + ('furni_romantique_tray2_name', 'Treats Tray'), + ('nav_modify_doorstatus_locked', 'Locked (visitors have to ring the bell)'), + ('NUF_visiting_rooms_categorylist_open', 'Click the \'Open\' button to open a category.'), + ('room_doorbell', 'Rings the doorbell - Open the door?'), + ('furni_sound_set_45_name', 'Lost_Beatness'), + ('nav_deleteroom', 'Delete'), + ('furni_barchair_silo_name', 'Bar Stool'), + ('furni_chair_plasto*5_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_tournament_14_name', 'Competitie Battle Ball 15'), + ('furni_pura_mdl1*1_desc', 'Any way you like it!'), + ('furni_rare_snowrug_desc', 'Chilled Elegance'), + ('poster_35_desc', 'The Hotel\'s girlband. Dream on!'), + ('furni_glass_stool_desc', 'Translucent beauty'), + ('furni_rare_fan*8_name', 'Habbo Wind Turbine'), + ('furni_menorah_desc', 'Light up your room'), + ('furni_table_silo_small*7_desc', 'Green Area Occasional Table'), + ('furni_divider_silo1*7_name', 'Green Area Corner Shelf'), + ('furni_romantique_divan*1_desc', 'null'), + ('furni_table_plasto_round*1_name', 'Round Dining Table'), + ('reg_changeEmail', 'Change your email'), + ('hobba_mark_normal', 'Send To Helpers'), + ('nav_venue_bb_lobby_tournament_8/0_desc', ''), + ('ph_tickets_have2', 'Tickets'), + ('nav_venue_sw_lobby_intermediate_0/0_desc', ''), + ('ph_tickets_have1', 'You Have'), + ('furni_bardesk_polyfon*7_desc', 'Green Mode Bardesk'), + ('console_inprivateroom', 'In A Guest Room'), + ('furni_sound_set_35_name', 'Dance 6'), + ('GoAway', 'Leave The Room'), + ('room_kick', 'Kick'), + ('furni_rubberchair*8_name', 'Black Inflatable Chair'), + ('poster_6_name', 'Abstract Poster'), + ('hubu_t1_3', ''), + ('NUF_meeting_people', 'Meeting people'), + ('nav_venue_bb_lobby_amateur_4/0_desc', ''), + ('nav_venue_bb_game/0_name', 'Battle Ball Arena'), + ('furni_pudding_name', 'Christmas Pudding'), + ('furni_tile_red_name', 'Floor Tiles'), + ('catalog_typeurname', 'Type your greetings here\\r(don\'t forget to put your name!):'), + ('furni_house2_name', 'Gingerbread House'), + ('hubu_t1_1', 'Kaupunkien pu_t2_2=Katso onko kotisi l_1=Tietoa Hubusta'), + ('furni_glass_table*4_desc', 'Translucent beauty'), + ('hubu_t1_2', ''), + ('nav_venue_club_massiva/1_name', 'Chill-out Room'), + ('furni_scifiport*2_desc', 'Get in the ring!'), + ('furni_traffic_light*4_name', 'Yellow Traffic Light'), + ('furni_tree2_name', 'Old Christmas Tree'), + ('furni_noob_stool*4_name', 'My first Habbo stool'), + ('done', 'Done'), + ('furni_goodie1*1_name', 'Marzipan Man'), + ('nav_venue_bb_lobby_tournament_18/0_desc', ''), + ('poster_17_name', 'Butterfly Cabinet 1'), + ('furni_summer_chair*5_name', 'Deck Chair'), + ('furni_prizetrophy*1_name', 'Classic trophy'), + ('furni_easterduck_desc', 'Can you tell what it is yet?'), + ('furni_barrier*3_desc', 'No trespassing, please!'), + ('furni_table_plasto_bigsquare*1_name', 'Square Dining Table'), + ('club_general_infolink', 'More Info About Habbo Club >>'), + ('furni_chair_silo*4_name', 'Beige Silo Dining Chair'), + ('roomatic_givename', 'Give your room a name!'), + ('furni_rare_icecream*1_name', 'Blueberry Ice Cream Machine'), + ('roomatic_open', 'Door open'), + ('NUF_getting_items_catalogue_tutor', 'Big! You can browse the products by clicking on the categories. There are loads of different types of furniture to decorate your room.'), + ('furni_marquee*4_name', 'Yellow Marquee'), + ('furni_bed_polyfon_one*7_name', 'Green Mode Single Bed'), + ('gs_button_go_started', 'Watch'), + ('poster_27_name', 'Holly Bundle 3'), + ('furni_divider_nor2*7_desc', 'No way through'), + ('furni_glass_chair*5_desc', 'Translucent beauty'), + ('nav_venue_basement_lobby_name', 'Basement Lobby'), + ('pick_furniture', 'Put Furni In Hand'), + ('nav_venue_bb_lobby_beginner_18/0_desc', ''), + ('furni_pura_mdl2*4_name', 'White Pura Module 2'), + ('club_status_title', 'You are currently a member of Habbo Club.'), + ('furni_rare_elephant_statue_name', 'Golden Elephant'), + ('furni_toy1*1_desc', 'it\'s bouncy-tastic'), + ('reg_doneheader', 'Congratulations!\\rYou\'re a Habbo!'), + ('furni_present_gen6_name', 'Gift'), + ('furni_noob_chair*2_desc', 'Lightweight, practical, with dark blue stripes'), + ('furni_sofachair_silo*5_name', 'Pink Area Armchair'), + ('BuddyNow', 'now:'), + ('furni_pura_mdl5*3_desc', 'Any way you like it!'), + ('furni_prizetrophy6*1_name', 'Champion trophy'), + ('BuddyEntry', 'On Hotel View'), + ('furni_scifiport*9_desc', 'Energy beams. No trespassers!'), + ('furni_table_polyfon_small_desc', 'For serving a stylish latte'), + ('furni_exe_rug_name', 'Executive Rug'), + ('nav_venue_the_dirty_duck_pub_name', 'The Dirty Duck Pub'), + ('nav_venue_bb_lobby_beginner_9_name', 'Beginners Battle Ball 10'), + ('nav_venue_sw_lobby_beginner_5_name', 'Snow Rookies Lobby'), + ('furni_pura_mdl5*2_name', 'Pink Pura Module 5'), + ('furni_bardeskcorner_polyfon*7_desc', 'Green Mode Bardesk Corner'), + ('alert_donate_content', 'The other Habbo has not put anything into the trade. Are you sure you want to give away your furni?'), + ('furni_hc_rllr_name', 'HC Rollers Set'), + ('furni_divider_nor1_desc', 'Looks squishy, but isn\'t'), + ('furni_nouvelle_trax_desc', ''), + ('wallitem_jp_sheet3_name', 'jp_sheet3'), + ('furni_hyacinth2_name', 'Blue Hyacinth'), + ('furni_sound_machine_name', 'Sound Machine'), + ('console_getmessage_sender', 'Sender:'), + ('furni_sandrug_name', 'Tropical Beach Rug'), + ('nav_updatenote_header', 'Note!'), + ('furni_pillar*4_desc', 'From the time of the Kick Warz'), + ('furni_waterbowl*1_name', 'Red Water Bowl'), + ('furni_grand_piano*5_name', 'Onyx Grand Piano'), + ('furni_redhologram_name', 'Holo-girl'), + ('sound_machine_alert_playlist_full', 'Could not save playlist! Playlists can have only %count% songs.'), + ('nav_rooms_search', 'Search'), + ('nav_venue_cunning_fox_gamehall/5_name', 'Poker'), + ('nav_venue_habbo_lido_ii_name', 'Habbo Lido II'), + ('furni_barchair_silo*9_desc', 'Practical and convenient'), + ('pet_nature', 'Nature:'), + ('furni_wood_tv_name', 'Large TV'), + ('poster_2008_desc', 'Once every four Habbo years!'), + ('poster_38_desc', 'For really TOUGH Habbos!'), + ('nav_venue_bb_lobby_expert_0_name', 'Expert'), + ('furni_chair_plasto*14_desc', 'Aqua chair'), + ('furni_queue_tile1*6_name', 'Blue Habbo Roller'), + ('poster_522_name', 'The flag of Japan'), + ('furni_chair_basic*3_name', 'Black Pura Egg Chair'), + ('nav_venue_pizza_desc', 'Tunnelmallinen pizzapaikka kiireettömään nautiskeluun.'), + ('furni_jp_tray6_desc', 'jp_tray6'), + ('furni_hc_btlr_desc', 'Your personal caretaker'), + ('furni_song_disk_desc', 'Burn, baby burn'), + ('furni_deadduck2_name', 'Dead Duck 2'), + ('furni_statue_name', 'Cupid Statue'), + ('furni_scifirocket*5_name', 'Uranus Smoke Machine'), + ('nav_gobutton', 'Go'), + ('recycler_furni_not_recyclable', 'This Furniture cannot be recycled. Please only use Furniture that has the recyclable tag in your hand.'), + ('furni_gothic_sofa*5_name', 'Green Gothic Sofa'), + ('furni_sound_set_32_desc', 'Piano concert set'), + ('furni_chair_plasto*10_name', 'Chair'), + ('nav_venue_bb_lobby_tournament_2_name', 'Competitie Battle Ball 3'), + ('furni_grand_piano*1_desc', 'Turquoise Grand Piano'), + ('buddyremove_windowheader', 'Your friends list is full.'), + ('furni_pillar*0_name', 'Greek Pillar'), + ('gs_title_countdown', 'Game Is About To Begin'), + ('furni_glass_sofa*3_name', 'Glass sofa'), + ('furni_hc_crtn_desc', 'Topnotch privacy protection'), + ('furni_waterbowl*5_desc', 'Aqua unlimited'), + ('furni_table_silo_small*4_desc', 'Beige Area Occasional Table'), + ('furni_jp_tray2_name', 'jp_tray2'), + ('furni_rare_moonrug_desc', 'Desolation rocks!'), + ('furni_val_teddy*3_name', 'Green Share Bear'), + ('furni_sleepingbag*10_desc', 'Ultimate coziness'), + ('furni_bar_polyfon_desc', 'You naughty Habbo!'), + ('furni_sofachair_polyfon*2_desc', 'Black Mode Armchair'), + ('furni_exe_sofa_name', 'Executive 3-Seater Sofa'), + ('furni_divider_silo1*4_desc', 'Beige Area Corner Shelf'), + ('poster_2004_name', 'Rasta Poster'), + ('furni_bench_armas_name', 'Bench'), + ('furni_soft_sofachair_norja_desc', 'Soft iced sofachair'), + ('nav_venue_bb_lobby_beginner_14_name', 'Beginners Battle Ball 15'), + ('gs_button_rejoin', 'Play again!'), + ('furni_marquee*8_name', 'Ultramarine Marquee'), + ('furni_tile_marble_desc', 'Slick sophistication; now 10% off!'), + ('hubu_info_url_1', 'http://www.habbohotel.co.uk/habbo/en/help/12'), + ('console_requests', 'Friend Request(s)'), + ('furni_sleepingbag*4_name', 'Army Sleeping Bag'), + ('furni_plant_yukka_desc', 'Easy to care for'), + ('NUF_getting_room_own_rooms_createroom', 'Empty? That\'s because you don\'t have any rooms yet. If it isn\'t empty then you already have made a room, which makes me wonder...'), + ('furni_glass_sofa*6_desc', 'Translucent beauty'), + ('ph_exit', 'Exit In Normal Clothes'), + ('pet_race_0_024', 'Black-eyed Boxer'), + ('furni_marquee*7_name', 'Purple Marquee'), + ('pet_race_0_023', 'Dotty Dalmatian'), + ('recycler_info_timeout', 'Your recycling was completed, but you did not accept it in time. Please press the cancel button below to have your recyclable items restored to your hand. To recycle these items you will need to begin the process again.'), + ('pet_race_0_022', 'Schnitzel Snatcher'), + ('hubu_info_url_2', 'http://www.talktofrank.com/'), + ('pet_race_0_021', 'Loyal Labrador'), + ('nav_venue_snowwar_lobby/0_desc', 'Snow Storm LobbyCome and be a Snow Stormer!'), + ('pet_race_0_020', 'Patchy Pup'), + ('furni_chair_plasto*8_name', 'Chair'), + ('furni_sofachair_silo*9_desc', 'Red Area Armchair'), + ('nav_venue_bb_lobby_beginner_17/0_desc', ''), + ('furni_hc_dsk_desc', 'For Habbo scholars'), + ('furni_wooden_screen*8_name', 'Night Blue Oriental Screen'), + ('gs_lounge_skill_no_min', 'No minimum'), + ('summer_chair_8_name', 'Yellow Deck Chair'), + ('gs_score_tie', 'The game ended in a tie!'), + ('nav_people', 'Who\'s in here?'), + ('furni_gothic_sofa*2_desc', 'Stylish seating for two'), + ('furni_summer_chair*8_name', 'Yellow Deck Chair'), + ('roomatic_roomname', 'Room name:'), + ('furni_ham_desc', 'Tuck in'), + ('nav_venue_star_lounge_desc', 'Is there a VIP visitor in the hotel?'), + ('furni_bardeskcorner_polyfon*3_name', 'White Corner Desk'), + ('gs_specnum', 'Number of spectators: \\x'), + ('furni_bed_budget*3_name', 'Black Pura Double Bed'), + ('furni_shelves_norja*6_name', 'Blue Bookcase'), + ('partner_registration_link', 'Finish registration'), + ('furni_pillar*1_name', 'Pink Marble Pillar'), + ('reg_olderage', 'I am 11 or older'), + ('furni_glass_stool*4_name', 'Glass stool'), + ('back', 'Back'), + ('furni_tile_yell_desc', 'In a choice of colours'), + ('club_confirm_text3', 'Buy more and pay less: 6 Months (186 days) of Habbo Club cost only 105 Credits. You have %credits% credits in your Purse.\\r\\r After buying the membership, you will immediately be part of the Habbo VIP Community.'), + ('furni_sofa_silo_desc', 'Cushioned, understated comfort'), + ('club_confirm_text1', '1 Habbo Club Month (31 days) costs 25 Credits. You have %credits% Credits in your Purse.\\r\\r After buying the membership, you will immediately be part of the Habbo VIP Community.'), + ('club_confirm_text2', 'Buy more and pay less: 3 Months (93 days) of Habbo Club cost only 60 Credits. You have %credits% credits in your Purse.\\r\\r After buying the membership, you will immediately be part of the Habbo VIP Community.'), + ('furni_carpet_legocourt_name', 'Basketball Court'), + ('furni_present_gen3_name', 'Gift'), + ('furni_sound_set_2_desc', 'Get the party started!'), + ('furni_barchair_silo*6_name', 'Blue Bar Stool'), + ('furni_arabian_bigtb_name', 'Amanjena Table'), + ('interface_icon_catalog', 'Catalogue, furnishing your room'), + ('furni_hologram_desc', 'As if by magic...'), + ('nav_venue_sw_lobby_expert_1/0_desc', ''), + ('furni_carpet_standard*1_name', 'Floor Rug'), + ('nav_owner', 'Owner'), + ('furni_glass_chair*2_desc', 'Translucent beauty'), + ('furni_rcandleset_name', 'Red Candle Plate'), + ('furni_divider_nor1*6_name', 'Blue Ice corner'), + ('nav_private_helptext_hd', 'Rooms'), + ('furni_sound_set_27_name', 'Groove 2'), + ('furni_drinks_name', 'Empty Cans'), + ('pet.saying.eat.cat.0', 'mmm...thumm, thumm'), + ('gs_title_nextround', 'Next game...'), + ('pet.saying.eat.cat.1', 'lap, lap, lap, lap'), + ('furni_scifirocket*9_desc', 'Something fishy is going on...'), + ('pet.saying.eat.cat.2', '*munch, munch*'), + ('pet.saying.sleep.dog.0', 'zzZZZzzz'), + ('furni_noob_lamp*4_name', 'My first Habbo lamp'), + ('nav_venue_sw_lobby_beginner_8_name', 'Snow Rookies Lobby'), + ('nav_venue_library/0_desc', 'Time to catch up on some studying'), + ('camera_dialog_open', 'Shoot'), + ('furni_lamp_armas_desc', 'Ambient lighting is essential'), + ('buddyremove_pleasewait', 'Please wait a second...'), + ('friend_request_options', 'Advanced options.'), + ('transaction_system_web_internal', 'Housekeeping purchase'), + ('furni_rare_dragonlamp*5_name', 'Elf Green Dragon Lamp'), + ('furni_bar_chair_armas_desc', 'The ultimate recycled furniture'), + ('room_ignore', 'Shutup'), + ('poster_518_desc', 'A fiery dragon for your wall'), + ('furni_soft_sofa_norja*7_desc', 'Sit back and relax'), + ('object_displayer_show_tags', 'Show tags'), + ('furni_goth_table_desc', 'The dark side of Habbo'), + ('club_txt_changesubscr', 'Change subscription'), + ('Alert_RememberSetYourPassword', 'Please check your password'), + ('reg_verification_checking', 'Checking...'), + ('furni_silo_studydesk_desc', 'For the true Habbo Scholars'), + ('room_give_rights', 'Give rights'), + ('furni_CF_50_goldbar_name', 'Gold Bar'), + ('furni_rom_lamp_name', 'Crystal Lamp'), + ('furni_sofachair_polyfon*8_desc', 'Yellow Mode Armchair'), + ('furni_deadduck3_name', 'Dead Duck 3'), + ('furni_bed_polyfon_one*4_name', 'Beige Mode Single Bed'), + ('furni_noob_stool*1_desc', 'Unfold me and take the weight off (orange)'), + ('furni_stand_polyfon_z_name', 'Shelf'), + ('furni_prize3_name', 'Bronze Trophy'), + ('club_status_text', 'Here you can see your Habbo Club membership status, number of elapsed months, pre-ordered months and status of the ongoing month.'), + ('furni_table_plasto_bigsquare*9_desc', 'Hip plastic furniture'), + ('furni_wooden_screen*4_desc', 'Add an exotic touch to your room'), + ('furni_sound_set_52_name', 'Christmas Party'), + ('furni_CF_1_coin_bronze_name', 'Bronze Coin'), + ('furni_tile_brown_name', 'Red Tile'), + ('nav_venue_bb_lobby_intermediate_5/0_desc', ''), + ('nav_venue_picnic/0_name', 'Picnic Garden'), + ('furni_sound_set_50_desc', 'The harder generation'), + ('furni_lamp2_armas_name', 'Lodge Candle'), + ('registration_disabled_text', 'You can\'t create new Habbos at the moment. Please try again [some date]..'), + ('catalog_selectproduct', 'Select product:'), + ('transaction_system_sms_telia', 'Telia'), + ('nav_venue_bb_lobby_intermediate_5_name', 'Semi-profs Battle Ball 6'), + ('furni_christmas_sleigh_name', 'Winter Sleigh'), + ('furni_scifirocket*8_desc', 'From a space far, far away!'), + ('furni_bed_budget*9_name', 'Red Pura Double Bed'), + ('poster_2000_desc', 'Suomen kartta'), + ('help_emergency_whathappens', 'A member of community staff will investigate the situation and take appropriate action. This may include sending you a response with advice on dealing with your issue.'), + ('purse_coins', 'Habbo Credits'), + ('furni_marquee*5_desc', 'It\'s both door and a shade!'), + ('club_txt_whatis', 'What is Habbo Club?'), + ('furni_present_gen2_name', 'Gift'), + ('trading', 'Trading'), + ('furni_sofa_silo*9_desc', 'Red Area Sofa'), + ('furni_summer_chair*9_name', 'Red Deck Chair'), + ('furni_shelves_armas_desc', 'For all those fire-side stories'), + ('purse_buy_coins', 'Buy Credits'), + ('room_confirmPlace', 'Are you sure?'), + ('furni_queue_tile1*3_desc', 'The power of movement'), + ('furni_soft_sofachair_norja*8_name', 'Yellow Iced Sofachair'), + ('furni_arabian_snake_desc', 'Beware the snake!'), + ('nav_venue_sw_lobby_tournament_6/0_desc', ''), + ('NUF_about_hotel', 'What\'s Habbo about?'), + ('furni_bardeskcorner_polyfon_desc', 'Tuck it away'), + ('furni_bardeskcorner_polyfon*4_name', 'Beige Mode Bardesk Corner'), + ('poster_13_desc', 'Arty black and white'), + ('nav_venue_bb_lobby_beginner_9/0_desc', ''), + ('nav_modify_nameshow', 'Show your name in the room info'), + ('NUF_mini_use_console_read_next', 'Click \'OK\' to mark message as read.'), + ('poster_1005_desc', 'The muscly movie hero'), + ('wallitem_jp_sheet2_name', 'jp_sheet2'), + ('furni_xmas_cstl_gate_desc', 'Let that icy draft out!'), + ('NUF_groups_url', 'http://d16-1.web.varoke.net/home/group-tutorial'), + ('furni_jp_irori_name', 'Irori'), + ('furni_jp_bamboo_desc', 'Watch out for pandas!'), + ('furni_christmas_reindeer_name', 'Reindeer'), + ('furni_glass_chair*4_name', 'Glass chair'), + ('furni_jp_tray5_desc', 'jp_tray5'), + ('furni_table_plasto_4leg*4_desc', 'Hip plastic furniture'), + ('NUF_getting_items_catalogue_purse', 'Click to open your Purse and find out how to get some Habbo Credits . You can use these to buy stuff!'), + ('furni_hc_tbl_name', 'Nordic Table'), + ('furni_bed_budget_one*6_name', 'Blue Pura Bed'), + ('furni_solarium_norja*7_name', 'Rural Solarium'), + ('console_newmessages', 'New Message(s)'), + ('poster_2_desc', 'Take pride in your veg!'), + ('furni_xmas_cstl_twr_desc', 'All I see from up here is snow!'), + ('hubu_info', 'Welcome to the FRANK Infobus! For the next three months FRANK advisors who know a lot about drugs, their effects and the risks involved, will be stepping aboard the Infobus to offer advice and support to any Habbo that wants to visit the bus. For more information click the link below:'), + ('furni_bardesk_polyfon*6_name', 'Blue Mode Bardesk'), + ('furni_summer_pool*3_name', 'Green Summer Pool'), + ('furni_pura_mdl3*8_name', 'yellow pura module 3'), + ('furni_valentinescreen_name', 'Holiday Romance'), + ('furni_rare_beehive_bulb*1_desc', 'A honey-hued glow'), + ('gs_link_gamerules', 'Game Rules'), + ('nav_venue_bb_lobby_tournament_11/0_desc', ''), + ('sound_machine_song_info', 'Song Info'), + ('wallitem_arabian_swords_name', 'Ancestral Scimitars'), + ('furni_one_way_door*6_desc', 'One way! The HC way!'), + ('furni_table_plasto_round*2_desc', 'Hip plastic furniture'), + ('credit', 'Credit'), + ('gs_lounge_skill_no_max', 'Infinite'), + ('furni_wall_china_desc', 'For your great wall'), + ('NUF_visiting_rooms_roomlist_add to fav', 'After clicking on a room you can click this button here to add it to favourites.'), + ('furni_carpet_polar*3_name', 'Yellow Bear Rug'), + ('poster_46_desc', 'Twinkle, twinkle'), + ('furni_petfood1_desc', 'Fantastic 20% Saving!'), + ('url_nobalance', 'http://%predefined%/credits?'), + ('furni_sofachair_silo*6_name', 'Blue Area Armchair'), + ('furni_noob_chair*1_desc', 'Lightweight, practical and yellow'), + ('nav_venue_bb_lobby_expert_7/0_desc', ''), + ('furni_pura_mdl1*7_name', 'Green Pura Module 1'), + ('furni_table_silo_small*6_name', 'Blue Area Occasional Table'), + ('club_thanks_title', 'Congratulations! You are now a member of Habbo Club.'), + ('furni_legotrophy_name', 'Basketball Trophy'), + ('roomatic_createyrown', 'Create Your Own Room'), + ('console_report_remove', 'Remove'), + ('furni_sound_set_42_desc', 'Bumps and Chills'), + ('furni_divider_nor5*5_desc', 'Cool cornering for your crib y0!'), + ('furni_rare_icecream*2_desc', 'Virtual pistachio rocks!'), + ('furni_pura_mdl4*6_name', 'Blue Pura Module 4'), + ('club_button_close', 'Close Window'), + ('wallitem_md_can_name', 'Bubble Juice Can'), + ('furni_prizetrophy7_desc', 'Palkinto'), + ('nav_venue_cunning_fox_gamehall/2_desc', 'Keep your head down, it\'s bombs away'), + ('poster_28_desc', '10 x Silver Tinsel'), + ('furni_rare_dragonlamp*2_desc', 'Oriental beast of legends'), + ('furni_glass_sofa*2_name', 'Glass sofa'), + ('modtool_hours', 'Hours'), + ('nav_venue_emperors_name', 'Emperor\'s hall'), + ('catalog_buyingSuccesfull', 'Buying Successful!'), + ('console_concurrency_error', 'There was a concurrency error while modifying friend list'), + ('furni_table_silo_med*3_desc', 'Wipe clean and unobtrusive'), + ('furni_sleepingbag*8_desc', 'Ultimate coziness for SnowStorm winners'), + ('poster_508_desc', 'The flag of Spain'), + ('furni_goodie1*2_desc', 'Crunchy Dog Treat'), + ('nav_venue_sw_lobby_free_3/0_desc', ''), + ('furni_chair_basic*7_desc', ''), + ('room_take_rights', 'Remove Rights'), + ('furni_hc_bkshlf_desc', 'For the scholarly ones'), + ('furni_bed_polyfon*2_desc', 'Black Mode Double Bed'), + ('furni_table_plasto_4leg_name', 'Occasional Table'), + ('furni_bed_budget*7_desc', 'King sized comfort!'), + ('win_partner_registration', 'Partner registration'), + ('summer_chair_4_desc', 'Please tan responsably'), + ('furni_table_norja_med_name', 'Coffee Table'), + ('nav_venue_club_massiva/2_desc', 'Make all the right moves'), + ('furni_divider_silo1_desc', 'Neat and natty'), + ('hobba_send_reply', 'Send Alert'), + ('shopping_nocash', 'You don\'t have enough Credits in your Purse.\\r Click \'OK\' to see the different ways of\\rgetting Habbo Credits.'), + ('furni_divider_poly3*9_name', 'Red Hatch'), + ('furni_rare_fountain*1_desc', 'For our feathered friends'), + ('poster_56_desc', 'Serious partying going on!'), + ('furni_scifiport*6_name', 'White Sci-Fi Port'), + ('furni_rclr_garden_desc', 'Self watering'), + ('furni_arabian_tray1_desc', 'Tea for every occasion'), + ('furni_rare_fountain*3_name', 'Bird Bath (blue)'), + ('furni_romantique_pianochair*1_name', 'Rose Quartz Piano Stool'), + ('furni_romantique_divider*1_desc', 'Beauty lies within'), + ('wallitem_post.it.vd_name', 'Heart Stickies'), + ('wallitem_torch_desc', 'The dark side of Habbo'), + ('roomatic_namedisplayed', 'Do you want your name to be displayed with the room?'), + ('furni_grunge_candle_name', 'Candle Box'), + ('furni_sound_set_17_name', 'Groove 3'), + ('furni_prizetrophy3*2_name', 'Globe trophy'), + ('furni_chair_silo_desc', 'Keep it simple'), + ('nav_venue_sw_lobby_beginner_7/0_desc', ''), + ('nav_venue_sw_lobby_beginner_3/0_desc', ''), + ('furni_hc_trll_name', 'Drinks Trolley'), + ('furni_bed_polyfon_one*7_desc', 'Green Mode Single Bed'), + ('furni_chair_plasto*2_name', 'Chair'), + ('furni_pura_mdl1*4_name', 'White Pura Module 1'), + ('furni_gothiccandelabra_desc', 'The dark side of Habbo'), + ('NUH_chat', 'Click here and type to chat to other Habbos.'), + ('furni_plant_valentinerose*2_name', 'White Valentine Rose'), + ('reg_privacypledge', 'Privacy Pledge'), + ('furni_exe_table_desc', 'Take a memo, Featherstone'), + ('hubu_info_link2', 'FRANK Website'), + ('furni_prizetrophy4*3_name', 'Fish trophy'), + ('furni_hc_chr_desc', 'Royal comfort'), + ('hubu_info_link1', 'FRANK Infobus Information'), + ('sound_machine_your_songs', 'Traxmachine Songs'), + ('furni_active_placeholder_name', 'This furniture is downloading...'), + ('furni_divider_silo3*8_name', 'Yellow Area Gate'), + ('NUF_visiting_rooms_categorylist_tutor', 'There are so many Guest Rooms we thought it would be a "hoot" to divide them into categories. Select a category to view its contents.'), + ('furni_sofa_silo*6_name', 'Blue Area Sofa'), + ('club_extend_failed', 'Sorry, we were unable to process the purchase. No Credits were charged!'), + ('furni_soft_sofa_norja*4_name', 'Urban Iced Sofa'), + ('furni_sporttrack3*3_desc', 'null'), + ('furni_sound_set_1_name', 'Habbo Sounds 1'), + ('furni_pura_mdl2*5_name', 'beige pura module 2'), + ('nav_venue_sw_lobby_intermediate_1/0_desc', ''), + ('furni_safe_silo*8_name', 'Yellow Safe Minibar'), + ('trading_agrees', 'agrees'), + ('alert_needpermission', 'You need your parent or guardian\'s permission to spend time in Habbo Hotel.'), + ('nav_modify', 'Modify'), + ('furni_noob_stool*4_desc', 'Unfold me and take the weight off (light blue)'), + ('catalog_length_trophymsg', 'Oops, your inscription is too long, so it won\'t fit on the trophy. \\rPlease type something shorter.'), + ('furni_s_sound_machine*3_desc', 'Sound Machine Green Desc'), + ('club_member', 'Member'), + ('modtool_ban_ip', 'Ban IP Also'), + ('bb_link_gamerules', 'Spelregels'), + ('furni_carpet_armas_name', 'Hand-Woven Rug'), + ('furni_rubberchair*5_desc', 'Soft and tearproof!'), + ('furni_table_plasto_square*1_desc', 'Hip plastic furniture'), + ('furni_divider_nor3*3_desc', 'Do go through...'), + ('nav_venue_habburger\'s/0_desc', 'Get food here!'), + ('reg_linkstitle', 'Full version of the documents:'), + ('roomevent_browser_title', 'Events'), + ('roomatic_security', 'Security'), + ('furni_table_plasto_4leg*7_desc', 'Hip plastic furniture'), + ('furni_table_plasto_round*14_desc', 'Hip plastic furniture'), + ('furni_sound_set_38_desc', 'Rock and Roses!'), + ('furni_rare_parasol*0_desc', 'Block those rays!'), + ('furni_pura_mdl3*6_desc', 'Any way you like it!'), + ('NUF_console', 'Learn about messaging'), + ('poster_45_name', 'Skeleton'), + ('furni_pura_mdl3*9_desc', 'Any way you like it!'), + ('pet_age', 'Age:'), + ('poster_48_name', 'Large gold star'), + ('open', 'Open'), + ('gs_3min', '3min'), + ('wallitem_habw_mirror_name', 'Habbowood Mirror'), + ('furni_carpet_polar*4_desc', 'Snuggle up on a Funky bear rug...'), + ('furni_table_armas_name', 'Dining Table'), + ('sw_gameprice', 'Play now for just 2 tickets!'), + ('furni_divider_nor5*4_name', 'Urban Iced Angle'), + ('navigator', 'Hotel Navigator'), + ('furni_pillow*2_desc', 'Puffy, soft and huge'), + ('purse_vouchers_checking', 'Checking code, please wait...'), + ('furni_noob_rug*4_desc', 'Nice and neat sisal rug with light blue edging'), + ('furni_safe_silo*5_name', 'Pink Safe Minibar'), + ('nav_venue_the_dirty_duck_pub/0_desc', 'The perfect place to chill!'), + ('furni_CFC_10_coin_bronze_desc', 'Worth 10 Credits'), + ('furni_teleport_door_desc', 'Magic doorway to anywhere!'), + ('furni_bardesk_polyfon_name', 'Bar/desk'), + ('login_password', 'Password'), + ('furni_pura_mdl2*8_desc', ''), + ('furni_divider_nor4*4_desc', 'Habbos, roll out!'), + ('furni_rare_fan*7_name', 'Brown Powered Fan'), + ('furni_bed_polyfon_girl_one_desc', 'Snuggle down in princess pink'), + ('club_general_elapsed', 'Elapsed Months'), + ('nav_venue_sw_lobby_free_1_name', 'Free Game Lobby'), + ('furni_gothic_chair*5_name', 'Green Gothic Chair'), + ('furni_sink_name', 'Sink'), + ('furni_bed_budget_one*4_desc', 'Prince sized comfort!'), + ('Alert_ForgotSetPassword', 'Please check your password'), + ('furni_chair_plasto*6_desc', 'Hip plastic furniture'), + ('furni_carpet_standard_desc', 'Available in a variety of colours'), + ('reg_update_text2', 'Only change them when you want to make sure that nobody can know or guess your password.'), + ('furni_arabian_swords_desc', 'Not for yielding'), + ('furni_divider_silo3*5_name', 'Pink Area Gate'), + ('furni_fireplace_polyfon_desc', 'Comfort in stainless steel'), + ('furni_glass_table*3_desc', 'Translucent beauty'), + ('furni_summer_pool*4_desc', 'Fancy a dip?'), + ('poster_500_desc', 'The UK flag'), + ('poster_1004_name', 'Eid Mubarak Poster'), + ('furni_rare_icecream*5_desc', 'Virtual vanilla rocks!'), + ('furni_one_way_door*2_name', 'Black HC Gate'), + ('furni_chair_plasty*3_desc', 'Hip plastic furniture'), + ('club_end_title', 'Your Habbo Club membership has now expired.'), + ('furni_table_polyfon_desc', 'For larger gatherings'), + ('furni_romantique_pianochair*4_desc', 'I can feel air coming through...'), + ('furni_bardesk_polyfon*3_name', 'White Bardesk'), + ('predefined_room_description', '%user_name% has entered the building'), + ('poster_53_desc', 'whack that ball!'), + ('poster_515_name', 'The Swedish flag'), + ('furni_rope_divider_desc', 'Rope Divider'), + ('furni_chair_norja*3_desc', 'Sleek and chic for each cheek'), + ('furni_scifidoor*9_name', 'Blue Spaceship Door'), + ('furni_goodie2_name', 'Chocolate Mouse'), + ('game_poker_logoff', 'Left the game'), + ('furni_bed_polyfon_desc', 'Give yourself space to stretch out'), + ('furni_table_plasto_round*5_desc', 'Hip plastic furniture'), + ('furni_couch_norja*3_desc', 'Two can perch comfortably'), + ('pet.saying.sleep.cat.2', 'Purrr... rrrr'), + ('pet.saying.sleep.cat.1', 'mrrrr..rrrr..'), + ('pet.saying.sleep.cat.0', 'hrrrrr....Mrrrrr'), + ('login_ok', 'OK'), + ('gs_button_expand', 'Expand Window'), + ('pet.saying.sleep.cat.4', 'mrrrr...muew..mrr'), + ('tutorial_next', 'Next:'), + ('pet.saying.sleep.cat.3', 'hurrr..hurrr'), + ('furni_jp_tatami_desc', 'Shoes off please'), + ('hobba_sent_to_moderators', 'Call re-assigned non-emergency, still visible to moderators'), + ('roomatic_choosecategory', ''), + ('wallitem_guitar_v_desc', 'tilulilulii'), + ('NUF_groups', 'Groups'), + ('bb_link_gameRules_url', 'http://%predefined%/groups/56552/id'), + ('nav_venue_theatredrome_halloween_name', 'Theatredrome Habboween'), + ('bb_buyTicketsButton', 'Buy tickets'), + ('furni_gothgate_desc', 'The dark side of Habbo'), + ('game_poker_waiting', 'Change done.\\rWaiting for the other players'), + ('furni_glass_stool*7_desc', 'Habbo Club'), + ('club_end_text', 'BUT, don\'t worry, you can still buy another month of Habbo Club and keep all your Habbo Club benefits,special Furni gifts and the shiny badge!'), + ('furni_sound_set_18_desc', 'Listen while you tan'), + ('furni_sound_set_35_desc', 'Groovelicious'), + ('furni_prizetrophy2*2_desc', 'Shiny silver'), + ('furni_plant_valentinerose*3_desc', 'Relight your passions'), + ('furni_romantique_divan*5_name', 'Onyx Chaise-Longue'), + ('furni_chair_norja*6_desc', 'Sleek and chic for each cheek'), + ('wallitem_hrella_poster_2_desc', 'For those scary Lido moments'), + ('furni_s_sound_machine*6_desc', 'Sound Machine Purple'), + ('game_bs_miss', 'Miss:'), + ('furni_carpet_standard*4_desc', 'Available in a variety of colours'), + ('furni_pura_mdl1*1_name', 'Aqua Pura Module 1'), + ('furni_rare_icecream*8_desc', 'Virtual peppermint rocks!'), + ('furni_petfood4_desc', 'Fantastic 20% Saving!'), + ('furni_table_silo_small*3_name', 'White Occasional Table'), + ('furni_table_plasto_round*8_desc', 'Hip plastic furniture'), + ('furni_chair_polyfon_desc', 'Metallic seating experience'), + ('furni_exe_drinks_desc', 'Give a warm welcome'), + ('nav_createroom', 'Create Own Room'), + ('furni_table_plasto_bigsquare*14_desc', 'Hip plastic furniture'), + ('poster_1001_name', 'Prince Charles Poster'), + ('furni_CF_20_moneybag_name', 'Sack of Credits'), + ('furni_prizetrophy5*1_name', 'Duo trophy'), + ('alert_reg_email', 'Email'), + ('pet_thirsty', 'Thirst:'), + ('nav_error_passwordtooshort', 'The password is too short.'), + ('nav_venue_sw_lobby_free_7_name', 'Free Game Lobby'), + ('furni_plant_valentinerose*5_name', 'Purple Valentine Rose'), + ('recycler_status_info', 'You have Furniture in recycling. The icon will blink when recycling is complete.'), + ('poster_52_name', 'Hockey Stick'), + ('win_doorbell', 'Doorbell'), + ('Unreadmessages', 'New Message(s)'), + ('furni_queue_tile1*9_desc', 'The power of movement'), + ('furni_rare_snowrug_name', 'Snow Rug'), + ('console_approve_selected', 'Accept selected'), + ('pet_race_0_009', 'Hound of Hull'), + ('poster_35_name', 'The Habbo Babes 1'), + ('pet_race_0_008', 'Springy Spaniel'), + ('furni_sofa_polyfon*3_desc', 'Comfort for stylish couples'), + ('furni_basket_name', 'Basket Of Eggs'), + ('pet_race_0_007', 'Slobber Don'), + ('pet_race_0_006', 'Stripy Setter'), + ('pet_race_0_005', 'Paws Forethought'), + ('pet_race_0_004', 'Droopy of Pawford'), + ('furni_barchair_silo_desc', 'Practical and convenient'), + ('furni_noob_lamp*2_desc', 'Get the light right where you want it (dark blue)'), + ('pet_race_0_003', 'Rescue Bernard'), + ('furni_glass_stool_name', 'Glass stool'), + ('pet_race_0_002', 'Joe Cocker Spaniel'), + ('pet_race_0_001', 'Habbo Husky'), + ('pet_race_0_000', 'Yappy Yorkie'), + ('NUF_mini_endtopic_step1_questionmark', 'Click to see our help menu and find our FAQs!'), + ('furni_sound_set_28_desc', 'Head for the pit!'), + ('nav_private_norooms', 'You dont have any rooms - create one?'), + ('furni_table_plasto_square*4_desc', 'Hip plastic furniture'), + ('furni_val_teddy*6_name', 'Blue Share Bear'), + ('furni_noob_table*3_desc', 'Lightweight, practical and aubergine'), + ('gs_state_finished', 'This Game is already over!'), + ('furni_rare_fan*8_desc', 'Stylish, Eco-Energy!'), + ('reg_parentemail_link_url1', 'http://%predefined%//help/parents_guide.html'), + ('furni_gothic_carpet2_desc', 'What lies beneath?'), + ('furni_rare_fan*5_desc', 'It\'ll blow you away!'), + ('modtool_kickuser', 'Kick User'), + ('furni_divider_silo1*7_desc', 'Green Area Corner Shelf'), + ('reg_parentemail_link_url2', 'http://%predefined%//footer_pages/privacy_policy.html'), + ('pet_race_0_019', 'Tiny Terrier'), + ('pet_race_0_018', 'Bushy Woofer'), + ('pet_race_0_017', 'Speckled Sheepdog'), + ('furni_rubberchair*8_desc', 'Soft and tearproof for HC!'), + ('pet_race_0_016', 'Murmurin\' Minimastiff'), + ('poster_42_name', 'Spiderweb'), + ('pet_race_0_015', 'Pixie Poodle'), + ('furni_safe_silo*2_name', 'Black Safe Minibar'), + ('pet_race_0_014', 'Whiffy Woofy'), + ('pet_race_0_013', 'Mangy Mutt'), + ('nav_publicRooms', 'Public Spaces'), + ('pet_race_0_012', 'Tawny Bleugh'), + ('pet_race_0_011', 'Lappy Lassie'), + ('pet_race_0_010', 'Furry McScottie'), + ('game_bs_toast', 'Toast!'), + ('furni_prizetrophy6_name', 'Pokaali'), + ('furni_pudding_desc', 'Will you get the lucky sixpence?'), + ('furni_tile_red_desc', 'In a choice of colours'), + ('nav_venue_sw_arena_expert_name', 'Playing expert game'), + ('pet.saying.sleep.croco.0', 'Zzzz... zzzzz...'), + ('poster_50_desc', 'flap, flap, screech, screech...'), + ('furni_shelves_norja*9_name', 'Red Bookcase'), + ('furni_sound_set_4_name', 'Ambient 1'), + ('furni_exe_s_table_desc', 'Get a clear reflection!'), + ('furni_present_gen6_desc', 'What\'s inside?'), + ('furni_one_way_door*5_name', 'Pink One Way Gate'), + ('nav_search_hd', 'Search rooms by Habbo name or room name.'), + ('poster_20_desc', 'high security for your room'), + ('buddyremove_messenger_updating', 'The console is updating, try again in a minute... Everything else is working fine!'), + ('pet.saying.sleep.croco.3', ':)'), + ('furni_house2_desc', 'Good enough to eat'), + ('pet.saying.sleep.croco.4', '*Snuh snuh*'), + ('tutorial_offtopic', 'Oops! You got off the topic. Please restart or select a new topic.'), + ('pet.saying.sleep.croco.1', 'Yrgh... Yrgh...'), + ('jukebox_now_playing', 'Now playing:'), + ('pet.saying.sleep.croco.2', 'Frgh... Frgh...'), + ('furni_sound_set_25_desc', 'Actually, it\'s Partay!'), + ('club_intro_header', 'Welcome to Habbo Club, the members-only club that all VIP Habbos belong to!'), + ('nav_venue_sw_lobby_amateur_3/0_desc', 'Astetta rankempaa lumisotaa.'), + ('pet.saying.sleep.croco.5', 'Rawwwwwwwwrrrm...'), + ('pet.saying.sleep.croco.6', 'Mmmm... Hooks...'), + ('furni_table_plasto_bigsquare*1_desc', 'Hip plastic furniture'), + ('nav_venue_sw_lobby_free_4_name', 'Free Game Lobby'), + ('alert_warning', 'Moderator says:'), + ('furni_barrier*3_name', 'Red Road Barrier'), + ('nav_venue_floatinggarden_name', 'Floating Garden'), + ('gs_error_nocredits', 'You need Habbo Credits to play a Game!'), + ('furni_chair_plasto*5_name', 'Chair'), + ('furni_tree2_desc', 'Old Christmas Tree'), + ('furni_bed_budget_one*7_desc', 'Prince sized comfort!'), + ('furni_romantique_clock_name', 'romantique_clock'), + ('room_banner_text', ''), + ('furni_sleepingbag*2_desc', 'Ultimate coziness'), + ('furni_divider_nor4*3_name', 'White Iced Auto Shutter'), + ('jukebox_song_remaining', 'Remaining time: %time%'), + ('reg_note_text', 'Never change your password or email\\rif someone else asks you to - they will\\rsteal your furni and Credits!'), + ('habbo_hand_next', '>>>'), + ('nav_venue_orient/0_desc', 'Tres chic with an Eastern twist. For Habbo Club members only.'), + ('furni_easterduck_name', 'Wannabe bunny'), + ('login_forgottenPassword', 'Forgotten your password?'), + ('furni_prizetrophy*1_desc', 'Glittery gold'), + ('hubu_t2_2', ''), + ('hubu_t2_3', 'Vapaa-ajan linkkejä'), + ('decision_cancel', 'Cancel'), + ('nav_venue_bb_lobby_tournament_2/0_desc', ''), + ('furni_samovar_desc', 'Click for a refreshing cuppa'), + ('furni_rcandle_name', 'Red Candle'), + ('furni_waterbowl*4_name', 'Blue Water Bowl'), + ('furni_table_norja_med*7_name', 'Rural Iced Coffee Table'), + ('NUF_playing_games_room_tutor', 'See some people wandering around? They are psyching themselves up for a game. Game Tickets are usually 2 Habbo Credits, but in this room the games are free.'), + ('furni_doormat_love_name', 'Doormat'), + ('bb_link_tournament_highScores_url', 'http://%predefined%//groups/56552/id'), + ('furni_sofachair_polyfon*4_name', 'Beige Mode Armchair'), + ('error_room_full', 'Huone on täynnä.'), + ('furni_chair_silo*4_desc', 'Beige Silo Dining Chair'), + ('furni_divider_nor2*7_name', 'Rural Iced Bar'), + ('hubu_t2_1', ''), + ('furni_divider_nor1*9_name', 'Red Ice corner'), + ('furni_wooden_screen*0_name', 'White Oriental Screen'), + ('furni_chair_basic*1_desc', ''), + ('gs_choose_gamename', 'Enter A Name For Your Game:'), + ('poll_question_number', 'Question %number%/%count%'), + ('furni_hc_rllr_desc', 'Highest class transportation'), + ('furni_table_plasto_4leg*15_desc', 'Hip plastic furniture'), + ('furni_scifiport*9_name', 'Violet Sci-Fi Port'), + ('furni_jukebox*1_desc', 'For your Happy Days!'), + ('furni_red_tv_desc', 'Don?t miss those soaps'), + ('furni_song_disk_name', 'Traxdisc'), + ('reg_agree_alert', 'You have to agree to the terms of service\\r(tick the box).'), + ('furni_summer_chair*1_desc', 'Got your swimming trunks?'), + ('poster_2008_name', 'Habbo Leap Day Poster'), + ('poster_505_desc', 'The Canadian flag'), + ('group_homepage', 'Groups\' Homepage >>>'), + ('furni_table_silo_med*6_desc', 'Blue Area Coffee Table'), + ('nav_venue_tearoom/0_name', 'Chinese Tea Room'), + ('dimmer_use_bg_only', 'Background only'), + ('furni_divider_poly3*4_name', 'Beige Mode Bardesk Gate'), + ('nav_venue_hotel_kitchen/0_desc', 'Beware the flying knives!'), + ('furni_divider_silo1*8_desc', 'Neat and natty'), + ('furni_hc_btlr_name', 'Electric Butler'), + ('furni_wooden_screen*5_name', 'Gray Oriental Screen'), + ('furni_scifiport*8_name', 'Purple Sci-Fi Port'), + ('furni_carpet_standard*5_name', 'Floor Rug'), + ('trading_offers', 'offers:'), + ('furni_prizetrophy2*3_name', 'Duck trophy'), + ('transaction_system_club_habbo', 'Habbo Club payment'), + ('nav_venue_bb_lobby_tournament_9/0_desc', ''), + ('poster_517_name', 'The Scottish flag'), + ('furni_wood_tv_desc', 'For family viewing'), + ('furni_deadduck2_desc', 'Someone forgot to feed me...'), + ('furni_sound_set_20_desc', 'Musical heaven'), + ('sound_machine_new', 'Create a New Song'), + ('nav_venue_the_chromide_club/0_desc', 'Ghetto Fabulous'), + ('nav_modify_doorstatus_pwagain', 'pw again:'), + ('furni_chair_plasto*10_desc', 'Hip plastic furniture'), + ('gs_idlewarning', 'You will be replaced if you don\'t start or join a Game soon!'), + ('purse_vouchers_entercode', 'Enter code here:'), + ('sound_machine_song_name', 'Untitled Trax'), + ('furni_sofa_polyfon*4_name', 'Beige Mode Sofa'), + ('furni_carpet_standard*a_name', 'Floor Rug'), + ('poster_510_name', 'The Italian flag'), + ('furni_table_plasto_square*7_name', 'Square Dining Table'), + ('furni_noob_chair*6_desc', 'Lightweight, practical with dark yellow stripes'), + ('forgottenpw_whatyou', 'What\'s your Habbo called?'), + ('nav_venue_bb_lobby_amateur_1_name', 'Gevorderden Battle Ball 2'), + ('furni_noob_table*6_name', 'My first Habbo table'), + ('furni_pillar*0_desc', 'Classy architect, for holding up ceilings!'), + ('poster_1002_desc', 'aw, bless...'), + ('furni_divider_arm1_desc', 'Good solid wood'), + ('furni_glass_stool*8_name', 'Glass stool'), + ('furni_rare_moonrug_name', 'Moon Patch'), + ('nav_venue_rooftop_rumble/0_desc', 'Are you ready?'), + ('transaction_system_sms_sonera', 'Sonera'), + ('furni_waterbowl*5_name', 'Brown Water Bowl'), + ('furni_sound_set_32_name', 'Instrumental 2'), + ('furni_table_silo_small*4_name', 'Beige Area Occasional Table'), + ('furni_prizetrophy8*1_name', 'Duo trophy'), + ('tutorial_menu', 'Get help with...'), + ('gs_2teams', '2 Teams Game'), + ('furni_sound_machine*4_desc', 'For Funky, Funky Fridays!'), + ('furni_romantique_divan*4_desc', 'Is that a cape hanging there?'), + ('furni_couch_norja*8_desc', 'Two can perch comfortably'), + ('console_usersnotfound', 'Habbo Not Found'), + ('nav_venue_bb_lobby_amateur_2/0_desc', ''), + ('furni_sleepingbag*4_desc', 'Ultimate coziness'), + ('furni_bed_budget_one*6_desc', 'Prince sized comfort!'), + ('furni_sw_chest_desc', ''), + ('nav_venue_bb_lobby_amateur_5/0_desc', ''), + ('NUF_visiting_rooms_room_tutor', 'This is a Guest Room. You can either quit the tutorial and start meeting people, or select the next topic.'), + ('furni_jp_pillow_name', 'Pillow Chair'), + ('url_logged_out', 'http://%predefined%/account/disconnected?reason=logout&origin=popup'), + ('furni_romantique_smalltabl*1_name', 'Rose Quartz Tray Table'), + ('friend_request_declined', 'Declined!'), + ('furni_grunge_shelf_desc', 'Scrap books and photo albums'), + ('furni_gothic_stool*6_name', 'Gothic Stool Blue'), + ('wallitem_gothicfountain_desc', 'Not suitable for drinking!'), + ('furni_scifiport*1_name', 'Gold Laser Gate'), + ('furni_sound_set_41_name', 'Rock 8'), + ('furni_toilet_yell_name', 'Loo Seat'), + ('console_fr_limit_exceeded_error', 'Too many friends selected. Please remove some first.'), + ('console_asktobecomeafriend', 'Ask To Become A Friend'), + ('console_friends', 'Friends'), + ('furni_table_plasto_bigsquare*4_desc', 'Hip plastic furniture'), + ('poster_2005_desc', 'The Special Infobus Poster'), + ('furni_summer_chair*8_desc', 'Got your sun cream?'), + ('furni_s_sound_machine*2_name', 'Sound Machine Ocean'), + ('nav_ringbell', 'The door is locked. Ringing the bell, and waiting...'), + ('console_profilematch', 'Habbo Profile match -'), + ('poster_14_name', 'Fox Poster'), + ('furni_bardeskcorner_polyfon*3_desc', 'Tuck it away'), + ('furni_carpet_soft*2_name', 'Soft Wool Rug'), + ('furni_ham_name', 'Joint of Ham'), + ('nav_venue_star_lounge_name', 'Star Lounge'), + ('nav_venue_bb_lobby_beginner_desc', 'Beginner battle ball'), + ('furni_doormat_plain*3_desc', 'Available in a variety of colours'), + ('furni_habbowood_chair_desc', 'Exclusively for Directors'), + ('nav_venue_bb_lobby_beginner_3/0_desc', ''), + ('furni_CF_20_moneybag_desc', 'Worth 20 Credits'), + ('furni_edice_desc', 'What\'s your lucky number?'), + ('furni_scifirocket*9_name', 'Neptune Smoke Machine'), + ('furni_bardesk_polyfon*9_name', 'Red Bardesk'), + ('furni_glass_table*8_desc', 'Translucent beauty'), + ('NUF_mini_endtopic', 'Find out more'), + ('pending_cfh_title', 'Your old message'), + ('nav_venue_sw_arena_tournament_name', 'Playing a tournament game!'), + ('furni_arabian_bigtb_desc', 'It must be Jinn-er time!'), + ('nav_venue_bb_lobby_beginner_0/0_desc', ''), + ('furni_pillow*3_name', 'Turquoise Satin Pillow'), + ('interface_icon_help', 'Help, need help?'), + ('nav_roomnfo_hd_src', 'Search Rooms'), + ('pet.saying.generic.dog.0', 'woof..woof'), + ('furni_chair_norja*9_name', 'Red Chair'), + ('NUF_getting_room_roommatic_start_tutor', 'This is the Room-O-Matic! Green! You use this to make your room.'), + ('furni_sound_set_2_name', 'Habbo Sounds 3'), + ('nav_venue_netcafe_name', 'My Habbo Home Netcafe'), + ('purse_voucherbutton', 'Vouchers'), + ('console_console', 'Console'), + ('game_poker_changed', 'changed'), + ('transaction_system_splashplastic', 'SplashPlastic'), + ('nav_venue_sw_lobby_free_7/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('furni_sporttrack3*1_desc', 'null'), + ('buddyremove_prev', '< Previous'), + ('roomatic_chooselayout', 'Choose the layout of your room'), + ('wallitem_item_placeholder_desc', 'This furniture is downloading...'), + ('purse_note', 'NOTE : The transactions are updated at 6 am every day.'), + ('poster_34_desc', 'Habbo-punk for the never-agreeing'), + ('furni_sound_set_27_desc', 'Jingle Bells will never be the same...'), + ('game_chess_start', 'Start Over'), + ('summer_chair_7_desc', 'A green deck chair'), + ('nav_venue_bb_lobby_beginner_6_name', 'Beginners Battle Ball 7'), + ('purse_link', 'Click here to see how to get Credits.'), + ('poster_59_desc', 'Torch - it gives you some light'), + ('room_info_rate_req', 'Rate this room'), + ('furni_rare_dragonlamp*5_desc', 'Roast your chestnuts here!'), + ('furni_divider_silo3*9_desc', 'Red Area Gate'), + ('more_roomlayouts', 'Extra room layouts for Habbo Club members >>'), + ('furni_grunge_chair_desc', 'Alternative chair for alternative people'), + ('furni_bed_budget*9_desc', 'King sized comfort!'), + ('furni_christmas_sleigh_desc', 'Ready for your Xmas cheer'), + ('furni_table_plasto_4leg*8_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_tournament_5_name', 'Competitie Battle Ball 6'), + ('furni_table_norja_med*4_name', 'Urban Iced Coffee Table'), + ('instant_friend_request_header', 'Friend Request'), + ('furni_marquee*3_name', 'Aqua Marquee'), + ('furni_noob_stool*1_name', 'My first Habbo stool'), + ('furni_rare_mnstr_desc', 'Don\'t get too close...'), + ('furni_safe_silo_pb_desc', 'Totally shatter-proof!'), + ('NUF_meeting_people_user_chatfield', 'Start typing here and press \'Enter\' to chat with others.'), + ('furni_prizetrophy6*2_desc', 'Shiny silver'), + ('furni_table_plasto_bigsquare*9_name', 'Square Dining Table'), + ('club_habbo.window.title', 'Habbo Club'), + ('recycler_info_ready', 'Recycling is complete. You have made a great environmentally friendly decision. All the recycled items you receive have been made from old items which helps to save natural resources and reduce pollution.'), + ('furni_shelves_norja*5_desc', 'For nic naks and art deco books'), + ('furni_table_silo_med_name', 'Coffee Table'), + ('furni_grunge_sign_desc', 'Bought legitimately from an M1 cafe.'), + ('roomevent_type_9', 'Group Events'), + ('roomevent_type_7', 'Dating'), + ('pet.saying.generic.dog.1', 'woof woof woof!!!'), + ('roomevent_type_8', 'Jobs'), + ('pet.saying.generic.dog.2', 'wooooof!'), + ('roomevent_type_5', 'Debates & Discussion'), + ('pet.saying.generic.dog.3', 'hooooowl'), + ('roomevent_type_6', 'Grand Openings'), + ('furni_solarium_norja*2_name', 'Beige Solarium'), + ('nav_venue_bb_lobby_intermediate_3_name', 'Semi-profs Battle Ball 4'), + ('console_searchfor', 'Search:'), + ('wallitem_arabian_wndw_desc', 'Arabian days and nights'), + ('furni_queue_tile1*3_name', 'Ice Habbo Roller'), + ('furni_lamp2_armas_desc', 'Wax lyrical with some old-world charm'), + ('furni_jp_tray3_desc', 'jp_tray3'), + ('wallitem_guitar_skull_name', 'skull guitar'), + ('roomevent_type_3', 'Games'), + ('furni_romantique_divider*2_desc', 'Keeping things separated'), + ('roomatic_owner', 'Owner:'), + ('url_helpterms', 'http://%predefined%//help/68'), + ('roomevent_type_4', 'Welcoming Party Events'), + ('furni_glass_chair*6_desc', 'Translucent beauty'), + ('furni_pillar*5_name', 'Pagan Pillar'), + ('roomevent_type_1', 'Parties & Music'), + ('roomevent_type_2', 'Trading'), + ('furni_present_gen2_desc', 'What\'s inside?'), + ('ph_tickets_title', 'Tickets'), + ('furni_table_norja_med*8_desc', 'For larger gatherings'), + ('furni_sound_set_54_desc', 'Tune into Christmas'), + ('poster_61_desc', 'The Auspicious One'), + ('furni_divider_silo3_name', 'Gate (lockable)'), + ('furni_scifirocket*4_desc', 'Welcome... to planet love'), + ('furni_plant_valentinerose*1_name', 'Red Valentine\'s Rose'), + ('furni_exe_chair2_name', 'Executive Boss Chair'), + ('alert_donate_ok', 'Give away my furni'), + ('furni_bardesk_polyfon*4_desc', 'Beige Mode Bardesk'), + ('furni_pura_mdl1*5_desc', ''), + ('hubu_close', 'Sulje kioski'), + ('gs_deathmatch', 'Every Habbo for himself!'), + ('summer_chair_9_desc', 'Sunbathing, why not?'), + ('furni_barchair_silo*8_name', 'Yellow Bar Stool'), + ('console_differentmessagemodes', 'Different Messages'), + ('furni_chair_silo*5_name', 'Pink Silo Dining Chair'), + ('callhelp_explanation', 'Thanks for reporting the problem'), + ('furni_chair_plasty*1_desc', 'Hip plastic furniture'), + ('furni_bed_budget*2_desc', 'Queen sized comfort!'), + ('furni_summer_grill*2_desc', 'Plenty of shrimp on that barbie'), + ('furni_heart_desc', 'Full of love'), + ('reg_donetext', 'Soon you\'ll see the Hotel Navigator, it shows you all the rooms you can go to -the guest rooms, clubs, caf�s, swimming pools and more!'), + ('poster_523_desc', 'The flag of India'), + ('furni_one_way_door*1_name', 'Aqua One Way Gate'), + ('furni_bardeskcorner_polyfon*13_desc', 'Tuck it away'), + ('nav_venue_sw_lobby_amateur_5/0_desc', 'Astetta rankempaa lumisotaa.'), + ('furni_gothic_chair*4_desc', 'Vampires and Wizards'), + ('furni_bardesk_polyfon*6_desc', 'Blue Mode Bardesk'), + ('transaction_system_sms_sra', 'Sonera'), + ('dimmer_turn_off', 'Turn OFF'), + ('furni_fireplace_armas_desc', 'Authentic, real flame fire'), + ('furni_chair_plasty*6_name', 'Plastic Pod Chair'), + ('furni_scifidoor*6_name', 'Black Monolith'), + ('furni_summer_pool*3_desc', 'Fancy a dip?'), + ('furni_christmas_reindeer_desc', 'Prancer becomes Rudolph in a click!'), + ('furni_chair_norja_name', 'Chair'), + ('furni_barchair_silo*3_name', 'White Bar Stool'), + ('nav_venue_bb_lobby_tournament_desc', 'Play battle ball tournament!'), + ('transaction_system_bank_sampo', 'Sampo'), + ('furni_sound_set_39_name', 'Rock 7'), + ('furni_pura_mdl3*8_desc', ''), + ('console_follow_prevented', 'Your friend has prevented others from following him/her.'), + ('poster_46_name', 'Small gold star'), + ('furni_sofa_polyfon_girl_name', 'Two-seater Sofa'), + ('furni_carpet_polar*3_desc', 'Snuggle up on a Funky bear rug...'), + ('modtool_rankerror', 'You do not have the rights for this action on this user!'), + ('furni_divider_nor3*4_name', 'Urban Iced Gate'), + ('nav_venue_theatredrome_valentine/0_desc', 'Hug A Friend, Its Valentines! Home Of Ralph (Wannabe Panda In Training)'), + ('furni_one_way_door*6_name', 'Blue HC Gate'), + ('poster_7_desc', 'For emergencies only'), + ('wallitem_hc_wall_lamp_name', 'Retro Wall Lamp'), + ('poster_508_name', 'The Spanish flag'), + ('help_emergency_example', 'Example: A Habbo wants to see me on webcam.'), + ('nav_venue_bb_lobby_expert_1/0_desc', ''), + ('furni_pura_mdl1*7_desc', 'Any way you like it!'), + ('wallitem_post.it_desc', 'Pad of stickies'), + ('nav_modify_doorstatus_passwordprotected', 'Let other people move and leave furniture in the room.'), + ('queue_set.queue_full.alert', 'The queue for this room is full. Please try again later.'), + ('nav_venue_bb_lobby_beginner_8_name', 'Beginners Battle Ball 9'), + ('nav_venue_sw_arena_amateur_name(0)', 'Playing amateur game'), + ('url_figure_editor', 'http://%predefined%//profile/profile.action'), + ('furni_noob_lamp*6_desc', 'Get the light right where you want it (canary yellow)'), + ('furni_divider_nor5*5_name', 'Pink Iced Angle'), + ('nav_venue_sw_lobby_free_desc', 'Come and play. It\'s free!'), + ('furni_table_silo_small*6_desc', 'Blue Area Occasional Table'), + ('NUF_getting_items_navigator_tutor', 'You need to be in a Habbo\'s room to access the Catalogue.'), + ('furni_safe_silo*6_desc', 'Totally shatter-proof!'), + ('furni_glass_sofa*7_name', 'Green Glass Sofa'), + ('wallitem_md_can_desc', 'Enough bubbling juice for one evening'), + ('furni_rare_fan*9_desc', 'It\'ll blow you away!'), + ('furni_prizetrophy7_name', 'Pokaali'), + ('furni_noob_stool*3_name', 'My first Habbo stool'), + ('furni_glass_sofa*2_desc', 'Translucent beauty'), + ('pet_frnd_10', 'Adoring'), + ('furni_turkey_desc', 'Where\'s the cranberry sauce?'), + ('pet_frnd_11', 'Devoted'), + ('Alert_ConnectionNotReady', 'Could not connect to the server'), + ('console_search_habbo_profilematch', 'Habbo Profile match -'), + ('furni_sound_set_59_desc', 'Urban break beats'), + ('poster_21_name', 'Butterfly Cabinet'), + ('credits', 'Credits'), + ('furni_sound_set_14_name', 'Hip Hop Beats 2'), + ('NUH_hand', 'Click here to open your inventory (aka the Big Hand). Drag and drop furniture to and from here to move it.'), + ('furni_pura_mdl3*1_desc', 'Any way you like it!'), + ('nav_modify_doorstatus_pwprotected', 'Password protected:'), + ('shopping_costs', 'XX costs XX Credit(s).\\rJust click \'buy\' once, it\'ll appear shortly.'), + ('NUF_mini_meet_people', 'Meet some people'), + ('furni_divider_nor1*3_name', 'White Iced Corner'), + ('furni_bed_budget*7_name', 'Green Pura Double Bed'), + ('furni_pura_mdl5*9_desc', 'Any way you like it!'), + ('nav_venue_club_massiva/2_name', 'Dancefloor'), + ('furni_scifiport*3_desc', 'Energy beams. No trespassers!'), + ('whisper', 'Whisper'), + ('furni_chair_plasto*4_name', 'Chair'), + ('furni_hc_bkshlf_name', 'Medieval Bookcase'), + ('furni_goodie1*2_name', 'Marzipan Man'), + ('furni_rare_fountain*1_name', 'Bird Bath (grey)'), + ('bb_text_hostInfo', 'Please choose a name for your Game and select the number of Teams.'), + ('hubu_t3_1', ''), + ('hubu_t3_2', 'Hubun kiertuekalenteri 2002'), + ('furni_sound_set_34_name', 'Rock 5'), + ('furni_rare_fountain*3_desc', 'For our feathered friends'), + ('nav_venue_sw_lobby_amateur_5_name', 'Snow Slingers Lobby'), + ('furni_pura_mdl3*2_name', 'Pink Pura Module 3'), + ('furni_xmas_cstl_wall_desc', 'Solid blocks of ice and snow'), + ('furni_arabian_tray1_name', 'Mint Tea Tray'), + ('furni_jp_tray4_name', 'jp_tray4'), + ('furni_grunge_candle_desc', 'Late night debate'), + ('furni_rclr_garden_name', 'Water Garden'), + ('furni_CFC_100_coin_gold_name', 'Gold Coin (China)'), + ('nav_venue_gate_park_name', 'Imperial Park'), + ('shopping_asagift', 'Buy As A Gift'), + ('furni_soft_sofachair_norja*7_desc', 'Sit back and relax'), + ('dance', 'Dance'), + ('roomatic_wrongpw', 'Oops! Sorry, your passwords don\'t match. Please enter them again.'), + ('furni_hc_trll_desc', 'For swanky dinners only'), + ('furni_prizetrophy3*2_desc', 'Shiny silver'), + ('modtool_roomkick', 'Room Kick'), + ('roomatic_letmove', 'Let other people move your furniture and place their own. (Furniture cannot be stolen.)'), + ('roomevent_default_description', ''), + ('nav_venue_sw_lobby_free_4/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('console_invalid_message', 'There was a message from a user that was probably removed your friend list. Note, user is removed from your friend list if you report a message to moderators.'), + ('poster_503_name', 'The Swiss flag'), + ('nav_venue_sw_arena_expert_name(0)', 'Playing expert game'), + ('poster_41_desc', 'For the best music-makers'), + ('furni_tile_name', 'Floor Tiles'), + ('furni_val_randomizer_name', 'Love Randomiser'), + ('nav_modify_doorstatus_open', 'Open'), + ('furni_plant_big_cactus_desc', 'Habbo Dreams monster in hiding! Shhhh'), + ('furni_safe_silo*8_desc', 'Totally shatter-proof!'), + ('wallitem_sw_hole_name', 'sw_hole'), + ('play_preview', 'Play preview of sounds'), + ('furni_table_plasto_round*14_name', 'Occasional Table'), + ('poll_thanks_window', 'Thanks!'), + ('wallitem_habbowheel_desc', 'So you gotta ask yourself "Do I feel lucky?"'), + ('furni_carpet_standard_name', 'Floor rug'), + ('furni_divider_nor1*8_name', 'Yellow Ice corner'), + ('nav_venue_bb_lobby_tournament_3/0_desc', ''), + ('buddyremove_ok_text', 'You have chosen enough friends to remove.'), + ('nav_venue_sw_lobby_intermediate_5/0_desc', 'Lumisota sen kuin vain kovenee.'), + ('furni_divider_nor4*7_desc', 'Habbos, roll out!'), + ('furni_summer_chair*3_desc', 'Black'), + ('furni_table_plasto_bigsquare*6_desc', 'Hip plastic furniture'), + ('gs_link_highscores', 'High Scores'), + ('Alert_purchasingerror', 'Buying unsuccessful'), + ('poster_5_desc', 'Quacking good design!'), + ('help_emergency_sent', 'A member of community staff will investigate the situation and take appropriate action. This may include sending you a response with advice on dealing with your issue.'), + ('room_user_page', 'Home Page'), + ('room_badge_window_title', 'Badge'), + ('login_name', 'Name of your Habbo'), + ('furni_divider_nor2*5_name', 'Pink Iced bar desk'), + ('nav_venue_habbo_lido_ii/0_desc', 'Dive right in!'), + ('furni_sporttrack2*2_name', 'Sport corner asphalt'), + ('roommatic_modify_size', 'Room size: %tileCount% tiles'), + ('pet.saying.sniff.croco.2', '*Sighs*'), + ('furni_prize2_name', 'Silver Trophy'), + ('Now you can find out how to get more cool Furniture for your room, or select another topic.', ''), + ('pet.saying.sniff.croco.0', 'Ewwwww....'), + ('pet.saying.sniff.croco.1', '*Sniff sniff*'), + ('furni_pura_mdl3*6_name', 'Blue Pura Module 3'), + ('poster_48_desc', 'All that glitters...'), + ('furni_wcandle_desc', 'Xmas tea light'), + ('nav_venue_bb_arena_3_name', 'Battle Ball Keskitaso'), + ('sound_machine_confirm_save_long', 'Are you sure you want to overwrite the current saved song?'), + ('purse_vouchers_helpurl', 'http://%predefined%/help/4'), + ('nav_venue_bouncer_room_2_name', 'Gevorderden Battle Ball Arena'), + ('furni_sand_cstl_gate_desc', 'sand_cstl_gate desc'), + ('furni_barrier*1_name', 'Yellow Maze Barrier'), + ('nav_venue_bb_lobby_tournament_0_name', 'Tournament'), + ('NUF_getting_room_roommatic_layout_tutor', 'Select what you want your room to look like. Use the arrows to cycle through different room layouts. Almost there, almost there...'), + ('poll_confirm_cancel', 'Stop answering?'), + ('furni_carpet_soft*4_desc', 'Soft Wool Rug'), + ('furni_rare_icecream_campaign_desc', 'Basic model'), + ('club_habbo.bottombar.text.notmember', 'Habbo Club'), + ('recycler_info_closed', 'Recycler is closed at the moment. Please check back later to recycle your Furniture.'), + ('furni_solarium_norja*8_desc', 'Rejuvenate your pixels!'), + ('callhelp_example', 'Example: How do I move my Furni?'), + ('furni_bed_budget_one*4_name', 'White Pura Bed'), + ('roomatic_givepwd', 'Password:'), + ('furni_teleport_door_name', 'Teleport Door'), + ('furni_table_silo_small*9_name', 'Red Area Occasional Table'), + ('furni_noob_chair*4_name', 'My first Habbo chair'), + ('furni_table_plasto_square*2_desc', 'Hip plastic furniture'), + ('room_waiting', 'Waiting to go in...'), + ('furni_sink_desc', 'Hot and cold thrown in for no charge'), + ('furni_doormat_plain_name', 'Doormat'), + ('nav_venue_eric\'s_eaterie_name', 'Eric\'s Eaterie'), + ('nav_venue_pizzeria_name', 'Slice of Life'), + ('poster_1004_desc', 'Celebrate with us'), + ('next', 'Next'), + ('furni_solarium_norja*9_name', 'Red Solarium'), + ('tutorial_quit_confirmation', 'You want to leave? Well I hope you learned something... something useful!'), + ('furni_val_teddy*2_desc', 'The pink bear of passion'), + ('poster_1003_name', 'UK Map'), + ('furni_glass_table*2_name', 'Glass table'), + ('NUF_habbo_home_url', 'http://d15-1.web.varoke.net/home/home-tutorial'), + ('furni_bed_silo_one_name', 'Single Bed'), + ('transaction_system_sms_win_btcellnet', 'O2 SMS'), + ('pet.hotwords.go_away', 'go away'), + ('furni_table_plasto_square*9_desc', 'Hip plastic furniture'), + ('furni_doormat_plain*4_name', 'Doormat'), + ('nav_venue_cunning_fox_gamehall_name', 'Cunning Fox Gamehall'), + ('furni_sound_machine*2_name', 'Ocean Traxmachine'), + ('furni_table_polyfon_name', 'Large Coffee Table'), + ('furni_hc_frplc_desc', 'Pixel-powered for maximum heating'), + ('console_request_massoperation_instruction', 'Use the options below to accept or decline ALL friend requests you have waiting.'), + ('nav_venue_bb_lobby_tournament_6/0_desc', ''), + ('furni_table_plasto_round*6_desc', 'Hip plastic furniture'), + ('trading_cancel', 'Cancel Trading'), + ('furni_glass_stool*3_name', 'Glass stool'), + ('furni_plant_mazegate_snow_name', 'Snowy Maze Gate'), + ('nav_venue_tv_studio_name', 'MuchMusic HQ'), + ('furni_table_norja_med*3_desc', 'For larger gatherings'), + ('furni_chair_plasty*8_desc', 'Hip plastic furniture'), + ('furni_bed_polyfon_name', 'Double Bed'), + ('gs_4teams', '4 Team Game'), + ('furni_sound_set_8_desc', 'Mellow electric grooves'), + ('ph_keys_jump', 'Jump:'), + ('reg_welcome', 'Welcome To Habbo Hotel!'), + ('purse_head', 'HABBO ACCOUNT ACTIVITY'), + ('nav_venue_bb_lobby_tournament_7_name', 'Competitie Battle Ball 8'), + ('reg_verification_newPasswordAgain', 'Retype new password:'), + ('furni_bardeskcorner_polyfon*8_desc', 'Yellow Mode Bardesk Corner'), + ('furni_sound_set_21_name', 'Rock 1'), + ('furni_gothic_stool*1_desc', 'The dark side of Habbo'), + ('furni_rope_divider_name', 'Rope Divider'), + ('poster_53_name', 'Hockey Stick'), + ('roomevent_default_desc', 'Event description..'), + ('nav_refresh_recoms', 'Refresh recommendations'), + ('nav_venue_sw_lobby_beginner_2_name', 'Snow Rookies Lobby'), + ('furni_divider_silo3*4_desc', 'Beige Area Gate'), + ('furni_divider_poly3*6_name', 'Blue Mode Bardesk Gate'), + ('reg_parentemail_title', 'Informing your parents'), + ('furni_gothgate_name', 'Gothic Portcullis'), + ('furni_mocchamaster_name', 'Mochamaster'), + ('modtool_message', 'Message:'), + ('furni_tree4_desc', 'Any presents under it yet?'), + ('furni_marquee*a_name', 'White Marquee'), + ('furni_queue_tile1*5_name', 'Knight Roller'), + ('furni_chair_polyfon_name', 'Dining Chair'), + ('furni_sleepingbag*9_name', 'Blue Sleeping Bag'), + ('furni_sound_set_9_name', 'Electronic 2'), + ('poster_39_desc', 'The rock masters of virtual music'), + ('furni_arabian_tetbl_desc', 'Serve up a treat'), + ('nav_venue_sw_lobby_free_9_name', 'Free Game Lobby'), + ('nav_venue_sw_arena_free_name(0)', 'Playing free for all game'), + ('furni_grand_piano*4_desc', 'Why is that key green?'), + ('furni_doorD_desc', 'Let\'s go over tzar!'), + ('purse_date', 'DATE'), + ('nav_venue_sw_lobby_beginner_6/0_desc', ''), + ('nav_venue_sw_lobby_beginner_4/0_desc', ''), + ('nav_venue_sw_lobby_intermediate_1_name', 'Snow Bombardiers Lobby'), + ('alert_reg_age', 'You are under 11 years old. Children under 11 can\'t enter Habbo Hotel.'), + ('nav_venue_bb_lobby_intermediate_9/0_desc', ''), + ('queue_set.c.alert', 'This room is for Habbo Club members only. In order to enter, you need to subscribe to Habbo Club.'), + ('sound_machine_confirm_clear_long', 'Are you sure you want to clear the current song?'), + ('furni_exe_drinks_name', 'Executive Drinks Tray'), + ('reg_bday_note', 'Please enter your correct date of birth, this is important! You\'ll need this information later on, if you want to change your password or e-mail.'), + ('modtool_roomalert', 'Room Alert'), + ('furni_rare_parasol*1_name', 'Yellow Parasol'), + ('furni_sound_set_18_name', 'Groove 4'), + ('sound_machine_window', 'Sound Machine Editor'), + ('furni_traffic_light*1_name', 'Classic Traffic Light'), + ('furni_chair_norja*4_desc', 'Sleek and chic for each cheek'), + ('furni_divider_nor1*2_desc', 'Black Ice corner'), + ('nav_venue_median_lobby_name', 'Median Lobby'), + ('furni_sofa_silo*3_desc', 'Cushioned, understated comfort'), + ('furni_bed_budget_desc', 'Comfortable, affordable!'), + ('furni_divider_nor4_name', 'Plain Iced Auto Shutter'), + ('furni_rare_icecream*6_desc', 'Virtual toffee rocks!'), + ('habboclub_txt1', 'You can buy Habbo Club one month at a time using Habbo Credits.'), + ('habboclub_txt3', 'Yes, I\'m over 14 years of age\\rOR\\rI\'m under 14 years of age and I have a permission from my parent/guardian to join Habbo Club.'), + ('furni_rare_dragonlamp*3_desc', 'Scary and scorching!'), + ('furni_noob_lamp*5_name', 'My first Habbo lamp'), + ('club_bottombar_text2', '(....)'), + ('furni_CFC_500_goldbar_name', 'Gold Bar (China)'), + ('club_bottombar_text1', 'Loading'), + ('furni_rare_elephant_statue*1_desc', 'Say hello to Nelly'), + ('furni_table_silo_med*7_name', 'Green Area Coffee Table'), + ('nav_venue_sw_lobby_free_1/0_desc', ''), + ('furni_bottle_desc', 'For interesting games!'), + ('furni_romantique_pianochair*2_desc', 'Let the music begin'), + ('furni_table_norja_med*2_name', 'Large Coffee Table Black'), + ('queue_set.e2.alert', 'This room is currently available only to Habbos participating to the event.'), + ('furni_solarium_norja_desc', 'Rejuvenate your pixels!'), + ('furni_table_plasto_square*14_desc', 'Hip plastic furniture'), + ('cam_save.help', 'Save & Print Photo'), + ('furni_sound_set_4_desc', 'Chilled out beats'), + ('furni_couch_norja*6_name', 'Blue Bench'), + ('poster_2003_desc', 'Would you trust this man?'), + ('hobba_cryforhelp', 'Call For Help:'), + ('furni_marquee*9_desc', 'It\'s both door and a shade!'), + ('nav_venue_bb_lobby_tournament_13/0_desc', ''), + ('poster_512_desc', 'The flag of Ireland'), + ('handitem12', 'Macchiato'), + ('object_displayer_hide_actions', 'Hide actions'), + ('furni_sound_set_25_name', 'Dance 1'), + ('handitem11', 'Mocha'), + ('handitem10', 'Latte'), + ('furni_sound_set_13_desc', 'Let Music be the food of Habbo'), + ('handitem16', 'Cappuccino'), + ('handitem15', 'Iced'), + ('handitem14', 'Filter'), + ('handitem13', 'Espresso'), + ('nav_venue_sw_lobby_free_2_name', 'Free Game Lobby'), + ('handitem19', 'Habbo Cola'), + ('nav_venue_sw_lobby_amateur_2/0_desc', ''), + ('handitem18', 'Tap'), + ('handitem17', 'Java'), + ('console_next_msg', 'Delete'), + ('furni_bardesk_polyfon*5_name', 'Candy Bar'), + ('furni_scifidoor*5_desc', 'There out of this world!'), + ('nav_roomispwprotected', 'The room is password protected.'), + ('furni_sleepingbag*2_name', 'Lime Sleeping Bag'), + ('furni_glass_table*6_name', 'Blue Glass Table'), + ('furni_divider_nor4*3_desc', 'Habbos, roll out!'), + ('furni_sound_set_61_name', 'Latin Love 3'), + ('nav_venue_pizza/0_desc', 'Pizza Palace'), + ('furni_romantique_clock_desc', ''), + ('furni_queue_tile1*0_desc', 'The power of movement'), + ('furni_pura_mdl2*9_desc', 'Any way you like it!'), + ('nav_venue_orient/0_name', 'Club Golden Dragon'), + ('furni_noob_table*1_desc', 'Lightweight, practical and orange'), + ('poster_22_desc', 'beautiful reproduction butterfly'), + ('furni_carpet_soft_name', 'Soft Wool Rug'), + ('Message', 'Message'), + ('furni_bed_trad_one_desc', 'All you need for a good night\'s kip'), + ('console_report_help', 'If the message you received was abusive or harassing, you can report it to the Moderators by clicking the Report button below. The Habbo will be removed from your Friends\' List automatically when you report. If you want to remove a Habbo from your Friends\' List without reporting their message, simply use the Remove button below.'), + ('furni_rcandle_desc', 'Xmas tea light'), + ('furni_sofa_silo*8_name', 'Yellow Two-Seater Sofa'), + ('furni_pura_mdl4*5_desc', ''), + ('NUF_mini_use_console_ready_tutor', 'You can now use the Console to find some of your friends, or you can continue the tutorial.'), + ('log_problem_link', 'Read FAQ\'s'), + ('furni_shelves_silo_name', 'Bookcase'), + ('gs_timetojoin', '\\x seconds to join'), + ('nav_venue_cunning_fox_gamehall/1_name', 'Gamehall Lobby'), + ('furni_safe_silo*7_name', 'Green Safe Minibar'), + ('NUF_mini_meet_people_hotelview_tutor', 'The Navigator lets you move between rooms in the Hotel. Open it up to get started!'), + ('purse_vouchers_sendbutton', 'Get Credits!'), + ('furni_gothic_sofa*4_name', 'Black Gothic Sofa'), + ('furni_wooden_screen*0_desc', 'Add an exotic touch to your room'), + ('catalog_give_trophymsg', 'You haven\'t engraved the trophy. Type \\ryour inscription in the grey box.'), + ('furni_prizetrophy5*3_name', 'Duo trophy'), + ('handitem23', 'Beetroot Habbo Soda'), + ('furni_rare_dragonlamp*8_name', 'Bronze Dragon Lamp'), + ('furni_divider_nor4*8_name', 'Yellow Iced Auto Shutter'), + ('handitem22', 'Lime Habbo Soda'), + ('furni_soft_sofa_norja*6_name', 'Blue Iced Sofa'), + ('handitem21', 'Hamburger'), + ('handitem20', 'Camera'), + ('furni_divider_nor1*9_desc', 'Red Ice corner'), + ('help_trouble', 'In Trouble?'), + ('handitem25', 'Love potion'), + ('handitem24', 'Bubble juice from 1999'), + ('furni_ham2_desc', 'Looks like you\'re too late!'), + ('nav_venue_bb_lobby_amateur_3_name', 'Gevorderden Battle Ball 4'), + ('furni_chair_plasto*15_name', 'Chair'), + ('furni_hyacinth1_desc', 'Beautiful bulb'), + ('furni_shelves_basic_desc', 'Pura series 404 shelves'), + ('furni_pura_mdl1*6_name', 'Blue Pura Module 1'), + ('nav_venue_cafe_gold/0_desc', 'Get the latest safety tips and tricks from Safety eXperts.'), + ('nav_venue_snowwar_lobby_name', 'Snow Storm Lobby'), + ('transaction_system_sms_slahti', 'Saunalahti'), + ('alert_tooLongPW', 'Your password is too long'), + ('furni_carpet_standard*5_desc', 'Available in a variety of colours'), + ('furni_deadduck_desc', 'Blood, but no guts'), + ('password.email.subject', 'Forgotten password'), + ('furni_prizetrophy2*3_desc', 'Breathtaking bronze'), + ('NUF_playing_games_hotelview_nav', 'Just click me to open the Navigator and get it over with...'), + ('furni_summer_chair*1_name', 'Aqua Deck Chair'), + ('furni_rubberchair*3_name', 'Orange Inflatable Chair'), + ('furni_exe_plant_desc', ''), + ('nav_venue_tearoom/0_desc', 'Chat with the people of Aoralia and meet a sprite or two!'), + ('nav_venue_sw_lobby_beginner_9/0_desc', ''), + ('furni_table_silo_med*6_name', 'Blue Area Coffee Table'), + ('nav_venue_sw_lobby_beginner_1/0_desc', ''), + ('furni_noob_stool*2_desc', 'Unfold me and take the weight off (dark blue)'), + ('camera_dialog_place', 'Move'), + ('furni_scifiport*8_desc', 'Energy beams. No trespassers!'), + ('url_peeloscore', 'http://%predefined%///groups/56555/id'), + ('console_follow_friend', 'Go to same room'), + ('sound_machine_alert_jukebox_list_full', 'The play list is full. Please wait until the current song has finished playing and try again.'), + ('poster_517_desc', 'Where\'s your kilt?'), + ('roomevent_type_11', 'Helpdesk'), + ('roomevent_type_10', 'Performance'), + ('furni_rare_dragonlamp*9_desc', 'Scary and scorching!'), + ('furni_pura_mdl2*3_name', 'Black Pura Module 2'), + ('url_help_1', 'http://%predefined%//credits'), + ('furni_edicehc_name', 'Dicemaster'), + ('furni_divider_silo1*8_name', 'Yellow Corner Shelf'), + ('furni_wooden_screen*5_desc', 'Add an exotic touch to your room'), + ('url_help_5', 'http://%predefined%/help/75'), + ('roomatic_intro2', 'Here\'s what one Habbo says about her room:'), + ('url_help_4', 'http://%predefined%//help/22'), + ('roomatic_intro1', 'You can decorate and furnish your room however you like and no one can tell you to tidy up or turn the music down. It\'s up to you if you let everyone in or just a chosen few, or lock the door and chill by yourself. Get creating and in a couple of minutes you\'ll have your own Habbo Hotel space.'), + ('url_help_3', 'http://%predefined%//help/'), + ('roomatic_intro3', 'My mates live miles away, but we can meet up in my room every Friday night and we don\'t have to worry about getting home afterwards.'), + ('url_help_2', 'http://%predefined%//profile?tab=4'), + ('furni_romantique_chair*5_name', 'Onyx Chair'), + ('url_help_6', 'http://www.habbohotel.co.uk/iot/go?lang=en&country=uk'), + ('furni_sound_set_20_name', 'SFX 2'), + ('furni_sofa_polyfon*4_desc', 'Beige Mode Sofa'), + ('sound_machine_alert_no_more_songs', 'Can\'t create new song! Traxmachine can have only %count% songs.'), + ('search', 'Search'), + ('room_preparing', '...Preparing room'), + ('nav_venue_bb_lobby_intermediate_0/0_desc', ''), + ('club_txt_renew2', 'You are Habbo Club member. If you want to change your subscription or leave the club, use the link below.'), + ('poster_1002_name', 'Queen Mum Poster'), + ('furni_barchair_silo*2_desc', 'Practical and convenient'), + ('reg_month', 'Month'), + ('club_txt_renew1', 'Your Habbo Club membership will be active for another %days% days. You can extend your membership by paying with Habbo Credits.'), + ('furni_rare_icecream*0_name', 'Cherry Ice Cream Machine'), + ('furni_sound_set_41_desc', 'Burning Riffs'), + ('nav_venue_beauty_salon_loreal_name', 'Beauty salon'), + ('poster_26_name', 'Angel Poster'), + ('furni_sound_set_19_name', 'Hip Hop Beats 4'), + ('furni_romantique_divan*4_name', 'Amber Chaise-Longue'), + ('furni_one_way_door*7_desc', 'One at a time!'), + ('sound_machine_confirm_eject_long', 'Are you sure you want to remove the Traxpack and it\'s samples from the song?'), + ('furni_glass_stool*8_desc', 'Translucent beauty'), + ('buddyremove_not_now', 'Cancel'), + ('no_user_for_gift', 'No user named %user% found. Gift not purchased.'), + ('buddyremove_lessoptions', 'Less Options <<'), + ('reg_legal_header1', 'Now you need to ask your parents/guardian to come to the computer. Read through the text (below) with your parents.'), + ('furni_carpet_soft*3_desc', 'Soft Wool Rug'), + ('reg_legal_header2', 'Read through the below text carefully. You must agree to the following terms before entering Habbo Hotel.'), + ('furni_sw_chest_name', 'sw_chest'), + ('nav_venue_sw_lobby_tournament_9_name', 'Tournament Lobby'), + ('messenger.email.footer', ''), + ('nav_venue_bb_arena_4_name', 'Battle Ball Expertit'), + ('club_change_url', 'http://%predefined%//credits/habboclub'), + ('furni_table_plasto_4leg*2_name', 'Occasional Table'), + ('ph_choosecolour', 'Choose Costume Colour'), + ('buddyremove_hc_more_info', 'More Info About Habbo Club >>'), + ('furni_romantique_smalltabl*1_desc', 'Every tray needs a table...'), + ('nav_venue_sw_lobby_tournament_8_name', 'Tournament Lobby'), + ('furni_divider_nor5_name', 'Plain Iced Angle'), + ('wallitem_roomdimmer_name', 'Mood Light'), + ('furni_bed_budget_one*5_name', 'Beige Pura Bed'), + ('furni_table_norja_med*9_name', 'Large Coffee Table Red'), + ('furni_pillow*3_desc', 'Puffy, soft and huge'), + ('furni_noob_rug*2_name', 'My first Habbo rug'), + ('nav_venue_sw_lobby_beginner_7_name', 'Snow Rookies Lobby'), + ('furni_exe_chair_desc', 'Relaxing leather comfort'), + ('furni_s_sound_machine*2_desc', 'Sound Machine Ocean Desc'), + ('nav_venue_dusty_lounge/0_desc', 'A dignified lounge for sitting back and enjoying a licorice pipe'), + ('game_bs_ship4', 'Destroyer(s)'), + ('game_bs_ship3', 'Cruiser(s)'), + ('game_bs_ship2', 'Battle Ship(s)'), + ('game_bs_ship1', 'An aircraft carrier'), + ('furni_table_plasto_bigsquare*4_name', 'Square Dining Table'), + ('openhrs_title', 'We are closing the hotel'), + ('furni_habbowood_chair_name', 'Director\'s Chair'), + ('roomatic_confirm', 'Confirm password:'), + ('poster_14_desc', 'A cunning painting'), + ('furni_doormat_plain*3_name', 'Doormat'), + ('furni_sound_set_3_desc', 'Chilled grooves'), + ('win_messenger', 'Habbo Console'), + ('summer_chair_7_name', 'Green Deck Chair'), + ('notickets_window_header', 'Tickets needed!'), + ('nav_updatenote', 'Updating your room properties may take a while. The changes have been made, but it\'ll take a few minutes until all Habbos can see them.'), + ('furni_table_plasto_bigsquare*5_name', 'Square Dining Table'), + ('url_purselink', 'http://%predefined%//credits?'), + ('console_follow_hotelview', 'Your friend is on the hotel view.'), + ('furni_solarium_norja*3_desc', 'Get the city look!'), + ('sound_machine_alert_song_name_missing', 'Please give your song a name.'), + ('furni_sound_machine*3_name', 'Green Traxmachine'), + ('jukebox_next_up', 'Next up:'), + ('trading_additems', 'Put items in boxes'), + ('furni_sporttrack3*1_name', 'Sport goal tartan'), + ('club_button_3_period', 'Buy 6 >>>'), + ('nav_delroom3', 'Room deleted!'), + ('nav_delroom2', 'Are you sure you want to delete this room? All the furniture left in it will also be deleted.'), + ('poster_34_name', 'Scamme\'d'), + ('go', 'Go >>'), + ('nav_delroom1', 'If you want to save the furniture in this room, move it to the giant hand before you continue.'), + ('console_habboprofile_arrowed', 'Habbo Profile >>'), + ('furni_chair_plasty*10_desc', 'Hip plastic furniture'), + ('cam_txtscreen.help', 'Caption'), + ('wallitem_item_placeholder_name', 'This furniture is downloading...'), + ('furni_carpet_standard*b_desc', 'Available in a variety of colours'), + ('poster_59_name', 'Torch'), + ('furni_chair_basic*4_name', 'White Pura Egg Chair'), + ('summer_chair_1_name', 'Aquamarine Deck Chair'), + ('nav_venue_space_cafe_name', 'Ten Forward'), + ('log_problem_url', 'http://%predefined%//help/faqs?faq_1_categoryId=14'), + ('group_homepage_url', 'http://%predefined%/groups/%groupid%/id'), + ('furni_heart_name', 'Giant Heart'), + ('nav_venue_sw_arena_beginner_name', 'Playing beginner game'), + ('furni_grunge_chair_name', 'Grunge Chair'), + ('nav_dooropens', 'Door opens! Go on in...'), + ('modtool_banuser', 'Ban User'), + ('furni_carpet_soft_tut_desc', 'Welcome, enjoy your stay!'), + ('furni_rare_mnstr_name', 'Venomus Habbolus'), + ('furni_divider_silo3*9_name', 'Red Area Gate'), + ('furni_pura_mdl3*1_name', 'Aqua Pura Module 3'), + ('Messages', 'Message(s)'), + ('wallitem_arabian_wndw_name', 'Arabian Window Frame'), + ('furni_prizetrophy3*1_desc', 'Glittery gold'), + ('furni_sound_set_47_desc', 'Storm the UKCharts!'), + ('poster_54_desc', 'whack that ball!'), + ('url_logout_concurrent', 'http://%predefined%//account/disconnected?reason=concurrentlogin&origin=popup'), + ('nav_venue_sw_lobby_beginner_1_name', 'Snow Rookies Lobby'), + ('furni_table_plasto_4leg*8_name', 'Occasional Table'), + ('sound_machine_turn_on', 'Switch On'), + ('furni_table_norja_med*4_desc', 'For larger gatherings'), + ('buddyremove_hc_info_url', 'http://www.habbo.co.uk/credits/habboclub'), + ('furni_romantique_divider*2_name', 'Green Screen'), + ('furni_pillar*5_desc', 'Find your natural roots'), + ('furni_table_silo_med_desc', 'Wipe clean and unobtrusive'), + ('furni_pillow*8_name', 'Navy Cord Pillow'), + ('room_owner', 'Owner:'), + ('furni_shelves_norja*5_name', 'Pink Bookcase'), + ('queue_set.d.info', 'There are %d% Habbos in front of you in the queue.'), + ('reg_retypepass', 'Retype Password:'), + ('furni_jp_tray3_name', 'jp_tray3'), + ('dance_stop', 'Stop Dancing'), + ('buddyremove_remove_text', 'You are about to remove %removeamount% friends from your friendlist.\\r\\r After removal, you\'ll have %amountleft% friends on your list:'), + ('nav_venue_bb_lobby_tournament_12_name', 'Competitie Battle Ball 13'), + ('furni_summer_chair*2_name', 'Deck Chair'), + ('furni_plant_valentinerose*1_desc', 'Secret admirer!'), + ('furni_sofachair_silo*4_name', 'Beige Area Armchair'), + ('poster_523_name', 'The flag of India'), + ('furni_scifirocket*4_name', 'Venus Smoke Machine'), + ('nav_venue_tearoom_name', 'Chinese Tea Room'), + ('furni_pura_mdl1*5_name', 'beige pura module 1'), + ('nav_venue_bb_lobby_tournament_0/0_desc', ''), + ('furni_chair_silo*5_desc', 'Pink Silo Dining Chair'), + ('club_txt_expired', 'Your Habbo Club membership has run out. You can join the club again by clicking the HC logo on the hotel view.\\rMembers of Habbo Club get priority access to the hotel (so you can always get in), exclusive clothes, hair colours, rare furni and special guest room layouts. To see exactly what you\'ll be able to get your hands on as a Habbo Club member, take a look in the Catalogue.'), + ('furni_glass_table*7_name', 'Green Glass Table'), + ('nav_prvrooms_notfound', 'Your search did not match any rooms'), + ('bb_title_BBscores2', 'Game over!'), + ('wallitem_gothicfountain_name', 'Gothic Ectoplasm Fountain'), + ('furni_one_way_door*1_desc', 'One at a time!'), + ('furni_chair_plasty*1_name', 'Plastic Pod Chair'), + ('furni_divider_nor3*9_name', 'Red Iced gate'), + ('sound_machine_time_2', '%min%:%sec%min'), + ('sound_machine_time_1', '%min%:%sec%min'), + ('furni_bardesk_polyfon*4_name', 'Beige Mode Bardesk'), + ('queue_set.queue_reset.alert', 'The queue for this room has been reset, please try again.'), + ('furni_jp_pillow_desc', 'Comfy and classical'), + ('nav_venue_sw_lobby_free_9/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('furni_barchair_silo*8_desc', 'Practical and convenient'), + ('delete_furniture', 'Delete Furniture (permanently)'), + ('furni_plant_bulrush_desc', 'Ideal for the riverside'), + ('poster_61_name', 'Siva Poster'), + ('furni_bed_silo_two_name', 'Double Bed'), + ('furni_plant_pineapple_desc', 'Needs loving glances'), + ('furni_bed_polyfon_girl_desc', 'Snuggle down in princess pink'), + ('furni_pillow*4_desc', 'Puffy, soft and huge'), + ('furni_table_norja_med*8_name', 'Large Coffee Table Yellow'), + ('transaction_system_tsms_win_tmobile', 'T-Mobile SMS'), + ('furni_scifidoor*10_desc', 'There out of this world!'), + ('furni_bed_polyfon*7_desc', 'Green Mode Double Bed'), + ('furni_toy1*2_desc', 'it\'s bouncy-tastic'), + ('transaction_system_sms_radiolinja', 'Elisa'), + ('furni_gothic_chair*4_name', 'Black Gothic Chair'), + ('furni_scifidoor*6_desc', 'Monolith goes up! Monolith goes down!'), + ('nav_venue_sw_lobby_free_3_name', 'Free Game Lobby'), + ('console_friend_request_not_found', 'There was an error finding the user for the friend request'), + ('furni_romantique_smalltabl*2_desc', 'Every tray needs a table...'), + ('furni_bed_budget*2_name', 'Pink Pura Double Bed'), + ('wallitem_post.it_name', 'Pad of stickies'), + ('gs_state_created', 'Waiting for players..'), + ('furni_divider_nor3*4_desc', 'Entrance or exit?'), + ('furni_sofa_polyfon_girl_desc', 'Romantic pink for two'), + ('locked', 'Locked (visitors have to ring bell)'), + ('alert_reg_birthday', 'Birthday'), + ('club_thanks_text', 'Here you can see your Habbo Club membership status, number of elapsed months, pre-ordered months and status of the ongoing month.'), + ('furni_sound_set_39_desc', 'Rock with a roll'), + ('nav_venue_old_skool/0_desc', 'A set of rooms inspired by the original and legendary Mobiles Disco, the progenitor of Habbo'), + ('poster_511_desc', 'The flag of The Netherlands'), + ('furni_couch_norja*7_name', 'Rural Iced Bench'), + ('furni_safe_silo*6_name', 'Blue Safe Minibar'), + ('furni_table_plasto_4leg*14_desc', 'Aqua table'), + ('room_sound_furni_limit', 'You can only place one sound furni per room'), + ('nav_venue_bb_lobby_beginner_15/0_desc', ''), + ('furni_glass_shelf_name', 'Glass shelf'), + ('furni_divider_nor2*6_desc', 'Blue Iced bar desk'), + ('furni_turkey_name', 'Roast Turkey'), + ('nav_venue_bb_lobby_tournament_16/0_desc', ''), + ('sw_timeleft', 'Time:'), + ('furni_rare_parasol_name', 'Parasol'), + ('furni_glass_sofa*7_desc', 'Habbo Club'), + ('furni_bardeskcorner_polyfon*13_name', 'Corner Cabinet/Desk'), + ('furni_rare_fan*9_name', 'Fucsia Powered Fan'), + ('furni_chair_plasto*4_desc', 'Hip plastic furniture'), + ('no', 'No'), + ('furni_rare_fan*4_desc', 'Fanning the fires of SUPERLOVE...'), + ('nav_venue_median_lobby/0_desc', 'A Mean place to hang'), + ('nav_venue_sw_lobby_intermediate_2/0_desc', ''), + ('furni_md_sofa_name', 'MD Sofa'), + ('furni_noob_lamp*1_desc', 'Get the light right where you want it (yellow)'), + ('login_connecting', 'Connecting...'), + ('furni_divider_nor1*3_desc', 'Looks squishy, but isn\'t!'), + ('furni_sound_set_14_desc', 'Rock them bodies'), + ('furni_sound_set_59_name', 'RnB Grooves 5'), + ('poster_21_desc', 'beautiful reproduction butterfly'), + ('wallitem_hc_wall_lamp_desc', 'Tres chic!'), + ('ok', 'OK'), + ('nav_venue_sw_lobby_tournament_1/0_desc', ''), + ('pet_happy', 'Happiness:'), + ('sound_machine_edit', 'Edit Song'), + ('furni_rare_elephant_statue*2_desc', 'Say hello to Nelly'), + ('furni_CFC_200_moneybag_desc', 'Worth 200 Credits'), + ('nav_venue_bb_lobby_intermediate_6/0_desc', ''), + ('console_buddylimit_requester', 'Friend could not be added. The request sender can not have anymore friends.'), + ('furni_sofa_silo*2_desc', 'Cushioned, understated comfort'), + ('sound_machine_alert_invalid_song_name', 'You have already burned another song with the same name. Please change the song name before trying again.'), + ('furni_fireplace_armas_name', 'Fireplace'), + ('furni_barchair_silo*3_desc', 'Practical and convenient'), + ('ph_ticket', 'Ticket'), + ('furni_arabian_divdr_desc', 'Carved Cedar Divider'), + ('wallitem_jp_ninjastars_desc', 'Not a frisbee'), + ('wallitem_hrella_poster_1_desc', 'Brighten up your cabin'), + ('furni_noob_stool*3_desc', 'Unfold me and take the weight off (aubergine)'), + ('furni_pura_mdl5*9_name', 'Red Pura Module 5'), + ('furni_divider_nor4*2_desc', 'Habbos, roll out!'), + ('NUF_mini_meet_people_roomlist_tutor', 'Click \'Open\' to open up a category and see what rooms are within. When you have found an interesting room, press \'Go\' to visit it.'), + ('poster_41_name', 'Habbo Golden Record'), + ('furni_jp_tray4_desc', 'jp_tray4'), + ('buddyremove_confirm', 'Yeah, it is done...'), + ('tutorial_topic_list_F', 'Choose a topic from the list below:'), + ('purse_time', 'TIME'), + ('nav_venue_sw_lobby_free_8_name', 'Free Game Lobby'), + ('tutorial_topic_list_M', 'Choose a topic from the list below:'), + ('furni_s_sound_machine*7_name', 'Sound Machine Red'), + ('interface_icon_navigator', 'Navigator, navigate around'), + ('furni_xmas_cstl_wall_name', 'Ice Castle Wall'), + ('nav_own_hd', 'Your Rooms.'), + ('modtool_aa_checkbox_text', 'Audio alert'), + ('wallitem_industrialfan_desc', 'Powerful and resilient'), + ('furni_bed_budget*8_desc', 'King sized comfort!'), + ('sound_machine_burn', 'Burn Song'), + ('nav_venue_sw_lobby_intermediate_0_name', 'Snow Bombardiers Lobby'), + ('nav_venue_bb_lobby_beginner_1_name', 'Beginners Battle Ball 2'), + ('furni_chair_basic*5_desc', ''), + ('password.email.prefix', 'Your password is:'), + ('furni_pura_mdl5*4_desc', 'Any way you like it!'), + ('furni_table_norja_med*3_name', 'White Iced Table'), + ('furni_pura_mdl3*2_desc', 'Any way you like it!'), + ('nav_venue_sw_lobby_tournament_3_name', 'Tournament Lobby'), + ('furni_sound_set_34_desc', 'For guitar heroes'), + ('furni_summer_grill*1_desc', 'Plenty of ribs on that barbie'), + ('hubu_t4_1', 'Anna palautetta Hubusta'), + ('furni_divider_nor1*8_desc', 'Yellow Ice corner'), + ('hubu_t4_2', 'Tsekkaa heebelin jorinat'), + ('poll_offer_title', 'Poll'), + ('summer_chair_2_desc', 'Leave your towel early'), + ('wallitem_habbowheel_name', 'The Wheel of Destiny!'), + ('reg_mission', 'Your Mission:'), + ('furni_sofa_polyfon*9_name', 'Red Two-seater Sofa'), + ('furni_bed_budget_one_desc', 'aquamarine'), + ('nav_venue_sw_lobby_tournament_7/0_desc', ''), + ('furni_gothic_sofa*3_name', 'Gothic Sofa Red'), + ('furni_chair_plasto*9_name', 'Chair'), + ('nav_venue_sw_arena_beginner_name(0)', 'Playing beginner game'), + ('notickets_text_2', 'Buy more tickets now and get a discount. You can also buy tickets as a present.'), + ('wallitem_sw_hole_desc', 'sw_hole'), + ('furni_plant_big_cactus_name', 'Mature Cactus'), + ('notickets_text_1', 'Game price is 1 credit. For that you get 2 tickets.'), + ('poster_19_name', 'Hole In The Wall'), + ('furni_divider_nor4*7_name', 'Rural Iced Shutter'), + ('email', ''), + ('furni_sound_set_13_name', 'Dance 5'), + ('furni_present_gen1_name', 'Gift'), + ('nav_venue_bb_lobby_tournament_19/0_desc', ''), + ('furni_chair_norja_desc', 'Sleek and chic for each cheek'), + ('furni_marquee*9_name', 'Green Marquee'), + ('sound_machine_alert_song_locked', 'The song you\'re editing can\'t be modified. Please save the song under another name to create a new copy.'), + ('furni_glass_stool*2_name', 'Glass stool'), + ('nav_venue_theatredrome_xmas/0_desc', ''), + ('poster_5_name', 'Duck Poster'), + ('furni_prize2_desc', 'Nice and shiny'), + ('furni_valeduck_desc', 'He\'s lovestruck'), + ('furni_chair_plasty*7_desc', 'Hip plastic furniture'), + ('closed', 'Closed'), + ('furni_wcandleset_name', 'White Candle Plate'), + ('furni_sleepingbag*3_name', 'Ocean Sleeping Bag'), + ('furni_tree3_name', 'Christmas Tree 1'), + ('furni_sound_set_26_name', 'Groove 1'), + ('furni_barrier*2_desc', 'No trespassing, please!'), + ('game_bs_turn1', 'Your Turn'), + ('nav_venue_bb_lobby_expert_desc', 'Expert battle ball!'), + ('alert_donate_topic', 'SCAM ALERT!'), + ('game_bs_turn2', 'The Enemy\'s Turn'), + ('furni_sand_cstl_gate_name', 'sand castle gate'), + ('furni_rare_dragonlamp*4_desc', 'Scary and scorching!'), + ('furni_camera_desc', 'Smile!'), + ('pet.hotwords.lie', 'lie down'), + ('furni_sound_set_60_name', 'Latin Love 2'), + ('console_accept_selected', 'Accept'), + ('furni_divider_silo1*3_desc', 'Neat and natty'), + ('furni_summer_chair*7_name', 'Green Deck Chair'), + ('furni_pumpkin_desc', 'Cast a spooky glow'), + ('reg_habboname_note', 'Now it\'s time to make your own Habbo character! To make your own Habbo, please start by choosing your Habbo Name.'), + ('furni_rare_icecream_campaign_name', 'Rare icecream white'), + ('furni_doormat_plain_desc', 'Available in a variety of colours'), + ('room_areYouSure', 'Are you sure you want to delete this item forever?'), + ('sound_machine_confirm_burn', 'Burn this song?'), + ('predefined_room_name', '%user_name%\'s room'), + ('furni_divider_silo1*2_name', 'Black Corner Shelf'), + ('furni_table_plasto_4leg*3_desc', 'Hip plastic furniture'), + ('furni_solarium_norja*8_name', 'Yellow Solarium'), + ('furni_exe_globe_desc', 'The power is yours!'), + ('furni_bed_polyfon*6_name', 'Blue Mode Double Bed'), + ('notickets_store_link', 'Go to ticket store >>>'), + ('NUF_habbo_home', 'Habbo Home'), + ('nav_venue_the_den_name', 'The Den'), + ('furni_table_plasto_square*2_name', 'Round Dining Table'), + ('modtool_header', 'The Tool'), + ('pet_enrg_7', 'Energetic'), + ('nav_noanswer', 'No answer'), + ('roommatic_hc_members_only', 'This Room Is For HC Members Only'), + ('furni_xmasduck_desc', 'A right Christmas quacker!'), + ('pet_enrg_8', 'Lively'), + ('NUF_getting_room_own_rooms_tutor', 'Click the \'Create own room\' button to start building your room. Don\'t worry, making your room is completely free.'), + ('pet_enrg_5', 'Sprightly'), + ('pet_enrg_6', 'Active'), + ('furni_doormat_plain*4_desc', 'Available in a variety of colours'), + ('pet_enrg_3', 'Lazy'), + ('pet_enrg_4', 'Relaxed'), + ('furni_divider_poly3*6_desc', 'Blue Mode Bardesk Gate'), + ('pet_enrg_1', 'Slow'), + ('furni_glass_table*2_desc', 'Translucent beauty'), + ('pet_enrg_2', 'Sluggish'), + ('poster_1003_desc', 'get the lovely isles on your walls'), + ('furni_hc_djset_name', 'The Grammophon'), + ('pet_enrg_9', 'Tireless'), + ('furni_table_plasto_round*6_name', 'Round Dining Table'), + ('furni_sporttrack2*3_name', 'Sport corner grass'), + ('furni_footylamp_name', 'Football Lamp'), + ('furni_bed_silo_one_desc', 'Plain and simple'), + ('pet_enrg_0', 'Tired'), + ('furni_soft_sofachair_norja*7_name', 'Rural Iced Sofachair'), + ('furni_solarium_norja*9_desc', 'Rejuvenate your pixels!'), + ('furni_pillow*9_desc', 'Puffy, soft and VERY fluffy!'), + ('furni_plant_mazegate_snow_desc', 'There\'s snow way through!'), + ('furni_sound_set_8_name', 'Ambient 2'), + ('furni_divider_silo3*4_name', 'Beige Area Gate'), + ('previous', 'Previous'), + ('furni_glass_stool*3_desc', 'Translucent beauty'), + ('furni_bardeskcorner_polyfon*8_name', 'Yellow Mode Bardesk Corner'), + ('next_onearrowed', 'Next >'), + ('nav_venue_sw_lobby_expert_desc', 'For the William Tells and Robin Hoods of Snow Storming.'), + ('furni_bardeskcorner_polyfon*2_name', 'Black Mode Bardesk Corner'), + ('catalog_pet_unacceptable', 'Sorry, that name is unacceptable to Hotel Management'), + ('furni_sound_set_46_name', 'Club 1'), + ('nav_error_room_full', 'The room is full.'), + ('furni_queue_tile1*4_name', 'Gold Habbo Roller'), + ('furni_mocchamaster_desc', 'Wake up and smell it!'), + ('furni_gothic_stool*1_name', 'Gothic Stool Pink'), + ('furni_noob_chair*5_name', 'My first Habbo chair'), + ('furni_noob_rug*3_desc', 'Nice and neat sisal rug with aubergine edging'), + ('nav_venue_club_mammoth/0_name', 'Club Mammoth'), + ('pet_race_1_024', 'Cat Burglar'), + ('pet_race_1_022', 'Matted Moggy'), + ('poster_39_name', 'Screaming Furnies'), + ('pet_race_1_023', 'Indoor Alley Cat'), + ('furni_prizetrophy5*3_desc', 'Breathtaking bronze'), + ('pet_race_1_020', 'Caterwaul Kitty'), + ('NUF_mini_meet_people_room_tutor', 'The people wandering around are Habbos just like you.\\nClick on one of them to learn more about them- or on yourself to look in the mirror.'), + ('pet_race_1_021', 'Fabulous Feline'), + ('furni_arabian_tetbl_name', 'Hexagonal Tea Table'), + ('furni_grand_piano*4_name', 'Amber Grand Piano'), + ('poster_504_desc', 'The German flag'), + ('roomatic_name', 'Room name:'), + ('furni_sound_set_21_desc', 'Headbanging riffs'), + ('credit_redeem_info', 'More info about credit furni >>'), + ('furni_marquee*a_desc', 'It\'s both door and a shade!'), + ('furni_sound_set_33_name', 'Rock 3'), + ('furni_queue_tile1*5_desc', 'The power of movement'), + ('furni_doorD_name', 'Imperial Teleport'), + ('furni_rare_parasol*1_desc', 'Block those rays!'), + ('purse_youhave', 'You Have'), + ('nav_fullbutton', 'Full'), + ('furni_rare_fountain*2_desc', 'For our feathered friends'), + ('friend_request_accepted', 'Accepted!'), + ('tutorial_help_button_bubble', 'Click the blue question mark to open up the help menu to restart the tutorial.'), + ('furni_rubberchair*4_desc', 'Soft and tearproof!'), + ('furni_sound_set_9_desc', 'Mystical ambient soundscapes'), + ('furni_rare_fan*3_name', 'Purple Dragon Skin Fan'), + ('furni_table_plasto_square*8_desc', 'Hip plastic furniture'), + ('gs_choose_gametime', 'Choose Game duration:'), + ('furni_traffic_light*1_desc', 'Chill and wait your turn!'), + ('furni_sofachair_polyfon*6_desc', 'Blue Mode Armchair'), + ('furni_chair_norja*4_name', 'Urban Iced Chair'), + ('furni_val_teddy*2_name', 'Pink Share Bear'), + ('nav_venue_chill/0_name', 'Zen Garden'), + ('furni_table_plasto_square_name', 'Occasional Table'), + ('furni_bed_budget_name', 'Pura Bed'), + ('furni_solarium_norja_name', 'White Solarium'), + ('furni_noob_table*1_name', 'My first Habbo table'), + ('gs_5min', '5min'), + ('purse_credits', 'You have \\x1 Habbo Credit(s) in your purse.'), + ('furni_divider_poly3*5_name', 'Candy Hatch (Lockable)'), + ('furni_rare_icecream*6_name', 'Toffee Ice Cream Machine'), + ('furni_table_polyfon_med_name', 'Large Coffee Table'), + ('console_deselect_all', 'Deselect all'), + ('nav_venue_bb_lobby_amateur_8_name', 'Gevorderden Battle Ball 9'), + ('transaction_system_sms_win_kpn', 'KPN SMS'), + ('nav_venue_bb_lobby_intermediate_3/0_desc', ''), + ('furni_CFC_500_goldbar_desc', 'Worth 500 Credits'), + ('NUF_visiting_rooms', 'Visiting other players\' rooms'), + ('url_logout_timeout', 'http://%predefined%//account/disconnected?reason=logout'), + ('furni_table_silo_med*7_desc', 'Green Area Coffee Table'), + ('player_commands_no_args', 'You have not supplied any arguments!'), + ('furni_romantique_pianochair*2_name', 'Lime Romantique Piano Chair'), + ('pickup', 'Pick up'), + ('reg_tutorial_url', ''), + ('habboclub_confirm_body', 'You have %credits% credits'), + ('nav_venue_bb_lobby_beginner_12/0_desc', ''), + ('furni_rare_elephant_statue*1_name', 'Silver Elephant'), + ('help', 'Habbo Help'), + ('furni_soft_sofachair_norja*2_desc', 'Black Iced Sofachair'), + ('furni_table_plasto_round*1_desc', 'Hip plastic furniture'), + ('furni_sleepingbag*9_desc', 'Ultimate coziness'), + ('furni_arabian_tray2_desc', 'For those Arabian nights'), + ('NUF_visiting_rooms_hotelview_tutor', 'Hello. This time we are learning how to visit another user\'s room.'), + ('furni_traffic_light*6_name', 'Red Traffic Light'), + ('Alert_ChooseWhoToSentMessage', 'Please choose who to\\rsend your message to'), + ('poster_47_desc', 'Twinkle, twinkle'), + ('bb_title_finalScores', 'Final standings:'), + ('jukebox_song_author', 'by: %author%'), + ('poster_2003_name', 'Dodgy Geezer'), + ('poster_509_name', 'The Jamaican flag'), + ('poster_6_desc', 'But is it the right way up?'), + ('furni_toy1*1_name', 'Rubber Ball'), + ('nav_venue_bb_lobby_beginner_13_name', 'Beginners Battle Ball 14'), + ('furni_scifidoor*5_name', 'White Spaceship Door'), + ('credit_redeem_text', 'You are going to change Furni to %value% credits.'), + ('nav_venue_sw_lobby_amateur_0_name', 'Snow Slingers Lobby'), + ('club_txt_intro', 'Welcome to Habbo Club - the members only club that all the best Habbos belong to!\\r\\rMembers of Habbo Club get priority access to the hotel (so you can always get in), exclusive clothes, hair colours, rare furni and special guest room layouts. To see exactly what you\'ll be able to get your hands on as a Habbo Club member, take a look in the Catalogue.'), + ('nav_venue_bouncer_room_1_name', 'Beginners Battle Ball Arena'), + ('update_email_suggest', 'Habbo Hotel security supervisor requests you to update your email'), + ('furni_rare_dragonlamp*3_name', 'Silver Dragon Lamp'), + ('furni_scifiport*2_name', 'Blue Laser Gate'), + ('club_button_extend', 'Extend Membership'), + ('wallitem_val_heart_name', 'Heart Light'), + ('furni_pura_mdl3*7_name', 'Green Pura Module 3'), + ('furni_sound_set_61_desc', 'Straight from the heart'), + ('nav_venue_bb_lobby_expert_9/0_desc', ''), + ('furni_pura_mdl2*9_name', 'Red Pura Module 2'), + ('furni_hal_cauldron_name', 'Habboween Cauldron'), + ('furni_divider_nor1*2_name', 'Black Ice corner'), + ('send', 'Send'), + ('furni_couch_norja_desc', 'Two can perch comfortably'), + ('furni_pura_mdl4*5_name', 'beige pura module 4'), + ('pet_race_1_008', 'Mad Mouser'), + ('pet_race_1_009', 'Scaredy Kat'), + ('pet_race_1_006', 'Titchy Tiger'), + ('pet_race_1_007', 'Burmese Buddy'), + ('pet_race_1_004', 'Soft-Toed Sneaker'), + ('furni_divider_nor4*8_desc', 'Habbos, roll out!'), + ('furni_tile_desc', 'In a choice of colours'), + ('pet_race_1_005', 'Cat Astroflea'), + ('pet_race_1_002', 'Lesser Spotted Longhair'), + ('pet_race_1_003', 'Hidden Clause'), + ('pet_race_1_000', 'Sleepy Siamese'), + ('pet_race_1_001', 'Purr-Sian'), + ('furni_sound_set_53_name', 'Snowy Surprise'), + ('furni_rare_icecream*1_desc', 'Virtual blueberry rocks!'), + ('furni_table_plasto_round*15_name', 'Occasional Table'), + ('security', 'Security'), + ('furni_glass_chair*5_name', 'Glass chair'), + ('nav_venue_cunning_fox_gamehall/1_desc', 'It\'s one-on-one for five in a row'), + ('nav_venue_sw_lobby_tournament_4/0_desc', ''), + ('furni_carpet_soft_desc', 'Soft Wool Rug'), + ('poster_27_desc', 'Deck the halls!'), + ('furni_safe_silo*7_desc', 'Totally shatter-proof!'), + ('furni_table_silo_small*5_desc', 'Pink Area Occasional Table'), + ('furni_marquee*4_desc', 'It\'s both door and a shade!'), + ('furni_gothic_sofa*4_desc', 'Ghosts and Ghouls'), + ('furni_prizetrophy6*1_desc', 'Glittery gold'), + ('pet_race_1_019', 'Bobcat Wailer'), + ('furni_bardesk_polyfon*5_desc', 'For cute constructions'), + ('furni_carpet_polar*2_name', 'Blue Bear Rug'), + ('pet_race_1_017', 'Furry Friend'), + ('furni_soft_sofa_norja*6_desc', 'Blue Iced Sofa'), + ('furni_pura_mdl2*4_desc', 'Any way you like it!'), + ('pet_race_1_018', 'Trusting Tabby'), + ('pet_race_1_015', 'Haughty House Pet'), + ('chatlog.url', 'https://theallseeingeye.sulake.com/ase/habbo/uk/housekeeping/extra/hobba/chatlog.action?chatId='), + ('furni_ham2_name', 'Eaten Ham'), + ('pet_race_1_016', 'Curiousity - The Return!'), + ('pet_race_1_013', 'Felis Catus Allergicus'), + ('pet_race_1_014', 'Bushy Bobtail'), + ('pet_race_1_011', 'Egyptian Angora'), + ('pet_race_1_012', 'Freckled Feral'), + ('gs_choose_gamefield', 'Choose Game Arena:'), + ('furni_divider_nor5*6_desc', 'Cool cornering for your crib y0!'), + ('furni_summer_pool*2_name', 'Red Summer Pool'), + ('pet_race_1_010', 'Wannabe Wildcat'), + ('furni_rare_elephant_statue_desc', 'Say hello to Nelly'), + ('furni_sofa_silo*8_desc', 'Cushioned, understated comfort'), + ('furni_exe_rug_desc', 'Please remove your shoes!'), + ('NUF_meeting_people_roomlist_tutor', 'Let\'s visit one of the rooms and find out how to meet other users.'), + ('furni_chair_plasto*15_desc', 'Hip plastic furniture'), + ('nav_venue_habburger\'s_name', 'Habburgers'), + ('queue_current_2', 'You are in queue for the room.'), + ('queue_current_1', 'You are in Habbo Live queue...'), + ('furni_pura_mdl5*3_name', 'Black Pura Module 5'), + ('furni_hockey_score_name', 'Scoreboard'), + ('furni_sofachair_silo*5_desc', 'Pink Area Armchair'), + ('furni_hyacinth1_name', 'Pink Hyacinth'), + ('furni_pura_mdl1*6_desc', 'Any way you like it!'), + ('camera_open_dialog_heading', 'Camera'), + ('furni_prizetrophy5*2_name', 'Duo trophy'), + ('furni_glass_chair_desc', 'Translucent beauty'), + ('furni_rubberchair*3_desc', 'Soft and tearproof!'), + ('furni_exe_plant_name', 'Executive Plant'), + ('furni_pura_mdl2*3_desc', 'Any way you like it!'), + ('furni_pura_mdl1*2_name', 'Pink Pura Module 1'), + ('furni_plant_bonsai_desc', 'You can be sure it lives'), + ('furni_plant_valentinerose*4_desc', 'Be mine!'), + ('wallitem_hrella_poster_3_desc', 'Don\'t drift away!'), + ('furni_deadduck_name', 'Dead Duck'), + ('furni_summer_grill*3_desc', 'Plenty of steak on that barbie'), + ('modtool_extrainfo', 'Extra Info:'), + ('sound_machine_jukebox_window', 'Jukebox'), + ('gs_button_start', 'Start Game!'), + ('nav_venue_sw_lobby_beginner_5/0_desc', ''), + ('furni_romantique_chair*5_desc', 'What does this button do?'), + ('furni_table_plasto_4leg*9_desc', 'Hip plastic furniture'), + ('furni_soft_sofa_norja_desc', 'A soft iced sofa'), + ('furni_divider_nor4*9_name', 'Red Iced Auto Shutter'), + ('login_haventGotHabbo', 'Haven\'t got a Habbo yet?'), + ('furni_noob_stool*2_name', 'My first Habbo stool'), + ('furni_s_sound_machine*5_desc', 'Sound Machine Brown Desc'), + ('credit_redeem_window', 'Redeem credit furni'), + ('send_invitation_text', 'Want to meet someone from our Welcoming Party?'), + ('purse_vouchers_exitbutton', 'Cancel'), + ('furni_prizetrophy6*3_desc', 'Breathtaking bronze'), + ('nav_venue_cafe_gold/0_name', 'Kultakahvila'), + ('furni_fortune_name', 'Crystal Ball'), + ('poster_22_name', 'Butterfly Cabinet (blue)'), + ('object_displayer_link_badge', 'Edit Badge'), + ('furni_sound_set_15_name', 'RnB Grooves 6'), + ('Alert_NoNameSet', 'Check your Habbo name.'), + ('furni_hc_crpt_name', 'Persian Carpet'), + ('error_ok', 'OK->'), + ('game_chess_email', 'Receive game via email'), + ('sound_machine_confirm_save_list', 'Save playlist?'), + ('furni_noob_rug*2_desc', 'Nice and neat sisal rug with blue edging'), + ('queue_set.e1.alert', 'This room is currently available only to Habbos participating to the event.'), + ('furni_rare_icecream*0_desc', 'Virtual cherry rocks!'), + ('furni_arabian_chair_name', 'Green Blossom Chair'), + ('furni_divider_silo3*6_name', 'Blue Area Gate'), + ('furni_scifiport*4_desc', 'Energy beams. No trespassers!'), + ('furni_sofa_silo*4_desc', 'Beige Area Sofa'), + ('furni_one_way_door*4_desc', 'One at a time!'), + ('furni_chair_norja*5_desc', 'Sleek and chic for each cheek'), + ('furni_sound_set_19_desc', 'Shake your body!'), + ('poster_26_desc', 'See that halo gleam!'), + ('furni_doormat_plain*2_desc', 'Available in a variety of colours'), + ('furni_romantique_chair*1_name', 'Rose Quartz Chair'), + ('furni_hc_tv_name', 'Mega TV Set'), + ('pet.hotwords.follow_me', 'heel'), + ('furni_petfood3_desc', 'Fantastic 20% Saving!'), + ('furni_couch_norja*5_name', 'Pink Bench'), + ('furni_table_plasto_round*7_desc', 'Hip plastic furniture'), + ('furni_bed_armas_two_desc', 'King-sized pine comfort'), + ('modtool_days', 'Days'), + ('furni_one_way_door*7_name', 'Green One Way Gate'), + ('furni_table_norja_med*5_name', 'Large Coffee Table Pink'), + ('furni_sand_cstl_wall_name', 'sand_cstl_wall'), + ('nav_modify_doorstatus_givepw', 'Password for the room'), + ('NUF_getting_items_room_tutor', 'Nice room. Reminds me of a chic Parisian cafe in Slough. Open the Catalogue.'), + ('habbo_hand_prev', '<<<'), + ('pet.saying.generic.croco.3', 'Tick tock tick....'), + ('invitation_follow_failed', 'Sorry, your attempt to follow an invitation failed.'), + ('furni_sound_set_12_desc', 'Unusual as Standard'), + ('pet.saying.generic.croco.1', '*Mellow*'), + ('error_text', 'Error occured, press \'OK\' to restart program.\\r\\rPlease report bugs to:\\rwww.habbohotel.com/habbo/en/help/contact/bugs/ \\rSorry for the inconvenience.'), + ('pet.saying.generic.croco.2', 'I\'m so hungry I could eat you!'), + ('furni_divider_silo3*3_desc', 'Form following function'), + ('furni_table_plasto_4leg*2_desc', 'Hip plastic furniture'), + ('int_newmessages', 'New Message(s)'), + ('furni_rare_icecream*3_name', 'Blackcurrant Ice Cream Machine'), + ('bb_header_gameinfo', 'Game info'), + ('furni_scifiport*0_name', 'Red Laser Door'), + ('nav_venue_bb_lobby_beginner_7_name', 'Beginners Battle Ball 8'), + ('tx_history.description.bank_wallie', 'Wallie-card'), + ('nav_venue_hallway_name', 'Hallway'), + ('nav_venue_bb_lobby_amateur_11/0_desc', ''), + ('furni_bed_budget_one*5_desc', 'Prince sized comfort!'), + ('pet.saying.generic.croco.0', 'Rrrr....Grrrrrg....'), + ('nav_popup_go', '>>'), + ('furni_safe_silo*3_name', 'White Safe Minibar'), + ('furni_table_silo_small_name', 'Occasional Table'), + ('poll_confirm_window', 'Leave our poll'), + ('furni_table_norja_med*9_desc', 'For larger gatherings'), + ('furni_divider_nor4*6_desc', 'Habbos, roll out!'), + ('gs_3teams', '3 Teams Game'), + ('wallitem_post.it.limit', 'Only 50 stickies per room are allowed!'), + ('furni_scifidoor*4_desc', 'Protect your pot of gold!'), + ('furni_bed_polyfon_one*9_name', 'Red Single Bed'), + ('furni_soft_sofa_norja*2_desc', 'Black Iced Sofa'), + ('furni_corner_china_desc', 'Firm, fireproof foundation'), + ('hobba_pickup_go', 'Pick Up & Go!'), + ('furni_sporttrack3*2_desc', 'null'), + ('furni_rare_fan*6_name', 'Ochre Powered Fan'), + ('furni_sound_set_3_name', 'Electronic 1'), + ('NUF_mini_meet_people_user_tutor', 'Here you can chat to users directly. Ask a Habbo to be your friend by clicking on their Habbo and the button.\\nIf this is your first time, check your Hand to see a present to decorate your own room with, later.'), + ('furni_pura_mdl2*6_name', 'Blue Pura Module 2'), + ('furni_couch_norja*9_desc', 'Two can perch comfortably'), + ('furni_chair_plasty*9_desc', 'Hip plastic furniture'), + ('game_chess_white', 'White:'), + ('nav_venue_sw_lobby_intermediate_3/0_desc', 'Lumisota sen kuin vain kovenee.'), + ('furni_table_plasto_square*3_desc', 'Hip plastic furniture'), + ('nav_venue_theatredrome/0_desc', 'Perform your latest masterpiece!'), + ('nav_venue_the_den/0_desc', 'Has anyone seen my map?'), + ('furni_sound_set_40_name', 'Rock 4'), + ('remove', 'Remove'), + ('friend_request_decline_all', 'Decline all requests.'), + ('furni_rare_globe_name', 'Snow Globe'), + ('furni_bardesk_polyfon*8_name', 'Yellow Mode Bardesk'), + ('nav_venue_sw_lobby_free_6_name', 'Free Game Lobby'), + ('queue_change', 'Change queue'), + ('reg_parentemail_link_text2', 'Privacy Pledge'), + ('furni_rare_parasol*2_desc', 'Block those rays!'), + ('furni_romantique_pianochair*3_desc', 'null'), + ('reg_parentemail_link_text1', 'See the letter'), + ('sound_machine_list_save', 'Save Playlist'), + ('nav_public_helptext_hd', 'Public Spaces'), + ('furni_chair_plasty*2_desc', 'Hip plastic furniture'), + ('spectator_count', 'spectators %cnt%/%max%'), + ('reg_welcome2', 'Create Your Own Habbo'), + ('wallitem_roomdimmer_desc', 'Superior lighting for your room'), + ('furni_prizetrophy*3_name', 'Classic trophy'), + ('furni_plant_rose_name', 'Cut Roses'), + ('reg_welcome3', 'Now the fun begins! All you need to do is register and you\'re ready to start. It won\'t take long!\\rYou can change everything except your name and date of birth later. Come on!'), + ('furni_noob_table*5_name', 'My first Habbo table'), + ('nav_error_room_closed', 'The room is closed.'), + ('reg_changePassword', 'Change your password'), + ('furni_divider_nor5*3_desc', 'Cool cornering for your crib y0!'), + ('furni_doorC_name', 'Portaloo'), + ('furni_chair_plasty*10_name', 'Plastic Pod Chair'), + ('furni_pura_mdl1*9_name', 'Red Pura Module 1'), + ('furni_rare_stand_name', 'Speaker\'s Corner'), + ('furni_grunge_table_name', 'Grunge Table'), + ('furni_traffic_light*2_name', 'Blue Traffic Light'), + ('pet.saying.angry.croco.2', 'You have displeased me.'), + ('human_trading', 'Trading'), + ('furni_noob_stool*6_desc', 'Unfold me and take the weight off (green)'), + ('pet.saying.angry.croco.1', 'Rawwwr...rrr'), + ('nav_venue_sw_lobby_intermediate_5_name', 'Snow Bombardiers Lobby'), + ('gs_button_leavegame', 'Leave Game'), + ('pet.saying.angry.croco.0', 'Grrrrr...rrr'), + ('furni_s_sound_machine*1_name', 'Sound Machine Grey'), + ('pet.saying.angry.croco.4', 'Buuuuurrr..rrrrr'), + ('furni_chair_plasto*7_desc', 'Hip plastic furniture'), + ('pet.saying.angry.croco.3', 'Rowrrrr...rrrr'), + ('furni_soft_sofa_norja*9_desc', 'Red Iced Sofa'), + ('nav_venue_skylight_lobby_name', 'Skylight Lobby'), + ('furni_bed_polyfon_one*6_desc', 'Blue Mode Single Bed'), + ('furni_pillow*8_desc', 'Puffy, soft and huge'), + ('furni_hc_rntgn_name', 'X-Ray Divider'), + ('furni_table_silo_med*5_desc', 'Pink Area Coffee Table'), + ('furni_gothic_stool*2_desc', 'Be seated please..'), + ('furni_typingmachine_desc', 'Write that bestseller'), + ('furni_fridge_desc', 'Keep cool with a chilled snack or drink'), + ('nav_venue_cunning_fox_gamehall/4_desc', 'Get a hand like a foot? Keep a straight face and bluff it out'), + ('doorbell_rings', 'Rings the doorbell - Open the door?'), + ('furni_divider_silo1*9_desc', 'Red Area Small Table'), + ('nav_venue_bb_lobby_intermediate_7/0_desc', ''), + ('furni_prize1_name', 'Gold Trophy'), + ('poster_54_name', 'Hockey Stick'), + ('furni_sound_set_47_name', 'Club 2'), + ('furni_prizetrophy3*1_name', 'Globe trophy'), + ('purse_head2', 'ACCOUNT TRANSACTIONS'), + ('furni_soft_sofa_norja*5_name', 'Pink Iced Sofa'), + ('furni_prizetrophy9*1_desc', 'Glittery gold'), + ('buddyremove_next', 'Next >'), + ('reg_girl', 'Girl'), + ('furni_bed_budget_one*1_name', 'Aqua Pura Bed'), + ('NUF_visiting_rooms_roomlist_go', 'Click \'Go\' to go to a room.'), + ('poster_506_desc', 'To \'Finnish\' your decor...'), + ('furni_toy1_name', 'Rubber Ball'), + ('furni_sound_set_7_desc', 'Sound effects for Furni'), + ('sw_fieldname_6', 'Riverbank Siege'), + ('sw_fieldname_5', 'Polar Labyrinth'), + ('furni_bed_polyfon*4_desc', 'Beige Mode Double Bed'), + ('furni_pillow*4_name', 'Gold Feather Pillow'), + ('alert_duplicatesession', 'You are already logged in on another hotel! Log out before trying again.'), + ('sw_fieldname_7', 'Skull Falls Assault'), + ('sound_machine_alert_song_not_ready', 'Can\'t save song! Song not ready yet.'), + ('nav_venue_bb_lobby_beginner_5/0_desc', ''), + ('nav_venue_bb_lobby_tournament_4/0_desc', ''), + ('pet.saying.play.dog.1', 'woofWOOFwoofWOOFwoof'), + ('pet.saying.play.dog.0', 'rrr.. WOOF .rrr..'), + ('furni_cn_lamp_name', 'Lantern'), + ('furni_arabian_rug_name', 'Berber Kilim Rug'), + ('NUF_groups_hotelview_tutor', 'You have now opened the Group tutorial in the website window. Special!'), + ('gs_error_start_9', 'Team sizes can only differ by one player. This Game cannot start!'), + ('furni_divider_poly3*7_desc', 'Green Mode Bardesk Gate'), + ('furni_sofachair_silo*4_desc', 'Beige Area Armchair'), + ('poster_58_desc', 'whish you luck'), + ('furni_chair_basic*2_desc', 'It\'s a cracking design!'), + ('poster_516_name', 'The English flag'), + ('nav_venue_sw_lobby_tournament_2/0_desc', ''), + ('furni_gothic_carpet_name', 'Cobbled Path'), + ('sw_title', 'Snow Storm'), + ('furni_doormat_plain*5_name', 'Doormat'), + ('furni_pura_mdl4*4_desc', 'Any way you like it!'), + ('furni_sound_machine*1_name', 'Sound Machine'), + ('furni_sofa_silo*7_name', 'Green Area Sofa'), + ('nav_venue_sw_lobby_tournament_4_name', 'Tournament Lobby'), + ('gs_title_gamecreation', 'Game creation'), + ('furni_couch_norja*2_desc', 'Two can perch comfortably'), + ('furni_prizetrophy5_desc', 'Palkinto'), + ('furni_divider_nor3*9_desc', 'Red Iced gate'), + ('furni_present_gen_name', 'Gift'), + ('furni_prizetrophy7*3_name', 'Bronze Habbo trophy'), + ('alert_reg_parent_email', 'The email address you provided is unacceptable.'), + ('furni_bed_polyfon_girl_name', 'Double Bed'), + ('furni_rare_fountain_name', 'Bird Bath (red)'), + ('furni_pura_mdl3*3_name', 'Black Pura Module 3'), + ('furni_plant_pineapple_name', 'Pineapple Plant'), + ('furni_divider_nor2*8_name', 'Yellow Iced bar desk'), + ('messenger', 'Messenger'), + ('nav_venue_bb_arena_0_name', 'Battle Ball kaikille'), + ('sw_fieldname_2', 'Algid River'), + ('furni_bed_silo_two_desc', 'Plain and simple x2'), + ('sw_fieldname_1', 'Arctic Island'), + ('furni_pillow*1_desc', 'Puffy, soft and huge'), + ('sw_fieldname_4', 'Frosty Forest'), + ('sw_fieldname_3', 'Glacial Fort'), + ('furni_bar_basic_desc', 'A pura series 300 minibar'), + ('tutorial_welcome_M', 'Hi! I am your guide to Habbo Hotel. Please pick a topic to start.'), + ('tutorial_welcome_F', 'Hi there! I\'m your guide to Habbo Hotel. What would you like to learn today?'), + ('Alert_NoNameSetForLogo', 'Please give a name to your logo'), + ('furni_glass_table*5_name', 'Glass table'), + ('group_owner', 'Owner'), + ('console_target_friend_list_full', 'This user\'s friend list is full'), + ('furni_romantique_smalltabl*2_name', 'Lime Tray Table'), + ('ph_keys_spacebar', 'Spacebar'), + ('furni_noob_chair*3_name', 'My first Habbo chair'), + ('NUF_meeting_people_roomlist_publicTab', 'Click the Public Spaces tab to see the list of public rooms. To go to the room click the \'Go\' button.'), + ('furni_bed_polyfon*7_name', 'Green Mode Double Bed'), + ('furni_jukebox_ptv*1_name', 'Jukebox Pacha TV'), + ('poster_513_desc', 'Aussies rule!'), + ('poster_51_desc', '2 points for every basket'), + ('furni_toy1*2_name', 'Rubber Ball'), + ('furni_bartable_armas_name', 'Bardesk'), + ('nav_venue_sw_lobby_amateur_0/0_desc', ''), + ('NUF_mini_use_console_read_tutor', 'The Habbo Console lets you message with people you have added to your friends list.'), + ('nav_venue_bb_lobby_beginner_12_name', 'Beginners Battle Ball 13'), + ('poster_2002_name', 'Urho Kaleva Kekkonen'), + ('furni_sound_set_44_desc', 'Haunted Dimension'), + ('pet.saying.beg.dog.1', 'Oouh..oouh..snuh..ooo'), + ('furni_sporttrack2*1_name', 'Sport corner tartan'), + ('pet.saying.beg.dog.0', 'Oooo...Ouuu...oo...OUUU'), + ('furni_solarium_norja*5_desc', 'Rejuvenate your pixels!'), + ('pet.saying.beg.dog.2', '*whimpers *'), + ('reg_pledgelink', 'Hotel rules'), + ('habboclub_price1.days', '30'), + ('furni_glass_shelf_desc', 'Translucent beauty'), + ('furni_sofachair_polyfon*3_name', 'White Armchair'), + ('reg_verification_info', 'You must know the correct birthday and password before you\'re allowed to make these changes.'), + ('furni_carpet_soft*5_desc', 'Soft Wool Rug'), + ('furni_grunge_mattress_name', 'Grunge Mattress'), + ('furni_bed_polyfon_one_name', 'Single Bed'), + ('furni_sound_machine_pro_name', 'Sound Machine Pro'), + ('furni_chair_china_desc', 'The elegant beauty of tradition'), + ('furni_rare_icecream*7_desc', 'Virtual chocolate rocks!'), + ('furni_table_silo_med*8_name', 'Yellow Coffee Table'), + ('club_gift.message', 'Happy Habbo Club! Love Callie :)'), + ('furni_sw_raven_desc', 'My name is Otter'), + ('furni_noob_table*2_desc', 'Lightweight, practical and dark blue'), + ('furni_soft_sofachair_norja*3_desc', 'Soft Iced sofachair'), + ('sound_machine_confirm_delete', 'Delete song?'), + ('furni_plant_fruittree_name', 'Fruit Tree'), + ('nav_venue_bb_lobby_intermediate_1/0_desc', ''), + ('furni_heartsofa_name', 'Heart Sofa'), + ('furni_bed_budget_one*8_name', 'Yellow Pura Bed'), + ('NUF_getting_room', 'Making your own room'), + ('furni_rare_elephant_statue*2_name', 'Bronze Elephant'), + ('nav_venue_ballroom/0_desc', 'Come play ball!'), + ('nav_venue_sw_lobby_amateur_1_name', 'Snow Slingers Lobby'), + ('console_lasttime', 'Last Time'), + ('furni_md_sofa_desc', 'A decent recliner'), + ('furni_wooden_screen*6_name', 'Blue Oriental Screen'), + ('partner_registration_text', 'Click the link to finish your registration. When you have finished the registration click OK to continue to the hotel.'), + ('furni_sound_set_62_desc', 'Music of the Arabian night!'), + ('furni_arabian_divdr_name', 'Soft wooden screen'), + ('furni_tree1_desc', 'Dead christmas tree'), + ('furni_grand_piano*3_name', 'Pink Grand Piano'), + ('console_select_requests', 'Following users have asked to be your friend. Please accept or decline.'), + ('furni_divider_nor4*2_name', 'Black Iced Auto Shutter'), + ('furni_glass_chair*3_name', 'Glass chair'), + ('reg_passwordContainsNoNumber', 'Password must contain at least one number'), + ('buddyremove_invert', 'Invert Selection'), + ('furni_val_teddy*5_desc', 'The yellow bear of understanding'), + ('furni_sound_set_51_name', 'Club 6'), + ('poster_1_desc', 'The Noble and Silver Show'), + ('roomevent_create_name', 'Type the name of your event'), + ('Alert_unacceptableName', 'Sorry, that name is unacceptable to the Hotel Management'), + ('NUF_getting_room_go_tutor', 'Your room is now ready. Let\'s go see! I hope you have a bed...'), + ('poster_520_name', 'The Rainbow Flag'), + ('password', 'Password:'), + ('furni_bed_budget*8_name', 'Yellow Pura Double Bed'), + ('gs_header_gamelist', 'Game List'), + ('furni_chair_plasty_desc', 'Hip plastic furniture'), + ('url_purse_subscribe', 'http://%predefined%//credits?'), + ('furni_table_plasto_bigsquare*15_desc', 'Hip plastic furniture'), + ('furni_glass_stool*6_desc', 'Translucent beauty'), + ('error_report', 'Error Report'), + ('summer_chair_6_desc', 'Get decked'), + ('furni_chair_basic*5_name', 'chair_basic'), + ('room_remove_specs', 'Sorry! Now it\'s someone else\'s turn to watch this event.'), + ('furni_bunny_desc', 'Yours to cuddle up to'), + ('invitation_exists', 'You have already invited members of the Welcoming Party to your room.'), + ('purse_vouchers_furni_success', 'Voucher was successfully redeemed. You have been given the following furniture:'), + ('nav_rooms_popular', 'Popular rooms'), + ('nav_cancel', 'Cancel'), + ('alert_cross_domain_download', 'Cross domain content download prevented'), + ('furni_table_plasto_4leg*16_desc', 'Hip plastic furniture'), + ('url_pets', 'http://%predefined%//hotel/pets'), + ('furni_bardeskcorner_polyfon*9_desc', 'Tuck it away'), + ('gs_button_cancel', 'Cancel'), + ('furni_barchair_silo*7_name', 'Green Bar Stool'), + ('catalog_credits', 'You have \\x Credits in your purse.'), + ('furni_divider_nor3_name', 'Door (Lockable)'), + ('nav_modify_name', 'Name of the room'), + ('nav_venue_bb_lobby_amateur_7_name', 'Gevorderden Battle Ball 8'), + ('nav_venue_club_massiva/0_desc', 'Rest your dancing feet!'), + ('furni_gothrailing_desc', 'The dark side of Habbo'), + ('queue_set.na.alert', 'This Room is for Staff only.'), + ('nav_venue_bb_lobby_tournament_8_name', 'Competitie Battle Ball 9'), + ('furni_sound_set_29_name', 'Dance 2'), + ('console_msgs', 'msgs'), + ('furni_noob_lamp*6_name', 'My first Habbo lamp'), + ('furni_marquee*6_desc', 'It\'s both door and a shade!'), + ('furni_chair_plasto*16_desc', 'Hip plastic furniture'), + ('furni_chair_basic*9_desc', 'It\'s a cracking design!'), + ('summer_chair_2_name', 'Pink Deck Chair'), + ('alert_too_much_furnitures', 'Furni limit for room is exceeded. Not all furnitures are shown. Please remove some.'), + ('furni_pura_mdl5*4_name', 'White Pura Module 5'), + ('bus.full_msg', 'The FRANK bus is full at the moment, please come back later or visit the FRANK page below for more information.'), + ('furni_sound_set_22_name', 'SFX 3'), + ('furni_gothic_sofa*3_desc', 'The dark side of Habbo'), + ('furni_md_limukaappi_name', 'Habbo Cola Machine'), + ('poster_19_desc', 'Trying to get in or out?'), + ('gs_2min', '2min'), + ('poster_8_desc', 'Habbos come in all colours'), + ('furni_pillar*6_desc', 'Ancient and stately'), + ('furni_carpet_standard*3_desc', 'Available in a variety of colours'), + ('purse_vouchers_info', 'When you buy Habbo Credits with a mobile phone, you will receive a special voucher code. Enter the code in the box above, click \'Get Credits!\' and they\'ll be added to your purse.'), + ('furni_valeduck_name', 'Valentine\'s Duck'), + ('Alert_MessageFromAdmin', 'Message from Hotel Management:'), + ('furni_present_gen1_desc', 'What\'s inside?'), + ('reg_tutorial_txt', ''), + ('furni_tile_stella_name', 'Star Tile'), + ('furni_shelves_norja*4_name', 'Urban Iced Bookcase'), + ('transaction_system_creditcards_is', 'Creditcard'), + ('furni_shelves_polyfon_desc', 'For the arty pad'), + ('furni_tv_luxus_name', 'Digital TV'), + ('recycler_status_window_title', 'Recycling Status'), + ('furni_sleepingbag*6_name', 'Purple Sleeping Bag'), + ('gs_button_shrink', 'Minimize Window'), + ('furni_wcandleset_desc', 'Simple but stylish'), + ('furni_sleepingbag*3_desc', 'Ultimate coziness'), + ('object_displayer_show_actions', 'Show actions'), + ('hubu_t5_1', 'Lisetoa huumeista'), + ('song_disk_text_template', '%name%'), + ('hubu_t5_2', 'Huumeista-esite'), + ('queue_other_1', 'Habbo Live queue status'), + ('poster_33_name', 'Save the Panda'), + ('hubu_t5_3', 'Yleistietoa EOPH ry:st--------------'), + ('queue_other_2', 'Room queue status'), + ('furni_hcsohva_name', 'Throne Sofa'), + ('furni_sound_set_26_desc', 'Bollywood Beats!'), + ('furni_christmas_poop_name', 'Reindeer Droppings'), + ('furni_rare_dragonlamp*4_name', 'Serpent of Doom'), + ('nav_venue_bb_lobby_amateur_7/0_desc', ''), + ('purse_value', 'VALUE'), + ('furni_glass_sofa*5_desc', 'Translucent beauty'), + ('nav_venue_bb_lobby_tournament_15/0_desc', ''), + ('furni_glass_stool*2_desc', 'Translucent beauty'), + ('pet.saying.play.cat.1', 'Purrrr.. oo..Purrr'), + ('furni_pura_mdl4*7_name', 'Green Pura Module 4'), + ('nav_venue_cafe_ole/0_desc', 'Relax with friends over one of Marias specialty coffees'), + ('pet.saying.play.cat.0', 'Mew..MEOW..meow'), + ('furni_pumpkin_name', 'Pumpkin Lamp'), + ('furni_summer_chair*7_desc', 'Reserved!'), + ('ph_tickets_txt', 'Tickets can be used for BattleBall: Rebound!, SnowStorm, the Lido Diving and Wobble Squabble games. Tickets never expire.\\r\\rCurrently you have \\x1 ticket(s).'), + ('roomatic_onemoment', 'Please wait, we are going to your room...'), + ('furni_small_table_armas_name', 'Occasional Table'), + ('furni_table_polyfon_med_desc', 'For larger gatherings'), + ('nav_venue_bb_lobby_expert_3/0_desc', ''), + ('furni_chair_silo*6_desc', 'Blue Silo Dining Chair'), + ('furni_exe_globe_name', 'Power Globe'), + ('furni_bed_budget_one_name', 'bed_budget_one'), + ('furni_divider_silo1*2_desc', 'Neat and natty'), + ('nav_venue_bb_lobby_intermediate_0_name', 'Intermediate'), + ('furni_sofa_polyfon*9_desc', 'Comfort for stylish couples'), + ('furni_noob_lamp*3_desc', 'Get the light right where you want it (aubergine)'), + ('nav_showfull', 'Show Full Rooms'), + ('furni_divider_nor3*2_desc', 'Black Iced gate'), + ('reg_note_title', 'Warning!'), + ('hubu_answ_count', 'Replies'), + ('nav_recommended_rooms', 'Recommended Rooms'), + ('transaction_system_bank_nordea', 'Nordea'), + ('furni_sound_set_37_desc', ''), + ('poster_2006_desc', 'He is the magic Habbo'), + ('sw_link_gameRules_url', 'http://%predefined%//groups/56553/id'), + ('wave', 'Wave'), + ('furni_hc_djset_desc', 'Very old skool scratch\'n\'spin'), + ('furni_plant_maze_name', 'Maze Shrubbery'), + ('furni_scifirocket*3_name', 'Endor Smoke Machine'), + ('furni_val_teddy*1_name', 'Grey Share Bear'), + ('recycler_ready_outcome', 'Recycling reward: %outcome%'), + ('poster_4_desc', 'Fake of course!'), + ('poster_62_desc', 'We can\'t bear to lose them!'), + ('furni_glass_stool*9_desc', 'Translucent beauty'), + ('furni_goodie1_name', 'Marzipan Man'), + ('nav_modify_choosecategory', 'Choose a category for your room'), + ('object_displayer_link_home', 'User\'s home page'), + ('nav_venue_sw_lobby_tournament_8/0_desc', ''), + ('furni_xmasduck_name', 'Christmas Rubber Duck'), + ('help_txt_2', 'Password Reset'), + ('pet_mood_2', 'Blue'), + ('furni_queue_tile1*4_desc', 'The power of movement'), + ('help_txt_1', 'How do I get Credits?'), + ('pet_mood_3', 'Contented'), + ('nav_venue_bb_lobby_tournament_1_name', 'Competitie Battle Ball 2'), + ('furni_rare_daffodil_rug_name', 'Petal Patch'), + ('help_txt_4', 'The Habbo Way'), + ('pet_mood_0', 'Miserable'), + ('help_txt_3', 'Help with Habbo Hotel'), + ('pet_mood_1', 'Depressed'), + ('pet_mood_6', 'Ecstatic'), + ('furni_bed_budget*4_name', 'White Pura Double Bed'), + ('nav_venue_bb_lobby_amateur_0_name', 'Amateur'), + ('furni_sofachair_polyfon*7_desc', 'Green Mode Armchair'), + ('yes', 'Yes'), + ('pet_mood_4', 'Happy'), + ('pet_mood_5', 'Joyful'), + ('furni_sound_set_30_desc', 'Moments in love'), + ('furni_prizetrophy2*1_desc', 'Glittery gold'), + ('furni_wooden_screen*3_desc', 'Add an exotic touch to your room'), + ('transaction_system_bank_op', 'Osuuspankki'), + ('help_txt_6', 'Contact Us'), + ('help_txt_5', 'Safety Tips'), + ('furni_bardeskcorner_polyfon*2_desc', 'Black Mode Bardesk Corner'), + ('poster_15_desc', 'Marvellous mountains'), + ('room_areYouSurePlace', 'Warning! If you put something down in this room you will not be able to pick it up again.'), + ('nav_venue_bouncer_room_3_name', 'Semi-profs Battle Ball Arena'), + ('furni_chair_plasto*12_name', 'Chair'), + ('furni_gothic_chair*6_name', 'Gothic Chair Blue'), + ('furni_sofa_polyfon*2_desc', 'Black Mode Sofa'), + ('modtool_alertuser', 'Alert User'), + ('furni_toilet_desc', 'Loo Seat'), + ('furni_plant_cruddy_name', 'Aloe Vera'), + ('nav_venue_space_cafe/0_desc', 'In this space noone can see you ask for a soda!'), + ('nav_incorrectflatpw', 'Incorrect, try again.'), + ('furni_chair_plasto*13_desc', 'Hip plastic furniture'), + ('login_firstTimeHere', 'First time here?'), + ('furni_skullcandle_desc', 'Alas poor Yorrick...'), + ('NUF_mini_endtopic_step1_tutor', 'Well that\'s all from me. If you have any problems just click the little blue question mark to restart the tutorial and find our FAQs.\\nTo start exploring by yourself, click Close guide from the upper left corner.'), + ('furni_divider_poly3*3_name', 'White Hatch'), + ('help_callforhelp', 'Get Live Help'), + ('furni_rare_fountain*2_name', 'Bird Bath (green)'), + ('nav_venue_rooftop_name', 'Rooftop Cafe'), + ('furni_scifiport*7_name', 'Turquoise Sci-Fi Port'), + ('purse_back_to_credits', 'Back To Purse'), + ('room_ban', 'Kick & ban'), + ('furni_pura_mdl5*1_name', 'Aqua Pura Module 5'), + ('furni_val_teddy*4_name', 'Brown Share Bear'), + ('poster_40_name', 'Bonnie Blonde'), + ('NUF_getting_room_navigator_tutor', 'You want to click it real good. The \'Own room(s)\' tab I mean. Don\'t click yourself. It\'s unhygienic.'), + ('summer_chair_3_desc', 'Relax and enjoy the sun'), + ('furni_wooden_screen*2_name', 'RosewoodScreen'), + ('nav_venue_sun_terrace_name', 'Sun Terrace'), + ('furni_rare_fan*3_desc', 'Keeps the heat off St George!'), + ('nav_venue_sport_name', 'Power Gym'), + ('furni_toilet_red_desc', 'Loo Seat'), + ('retype_password', 'Retype Password:'), + ('furni_chair_basic*6_desc', 'It\'s a cracking design!'), + ('console_friends_helptext', 'This screen shows a list of all your Habbo Friends. It tells you where they are in the hotel, or, if they\'re not checked in, when their last visit was.'), + ('NUF_getting_items_room_', 'This is the Catalogue icon. Click to open it.'), + ('furni_grunge_barrel_desc', 'Beacon of light!'), + ('furni_soft_sofachair_norja*6_name', 'Blue Iced Sofachair'), + ('int_howtoget', 'How To get?'), + ('furni_sound_set_23_desc', 'Don\'t be afraid of the dark'), + ('nav_ok', 'OK'), + ('furni_sofachair_polyfon*6_name', 'Blue Mode Armchair'), + ('nav_venue_theatredrome_valentine_name', 'Theatredrome Valentine'), + ('furni_sofachair_polyfon_desc', 'Loft-style comfort'), + ('poster_83_name', 'Pöllö huhuilee'), + ('furni_soft_sofachair_norja*2_name', 'Black Iced Sofachair'), + ('roomdimmer_furni_limit', 'You can only have one roomdimmer per room'), + ('recycler_progress_timeleft', 'Time left: %hours% h and %minutes% min'), + ('furni_chair_plasto*3_name', 'Chair'), + ('NUF_getting_room_hotelview_tutor', 'Now you will learn how to make your own room. First go to the Guest Rooms area of the Navigator.'), + ('roomevent_create', 'Create'), + ('reg_year', 'Year'), + ('furni_divider_poly3_name', 'Hatch (Lockable)'), + ('furni_divider_nor1*7_name', 'Rural Iced Corner'), + ('furni_rare_beehive_bulb_name', 'Blue Amber Lamp'), + ('furni_waterbowl*2_name', 'Green Water Bowl'), + ('NUF_getting_room_room_hand', 'Open your hand!'), + ('furni_carpet_standard*6_desc', 'Available in a variety of colours'), + ('furni_CF_5_coin_silver_name', 'Silver Coin'), + ('furni_shelves_norja*7_name', 'Rural Iced Bookcase'), + ('opening_hours_text_disabled', 'The Hotel is shutting down really soon. To avoid confusion, purchasing of furniture, Habbo Club and game tickets have been disabled, as well as playing games and furniture trading. Try again tomorrow when the hotel is open!'), + ('nav_venue_bb_lobby_5_name', 'Battle Ball Kaikille'), + ('game_bs_congrat', 'Congratulations!'), + ('furni_arabian_tray2_name', 'Candle Tray'), + ('furni_giftflowers_desc', 'Guaranteed to stay fresh'), + ('club_button_1_period', 'Buy 1 >>>'), + ('furni_bed_polyfon_one*2_desc', 'Black Mode Single Bed'), + ('poster_47_name', 'Small silver star'), + ('furni_divider_nor3*5_desc', 'Pink Iced gate'), + ('furni_sofachair_polyfon_girl_desc', 'Think pink'), + ('furni_pura_mdl5*8_name', 'Yellow Pura Module 5'), + ('furni_hal_cauldron_desc', 'Eye of Habbo and toe of Mod!'), + ('poster_1006_name', 'Hoot Poster'), + ('furni_carpet_valentine_name', 'Red carpet'), + ('furni_floortile_name', 'Floor Tile'), + ('furni_divider_nor1*4_name', 'Urban Iced Corner'), + ('furni_bardeskcorner_polyfon*12_desc', 'Tuck it away'), + ('furni_table_plasto_bigsquare*3_desc', 'Hip plastic furniture'), + ('furni_traffic_light*6_desc', 'Chill and wait your turn!'), + ('club_general_prepaid', 'Prepaid Months'), + ('wallitem_val_heart_desc', 'Heartbroken... without your love!'), + ('furni_pura_mdl3*7_desc', 'Any way you like it!'), + ('furni_sound_set_58_name', 'RnB Grooves 4'), + ('furni_china_shelve_name', 'Chinese Lacquer Bookshelf'), + ('furni_divider_silo1*5_desc', 'Pink Area Corner Shelf'), + ('nav_venue_sw_lobby_tournament_desc', 'For stand-alone Tournaments.'), + ('furni_divider_silo2_name', 'Screen'), + ('furni_plant_mazegate_name', 'Maze Shrubbery Gate'), + ('poster_509_desc', 'The flag of Jamaica'), + ('furni_soft_sofachair_norja*9_name', 'Red Iced Sofachair'), + ('nav_venue_sw_arena_intermediate_name(0)', 'Playing intermediate game'), + ('furni_barchair_silo*4_name', 'Beige Bar Stool'), + ('furni_scifidoor*7_name', 'Aqua Spaceship Door'), + ('furni_CF_10_coin_gold_desc', 'Worth 10 Credits'), + ('furni_glass_sofa*8_desc', 'Translucent beauty'), + ('jukebox_reset', 'Reset Jukebox'), + ('nav_venue_sw_lobby_intermediate_desc', 'For the accomplished Snow Stormers.'), + ('furni_spotlight_desc', 'For the star of the show'), + ('furni_couch_norja_name', 'Bench'), + ('furni_romantique_divan*3_name', 'Turquoise Romantique Divan'), + ('furni_sleepingbag*7_desc', 'Ultimate coziness'), + ('roomatic_pws2', '24 hour access:'), + ('wallitem_jp_sheet1_desc', 'jp_sheet1'), + ('furni_table_silo_med*2_desc', 'Wipe clean and unobtrusive'), + ('furni_glass_table_desc', 'Translucent beauty'), + ('poster_502_desc', 'The US flag'), + ('pet_enrg_10', 'Mad'), + ('gs_scores_team_2', 'Blue Team:'), + ('pet_enrg_11', 'Nutcase'), + ('gs_scores_team_1', 'Red Team:'), + ('furni_cn_sofa_desc', 'Seating,Oriental style!'), + ('gs_scores_team_4', 'Green Team:'), + ('gs_scores_team_3', 'Yellow Team:'), + ('furni_table_silo_med*9_desc', 'Red Area Coffee Table'), + ('furni_hc_machine_name', 'Weird Science Machine'), + ('callhelp_writeyour', 'Write your question about Habbo Hotel here:'), + ('furni_table_silo_small*5_name', 'Pink Area Occasional Table'), + ('nav_addtofavourites', 'Add to favourites'), + ('furni_table_plasto_round*15_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_tournament_4_name', 'Competitie Battle Ball 5'), + ('furni_birdie_name', 'Pop-up Egg'), + ('furni_table_plasto_bigsquare_desc', 'Hip plastic furniture'), + ('furni_sound_set_33_desc', 'Guitar solo set'), + ('furni_romantique_divider*3_desc', 'Keeping things separated'), + ('furni_bed_budget*1_name', 'Aqua Pura Double Bed'), + ('furni_rare_beehive_bulb*2_desc', 'A honey-hued glow'), + ('furni_theatre_seat_desc', 'For Lazy boys and girls!'), + ('furni_hc_lmpst_desc', 'Somber and atmospheric'), + ('furni_divider_nor5*6_name', 'Blue Iced Angle'), + ('furni_summer_pool*2_desc', 'Fancy a dip?'), + ('poster_12_desc', 'a beautiful sunset'), + ('furni_carpet_polar*2_desc', 'Snuggle up on a Funky bear rug...'), + ('furni_md_rug_desc', 'Bubbles under your steps'), + ('Alert_InviteFriend', 'Invite your friends'), + ('nav_venue_bb_lobby_intermediate_4_name', 'Semi-profs Battle Ball 5'), + ('furni_hockey_score_desc', '...for keeping your score'), + ('furni_gothic_chair*3_name', 'Red Gothic Chair'), + ('wallitem_sw_stone_name', 'sw_stone'), + ('furni_pillow*7_name', 'Purple Velvet Pillow'), + ('nav_popup_header', 'Recommended rooms'), + ('nav_venue_sw_lobby_beginner_0_name', 'Snow Rookies Lobby'), + ('furni_table_norja_med*5_desc', 'For larger gatherings'), + ('furni_red_tv_name', 'Portable TV'), + ('reg_promise', '*Any personal information you supply will only be used by Habbo Ltd in accordance with the Habbo Pledge and will not be shared with third parties.'), + ('room_badge_choose', 'Modify Badge:'), + ('furni_table_plasto_square*15_desc', 'Hip plastic furniture'), + ('furni_sound_set_48_desc', 'Sweet party beat'), + ('nav_venue_ballroom_name', 'Ballroom'), + ('pet.hotwords.bad', 'bad'), + ('poster_55_desc', 'Save our trees!'), + ('furni_glass_chair_name', 'Glass chair'), + ('furni_prizetrophy5*2_desc', 'Shiny silver'), + ('furni_divider_poly3*4_desc', 'Beige Mode Bardesk Gate'), + ('tutorial_console_sample_message', 'Hello! This is a message sent to you from the Habbo Tutorial. To close and delete this message click delete. Sadly you cannot reply to this message as it is automated. Normally you can reply to messages by clicking the reply button.'), + ('furni_s_sound_machine*5_name', 'Sound Machine Brown'), + ('furni_divider_nor4*9_desc', 'Habbos, roll out!'), + ('furni_pura_mdl3*4_desc', 'Any way you like it!'), + ('NUF_getting_room_room_tutor', 'Tada! Nice room, although it\'s a little empty. Hey! Let\'s furnish it with something./nOpen your hand to check what you have, (if you have done this step before then you won\'t receive anything).'), + ('furni_fortune_desc', 'Gaze into the future'), + ('furni_soft_sofa_norja_name', 'iced sofa'), + ('furni_pura_mdl1*2_desc', 'Any way you like it!'), + ('nav_venue_sw_lobby_free_6/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('furni_divider_nor3*8_name', 'Yellow Iced gate'), + ('gs_title_finalscores', 'Final Standings:'), + ('gs_error_10', 'The hotel is closed or about to close. We look forward to welcoming you back tomorrow at (ADD LOCAL OPENING TIME).'), + ('furni_plant_bonsai_name', 'Bonsai Tree'), + ('furni_jukebox*1_name', 'Jukebox'), + ('room_loading', 'Loading room...'), + ('furni_hc_crpt_desc', 'Ultimate craftsmanship'), + ('furni_rare_hammock_desc', 'Eco bed'), + ('NUF_mini_use_console', 'Learn about messaging'), + ('furni_romantique_chair*1_desc', 'Elegant seating for elegant Habbos'), + ('transaction_system_bank_digiraha', 'Digiraha'), + ('NUH_messenger', 'Open your Console here - you might have messages or friend requests waiting.'), + ('furni_arabian_chair_desc', 'Exotic, soft seating'), + ('furni_noob_chair*6_name', 'My first Habbo chair'), + ('poster_510_desc', 'The flag of Italy'), + ('furni_carpet_standard*a_desc', 'Available in a variety of colours'), + ('queue_set.c.info', 'There are %c% Habbo Club member(s) in front of you. Be patient :)'), + ('furni_scifiport*4_name', 'Pink Sci-Fi Port'), + ('furni_sound_set_44_name', 'Graveyard Portal'), + ('furni_pura_mdl4*1_desc', 'Any way you like it!'), + ('furni_divider_silo3*6_desc', 'Blue Area Gate'), + ('furni_sound_machine*4_name', 'Blue Traxmachine'), + ('send_invitation_header', 'Get a warm welcome'), + ('game_TicTacToe', 'Boter kaas en eieren'), + ('nav_venue_sw_lobby_tournament_1_name', 'Tournament Lobby'), + ('furni_rare_fan*2_name', 'Green Powered Fan'), + ('furni_doormat_plain*2_name', 'Doormat'), + ('furni_table_plasto_square*7_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_intermediate_8/0_desc', ''), + ('furni_noob_table*6_desc', 'Lightweight, practical and green'), + ('win_callforhelp', 'Alert a Moderator'), + ('furni_prizetrophy8*1_desc', 'Glittery gold'), + ('furni_chair_norja*5_name', 'Pink Chair'), + ('furni_hc_tv_desc', 'Forget plasma, go HC!'), + ('furni_divider_arm1_name', 'Corner plinth'), + ('furni_table_plasto_round*7_name', 'Round Dining Table'), + ('furni_petfood3_name', 'Cabbage Mega Multipack'), + ('furni_carpet_standard*9_name', 'Floor Rug'), + ('opening_hours_title', 'Hotel Maintenance'), + ('console_noemail', 'Sorry,'), + ('furni_couch_norja*8_name', 'Yellow Bench'), + ('furni_s_sound_machine*1_desc', 'Sound Machine Grey Desc'), + ('furni_noob_stool*6_name', 'My first Habbo stool'), + ('purse_event', 'ACTIVITY'), + ('reg_readterms_alert', 'You have to read the Terms and Conditions\\r(scroll to the bottom of the text).'), + ('pet.hotwords.beg', 'beg'), + ('furni_jp_drawer_name', 'Japanese Drawer'), + ('gs_state_started', 'This Game has already started...'), + ('furni_sound_set_11_name', 'Dance 4'), + ('furni_divider_nor2*4_name', 'Urban Iced Bar'), + ('queue_set.e2.info', 'There are %e2% Habbos in front of you in the queue.'), + ('furni_bath_name', 'Bubble Bath'), + ('furni_rare_icecream*3_desc', 'Virtual blackcurrant rocks!'), + ('nav_modify_nameoftheroom', 'Name Of The Room'), + ('furni_scifiport*1_desc', 'Energy beams. No trespassers!'), + ('nav_venue_bb_lobby_amateur_12/0_desc', ''), + ('furni_table_silo_small*8_name', 'Yellow Occasional Table'), + ('furni_divider_silo3*3_name', 'White Area Gate'), + ('nav_venue_sw_lobby_amateur_7/0_desc', 'Astetta rankempaa lumisotaa.'), + ('reply', 'Reply'), + ('furni_toilet_yell_desc', 'Loo Seat'), + ('hobba_alert', 'Moderator Alert'), + ('You can play a bunch of exciting games, visit your friends\' rooms or even make your own place and decorate it to your heart\'s delight.', ''), + ('pet.saying.eat.croco.4', '*Buurrrrp*'), + ('furni_tree5_desc', 'Any presents under it yet?'), + ('pet.saying.eat.croco.2', '*Chomp chomp*'), + ('pet.saying.eat.croco.3', 'Mmmm mmmmm....'), + ('furni_divider_poly3*7_name', 'Green Mode Bardesk Gate'), + ('pet.saying.eat.croco.0', 'Mmmm yum yum'), + ('pet.saying.eat.croco.1', 'Ruff ruff ruff'), + ('furni_scifidoor*4_name', 'Emerald Spaceship Door'), + ('furni_edice_name', 'Holo-dice'), + ('furni_divider_nor4*6_name', 'Blue Iced Auto Shutter'), + ('furni_safe_silo*3_desc', 'Totally shatter-proof!'), + ('furni_table_silo_small_desc', 'For those random moments'), + ('gs_header_page', 'Page'), + ('furni_sporttrack3*2_name', 'Sport goal asphalt'), + ('furni_pura_mdl2*6_desc', 'Any way you like it!'), + ('furni_hcamme_name', 'Tubmaster'), + ('furni_carpet_soft*2_desc', 'Soft Wool Rug'), + ('furni_sound_set_12_name', 'Habbo Sounds 2'), + ('forgottenpw_done', 'If the email you gave during registration was correct, your password will be sent to you now.'), + ('navigator.no_category', 'No Category'), + ('login_whatsHabboCalled', 'What\'s your Habbo called?'), + ('furni_scifidoor*3_name', 'Lightblue Spaceship Door'), + ('game_poker', 'POKER'), + ('roomatic_pws', 'Password for selected'), + ('furni_glass_table*8_name', 'Glass table'), + ('furni_one_way_door*8_desc', 'One at a time!'), + ('furni_bardesk_polyfon*9_desc', 'Perfect for work or play'), + ('nav_venue_bb_lobby_tournament_13_name', 'Competitie Battle Ball 14'), + ('pet.hotwords.sit', 'sit'), + ('furni_arabian_tray3_desc', 'Indulge yourself!'), + ('furni_sound_set_40_desc', 'Dude? Cheese!'), + ('console_compose', 'Compose A Message'), + ('furni_table_plasto_square*3_name', 'Square Dining Table'), + ('furni_rclr_sofa_name', 'Polar Sofa'), + ('poster_2005_name', 'Infobus'), + ('furni_table_plasto_4leg*9_name', 'Occasional Table'), + ('furni_chair_norja*9_desc', 'Sleek and chic for each cheek'), + ('Room', 'Room:'), + ('furni_chair_plasty*2_name', 'Plastic Pod Chair'), + ('furni_romantique_pianochair*3_name', 'Turquoise Romantique Piano Chair'), + ('furni_rare_parasol*2_name', 'Orange Parasol'), + ('loading_project', 'Loading Habbo Hotel...'), + ('poster_505_name', 'The Maple Leaf'), + ('furni_traffic_light*2_desc', 'Chill and wait your turn!'), + ('nav_venue_sw_lobby_amateur_4_name', 'Snow Slingers Lobby'), + ('furni_grunge_shelf_name', 'Grunge Bookshelf'), + ('furni_sofa_polyfon*8_name', 'Yellow Mode Sofa'), + ('furni_doorC_desc', 'In a hurry?'), + ('roomatic_nomatch', 'Sorry. Your passwords don\'t match. Please enter them again.'), + ('furni_soft_sofa_norja*9_name', 'Red Iced Sofa'), + ('nav_venue_tv_studio_general/0_desc', 'Suosikki rules! Musaa, leffoja ja staroja!'), + ('nav_venue_sw_arena_amateur_name', 'Playing amateur game'), + ('interface_icon_events', 'Open the room event browser'), + ('furni_grunge_table_desc', 'Students of the round table!'), + ('furni_wooden_screen*9_name', 'Green Oriental Screen'), + ('NUF_getting_room_hotelview_nav', 'Click to open the Navigator.'), + ('furni_table_silo_med*5_name', 'Pink Area Coffee Table'), + ('furni_divider_silo1*9_name', 'Red Area Small Table'), + ('nav_venue_bb_lobby_amateur_4_name', 'Gevorderden Battle Ball 5'), + ('room_badge_hidden', 'Hidden'), + ('pet.saying.generic.cat.0', 'meow'), + ('furni_marquee*3_desc', 'It\'s both door and a shade!'), + ('pet.saying.generic.cat.1', 'meow...meOW'), + ('nav_venue_cunning_fox_gamehall/4_name', 'Chess'), + ('furni_present_gen_desc', 'What\'s inside?'), + ('pet.saying.generic.cat.2', 'muew..muew'), + ('pet.saying.generic.cat.3', 'Purrrrrrrrrr'), + ('furni_scifidoor*1_desc', 'There out of this world!'), + ('pet.saying.generic.cat.4', 'Purrrrr oow'), + ('furni_fridge_name', 'Pura Refridgerator'), + ('furni_rubberchair*2_name', 'Pink Inflatable Chair'), + ('furni_romantique_chair*4_name', 'Amber Chair'), + ('bb_fieldname_5', 'Barebones Classic'), + ('furni_sofa_silo*7_desc', 'Green Area Sofa'), + ('bb_fieldname_4', 'Gothic Hallway'), + ('furni_prizetrophy6*2_name', 'Champion trophy'), + ('bb_fieldname_3', 'Maze Park'), + ('bb_fieldname_2', 'Coral Beach'), + ('bb_fieldname_1', 'Sky Peak'), + ('furni_safe_silo_pb_name', 'postbank Safe'), + ('furni_solarium_norja*2_desc', 'Rejuvenate your pixels!'), + ('furni_table_plasto_bigsquare*7_desc', 'Hip plastic furniture'), + ('reg_check_age', 'Age'), + ('furni_exe_chair2_desc', 'You\'re fired!'), + ('furni_typingmachine_name', 'Typewriter'), + ('human_carrying', 'Carrying:'), + ('furni_grunge_sign_name', 'Road Sign'), + ('loading', 'Loading...'), + ('furni_bed_polyfon_one*6_name', 'Blue Mode Single Bed'), + ('furni_bed_budget_one*1_desc', 'Prince sized comfort!'), + ('furni_sofa_polyfon_name', 'Two-seater Sofa'), + ('furni_jp_lantern_desc', 'For a mellow Eastern glow'), + ('furni_gothic_stool*2_name', 'Golden Gothic Stool'), + ('roomevent_starttime', 'Started at:'), + ('furni_prize1_desc', 'Gorgeously glittery'), + ('furni_prizetrophy9*1_name', 'Champion trophy'), + ('wallitem_guitar_skull_desc', 'tilulilulaa'), + ('gs_title_bestplayer', 'Best player:'), + ('nav_removefavourites', 'Remove from favourites'), + ('furni_toy1_desc', 'it\'s bouncy-tastic'), + ('alert_shortenPW', 'Your password cannot be longer than 9 characters'), + ('normal_roomlayouts', '<< Back to normal room layouts'), + ('furni_noob_rug*1_name', 'My first Habbo rug'), + ('poster_58_name', 'Red knots poster'), + ('furni_divider_nor2*8_desc', 'Yellow Iced bar desk'), + ('furni_carpet_polar*1_name', 'Pink Faux-Fur Bear Rug'), + ('habboclub_continue_button', 'Buy one month'), + ('furni_divider_silo3_desc', 'Form following function'), + ('furni_sound_set_7_name', 'SFX 5'), + ('furni_soft_sofa_norja*5_desc', 'Pink Iced Sofa'), + ('furni_arabian_rug_desc', 'Green blossom design'), + ('restart_tutorial', 'Restart tutorial'), + ('gs_choose_numteams', 'Choose number of Teams:'), + ('hubu_info_t', 'The big FRANK Infobus'), + ('furni_divider_nor5*7_desc', 'Cool cornering for your crib!'), + ('furni_bed_polyfon*4_name', 'Beige Mode Double Bed'), + ('callhelp_allwillreceive', 'A member of community staff will investigate the situation and take appropriate action. This may include sending you a response with advice on dealing with your issue.'), + ('furni_pura_mdl4*4_name', 'White Pura Module 4'), + ('hubu_odotetaan', 'Waiting for replies from others...'), + ('furni_door_name', 'Telephone Box'), + ('furni_doormat_plain*5_desc', 'Available in a variety of colours'), + ('furni_gothic_carpet_desc', 'The path less travelled'), + ('poster_516_desc', 'Eng-er-land'), + ('furni_gothic_stool*6_desc', 'The dark side of Habbo'), + ('furni_traffic_light*3_desc', 'Chill and wait your turn!'), + ('furni_bartable_armas_desc', 'Bar-Style Table - essential for extra guests'), + ('club_isp_change', 'Change your subscription'), + ('furni_summer_grill*2_name', 'Red Barbeque Grill'), + ('poster_23_desc', 'flap, flap, screech, screech...'), + ('furni_prizetrophy7*3_desc', 'Bronze Habbo trophy'), + ('furni_couch_norja*2_name', 'Black Bench'), + ('nav_venue_cunning_fox_gamehall/0_desc', 'Pit your wits on the battlefield, the board or the baize - choose what to play here'), + ('furni_jp_tatami2_name', 'Large Tatami Mat'), + ('furni_pura_mdl3*3_desc', 'Any way you like it!'), + ('furni_house_name', 'Gingerbread House'), + ('furni_sound_set_54_name', 'Oh Blinging Tree'), + ('furni_table_plasto_4leg*1_name', 'Square Dining Table'), + ('furni_pillow*1_name', 'Pink Fluffy Pillow'), + ('NUF_console_hotelview_tutor', 'Oh! You have a message on your Habbo Console. Let\'s see who it is.'), + ('LoadingRoom', 'Loading room...'), + ('rotate', 'Rotate'), + ('nav_venue_sw_lobby_beginner_6_name', 'Snow Rookies Lobby'), + ('nav_venue_bb_lobby_amateur_1/0_desc', ''), + ('furni_jukebox_ptv*1_desc', 'Jukebox Pacha TV'), + ('nav_venue_star_lounge/0_desc', 'Chat with Sean Kingston here!'), + ('furni_chair_plasty*6_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_tournament_10/0_desc', ''), + ('NUF_mini_use_console_hotelview_tutor', 'Ah! You have a message on your Habbo Console. Let\'s see who it is.'), + ('furni_rare_xmas_screen_name', 'Lappland Greetings'), + ('summer_chair_9_name', 'Red Deck Chair'), + ('club_timefull', 'Sorry, you can only buy up to three months of Habbo Club subscription in advance.'), + ('poster_2002_desc', 'Presidentin muotokuva'), + ('poster_7_name', 'Hammer Cabinet'), + ('furni_gothic_chair*2_name', 'Golden Gothic Chair'), + ('bb_header_powerups', 'Powerups in game:'), + ('credit_redeem_url', 'http://%predefined%//help/19'), + ('furni_divider_silo3*2_name', 'Black Area Gate'), + ('furni_chair_plasto*16_name', 'Chair'), + ('catalog_itsurs', 'Yay! It\'s being delivered now..'), + ('hobba_pickandreply', 'Pick & Reply'), + ('reg_terms', 'Welcome to Habbo Hotel. If you are under 16, please check the Terms and Conditions with your parents/guardian before you agree to them. Get them to explain anything that you don\'t understand.\\rIn order to use the service you have to give valid information about yourself when registering. Please email us if any of your user information changes.\\rAs a user of Habbo Hotel - www.habbohotel.co.uk , you have to behave according to the Habbo Way (hotel rules) and the Terms and Conditions. Click the links below to read about them.\\rNever give your password or email address to anyone. If you do, your Habbo may get stolen.\\rRegistering with the hotel, making your own empty room and chatting is free of charge. For a small fee you can decorate your room with virtual furniture, play games and join the Habbo Club. If you wish to buy, you will need your parent\'s permission to do so.'), + ('furni_summer_pool*1_name', 'Blue Summer Pool'), + ('furni_heartsofa_desc', 'Perfect for snuggling up on'), + ('furni_scifiport*3_name', 'Jade Sci-Fi Port'), + ('furni_glass_chair*6_name', 'Blue Glass Chair'), + ('furni_sound_set_62_name', 'Alhambra Trax 1'), + ('win_voucher', 'Habbo Credit Code'), + ('furni_summer_chair*4_desc', 'White'), + ('furni_bed_polyfon_one_desc', 'Cot of the artistic'), + ('nav_venue_bb_lobby_tournament_5/0_desc', ''), + ('nav_venue_bb_lobby_beginner_3_name', 'Beginners Battle Ball 4'), + ('console_follow_not_friend', 'The user you tried to follow is not your friend anymore.'), + ('delete', 'Delete'), + ('furni_grunge_mattress_desc', 'Beats sleeping on the floor!'), + ('furni_rare_icecream*7_name', 'Chocolate Ice Cream Machine'), + ('sound_machine_alert_no_disks', 'You don\'t have any more discs!'), + ('furni_sofachair_silo_name', 'Armchair'), + ('nav_venue_sw_lobby_expert_0_name', 'Snow Marksmen Lobby'), + ('game_waitop', 'WAITING FOR THE OPPONENT'), + ('Alert_NameAlreadyUse', 'That name is already being used'), + ('furni_queue_tile1*1_desc', 'The power of movement'), + ('poster_18_name', 'Butterfly Cabinet 2'), + ('furni_wooden_screen*6_desc', 'Add an exotic touch to your room'), + ('furni_noob_table*2_name', 'My first Habbo table'), + ('furni_tree1_name', 'Dead tree'), + ('nav_venue_bouncer_room_0_name', 'Battle Ball Competitie Arena'), + ('furni_traffic_light*5_name', 'White Traffic Light'), + ('furni_sw_raven_name', 'Mrs Raven'), + ('cam_shoot.help', 'Shutter Release'), + ('furni_grand_piano*3_desc', 'Make sure you play in key!'), + ('nav_venue_sw_lobby_intermediate_2_name', 'Snow Bombardiers Lobby'), + ('interface_icon_purse', 'Purse, manage your coins'), + ('poll_alert_server_error', 'The poll isn\'t available anymore. Polls are only available at a certain public space for a certain duration.'), + ('sound_machine_confirm_delete_long', 'Are you sure you want to delete the selected song?'), + ('reg_check_confirm', 'Please check that your information is correct, especially your birthdate and Habbo name. You CANNOT change these later. If you want make any changes now, press the back button.'), + ('Alert_CheckBirthday', 'Please check your birthday'), + ('furni_shelves_norja*4_desc', 'For nic naks and tech books'), + ('club_expired_link', 'Click here to join Habbo Club'), + ('poster_520_desc', 'Every colour for everyone'), + ('nav_venue_bb_lobby_intermediate_desc', 'Intermediate battle ball!'), + ('tutorial_restart_button_bubble', 'Remember! Anytime you want to relive the fun click here to restart the tutorial!'), + ('poster_1_name', 'Comedy Poster'), + ('reg_verification_incorrectBirthday', 'Your birthday was incorrect'), + ('furni_glass_stool*6_name', 'Blue Glass Stool'), + ('furni_CFC_100_coin_gold_desc', 'Worth 100 Credits'), + ('buddyremove_list_full', 'Your friends list is full, you can\'t add new friends until you delete some. \\r\\The maximum number of friends you can have, is %mylimit% Habbos. Members of Habbo Club can have up to %clublimit% friends on their list.'), + ('furni_bunny_name', 'Squidgy Bunny'), + ('furni_small_chair_armas_name', 'Stool'), + ('nav_venue_sw_lobby_free_0/0_desc', ''), + ('furni_sofachair_silo*3_name', 'White Armchair'), + ('furni_sound_machine*2_desc', 'Dance to the Habbo Club beat!'), + ('nav_venue_gate_park/0_desc', 'Follow your path...'), + ('NUF_mini_use_console_hotelview_icon', 'Click the icon to open your Habbo Console.'), + ('nav_venue_eric\'s_eaterie/0_desc', 'Join Eric for a bite to eat'), + ('furni_table_silo_med*8_desc', 'Wipe clean and unobtrusive'), + ('poster_503_desc', 'There\'s no holes in this...'), + ('furni_bardeskcorner_polyfon*9_name', 'Red Corner Desk'), + ('furni_val_randomizer_desc', 'Surprise surprise! (Cilla Black not included)'), + ('furni_marquee*2_name', 'Red Dragon Marquee'), + ('furni_table_plasto_round_name', 'Round Dining Table'), + ('furni_summer_chair*3_name', 'Deck Chair'), + ('club_paycoins', 'Buy subscription'), + ('nav_venue_beauty_salon_general/0_desc', 'Join in the fun of Fashion Week! Check the homepage now for details.'), + ('furni_rare_dragonlamp*7_name', 'Sky Dragon Lamp'), + ('nav_venue_bb_lobby_beginner_6/0_desc', ''), + ('roomevent_quit', 'End event'), + ('console_search_habbo_lasthere', 'Last time'), + ('trading_title', 'Safe Trading'), + ('furni_glass_chair*7_desc', 'Habbo Club'), + ('gs_error_game_deleted', 'The Game has been deleted.'), + ('recycler_info_link_url', 'http://%predefined%/help/36'), + ('furni_pillar*6_name', 'Terracotta Pillar'), + ('furni_tile_stella_desc', '10% off the walk of fame!'), + ('transaction_system_sms_win_tmobile', 'T-Mobile SMS'), + ('buddyremove_names_ordered', 'Names Ordered By:'), + ('pet_race_2_010', 'Giggly Go-go'), + ('furni_table_plasto_bigsquare*6_name', 'Square Dining Table'), + ('pet_race_2_011', 'Petty Petsuchos'), + ('summer_chair_6_name', 'Blue Deck Chair'), + ('console_now', 'now:'), + ('gs_skill_changed', 'You have advanced to the next skill level. Your level is now %1!'), + ('roomatic_goyourroom', 'Go to your room'), + ('furni_carpet_soft*4_name', 'Soft Wool Rug'), + ('sound_machine_confirm_close_list', 'Close playlist editor?'), + ('pet.hotwords.good', 'good'), + ('furni_pura_mdl4*7_desc', 'Any way you like it!'), + ('furni_carpet_soft*1_name', 'Soft Wool Rug'), + ('furni_sound_set_22_desc', 'With a hamper full of sounds, not sarnies'), + ('nav_venue_sw_lobby_tournament_7_name', 'Tournament Lobby'), + ('furni_divider_nor3*6_desc', 'Blue Iced gate'), + ('furni_carpet_standard*3_name', 'Floor Rug'), + ('people', 'People'), + ('pet_race_2_007', 'Pretty Pui Pui'), + ('pet_race_2_008', 'Indifferent'), + ('pet_race_2_009', 'Swampy Siamese'), + ('furni_wcandle_name', 'White Candle'), + ('furni_sporttrack1*1_desc', 'null'), + ('furni_solarium_norja*1_name', 'Black Solarium'), + ('NUF_playing_games_gamecategories_tutor', 'Click the Beginner category to open it wide open. Like a melon!'), + ('pet_race_2_003', 'Silly Sobek'), + ('pet_race_2_004', 'Dirty Dundee'), + ('pet_race_2_005', 'Galled Gator'), + ('int_credits', 'Credits'), + ('furni_gothrailing_name', 'Gothic Railing'), + ('furni_sporttrack2*2_desc', 'null'), + ('pet_race_2_006', 'Confused Croc'), + ('furni_shelves_polyfon_name', 'Bookcase'), + ('pet_race_2_000', 'Endangered Albino'), + ('pet_race_2_001', 'Krazy Krokodilos'), + ('pet_race_2_002', 'Nile Dile'), + ('furni_divider_nor2*2_desc', 'Black Iced bar desk'), + ('log_problem_text', 'Oops.. Cannot connect to Habbo Hotel'), + ('furni_divider_nor2*5_desc', 'Pink Iced bar desk'), + ('nav_venue_sw_lobby_amateur_6/0_desc', 'Astetta rankempaa lumisotaa.'), + ('furni_rare_fountain_desc', 'For our feathered friends'), + ('furni_glass_sofa*5_name', 'Glass sofa'), + ('poster_33_desc', 'We can\'t bear to lose them'), + ('nav_venue_bb_lobby_tournament_14/0_desc', ''), + ('furni_summer_chair*6_name', 'Deck Chair'), + ('furni_hcsohva_desc', 'For royal bottoms...'), + ('furni_bed_budget*4_desc', 'King sized comfort!'), + ('furni_christmas_poop_desc', 'Bob?s magical fertilizer'), + ('furni_pura_mdl5*7_name', 'Green Pura Module 5'), + ('furni_barrier*1_desc', 'No escape this way!'), + ('nav_venue_bb_lobby_amateur_8/0_desc', ''), + ('furni_divider_arm2_desc', 'I wooden go there'), + ('furni_chair_plasty*11_desc', 'Hip plastic furniture'), + ('furni_small_table_armas_desc', 'Practical and beautiful'), + ('nav_venue_theatredrome_xmas_name', 'Theatredrome Xmas'), + ('poster_62_name', 'Save The Panda'), + ('reg_verification_currentPassword', 'Current password:'), + ('game_poker_change', 'Choose cards to change'), + ('NUF_getting_items_hotelview_nav', 'Click here to open the Navigator'), + ('furni_chair_basic*9_name', 'Red Pura Egg Chair'), + ('friend_request_failed', 'Failed!'), + ('furni_noob_chair*4_desc', 'Lightweight, practical, with light blue stripes'), + ('furni_table_silo_small*9_desc', 'Red Area Occasional Table'), + ('nav_hotelview', 'Hotel view'), + ('furni_toy1*3_desc', 'it\'s bouncy-tastic'), + ('furni_divider_nor3*2_name', 'Black Iced gate'), + ('furni_chair_silo*6_name', 'Blue Silo Dining Chair'), + ('update_password_suggest', 'Habbo Hotel security supervisor requests you to update your password'), + ('nav_venue_orient_name', 'Club Orient'), + ('Alert_NameTooLong', 'Sorry, that username is too long!'), + ('furni_sound_set_37_name', 'Sound set 37'), + ('furni_barchair_silo*7_desc', 'Practical and convenient'), + ('wallitem_wallmirror_name', 'Wallmirror'), + ('furni_chair_plasty*8_name', 'Plastic Pod Chair'), + ('sound_machine_confirm_close_list_long', 'Are you sure you want to exit playlist editor without saving?'), + ('furni_hc_frplc_name', 'Heavy Duty Fireplace'), + ('dance4', 'The Rollie'), + ('dance3', 'Duck Funk'), + ('furni_glass_stool*9_name', 'Glass stool'), + ('furni_sound_set_55_desc', 'Can you fill me in?'), + ('furni_carpet_standard*7_desc', 'Available in a variety of colours'), + ('poster_4_name', 'Bear Plaque'), + ('cam_zoom_out.help', 'Zoom Out'), + ('furni_sofa_polyfon*2_name', 'Black Mode Sofa'), + ('furni_prizetrophy2*1_name', 'Duck trophy'), + ('furni_scifirocket*3_desc', 'Caution! Unknown Location!'), + ('NUF_getting_items', 'Getting items'), + ('furni_val_teddy*1_desc', 'The grey bear of affection'), + ('furni_sofachair_polyfon*7_name', 'Green Mode Armchair'), + ('club_habbo.bottombar.link.member', '%days% days'), + ('habboclub_confirm_header', 'Subscription costs %price% credits'), + ('furni_rare_daffodil_rug_desc', 'A little bit of outdoors indoors..'), + ('poster_15_name', 'Himalayas Poster'), + ('furni_smooth_table_polyfon_desc', 'For larger gatherings'), + ('dance2', 'Pogo Mogo'), + ('furni_wooden_screen*3_name', 'Aqua Oriental Screen'), + ('furni_plant_cruddy_desc', 'Goodbye Bert...'), + ('dance1', 'Hab-Hop'), + ('furni_gothic_chair*6_desc', 'The dark side of Habbo'), + ('furni_table_plasto_square*9_name', 'Square Dining Table'), + ('nav_venue_bb_lobby_beginner_14/0_desc', ''), + ('furni_club_sofa_desc', 'Club sofa'), + ('roomevent_default_name', 'Event name..'), + ('game_poker_ok', 'Change cards'), + ('nav_venue_picnic_dudesons/0_desc', 'Duudsoneiden sponssaama oma Ranchi - www.extremeduudsonit.com'), + ('nav_venue_hallway/0_desc', 'Beware the ghosts and ghouls!'), + ('nav_venue_park/0_desc', 'Go for a stroll outdoors'), + ('console_fr_declined_count', 'Amount to be declined'), + ('furni_tree4_name', 'Christmas Tree 2'), + ('NUF_console_read_link', 'Click the link to open the message.'), + ('win_figurecreator', 'Habbo Details'), + ('furni_table_plasto_square*14_name', 'Occasional Table'), + ('furni_soft_sofachair_norja*6_desc', 'Blue Iced Sofachair'), + ('nav_venue_bb_lobby_beginner_0_name', 'Beginner'), + ('Alert_LogoNameAlreadyUse', 'That name is already being used'), + ('poster_25_name', 'Snowman Poster'), + ('furni_pura_mdl2*2_name', 'Pink Pura Module 2'), + ('furni_chair_plasto*13_name', 'Chair'), + ('furni_ticket_name', 'Small Ticket Bundle'), + ('furni_hc_lmpst_name', 'Victorian Street Light'), + ('furni_scifiport*7_desc', 'Energy beams. No trespassers!'), + ('jukebox_load_trax', 'Load Trax'), + ('furni_val_teddy*4_desc', 'The brown bear of naughtiness'), + ('reg_birthdayformat_update', 'Birthday (dd.mm.yyyy)'), + ('nav_venue_the_chromide_club_name', 'The Chromide Club'), + ('roomevent_not_available', 'Sorry, no events available'), + ('nav_venue_sw_lobby_beginner_0/0_desc', ''), + ('summer_chair_3_name', 'Black Deck Chair'), + ('int_newrequests', 'Friend Request(s)'), + ('console_profile_helptext', 'The Habbo Profile is a snapshot of your interests and hobbies - simply tick the things you like.'), + ('nav_roomnfo_hd_fav', 'Favourite Rooms'), + ('furni_chair_plasto*3_desc', 'Hip plastic furniture'), + ('furni_chair_basic*6_name', 'Blue Pura Egg Chair'), + ('number_4', '4'), + ('number_3', '3'), + ('number_2', '2'), + ('room_open_package', 'Open The Present'), + ('furni_grunge_barrel_name', 'Flaming Barrel'), + ('wallitem_photo_desc', 'Photo from Habbo'), + ('poster_30_desc', 'Pucker up'), + ('furni_glass_table*9_desc', 'Translucent beauty'), + ('nav_venue_sw_lobby_beginner_3_name', 'Snow Rookies Lobby'), + ('Alert_YouAreBanned', 'You have been banned for breaking the Habbo Way. This is why (if no ban reason is shown use the Contact Us form):'), + ('furni_gothic_sofa*2_name', 'Golden Gothic Sofa'), + ('NUF_getting_items_hotelview_tutor', 'Let us find out how to purchase items from the Hotel Catalogue. The Catalogue contains loads of cool stuff to decorate your Habbo room with. To begin open the Navigator.'), + ('furni_table_norja_med*2_desc', 'For larger gatherings'), + ('furni_sofa_silo*3_name', 'White Two-Seater Sofa'), + ('furni_pura_mdl5*5_desc', ''), + ('nav_venue_sw_lobby_beginner_desc', 'Yes, take a load of snowballs and hit the enemy Teams. Easy, isn\'t it?'), + ('furni_romantique_smalltabl*5_name', 'Onyx Tray Table'), + ('furni_divider_nor4_desc', 'Habbos, roll out!'), + ('furni_shelves_norja*7_desc', 'For nic naks and cookery books'), + ('nav_venue_sw_lobby_intermediate_4/0_desc', 'Lumisota sen kuin vain kovenee.'), + ('gs_text_spectate', 'You can watch this game'), + ('recycler_info_link', 'More information about Furni Recycler'), + ('furni_sofachair_polyfon_name', 'Armchair'), + ('club_intro_text', 'Members of Habbo Club get LOTS of cool stuff!\\rWith Habbo Club you get cool dances, access to Club Mammoth and The Blue Dragon Tavern, and a 500 limit on your friends list!'), + ('furni_divider_nor1*7_desc', 'The missing piece'), + ('url_helppledge', 'http://%predefined%//help/22'), + ('jukebox_song_name', '%name%'), + ('game_bs_won', 'WON!'), + ('furni_soft_jaggara_norja_name', 'Iced Sofachair'), + ('furni_rare_beehive_bulb_desc', 'A honey-hued glow'), + ('furni_chair_norja*8_name', 'Yellow Chair'), + ('poster_83_desc', 'Pöllö huhuilee, huhuu!'), + ('floodblocking', 'You are typing too fast - don\'t flood the room.'), + ('furni_CF_5_coin_silver_desc', 'Worth 5 Credits'), + ('sound_machine_confirm_clear', 'Clear the song?'), + ('furni_carpet_standard*6_name', 'Floor Rug'), + ('furni_waterbowl*2_desc', 'Aqua unlimited'), + ('sw_link_tournament_highScores_url', 'http://%predefined%//groups/56553/id'), + ('NUF_meeting_people_room_tutor', 'This is a Public Room. Your Habbo is in the doorway beneath the orange arrow. Click on another user to find out more about them.'), + ('furni_bottle_name', 'Empty Spinning Bottle'), + ('poster_512_name', 'The Irish flag'), + ('club_info_url', 'http://%predefined%//credits/habboclub'), + ('nav_venue_tv_studio_nike/0_desc', ''), + ('furni_couch_norja*6_desc', 'Two can perch comfortably'), + ('furni_pura_mdl5*8_desc', 'Any way you like it!'), + ('furni_carpet_valentine_desc', 'For making an appearance'), + ('furni_floortile_desc', 'In Variety of Colours'), + ('furni_pillar*9_name', 'Rock Pillar'), + ('furni_table_plasto_bigsquare*3_name', 'Square Dining Table'), + ('furni_bardeskcorner_polyfon*12_name', 'Corner Cabinet/Desk'), + ('furni_divider_nor1*4_desc', 'The missing piece'), + ('furni_chair_plasty*5_name', 'Plastic Pod Chair'), + ('furni_scifirocket*0_desc', 'See in 2007 with a bang!'), + ('poster_32_name', 'Siva Poster'), + ('club_button_2_period', 'Buy 3 >>>'), + ('furni_sound_set_58_desc', 'Sh-shake it!'), + ('furni_china_shelve_desc', 'To hold the mind\'s treasures'), + ('furni_scifidoor*7_desc', 'There out of this world!'), + ('furni_chair_silo*9_name', 'Red Silo Dining Chair'), + ('furni_gothic_stool*5_name', 'Green Gothic Stool'), + ('friend_request_massoperation_cancel', 'Back to request list.'), + ('furni_queue_tile1*0_name', 'White Quest Roller'), + ('furni_divider_nor3*5_name', 'Pink Iced gate'), + ('furni_sound_machine*5_desc', 'Heard the Habbo Bands new singles?'), + ('furni_glass_table*6_desc', 'Translucent beauty'), + ('furni_soft_sofachair_norja*9_desc', 'Red Iced Sofachair'), + ('furni_plant_mazegate_desc', 'Did we make it?'), + ('tickets_info_1', 'With 2 tickets you can play the following Games:\\r10 BattleBall:Rebound!\\r10 SnowStorm\\r20 Wobble Squabble or\\r20 Lido Diving'), + ('furni_barchair_silo*4_desc', 'Practical and convenient'), + ('furni_CF_10_coin_gold_name', 'Gold Coin'), + ('tickets_info_2', 'With 20 tickets you can play the following Games:\\r10 BattleBall:Rebound!\\r10 SnowStorm\\r20 Wobble Squabble or\\r20 Lido Diving'), + ('furni_sound_set_15_desc', 'Unadulterated essentials'), + ('handitem1', 'Tea'), + ('furni_romantique_divan*3_desc', 'null'), + ('furni_glass_sofa*8_name', 'Glass sofa'), + ('epsnotify_1001', 'The hotel is full at the moment. Please try again in a few minutes.'), + ('furni_table_silo_med*2_name', 'Black Coffee Table'), + ('furni_sleepingbag*7_name', 'Orange Sleeping Bag'), + ('furni_pillow*5_desc', 'Puffy, soft and huge'), + ('furni_bed_budget*1_desc', 'King sized comfort!'), + ('furni_bed_trad_one_name', 'Plain Single Bed'), + ('catalog_giftfor', 'This is a gift for:'), + ('furni_theatre_seat_name', 'Deluxe Theatre Chair'), + ('furni_romantique_divider*3_name', 'Turquoise Screen'), + ('furni_shelves_silo_desc', 'For nic naks and art deco books'), + ('handitem9', 'Decaff'), + ('handitem8', 'Regular'), + ('handitem7', 'Water'), + ('furni_glass_table_name', 'Glass table'), + ('console_selection_invert', 'Invert selection'), + ('handitem6', 'Blackcurrant'), + ('furni_hc_machine_desc', 'By and for mad inventors'), + ('handitem5', 'Milk'), + ('handitem4', 'Ice-cream'), + ('poster_40_desc', 'The one and only. Adore her!'), + ('nav_venue_sw_lobby_tournament_9/0_desc', ''), + ('handitem3', 'Carrot'), + ('handitem2', 'Juice'), + ('furni_cn_sofa_name', 'Chinese Sofa'), + ('nav_venue_bb_lobby_expert_4/0_desc', ''), + ('poster_502_name', 'The Stars and Stripes'), + ('furni_md_rug_name', 'Bubble Juice Floor'), + ('furni_table_plasto_bigsquare_name', 'Square Dining Table'), + ('furni_bed_polyfon*8_desc', 'Yellow Mode Double Bed'), + ('nav_venue_sw_lobby_amateur_7_name', 'Snow Slingers Lobby'), + ('furni_birdie_desc', 'Cheep (!) and cheerful'), + ('poster_12_name', 'Lapland Poster'), + ('club_desc_1_period', '1 Month (31 days) = 25 Credits'), + ('hobba_emergency_help', 'Call For Emergency Help:'), + ('reg_age_check_note', 'Enter your birthday. You will need your birthday information when changing your password or email.'), + ('furni_table_plasto_square*6_name', 'Square Dining Table'), + ('trade', 'Trade'), + ('furni_romantique_smalltabl*3_desc', 'Every tray needs a table...'), + ('reg_back', 'Back'), + ('furni_tree7_name', 'Snowy Christmas Tree'), + ('recycler_trader_open_alert', 'Recycling cannot begin while you are trading. Please close the safe trading box before recycling.'), + ('furni_rare_dragonlamp*8_desc', 'Scary and scorching!'), + ('furni_gothic_chair*3_desc', 'The head of the table'), + ('Alert_YourNameIstooShort', 'Habbo names must be at least 3 characters long.'), + ('furni_bed_budgetb_desc', 'Sweet dreams for two'), + ('furni_shelves_basic_name', 'Pura Shelves'), + ('console_messagemode_helptext', 'You can send an instant message to your Habbo Friends.'), + ('nav_venue_cunning_fox_gamehall/5_desc', 'Get a hand like a foot? Keep a straight face and bluff it out'), + ('furni_table_polyfon_small_name', 'Small Coffee Table'), + ('move_furniture', 'Move Furni'), + ('nav_searchbutton', 'Search'), + ('furni_habboween_grass_desc', 'Autumnal chills with each rotation!'), + ('furni_pura_mdl5*2_desc', 'Any way you like it!'), + ('NUF_meeting_people_user_tutor', 'The user you clicked on is shown in the corner of your screen. The buttons beneath the Habbo let you visit their Habbo Home, send them a Friend Request or ignore them if they look or act like a moron.'), + ('poster_55_name', 'Tree of Time'), + ('furni_soft_sofachair_norja*5_name', 'Pink Iced Sofachair'), + ('furni_sound_set_48_name', 'Club 3'), + ('furni_table_plasto_4leg_desc', 'Hip plastic furniture'), + ('furni_pura_mdl4*1_name', 'Aqua Pura Module 4'), + ('login_forgottenPassword_url', 'https://www.habbo.co.uk/account/password/forgot'), + ('nav_venue_floatinggarden/0_desc', 'Peace, tranquility and still waters'), + ('furni_sound_set_36_desc', 'For adult minded'), + ('poster_43_desc', 'Shake, rattle and roll'), + ('furni_gothic_stool*3_desc', 'The dark side of Habbo'), + ('room_alert_furni_limit', 'This room has the maximum amount of Furni.'), + ('furni_table_plasto_square*15_name', 'Occasional Table'), + ('furni_rare_hammock_name', 'Hammock'), + ('sound_machine_confirm_burn_long', 'Are you sure you want to burn this song to disc? Burning costs one credit.'), + ('furni_rclr_chair_desc', 'Watch out for coconuts'), + ('furni_chair_basic*3_desc', 'It\'s a cracking design!'), + ('furni_doormat_plain*6_name', 'Doormat'), + ('furni_sofachair_polyfon*9_name', 'Red Armchair'), + ('furni_jp_tray6_name', 'jp_tray6'), + ('furni_habbocake_name', 'Cake'), + ('poster_501_name', 'Jolly Roger'), + ('nav_goingprivate', 'Going to Guest room'), + ('furni_bed_budget_one*9_name', 'Red Pura Bed'), + ('alert_no_category', 'Your room has no category. Select one from the list.'), + ('nav_venue_theatredrome_easter/0_desc', ''), + ('gs_button_buytickets', 'Buy Tickets'), + ('nav_venue_bouncer_room_4_name', 'Experts Battle Ball Arena'), + ('close', 'Close'), + ('furni_carpet_standard*9_desc', 'Available in a variety of colours'), + ('furni_prizetrophy4*1_desc', 'Glittery gold'), + ('help_pointer_1', 'http://www.habbo.co.uk/help/'), + ('help_pointer_3', 'emergency_help'), + ('furni_rclr_lamp_name', 'Moon Lamp'), + ('help_pointer_2', 'http://www.habbohotel.co.uk/iot/go?lang=en&country=uk'), + ('furni_exe_sofa_desc', 'Relaxing leather comfort'), + ('furni_divider_silo1*4_name', 'Beige Area Corner Shelf'), + ('poster_2001_name', 'SeinNightitititititdiskotappaja'), + ('interface_icon_tv_close', 'Leave the Room and close the Habbovision mode.'), + ('furni_sound_machine*7_name', 'Red Traxmachine'), + ('game_bs_hit', 'A Hit!:'), + ('furni_rare_fan*2_desc', 'It\'ll blow you away!'), + ('win_place', 'Note!'), + ('nav_venue_bb_lobby_beginner_11_name', 'Beginners Battle Ball 12'), + ('furni_pillow*7_desc', 'Bonnie\'s pillow of choice!'), + ('furni_table_silo_small*8_desc', 'For those random moments'), + ('furni_divider_nor4*5_desc', 'Habbos, roll out!'), + ('hubu_vastaa', 'Answer the question'), + ('furni_pura_mdl4*8_name', 'yellow pura module 4'), + ('furni_glass_chair*9_name', 'Glass chair'), + ('furni_chair_silo*7_desc', 'Green Silo Dining Chair'), + ('furni_jp_drawer_desc', 'Spiritual home for odds and ends'), + ('tutorial_select_another_topic', 'Select another topic'), + ('furni_noob_lamp*4_desc', 'Get the light right where you want it (light blue)'), + ('nav_venue_beauty_salon_general_name', 'Beauty salon'), + ('furni_sofachair_polyfon*2_name', 'Black Mode Armchair'), + ('console_report_header', 'Report Abusive Message'), + ('club_buy_url', 'http://%predefined%//credits/habboclub'), + ('furni_prizetrophy*2_name', 'Classic trophy'), + ('furni_rare_icecream*4_name', 'Strawberry Ice Cream Machine'), + ('furni_barchair_silo*5_desc', 'Practical and convenient'), + ('furni_divider_nor2*4_desc', 'No way through'), + ('furni_xmas_cstl_gate_name', 'Ice Castle Gate'), + ('furni_noob_stool*5_desc', 'Unfold me and take the weight off (pink)'), + ('furni_bed_budgetb_one_name', 'Plain Single Bed'), + ('friend_request_accept_all', 'Accept all requests.'), + ('furni_val_choco_name', 'Heart Shaped Box'), + ('poster_514_desc', 'Be proud to be in the Union!'), + ('furni_carpet_legocourt_desc', 'Line up your slam dunk'), + ('furni_sofa_silo_name', 'Two-Seater Sofa'), + ('furni_chair_plasto*8_desc', 'Hip plastic furniture'), + ('furni_tree5_name', 'Christmas Tree 3'), + ('nav_venue_habbo_cinema/0_desc', 'Now showing: Kick Warz II - The revenge of Donnie Santini!'), + ('furni_couch_norja*4_name', 'Urban Iced Bench'), + ('poster_52_desc', 'whack that ball!'), + ('furni_sound_set_45_desc', 'The Bass? is the rhythm!'), + ('nav_venue_sun_terrace/0_name', 'Sun Terrace'), + ('queue_tile_limit', 'You can\'t fit more Habbo Rollers in this room!'), + ('BuddyRequesta', 'Friend Request(s)'), + ('transaction_system_sms_rl', 'Elisa'), + ('furni_prizetrophy4_desc', 'Palkinto'), + ('furni_hcamme_desc', 'Time for a soak'), + ('furni_scifirocket*2_name', 'Earth Smoke Machine'), + ('furni_divider_nor5*2_desc', 'Cool cornering for your crib y0!'), + ('forgottenpw', 'Forgotten your password?'), + ('furni_rclr_sofa_desc', 'Snuggle up together'), + ('furni_val_cauldron_desc', 'Cast a loving spell!'), + ('poster_3_name', 'Fish Plaque'), + ('furni_one_way_door*8_name', 'Yellow One Way Gate'), + ('furni_divider_nor3*8_desc', 'Yellow Iced gate'), + ('sw_link_highScores_url', 'http://%predefined%//groups/56553/id'), + ('furni_carpet_standard*2_desc', 'Available in a variety of colours'), + ('nav_venue_sport/0_name', 'The Power Gym'), + ('furni_scifidoor*3_desc', 'There out of this world!'), + ('furni_pillar*7_desc', 'Recovered from Habblantis'), + ('furni_arabian_tray3_name', 'Sweets Tray'), + ('furni_chair_plasto_name', 'Chair'), + ('nav_venue_pizza_name', 'Slice of Life'), + ('url_privacypledge', 'http://%predefined%//help/69'), + ('furni_one_way_door*3_desc', 'One way! The HC way!'), + ('catalog_purchase_not_allowed_hc', 'In order to buy this item you must be a Habbo Club member!'), + ('furni_pura_mdl3*4_name', 'White Pura Module 3'), + ('room_confirmDelete', 'Confirm'), + ('BuddyPrivateRoom', 'In A Guest Room'), + ('furni_marquee*7_desc', 'It\'s both door and a shade!'), + ('furni_bath_desc', 'The ultimate in pampering'), + ('furni_soft_sofa_norja*3_desc', 'Pristine white, keep it clean!'), + ('game_BattleShip', 'Battleships'), + ('furni_sound_set_11_desc', 'Music you can really sink your teeth into'), + ('furni_glass_chair*2_name', 'Glass chair'), + ('furni_sofa_silo*5_desc', 'Pink Area Sofa'), + ('furni_pura_mdl2*7_name', 'Green Pura Module 2'), + ('cam_film.help', 'Number Of Photos Left'), + ('nav_venue_bb_lobby_tournament_17/0_desc', ''), + ('roomatic_hway', 'Hotel guests are expected to follow the Habbo Way even if word filtering is switched off.'), + ('modify', 'Modify'), + ('furni_sofachair_silo*8_name', 'Yellow Armchair'), + ('alert_reg_blocked', 'A person under 11 years of age has tried to register from this machine recently.\\rRegistration is not possible for a while.'), + ('furni_sofa_polyfon*8_desc', 'Yellow Mode Sofa'), + ('furni_wooden_screen*9_desc', 'Add an exotic touch to your room'), + ('hobba_message_from', 'Your call has been responded to as follows:'), + ('win_help', 'Habbo Help'), + ('pet.saying.sniff.dog.1', 'snuh...SNUUUUUH'), + ('pet.saying.sniff.dog.0', 'snuuh..snuuh'), + ('sw_user_skill', 'Snow Storm Skill Level: \\x \\r (\\y points)'), + ('furni_rom_lamp_desc', 'Light up your life'), + ('console_profile_create', 'Create your Habbo Profile.'), + ('furni_CF_50_goldbar_desc', 'Worth 50 Credits'), + ('furni_romantique_chair*4_desc', 'What does this button do?'), + ('reg_use_allowed_chars', 'Use only these characters:'), + ('furni_bar_chair_armas_name', 'Barrel Stool'), + ('pet.saying.sniff.dog.2', '*sighs*'), + ('furni_sound_set_64_name', 'Alhambra Trax 3'), + ('furni_pillar*3_name', 'blue pillar'), + ('furni_glass_chair*4_desc', 'Translucent beauty'), + ('furni_pizza_desc', 'You dirty Habbo'), + ('opening_hours_text_shutdown', 'The Hotel will shut down in %d% minutes. To avoid confusion, purchasing of furniture, Habbo Club and game tickets will be disabled during that time, as well as playing Games and furniture trading. Thank you for visiting and welcome back tomorrow!'), + ('nav_venue_bb_lobby_tournament_10_name', 'Competitie Battle Ball 11'), + ('poster_521_desc', 'Ordem e progresso'), + ('furni_sound_set_52_desc', 'Under the mistletoe!'), + ('furni_shelves_norja*3_name', 'White Iced Bookcase'), + ('furni_scifiport*5_desc', 'Recovered from Roswell'), + ('help_emergency_writeyour', 'Give details of your emergency here:'), + ('furni_table_norja_med*6_name', 'Large Coffee Table Blue'), + ('nav_venue_bb_lobby_expert_3_name', 'Experts Battle Ball 4'), + ('photo_legend', 'Caption'), + ('furni_sofachair_silo_desc', 'Large, but worth it'), + ('console_youdonthavebuddies', 'You have no Friends on your list.\\rYou can send Friend Requests using\\rthe \'search\' button.'), + ('furni_table_plasto_4leg*6_name', 'Occasional table Table'), + ('furni_scifidoor*1_name', 'Pink Spaceship Door'), + ('furni_tile_brown_desc', '10% off downtown promenades & piazzas!'), + ('NUF_getting_room_go_button', 'Click here to go to your just created room!'), + ('dimmer_turn_on', 'Turn ON'), + ('furni_sofa_polyfon_desc', 'Comfort for stylish couples'), + ('furni_sound_set_50_name', 'Club 5'), + ('furni_doorB_name', 'Wardrobe'), + ('reg_agree1', 'Yes, my parents and I agree to the above terms. I am allowed to use Habbo Hotel.'), + ('furni_chair_silo*3_name', 'White Dining Chair'), + ('furni_CF_1_coin_bronze_desc', 'Worth 1 Credits'), + ('reg_agree2', 'Yes, I have read the Habbo Hotel Terms of Service and I accept them'), + ('you_have_pending_cfh', 'Your previous call for help has not been answered yet. To make a new one you must delete the old message.'), + ('furni_table_plasto_bigsquare*7_name', 'Square Dining Table'), + ('console_accept', 'Accept'), + ('furni_lamp_basic_name', 'Pura Lamp'), + ('console_friend_request_error', 'There was an error with friend requests'), + ('poster_11_desc', 'I obey the Habbo way!'), + ('furni_bardeskcorner_polyfon*6_name', 'Blue Mode Bardesk Corner'), + ('furni_plant_sunflower_name', 'Cut Sunflower'), + ('furni_traffic_light*3_name', 'Purple Traffic Light'), + ('furni_bed_polyfon_one*8_name', 'Yellow Mode Single Bed'), + ('furni_carpet_polar*1_desc', 'Cute'), + ('furni_noob_rug*1_desc', 'Nice and neat sisal rug with orange edging'), + ('furni_exe_bardesk_desc', 'Divide the profits!'), + ('furni_romantique_divider*4_desc', 'Keeping things separated'), + ('pet_status_dialog', '%name%'), + ('furni_jp_lantern_name', 'Japanese Lantern'), + ('furni_chair_norja*2_name', 'Black Chair'), + ('furni_jp_irori_desc', 'Traditional heating and eating'), + ('furni_bed_budget*5_name', 'Beige Pura Double Bed'), + ('furni_scifidoor*8_name', 'Purple Spaceship Door'), + ('nav_venue_sw_lobby_free_5_name', 'Free Game Lobby'), + ('wallitem_jp_sheet2_desc', 'jp_sheet2'), + ('furni_glass_sofa*9_desc', 'Translucent beauty'), + ('furni_divider_nor5*7_name', 'Rural Iced Angle'), + ('sound_machine_open_editor', 'Trax Editor'), + ('furni_jp_tatami2_desc', 'Shoes off please'), + ('furni_sound_set_16_name', 'Hip Hop Beats 3'), + ('console_recipients', 'Recipient(s)'), + ('catalog_page', 'page'), + ('poster_23_name', 'Bat Poster'), + ('furni_table_plasto_round*4_name', 'Square Dining Table'), + ('furni_rubberchair*2_desc', 'Soft and tearproof!'), + ('nav_venue_bb_lobby_beginner_16/0_desc', ''), + ('poster_1005_name', 'Johnny Squabble'), + ('furni_silo_studydesk_name', 'Area Quest Desk'), + ('furni_table_plasto_4leg*1_desc', 'Hip plastic furniture'), + ('nav_venue_basement_lobby/0_desc', 'For low level hanging'), + ('furni_rare_parasol*3_desc', 'Block those rays!'), + ('furni_arabian_wndw_name', 'Arabian Window Frame'), + ('Alert_ConnectionFailure', 'Disconnected'), + ('furni_house_desc', 'Good enough to eat'), + ('console_confirm_selected', 'Confirm the selections. Below are the amount of friend requests that will be accepted and declined. If you want, you can still modify the selections.'), + ('furni_table_plasto_4leg*4_name', 'Square Dining Table'), + ('furni_sound_set_57_name', 'RnB Grooves 3'), + ('hubu_h3', 'Huumetietobussi'), + ('furni_table_plasto_bigsquare*2_name', 'Square Dining Table'), + ('hubu_h4', 'Anna palautetta'), + ('hubu_h1', 'Puhelintuki'), + ('roomatic_bobbafilter', 'Bobba filter (filters out bad language)'), + ('hubu_h2', 'Harrastamaan!'), + ('furni_tv_luxus_desc', 'Bang up to date'), + ('hubu_h5', 'Huumetietoa'), + ('NUF_console_hotelview_icon', 'Click the button to open your Habbo Console.'), + ('modtool_banlength', 'Ban Length:'), + ('NUF_visiting_rooms_roomlist_tutor', 'Just pick any room you like. Click on the room to see a description of the room. ROOM!'), + ('reg_verification_newPassword', 'New password:'), + ('furni_wall_china_name', 'Dragon Screen'), + ('nav_venue_hallway_ii/0_desc', 'Beware witches and warlocks'), + ('jukebox_disk_add', 'Add Disc'), + ('furni_rare_xmas_screen_desc', 'Ho Ho Ho!'), + ('furni_table_plasto_round*2_name', 'Round Dining Table'), + ('furni_rubberchair*7_name', 'White Inflatable Chair'), + ('nav_favourites_helptext', 'These are your favourite rooms. Nice selection you have here...'), + ('nav_venue_sw_lobby_beginner_4_name', 'Snow Rookies Lobby'), + ('furni_gothic_chair*2_desc', 'The prince of Habbo'), + ('cam_save_nofilm', 'You have run out of film.\\rGet a roll (5 photos) from\\rthe Catalogue for 6 Credits.'), + ('furni_sofa_polyfon*6_desc', 'Blue Mode Sofa'), + ('furni_divider_silo3*2_desc', 'Form following function'), + ('furni_rare_beehive_bulb*1_name', 'Red Amber Lamp'), + ('furni_plant_small_cactus_desc', 'Even less watering than the real world'), + ('furni_triplecandle_name', 'Electric Candles'), + ('help_option_1', 'Playing Habbo'), + ('help_option_3', 'A serious issue (harassment, sexual behaviour)'), + ('furni_present_gen5_name', 'Gift'), + ('help_option_2', 'My Habbo account.'), + ('furni_shelves_norja*8_name', 'Yellow Bookcase'), + ('furni_legotrophy_desc', 'For the winning team'), + ('furni_rare_icecream*2_name', 'Pistachio Ice Cream Machine'), + ('furni_summer_pool*1_desc', 'Fancy a dip?'), + ('nav_venue_theatredrome_deli/0_desc', 'Join in all the fun of the fair!'), + ('game_newgame', 'New game'), + ('help_tour', 'Guided Tour'), + ('purse_vouchers_error3_url', 'http://%predefined%//credits'), + ('furni_marquee*5_name', 'Graphite Marquee'), + ('forgottenpw_explanation', 'If you have forgotten your password and you gave your correct email address when you registered, we can send your password to you.'), + ('furni_waterbowl*3_name', 'Yellow Water Bowl'), + ('roomatic_namedisp', 'Do you want your name to be displayed with the room?'), + ('poster_28_name', 'Silver Tinsel Bundle'), + ('Alert_BuyingOK', 'Buying Successful!'), + ('furni_summer_chair*4_name', 'Deck Chair'), + ('nav_venue_welcome_lounge_ii/0_desc', 'New? Lost? Get a warm welcome here from Habbo eXperts.'), + ('bb_title_gameCreation', 'Aloita uusi peli!'), + ('furni_sporttrack1*3_name', 'Sport track straight grass'), + ('furni_romantique_divan*2_name', 'Emerald Chaise-Longue'), + ('furni_divider_silo1*6_name', 'Blue Area Corner Shelf'), + ('NUF_about_hotel_about_tutor', 'Habbo is both a virtual world and an online community.'), + ('url_helpparents', 'http://%predefined%//help/73'), + ('furni_divider_silo3*7_name', 'Green Area Gate'), + ('poster_18_desc', 'Beautiful reproduction butterfly'), + ('furni_traffic_light*5_desc', 'Chill and wait your turn!'), + ('furni_scifirocket*6_desc', 'Too hot to handle!'), + ('pet.saying.angry.cat.0', 'Sssppp!'), + ('furni_bed_armas_one_desc', 'Rustic charm for one'), + ('pet.saying.angry.cat.3', '*hiss*'), + ('pet.saying.angry.cat.1', 'MrrRRRR'), + ('pet.saying.angry.cat.2', 'Tssssss!'), + ('furni_noob_rug*6_name', 'My first Habbo rug'), + ('club_habbo.bottombar.text.member', 'Habbo Club'), + ('furni_divider_silo1_name', 'Corner Shelf'), + ('nav_venue_bb_lobby_beginner_10/0_desc', ''), + ('recycler_info_progress', 'Recycling is currently in progress. The recycling process takes a total of %recyclinghours% hour. You can leave the catalogue and recycling will continue in the background.'), + ('furni_queue_tile1*1_name', 'Pink Habbo Roller'), + ('notickets_header', 'Buy game tickets to play this game'), + ('reg_underage', 'I am under 11 years old'), + ('nav_venue_sw_arena_intermediate_name', 'Playing intermediate game'), + ('furni_table_plasto_square*5_name', 'Square Dining Table'), + ('Alert_YouAreBanned_T', 'A Moderator kicked you out of the room.'), + ('buddyremove_moreoptions', 'More Options >>'), + ('furni_prizetrophy4*3_desc', 'Breathtaking bronze'), + ('furni_chair_silo*2_desc', 'Keep it simple'), + ('club_habbo.bottombar.link.notmember', 'Join!'), + ('poster_1000_name', 'Comedy Poster'), + ('room_badge_button', 'Badge'), + ('furni_soft_sofa_norja*8_desc', 'Yellow Iced Sofa'), + ('wallitem_torch_name', 'Gothic Torch'), + ('furni_scifirocket*7_name', 'Jupiter Smoke Machine'), + ('furni_romantique_tray1_desc', 'For a fast break'), + ('furni_rare_dragonlamp*0_desc', 'George and the...'), + ('furni_nest_desc', 'Night, night'), + ('furni_table_silo_small*2_name', 'Black Occasional Table'), + ('furni_prizetrophy7*2_name', 'Silver Habbo trophy'), + ('furni_sofachair_silo*3_desc', 'Large, but worth it'), + ('furni_divider_nor2*9_name', 'Red Iced bar desk'), + ('club_extend_title', 'Habbo Club membership can be extended VERY easily.'), + ('furni_rare_fan*0_desc', 'As red as Rudolph\'s nose'), + ('club_paybycash_url', '(leave this empty if you don\'t want to have this link displayed)'), + ('poster_57_name', 'Calligraphy poster'), + ('furni_CFC_50_coin_silver_desc', 'Worth 50 Credits'), + ('furni_pillow*5_name', 'Black Leather Pillow'), + ('furni_hc_chr_name', 'Majestic Chair'), + ('nav_venue_sw_arena_free_name', 'Playing free for all game'), + ('furni_active_placeholder_desc', 'This furniture is downloading...'), + ('nav_venue_welcome_lounge_name', 'Welcome Lounge'), + ('furni_soft_sofachair_norja*3_name', 'White Iced Sofachair'), + ('furni_bed_polyfon*3_desc', 'Give yourself space to stretch out'), + ('furni_pura_mdl4*3_name', 'Black Pura Module 4'), + ('furni_pillar*2_desc', 'Ancient and stately'), + ('furni_small_chair_armas_desc', 'Rustic charm at it\'s best'), + ('furni_table_plasto_round_desc', 'Hip plastic furniture'), + ('furni_marquee*2_desc', 'Dragons out and Davids in!'), + ('furni_wooden_screen*7_desc', 'Add an exotic touch to your room'), + ('furni_queue_tile1*8_name', 'Navy Habbo Roller'), + ('furni_arabian_pllw_desc', 'Exotic comfort'), + ('furni_sound_set_1_desc', 'Get the party started!'), + ('furni_gothic_stool*5_desc', 'The dark side of Habbo'), + ('furni_china_table_desc', 'Exotic and classy'), + ('song_disk_trade_info', '%name%'), + ('nav_venue_sw_lobby_beginner_9_name', 'Snow Rookies Lobby'), + ('console_modify', 'Modify'), + ('poster_36_desc', 'The Hotels girlband. Dream on!'), + ('furni_rare_dragonlamp*7_desc', 'Scary and scorching!'), + ('furni_sound_set_63_desc', 'Desert hits by the oasis!'), + ('nav_venue_cafe_gold_name', 'The Oasis'), + ('nav_venue_sw_lobby_tournament_3/0_desc', ''), + ('nav_venue_habbo_cinema_name', 'Habbo Cinema'), + ('furni_chair_plasty*4_name', 'Plastic Pod Chair'), + ('nav_venue_welcome_lounge_iii/0_desc', 'New? Lost? Get a warm welcome here from Habbo eXperts.'), + ('furni_carpet_soft*1_desc', 'Soft Wool Rug'), + ('furni_sporttrack1*1_name', 'Sport track straight'), + ('furni_divider_nor3*6_name', 'Blue Iced gate'), + ('furni_glass_chair*7_name', 'Green Glass Chair'), + ('club_confirm_gift_text', 'A new club gift has arrived. Please push OK if you want to receive it now. If you click cancel you will be asked again next time you log in to the Hotel.'), + ('furni_rubberchair*5_name', 'Lime Inflatable Chair'), + ('furni_plant_maze_snow_name', 'Snowy Maze Bundle 2'), + ('furni_table_silo_med*4_name', 'Beige Area Coffee Table'), + ('furni_solarium_norja*1_desc', 'Rejuvenate your pixels!'), + ('furni_divider_nor2*2_name', 'Black Iced bar desk'), + ('poster_45_desc', 'Needs a few more Habburgers'), + ('wallitem_habw_mirror_desc', 'Star of the show!'), + ('furni_pura_mdl3*9_name', 'Red Pura Module 3'), + ('furni_exe_corner_name', 'Executive Corner Desk'), + ('nav_venue_cunning_fox_gamehall/3_desc', 'Are you the new Deep Blue?'), + ('furni_rare_fan*7_desc', 'It\'ll blow you away!'), + ('furni_divider_nor1*5_desc', 'Pink Ice corner'), + ('wallitem_md_logo_wall_name', 'Bubble Juice Logo'), + ('furni_bardesk_polyfon_desc', 'Perfect for work or play'), + ('console_target_does_not_accept', 'This user does not accept friend requests at the moment'), + ('pet.saying.beg.croco.0', 'Mmmmmrrr'), + ('pet.saying.beg.croco.1', '*Emo tear*'), + ('messenger.email.header', ''), + ('pet.saying.beg.croco.2', 'Waarrrr...rrr'), + ('furni_carpet_polar*4_name', 'Green Bear Rug'), + ('furni_chair_plasto*6_name', 'Chair'), + ('furni_noob_rug*4_name', 'My first Habbo rug'), + ('furni_summer_chair*6_desc', 'Blue'), + ('rotate_furniture', 'Rotate Furni'), + ('poster_16_desc', 'Added security'), + ('furni_sofachair_silo*7_desc', 'Green Area Armchair'), + ('furni_divider_nor5*4_desc', 'Cool cornering for your crib!'), + ('furni_sand_cstl_twr_name', 'sand_cstl_twr'), + ('furni_safe_silo*4_name', 'Beige Safe Minibar'), + ('furni_chair_plasty*11_name', 'Plastic Pod Chair'), + ('furni_divider_arm2_name', 'Room divider'), + ('furni_sound_set_55_name', 'RnB Grooves 1'), + ('nav_venue_sw_lobby_intermediate_4_name', 'Snow Bombardiers Lobby'), + ('roomatic_canmodifysettings', '(You can change these settings later)'), + ('furni_pura_mdl5*7_desc', 'Any way you like it!'), + ('catalog_pet_name_length', 'Oops, pet\'s name is too long (max 15 characters)'), + ('furni_toy1*3_name', 'Rubber Ball'), + ('nav_venue_beauty_salon_loreal/0_desc', 'No Pixel Surgery, only natural make-ups!'), + ('furni_arabian_swords_name', 'Ancestral Scimitars'), + ('furni_summer_pool*4_name', 'Yellow Summer Pool'), + ('gs_error_create_0', 'This Lobby is full, please create a Game in another Lobby!'), + ('nav_venue_pizzeria/0_desc', 'Pizza; food of the hungry!'), + ('nav_roomnfo_hd_own', 'Own Rooms'), + ('furni_glass_sofa*4_desc', 'Translucent beauty'), + ('buddyremove_accept', 'Remove Friends'), + ('transaction_system_sms_win_orange', 'Orange SMS'), + ('gs_error_create_3', 'Your skill level isn\'t high enough for creating Games in this Lobby.'), + ('furni_goodie2_desc', 'For gourmet kittens'), + ('trading_youagree', 'You agree'), + ('furni_bench_lego_name', 'Team Bench'), + ('reg_verification_updateOK', 'Update successful'), + ('transaction_system_refunds', 'Refund'), + ('furni_carpet_standard*7_name', 'Floor Rug'), + ('poster_44_name', 'Mummy'), + ('furni_bed_polyfon_one*3_name', 'White Single Bed'), + ('furni_jp_tray1_name', 'jp_tray1'), + ('furni_jp_tatami_name', 'Small Tatami Mat'), + ('furni_bardesk_polyfon*2_name', 'Black Mode Bardesk'), + ('furni_hockey_light_desc', 'Set it off.'), + ('nav_venue_bb_lobby_intermediate_2/0_desc', ''), + ('wallitem_guitar_v_name', 'v guitar'), + ('reg_email', 'Email:'), + ('nav_venue_sw_lobby_tournament_0/0_desc', ''), + ('furni_club_sofa_name', 'Club sofa'), + ('furni_duck_name', 'Rubber Duck'), + ('furni_divider_nor5*9_name', 'Red Iced Angle'), + ('furni_smooth_table_polyfon_name', 'Large Dining Table'), + ('reg_forcedupdate', 'Please update your Habbo details!'), + ('transaction_system_stuff_store', 'Catalogue purchase'), + ('console_request_massoperation_title', 'You have %messageCount% friend requests waiting.'), + ('nav_venue_bb_lobby_expert_8/0_desc', ''), + ('roomatic_roomdescription', 'Room description:'), + ('reg_verification_invalidEmail', 'Check email address'), + ('furni_xmas_icelamp_desc', '20 lanterns for the price of 6!'), + ('wallitem_wallmirror_desc', 'Mirror, mirror on the wall...'), + ('furni_pura_mdl1*3_name', 'Black Pura Module 1'), + ('pet.saying.play.croco.1', 'Squeh Squeeeeh...'), + ('pet.saying.play.croco.0', ':)'), + ('nav_venue_theatredrome_halloween/0_desc', 'Warm welcome to Bullet For My Valentine!'), + ('nav_venue_bb_lobby_amateur_6_name', 'Gevorderden Battle Ball 7'), + ('cam_savetxt', 'Saving Photo...'), + ('nav_venue_bb_lobby_intermediate_1_name', 'Semi-profs Battle Ball 2'), + ('nav_modify_doorstatus', 'Door status'), + ('callhelp_sent', 'If you have questions about Habbo Hotel or your Habbo account, please write the details below and a member of community staff will respond as soon as possible.'), + ('wallitem_photo_name', 'Photo'), + ('poster_25_desc', 'A new use for carrots!'), + ('furni_chair_plasto*1_desc', 'Hip plastic furniture'), + ('furni_prizetrophy4*2_name', 'Fish trophy'), + ('furni_bar_armas_name', 'Barrel Minibar'), + ('nav_rooms_favourite', 'Favourites'), + ('furni_table_plasto_square*6_desc', 'Hip plastic furniture'), + ('furni_gothic_sofa*6_desc', 'The dark side of Habbo'), + ('jukebox_song_length', 'Song length: %time%'), + ('buddyremove_header', 'Choose %amount% friends to remove'), + ('furni_romantique_mirrortabl_desc', 'Get ready for your big date'), + ('wallitem_hrella_poster_2_name', 'Life Buoy'), + ('reg_boy', 'Boy'), + ('sound_machine_trax_name', 'Trax name:'), + ('purse_vouchers_error0', 'Technical error! Cannot redeem voucher.'), + ('furni_plant_valentinerose*3_name', 'Yellow Valentine Rose'), + ('purse_vouchers_error1', 'Invalid voucher code.'), + ('nav_venue_bb_lobby_expert_1_name', 'Experts Battle Ball 2'), + ('purse_vouchers_error2', 'Product delivery failed, please contact Customer Service'), + ('purse_vouchers_error3', 'This voucher must be redeemed on the Habbo website'), + ('furni_romantique_chair*2_desc', 'null'), + ('furni_prizetrophy7*1_desc', 'Gold Habbo trophy'), + ('furni_table_plasto_bigsquare*14_name', 'Occasional Table'), + ('furni_ticket_desc', 'A bundle of 5 gaming tickets'), + ('nav_venue_club_massiva_name', 'Club Massiva'), + ('roomatic_locked', 'Door locked - visitors have to ring doorbell'), + ('furni_table_silo_small*3_desc', 'For those random moments'), + ('furni_bed_trad_name', 'Plain Double Bed'), + ('summer_chair_5_name', 'Beige Deck Chair'), + ('buddyremove_select_all', 'Select All Friends'), + ('furni_plant_valentinerose*5_desc', 'For that special pixel'), + ('furni_glass_table*9_name', 'Glass table'), + ('furni_romantique_smalltabl*5_desc', 'Why is one leg different?'), + ('furni_pura_mdl5*5_name', 'beige pura module 5'), + ('poster_30_name', 'Mistletoe'), + ('furni_chair_basic*8_name', 'chair_basic'), + ('nav_venue_sw_lobby_amateur_2_name', 'Snow Slingers Lobby'), + ('Alert_ConnectionDisconnected', 'Please reload Habbo Hotel!\\r\\rIf this happens again, please wait a moment before reloading.'), + ('Alert_WrongPassword', 'Check password!'), + ('nav_modify_letothersmove', 'Let other people move and leave furniture in the room.'), + ('furni_rare_dragonlamp*1_name', 'Sea Dragon Lamp'), + ('furni_table_plasto_4leg*10_desc', 'Hip plastic furniture'), + ('furni_sound_set_28_name', 'Rock 2'), + ('furni_grand_piano*2_name', 'Black Grand Piano'), + ('furni_basket_desc', 'Eggs-actly what you want for Easter'), + ('furni_rare_fan*5_name', 'Yellow Powered Fan'), + ('furni_noob_lamp*2_name', 'My first Habbo lamp'), + ('furni_present_gen4_desc', 'What\'s inside?'), + ('furni_pillar*9_desc', 'Ancient and stately'), + ('furni_chair_norja*8_desc', 'Sleek and chic for each cheek'), + ('furni_pura_mdl2*2_desc', 'Any way you like it!'), + ('furni_glass_stool*5_desc', 'Translucent beauty'), + ('furni_hc_lmp_name', 'Oil Lamp'), + ('console_myinterests', 'My interests:'), + ('furni_val_teddy*6_desc', 'The blue bear of happiness'), + ('room_cant_set_item', 'You cannot place this in someone else\'s room!'), + ('poster_29_desc', '10 x Gold Tinsel'), + ('club_general_daysleft', 'Number of HC days left'), + ('nav_popup_nav_link', 'Open the Navigator'), + ('furni_sound_set_43_desc', 'Beware zombies!'), + ('furni_solarium_norja*6_name', 'Blue Solarium'), + ('furni_doormat_plain*1_name', 'Doormat'), + ('nav_venue_chill_name', 'Zen Garden'), + ('furni_one_way_door*5_desc', 'One at a time!'), + ('furni_table_plasto_round*3_desc', 'Hip plastic furniture?'), + ('furni_prizetrophy6_desc', 'Palkinto'), + ('furni_exe_s_table_name', 'Executive Glass Table'), + ('furni_noob_rug*5_desc', 'Nice and neat sisal rug with pink edging'), + ('furni_scifirocket*0_name', 'Mars Smoke Machine'), + ('furni_soft_jaggara_norja_desc', 'Soft Iced sofachair'), + ('nav_venue_bb_lobby_amateur_9/0_desc', ''), + ('furni_chair_plasty*5_desc', 'Hip plastic furniture'), + ('hobba_mark_emergency', 'Emergency Help'), + ('furni_djesko_turntable_name', 'Habbo Turntable'), + ('furni_shelves_norja*9_desc', 'For nic naks and art deco books'), + ('poll_confirm_cancel_long', 'Are you sure you want to stop answering the poll? You can\'t continue later.'), + ('poster_32_desc', 'The Auspicious One'), + ('opening_hours_text_opening_time', 'The Hotel will open again at %h%:%m%. We look forward to welcoming you back!'), + ('furni_bed_budget_one*7_name', 'Green Pura Bed'), + ('furni_pillow*0_desc', 'Minimalist comfort!'), + ('furni_divider_poly3*8_desc', 'Yellow Mode Bardesk Gate'), + ('nav_venue_bb_lobby_beginner_13/0_desc', ''), + ('furni_sound_set_6_name', 'Ambient 3'), + ('hubu_win', 'Bus - Info'), + ('furni_sound_machine*5_name', 'Brown Traxmachine'), + ('furni_sporttrack1*2_desc', 'null'), + ('bb_title_bouncingBall', 'Battle Ball'), + ('nav_venue_rooftop/0_desc', 'Hang out on the very rooftop of Habbo Hotel!'), + ('modtool_banreason', 'Ban Reason:'), + ('furni_chair_silo*9_desc', 'Red Silo Dining Chair'), + ('furni_bed_budget*6_desc', 'King sized comfort!'), + ('furni_s_sound_machine*4_desc', 'Sound Machine Blue Desc'), + ('furni_rubberchair*6_desc', 'Soft and tearproof!'), + ('nav_venue_sw_lobby_expert_1_name', 'Snow Marksmen Lobby'), + ('nav_venue_bb_lobby_beginner_7/0_desc', ''), + ('furni_table_plasto_4leg*5_desc', 'Hip plastic furniture'), + ('gen_youhave', 'You Have'), + ('furni_carpet_soft*6_name', 'Soft Wool Rug'), + ('furni_petfood2_desc', 'Fantastic 20% Saving!'), + ('group_privileges', 'Priviliges:'), + ('furni_samovar_name', 'Russian Samovar'), + ('furni_hal_grave_name', 'Haunted Grave'), + ('furni_bed_budget_one*2_desc', 'Princess sized comfort!'), + ('gs_error_1', 'You have entered invalid data!'), + ('reject', 'Reject'), + ('gs_error_4', 'You have reached your maximum number of daily Games!'), + ('nav_venue_sw_lobby_tournament_5_name', 'Tournament Lobby'), + ('gs_error_5', 'Tournament is only available for users living in the UK.'), + ('gs_error_2', 'You don\'t have enough Tickets!'), + ('gs_error_8', 'To start a Game, there must be at least two Teams of one player each!'), + ('sound_machine_alert_no_sound_sets', 'You don\'t have any sound sets available for song editing. \\rNote that the sets need to be in your inventory (hand).'), + ('furni_waterbowl*4_desc', 'Aqua unlimited'), + ('furni_doormat_love_desc', 'Welcome Habbos in style'), + ('gs_error_6', 'You have been removed from the Game!'), + ('furni_soft_sofachair_norja*4_desc', 'Sit back and relax'), + ('bb_powerup_desc_8', 'By using a vacuum cleaner, you can clear any tile in the field.'), + ('move', 'Move'), + ('furni_romantique_smalltabl*3_name', 'Turquoise Tray Table'), + ('furni_bed_polyfon*8_name', 'Yellow Mode Double Bed'), + ('furni_sofachair_polyfon*4_desc', 'Beige Mode Armchair'), + ('forgottenpw_email', 'Your email address'), + ('console_email', 'Email'), + ('bb_powerup_desc_1', 'Light bulb colours an area around it.'), + ('furni_divider_nor2_desc', 'Strong, yet soft looking'), + ('furni_bardeskcorner_polyfon*5_desc', 'For sweet corners!'), + ('say', 'Say'), + ('bb_powerup_desc_3', 'Flashlight colours a straight line ahead of you.'), + ('bb_powerup_desc_2', 'Bouncing on a spring locks tiles in a single jump.'), + ('bb_powerup_desc_5', 'Bouncing on a box of pins will burst your Battle Ball!'), + ('bb_powerup_desc_4', 'A shot with a cannon locks tiles on a straight line.'), + ('furni_chair_basic*1_name', 'chair_basic'), + ('bb_powerup_desc_7', 'A bomb will clear all tiles around it.'), + ('bb_powerup_desc_6', 'Harlequin effect makes everybody colour tiles for your team!'), + ('NUF_console_read_next', 'Click \'OK\' to mark message as read.'), + ('poster_50_name', 'Bat Poster'), + ('furni_table_plasto_4leg*15_name', 'Occasional Table'), + ('furni_tree7_desc', 'Walking in a winter wonderland!'), + ('poster_37_name', 'The Habbo Babes 3'), + ('furni_queue_tile1*7_desc', 'The power of movement'), + ('furni_bed_budgetb_name', 'Plain Double Bed'), + ('interface_icon_sound', 'Sound Off/On'), + ('pet.hotwords.come_here', 'come here'), + ('poster_10_name', 'Lapland Poster'), + ('win_delete_item', 'Remove Item'), + ('wallitem_hrella_poster_3_name', 'Anchor'), + ('furni_table_plasto_bigsquare*8_desc', 'Hip plastic furniture'), + ('furni_habboween_grass_name', 'Unholy Ground'), + ('furni_plant_valentinerose*4_name', 'Pink Valentine\'s Rose'), + ('nav_venue_skylight_lobby/0_desc', 'Lift your spirits on the top floor'), + ('buddyremove_alphabetical', 'Alphabetical Order'), + ('alert_win_coppa', 'You are blocked'), + ('nav_venue_bb_lobby_amateur_5_name', 'Gevorderden Battle Ball 6'), + ('reg_update_text', 'Never change your password or email just because somebody asks you to. He / she is most probably trying to steal your Habbo account and furni!'), + ('decision_ok', 'OK'), + ('furni_summer_grill*3_name', 'Yellow Barbeque Grill'), + ('nav_public_helptext', 'These are hotel\'s public rooms. What are you waiting for? Go and meet other Habbos!'), + ('tickets_button_info_2', 'Stuff you can do with these 20 tickets'), + ('furni_rclr_chair_name', 'Palm Chair'), + ('login_create1here', 'You can create one here.'), + ('tickets_button_info_1', 'Stuff you can do with these 2 tickets'), + ('furni_prizetrophy6*3_name', 'Champion trophy'), + ('furni_shelves_norja*2_desc', 'For nic naks and art deco books'), + ('purse_info', 'DESCRIPTION'), + ('bb_choose_powerups', 'Powerup select'), + ('purse_transaction', 'View Transactions'), + ('reg_birthdayformat', 'Birthday*: [dd][mm][yyyy]'), + ('Alert_YouMustAgree', 'You must accept the Terms and Conditions before proceeding.'), + ('jukebox_empty', 'Empty'), + ('purse_info_film', 'Films For Camera'), + ('furni_sofachair_polyfon*9_desc', 'Loft-style comfort'), + ('furni_habbocake_desc', 'Save me a slice!'), + ('furni_doormat_plain*6_desc', 'Available in a variety of colours'), + ('nav_venue_sun_terrace/0_desc', 'For lazy afternoons and super tan treatment!'), + ('poster_501_desc', 'For pirates everywhere'), + ('pet_thir_2', 'Thirsty'), + ('gs_error_watch_0', 'All The Spectator Seats Are Taken!'), + ('pet_thir_3', 'Not thirsty'), + ('camera_open_dialog_text', 'Would you like to take some photos\\ror put your camera in your room?'), + ('furni_bed_budget_one*9_desc', 'Prince sized comfort!'), + ('ph_goswimming', 'Go swimming!'), + ('furni_habboween_crypt_name', 'Creepy Crypt'), + ('gs_error_join_7', 'You have already joined this Game!'), + ('nav_venue_sw_lobby_amateur_3_name', 'Snow Slingers Lobby'), + ('furni_romantique_smalltabl*4_name', 'Amber Tray Table'), + ('gs_error_join_3', 'You either have too much or too little skill to join.'), + ('pet_thir_0', 'Gasping'), + ('gs_error_join_0', 'The team you selected is already full.'), + ('pet_thir_1', 'Parched'), + ('furni_gothic_stool*3_name', 'Gothic Stool Red'), + ('furni_wooden_screen*1_name', 'Pink Oriental screen'), + ('furni_sofa_silo*4_name', 'Beige Area Sofa'), + ('furni_queue_tile1*2_desc', 'The power of movement'), + ('buddyremove_continue', 'Remove Friend Now'), + ('nav_venue_bb_lobby_expert_2/0_desc', ''), + ('nav_loading', 'Loading...'), + ('furni_bed_armas_two_name', 'Double Bed'), + ('furni_prizetrophy4*1_name', 'Fish trophy'), + ('furni_sound_machine*7_desc', 'Red alert. Red alert. It\'s a party!'), + ('furni_glass_sofa_desc', 'Translucent beauty'), + ('furni_barchair_silo*5_name', 'Pink Bar Stool'), + ('furni_soft_sofachair_norja*5_desc', 'Pink Iced Sofachair'), + ('console_fr_accepted_count', 'Amount to be accepted'), + ('poster_2001_desc', 'Perinteinen ryijy,'), + ('furni_couch_norja*5_desc', 'Two can perch comfortably'), + ('furni_rclr_lamp_desc', 'Light your space'), + ('furni_sand_cstl_wall_desc', 'sand_cstl_wall'), + ('furni_one_way_door*4_name', 'Beige One Way Gate'), + ('furni_corner_china_name', 'Dragon Screen'), + ('nav_venue_sw_lobby_amateur_4/0_desc', 'Astetta rankempaa lumisotaa.'), + ('furni_chair_silo*7_name', 'Green Silo Dining Chair'), + ('transaction_system_messenger', 'Console SMS'), + ('furni_pura_mdl4*8_desc', ''), + ('console_reject_selected', 'Reject selected'), + ('furni_rare_icecream*4_desc', 'Virtual strawberry rocks!'), + ('furni_prizetrophy*2_desc', 'Shiny silver'), + ('furni_scifiport*0_desc', 'Energy beams. No trespassers!'), + ('paalu_ui2', 'Push'), + ('paalu_ui3', 'Moving'), + ('paalu_ui4', 'Stabilise'), + ('paalu_ui5', 'Balance'), + ('furni_sofa_polyfon*7_name', 'Green Mode Sofa'), + ('nav_error_toomanyfavrooms', 'You can\'t have more than 10 favourite rooms! Please remove an old favourite if you want to add a new one.'), + ('furni_noob_stool*5_name', 'My first Habbo stool'), + ('sound_machine_alert_missing_packages', 'You need the following Traxpacks to edit this song:'), + ('furni_grunge_bench_name', 'Bench'), + ('paalu_ui1', 'Balance'), + ('furni_sleepingbag*5_name', 'Graphite Sleeping Bag'), + ('furni_divider_nor2*3_name', 'White Iced Bar-Desk'), + ('bb_header_teams', 'Teams'), + ('wallitem_sw_swords_name', 'Swords'), + ('furni_val_choco_desc', 'One for them. Two for me!'), + ('nav_venue_bb_lobby_expert_5/0_desc', ''), + ('furni_soft_sofa_norja*2_name', 'Black Iced Sofa'), + ('furni_bed_budgetb_one_desc', 'All you need for a good night\'s kip'), + ('furni_carpet_standard*8_name', 'Floor Rug'), + ('furni_rare_dragonlamp*6_name', 'Gold Dragon Lamp'), + ('furni_sound_set_56_desc', 'Get down tonight!'), + ('furni_divider_nor5*2_name', 'Black Iced Angle'), + ('chat.curse_word', 'Bobba'), + ('furni_couch_norja*4_desc', 'Two can perch comfortably'), + ('furni_scifirocket*2_desc', 'A little closer to home!'), + ('furni_rare_fan*6_desc', 'It\'ll blow you away!'), + ('poster_514_name', 'The EU flag'), + ('club_desc_2_period', '3 Months (93 days) = 60 Credits'), + ('furni_glass_chair*9_desc', 'Translucent beauty'), + ('poster_1338_desc', 'If her age on the clock, she ready for the cock'), + ('nav_src_hd', 'Search Results.'), + ('console_unknown_sender', 'Unknown sender'), + ('furni_prizetrophy4_name', 'Pokaali'), + ('nav_venue_sunset_cafe/0_desc', 'Come and chat about Official Fansites and meet their staff!'), + ('furni_pura_mdl4*9_desc', 'Any way you like it!'), + ('furni_pillar*8_name', 'Roman Pillar'), + ('nav_venue_sport/0_desc', 'St Trinian\'s is out on DVD April 14th!'), + ('furni_pillar*7_name', 'Atlantean Pillar'), + ('club_extend_text', 'If you\'re subscribing again to Habbo Club, you won\'t lose any of the advantages or ongoing furni gifts. Club membership can be extended in advance.\\rRemember: one club month lasts 31 days.'), + ('sound_machine_confirm_eject', 'Remove cartridge?'), + ('shopping_got', 'You have xx in your Purse.'), + ('furni_rare_stand_desc', 'Stand and Deliver!'), + ('furni_chair_plasto_desc', 'Hip plastic furniture'), + ('furni_bed_polyfon_one*9_desc', 'Cot of the artistic'), + ('furni_couch_norja*9_name', 'Red Bench'), + ('poster_3_desc', 'Smells fishy, looks cool'), + ('paalu.winner', 'Winner:'), + ('NUF_meeting_people_room_wave', 'These buttons let you wave and dance. Click on your Habbo at anytime to see these buttons.'), + ('sound_machine_confirm_window', 'Sound Machine'), + ('furni_one_way_door*3_name', 'White HC Gate'), + ('furni_chair_plasty*9_name', 'Plastic Pod Chair'), + ('gs_timeleft', 'Time Left \\x'), + ('hobba_pickup', 'Pick Up'), + ('console_lastvisit', 'Last Visit'), + ('furni_rare_globe_desc', 'It\'s all white..'), + ('furni_val_cauldron_name', 'Valentine\'s Cauldron'), + ('poster_43_name', 'Chains'), + ('furni_bardesk_polyfon*8_desc', 'Yellow Mode Bardesk'), + ('furni_sound_set_36_name', 'Latin Love 1'), + ('dimmer_apply', 'Apply'), + ('furni_glass_chair*8_desc', 'Translucent beauty'), + ('furni_pura_mdl2*7_desc', 'Any way you like it!'), + ('furni_prizetrophy*3_desc', 'Breathtaking bronze'), + ('furni_marquee*1_name', 'Pink marquee'), + ('NUH_own_user', 'This is your Habbo. Click on the floor to move around.'), + ('furni_gothic_sofa*1_desc', 'The dark side of Habbo'), + ('furni_divider_nor5*3_name', 'White Iced Angle'), + ('furni_divider_nor4*5_name', 'Pink Iced Auto Shutter'), + ('furni_soft_sofa_norja*3_name', 'White Iced Sofa'), + ('furni_sofachair_silo*8_desc', 'Large, but worth it'), + ('furni_pura_mdl1*9_desc', 'Any way you like it!'), + ('furni_chair_plasto*7_name', 'Chair'), + ('furni_pura_mdl5*6_desc', 'Any way you like it!'), + ('emailpw', 'Send'), + ('sound_machine_playlist_window', 'Traxmachine Playlist Editor'), + ('furni_pura_mdl1*3_desc', 'Any way you like it!'), + ('furni_noob_table*5_desc', 'Lightweight, practical and pink'), + ('furni_scifirocket*6_name', 'Mercury Smoke Machine'), + ('furni_shelves_norja_name', 'Bookcase'), + ('poster_521_name', 'Flag of Brazil'), + ('sound_machine_jukebox_disk_window', 'Insert disc'), + ('furni_table_norja_med*6_desc', 'For larger gatherings'), + ('furni_pillow*6_name', 'Blue Cotton Pillow'), + ('furni_shelves_norja*3_desc', 'For nic naks and art deco books'), + ('queue_set.s.info', 'There are %d% Habbos in front of you in the queue to see the Habbo Live broadcast!'), + ('reg_parentemail_info', 'Because of your age, we need to let your parents know you are registering at Habbo Hotel. Please give the email address of one of your parents/guardians.'), + ('club_txt_paycash', 'Pay by Cash'), + ('furni_chair_plasto*11_name', 'Chair'), + ('furni_pizza_name', 'Pizza Box'), + ('furni_table_plasto_4leg*6_desc', 'Hip plastic furniture'), + ('furni_chair_silo*3_desc', 'Keep it simple'), + ('alert_reg_t', 'Please check these details:'), + ('nav_venue_theatredrome_name', 'Theatredrome'), + ('furni_hc_rntgn_desc', 'Believe it or not!'), + ('nav_venue_main_lobby_name', 'Main Lobby'), + ('furni_sound_set_64_desc', 'Make a little Jinn-gle!'), + ('nav_venue_sw_lobby_amateur_desc', 'Practice improves a Snow Stormer\'s aim... Ops, missed!'), + ('furni_scifiport*5_name', 'Security Fence'), + ('furni_lamp_basic_desc', 'Switch on the atmosphere with this sophisticated light'), + ('pet.saying.sniff.cat.0', 'snuh..snuh'), + ('poster_506_name', 'The flag of Finland'), + ('furni_bardeskcorner_polyfon*6_desc', 'Blue Mode Bardesk Corner'), + ('nav_venue_hotel_kitchen_name', 'Hotel Kitchen'), + ('furni_doorB_desc', 'Narnia this way!'), + ('poster_11_name', 'Certificate'), + ('furni_safe_silo_desc', 'Totally shatter-proof!'), + ('furni_bed_budget_one*3_desc', 'Prince sized comfort!'), + ('furni_romantique_divider*4_name', 'Ochre Screen'), + ('previous_onearrowed', '< Previous'), + ('nav_venue_bb_lobby_tournament_3_name', 'Competitie Battle Ball 4'), + ('furni_plant_sunflower_desc', 'For happy Habbos'), + ('furni_throne_desc', 'Important Habbos only'), + ('furni_exe_bardesk_name', 'Executive Bar Desk'), + ('furni_tree6_desc', 'The future\'s bright!'), + ('log_problem_title', 'Problems Connecting'), + ('furni_chair_basic*2_name', 'Pink Pura Egg Chair'), + ('game_chess_black', 'Black:'), + ('furni_glass_sofa*9_name', 'Glass sofa'), + ('furni_chair_norja*2_desc', 'Sleek and chic for each cheek'), + ('furni_pillar*3_desc', 'Ancient and stately'), + ('furni_scifidoor*8_desc', 'There out of this world!'), + ('alert_InvalidUserName', 'Don\'t use this character: \\x !'), + ('furni_rare_parasol*3_name', 'Violet Parasol'), + ('furni_bed_budget*5_desc', 'King sized comfort!'), + ('furni_chair_silo*8_name', 'Yellow Dining Chair'), + ('nav_tryingpw', 'Trying the password...'), + ('furni_cn_lamp_desc', 'Light of the East'), + ('furni_prizetrophy3*3_name', 'Globe trophy'), + ('furni_sound_set_16_desc', 'Ferry, ferry good!'), + ('furni_table_plasto_round*4_desc', 'Hip plastic furniture'), + ('poster_2007_desc', 'The legendary founder of the Hotel'), + ('sound_machine_insert', 'Add to mixer'), + ('furni_sound_machine*1_desc', 'Let the party begin!'), + ('furni_bed_polyfon_one*8_desc', 'Yellow Mode Single Bed'), + ('error_room_closed', 'Huone on suljettu.'), + ('pet.hotwords.play_dead', 'play dead'), + ('gs_button_go_finished', 'Scores'), + ('group_member', 'Member'), + ('sound_machine_confirm_save', 'Save the song?'), + ('furni_arabian_wndw_desc', 'Arabian days and nights'), + ('nav_venue_sw_lobby_expert_2_name', 'Snow Marksmen Lobby'), + ('furni_sound_set_57_desc', 'Feel the groove'), + ('furni_triplecandle_desc', 'No need to worry about wax drips'), + ('char_welcome', 'Welcome!'), + ('furni_sound_machine*6_desc', 'Add some effects to your room!'), + ('furni_sofachair_polyfon*3_desc', 'Loft-style comfort'), + ('nav_venue_bb_lobby_amateur_6/0_desc', ''), + ('group_logo_url_template', 'http://www.habbohotel.co.uk/habbo-imaging/badge-fill/%imagerdata%.gif'), + ('furni_table_plasto_bigsquare*2_desc', 'Hip plastic furniture'), + ('furni_glass_table*5_desc', 'Translucent beauty'), + ('url_purse_link', 'http://%predefined%//credits?'), + ('buddyremove_logintime', 'Last Login Time'), + ('NUF_meeting_people_hotelview_tutor', 'The Navigator lets you move between rooms in the Hotel, so open it up to get started!'), + ('furni_sofa_polyfon*6_name', 'Blue Mode Sofa'), + ('furni_scifirocket*1_desc', 'There is always space for this!'), + ('nav_venue_bb_lobby_amateur_10/0_desc', ''), + ('furni_prizetrophy5_name', 'Pokaali'), + ('purse_info_tickets', 'Gaming Tickets'), + ('poster_513_name', 'The Australian flag'), + ('furni_noob_chair*3_desc', 'Lightweight, practical, with red stripes'), + ('alert_old_client', 'You have an old version cached. Please empty your browser cache and login again.'), + ('furni_bar_basic_name', 'A Pura Minibar'), + ('furni_shelves_norja*8_desc', 'For nic naks and art deco books'), + ('sound_machine_save_window', 'Save your Trax'), + ('poster_51_name', 'Basketball Hoop'), + ('Alert_moderator_warning', ''), + ('furni_solarium_norja*5_name', 'Pink Solarium'), + ('furni_sporttrack2*1_desc', 'null'), + ('furni_rubberchair*7_desc', 'Soft and tearproof!'), + ('reg_parentemail_moreinfo', 'More information:'), + ('furni_present_gen5_desc', 'What\'s inside?'), + ('furni_bed_polyfon*9_desc', 'Give yourself space to stretch out'), + ('sound_machine_confirm_save_list_long', 'Are you sure you want to overwrite the current playlist?'), + ('cam_zoom_in.help', 'Zoom In'), + ('furni_carpet_soft*5_name', 'Soft Wool Rug'), + ('furni_plant_small_cactus_name', 'Small Cactus'), + ('console_creatingaprofile', 'Creating A Profile'), + ('console_select_all', 'Select all'), + ('hobba_reply_cfh', 'Reply to:'), + ('notickets_buygame', 'Buy a game'), + ('furni_sporttrack1*3_desc', 'null'), + ('furni_sleepingbag*1_desc', 'Ultimate coziness'), + ('furni_gothic_stool*4_name', 'Black Gothic Stool'), + ('nav_venue_bb_lobby_beginner_4/0_desc', ''), + ('nav_venue_netcafe/0_desc', 'Learn a foreign language and win Habbo Credits in our quests!'), + ('poster_31_desc', 'Pure and unbridled nu-metal'), + ('furni_sound_set_24_desc', 'It\'s all about the Pentiums, baby!'), + ('pet.saying.angry.dog.3', 'dog.1=Oouh..oouh..snuh..ooo'), + ('furni_bed_budget_one*8_desc', 'Prince sized comfort!'), + ('pet.saying.angry.dog.4', 'ARRR Grrr.. woof woof woof'), + ('pet.saying.angry.dog.1', 'Woof! Grrrr..woof woof'), + ('furni_sw_table_desc', ''), + ('pet.saying.angry.dog.2', 'grRRRRrr.r...r'), + ('pet.saying.angry.dog.0', 'Rrrr..woof.. Rrr'), + ('furni_chair_china_name', 'Chinese Lacquer Chair'), + ('furni_romantique_divan*2_desc', 'Recline in continental comfort'), + ('furni_divider_silo1*6_desc', 'Blue Area Corner Shelf'), + ('furni_sound_set_5_name', 'Ambient 4'), + ('roomevent_browser_create', 'Host an event'), + ('furni_noob_rug*6_desc', 'Nice and neat sisal rug with green edging'), + ('transaction_system_bank_luottokunta', 'Luottokortti'), + ('furni_bed_armas_one_name', 'Single Bed'), + ('furni_plant_fruittree_desc', 'Great yield and sweet fruit'), + ('furni_sound_machine_pro_desc', 'creating fancy sounds'), + ('nav_ownrooms_helptext', 'If you didn\'t know, these are your rooms. Here you can modify your rooms or create new ones if you feel like it.'), + ('furni_grunge_radiator_desc', 'Started cool but now it\'s hot!'), + ('furni_divider_silo3*7_desc', 'Green Area Gate'), + ('room_hold', 'Wait a second...\\rLoading room...'), + ('furni_sound_set_49_desc', 'You will belong'), + ('nav_venue_emperors/0_desc', 'Even the smallest of light... shines in the darkness'), + ('furni_nest_name', 'Basket'), + ('furni_noob_table*4_name', 'My first Habbo table'), + ('furni_sound_set_51_desc', 'Bop to the beat'), + ('furni_plant_maze_snow_desc', '20 x Snowy Maze Shrubbery'), + ('NUF_meeting_people_hotelview_icon', 'Click the Navigator button to start visiting the rooms!'), + ('furni_scifirocket*7_desc', 'Larger than life!'), + ('furni_table_plasto_round*9_name', 'Round Dining Table'), + ('furni_val_teddy*5_name', 'Yellow Share Bear'), + ('nav_venue_bb_lobby_expert_2_name', 'Experts Battle Ball 3'), + ('console_onfrontpage', 'Online'), + ('poster_1000_desc', 'The Noble and Silver Show'), + ('furni_rare_icecream*9_name', 'Bubblegum Ice Cream Machine'), + ('furni_rare_fan*0_name', 'Festive Fan'), + ('furni_carpet_polar_name', 'Faux-Fur Bear Rug'), + ('hobba_chatlog', 'See Chat Log >>'), + ('furni_romantique_chair*3_desc', 'null'), + ('hobba_pickedby', 'Picked Up By:'), + ('poster_24_desc', 'Trying to get in or out?'), + ('furni_table_silo_small*2_desc', 'For those random moments'), + ('furni_table_plasto_bigsquare*15_name', 'Occasional Table'), + ('furni_prizetrophy7*2_desc', 'Silver Habbo trophy'), + ('ph_keys_run', 'Run:'), + ('error_title', 'Oops, error!'), + ('furni_rare_dragonlamp*0_name', 'Fire Dragon Lamp'), + ('furni_CFC_50_coin_silver_name', 'Silver Coin (China)'), + ('furni_chair_plasty_name', 'Plastic Pod Chair'), + ('nav_roomInfo', 'Room info'), + ('furni_sound_set_63_name', 'Alhambra Trax 2'), + ('furni_divider_nor2*9_desc', 'Red Iced bar desk'), + ('furni_soft_sofa_norja*8_name', 'Yellow Iced Sofa'), + ('poster_57_desc', 'chinese calligraphy'), + ('furni_table_plasto_4leg*16_name', 'Occasional Table'), + ('accept', 'Accept'), + ('pet.saying.beg.cat.2', 'MEOW, MEOW, MEOW..'), + ('furni_waterbowl*3_desc', 'Aqua unlimited'), + ('furni_divider_poly3*2_name', 'Black Mode Bardesk Gate'), + ('furni_divider_nor3_desc', 'Do go through...'), + ('furni_table_plasto_square*5_desc', 'Hip plastic furniture'), + ('furni_rubberchair*1_desc', 'Soft and stylish HC chair'), + ('furni_divider_nor5*8_name', 'Yellow Iced Angle'), + ('furni_pura_mdl4*3_desc', 'Any way you like it!'), + ('nav_removerights_desc', 'Remove all rights to this room from other users.'), + ('furni_chair_norja*7_name', 'Rural Chair'), + ('furni_pillar*2_name', 'Nordic Pillar'), + ('furni_bed_polyfon*3_name', 'White Double Bed'), + ('furni_glass_chair*3_desc', 'Translucent beauty'), + ('wallitem_xmas_light_name', 'Xmas light'), + ('pet.saying.beg.cat.0', 'MaUUU...MEOW...meow'), + ('pet.saying.beg.cat.1', '*looks up with sad eyes*'), + ('reg_verification_newEmail', 'Your new email address:'), + ('furni_sound_set_29_desc', 'Electronic house'), + ('furni_joulutahti_desc', 'Christmas in a pot'), + ('furni_china_table_name', 'Chinese Lacquer Table'), + ('poster_507_desc', 'The French flag'), + ('NUF_visiting_rooms_hotelview_nav', 'Click the icon to open the Navigator.'), + ('dimmer_preset_1', 'Preset 1'), + ('nav_private_helptext', 'These are the rooms owned by Habbos. Select a category first and then browse some rooms and meet some people!'), + ('furni_queue_tile1*8_desc', 'The power of movement'), + ('dimmer_preset_2', 'Preset 2'), + ('furni_arabian_pllw_name', 'Green Blossom Pillow'), + ('nav_venue_bb_lobby_tournament_7/0_desc', ''), + ('furni_goodie1*1_desc', 'Crunchy Dog Treat'), + ('poster_36_name', 'The Habbo Babes 2'), + ('poll_window', 'Question'), + ('furni_md_limukaappi_desc', 'A sparkling and refreshing pixel drink!'), + ('nav_venue_rooftop_rumble_ii_name', 'Rooftop Rumble II'), + ('furni_wooden_screen*7_name', 'Purple Oriental Screen'), + ('furni_scifidoor*2_name', 'Yellow Spaceship Door'), + ('room_max_pet_limit', 'Too many pets in the room!'), + ('hobba_sent_to_helpers', 'Call re-assigned as emergency and sent to moderators'), + ('furni_table_silo_med*4_desc', 'Beige Area Coffee Table'), + ('furni_romantique_pianochair*5_name', 'Onyx Piano Stool'), + ('nav_modify_roomdescription', 'Room Description'), + ('furni_sound_set_10_name', 'Hip Hop Beats 1'), + ('furni_chair_silo*2_name', 'Black Dining Chair'), + ('furni_marquee*6_name', 'Blue Marquee'), + ('poster_8_name', 'Habbo Colours'), + ('transaction_system_htk_singledrop', 'Landline'), + ('furni_chair_plasty*4_desc', 'Hip plastic furniture'), + ('dimmer_preset_3', 'Preset 3'), + ('furni_exe_corner_desc', 'Tuck it away'), + ('nav_venue_welcome_lounge/0_desc', 'New? Lost? Get a warm welcome here from Habbo eXperts.'), + ('furni_sleepingbag*6_desc', 'Ultimate coziness'), + ('nav_venue_cunning_fox_gamehall/3_name', 'Batleships'), + ('console_mainhelp', 'Habbo Console Help'), + ('tickets_button_info_hide', 'Hide Ticket Info'), + ('furni_xmas_icelamp_name', 'Lantern Bundle 2'), + ('nav_venue_bb_lobby_amateur_0/0_desc', ''), + ('purse_header', 'Habbo Purse'), + ('furni_noob_lamp*3_name', 'My first Habbo lamp'), + ('nav_help_title', 'Want a room of your own?'), + ('buy', 'Buy'), + ('furni_pura_mdl1*8_name', 'yellow pura module 1'), + ('dimmer_title', 'Mood Light'), + ('NUF_mini_meet_people_hotelview_icon', 'Click the Navigator button to start visiting the rooms!'), + ('console_credits', 'Credits'), + ('bb_link_highScores_url', 'http://%predefined%/groups/56552/id'), + ('wallitem_md_logo_wall_desc', 'Bubble up your wall'), + ('furni_safe_silo*4_desc', 'Totally shatter-proof!'), + ('room_unignore', 'Listen'), + ('nav_venue_sw_lobby_amateur_1/0_desc', ''), + ('poster_16_name', 'Bars'), + ('furni_sofachair_silo*7_name', 'Green Area Armchair'), + ('furni_spyro_name', 'Dragon Egg'), + ('nav_venue_bb_lobby_beginner_19/0_desc', ''), + ('Alert_YourPasswordIsTooShort', 'Passwords must be at least 6 characters long.'), + ('room_cant_trade', 'You cannot trade this!'), + ('furni_door_desc', 'Dr Who?'), + ('gs_button_go_created', 'Join'), + ('poster_49_name', 'Large silver star'), + ('furni_glass_sofa*4_name', 'Glass sofa'), + ('furni_divider_arm3_desc', 'Knock, knock...'), + ('furni_sound_set_31_desc', 'House loops'), + ('reg_habboname', 'Habbo name:'), + ('habboclub_thanks', 'Yippee! You are now a member of Habbo Club! Your current email address is %email%. \\r\\rIf that\'s not the one you are using, please go to \'Update my Habbo ID\' and change it now. \\rThen we can contact you about your membership if need be.'), + ('console_follow_offline', 'Your friend is offline.'), + ('furni_divider_nor1*5_name', 'Pink Ice corner'), + ('nav_openbutton', 'Open'), + ('nav_venue_theatredrome_habbowood/0_desc', 'Home to the Habbowood Gala and HAFTA Awards!'), + ('nav_venue_ice_cafe/0_desc', 'Come here. And chill out.'), + ('furni_calippo_name', 'Calippo icecream machine'), + ('furni_bench_lego_desc', 'For your reserve players'), + ('poster_9_desc', 'Do your bit for the environment'), + ('furni_bed_polyfon_one*3_desc', 'Cot of the artistic'), + ('poster_44_desc', 'Beware the curse...'), + ('poster_2006_name', 'DJ Throne'), + ('furni_pura_mdl3*5_desc', ''), + ('furni_arabian_tray4_name', 'Fruit Tray'), + ('furni_divider_nor3*7_desc', 'Entrance or exit?'), + ('furni_sound_set_30_name', 'Instrumental 1'), + ('furni_romantique_tray1_name', 'Breakfast Tray'), + ('furni_jp_tray1_desc', 'jp_tray1'), + ('furni_plant_maze_desc', 'Build your maze!'), + ('console_getfriendrequest_2', 'If you accept this invitation (s)he will be added to your Friends List. Then you can send messages to each other.'), + ('furni_hockey_light_name', 'Lert'), + ('furni_goodie1_desc', 'Crunchy Dog Treat'), + ('console_getfriendrequest_1', 'has asked you to become his/her Friend.'), + ('furni_pura_mdl2*1_desc', 'Any way you like it!'), + ('score_board.text', 'POINTS'), + ('furni_one_way_door*9_name', 'Red One Way Gate'), + ('furni_sand_cstl_twr_desc', 'sand_cstl_twr desc'), + ('furni_divider_nor5*9_desc', 'Cool cornering for your crib y0!'), + ('furni_duck_desc', 'Every bather needs one'), + ('furni_bardesk_polyfon*2_desc', 'Black Mode Bardesk'), + ('console_request_2', '(S)he will be added into your Friends List if (s)he accepts it.'), + ('bb_link_join', 'Join Team'), + ('nav_createroom_hd', 'Here you can create your own room!'), + ('console_request_1', 'has been sent your Friend Request.'), + ('reg_check_info', 'CHECK YOUR INFO'), + ('furni_toy1*4_name', 'Rubber Ball'), + ('nav_venue_sw_lobby_free_0_name', 'Free Game Lobby'), + ('furni_chair_plasto*1_name', 'Chair'), + ('furni_toilet_name', 'Loo Seat'), + ('queue_set.dc.info', 'Number of Habbos in default queue is %d% and in Habbo Club queue %c%'), + ('furni_sofachair_silo*2_desc', 'Large, but worth it'), + ('furni_chair_plasto*12_desc', 'Hip plastic furniture'), + ('ph_tickets_buyfor', 'Buy Tickets for:'), + ('sound_machine_confirm_close', 'Close the editor?'), + ('furni_rare_fan*1_desc', 'It\'ll blow you away!'), + ('furni_divider_poly3*3_desc', 'Border control!'), + ('nav_venue_kattoterassi/0_desc', 'When push comes to shove...'), + ('furni_summer_grill*4_desc', 'Plenty of burgers on that barbie'), + ('furni_bar_armas_desc', 'It\'s a barrel of laughs and a great talking point'), + ('furni_toilet_red_name', 'Loo Seat'), + ('furni_hc_lmp_desc', 'Be enlightened'), + ('furni_romantique_mirrortabl_name', 'Dressing Table'), + ('furni_pura_mdl4*2_name', 'Pink Pura Module 4'), + ('summer_chair_5_desc', 'Enjoy the summer air'), + ('furni_plant_rose_desc', 'Sleek and chic'), + ('furni_skullcandle_name', 'Skull Candle Holder'), + ('Alert_no_credits', 'You don�t have enough Credits for this.'), + ('pet.hotwords.voice', 'speak'), + ('furni_prizetrophy4*2_desc', 'Shiny silver'), + ('furni_soft_sofachair_norja*4_name', 'Urban Iced Sofachair'), + ('furni_pura_mdl5*1_desc', 'Any way you like it!'), + ('furni_safe_silo*9_name', 'Red Safe Minibar'), + ('furni_bed_trad_desc', 'Sweet dreams for two'), + ('nav_venue_club_massiva_desc', 'Strut your funky stuff!'), + ('furni_rare_dragonlamp*1_desc', 'Out of the deep blue!'), + ('furni_wooden_screen*2_desc', 'Add an exotic touch to your room'), + ('furni_prizetrophy7*1_name', 'Gold Habbo trophy'), + ('furni_carpet_standard*2_name', 'Floor Rug'), + ('furni_arabian_teamk_desc', 'Quench that desert thirst'), + ('furni_romantique_chair*2_name', 'Lime Romantique Chair'), + ('nav_venue_sw_lobby_tournament_0_name', 'Tournament Lobby'), + ('invitation_expired', 'Sorry, all Welcoming Party members were busy.'), + ('gs_error_game_checkname', 'Please check the Game\'s name!'), + ('furni_sound_set_23_name', 'SFX 4'), + ('furni_grand_piano*2_desc', 'Black Grand Piano'), + ('tutorial_quit', 'Close guide'), + ('furni_chair_basic*8_desc', ''), + ('NUF_getting_room_roommatic_security_tutor', 'Finally you can choose the security settings to your room and whether other users can move your furniture.'), + ('nav_venue_bb_lobby_beginner_1/0_desc', ''), + ('nav_private_helptext_hd_main', 'Habbo Guest Rooms'), + ('club_price', 'One month costs 25 Habbo Credits.'), + ('NUF_playing_games_navigator_tutor', 'Click either SnowStorm or BattleBall to open up a list of the game lounges.'), + ('nav_venue_old_skool_name', 'Old Skool Habbo'), + ('nav_venue_bb_lobby_beginner_4_name', 'Beginners Battle Ball 5'), + ('nav_venue_bb_lobby_tournament_9_name', 'Competitie Battle Ball 10'), + ('sound_machine_alert_song_saved', 'Song "%name%" successfully saved.'), + ('nav_venue_sw_lobby_intermediate_3_name', 'Snow Bombardiers Lobby'), + ('nav_venue_club_massiva/1_desc', 'Strut your funky stuff'), + ('furni_gothic_chair*1_name', 'Gothic Chair Pink'), + ('furni_divider_poly3_desc', 'All bars should have one'), + ('furni_romantique_divan*1_name', 'Pink Romantique Divan'), + ('NUF_playing_games_hotelview_tutor', 'Now we find out where to locate the Habbo Games!'), + ('poster_29_name', 'Gold Tinsel Bundle'), + ('furni_present_gen4_name', 'Gift'), + ('furni_bardesk_polyfon*7_name', 'Green Mode Bardesk'), + ('furni_gothic_sofa*6_name', 'Gothic Sofa Blue'), + ('furni_glass_stool*5_name', 'Glass stool'), + ('nav_venue_sw_lobby_free_5/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('nav_fav_hd', 'Your Favourite Rooms.'), + ('NUF_console_read_tutor', 'The Habbo Console lets you message your Habbo friends, and check whether they are online.'), + ('furni_romantique_tray2_desc', 'Spoil Yourself'), + ('Alert_ModeratorWarning', 'Message from a Moderator:'), + ('furni_giftflowers_name', 'Vase of Flowers'), + ('furni_table_silo_small*7_name', 'Green Area Occasional Table'), + ('furni_menorah_name', 'Menorah'), + ('furni_bed_polyfon_one*2_name', 'Black Mode Single Bed'), + ('console_offline', 'Offline'), + ('gs_mouseover_player', '\\x\\r\\yp'), + ('nav_venue_bb_lobby_amateur_3/0_desc', ''), + ('nav_venue_bb_lobby_amateur_13/0_desc', ''), + ('furni_noob_chair*2_name', 'My first Habbo chair'), + ('furni_doormat_plain*1_desc', 'Available in a variety of colours'), + ('object_displayer_hide_tags', 'Hide tags'), + ('poster_17_desc', 'Beautiful reproduction butterfly'), + ('gs_joinedplayers', 'Players Who Joined: \\x'), + ('furni_table_plasto_round*3_name', 'Round Dining Table'), + ('furni_divider_poly3*8_name', 'Yellow Mode Bardesk Gate'), + ('furni_glass_table*4_name', 'Glass table'), + ('furni_solarium_norja*6_desc', 'Rejuvenate your pixels!'), + ('poster_1006_desc', 'The eyes follow you...'), + ('furni_noob_rug*5_name', 'My first Habbo rug'), + ('buddyremove_pagecounter', 'Page'), + ('poll_alert_answer_missing', 'Please give an answer'), + ('furni_summer_chair*5_desc', 'Beige'), + ('furni_table_plasto_4leg*10_name', 'Occasional Table'), + ('furni_divider_silo2_desc', 'Stylish sectioning'), + ('furni_djesko_turntable_desc', 'For the music-lovers'), + ('nav_remrightsconf', 'You are about to remove all rights from your room. This means that only you will have rights to move and place furni in the room.'), + ('furni_pillow*0_name', 'White Lace Pillow'), + ('sound_machine_eject', 'Eject'), + ('gs_button_ready', 'Ready'), + ('furni_divider_silo1*5_name', 'Pink Area Corner Shelf'), + ('NUF_habbo_home_hotelview_tutor', 'You have now opened a page on the Habbo Website that will give you plenty of information about how to make yourself a Habbo Home.'), + ('furni_traffic_light*4_desc', 'Chill and wait your turn!'), + ('nav_venue_$unit.name$/0_desc', 'Roam more of the hotel\'s corridors'), + ('furni_sporttrack1*2_name', 'Sport track straight asphalt'), + ('furni_sofachair_polyfon_girl_name', 'Armchair'), + ('furni_sound_set_6_desc', 'Background ambience loops'), + ('furni_hal_grave_desc', 'We\'re raising the dead!'), + ('recycler_ready_info', 'Your recycled Furniture is ready. Please either accept or cancel. If you accept, you will receive your recycling reward, detailed below. If you cancel, all your old Furniture will be restored to your hand.'), + ('wallitem_jp_sheet1_name', 'jp_sheet1'), + ('furni_petfood2_name', 'Sardines Mega Multipack'), + ('furni_spotlight_name', 'Habbowood Spotlight'), + ('furni_carpet_soft*6_desc', 'Soft Wool Rug'), + ('gs_lounge_skill', 'Level in this Lounge: \\x \\r (\\y-\\z points)'), + ('nav_help_text', 'Click the Public Spaces tab on the top left of this navigator to find gaming rooms!'), + ('furni_table_plasto_4leg*5_name', 'Occasional Table'), + ('nav_venue_bb_arena_1_name', 'Battle Ball Aloittelijat'), + ('furni_table_silo_med*9_name', 'Red Area Coffee Table'), + ('furni_bed_budget_one*2_name', 'Pink Pura Bed'), + ('nav_venue_sw_lobby_expert_2/0_desc', 'Todellisille lumisotureille.'), + ('furni_rubberchair*6_name', 'Violet Inflatable Chair'), + ('furni_bardeskcorner_polyfon*5_name', 'Candy Corner'), + ('bb_powerup_8', 'Vacuum cleaner'), + ('bb_powerup_6', 'Harlequin'), + ('furni_rare_beehive_bulb*2_name', 'Yellow Amber Lamp'), + ('bb_powerup_7', 'Bomb'), + ('furni_divider_nor2_name', 'Ice Bar-Desk'), + ('bb_powerup_4', 'Cannon'), + ('bb_powerup_5', 'Box of pins'), + ('bb_powerup_2', 'Spring'), + ('bb_powerup_3', 'Flashlight'), + ('console_report', 'Report'), + ('bb_powerup_1', 'Light bulb'), + ('furni_sound_set_43_name', 'SFX 1'), + ('poster_37_desc', 'The Hotels girlband. Dream on!'), + ('interface_icon_messenger', 'Messenger, friends & messages on here'), + ('interface_icon_hand', 'Hand, your inventory'), + ('furni_s_sound_machine*4_name', 'Sound Machine Blue'), + ('nav_venue_sunset_cafe_name', 'Sunset Cafe'), + ('wallitem_sw_stone_desc', 'sw_stone'), + ('reg_check_mail', 'Email'), + ('furni_queue_tile1*7_name', 'Purple Habbo Roller'), + ('pet.hotwords.nest', 'sleep'), + ('furni_sound_machine_desc', 'Creating fancy sounds'), + ('cancel', 'Cancel'), + ('furni_hyacinth2_desc', 'Beautiful bulb'), + ('nav_venue_library/0_name', 'Habbo Library'), + ('furni_waterbowl*1_desc', 'Aqua unlimited'), + ('furni_grand_piano*5_desc', 'Why is that key green?'), + ('furni_table_plasto_bigsquare*8_name', 'Square Dining Table'), + ('furni_nouvelle_trax_name', 'nouvelle_trax'), + ('help_choise_header', 'What do you need help with?'), + ('furni_bardeskcorner_polyfon*7_name', 'Green Mode Bardesk Corner'), + ('furni_pillar*4_name', 'Dark Ages Pillar'), + ('furni_queue_tile1*6_desc', 'The power of movement'), + ('club_intro_link', 'Learn more about Habbo Club!'), + ('furni_sandrug_desc', 'Your own paradise island'), + ('poster_10_desc', 'Beautiful sunset'), + ('furni_divider_nor1_name', 'Ice Corner'), + ('nav_venue_bb_lobby_tournament_6_name', 'Competitie Battle Ball 7'), + ('furni_redhologram_desc', 'You\'re her only hope...'), + ('poster_38_name', 'Smiling Headbangerz'), + ('furni_hc_crtn_name', 'Antique Drapery'), + ('furni_barchair_silo*9_name', 'Red Bar Stool'), + ('room_badge_visible', 'Visible'), + ('furni_sleepingbag*8_name', 'Golden Sleeping Bag'), + ('roomevent_invalid_input', 'You must give your event a name and a description.'), + ('furni_chair_plasto*14_name', 'HC chair'), + ('poster_522_desc', 'The flag of Japan'), + ('furni_shelves_norja*2_name', 'Black Bookcase'), + ('nav_venue_dusty_lounge_name', 'Dusty Lounge'), + ('furni_sound_set_53_desc', 'Break the icy silence'), + ('nav_venue_ice_cafe_name', 'Ice Cafe'), + ('click', 'OK to continue to the hotel.'), + ('nav_venue_sw_lobby_free_2/0_desc', ''), + ('furni_rare_dragonlamp*9_name', 'Purple Dragon Lamp'), + ('furni_statue_desc', 'Watch out for those arrows!'), + ('game_battles_turn', 'TURN'), + ('wallitem_jp_sheet3_desc', 'jp_sheet3'), + ('furni_edicehc_desc', 'Click and roll!'), + ('furni_bed_budget*6_name', 'Blue Pura Double Bed'), + ('furni_gothic_sofa*5_desc', 'The dark side of Habbo'), + ('furni_scifirocket*5_desc', 'From the unknown depths of space'), + ('game_poker_ready', 'READY'), + ('furni_queue_tile1*2_name', 'Red Habbo Roller'), + ('furni_rare_parasol_desc', 'Zon! Zon! Zon!'), + ('transaction_system_sms_dna', 'DNA'), + ('furni_bar_polyfon_name', 'Mini-Bar'), + ('furni_grand_piano*1_name', 'Turquoise Grand Piano'), + ('nav_venue_bb_lobby_expert_4_name', 'Experts Battle Ball 5'), + ('bb_link_highscores', 'Highscores'), + ('summer_chair_8_desc', 'The summer winds are creeping in'), + ('reg_parentemail_title2', 'Email address of parent/guardian:'), + ('error_report_explain', 'An error has occurred, please see the error code above.'), + ('console_noprofile', 'Habbo Profile Not Found'), + ('furni_glass_sofa*3_desc', 'Translucent beauty'), + ('furni_romantique_smalltabl*4_desc', 'Why is one leg different?'), + ('furni_table_plasto_4leg*14_name', 'HC table'), + ('nav_venue_bb_lobby_intermediate_2_name', 'Semi-profs Battle Ball 3'), + ('NUF_playing_games_gamerooms_tutor', 'Click the \'Go\' button to go to the Game Lounge.'), + ('habboclub_require_parent_permission', 'You need to tick the box to say that you are over 14 years or age, \\ror under 14 and have your parent/guardian\'s permission to join Habbo Club. \\rPlease go back and tick the box.'), + ('furni_wooden_screen*1_desc', 'Add an exotic touch to your room'), + ('nav_venue_bb_lobby_intermediate_4/0_desc', ''), + ('furni_glass_sofa*6_name', 'Blue Glass Sofa'), + ('furni_bench_armas_desc', 'To complete the dining set'), + ('furni_barchair_silo*2_name', 'Black Bar Stool'), + ('nav_venue_bb_lobby_expert_6/0_desc', ''), + ('furni_jp_tray2_desc', 'jp_tray2'), + ('furni_val_teddy*3_desc', 'The green bear of friendship'), + ('transaction_system_sms_win_vodafone', 'Vodafone SMS'), + ('furni_glass_sofa_name', 'Glass sofa'), + ('console_online', 'online:'), + ('poster_2004_desc', 'irie!'), + ('x', 'X'), + ('nav_venue_habbo_lido/0_desc', 'Pool is open for swimming and diving!'), + ('furni_soft_sofachair_norja_name', 'iced sofachair'), + ('furni_xmas_cstl_twr_name', 'Ice Castle Tower'), + ('nav_venue_park_name', 'Habbo Gardens'), + ('recycler_info_open', 'Ecotron is the place to visit if you want to recycle your old Furniture. Simply drag the old Furni from your hand to the empty slots below. Recyclable items display the green recyclable tag in your hand. Please note that you must own the Furniture for at least %quarantine_hours% hour before they can be recycled. Recycling takes a total of %total_hours% hours.'), + ('group_window_title', 'Habbo Groups'), + ('pet.saying.eat.dog.4', 'Mmmmm..'), + ('game_chess', 'Chess'), + ('pet.saying.eat.dog.2', 'slurp, slurp, slurp'), + ('roomatic_roomdesc', 'Room description:'), + ('furni_sofa_polyfon*7_desc', 'Green Mode Sofa'), + ('pet.saying.eat.dog.3', 'hrum, umm, umm grrr'), + ('pet.saying.eat.dog.0', 'hrum, hrum, crunch!'), + ('preview_downloading', 'Preview downloading...'), + ('sound_machine_confirm_close_long', 'Are you sure you want to leave the editor without saving the song?'), + ('partner_registration_title', 'Hey, I forgot to mention one thing..'), + ('pet.saying.eat.dog.1', 'crunch, crunch mmmm'), + ('nav_venue_bb_lobby_tournament_12/0_desc', ''), + ('furni_carpet_soft*3_name', 'Soft Wool Rug'), + ('furni_sound_set_56_name', 'RnB Grooves 2'), + ('reg_termslink', 'Terms and Conditions'), + ('wallitem_sw_swords_desc', 'Z for Zorro'), + ('furni_sleepingbag*10_name', 'Khaki Sleeping Bag'), + ('furni_hc_dsk_name', 'Study Desk'), + ('furni_chair_silo*8_desc', 'Keep it simple'), + ('furni_glass_chair*8_name', 'Glass chair'), + ('nav_venue_cafe_ole_name', 'Cafe ole'), + ('furni_sleepingbag*5_desc', 'Ultimate coziness'), + ('opening_hours_text_closed', 'The Hotel has been closed and will be open to the public again at %h%:%m%.'), + ('furni_grunge_bench_desc', 'Laid back seating'), + ('BuddyNotHere', 'Offline'), + ('furni_noob_lamp*5_desc', 'Get the light right where you want it (pink)'), + ('NUH_navigator', 'Use the Navigator to move around. There are literally thousands of rooms to explore!'), + ('poster_1338_name', 'Pedobear Seal of Approval'), + ('furni_queue_tile1*9_name', 'Green Habbo Roller'), + ('furni_habboween_crypt_desc', 'What lurks inside?'), + ('furni_sofachair_silo*9_name', 'Red Area Armchair'), + ('furni_exe_chair_name', 'Executive Sofa Chair'), + ('furni_rare_dragonlamp*6_desc', 'Scary and scorching!'), + ('furni_divider_nor2*3_desc', 'Strong, yet soft looking'), + ('furni_tile_yell_name', 'Floor Tiles'), + ('furni_plant_yukka_name', 'Yukka Plant'), + ('furni_wooden_screen*8_desc', 'Add an exotic touch to your room'), + ('furni_pillar*8_desc', 'All roads lead to Rome'), + ('trading_youoffer', 'You offer:'), + ('furni_marquee*8_desc', 'It\'s both door and a shade!'), + ('furni_pura_mdl4*9_name', 'Red Pura Module 4'), + ('roomatic_congrats', 'Congratulations! You\'re now the proud owner of your own Habbo Hotel room.'), + ('furni_tile_marble_name', 'Marble Tile'), + ('furni_bed_budget*3_desc', 'King sized comfort!'), + ('furni_sound_machine*3_desc', 'Top the Habbo Charts!'), + ('nav_venue_bb_lobby_beginner_10_name', 'Beginners Battle Ball 11'), + ('nav_venue_bb_lobby_tournament_1/0_desc', ''), + ('poster_2000_name', 'Suomen kartta'), + ('furni_solarium_norja*3_name', 'Urban Solarium'), + ('furni_present_gen3_desc', 'What\'s inside?'), + ('furni_glass_stool*4_desc', 'Translucent beauty'), + ('int_update_id', 'Update My Habbo ID >>'), + ('nav_venue_bb_lobby_beginner_8/0_desc', ''), + ('furni_carpet_standard*8_desc', 'Available in a variety of colours'), + ('furni_pillar*1_desc', 'Ancient and stately'), + ('receive_invitation_text', 'invites you his/her room. Accept invitation?'), + ('poll_offer_window', 'Welcome to our poll'), + ('furni_table_plasto_bigsquare*5_desc', 'Hip plastic furniture'), + ('furni_carpet_standard*1_desc', 'Available in a variety of colours'), + ('furni_hologram_name', 'Holopod'), + ('nav_venue_bb_lobby_amateur_desc', 'Amateur battle ball!'), + ('furni_barchair_silo*6_desc', 'Practical and convenient'), + ('furni_divider_nor5_desc', 'Cool cornering for your crib y0!'), + ('purse_vouchers_helpbutton', 'More about vouchers >>'), + ('furni_shelves_norja*6_desc', 'For nic naks and art deco books'), + ('nav_venue_sw_lobby_tournament_5/0_desc', ''), + ('furni_chair_basic*4_desc', 'It\'s a cracking design!'), + ('nav_hidefull', 'Hide Full Rooms'), + ('modtool_ban_computer', 'Ban Computer Also'), + ('furni_gothic_sofa*1_name', 'Gothic Sofa Pink'), + ('furni_carpet_standard*b_name', 'Floor Rug'), + ('queue_line', 'You are queueing right now...'), + ('furni_divider_nor1*6_desc', 'Blue Ice corner'), + ('nav_search_helptext', 'Looking for something? Here you can search other Habbo\'s rooms. Type the room name or the name of the Habbo to search for a room.'), + ('furni_marquee*1_desc', 'It\'s both door and a shade!'), + ('furni_rcandleset_desc', 'Simple but stylish'), + ('nav_room_banned', 'You are banned from this room.'), + ('furni_lamp_armas_name', 'Table Lamp'), + ('catalog_costs', '\\x1 costs \\x2 Credits'), + ('furni_drinks_desc', 'Are you a slob too?'), + ('furni_pura_mdl5*6_name', 'Blue Pura Module 5'), + ('summer_chair_1_desc', 'Gotta get up early to get one!'), + ('furni_prize3_desc', 'A weighty award'), + ('furni_soft_sofa_norja*7_name', 'Rural Iced Sofa'), + ('poster_518_name', 'The Welsh flag'), + ('furni_sofachair_polyfon*8_name', 'Yellow Mode Armchair'), + ('furni_prizetrophy3*3_desc', 'Breathtaking bronze'), + ('nav_venue_sw_lobby_amateur_6_name', 'Snow Slingers Lobby'), + ('furni_stand_polyfon_z_desc', 'Tidy up'), + ('furni_carpet_soft_tut_name', 'Welcome Mat'), + ('console_reject_all', 'Reject All'), + ('month12', 'December'), + ('month11', 'November'), + ('help_topics', 'Help Topics:'), + ('nav_venue_sw_lobby_beginner_8/0_desc', ''), + ('nav_rooms_own', 'Own Room(s)'), + ('reg_pwd_note', 'Choose a password that\'s hard to guess! So, don\'t use ANYONES name, or your favorite colour!'), + ('furni_wooden_screen*4_name', 'Golden Oriental Screen'), + ('nav_venue_sw_lobby_beginner_2/0_desc', ''), + ('furni_pillow*6_desc', 'Puffy, soft and huge'), + ('furni_bed_polyfon_one*4_desc', 'Beige Mode Single Bed'), + ('reg_email_note', 'Please enter your e-mail address, this is important! You\'ll only get customer support and special offers via email, if you enter a valid email address and verify it.'), + ('group_admin', 'Administrator'), + ('furni_scifirocket*8_name', 'Pluto Smoke Machine'), + ('furni_chair_plasto*11_desc', 'Hip plastic furniture'), + ('month10', 'October'), + ('furni_goth_table_name', 'Gothic table'), + ('month05', 'May'), + ('month04', 'April'), + ('nav_modify_maxvisitors', 'Choose maximum number of visitors'), + ('nav_venue_bb_lobby_amateur_2_name', 'Gevorderden Battle Ball 3'), + ('month07', 'July'), + ('habboclub_price1', '30'), + ('month06', 'June'), + ('month01', 'January'), + ('month03', 'March'), + ('month02', 'February'), + ('furni_summer_chair*2_desc', 'Pink'), + ('month09', 'September'), + ('month08', 'August'), + ('furni_bardeskcorner_polyfon*4_desc', 'Beige Mode Bardesk Corner'), + ('furni_tree6_name', 'Flashy Christmas Tree'), + ('furni_arabian_snake_name', 'Ornamental Urn'), + ('reg_verification_incorrectPassword', 'Your password was incorrect'), + ('NUF_visting_rooms_hotelview_tutor', 'Here we go again. This time we are learning how to visit another Habbos room.'), + ('furni_summer_chair*9_desc', 'Got your sunglasses?'), + ('furni_safe_silo_name', 'Safe Minibar'), + ('furni_throne_name', 'Throne'), + ('furni_soft_sofachair_norja*8_desc', 'Yellow Iced Sofachair'), + ('NUF_console_ready_tutor', 'You can now use the Console to find some of your friends, or you can continue the tutorial.'), + ('nav_venue_picnic/0_desc', 'Don\'t forget to grab a carrot or two!'), + ('furni_bardeskcorner_polyfon_name', 'Corner Cabinet/Desk'), + ('game_placeship', 'Place your ships:'), + ('furni_glass_table*7_desc', 'Habbo Club'), + ('poster_13_name', 'BW Skyline Poster'), + ('furni_jp_bamboo_name', 'Bamboo Forest'), + ('furni_plant_bulrush_name', 'Bulrush'), + ('furni_deadduck3_desc', 'With added ectoplasm'), + ('win_purse', 'Habbo Purse'), + ('furni_jp_tray5_name', 'jp_tray5'), + ('furni_hc_tbl_desc', 'Perfect for banquets'), + ('furni_shelves_norja_desc', 'For nic naks and art deco books'), + ('club_desc_3_period', '6 Months (186 days) = 105 Credits'), + ('furni_bed_budget_one*3_name', 'Black Pura Bed'), + ('poster_2_name', 'Carrot Plaque'), + ('furni_solarium_norja*7_desc', 'Fun in the sun!'), + ('poster_2007_name', 'The Father Of Habbo'), + ('gs_header_teams', 'Teams'), + ('furni_divider_poly3*9_desc', 'Border Control!'), + ('gs_button_creategame', 'Create A New Game'), + ('furni_sound_set_42_name', 'Haunted Mansion'), + ('poll_alert_invalid_selection', 'Please select fewer alternatives'), + ('furni_scifirocket*1_name', 'Saturn Smoke Machine'), + ('furni_scifidoor*10_name', 'Violet Spaceship Door'), + ('furni_sound_set_5_desc', 'The dark side of Habbo'), + ('club_confirm_gift_title', 'You have received a Habbo club gift!'), + ('bb_info_gamePrice', 'Play now for just 2 tickets.'), + ('furni_sound_machine*6_name', 'Purple Traxmachine'), + ('wallitem_arabian_swords_desc', 'Not for yielding'), + ('furni_divider_nor2*6_name', 'Blue Iced bar desk'), + ('nav_venue_sw_lobby_expert_0/0_desc', ''), + ('furni_noob_chair*1_name', 'My first Habbo chair'), + ('group_room_link', 'Group\'s room: %room_name% >>>'), + ('sound_machine_playlist', 'Playlist'), + ('nav_venue_bb_arena_2_name', 'Battle Ball Amatöörit'), + ('roomatic_create_error', 'Error in room creation process. Please try again!'), + ('furni_couch_norja*7_desc', 'Two can perch comfortably'), + ('gs_button_spectate', 'Watch Game!'), + ('furni_sofachair_silo*6_desc', 'Blue Area Armchair'), + ('credit_redeem_button', 'Redeem'), + ('furni_valentinescreen_desc', 'Peep through and smile!'), + ('poster_511_name', 'The Dutch flag'), + ('furni_shelves_armas_name', 'Bookcase'), + ('nav_venue_habbo_lido_name', 'Habbo Lido'), + ('furni_bed_polyfon*9_name', 'Red Double Bed'), + ('furni_sofa_silo*9_name', 'Red Area Sofa'), + ('furni_pura_mdl4*6_desc', 'Any way you like it!'), + ('console_mainhelptext', 'You can use the Habbo Console to keep in constant contact with your friends using instant messages.'), + ('wallitem_jp_ninjastars_name', 'Ninja Stars'), + ('ad_note', 'Clicking this advertisement will open a new window'), + ('ph_tickets_choise2', 'Buy 20 Tickets for 6 Credits.'), + ('ph_tickets_choise1', 'Buy 2 Tickets for 1 Credit.'), + ('reg_day', 'Day'), + ('nav_venue_cunning_fox_gamehall/2_name', 'Noughts&Crosses'), + ('nav_venue_sw_lobby_tournament_6_name', 'Tournament Lobby'), + ('furni_noob_lamp*1_name', 'My first Habbo lamp'), + ('furni_petfood1_name', 'Bones Mega Multipack'), + ('furni_table_silo_med*3_name', 'White Coffee Table'), + ('pet.hotwords.jump', 'jump'), + ('furni_sleepingbag*1_name', 'Red Sleeping Bag'), + ('nav_venue_main_lobby/0_desc', 'The heart of Habbo Hotel'), + ('pet_hungry', 'Hunger:'), + ('furni_rare_fan*4_name', 'SUPERLOVE Fan'), + ('furni_sw_table_name', 'sw_table'), + ('furni_CFC_200_moneybag_name', 'Sack of Credits (China)'), + ('room_ask_friend', 'Ask to be a Friend'), + ('furni_bed_polyfon*2_name', 'Black Mode Double Bed'), + ('furni_table_norja_med_desc', 'Elegance embodied'), + ('nav_removerights', 'Reset'), + ('wallitem_hrella_poster_1_name', 'Porthole'), + ('NUF_getting_items_purse_', 'Click this link to open the Habbo Credits page in the website window.'), + ('poster_31_name', 'System of a Ban'), + ('furni_sound_set_24_name', 'Habbo Sounds 4'), + ('furni_chair_basic*7_name', 'chair_basic'), + ('poster_56_name', 'Disco Sign'), + ('furni_rare_dragonlamp*2_name', 'Jade Dragon Lamp'), + ('furni_gothic_stool*4_desc', 'Witches and Warlocks'), + ('furni_sofa_silo*2_name', 'Black Two-Seater Sofa'), + ('furni_grunge_radiator_name', 'Radiator'), + ('nav_venue_bb_lobby_amateur_9_name', 'Gevorderden Battle Ball 10'), + ('summer_chair_4_name', 'White Deck Chair'), + ('furni_sound_set_49_name', 'Club 4'), + ('messenger.email.subject', ''), + ('furni_romantique_chair*3_name', 'Turquoise Romantique Chair'), + ('furni_s_sound_machine*7_desc', 'Sound Machine Red'), + ('furni_table_plasto_round*9_desc', 'Hip plastic furniture'), + ('furni_table_plasto_4leg*7_name', 'Occasional table'), + ('club_confirm_title', 'You are about to subscribe to Habbo Club. Wise choice!'), + ('furni_romantique_pianochair*1_desc', 'Here sat the legend of 1900'), + ('furni_sofa_silo*6_desc', 'Blue Area Sofa'), + ('nav_venue_bb_lobby_tournament_11_name', 'Competitie Battle Ball 12'), + ('furni_rare_icecream*9_desc', 'Virtual bubblegum rocks!'), + ('furni_romantique_divider*1_name', 'Rose Quartz Screen'), + ('NUF_playing_games_room_ruleslink', 'Click me! But only if you want to read the game FAQs in the website.'), + ('furni_chair_silo_name', 'Dining Chair'), + ('furni_sound_set_17_desc', 'Jive\'s Alive!'), + ('dance_choose', 'Choose Dance'), + ('wallitem_industrialfan_name', 'Industrial Turbine'), + ('sound_machine_alert_invalid_song_length', 'Can\'t burn an empty song!'), + ('furni_pura_mdl1*4_desc', 'Any way you like it!'), + ('wallitem_post.it.vd_desc', 'Heart Stickies'), + ('catalog_give_petname', 'Type your pet\'s name in the grey box.'), + ('furni_pura_mdl2*1_name', 'Aqua Pura Module 2'), + ('poster_24_name', 'Hole In The Wall'), + ('win_error', 'Notice!'), + ('furni_chair_plasto*2_desc', 'Hip plastic furniture'), + ('wallitem_xmas_light_desc', 'Xmas light'), + ('furni_rubberchair*1_name', 'Blue Inflatable Chair'), + ('NUF_getting_room_roommatic_details_tutor', 'Give a name to your room, choose a category and add a description. Don\'t worry, you can change it all later.'), + ('furni_divider_poly3*2_desc', 'Black Mode Bardesk Gate'), + ('furni_plant_valentinerose*2_desc', 'Your secret love'), + ('furni_table_norja_med*7_desc', 'For larger gatherings'), + ('furni_carpet_polar_desc', 'For cuddling up on'), + ('nav_venue_sw_lobby_free_8/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('furni_summer_grill*1_name', 'Blue Barbeque Grill'), + ('furni_chair_norja*7_desc', 'Sleek and chic for each cheek'), + ('furni_joulutahti_name', 'Poinsetta'), + ('furni_exe_table_name', 'Executive Desk'), + ('furni_divider_silo3*8_desc', 'Form following function'), + ('furni_gothiccandelabra_name', 'Gothic Candelabra'), + ('transaction_system_bibit', 'Credit card'), + ('nav_venue_tv_studio/0_desc', 'Sponsored by Bobbanet.com'), + ('furni_noob_table*4_desc', 'Lightweight, practical and light blue'), + ('furni_bardesk_polyfon*3_desc', 'Perfect for work or play'), + ('room_info_rated', 'Room rating:'), + ('nav_venue_bb_lobby_beginner_2/0_desc', ''), + ('help_emergency_explanation', 'If you are experiencing a situation which is making you feel uncomfortable or unsafe, please give details below and a member of community staff will reply as soon as possible.'), + ('furni_divider_nor5*8_desc', 'Cool cornering for your crib y0!'), + ('poster_507_name', 'The French Tricolore'), + ('nav_privateRooms', 'Rooms'), + ('furni_pura_mdl2*5_desc', ''), + ('furni_sporttrack3*3_name', 'Sport goal grass'), + ('furni_sound_set_10_desc', 'Made from real Boy Bands!'), + ('furni_chair_plasto*9_desc', 'Hip plastic furniture'), + ('furni_soft_sofa_norja*4_desc', 'Sit back and relax'), + ('furni_s_sound_machine*3_name', 'Sound Machine Green'), + ('reg_spam', 'Yes, I want to get the occasional email from the Hotel Manager.'), + ('shout', 'Shout'), + ('NUF_mini_use_console_read_link', 'Click here to view the message.'), + ('furni_scifidoor*2_desc', 'There out of this world!'), + ('furni_divider_nor3*3_name', 'White Iced Gate'), + ('pet_hung_0', 'Empty'), + ('furni_table_plasto_square*1_name', 'Occasional Table'), + ('pet_hung_6', 'Stuffed'), + ('pet_hung_5', 'Full'), + ('bb_user_skill', 'Skill Level: \\x\\rScore: \\y'), + ('login_welcome', 'Welcome'), + ('pet_hung_2', 'Rumbling'), + ('pet_hung_1', 'Hungry'), + ('poster_20_name', 'Bars'), + ('pet_hung_4', 'Satisfied'), + ('pet_hung_3', 'Peckish'), + ('Alert_WrongNameOrPassword', 'Wrong name or password - please try again!'), + ('furni_romantique_pianochair*5_desc', 'I can feel air coming through...'), + ('furni_carpet_armas_desc', 'Adds instant warmth'), + ('console_removefriend_2', 'from your Friends List?'), + ('console_removefriend_1', 'Are you sure you want to remove'), + ('furni_rare_parasol*0_name', 'Green Parasol'), + ('furni_sound_set_38_name', 'Rock 6'), + ('NUF_mini_meet_people_room_wave', 'These buttons let you wave and dance. Click on your Habbo at anytime to see these buttons.'), + ('gs_skill_changed_header', 'Congratulations!'), + ('furni_chair_plasty*7_name', 'Plastic Pod Chair'), + ('furni_safe_silo*5_desc', 'Totally shatter-proof!'), + ('furni_divider_silo1*3_name', 'White Corner Shelf'), + ('nav_venue_hallway_ii_name', 'Hallway II'), + ('cam_release.help', 'Cancel Photo'), + ('nav_venue_bb_lobby_amateur_14/0_desc', ''), + ('habbo_tv_title', 'Widescreen Habbovision'), + ('purse_noevents', 'You haven\'t made any transactions yet. Click the button below to find out how to get Habbo Credits.\\rRemember: you must ask your parents permission before you buy Habbo Credits.'), + ('furni_pura_mdl2*8_name', 'yellow pura module 2'), + ('furni_CFC_10_coin_bronze_name', 'Bronze Coin (China)'), + ('sound_machine_song_remove', 'Remove song'), + ('modtool_choose_length', 'Choose Length:'), + ('sound_machine_turn_off', 'Switch Off'), + ('furni_pura_mdl1*8_desc', ''), + ('furni_spyro_desc', 'The stuff of legend'), + ('furni_pillow*2_name', 'Red Silk Pillow'), + ('furni_table_armas_desc', 'For informal dining'), + ('furni_tree3_desc', 'Any presents under it yet?'), + ('object_displayer_link_looks', 'Change avatar looks'), + ('furni_barrier*2_name', 'White Road Barrier'), + ('furni_gothic_chair*5_desc', 'The dark side of Habbo'), + ('furni_divider_nor4*4_name', 'Urban Iced Shutter'), + ('furni_camera_name', 'Camera'), + ('next_arrows', 'Next >>'), + ('furni_sound_set_60_desc', 'Love and affection!'), + ('furni_bed_polyfon_girl_one_name', 'Single Bed'), + ('NUF_mini_meet_people_user_chatfield', 'Start typing here and press \'Enter\' to chat with others.'), + ('successfully_purchase_gift_for', 'Successfully purchased gift for user %user%!'), + ('poster_49_desc', 'All that glitters...'), + ('furni_glass_table*3_name', 'Glass table'), + ('furni_divider_silo3*5_desc', 'Pink Area Gate'), + ('furni_divider_arm3_name', 'Gate (lockable)'), + ('furni_table_plasto_4leg*3_name', 'Round Dining Table'), + ('roomatic_roomnumber', 'Room number:'), + ('nav_venue_bb_lobby_beginner_5_name', 'Beginners Battle Ball 6'), + ('reg_nameAndPassTooSimilar', 'Your name and password are too similar'), + ('nav_venue_theatredrome_easter_name', 'Theatredrome Easter'), + ('nav_venue_bb_lobby_beginner_11/0_desc', ''), + ('furni_fireplace_polyfon_name', 'Fireplace'), + ('queue_set.e1.info', 'There are %e1% Habbos in front of you in the queue.'), + ('more_info_link', 'Redeem Now'), + ('furni_bed_polyfon*6_desc', 'Blue Mode Double Bed'), + ('furni_rare_icecream*5_name', 'Vanilla Ice Cream Machine'), + ('poster_500_name', 'Union Jack'), + ('furni_chair_norja*3_name', 'White Iced Chair'), + ('furni_sound_set_31_name', 'Dance 3'), + ('furni_pura_mdl3*5_name', 'beige pura module 3'), + ('furni_sporttrack2*3_desc', 'null'), + ('furni_sound_set_46_desc', 'De bada bada bo!'), + ('poster_9_name', 'Rainforest Poster'), + ('furni_romantique_pianochair*4_name', 'Amber Piano Stool'), + ('poster_515_desc', 'Waved by Swedes everywhere'), + ('furni_scifidoor*9_desc', 'There out of this world!'), + ('furni_chair_plasty*3_name', 'Plastic Pod Chair'), + ('furni_table_plasto_round*5_name', 'Round Dining Table'), + ('furni_one_way_door*9_desc', 'One at a time!'), + ('furni_calippo_desc', 'Basic model'), + ('furni_footylamp_desc', 'Can you kick it?'), + ('furni_one_way_door*2_desc', 'One way! The HC way!'), + ('furni_arabian_tray4_desc', 'Sweet, juicy and ripe'), + ('furni_divider_nor3*7_name', 'Rural Iced gate'), + ('furni_couch_norja*3_name', 'White Iced Bench'), + ('furni_pillow*9_name', 'Green Wooly Pillow'), + ('game_chooseside', 'Choose your side'), + ('start', 'Start'), + ('furni_toy1*4_desc', 'it\'s bouncy-tastic'), + ('roomevent_host', 'Host:'), + ('nav_venue_rooftop_rumble_name', 'Rooftop Rumble'), + ('nav_venue_bb_lobby_expert_0/0_desc', ''), + ('nav_venue_rooftop_rumble_ii/0_desc', 'Are you ready?'), + ('error_report_trigger_message', 'Last message ID'), + ('furni_sofachair_silo*2_name', 'Black Armchair'), + ('furni_noob_chair*5_desc', 'Lightweight, practical, with pink stripes'), + ('pet_frnd_0', 'Hostile'), + ('furni_noob_rug*3_name', 'My first Habbo rug'), + ('pet_frnd_2', 'Suspicious'), + ('pet_frnd_1', 'Angry'), + ('furni_scifiport*6_desc', 'Energy beams. No trespassers!'), + ('pet_frnd_4', 'Calm'), + ('pet_frnd_3', 'Cool'), + ('pet_frnd_6', 'Warm'), + ('pet_frnd_5', 'Friendly'), + ('pet_frnd_8', 'Loving'), + ('credit_trade_value', 'Includes credit furnis worth %value% credits.'), + ('pet_frnd_7', 'Affectionate'), + ('pet_frnd_9', 'Loyal'), + ('NUF_getting_items_purse_tutor', 'Your Purse tells you how many Habbo Credits you have. If you have a voucher code you can redeem it here by clicking the \'Vouchers\' button.'), + ('furni_chair_norja*6_name', 'Blue Chair'), + ('sound_machine_alert_machine_full', 'You already have 4 Traxpacks loaded. Eject one before adding a new Traxpack.'), + ('nav_venue_club_mammoth/0_desc', 'Monumental and magnificent. For Habbo Club members only.'), + ('NUF_getting_room_hand_tutor', 'This is your hand. It contains all your furniture. I have given you a rug so that you can place it in your room- click and drag it to set it down.'), + ('reg_check_name', 'Name'), + ('furni_glass_stool*7_name', 'Green Glass Stool'), + ('poster_504_name', 'The Bundesflagge'), + ('poster_42_desc', 'Not something you want to run into'), + ('pet.saying.sleep.dog.6', '*dreaming*'), + ('pet.saying.sleep.dog.5', 'Zzzzz wuff! zzzzz'), + ('pet.saying.sleep.dog.4', 'hrrrrr...murrmm..'), + ('furni_pura_mdl4*2_desc', 'Any way you like it!'), + ('pet.saying.sleep.dog.3', 'bzz.. oof oof'), + ('furni_sofa_silo*5_name', 'Pink Area Sofa'), + ('pet.saying.sleep.dog.2', 'hrrr.. hrrr'), + ('pet.saying.sleep.dog.1', 'bzz.. bzzzzz'), + ('furni_petfood4_name', 'T-Bones Mega Multipack'), + ('nav_venue_club_mammoth_name', 'Club Mammoth'), + ('ph_keys_dive', 'Diving moves:'), + ('furni_noob_table*3_name', 'My first Habbo table'), + ('furni_romantique_divan*5_desc', 'Is that a cape hanging there?'), + ('furni_table_plasto_round*8_name', 'Round Dining Table'), + ('furni_rare_fan*1_name', 'Blue Powered Fan'), + ('reg_forcedupdate2', 'Update your Habbo info'), + ('furni_table_plasto_square*4_name', 'Square Dining Table'), + ('NUF_playing_games', 'Playing games'), + ('furni_prizetrophy2*2_name', 'Duck trophy'), + ('reg_forcedupdate3', 'The Habbo Hotel management requires all Habbos to read and agree to the service Terms and Conditions. It won\'t take long.\\rJust go through the registration, check your info and agree to the new terms. Thank you!'), + ('nav_venue_sw_lobby_tournament_2_name', 'Tournament Lobby'), + ('furni_carpet_standard*4_name', 'Floor Rug'), + ('furni_s_sound_machine*6_name', 'Sound Machine Purple'), + ('furni_prizetrophy5*1_desc', 'Glittery gold'), + ('furni_table_plasto_square_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_beginner_2_name', 'Beginners Battle Ball 3'), + ('furni_rubberchair*4_name', 'Ocean Inflatable Chair'), + ('furni_divider_poly3*5_desc', 'Keep the Pink in!'), + ('furni_arabian_teamk_name', 'Tea Maker'), + ('room_name', 'Room:'), + ('nav_venue_chill/0_desc', 'Come chill in the Zen Garden!'), + ('furni_summer_grill*4_name', 'Green Barbeque Grill'), + ('poster_1001_desc', 'even walls have ears'), + ('furni_rare_icecream*8_name', 'Peppermint Ice Cream Machine'), + ('furni_safe_silo*9_desc', 'Totally shatter-proof!'), + ('sound_machine_song_save', 'Save song'), + ('NUF_getting_room_navigator_ownrooms', 'Click the \'Own Room(s)\' tab to see your rooms.'), + ('furni_gothic_chair*1_desc', 'The dark side of Habbo'), + ('furni_table_plasto_square*8_name', 'Square Dining Table'), + ('furni_safe_silo*2_desc', 'Totally shatter-proof!'), + ('roomevent_create_description', 'Describe your event'), + ('purse_vouchers_success', 'Voucher was successfully redeemed. You have the Credits.'), + ('furni_gothic_carpet2_name', 'Dungeon Floor'), + ('furni_sofa_polyfon*3_name', 'White Two-seater Sofa'), + ('furni_romantique_tray2_name', 'Treats Tray'), + ('nav_modify_doorstatus_locked', 'Locked (visitors have to ring the bell)'), + ('NUF_visiting_rooms_categorylist_open', 'Click the \'Open\' button to open a category.'), + ('room_doorbell', 'Rings the doorbell - Open the door?'), + ('furni_sound_set_45_name', 'Lost_Beatness'), + ('nav_deleteroom', 'Delete'), + ('furni_barchair_silo_name', 'Bar Stool'), + ('furni_chair_plasto*5_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_tournament_14_name', 'Competitie Battle Ball 15'), + ('furni_pura_mdl1*1_desc', 'Any way you like it!'), + ('furni_rare_snowrug_desc', 'Chilled Elegance'), + ('poster_35_desc', 'The Hotel\'s girlband. Dream on!'), + ('furni_glass_stool_desc', 'Translucent beauty'), + ('furni_rare_fan*8_name', 'Habbo Wind Turbine'), + ('furni_menorah_desc', 'Light up your room'), + ('furni_table_silo_small*7_desc', 'Green Area Occasional Table'), + ('furni_divider_silo1*7_name', 'Green Area Corner Shelf'), + ('furni_romantique_divan*1_desc', 'null'), + ('furni_table_plasto_round*1_name', 'Round Dining Table'), + ('reg_changeEmail', 'Change your email'), + ('hobba_mark_normal', 'Send To Helpers'), + ('nav_venue_bb_lobby_tournament_8/0_desc', ''), + ('ph_tickets_have2', 'Tickets'), + ('nav_venue_sw_lobby_intermediate_0/0_desc', ''), + ('ph_tickets_have1', 'You Have'), + ('furni_bardesk_polyfon*7_desc', 'Green Mode Bardesk'), + ('console_inprivateroom', 'In A Guest Room'), + ('furni_sound_set_35_name', 'Dance 6'), + ('GoAway', 'Leave The Room'), + ('room_kick', 'Kick'), + ('furni_rubberchair*8_name', 'Black Inflatable Chair'), + ('poster_6_name', 'Abstract Poster'), + ('hubu_t1_3', ''), + ('NUF_meeting_people', 'Meeting people'), + ('nav_venue_bb_lobby_amateur_4/0_desc', ''), + ('nav_venue_bb_game/0_name', 'Battle Ball Arena'), + ('furni_pudding_name', 'Christmas Pudding'), + ('furni_tile_red_name', 'Floor Tiles'), + ('catalog_typeurname', 'Type your greetings here\\r(don\'t forget to put your name!):'), + ('furni_house2_name', 'Gingerbread House'), + ('hubu_t1_1', 'Kaupunkien pu_t2_2=Katso onko kotisi l_1=Tietoa Hubusta'), + ('furni_glass_table*4_desc', 'Translucent beauty'), + ('hubu_t1_2', ''), + ('nav_venue_club_massiva/1_name', 'Chill-out Room'), + ('furni_scifiport*2_desc', 'Get in the ring!'), + ('furni_traffic_light*4_name', 'Yellow Traffic Light'), + ('furni_tree2_name', 'Old Christmas Tree'), + ('furni_noob_stool*4_name', 'My first Habbo stool'), + ('done', 'Done'), + ('furni_goodie1*1_name', 'Marzipan Man'), + ('nav_venue_bb_lobby_tournament_18/0_desc', ''), + ('poster_17_name', 'Butterfly Cabinet 1'), + ('furni_summer_chair*5_name', 'Deck Chair'), + ('furni_prizetrophy*1_name', 'Classic trophy'), + ('furni_easterduck_desc', 'Can you tell what it is yet?'), + ('furni_barrier*3_desc', 'No trespassing, please!'), + ('furni_table_plasto_bigsquare*1_name', 'Square Dining Table'), + ('club_general_infolink', 'More Info About Habbo Club >>'), + ('furni_chair_silo*4_name', 'Beige Silo Dining Chair'), + ('roomatic_givename', 'Give your room a name!'), + ('furni_rare_icecream*1_name', 'Blueberry Ice Cream Machine'), + ('roomatic_open', 'Door open'), + ('NUF_getting_items_catalogue_tutor', 'Big! You can browse the products by clicking on the categories. There are loads of different types of furniture to decorate your room.'), + ('furni_marquee*4_name', 'Yellow Marquee'), + ('furni_bed_polyfon_one*7_name', 'Green Mode Single Bed'), + ('gs_button_go_started', 'Watch'), + ('poster_27_name', 'Holly Bundle 3'), + ('furni_divider_nor2*7_desc', 'No way through'), + ('furni_glass_chair*5_desc', 'Translucent beauty'), + ('nav_venue_basement_lobby_name', 'Basement Lobby'), + ('pick_furniture', 'Put Furni In Hand'), + ('nav_venue_bb_lobby_beginner_18/0_desc', ''), + ('furni_pura_mdl2*4_name', 'White Pura Module 2'), + ('club_status_title', 'You are currently a member of Habbo Club.'), + ('furni_rare_elephant_statue_name', 'Golden Elephant'), + ('furni_toy1*1_desc', 'it\'s bouncy-tastic'), + ('reg_doneheader', 'Congratulations!\\rYou\'re a Habbo!'), + ('furni_present_gen6_name', 'Gift'), + ('furni_noob_chair*2_desc', 'Lightweight, practical, with dark blue stripes'), + ('furni_sofachair_silo*5_name', 'Pink Area Armchair'), + ('BuddyNow', 'now:'), + ('furni_pura_mdl5*3_desc', 'Any way you like it!'), + ('furni_prizetrophy6*1_name', 'Champion trophy'), + ('BuddyEntry', 'On Hotel View'), + ('furni_scifiport*9_desc', 'Energy beams. No trespassers!'), + ('furni_table_polyfon_small_desc', 'For serving a stylish latte'), + ('furni_exe_rug_name', 'Executive Rug'), + ('nav_venue_the_dirty_duck_pub_name', 'The Dirty Duck Pub'), + ('nav_venue_bb_lobby_beginner_9_name', 'Beginners Battle Ball 10'), + ('nav_venue_sw_lobby_beginner_5_name', 'Snow Rookies Lobby'), + ('furni_pura_mdl5*2_name', 'Pink Pura Module 5'), + ('furni_bardeskcorner_polyfon*7_desc', 'Green Mode Bardesk Corner'), + ('alert_donate_content', 'The other Habbo has not put anything into the trade. Are you sure you want to give away your furni?'), + ('furni_hc_rllr_name', 'HC Rollers Set'), + ('furni_divider_nor1_desc', 'Looks squishy, but isn\'t'), + ('furni_nouvelle_trax_desc', ''), + ('wallitem_jp_sheet3_name', 'jp_sheet3'), + ('furni_hyacinth2_name', 'Blue Hyacinth'), + ('furni_sound_machine_name', 'Sound Machine'), + ('console_getmessage_sender', 'Sender:'), + ('furni_sandrug_name', 'Tropical Beach Rug'), + ('nav_updatenote_header', 'Note!'), + ('furni_pillar*4_desc', 'From the time of the Kick Warz'), + ('furni_waterbowl*1_name', 'Red Water Bowl'), + ('furni_grand_piano*5_name', 'Onyx Grand Piano'), + ('furni_redhologram_name', 'Holo-girl'), + ('sound_machine_alert_playlist_full', 'Could not save playlist! Playlists can have only %count% songs.'), + ('nav_rooms_search', 'Search'), + ('nav_venue_cunning_fox_gamehall/5_name', 'Poker'), + ('nav_venue_habbo_lido_ii_name', 'Habbo Lido II'), + ('furni_barchair_silo*9_desc', 'Practical and convenient'), + ('pet_nature', 'Nature:'), + ('furni_wood_tv_name', 'Large TV'), + ('poster_2008_desc', 'Once every four Habbo years!'), + ('poster_38_desc', 'For really TOUGH Habbos!'), + ('nav_venue_bb_lobby_expert_0_name', 'Expert'), + ('furni_chair_plasto*14_desc', 'Aqua chair'), + ('furni_queue_tile1*6_name', 'Blue Habbo Roller'), + ('poster_522_name', 'The flag of Japan'), + ('furni_chair_basic*3_name', 'Black Pura Egg Chair'), + ('nav_venue_pizza_desc', 'Tunnelmallinen pizzapaikka kiireettömään nautiskeluun.'), + ('furni_jp_tray6_desc', 'jp_tray6'), + ('furni_hc_btlr_desc', 'Your personal caretaker'), + ('furni_song_disk_desc', 'Burn, baby burn'), + ('furni_deadduck2_name', 'Dead Duck 2'), + ('furni_statue_name', 'Cupid Statue'), + ('furni_scifirocket*5_name', 'Uranus Smoke Machine'), + ('nav_gobutton', 'Go'), + ('recycler_furni_not_recyclable', 'This Furniture cannot be recycled. Please only use Furniture that has the recyclable tag in your hand.'), + ('furni_gothic_sofa*5_name', 'Green Gothic Sofa'), + ('furni_sound_set_32_desc', 'Piano concert set'), + ('furni_chair_plasto*10_name', 'Chair'), + ('nav_venue_bb_lobby_tournament_2_name', 'Competitie Battle Ball 3'), + ('furni_grand_piano*1_desc', 'Turquoise Grand Piano'), + ('buddyremove_windowheader', 'Your friends list is full.'), + ('furni_pillar*0_name', 'Greek Pillar'), + ('gs_title_countdown', 'Game Is About To Begin'), + ('furni_glass_sofa*3_name', 'Glass sofa'), + ('furni_hc_crtn_desc', 'Topnotch privacy protection'), + ('furni_waterbowl*5_desc', 'Aqua unlimited'), + ('furni_table_silo_small*4_desc', 'Beige Area Occasional Table'), + ('furni_jp_tray2_name', 'jp_tray2'), + ('furni_rare_moonrug_desc', 'Desolation rocks!'), + ('furni_val_teddy*3_name', 'Green Share Bear'), + ('furni_sleepingbag*10_desc', 'Ultimate coziness'), + ('furni_bar_polyfon_desc', 'You naughty Habbo!'), + ('furni_sofachair_polyfon*2_desc', 'Black Mode Armchair'), + ('furni_exe_sofa_name', 'Executive 3-Seater Sofa'), + ('furni_divider_silo1*4_desc', 'Beige Area Corner Shelf'), + ('poster_2004_name', 'Rasta Poster'), + ('furni_bench_armas_name', 'Bench'), + ('furni_soft_sofachair_norja_desc', 'Soft iced sofachair'), + ('nav_venue_bb_lobby_beginner_14_name', 'Beginners Battle Ball 15'), + ('gs_button_rejoin', 'Play again!'), + ('furni_marquee*8_name', 'Ultramarine Marquee'), + ('furni_tile_marble_desc', 'Slick sophistication; now 10% off!'), + ('hubu_info_url_1', 'http://www.habbohotel.co.uk/habbo/en/help/12'), + ('console_requests', 'Friend Request(s)'), + ('furni_sleepingbag*4_name', 'Army Sleeping Bag'), + ('furni_plant_yukka_desc', 'Easy to care for'), + ('NUF_getting_room_own_rooms_createroom', 'Empty? That\'s because you don\'t have any rooms yet. If it isn\'t empty then you already have made a room, which makes me wonder...'), + ('furni_glass_sofa*6_desc', 'Translucent beauty'), + ('ph_exit', 'Exit In Normal Clothes'), + ('pet_race_0_024', 'Black-eyed Boxer'), + ('furni_marquee*7_name', 'Purple Marquee'), + ('pet_race_0_023', 'Dotty Dalmatian'), + ('recycler_info_timeout', 'Your recycling was completed, but you did not accept it in time. Please press the cancel button below to have your recyclable items restored to your hand. To recycle these items you will need to begin the process again.'), + ('pet_race_0_022', 'Schnitzel Snatcher'), + ('hubu_info_url_2', 'http://www.talktofrank.com/'), + ('pet_race_0_021', 'Loyal Labrador'), + ('nav_venue_snowwar_lobby/0_desc', 'Snow Storm LobbyCome and be a Snow Stormer!'), + ('pet_race_0_020', 'Patchy Pup'), + ('furni_chair_plasto*8_name', 'Chair'), + ('furni_sofachair_silo*9_desc', 'Red Area Armchair'), + ('nav_venue_bb_lobby_beginner_17/0_desc', ''), + ('furni_hc_dsk_desc', 'For Habbo scholars'), + ('furni_wooden_screen*8_name', 'Night Blue Oriental Screen'), + ('gs_lounge_skill_no_min', 'No minimum'), + ('summer_chair_8_name', 'Yellow Deck Chair'), + ('gs_score_tie', 'The game ended in a tie!'), + ('nav_people', 'Who\'s in here?'), + ('furni_gothic_sofa*2_desc', 'Stylish seating for two'), + ('furni_summer_chair*8_name', 'Yellow Deck Chair'), + ('roomatic_roomname', 'Room name:'), + ('furni_ham_desc', 'Tuck in'), + ('nav_venue_star_lounge_desc', 'Is there a VIP visitor in the hotel?'), + ('furni_bardeskcorner_polyfon*3_name', 'White Corner Desk'), + ('gs_specnum', 'Number of spectators: \\x'), + ('furni_bed_budget*3_name', 'Black Pura Double Bed'), + ('furni_shelves_norja*6_name', 'Blue Bookcase'), + ('partner_registration_link', 'Finish registration'), + ('furni_pillar*1_name', 'Pink Marble Pillar'), + ('reg_olderage', 'I am 11 or older'), + ('furni_glass_stool*4_name', 'Glass stool'), + ('back', 'Back'), + ('furni_tile_yell_desc', 'In a choice of colours'), + ('club_confirm_text3', 'Buy more and pay less: 6 Months (186 days) of Habbo Club cost only 105 Credits. You have %credits% credits in your Purse.\\r\\r After buying the membership, you will immediately be part of the Habbo VIP Community.'), + ('furni_sofa_silo_desc', 'Cushioned, understated comfort'), + ('club_confirm_text1', '1 Habbo Club Month (31 days) costs 25 Credits. You have %credits% Credits in your Purse.\\r\\r After buying the membership, you will immediately be part of the Habbo VIP Community.'), + ('club_confirm_text2', 'Buy more and pay less: 3 Months (93 days) of Habbo Club cost only 60 Credits. You have %credits% credits in your Purse.\\r\\r After buying the membership, you will immediately be part of the Habbo VIP Community.'), + ('furni_carpet_legocourt_name', 'Basketball Court'), + ('furni_present_gen3_name', 'Gift'), + ('furni_sound_set_2_desc', 'Get the party started!'), + ('furni_barchair_silo*6_name', 'Blue Bar Stool'), + ('furni_arabian_bigtb_name', 'Amanjena Table'), + ('interface_icon_catalog', 'Catalogue, furnishing your room'), + ('furni_hologram_desc', 'As if by magic...'), + ('nav_venue_sw_lobby_expert_1/0_desc', ''), + ('furni_carpet_standard*1_name', 'Floor Rug'), + ('nav_owner', 'Owner'), + ('furni_glass_chair*2_desc', 'Translucent beauty'), + ('furni_rcandleset_name', 'Red Candle Plate'), + ('furni_divider_nor1*6_name', 'Blue Ice corner'), + ('nav_private_helptext_hd', 'Rooms'), + ('furni_sound_set_27_name', 'Groove 2'), + ('furni_drinks_name', 'Empty Cans'), + ('pet.saying.eat.cat.0', 'mmm...thumm, thumm'), + ('gs_title_nextround', 'Next game...'), + ('pet.saying.eat.cat.1', 'lap, lap, lap, lap'), + ('furni_scifirocket*9_desc', 'Something fishy is going on...'), + ('pet.saying.eat.cat.2', '*munch, munch*'), + ('pet.saying.sleep.dog.0', 'zzZZZzzz'), + ('furni_noob_lamp*4_name', 'My first Habbo lamp'), + ('nav_venue_sw_lobby_beginner_8_name', 'Snow Rookies Lobby'), + ('nav_venue_library/0_desc', 'Time to catch up on some studying'), + ('camera_dialog_open', 'Shoot'), + ('furni_lamp_armas_desc', 'Ambient lighting is essential'), + ('buddyremove_pleasewait', 'Please wait a second...'), + ('friend_request_options', 'Advanced options.'), + ('transaction_system_web_internal', 'Housekeeping purchase'), + ('furni_rare_dragonlamp*5_name', 'Elf Green Dragon Lamp'), + ('furni_bar_chair_armas_desc', 'The ultimate recycled furniture'), + ('room_ignore', 'Shutup'), + ('poster_518_desc', 'A fiery dragon for your wall'), + ('furni_soft_sofa_norja*7_desc', 'Sit back and relax'), + ('object_displayer_show_tags', 'Show tags'), + ('furni_goth_table_desc', 'The dark side of Habbo'), + ('club_txt_changesubscr', 'Change subscription'), + ('Alert_RememberSetYourPassword', 'Please check your password'), + ('reg_verification_checking', 'Checking...'), + ('furni_silo_studydesk_desc', 'For the true Habbo Scholars'), + ('room_give_rights', 'Give rights'), + ('furni_CF_50_goldbar_name', 'Gold Bar'), + ('furni_rom_lamp_name', 'Crystal Lamp'), + ('furni_sofachair_polyfon*8_desc', 'Yellow Mode Armchair'), + ('furni_deadduck3_name', 'Dead Duck 3'), + ('furni_bed_polyfon_one*4_name', 'Beige Mode Single Bed'), + ('furni_noob_stool*1_desc', 'Unfold me and take the weight off (orange)'), + ('furni_stand_polyfon_z_name', 'Shelf'), + ('furni_prize3_name', 'Bronze Trophy'), + ('club_status_text', 'Here you can see your Habbo Club membership status, number of elapsed months, pre-ordered months and status of the ongoing month.'), + ('furni_table_plasto_bigsquare*9_desc', 'Hip plastic furniture'), + ('furni_wooden_screen*4_desc', 'Add an exotic touch to your room'), + ('furni_sound_set_52_name', 'Christmas Party'), + ('furni_CF_1_coin_bronze_name', 'Bronze Coin'), + ('furni_tile_brown_name', 'Red Tile'), + ('nav_venue_bb_lobby_intermediate_5/0_desc', ''), + ('nav_venue_picnic/0_name', 'Picnic Garden'), + ('furni_sound_set_50_desc', 'The harder generation'), + ('furni_lamp2_armas_name', 'Lodge Candle'), + ('registration_disabled_text', 'You can\'t create new Habbos at the moment. Please try again [some date]..'), + ('catalog_selectproduct', 'Select product:'), + ('transaction_system_sms_telia', 'Telia'), + ('nav_venue_bb_lobby_intermediate_5_name', 'Semi-profs Battle Ball 6'), + ('furni_christmas_sleigh_name', 'Winter Sleigh'), + ('furni_scifirocket*8_desc', 'From a space far, far away!'), + ('furni_bed_budget*9_name', 'Red Pura Double Bed'), + ('poster_2000_desc', 'Suomen kartta'), + ('help_emergency_whathappens', 'A member of community staff will investigate the situation and take appropriate action. This may include sending you a response with advice on dealing with your issue.'), + ('purse_coins', 'Habbo Credits'), + ('furni_marquee*5_desc', 'It\'s both door and a shade!'), + ('club_txt_whatis', 'What is Habbo Club?'), + ('furni_present_gen2_name', 'Gift'), + ('trading', 'Trading'), + ('furni_sofa_silo*9_desc', 'Red Area Sofa'), + ('furni_summer_chair*9_name', 'Red Deck Chair'), + ('furni_shelves_armas_desc', 'For all those fire-side stories'), + ('purse_buy_coins', 'Buy Credits'), + ('room_confirmPlace', 'Are you sure?'), + ('furni_queue_tile1*3_desc', 'The power of movement'), + ('furni_soft_sofachair_norja*8_name', 'Yellow Iced Sofachair'), + ('furni_arabian_snake_desc', 'Beware the snake!'), + ('nav_venue_sw_lobby_tournament_6/0_desc', ''), + ('NUF_about_hotel', 'What\'s Habbo about?'), + ('furni_bardeskcorner_polyfon_desc', 'Tuck it away'), + ('furni_bardeskcorner_polyfon*4_name', 'Beige Mode Bardesk Corner'), + ('poster_13_desc', 'Arty black and white'), + ('nav_venue_bb_lobby_beginner_9/0_desc', ''), + ('nav_modify_nameshow', 'Show your name in the room info'), + ('NUF_mini_use_console_read_next', 'Click \'OK\' to mark message as read.'), + ('poster_1005_desc', 'The muscly movie hero'), + ('wallitem_jp_sheet2_name', 'jp_sheet2'), + ('furni_xmas_cstl_gate_desc', 'Let that icy draft out!'), + ('NUF_groups_url', 'http://d16-1.web.varoke.net/home/group-tutorial'), + ('furni_jp_irori_name', 'Irori'), + ('furni_jp_bamboo_desc', 'Watch out for pandas!'), + ('furni_christmas_reindeer_name', 'Reindeer'), + ('furni_glass_chair*4_name', 'Glass chair'), + ('furni_jp_tray5_desc', 'jp_tray5'), + ('furni_table_plasto_4leg*4_desc', 'Hip plastic furniture'), + ('NUF_getting_items_catalogue_purse', 'Click to open your Purse and find out how to get some Habbo Credits . You can use these to buy stuff!'), + ('furni_hc_tbl_name', 'Nordic Table'), + ('furni_bed_budget_one*6_name', 'Blue Pura Bed'), + ('furni_solarium_norja*7_name', 'Rural Solarium'), + ('console_newmessages', 'New Message(s)'), + ('poster_2_desc', 'Take pride in your veg!'), + ('furni_xmas_cstl_twr_desc', 'All I see from up here is snow!'), + ('hubu_info', 'Welcome to the FRANK Infobus! For the next three months FRANK advisors who know a lot about drugs, their effects and the risks involved, will be stepping aboard the Infobus to offer advice and support to any Habbo that wants to visit the bus. For more information click the link below:'), + ('furni_bardesk_polyfon*6_name', 'Blue Mode Bardesk'), + ('furni_summer_pool*3_name', 'Green Summer Pool'), + ('furni_pura_mdl3*8_name', 'yellow pura module 3'), + ('furni_valentinescreen_name', 'Holiday Romance'), + ('furni_rare_beehive_bulb*1_desc', 'A honey-hued glow'), + ('gs_link_gamerules', 'Game Rules'), + ('nav_venue_bb_lobby_tournament_11/0_desc', ''), + ('sound_machine_song_info', 'Song Info'), + ('wallitem_arabian_swords_name', 'Ancestral Scimitars'), + ('furni_one_way_door*6_desc', 'One way! The HC way!'), + ('furni_table_plasto_round*2_desc', 'Hip plastic furniture'), + ('credit', 'Credit'), + ('gs_lounge_skill_no_max', 'Infinite'), + ('furni_wall_china_desc', 'For your great wall'), + ('NUF_visiting_rooms_roomlist_add to fav', 'After clicking on a room you can click this button here to add it to favourites.'), + ('furni_carpet_polar*3_name', 'Yellow Bear Rug'), + ('poster_46_desc', 'Twinkle, twinkle'), + ('furni_petfood1_desc', 'Fantastic 20% Saving!'), + ('url_nobalance', 'http://%predefined%/credits?'), + ('furni_sofachair_silo*6_name', 'Blue Area Armchair'), + ('furni_noob_chair*1_desc', 'Lightweight, practical and yellow'), + ('nav_venue_bb_lobby_expert_7/0_desc', ''), + ('furni_pura_mdl1*7_name', 'Green Pura Module 1'), + ('furni_table_silo_small*6_name', 'Blue Area Occasional Table'), + ('club_thanks_title', 'Congratulations! You are now a member of Habbo Club.'), + ('furni_legotrophy_name', 'Basketball Trophy'), + ('roomatic_createyrown', 'Create Your Own Room'), + ('console_report_remove', 'Remove'), + ('furni_sound_set_42_desc', 'Bumps and Chills'), + ('furni_divider_nor5*5_desc', 'Cool cornering for your crib y0!'), + ('furni_rare_icecream*2_desc', 'Virtual pistachio rocks!'), + ('furni_pura_mdl4*6_name', 'Blue Pura Module 4'), + ('club_button_close', 'Close Window'), + ('wallitem_md_can_name', 'Bubble Juice Can'), + ('furni_prizetrophy7_desc', 'Palkinto'), + ('nav_venue_cunning_fox_gamehall/2_desc', 'Keep your head down, it\'s bombs away'), + ('poster_28_desc', '10 x Silver Tinsel'), + ('furni_rare_dragonlamp*2_desc', 'Oriental beast of legends'), + ('furni_glass_sofa*2_name', 'Glass sofa'), + ('modtool_hours', 'Hours'), + ('nav_venue_emperors_name', 'Emperor\'s hall'), + ('catalog_buyingSuccesfull', 'Buying Successful!'), + ('console_concurrency_error', 'There was a concurrency error while modifying friend list'), + ('furni_table_silo_med*3_desc', 'Wipe clean and unobtrusive'), + ('furni_sleepingbag*8_desc', 'Ultimate coziness for SnowStorm winners'), + ('poster_508_desc', 'The flag of Spain'), + ('furni_goodie1*2_desc', 'Crunchy Dog Treat'), + ('nav_venue_sw_lobby_free_3/0_desc', ''), + ('furni_chair_basic*7_desc', ''), + ('room_take_rights', 'Remove Rights'), + ('furni_hc_bkshlf_desc', 'For the scholarly ones'), + ('furni_bed_polyfon*2_desc', 'Black Mode Double Bed'), + ('furni_table_plasto_4leg_name', 'Occasional Table'), + ('furni_bed_budget*7_desc', 'King sized comfort!'), + ('win_partner_registration', 'Partner registration'), + ('summer_chair_4_desc', 'Please tan responsably'), + ('furni_table_norja_med_name', 'Coffee Table'), + ('nav_venue_club_massiva/2_desc', 'Make all the right moves'), + ('furni_divider_silo1_desc', 'Neat and natty'), + ('hobba_send_reply', 'Send Alert'), + ('shopping_nocash', 'You don\'t have enough Credits in your Purse.\\r Click \'OK\' to see the different ways of\\rgetting Habbo Credits.'), + ('furni_divider_poly3*9_name', 'Red Hatch'), + ('furni_rare_fountain*1_desc', 'For our feathered friends'), + ('poster_56_desc', 'Serious partying going on!'), + ('furni_scifiport*6_name', 'White Sci-Fi Port'), + ('furni_rclr_garden_desc', 'Self watering'), + ('furni_arabian_tray1_desc', 'Tea for every occasion'), + ('furni_rare_fountain*3_name', 'Bird Bath (blue)'), + ('furni_romantique_pianochair*1_name', 'Rose Quartz Piano Stool'), + ('furni_romantique_divider*1_desc', 'Beauty lies within'), + ('wallitem_post.it.vd_name', 'Heart Stickies'), + ('wallitem_torch_desc', 'The dark side of Habbo'), + ('roomatic_namedisplayed', 'Do you want your name to be displayed with the room?'), + ('furni_grunge_candle_name', 'Candle Box'), + ('furni_sound_set_17_name', 'Groove 3'), + ('furni_prizetrophy3*2_name', 'Globe trophy'), + ('furni_chair_silo_desc', 'Keep it simple'), + ('nav_venue_sw_lobby_beginner_7/0_desc', ''), + ('nav_venue_sw_lobby_beginner_3/0_desc', ''), + ('furni_hc_trll_name', 'Drinks Trolley'), + ('furni_bed_polyfon_one*7_desc', 'Green Mode Single Bed'), + ('furni_chair_plasto*2_name', 'Chair'), + ('furni_pura_mdl1*4_name', 'White Pura Module 1'), + ('furni_gothiccandelabra_desc', 'The dark side of Habbo'), + ('NUH_chat', 'Click here and type to chat to other Habbos.'), + ('furni_plant_valentinerose*2_name', 'White Valentine Rose'), + ('reg_privacypledge', 'Privacy Pledge'), + ('furni_exe_table_desc', 'Take a memo, Featherstone'), + ('hubu_info_link2', 'FRANK Website'), + ('furni_prizetrophy4*3_name', 'Fish trophy'), + ('furni_hc_chr_desc', 'Royal comfort'), + ('hubu_info_link1', 'FRANK Infobus Information'), + ('sound_machine_your_songs', 'Traxmachine Songs'), + ('furni_active_placeholder_name', 'This furniture is downloading...'), + ('furni_divider_silo3*8_name', 'Yellow Area Gate'), + ('NUF_visiting_rooms_categorylist_tutor', 'There are so many Guest Rooms we thought it would be a "hoot" to divide them into categories. Select a category to view its contents.'), + ('furni_sofa_silo*6_name', 'Blue Area Sofa'), + ('club_extend_failed', 'Sorry, we were unable to process the purchase. No Credits were charged!'), + ('furni_soft_sofa_norja*4_name', 'Urban Iced Sofa'), + ('furni_sporttrack3*3_desc', 'null'), + ('furni_sound_set_1_name', 'Habbo Sounds 1'), + ('furni_pura_mdl2*5_name', 'beige pura module 2'), + ('nav_venue_sw_lobby_intermediate_1/0_desc', ''), + ('furni_safe_silo*8_name', 'Yellow Safe Minibar'), + ('trading_agrees', 'agrees'), + ('alert_needpermission', 'You need your parent or guardian\'s permission to spend time in Habbo Hotel.'), + ('nav_modify', 'Modify'), + ('furni_noob_stool*4_desc', 'Unfold me and take the weight off (light blue)'), + ('catalog_length_trophymsg', 'Oops, your inscription is too long, so it won\'t fit on the trophy. \\rPlease type something shorter.'), + ('furni_s_sound_machine*3_desc', 'Sound Machine Green Desc'), + ('club_member', 'Member'), + ('modtool_ban_ip', 'Ban IP Also'), + ('bb_link_gamerules', 'Spelregels'), + ('furni_carpet_armas_name', 'Hand-Woven Rug'), + ('furni_rubberchair*5_desc', 'Soft and tearproof!'), + ('furni_table_plasto_square*1_desc', 'Hip plastic furniture'), + ('furni_divider_nor3*3_desc', 'Do go through...'), + ('nav_venue_habburger\'s/0_desc', 'Get food here!'), + ('reg_linkstitle', 'Full version of the documents:'), + ('roomevent_browser_title', 'Events'), + ('roomatic_security', 'Security'), + ('furni_table_plasto_4leg*7_desc', 'Hip plastic furniture'), + ('furni_table_plasto_round*14_desc', 'Hip plastic furniture'), + ('furni_sound_set_38_desc', 'Rock and Roses!'), + ('furni_rare_parasol*0_desc', 'Block those rays!'), + ('furni_pura_mdl3*6_desc', 'Any way you like it!'), + ('NUF_console', 'Learn about messaging'), + ('poster_45_name', 'Skeleton'), + ('furni_pura_mdl3*9_desc', 'Any way you like it!'), + ('pet_age', 'Age:'), + ('poster_48_name', 'Large gold star'), + ('open', 'Open'), + ('gs_3min', '3min'), + ('wallitem_habw_mirror_name', 'Habbowood Mirror'), + ('furni_carpet_polar*4_desc', 'Snuggle up on a Funky bear rug...'), + ('furni_table_armas_name', 'Dining Table'), + ('sw_gameprice', 'Play now for just 2 tickets!'), + ('furni_divider_nor5*4_name', 'Urban Iced Angle'), + ('navigator', 'Hotel Navigator'), + ('furni_pillow*2_desc', 'Puffy, soft and huge'), + ('purse_vouchers_checking', 'Checking code, please wait...'), + ('furni_noob_rug*4_desc', 'Nice and neat sisal rug with light blue edging'), + ('furni_safe_silo*5_name', 'Pink Safe Minibar'), + ('nav_venue_the_dirty_duck_pub/0_desc', 'The perfect place to chill!'), + ('furni_CFC_10_coin_bronze_desc', 'Worth 10 Credits'), + ('furni_teleport_door_desc', 'Magic doorway to anywhere!'), + ('furni_bardesk_polyfon_name', 'Bar/desk'), + ('login_password', 'Password'), + ('furni_pura_mdl2*8_desc', ''), + ('furni_divider_nor4*4_desc', 'Habbos, roll out!'), + ('furni_rare_fan*7_name', 'Brown Powered Fan'), + ('furni_bed_polyfon_girl_one_desc', 'Snuggle down in princess pink'), + ('club_general_elapsed', 'Elapsed Months'), + ('nav_venue_sw_lobby_free_1_name', 'Free Game Lobby'), + ('furni_gothic_chair*5_name', 'Green Gothic Chair'), + ('furni_sink_name', 'Sink'), + ('furni_bed_budget_one*4_desc', 'Prince sized comfort!'), + ('Alert_ForgotSetPassword', 'Please check your password'), + ('furni_chair_plasto*6_desc', 'Hip plastic furniture'), + ('furni_carpet_standard_desc', 'Available in a variety of colours'), + ('reg_update_text2', 'Only change them when you want to make sure that nobody can know or guess your password.'), + ('furni_arabian_swords_desc', 'Not for yielding'), + ('furni_divider_silo3*5_name', 'Pink Area Gate'), + ('furni_fireplace_polyfon_desc', 'Comfort in stainless steel'), + ('furni_glass_table*3_desc', 'Translucent beauty'), + ('furni_summer_pool*4_desc', 'Fancy a dip?'), + ('poster_500_desc', 'The UK flag'), + ('poster_1004_name', 'Eid Mubarak Poster'), + ('furni_rare_icecream*5_desc', 'Virtual vanilla rocks!'), + ('furni_one_way_door*2_name', 'Black HC Gate'), + ('furni_chair_plasty*3_desc', 'Hip plastic furniture'), + ('club_end_title', 'Your Habbo Club membership has now expired.'), + ('furni_table_polyfon_desc', 'For larger gatherings'), + ('furni_romantique_pianochair*4_desc', 'I can feel air coming through...'), + ('furni_bardesk_polyfon*3_name', 'White Bardesk'), + ('predefined_room_description', '%user_name% has entered the building'), + ('poster_53_desc', 'whack that ball!'), + ('poster_515_name', 'The Swedish flag'), + ('furni_rope_divider_desc', 'Rope Divider'), + ('furni_chair_norja*3_desc', 'Sleek and chic for each cheek'), + ('furni_scifidoor*9_name', 'Blue Spaceship Door'), + ('furni_goodie2_name', 'Chocolate Mouse'), + ('game_poker_logoff', 'Left the game'), + ('furni_bed_polyfon_desc', 'Give yourself space to stretch out'), + ('furni_table_plasto_round*5_desc', 'Hip plastic furniture'), + ('furni_couch_norja*3_desc', 'Two can perch comfortably'), + ('pet.saying.sleep.cat.2', 'Purrr... rrrr'), + ('pet.saying.sleep.cat.1', 'mrrrr..rrrr..'), + ('pet.saying.sleep.cat.0', 'hrrrrr....Mrrrrr'), + ('login_ok', 'OK'), + ('gs_button_expand', 'Expand Window'), + ('pet.saying.sleep.cat.4', 'mrrrr...muew..mrr'), + ('tutorial_next', 'Next:'), + ('pet.saying.sleep.cat.3', 'hurrr..hurrr'), + ('furni_jp_tatami_desc', 'Shoes off please'), + ('hobba_sent_to_moderators', 'Call re-assigned non-emergency, still visible to moderators'), + ('roomatic_choosecategory', ''), + ('wallitem_guitar_v_desc', 'tilulilulii'), + ('NUF_groups', 'Groups'), + ('bb_link_gameRules_url', 'http://%predefined%/groups/56552/id'), + ('nav_venue_theatredrome_halloween_name', 'Theatredrome Habboween'), + ('bb_buyTicketsButton', 'Buy tickets'), + ('furni_gothgate_desc', 'The dark side of Habbo'), + ('game_poker_waiting', 'Change done.\\rWaiting for the other players'), + ('furni_glass_stool*7_desc', 'Habbo Club'), + ('club_end_text', 'BUT, don\'t worry, you can still buy another month of Habbo Club and keep all your Habbo Club benefits,special Furni gifts and the shiny badge!'), + ('furni_sound_set_18_desc', 'Listen while you tan'), + ('furni_sound_set_35_desc', 'Groovelicious'), + ('furni_prizetrophy2*2_desc', 'Shiny silver'), + ('furni_plant_valentinerose*3_desc', 'Relight your passions'), + ('furni_romantique_divan*5_name', 'Onyx Chaise-Longue'), + ('furni_chair_norja*6_desc', 'Sleek and chic for each cheek'), + ('wallitem_hrella_poster_2_desc', 'For those scary Lido moments'), + ('furni_s_sound_machine*6_desc', 'Sound Machine Purple'), + ('game_bs_miss', 'Miss:'), + ('furni_carpet_standard*4_desc', 'Available in a variety of colours'), + ('furni_pura_mdl1*1_name', 'Aqua Pura Module 1'), + ('furni_rare_icecream*8_desc', 'Virtual peppermint rocks!'), + ('furni_petfood4_desc', 'Fantastic 20% Saving!'), + ('furni_table_silo_small*3_name', 'White Occasional Table'), + ('furni_table_plasto_round*8_desc', 'Hip plastic furniture'), + ('furni_chair_polyfon_desc', 'Metallic seating experience'), + ('furni_exe_drinks_desc', 'Give a warm welcome'), + ('nav_createroom', 'Create Own Room'), + ('furni_table_plasto_bigsquare*14_desc', 'Hip plastic furniture'), + ('poster_1001_name', 'Prince Charles Poster'), + ('furni_CF_20_moneybag_name', 'Sack of Credits'), + ('furni_prizetrophy5*1_name', 'Duo trophy'), + ('alert_reg_email', 'Email'), + ('pet_thirsty', 'Thirst:'), + ('nav_error_passwordtooshort', 'The password is too short.'), + ('nav_venue_sw_lobby_free_7_name', 'Free Game Lobby'), + ('furni_plant_valentinerose*5_name', 'Purple Valentine Rose'), + ('recycler_status_info', 'You have Furniture in recycling. The icon will blink when recycling is complete.'), + ('poster_52_name', 'Hockey Stick'), + ('win_doorbell', 'Doorbell'), + ('Unreadmessages', 'New Message(s)'), + ('furni_queue_tile1*9_desc', 'The power of movement'), + ('furni_rare_snowrug_name', 'Snow Rug'), + ('console_approve_selected', 'Accept selected'), + ('pet_race_0_009', 'Hound of Hull'), + ('poster_35_name', 'The Habbo Babes 1'), + ('pet_race_0_008', 'Springy Spaniel'), + ('furni_sofa_polyfon*3_desc', 'Comfort for stylish couples'), + ('furni_basket_name', 'Basket Of Eggs'), + ('pet_race_0_007', 'Slobber Don'), + ('pet_race_0_006', 'Stripy Setter'), + ('pet_race_0_005', 'Paws Forethought'), + ('pet_race_0_004', 'Droopy of Pawford'), + ('furni_barchair_silo_desc', 'Practical and convenient'), + ('furni_noob_lamp*2_desc', 'Get the light right where you want it (dark blue)'), + ('pet_race_0_003', 'Rescue Bernard'), + ('furni_glass_stool_name', 'Glass stool'), + ('pet_race_0_002', 'Joe Cocker Spaniel'), + ('pet_race_0_001', 'Habbo Husky'), + ('pet_race_0_000', 'Yappy Yorkie'), + ('NUF_mini_endtopic_step1_questionmark', 'Click to see our help menu and find our FAQs!'), + ('furni_sound_set_28_desc', 'Head for the pit!'), + ('nav_private_norooms', 'You dont have any rooms - create one?'), + ('furni_table_plasto_square*4_desc', 'Hip plastic furniture'), + ('furni_val_teddy*6_name', 'Blue Share Bear'), + ('furni_noob_table*3_desc', 'Lightweight, practical and aubergine'), + ('gs_state_finished', 'This Game is already over!'), + ('furni_rare_fan*8_desc', 'Stylish, Eco-Energy!'), + ('reg_parentemail_link_url1', 'http://%predefined%//help/parents_guide.html'), + ('furni_gothic_carpet2_desc', 'What lies beneath?'), + ('furni_rare_fan*5_desc', 'It\'ll blow you away!'), + ('modtool_kickuser', 'Kick User'), + ('furni_divider_silo1*7_desc', 'Green Area Corner Shelf'), + ('reg_parentemail_link_url2', 'http://%predefined%//footer_pages/privacy_policy.html'), + ('pet_race_0_019', 'Tiny Terrier'), + ('pet_race_0_018', 'Bushy Woofer'), + ('pet_race_0_017', 'Speckled Sheepdog'), + ('furni_rubberchair*8_desc', 'Soft and tearproof for HC!'), + ('pet_race_0_016', 'Murmurin\' Minimastiff'), + ('poster_42_name', 'Spiderweb'), + ('pet_race_0_015', 'Pixie Poodle'), + ('furni_safe_silo*2_name', 'Black Safe Minibar'), + ('pet_race_0_014', 'Whiffy Woofy'), + ('pet_race_0_013', 'Mangy Mutt'), + ('nav_publicRooms', 'Public Spaces'), + ('pet_race_0_012', 'Tawny Bleugh'), + ('pet_race_0_011', 'Lappy Lassie'), + ('pet_race_0_010', 'Furry McScottie'), + ('game_bs_toast', 'Toast!'), + ('furni_prizetrophy6_name', 'Pokaali'), + ('furni_pudding_desc', 'Will you get the lucky sixpence?'), + ('furni_tile_red_desc', 'In a choice of colours'), + ('nav_venue_sw_arena_expert_name', 'Playing expert game'), + ('pet.saying.sleep.croco.0', 'Zzzz... zzzzz...'), + ('poster_50_desc', 'flap, flap, screech, screech...'), + ('furni_shelves_norja*9_name', 'Red Bookcase'), + ('furni_sound_set_4_name', 'Ambient 1'), + ('furni_exe_s_table_desc', 'Get a clear reflection!'), + ('furni_present_gen6_desc', 'What\'s inside?'), + ('furni_one_way_door*5_name', 'Pink One Way Gate'), + ('nav_search_hd', 'Search rooms by Habbo name or room name.'), + ('poster_20_desc', 'high security for your room'), + ('buddyremove_messenger_updating', 'The console is updating, try again in a minute... Everything else is working fine!'), + ('pet.saying.sleep.croco.3', ':)'), + ('furni_house2_desc', 'Good enough to eat'), + ('pet.saying.sleep.croco.4', '*Snuh snuh*'), + ('tutorial_offtopic', 'Oops! You got off the topic. Please restart or select a new topic.'), + ('pet.saying.sleep.croco.1', 'Yrgh... Yrgh...'), + ('jukebox_now_playing', 'Now playing:'), + ('pet.saying.sleep.croco.2', 'Frgh... Frgh...'), + ('furni_sound_set_25_desc', 'Actually, it\'s Partay!'), + ('club_intro_header', 'Welcome to Habbo Club, the members-only club that all VIP Habbos belong to!'), + ('nav_venue_sw_lobby_amateur_3/0_desc', 'Astetta rankempaa lumisotaa.'), + ('pet.saying.sleep.croco.5', 'Rawwwwwwwwrrrm...'), + ('pet.saying.sleep.croco.6', 'Mmmm... Hooks...'), + ('furni_table_plasto_bigsquare*1_desc', 'Hip plastic furniture'), + ('nav_venue_sw_lobby_free_4_name', 'Free Game Lobby'), + ('alert_warning', 'Moderator says:'), + ('furni_barrier*3_name', 'Red Road Barrier'), + ('nav_venue_floatinggarden_name', 'Floating Garden'), + ('gs_error_nocredits', 'You need Habbo Credits to play a Game!'), + ('furni_chair_plasto*5_name', 'Chair'), + ('furni_tree2_desc', 'Old Christmas Tree'), + ('furni_bed_budget_one*7_desc', 'Prince sized comfort!'), + ('furni_romantique_clock_name', 'romantique_clock'), + ('room_banner_text', ''), + ('furni_sleepingbag*2_desc', 'Ultimate coziness'), + ('furni_divider_nor4*3_name', 'White Iced Auto Shutter'), + ('jukebox_song_remaining', 'Remaining time: %time%'), + ('reg_note_text', 'Never change your password or email\\rif someone else asks you to - they will\\rsteal your furni and Credits!'), + ('habbo_hand_next', '>>>'), + ('nav_venue_orient/0_desc', 'Tres chic with an Eastern twist. For Habbo Club members only.'), + ('furni_easterduck_name', 'Wannabe bunny'), + ('login_forgottenPassword', 'Forgotten your password?'), + ('furni_prizetrophy*1_desc', 'Glittery gold'), + ('hubu_t2_2', ''), + ('hubu_t2_3', 'Vapaa-ajan linkkejä'), + ('decision_cancel', 'Cancel'), + ('nav_venue_bb_lobby_tournament_2/0_desc', ''), + ('furni_samovar_desc', 'Click for a refreshing cuppa'), + ('furni_rcandle_name', 'Red Candle'), + ('furni_waterbowl*4_name', 'Blue Water Bowl'), + ('furni_table_norja_med*7_name', 'Rural Iced Coffee Table'), + ('NUF_playing_games_room_tutor', 'See some people wandering around? They are psyching themselves up for a game. Game Tickets are usually 2 Habbo Credits, but in this room the games are free.'), + ('furni_doormat_love_name', 'Doormat'), + ('bb_link_tournament_highScores_url', 'http://%predefined%//groups/56552/id'), + ('furni_sofachair_polyfon*4_name', 'Beige Mode Armchair'), + ('error_room_full', 'Huone on täynnä.'), + ('furni_chair_silo*4_desc', 'Beige Silo Dining Chair'), + ('furni_divider_nor2*7_name', 'Rural Iced Bar'), + ('hubu_t2_1', ''), + ('furni_divider_nor1*9_name', 'Red Ice corner'), + ('furni_wooden_screen*0_name', 'White Oriental Screen'), + ('furni_chair_basic*1_desc', ''), + ('gs_choose_gamename', 'Enter A Name For Your Game:'), + ('poll_question_number', 'Question %number%/%count%'), + ('furni_hc_rllr_desc', 'Highest class transportation'), + ('furni_table_plasto_4leg*15_desc', 'Hip plastic furniture'), + ('furni_scifiport*9_name', 'Violet Sci-Fi Port'), + ('furni_jukebox*1_desc', 'For your Happy Days!'), + ('furni_red_tv_desc', 'Don?t miss those soaps'), + ('furni_song_disk_name', 'Traxdisc'), + ('reg_agree_alert', 'You have to agree to the terms of service\\r(tick the box).'), + ('furni_summer_chair*1_desc', 'Got your swimming trunks?'), + ('poster_2008_name', 'Habbo Leap Day Poster'), + ('poster_505_desc', 'The Canadian flag'), + ('group_homepage', 'Groups\' Homepage >>>'), + ('furni_table_silo_med*6_desc', 'Blue Area Coffee Table'), + ('nav_venue_tearoom/0_name', 'Chinese Tea Room'), + ('dimmer_use_bg_only', 'Background only'), + ('furni_divider_poly3*4_name', 'Beige Mode Bardesk Gate'), + ('nav_venue_hotel_kitchen/0_desc', 'Beware the flying knives!'), + ('furni_divider_silo1*8_desc', 'Neat and natty'), + ('furni_hc_btlr_name', 'Electric Butler'), + ('furni_wooden_screen*5_name', 'Gray Oriental Screen'), + ('furni_scifiport*8_name', 'Purple Sci-Fi Port'), + ('furni_carpet_standard*5_name', 'Floor Rug'), + ('trading_offers', 'offers:'), + ('furni_prizetrophy2*3_name', 'Duck trophy'), + ('transaction_system_club_habbo', 'Habbo Club payment'), + ('nav_venue_bb_lobby_tournament_9/0_desc', ''), + ('poster_517_name', 'The Scottish flag'), + ('furni_wood_tv_desc', 'For family viewing'), + ('furni_deadduck2_desc', 'Someone forgot to feed me...'), + ('furni_sound_set_20_desc', 'Musical heaven'), + ('sound_machine_new', 'Create a New Song'), + ('nav_venue_the_chromide_club/0_desc', 'Ghetto Fabulous'), + ('nav_modify_doorstatus_pwagain', 'pw again:'), + ('furni_chair_plasto*10_desc', 'Hip plastic furniture'), + ('gs_idlewarning', 'You will be replaced if you don\'t start or join a Game soon!'), + ('purse_vouchers_entercode', 'Enter code here:'), + ('sound_machine_song_name', 'Untitled Trax'), + ('furni_sofa_polyfon*4_name', 'Beige Mode Sofa'), + ('furni_carpet_standard*a_name', 'Floor Rug'), + ('poster_510_name', 'The Italian flag'), + ('furni_table_plasto_square*7_name', 'Square Dining Table'), + ('furni_noob_chair*6_desc', 'Lightweight, practical with dark yellow stripes'), + ('forgottenpw_whatyou', 'What\'s your Habbo called?'), + ('nav_venue_bb_lobby_amateur_1_name', 'Gevorderden Battle Ball 2'), + ('furni_noob_table*6_name', 'My first Habbo table'), + ('furni_pillar*0_desc', 'Classy architect, for holding up ceilings!'), + ('poster_1002_desc', 'aw, bless...'), + ('furni_divider_arm1_desc', 'Good solid wood'), + ('furni_glass_stool*8_name', 'Glass stool'), + ('furni_rare_moonrug_name', 'Moon Patch'), + ('nav_venue_rooftop_rumble/0_desc', 'Are you ready?'), + ('transaction_system_sms_sonera', 'Sonera'), + ('furni_waterbowl*5_name', 'Brown Water Bowl'), + ('furni_sound_set_32_name', 'Instrumental 2'), + ('furni_table_silo_small*4_name', 'Beige Area Occasional Table'), + ('furni_prizetrophy8*1_name', 'Duo trophy'), + ('tutorial_menu', 'Get help with...'), + ('gs_2teams', '2 Teams Game'), + ('furni_sound_machine*4_desc', 'For Funky, Funky Fridays!'), + ('furni_romantique_divan*4_desc', 'Is that a cape hanging there?'), + ('furni_couch_norja*8_desc', 'Two can perch comfortably'), + ('console_usersnotfound', 'Habbo Not Found'), + ('nav_venue_bb_lobby_amateur_2/0_desc', ''), + ('furni_sleepingbag*4_desc', 'Ultimate coziness'), + ('furni_bed_budget_one*6_desc', 'Prince sized comfort!'), + ('furni_sw_chest_desc', ''), + ('nav_venue_bb_lobby_amateur_5/0_desc', ''), + ('NUF_visiting_rooms_room_tutor', 'This is a Guest Room. You can either quit the tutorial and start meeting people, or select the next topic.'), + ('furni_jp_pillow_name', 'Pillow Chair'), + ('url_logged_out', 'http://%predefined%/account/disconnected?reason=logout&origin=popup'), + ('furni_romantique_smalltabl*1_name', 'Rose Quartz Tray Table'), + ('friend_request_declined', 'Declined!'), + ('furni_grunge_shelf_desc', 'Scrap books and photo albums'), + ('furni_gothic_stool*6_name', 'Gothic Stool Blue'), + ('wallitem_gothicfountain_desc', 'Not suitable for drinking!'), + ('furni_scifiport*1_name', 'Gold Laser Gate'), + ('furni_sound_set_41_name', 'Rock 8'), + ('furni_toilet_yell_name', 'Loo Seat'), + ('console_fr_limit_exceeded_error', 'Too many friends selected. Please remove some first.'), + ('console_asktobecomeafriend', 'Ask To Become A Friend'), + ('console_friends', 'Friends'), + ('furni_table_plasto_bigsquare*4_desc', 'Hip plastic furniture'), + ('poster_2005_desc', 'The Special Infobus Poster'), + ('furni_summer_chair*8_desc', 'Got your sun cream?'), + ('furni_s_sound_machine*2_name', 'Sound Machine Ocean'), + ('nav_ringbell', 'The door is locked. Ringing the bell, and waiting...'), + ('console_profilematch', 'Habbo Profile match -'), + ('poster_14_name', 'Fox Poster'), + ('furni_bardeskcorner_polyfon*3_desc', 'Tuck it away'), + ('furni_carpet_soft*2_name', 'Soft Wool Rug'), + ('furni_ham_name', 'Joint of Ham'), + ('nav_venue_star_lounge_name', 'Star Lounge'), + ('nav_venue_bb_lobby_beginner_desc', 'Beginner battle ball'), + ('furni_doormat_plain*3_desc', 'Available in a variety of colours'), + ('furni_habbowood_chair_desc', 'Exclusively for Directors'), + ('nav_venue_bb_lobby_beginner_3/0_desc', ''), + ('furni_CF_20_moneybag_desc', 'Worth 20 Credits'), + ('furni_edice_desc', 'What\'s your lucky number?'), + ('furni_scifirocket*9_name', 'Neptune Smoke Machine'), + ('furni_bardesk_polyfon*9_name', 'Red Bardesk'), + ('furni_glass_table*8_desc', 'Translucent beauty'), + ('NUF_mini_endtopic', 'Find out more'), + ('pending_cfh_title', 'Your old message'), + ('nav_venue_sw_arena_tournament_name', 'Playing a tournament game!'), + ('furni_arabian_bigtb_desc', 'It must be Jinn-er time!'), + ('nav_venue_bb_lobby_beginner_0/0_desc', ''), + ('furni_pillow*3_name', 'Turquoise Satin Pillow'), + ('interface_icon_help', 'Help, need help?'), + ('nav_roomnfo_hd_src', 'Search Rooms'), + ('pet.saying.generic.dog.0', 'woof..woof'), + ('furni_chair_norja*9_name', 'Red Chair'), + ('NUF_getting_room_roommatic_start_tutor', 'This is the Room-O-Matic! Green! You use this to make your room.'), + ('furni_sound_set_2_name', 'Habbo Sounds 3'), + ('nav_venue_netcafe_name', 'My Habbo Home Netcafe'), + ('purse_voucherbutton', 'Vouchers'), + ('console_console', 'Console'), + ('game_poker_changed', 'changed'), + ('transaction_system_splashplastic', 'SplashPlastic'), + ('nav_venue_sw_lobby_free_7/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('furni_sporttrack3*1_desc', 'null'), + ('buddyremove_prev', '< Previous'), + ('roomatic_chooselayout', 'Choose the layout of your room'), + ('wallitem_item_placeholder_desc', 'This furniture is downloading...'), + ('purse_note', 'NOTE : The transactions are updated at 6 am every day.'), + ('poster_34_desc', 'Habbo-punk for the never-agreeing'), + ('furni_sound_set_27_desc', 'Jingle Bells will never be the same...'), + ('game_chess_start', 'Start Over'), + ('summer_chair_7_desc', 'A green deck chair'), + ('nav_venue_bb_lobby_beginner_6_name', 'Beginners Battle Ball 7'), + ('purse_link', 'Click here to see how to get Credits.'), + ('poster_59_desc', 'Torch - it gives you some light'), + ('room_info_rate_req', 'Rate this room'), + ('furni_rare_dragonlamp*5_desc', 'Roast your chestnuts here!'), + ('furni_divider_silo3*9_desc', 'Red Area Gate'), + ('more_roomlayouts', 'Extra room layouts for Habbo Club members >>'), + ('furni_grunge_chair_desc', 'Alternative chair for alternative people'), + ('furni_bed_budget*9_desc', 'King sized comfort!'), + ('furni_christmas_sleigh_desc', 'Ready for your Xmas cheer'), + ('furni_table_plasto_4leg*8_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_tournament_5_name', 'Competitie Battle Ball 6'), + ('furni_table_norja_med*4_name', 'Urban Iced Coffee Table'), + ('instant_friend_request_header', 'Friend Request'), + ('furni_marquee*3_name', 'Aqua Marquee'), + ('furni_noob_stool*1_name', 'My first Habbo stool'), + ('furni_rare_mnstr_desc', 'Don\'t get too close...'), + ('furni_safe_silo_pb_desc', 'Totally shatter-proof!'), + ('NUF_meeting_people_user_chatfield', 'Start typing here and press \'Enter\' to chat with others.'), + ('furni_prizetrophy6*2_desc', 'Shiny silver'), + ('furni_table_plasto_bigsquare*9_name', 'Square Dining Table'), + ('club_habbo.window.title', 'Habbo Club'), + ('recycler_info_ready', 'Recycling is complete. You have made a great environmentally friendly decision. All the recycled items you receive have been made from old items which helps to save natural resources and reduce pollution.'), + ('furni_shelves_norja*5_desc', 'For nic naks and art deco books'), + ('furni_table_silo_med_name', 'Coffee Table'), + ('furni_grunge_sign_desc', 'Bought legitimately from an M1 cafe.'), + ('roomevent_type_9', 'Group Events'), + ('roomevent_type_7', 'Dating'), + ('pet.saying.generic.dog.1', 'woof woof woof!!!'), + ('roomevent_type_8', 'Jobs'), + ('pet.saying.generic.dog.2', 'wooooof!'), + ('roomevent_type_5', 'Debates & Discussion'), + ('pet.saying.generic.dog.3', 'hooooowl'), + ('roomevent_type_6', 'Grand Openings'), + ('furni_solarium_norja*2_name', 'Beige Solarium'), + ('nav_venue_bb_lobby_intermediate_3_name', 'Semi-profs Battle Ball 4'), + ('console_searchfor', 'Search:'), + ('wallitem_arabian_wndw_desc', 'Arabian days and nights'), + ('furni_queue_tile1*3_name', 'Ice Habbo Roller'), + ('furni_lamp2_armas_desc', 'Wax lyrical with some old-world charm'), + ('furni_jp_tray3_desc', 'jp_tray3'), + ('wallitem_guitar_skull_name', 'skull guitar'), + ('roomevent_type_3', 'Games'), + ('furni_romantique_divider*2_desc', 'Keeping things separated'), + ('roomatic_owner', 'Owner:'), + ('url_helpterms', 'http://%predefined%//help/68'), + ('roomevent_type_4', 'Welcoming Party Events'), + ('furni_glass_chair*6_desc', 'Translucent beauty'), + ('furni_pillar*5_name', 'Pagan Pillar'), + ('roomevent_type_1', 'Parties & Music'), + ('roomevent_type_2', 'Trading'), + ('furni_present_gen2_desc', 'What\'s inside?'), + ('ph_tickets_title', 'Tickets'), + ('furni_table_norja_med*8_desc', 'For larger gatherings'), + ('furni_sound_set_54_desc', 'Tune into Christmas'), + ('poster_61_desc', 'The Auspicious One'), + ('furni_divider_silo3_name', 'Gate (lockable)'), + ('furni_scifirocket*4_desc', 'Welcome... to planet love'), + ('furni_plant_valentinerose*1_name', 'Red Valentine\'s Rose'), + ('furni_exe_chair2_name', 'Executive Boss Chair'), + ('alert_donate_ok', 'Give away my furni'), + ('furni_bardesk_polyfon*4_desc', 'Beige Mode Bardesk'), + ('furni_pura_mdl1*5_desc', ''), + ('hubu_close', 'Sulje kioski'), + ('gs_deathmatch', 'Every Habbo for himself!'), + ('summer_chair_9_desc', 'Sunbathing, why not?'), + ('furni_barchair_silo*8_name', 'Yellow Bar Stool'), + ('console_differentmessagemodes', 'Different Messages'), + ('furni_chair_silo*5_name', 'Pink Silo Dining Chair'), + ('callhelp_explanation', 'Thanks for reporting the problem'), + ('furni_chair_plasty*1_desc', 'Hip plastic furniture'), + ('furni_bed_budget*2_desc', 'Queen sized comfort!'), + ('furni_summer_grill*2_desc', 'Plenty of shrimp on that barbie'), + ('furni_heart_desc', 'Full of love'), + ('reg_donetext', 'Soon you\'ll see the Hotel Navigator, it shows you all the rooms you can go to -the guest rooms, clubs, caf�s, swimming pools and more!'), + ('poster_523_desc', 'The flag of India'), + ('furni_one_way_door*1_name', 'Aqua One Way Gate'), + ('furni_bardeskcorner_polyfon*13_desc', 'Tuck it away'), + ('nav_venue_sw_lobby_amateur_5/0_desc', 'Astetta rankempaa lumisotaa.'), + ('furni_gothic_chair*4_desc', 'Vampires and Wizards'), + ('furni_bardesk_polyfon*6_desc', 'Blue Mode Bardesk'), + ('transaction_system_sms_sra', 'Sonera'), + ('dimmer_turn_off', 'Turn OFF'), + ('furni_fireplace_armas_desc', 'Authentic, real flame fire'), + ('furni_chair_plasty*6_name', 'Plastic Pod Chair'), + ('furni_scifidoor*6_name', 'Black Monolith'), + ('furni_summer_pool*3_desc', 'Fancy a dip?'), + ('furni_christmas_reindeer_desc', 'Prancer becomes Rudolph in a click!'), + ('furni_chair_norja_name', 'Chair'), + ('furni_barchair_silo*3_name', 'White Bar Stool'), + ('nav_venue_bb_lobby_tournament_desc', 'Play battle ball tournament!'), + ('transaction_system_bank_sampo', 'Sampo'), + ('furni_sound_set_39_name', 'Rock 7'), + ('furni_pura_mdl3*8_desc', ''), + ('console_follow_prevented', 'Your friend has prevented others from following him/her.'), + ('poster_46_name', 'Small gold star'), + ('furni_sofa_polyfon_girl_name', 'Two-seater Sofa'), + ('furni_carpet_polar*3_desc', 'Snuggle up on a Funky bear rug...'), + ('modtool_rankerror', 'You do not have the rights for this action on this user!'), + ('furni_divider_nor3*4_name', 'Urban Iced Gate'), + ('nav_venue_theatredrome_valentine/0_desc', 'Hug A Friend, Its Valentines! Home Of Ralph (Wannabe Panda In Training)'), + ('furni_one_way_door*6_name', 'Blue HC Gate'), + ('poster_7_desc', 'For emergencies only'), + ('wallitem_hc_wall_lamp_name', 'Retro Wall Lamp'), + ('poster_508_name', 'The Spanish flag'), + ('help_emergency_example', 'Example: A Habbo wants to see me on webcam.'), + ('nav_venue_bb_lobby_expert_1/0_desc', ''), + ('furni_pura_mdl1*7_desc', 'Any way you like it!'), + ('wallitem_post.it_desc', 'Pad of stickies'), + ('nav_modify_doorstatus_passwordprotected', 'Let other people move and leave furniture in the room.'), + ('queue_set.queue_full.alert', 'The queue for this room is full. Please try again later.'), + ('nav_venue_bb_lobby_beginner_8_name', 'Beginners Battle Ball 9'), + ('nav_venue_sw_arena_amateur_name(0)', 'Playing amateur game'), + ('url_figure_editor', 'http://%predefined%//profile/profile.action'), + ('furni_noob_lamp*6_desc', 'Get the light right where you want it (canary yellow)'), + ('furni_divider_nor5*5_name', 'Pink Iced Angle'), + ('nav_venue_sw_lobby_free_desc', 'Come and play. It\'s free!'), + ('furni_table_silo_small*6_desc', 'Blue Area Occasional Table'), + ('NUF_getting_items_navigator_tutor', 'You need to be in a Habbo\'s room to access the Catalogue.'), + ('furni_safe_silo*6_desc', 'Totally shatter-proof!'), + ('furni_glass_sofa*7_name', 'Green Glass Sofa'), + ('wallitem_md_can_desc', 'Enough bubbling juice for one evening'), + ('furni_rare_fan*9_desc', 'It\'ll blow you away!'), + ('furni_prizetrophy7_name', 'Pokaali'), + ('furni_noob_stool*3_name', 'My first Habbo stool'), + ('furni_glass_sofa*2_desc', 'Translucent beauty'), + ('pet_frnd_10', 'Adoring'), + ('furni_turkey_desc', 'Where\'s the cranberry sauce?'), + ('pet_frnd_11', 'Devoted'), + ('Alert_ConnectionNotReady', 'Could not connect to the server'), + ('console_search_habbo_profilematch', 'Habbo Profile match -'), + ('furni_sound_set_59_desc', 'Urban break beats'), + ('poster_21_name', 'Butterfly Cabinet'), + ('credits', 'Credits'), + ('furni_sound_set_14_name', 'Hip Hop Beats 2'), + ('NUH_hand', 'Click here to open your inventory (aka the Big Hand). Drag and drop furniture to and from here to move it.'), + ('furni_pura_mdl3*1_desc', 'Any way you like it!'), + ('nav_modify_doorstatus_pwprotected', 'Password protected:'), + ('shopping_costs', 'XX costs XX Credit(s).\\rJust click \'buy\' once, it\'ll appear shortly.'), + ('NUF_mini_meet_people', 'Meet some people'), + ('furni_divider_nor1*3_name', 'White Iced Corner'), + ('furni_bed_budget*7_name', 'Green Pura Double Bed'), + ('furni_pura_mdl5*9_desc', 'Any way you like it!'), + ('nav_venue_club_massiva/2_name', 'Dancefloor'), + ('furni_scifiport*3_desc', 'Energy beams. No trespassers!'), + ('whisper', 'Whisper'), + ('furni_chair_plasto*4_name', 'Chair'), + ('furni_hc_bkshlf_name', 'Medieval Bookcase'), + ('furni_goodie1*2_name', 'Marzipan Man'), + ('furni_rare_fountain*1_name', 'Bird Bath (grey)'), + ('bb_text_hostInfo', 'Please choose a name for your Game and select the number of Teams.'), + ('hubu_t3_1', ''), + ('hubu_t3_2', 'Hubun kiertuekalenteri 2002'), + ('furni_sound_set_34_name', 'Rock 5'), + ('furni_rare_fountain*3_desc', 'For our feathered friends'), + ('nav_venue_sw_lobby_amateur_5_name', 'Snow Slingers Lobby'), + ('furni_pura_mdl3*2_name', 'Pink Pura Module 3'), + ('furni_xmas_cstl_wall_desc', 'Solid blocks of ice and snow'), + ('furni_arabian_tray1_name', 'Mint Tea Tray'), + ('furni_jp_tray4_name', 'jp_tray4'), + ('furni_grunge_candle_desc', 'Late night debate'), + ('furni_rclr_garden_name', 'Water Garden'), + ('furni_CFC_100_coin_gold_name', 'Gold Coin (China)'), + ('nav_venue_gate_park_name', 'Imperial Park'), + ('shopping_asagift', 'Buy As A Gift'), + ('furni_soft_sofachair_norja*7_desc', 'Sit back and relax'), + ('dance', 'Dance'), + ('roomatic_wrongpw', 'Oops! Sorry, your passwords don\'t match. Please enter them again.'), + ('furni_hc_trll_desc', 'For swanky dinners only'), + ('furni_prizetrophy3*2_desc', 'Shiny silver'), + ('modtool_roomkick', 'Room Kick'), + ('roomatic_letmove', 'Let other people move your furniture and place their own. (Furniture cannot be stolen.)'), + ('roomevent_default_description', ''), + ('nav_venue_sw_lobby_free_4/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('console_invalid_message', 'There was a message from a user that was probably removed your friend list. Note, user is removed from your friend list if you report a message to moderators.'), + ('poster_503_name', 'The Swiss flag'), + ('nav_venue_sw_arena_expert_name(0)', 'Playing expert game'), + ('poster_41_desc', 'For the best music-makers'), + ('furni_tile_name', 'Floor Tiles'), + ('furni_val_randomizer_name', 'Love Randomiser'), + ('nav_modify_doorstatus_open', 'Open'), + ('furni_plant_big_cactus_desc', 'Habbo Dreams monster in hiding! Shhhh'), + ('furni_safe_silo*8_desc', 'Totally shatter-proof!'), + ('wallitem_sw_hole_name', 'sw_hole'), + ('play_preview', 'Play preview of sounds'), + ('furni_table_plasto_round*14_name', 'Occasional Table'), + ('poll_thanks_window', 'Thanks!'), + ('wallitem_habbowheel_desc', 'So you gotta ask yourself "Do I feel lucky?"'), + ('furni_carpet_standard_name', 'Floor rug'), + ('furni_divider_nor1*8_name', 'Yellow Ice corner'), + ('nav_venue_bb_lobby_tournament_3/0_desc', ''), + ('buddyremove_ok_text', 'You have chosen enough friends to remove.'), + ('nav_venue_sw_lobby_intermediate_5/0_desc', 'Lumisota sen kuin vain kovenee.'), + ('furni_divider_nor4*7_desc', 'Habbos, roll out!'), + ('furni_summer_chair*3_desc', 'Black'), + ('furni_table_plasto_bigsquare*6_desc', 'Hip plastic furniture'), + ('gs_link_highscores', 'High Scores'), + ('Alert_purchasingerror', 'Buying unsuccessful'), + ('poster_5_desc', 'Quacking good design!'), + ('help_emergency_sent', 'A member of community staff will investigate the situation and take appropriate action. This may include sending you a response with advice on dealing with your issue.'), + ('room_user_page', 'Home Page'), + ('room_badge_window_title', 'Badge'), + ('login_name', 'Name of your Habbo'), + ('furni_divider_nor2*5_name', 'Pink Iced bar desk'), + ('nav_venue_habbo_lido_ii/0_desc', 'Dive right in!'), + ('furni_sporttrack2*2_name', 'Sport corner asphalt'), + ('roommatic_modify_size', 'Room size: %tileCount% tiles'), + ('pet.saying.sniff.croco.2', '*Sighs*'), + ('furni_prize2_name', 'Silver Trophy'), + ('Now you can find out how to get more cool Furniture for your room, or select another topic.', ''), + ('pet.saying.sniff.croco.0', 'Ewwwww....'), + ('pet.saying.sniff.croco.1', '*Sniff sniff*'), + ('furni_pura_mdl3*6_name', 'Blue Pura Module 3'), + ('poster_48_desc', 'All that glitters...'), + ('furni_wcandle_desc', 'Xmas tea light'), + ('nav_venue_bb_arena_3_name', 'Battle Ball Keskitaso'), + ('sound_machine_confirm_save_long', 'Are you sure you want to overwrite the current saved song?'), + ('purse_vouchers_helpurl', 'http://%predefined%/help/4'), + ('nav_venue_bouncer_room_2_name', 'Gevorderden Battle Ball Arena'), + ('furni_sand_cstl_gate_desc', 'sand_cstl_gate desc'), + ('furni_barrier*1_name', 'Yellow Maze Barrier'), + ('nav_venue_bb_lobby_tournament_0_name', 'Tournament'), + ('NUF_getting_room_roommatic_layout_tutor', 'Select what you want your room to look like. Use the arrows to cycle through different room layouts. Almost there, almost there...'), + ('poll_confirm_cancel', 'Stop answering?'), + ('furni_carpet_soft*4_desc', 'Soft Wool Rug'), + ('furni_rare_icecream_campaign_desc', 'Basic model'), + ('club_habbo.bottombar.text.notmember', 'Habbo Club'), + ('recycler_info_closed', 'Recycler is closed at the moment. Please check back later to recycle your Furniture.'), + ('furni_solarium_norja*8_desc', 'Rejuvenate your pixels!'), + ('callhelp_example', 'Example: How do I move my Furni?'), + ('furni_bed_budget_one*4_name', 'White Pura Bed'), + ('roomatic_givepwd', 'Password:'), + ('furni_teleport_door_name', 'Teleport Door'), + ('furni_table_silo_small*9_name', 'Red Area Occasional Table'), + ('furni_noob_chair*4_name', 'My first Habbo chair'), + ('furni_table_plasto_square*2_desc', 'Hip plastic furniture'), + ('room_waiting', 'Waiting to go in...'), + ('furni_sink_desc', 'Hot and cold thrown in for no charge'), + ('furni_doormat_plain_name', 'Doormat'), + ('nav_venue_eric\'s_eaterie_name', 'Eric\'s Eaterie'), + ('nav_venue_pizzeria_name', 'Slice of Life'), + ('poster_1004_desc', 'Celebrate with us'), + ('next', 'Next'), + ('furni_solarium_norja*9_name', 'Red Solarium'), + ('tutorial_quit_confirmation', 'You want to leave? Well I hope you learned something... something useful!'), + ('furni_val_teddy*2_desc', 'The pink bear of passion'), + ('poster_1003_name', 'UK Map'), + ('furni_glass_table*2_name', 'Glass table'), + ('NUF_habbo_home_url', 'http://d15-1.web.varoke.net/home/home-tutorial'), + ('furni_bed_silo_one_name', 'Single Bed'), + ('transaction_system_sms_win_btcellnet', 'O2 SMS'), + ('pet.hotwords.go_away', 'go away'), + ('furni_table_plasto_square*9_desc', 'Hip plastic furniture'), + ('furni_doormat_plain*4_name', 'Doormat'), + ('nav_venue_cunning_fox_gamehall_name', 'Cunning Fox Gamehall'), + ('furni_sound_machine*2_name', 'Ocean Traxmachine'), + ('furni_table_polyfon_name', 'Large Coffee Table'), + ('furni_hc_frplc_desc', 'Pixel-powered for maximum heating'), + ('console_request_massoperation_instruction', 'Use the options below to accept or decline ALL friend requests you have waiting.'), + ('nav_venue_bb_lobby_tournament_6/0_desc', ''), + ('furni_table_plasto_round*6_desc', 'Hip plastic furniture'), + ('trading_cancel', 'Cancel Trading'), + ('furni_glass_stool*3_name', 'Glass stool'), + ('furni_plant_mazegate_snow_name', 'Snowy Maze Gate'), + ('nav_venue_tv_studio_name', 'MuchMusic HQ'), + ('furni_table_norja_med*3_desc', 'For larger gatherings'), + ('furni_chair_plasty*8_desc', 'Hip plastic furniture'), + ('furni_bed_polyfon_name', 'Double Bed'), + ('gs_4teams', '4 Team Game'), + ('furni_sound_set_8_desc', 'Mellow electric grooves'), + ('ph_keys_jump', 'Jump:'), + ('reg_welcome', 'Welcome To Habbo Hotel!'), + ('purse_head', 'HABBO ACCOUNT ACTIVITY'), + ('nav_venue_bb_lobby_tournament_7_name', 'Competitie Battle Ball 8'), + ('reg_verification_newPasswordAgain', 'Retype new password:'), + ('furni_bardeskcorner_polyfon*8_desc', 'Yellow Mode Bardesk Corner'), + ('furni_sound_set_21_name', 'Rock 1'), + ('furni_gothic_stool*1_desc', 'The dark side of Habbo'), + ('furni_rope_divider_name', 'Rope Divider'), + ('poster_53_name', 'Hockey Stick'), + ('roomevent_default_desc', 'Event description..'), + ('nav_refresh_recoms', 'Refresh recommendations'), + ('nav_venue_sw_lobby_beginner_2_name', 'Snow Rookies Lobby'), + ('furni_divider_silo3*4_desc', 'Beige Area Gate'), + ('furni_divider_poly3*6_name', 'Blue Mode Bardesk Gate'), + ('reg_parentemail_title', 'Informing your parents'), + ('furni_gothgate_name', 'Gothic Portcullis'), + ('furni_mocchamaster_name', 'Mochamaster'), + ('modtool_message', 'Message:'), + ('furni_tree4_desc', 'Any presents under it yet?'), + ('furni_marquee*a_name', 'White Marquee'), + ('furni_queue_tile1*5_name', 'Knight Roller'), + ('furni_chair_polyfon_name', 'Dining Chair'), + ('furni_sleepingbag*9_name', 'Blue Sleeping Bag'), + ('furni_sound_set_9_name', 'Electronic 2'), + ('poster_39_desc', 'The rock masters of virtual music'), + ('furni_arabian_tetbl_desc', 'Serve up a treat'), + ('nav_venue_sw_lobby_free_9_name', 'Free Game Lobby'), + ('nav_venue_sw_arena_free_name(0)', 'Playing free for all game'), + ('furni_grand_piano*4_desc', 'Why is that key green?'), + ('furni_doorD_desc', 'Let\'s go over tzar!'), + ('purse_date', 'DATE'), + ('nav_venue_sw_lobby_beginner_6/0_desc', ''), + ('nav_venue_sw_lobby_beginner_4/0_desc', ''), + ('nav_venue_sw_lobby_intermediate_1_name', 'Snow Bombardiers Lobby'), + ('alert_reg_age', 'You are under 11 years old. Children under 11 can\'t enter Habbo Hotel.'), + ('nav_venue_bb_lobby_intermediate_9/0_desc', ''), + ('queue_set.c.alert', 'This room is for Habbo Club members only. In order to enter, you need to subscribe to Habbo Club.'), + ('sound_machine_confirm_clear_long', 'Are you sure you want to clear the current song?'), + ('furni_exe_drinks_name', 'Executive Drinks Tray'), + ('reg_bday_note', 'Please enter your correct date of birth, this is important! You\'ll need this information later on, if you want to change your password or e-mail.'), + ('modtool_roomalert', 'Room Alert'), + ('furni_rare_parasol*1_name', 'Yellow Parasol'), + ('furni_sound_set_18_name', 'Groove 4'), + ('sound_machine_window', 'Sound Machine Editor'), + ('furni_traffic_light*1_name', 'Classic Traffic Light'), + ('furni_chair_norja*4_desc', 'Sleek and chic for each cheek'), + ('furni_divider_nor1*2_desc', 'Black Ice corner'), + ('nav_venue_median_lobby_name', 'Median Lobby'), + ('furni_sofa_silo*3_desc', 'Cushioned, understated comfort'), + ('furni_bed_budget_desc', 'Comfortable, affordable!'), + ('furni_divider_nor4_name', 'Plain Iced Auto Shutter'), + ('furni_rare_icecream*6_desc', 'Virtual toffee rocks!'), + ('habboclub_txt1', 'You can buy Habbo Club one month at a time using Habbo Credits.'), + ('habboclub_txt3', 'Yes, I\'m over 14 years of age\\rOR\\rI\'m under 14 years of age and I have a permission from my parent/guardian to join Habbo Club.'), + ('furni_rare_dragonlamp*3_desc', 'Scary and scorching!'), + ('furni_noob_lamp*5_name', 'My first Habbo lamp'), + ('club_bottombar_text2', '(....)'), + ('furni_CFC_500_goldbar_name', 'Gold Bar (China)'), + ('club_bottombar_text1', 'Loading'), + ('furni_rare_elephant_statue*1_desc', 'Say hello to Nelly'), + ('furni_table_silo_med*7_name', 'Green Area Coffee Table'), + ('nav_venue_sw_lobby_free_1/0_desc', ''), + ('furni_bottle_desc', 'For interesting games!'), + ('furni_romantique_pianochair*2_desc', 'Let the music begin'), + ('furni_table_norja_med*2_name', 'Large Coffee Table Black'), + ('queue_set.e2.alert', 'This room is currently available only to Habbos participating to the event.'), + ('furni_solarium_norja_desc', 'Rejuvenate your pixels!'), + ('furni_table_plasto_square*14_desc', 'Hip plastic furniture'), + ('cam_save.help', 'Save & Print Photo'), + ('furni_sound_set_4_desc', 'Chilled out beats'), + ('furni_couch_norja*6_name', 'Blue Bench'), + ('poster_2003_desc', 'Would you trust this man?'), + ('hobba_cryforhelp', 'Call For Help:'), + ('furni_marquee*9_desc', 'It\'s both door and a shade!'), + ('nav_venue_bb_lobby_tournament_13/0_desc', ''), + ('poster_512_desc', 'The flag of Ireland'), + ('handitem12', 'Macchiato'), + ('object_displayer_hide_actions', 'Hide actions'), + ('furni_sound_set_25_name', 'Dance 1'), + ('handitem11', 'Mocha'), + ('handitem10', 'Latte'), + ('furni_sound_set_13_desc', 'Let Music be the food of Habbo'), + ('handitem16', 'Cappuccino'), + ('handitem15', 'Iced'), + ('handitem14', 'Filter'), + ('handitem13', 'Espresso'), + ('nav_venue_sw_lobby_free_2_name', 'Free Game Lobby'), + ('handitem19', 'Habbo Cola'), + ('nav_venue_sw_lobby_amateur_2/0_desc', ''), + ('handitem18', 'Tap'), + ('handitem17', 'Java'), + ('console_next_msg', 'Delete'), + ('furni_bardesk_polyfon*5_name', 'Candy Bar'), + ('furni_scifidoor*5_desc', 'There out of this world!'), + ('nav_roomispwprotected', 'The room is password protected.'), + ('furni_sleepingbag*2_name', 'Lime Sleeping Bag'), + ('furni_glass_table*6_name', 'Blue Glass Table'), + ('furni_divider_nor4*3_desc', 'Habbos, roll out!'), + ('furni_sound_set_61_name', 'Latin Love 3'), + ('nav_venue_pizza/0_desc', 'Pizza Palace'), + ('furni_romantique_clock_desc', ''), + ('furni_queue_tile1*0_desc', 'The power of movement'), + ('furni_pura_mdl2*9_desc', 'Any way you like it!'), + ('nav_venue_orient/0_name', 'Club Golden Dragon'), + ('furni_noob_table*1_desc', 'Lightweight, practical and orange'), + ('poster_22_desc', 'beautiful reproduction butterfly'), + ('furni_carpet_soft_name', 'Soft Wool Rug'), + ('Message', 'Message'), + ('furni_bed_trad_one_desc', 'All you need for a good night\'s kip'), + ('console_report_help', 'If the message you received was abusive or harassing, you can report it to the Moderators by clicking the Report button below. The Habbo will be removed from your Friends\' List automatically when you report. If you want to remove a Habbo from your Friends\' List without reporting their message, simply use the Remove button below.'), + ('furni_rcandle_desc', 'Xmas tea light'), + ('furni_sofa_silo*8_name', 'Yellow Two-Seater Sofa'), + ('furni_pura_mdl4*5_desc', ''), + ('NUF_mini_use_console_ready_tutor', 'You can now use the Console to find some of your friends, or you can continue the tutorial.'), + ('log_problem_link', 'Read FAQ\'s'), + ('furni_shelves_silo_name', 'Bookcase'), + ('gs_timetojoin', '\\x seconds to join'), + ('nav_venue_cunning_fox_gamehall/1_name', 'Gamehall Lobby'), + ('furni_safe_silo*7_name', 'Green Safe Minibar'), + ('NUF_mini_meet_people_hotelview_tutor', 'The Navigator lets you move between rooms in the Hotel. Open it up to get started!'), + ('purse_vouchers_sendbutton', 'Get Credits!'), + ('furni_gothic_sofa*4_name', 'Black Gothic Sofa'), + ('furni_wooden_screen*0_desc', 'Add an exotic touch to your room'), + ('catalog_give_trophymsg', 'You haven\'t engraved the trophy. Type \\ryour inscription in the grey box.'), + ('furni_prizetrophy5*3_name', 'Duo trophy'), + ('handitem23', 'Beetroot Habbo Soda'), + ('furni_rare_dragonlamp*8_name', 'Bronze Dragon Lamp'), + ('furni_divider_nor4*8_name', 'Yellow Iced Auto Shutter'), + ('handitem22', 'Lime Habbo Soda'), + ('furni_soft_sofa_norja*6_name', 'Blue Iced Sofa'), + ('handitem21', 'Hamburger'), + ('handitem20', 'Camera'), + ('furni_divider_nor1*9_desc', 'Red Ice corner'), + ('help_trouble', 'In Trouble?'), + ('handitem25', 'Love potion'), + ('handitem24', 'Bubble juice from 1999'), + ('furni_ham2_desc', 'Looks like you\'re too late!'), + ('nav_venue_bb_lobby_amateur_3_name', 'Gevorderden Battle Ball 4'), + ('furni_chair_plasto*15_name', 'Chair'), + ('furni_hyacinth1_desc', 'Beautiful bulb'), + ('furni_shelves_basic_desc', 'Pura series 404 shelves'), + ('furni_pura_mdl1*6_name', 'Blue Pura Module 1'), + ('nav_venue_cafe_gold/0_desc', 'Get the latest safety tips and tricks from Safety eXperts.'), + ('nav_venue_snowwar_lobby_name', 'Snow Storm Lobby'), + ('transaction_system_sms_slahti', 'Saunalahti'), + ('alert_tooLongPW', 'Your password is too long'), + ('furni_carpet_standard*5_desc', 'Available in a variety of colours'), + ('furni_deadduck_desc', 'Blood, but no guts'), + ('password.email.subject', 'Forgotten password'), + ('furni_prizetrophy2*3_desc', 'Breathtaking bronze'), + ('NUF_playing_games_hotelview_nav', 'Just click me to open the Navigator and get it over with...'), + ('furni_summer_chair*1_name', 'Aqua Deck Chair'), + ('furni_rubberchair*3_name', 'Orange Inflatable Chair'), + ('furni_exe_plant_desc', ''), + ('nav_venue_tearoom/0_desc', 'Chat with the people of Aoralia and meet a sprite or two!'), + ('nav_venue_sw_lobby_beginner_9/0_desc', ''), + ('furni_table_silo_med*6_name', 'Blue Area Coffee Table'), + ('nav_venue_sw_lobby_beginner_1/0_desc', ''), + ('furni_noob_stool*2_desc', 'Unfold me and take the weight off (dark blue)'), + ('camera_dialog_place', 'Move'), + ('furni_scifiport*8_desc', 'Energy beams. No trespassers!'), + ('url_peeloscore', 'http://%predefined%///groups/56555/id'), + ('console_follow_friend', 'Go to same room'), + ('sound_machine_alert_jukebox_list_full', 'The play list is full. Please wait until the current song has finished playing and try again.'), + ('poster_517_desc', 'Where\'s your kilt?'), + ('roomevent_type_11', 'Helpdesk'), + ('roomevent_type_10', 'Performance'), + ('furni_rare_dragonlamp*9_desc', 'Scary and scorching!'), + ('furni_pura_mdl2*3_name', 'Black Pura Module 2'), + ('url_help_1', 'http://%predefined%//credits'), + ('furni_edicehc_name', 'Dicemaster'), + ('furni_divider_silo1*8_name', 'Yellow Corner Shelf'), + ('furni_wooden_screen*5_desc', 'Add an exotic touch to your room'), + ('url_help_5', 'http://%predefined%/help/75'), + ('roomatic_intro2', 'Here\'s what one Habbo says about her room:'), + ('url_help_4', 'http://%predefined%//help/22'), + ('roomatic_intro1', 'You can decorate and furnish your room however you like and no one can tell you to tidy up or turn the music down. It\'s up to you if you let everyone in or just a chosen few, or lock the door and chill by yourself. Get creating and in a couple of minutes you\'ll have your own Habbo Hotel space.'), + ('url_help_3', 'http://%predefined%//help/'), + ('roomatic_intro3', 'My mates live miles away, but we can meet up in my room every Friday night and we don\'t have to worry about getting home afterwards.'), + ('url_help_2', 'http://%predefined%//profile?tab=4'), + ('furni_romantique_chair*5_name', 'Onyx Chair'), + ('url_help_6', 'http://www.habbohotel.co.uk/iot/go?lang=en&country=uk'), + ('furni_sound_set_20_name', 'SFX 2'), + ('furni_sofa_polyfon*4_desc', 'Beige Mode Sofa'), + ('sound_machine_alert_no_more_songs', 'Can\'t create new song! Traxmachine can have only %count% songs.'), + ('search', 'Search'), + ('room_preparing', '...Preparing room'), + ('nav_venue_bb_lobby_intermediate_0/0_desc', ''), + ('club_txt_renew2', 'You are Habbo Club member. If you want to change your subscription or leave the club, use the link below.'), + ('poster_1002_name', 'Queen Mum Poster'), + ('furni_barchair_silo*2_desc', 'Practical and convenient'), + ('reg_month', 'Month'), + ('club_txt_renew1', 'Your Habbo Club membership will be active for another %days% days. You can extend your membership by paying with Habbo Credits.'), + ('furni_rare_icecream*0_name', 'Cherry Ice Cream Machine'), + ('furni_sound_set_41_desc', 'Burning Riffs'), + ('nav_venue_beauty_salon_loreal_name', 'Beauty salon'), + ('poster_26_name', 'Angel Poster'), + ('furni_sound_set_19_name', 'Hip Hop Beats 4'), + ('furni_romantique_divan*4_name', 'Amber Chaise-Longue'), + ('furni_one_way_door*7_desc', 'One at a time!'), + ('sound_machine_confirm_eject_long', 'Are you sure you want to remove the Traxpack and it\'s samples from the song?'), + ('furni_glass_stool*8_desc', 'Translucent beauty'), + ('buddyremove_not_now', 'Cancel'), + ('no_user_for_gift', 'No user named %user% found. Gift not purchased.'), + ('buddyremove_lessoptions', 'Less Options <<'), + ('reg_legal_header1', 'Now you need to ask your parents/guardian to come to the computer. Read through the text (below) with your parents.'), + ('furni_carpet_soft*3_desc', 'Soft Wool Rug'), + ('reg_legal_header2', 'Read through the below text carefully. You must agree to the following terms before entering Habbo Hotel.'), + ('furni_sw_chest_name', 'sw_chest'), + ('nav_venue_sw_lobby_tournament_9_name', 'Tournament Lobby'), + ('messenger.email.footer', ''), + ('nav_venue_bb_arena_4_name', 'Battle Ball Expertit'), + ('club_change_url', 'http://%predefined%//credits/habboclub'), + ('furni_table_plasto_4leg*2_name', 'Occasional Table'), + ('ph_choosecolour', 'Choose Costume Colour'), + ('buddyremove_hc_more_info', 'More Info About Habbo Club >>'), + ('furni_romantique_smalltabl*1_desc', 'Every tray needs a table...'), + ('nav_venue_sw_lobby_tournament_8_name', 'Tournament Lobby'), + ('furni_divider_nor5_name', 'Plain Iced Angle'), + ('wallitem_roomdimmer_name', 'Mood Light'), + ('furni_bed_budget_one*5_name', 'Beige Pura Bed'), + ('furni_table_norja_med*9_name', 'Large Coffee Table Red'), + ('furni_pillow*3_desc', 'Puffy, soft and huge'), + ('furni_noob_rug*2_name', 'My first Habbo rug'), + ('nav_venue_sw_lobby_beginner_7_name', 'Snow Rookies Lobby'), + ('furni_exe_chair_desc', 'Relaxing leather comfort'), + ('furni_s_sound_machine*2_desc', 'Sound Machine Ocean Desc'), + ('nav_venue_dusty_lounge/0_desc', 'A dignified lounge for sitting back and enjoying a licorice pipe'), + ('game_bs_ship4', 'Destroyer(s)'), + ('game_bs_ship3', 'Cruiser(s)'), + ('game_bs_ship2', 'Battle Ship(s)'), + ('game_bs_ship1', 'An aircraft carrier'), + ('furni_table_plasto_bigsquare*4_name', 'Square Dining Table'), + ('openhrs_title', 'We are closing the hotel'), + ('furni_habbowood_chair_name', 'Director\'s Chair'), + ('roomatic_confirm', 'Confirm password:'), + ('poster_14_desc', 'A cunning painting'), + ('furni_doormat_plain*3_name', 'Doormat'), + ('furni_sound_set_3_desc', 'Chilled grooves'), + ('win_messenger', 'Habbo Console'), + ('summer_chair_7_name', 'Green Deck Chair'), + ('notickets_window_header', 'Tickets needed!'), + ('nav_updatenote', 'Updating your room properties may take a while. The changes have been made, but it\'ll take a few minutes until all Habbos can see them.'), + ('furni_table_plasto_bigsquare*5_name', 'Square Dining Table'), + ('url_purselink', 'http://%predefined%//credits?'), + ('console_follow_hotelview', 'Your friend is on the hotel view.'), + ('furni_solarium_norja*3_desc', 'Get the city look!'), + ('sound_machine_alert_song_name_missing', 'Please give your song a name.'), + ('furni_sound_machine*3_name', 'Green Traxmachine'), + ('jukebox_next_up', 'Next up:'), + ('trading_additems', 'Put items in boxes'), + ('furni_sporttrack3*1_name', 'Sport goal tartan'), + ('club_button_3_period', 'Buy 6 >>>'), + ('nav_delroom3', 'Room deleted!'), + ('nav_delroom2', 'Are you sure you want to delete this room? All the furniture left in it will also be deleted.'), + ('poster_34_name', 'Scamme\'d'), + ('go', 'Go >>'), + ('nav_delroom1', 'If you want to save the furniture in this room, move it to the giant hand before you continue.'), + ('console_habboprofile_arrowed', 'Habbo Profile >>'), + ('furni_chair_plasty*10_desc', 'Hip plastic furniture'), + ('cam_txtscreen.help', 'Caption'), + ('wallitem_item_placeholder_name', 'This furniture is downloading...'), + ('furni_carpet_standard*b_desc', 'Available in a variety of colours'), + ('poster_59_name', 'Torch'), + ('furni_chair_basic*4_name', 'White Pura Egg Chair'), + ('summer_chair_1_name', 'Aquamarine Deck Chair'), + ('nav_venue_space_cafe_name', 'Ten Forward'), + ('log_problem_url', 'http://%predefined%//help/faqs?faq_1_categoryId=14'), + ('group_homepage_url', 'http://%predefined%/groups/%groupid%/id'), + ('furni_heart_name', 'Giant Heart'), + ('nav_venue_sw_arena_beginner_name', 'Playing beginner game'), + ('furni_grunge_chair_name', 'Grunge Chair'), + ('nav_dooropens', 'Door opens! Go on in...'), + ('modtool_banuser', 'Ban User'), + ('furni_carpet_soft_tut_desc', 'Welcome, enjoy your stay!'), + ('furni_rare_mnstr_name', 'Venomus Habbolus'), + ('furni_divider_silo3*9_name', 'Red Area Gate'), + ('furni_pura_mdl3*1_name', 'Aqua Pura Module 3'), + ('Messages', 'Message(s)'), + ('wallitem_arabian_wndw_name', 'Arabian Window Frame'), + ('furni_prizetrophy3*1_desc', 'Glittery gold'), + ('furni_sound_set_47_desc', 'Storm the UKCharts!'), + ('poster_54_desc', 'whack that ball!'), + ('url_logout_concurrent', 'http://%predefined%//account/disconnected?reason=concurrentlogin&origin=popup'), + ('nav_venue_sw_lobby_beginner_1_name', 'Snow Rookies Lobby'), + ('furni_table_plasto_4leg*8_name', 'Occasional Table'), + ('sound_machine_turn_on', 'Switch On'), + ('furni_table_norja_med*4_desc', 'For larger gatherings'), + ('buddyremove_hc_info_url', 'http://www.habbo.co.uk/credits/habboclub'), + ('furni_romantique_divider*2_name', 'Green Screen'), + ('furni_pillar*5_desc', 'Find your natural roots'), + ('furni_table_silo_med_desc', 'Wipe clean and unobtrusive'), + ('furni_pillow*8_name', 'Navy Cord Pillow'), + ('room_owner', 'Owner:'), + ('furni_shelves_norja*5_name', 'Pink Bookcase'), + ('queue_set.d.info', 'There are %d% Habbos in front of you in the queue.'), + ('reg_retypepass', 'Retype Password:'), + ('furni_jp_tray3_name', 'jp_tray3'), + ('dance_stop', 'Stop Dancing'), + ('buddyremove_remove_text', 'You are about to remove %removeamount% friends from your friendlist.\\r\\r After removal, you\'ll have %amountleft% friends on your list:'), + ('nav_venue_bb_lobby_tournament_12_name', 'Competitie Battle Ball 13'), + ('furni_summer_chair*2_name', 'Deck Chair'), + ('furni_plant_valentinerose*1_desc', 'Secret admirer!'), + ('furni_sofachair_silo*4_name', 'Beige Area Armchair'), + ('poster_523_name', 'The flag of India'), + ('furni_scifirocket*4_name', 'Venus Smoke Machine'), + ('nav_venue_tearoom_name', 'Chinese Tea Room'), + ('furni_pura_mdl1*5_name', 'beige pura module 1'), + ('nav_venue_bb_lobby_tournament_0/0_desc', ''), + ('furni_chair_silo*5_desc', 'Pink Silo Dining Chair'), + ('club_txt_expired', 'Your Habbo Club membership has run out. You can join the club again by clicking the HC logo on the hotel view.\\rMembers of Habbo Club get priority access to the hotel (so you can always get in), exclusive clothes, hair colours, rare furni and special guest room layouts. To see exactly what you\'ll be able to get your hands on as a Habbo Club member, take a look in the Catalogue.'), + ('furni_glass_table*7_name', 'Green Glass Table'), + ('nav_prvrooms_notfound', 'Your search did not match any rooms'), + ('bb_title_BBscores2', 'Game over!'), + ('wallitem_gothicfountain_name', 'Gothic Ectoplasm Fountain'), + ('furni_one_way_door*1_desc', 'One at a time!'), + ('furni_chair_plasty*1_name', 'Plastic Pod Chair'), + ('furni_divider_nor3*9_name', 'Red Iced gate'), + ('sound_machine_time_2', '%min%:%sec%min'), + ('sound_machine_time_1', '%min%:%sec%min'), + ('furni_bardesk_polyfon*4_name', 'Beige Mode Bardesk'), + ('queue_set.queue_reset.alert', 'The queue for this room has been reset, please try again.'), + ('furni_jp_pillow_desc', 'Comfy and classical'), + ('nav_venue_sw_lobby_free_9/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('furni_barchair_silo*8_desc', 'Practical and convenient'), + ('delete_furniture', 'Delete Furniture (permanently)'), + ('furni_plant_bulrush_desc', 'Ideal for the riverside'), + ('poster_61_name', 'Siva Poster'), + ('furni_bed_silo_two_name', 'Double Bed'), + ('furni_plant_pineapple_desc', 'Needs loving glances'), + ('furni_bed_polyfon_girl_desc', 'Snuggle down in princess pink'), + ('furni_pillow*4_desc', 'Puffy, soft and huge'), + ('furni_table_norja_med*8_name', 'Large Coffee Table Yellow'), + ('transaction_system_tsms_win_tmobile', 'T-Mobile SMS'), + ('furni_scifidoor*10_desc', 'There out of this world!'), + ('furni_bed_polyfon*7_desc', 'Green Mode Double Bed'), + ('furni_toy1*2_desc', 'it\'s bouncy-tastic'), + ('transaction_system_sms_radiolinja', 'Elisa'), + ('furni_gothic_chair*4_name', 'Black Gothic Chair'), + ('furni_scifidoor*6_desc', 'Monolith goes up! Monolith goes down!'), + ('nav_venue_sw_lobby_free_3_name', 'Free Game Lobby'), + ('console_friend_request_not_found', 'There was an error finding the user for the friend request'), + ('furni_romantique_smalltabl*2_desc', 'Every tray needs a table...'), + ('furni_bed_budget*2_name', 'Pink Pura Double Bed'), + ('wallitem_post.it_name', 'Pad of stickies'), + ('gs_state_created', 'Waiting for players..'), + ('furni_divider_nor3*4_desc', 'Entrance or exit?'), + ('furni_sofa_polyfon_girl_desc', 'Romantic pink for two'), + ('locked', 'Locked (visitors have to ring bell)'), + ('alert_reg_birthday', 'Birthday'), + ('club_thanks_text', 'Here you can see your Habbo Club membership status, number of elapsed months, pre-ordered months and status of the ongoing month.'), + ('furni_sound_set_39_desc', 'Rock with a roll'), + ('nav_venue_old_skool/0_desc', 'A set of rooms inspired by the original and legendary Mobiles Disco, the progenitor of Habbo'), + ('poster_511_desc', 'The flag of The Netherlands'), + ('furni_couch_norja*7_name', 'Rural Iced Bench'), + ('furni_safe_silo*6_name', 'Blue Safe Minibar'), + ('furni_table_plasto_4leg*14_desc', 'Aqua table'), + ('room_sound_furni_limit', 'You can only place one sound furni per room'), + ('nav_venue_bb_lobby_beginner_15/0_desc', ''), + ('furni_glass_shelf_name', 'Glass shelf'), + ('furni_divider_nor2*6_desc', 'Blue Iced bar desk'), + ('furni_turkey_name', 'Roast Turkey'), + ('nav_venue_bb_lobby_tournament_16/0_desc', ''), + ('sw_timeleft', 'Time:'), + ('furni_rare_parasol_name', 'Parasol'), + ('furni_glass_sofa*7_desc', 'Habbo Club'), + ('furni_bardeskcorner_polyfon*13_name', 'Corner Cabinet/Desk'), + ('furni_rare_fan*9_name', 'Fucsia Powered Fan'), + ('furni_chair_plasto*4_desc', 'Hip plastic furniture'), + ('no', 'No'), + ('furni_rare_fan*4_desc', 'Fanning the fires of SUPERLOVE...'), + ('nav_venue_median_lobby/0_desc', 'A Mean place to hang'), + ('nav_venue_sw_lobby_intermediate_2/0_desc', ''), + ('furni_md_sofa_name', 'MD Sofa'), + ('furni_noob_lamp*1_desc', 'Get the light right where you want it (yellow)'), + ('login_connecting', 'Connecting...'), + ('furni_divider_nor1*3_desc', 'Looks squishy, but isn\'t!'), + ('furni_sound_set_14_desc', 'Rock them bodies'), + ('furni_sound_set_59_name', 'RnB Grooves 5'), + ('poster_21_desc', 'beautiful reproduction butterfly'), + ('wallitem_hc_wall_lamp_desc', 'Tres chic!'), + ('ok', 'OK'), + ('nav_venue_sw_lobby_tournament_1/0_desc', ''), + ('pet_happy', 'Happiness:'), + ('sound_machine_edit', 'Edit Song'), + ('furni_rare_elephant_statue*2_desc', 'Say hello to Nelly'), + ('furni_CFC_200_moneybag_desc', 'Worth 200 Credits'), + ('nav_venue_bb_lobby_intermediate_6/0_desc', ''), + ('console_buddylimit_requester', 'Friend could not be added. The request sender can not have anymore friends.'), + ('furni_sofa_silo*2_desc', 'Cushioned, understated comfort'), + ('sound_machine_alert_invalid_song_name', 'You have already burned another song with the same name. Please change the song name before trying again.'), + ('furni_fireplace_armas_name', 'Fireplace'), + ('furni_barchair_silo*3_desc', 'Practical and convenient'), + ('ph_ticket', 'Ticket'), + ('furni_arabian_divdr_desc', 'Carved Cedar Divider'), + ('wallitem_jp_ninjastars_desc', 'Not a frisbee'), + ('wallitem_hrella_poster_1_desc', 'Brighten up your cabin'), + ('furni_noob_stool*3_desc', 'Unfold me and take the weight off (aubergine)'), + ('furni_pura_mdl5*9_name', 'Red Pura Module 5'), + ('furni_divider_nor4*2_desc', 'Habbos, roll out!'), + ('NUF_mini_meet_people_roomlist_tutor', 'Click \'Open\' to open up a category and see what rooms are within. When you have found an interesting room, press \'Go\' to visit it.'), + ('poster_41_name', 'Habbo Golden Record'), + ('furni_jp_tray4_desc', 'jp_tray4'), + ('buddyremove_confirm', 'Yeah, it is done...'), + ('tutorial_topic_list_F', 'Choose a topic from the list below:'), + ('purse_time', 'TIME'), + ('nav_venue_sw_lobby_free_8_name', 'Free Game Lobby'), + ('tutorial_topic_list_M', 'Choose a topic from the list below:'), + ('furni_s_sound_machine*7_name', 'Sound Machine Red'), + ('interface_icon_navigator', 'Navigator, navigate around'), + ('furni_xmas_cstl_wall_name', 'Ice Castle Wall'), + ('nav_own_hd', 'Your Rooms.'), + ('modtool_aa_checkbox_text', 'Audio alert'), + ('wallitem_industrialfan_desc', 'Powerful and resilient'), + ('furni_bed_budget*8_desc', 'King sized comfort!'), + ('sound_machine_burn', 'Burn Song'), + ('nav_venue_sw_lobby_intermediate_0_name', 'Snow Bombardiers Lobby'), + ('nav_venue_bb_lobby_beginner_1_name', 'Beginners Battle Ball 2'), + ('furni_chair_basic*5_desc', ''), + ('password.email.prefix', 'Your password is:'), + ('furni_pura_mdl5*4_desc', 'Any way you like it!'), + ('furni_table_norja_med*3_name', 'White Iced Table'), + ('furni_pura_mdl3*2_desc', 'Any way you like it!'), + ('nav_venue_sw_lobby_tournament_3_name', 'Tournament Lobby'), + ('furni_sound_set_34_desc', 'For guitar heroes'), + ('furni_summer_grill*1_desc', 'Plenty of ribs on that barbie'), + ('hubu_t4_1', 'Anna palautetta Hubusta'), + ('furni_divider_nor1*8_desc', 'Yellow Ice corner'), + ('hubu_t4_2', 'Tsekkaa heebelin jorinat'), + ('poll_offer_title', 'Poll'), + ('summer_chair_2_desc', 'Leave your towel early'), + ('wallitem_habbowheel_name', 'The Wheel of Destiny!'), + ('reg_mission', 'Your Mission:'), + ('furni_sofa_polyfon*9_name', 'Red Two-seater Sofa'), + ('furni_bed_budget_one_desc', 'aquamarine'), + ('nav_venue_sw_lobby_tournament_7/0_desc', ''), + ('furni_gothic_sofa*3_name', 'Gothic Sofa Red'), + ('furni_chair_plasto*9_name', 'Chair'), + ('nav_venue_sw_arena_beginner_name(0)', 'Playing beginner game'), + ('notickets_text_2', 'Buy more tickets now and get a discount. You can also buy tickets as a present.'), + ('wallitem_sw_hole_desc', 'sw_hole'), + ('furni_plant_big_cactus_name', 'Mature Cactus'), + ('notickets_text_1', 'Game price is 1 credit. For that you get 2 tickets.'), + ('poster_19_name', 'Hole In The Wall'), + ('furni_divider_nor4*7_name', 'Rural Iced Shutter'), + ('email', ''), + ('furni_sound_set_13_name', 'Dance 5'), + ('furni_present_gen1_name', 'Gift'), + ('nav_venue_bb_lobby_tournament_19/0_desc', ''), + ('furni_chair_norja_desc', 'Sleek and chic for each cheek'), + ('furni_marquee*9_name', 'Green Marquee'), + ('sound_machine_alert_song_locked', 'The song you\'re editing can\'t be modified. Please save the song under another name to create a new copy.'), + ('furni_glass_stool*2_name', 'Glass stool'), + ('nav_venue_theatredrome_xmas/0_desc', ''), + ('poster_5_name', 'Duck Poster'), + ('furni_prize2_desc', 'Nice and shiny'), + ('furni_valeduck_desc', 'He\'s lovestruck'), + ('furni_chair_plasty*7_desc', 'Hip plastic furniture'), + ('closed', 'Closed'), + ('furni_wcandleset_name', 'White Candle Plate'), + ('furni_sleepingbag*3_name', 'Ocean Sleeping Bag'), + ('furni_tree3_name', 'Christmas Tree 1'), + ('furni_sound_set_26_name', 'Groove 1'), + ('furni_barrier*2_desc', 'No trespassing, please!'), + ('game_bs_turn1', 'Your Turn'), + ('nav_venue_bb_lobby_expert_desc', 'Expert battle ball!'), + ('alert_donate_topic', 'SCAM ALERT!'), + ('game_bs_turn2', 'The Enemy\'s Turn'), + ('furni_sand_cstl_gate_name', 'sand castle gate'), + ('furni_rare_dragonlamp*4_desc', 'Scary and scorching!'), + ('furni_camera_desc', 'Smile!'), + ('pet.hotwords.lie', 'lie down'), + ('furni_sound_set_60_name', 'Latin Love 2'), + ('console_accept_selected', 'Accept'), + ('furni_divider_silo1*3_desc', 'Neat and natty'), + ('furni_summer_chair*7_name', 'Green Deck Chair'), + ('furni_pumpkin_desc', 'Cast a spooky glow'), + ('reg_habboname_note', 'Now it\'s time to make your own Habbo character! To make your own Habbo, please start by choosing your Habbo Name.'), + ('furni_rare_icecream_campaign_name', 'Rare icecream white'), + ('furni_doormat_plain_desc', 'Available in a variety of colours'), + ('room_areYouSure', 'Are you sure you want to delete this item forever?'), + ('sound_machine_confirm_burn', 'Burn this song?'), + ('predefined_room_name', '%user_name%\'s room'), + ('furni_divider_silo1*2_name', 'Black Corner Shelf'), + ('furni_table_plasto_4leg*3_desc', 'Hip plastic furniture'), + ('furni_solarium_norja*8_name', 'Yellow Solarium'), + ('furni_exe_globe_desc', 'The power is yours!'), + ('furni_bed_polyfon*6_name', 'Blue Mode Double Bed'), + ('notickets_store_link', 'Go to ticket store >>>'), + ('NUF_habbo_home', 'Habbo Home'), + ('nav_venue_the_den_name', 'The Den'), + ('furni_table_plasto_square*2_name', 'Round Dining Table'), + ('modtool_header', 'The Tool'), + ('pet_enrg_7', 'Energetic'), + ('nav_noanswer', 'No answer'), + ('roommatic_hc_members_only', 'This Room Is For HC Members Only'), + ('furni_xmasduck_desc', 'A right Christmas quacker!'), + ('pet_enrg_8', 'Lively'), + ('NUF_getting_room_own_rooms_tutor', 'Click the \'Create own room\' button to start building your room. Don\'t worry, making your room is completely free.'), + ('pet_enrg_5', 'Sprightly'), + ('pet_enrg_6', 'Active'), + ('furni_doormat_plain*4_desc', 'Available in a variety of colours'), + ('pet_enrg_3', 'Lazy'), + ('pet_enrg_4', 'Relaxed'), + ('furni_divider_poly3*6_desc', 'Blue Mode Bardesk Gate'), + ('pet_enrg_1', 'Slow'), + ('furni_glass_table*2_desc', 'Translucent beauty'), + ('pet_enrg_2', 'Sluggish'), + ('poster_1003_desc', 'get the lovely isles on your walls'), + ('furni_hc_djset_name', 'The Grammophon'), + ('pet_enrg_9', 'Tireless'), + ('furni_table_plasto_round*6_name', 'Round Dining Table'), + ('furni_sporttrack2*3_name', 'Sport corner grass'), + ('furni_footylamp_name', 'Football Lamp'), + ('furni_bed_silo_one_desc', 'Plain and simple'), + ('pet_enrg_0', 'Tired'), + ('furni_soft_sofachair_norja*7_name', 'Rural Iced Sofachair'), + ('furni_solarium_norja*9_desc', 'Rejuvenate your pixels!'), + ('furni_pillow*9_desc', 'Puffy, soft and VERY fluffy!'), + ('furni_plant_mazegate_snow_desc', 'There\'s snow way through!'), + ('furni_sound_set_8_name', 'Ambient 2'), + ('furni_divider_silo3*4_name', 'Beige Area Gate'), + ('previous', 'Previous'), + ('furni_glass_stool*3_desc', 'Translucent beauty'), + ('furni_bardeskcorner_polyfon*8_name', 'Yellow Mode Bardesk Corner'), + ('next_onearrowed', 'Next >'), + ('nav_venue_sw_lobby_expert_desc', 'For the William Tells and Robin Hoods of Snow Storming.'), + ('furni_bardeskcorner_polyfon*2_name', 'Black Mode Bardesk Corner'), + ('catalog_pet_unacceptable', 'Sorry, that name is unacceptable to Hotel Management'), + ('furni_sound_set_46_name', 'Club 1'), + ('nav_error_room_full', 'The room is full.'), + ('furni_queue_tile1*4_name', 'Gold Habbo Roller'), + ('furni_mocchamaster_desc', 'Wake up and smell it!'), + ('furni_gothic_stool*1_name', 'Gothic Stool Pink'), + ('furni_noob_chair*5_name', 'My first Habbo chair'), + ('furni_noob_rug*3_desc', 'Nice and neat sisal rug with aubergine edging'), + ('nav_venue_club_mammoth/0_name', 'Club Mammoth'), + ('pet_race_1_024', 'Cat Burglar'), + ('pet_race_1_022', 'Matted Moggy'), + ('poster_39_name', 'Screaming Furnies'), + ('pet_race_1_023', 'Indoor Alley Cat'), + ('furni_prizetrophy5*3_desc', 'Breathtaking bronze'), + ('pet_race_1_020', 'Caterwaul Kitty'), + ('NUF_mini_meet_people_room_tutor', 'The people wandering around are Habbos just like you.\\nClick on one of them to learn more about them- or on yourself to look in the mirror.'), + ('pet_race_1_021', 'Fabulous Feline'), + ('furni_arabian_tetbl_name', 'Hexagonal Tea Table'), + ('furni_grand_piano*4_name', 'Amber Grand Piano'), + ('poster_504_desc', 'The German flag'), + ('roomatic_name', 'Room name:'), + ('furni_sound_set_21_desc', 'Headbanging riffs'), + ('credit_redeem_info', 'More info about credit furni >>'), + ('furni_marquee*a_desc', 'It\'s both door and a shade!'), + ('furni_sound_set_33_name', 'Rock 3'), + ('furni_queue_tile1*5_desc', 'The power of movement'), + ('furni_doorD_name', 'Imperial Teleport'), + ('furni_rare_parasol*1_desc', 'Block those rays!'), + ('purse_youhave', 'You Have'), + ('nav_fullbutton', 'Full'), + ('furni_rare_fountain*2_desc', 'For our feathered friends'), + ('friend_request_accepted', 'Accepted!'), + ('tutorial_help_button_bubble', 'Click the blue question mark to open up the help menu to restart the tutorial.'), + ('furni_rubberchair*4_desc', 'Soft and tearproof!'), + ('furni_sound_set_9_desc', 'Mystical ambient soundscapes'), + ('furni_rare_fan*3_name', 'Purple Dragon Skin Fan'), + ('furni_table_plasto_square*8_desc', 'Hip plastic furniture'), + ('gs_choose_gametime', 'Choose Game duration:'), + ('furni_traffic_light*1_desc', 'Chill and wait your turn!'), + ('furni_sofachair_polyfon*6_desc', 'Blue Mode Armchair'), + ('furni_chair_norja*4_name', 'Urban Iced Chair'), + ('furni_val_teddy*2_name', 'Pink Share Bear'), + ('nav_venue_chill/0_name', 'Zen Garden'), + ('furni_table_plasto_square_name', 'Occasional Table'), + ('furni_bed_budget_name', 'Pura Bed'), + ('furni_solarium_norja_name', 'White Solarium'), + ('furni_noob_table*1_name', 'My first Habbo table'), + ('gs_5min', '5min'), + ('purse_credits', 'You have \\x1 Habbo Credit(s) in your purse.'), + ('furni_divider_poly3*5_name', 'Candy Hatch (Lockable)'), + ('furni_rare_icecream*6_name', 'Toffee Ice Cream Machine'), + ('furni_table_polyfon_med_name', 'Large Coffee Table'), + ('console_deselect_all', 'Deselect all'), + ('nav_venue_bb_lobby_amateur_8_name', 'Gevorderden Battle Ball 9'), + ('transaction_system_sms_win_kpn', 'KPN SMS'), + ('nav_venue_bb_lobby_intermediate_3/0_desc', ''), + ('furni_CFC_500_goldbar_desc', 'Worth 500 Credits'), + ('NUF_visiting_rooms', 'Visiting other players\' rooms'), + ('url_logout_timeout', 'http://%predefined%//account/disconnected?reason=logout'), + ('furni_table_silo_med*7_desc', 'Green Area Coffee Table'), + ('player_commands_no_args', 'You have not supplied any arguments!'), + ('furni_romantique_pianochair*2_name', 'Lime Romantique Piano Chair'), + ('pickup', 'Pick up'), + ('reg_tutorial_url', ''), + ('habboclub_confirm_body', 'You have %credits% credits'), + ('nav_venue_bb_lobby_beginner_12/0_desc', ''), + ('furni_rare_elephant_statue*1_name', 'Silver Elephant'), + ('help', 'Habbo Help'), + ('furni_soft_sofachair_norja*2_desc', 'Black Iced Sofachair'), + ('furni_table_plasto_round*1_desc', 'Hip plastic furniture'), + ('furni_sleepingbag*9_desc', 'Ultimate coziness'), + ('furni_arabian_tray2_desc', 'For those Arabian nights'), + ('NUF_visiting_rooms_hotelview_tutor', 'Hello. This time we are learning how to visit another user\'s room.'), + ('furni_traffic_light*6_name', 'Red Traffic Light'), + ('Alert_ChooseWhoToSentMessage', 'Please choose who to\\rsend your message to'), + ('poster_47_desc', 'Twinkle, twinkle'), + ('bb_title_finalScores', 'Final standings:'), + ('jukebox_song_author', 'by: %author%'), + ('poster_2003_name', 'Dodgy Geezer'), + ('poster_509_name', 'The Jamaican flag'), + ('poster_6_desc', 'But is it the right way up?'), + ('furni_toy1*1_name', 'Rubber Ball'), + ('nav_venue_bb_lobby_beginner_13_name', 'Beginners Battle Ball 14'), + ('furni_scifidoor*5_name', 'White Spaceship Door'), + ('credit_redeem_text', 'You are going to change Furni to %value% credits.'), + ('nav_venue_sw_lobby_amateur_0_name', 'Snow Slingers Lobby'), + ('club_txt_intro', 'Welcome to Habbo Club - the members only club that all the best Habbos belong to!\\r\\rMembers of Habbo Club get priority access to the hotel (so you can always get in), exclusive clothes, hair colours, rare furni and special guest room layouts. To see exactly what you\'ll be able to get your hands on as a Habbo Club member, take a look in the Catalogue.'), + ('nav_venue_bouncer_room_1_name', 'Beginners Battle Ball Arena'), + ('update_email_suggest', 'Habbo Hotel security supervisor requests you to update your email'), + ('furni_rare_dragonlamp*3_name', 'Silver Dragon Lamp'), + ('furni_scifiport*2_name', 'Blue Laser Gate'), + ('club_button_extend', 'Extend Membership'), + ('wallitem_val_heart_name', 'Heart Light'), + ('furni_pura_mdl3*7_name', 'Green Pura Module 3'), + ('furni_sound_set_61_desc', 'Straight from the heart'), + ('nav_venue_bb_lobby_expert_9/0_desc', ''), + ('furni_pura_mdl2*9_name', 'Red Pura Module 2'), + ('furni_hal_cauldron_name', 'Habboween Cauldron'), + ('furni_divider_nor1*2_name', 'Black Ice corner'), + ('send', 'Send'), + ('furni_couch_norja_desc', 'Two can perch comfortably'), + ('furni_pura_mdl4*5_name', 'beige pura module 4'), + ('pet_race_1_008', 'Mad Mouser'), + ('pet_race_1_009', 'Scaredy Kat'), + ('pet_race_1_006', 'Titchy Tiger'), + ('pet_race_1_007', 'Burmese Buddy'), + ('pet_race_1_004', 'Soft-Toed Sneaker'), + ('furni_divider_nor4*8_desc', 'Habbos, roll out!'), + ('furni_tile_desc', 'In a choice of colours'), + ('pet_race_1_005', 'Cat Astroflea'), + ('pet_race_1_002', 'Lesser Spotted Longhair'), + ('pet_race_1_003', 'Hidden Clause'), + ('pet_race_1_000', 'Sleepy Siamese'), + ('pet_race_1_001', 'Purr-Sian'), + ('furni_sound_set_53_name', 'Snowy Surprise'), + ('furni_rare_icecream*1_desc', 'Virtual blueberry rocks!'), + ('furni_table_plasto_round*15_name', 'Occasional Table'), + ('security', 'Security'), + ('furni_glass_chair*5_name', 'Glass chair'), + ('nav_venue_cunning_fox_gamehall/1_desc', 'It\'s one-on-one for five in a row'), + ('nav_venue_sw_lobby_tournament_4/0_desc', ''), + ('furni_carpet_soft_desc', 'Soft Wool Rug'), + ('poster_27_desc', 'Deck the halls!'), + ('furni_safe_silo*7_desc', 'Totally shatter-proof!'), + ('furni_table_silo_small*5_desc', 'Pink Area Occasional Table'), + ('furni_marquee*4_desc', 'It\'s both door and a shade!'), + ('furni_gothic_sofa*4_desc', 'Ghosts and Ghouls'), + ('furni_prizetrophy6*1_desc', 'Glittery gold'), + ('pet_race_1_019', 'Bobcat Wailer'), + ('furni_bardesk_polyfon*5_desc', 'For cute constructions'), + ('furni_carpet_polar*2_name', 'Blue Bear Rug'), + ('pet_race_1_017', 'Furry Friend'), + ('furni_soft_sofa_norja*6_desc', 'Blue Iced Sofa'), + ('furni_pura_mdl2*4_desc', 'Any way you like it!'), + ('pet_race_1_018', 'Trusting Tabby'), + ('pet_race_1_015', 'Haughty House Pet'), + ('chatlog.url', 'https://theallseeingeye.sulake.com/ase/habbo/uk/housekeeping/extra/hobba/chatlog.action?chatId='), + ('furni_ham2_name', 'Eaten Ham'), + ('pet_race_1_016', 'Curiousity - The Return!'), + ('pet_race_1_013', 'Felis Catus Allergicus'), + ('pet_race_1_014', 'Bushy Bobtail'), + ('pet_race_1_011', 'Egyptian Angora'), + ('pet_race_1_012', 'Freckled Feral'), + ('gs_choose_gamefield', 'Choose Game Arena:'), + ('furni_divider_nor5*6_desc', 'Cool cornering for your crib y0!'), + ('furni_summer_pool*2_name', 'Red Summer Pool'), + ('pet_race_1_010', 'Wannabe Wildcat'), + ('furni_rare_elephant_statue_desc', 'Say hello to Nelly'), + ('furni_sofa_silo*8_desc', 'Cushioned, understated comfort'), + ('furni_exe_rug_desc', 'Please remove your shoes!'), + ('NUF_meeting_people_roomlist_tutor', 'Let\'s visit one of the rooms and find out how to meet other users.'), + ('furni_chair_plasto*15_desc', 'Hip plastic furniture'), + ('nav_venue_habburger\'s_name', 'Habburgers'), + ('queue_current_2', 'You are in queue for the room.'), + ('queue_current_1', 'You are in Habbo Live queue...'), + ('furni_pura_mdl5*3_name', 'Black Pura Module 5'), + ('furni_hockey_score_name', 'Scoreboard'), + ('furni_sofachair_silo*5_desc', 'Pink Area Armchair'), + ('furni_hyacinth1_name', 'Pink Hyacinth'), + ('furni_pura_mdl1*6_desc', 'Any way you like it!'), + ('camera_open_dialog_heading', 'Camera'), + ('furni_prizetrophy5*2_name', 'Duo trophy'), + ('furni_glass_chair_desc', 'Translucent beauty'), + ('furni_rubberchair*3_desc', 'Soft and tearproof!'), + ('furni_exe_plant_name', 'Executive Plant'), + ('furni_pura_mdl2*3_desc', 'Any way you like it!'), + ('furni_pura_mdl1*2_name', 'Pink Pura Module 1'), + ('furni_plant_bonsai_desc', 'You can be sure it lives'), + ('furni_plant_valentinerose*4_desc', 'Be mine!'), + ('wallitem_hrella_poster_3_desc', 'Don\'t drift away!'), + ('furni_deadduck_name', 'Dead Duck'), + ('furni_summer_grill*3_desc', 'Plenty of steak on that barbie'), + ('modtool_extrainfo', 'Extra Info:'), + ('sound_machine_jukebox_window', 'Jukebox'), + ('gs_button_start', 'Start Game!'), + ('nav_venue_sw_lobby_beginner_5/0_desc', ''), + ('furni_romantique_chair*5_desc', 'What does this button do?'), + ('furni_table_plasto_4leg*9_desc', 'Hip plastic furniture'), + ('furni_soft_sofa_norja_desc', 'A soft iced sofa'), + ('furni_divider_nor4*9_name', 'Red Iced Auto Shutter'), + ('login_haventGotHabbo', 'Haven\'t got a Habbo yet?'), + ('furni_noob_stool*2_name', 'My first Habbo stool'), + ('furni_s_sound_machine*5_desc', 'Sound Machine Brown Desc'), + ('credit_redeem_window', 'Redeem credit furni'), + ('send_invitation_text', 'Want to meet someone from our Welcoming Party?'), + ('purse_vouchers_exitbutton', 'Cancel'), + ('furni_prizetrophy6*3_desc', 'Breathtaking bronze'), + ('nav_venue_cafe_gold/0_name', 'Kultakahvila'), + ('furni_fortune_name', 'Crystal Ball'), + ('poster_22_name', 'Butterfly Cabinet (blue)'), + ('object_displayer_link_badge', 'Edit Badge'), + ('furni_sound_set_15_name', 'RnB Grooves 6'), + ('Alert_NoNameSet', 'Check your Habbo name.'), + ('furni_hc_crpt_name', 'Persian Carpet'), + ('error_ok', 'OK->'), + ('game_chess_email', 'Receive game via email'), + ('sound_machine_confirm_save_list', 'Save playlist?'), + ('furni_noob_rug*2_desc', 'Nice and neat sisal rug with blue edging'), + ('queue_set.e1.alert', 'This room is currently available only to Habbos participating to the event.'), + ('furni_rare_icecream*0_desc', 'Virtual cherry rocks!'), + ('furni_arabian_chair_name', 'Green Blossom Chair'), + ('furni_divider_silo3*6_name', 'Blue Area Gate'), + ('furni_scifiport*4_desc', 'Energy beams. No trespassers!'), + ('furni_sofa_silo*4_desc', 'Beige Area Sofa'), + ('furni_one_way_door*4_desc', 'One at a time!'), + ('furni_chair_norja*5_desc', 'Sleek and chic for each cheek'), + ('furni_sound_set_19_desc', 'Shake your body!'), + ('poster_26_desc', 'See that halo gleam!'), + ('furni_doormat_plain*2_desc', 'Available in a variety of colours'), + ('furni_romantique_chair*1_name', 'Rose Quartz Chair'), + ('furni_hc_tv_name', 'Mega TV Set'), + ('pet.hotwords.follow_me', 'heel'), + ('furni_petfood3_desc', 'Fantastic 20% Saving!'), + ('furni_couch_norja*5_name', 'Pink Bench'), + ('furni_table_plasto_round*7_desc', 'Hip plastic furniture'), + ('furni_bed_armas_two_desc', 'King-sized pine comfort'), + ('modtool_days', 'Days'), + ('furni_one_way_door*7_name', 'Green One Way Gate'), + ('furni_table_norja_med*5_name', 'Large Coffee Table Pink'), + ('furni_sand_cstl_wall_name', 'sand_cstl_wall'), + ('nav_modify_doorstatus_givepw', 'Password for the room'), + ('NUF_getting_items_room_tutor', 'Nice room. Reminds me of a chic Parisian cafe in Slough. Open the Catalogue.'), + ('habbo_hand_prev', '<<<'), + ('pet.saying.generic.croco.3', 'Tick tock tick....'), + ('invitation_follow_failed', 'Sorry, your attempt to follow an invitation failed.'), + ('furni_sound_set_12_desc', 'Unusual as Standard'), + ('pet.saying.generic.croco.1', '*Mellow*'), + ('error_text', 'Error occured, press \'OK\' to restart program.\\r\\rPlease report bugs to:\\rwww.habbohotel.com/habbo/en/help/contact/bugs/ \\rSorry for the inconvenience.'), + ('pet.saying.generic.croco.2', 'I\'m so hungry I could eat you!'), + ('furni_divider_silo3*3_desc', 'Form following function'), + ('furni_table_plasto_4leg*2_desc', 'Hip plastic furniture'), + ('int_newmessages', 'New Message(s)'), + ('furni_rare_icecream*3_name', 'Blackcurrant Ice Cream Machine'), + ('bb_header_gameinfo', 'Game info'), + ('furni_scifiport*0_name', 'Red Laser Door'), + ('nav_venue_bb_lobby_beginner_7_name', 'Beginners Battle Ball 8'), + ('tx_history.description.bank_wallie', 'Wallie-card'), + ('nav_venue_hallway_name', 'Hallway'), + ('nav_venue_bb_lobby_amateur_11/0_desc', ''), + ('furni_bed_budget_one*5_desc', 'Prince sized comfort!'), + ('pet.saying.generic.croco.0', 'Rrrr....Grrrrrg....'), + ('nav_popup_go', '>>'), + ('furni_safe_silo*3_name', 'White Safe Minibar'), + ('furni_table_silo_small_name', 'Occasional Table'), + ('poll_confirm_window', 'Leave our poll'), + ('furni_table_norja_med*9_desc', 'For larger gatherings'), + ('furni_divider_nor4*6_desc', 'Habbos, roll out!'), + ('gs_3teams', '3 Teams Game'), + ('wallitem_post.it.limit', 'Only 50 stickies per room are allowed!'), + ('furni_scifidoor*4_desc', 'Protect your pot of gold!'), + ('furni_bed_polyfon_one*9_name', 'Red Single Bed'), + ('furni_soft_sofa_norja*2_desc', 'Black Iced Sofa'), + ('furni_corner_china_desc', 'Firm, fireproof foundation'), + ('hobba_pickup_go', 'Pick Up & Go!'), + ('furni_sporttrack3*2_desc', 'null'), + ('furni_rare_fan*6_name', 'Ochre Powered Fan'), + ('furni_sound_set_3_name', 'Electronic 1'), + ('NUF_mini_meet_people_user_tutor', 'Here you can chat to users directly. Ask a Habbo to be your friend by clicking on their Habbo and the button.\\nIf this is your first time, check your Hand to see a present to decorate your own room with, later.'), + ('furni_pura_mdl2*6_name', 'Blue Pura Module 2'), + ('furni_couch_norja*9_desc', 'Two can perch comfortably'), + ('furni_chair_plasty*9_desc', 'Hip plastic furniture'), + ('game_chess_white', 'White:'), + ('nav_venue_sw_lobby_intermediate_3/0_desc', 'Lumisota sen kuin vain kovenee.'), + ('furni_table_plasto_square*3_desc', 'Hip plastic furniture'), + ('nav_venue_theatredrome/0_desc', 'Perform your latest masterpiece!'), + ('nav_venue_the_den/0_desc', 'Has anyone seen my map?'), + ('furni_sound_set_40_name', 'Rock 4'), + ('remove', 'Remove'), + ('friend_request_decline_all', 'Decline all requests.'), + ('furni_rare_globe_name', 'Snow Globe'), + ('furni_bardesk_polyfon*8_name', 'Yellow Mode Bardesk'), + ('nav_venue_sw_lobby_free_6_name', 'Free Game Lobby'), + ('queue_change', 'Change queue'), + ('reg_parentemail_link_text2', 'Privacy Pledge'), + ('furni_rare_parasol*2_desc', 'Block those rays!'), + ('furni_romantique_pianochair*3_desc', 'null'), + ('reg_parentemail_link_text1', 'See the letter'), + ('sound_machine_list_save', 'Save Playlist'), + ('nav_public_helptext_hd', 'Public Spaces'), + ('furni_chair_plasty*2_desc', 'Hip plastic furniture'), + ('spectator_count', 'spectators %cnt%/%max%'), + ('reg_welcome2', 'Create Your Own Habbo'), + ('wallitem_roomdimmer_desc', 'Superior lighting for your room'), + ('furni_prizetrophy*3_name', 'Classic trophy'), + ('furni_plant_rose_name', 'Cut Roses'), + ('reg_welcome3', 'Now the fun begins! All you need to do is register and you\'re ready to start. It won\'t take long!\\rYou can change everything except your name and date of birth later. Come on!'), + ('furni_noob_table*5_name', 'My first Habbo table'), + ('nav_error_room_closed', 'The room is closed.'), + ('reg_changePassword', 'Change your password'), + ('furni_divider_nor5*3_desc', 'Cool cornering for your crib y0!'), + ('furni_doorC_name', 'Portaloo'), + ('furni_chair_plasty*10_name', 'Plastic Pod Chair'), + ('furni_pura_mdl1*9_name', 'Red Pura Module 1'), + ('furni_rare_stand_name', 'Speaker\'s Corner'), + ('furni_grunge_table_name', 'Grunge Table'), + ('furni_traffic_light*2_name', 'Blue Traffic Light'), + ('pet.saying.angry.croco.2', 'You have displeased me.'), + ('human_trading', 'Trading'), + ('furni_noob_stool*6_desc', 'Unfold me and take the weight off (green)'), + ('pet.saying.angry.croco.1', 'Rawwwr...rrr'), + ('nav_venue_sw_lobby_intermediate_5_name', 'Snow Bombardiers Lobby'), + ('gs_button_leavegame', 'Leave Game'), + ('pet.saying.angry.croco.0', 'Grrrrr...rrr'), + ('furni_s_sound_machine*1_name', 'Sound Machine Grey'), + ('pet.saying.angry.croco.4', 'Buuuuurrr..rrrrr'), + ('furni_chair_plasto*7_desc', 'Hip plastic furniture'), + ('pet.saying.angry.croco.3', 'Rowrrrr...rrrr'), + ('furni_soft_sofa_norja*9_desc', 'Red Iced Sofa'), + ('nav_venue_skylight_lobby_name', 'Skylight Lobby'), + ('furni_bed_polyfon_one*6_desc', 'Blue Mode Single Bed'), + ('furni_pillow*8_desc', 'Puffy, soft and huge'), + ('furni_hc_rntgn_name', 'X-Ray Divider'), + ('furni_table_silo_med*5_desc', 'Pink Area Coffee Table'), + ('furni_gothic_stool*2_desc', 'Be seated please..'), + ('furni_typingmachine_desc', 'Write that bestseller'), + ('furni_fridge_desc', 'Keep cool with a chilled snack or drink'), + ('nav_venue_cunning_fox_gamehall/4_desc', 'Get a hand like a foot? Keep a straight face and bluff it out'), + ('doorbell_rings', 'Rings the doorbell - Open the door?'), + ('furni_divider_silo1*9_desc', 'Red Area Small Table'), + ('nav_venue_bb_lobby_intermediate_7/0_desc', ''), + ('furni_prize1_name', 'Gold Trophy'), + ('poster_54_name', 'Hockey Stick'), + ('furni_sound_set_47_name', 'Club 2'), + ('furni_prizetrophy3*1_name', 'Globe trophy'), + ('purse_head2', 'ACCOUNT TRANSACTIONS'), + ('furni_soft_sofa_norja*5_name', 'Pink Iced Sofa'), + ('furni_prizetrophy9*1_desc', 'Glittery gold'), + ('buddyremove_next', 'Next >'), + ('reg_girl', 'Girl'), + ('furni_bed_budget_one*1_name', 'Aqua Pura Bed'), + ('NUF_visiting_rooms_roomlist_go', 'Click \'Go\' to go to a room.'), + ('poster_506_desc', 'To \'Finnish\' your decor...'), + ('furni_toy1_name', 'Rubber Ball'), + ('furni_sound_set_7_desc', 'Sound effects for Furni'), + ('sw_fieldname_6', 'Riverbank Siege'), + ('sw_fieldname_5', 'Polar Labyrinth'), + ('furni_bed_polyfon*4_desc', 'Beige Mode Double Bed'), + ('furni_pillow*4_name', 'Gold Feather Pillow'), + ('alert_duplicatesession', 'You are already logged in on another hotel! Log out before trying again.'), + ('sw_fieldname_7', 'Skull Falls Assault'), + ('sound_machine_alert_song_not_ready', 'Can\'t save song! Song not ready yet.'), + ('nav_venue_bb_lobby_beginner_5/0_desc', ''), + ('nav_venue_bb_lobby_tournament_4/0_desc', ''), + ('pet.saying.play.dog.1', 'woofWOOFwoofWOOFwoof'), + ('pet.saying.play.dog.0', 'rrr.. WOOF .rrr..'), + ('furni_cn_lamp_name', 'Lantern'), + ('furni_arabian_rug_name', 'Berber Kilim Rug'), + ('NUF_groups_hotelview_tutor', 'You have now opened the Group tutorial in the website window. Special!'), + ('gs_error_start_9', 'Team sizes can only differ by one player. This Game cannot start!'), + ('furni_divider_poly3*7_desc', 'Green Mode Bardesk Gate'), + ('furni_sofachair_silo*4_desc', 'Beige Area Armchair'), + ('poster_58_desc', 'whish you luck'), + ('furni_chair_basic*2_desc', 'It\'s a cracking design!'), + ('poster_516_name', 'The English flag'), + ('nav_venue_sw_lobby_tournament_2/0_desc', ''), + ('furni_gothic_carpet_name', 'Cobbled Path'), + ('sw_title', 'Snow Storm'), + ('furni_doormat_plain*5_name', 'Doormat'), + ('furni_pura_mdl4*4_desc', 'Any way you like it!'), + ('furni_sound_machine*1_name', 'Sound Machine'), + ('furni_sofa_silo*7_name', 'Green Area Sofa'), + ('nav_venue_sw_lobby_tournament_4_name', 'Tournament Lobby'), + ('gs_title_gamecreation', 'Game creation'), + ('furni_couch_norja*2_desc', 'Two can perch comfortably'), + ('furni_prizetrophy5_desc', 'Palkinto'), + ('furni_divider_nor3*9_desc', 'Red Iced gate'), + ('furni_present_gen_name', 'Gift'), + ('furni_prizetrophy7*3_name', 'Bronze Habbo trophy'), + ('alert_reg_parent_email', 'The email address you provided is unacceptable.'), + ('furni_bed_polyfon_girl_name', 'Double Bed'), + ('furni_rare_fountain_name', 'Bird Bath (red)'), + ('furni_pura_mdl3*3_name', 'Black Pura Module 3'), + ('furni_plant_pineapple_name', 'Pineapple Plant'), + ('furni_divider_nor2*8_name', 'Yellow Iced bar desk'), + ('messenger', 'Messenger'), + ('nav_venue_bb_arena_0_name', 'Battle Ball kaikille'), + ('sw_fieldname_2', 'Algid River'), + ('furni_bed_silo_two_desc', 'Plain and simple x2'), + ('sw_fieldname_1', 'Arctic Island'), + ('furni_pillow*1_desc', 'Puffy, soft and huge'), + ('sw_fieldname_4', 'Frosty Forest'), + ('sw_fieldname_3', 'Glacial Fort'), + ('furni_bar_basic_desc', 'A pura series 300 minibar'), + ('tutorial_welcome_M', 'Hi! I am your guide to Habbo Hotel. Please pick a topic to start.'), + ('tutorial_welcome_F', 'Hi there! I\'m your guide to Habbo Hotel. What would you like to learn today?'), + ('Alert_NoNameSetForLogo', 'Please give a name to your logo'), + ('furni_glass_table*5_name', 'Glass table'), + ('group_owner', 'Owner'), + ('console_target_friend_list_full', 'This user\'s friend list is full'), + ('furni_romantique_smalltabl*2_name', 'Lime Tray Table'), + ('ph_keys_spacebar', 'Spacebar'), + ('furni_noob_chair*3_name', 'My first Habbo chair'), + ('NUF_meeting_people_roomlist_publicTab', 'Click the Public Spaces tab to see the list of public rooms. To go to the room click the \'Go\' button.'), + ('furni_bed_polyfon*7_name', 'Green Mode Double Bed'), + ('furni_jukebox_ptv*1_name', 'Jukebox Pacha TV'), + ('poster_513_desc', 'Aussies rule!'), + ('poster_51_desc', '2 points for every basket'), + ('furni_toy1*2_name', 'Rubber Ball'), + ('furni_bartable_armas_name', 'Bardesk'), + ('nav_venue_sw_lobby_amateur_0/0_desc', ''), + ('NUF_mini_use_console_read_tutor', 'The Habbo Console lets you message with people you have added to your friends list.'), + ('nav_venue_bb_lobby_beginner_12_name', 'Beginners Battle Ball 13'), + ('poster_2002_name', 'Urho Kaleva Kekkonen'), + ('furni_sound_set_44_desc', 'Haunted Dimension'), + ('pet.saying.beg.dog.1', 'Oouh..oouh..snuh..ooo'), + ('furni_sporttrack2*1_name', 'Sport corner tartan'), + ('pet.saying.beg.dog.0', 'Oooo...Ouuu...oo...OUUU'), + ('furni_solarium_norja*5_desc', 'Rejuvenate your pixels!'), + ('pet.saying.beg.dog.2', '*whimpers *'), + ('reg_pledgelink', 'Hotel rules'), + ('habboclub_price1.days', '30'), + ('furni_glass_shelf_desc', 'Translucent beauty'), + ('furni_sofachair_polyfon*3_name', 'White Armchair'), + ('reg_verification_info', 'You must know the correct birthday and password before you\'re allowed to make these changes.'), + ('furni_carpet_soft*5_desc', 'Soft Wool Rug'), + ('furni_grunge_mattress_name', 'Grunge Mattress'), + ('furni_bed_polyfon_one_name', 'Single Bed'), + ('furni_sound_machine_pro_name', 'Sound Machine Pro'), + ('furni_chair_china_desc', 'The elegant beauty of tradition'), + ('furni_rare_icecream*7_desc', 'Virtual chocolate rocks!'), + ('furni_table_silo_med*8_name', 'Yellow Coffee Table'), + ('club_gift.message', 'Happy Habbo Club! Love Callie :)'), + ('furni_sw_raven_desc', 'My name is Otter'), + ('furni_noob_table*2_desc', 'Lightweight, practical and dark blue'), + ('furni_soft_sofachair_norja*3_desc', 'Soft Iced sofachair'), + ('sound_machine_confirm_delete', 'Delete song?'), + ('furni_plant_fruittree_name', 'Fruit Tree'), + ('nav_venue_bb_lobby_intermediate_1/0_desc', ''), + ('furni_heartsofa_name', 'Heart Sofa'), + ('furni_bed_budget_one*8_name', 'Yellow Pura Bed'), + ('NUF_getting_room', 'Making your own room'), + ('furni_rare_elephant_statue*2_name', 'Bronze Elephant'), + ('nav_venue_ballroom/0_desc', 'Come play ball!'), + ('nav_venue_sw_lobby_amateur_1_name', 'Snow Slingers Lobby'), + ('console_lasttime', 'Last Time'), + ('furni_md_sofa_desc', 'A decent recliner'), + ('furni_wooden_screen*6_name', 'Blue Oriental Screen'), + ('partner_registration_text', 'Click the link to finish your registration. When you have finished the registration click OK to continue to the hotel.'), + ('furni_sound_set_62_desc', 'Music of the Arabian night!'), + ('furni_arabian_divdr_name', 'Soft wooden screen'), + ('furni_tree1_desc', 'Dead christmas tree'), + ('furni_grand_piano*3_name', 'Pink Grand Piano'), + ('console_select_requests', 'Following users have asked to be your friend. Please accept or decline.'), + ('furni_divider_nor4*2_name', 'Black Iced Auto Shutter'), + ('furni_glass_chair*3_name', 'Glass chair'), + ('reg_passwordContainsNoNumber', 'Password must contain at least one number'), + ('buddyremove_invert', 'Invert Selection'), + ('furni_val_teddy*5_desc', 'The yellow bear of understanding'), + ('furni_sound_set_51_name', 'Club 6'), + ('poster_1_desc', 'The Noble and Silver Show'), + ('roomevent_create_name', 'Type the name of your event'), + ('Alert_unacceptableName', 'Sorry, that name is unacceptable to the Hotel Management'), + ('NUF_getting_room_go_tutor', 'Your room is now ready. Let\'s go see! I hope you have a bed...'), + ('poster_520_name', 'The Rainbow Flag'), + ('password', 'Password:'), + ('furni_bed_budget*8_name', 'Yellow Pura Double Bed'), + ('gs_header_gamelist', 'Game List'), + ('furni_chair_plasty_desc', 'Hip plastic furniture'), + ('url_purse_subscribe', 'http://%predefined%//credits?'), + ('furni_table_plasto_bigsquare*15_desc', 'Hip plastic furniture'), + ('furni_glass_stool*6_desc', 'Translucent beauty'), + ('error_report', 'Error Report'), + ('summer_chair_6_desc', 'Get decked'), + ('furni_chair_basic*5_name', 'chair_basic'), + ('room_remove_specs', 'Sorry! Now it\'s someone else\'s turn to watch this event.'), + ('furni_bunny_desc', 'Yours to cuddle up to'), + ('invitation_exists', 'You have already invited members of the Welcoming Party to your room.'), + ('purse_vouchers_furni_success', 'Voucher was successfully redeemed. You have been given the following furniture:'), + ('nav_rooms_popular', 'Popular rooms'), + ('nav_cancel', 'Cancel'), + ('alert_cross_domain_download', 'Cross domain content download prevented'), + ('furni_table_plasto_4leg*16_desc', 'Hip plastic furniture'), + ('url_pets', 'http://%predefined%//hotel/pets'), + ('furni_bardeskcorner_polyfon*9_desc', 'Tuck it away'), + ('gs_button_cancel', 'Cancel'), + ('furni_barchair_silo*7_name', 'Green Bar Stool'), + ('catalog_credits', 'You have \\x Credits in your purse.'), + ('furni_divider_nor3_name', 'Door (Lockable)'), + ('nav_modify_name', 'Name of the room'), + ('nav_venue_bb_lobby_amateur_7_name', 'Gevorderden Battle Ball 8'), + ('nav_venue_club_massiva/0_desc', 'Rest your dancing feet!'), + ('furni_gothrailing_desc', 'The dark side of Habbo'), + ('queue_set.na.alert', 'This Room is for Staff only.'), + ('nav_venue_bb_lobby_tournament_8_name', 'Competitie Battle Ball 9'), + ('furni_sound_set_29_name', 'Dance 2'), + ('console_msgs', 'msgs'), + ('furni_noob_lamp*6_name', 'My first Habbo lamp'), + ('furni_marquee*6_desc', 'It\'s both door and a shade!'), + ('furni_chair_plasto*16_desc', 'Hip plastic furniture'), + ('furni_chair_basic*9_desc', 'It\'s a cracking design!'), + ('summer_chair_2_name', 'Pink Deck Chair'), + ('alert_too_much_furnitures', 'Furni limit for room is exceeded. Not all furnitures are shown. Please remove some.'), + ('furni_pura_mdl5*4_name', 'White Pura Module 5'), + ('bus.full_msg', 'The FRANK bus is full at the moment, please come back later or visit the FRANK page below for more information.'), + ('furni_sound_set_22_name', 'SFX 3'), + ('furni_gothic_sofa*3_desc', 'The dark side of Habbo'), + ('furni_md_limukaappi_name', 'Habbo Cola Machine'), + ('poster_19_desc', 'Trying to get in or out?'), + ('gs_2min', '2min'), + ('poster_8_desc', 'Habbos come in all colours'), + ('furni_pillar*6_desc', 'Ancient and stately'), + ('furni_carpet_standard*3_desc', 'Available in a variety of colours'), + ('purse_vouchers_info', 'When you buy Habbo Credits with a mobile phone, you will receive a special voucher code. Enter the code in the box above, click \'Get Credits!\' and they\'ll be added to your purse.'), + ('furni_valeduck_name', 'Valentine\'s Duck'), + ('Alert_MessageFromAdmin', 'Message from Hotel Management:'), + ('furni_present_gen1_desc', 'What\'s inside?'), + ('reg_tutorial_txt', ''), + ('furni_tile_stella_name', 'Star Tile'), + ('furni_shelves_norja*4_name', 'Urban Iced Bookcase'), + ('transaction_system_creditcards_is', 'Creditcard'), + ('furni_shelves_polyfon_desc', 'For the arty pad'), + ('furni_tv_luxus_name', 'Digital TV'), + ('recycler_status_window_title', 'Recycling Status'), + ('furni_sleepingbag*6_name', 'Purple Sleeping Bag'), + ('gs_button_shrink', 'Minimize Window'), + ('furni_wcandleset_desc', 'Simple but stylish'), + ('furni_sleepingbag*3_desc', 'Ultimate coziness'), + ('object_displayer_show_actions', 'Show actions'), + ('hubu_t5_1', 'Lisetoa huumeista'), + ('song_disk_text_template', '%name%'), + ('hubu_t5_2', 'Huumeista-esite'), + ('queue_other_1', 'Habbo Live queue status'), + ('poster_33_name', 'Save the Panda'), + ('hubu_t5_3', 'Yleistietoa EOPH ry:st--------------'), + ('queue_other_2', 'Room queue status'), + ('furni_hcsohva_name', 'Throne Sofa'), + ('furni_sound_set_26_desc', 'Bollywood Beats!'), + ('furni_christmas_poop_name', 'Reindeer Droppings'), + ('furni_rare_dragonlamp*4_name', 'Serpent of Doom'), + ('nav_venue_bb_lobby_amateur_7/0_desc', ''), + ('purse_value', 'VALUE'), + ('furni_glass_sofa*5_desc', 'Translucent beauty'), + ('nav_venue_bb_lobby_tournament_15/0_desc', ''), + ('furni_glass_stool*2_desc', 'Translucent beauty'), + ('pet.saying.play.cat.1', 'Purrrr.. oo..Purrr'), + ('furni_pura_mdl4*7_name', 'Green Pura Module 4'), + ('nav_venue_cafe_ole/0_desc', 'Relax with friends over one of Marias specialty coffees'), + ('pet.saying.play.cat.0', 'Mew..MEOW..meow'), + ('furni_pumpkin_name', 'Pumpkin Lamp'), + ('furni_summer_chair*7_desc', 'Reserved!'), + ('ph_tickets_txt', 'Tickets can be used for BattleBall: Rebound!, SnowStorm, the Lido Diving and Wobble Squabble games. Tickets never expire.\\r\\rCurrently you have \\x1 ticket(s).'), + ('roomatic_onemoment', 'Please wait, we are going to your room...'), + ('furni_small_table_armas_name', 'Occasional Table'), + ('furni_table_polyfon_med_desc', 'For larger gatherings'), + ('nav_venue_bb_lobby_expert_3/0_desc', ''), + ('furni_chair_silo*6_desc', 'Blue Silo Dining Chair'), + ('furni_exe_globe_name', 'Power Globe'), + ('furni_bed_budget_one_name', 'bed_budget_one'), + ('furni_divider_silo1*2_desc', 'Neat and natty'), + ('nav_venue_bb_lobby_intermediate_0_name', 'Intermediate'), + ('furni_sofa_polyfon*9_desc', 'Comfort for stylish couples'), + ('furni_noob_lamp*3_desc', 'Get the light right where you want it (aubergine)'), + ('nav_showfull', 'Show Full Rooms'), + ('furni_divider_nor3*2_desc', 'Black Iced gate'), + ('reg_note_title', 'Warning!'), + ('hubu_answ_count', 'Replies'), + ('nav_recommended_rooms', 'Recommended Rooms'), + ('transaction_system_bank_nordea', 'Nordea'), + ('furni_sound_set_37_desc', ''), + ('poster_2006_desc', 'He is the magic Habbo'), + ('sw_link_gameRules_url', 'http://%predefined%//groups/56553/id'), + ('wave', 'Wave'), + ('furni_hc_djset_desc', 'Very old skool scratch\'n\'spin'), + ('furni_plant_maze_name', 'Maze Shrubbery'), + ('furni_scifirocket*3_name', 'Endor Smoke Machine'), + ('furni_val_teddy*1_name', 'Grey Share Bear'), + ('recycler_ready_outcome', 'Recycling reward: %outcome%'), + ('poster_4_desc', 'Fake of course!'), + ('poster_62_desc', 'We can\'t bear to lose them!'), + ('furni_glass_stool*9_desc', 'Translucent beauty'), + ('furni_goodie1_name', 'Marzipan Man'), + ('nav_modify_choosecategory', 'Choose a category for your room'), + ('object_displayer_link_home', 'User\'s home page'), + ('nav_venue_sw_lobby_tournament_8/0_desc', ''), + ('furni_xmasduck_name', 'Christmas Rubber Duck'), + ('help_txt_2', 'Password Reset'), + ('pet_mood_2', 'Blue'), + ('furni_queue_tile1*4_desc', 'The power of movement'), + ('help_txt_1', 'How do I get Credits?'), + ('pet_mood_3', 'Contented'), + ('nav_venue_bb_lobby_tournament_1_name', 'Competitie Battle Ball 2'), + ('furni_rare_daffodil_rug_name', 'Petal Patch'), + ('help_txt_4', 'The Habbo Way'), + ('pet_mood_0', 'Miserable'), + ('help_txt_3', 'Help with Habbo Hotel'), + ('pet_mood_1', 'Depressed'), + ('pet_mood_6', 'Ecstatic'), + ('furni_bed_budget*4_name', 'White Pura Double Bed'), + ('nav_venue_bb_lobby_amateur_0_name', 'Amateur'), + ('furni_sofachair_polyfon*7_desc', 'Green Mode Armchair'), + ('yes', 'Yes'), + ('pet_mood_4', 'Happy'), + ('pet_mood_5', 'Joyful'), + ('furni_sound_set_30_desc', 'Moments in love'), + ('furni_prizetrophy2*1_desc', 'Glittery gold'), + ('furni_wooden_screen*3_desc', 'Add an exotic touch to your room'), + ('transaction_system_bank_op', 'Osuuspankki'), + ('help_txt_6', 'Contact Us'), + ('help_txt_5', 'Safety Tips'), + ('furni_bardeskcorner_polyfon*2_desc', 'Black Mode Bardesk Corner'), + ('poster_15_desc', 'Marvellous mountains'), + ('room_areYouSurePlace', 'Warning! If you put something down in this room you will not be able to pick it up again.'), + ('nav_venue_bouncer_room_3_name', 'Semi-profs Battle Ball Arena'), + ('furni_chair_plasto*12_name', 'Chair'), + ('furni_gothic_chair*6_name', 'Gothic Chair Blue'), + ('furni_sofa_polyfon*2_desc', 'Black Mode Sofa'), + ('modtool_alertuser', 'Alert User'), + ('furni_toilet_desc', 'Loo Seat'), + ('furni_plant_cruddy_name', 'Aloe Vera'), + ('nav_venue_space_cafe/0_desc', 'In this space noone can see you ask for a soda!'), + ('nav_incorrectflatpw', 'Incorrect, try again.'), + ('furni_chair_plasto*13_desc', 'Hip plastic furniture'), + ('login_firstTimeHere', 'First time here?'), + ('furni_skullcandle_desc', 'Alas poor Yorrick...'), + ('NUF_mini_endtopic_step1_tutor', 'Well that\'s all from me. If you have any problems just click the little blue question mark to restart the tutorial and find our FAQs.\\nTo start exploring by yourself, click Close guide from the upper left corner.'), + ('furni_divider_poly3*3_name', 'White Hatch'), + ('help_callforhelp', 'Get Live Help'), + ('furni_rare_fountain*2_name', 'Bird Bath (green)'), + ('nav_venue_rooftop_name', 'Rooftop Cafe'), + ('furni_scifiport*7_name', 'Turquoise Sci-Fi Port'), + ('purse_back_to_credits', 'Back To Purse'), + ('room_ban', 'Kick & ban'), + ('furni_pura_mdl5*1_name', 'Aqua Pura Module 5'), + ('furni_val_teddy*4_name', 'Brown Share Bear'), + ('poster_40_name', 'Bonnie Blonde'), + ('NUF_getting_room_navigator_tutor', 'You want to click it real good. The \'Own room(s)\' tab I mean. Don\'t click yourself. It\'s unhygienic.'), + ('summer_chair_3_desc', 'Relax and enjoy the sun'), + ('furni_wooden_screen*2_name', 'RosewoodScreen'), + ('nav_venue_sun_terrace_name', 'Sun Terrace'), + ('furni_rare_fan*3_desc', 'Keeps the heat off St George!'), + ('nav_venue_sport_name', 'Power Gym'), + ('furni_toilet_red_desc', 'Loo Seat'), + ('retype_password', 'Retype Password:'), + ('furni_chair_basic*6_desc', 'It\'s a cracking design!'), + ('console_friends_helptext', 'This screen shows a list of all your Habbo Friends. It tells you where they are in the hotel, or, if they\'re not checked in, when their last visit was.'), + ('NUF_getting_items_room_', 'This is the Catalogue icon. Click to open it.'), + ('furni_grunge_barrel_desc', 'Beacon of light!'), + ('furni_soft_sofachair_norja*6_name', 'Blue Iced Sofachair'), + ('int_howtoget', 'How To get?'), + ('furni_sound_set_23_desc', 'Don\'t be afraid of the dark'), + ('nav_ok', 'OK'), + ('furni_sofachair_polyfon*6_name', 'Blue Mode Armchair'), + ('nav_venue_theatredrome_valentine_name', 'Theatredrome Valentine'), + ('furni_sofachair_polyfon_desc', 'Loft-style comfort'), + ('poster_83_name', 'Pöllö huhuilee'), + ('furni_soft_sofachair_norja*2_name', 'Black Iced Sofachair'), + ('roomdimmer_furni_limit', 'You can only have one roomdimmer per room'), + ('recycler_progress_timeleft', 'Time left: %hours% h and %minutes% min'), + ('furni_chair_plasto*3_name', 'Chair'), + ('NUF_getting_room_hotelview_tutor', 'Now you will learn how to make your own room. First go to the Guest Rooms area of the Navigator.'), + ('roomevent_create', 'Create'), + ('reg_year', 'Year'), + ('furni_divider_poly3_name', 'Hatch (Lockable)'), + ('furni_divider_nor1*7_name', 'Rural Iced Corner'), + ('furni_rare_beehive_bulb_name', 'Blue Amber Lamp'), + ('furni_waterbowl*2_name', 'Green Water Bowl'), + ('NUF_getting_room_room_hand', 'Open your hand!'), + ('furni_carpet_standard*6_desc', 'Available in a variety of colours'), + ('furni_CF_5_coin_silver_name', 'Silver Coin'), + ('furni_shelves_norja*7_name', 'Rural Iced Bookcase'), + ('opening_hours_text_disabled', 'The Hotel is shutting down really soon. To avoid confusion, purchasing of furniture, Habbo Club and game tickets have been disabled, as well as playing games and furniture trading. Try again tomorrow when the hotel is open!'), + ('nav_venue_bb_lobby_5_name', 'Battle Ball Kaikille'), + ('game_bs_congrat', 'Congratulations!'), + ('furni_arabian_tray2_name', 'Candle Tray'), + ('furni_giftflowers_desc', 'Guaranteed to stay fresh'), + ('club_button_1_period', 'Buy 1 >>>'), + ('furni_bed_polyfon_one*2_desc', 'Black Mode Single Bed'), + ('poster_47_name', 'Small silver star'), + ('furni_divider_nor3*5_desc', 'Pink Iced gate'), + ('furni_sofachair_polyfon_girl_desc', 'Think pink'), + ('furni_pura_mdl5*8_name', 'Yellow Pura Module 5'), + ('furni_hal_cauldron_desc', 'Eye of Habbo and toe of Mod!'), + ('poster_1006_name', 'Hoot Poster'), + ('furni_carpet_valentine_name', 'Red carpet'), + ('furni_floortile_name', 'Floor Tile'), + ('furni_divider_nor1*4_name', 'Urban Iced Corner'), + ('furni_bardeskcorner_polyfon*12_desc', 'Tuck it away'), + ('furni_table_plasto_bigsquare*3_desc', 'Hip plastic furniture'), + ('furni_traffic_light*6_desc', 'Chill and wait your turn!'), + ('club_general_prepaid', 'Prepaid Months'), + ('wallitem_val_heart_desc', 'Heartbroken... without your love!'), + ('furni_pura_mdl3*7_desc', 'Any way you like it!'), + ('furni_sound_set_58_name', 'RnB Grooves 4'), + ('furni_china_shelve_name', 'Chinese Lacquer Bookshelf'), + ('furni_divider_silo1*5_desc', 'Pink Area Corner Shelf'), + ('nav_venue_sw_lobby_tournament_desc', 'For stand-alone Tournaments.'), + ('furni_divider_silo2_name', 'Screen'), + ('furni_plant_mazegate_name', 'Maze Shrubbery Gate'), + ('poster_509_desc', 'The flag of Jamaica'), + ('furni_soft_sofachair_norja*9_name', 'Red Iced Sofachair'), + ('nav_venue_sw_arena_intermediate_name(0)', 'Playing intermediate game'), + ('furni_barchair_silo*4_name', 'Beige Bar Stool'), + ('furni_scifidoor*7_name', 'Aqua Spaceship Door'), + ('furni_CF_10_coin_gold_desc', 'Worth 10 Credits'), + ('furni_glass_sofa*8_desc', 'Translucent beauty'), + ('jukebox_reset', 'Reset Jukebox'), + ('nav_venue_sw_lobby_intermediate_desc', 'For the accomplished Snow Stormers.'), + ('furni_spotlight_desc', 'For the star of the show'), + ('furni_couch_norja_name', 'Bench'), + ('furni_romantique_divan*3_name', 'Turquoise Romantique Divan'), + ('furni_sleepingbag*7_desc', 'Ultimate coziness'), + ('roomatic_pws2', '24 hour access:'), + ('wallitem_jp_sheet1_desc', 'jp_sheet1'), + ('furni_table_silo_med*2_desc', 'Wipe clean and unobtrusive'), + ('furni_glass_table_desc', 'Translucent beauty'), + ('poster_502_desc', 'The US flag'), + ('pet_enrg_10', 'Mad'), + ('gs_scores_team_2', 'Blue Team:'), + ('pet_enrg_11', 'Nutcase'), + ('gs_scores_team_1', 'Red Team:'), + ('furni_cn_sofa_desc', 'Seating,Oriental style!'), + ('gs_scores_team_4', 'Green Team:'), + ('gs_scores_team_3', 'Yellow Team:'), + ('furni_table_silo_med*9_desc', 'Red Area Coffee Table'), + ('furni_hc_machine_name', 'Weird Science Machine'), + ('callhelp_writeyour', 'Write your question about Habbo Hotel here:'), + ('furni_table_silo_small*5_name', 'Pink Area Occasional Table'), + ('nav_addtofavourites', 'Add to favourites'), + ('furni_table_plasto_round*15_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_tournament_4_name', 'Competitie Battle Ball 5'), + ('furni_birdie_name', 'Pop-up Egg'), + ('furni_table_plasto_bigsquare_desc', 'Hip plastic furniture'), + ('furni_sound_set_33_desc', 'Guitar solo set'), + ('furni_romantique_divider*3_desc', 'Keeping things separated'), + ('furni_bed_budget*1_name', 'Aqua Pura Double Bed'), + ('furni_rare_beehive_bulb*2_desc', 'A honey-hued glow'), + ('furni_theatre_seat_desc', 'For Lazy boys and girls!'), + ('furni_hc_lmpst_desc', 'Somber and atmospheric'), + ('furni_divider_nor5*6_name', 'Blue Iced Angle'), + ('furni_summer_pool*2_desc', 'Fancy a dip?'), + ('poster_12_desc', 'a beautiful sunset'), + ('furni_carpet_polar*2_desc', 'Snuggle up on a Funky bear rug...'), + ('furni_md_rug_desc', 'Bubbles under your steps'), + ('Alert_InviteFriend', 'Invite your friends'), + ('nav_venue_bb_lobby_intermediate_4_name', 'Semi-profs Battle Ball 5'), + ('furni_hockey_score_desc', '...for keeping your score'), + ('furni_gothic_chair*3_name', 'Red Gothic Chair'), + ('wallitem_sw_stone_name', 'sw_stone'), + ('furni_pillow*7_name', 'Purple Velvet Pillow'), + ('nav_popup_header', 'Recommended rooms'), + ('nav_venue_sw_lobby_beginner_0_name', 'Snow Rookies Lobby'), + ('furni_table_norja_med*5_desc', 'For larger gatherings'), + ('furni_red_tv_name', 'Portable TV'), + ('reg_promise', '*Any personal information you supply will only be used by Habbo Ltd in accordance with the Habbo Pledge and will not be shared with third parties.'), + ('room_badge_choose', 'Modify Badge:'), + ('furni_table_plasto_square*15_desc', 'Hip plastic furniture'), + ('furni_sound_set_48_desc', 'Sweet party beat'), + ('nav_venue_ballroom_name', 'Ballroom'), + ('pet.hotwords.bad', 'bad'), + ('poster_55_desc', 'Save our trees!'), + ('furni_glass_chair_name', 'Glass chair'), + ('furni_prizetrophy5*2_desc', 'Shiny silver'), + ('furni_divider_poly3*4_desc', 'Beige Mode Bardesk Gate'), + ('tutorial_console_sample_message', 'Hello! This is a message sent to you from the Habbo Tutorial. To close and delete this message click delete. Sadly you cannot reply to this message as it is automated. Normally you can reply to messages by clicking the reply button.'), + ('furni_s_sound_machine*5_name', 'Sound Machine Brown'), + ('furni_divider_nor4*9_desc', 'Habbos, roll out!'), + ('furni_pura_mdl3*4_desc', 'Any way you like it!'), + ('NUF_getting_room_room_tutor', 'Tada! Nice room, although it\'s a little empty. Hey! Let\'s furnish it with something./nOpen your hand to check what you have, (if you have done this step before then you won\'t receive anything).'), + ('furni_fortune_desc', 'Gaze into the future'), + ('furni_soft_sofa_norja_name', 'iced sofa'), + ('furni_pura_mdl1*2_desc', 'Any way you like it!'), + ('nav_venue_sw_lobby_free_6/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('furni_divider_nor3*8_name', 'Yellow Iced gate'), + ('gs_title_finalscores', 'Final Standings:'), + ('gs_error_10', 'The hotel is closed or about to close. We look forward to welcoming you back tomorrow at (ADD LOCAL OPENING TIME).'), + ('furni_plant_bonsai_name', 'Bonsai Tree'), + ('furni_jukebox*1_name', 'Jukebox'), + ('room_loading', 'Loading room...'), + ('furni_hc_crpt_desc', 'Ultimate craftsmanship'), + ('furni_rare_hammock_desc', 'Eco bed'), + ('NUF_mini_use_console', 'Learn about messaging'), + ('furni_romantique_chair*1_desc', 'Elegant seating for elegant Habbos'), + ('transaction_system_bank_digiraha', 'Digiraha'), + ('NUH_messenger', 'Open your Console here - you might have messages or friend requests waiting.'), + ('furni_arabian_chair_desc', 'Exotic, soft seating'), + ('furni_noob_chair*6_name', 'My first Habbo chair'), + ('poster_510_desc', 'The flag of Italy'), + ('furni_carpet_standard*a_desc', 'Available in a variety of colours'), + ('queue_set.c.info', 'There are %c% Habbo Club member(s) in front of you. Be patient :)'), + ('furni_scifiport*4_name', 'Pink Sci-Fi Port'), + ('furni_sound_set_44_name', 'Graveyard Portal'), + ('furni_pura_mdl4*1_desc', 'Any way you like it!'), + ('furni_divider_silo3*6_desc', 'Blue Area Gate'), + ('furni_sound_machine*4_name', 'Blue Traxmachine'), + ('send_invitation_header', 'Get a warm welcome'), + ('game_TicTacToe', 'Boter kaas en eieren'), + ('nav_venue_sw_lobby_tournament_1_name', 'Tournament Lobby'), + ('furni_rare_fan*2_name', 'Green Powered Fan'), + ('furni_doormat_plain*2_name', 'Doormat'), + ('furni_table_plasto_square*7_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_intermediate_8/0_desc', ''), + ('furni_noob_table*6_desc', 'Lightweight, practical and green'), + ('win_callforhelp', 'Alert a Moderator'), + ('furni_prizetrophy8*1_desc', 'Glittery gold'), + ('furni_chair_norja*5_name', 'Pink Chair'), + ('furni_hc_tv_desc', 'Forget plasma, go HC!'), + ('furni_divider_arm1_name', 'Corner plinth'), + ('furni_table_plasto_round*7_name', 'Round Dining Table'), + ('furni_petfood3_name', 'Cabbage Mega Multipack'), + ('furni_carpet_standard*9_name', 'Floor Rug'), + ('opening_hours_title', 'Hotel Maintenance'), + ('console_noemail', 'Sorry,'), + ('furni_couch_norja*8_name', 'Yellow Bench'), + ('furni_s_sound_machine*1_desc', 'Sound Machine Grey Desc'), + ('furni_noob_stool*6_name', 'My first Habbo stool'), + ('purse_event', 'ACTIVITY'), + ('reg_readterms_alert', 'You have to read the Terms and Conditions\\r(scroll to the bottom of the text).'), + ('pet.hotwords.beg', 'beg'), + ('furni_jp_drawer_name', 'Japanese Drawer'), + ('gs_state_started', 'This Game has already started...'), + ('furni_sound_set_11_name', 'Dance 4'), + ('furni_divider_nor2*4_name', 'Urban Iced Bar'), + ('queue_set.e2.info', 'There are %e2% Habbos in front of you in the queue.'), + ('furni_bath_name', 'Bubble Bath'), + ('furni_rare_icecream*3_desc', 'Virtual blackcurrant rocks!'), + ('nav_modify_nameoftheroom', 'Name Of The Room'), + ('furni_scifiport*1_desc', 'Energy beams. No trespassers!'), + ('nav_venue_bb_lobby_amateur_12/0_desc', ''), + ('furni_table_silo_small*8_name', 'Yellow Occasional Table'), + ('furni_divider_silo3*3_name', 'White Area Gate'), + ('nav_venue_sw_lobby_amateur_7/0_desc', 'Astetta rankempaa lumisotaa.'), + ('reply', 'Reply'), + ('furni_toilet_yell_desc', 'Loo Seat'), + ('hobba_alert', 'Moderator Alert'), + ('You can play a bunch of exciting games, visit your friends\' rooms or even make your own place and decorate it to your heart\'s delight.', ''), + ('pet.saying.eat.croco.4', '*Buurrrrp*'), + ('furni_tree5_desc', 'Any presents under it yet?'), + ('pet.saying.eat.croco.2', '*Chomp chomp*'), + ('pet.saying.eat.croco.3', 'Mmmm mmmmm....'), + ('furni_divider_poly3*7_name', 'Green Mode Bardesk Gate'), + ('pet.saying.eat.croco.0', 'Mmmm yum yum'), + ('pet.saying.eat.croco.1', 'Ruff ruff ruff'), + ('furni_scifidoor*4_name', 'Emerald Spaceship Door'), + ('furni_edice_name', 'Holo-dice'), + ('furni_divider_nor4*6_name', 'Blue Iced Auto Shutter'), + ('furni_safe_silo*3_desc', 'Totally shatter-proof!'), + ('furni_table_silo_small_desc', 'For those random moments'), + ('gs_header_page', 'Page'), + ('furni_sporttrack3*2_name', 'Sport goal asphalt'), + ('furni_pura_mdl2*6_desc', 'Any way you like it!'), + ('furni_hcamme_name', 'Tubmaster'), + ('furni_carpet_soft*2_desc', 'Soft Wool Rug'), + ('furni_sound_set_12_name', 'Habbo Sounds 2'), + ('forgottenpw_done', 'If the email you gave during registration was correct, your password will be sent to you now.'), + ('navigator.no_category', 'No Category'), + ('login_whatsHabboCalled', 'What\'s your Habbo called?'), + ('furni_scifidoor*3_name', 'Lightblue Spaceship Door'), + ('game_poker', 'POKER'), + ('roomatic_pws', 'Password for selected'), + ('furni_glass_table*8_name', 'Glass table'), + ('furni_one_way_door*8_desc', 'One at a time!'), + ('furni_bardesk_polyfon*9_desc', 'Perfect for work or play'), + ('nav_venue_bb_lobby_tournament_13_name', 'Competitie Battle Ball 14'), + ('pet.hotwords.sit', 'sit'), + ('furni_arabian_tray3_desc', 'Indulge yourself!'), + ('furni_sound_set_40_desc', 'Dude? Cheese!'), + ('console_compose', 'Compose A Message'), + ('furni_table_plasto_square*3_name', 'Square Dining Table'), + ('furni_rclr_sofa_name', 'Polar Sofa'), + ('poster_2005_name', 'Infobus'), + ('furni_table_plasto_4leg*9_name', 'Occasional Table'), + ('furni_chair_norja*9_desc', 'Sleek and chic for each cheek'), + ('Room', 'Room:'), + ('furni_chair_plasty*2_name', 'Plastic Pod Chair'), + ('furni_romantique_pianochair*3_name', 'Turquoise Romantique Piano Chair'), + ('furni_rare_parasol*2_name', 'Orange Parasol'), + ('loading_project', 'Loading Habbo Hotel...'), + ('poster_505_name', 'The Maple Leaf'), + ('furni_traffic_light*2_desc', 'Chill and wait your turn!'), + ('nav_venue_sw_lobby_amateur_4_name', 'Snow Slingers Lobby'), + ('furni_grunge_shelf_name', 'Grunge Bookshelf'), + ('furni_sofa_polyfon*8_name', 'Yellow Mode Sofa'), + ('furni_doorC_desc', 'In a hurry?'), + ('roomatic_nomatch', 'Sorry. Your passwords don\'t match. Please enter them again.'), + ('furni_soft_sofa_norja*9_name', 'Red Iced Sofa'), + ('nav_venue_tv_studio_general/0_desc', 'Suosikki rules! Musaa, leffoja ja staroja!'), + ('nav_venue_sw_arena_amateur_name', 'Playing amateur game'), + ('interface_icon_events', 'Open the room event browser'), + ('furni_grunge_table_desc', 'Students of the round table!'), + ('furni_wooden_screen*9_name', 'Green Oriental Screen'), + ('NUF_getting_room_hotelview_nav', 'Click to open the Navigator.'), + ('furni_table_silo_med*5_name', 'Pink Area Coffee Table'), + ('furni_divider_silo1*9_name', 'Red Area Small Table'), + ('nav_venue_bb_lobby_amateur_4_name', 'Gevorderden Battle Ball 5'), + ('room_badge_hidden', 'Hidden'), + ('pet.saying.generic.cat.0', 'meow'), + ('furni_marquee*3_desc', 'It\'s both door and a shade!'), + ('pet.saying.generic.cat.1', 'meow...meOW'), + ('nav_venue_cunning_fox_gamehall/4_name', 'Chess'), + ('furni_present_gen_desc', 'What\'s inside?'), + ('pet.saying.generic.cat.2', 'muew..muew'), + ('pet.saying.generic.cat.3', 'Purrrrrrrrrr'), + ('furni_scifidoor*1_desc', 'There out of this world!'), + ('pet.saying.generic.cat.4', 'Purrrrr oow'), + ('furni_fridge_name', 'Pura Refridgerator'), + ('furni_rubberchair*2_name', 'Pink Inflatable Chair'), + ('furni_romantique_chair*4_name', 'Amber Chair'), + ('bb_fieldname_5', 'Barebones Classic'), + ('furni_sofa_silo*7_desc', 'Green Area Sofa'), + ('bb_fieldname_4', 'Gothic Hallway'), + ('furni_prizetrophy6*2_name', 'Champion trophy'), + ('bb_fieldname_3', 'Maze Park'), + ('bb_fieldname_2', 'Coral Beach'), + ('bb_fieldname_1', 'Sky Peak'), + ('furni_safe_silo_pb_name', 'postbank Safe'), + ('furni_solarium_norja*2_desc', 'Rejuvenate your pixels!'), + ('furni_table_plasto_bigsquare*7_desc', 'Hip plastic furniture'), + ('reg_check_age', 'Age'), + ('furni_exe_chair2_desc', 'You\'re fired!'), + ('furni_typingmachine_name', 'Typewriter'), + ('human_carrying', 'Carrying:'), + ('furni_grunge_sign_name', 'Road Sign'), + ('loading', 'Loading...'), + ('furni_bed_polyfon_one*6_name', 'Blue Mode Single Bed'), + ('furni_bed_budget_one*1_desc', 'Prince sized comfort!'), + ('furni_sofa_polyfon_name', 'Two-seater Sofa'), + ('furni_jp_lantern_desc', 'For a mellow Eastern glow'), + ('furni_gothic_stool*2_name', 'Golden Gothic Stool'), + ('roomevent_starttime', 'Started at:'), + ('furni_prize1_desc', 'Gorgeously glittery'), + ('furni_prizetrophy9*1_name', 'Champion trophy'), + ('wallitem_guitar_skull_desc', 'tilulilulaa'), + ('gs_title_bestplayer', 'Best player:'), + ('nav_removefavourites', 'Remove from favourites'), + ('furni_toy1_desc', 'it\'s bouncy-tastic'), + ('alert_shortenPW', 'Your password cannot be longer than 9 characters'), + ('normal_roomlayouts', '<< Back to normal room layouts'), + ('furni_noob_rug*1_name', 'My first Habbo rug'), + ('poster_58_name', 'Red knots poster'), + ('furni_divider_nor2*8_desc', 'Yellow Iced bar desk'), + ('furni_carpet_polar*1_name', 'Pink Faux-Fur Bear Rug'), + ('habboclub_continue_button', 'Buy one month'), + ('furni_divider_silo3_desc', 'Form following function'), + ('furni_sound_set_7_name', 'SFX 5'), + ('furni_soft_sofa_norja*5_desc', 'Pink Iced Sofa'), + ('furni_arabian_rug_desc', 'Green blossom design'), + ('restart_tutorial', 'Restart tutorial'), + ('gs_choose_numteams', 'Choose number of Teams:'), + ('hubu_info_t', 'The big FRANK Infobus'), + ('furni_divider_nor5*7_desc', 'Cool cornering for your crib!'), + ('furni_bed_polyfon*4_name', 'Beige Mode Double Bed'), + ('callhelp_allwillreceive', 'A member of community staff will investigate the situation and take appropriate action. This may include sending you a response with advice on dealing with your issue.'), + ('furni_pura_mdl4*4_name', 'White Pura Module 4'), + ('hubu_odotetaan', 'Waiting for replies from others...'), + ('furni_door_name', 'Telephone Box'), + ('furni_doormat_plain*5_desc', 'Available in a variety of colours'), + ('furni_gothic_carpet_desc', 'The path less travelled'), + ('poster_516_desc', 'Eng-er-land'), + ('furni_gothic_stool*6_desc', 'The dark side of Habbo'), + ('furni_traffic_light*3_desc', 'Chill and wait your turn!'), + ('furni_bartable_armas_desc', 'Bar-Style Table - essential for extra guests'), + ('club_isp_change', 'Change your subscription'), + ('furni_summer_grill*2_name', 'Red Barbeque Grill'), + ('poster_23_desc', 'flap, flap, screech, screech...'), + ('furni_prizetrophy7*3_desc', 'Bronze Habbo trophy'), + ('furni_couch_norja*2_name', 'Black Bench'), + ('nav_venue_cunning_fox_gamehall/0_desc', 'Pit your wits on the battlefield, the board or the baize - choose what to play here'), + ('furni_jp_tatami2_name', 'Large Tatami Mat'), + ('furni_pura_mdl3*3_desc', 'Any way you like it!'), + ('furni_house_name', 'Gingerbread House'), + ('furni_sound_set_54_name', 'Oh Blinging Tree'), + ('furni_table_plasto_4leg*1_name', 'Square Dining Table'), + ('furni_pillow*1_name', 'Pink Fluffy Pillow'), + ('NUF_console_hotelview_tutor', 'Oh! You have a message on your Habbo Console. Let\'s see who it is.'), + ('LoadingRoom', 'Loading room...'), + ('rotate', 'Rotate'), + ('nav_venue_sw_lobby_beginner_6_name', 'Snow Rookies Lobby'), + ('nav_venue_bb_lobby_amateur_1/0_desc', ''), + ('furni_jukebox_ptv*1_desc', 'Jukebox Pacha TV'), + ('nav_venue_star_lounge/0_desc', 'Chat with Sean Kingston here!'), + ('furni_chair_plasty*6_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_tournament_10/0_desc', ''), + ('NUF_mini_use_console_hotelview_tutor', 'Ah! You have a message on your Habbo Console. Let\'s see who it is.'), + ('furni_rare_xmas_screen_name', 'Lappland Greetings'), + ('summer_chair_9_name', 'Red Deck Chair'), + ('club_timefull', 'Sorry, you can only buy up to three months of Habbo Club subscription in advance.'), + ('poster_2002_desc', 'Presidentin muotokuva'), + ('poster_7_name', 'Hammer Cabinet'), + ('furni_gothic_chair*2_name', 'Golden Gothic Chair'), + ('bb_header_powerups', 'Powerups in game:'), + ('credit_redeem_url', 'http://%predefined%//help/19'), + ('furni_divider_silo3*2_name', 'Black Area Gate'), + ('furni_chair_plasto*16_name', 'Chair'), + ('catalog_itsurs', 'Yay! It\'s being delivered now..'), + ('hobba_pickandreply', 'Pick & Reply'), + ('reg_terms', 'Welcome to Habbo Hotel. If you are under 16, please check the Terms and Conditions with your parents/guardian before you agree to them. Get them to explain anything that you don\'t understand.\\rIn order to use the service you have to give valid information about yourself when registering. Please email us if any of your user information changes.\\rAs a user of Habbo Hotel - www.habbohotel.co.uk , you have to behave according to the Habbo Way (hotel rules) and the Terms and Conditions. Click the links below to read about them.\\rNever give your password or email address to anyone. If you do, your Habbo may get stolen.\\rRegistering with the hotel, making your own empty room and chatting is free of charge. For a small fee you can decorate your room with virtual furniture, play games and join the Habbo Club. If you wish to buy, you will need your parent\'s permission to do so.'), + ('furni_summer_pool*1_name', 'Blue Summer Pool'), + ('furni_heartsofa_desc', 'Perfect for snuggling up on'), + ('furni_scifiport*3_name', 'Jade Sci-Fi Port'), + ('furni_glass_chair*6_name', 'Blue Glass Chair'), + ('furni_sound_set_62_name', 'Alhambra Trax 1'), + ('win_voucher', 'Habbo Credit Code'), + ('furni_summer_chair*4_desc', 'White'), + ('furni_bed_polyfon_one_desc', 'Cot of the artistic'), + ('nav_venue_bb_lobby_tournament_5/0_desc', ''), + ('nav_venue_bb_lobby_beginner_3_name', 'Beginners Battle Ball 4'), + ('console_follow_not_friend', 'The user you tried to follow is not your friend anymore.'), + ('delete', 'Delete'), + ('furni_grunge_mattress_desc', 'Beats sleeping on the floor!'), + ('furni_rare_icecream*7_name', 'Chocolate Ice Cream Machine'), + ('sound_machine_alert_no_disks', 'You don\'t have any more discs!'), + ('furni_sofachair_silo_name', 'Armchair'), + ('nav_venue_sw_lobby_expert_0_name', 'Snow Marksmen Lobby'), + ('game_waitop', 'WAITING FOR THE OPPONENT'), + ('Alert_NameAlreadyUse', 'That name is already being used'), + ('furni_queue_tile1*1_desc', 'The power of movement'), + ('poster_18_name', 'Butterfly Cabinet 2'), + ('furni_wooden_screen*6_desc', 'Add an exotic touch to your room'), + ('furni_noob_table*2_name', 'My first Habbo table'), + ('furni_tree1_name', 'Dead tree'), + ('nav_venue_bouncer_room_0_name', 'Battle Ball Competitie Arena'), + ('furni_traffic_light*5_name', 'White Traffic Light'), + ('furni_sw_raven_name', 'Mrs Raven'), + ('cam_shoot.help', 'Shutter Release'), + ('furni_grand_piano*3_desc', 'Make sure you play in key!'), + ('nav_venue_sw_lobby_intermediate_2_name', 'Snow Bombardiers Lobby'), + ('interface_icon_purse', 'Purse, manage your coins'), + ('poll_alert_server_error', 'The poll isn\'t available anymore. Polls are only available at a certain public space for a certain duration.'), + ('sound_machine_confirm_delete_long', 'Are you sure you want to delete the selected song?'), + ('reg_check_confirm', 'Please check that your information is correct, especially your birthdate and Habbo name. You CANNOT change these later. If you want make any changes now, press the back button.'), + ('Alert_CheckBirthday', 'Please check your birthday'), + ('furni_shelves_norja*4_desc', 'For nic naks and tech books'), + ('club_expired_link', 'Click here to join Habbo Club'), + ('poster_520_desc', 'Every colour for everyone'), + ('nav_venue_bb_lobby_intermediate_desc', 'Intermediate battle ball!'), + ('tutorial_restart_button_bubble', 'Remember! Anytime you want to relive the fun click here to restart the tutorial!'), + ('poster_1_name', 'Comedy Poster'), + ('reg_verification_incorrectBirthday', 'Your birthday was incorrect'), + ('furni_glass_stool*6_name', 'Blue Glass Stool'), + ('furni_CFC_100_coin_gold_desc', 'Worth 100 Credits'), + ('buddyremove_list_full', 'Your friends list is full, you can\'t add new friends until you delete some. \\r\\The maximum number of friends you can have, is %mylimit% Habbos. Members of Habbo Club can have up to %clublimit% friends on their list.'), + ('furni_bunny_name', 'Squidgy Bunny'), + ('furni_small_chair_armas_name', 'Stool'), + ('nav_venue_sw_lobby_free_0/0_desc', ''), + ('furni_sofachair_silo*3_name', 'White Armchair'), + ('furni_sound_machine*2_desc', 'Dance to the Habbo Club beat!'), + ('nav_venue_gate_park/0_desc', 'Follow your path...'), + ('NUF_mini_use_console_hotelview_icon', 'Click the icon to open your Habbo Console.'), + ('nav_venue_eric\'s_eaterie/0_desc', 'Join Eric for a bite to eat'), + ('furni_table_silo_med*8_desc', 'Wipe clean and unobtrusive'), + ('poster_503_desc', 'There\'s no holes in this...'), + ('furni_bardeskcorner_polyfon*9_name', 'Red Corner Desk'), + ('furni_val_randomizer_desc', 'Surprise surprise! (Cilla Black not included)'), + ('furni_marquee*2_name', 'Red Dragon Marquee'), + ('furni_table_plasto_round_name', 'Round Dining Table'), + ('furni_summer_chair*3_name', 'Deck Chair'), + ('club_paycoins', 'Buy subscription'), + ('nav_venue_beauty_salon_general/0_desc', 'Join in the fun of Fashion Week! Check the homepage now for details.'), + ('furni_rare_dragonlamp*7_name', 'Sky Dragon Lamp'), + ('nav_venue_bb_lobby_beginner_6/0_desc', ''), + ('roomevent_quit', 'End event'), + ('console_search_habbo_lasthere', 'Last time'), + ('trading_title', 'Safe Trading'), + ('furni_glass_chair*7_desc', 'Habbo Club'), + ('gs_error_game_deleted', 'The Game has been deleted.'), + ('recycler_info_link_url', 'http://%predefined%/help/36'), + ('furni_pillar*6_name', 'Terracotta Pillar'), + ('furni_tile_stella_desc', '10% off the walk of fame!'), + ('transaction_system_sms_win_tmobile', 'T-Mobile SMS'), + ('buddyremove_names_ordered', 'Names Ordered By:'), + ('pet_race_2_010', 'Giggly Go-go'), + ('furni_table_plasto_bigsquare*6_name', 'Square Dining Table'), + ('pet_race_2_011', 'Petty Petsuchos'), + ('summer_chair_6_name', 'Blue Deck Chair'), + ('console_now', 'now:'), + ('gs_skill_changed', 'You have advanced to the next skill level. Your level is now %1!'), + ('roomatic_goyourroom', 'Go to your room'), + ('furni_carpet_soft*4_name', 'Soft Wool Rug'), + ('sound_machine_confirm_close_list', 'Close playlist editor?'), + ('pet.hotwords.good', 'good'), + ('furni_pura_mdl4*7_desc', 'Any way you like it!'), + ('furni_carpet_soft*1_name', 'Soft Wool Rug'), + ('furni_sound_set_22_desc', 'With a hamper full of sounds, not sarnies'), + ('nav_venue_sw_lobby_tournament_7_name', 'Tournament Lobby'), + ('furni_divider_nor3*6_desc', 'Blue Iced gate'), + ('furni_carpet_standard*3_name', 'Floor Rug'), + ('people', 'People'), + ('pet_race_2_007', 'Pretty Pui Pui'), + ('pet_race_2_008', 'Indifferent'), + ('pet_race_2_009', 'Swampy Siamese'), + ('furni_wcandle_name', 'White Candle'), + ('furni_sporttrack1*1_desc', 'null'), + ('furni_solarium_norja*1_name', 'Black Solarium'), + ('NUF_playing_games_gamecategories_tutor', 'Click the Beginner category to open it wide open. Like a melon!'), + ('pet_race_2_003', 'Silly Sobek'), + ('pet_race_2_004', 'Dirty Dundee'), + ('pet_race_2_005', 'Galled Gator'), + ('int_credits', 'Credits'), + ('furni_gothrailing_name', 'Gothic Railing'), + ('furni_sporttrack2*2_desc', 'null'), + ('pet_race_2_006', 'Confused Croc'), + ('furni_shelves_polyfon_name', 'Bookcase'), + ('pet_race_2_000', 'Endangered Albino'), + ('pet_race_2_001', 'Krazy Krokodilos'), + ('pet_race_2_002', 'Nile Dile'), + ('furni_divider_nor2*2_desc', 'Black Iced bar desk'), + ('log_problem_text', 'Oops.. Cannot connect to Habbo Hotel'), + ('furni_divider_nor2*5_desc', 'Pink Iced bar desk'), + ('nav_venue_sw_lobby_amateur_6/0_desc', 'Astetta rankempaa lumisotaa.'), + ('furni_rare_fountain_desc', 'For our feathered friends'), + ('furni_glass_sofa*5_name', 'Glass sofa'), + ('poster_33_desc', 'We can\'t bear to lose them'), + ('nav_venue_bb_lobby_tournament_14/0_desc', ''), + ('furni_summer_chair*6_name', 'Deck Chair'), + ('furni_hcsohva_desc', 'For royal bottoms...'), + ('furni_bed_budget*4_desc', 'King sized comfort!'), + ('furni_christmas_poop_desc', 'Bob?s magical fertilizer'), + ('furni_pura_mdl5*7_name', 'Green Pura Module 5'), + ('furni_barrier*1_desc', 'No escape this way!'), + ('nav_venue_bb_lobby_amateur_8/0_desc', ''), + ('furni_divider_arm2_desc', 'I wooden go there'), + ('furni_chair_plasty*11_desc', 'Hip plastic furniture'), + ('furni_small_table_armas_desc', 'Practical and beautiful'), + ('nav_venue_theatredrome_xmas_name', 'Theatredrome Xmas'), + ('poster_62_name', 'Save The Panda'), + ('reg_verification_currentPassword', 'Current password:'), + ('game_poker_change', 'Choose cards to change'), + ('NUF_getting_items_hotelview_nav', 'Click here to open the Navigator'), + ('furni_chair_basic*9_name', 'Red Pura Egg Chair'), + ('friend_request_failed', 'Failed!'), + ('furni_noob_chair*4_desc', 'Lightweight, practical, with light blue stripes'), + ('furni_table_silo_small*9_desc', 'Red Area Occasional Table'), + ('nav_hotelview', 'Hotel view'), + ('furni_toy1*3_desc', 'it\'s bouncy-tastic'), + ('furni_divider_nor3*2_name', 'Black Iced gate'), + ('furni_chair_silo*6_name', 'Blue Silo Dining Chair'), + ('update_password_suggest', 'Habbo Hotel security supervisor requests you to update your password'), + ('nav_venue_orient_name', 'Club Orient'), + ('Alert_NameTooLong', 'Sorry, that username is too long!'), + ('furni_sound_set_37_name', 'Sound set 37'), + ('furni_barchair_silo*7_desc', 'Practical and convenient'), + ('wallitem_wallmirror_name', 'Wallmirror'), + ('furni_chair_plasty*8_name', 'Plastic Pod Chair'), + ('sound_machine_confirm_close_list_long', 'Are you sure you want to exit playlist editor without saving?'), + ('furni_hc_frplc_name', 'Heavy Duty Fireplace'), + ('dance4', 'The Rollie'), + ('dance3', 'Duck Funk'), + ('furni_glass_stool*9_name', 'Glass stool'), + ('furni_sound_set_55_desc', 'Can you fill me in?'), + ('furni_carpet_standard*7_desc', 'Available in a variety of colours'), + ('poster_4_name', 'Bear Plaque'), + ('cam_zoom_out.help', 'Zoom Out'), + ('furni_sofa_polyfon*2_name', 'Black Mode Sofa'), + ('furni_prizetrophy2*1_name', 'Duck trophy'), + ('furni_scifirocket*3_desc', 'Caution! Unknown Location!'), + ('NUF_getting_items', 'Getting items'), + ('furni_val_teddy*1_desc', 'The grey bear of affection'), + ('furni_sofachair_polyfon*7_name', 'Green Mode Armchair'), + ('club_habbo.bottombar.link.member', '%days% days'), + ('habboclub_confirm_header', 'Subscription costs %price% credits'), + ('furni_rare_daffodil_rug_desc', 'A little bit of outdoors indoors..'), + ('poster_15_name', 'Himalayas Poster'), + ('furni_smooth_table_polyfon_desc', 'For larger gatherings'), + ('dance2', 'Pogo Mogo'), + ('furni_wooden_screen*3_name', 'Aqua Oriental Screen'), + ('furni_plant_cruddy_desc', 'Goodbye Bert...'), + ('dance1', 'Hab-Hop'), + ('furni_gothic_chair*6_desc', 'The dark side of Habbo'), + ('furni_table_plasto_square*9_name', 'Square Dining Table'), + ('nav_venue_bb_lobby_beginner_14/0_desc', ''), + ('furni_club_sofa_desc', 'Club sofa'), + ('roomevent_default_name', 'Event name..'), + ('game_poker_ok', 'Change cards'), + ('nav_venue_picnic_dudesons/0_desc', 'Duudsoneiden sponssaama oma Ranchi - www.extremeduudsonit.com'), + ('nav_venue_hallway/0_desc', 'Beware the ghosts and ghouls!'), + ('nav_venue_park/0_desc', 'Go for a stroll outdoors'), + ('console_fr_declined_count', 'Amount to be declined'), + ('furni_tree4_name', 'Christmas Tree 2'), + ('NUF_console_read_link', 'Click the link to open the message.'), + ('win_figurecreator', 'Habbo Details'), + ('furni_table_plasto_square*14_name', 'Occasional Table'), + ('furni_soft_sofachair_norja*6_desc', 'Blue Iced Sofachair'), + ('nav_venue_bb_lobby_beginner_0_name', 'Beginner'), + ('Alert_LogoNameAlreadyUse', 'That name is already being used'), + ('poster_25_name', 'Snowman Poster'), + ('furni_pura_mdl2*2_name', 'Pink Pura Module 2'), + ('furni_chair_plasto*13_name', 'Chair'), + ('furni_ticket_name', 'Small Ticket Bundle'), + ('furni_hc_lmpst_name', 'Victorian Street Light'), + ('furni_scifiport*7_desc', 'Energy beams. No trespassers!'), + ('jukebox_load_trax', 'Load Trax'), + ('furni_val_teddy*4_desc', 'The brown bear of naughtiness'), + ('reg_birthdayformat_update', 'Birthday (dd.mm.yyyy)'), + ('nav_venue_the_chromide_club_name', 'The Chromide Club'), + ('roomevent_not_available', 'Sorry, no events available'), + ('nav_venue_sw_lobby_beginner_0/0_desc', ''), + ('summer_chair_3_name', 'Black Deck Chair'), + ('int_newrequests', 'Friend Request(s)'), + ('console_profile_helptext', 'The Habbo Profile is a snapshot of your interests and hobbies - simply tick the things you like.'), + ('nav_roomnfo_hd_fav', 'Favourite Rooms'), + ('furni_chair_plasto*3_desc', 'Hip plastic furniture'), + ('furni_chair_basic*6_name', 'Blue Pura Egg Chair'), + ('number_4', '4'), + ('number_3', '3'), + ('number_2', '2'), + ('room_open_package', 'Open The Present'), + ('furni_grunge_barrel_name', 'Flaming Barrel'), + ('wallitem_photo_desc', 'Photo from Habbo'), + ('poster_30_desc', 'Pucker up'), + ('furni_glass_table*9_desc', 'Translucent beauty'), + ('nav_venue_sw_lobby_beginner_3_name', 'Snow Rookies Lobby'), + ('Alert_YouAreBanned', 'You have been banned for breaking the Habbo Way. This is why (if no ban reason is shown use the Contact Us form):'), + ('furni_gothic_sofa*2_name', 'Golden Gothic Sofa'), + ('NUF_getting_items_hotelview_tutor', 'Let us find out how to purchase items from the Hotel Catalogue. The Catalogue contains loads of cool stuff to decorate your Habbo room with. To begin open the Navigator.'), + ('furni_table_norja_med*2_desc', 'For larger gatherings'), + ('furni_sofa_silo*3_name', 'White Two-Seater Sofa'), + ('furni_pura_mdl5*5_desc', ''), + ('nav_venue_sw_lobby_beginner_desc', 'Yes, take a load of snowballs and hit the enemy Teams. Easy, isn\'t it?'), + ('furni_romantique_smalltabl*5_name', 'Onyx Tray Table'), + ('furni_divider_nor4_desc', 'Habbos, roll out!'), + ('furni_shelves_norja*7_desc', 'For nic naks and cookery books'), + ('nav_venue_sw_lobby_intermediate_4/0_desc', 'Lumisota sen kuin vain kovenee.'), + ('gs_text_spectate', 'You can watch this game'), + ('recycler_info_link', 'More information about Furni Recycler'), + ('furni_sofachair_polyfon_name', 'Armchair'), + ('club_intro_text', 'Members of Habbo Club get LOTS of cool stuff!\\rWith Habbo Club you get cool dances, access to Club Mammoth and The Blue Dragon Tavern, and a 500 limit on your friends list!'), + ('furni_divider_nor1*7_desc', 'The missing piece'), + ('url_helppledge', 'http://%predefined%//help/22'), + ('jukebox_song_name', '%name%'), + ('game_bs_won', 'WON!'), + ('furni_soft_jaggara_norja_name', 'Iced Sofachair'), + ('furni_rare_beehive_bulb_desc', 'A honey-hued glow'), + ('furni_chair_norja*8_name', 'Yellow Chair'), + ('poster_83_desc', 'Pöllö huhuilee, huhuu!'), + ('floodblocking', 'You are typing too fast - don\'t flood the room.'), + ('furni_CF_5_coin_silver_desc', 'Worth 5 Credits'), + ('sound_machine_confirm_clear', 'Clear the song?'), + ('furni_carpet_standard*6_name', 'Floor Rug'), + ('furni_waterbowl*2_desc', 'Aqua unlimited'), + ('sw_link_tournament_highScores_url', 'http://%predefined%//groups/56553/id'), + ('NUF_meeting_people_room_tutor', 'This is a Public Room. Your Habbo is in the doorway beneath the orange arrow. Click on another user to find out more about them.'), + ('furni_bottle_name', 'Empty Spinning Bottle'), + ('poster_512_name', 'The Irish flag'), + ('club_info_url', 'http://%predefined%//credits/habboclub'), + ('nav_venue_tv_studio_nike/0_desc', ''), + ('furni_couch_norja*6_desc', 'Two can perch comfortably'), + ('furni_pura_mdl5*8_desc', 'Any way you like it!'), + ('furni_carpet_valentine_desc', 'For making an appearance'), + ('furni_floortile_desc', 'In Variety of Colours'), + ('furni_pillar*9_name', 'Rock Pillar'), + ('furni_table_plasto_bigsquare*3_name', 'Square Dining Table'), + ('furni_bardeskcorner_polyfon*12_name', 'Corner Cabinet/Desk'), + ('furni_divider_nor1*4_desc', 'The missing piece'), + ('furni_chair_plasty*5_name', 'Plastic Pod Chair'), + ('furni_scifirocket*0_desc', 'See in 2007 with a bang!'), + ('poster_32_name', 'Siva Poster'), + ('club_button_2_period', 'Buy 3 >>>'), + ('furni_sound_set_58_desc', 'Sh-shake it!'), + ('furni_china_shelve_desc', 'To hold the mind\'s treasures'), + ('furni_scifidoor*7_desc', 'There out of this world!'), + ('furni_chair_silo*9_name', 'Red Silo Dining Chair'), + ('furni_gothic_stool*5_name', 'Green Gothic Stool'), + ('friend_request_massoperation_cancel', 'Back to request list.'), + ('furni_queue_tile1*0_name', 'White Quest Roller'), + ('furni_divider_nor3*5_name', 'Pink Iced gate'), + ('furni_sound_machine*5_desc', 'Heard the Habbo Bands new singles?'), + ('furni_glass_table*6_desc', 'Translucent beauty'), + ('furni_soft_sofachair_norja*9_desc', 'Red Iced Sofachair'), + ('furni_plant_mazegate_desc', 'Did we make it?'), + ('tickets_info_1', 'With 2 tickets you can play the following Games:\\r10 BattleBall:Rebound!\\r10 SnowStorm\\r20 Wobble Squabble or\\r20 Lido Diving'), + ('furni_barchair_silo*4_desc', 'Practical and convenient'), + ('furni_CF_10_coin_gold_name', 'Gold Coin'), + ('tickets_info_2', 'With 20 tickets you can play the following Games:\\r10 BattleBall:Rebound!\\r10 SnowStorm\\r20 Wobble Squabble or\\r20 Lido Diving'), + ('furni_sound_set_15_desc', 'Unadulterated essentials'), + ('handitem1', 'Tea'), + ('furni_romantique_divan*3_desc', 'null'), + ('furni_glass_sofa*8_name', 'Glass sofa'), + ('epsnotify_1001', 'The hotel is full at the moment. Please try again in a few minutes.'), + ('furni_table_silo_med*2_name', 'Black Coffee Table'), + ('furni_sleepingbag*7_name', 'Orange Sleeping Bag'), + ('furni_pillow*5_desc', 'Puffy, soft and huge'), + ('furni_bed_budget*1_desc', 'King sized comfort!'), + ('furni_bed_trad_one_name', 'Plain Single Bed'), + ('catalog_giftfor', 'This is a gift for:'), + ('furni_theatre_seat_name', 'Deluxe Theatre Chair'), + ('furni_romantique_divider*3_name', 'Turquoise Screen'), + ('furni_shelves_silo_desc', 'For nic naks and art deco books'), + ('handitem9', 'Decaff'), + ('handitem8', 'Regular'), + ('handitem7', 'Water'), + ('furni_glass_table_name', 'Glass table'), + ('console_selection_invert', 'Invert selection'), + ('handitem6', 'Blackcurrant'), + ('furni_hc_machine_desc', 'By and for mad inventors'), + ('handitem5', 'Milk'), + ('handitem4', 'Ice-cream'), + ('poster_40_desc', 'The one and only. Adore her!'), + ('nav_venue_sw_lobby_tournament_9/0_desc', ''), + ('handitem3', 'Carrot'), + ('handitem2', 'Juice'), + ('furni_cn_sofa_name', 'Chinese Sofa'), + ('nav_venue_bb_lobby_expert_4/0_desc', ''), + ('poster_502_name', 'The Stars and Stripes'), + ('furni_md_rug_name', 'Bubble Juice Floor'), + ('furni_table_plasto_bigsquare_name', 'Square Dining Table'), + ('furni_bed_polyfon*8_desc', 'Yellow Mode Double Bed'), + ('nav_venue_sw_lobby_amateur_7_name', 'Snow Slingers Lobby'), + ('furni_birdie_desc', 'Cheep (!) and cheerful'), + ('poster_12_name', 'Lapland Poster'), + ('club_desc_1_period', '1 Month (31 days) = 25 Credits'), + ('hobba_emergency_help', 'Call For Emergency Help:'), + ('reg_age_check_note', 'Enter your birthday. You will need your birthday information when changing your password or email.'), + ('furni_table_plasto_square*6_name', 'Square Dining Table'), + ('trade', 'Trade'), + ('furni_romantique_smalltabl*3_desc', 'Every tray needs a table...'), + ('reg_back', 'Back'), + ('furni_tree7_name', 'Snowy Christmas Tree'), + ('recycler_trader_open_alert', 'Recycling cannot begin while you are trading. Please close the safe trading box before recycling.'), + ('furni_rare_dragonlamp*8_desc', 'Scary and scorching!'), + ('furni_gothic_chair*3_desc', 'The head of the table'), + ('Alert_YourNameIstooShort', 'Habbo names must be at least 3 characters long.'), + ('furni_bed_budgetb_desc', 'Sweet dreams for two'), + ('furni_shelves_basic_name', 'Pura Shelves'), + ('console_messagemode_helptext', 'You can send an instant message to your Habbo Friends.'), + ('nav_venue_cunning_fox_gamehall/5_desc', 'Get a hand like a foot? Keep a straight face and bluff it out'), + ('furni_table_polyfon_small_name', 'Small Coffee Table'), + ('move_furniture', 'Move Furni'), + ('nav_searchbutton', 'Search'), + ('furni_habboween_grass_desc', 'Autumnal chills with each rotation!'), + ('furni_pura_mdl5*2_desc', 'Any way you like it!'), + ('NUF_meeting_people_user_tutor', 'The user you clicked on is shown in the corner of your screen. The buttons beneath the Habbo let you visit their Habbo Home, send them a Friend Request or ignore them if they look or act like a moron.'), + ('poster_55_name', 'Tree of Time'), + ('furni_soft_sofachair_norja*5_name', 'Pink Iced Sofachair'), + ('furni_sound_set_48_name', 'Club 3'), + ('furni_table_plasto_4leg_desc', 'Hip plastic furniture'), + ('furni_pura_mdl4*1_name', 'Aqua Pura Module 4'), + ('login_forgottenPassword_url', 'https://www.habbo.co.uk/account/password/forgot'), + ('nav_venue_floatinggarden/0_desc', 'Peace, tranquility and still waters'), + ('furni_sound_set_36_desc', 'For adult minded'), + ('poster_43_desc', 'Shake, rattle and roll'), + ('furni_gothic_stool*3_desc', 'The dark side of Habbo'), + ('room_alert_furni_limit', 'This room has the maximum amount of Furni.'), + ('furni_table_plasto_square*15_name', 'Occasional Table'), + ('furni_rare_hammock_name', 'Hammock'), + ('sound_machine_confirm_burn_long', 'Are you sure you want to burn this song to disc? Burning costs one credit.'), + ('furni_rclr_chair_desc', 'Watch out for coconuts'), + ('furni_chair_basic*3_desc', 'It\'s a cracking design!'), + ('furni_doormat_plain*6_name', 'Doormat'), + ('furni_sofachair_polyfon*9_name', 'Red Armchair'), + ('furni_jp_tray6_name', 'jp_tray6'), + ('furni_habbocake_name', 'Cake'), + ('poster_501_name', 'Jolly Roger'), + ('nav_goingprivate', 'Going to Guest room'), + ('furni_bed_budget_one*9_name', 'Red Pura Bed'), + ('alert_no_category', 'Your room has no category. Select one from the list.'), + ('nav_venue_theatredrome_easter/0_desc', ''), + ('gs_button_buytickets', 'Buy Tickets'), + ('nav_venue_bouncer_room_4_name', 'Experts Battle Ball Arena'), + ('close', 'Close'), + ('furni_carpet_standard*9_desc', 'Available in a variety of colours'), + ('furni_prizetrophy4*1_desc', 'Glittery gold'), + ('help_pointer_1', 'http://www.habbo.co.uk/help/'), + ('help_pointer_3', 'emergency_help'), + ('furni_rclr_lamp_name', 'Moon Lamp'), + ('help_pointer_2', 'http://www.habbohotel.co.uk/iot/go?lang=en&country=uk'), + ('furni_exe_sofa_desc', 'Relaxing leather comfort'), + ('furni_divider_silo1*4_name', 'Beige Area Corner Shelf'), + ('poster_2001_name', 'SeinNightitititititdiskotappaja'), + ('interface_icon_tv_close', 'Leave the Room and close the Habbovision mode.'), + ('furni_sound_machine*7_name', 'Red Traxmachine'), + ('game_bs_hit', 'A Hit!:'), + ('furni_rare_fan*2_desc', 'It\'ll blow you away!'), + ('win_place', 'Note!'), + ('nav_venue_bb_lobby_beginner_11_name', 'Beginners Battle Ball 12'), + ('furni_pillow*7_desc', 'Bonnie\'s pillow of choice!'), + ('furni_table_silo_small*8_desc', 'For those random moments'), + ('furni_divider_nor4*5_desc', 'Habbos, roll out!'), + ('hubu_vastaa', 'Answer the question'), + ('furni_pura_mdl4*8_name', 'yellow pura module 4'), + ('furni_glass_chair*9_name', 'Glass chair'), + ('furni_chair_silo*7_desc', 'Green Silo Dining Chair'), + ('furni_jp_drawer_desc', 'Spiritual home for odds and ends'), + ('tutorial_select_another_topic', 'Select another topic'), + ('furni_noob_lamp*4_desc', 'Get the light right where you want it (light blue)'), + ('nav_venue_beauty_salon_general_name', 'Beauty salon'), + ('furni_sofachair_polyfon*2_name', 'Black Mode Armchair'), + ('console_report_header', 'Report Abusive Message'), + ('club_buy_url', 'http://%predefined%//credits/habboclub'), + ('furni_prizetrophy*2_name', 'Classic trophy'), + ('furni_rare_icecream*4_name', 'Strawberry Ice Cream Machine'), + ('furni_barchair_silo*5_desc', 'Practical and convenient'), + ('furni_divider_nor2*4_desc', 'No way through'), + ('furni_xmas_cstl_gate_name', 'Ice Castle Gate'), + ('furni_noob_stool*5_desc', 'Unfold me and take the weight off (pink)'), + ('furni_bed_budgetb_one_name', 'Plain Single Bed'), + ('friend_request_accept_all', 'Accept all requests.'), + ('furni_val_choco_name', 'Heart Shaped Box'), + ('poster_514_desc', 'Be proud to be in the Union!'), + ('furni_carpet_legocourt_desc', 'Line up your slam dunk'), + ('furni_sofa_silo_name', 'Two-Seater Sofa'), + ('furni_chair_plasto*8_desc', 'Hip plastic furniture'), + ('furni_tree5_name', 'Christmas Tree 3'), + ('nav_venue_habbo_cinema/0_desc', 'Now showing: Kick Warz II - The revenge of Donnie Santini!'), + ('furni_couch_norja*4_name', 'Urban Iced Bench'), + ('poster_52_desc', 'whack that ball!'), + ('furni_sound_set_45_desc', 'The Bass? is the rhythm!'), + ('nav_venue_sun_terrace/0_name', 'Sun Terrace'), + ('queue_tile_limit', 'You can\'t fit more Habbo Rollers in this room!'), + ('BuddyRequesta', 'Friend Request(s)'), + ('transaction_system_sms_rl', 'Elisa'), + ('furni_prizetrophy4_desc', 'Palkinto'), + ('furni_hcamme_desc', 'Time for a soak'), + ('furni_scifirocket*2_name', 'Earth Smoke Machine'), + ('furni_divider_nor5*2_desc', 'Cool cornering for your crib y0!'), + ('forgottenpw', 'Forgotten your password?'), + ('furni_rclr_sofa_desc', 'Snuggle up together'), + ('furni_val_cauldron_desc', 'Cast a loving spell!'), + ('poster_3_name', 'Fish Plaque'), + ('furni_one_way_door*8_name', 'Yellow One Way Gate'), + ('furni_divider_nor3*8_desc', 'Yellow Iced gate'), + ('sw_link_highScores_url', 'http://%predefined%//groups/56553/id'), + ('furni_carpet_standard*2_desc', 'Available in a variety of colours'), + ('nav_venue_sport/0_name', 'The Power Gym'), + ('furni_scifidoor*3_desc', 'There out of this world!'), + ('furni_pillar*7_desc', 'Recovered from Habblantis'), + ('furni_arabian_tray3_name', 'Sweets Tray'), + ('furni_chair_plasto_name', 'Chair'), + ('nav_venue_pizza_name', 'Slice of Life'), + ('url_privacypledge', 'http://%predefined%//help/69'), + ('furni_one_way_door*3_desc', 'One way! The HC way!'), + ('catalog_purchase_not_allowed_hc', 'In order to buy this item you must be a Habbo Club member!'), + ('furni_pura_mdl3*4_name', 'White Pura Module 3'), + ('room_confirmDelete', 'Confirm'), + ('BuddyPrivateRoom', 'In A Guest Room'), + ('furni_marquee*7_desc', 'It\'s both door and a shade!'), + ('furni_bath_desc', 'The ultimate in pampering'), + ('furni_soft_sofa_norja*3_desc', 'Pristine white, keep it clean!'), + ('game_BattleShip', 'Battleships'), + ('furni_sound_set_11_desc', 'Music you can really sink your teeth into'), + ('furni_glass_chair*2_name', 'Glass chair'), + ('furni_sofa_silo*5_desc', 'Pink Area Sofa'), + ('furni_pura_mdl2*7_name', 'Green Pura Module 2'), + ('cam_film.help', 'Number Of Photos Left'), + ('nav_venue_bb_lobby_tournament_17/0_desc', ''), + ('roomatic_hway', 'Hotel guests are expected to follow the Habbo Way even if word filtering is switched off.'), + ('modify', 'Modify'), + ('furni_sofachair_silo*8_name', 'Yellow Armchair'), + ('alert_reg_blocked', 'A person under 11 years of age has tried to register from this machine recently.\\rRegistration is not possible for a while.'), + ('furni_sofa_polyfon*8_desc', 'Yellow Mode Sofa'), + ('furni_wooden_screen*9_desc', 'Add an exotic touch to your room'), + ('hobba_message_from', 'Your call has been responded to as follows:'), + ('win_help', 'Habbo Help'), + ('pet.saying.sniff.dog.1', 'snuh...SNUUUUUH'), + ('pet.saying.sniff.dog.0', 'snuuh..snuuh'), + ('sw_user_skill', 'Snow Storm Skill Level: \\x \\r (\\y points)'), + ('furni_rom_lamp_desc', 'Light up your life'), + ('console_profile_create', 'Create your Habbo Profile.'), + ('furni_CF_50_goldbar_desc', 'Worth 50 Credits'), + ('furni_romantique_chair*4_desc', 'What does this button do?'), + ('reg_use_allowed_chars', 'Use only these characters:'), + ('furni_bar_chair_armas_name', 'Barrel Stool'), + ('pet.saying.sniff.dog.2', '*sighs*'), + ('furni_sound_set_64_name', 'Alhambra Trax 3'), + ('furni_pillar*3_name', 'blue pillar'), + ('furni_glass_chair*4_desc', 'Translucent beauty'), + ('furni_pizza_desc', 'You dirty Habbo'), + ('opening_hours_text_shutdown', 'The Hotel will shut down in %d% minutes. To avoid confusion, purchasing of furniture, Habbo Club and game tickets will be disabled during that time, as well as playing Games and furniture trading. Thank you for visiting and welcome back tomorrow!'), + ('nav_venue_bb_lobby_tournament_10_name', 'Competitie Battle Ball 11'), + ('poster_521_desc', 'Ordem e progresso'), + ('furni_sound_set_52_desc', 'Under the mistletoe!'), + ('furni_shelves_norja*3_name', 'White Iced Bookcase'), + ('furni_scifiport*5_desc', 'Recovered from Roswell'), + ('help_emergency_writeyour', 'Give details of your emergency here:'), + ('furni_table_norja_med*6_name', 'Large Coffee Table Blue'), + ('nav_venue_bb_lobby_expert_3_name', 'Experts Battle Ball 4'), + ('photo_legend', 'Caption'), + ('furni_sofachair_silo_desc', 'Large, but worth it'), + ('console_youdonthavebuddies', 'You have no Friends on your list.\\rYou can send Friend Requests using\\rthe \'search\' button.'), + ('furni_table_plasto_4leg*6_name', 'Occasional table Table'), + ('furni_scifidoor*1_name', 'Pink Spaceship Door'), + ('furni_tile_brown_desc', '10% off downtown promenades & piazzas!'), + ('NUF_getting_room_go_button', 'Click here to go to your just created room!'), + ('dimmer_turn_on', 'Turn ON'), + ('furni_sofa_polyfon_desc', 'Comfort for stylish couples'), + ('furni_sound_set_50_name', 'Club 5'), + ('furni_doorB_name', 'Wardrobe'), + ('reg_agree1', 'Yes, my parents and I agree to the above terms. I am allowed to use Habbo Hotel.'), + ('furni_chair_silo*3_name', 'White Dining Chair'), + ('furni_CF_1_coin_bronze_desc', 'Worth 1 Credits'), + ('reg_agree2', 'Yes, I have read the Habbo Hotel Terms of Service and I accept them'), + ('you_have_pending_cfh', 'Your previous call for help has not been answered yet. To make a new one you must delete the old message.'), + ('furni_table_plasto_bigsquare*7_name', 'Square Dining Table'), + ('console_accept', 'Accept'), + ('furni_lamp_basic_name', 'Pura Lamp'), + ('console_friend_request_error', 'There was an error with friend requests'), + ('poster_11_desc', 'I obey the Habbo way!'), + ('furni_bardeskcorner_polyfon*6_name', 'Blue Mode Bardesk Corner'), + ('furni_plant_sunflower_name', 'Cut Sunflower'), + ('furni_traffic_light*3_name', 'Purple Traffic Light'), + ('furni_bed_polyfon_one*8_name', 'Yellow Mode Single Bed'), + ('furni_carpet_polar*1_desc', 'Cute'), + ('furni_noob_rug*1_desc', 'Nice and neat sisal rug with orange edging'), + ('furni_exe_bardesk_desc', 'Divide the profits!'), + ('furni_romantique_divider*4_desc', 'Keeping things separated'), + ('pet_status_dialog', '%name%'), + ('furni_jp_lantern_name', 'Japanese Lantern'), + ('furni_chair_norja*2_name', 'Black Chair'), + ('furni_jp_irori_desc', 'Traditional heating and eating'), + ('furni_bed_budget*5_name', 'Beige Pura Double Bed'), + ('furni_scifidoor*8_name', 'Purple Spaceship Door'), + ('nav_venue_sw_lobby_free_5_name', 'Free Game Lobby'), + ('wallitem_jp_sheet2_desc', 'jp_sheet2'), + ('furni_glass_sofa*9_desc', 'Translucent beauty'), + ('furni_divider_nor5*7_name', 'Rural Iced Angle'), + ('sound_machine_open_editor', 'Trax Editor'), + ('furni_jp_tatami2_desc', 'Shoes off please'), + ('furni_sound_set_16_name', 'Hip Hop Beats 3'), + ('console_recipients', 'Recipient(s)'), + ('catalog_page', 'page'), + ('poster_23_name', 'Bat Poster'), + ('furni_table_plasto_round*4_name', 'Square Dining Table'), + ('furni_rubberchair*2_desc', 'Soft and tearproof!'), + ('nav_venue_bb_lobby_beginner_16/0_desc', ''), + ('poster_1005_name', 'Johnny Squabble'), + ('furni_silo_studydesk_name', 'Area Quest Desk'), + ('furni_table_plasto_4leg*1_desc', 'Hip plastic furniture'), + ('nav_venue_basement_lobby/0_desc', 'For low level hanging'), + ('furni_rare_parasol*3_desc', 'Block those rays!'), + ('furni_arabian_wndw_name', 'Arabian Window Frame'), + ('Alert_ConnectionFailure', 'Disconnected'), + ('furni_house_desc', 'Good enough to eat'), + ('console_confirm_selected', 'Confirm the selections. Below are the amount of friend requests that will be accepted and declined. If you want, you can still modify the selections.'), + ('furni_table_plasto_4leg*4_name', 'Square Dining Table'), + ('furni_sound_set_57_name', 'RnB Grooves 3'), + ('hubu_h3', 'Huumetietobussi'), + ('furni_table_plasto_bigsquare*2_name', 'Square Dining Table'), + ('hubu_h4', 'Anna palautetta'), + ('hubu_h1', 'Puhelintuki'), + ('roomatic_bobbafilter', 'Bobba filter (filters out bad language)'), + ('hubu_h2', 'Harrastamaan!'), + ('furni_tv_luxus_desc', 'Bang up to date'), + ('hubu_h5', 'Huumetietoa'), + ('NUF_console_hotelview_icon', 'Click the button to open your Habbo Console.'), + ('modtool_banlength', 'Ban Length:'), + ('NUF_visiting_rooms_roomlist_tutor', 'Just pick any room you like. Click on the room to see a description of the room. ROOM!'), + ('reg_verification_newPassword', 'New password:'), + ('furni_wall_china_name', 'Dragon Screen'), + ('nav_venue_hallway_ii/0_desc', 'Beware witches and warlocks'), + ('jukebox_disk_add', 'Add Disc'), + ('furni_rare_xmas_screen_desc', 'Ho Ho Ho!'), + ('furni_table_plasto_round*2_name', 'Round Dining Table'), + ('furni_rubberchair*7_name', 'White Inflatable Chair'), + ('nav_favourites_helptext', 'These are your favourite rooms. Nice selection you have here...'), + ('nav_venue_sw_lobby_beginner_4_name', 'Snow Rookies Lobby'), + ('furni_gothic_chair*2_desc', 'The prince of Habbo'), + ('cam_save_nofilm', 'You have run out of film.\\rGet a roll (5 photos) from\\rthe Catalogue for 6 Credits.'), + ('furni_sofa_polyfon*6_desc', 'Blue Mode Sofa'), + ('furni_divider_silo3*2_desc', 'Form following function'), + ('furni_rare_beehive_bulb*1_name', 'Red Amber Lamp'), + ('furni_plant_small_cactus_desc', 'Even less watering than the real world'), + ('furni_triplecandle_name', 'Electric Candles'), + ('help_option_1', 'Playing Habbo'), + ('help_option_3', 'A serious issue (harassment, sexual behaviour)'), + ('furni_present_gen5_name', 'Gift'), + ('help_option_2', 'My Habbo account.'), + ('furni_shelves_norja*8_name', 'Yellow Bookcase'), + ('furni_legotrophy_desc', 'For the winning team'), + ('furni_rare_icecream*2_name', 'Pistachio Ice Cream Machine'), + ('furni_summer_pool*1_desc', 'Fancy a dip?'), + ('nav_venue_theatredrome_deli/0_desc', 'Join in all the fun of the fair!'), + ('game_newgame', 'New game'), + ('help_tour', 'Guided Tour'), + ('purse_vouchers_error3_url', 'http://%predefined%//credits'), + ('furni_marquee*5_name', 'Graphite Marquee'), + ('forgottenpw_explanation', 'If you have forgotten your password and you gave your correct email address when you registered, we can send your password to you.'), + ('furni_waterbowl*3_name', 'Yellow Water Bowl'), + ('roomatic_namedisp', 'Do you want your name to be displayed with the room?'), + ('poster_28_name', 'Silver Tinsel Bundle'), + ('Alert_BuyingOK', 'Buying Successful!'), + ('furni_summer_chair*4_name', 'Deck Chair'), + ('nav_venue_welcome_lounge_ii/0_desc', 'New? Lost? Get a warm welcome here from Habbo eXperts.'), + ('bb_title_gameCreation', 'Aloita uusi peli!'), + ('furni_sporttrack1*3_name', 'Sport track straight grass'), + ('furni_romantique_divan*2_name', 'Emerald Chaise-Longue'), + ('furni_divider_silo1*6_name', 'Blue Area Corner Shelf'), + ('NUF_about_hotel_about_tutor', 'Habbo is both a virtual world and an online community.'), + ('url_helpparents', 'http://%predefined%//help/73'), + ('furni_divider_silo3*7_name', 'Green Area Gate'), + ('poster_18_desc', 'Beautiful reproduction butterfly'), + ('furni_traffic_light*5_desc', 'Chill and wait your turn!'), + ('furni_scifirocket*6_desc', 'Too hot to handle!'), + ('pet.saying.angry.cat.0', 'Sssppp!'), + ('furni_bed_armas_one_desc', 'Rustic charm for one'), + ('pet.saying.angry.cat.3', '*hiss*'), + ('pet.saying.angry.cat.1', 'MrrRRRR'), + ('pet.saying.angry.cat.2', 'Tssssss!'), + ('furni_noob_rug*6_name', 'My first Habbo rug'), + ('club_habbo.bottombar.text.member', 'Habbo Club'), + ('furni_divider_silo1_name', 'Corner Shelf'), + ('nav_venue_bb_lobby_beginner_10/0_desc', ''), + ('recycler_info_progress', 'Recycling is currently in progress. The recycling process takes a total of %recyclinghours% hour. You can leave the catalogue and recycling will continue in the background.'), + ('furni_queue_tile1*1_name', 'Pink Habbo Roller'), + ('notickets_header', 'Buy game tickets to play this game'), + ('reg_underage', 'I am under 11 years old'), + ('nav_venue_sw_arena_intermediate_name', 'Playing intermediate game'), + ('furni_table_plasto_square*5_name', 'Square Dining Table'), + ('Alert_YouAreBanned_T', 'A Moderator kicked you out of the room.'), + ('buddyremove_moreoptions', 'More Options >>'), + ('furni_prizetrophy4*3_desc', 'Breathtaking bronze'), + ('furni_chair_silo*2_desc', 'Keep it simple'), + ('club_habbo.bottombar.link.notmember', 'Join!'), + ('poster_1000_name', 'Comedy Poster'), + ('room_badge_button', 'Badge'), + ('furni_soft_sofa_norja*8_desc', 'Yellow Iced Sofa'), + ('wallitem_torch_name', 'Gothic Torch'), + ('furni_scifirocket*7_name', 'Jupiter Smoke Machine'), + ('furni_romantique_tray1_desc', 'For a fast break'), + ('furni_rare_dragonlamp*0_desc', 'George and the...'), + ('furni_nest_desc', 'Night, night'), + ('furni_table_silo_small*2_name', 'Black Occasional Table'), + ('furni_prizetrophy7*2_name', 'Silver Habbo trophy'), + ('furni_sofachair_silo*3_desc', 'Large, but worth it'), + ('furni_divider_nor2*9_name', 'Red Iced bar desk'), + ('club_extend_title', 'Habbo Club membership can be extended VERY easily.'), + ('furni_rare_fan*0_desc', 'As red as Rudolph\'s nose'), + ('club_paybycash_url', '(leave this empty if you don\'t want to have this link displayed)'), + ('poster_57_name', 'Calligraphy poster'), + ('furni_CFC_50_coin_silver_desc', 'Worth 50 Credits'), + ('furni_pillow*5_name', 'Black Leather Pillow'), + ('furni_hc_chr_name', 'Majestic Chair'), + ('nav_venue_sw_arena_free_name', 'Playing free for all game'), + ('furni_active_placeholder_desc', 'This furniture is downloading...'), + ('nav_venue_welcome_lounge_name', 'Welcome Lounge'), + ('furni_soft_sofachair_norja*3_name', 'White Iced Sofachair'), + ('furni_bed_polyfon*3_desc', 'Give yourself space to stretch out'), + ('furni_pura_mdl4*3_name', 'Black Pura Module 4'), + ('furni_pillar*2_desc', 'Ancient and stately'), + ('furni_small_chair_armas_desc', 'Rustic charm at it\'s best'), + ('furni_table_plasto_round_desc', 'Hip plastic furniture'), + ('furni_marquee*2_desc', 'Dragons out and Davids in!'), + ('furni_wooden_screen*7_desc', 'Add an exotic touch to your room'), + ('furni_queue_tile1*8_name', 'Navy Habbo Roller'), + ('furni_arabian_pllw_desc', 'Exotic comfort'), + ('furni_sound_set_1_desc', 'Get the party started!'), + ('furni_gothic_stool*5_desc', 'The dark side of Habbo'), + ('furni_china_table_desc', 'Exotic and classy'), + ('song_disk_trade_info', '%name%'), + ('nav_venue_sw_lobby_beginner_9_name', 'Snow Rookies Lobby'), + ('console_modify', 'Modify'), + ('poster_36_desc', 'The Hotels girlband. Dream on!'), + ('furni_rare_dragonlamp*7_desc', 'Scary and scorching!'), + ('furni_sound_set_63_desc', 'Desert hits by the oasis!'), + ('nav_venue_cafe_gold_name', 'The Oasis'), + ('nav_venue_sw_lobby_tournament_3/0_desc', ''), + ('nav_venue_habbo_cinema_name', 'Habbo Cinema'), + ('furni_chair_plasty*4_name', 'Plastic Pod Chair'), + ('nav_venue_welcome_lounge_iii/0_desc', 'New? Lost? Get a warm welcome here from Habbo eXperts.'), + ('furni_carpet_soft*1_desc', 'Soft Wool Rug'), + ('furni_sporttrack1*1_name', 'Sport track straight'), + ('furni_divider_nor3*6_name', 'Blue Iced gate'), + ('furni_glass_chair*7_name', 'Green Glass Chair'), + ('club_confirm_gift_text', 'A new club gift has arrived. Please push OK if you want to receive it now. If you click cancel you will be asked again next time you log in to the Hotel.'), + ('furni_rubberchair*5_name', 'Lime Inflatable Chair'), + ('furni_plant_maze_snow_name', 'Snowy Maze Bundle 2'), + ('furni_table_silo_med*4_name', 'Beige Area Coffee Table'), + ('furni_solarium_norja*1_desc', 'Rejuvenate your pixels!'), + ('furni_divider_nor2*2_name', 'Black Iced bar desk'), + ('poster_45_desc', 'Needs a few more Habburgers'), + ('wallitem_habw_mirror_desc', 'Star of the show!'), + ('furni_pura_mdl3*9_name', 'Red Pura Module 3'), + ('furni_exe_corner_name', 'Executive Corner Desk'), + ('nav_venue_cunning_fox_gamehall/3_desc', 'Are you the new Deep Blue?'), + ('furni_rare_fan*7_desc', 'It\'ll blow you away!'), + ('furni_divider_nor1*5_desc', 'Pink Ice corner'), + ('wallitem_md_logo_wall_name', 'Bubble Juice Logo'), + ('furni_bardesk_polyfon_desc', 'Perfect for work or play'), + ('console_target_does_not_accept', 'This user does not accept friend requests at the moment'), + ('pet.saying.beg.croco.0', 'Mmmmmrrr'), + ('pet.saying.beg.croco.1', '*Emo tear*'), + ('messenger.email.header', ''), + ('pet.saying.beg.croco.2', 'Waarrrr...rrr'), + ('furni_carpet_polar*4_name', 'Green Bear Rug'), + ('furni_chair_plasto*6_name', 'Chair'), + ('furni_noob_rug*4_name', 'My first Habbo rug'), + ('furni_summer_chair*6_desc', 'Blue'), + ('rotate_furniture', 'Rotate Furni'), + ('poster_16_desc', 'Added security'), + ('furni_sofachair_silo*7_desc', 'Green Area Armchair'), + ('furni_divider_nor5*4_desc', 'Cool cornering for your crib!'), + ('furni_sand_cstl_twr_name', 'sand_cstl_twr'), + ('furni_safe_silo*4_name', 'Beige Safe Minibar'), + ('furni_chair_plasty*11_name', 'Plastic Pod Chair'), + ('furni_divider_arm2_name', 'Room divider'), + ('furni_sound_set_55_name', 'RnB Grooves 1'), + ('nav_venue_sw_lobby_intermediate_4_name', 'Snow Bombardiers Lobby'), + ('roomatic_canmodifysettings', '(You can change these settings later)'), + ('furni_pura_mdl5*7_desc', 'Any way you like it!'), + ('catalog_pet_name_length', 'Oops, pet\'s name is too long (max 15 characters)'), + ('furni_toy1*3_name', 'Rubber Ball'), + ('nav_venue_beauty_salon_loreal/0_desc', 'No Pixel Surgery, only natural make-ups!'), + ('furni_arabian_swords_name', 'Ancestral Scimitars'), + ('furni_summer_pool*4_name', 'Yellow Summer Pool'), + ('gs_error_create_0', 'This Lobby is full, please create a Game in another Lobby!'), + ('nav_venue_pizzeria/0_desc', 'Pizza; food of the hungry!'), + ('nav_roomnfo_hd_own', 'Own Rooms'), + ('furni_glass_sofa*4_desc', 'Translucent beauty'), + ('buddyremove_accept', 'Remove Friends'), + ('transaction_system_sms_win_orange', 'Orange SMS'), + ('gs_error_create_3', 'Your skill level isn\'t high enough for creating Games in this Lobby.'), + ('furni_goodie2_desc', 'For gourmet kittens'), + ('trading_youagree', 'You agree'), + ('furni_bench_lego_name', 'Team Bench'), + ('reg_verification_updateOK', 'Update successful'), + ('transaction_system_refunds', 'Refund'), + ('furni_carpet_standard*7_name', 'Floor Rug'), + ('poster_44_name', 'Mummy'), + ('furni_bed_polyfon_one*3_name', 'White Single Bed'), + ('furni_jp_tray1_name', 'jp_tray1'), + ('furni_jp_tatami_name', 'Small Tatami Mat'), + ('furni_bardesk_polyfon*2_name', 'Black Mode Bardesk'), + ('furni_hockey_light_desc', 'Set it off.'), + ('nav_venue_bb_lobby_intermediate_2/0_desc', ''), + ('wallitem_guitar_v_name', 'v guitar'), + ('reg_email', 'Email:'), + ('nav_venue_sw_lobby_tournament_0/0_desc', ''), + ('furni_club_sofa_name', 'Club sofa'), + ('furni_duck_name', 'Rubber Duck'), + ('furni_divider_nor5*9_name', 'Red Iced Angle'), + ('furni_smooth_table_polyfon_name', 'Large Dining Table'), + ('reg_forcedupdate', 'Please update your Habbo details!'), + ('transaction_system_stuff_store', 'Catalogue purchase'), + ('console_request_massoperation_title', 'You have %messageCount% friend requests waiting.'), + ('nav_venue_bb_lobby_expert_8/0_desc', ''), + ('roomatic_roomdescription', 'Room description:'), + ('reg_verification_invalidEmail', 'Check email address'), + ('furni_xmas_icelamp_desc', '20 lanterns for the price of 6!'), + ('wallitem_wallmirror_desc', 'Mirror, mirror on the wall...'), + ('furni_pura_mdl1*3_name', 'Black Pura Module 1'), + ('pet.saying.play.croco.1', 'Squeh Squeeeeh...'), + ('pet.saying.play.croco.0', ':)'), + ('nav_venue_theatredrome_halloween/0_desc', 'Warm welcome to Bullet For My Valentine!'), + ('nav_venue_bb_lobby_amateur_6_name', 'Gevorderden Battle Ball 7'), + ('cam_savetxt', 'Saving Photo...'), + ('nav_venue_bb_lobby_intermediate_1_name', 'Semi-profs Battle Ball 2'), + ('nav_modify_doorstatus', 'Door status'), + ('callhelp_sent', 'If you have questions about Habbo Hotel or your Habbo account, please write the details below and a member of community staff will respond as soon as possible.'), + ('wallitem_photo_name', 'Photo'), + ('poster_25_desc', 'A new use for carrots!'), + ('furni_chair_plasto*1_desc', 'Hip plastic furniture'), + ('furni_prizetrophy4*2_name', 'Fish trophy'), + ('furni_bar_armas_name', 'Barrel Minibar'), + ('nav_rooms_favourite', 'Favourites'), + ('furni_table_plasto_square*6_desc', 'Hip plastic furniture'), + ('furni_gothic_sofa*6_desc', 'The dark side of Habbo'), + ('jukebox_song_length', 'Song length: %time%'), + ('buddyremove_header', 'Choose %amount% friends to remove'), + ('furni_romantique_mirrortabl_desc', 'Get ready for your big date'), + ('wallitem_hrella_poster_2_name', 'Life Buoy'), + ('reg_boy', 'Boy'), + ('sound_machine_trax_name', 'Trax name:'), + ('purse_vouchers_error0', 'Technical error! Cannot redeem voucher.'), + ('furni_plant_valentinerose*3_name', 'Yellow Valentine Rose'), + ('purse_vouchers_error1', 'Invalid voucher code.'), + ('nav_venue_bb_lobby_expert_1_name', 'Experts Battle Ball 2'), + ('purse_vouchers_error2', 'Product delivery failed, please contact Customer Service'), + ('purse_vouchers_error3', 'This voucher must be redeemed on the Habbo website'), + ('furni_romantique_chair*2_desc', 'null'), + ('furni_prizetrophy7*1_desc', 'Gold Habbo trophy'), + ('furni_table_plasto_bigsquare*14_name', 'Occasional Table'), + ('furni_ticket_desc', 'A bundle of 5 gaming tickets'), + ('nav_venue_club_massiva_name', 'Club Massiva'), + ('roomatic_locked', 'Door locked - visitors have to ring doorbell'), + ('furni_table_silo_small*3_desc', 'For those random moments'), + ('furni_bed_trad_name', 'Plain Double Bed'), + ('summer_chair_5_name', 'Beige Deck Chair'), + ('buddyremove_select_all', 'Select All Friends'), + ('furni_plant_valentinerose*5_desc', 'For that special pixel'), + ('furni_glass_table*9_name', 'Glass table'), + ('furni_romantique_smalltabl*5_desc', 'Why is one leg different?'), + ('furni_pura_mdl5*5_name', 'beige pura module 5'), + ('poster_30_name', 'Mistletoe'), + ('furni_chair_basic*8_name', 'chair_basic'), + ('nav_venue_sw_lobby_amateur_2_name', 'Snow Slingers Lobby'), + ('Alert_ConnectionDisconnected', 'Please reload Habbo Hotel!\\r\\rIf this happens again, please wait a moment before reloading.'), + ('Alert_WrongPassword', 'Check password!'), + ('nav_modify_letothersmove', 'Let other people move and leave furniture in the room.'), + ('furni_rare_dragonlamp*1_name', 'Sea Dragon Lamp'), + ('furni_table_plasto_4leg*10_desc', 'Hip plastic furniture'), + ('furni_sound_set_28_name', 'Rock 2'), + ('furni_grand_piano*2_name', 'Black Grand Piano'), + ('furni_basket_desc', 'Eggs-actly what you want for Easter'), + ('furni_rare_fan*5_name', 'Yellow Powered Fan'), + ('furni_noob_lamp*2_name', 'My first Habbo lamp'), + ('furni_present_gen4_desc', 'What\'s inside?'), + ('furni_pillar*9_desc', 'Ancient and stately'), + ('furni_chair_norja*8_desc', 'Sleek and chic for each cheek'), + ('furni_pura_mdl2*2_desc', 'Any way you like it!'), + ('furni_glass_stool*5_desc', 'Translucent beauty'), + ('furni_hc_lmp_name', 'Oil Lamp'), + ('console_myinterests', 'My interests:'), + ('furni_val_teddy*6_desc', 'The blue bear of happiness'), + ('room_cant_set_item', 'You cannot place this in someone else\'s room!'), + ('poster_29_desc', '10 x Gold Tinsel'), + ('club_general_daysleft', 'Number of HC days left'), + ('nav_popup_nav_link', 'Open the Navigator'), + ('furni_sound_set_43_desc', 'Beware zombies!'), + ('furni_solarium_norja*6_name', 'Blue Solarium'), + ('furni_doormat_plain*1_name', 'Doormat'), + ('nav_venue_chill_name', 'Zen Garden'), + ('furni_one_way_door*5_desc', 'One at a time!'), + ('furni_table_plasto_round*3_desc', 'Hip plastic furniture?'), + ('furni_prizetrophy6_desc', 'Palkinto'), + ('furni_exe_s_table_name', 'Executive Glass Table'), + ('furni_noob_rug*5_desc', 'Nice and neat sisal rug with pink edging'), + ('furni_scifirocket*0_name', 'Mars Smoke Machine'), + ('furni_soft_jaggara_norja_desc', 'Soft Iced sofachair'), + ('nav_venue_bb_lobby_amateur_9/0_desc', ''), + ('furni_chair_plasty*5_desc', 'Hip plastic furniture'), + ('hobba_mark_emergency', 'Emergency Help'), + ('furni_djesko_turntable_name', 'Habbo Turntable'), + ('furni_shelves_norja*9_desc', 'For nic naks and art deco books'), + ('poll_confirm_cancel_long', 'Are you sure you want to stop answering the poll? You can\'t continue later.'), + ('poster_32_desc', 'The Auspicious One'), + ('opening_hours_text_opening_time', 'The Hotel will open again at %h%:%m%. We look forward to welcoming you back!'), + ('furni_bed_budget_one*7_name', 'Green Pura Bed'), + ('furni_pillow*0_desc', 'Minimalist comfort!'), + ('furni_divider_poly3*8_desc', 'Yellow Mode Bardesk Gate'), + ('nav_venue_bb_lobby_beginner_13/0_desc', ''), + ('furni_sound_set_6_name', 'Ambient 3'), + ('hubu_win', 'Bus - Info'), + ('furni_sound_machine*5_name', 'Brown Traxmachine'), + ('furni_sporttrack1*2_desc', 'null'), + ('bb_title_bouncingBall', 'Battle Ball'), + ('nav_venue_rooftop/0_desc', 'Hang out on the very rooftop of Habbo Hotel!'), + ('modtool_banreason', 'Ban Reason:'), + ('furni_chair_silo*9_desc', 'Red Silo Dining Chair'), + ('furni_bed_budget*6_desc', 'King sized comfort!'), + ('furni_s_sound_machine*4_desc', 'Sound Machine Blue Desc'), + ('furni_rubberchair*6_desc', 'Soft and tearproof!'), + ('nav_venue_sw_lobby_expert_1_name', 'Snow Marksmen Lobby'), + ('nav_venue_bb_lobby_beginner_7/0_desc', ''), + ('furni_table_plasto_4leg*5_desc', 'Hip plastic furniture'), + ('gen_youhave', 'You Have'), + ('furni_carpet_soft*6_name', 'Soft Wool Rug'), + ('furni_petfood2_desc', 'Fantastic 20% Saving!'), + ('group_privileges', 'Priviliges:'), + ('furni_samovar_name', 'Russian Samovar'), + ('furni_hal_grave_name', 'Haunted Grave'), + ('furni_bed_budget_one*2_desc', 'Princess sized comfort!'), + ('gs_error_1', 'You have entered invalid data!'), + ('reject', 'Reject'), + ('gs_error_4', 'You have reached your maximum number of daily Games!'), + ('nav_venue_sw_lobby_tournament_5_name', 'Tournament Lobby'), + ('gs_error_5', 'Tournament is only available for users living in the UK.'), + ('gs_error_2', 'You don\'t have enough Tickets!'), + ('gs_error_8', 'To start a Game, there must be at least two Teams of one player each!'), + ('sound_machine_alert_no_sound_sets', 'You don\'t have any sound sets available for song editing. \\rNote that the sets need to be in your inventory (hand).'), + ('furni_waterbowl*4_desc', 'Aqua unlimited'), + ('furni_doormat_love_desc', 'Welcome Habbos in style'), + ('gs_error_6', 'You have been removed from the Game!'), + ('furni_soft_sofachair_norja*4_desc', 'Sit back and relax'), + ('bb_powerup_desc_8', 'By using a vacuum cleaner, you can clear any tile in the field.'), + ('move', 'Move'), + ('furni_romantique_smalltabl*3_name', 'Turquoise Tray Table'), + ('furni_bed_polyfon*8_name', 'Yellow Mode Double Bed'), + ('furni_sofachair_polyfon*4_desc', 'Beige Mode Armchair'), + ('forgottenpw_email', 'Your email address'), + ('console_email', 'Email'), + ('bb_powerup_desc_1', 'Light bulb colours an area around it.'), + ('furni_divider_nor2_desc', 'Strong, yet soft looking'), + ('furni_bardeskcorner_polyfon*5_desc', 'For sweet corners!'), + ('say', 'Say'), + ('bb_powerup_desc_3', 'Flashlight colours a straight line ahead of you.'), + ('bb_powerup_desc_2', 'Bouncing on a spring locks tiles in a single jump.'), + ('bb_powerup_desc_5', 'Bouncing on a box of pins will burst your Battle Ball!'), + ('bb_powerup_desc_4', 'A shot with a cannon locks tiles on a straight line.'), + ('furni_chair_basic*1_name', 'chair_basic'), + ('bb_powerup_desc_7', 'A bomb will clear all tiles around it.'), + ('bb_powerup_desc_6', 'Harlequin effect makes everybody colour tiles for your team!'), + ('NUF_console_read_next', 'Click \'OK\' to mark message as read.'), + ('poster_50_name', 'Bat Poster'), + ('furni_table_plasto_4leg*15_name', 'Occasional Table'), + ('furni_tree7_desc', 'Walking in a winter wonderland!'), + ('poster_37_name', 'The Habbo Babes 3'), + ('furni_queue_tile1*7_desc', 'The power of movement'), + ('furni_bed_budgetb_name', 'Plain Double Bed'), + ('interface_icon_sound', 'Sound Off/On'), + ('pet.hotwords.come_here', 'come here'), + ('poster_10_name', 'Lapland Poster'), + ('win_delete_item', 'Remove Item'), + ('wallitem_hrella_poster_3_name', 'Anchor'), + ('furni_table_plasto_bigsquare*8_desc', 'Hip plastic furniture'), + ('furni_habboween_grass_name', 'Unholy Ground'), + ('furni_plant_valentinerose*4_name', 'Pink Valentine\'s Rose'), + ('nav_venue_skylight_lobby/0_desc', 'Lift your spirits on the top floor'), + ('buddyremove_alphabetical', 'Alphabetical Order'), + ('alert_win_coppa', 'You are blocked'), + ('nav_venue_bb_lobby_amateur_5_name', 'Gevorderden Battle Ball 6'), + ('reg_update_text', 'Never change your password or email just because somebody asks you to. He / she is most probably trying to steal your Habbo account and furni!'), + ('decision_ok', 'OK'), + ('furni_summer_grill*3_name', 'Yellow Barbeque Grill'), + ('nav_public_helptext', 'These are hotel\'s public rooms. What are you waiting for? Go and meet other Habbos!'), + ('tickets_button_info_2', 'Stuff you can do with these 20 tickets'), + ('furni_rclr_chair_name', 'Palm Chair'), + ('login_create1here', 'You can create one here.'), + ('tickets_button_info_1', 'Stuff you can do with these 2 tickets'), + ('furni_prizetrophy6*3_name', 'Champion trophy'), + ('furni_shelves_norja*2_desc', 'For nic naks and art deco books'), + ('purse_info', 'DESCRIPTION'), + ('bb_choose_powerups', 'Powerup select'), + ('purse_transaction', 'View Transactions'), + ('reg_birthdayformat', 'Birthday*: [dd][mm][yyyy]'), + ('Alert_YouMustAgree', 'You must accept the Terms and Conditions before proceeding.'), + ('jukebox_empty', 'Empty'), + ('purse_info_film', 'Films For Camera'), + ('furni_sofachair_polyfon*9_desc', 'Loft-style comfort'), + ('furni_habbocake_desc', 'Save me a slice!'), + ('furni_doormat_plain*6_desc', 'Available in a variety of colours'), + ('nav_venue_sun_terrace/0_desc', 'For lazy afternoons and super tan treatment!'), + ('poster_501_desc', 'For pirates everywhere'), + ('pet_thir_2', 'Thirsty'), + ('gs_error_watch_0', 'All The Spectator Seats Are Taken!'), + ('pet_thir_3', 'Not thirsty'), + ('camera_open_dialog_text', 'Would you like to take some photos\\ror put your camera in your room?'), + ('furni_bed_budget_one*9_desc', 'Prince sized comfort!'), + ('ph_goswimming', 'Go swimming!'), + ('furni_habboween_crypt_name', 'Creepy Crypt'), + ('gs_error_join_7', 'You have already joined this Game!'), + ('nav_venue_sw_lobby_amateur_3_name', 'Snow Slingers Lobby'), + ('furni_romantique_smalltabl*4_name', 'Amber Tray Table'), + ('gs_error_join_3', 'You either have too much or too little skill to join.'), + ('pet_thir_0', 'Gasping'), + ('gs_error_join_0', 'The team you selected is already full.'), + ('pet_thir_1', 'Parched'), + ('furni_gothic_stool*3_name', 'Gothic Stool Red'), + ('furni_wooden_screen*1_name', 'Pink Oriental screen'), + ('furni_sofa_silo*4_name', 'Beige Area Sofa'), + ('furni_queue_tile1*2_desc', 'The power of movement'), + ('buddyremove_continue', 'Remove Friend Now'), + ('nav_venue_bb_lobby_expert_2/0_desc', ''), + ('nav_loading', 'Loading...'), + ('furni_bed_armas_two_name', 'Double Bed'), + ('furni_prizetrophy4*1_name', 'Fish trophy'), + ('furni_sound_machine*7_desc', 'Red alert. Red alert. It\'s a party!'), + ('furni_glass_sofa_desc', 'Translucent beauty'), + ('furni_barchair_silo*5_name', 'Pink Bar Stool'), + ('furni_soft_sofachair_norja*5_desc', 'Pink Iced Sofachair'), + ('console_fr_accepted_count', 'Amount to be accepted'), + ('poster_2001_desc', 'Perinteinen ryijy,'), + ('furni_couch_norja*5_desc', 'Two can perch comfortably'), + ('furni_rclr_lamp_desc', 'Light your space'), + ('furni_sand_cstl_wall_desc', 'sand_cstl_wall'), + ('furni_one_way_door*4_name', 'Beige One Way Gate'), + ('furni_corner_china_name', 'Dragon Screen'), + ('nav_venue_sw_lobby_amateur_4/0_desc', 'Astetta rankempaa lumisotaa.'), + ('furni_chair_silo*7_name', 'Green Silo Dining Chair'), + ('transaction_system_messenger', 'Console SMS'), + ('furni_pura_mdl4*8_desc', ''), + ('console_reject_selected', 'Reject selected'), + ('furni_rare_icecream*4_desc', 'Virtual strawberry rocks!'), + ('furni_prizetrophy*2_desc', 'Shiny silver'), + ('furni_scifiport*0_desc', 'Energy beams. No trespassers!'), + ('paalu_ui2', 'Push'), + ('paalu_ui3', 'Moving'), + ('paalu_ui4', 'Stabilise'), + ('paalu_ui5', 'Balance'), + ('furni_sofa_polyfon*7_name', 'Green Mode Sofa'), + ('nav_error_toomanyfavrooms', 'You can\'t have more than 10 favourite rooms! Please remove an old favourite if you want to add a new one.'), + ('furni_noob_stool*5_name', 'My first Habbo stool'), + ('sound_machine_alert_missing_packages', 'You need the following Traxpacks to edit this song:'), + ('furni_grunge_bench_name', 'Bench'), + ('paalu_ui1', 'Balance'), + ('furni_sleepingbag*5_name', 'Graphite Sleeping Bag'), + ('furni_divider_nor2*3_name', 'White Iced Bar-Desk'), + ('bb_header_teams', 'Teams'), + ('wallitem_sw_swords_name', 'Swords'), + ('furni_val_choco_desc', 'One for them. Two for me!'), + ('nav_venue_bb_lobby_expert_5/0_desc', ''), + ('furni_soft_sofa_norja*2_name', 'Black Iced Sofa'), + ('furni_bed_budgetb_one_desc', 'All you need for a good night\'s kip'), + ('furni_carpet_standard*8_name', 'Floor Rug'), + ('furni_rare_dragonlamp*6_name', 'Gold Dragon Lamp'), + ('furni_sound_set_56_desc', 'Get down tonight!'), + ('furni_divider_nor5*2_name', 'Black Iced Angle'), + ('chat.curse_word', 'Bobba'), + ('furni_couch_norja*4_desc', 'Two can perch comfortably'), + ('furni_scifirocket*2_desc', 'A little closer to home!'), + ('furni_rare_fan*6_desc', 'It\'ll blow you away!'), + ('poster_514_name', 'The EU flag'), + ('club_desc_2_period', '3 Months (93 days) = 60 Credits'), + ('furni_glass_chair*9_desc', 'Translucent beauty'), + ('poster_1338_desc', 'If her age on the clock, she ready for the cock'), + ('nav_src_hd', 'Search Results.'), + ('console_unknown_sender', 'Unknown sender'), + ('furni_prizetrophy4_name', 'Pokaali'), + ('nav_venue_sunset_cafe/0_desc', 'Come and chat about Official Fansites and meet their staff!'), + ('furni_pura_mdl4*9_desc', 'Any way you like it!'), + ('furni_pillar*8_name', 'Roman Pillar'), + ('nav_venue_sport/0_desc', 'St Trinian\'s is out on DVD April 14th!'), + ('furni_pillar*7_name', 'Atlantean Pillar'), + ('club_extend_text', 'If you\'re subscribing again to Habbo Club, you won\'t lose any of the advantages or ongoing furni gifts. Club membership can be extended in advance.\\rRemember: one club month lasts 31 days.'), + ('sound_machine_confirm_eject', 'Remove cartridge?'), + ('shopping_got', 'You have xx in your Purse.'), + ('furni_rare_stand_desc', 'Stand and Deliver!'), + ('furni_chair_plasto_desc', 'Hip plastic furniture'), + ('furni_bed_polyfon_one*9_desc', 'Cot of the artistic'), + ('furni_couch_norja*9_name', 'Red Bench'), + ('poster_3_desc', 'Smells fishy, looks cool'), + ('paalu.winner', 'Winner:'), + ('NUF_meeting_people_room_wave', 'These buttons let you wave and dance. Click on your Habbo at anytime to see these buttons.'), + ('sound_machine_confirm_window', 'Sound Machine'), + ('furni_one_way_door*3_name', 'White HC Gate'), + ('furni_chair_plasty*9_name', 'Plastic Pod Chair'), + ('gs_timeleft', 'Time Left \\x'), + ('hobba_pickup', 'Pick Up'), + ('console_lastvisit', 'Last Visit'), + ('furni_rare_globe_desc', 'It\'s all white..'), + ('furni_val_cauldron_name', 'Valentine\'s Cauldron'), + ('poster_43_name', 'Chains'), + ('furni_bardesk_polyfon*8_desc', 'Yellow Mode Bardesk'), + ('furni_sound_set_36_name', 'Latin Love 1'), + ('dimmer_apply', 'Apply'), + ('furni_glass_chair*8_desc', 'Translucent beauty'), + ('furni_pura_mdl2*7_desc', 'Any way you like it!'), + ('furni_prizetrophy*3_desc', 'Breathtaking bronze'), + ('furni_marquee*1_name', 'Pink marquee'), + ('NUH_own_user', 'This is your Habbo. Click on the floor to move around.'), + ('furni_gothic_sofa*1_desc', 'The dark side of Habbo'), + ('furni_divider_nor5*3_name', 'White Iced Angle'), + ('furni_divider_nor4*5_name', 'Pink Iced Auto Shutter'), + ('furni_soft_sofa_norja*3_name', 'White Iced Sofa'), + ('furni_sofachair_silo*8_desc', 'Large, but worth it'), + ('furni_pura_mdl1*9_desc', 'Any way you like it!'), + ('furni_chair_plasto*7_name', 'Chair'), + ('furni_pura_mdl5*6_desc', 'Any way you like it!'), + ('emailpw', 'Send'), + ('sound_machine_playlist_window', 'Traxmachine Playlist Editor'), + ('furni_pura_mdl1*3_desc', 'Any way you like it!'), + ('furni_noob_table*5_desc', 'Lightweight, practical and pink'), + ('furni_scifirocket*6_name', 'Mercury Smoke Machine'), + ('furni_shelves_norja_name', 'Bookcase'), + ('poster_521_name', 'Flag of Brazil'), + ('sound_machine_jukebox_disk_window', 'Insert disc'), + ('furni_table_norja_med*6_desc', 'For larger gatherings'), + ('furni_pillow*6_name', 'Blue Cotton Pillow'), + ('furni_shelves_norja*3_desc', 'For nic naks and art deco books'), + ('queue_set.s.info', 'There are %d% Habbos in front of you in the queue to see the Habbo Live broadcast!'), + ('reg_parentemail_info', 'Because of your age, we need to let your parents know you are registering at Habbo Hotel. Please give the email address of one of your parents/guardians.'), + ('club_txt_paycash', 'Pay by Cash'), + ('furni_chair_plasto*11_name', 'Chair'), + ('furni_pizza_name', 'Pizza Box'), + ('furni_table_plasto_4leg*6_desc', 'Hip plastic furniture'), + ('furni_chair_silo*3_desc', 'Keep it simple'), + ('alert_reg_t', 'Please check these details:'), + ('nav_venue_theatredrome_name', 'Theatredrome'), + ('furni_hc_rntgn_desc', 'Believe it or not!'), + ('nav_venue_main_lobby_name', 'Main Lobby'), + ('furni_sound_set_64_desc', 'Make a little Jinn-gle!'), + ('nav_venue_sw_lobby_amateur_desc', 'Practice improves a Snow Stormer\'s aim... Ops, missed!'), + ('furni_scifiport*5_name', 'Security Fence'), + ('furni_lamp_basic_desc', 'Switch on the atmosphere with this sophisticated light'), + ('pet.saying.sniff.cat.0', 'snuh..snuh'), + ('poster_506_name', 'The flag of Finland'), + ('furni_bardeskcorner_polyfon*6_desc', 'Blue Mode Bardesk Corner'), + ('nav_venue_hotel_kitchen_name', 'Hotel Kitchen'), + ('furni_doorB_desc', 'Narnia this way!'), + ('poster_11_name', 'Certificate'), + ('furni_safe_silo_desc', 'Totally shatter-proof!'), + ('furni_bed_budget_one*3_desc', 'Prince sized comfort!'), + ('furni_romantique_divider*4_name', 'Ochre Screen'), + ('previous_onearrowed', '< Previous'), + ('nav_venue_bb_lobby_tournament_3_name', 'Competitie Battle Ball 4'), + ('furni_plant_sunflower_desc', 'For happy Habbos'), + ('furni_throne_desc', 'Important Habbos only'), + ('furni_exe_bardesk_name', 'Executive Bar Desk'), + ('furni_tree6_desc', 'The future\'s bright!'), + ('log_problem_title', 'Problems Connecting'), + ('furni_chair_basic*2_name', 'Pink Pura Egg Chair'), + ('game_chess_black', 'Black:'), + ('furni_glass_sofa*9_name', 'Glass sofa'), + ('furni_chair_norja*2_desc', 'Sleek and chic for each cheek'), + ('furni_pillar*3_desc', 'Ancient and stately'), + ('furni_scifidoor*8_desc', 'There out of this world!'), + ('alert_InvalidUserName', 'Don\'t use this character: \\x !'), + ('furni_rare_parasol*3_name', 'Violet Parasol'), + ('furni_bed_budget*5_desc', 'King sized comfort!'), + ('furni_chair_silo*8_name', 'Yellow Dining Chair'), + ('nav_tryingpw', 'Trying the password...'), + ('furni_cn_lamp_desc', 'Light of the East'), + ('furni_prizetrophy3*3_name', 'Globe trophy'), + ('furni_sound_set_16_desc', 'Ferry, ferry good!'), + ('furni_table_plasto_round*4_desc', 'Hip plastic furniture'), + ('poster_2007_desc', 'The legendary founder of the Hotel'), + ('sound_machine_insert', 'Add to mixer'), + ('furni_sound_machine*1_desc', 'Let the party begin!'), + ('furni_bed_polyfon_one*8_desc', 'Yellow Mode Single Bed'), + ('error_room_closed', 'Huone on suljettu.'), + ('pet.hotwords.play_dead', 'play dead'), + ('gs_button_go_finished', 'Scores'), + ('group_member', 'Member'), + ('sound_machine_confirm_save', 'Save the song?'), + ('furni_arabian_wndw_desc', 'Arabian days and nights'), + ('nav_venue_sw_lobby_expert_2_name', 'Snow Marksmen Lobby'), + ('furni_sound_set_57_desc', 'Feel the groove'), + ('furni_triplecandle_desc', 'No need to worry about wax drips'), + ('char_welcome', 'Welcome!'), + ('furni_sound_machine*6_desc', 'Add some effects to your room!'), + ('furni_sofachair_polyfon*3_desc', 'Loft-style comfort'), + ('nav_venue_bb_lobby_amateur_6/0_desc', ''), + ('group_logo_url_template', 'http://www.habbohotel.co.uk/habbo-imaging/badge-fill/%imagerdata%.gif'), + ('furni_table_plasto_bigsquare*2_desc', 'Hip plastic furniture'), + ('furni_glass_table*5_desc', 'Translucent beauty'), + ('url_purse_link', 'http://%predefined%//credits?'), + ('buddyremove_logintime', 'Last Login Time'), + ('NUF_meeting_people_hotelview_tutor', 'The Navigator lets you move between rooms in the Hotel, so open it up to get started!'), + ('furni_sofa_polyfon*6_name', 'Blue Mode Sofa'), + ('furni_scifirocket*1_desc', 'There is always space for this!'), + ('nav_venue_bb_lobby_amateur_10/0_desc', ''), + ('furni_prizetrophy5_name', 'Pokaali'), + ('purse_info_tickets', 'Gaming Tickets'), + ('poster_513_name', 'The Australian flag'), + ('furni_noob_chair*3_desc', 'Lightweight, practical, with red stripes'), + ('alert_old_client', 'You have an old version cached. Please empty your browser cache and login again.'), + ('furni_bar_basic_name', 'A Pura Minibar'), + ('furni_shelves_norja*8_desc', 'For nic naks and art deco books'), + ('sound_machine_save_window', 'Save your Trax'), + ('poster_51_name', 'Basketball Hoop'), + ('Alert_moderator_warning', ''), + ('furni_solarium_norja*5_name', 'Pink Solarium'), + ('furni_sporttrack2*1_desc', 'null'), + ('furni_rubberchair*7_desc', 'Soft and tearproof!'), + ('reg_parentemail_moreinfo', 'More information:'), + ('furni_present_gen5_desc', 'What\'s inside?'), + ('furni_bed_polyfon*9_desc', 'Give yourself space to stretch out'), + ('sound_machine_confirm_save_list_long', 'Are you sure you want to overwrite the current playlist?'), + ('cam_zoom_in.help', 'Zoom In'), + ('furni_carpet_soft*5_name', 'Soft Wool Rug'), + ('furni_plant_small_cactus_name', 'Small Cactus'), + ('console_creatingaprofile', 'Creating A Profile'), + ('console_select_all', 'Select all'), + ('hobba_reply_cfh', 'Reply to:'), + ('notickets_buygame', 'Buy a game'), + ('furni_sporttrack1*3_desc', 'null'), + ('furni_sleepingbag*1_desc', 'Ultimate coziness'), + ('furni_gothic_stool*4_name', 'Black Gothic Stool'), + ('nav_venue_bb_lobby_beginner_4/0_desc', ''), + ('nav_venue_netcafe/0_desc', 'Learn a foreign language and win Habbo Credits in our quests!'), + ('poster_31_desc', 'Pure and unbridled nu-metal'), + ('furni_sound_set_24_desc', 'It\'s all about the Pentiums, baby!'), + ('pet.saying.angry.dog.3', 'dog.1=Oouh..oouh..snuh..ooo'), + ('furni_bed_budget_one*8_desc', 'Prince sized comfort!'), + ('pet.saying.angry.dog.4', 'ARRR Grrr.. woof woof woof'), + ('pet.saying.angry.dog.1', 'Woof! Grrrr..woof woof'), + ('furni_sw_table_desc', ''), + ('pet.saying.angry.dog.2', 'grRRRRrr.r...r'), + ('pet.saying.angry.dog.0', 'Rrrr..woof.. Rrr'), + ('furni_chair_china_name', 'Chinese Lacquer Chair'), + ('furni_romantique_divan*2_desc', 'Recline in continental comfort'), + ('furni_divider_silo1*6_desc', 'Blue Area Corner Shelf'), + ('furni_sound_set_5_name', 'Ambient 4'), + ('roomevent_browser_create', 'Host an event'), + ('furni_noob_rug*6_desc', 'Nice and neat sisal rug with green edging'), + ('transaction_system_bank_luottokunta', 'Luottokortti'), + ('furni_bed_armas_one_name', 'Single Bed'), + ('furni_plant_fruittree_desc', 'Great yield and sweet fruit'), + ('furni_sound_machine_pro_desc', 'creating fancy sounds'), + ('nav_ownrooms_helptext', 'If you didn\'t know, these are your rooms. Here you can modify your rooms or create new ones if you feel like it.'), + ('furni_grunge_radiator_desc', 'Started cool but now it\'s hot!'), + ('furni_divider_silo3*7_desc', 'Green Area Gate'), + ('room_hold', 'Wait a second...\\rLoading room...'), + ('furni_sound_set_49_desc', 'You will belong'), + ('nav_venue_emperors/0_desc', 'Even the smallest of light... shines in the darkness'), + ('furni_nest_name', 'Basket'), + ('furni_noob_table*4_name', 'My first Habbo table'), + ('furni_sound_set_51_desc', 'Bop to the beat'), + ('furni_plant_maze_snow_desc', '20 x Snowy Maze Shrubbery'), + ('NUF_meeting_people_hotelview_icon', 'Click the Navigator button to start visiting the rooms!'), + ('furni_scifirocket*7_desc', 'Larger than life!'), + ('furni_table_plasto_round*9_name', 'Round Dining Table'), + ('furni_val_teddy*5_name', 'Yellow Share Bear'), + ('nav_venue_bb_lobby_expert_2_name', 'Experts Battle Ball 3'), + ('console_onfrontpage', 'Online'), + ('poster_1000_desc', 'The Noble and Silver Show'), + ('furni_rare_icecream*9_name', 'Bubblegum Ice Cream Machine'), + ('furni_rare_fan*0_name', 'Festive Fan'), + ('furni_carpet_polar_name', 'Faux-Fur Bear Rug'), + ('hobba_chatlog', 'See Chat Log >>'), + ('furni_romantique_chair*3_desc', 'null'), + ('hobba_pickedby', 'Picked Up By:'), + ('poster_24_desc', 'Trying to get in or out?'), + ('furni_table_silo_small*2_desc', 'For those random moments'), + ('furni_table_plasto_bigsquare*15_name', 'Occasional Table'), + ('furni_prizetrophy7*2_desc', 'Silver Habbo trophy'), + ('ph_keys_run', 'Run:'), + ('error_title', 'Oops, error!'), + ('furni_rare_dragonlamp*0_name', 'Fire Dragon Lamp'), + ('furni_CFC_50_coin_silver_name', 'Silver Coin (China)'), + ('furni_chair_plasty_name', 'Plastic Pod Chair'), + ('nav_roomInfo', 'Room info'), + ('furni_sound_set_63_name', 'Alhambra Trax 2'), + ('furni_divider_nor2*9_desc', 'Red Iced bar desk'), + ('furni_soft_sofa_norja*8_name', 'Yellow Iced Sofa'), + ('poster_57_desc', 'chinese calligraphy'), + ('furni_table_plasto_4leg*16_name', 'Occasional Table'), + ('accept', 'Accept'), + ('pet.saying.beg.cat.2', 'MEOW, MEOW, MEOW..'), + ('furni_waterbowl*3_desc', 'Aqua unlimited'), + ('furni_divider_poly3*2_name', 'Black Mode Bardesk Gate'), + ('furni_divider_nor3_desc', 'Do go through...'), + ('furni_table_plasto_square*5_desc', 'Hip plastic furniture'), + ('furni_rubberchair*1_desc', 'Soft and stylish HC chair'), + ('furni_divider_nor5*8_name', 'Yellow Iced Angle'), + ('furni_pura_mdl4*3_desc', 'Any way you like it!'), + ('nav_removerights_desc', 'Remove all rights to this room from other users.'), + ('furni_chair_norja*7_name', 'Rural Chair'), + ('furni_pillar*2_name', 'Nordic Pillar'), + ('furni_bed_polyfon*3_name', 'White Double Bed'), + ('furni_glass_chair*3_desc', 'Translucent beauty'), + ('wallitem_xmas_light_name', 'Xmas light'), + ('pet.saying.beg.cat.0', 'MaUUU...MEOW...meow'), + ('pet.saying.beg.cat.1', '*looks up with sad eyes*'), + ('reg_verification_newEmail', 'Your new email address:'), + ('furni_sound_set_29_desc', 'Electronic house'), + ('furni_joulutahti_desc', 'Christmas in a pot'), + ('furni_china_table_name', 'Chinese Lacquer Table'), + ('poster_507_desc', 'The French flag'), + ('NUF_visiting_rooms_hotelview_nav', 'Click the icon to open the Navigator.'), + ('dimmer_preset_1', 'Preset 1'), + ('nav_private_helptext', 'These are the rooms owned by Habbos. Select a category first and then browse some rooms and meet some people!'), + ('furni_queue_tile1*8_desc', 'The power of movement'), + ('dimmer_preset_2', 'Preset 2'), + ('furni_arabian_pllw_name', 'Green Blossom Pillow'), + ('nav_venue_bb_lobby_tournament_7/0_desc', ''), + ('furni_goodie1*1_desc', 'Crunchy Dog Treat'), + ('poster_36_name', 'The Habbo Babes 2'), + ('poll_window', 'Question'), + ('furni_md_limukaappi_desc', 'A sparkling and refreshing pixel drink!'), + ('nav_venue_rooftop_rumble_ii_name', 'Rooftop Rumble II'), + ('furni_wooden_screen*7_name', 'Purple Oriental Screen'), + ('furni_scifidoor*2_name', 'Yellow Spaceship Door'), + ('room_max_pet_limit', 'Too many pets in the room!'), + ('hobba_sent_to_helpers', 'Call re-assigned as emergency and sent to moderators'), + ('furni_table_silo_med*4_desc', 'Beige Area Coffee Table'), + ('furni_romantique_pianochair*5_name', 'Onyx Piano Stool'), + ('nav_modify_roomdescription', 'Room Description'), + ('furni_sound_set_10_name', 'Hip Hop Beats 1'), + ('furni_chair_silo*2_name', 'Black Dining Chair'), + ('furni_marquee*6_name', 'Blue Marquee'), + ('poster_8_name', 'Habbo Colours'), + ('transaction_system_htk_singledrop', 'Landline'), + ('furni_chair_plasty*4_desc', 'Hip plastic furniture'), + ('dimmer_preset_3', 'Preset 3'), + ('furni_exe_corner_desc', 'Tuck it away'), + ('nav_venue_welcome_lounge/0_desc', 'New? Lost? Get a warm welcome here from Habbo eXperts.'), + ('furni_sleepingbag*6_desc', 'Ultimate coziness'), + ('nav_venue_cunning_fox_gamehall/3_name', 'Batleships'), + ('console_mainhelp', 'Habbo Console Help'), + ('tickets_button_info_hide', 'Hide Ticket Info'), + ('furni_xmas_icelamp_name', 'Lantern Bundle 2'), + ('nav_venue_bb_lobby_amateur_0/0_desc', ''), + ('purse_header', 'Habbo Purse'), + ('furni_noob_lamp*3_name', 'My first Habbo lamp'), + ('nav_help_title', 'Want a room of your own?'), + ('buy', 'Buy'), + ('furni_pura_mdl1*8_name', 'yellow pura module 1'), + ('dimmer_title', 'Mood Light'), + ('NUF_mini_meet_people_hotelview_icon', 'Click the Navigator button to start visiting the rooms!'), + ('console_credits', 'Credits'), + ('bb_link_highScores_url', 'http://%predefined%/groups/56552/id'), + ('wallitem_md_logo_wall_desc', 'Bubble up your wall'), + ('furni_safe_silo*4_desc', 'Totally shatter-proof!'), + ('room_unignore', 'Listen'), + ('nav_venue_sw_lobby_amateur_1/0_desc', ''), + ('poster_16_name', 'Bars'), + ('furni_sofachair_silo*7_name', 'Green Area Armchair'), + ('furni_spyro_name', 'Dragon Egg'), + ('nav_venue_bb_lobby_beginner_19/0_desc', ''), + ('Alert_YourPasswordIsTooShort', 'Passwords must be at least 6 characters long.'), + ('room_cant_trade', 'You cannot trade this!'), + ('furni_door_desc', 'Dr Who?'), + ('gs_button_go_created', 'Join'), + ('poster_49_name', 'Large silver star'), + ('furni_glass_sofa*4_name', 'Glass sofa'), + ('furni_divider_arm3_desc', 'Knock, knock...'), + ('furni_sound_set_31_desc', 'House loops'), + ('reg_habboname', 'Habbo name:'), + ('habboclub_thanks', 'Yippee! You are now a member of Habbo Club! Your current email address is %email%. \\r\\rIf that\'s not the one you are using, please go to \'Update my Habbo ID\' and change it now. \\rThen we can contact you about your membership if need be.'), + ('console_follow_offline', 'Your friend is offline.'), + ('furni_divider_nor1*5_name', 'Pink Ice corner'), + ('nav_openbutton', 'Open'), + ('nav_venue_theatredrome_habbowood/0_desc', 'Home to the Habbowood Gala and HAFTA Awards!'), + ('nav_venue_ice_cafe/0_desc', 'Come here. And chill out.'), + ('furni_calippo_name', 'Calippo icecream machine'), + ('furni_bench_lego_desc', 'For your reserve players'), + ('poster_9_desc', 'Do your bit for the environment'), + ('furni_bed_polyfon_one*3_desc', 'Cot of the artistic'), + ('poster_44_desc', 'Beware the curse...'), + ('poster_2006_name', 'DJ Throne'), + ('furni_pura_mdl3*5_desc', ''), + ('furni_arabian_tray4_name', 'Fruit Tray'), + ('furni_divider_nor3*7_desc', 'Entrance or exit?'), + ('furni_sound_set_30_name', 'Instrumental 1'), + ('furni_romantique_tray1_name', 'Breakfast Tray'), + ('furni_jp_tray1_desc', 'jp_tray1'), + ('furni_plant_maze_desc', 'Build your maze!'), + ('console_getfriendrequest_2', 'If you accept this invitation (s)he will be added to your Friends List. Then you can send messages to each other.'), + ('furni_hockey_light_name', 'Lert'), + ('furni_goodie1_desc', 'Crunchy Dog Treat'), + ('console_getfriendrequest_1', 'has asked you to become his/her Friend.'), + ('furni_pura_mdl2*1_desc', 'Any way you like it!'), + ('score_board.text', 'POINTS'), + ('furni_one_way_door*9_name', 'Red One Way Gate'), + ('furni_sand_cstl_twr_desc', 'sand_cstl_twr desc'), + ('furni_divider_nor5*9_desc', 'Cool cornering for your crib y0!'), + ('furni_duck_desc', 'Every bather needs one'), + ('furni_bardesk_polyfon*2_desc', 'Black Mode Bardesk'), + ('console_request_2', '(S)he will be added into your Friends List if (s)he accepts it.'), + ('bb_link_join', 'Join Team'), + ('nav_createroom_hd', 'Here you can create your own room!'), + ('console_request_1', 'has been sent your Friend Request.'), + ('reg_check_info', 'CHECK YOUR INFO'), + ('furni_toy1*4_name', 'Rubber Ball'), + ('nav_venue_sw_lobby_free_0_name', 'Free Game Lobby'), + ('furni_chair_plasto*1_name', 'Chair'), + ('furni_toilet_name', 'Loo Seat'), + ('queue_set.dc.info', 'Number of Habbos in default queue is %d% and in Habbo Club queue %c%'), + ('furni_sofachair_silo*2_desc', 'Large, but worth it'), + ('furni_chair_plasto*12_desc', 'Hip plastic furniture'), + ('ph_tickets_buyfor', 'Buy Tickets for:'), + ('sound_machine_confirm_close', 'Close the editor?'), + ('furni_rare_fan*1_desc', 'It\'ll blow you away!'), + ('furni_divider_poly3*3_desc', 'Border control!'), + ('nav_venue_kattoterassi/0_desc', 'When push comes to shove...'), + ('furni_summer_grill*4_desc', 'Plenty of burgers on that barbie'), + ('furni_bar_armas_desc', 'It\'s a barrel of laughs and a great talking point'), + ('furni_toilet_red_name', 'Loo Seat'), + ('furni_hc_lmp_desc', 'Be enlightened'), + ('furni_romantique_mirrortabl_name', 'Dressing Table'), + ('furni_pura_mdl4*2_name', 'Pink Pura Module 4'), + ('summer_chair_5_desc', 'Enjoy the summer air'), + ('furni_plant_rose_desc', 'Sleek and chic'), + ('furni_skullcandle_name', 'Skull Candle Holder'), + ('Alert_no_credits', 'You don�t have enough Credits for this.'), + ('pet.hotwords.voice', 'speak'), + ('furni_prizetrophy4*2_desc', 'Shiny silver'), + ('furni_soft_sofachair_norja*4_name', 'Urban Iced Sofachair'), + ('furni_pura_mdl5*1_desc', 'Any way you like it!'), + ('furni_safe_silo*9_name', 'Red Safe Minibar'), + ('furni_bed_trad_desc', 'Sweet dreams for two'), + ('nav_venue_club_massiva_desc', 'Strut your funky stuff!'), + ('furni_rare_dragonlamp*1_desc', 'Out of the deep blue!'), + ('furni_wooden_screen*2_desc', 'Add an exotic touch to your room'), + ('furni_prizetrophy7*1_name', 'Gold Habbo trophy'), + ('furni_carpet_standard*2_name', 'Floor Rug'), + ('furni_arabian_teamk_desc', 'Quench that desert thirst'), + ('furni_romantique_chair*2_name', 'Lime Romantique Chair'), + ('nav_venue_sw_lobby_tournament_0_name', 'Tournament Lobby'), + ('invitation_expired', 'Sorry, all Welcoming Party members were busy.'), + ('gs_error_game_checkname', 'Please check the Game\'s name!'), + ('furni_sound_set_23_name', 'SFX 4'), + ('furni_grand_piano*2_desc', 'Black Grand Piano'), + ('tutorial_quit', 'Close guide'), + ('furni_chair_basic*8_desc', ''), + ('NUF_getting_room_roommatic_security_tutor', 'Finally you can choose the security settings to your room and whether other users can move your furniture.'), + ('nav_venue_bb_lobby_beginner_1/0_desc', ''), + ('nav_private_helptext_hd_main', 'Habbo Guest Rooms'), + ('club_price', 'One month costs 25 Habbo Credits.'), + ('NUF_playing_games_navigator_tutor', 'Click either SnowStorm or BattleBall to open up a list of the game lounges.'), + ('nav_venue_old_skool_name', 'Old Skool Habbo'), + ('nav_venue_bb_lobby_beginner_4_name', 'Beginners Battle Ball 5'), + ('nav_venue_bb_lobby_tournament_9_name', 'Competitie Battle Ball 10'), + ('sound_machine_alert_song_saved', 'Song "%name%" successfully saved.'), + ('nav_venue_sw_lobby_intermediate_3_name', 'Snow Bombardiers Lobby'), + ('nav_venue_club_massiva/1_desc', 'Strut your funky stuff'), + ('furni_gothic_chair*1_name', 'Gothic Chair Pink'), + ('furni_divider_poly3_desc', 'All bars should have one'), + ('furni_romantique_divan*1_name', 'Pink Romantique Divan'), + ('NUF_playing_games_hotelview_tutor', 'Now we find out where to locate the Habbo Games!'), + ('poster_29_name', 'Gold Tinsel Bundle'), + ('furni_present_gen4_name', 'Gift'), + ('furni_bardesk_polyfon*7_name', 'Green Mode Bardesk'), + ('furni_gothic_sofa*6_name', 'Gothic Sofa Blue'), + ('furni_glass_stool*5_name', 'Glass stool'), + ('nav_venue_sw_lobby_free_5/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('nav_fav_hd', 'Your Favourite Rooms.'), + ('NUF_console_read_tutor', 'The Habbo Console lets you message your Habbo friends, and check whether they are online.'), + ('furni_romantique_tray2_desc', 'Spoil Yourself'), + ('Alert_ModeratorWarning', 'Message from a Moderator:'), + ('furni_giftflowers_name', 'Vase of Flowers'), + ('furni_table_silo_small*7_name', 'Green Area Occasional Table'), + ('furni_menorah_name', 'Menorah'), + ('furni_bed_polyfon_one*2_name', 'Black Mode Single Bed'), + ('console_offline', 'Offline'), + ('gs_mouseover_player', '\\x\\r\\yp'), + ('nav_venue_bb_lobby_amateur_3/0_desc', ''), + ('nav_venue_bb_lobby_amateur_13/0_desc', ''), + ('furni_noob_chair*2_name', 'My first Habbo chair'), + ('furni_doormat_plain*1_desc', 'Available in a variety of colours'), + ('object_displayer_hide_tags', 'Hide tags'), + ('poster_17_desc', 'Beautiful reproduction butterfly'), + ('gs_joinedplayers', 'Players Who Joined: \\x'), + ('furni_table_plasto_round*3_name', 'Round Dining Table'), + ('furni_divider_poly3*8_name', 'Yellow Mode Bardesk Gate'), + ('furni_glass_table*4_name', 'Glass table'), + ('furni_solarium_norja*6_desc', 'Rejuvenate your pixels!'), + ('poster_1006_desc', 'The eyes follow you...'), + ('furni_noob_rug*5_name', 'My first Habbo rug'), + ('buddyremove_pagecounter', 'Page'), + ('poll_alert_answer_missing', 'Please give an answer'), + ('furni_summer_chair*5_desc', 'Beige'), + ('furni_table_plasto_4leg*10_name', 'Occasional Table'), + ('furni_divider_silo2_desc', 'Stylish sectioning'), + ('furni_djesko_turntable_desc', 'For the music-lovers'), + ('nav_remrightsconf', 'You are about to remove all rights from your room. This means that only you will have rights to move and place furni in the room.'), + ('furni_pillow*0_name', 'White Lace Pillow'), + ('sound_machine_eject', 'Eject'), + ('gs_button_ready', 'Ready'), + ('furni_divider_silo1*5_name', 'Pink Area Corner Shelf'), + ('NUF_habbo_home_hotelview_tutor', 'You have now opened a page on the Habbo Website that will give you plenty of information about how to make yourself a Habbo Home.'), + ('furni_traffic_light*4_desc', 'Chill and wait your turn!'), + ('nav_venue_$unit.name$/0_desc', 'Roam more of the hotel\'s corridors'), + ('furni_sporttrack1*2_name', 'Sport track straight asphalt'), + ('furni_sofachair_polyfon_girl_name', 'Armchair'), + ('furni_sound_set_6_desc', 'Background ambience loops'), + ('furni_hal_grave_desc', 'We\'re raising the dead!'), + ('recycler_ready_info', 'Your recycled Furniture is ready. Please either accept or cancel. If you accept, you will receive your recycling reward, detailed below. If you cancel, all your old Furniture will be restored to your hand.'), + ('wallitem_jp_sheet1_name', 'jp_sheet1'), + ('furni_petfood2_name', 'Sardines Mega Multipack'), + ('furni_spotlight_name', 'Habbowood Spotlight'), + ('furni_carpet_soft*6_desc', 'Soft Wool Rug'), + ('gs_lounge_skill', 'Level in this Lounge: \\x \\r (\\y-\\z points)'), + ('nav_help_text', 'Click the Public Spaces tab on the top left of this navigator to find gaming rooms!'), + ('furni_table_plasto_4leg*5_name', 'Occasional Table'), + ('nav_venue_bb_arena_1_name', 'Battle Ball Aloittelijat'), + ('furni_table_silo_med*9_name', 'Red Area Coffee Table'), + ('furni_bed_budget_one*2_name', 'Pink Pura Bed'), + ('nav_venue_sw_lobby_expert_2/0_desc', 'Todellisille lumisotureille.'), + ('furni_rubberchair*6_name', 'Violet Inflatable Chair'), + ('furni_bardeskcorner_polyfon*5_name', 'Candy Corner'), + ('bb_powerup_8', 'Vacuum cleaner'), + ('bb_powerup_6', 'Harlequin'), + ('furni_rare_beehive_bulb*2_name', 'Yellow Amber Lamp'), + ('bb_powerup_7', 'Bomb'), + ('furni_divider_nor2_name', 'Ice Bar-Desk'), + ('bb_powerup_4', 'Cannon'), + ('bb_powerup_5', 'Box of pins'), + ('bb_powerup_2', 'Spring'), + ('bb_powerup_3', 'Flashlight'), + ('console_report', 'Report'), + ('bb_powerup_1', 'Light bulb'), + ('furni_sound_set_43_name', 'SFX 1'), + ('poster_37_desc', 'The Hotels girlband. Dream on!'), + ('interface_icon_messenger', 'Messenger, friends & messages on here'), + ('interface_icon_hand', 'Hand, your inventory'), + ('furni_s_sound_machine*4_name', 'Sound Machine Blue'), + ('nav_venue_sunset_cafe_name', 'Sunset Cafe'), + ('wallitem_sw_stone_desc', 'sw_stone'), + ('reg_check_mail', 'Email'), + ('furni_queue_tile1*7_name', 'Purple Habbo Roller'), + ('pet.hotwords.nest', 'sleep'), + ('furni_sound_machine_desc', 'Creating fancy sounds'), + ('cancel', 'Cancel'), + ('furni_hyacinth2_desc', 'Beautiful bulb'), + ('nav_venue_library/0_name', 'Habbo Library'), + ('furni_waterbowl*1_desc', 'Aqua unlimited'), + ('furni_grand_piano*5_desc', 'Why is that key green?'), + ('furni_table_plasto_bigsquare*8_name', 'Square Dining Table'), + ('furni_nouvelle_trax_name', 'nouvelle_trax'), + ('help_choise_header', 'What do you need help with?'), + ('furni_bardeskcorner_polyfon*7_name', 'Green Mode Bardesk Corner'), + ('furni_pillar*4_name', 'Dark Ages Pillar'), + ('furni_queue_tile1*6_desc', 'The power of movement'), + ('club_intro_link', 'Learn more about Habbo Club!'), + ('furni_sandrug_desc', 'Your own paradise island'), + ('poster_10_desc', 'Beautiful sunset'), + ('furni_divider_nor1_name', 'Ice Corner'), + ('nav_venue_bb_lobby_tournament_6_name', 'Competitie Battle Ball 7'), + ('furni_redhologram_desc', 'You\'re her only hope...'), + ('poster_38_name', 'Smiling Headbangerz'), + ('furni_hc_crtn_name', 'Antique Drapery'), + ('furni_barchair_silo*9_name', 'Red Bar Stool'), + ('room_badge_visible', 'Visible'), + ('furni_sleepingbag*8_name', 'Golden Sleeping Bag'), + ('roomevent_invalid_input', 'You must give your event a name and a description.'), + ('furni_chair_plasto*14_name', 'HC chair'), + ('poster_522_desc', 'The flag of Japan'), + ('furni_shelves_norja*2_name', 'Black Bookcase'), + ('nav_venue_dusty_lounge_name', 'Dusty Lounge'), + ('furni_sound_set_53_desc', 'Break the icy silence'), + ('nav_venue_ice_cafe_name', 'Ice Cafe'), + ('click', 'OK to continue to the hotel.'), + ('nav_venue_sw_lobby_free_2/0_desc', ''), + ('furni_rare_dragonlamp*9_name', 'Purple Dragon Lamp'), + ('furni_statue_desc', 'Watch out for those arrows!'), + ('game_battles_turn', 'TURN'), + ('wallitem_jp_sheet3_desc', 'jp_sheet3'), + ('furni_edicehc_desc', 'Click and roll!'), + ('furni_bed_budget*6_name', 'Blue Pura Double Bed'), + ('furni_gothic_sofa*5_desc', 'The dark side of Habbo'), + ('furni_scifirocket*5_desc', 'From the unknown depths of space'), + ('game_poker_ready', 'READY'), + ('furni_queue_tile1*2_name', 'Red Habbo Roller'), + ('furni_rare_parasol_desc', 'Zon! Zon! Zon!'), + ('transaction_system_sms_dna', 'DNA'), + ('furni_bar_polyfon_name', 'Mini-Bar'), + ('furni_grand_piano*1_name', 'Turquoise Grand Piano'), + ('nav_venue_bb_lobby_expert_4_name', 'Experts Battle Ball 5'), + ('bb_link_highscores', 'Highscores'), + ('summer_chair_8_desc', 'The summer winds are creeping in'), + ('reg_parentemail_title2', 'Email address of parent/guardian:'), + ('error_report_explain', 'An error has occurred, please see the error code above.'), + ('console_noprofile', 'Habbo Profile Not Found'), + ('furni_glass_sofa*3_desc', 'Translucent beauty'), + ('furni_romantique_smalltabl*4_desc', 'Why is one leg different?'), + ('furni_table_plasto_4leg*14_name', 'HC table'), + ('nav_venue_bb_lobby_intermediate_2_name', 'Semi-profs Battle Ball 3'), + ('NUF_playing_games_gamerooms_tutor', 'Click the \'Go\' button to go to the Game Lounge.'), + ('habboclub_require_parent_permission', 'You need to tick the box to say that you are over 14 years or age, \\ror under 14 and have your parent/guardian\'s permission to join Habbo Club. \\rPlease go back and tick the box.'), + ('furni_wooden_screen*1_desc', 'Add an exotic touch to your room'), + ('nav_venue_bb_lobby_intermediate_4/0_desc', ''), + ('furni_glass_sofa*6_name', 'Blue Glass Sofa'), + ('furni_bench_armas_desc', 'To complete the dining set'), + ('furni_barchair_silo*2_name', 'Black Bar Stool'), + ('nav_venue_bb_lobby_expert_6/0_desc', ''), + ('furni_jp_tray2_desc', 'jp_tray2'), + ('furni_val_teddy*3_desc', 'The green bear of friendship'), + ('transaction_system_sms_win_vodafone', 'Vodafone SMS'), + ('furni_glass_sofa_name', 'Glass sofa'), + ('console_online', 'online:'), + ('poster_2004_desc', 'irie!'), + ('x', 'X'), + ('nav_venue_habbo_lido/0_desc', 'Pool is open for swimming and diving!'), + ('furni_soft_sofachair_norja_name', 'iced sofachair'), + ('furni_xmas_cstl_twr_name', 'Ice Castle Tower'), + ('nav_venue_park_name', 'Habbo Gardens'), + ('recycler_info_open', 'Ecotron is the place to visit if you want to recycle your old Furniture. Simply drag the old Furni from your hand to the empty slots below. Recyclable items display the green recyclable tag in your hand. Please note that you must own the Furniture for at least %quarantine_hours% hour before they can be recycled. Recycling takes a total of %total_hours% hours.'), + ('group_window_title', 'Habbo Groups'), + ('pet.saying.eat.dog.4', 'Mmmmm..'), + ('game_chess', 'Chess'), + ('pet.saying.eat.dog.2', 'slurp, slurp, slurp'), + ('roomatic_roomdesc', 'Room description:'), + ('furni_sofa_polyfon*7_desc', 'Green Mode Sofa'), + ('pet.saying.eat.dog.3', 'hrum, umm, umm grrr'), + ('pet.saying.eat.dog.0', 'hrum, hrum, crunch!'), + ('preview_downloading', 'Preview downloading...'), + ('sound_machine_confirm_close_long', 'Are you sure you want to leave the editor without saving the song?'), + ('partner_registration_title', 'Hey, I forgot to mention one thing..'), + ('pet.saying.eat.dog.1', 'crunch, crunch mmmm'), + ('nav_venue_bb_lobby_tournament_12/0_desc', ''), + ('furni_carpet_soft*3_name', 'Soft Wool Rug'), + ('furni_sound_set_56_name', 'RnB Grooves 2'), + ('reg_termslink', 'Terms and Conditions'), + ('wallitem_sw_swords_desc', 'Z for Zorro'), + ('furni_sleepingbag*10_name', 'Khaki Sleeping Bag'), + ('furni_hc_dsk_name', 'Study Desk'), + ('furni_chair_silo*8_desc', 'Keep it simple'), + ('furni_glass_chair*8_name', 'Glass chair'), + ('nav_venue_cafe_ole_name', 'Cafe ole'), + ('furni_sleepingbag*5_desc', 'Ultimate coziness'), + ('opening_hours_text_closed', 'The Hotel has been closed and will be open to the public again at %h%:%m%.'), + ('furni_grunge_bench_desc', 'Laid back seating'), + ('BuddyNotHere', 'Offline'), + ('furni_noob_lamp*5_desc', 'Get the light right where you want it (pink)'), + ('NUH_navigator', 'Use the Navigator to move around. There are literally thousands of rooms to explore!'), + ('poster_1338_name', 'Pedobear Seal of Approval'), + ('furni_queue_tile1*9_name', 'Green Habbo Roller'), + ('furni_habboween_crypt_desc', 'What lurks inside?'), + ('furni_sofachair_silo*9_name', 'Red Area Armchair'), + ('furni_exe_chair_name', 'Executive Sofa Chair'), + ('furni_rare_dragonlamp*6_desc', 'Scary and scorching!'), + ('furni_divider_nor2*3_desc', 'Strong, yet soft looking'), + ('furni_tile_yell_name', 'Floor Tiles'), + ('furni_plant_yukka_name', 'Yukka Plant'), + ('furni_wooden_screen*8_desc', 'Add an exotic touch to your room'), + ('furni_pillar*8_desc', 'All roads lead to Rome'), + ('trading_youoffer', 'You offer:'), + ('furni_marquee*8_desc', 'It\'s both door and a shade!'), + ('furni_pura_mdl4*9_name', 'Red Pura Module 4'), + ('roomatic_congrats', 'Congratulations! You\'re now the proud owner of your own Habbo Hotel room.'), + ('furni_tile_marble_name', 'Marble Tile'), + ('furni_bed_budget*3_desc', 'King sized comfort!'), + ('furni_sound_machine*3_desc', 'Top the Habbo Charts!'), + ('nav_venue_bb_lobby_beginner_10_name', 'Beginners Battle Ball 11'), + ('nav_venue_bb_lobby_tournament_1/0_desc', ''), + ('poster_2000_name', 'Suomen kartta'), + ('furni_solarium_norja*3_name', 'Urban Solarium'), + ('furni_present_gen3_desc', 'What\'s inside?'), + ('furni_glass_stool*4_desc', 'Translucent beauty'), + ('int_update_id', 'Update My Habbo ID >>'), + ('nav_venue_bb_lobby_beginner_8/0_desc', ''), + ('furni_carpet_standard*8_desc', 'Available in a variety of colours'), + ('furni_pillar*1_desc', 'Ancient and stately'), + ('receive_invitation_text', 'invites you his/her room. Accept invitation?'), + ('poll_offer_window', 'Welcome to our poll'), + ('furni_table_plasto_bigsquare*5_desc', 'Hip plastic furniture'), + ('furni_carpet_standard*1_desc', 'Available in a variety of colours'), + ('furni_hologram_name', 'Holopod'), + ('nav_venue_bb_lobby_amateur_desc', 'Amateur battle ball!'), + ('furni_barchair_silo*6_desc', 'Practical and convenient'), + ('furni_divider_nor5_desc', 'Cool cornering for your crib y0!'), + ('purse_vouchers_helpbutton', 'More about vouchers >>'), + ('furni_shelves_norja*6_desc', 'For nic naks and art deco books'), + ('nav_venue_sw_lobby_tournament_5/0_desc', ''), + ('furni_chair_basic*4_desc', 'It\'s a cracking design!'), + ('nav_hidefull', 'Hide Full Rooms'), + ('modtool_ban_computer', 'Ban Computer Also'), + ('furni_gothic_sofa*1_name', 'Gothic Sofa Pink'), + ('furni_carpet_standard*b_name', 'Floor Rug'), + ('queue_line', 'You are queueing right now...'), + ('furni_divider_nor1*6_desc', 'Blue Ice corner'), + ('nav_search_helptext', 'Looking for something? Here you can search other Habbo\'s rooms. Type the room name or the name of the Habbo to search for a room.'), + ('furni_marquee*1_desc', 'It\'s both door and a shade!'), + ('furni_rcandleset_desc', 'Simple but stylish'), + ('nav_room_banned', 'You are banned from this room.'), + ('furni_lamp_armas_name', 'Table Lamp'), + ('catalog_costs', '\\x1 costs \\x2 Credits'), + ('furni_drinks_desc', 'Are you a slob too?'), + ('furni_pura_mdl5*6_name', 'Blue Pura Module 5'), + ('summer_chair_1_desc', 'Gotta get up early to get one!'), + ('furni_prize3_desc', 'A weighty award'), + ('furni_soft_sofa_norja*7_name', 'Rural Iced Sofa'), + ('poster_518_name', 'The Welsh flag'), + ('furni_sofachair_polyfon*8_name', 'Yellow Mode Armchair'), + ('furni_prizetrophy3*3_desc', 'Breathtaking bronze'), + ('nav_venue_sw_lobby_amateur_6_name', 'Snow Slingers Lobby'), + ('furni_stand_polyfon_z_desc', 'Tidy up'), + ('furni_carpet_soft_tut_name', 'Welcome Mat'), + ('console_reject_all', 'Reject All'), + ('month12', 'December'), + ('month11', 'November'), + ('help_topics', 'Help Topics:'), + ('nav_venue_sw_lobby_beginner_8/0_desc', ''), + ('nav_rooms_own', 'Own Room(s)'), + ('reg_pwd_note', 'Choose a password that\'s hard to guess! So, don\'t use ANYONES name, or your favorite colour!'), + ('furni_wooden_screen*4_name', 'Golden Oriental Screen'), + ('nav_venue_sw_lobby_beginner_2/0_desc', ''), + ('furni_pillow*6_desc', 'Puffy, soft and huge'), + ('furni_bed_polyfon_one*4_desc', 'Beige Mode Single Bed'), + ('reg_email_note', 'Please enter your e-mail address, this is important! You\'ll only get customer support and special offers via email, if you enter a valid email address and verify it.'), + ('group_admin', 'Administrator'), + ('furni_scifirocket*8_name', 'Pluto Smoke Machine'), + ('furni_chair_plasto*11_desc', 'Hip plastic furniture'), + ('month10', 'October'), + ('furni_goth_table_name', 'Gothic table'), + ('month05', 'May'), + ('month04', 'April'), + ('nav_modify_maxvisitors', 'Choose maximum number of visitors'), + ('nav_venue_bb_lobby_amateur_2_name', 'Gevorderden Battle Ball 3'), + ('month07', 'July'), + ('habboclub_price1', '30'), + ('month06', 'June'), + ('month01', 'January'), + ('month03', 'March'), + ('month02', 'February'), + ('furni_summer_chair*2_desc', 'Pink'), + ('month09', 'September'), + ('month08', 'August'), + ('furni_bardeskcorner_polyfon*4_desc', 'Beige Mode Bardesk Corner'), + ('furni_tree6_name', 'Flashy Christmas Tree'), + ('furni_arabian_snake_name', 'Ornamental Urn'), + ('reg_verification_incorrectPassword', 'Your password was incorrect'), + ('NUF_visting_rooms_hotelview_tutor', 'Here we go again. This time we are learning how to visit another Habbos room.'), + ('furni_summer_chair*9_desc', 'Got your sunglasses?'), + ('furni_safe_silo_name', 'Safe Minibar'), + ('furni_throne_name', 'Throne'), + ('furni_soft_sofachair_norja*8_desc', 'Yellow Iced Sofachair'), + ('NUF_console_ready_tutor', 'You can now use the Console to find some of your friends, or you can continue the tutorial.'), + ('nav_venue_picnic/0_desc', 'Don\'t forget to grab a carrot or two!'), + ('furni_bardeskcorner_polyfon_name', 'Corner Cabinet/Desk'), + ('game_placeship', 'Place your ships:'), + ('furni_glass_table*7_desc', 'Habbo Club'), + ('poster_13_name', 'BW Skyline Poster'), + ('furni_jp_bamboo_name', 'Bamboo Forest'), + ('furni_plant_bulrush_name', 'Bulrush'), + ('furni_deadduck3_desc', 'With added ectoplasm'), + ('win_purse', 'Habbo Purse'), + ('furni_jp_tray5_name', 'jp_tray5'), + ('furni_hc_tbl_desc', 'Perfect for banquets'), + ('furni_shelves_norja_desc', 'For nic naks and art deco books'), + ('club_desc_3_period', '6 Months (186 days) = 105 Credits'), + ('furni_bed_budget_one*3_name', 'Black Pura Bed'), + ('poster_2_name', 'Carrot Plaque'), + ('furni_solarium_norja*7_desc', 'Fun in the sun!'), + ('poster_2007_name', 'The Father Of Habbo'), + ('gs_header_teams', 'Teams'), + ('furni_divider_poly3*9_desc', 'Border Control!'), + ('gs_button_creategame', 'Create A New Game'), + ('furni_sound_set_42_name', 'Haunted Mansion'), + ('poll_alert_invalid_selection', 'Please select fewer alternatives'), + ('furni_scifirocket*1_name', 'Saturn Smoke Machine'), + ('furni_scifidoor*10_name', 'Violet Spaceship Door'), + ('furni_sound_set_5_desc', 'The dark side of Habbo'), + ('club_confirm_gift_title', 'You have received a Habbo club gift!'), + ('bb_info_gamePrice', 'Play now for just 2 tickets.'), + ('furni_sound_machine*6_name', 'Purple Traxmachine'), + ('wallitem_arabian_swords_desc', 'Not for yielding'), + ('furni_divider_nor2*6_name', 'Blue Iced bar desk'), + ('nav_venue_sw_lobby_expert_0/0_desc', ''), + ('furni_noob_chair*1_name', 'My first Habbo chair'), + ('group_room_link', 'Group\'s room: %room_name% >>>'), + ('sound_machine_playlist', 'Playlist'), + ('nav_venue_bb_arena_2_name', 'Battle Ball Amatöörit'), + ('roomatic_create_error', 'Error in room creation process. Please try again!'), + ('furni_couch_norja*7_desc', 'Two can perch comfortably'), + ('gs_button_spectate', 'Watch Game!'), + ('furni_sofachair_silo*6_desc', 'Blue Area Armchair'), + ('credit_redeem_button', 'Redeem'), + ('furni_valentinescreen_desc', 'Peep through and smile!'), + ('poster_511_name', 'The Dutch flag'), + ('furni_shelves_armas_name', 'Bookcase'), + ('nav_venue_habbo_lido_name', 'Habbo Lido'), + ('furni_bed_polyfon*9_name', 'Red Double Bed'), + ('furni_sofa_silo*9_name', 'Red Area Sofa'), + ('furni_pura_mdl4*6_desc', 'Any way you like it!'), + ('console_mainhelptext', 'You can use the Habbo Console to keep in constant contact with your friends using instant messages.'), + ('wallitem_jp_ninjastars_name', 'Ninja Stars'), + ('ad_note', 'Clicking this advertisement will open a new window'), + ('ph_tickets_choise2', 'Buy 20 Tickets for 6 Credits.'), + ('ph_tickets_choise1', 'Buy 2 Tickets for 1 Credit.'), + ('reg_day', 'Day'), + ('nav_venue_cunning_fox_gamehall/2_name', 'Noughts&Crosses'), + ('nav_venue_sw_lobby_tournament_6_name', 'Tournament Lobby'), + ('furni_noob_lamp*1_name', 'My first Habbo lamp'), + ('furni_petfood1_name', 'Bones Mega Multipack'), + ('furni_table_silo_med*3_name', 'White Coffee Table'), + ('pet.hotwords.jump', 'jump'), + ('furni_sleepingbag*1_name', 'Red Sleeping Bag'), + ('nav_venue_main_lobby/0_desc', 'The heart of Habbo Hotel'), + ('pet_hungry', 'Hunger:'), + ('furni_rare_fan*4_name', 'SUPERLOVE Fan'), + ('furni_sw_table_name', 'sw_table'), + ('furni_CFC_200_moneybag_name', 'Sack of Credits (China)'), + ('room_ask_friend', 'Ask to be a Friend'), + ('furni_bed_polyfon*2_name', 'Black Mode Double Bed'), + ('furni_table_norja_med_desc', 'Elegance embodied'), + ('nav_removerights', 'Reset'), + ('wallitem_hrella_poster_1_name', 'Porthole'), + ('NUF_getting_items_purse_', 'Click this link to open the Habbo Credits page in the website window.'), + ('poster_31_name', 'System of a Ban'), + ('furni_sound_set_24_name', 'Habbo Sounds 4'), + ('furni_chair_basic*7_name', 'chair_basic'), + ('poster_56_name', 'Disco Sign'), + ('furni_rare_dragonlamp*2_name', 'Jade Dragon Lamp'), + ('furni_gothic_stool*4_desc', 'Witches and Warlocks'), + ('furni_sofa_silo*2_name', 'Black Two-Seater Sofa'), + ('furni_grunge_radiator_name', 'Radiator'), + ('nav_venue_bb_lobby_amateur_9_name', 'Gevorderden Battle Ball 10'), + ('summer_chair_4_name', 'White Deck Chair'), + ('furni_sound_set_49_name', 'Club 4'), + ('messenger.email.subject', ''), + ('furni_romantique_chair*3_name', 'Turquoise Romantique Chair'), + ('furni_s_sound_machine*7_desc', 'Sound Machine Red'), + ('furni_table_plasto_round*9_desc', 'Hip plastic furniture'), + ('furni_table_plasto_4leg*7_name', 'Occasional table'), + ('club_confirm_title', 'You are about to subscribe to Habbo Club. Wise choice!'), + ('furni_romantique_pianochair*1_desc', 'Here sat the legend of 1900'), + ('furni_sofa_silo*6_desc', 'Blue Area Sofa'), + ('nav_venue_bb_lobby_tournament_11_name', 'Competitie Battle Ball 12'), + ('furni_rare_icecream*9_desc', 'Virtual bubblegum rocks!'), + ('furni_romantique_divider*1_name', 'Rose Quartz Screen'), + ('NUF_playing_games_room_ruleslink', 'Click me! But only if you want to read the game FAQs in the website.'), + ('furni_chair_silo_name', 'Dining Chair'), + ('furni_sound_set_17_desc', 'Jive\'s Alive!'), + ('dance_choose', 'Choose Dance'), + ('wallitem_industrialfan_name', 'Industrial Turbine'), + ('sound_machine_alert_invalid_song_length', 'Can\'t burn an empty song!'), + ('furni_pura_mdl1*4_desc', 'Any way you like it!'), + ('wallitem_post.it.vd_desc', 'Heart Stickies'), + ('catalog_give_petname', 'Type your pet\'s name in the grey box.'), + ('furni_pura_mdl2*1_name', 'Aqua Pura Module 2'), + ('poster_24_name', 'Hole In The Wall'), + ('win_error', 'Notice!'), + ('furni_chair_plasto*2_desc', 'Hip plastic furniture'), + ('wallitem_xmas_light_desc', 'Xmas light'), + ('furni_rubberchair*1_name', 'Blue Inflatable Chair'), + ('NUF_getting_room_roommatic_details_tutor', 'Give a name to your room, choose a category and add a description. Don\'t worry, you can change it all later.'), + ('furni_divider_poly3*2_desc', 'Black Mode Bardesk Gate'), + ('furni_plant_valentinerose*2_desc', 'Your secret love'), + ('furni_table_norja_med*7_desc', 'For larger gatherings'), + ('furni_carpet_polar_desc', 'For cuddling up on'), + ('nav_venue_sw_lobby_free_8/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('furni_summer_grill*1_name', 'Blue Barbeque Grill'), + ('furni_chair_norja*7_desc', 'Sleek and chic for each cheek'), + ('furni_joulutahti_name', 'Poinsetta'), + ('furni_exe_table_name', 'Executive Desk'), + ('furni_divider_silo3*8_desc', 'Form following function'), + ('furni_gothiccandelabra_name', 'Gothic Candelabra'), + ('transaction_system_bibit', 'Credit card'), + ('nav_venue_tv_studio/0_desc', 'Sponsored by Bobbanet.com'), + ('furni_noob_table*4_desc', 'Lightweight, practical and light blue'), + ('furni_bardesk_polyfon*3_desc', 'Perfect for work or play'), + ('room_info_rated', 'Room rating:'), + ('nav_venue_bb_lobby_beginner_2/0_desc', ''), + ('help_emergency_explanation', 'If you are experiencing a situation which is making you feel uncomfortable or unsafe, please give details below and a member of community staff will reply as soon as possible.'), + ('furni_divider_nor5*8_desc', 'Cool cornering for your crib y0!'), + ('poster_507_name', 'The French Tricolore'), + ('nav_privateRooms', 'Rooms'), + ('furni_pura_mdl2*5_desc', ''), + ('furni_sporttrack3*3_name', 'Sport goal grass'), + ('furni_sound_set_10_desc', 'Made from real Boy Bands!'), + ('furni_chair_plasto*9_desc', 'Hip plastic furniture'), + ('furni_soft_sofa_norja*4_desc', 'Sit back and relax'), + ('furni_s_sound_machine*3_name', 'Sound Machine Green'), + ('reg_spam', 'Yes, I want to get the occasional email from the Hotel Manager.'), + ('shout', 'Shout'), + ('NUF_mini_use_console_read_link', 'Click here to view the message.'), + ('furni_scifidoor*2_desc', 'There out of this world!'), + ('furni_divider_nor3*3_name', 'White Iced Gate'), + ('pet_hung_0', 'Empty'), + ('furni_table_plasto_square*1_name', 'Occasional Table'), + ('pet_hung_6', 'Stuffed'), + ('pet_hung_5', 'Full'), + ('bb_user_skill', 'Skill Level: \\x\\rScore: \\y'), + ('login_welcome', 'Welcome'), + ('pet_hung_2', 'Rumbling'), + ('pet_hung_1', 'Hungry'), + ('poster_20_name', 'Bars'), + ('pet_hung_4', 'Satisfied'), + ('pet_hung_3', 'Peckish'), + ('Alert_WrongNameOrPassword', 'Wrong name or password - please try again!'), + ('furni_romantique_pianochair*5_desc', 'I can feel air coming through...'), + ('furni_carpet_armas_desc', 'Adds instant warmth'), + ('console_removefriend_2', 'from your Friends List?'), + ('console_removefriend_1', 'Are you sure you want to remove'), + ('furni_rare_parasol*0_name', 'Green Parasol'), + ('furni_sound_set_38_name', 'Rock 6'), + ('NUF_mini_meet_people_room_wave', 'These buttons let you wave and dance. Click on your Habbo at anytime to see these buttons.'), + ('gs_skill_changed_header', 'Congratulations!'), + ('furni_chair_plasty*7_name', 'Plastic Pod Chair'), + ('furni_safe_silo*5_desc', 'Totally shatter-proof!'), + ('furni_divider_silo1*3_name', 'White Corner Shelf'), + ('nav_venue_hallway_ii_name', 'Hallway II'), + ('cam_release.help', 'Cancel Photo'), + ('nav_venue_bb_lobby_amateur_14/0_desc', ''), + ('habbo_tv_title', 'Widescreen Habbovision'), + ('purse_noevents', 'You haven\'t made any transactions yet. Click the button below to find out how to get Habbo Credits.\\rRemember: you must ask your parents permission before you buy Habbo Credits.'), + ('furni_pura_mdl2*8_name', 'yellow pura module 2'), + ('furni_CFC_10_coin_bronze_name', 'Bronze Coin (China)'), + ('sound_machine_song_remove', 'Remove song'), + ('modtool_choose_length', 'Choose Length:'), + ('sound_machine_turn_off', 'Switch Off'), + ('furni_pura_mdl1*8_desc', ''), + ('furni_spyro_desc', 'The stuff of legend'), + ('furni_pillow*2_name', 'Red Silk Pillow'), + ('furni_table_armas_desc', 'For informal dining'), + ('furni_tree3_desc', 'Any presents under it yet?'), + ('object_displayer_link_looks', 'Change avatar looks'), + ('furni_barrier*2_name', 'White Road Barrier'), + ('furni_gothic_chair*5_desc', 'The dark side of Habbo'), + ('furni_divider_nor4*4_name', 'Urban Iced Shutter'), + ('furni_camera_name', 'Camera'), + ('next_arrows', 'Next >>'), + ('furni_sound_set_60_desc', 'Love and affection!'), + ('furni_bed_polyfon_girl_one_name', 'Single Bed'), + ('NUF_mini_meet_people_user_chatfield', 'Start typing here and press \'Enter\' to chat with others.'), + ('successfully_purchase_gift_for', 'Successfully purchased gift for user %user%!'), + ('poster_49_desc', 'All that glitters...'), + ('furni_glass_table*3_name', 'Glass table'), + ('furni_divider_silo3*5_desc', 'Pink Area Gate'), + ('furni_divider_arm3_name', 'Gate (lockable)'), + ('furni_table_plasto_4leg*3_name', 'Round Dining Table'), + ('roomatic_roomnumber', 'Room number:'), + ('nav_venue_bb_lobby_beginner_5_name', 'Beginners Battle Ball 6'), + ('reg_nameAndPassTooSimilar', 'Your name and password are too similar'), + ('nav_venue_theatredrome_easter_name', 'Theatredrome Easter'), + ('nav_venue_bb_lobby_beginner_11/0_desc', ''), + ('furni_fireplace_polyfon_name', 'Fireplace'), + ('queue_set.e1.info', 'There are %e1% Habbos in front of you in the queue.'), + ('more_info_link', 'Redeem Now'), + ('furni_bed_polyfon*6_desc', 'Blue Mode Double Bed'), + ('furni_rare_icecream*5_name', 'Vanilla Ice Cream Machine'), + ('poster_500_name', 'Union Jack'), + ('furni_chair_norja*3_name', 'White Iced Chair'), + ('furni_sound_set_31_name', 'Dance 3'), + ('furni_pura_mdl3*5_name', 'beige pura module 3'), + ('furni_sporttrack2*3_desc', 'null'), + ('furni_sound_set_46_desc', 'De bada bada bo!'), + ('poster_9_name', 'Rainforest Poster'), + ('furni_romantique_pianochair*4_name', 'Amber Piano Stool'), + ('poster_515_desc', 'Waved by Swedes everywhere'), + ('furni_scifidoor*9_desc', 'There out of this world!'), + ('furni_chair_plasty*3_name', 'Plastic Pod Chair'), + ('furni_table_plasto_round*5_name', 'Round Dining Table'), + ('furni_one_way_door*9_desc', 'One at a time!'), + ('furni_calippo_desc', 'Basic model'), + ('furni_footylamp_desc', 'Can you kick it?'), + ('furni_one_way_door*2_desc', 'One way! The HC way!'), + ('furni_arabian_tray4_desc', 'Sweet, juicy and ripe'), + ('furni_divider_nor3*7_name', 'Rural Iced gate'), + ('furni_couch_norja*3_name', 'White Iced Bench'), + ('furni_pillow*9_name', 'Green Wooly Pillow'), + ('game_chooseside', 'Choose your side'), + ('start', 'Start'), + ('furni_toy1*4_desc', 'it\'s bouncy-tastic'), + ('roomevent_host', 'Host:'), + ('nav_venue_rooftop_rumble_name', 'Rooftop Rumble'), + ('nav_venue_bb_lobby_expert_0/0_desc', ''), + ('nav_venue_rooftop_rumble_ii/0_desc', 'Are you ready?'), + ('error_report_trigger_message', 'Last message ID'), + ('furni_sofachair_silo*2_name', 'Black Armchair'), + ('furni_noob_chair*5_desc', 'Lightweight, practical, with pink stripes'), + ('pet_frnd_0', 'Hostile'), + ('furni_noob_rug*3_name', 'My first Habbo rug'), + ('pet_frnd_2', 'Suspicious'), + ('pet_frnd_1', 'Angry'), + ('furni_scifiport*6_desc', 'Energy beams. No trespassers!'), + ('pet_frnd_4', 'Calm'), + ('pet_frnd_3', 'Cool'), + ('pet_frnd_6', 'Warm'), + ('pet_frnd_5', 'Friendly'), + ('pet_frnd_8', 'Loving'), + ('credit_trade_value', 'Includes credit furnis worth %value% credits.'), + ('pet_frnd_7', 'Affectionate'), + ('pet_frnd_9', 'Loyal'), + ('NUF_getting_items_purse_tutor', 'Your Purse tells you how many Habbo Credits you have. If you have a voucher code you can redeem it here by clicking the \'Vouchers\' button.'), + ('furni_chair_norja*6_name', 'Blue Chair'), + ('sound_machine_alert_machine_full', 'You already have 4 Traxpacks loaded. Eject one before adding a new Traxpack.'), + ('nav_venue_club_mammoth/0_desc', 'Monumental and magnificent. For Habbo Club members only.'), + ('NUF_getting_room_hand_tutor', 'This is your hand. It contains all your furniture. I have given you a rug so that you can place it in your room- click and drag it to set it down.'), + ('reg_check_name', 'Name'), + ('furni_glass_stool*7_name', 'Green Glass Stool'), + ('poster_504_name', 'The Bundesflagge'), + ('poster_42_desc', 'Not something you want to run into'), + ('pet.saying.sleep.dog.6', '*dreaming*'), + ('pet.saying.sleep.dog.5', 'Zzzzz wuff! zzzzz'), + ('pet.saying.sleep.dog.4', 'hrrrrr...murrmm..'), + ('furni_pura_mdl4*2_desc', 'Any way you like it!'), + ('pet.saying.sleep.dog.3', 'bzz.. oof oof'), + ('furni_sofa_silo*5_name', 'Pink Area Sofa'), + ('pet.saying.sleep.dog.2', 'hrrr.. hrrr'), + ('pet.saying.sleep.dog.1', 'bzz.. bzzzzz'), + ('furni_petfood4_name', 'T-Bones Mega Multipack'), + ('nav_venue_club_mammoth_name', 'Club Mammoth'), + ('ph_keys_dive', 'Diving moves:'), + ('furni_noob_table*3_name', 'My first Habbo table'), + ('furni_romantique_divan*5_desc', 'Is that a cape hanging there?'), + ('furni_table_plasto_round*8_name', 'Round Dining Table'), + ('furni_rare_fan*1_name', 'Blue Powered Fan'), + ('reg_forcedupdate2', 'Update your Habbo info'), + ('furni_table_plasto_square*4_name', 'Square Dining Table'), + ('NUF_playing_games', 'Playing games'), + ('furni_prizetrophy2*2_name', 'Duck trophy'), + ('reg_forcedupdate3', 'The Habbo Hotel management requires all Habbos to read and agree to the service Terms and Conditions. It won\'t take long.\\rJust go through the registration, check your info and agree to the new terms. Thank you!'), + ('nav_venue_sw_lobby_tournament_2_name', 'Tournament Lobby'), + ('furni_carpet_standard*4_name', 'Floor Rug'), + ('furni_s_sound_machine*6_name', 'Sound Machine Purple'), + ('furni_prizetrophy5*1_desc', 'Glittery gold'), + ('furni_table_plasto_square_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_beginner_2_name', 'Beginners Battle Ball 3'), + ('furni_rubberchair*4_name', 'Ocean Inflatable Chair'), + ('furni_divider_poly3*5_desc', 'Keep the Pink in!'), + ('furni_arabian_teamk_name', 'Tea Maker'), + ('room_name', 'Room:'), + ('nav_venue_chill/0_desc', 'Come chill in the Zen Garden!'), + ('furni_summer_grill*4_name', 'Green Barbeque Grill'), + ('poster_1001_desc', 'even walls have ears'), + ('furni_rare_icecream*8_name', 'Peppermint Ice Cream Machine'), + ('furni_safe_silo*9_desc', 'Totally shatter-proof!'), + ('sound_machine_song_save', 'Save song'), + ('NUF_getting_room_navigator_ownrooms', 'Click the \'Own Room(s)\' tab to see your rooms.'), + ('furni_gothic_chair*1_desc', 'The dark side of Habbo'), + ('furni_table_plasto_square*8_name', 'Square Dining Table'), + ('furni_safe_silo*2_desc', 'Totally shatter-proof!'), + ('roomevent_create_description', 'Describe your event'), + ('purse_vouchers_success', 'Voucher was successfully redeemed. You have the Credits.'), + ('furni_gothic_carpet2_name', 'Dungeon Floor'), + ('furni_sofa_polyfon*3_name', 'White Two-seater Sofa'), + ('furni_romantique_tray2_name', 'Treats Tray'), + ('nav_modify_doorstatus_locked', 'Locked (visitors have to ring the bell)'), + ('NUF_visiting_rooms_categorylist_open', 'Click the \'Open\' button to open a category.'), + ('room_doorbell', 'Rings the doorbell - Open the door?'), + ('furni_sound_set_45_name', 'Lost_Beatness'), + ('nav_deleteroom', 'Delete'), + ('furni_barchair_silo_name', 'Bar Stool'), + ('furni_chair_plasto*5_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_tournament_14_name', 'Competitie Battle Ball 15'), + ('furni_pura_mdl1*1_desc', 'Any way you like it!'), + ('furni_rare_snowrug_desc', 'Chilled Elegance'), + ('poster_35_desc', 'The Hotel\'s girlband. Dream on!'), + ('furni_glass_stool_desc', 'Translucent beauty'), + ('furni_rare_fan*8_name', 'Habbo Wind Turbine'), + ('furni_menorah_desc', 'Light up your room'), + ('furni_table_silo_small*7_desc', 'Green Area Occasional Table'), + ('furni_divider_silo1*7_name', 'Green Area Corner Shelf'), + ('furni_romantique_divan*1_desc', 'null'), + ('furni_table_plasto_round*1_name', 'Round Dining Table'), + ('reg_changeEmail', 'Change your email'), + ('hobba_mark_normal', 'Send To Helpers'), + ('nav_venue_bb_lobby_tournament_8/0_desc', ''), + ('ph_tickets_have2', 'Tickets'), + ('nav_venue_sw_lobby_intermediate_0/0_desc', ''), + ('ph_tickets_have1', 'You Have'), + ('furni_bardesk_polyfon*7_desc', 'Green Mode Bardesk'), + ('console_inprivateroom', 'In A Guest Room'), + ('furni_sound_set_35_name', 'Dance 6'), + ('GoAway', 'Leave The Room'), + ('room_kick', 'Kick'), + ('furni_rubberchair*8_name', 'Black Inflatable Chair'), + ('poster_6_name', 'Abstract Poster'), + ('hubu_t1_3', ''), + ('NUF_meeting_people', 'Meeting people'), + ('nav_venue_bb_lobby_amateur_4/0_desc', ''), + ('nav_venue_bb_game/0_name', 'Battle Ball Arena'), + ('furni_pudding_name', 'Christmas Pudding'), + ('furni_tile_red_name', 'Floor Tiles'), + ('catalog_typeurname', 'Type your greetings here\\r(don\'t forget to put your name!):'), + ('furni_house2_name', 'Gingerbread House'), + ('hubu_t1_1', 'Kaupunkien pu_t2_2=Katso onko kotisi l_1=Tietoa Hubusta'), + ('furni_glass_table*4_desc', 'Translucent beauty'), + ('hubu_t1_2', ''), + ('nav_venue_club_massiva/1_name', 'Chill-out Room'), + ('furni_scifiport*2_desc', 'Get in the ring!'), + ('furni_traffic_light*4_name', 'Yellow Traffic Light'), + ('furni_tree2_name', 'Old Christmas Tree'), + ('furni_noob_stool*4_name', 'My first Habbo stool'), + ('done', 'Done'), + ('furni_goodie1*1_name', 'Marzipan Man'), + ('nav_venue_bb_lobby_tournament_18/0_desc', ''), + ('poster_17_name', 'Butterfly Cabinet 1'), + ('furni_summer_chair*5_name', 'Deck Chair'), + ('furni_prizetrophy*1_name', 'Classic trophy'), + ('furni_easterduck_desc', 'Can you tell what it is yet?'), + ('furni_barrier*3_desc', 'No trespassing, please!'), + ('furni_table_plasto_bigsquare*1_name', 'Square Dining Table'), + ('club_general_infolink', 'More Info About Habbo Club >>'), + ('furni_chair_silo*4_name', 'Beige Silo Dining Chair'), + ('roomatic_givename', 'Give your room a name!'), + ('furni_rare_icecream*1_name', 'Blueberry Ice Cream Machine'), + ('roomatic_open', 'Door open'), + ('NUF_getting_items_catalogue_tutor', 'Big! You can browse the products by clicking on the categories. There are loads of different types of furniture to decorate your room.'), + ('furni_marquee*4_name', 'Yellow Marquee'), + ('furni_bed_polyfon_one*7_name', 'Green Mode Single Bed'), + ('gs_button_go_started', 'Watch'), + ('poster_27_name', 'Holly Bundle 3'), + ('furni_divider_nor2*7_desc', 'No way through'), + ('furni_glass_chair*5_desc', 'Translucent beauty'), + ('nav_venue_basement_lobby_name', 'Basement Lobby'), + ('pick_furniture', 'Put Furni In Hand'), + ('nav_venue_bb_lobby_beginner_18/0_desc', ''), + ('furni_pura_mdl2*4_name', 'White Pura Module 2'), + ('club_status_title', 'You are currently a member of Habbo Club.'), + ('furni_rare_elephant_statue_name', 'Golden Elephant'), + ('furni_toy1*1_desc', 'it\'s bouncy-tastic'), + ('reg_doneheader', 'Congratulations!\\rYou\'re a Habbo!'), + ('furni_present_gen6_name', 'Gift'), + ('furni_noob_chair*2_desc', 'Lightweight, practical, with dark blue stripes'), + ('furni_sofachair_silo*5_name', 'Pink Area Armchair'), + ('BuddyNow', 'now:'), + ('furni_pura_mdl5*3_desc', 'Any way you like it!'), + ('furni_prizetrophy6*1_name', 'Champion trophy'), + ('BuddyEntry', 'On Hotel View'), + ('furni_scifiport*9_desc', 'Energy beams. No trespassers!'), + ('furni_table_polyfon_small_desc', 'For serving a stylish latte'), + ('furni_exe_rug_name', 'Executive Rug'), + ('nav_venue_the_dirty_duck_pub_name', 'The Dirty Duck Pub'), + ('nav_venue_bb_lobby_beginner_9_name', 'Beginners Battle Ball 10'), + ('nav_venue_sw_lobby_beginner_5_name', 'Snow Rookies Lobby'), + ('furni_pura_mdl5*2_name', 'Pink Pura Module 5'), + ('furni_bardeskcorner_polyfon*7_desc', 'Green Mode Bardesk Corner'), + ('alert_donate_content', 'The other Habbo has not put anything into the trade. Are you sure you want to give away your furni?'), + ('furni_hc_rllr_name', 'HC Rollers Set'), + ('furni_divider_nor1_desc', 'Looks squishy, but isn\'t'), + ('furni_nouvelle_trax_desc', ''), + ('wallitem_jp_sheet3_name', 'jp_sheet3'), + ('furni_hyacinth2_name', 'Blue Hyacinth'), + ('furni_sound_machine_name', 'Sound Machine'), + ('console_getmessage_sender', 'Sender:'), + ('furni_sandrug_name', 'Tropical Beach Rug'), + ('nav_updatenote_header', 'Note!'), + ('furni_pillar*4_desc', 'From the time of the Kick Warz'), + ('furni_waterbowl*1_name', 'Red Water Bowl'), + ('furni_grand_piano*5_name', 'Onyx Grand Piano'), + ('furni_redhologram_name', 'Holo-girl'), + ('sound_machine_alert_playlist_full', 'Could not save playlist! Playlists can have only %count% songs.'), + ('nav_rooms_search', 'Search'), + ('nav_venue_cunning_fox_gamehall/5_name', 'Poker'), + ('nav_venue_habbo_lido_ii_name', 'Habbo Lido II'), + ('furni_barchair_silo*9_desc', 'Practical and convenient'), + ('pet_nature', 'Nature:'), + ('furni_wood_tv_name', 'Large TV'), + ('poster_2008_desc', 'Once every four Habbo years!'), + ('poster_38_desc', 'For really TOUGH Habbos!'), + ('nav_venue_bb_lobby_expert_0_name', 'Expert'), + ('furni_chair_plasto*14_desc', 'Aqua chair'), + ('furni_queue_tile1*6_name', 'Blue Habbo Roller'), + ('poster_522_name', 'The flag of Japan'), + ('furni_chair_basic*3_name', 'Black Pura Egg Chair'), + ('nav_venue_pizza_desc', 'Tunnelmallinen pizzapaikka kiireettömään nautiskeluun.'), + ('furni_jp_tray6_desc', 'jp_tray6'), + ('furni_hc_btlr_desc', 'Your personal caretaker'), + ('furni_song_disk_desc', 'Burn, baby burn'), + ('furni_deadduck2_name', 'Dead Duck 2'), + ('furni_statue_name', 'Cupid Statue'), + ('furni_scifirocket*5_name', 'Uranus Smoke Machine'), + ('nav_gobutton', 'Go'), + ('recycler_furni_not_recyclable', 'This Furniture cannot be recycled. Please only use Furniture that has the recyclable tag in your hand.'), + ('furni_gothic_sofa*5_name', 'Green Gothic Sofa'), + ('furni_sound_set_32_desc', 'Piano concert set'), + ('furni_chair_plasto*10_name', 'Chair'), + ('nav_venue_bb_lobby_tournament_2_name', 'Competitie Battle Ball 3'), + ('furni_grand_piano*1_desc', 'Turquoise Grand Piano'), + ('buddyremove_windowheader', 'Your friends list is full.'), + ('furni_pillar*0_name', 'Greek Pillar'), + ('gs_title_countdown', 'Game Is About To Begin'), + ('furni_glass_sofa*3_name', 'Glass sofa'), + ('furni_hc_crtn_desc', 'Topnotch privacy protection'), + ('furni_waterbowl*5_desc', 'Aqua unlimited'), + ('furni_table_silo_small*4_desc', 'Beige Area Occasional Table'), + ('furni_jp_tray2_name', 'jp_tray2'), + ('furni_rare_moonrug_desc', 'Desolation rocks!'), + ('furni_val_teddy*3_name', 'Green Share Bear'), + ('furni_sleepingbag*10_desc', 'Ultimate coziness'), + ('furni_bar_polyfon_desc', 'You naughty Habbo!'), + ('furni_sofachair_polyfon*2_desc', 'Black Mode Armchair'), + ('furni_exe_sofa_name', 'Executive 3-Seater Sofa'), + ('furni_divider_silo1*4_desc', 'Beige Area Corner Shelf'), + ('poster_2004_name', 'Rasta Poster'), + ('furni_bench_armas_name', 'Bench'), + ('furni_soft_sofachair_norja_desc', 'Soft iced sofachair'), + ('nav_venue_bb_lobby_beginner_14_name', 'Beginners Battle Ball 15'), + ('gs_button_rejoin', 'Play again!'), + ('furni_marquee*8_name', 'Ultramarine Marquee'), + ('furni_tile_marble_desc', 'Slick sophistication; now 10% off!'), + ('hubu_info_url_1', 'http://www.habbohotel.co.uk/habbo/en/help/12'), + ('console_requests', 'Friend Request(s)'), + ('furni_sleepingbag*4_name', 'Army Sleeping Bag'), + ('furni_plant_yukka_desc', 'Easy to care for'), + ('NUF_getting_room_own_rooms_createroom', 'Empty? That\'s because you don\'t have any rooms yet. If it isn\'t empty then you already have made a room, which makes me wonder...'), + ('furni_glass_sofa*6_desc', 'Translucent beauty'), + ('ph_exit', 'Exit In Normal Clothes'), + ('pet_race_0_024', 'Black-eyed Boxer'), + ('furni_marquee*7_name', 'Purple Marquee'), + ('pet_race_0_023', 'Dotty Dalmatian'), + ('recycler_info_timeout', 'Your recycling was completed, but you did not accept it in time. Please press the cancel button below to have your recyclable items restored to your hand. To recycle these items you will need to begin the process again.'), + ('pet_race_0_022', 'Schnitzel Snatcher'), + ('hubu_info_url_2', 'http://www.talktofrank.com/'), + ('pet_race_0_021', 'Loyal Labrador'), + ('nav_venue_snowwar_lobby/0_desc', 'Snow Storm LobbyCome and be a Snow Stormer!'), + ('pet_race_0_020', 'Patchy Pup'), + ('furni_chair_plasto*8_name', 'Chair'), + ('furni_sofachair_silo*9_desc', 'Red Area Armchair'), + ('nav_venue_bb_lobby_beginner_17/0_desc', ''), + ('furni_hc_dsk_desc', 'For Habbo scholars'), + ('furni_wooden_screen*8_name', 'Night Blue Oriental Screen'), + ('gs_lounge_skill_no_min', 'No minimum'), + ('summer_chair_8_name', 'Yellow Deck Chair'), + ('gs_score_tie', 'The game ended in a tie!'), + ('nav_people', 'Who\'s in here?'), + ('furni_gothic_sofa*2_desc', 'Stylish seating for two'), + ('furni_summer_chair*8_name', 'Yellow Deck Chair'), + ('roomatic_roomname', 'Room name:'), + ('furni_ham_desc', 'Tuck in'), + ('nav_venue_star_lounge_desc', 'Is there a VIP visitor in the hotel?'), + ('furni_bardeskcorner_polyfon*3_name', 'White Corner Desk'), + ('gs_specnum', 'Number of spectators: \\x'), + ('furni_bed_budget*3_name', 'Black Pura Double Bed'), + ('furni_shelves_norja*6_name', 'Blue Bookcase'), + ('partner_registration_link', 'Finish registration'), + ('furni_pillar*1_name', 'Pink Marble Pillar'), + ('reg_olderage', 'I am 11 or older'), + ('furni_glass_stool*4_name', 'Glass stool'), + ('back', 'Back'), + ('furni_tile_yell_desc', 'In a choice of colours'), + ('club_confirm_text3', 'Buy more and pay less: 6 Months (186 days) of Habbo Club cost only 105 Credits. You have %credits% credits in your Purse.\\r\\r After buying the membership, you will immediately be part of the Habbo VIP Community.'), + ('furni_sofa_silo_desc', 'Cushioned, understated comfort'), + ('club_confirm_text1', '1 Habbo Club Month (31 days) costs 25 Credits. You have %credits% Credits in your Purse.\\r\\r After buying the membership, you will immediately be part of the Habbo VIP Community.'), + ('club_confirm_text2', 'Buy more and pay less: 3 Months (93 days) of Habbo Club cost only 60 Credits. You have %credits% credits in your Purse.\\r\\r After buying the membership, you will immediately be part of the Habbo VIP Community.'), + ('furni_carpet_legocourt_name', 'Basketball Court'), + ('furni_present_gen3_name', 'Gift'), + ('furni_sound_set_2_desc', 'Get the party started!'), + ('furni_barchair_silo*6_name', 'Blue Bar Stool'), + ('furni_arabian_bigtb_name', 'Amanjena Table'), + ('interface_icon_catalog', 'Catalogue, furnishing your room'), + ('furni_hologram_desc', 'As if by magic...'), + ('nav_venue_sw_lobby_expert_1/0_desc', ''), + ('furni_carpet_standard*1_name', 'Floor Rug'), + ('nav_owner', 'Owner'), + ('furni_glass_chair*2_desc', 'Translucent beauty'), + ('furni_rcandleset_name', 'Red Candle Plate'), + ('furni_divider_nor1*6_name', 'Blue Ice corner'), + ('nav_private_helptext_hd', 'Rooms'), + ('furni_sound_set_27_name', 'Groove 2'), + ('furni_drinks_name', 'Empty Cans'), + ('pet.saying.eat.cat.0', 'mmm...thumm, thumm'), + ('gs_title_nextround', 'Next game...'), + ('pet.saying.eat.cat.1', 'lap, lap, lap, lap'), + ('furni_scifirocket*9_desc', 'Something fishy is going on...'), + ('pet.saying.eat.cat.2', '*munch, munch*'), + ('pet.saying.sleep.dog.0', 'zzZZZzzz'), + ('furni_noob_lamp*4_name', 'My first Habbo lamp'), + ('nav_venue_sw_lobby_beginner_8_name', 'Snow Rookies Lobby'), + ('nav_venue_library/0_desc', 'Time to catch up on some studying'), + ('camera_dialog_open', 'Shoot'), + ('furni_lamp_armas_desc', 'Ambient lighting is essential'), + ('buddyremove_pleasewait', 'Please wait a second...'), + ('friend_request_options', 'Advanced options.'), + ('transaction_system_web_internal', 'Housekeeping purchase'), + ('furni_rare_dragonlamp*5_name', 'Elf Green Dragon Lamp'), + ('furni_bar_chair_armas_desc', 'The ultimate recycled furniture'), + ('room_ignore', 'Shutup'), + ('poster_518_desc', 'A fiery dragon for your wall'), + ('furni_soft_sofa_norja*7_desc', 'Sit back and relax'), + ('object_displayer_show_tags', 'Show tags'), + ('furni_goth_table_desc', 'The dark side of Habbo'), + ('club_txt_changesubscr', 'Change subscription'), + ('Alert_RememberSetYourPassword', 'Please check your password'), + ('reg_verification_checking', 'Checking...'), + ('furni_silo_studydesk_desc', 'For the true Habbo Scholars'), + ('room_give_rights', 'Give rights'), + ('furni_CF_50_goldbar_name', 'Gold Bar'), + ('furni_rom_lamp_name', 'Crystal Lamp'), + ('furni_sofachair_polyfon*8_desc', 'Yellow Mode Armchair'), + ('furni_deadduck3_name', 'Dead Duck 3'), + ('furni_bed_polyfon_one*4_name', 'Beige Mode Single Bed'), + ('furni_noob_stool*1_desc', 'Unfold me and take the weight off (orange)'), + ('furni_stand_polyfon_z_name', 'Shelf'), + ('furni_prize3_name', 'Bronze Trophy'), + ('club_status_text', 'Here you can see your Habbo Club membership status, number of elapsed months, pre-ordered months and status of the ongoing month.'), + ('furni_table_plasto_bigsquare*9_desc', 'Hip plastic furniture'), + ('furni_wooden_screen*4_desc', 'Add an exotic touch to your room'), + ('furni_sound_set_52_name', 'Christmas Party'), + ('furni_CF_1_coin_bronze_name', 'Bronze Coin'), + ('furni_tile_brown_name', 'Red Tile'), + ('nav_venue_bb_lobby_intermediate_5/0_desc', ''), + ('nav_venue_picnic/0_name', 'Picnic Garden'), + ('furni_sound_set_50_desc', 'The harder generation'), + ('furni_lamp2_armas_name', 'Lodge Candle'), + ('registration_disabled_text', 'You can\'t create new Habbos at the moment. Please try again [some date]..'), + ('catalog_selectproduct', 'Select product:'), + ('transaction_system_sms_telia', 'Telia'), + ('nav_venue_bb_lobby_intermediate_5_name', 'Semi-profs Battle Ball 6'), + ('furni_christmas_sleigh_name', 'Winter Sleigh'), + ('furni_scifirocket*8_desc', 'From a space far, far away!'), + ('furni_bed_budget*9_name', 'Red Pura Double Bed'), + ('poster_2000_desc', 'Suomen kartta'), + ('help_emergency_whathappens', 'A member of community staff will investigate the situation and take appropriate action. This may include sending you a response with advice on dealing with your issue.'), + ('purse_coins', 'Habbo Credits'), + ('furni_marquee*5_desc', 'It\'s both door and a shade!'), + ('club_txt_whatis', 'What is Habbo Club?'), + ('furni_present_gen2_name', 'Gift'), + ('trading', 'Trading'), + ('furni_sofa_silo*9_desc', 'Red Area Sofa'), + ('furni_summer_chair*9_name', 'Red Deck Chair'), + ('furni_shelves_armas_desc', 'For all those fire-side stories'), + ('purse_buy_coins', 'Buy Credits'), + ('room_confirmPlace', 'Are you sure?'), + ('furni_queue_tile1*3_desc', 'The power of movement'), + ('furni_soft_sofachair_norja*8_name', 'Yellow Iced Sofachair'), + ('furni_arabian_snake_desc', 'Beware the snake!'), + ('nav_venue_sw_lobby_tournament_6/0_desc', ''), + ('NUF_about_hotel', 'What\'s Habbo about?'), + ('furni_bardeskcorner_polyfon_desc', 'Tuck it away'), + ('furni_bardeskcorner_polyfon*4_name', 'Beige Mode Bardesk Corner'), + ('poster_13_desc', 'Arty black and white'), + ('nav_venue_bb_lobby_beginner_9/0_desc', ''), + ('nav_modify_nameshow', 'Show your name in the room info'), + ('NUF_mini_use_console_read_next', 'Click \'OK\' to mark message as read.'), + ('poster_1005_desc', 'The muscly movie hero'), + ('wallitem_jp_sheet2_name', 'jp_sheet2'), + ('furni_xmas_cstl_gate_desc', 'Let that icy draft out!'), + ('NUF_groups_url', 'http://d16-1.web.varoke.net/home/group-tutorial'), + ('furni_jp_irori_name', 'Irori'), + ('furni_jp_bamboo_desc', 'Watch out for pandas!'), + ('furni_christmas_reindeer_name', 'Reindeer'), + ('furni_glass_chair*4_name', 'Glass chair'), + ('furni_jp_tray5_desc', 'jp_tray5'), + ('furni_table_plasto_4leg*4_desc', 'Hip plastic furniture'), + ('NUF_getting_items_catalogue_purse', 'Click to open your Purse and find out how to get some Habbo Credits . You can use these to buy stuff!'), + ('furni_hc_tbl_name', 'Nordic Table'), + ('furni_bed_budget_one*6_name', 'Blue Pura Bed'), + ('furni_solarium_norja*7_name', 'Rural Solarium'), + ('console_newmessages', 'New Message(s)'), + ('poster_2_desc', 'Take pride in your veg!'), + ('furni_xmas_cstl_twr_desc', 'All I see from up here is snow!'), + ('hubu_info', 'Welcome to the FRANK Infobus! For the next three months FRANK advisors who know a lot about drugs, their effects and the risks involved, will be stepping aboard the Infobus to offer advice and support to any Habbo that wants to visit the bus. For more information click the link below:'), + ('furni_bardesk_polyfon*6_name', 'Blue Mode Bardesk'), + ('furni_summer_pool*3_name', 'Green Summer Pool'), + ('furni_pura_mdl3*8_name', 'yellow pura module 3'), + ('furni_valentinescreen_name', 'Holiday Romance'), + ('furni_rare_beehive_bulb*1_desc', 'A honey-hued glow'), + ('gs_link_gamerules', 'Game Rules'), + ('nav_venue_bb_lobby_tournament_11/0_desc', ''), + ('sound_machine_song_info', 'Song Info'), + ('wallitem_arabian_swords_name', 'Ancestral Scimitars'), + ('furni_one_way_door*6_desc', 'One way! The HC way!'), + ('furni_table_plasto_round*2_desc', 'Hip plastic furniture'), + ('credit', 'Credit'), + ('gs_lounge_skill_no_max', 'Infinite'), + ('furni_wall_china_desc', 'For your great wall'), + ('NUF_visiting_rooms_roomlist_add to fav', 'After clicking on a room you can click this button here to add it to favourites.'), + ('furni_carpet_polar*3_name', 'Yellow Bear Rug'), + ('poster_46_desc', 'Twinkle, twinkle'), + ('furni_petfood1_desc', 'Fantastic 20% Saving!'), + ('url_nobalance', 'http://%predefined%/credits?'), + ('furni_sofachair_silo*6_name', 'Blue Area Armchair'), + ('furni_noob_chair*1_desc', 'Lightweight, practical and yellow'), + ('nav_venue_bb_lobby_expert_7/0_desc', ''), + ('furni_pura_mdl1*7_name', 'Green Pura Module 1'), + ('furni_table_silo_small*6_name', 'Blue Area Occasional Table'), + ('club_thanks_title', 'Congratulations! You are now a member of Habbo Club.'), + ('furni_legotrophy_name', 'Basketball Trophy'), + ('roomatic_createyrown', 'Create Your Own Room'), + ('console_report_remove', 'Remove'), + ('furni_sound_set_42_desc', 'Bumps and Chills'), + ('furni_divider_nor5*5_desc', 'Cool cornering for your crib y0!'), + ('furni_rare_icecream*2_desc', 'Virtual pistachio rocks!'), + ('furni_pura_mdl4*6_name', 'Blue Pura Module 4'), + ('club_button_close', 'Close Window'), + ('wallitem_md_can_name', 'Bubble Juice Can'), + ('furni_prizetrophy7_desc', 'Palkinto'), + ('nav_venue_cunning_fox_gamehall/2_desc', 'Keep your head down, it\'s bombs away'), + ('poster_28_desc', '10 x Silver Tinsel'), + ('furni_rare_dragonlamp*2_desc', 'Oriental beast of legends'), + ('furni_glass_sofa*2_name', 'Glass sofa'), + ('modtool_hours', 'Hours'), + ('nav_venue_emperors_name', 'Emperor\'s hall'), + ('catalog_buyingSuccesfull', 'Buying Successful!'), + ('console_concurrency_error', 'There was a concurrency error while modifying friend list'), + ('furni_table_silo_med*3_desc', 'Wipe clean and unobtrusive'), + ('furni_sleepingbag*8_desc', 'Ultimate coziness for SnowStorm winners'), + ('poster_508_desc', 'The flag of Spain'), + ('furni_goodie1*2_desc', 'Crunchy Dog Treat'), + ('nav_venue_sw_lobby_free_3/0_desc', ''), + ('furni_chair_basic*7_desc', ''), + ('room_take_rights', 'Remove Rights'), + ('furni_hc_bkshlf_desc', 'For the scholarly ones'), + ('furni_bed_polyfon*2_desc', 'Black Mode Double Bed'), + ('furni_table_plasto_4leg_name', 'Occasional Table'), + ('furni_bed_budget*7_desc', 'King sized comfort!'), + ('win_partner_registration', 'Partner registration'), + ('summer_chair_4_desc', 'Please tan responsably'), + ('furni_table_norja_med_name', 'Coffee Table'), + ('nav_venue_club_massiva/2_desc', 'Make all the right moves'), + ('furni_divider_silo1_desc', 'Neat and natty'), + ('hobba_send_reply', 'Send Alert'), + ('shopping_nocash', 'You don\'t have enough Credits in your Purse.\\r Click \'OK\' to see the different ways of\\rgetting Habbo Credits.'), + ('furni_divider_poly3*9_name', 'Red Hatch'), + ('furni_rare_fountain*1_desc', 'For our feathered friends'), + ('poster_56_desc', 'Serious partying going on!'), + ('furni_scifiport*6_name', 'White Sci-Fi Port'), + ('furni_rclr_garden_desc', 'Self watering'), + ('furni_arabian_tray1_desc', 'Tea for every occasion'), + ('furni_rare_fountain*3_name', 'Bird Bath (blue)'), + ('furni_romantique_pianochair*1_name', 'Rose Quartz Piano Stool'), + ('furni_romantique_divider*1_desc', 'Beauty lies within'), + ('wallitem_post.it.vd_name', 'Heart Stickies'), + ('wallitem_torch_desc', 'The dark side of Habbo'), + ('roomatic_namedisplayed', 'Do you want your name to be displayed with the room?'), + ('furni_grunge_candle_name', 'Candle Box'), + ('furni_sound_set_17_name', 'Groove 3'), + ('furni_prizetrophy3*2_name', 'Globe trophy'), + ('furni_chair_silo_desc', 'Keep it simple'), + ('nav_venue_sw_lobby_beginner_7/0_desc', ''), + ('nav_venue_sw_lobby_beginner_3/0_desc', ''), + ('furni_hc_trll_name', 'Drinks Trolley'), + ('furni_bed_polyfon_one*7_desc', 'Green Mode Single Bed'), + ('furni_chair_plasto*2_name', 'Chair'), + ('furni_pura_mdl1*4_name', 'White Pura Module 1'), + ('furni_gothiccandelabra_desc', 'The dark side of Habbo'), + ('NUH_chat', 'Click here and type to chat to other Habbos.'), + ('furni_plant_valentinerose*2_name', 'White Valentine Rose'), + ('reg_privacypledge', 'Privacy Pledge'), + ('furni_exe_table_desc', 'Take a memo, Featherstone'), + ('hubu_info_link2', 'FRANK Website'), + ('furni_prizetrophy4*3_name', 'Fish trophy'), + ('furni_hc_chr_desc', 'Royal comfort'), + ('hubu_info_link1', 'FRANK Infobus Information'), + ('sound_machine_your_songs', 'Traxmachine Songs'), + ('furni_active_placeholder_name', 'This furniture is downloading...'), + ('furni_divider_silo3*8_name', 'Yellow Area Gate'), + ('NUF_visiting_rooms_categorylist_tutor', 'There are so many Guest Rooms we thought it would be a "hoot" to divide them into categories. Select a category to view its contents.'), + ('furni_sofa_silo*6_name', 'Blue Area Sofa'), + ('club_extend_failed', 'Sorry, we were unable to process the purchase. No Credits were charged!'), + ('furni_soft_sofa_norja*4_name', 'Urban Iced Sofa'), + ('furni_sporttrack3*3_desc', 'null'), + ('furni_sound_set_1_name', 'Habbo Sounds 1'), + ('furni_pura_mdl2*5_name', 'beige pura module 2'), + ('nav_venue_sw_lobby_intermediate_1/0_desc', ''), + ('furni_safe_silo*8_name', 'Yellow Safe Minibar'), + ('trading_agrees', 'agrees'), + ('alert_needpermission', 'You need your parent or guardian\'s permission to spend time in Habbo Hotel.'), + ('nav_modify', 'Modify'), + ('furni_noob_stool*4_desc', 'Unfold me and take the weight off (light blue)'), + ('catalog_length_trophymsg', 'Oops, your inscription is too long, so it won\'t fit on the trophy. \\rPlease type something shorter.'), + ('furni_s_sound_machine*3_desc', 'Sound Machine Green Desc'), + ('club_member', 'Member'), + ('modtool_ban_ip', 'Ban IP Also'), + ('bb_link_gamerules', 'Spelregels'), + ('furni_carpet_armas_name', 'Hand-Woven Rug'), + ('furni_rubberchair*5_desc', 'Soft and tearproof!'), + ('furni_table_plasto_square*1_desc', 'Hip plastic furniture'), + ('furni_divider_nor3*3_desc', 'Do go through...'), + ('nav_venue_habburger\'s/0_desc', 'Get food here!'), + ('reg_linkstitle', 'Full version of the documents:'), + ('roomevent_browser_title', 'Events'), + ('roomatic_security', 'Security'), + ('furni_table_plasto_4leg*7_desc', 'Hip plastic furniture'), + ('furni_table_plasto_round*14_desc', 'Hip plastic furniture'), + ('furni_sound_set_38_desc', 'Rock and Roses!'), + ('furni_rare_parasol*0_desc', 'Block those rays!'), + ('furni_pura_mdl3*6_desc', 'Any way you like it!'), + ('NUF_console', 'Learn about messaging'), + ('poster_45_name', 'Skeleton'), + ('furni_pura_mdl3*9_desc', 'Any way you like it!'), + ('pet_age', 'Age:'), + ('poster_48_name', 'Large gold star'), + ('open', 'Open'), + ('gs_3min', '3min'), + ('wallitem_habw_mirror_name', 'Habbowood Mirror'), + ('furni_carpet_polar*4_desc', 'Snuggle up on a Funky bear rug...'), + ('furni_table_armas_name', 'Dining Table'), + ('sw_gameprice', 'Play now for just 2 tickets!'), + ('furni_divider_nor5*4_name', 'Urban Iced Angle'), + ('navigator', 'Hotel Navigator'), + ('furni_pillow*2_desc', 'Puffy, soft and huge'), + ('purse_vouchers_checking', 'Checking code, please wait...'), + ('furni_noob_rug*4_desc', 'Nice and neat sisal rug with light blue edging'), + ('furni_safe_silo*5_name', 'Pink Safe Minibar'), + ('nav_venue_the_dirty_duck_pub/0_desc', 'The perfect place to chill!'), + ('furni_CFC_10_coin_bronze_desc', 'Worth 10 Credits'), + ('furni_teleport_door_desc', 'Magic doorway to anywhere!'), + ('furni_bardesk_polyfon_name', 'Bar/desk'), + ('login_password', 'Password'), + ('furni_pura_mdl2*8_desc', ''), + ('furni_divider_nor4*4_desc', 'Habbos, roll out!'), + ('furni_rare_fan*7_name', 'Brown Powered Fan'), + ('furni_bed_polyfon_girl_one_desc', 'Snuggle down in princess pink'), + ('club_general_elapsed', 'Elapsed Months'), + ('nav_venue_sw_lobby_free_1_name', 'Free Game Lobby'), + ('furni_gothic_chair*5_name', 'Green Gothic Chair'), + ('furni_sink_name', 'Sink'), + ('furni_bed_budget_one*4_desc', 'Prince sized comfort!'), + ('Alert_ForgotSetPassword', 'Please check your password'), + ('furni_chair_plasto*6_desc', 'Hip plastic furniture'), + ('furni_carpet_standard_desc', 'Available in a variety of colours'), + ('reg_update_text2', 'Only change them when you want to make sure that nobody can know or guess your password.'), + ('furni_arabian_swords_desc', 'Not for yielding'), + ('furni_divider_silo3*5_name', 'Pink Area Gate'), + ('furni_fireplace_polyfon_desc', 'Comfort in stainless steel'), + ('furni_glass_table*3_desc', 'Translucent beauty'), + ('furni_summer_pool*4_desc', 'Fancy a dip?'), + ('poster_500_desc', 'The UK flag'), + ('poster_1004_name', 'Eid Mubarak Poster'), + ('furni_rare_icecream*5_desc', 'Virtual vanilla rocks!'), + ('furni_one_way_door*2_name', 'Black HC Gate'), + ('furni_chair_plasty*3_desc', 'Hip plastic furniture'), + ('club_end_title', 'Your Habbo Club membership has now expired.'), + ('furni_table_polyfon_desc', 'For larger gatherings'), + ('furni_romantique_pianochair*4_desc', 'I can feel air coming through...'), + ('furni_bardesk_polyfon*3_name', 'White Bardesk'), + ('predefined_room_description', '%user_name% has entered the building'), + ('poster_53_desc', 'whack that ball!'), + ('poster_515_name', 'The Swedish flag'), + ('furni_rope_divider_desc', 'Rope Divider'), + ('furni_chair_norja*3_desc', 'Sleek and chic for each cheek'), + ('furni_scifidoor*9_name', 'Blue Spaceship Door'), + ('furni_goodie2_name', 'Chocolate Mouse'), + ('game_poker_logoff', 'Left the game'), + ('furni_bed_polyfon_desc', 'Give yourself space to stretch out'), + ('furni_table_plasto_round*5_desc', 'Hip plastic furniture'), + ('furni_couch_norja*3_desc', 'Two can perch comfortably'), + ('pet.saying.sleep.cat.2', 'Purrr... rrrr'), + ('pet.saying.sleep.cat.1', 'mrrrr..rrrr..'), + ('pet.saying.sleep.cat.0', 'hrrrrr....Mrrrrr'), + ('login_ok', 'OK'), + ('gs_button_expand', 'Expand Window'), + ('pet.saying.sleep.cat.4', 'mrrrr...muew..mrr'), + ('tutorial_next', 'Next:'), + ('pet.saying.sleep.cat.3', 'hurrr..hurrr'), + ('furni_jp_tatami_desc', 'Shoes off please'), + ('hobba_sent_to_moderators', 'Call re-assigned non-emergency, still visible to moderators'), + ('roomatic_choosecategory', ''), + ('wallitem_guitar_v_desc', 'tilulilulii'), + ('NUF_groups', 'Groups'), + ('bb_link_gameRules_url', 'http://%predefined%/groups/56552/id'), + ('nav_venue_theatredrome_halloween_name', 'Theatredrome Habboween'), + ('bb_buyTicketsButton', 'Buy tickets'), + ('furni_gothgate_desc', 'The dark side of Habbo'), + ('game_poker_waiting', 'Change done.\\rWaiting for the other players'), + ('furni_glass_stool*7_desc', 'Habbo Club'), + ('club_end_text', 'BUT, don\'t worry, you can still buy another month of Habbo Club and keep all your Habbo Club benefits,special Furni gifts and the shiny badge!'), + ('furni_sound_set_18_desc', 'Listen while you tan'), + ('furni_sound_set_35_desc', 'Groovelicious'), + ('furni_prizetrophy2*2_desc', 'Shiny silver'), + ('furni_plant_valentinerose*3_desc', 'Relight your passions'), + ('furni_romantique_divan*5_name', 'Onyx Chaise-Longue'), + ('furni_chair_norja*6_desc', 'Sleek and chic for each cheek'), + ('wallitem_hrella_poster_2_desc', 'For those scary Lido moments'), + ('furni_s_sound_machine*6_desc', 'Sound Machine Purple'), + ('game_bs_miss', 'Miss:'), + ('furni_carpet_standard*4_desc', 'Available in a variety of colours'), + ('furni_pura_mdl1*1_name', 'Aqua Pura Module 1'), + ('furni_rare_icecream*8_desc', 'Virtual peppermint rocks!'), + ('furni_petfood4_desc', 'Fantastic 20% Saving!'), + ('furni_table_silo_small*3_name', 'White Occasional Table'), + ('furni_table_plasto_round*8_desc', 'Hip plastic furniture'), + ('furni_chair_polyfon_desc', 'Metallic seating experience'), + ('furni_exe_drinks_desc', 'Give a warm welcome'), + ('nav_createroom', 'Create Own Room'), + ('furni_table_plasto_bigsquare*14_desc', 'Hip plastic furniture'), + ('poster_1001_name', 'Prince Charles Poster'), + ('furni_CF_20_moneybag_name', 'Sack of Credits'), + ('furni_prizetrophy5*1_name', 'Duo trophy'), + ('alert_reg_email', 'Email'), + ('pet_thirsty', 'Thirst:'), + ('nav_error_passwordtooshort', 'The password is too short.'), + ('nav_venue_sw_lobby_free_7_name', 'Free Game Lobby'), + ('furni_plant_valentinerose*5_name', 'Purple Valentine Rose'), + ('recycler_status_info', 'You have Furniture in recycling. The icon will blink when recycling is complete.'), + ('poster_52_name', 'Hockey Stick'), + ('win_doorbell', 'Doorbell'), + ('Unreadmessages', 'New Message(s)'), + ('furni_queue_tile1*9_desc', 'The power of movement'), + ('furni_rare_snowrug_name', 'Snow Rug'), + ('console_approve_selected', 'Accept selected'), + ('pet_race_0_009', 'Hound of Hull'), + ('poster_35_name', 'The Habbo Babes 1'), + ('pet_race_0_008', 'Springy Spaniel'), + ('furni_sofa_polyfon*3_desc', 'Comfort for stylish couples'), + ('furni_basket_name', 'Basket Of Eggs'), + ('pet_race_0_007', 'Slobber Don'), + ('pet_race_0_006', 'Stripy Setter'), + ('pet_race_0_005', 'Paws Forethought'), + ('pet_race_0_004', 'Droopy of Pawford'), + ('furni_barchair_silo_desc', 'Practical and convenient'), + ('furni_noob_lamp*2_desc', 'Get the light right where you want it (dark blue)'), + ('pet_race_0_003', 'Rescue Bernard'), + ('furni_glass_stool_name', 'Glass stool'), + ('pet_race_0_002', 'Joe Cocker Spaniel'), + ('pet_race_0_001', 'Habbo Husky'), + ('pet_race_0_000', 'Yappy Yorkie'), + ('NUF_mini_endtopic_step1_questionmark', 'Click to see our help menu and find our FAQs!'), + ('furni_sound_set_28_desc', 'Head for the pit!'), + ('nav_private_norooms', 'You dont have any rooms - create one?'), + ('furni_table_plasto_square*4_desc', 'Hip plastic furniture'), + ('furni_val_teddy*6_name', 'Blue Share Bear'), + ('furni_noob_table*3_desc', 'Lightweight, practical and aubergine'), + ('gs_state_finished', 'This Game is already over!'), + ('furni_rare_fan*8_desc', 'Stylish, Eco-Energy!'), + ('reg_parentemail_link_url1', 'http://%predefined%//help/parents_guide.html'), + ('furni_gothic_carpet2_desc', 'What lies beneath?'), + ('furni_rare_fan*5_desc', 'It\'ll blow you away!'), + ('modtool_kickuser', 'Kick User'), + ('furni_divider_silo1*7_desc', 'Green Area Corner Shelf'), + ('reg_parentemail_link_url2', 'http://%predefined%//footer_pages/privacy_policy.html'), + ('pet_race_0_019', 'Tiny Terrier'), + ('pet_race_0_018', 'Bushy Woofer'), + ('pet_race_0_017', 'Speckled Sheepdog'), + ('furni_rubberchair*8_desc', 'Soft and tearproof for HC!'), + ('pet_race_0_016', 'Murmurin\' Minimastiff'), + ('poster_42_name', 'Spiderweb'), + ('pet_race_0_015', 'Pixie Poodle'), + ('furni_safe_silo*2_name', 'Black Safe Minibar'), + ('pet_race_0_014', 'Whiffy Woofy'), + ('pet_race_0_013', 'Mangy Mutt'), + ('nav_publicRooms', 'Public Spaces'), + ('pet_race_0_012', 'Tawny Bleugh'), + ('pet_race_0_011', 'Lappy Lassie'), + ('pet_race_0_010', 'Furry McScottie'), + ('game_bs_toast', 'Toast!'), + ('furni_prizetrophy6_name', 'Pokaali'), + ('furni_pudding_desc', 'Will you get the lucky sixpence?'), + ('furni_tile_red_desc', 'In a choice of colours'), + ('nav_venue_sw_arena_expert_name', 'Playing expert game'), + ('pet.saying.sleep.croco.0', 'Zzzz... zzzzz...'), + ('poster_50_desc', 'flap, flap, screech, screech...'), + ('furni_shelves_norja*9_name', 'Red Bookcase'), + ('furni_sound_set_4_name', 'Ambient 1'), + ('furni_exe_s_table_desc', 'Get a clear reflection!'), + ('furni_present_gen6_desc', 'What\'s inside?'), + ('furni_one_way_door*5_name', 'Pink One Way Gate'), + ('nav_search_hd', 'Search rooms by Habbo name or room name.'), + ('poster_20_desc', 'high security for your room'), + ('buddyremove_messenger_updating', 'The console is updating, try again in a minute... Everything else is working fine!'), + ('pet.saying.sleep.croco.3', ':)'), + ('furni_house2_desc', 'Good enough to eat'), + ('pet.saying.sleep.croco.4', '*Snuh snuh*'), + ('tutorial_offtopic', 'Oops! You got off the topic. Please restart or select a new topic.'), + ('pet.saying.sleep.croco.1', 'Yrgh... Yrgh...'), + ('jukebox_now_playing', 'Now playing:'), + ('pet.saying.sleep.croco.2', 'Frgh... Frgh...'), + ('furni_sound_set_25_desc', 'Actually, it\'s Partay!'), + ('club_intro_header', 'Welcome to Habbo Club, the members-only club that all VIP Habbos belong to!'), + ('nav_venue_sw_lobby_amateur_3/0_desc', 'Astetta rankempaa lumisotaa.'), + ('pet.saying.sleep.croco.5', 'Rawwwwwwwwrrrm...'), + ('pet.saying.sleep.croco.6', 'Mmmm... Hooks...'), + ('furni_table_plasto_bigsquare*1_desc', 'Hip plastic furniture'), + ('nav_venue_sw_lobby_free_4_name', 'Free Game Lobby'), + ('alert_warning', 'Moderator says:'), + ('furni_barrier*3_name', 'Red Road Barrier'), + ('nav_venue_floatinggarden_name', 'Floating Garden'), + ('gs_error_nocredits', 'You need Habbo Credits to play a Game!'), + ('furni_chair_plasto*5_name', 'Chair'), + ('furni_tree2_desc', 'Old Christmas Tree'), + ('furni_bed_budget_one*7_desc', 'Prince sized comfort!'), + ('furni_romantique_clock_name', 'romantique_clock'), + ('room_banner_text', ''), + ('furni_sleepingbag*2_desc', 'Ultimate coziness'), + ('furni_divider_nor4*3_name', 'White Iced Auto Shutter'), + ('jukebox_song_remaining', 'Remaining time: %time%'), + ('reg_note_text', 'Never change your password or email\\rif someone else asks you to - they will\\rsteal your furni and Credits!'), + ('habbo_hand_next', '>>>'), + ('nav_venue_orient/0_desc', 'Tres chic with an Eastern twist. For Habbo Club members only.'), + ('furni_easterduck_name', 'Wannabe bunny'), + ('login_forgottenPassword', 'Forgotten your password?'), + ('furni_prizetrophy*1_desc', 'Glittery gold'), + ('hubu_t2_2', ''), + ('hubu_t2_3', 'Vapaa-ajan linkkejä'), + ('decision_cancel', 'Cancel'), + ('nav_venue_bb_lobby_tournament_2/0_desc', ''), + ('furni_samovar_desc', 'Click for a refreshing cuppa'), + ('furni_rcandle_name', 'Red Candle'), + ('furni_waterbowl*4_name', 'Blue Water Bowl'), + ('furni_table_norja_med*7_name', 'Rural Iced Coffee Table'), + ('NUF_playing_games_room_tutor', 'See some people wandering around? They are psyching themselves up for a game. Game Tickets are usually 2 Habbo Credits, but in this room the games are free.'), + ('furni_doormat_love_name', 'Doormat'), + ('bb_link_tournament_highScores_url', 'http://%predefined%//groups/56552/id'), + ('furni_sofachair_polyfon*4_name', 'Beige Mode Armchair'), + ('error_room_full', 'Huone on täynnä.'), + ('furni_chair_silo*4_desc', 'Beige Silo Dining Chair'), + ('furni_divider_nor2*7_name', 'Rural Iced Bar'), + ('hubu_t2_1', ''), + ('furni_divider_nor1*9_name', 'Red Ice corner'), + ('furni_wooden_screen*0_name', 'White Oriental Screen'), + ('furni_chair_basic*1_desc', ''), + ('gs_choose_gamename', 'Enter A Name For Your Game:'), + ('poll_question_number', 'Question %number%/%count%'), + ('furni_hc_rllr_desc', 'Highest class transportation'), + ('furni_table_plasto_4leg*15_desc', 'Hip plastic furniture'), + ('furni_scifiport*9_name', 'Violet Sci-Fi Port'), + ('furni_jukebox*1_desc', 'For your Happy Days!'), + ('furni_red_tv_desc', 'Don?t miss those soaps'), + ('furni_song_disk_name', 'Traxdisc'), + ('reg_agree_alert', 'You have to agree to the terms of service\\r(tick the box).'), + ('furni_summer_chair*1_desc', 'Got your swimming trunks?'), + ('poster_2008_name', 'Habbo Leap Day Poster'), + ('poster_505_desc', 'The Canadian flag'), + ('group_homepage', 'Groups\' Homepage >>>'), + ('furni_table_silo_med*6_desc', 'Blue Area Coffee Table'), + ('nav_venue_tearoom/0_name', 'Chinese Tea Room'), + ('dimmer_use_bg_only', 'Background only'), + ('furni_divider_poly3*4_name', 'Beige Mode Bardesk Gate'), + ('nav_venue_hotel_kitchen/0_desc', 'Beware the flying knives!'), + ('furni_divider_silo1*8_desc', 'Neat and natty'), + ('furni_hc_btlr_name', 'Electric Butler'), + ('furni_wooden_screen*5_name', 'Gray Oriental Screen'), + ('furni_scifiport*8_name', 'Purple Sci-Fi Port'), + ('furni_carpet_standard*5_name', 'Floor Rug'), + ('trading_offers', 'offers:'), + ('furni_prizetrophy2*3_name', 'Duck trophy'), + ('transaction_system_club_habbo', 'Habbo Club payment'), + ('nav_venue_bb_lobby_tournament_9/0_desc', ''), + ('poster_517_name', 'The Scottish flag'), + ('furni_wood_tv_desc', 'For family viewing'), + ('furni_deadduck2_desc', 'Someone forgot to feed me...'), + ('furni_sound_set_20_desc', 'Musical heaven'), + ('sound_machine_new', 'Create a New Song'), + ('nav_venue_the_chromide_club/0_desc', 'Ghetto Fabulous'), + ('nav_modify_doorstatus_pwagain', 'pw again:'), + ('furni_chair_plasto*10_desc', 'Hip plastic furniture'), + ('gs_idlewarning', 'You will be replaced if you don\'t start or join a Game soon!'), + ('purse_vouchers_entercode', 'Enter code here:'), + ('sound_machine_song_name', 'Untitled Trax'), + ('furni_sofa_polyfon*4_name', 'Beige Mode Sofa'), + ('furni_carpet_standard*a_name', 'Floor Rug'), + ('poster_510_name', 'The Italian flag'), + ('furni_table_plasto_square*7_name', 'Square Dining Table'), + ('furni_noob_chair*6_desc', 'Lightweight, practical with dark yellow stripes'), + ('forgottenpw_whatyou', 'What\'s your Habbo called?'), + ('nav_venue_bb_lobby_amateur_1_name', 'Gevorderden Battle Ball 2'), + ('furni_noob_table*6_name', 'My first Habbo table'), + ('furni_pillar*0_desc', 'Classy architect, for holding up ceilings!'), + ('poster_1002_desc', 'aw, bless...'), + ('furni_divider_arm1_desc', 'Good solid wood'), + ('furni_glass_stool*8_name', 'Glass stool'), + ('furni_rare_moonrug_name', 'Moon Patch'), + ('nav_venue_rooftop_rumble/0_desc', 'Are you ready?'), + ('transaction_system_sms_sonera', 'Sonera'), + ('furni_waterbowl*5_name', 'Brown Water Bowl'), + ('furni_sound_set_32_name', 'Instrumental 2'), + ('furni_table_silo_small*4_name', 'Beige Area Occasional Table'), + ('furni_prizetrophy8*1_name', 'Duo trophy'), + ('tutorial_menu', 'Get help with...'), + ('gs_2teams', '2 Teams Game'), + ('furni_sound_machine*4_desc', 'For Funky, Funky Fridays!'), + ('furni_romantique_divan*4_desc', 'Is that a cape hanging there?'), + ('furni_couch_norja*8_desc', 'Two can perch comfortably'), + ('console_usersnotfound', 'Habbo Not Found'), + ('nav_venue_bb_lobby_amateur_2/0_desc', ''), + ('furni_sleepingbag*4_desc', 'Ultimate coziness'), + ('furni_bed_budget_one*6_desc', 'Prince sized comfort!'), + ('furni_sw_chest_desc', ''), + ('nav_venue_bb_lobby_amateur_5/0_desc', ''), + ('NUF_visiting_rooms_room_tutor', 'This is a Guest Room. You can either quit the tutorial and start meeting people, or select the next topic.'), + ('furni_jp_pillow_name', 'Pillow Chair'), + ('url_logged_out', 'http://%predefined%/account/disconnected?reason=logout&origin=popup'), + ('furni_romantique_smalltabl*1_name', 'Rose Quartz Tray Table'), + ('friend_request_declined', 'Declined!'), + ('furni_grunge_shelf_desc', 'Scrap books and photo albums'), + ('furni_gothic_stool*6_name', 'Gothic Stool Blue'), + ('wallitem_gothicfountain_desc', 'Not suitable for drinking!'), + ('furni_scifiport*1_name', 'Gold Laser Gate'), + ('furni_sound_set_41_name', 'Rock 8'), + ('furni_toilet_yell_name', 'Loo Seat'), + ('console_fr_limit_exceeded_error', 'Too many friends selected. Please remove some first.'), + ('console_asktobecomeafriend', 'Ask To Become A Friend'), + ('console_friends', 'Friends'), + ('furni_table_plasto_bigsquare*4_desc', 'Hip plastic furniture'), + ('poster_2005_desc', 'The Special Infobus Poster'), + ('furni_summer_chair*8_desc', 'Got your sun cream?'), + ('furni_s_sound_machine*2_name', 'Sound Machine Ocean'), + ('nav_ringbell', 'The door is locked. Ringing the bell, and waiting...'), + ('console_profilematch', 'Habbo Profile match -'), + ('poster_14_name', 'Fox Poster'), + ('furni_bardeskcorner_polyfon*3_desc', 'Tuck it away'), + ('furni_carpet_soft*2_name', 'Soft Wool Rug'), + ('furni_ham_name', 'Joint of Ham'), + ('nav_venue_star_lounge_name', 'Star Lounge'), + ('nav_venue_bb_lobby_beginner_desc', 'Beginner battle ball'), + ('furni_doormat_plain*3_desc', 'Available in a variety of colours'), + ('furni_habbowood_chair_desc', 'Exclusively for Directors'), + ('nav_venue_bb_lobby_beginner_3/0_desc', ''), + ('furni_CF_20_moneybag_desc', 'Worth 20 Credits'), + ('furni_edice_desc', 'What\'s your lucky number?'), + ('furni_scifirocket*9_name', 'Neptune Smoke Machine'), + ('furni_bardesk_polyfon*9_name', 'Red Bardesk'), + ('furni_glass_table*8_desc', 'Translucent beauty'), + ('NUF_mini_endtopic', 'Find out more'), + ('pending_cfh_title', 'Your old message'), + ('nav_venue_sw_arena_tournament_name', 'Playing a tournament game!'), + ('furni_arabian_bigtb_desc', 'It must be Jinn-er time!'), + ('nav_venue_bb_lobby_beginner_0/0_desc', ''), + ('furni_pillow*3_name', 'Turquoise Satin Pillow'), + ('interface_icon_help', 'Help, need help?'), + ('nav_roomnfo_hd_src', 'Search Rooms'), + ('pet.saying.generic.dog.0', 'woof..woof'), + ('furni_chair_norja*9_name', 'Red Chair'), + ('NUF_getting_room_roommatic_start_tutor', 'This is the Room-O-Matic! Green! You use this to make your room.'), + ('furni_sound_set_2_name', 'Habbo Sounds 3'), + ('nav_venue_netcafe_name', 'My Habbo Home Netcafe'), + ('purse_voucherbutton', 'Vouchers'), + ('console_console', 'Console'), + ('game_poker_changed', 'changed'), + ('transaction_system_splashplastic', 'SplashPlastic'), + ('nav_venue_sw_lobby_free_7/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('furni_sporttrack3*1_desc', 'null'), + ('buddyremove_prev', '< Previous'), + ('roomatic_chooselayout', 'Choose the layout of your room'), + ('wallitem_item_placeholder_desc', 'This furniture is downloading...'), + ('purse_note', 'NOTE : The transactions are updated at 6 am every day.'), + ('poster_34_desc', 'Habbo-punk for the never-agreeing'), + ('furni_sound_set_27_desc', 'Jingle Bells will never be the same...'), + ('game_chess_start', 'Start Over'), + ('summer_chair_7_desc', 'A green deck chair'), + ('nav_venue_bb_lobby_beginner_6_name', 'Beginners Battle Ball 7'), + ('purse_link', 'Click here to see how to get Credits.'), + ('poster_59_desc', 'Torch - it gives you some light'), + ('room_info_rate_req', 'Rate this room'), + ('furni_rare_dragonlamp*5_desc', 'Roast your chestnuts here!'), + ('furni_divider_silo3*9_desc', 'Red Area Gate'), + ('more_roomlayouts', 'Extra room layouts for Habbo Club members >>'), + ('furni_grunge_chair_desc', 'Alternative chair for alternative people'), + ('furni_bed_budget*9_desc', 'King sized comfort!'), + ('furni_christmas_sleigh_desc', 'Ready for your Xmas cheer'), + ('furni_table_plasto_4leg*8_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_tournament_5_name', 'Competitie Battle Ball 6'), + ('furni_table_norja_med*4_name', 'Urban Iced Coffee Table'), + ('instant_friend_request_header', 'Friend Request'), + ('furni_marquee*3_name', 'Aqua Marquee'), + ('furni_noob_stool*1_name', 'My first Habbo stool'), + ('furni_rare_mnstr_desc', 'Don\'t get too close...'), + ('furni_safe_silo_pb_desc', 'Totally shatter-proof!'), + ('NUF_meeting_people_user_chatfield', 'Start typing here and press \'Enter\' to chat with others.'), + ('furni_prizetrophy6*2_desc', 'Shiny silver'), + ('furni_table_plasto_bigsquare*9_name', 'Square Dining Table'), + ('club_habbo.window.title', 'Habbo Club'), + ('recycler_info_ready', 'Recycling is complete. You have made a great environmentally friendly decision. All the recycled items you receive have been made from old items which helps to save natural resources and reduce pollution.'), + ('furni_shelves_norja*5_desc', 'For nic naks and art deco books'), + ('furni_table_silo_med_name', 'Coffee Table'), + ('furni_grunge_sign_desc', 'Bought legitimately from an M1 cafe.'), + ('roomevent_type_9', 'Group Events'), + ('roomevent_type_7', 'Dating'), + ('pet.saying.generic.dog.1', 'woof woof woof!!!'), + ('roomevent_type_8', 'Jobs'), + ('pet.saying.generic.dog.2', 'wooooof!'), + ('roomevent_type_5', 'Debates & Discussion'), + ('pet.saying.generic.dog.3', 'hooooowl'), + ('roomevent_type_6', 'Grand Openings'), + ('furni_solarium_norja*2_name', 'Beige Solarium'), + ('nav_venue_bb_lobby_intermediate_3_name', 'Semi-profs Battle Ball 4'), + ('console_searchfor', 'Search:'), + ('wallitem_arabian_wndw_desc', 'Arabian days and nights'), + ('furni_queue_tile1*3_name', 'Ice Habbo Roller'), + ('furni_lamp2_armas_desc', 'Wax lyrical with some old-world charm'), + ('furni_jp_tray3_desc', 'jp_tray3'), + ('wallitem_guitar_skull_name', 'skull guitar'), + ('roomevent_type_3', 'Games'), + ('furni_romantique_divider*2_desc', 'Keeping things separated'), + ('roomatic_owner', 'Owner:'), + ('url_helpterms', 'http://%predefined%//help/68'), + ('roomevent_type_4', 'Welcoming Party Events'), + ('furni_glass_chair*6_desc', 'Translucent beauty'), + ('furni_pillar*5_name', 'Pagan Pillar'), + ('roomevent_type_1', 'Parties & Music'), + ('roomevent_type_2', 'Trading'), + ('furni_present_gen2_desc', 'What\'s inside?'), + ('ph_tickets_title', 'Tickets'), + ('furni_table_norja_med*8_desc', 'For larger gatherings'), + ('furni_sound_set_54_desc', 'Tune into Christmas'), + ('poster_61_desc', 'The Auspicious One'), + ('furni_divider_silo3_name', 'Gate (lockable)'), + ('furni_scifirocket*4_desc', 'Welcome... to planet love'), + ('furni_plant_valentinerose*1_name', 'Red Valentine\'s Rose'), + ('furni_exe_chair2_name', 'Executive Boss Chair'), + ('alert_donate_ok', 'Give away my furni'), + ('furni_bardesk_polyfon*4_desc', 'Beige Mode Bardesk'), + ('furni_pura_mdl1*5_desc', ''), + ('hubu_close', 'Sulje kioski'), + ('gs_deathmatch', 'Every Habbo for himself!'), + ('summer_chair_9_desc', 'Sunbathing, why not?'), + ('furni_barchair_silo*8_name', 'Yellow Bar Stool'), + ('console_differentmessagemodes', 'Different Messages'), + ('furni_chair_silo*5_name', 'Pink Silo Dining Chair'), + ('callhelp_explanation', 'Thanks for reporting the problem'), + ('furni_chair_plasty*1_desc', 'Hip plastic furniture'), + ('furni_bed_budget*2_desc', 'Queen sized comfort!'), + ('furni_summer_grill*2_desc', 'Plenty of shrimp on that barbie'), + ('furni_heart_desc', 'Full of love'), + ('reg_donetext', 'Soon you\'ll see the Hotel Navigator, it shows you all the rooms you can go to -the guest rooms, clubs, caf�s, swimming pools and more!'), + ('poster_523_desc', 'The flag of India'), + ('furni_one_way_door*1_name', 'Aqua One Way Gate'), + ('furni_bardeskcorner_polyfon*13_desc', 'Tuck it away'), + ('nav_venue_sw_lobby_amateur_5/0_desc', 'Astetta rankempaa lumisotaa.'), + ('furni_gothic_chair*4_desc', 'Vampires and Wizards'), + ('furni_bardesk_polyfon*6_desc', 'Blue Mode Bardesk'), + ('transaction_system_sms_sra', 'Sonera'), + ('dimmer_turn_off', 'Turn OFF'), + ('furni_fireplace_armas_desc', 'Authentic, real flame fire'), + ('furni_chair_plasty*6_name', 'Plastic Pod Chair'), + ('furni_scifidoor*6_name', 'Black Monolith'), + ('furni_summer_pool*3_desc', 'Fancy a dip?'), + ('furni_christmas_reindeer_desc', 'Prancer becomes Rudolph in a click!'), + ('furni_chair_norja_name', 'Chair'), + ('furni_barchair_silo*3_name', 'White Bar Stool'), + ('nav_venue_bb_lobby_tournament_desc', 'Play battle ball tournament!'), + ('transaction_system_bank_sampo', 'Sampo'), + ('furni_sound_set_39_name', 'Rock 7'), + ('furni_pura_mdl3*8_desc', ''), + ('console_follow_prevented', 'Your friend has prevented others from following him/her.'), + ('poster_46_name', 'Small gold star'), + ('furni_sofa_polyfon_girl_name', 'Two-seater Sofa'), + ('furni_carpet_polar*3_desc', 'Snuggle up on a Funky bear rug...'), + ('modtool_rankerror', 'You do not have the rights for this action on this user!'), + ('furni_divider_nor3*4_name', 'Urban Iced Gate'), + ('nav_venue_theatredrome_valentine/0_desc', 'Hug A Friend, Its Valentines! Home Of Ralph (Wannabe Panda In Training)'), + ('furni_one_way_door*6_name', 'Blue HC Gate'), + ('poster_7_desc', 'For emergencies only'), + ('wallitem_hc_wall_lamp_name', 'Retro Wall Lamp'), + ('poster_508_name', 'The Spanish flag'), + ('help_emergency_example', 'Example: A Habbo wants to see me on webcam.'), + ('nav_venue_bb_lobby_expert_1/0_desc', ''), + ('furni_pura_mdl1*7_desc', 'Any way you like it!'), + ('wallitem_post.it_desc', 'Pad of stickies'), + ('nav_modify_doorstatus_passwordprotected', 'Let other people move and leave furniture in the room.'), + ('queue_set.queue_full.alert', 'The queue for this room is full. Please try again later.'), + ('nav_venue_bb_lobby_beginner_8_name', 'Beginners Battle Ball 9'), + ('nav_venue_sw_arena_amateur_name(0)', 'Playing amateur game'), + ('url_figure_editor', 'http://%predefined%//profile/profile.action'), + ('furni_noob_lamp*6_desc', 'Get the light right where you want it (canary yellow)'), + ('furni_divider_nor5*5_name', 'Pink Iced Angle'), + ('nav_venue_sw_lobby_free_desc', 'Come and play. It\'s free!'), + ('furni_table_silo_small*6_desc', 'Blue Area Occasional Table'), + ('NUF_getting_items_navigator_tutor', 'You need to be in a Habbo\'s room to access the Catalogue.'), + ('furni_safe_silo*6_desc', 'Totally shatter-proof!'), + ('furni_glass_sofa*7_name', 'Green Glass Sofa'), + ('wallitem_md_can_desc', 'Enough bubbling juice for one evening'), + ('furni_rare_fan*9_desc', 'It\'ll blow you away!'), + ('furni_prizetrophy7_name', 'Pokaali'), + ('furni_noob_stool*3_name', 'My first Habbo stool'), + ('furni_glass_sofa*2_desc', 'Translucent beauty'), + ('pet_frnd_10', 'Adoring'), + ('furni_turkey_desc', 'Where\'s the cranberry sauce?'), + ('pet_frnd_11', 'Devoted'), + ('Alert_ConnectionNotReady', 'Could not connect to the server'), + ('console_search_habbo_profilematch', 'Habbo Profile match -'), + ('furni_sound_set_59_desc', 'Urban break beats'), + ('poster_21_name', 'Butterfly Cabinet'), + ('credits', 'Credits'), + ('furni_sound_set_14_name', 'Hip Hop Beats 2'), + ('NUH_hand', 'Click here to open your inventory (aka the Big Hand). Drag and drop furniture to and from here to move it.'), + ('furni_pura_mdl3*1_desc', 'Any way you like it!'), + ('nav_modify_doorstatus_pwprotected', 'Password protected:'), + ('shopping_costs', 'XX costs XX Credit(s).\\rJust click \'buy\' once, it\'ll appear shortly.'), + ('NUF_mini_meet_people', 'Meet some people'), + ('furni_divider_nor1*3_name', 'White Iced Corner'), + ('furni_bed_budget*7_name', 'Green Pura Double Bed'), + ('furni_pura_mdl5*9_desc', 'Any way you like it!'), + ('nav_venue_club_massiva/2_name', 'Dancefloor'), + ('furni_scifiport*3_desc', 'Energy beams. No trespassers!'), + ('whisper', 'Whisper'), + ('furni_chair_plasto*4_name', 'Chair'), + ('furni_hc_bkshlf_name', 'Medieval Bookcase'), + ('furni_goodie1*2_name', 'Marzipan Man'), + ('furni_rare_fountain*1_name', 'Bird Bath (grey)'), + ('bb_text_hostInfo', 'Please choose a name for your Game and select the number of Teams.'), + ('hubu_t3_1', ''), + ('hubu_t3_2', 'Hubun kiertuekalenteri 2002'), + ('furni_sound_set_34_name', 'Rock 5'), + ('furni_rare_fountain*3_desc', 'For our feathered friends'), + ('nav_venue_sw_lobby_amateur_5_name', 'Snow Slingers Lobby'), + ('furni_pura_mdl3*2_name', 'Pink Pura Module 3'), + ('furni_xmas_cstl_wall_desc', 'Solid blocks of ice and snow'), + ('furni_arabian_tray1_name', 'Mint Tea Tray'), + ('furni_jp_tray4_name', 'jp_tray4'), + ('furni_grunge_candle_desc', 'Late night debate'), + ('furni_rclr_garden_name', 'Water Garden'), + ('furni_CFC_100_coin_gold_name', 'Gold Coin (China)'), + ('nav_venue_gate_park_name', 'Imperial Park'), + ('shopping_asagift', 'Buy As A Gift'), + ('furni_soft_sofachair_norja*7_desc', 'Sit back and relax'), + ('dance', 'Dance'), + ('roomatic_wrongpw', 'Oops! Sorry, your passwords don\'t match. Please enter them again.'), + ('furni_hc_trll_desc', 'For swanky dinners only'), + ('furni_prizetrophy3*2_desc', 'Shiny silver'), + ('modtool_roomkick', 'Room Kick'), + ('roomatic_letmove', 'Let other people move your furniture and place their own. (Furniture cannot be stolen.)'), + ('roomevent_default_description', ''), + ('nav_venue_sw_lobby_free_4/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('console_invalid_message', 'There was a message from a user that was probably removed your friend list. Note, user is removed from your friend list if you report a message to moderators.'), + ('poster_503_name', 'The Swiss flag'), + ('nav_venue_sw_arena_expert_name(0)', 'Playing expert game'), + ('poster_41_desc', 'For the best music-makers'), + ('furni_tile_name', 'Floor Tiles'), + ('furni_val_randomizer_name', 'Love Randomiser'), + ('nav_modify_doorstatus_open', 'Open'), + ('furni_plant_big_cactus_desc', 'Habbo Dreams monster in hiding! Shhhh'), + ('furni_safe_silo*8_desc', 'Totally shatter-proof!'), + ('wallitem_sw_hole_name', 'sw_hole'), + ('play_preview', 'Play preview of sounds'), + ('furni_table_plasto_round*14_name', 'Occasional Table'), + ('poll_thanks_window', 'Thanks!'), + ('wallitem_habbowheel_desc', 'So you gotta ask yourself "Do I feel lucky?"'), + ('furni_carpet_standard_name', 'Floor rug'), + ('furni_divider_nor1*8_name', 'Yellow Ice corner'), + ('nav_venue_bb_lobby_tournament_3/0_desc', ''), + ('buddyremove_ok_text', 'You have chosen enough friends to remove.'), + ('nav_venue_sw_lobby_intermediate_5/0_desc', 'Lumisota sen kuin vain kovenee.'), + ('furni_divider_nor4*7_desc', 'Habbos, roll out!'), + ('furni_summer_chair*3_desc', 'Black'), + ('furni_table_plasto_bigsquare*6_desc', 'Hip plastic furniture'), + ('gs_link_highscores', 'High Scores'), + ('Alert_purchasingerror', 'Buying unsuccessful'), + ('poster_5_desc', 'Quacking good design!'), + ('help_emergency_sent', 'A member of community staff will investigate the situation and take appropriate action. This may include sending you a response with advice on dealing with your issue.'), + ('room_user_page', 'Home Page'), + ('room_badge_window_title', 'Badge'), + ('login_name', 'Name of your Habbo'), + ('furni_divider_nor2*5_name', 'Pink Iced bar desk'), + ('nav_venue_habbo_lido_ii/0_desc', 'Dive right in!'), + ('furni_sporttrack2*2_name', 'Sport corner asphalt'), + ('roommatic_modify_size', 'Room size: %tileCount% tiles'), + ('pet.saying.sniff.croco.2', '*Sighs*'), + ('furni_prize2_name', 'Silver Trophy'), + ('Now you can find out how to get more cool Furniture for your room, or select another topic.', ''), + ('pet.saying.sniff.croco.0', 'Ewwwww....'), + ('pet.saying.sniff.croco.1', '*Sniff sniff*'), + ('furni_pura_mdl3*6_name', 'Blue Pura Module 3'), + ('poster_48_desc', 'All that glitters...'), + ('furni_wcandle_desc', 'Xmas tea light'), + ('nav_venue_bb_arena_3_name', 'Battle Ball Keskitaso'), + ('sound_machine_confirm_save_long', 'Are you sure you want to overwrite the current saved song?'), + ('purse_vouchers_helpurl', 'http://%predefined%/help/4'), + ('nav_venue_bouncer_room_2_name', 'Gevorderden Battle Ball Arena'), + ('furni_sand_cstl_gate_desc', 'sand_cstl_gate desc'), + ('furni_barrier*1_name', 'Yellow Maze Barrier'), + ('nav_venue_bb_lobby_tournament_0_name', 'Tournament'), + ('NUF_getting_room_roommatic_layout_tutor', 'Select what you want your room to look like. Use the arrows to cycle through different room layouts. Almost there, almost there...'), + ('poll_confirm_cancel', 'Stop answering?'), + ('furni_carpet_soft*4_desc', 'Soft Wool Rug'), + ('furni_rare_icecream_campaign_desc', 'Basic model'), + ('club_habbo.bottombar.text.notmember', 'Habbo Club'), + ('recycler_info_closed', 'Recycler is closed at the moment. Please check back later to recycle your Furniture.'), + ('furni_solarium_norja*8_desc', 'Rejuvenate your pixels!'), + ('callhelp_example', 'Example: How do I move my Furni?'), + ('furni_bed_budget_one*4_name', 'White Pura Bed'), + ('roomatic_givepwd', 'Password:'), + ('furni_teleport_door_name', 'Teleport Door'), + ('furni_table_silo_small*9_name', 'Red Area Occasional Table'), + ('furni_noob_chair*4_name', 'My first Habbo chair'), + ('furni_table_plasto_square*2_desc', 'Hip plastic furniture'), + ('room_waiting', 'Waiting to go in...'), + ('furni_sink_desc', 'Hot and cold thrown in for no charge'), + ('furni_doormat_plain_name', 'Doormat'), + ('nav_venue_eric\'s_eaterie_name', 'Eric\'s Eaterie'), + ('nav_venue_pizzeria_name', 'Slice of Life'), + ('poster_1004_desc', 'Celebrate with us'), + ('next', 'Next'), + ('furni_solarium_norja*9_name', 'Red Solarium'), + ('tutorial_quit_confirmation', 'You want to leave? Well I hope you learned something... something useful!'), + ('furni_val_teddy*2_desc', 'The pink bear of passion'), + ('poster_1003_name', 'UK Map'), + ('furni_glass_table*2_name', 'Glass table'), + ('NUF_habbo_home_url', 'http://d15-1.web.varoke.net/home/home-tutorial'), + ('furni_bed_silo_one_name', 'Single Bed'), + ('transaction_system_sms_win_btcellnet', 'O2 SMS'), + ('pet.hotwords.go_away', 'go away'), + ('furni_table_plasto_square*9_desc', 'Hip plastic furniture'), + ('furni_doormat_plain*4_name', 'Doormat'), + ('nav_venue_cunning_fox_gamehall_name', 'Cunning Fox Gamehall'), + ('furni_sound_machine*2_name', 'Ocean Traxmachine'), + ('furni_table_polyfon_name', 'Large Coffee Table'), + ('furni_hc_frplc_desc', 'Pixel-powered for maximum heating'), + ('console_request_massoperation_instruction', 'Use the options below to accept or decline ALL friend requests you have waiting.'), + ('nav_venue_bb_lobby_tournament_6/0_desc', ''), + ('furni_table_plasto_round*6_desc', 'Hip plastic furniture'), + ('trading_cancel', 'Cancel Trading'), + ('furni_glass_stool*3_name', 'Glass stool'), + ('furni_plant_mazegate_snow_name', 'Snowy Maze Gate'), + ('nav_venue_tv_studio_name', 'MuchMusic HQ'), + ('furni_table_norja_med*3_desc', 'For larger gatherings'), + ('furni_chair_plasty*8_desc', 'Hip plastic furniture'), + ('furni_bed_polyfon_name', 'Double Bed'), + ('gs_4teams', '4 Team Game'), + ('furni_sound_set_8_desc', 'Mellow electric grooves'), + ('ph_keys_jump', 'Jump:'), + ('reg_welcome', 'Welcome To Habbo Hotel!'), + ('purse_head', 'HABBO ACCOUNT ACTIVITY'), + ('nav_venue_bb_lobby_tournament_7_name', 'Competitie Battle Ball 8'), + ('reg_verification_newPasswordAgain', 'Retype new password:'), + ('furni_bardeskcorner_polyfon*8_desc', 'Yellow Mode Bardesk Corner'), + ('furni_sound_set_21_name', 'Rock 1'), + ('furni_gothic_stool*1_desc', 'The dark side of Habbo'), + ('furni_rope_divider_name', 'Rope Divider'), + ('poster_53_name', 'Hockey Stick'), + ('roomevent_default_desc', 'Event description..'), + ('nav_refresh_recoms', 'Refresh recommendations'), + ('nav_venue_sw_lobby_beginner_2_name', 'Snow Rookies Lobby'), + ('furni_divider_silo3*4_desc', 'Beige Area Gate'), + ('furni_divider_poly3*6_name', 'Blue Mode Bardesk Gate'), + ('reg_parentemail_title', 'Informing your parents'), + ('furni_gothgate_name', 'Gothic Portcullis'), + ('furni_mocchamaster_name', 'Mochamaster'), + ('modtool_message', 'Message:'), + ('furni_tree4_desc', 'Any presents under it yet?'), + ('furni_marquee*a_name', 'White Marquee'), + ('furni_queue_tile1*5_name', 'Knight Roller'), + ('furni_chair_polyfon_name', 'Dining Chair'), + ('furni_sleepingbag*9_name', 'Blue Sleeping Bag'), + ('furni_sound_set_9_name', 'Electronic 2'), + ('poster_39_desc', 'The rock masters of virtual music'), + ('furni_arabian_tetbl_desc', 'Serve up a treat'), + ('nav_venue_sw_lobby_free_9_name', 'Free Game Lobby'), + ('nav_venue_sw_arena_free_name(0)', 'Playing free for all game'), + ('furni_grand_piano*4_desc', 'Why is that key green?'), + ('furni_doorD_desc', 'Let\'s go over tzar!'), + ('purse_date', 'DATE'), + ('nav_venue_sw_lobby_beginner_6/0_desc', ''), + ('nav_venue_sw_lobby_beginner_4/0_desc', ''), + ('nav_venue_sw_lobby_intermediate_1_name', 'Snow Bombardiers Lobby'), + ('alert_reg_age', 'You are under 11 years old. Children under 11 can\'t enter Habbo Hotel.'), + ('nav_venue_bb_lobby_intermediate_9/0_desc', ''), + ('queue_set.c.alert', 'This room is for Habbo Club members only. In order to enter, you need to subscribe to Habbo Club.'), + ('sound_machine_confirm_clear_long', 'Are you sure you want to clear the current song?'), + ('furni_exe_drinks_name', 'Executive Drinks Tray'), + ('reg_bday_note', 'Please enter your correct date of birth, this is important! You\'ll need this information later on, if you want to change your password or e-mail.'), + ('modtool_roomalert', 'Room Alert'), + ('furni_rare_parasol*1_name', 'Yellow Parasol'), + ('furni_sound_set_18_name', 'Groove 4'), + ('sound_machine_window', 'Sound Machine Editor'), + ('furni_traffic_light*1_name', 'Classic Traffic Light'), + ('furni_chair_norja*4_desc', 'Sleek and chic for each cheek'), + ('furni_divider_nor1*2_desc', 'Black Ice corner'), + ('nav_venue_median_lobby_name', 'Median Lobby'), + ('furni_sofa_silo*3_desc', 'Cushioned, understated comfort'), + ('furni_bed_budget_desc', 'Comfortable, affordable!'), + ('furni_divider_nor4_name', 'Plain Iced Auto Shutter'), + ('furni_rare_icecream*6_desc', 'Virtual toffee rocks!'), + ('habboclub_txt1', 'You can buy Habbo Club one month at a time using Habbo Credits.'), + ('habboclub_txt3', 'Yes, I\'m over 14 years of age\\rOR\\rI\'m under 14 years of age and I have a permission from my parent/guardian to join Habbo Club.'), + ('furni_rare_dragonlamp*3_desc', 'Scary and scorching!'), + ('furni_noob_lamp*5_name', 'My first Habbo lamp'), + ('club_bottombar_text2', '(....)'), + ('furni_CFC_500_goldbar_name', 'Gold Bar (China)'), + ('club_bottombar_text1', 'Loading'), + ('furni_rare_elephant_statue*1_desc', 'Say hello to Nelly'), + ('furni_table_silo_med*7_name', 'Green Area Coffee Table'), + ('nav_venue_sw_lobby_free_1/0_desc', ''), + ('furni_bottle_desc', 'For interesting games!'), + ('furni_romantique_pianochair*2_desc', 'Let the music begin'), + ('furni_table_norja_med*2_name', 'Large Coffee Table Black'), + ('queue_set.e2.alert', 'This room is currently available only to Habbos participating to the event.'), + ('furni_solarium_norja_desc', 'Rejuvenate your pixels!'), + ('furni_table_plasto_square*14_desc', 'Hip plastic furniture'), + ('cam_save.help', 'Save & Print Photo'), + ('furni_sound_set_4_desc', 'Chilled out beats'), + ('furni_couch_norja*6_name', 'Blue Bench'), + ('poster_2003_desc', 'Would you trust this man?'), + ('hobba_cryforhelp', 'Call For Help:'), + ('furni_marquee*9_desc', 'It\'s both door and a shade!'), + ('nav_venue_bb_lobby_tournament_13/0_desc', ''), + ('poster_512_desc', 'The flag of Ireland'), + ('handitem12', 'Macchiato'), + ('object_displayer_hide_actions', 'Hide actions'), + ('furni_sound_set_25_name', 'Dance 1'), + ('handitem11', 'Mocha'), + ('handitem10', 'Latte'), + ('furni_sound_set_13_desc', 'Let Music be the food of Habbo'), + ('handitem16', 'Cappuccino'), + ('handitem15', 'Iced'), + ('handitem14', 'Filter'), + ('handitem13', 'Espresso'), + ('nav_venue_sw_lobby_free_2_name', 'Free Game Lobby'), + ('handitem19', 'Habbo Cola'), + ('nav_venue_sw_lobby_amateur_2/0_desc', ''), + ('handitem18', 'Tap'), + ('handitem17', 'Java'), + ('console_next_msg', 'Delete'), + ('furni_bardesk_polyfon*5_name', 'Candy Bar'), + ('furni_scifidoor*5_desc', 'There out of this world!'), + ('nav_roomispwprotected', 'The room is password protected.'), + ('furni_sleepingbag*2_name', 'Lime Sleeping Bag'), + ('furni_glass_table*6_name', 'Blue Glass Table'), + ('furni_divider_nor4*3_desc', 'Habbos, roll out!'), + ('furni_sound_set_61_name', 'Latin Love 3'), + ('nav_venue_pizza/0_desc', 'Pizza Palace'), + ('furni_romantique_clock_desc', ''), + ('furni_queue_tile1*0_desc', 'The power of movement'), + ('furni_pura_mdl2*9_desc', 'Any way you like it!'), + ('nav_venue_orient/0_name', 'Club Golden Dragon'), + ('furni_noob_table*1_desc', 'Lightweight, practical and orange'), + ('poster_22_desc', 'beautiful reproduction butterfly'), + ('furni_carpet_soft_name', 'Soft Wool Rug'), + ('Message', 'Message'), + ('furni_bed_trad_one_desc', 'All you need for a good night\'s kip'), + ('console_report_help', 'If the message you received was abusive or harassing, you can report it to the Moderators by clicking the Report button below. The Habbo will be removed from your Friends\' List automatically when you report. If you want to remove a Habbo from your Friends\' List without reporting their message, simply use the Remove button below.'), + ('furni_rcandle_desc', 'Xmas tea light'), + ('furni_sofa_silo*8_name', 'Yellow Two-Seater Sofa'), + ('furni_pura_mdl4*5_desc', ''), + ('NUF_mini_use_console_ready_tutor', 'You can now use the Console to find some of your friends, or you can continue the tutorial.'), + ('log_problem_link', 'Read FAQ\'s'), + ('furni_shelves_silo_name', 'Bookcase'), + ('gs_timetojoin', '\\x seconds to join'), + ('nav_venue_cunning_fox_gamehall/1_name', 'Gamehall Lobby'), + ('furni_safe_silo*7_name', 'Green Safe Minibar'), + ('NUF_mini_meet_people_hotelview_tutor', 'The Navigator lets you move between rooms in the Hotel. Open it up to get started!'), + ('purse_vouchers_sendbutton', 'Get Credits!'), + ('furni_gothic_sofa*4_name', 'Black Gothic Sofa'), + ('furni_wooden_screen*0_desc', 'Add an exotic touch to your room'), + ('catalog_give_trophymsg', 'You haven\'t engraved the trophy. Type \\ryour inscription in the grey box.'), + ('furni_prizetrophy5*3_name', 'Duo trophy'), + ('handitem23', 'Beetroot Habbo Soda'), + ('furni_rare_dragonlamp*8_name', 'Bronze Dragon Lamp'), + ('furni_divider_nor4*8_name', 'Yellow Iced Auto Shutter'), + ('handitem22', 'Lime Habbo Soda'), + ('furni_soft_sofa_norja*6_name', 'Blue Iced Sofa'), + ('handitem21', 'Hamburger'), + ('handitem20', 'Camera'), + ('furni_divider_nor1*9_desc', 'Red Ice corner'), + ('help_trouble', 'In Trouble?'), + ('handitem25', 'Love potion'), + ('handitem24', 'Bubble juice from 1999'), + ('furni_ham2_desc', 'Looks like you\'re too late!'), + ('nav_venue_bb_lobby_amateur_3_name', 'Gevorderden Battle Ball 4'), + ('furni_chair_plasto*15_name', 'Chair'), + ('furni_hyacinth1_desc', 'Beautiful bulb'), + ('furni_shelves_basic_desc', 'Pura series 404 shelves'), + ('furni_pura_mdl1*6_name', 'Blue Pura Module 1'), + ('nav_venue_cafe_gold/0_desc', 'Get the latest safety tips and tricks from Safety eXperts.'), + ('nav_venue_snowwar_lobby_name', 'Snow Storm Lobby'), + ('transaction_system_sms_slahti', 'Saunalahti'), + ('alert_tooLongPW', 'Your password is too long'), + ('furni_carpet_standard*5_desc', 'Available in a variety of colours'), + ('furni_deadduck_desc', 'Blood, but no guts'), + ('password.email.subject', 'Forgotten password'), + ('furni_prizetrophy2*3_desc', 'Breathtaking bronze'), + ('NUF_playing_games_hotelview_nav', 'Just click me to open the Navigator and get it over with...'), + ('furni_summer_chair*1_name', 'Aqua Deck Chair'), + ('furni_rubberchair*3_name', 'Orange Inflatable Chair'), + ('furni_exe_plant_desc', ''), + ('nav_venue_tearoom/0_desc', 'Chat with the people of Aoralia and meet a sprite or two!'), + ('nav_venue_sw_lobby_beginner_9/0_desc', ''), + ('furni_table_silo_med*6_name', 'Blue Area Coffee Table'), + ('nav_venue_sw_lobby_beginner_1/0_desc', ''), + ('furni_noob_stool*2_desc', 'Unfold me and take the weight off (dark blue)'), + ('camera_dialog_place', 'Move'), + ('furni_scifiport*8_desc', 'Energy beams. No trespassers!'), + ('url_peeloscore', 'http://%predefined%///groups/56555/id'), + ('console_follow_friend', 'Go to same room'), + ('sound_machine_alert_jukebox_list_full', 'The play list is full. Please wait until the current song has finished playing and try again.'), + ('poster_517_desc', 'Where\'s your kilt?'), + ('roomevent_type_11', 'Helpdesk'), + ('roomevent_type_10', 'Performance'), + ('furni_rare_dragonlamp*9_desc', 'Scary and scorching!'), + ('furni_pura_mdl2*3_name', 'Black Pura Module 2'), + ('url_help_1', 'http://%predefined%//credits'), + ('furni_edicehc_name', 'Dicemaster'), + ('furni_divider_silo1*8_name', 'Yellow Corner Shelf'), + ('furni_wooden_screen*5_desc', 'Add an exotic touch to your room'), + ('url_help_5', 'http://%predefined%/help/75'), + ('roomatic_intro2', 'Here\'s what one Habbo says about her room:'), + ('url_help_4', 'http://%predefined%//help/22'), + ('roomatic_intro1', 'You can decorate and furnish your room however you like and no one can tell you to tidy up or turn the music down. It\'s up to you if you let everyone in or just a chosen few, or lock the door and chill by yourself. Get creating and in a couple of minutes you\'ll have your own Habbo Hotel space.'), + ('url_help_3', 'http://%predefined%//help/'), + ('roomatic_intro3', 'My mates live miles away, but we can meet up in my room every Friday night and we don\'t have to worry about getting home afterwards.'), + ('url_help_2', 'http://%predefined%//profile?tab=4'), + ('furni_romantique_chair*5_name', 'Onyx Chair'), + ('url_help_6', 'http://www.habbohotel.co.uk/iot/go?lang=en&country=uk'), + ('furni_sound_set_20_name', 'SFX 2'), + ('furni_sofa_polyfon*4_desc', 'Beige Mode Sofa'), + ('sound_machine_alert_no_more_songs', 'Can\'t create new song! Traxmachine can have only %count% songs.'), + ('search', 'Search'), + ('room_preparing', '...Preparing room'), + ('nav_venue_bb_lobby_intermediate_0/0_desc', ''), + ('club_txt_renew2', 'You are Habbo Club member. If you want to change your subscription or leave the club, use the link below.'), + ('poster_1002_name', 'Queen Mum Poster'), + ('furni_barchair_silo*2_desc', 'Practical and convenient'), + ('reg_month', 'Month'), + ('club_txt_renew1', 'Your Habbo Club membership will be active for another %days% days. You can extend your membership by paying with Habbo Credits.'), + ('furni_rare_icecream*0_name', 'Cherry Ice Cream Machine'), + ('furni_sound_set_41_desc', 'Burning Riffs'), + ('nav_venue_beauty_salon_loreal_name', 'Beauty salon'), + ('poster_26_name', 'Angel Poster'), + ('furni_sound_set_19_name', 'Hip Hop Beats 4'), + ('furni_romantique_divan*4_name', 'Amber Chaise-Longue'), + ('furni_one_way_door*7_desc', 'One at a time!'), + ('sound_machine_confirm_eject_long', 'Are you sure you want to remove the Traxpack and it\'s samples from the song?'), + ('furni_glass_stool*8_desc', 'Translucent beauty'), + ('buddyremove_not_now', 'Cancel'), + ('no_user_for_gift', 'No user named %user% found. Gift not purchased.'), + ('buddyremove_lessoptions', 'Less Options <<'), + ('reg_legal_header1', 'Now you need to ask your parents/guardian to come to the computer. Read through the text (below) with your parents.'), + ('furni_carpet_soft*3_desc', 'Soft Wool Rug'), + ('reg_legal_header2', 'Read through the below text carefully. You must agree to the following terms before entering Habbo Hotel.'), + ('furni_sw_chest_name', 'sw_chest'), + ('nav_venue_sw_lobby_tournament_9_name', 'Tournament Lobby'), + ('messenger.email.footer', ''), + ('nav_venue_bb_arena_4_name', 'Battle Ball Expertit'), + ('club_change_url', 'http://%predefined%//credits/habboclub'), + ('furni_table_plasto_4leg*2_name', 'Occasional Table'), + ('ph_choosecolour', 'Choose Costume Colour'), + ('buddyremove_hc_more_info', 'More Info About Habbo Club >>'), + ('furni_romantique_smalltabl*1_desc', 'Every tray needs a table...'), + ('nav_venue_sw_lobby_tournament_8_name', 'Tournament Lobby'), + ('furni_divider_nor5_name', 'Plain Iced Angle'), + ('wallitem_roomdimmer_name', 'Mood Light'), + ('furni_bed_budget_one*5_name', 'Beige Pura Bed'), + ('furni_table_norja_med*9_name', 'Large Coffee Table Red'), + ('furni_pillow*3_desc', 'Puffy, soft and huge'), + ('furni_noob_rug*2_name', 'My first Habbo rug'), + ('nav_venue_sw_lobby_beginner_7_name', 'Snow Rookies Lobby'), + ('furni_exe_chair_desc', 'Relaxing leather comfort'), + ('furni_s_sound_machine*2_desc', 'Sound Machine Ocean Desc'), + ('nav_venue_dusty_lounge/0_desc', 'A dignified lounge for sitting back and enjoying a licorice pipe'), + ('game_bs_ship4', 'Destroyer(s)'), + ('game_bs_ship3', 'Cruiser(s)'), + ('game_bs_ship2', 'Battle Ship(s)'), + ('game_bs_ship1', 'An aircraft carrier'), + ('furni_table_plasto_bigsquare*4_name', 'Square Dining Table'), + ('openhrs_title', 'We are closing the hotel'), + ('furni_habbowood_chair_name', 'Director\'s Chair'), + ('roomatic_confirm', 'Confirm password:'), + ('poster_14_desc', 'A cunning painting'), + ('furni_doormat_plain*3_name', 'Doormat'), + ('furni_sound_set_3_desc', 'Chilled grooves'), + ('win_messenger', 'Habbo Console'), + ('summer_chair_7_name', 'Green Deck Chair'), + ('notickets_window_header', 'Tickets needed!'), + ('nav_updatenote', 'Updating your room properties may take a while. The changes have been made, but it\'ll take a few minutes until all Habbos can see them.'), + ('furni_table_plasto_bigsquare*5_name', 'Square Dining Table'), + ('url_purselink', 'http://%predefined%//credits?'), + ('console_follow_hotelview', 'Your friend is on the hotel view.'), + ('furni_solarium_norja*3_desc', 'Get the city look!'), + ('sound_machine_alert_song_name_missing', 'Please give your song a name.'), + ('furni_sound_machine*3_name', 'Green Traxmachine'), + ('jukebox_next_up', 'Next up:'), + ('trading_additems', 'Put items in boxes'), + ('furni_sporttrack3*1_name', 'Sport goal tartan'), + ('club_button_3_period', 'Buy 6 >>>'), + ('nav_delroom3', 'Room deleted!'), + ('nav_delroom2', 'Are you sure you want to delete this room? All the furniture left in it will also be deleted.'), + ('poster_34_name', 'Scamme\'d'), + ('go', 'Go >>'), + ('nav_delroom1', 'If you want to save the furniture in this room, move it to the giant hand before you continue.'), + ('console_habboprofile_arrowed', 'Habbo Profile >>'), + ('furni_chair_plasty*10_desc', 'Hip plastic furniture'), + ('cam_txtscreen.help', 'Caption'), + ('wallitem_item_placeholder_name', 'This furniture is downloading...'), + ('furni_carpet_standard*b_desc', 'Available in a variety of colours'), + ('poster_59_name', 'Torch'), + ('furni_chair_basic*4_name', 'White Pura Egg Chair'), + ('summer_chair_1_name', 'Aquamarine Deck Chair'), + ('nav_venue_space_cafe_name', 'Ten Forward'), + ('log_problem_url', 'http://%predefined%//help/faqs?faq_1_categoryId=14'), + ('group_homepage_url', 'http://%predefined%/groups/%groupid%/id'), + ('furni_heart_name', 'Giant Heart'), + ('nav_venue_sw_arena_beginner_name', 'Playing beginner game'), + ('furni_grunge_chair_name', 'Grunge Chair'), + ('nav_dooropens', 'Door opens! Go on in...'), + ('modtool_banuser', 'Ban User'), + ('furni_carpet_soft_tut_desc', 'Welcome, enjoy your stay!'), + ('furni_rare_mnstr_name', 'Venomus Habbolus'), + ('furni_divider_silo3*9_name', 'Red Area Gate'), + ('furni_pura_mdl3*1_name', 'Aqua Pura Module 3'), + ('Messages', 'Message(s)'), + ('wallitem_arabian_wndw_name', 'Arabian Window Frame'), + ('furni_prizetrophy3*1_desc', 'Glittery gold'), + ('furni_sound_set_47_desc', 'Storm the UKCharts!'), + ('poster_54_desc', 'whack that ball!'), + ('url_logout_concurrent', 'http://%predefined%//account/disconnected?reason=concurrentlogin&origin=popup'), + ('nav_venue_sw_lobby_beginner_1_name', 'Snow Rookies Lobby'), + ('furni_table_plasto_4leg*8_name', 'Occasional Table'), + ('sound_machine_turn_on', 'Switch On'), + ('furni_table_norja_med*4_desc', 'For larger gatherings'), + ('buddyremove_hc_info_url', 'http://www.habbo.co.uk/credits/habboclub'), + ('furni_romantique_divider*2_name', 'Green Screen'), + ('furni_pillar*5_desc', 'Find your natural roots'), + ('furni_table_silo_med_desc', 'Wipe clean and unobtrusive'), + ('furni_pillow*8_name', 'Navy Cord Pillow'), + ('room_owner', 'Owner:'), + ('furni_shelves_norja*5_name', 'Pink Bookcase'), + ('queue_set.d.info', 'There are %d% Habbos in front of you in the queue.'), + ('reg_retypepass', 'Retype Password:'), + ('furni_jp_tray3_name', 'jp_tray3'), + ('dance_stop', 'Stop Dancing'), + ('buddyremove_remove_text', 'You are about to remove %removeamount% friends from your friendlist.\\r\\r After removal, you\'ll have %amountleft% friends on your list:'), + ('nav_venue_bb_lobby_tournament_12_name', 'Competitie Battle Ball 13'), + ('furni_summer_chair*2_name', 'Deck Chair'), + ('furni_plant_valentinerose*1_desc', 'Secret admirer!'), + ('furni_sofachair_silo*4_name', 'Beige Area Armchair'), + ('poster_523_name', 'The flag of India'), + ('furni_scifirocket*4_name', 'Venus Smoke Machine'), + ('nav_venue_tearoom_name', 'Chinese Tea Room'), + ('furni_pura_mdl1*5_name', 'beige pura module 1'), + ('nav_venue_bb_lobby_tournament_0/0_desc', ''), + ('furni_chair_silo*5_desc', 'Pink Silo Dining Chair'), + ('club_txt_expired', 'Your Habbo Club membership has run out. You can join the club again by clicking the HC logo on the hotel view.\\rMembers of Habbo Club get priority access to the hotel (so you can always get in), exclusive clothes, hair colours, rare furni and special guest room layouts. To see exactly what you\'ll be able to get your hands on as a Habbo Club member, take a look in the Catalogue.'), + ('furni_glass_table*7_name', 'Green Glass Table'), + ('nav_prvrooms_notfound', 'Your search did not match any rooms'), + ('bb_title_BBscores2', 'Game over!'), + ('wallitem_gothicfountain_name', 'Gothic Ectoplasm Fountain'), + ('furni_one_way_door*1_desc', 'One at a time!'), + ('furni_chair_plasty*1_name', 'Plastic Pod Chair'), + ('furni_divider_nor3*9_name', 'Red Iced gate'), + ('sound_machine_time_2', '%min%:%sec%min'), + ('sound_machine_time_1', '%min%:%sec%min'), + ('furni_bardesk_polyfon*4_name', 'Beige Mode Bardesk'), + ('queue_set.queue_reset.alert', 'The queue for this room has been reset, please try again.'), + ('furni_jp_pillow_desc', 'Comfy and classical'), + ('nav_venue_sw_lobby_free_9/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('furni_barchair_silo*8_desc', 'Practical and convenient'), + ('delete_furniture', 'Delete Furniture (permanently)'), + ('furni_plant_bulrush_desc', 'Ideal for the riverside'), + ('poster_61_name', 'Siva Poster'), + ('furni_bed_silo_two_name', 'Double Bed'), + ('furni_plant_pineapple_desc', 'Needs loving glances'), + ('furni_bed_polyfon_girl_desc', 'Snuggle down in princess pink'), + ('furni_pillow*4_desc', 'Puffy, soft and huge'), + ('furni_table_norja_med*8_name', 'Large Coffee Table Yellow'), + ('transaction_system_tsms_win_tmobile', 'T-Mobile SMS'), + ('furni_scifidoor*10_desc', 'There out of this world!'), + ('furni_bed_polyfon*7_desc', 'Green Mode Double Bed'), + ('furni_toy1*2_desc', 'it\'s bouncy-tastic'), + ('transaction_system_sms_radiolinja', 'Elisa'), + ('furni_gothic_chair*4_name', 'Black Gothic Chair'), + ('furni_scifidoor*6_desc', 'Monolith goes up! Monolith goes down!'), + ('nav_venue_sw_lobby_free_3_name', 'Free Game Lobby'), + ('console_friend_request_not_found', 'There was an error finding the user for the friend request'), + ('furni_romantique_smalltabl*2_desc', 'Every tray needs a table...'), + ('furni_bed_budget*2_name', 'Pink Pura Double Bed'), + ('wallitem_post.it_name', 'Pad of stickies'), + ('gs_state_created', 'Waiting for players..'), + ('furni_divider_nor3*4_desc', 'Entrance or exit?'), + ('furni_sofa_polyfon_girl_desc', 'Romantic pink for two'), + ('locked', 'Locked (visitors have to ring bell)'), + ('alert_reg_birthday', 'Birthday'), + ('club_thanks_text', 'Here you can see your Habbo Club membership status, number of elapsed months, pre-ordered months and status of the ongoing month.'), + ('furni_sound_set_39_desc', 'Rock with a roll'), + ('nav_venue_old_skool/0_desc', 'A set of rooms inspired by the original and legendary Mobiles Disco, the progenitor of Habbo'), + ('poster_511_desc', 'The flag of The Netherlands'), + ('furni_couch_norja*7_name', 'Rural Iced Bench'), + ('furni_safe_silo*6_name', 'Blue Safe Minibar'), + ('furni_table_plasto_4leg*14_desc', 'Aqua table'), + ('room_sound_furni_limit', 'You can only place one sound furni per room'), + ('nav_venue_bb_lobby_beginner_15/0_desc', ''), + ('furni_glass_shelf_name', 'Glass shelf'), + ('furni_divider_nor2*6_desc', 'Blue Iced bar desk'), + ('furni_turkey_name', 'Roast Turkey'), + ('nav_venue_bb_lobby_tournament_16/0_desc', ''), + ('sw_timeleft', 'Time:'), + ('furni_rare_parasol_name', 'Parasol'), + ('furni_glass_sofa*7_desc', 'Habbo Club'), + ('furni_bardeskcorner_polyfon*13_name', 'Corner Cabinet/Desk'), + ('furni_rare_fan*9_name', 'Fucsia Powered Fan'), + ('furni_chair_plasto*4_desc', 'Hip plastic furniture'), + ('no', 'No'), + ('furni_rare_fan*4_desc', 'Fanning the fires of SUPERLOVE...'), + ('nav_venue_median_lobby/0_desc', 'A Mean place to hang'), + ('nav_venue_sw_lobby_intermediate_2/0_desc', ''), + ('furni_md_sofa_name', 'MD Sofa'), + ('furni_noob_lamp*1_desc', 'Get the light right where you want it (yellow)'), + ('login_connecting', 'Connecting...'), + ('furni_divider_nor1*3_desc', 'Looks squishy, but isn\'t!'), + ('furni_sound_set_14_desc', 'Rock them bodies'), + ('furni_sound_set_59_name', 'RnB Grooves 5'), + ('poster_21_desc', 'beautiful reproduction butterfly'), + ('wallitem_hc_wall_lamp_desc', 'Tres chic!'), + ('ok', 'OK'), + ('nav_venue_sw_lobby_tournament_1/0_desc', ''), + ('pet_happy', 'Happiness:'), + ('sound_machine_edit', 'Edit Song'), + ('furni_rare_elephant_statue*2_desc', 'Say hello to Nelly'), + ('furni_CFC_200_moneybag_desc', 'Worth 200 Credits'), + ('nav_venue_bb_lobby_intermediate_6/0_desc', ''), + ('console_buddylimit_requester', 'Friend could not be added. The request sender can not have anymore friends.'), + ('furni_sofa_silo*2_desc', 'Cushioned, understated comfort'), + ('sound_machine_alert_invalid_song_name', 'You have already burned another song with the same name. Please change the song name before trying again.'), + ('furni_fireplace_armas_name', 'Fireplace'), + ('furni_barchair_silo*3_desc', 'Practical and convenient'), + ('ph_ticket', 'Ticket'), + ('furni_arabian_divdr_desc', 'Carved Cedar Divider'), + ('wallitem_jp_ninjastars_desc', 'Not a frisbee'), + ('wallitem_hrella_poster_1_desc', 'Brighten up your cabin'), + ('furni_noob_stool*3_desc', 'Unfold me and take the weight off (aubergine)'), + ('furni_pura_mdl5*9_name', 'Red Pura Module 5'), + ('furni_divider_nor4*2_desc', 'Habbos, roll out!'), + ('NUF_mini_meet_people_roomlist_tutor', 'Click \'Open\' to open up a category and see what rooms are within. When you have found an interesting room, press \'Go\' to visit it.'), + ('poster_41_name', 'Habbo Golden Record'), + ('furni_jp_tray4_desc', 'jp_tray4'), + ('buddyremove_confirm', 'Yeah, it is done...'), + ('tutorial_topic_list_F', 'Choose a topic from the list below:'), + ('purse_time', 'TIME'), + ('nav_venue_sw_lobby_free_8_name', 'Free Game Lobby'), + ('tutorial_topic_list_M', 'Choose a topic from the list below:'), + ('furni_s_sound_machine*7_name', 'Sound Machine Red'), + ('interface_icon_navigator', 'Navigator, navigate around'), + ('furni_xmas_cstl_wall_name', 'Ice Castle Wall'), + ('nav_own_hd', 'Your Rooms.'), + ('modtool_aa_checkbox_text', 'Audio alert'), + ('wallitem_industrialfan_desc', 'Powerful and resilient'), + ('furni_bed_budget*8_desc', 'King sized comfort!'), + ('sound_machine_burn', 'Burn Song'), + ('nav_venue_sw_lobby_intermediate_0_name', 'Snow Bombardiers Lobby'), + ('nav_venue_bb_lobby_beginner_1_name', 'Beginners Battle Ball 2'), + ('furni_chair_basic*5_desc', ''), + ('password.email.prefix', 'Your password is:'), + ('furni_pura_mdl5*4_desc', 'Any way you like it!'), + ('furni_table_norja_med*3_name', 'White Iced Table'), + ('furni_pura_mdl3*2_desc', 'Any way you like it!'), + ('nav_venue_sw_lobby_tournament_3_name', 'Tournament Lobby'), + ('furni_sound_set_34_desc', 'For guitar heroes'), + ('furni_summer_grill*1_desc', 'Plenty of ribs on that barbie'), + ('hubu_t4_1', 'Anna palautetta Hubusta'), + ('furni_divider_nor1*8_desc', 'Yellow Ice corner'), + ('hubu_t4_2', 'Tsekkaa heebelin jorinat'), + ('poll_offer_title', 'Poll'), + ('summer_chair_2_desc', 'Leave your towel early'), + ('wallitem_habbowheel_name', 'The Wheel of Destiny!'), + ('reg_mission', 'Your Mission:'), + ('furni_sofa_polyfon*9_name', 'Red Two-seater Sofa'), + ('furni_bed_budget_one_desc', 'aquamarine'), + ('nav_venue_sw_lobby_tournament_7/0_desc', ''), + ('furni_gothic_sofa*3_name', 'Gothic Sofa Red'), + ('furni_chair_plasto*9_name', 'Chair'), + ('nav_venue_sw_arena_beginner_name(0)', 'Playing beginner game'), + ('notickets_text_2', 'Buy more tickets now and get a discount. You can also buy tickets as a present.'), + ('wallitem_sw_hole_desc', 'sw_hole'), + ('furni_plant_big_cactus_name', 'Mature Cactus'), + ('notickets_text_1', 'Game price is 1 credit. For that you get 2 tickets.'), + ('poster_19_name', 'Hole In The Wall'), + ('furni_divider_nor4*7_name', 'Rural Iced Shutter'), + ('email', ''), + ('furni_sound_set_13_name', 'Dance 5'), + ('furni_present_gen1_name', 'Gift'), + ('nav_venue_bb_lobby_tournament_19/0_desc', ''), + ('furni_chair_norja_desc', 'Sleek and chic for each cheek'), + ('furni_marquee*9_name', 'Green Marquee'), + ('sound_machine_alert_song_locked', 'The song you\'re editing can\'t be modified. Please save the song under another name to create a new copy.'), + ('furni_glass_stool*2_name', 'Glass stool'), + ('nav_venue_theatredrome_xmas/0_desc', ''), + ('poster_5_name', 'Duck Poster'), + ('furni_prize2_desc', 'Nice and shiny'), + ('furni_valeduck_desc', 'He\'s lovestruck'), + ('furni_chair_plasty*7_desc', 'Hip plastic furniture'), + ('closed', 'Closed'), + ('furni_wcandleset_name', 'White Candle Plate'), + ('furni_sleepingbag*3_name', 'Ocean Sleeping Bag'), + ('furni_tree3_name', 'Christmas Tree 1'), + ('furni_sound_set_26_name', 'Groove 1'), + ('furni_barrier*2_desc', 'No trespassing, please!'), + ('game_bs_turn1', 'Your Turn'), + ('nav_venue_bb_lobby_expert_desc', 'Expert battle ball!'), + ('alert_donate_topic', 'SCAM ALERT!'), + ('game_bs_turn2', 'The Enemy\'s Turn'), + ('furni_sand_cstl_gate_name', 'sand castle gate'), + ('furni_rare_dragonlamp*4_desc', 'Scary and scorching!'), + ('furni_camera_desc', 'Smile!'), + ('pet.hotwords.lie', 'lie down'), + ('furni_sound_set_60_name', 'Latin Love 2'), + ('console_accept_selected', 'Accept'), + ('furni_divider_silo1*3_desc', 'Neat and natty'), + ('furni_summer_chair*7_name', 'Green Deck Chair'), + ('furni_pumpkin_desc', 'Cast a spooky glow'), + ('reg_habboname_note', 'Now it\'s time to make your own Habbo character! To make your own Habbo, please start by choosing your Habbo Name.'), + ('furni_rare_icecream_campaign_name', 'Rare icecream white'), + ('furni_doormat_plain_desc', 'Available in a variety of colours'), + ('room_areYouSure', 'Are you sure you want to delete this item forever?'), + ('sound_machine_confirm_burn', 'Burn this song?'), + ('predefined_room_name', '%user_name%\'s room'), + ('furni_divider_silo1*2_name', 'Black Corner Shelf'), + ('furni_table_plasto_4leg*3_desc', 'Hip plastic furniture'), + ('furni_solarium_norja*8_name', 'Yellow Solarium'), + ('furni_exe_globe_desc', 'The power is yours!'), + ('furni_bed_polyfon*6_name', 'Blue Mode Double Bed'), + ('notickets_store_link', 'Go to ticket store >>>'), + ('NUF_habbo_home', 'Habbo Home'), + ('nav_venue_the_den_name', 'The Den'), + ('furni_table_plasto_square*2_name', 'Round Dining Table'), + ('modtool_header', 'The Tool'), + ('pet_enrg_7', 'Energetic'), + ('nav_noanswer', 'No answer'), + ('roommatic_hc_members_only', 'This Room Is For HC Members Only'), + ('furni_xmasduck_desc', 'A right Christmas quacker!'), + ('pet_enrg_8', 'Lively'), + ('NUF_getting_room_own_rooms_tutor', 'Click the \'Create own room\' button to start building your room. Don\'t worry, making your room is completely free.'), + ('pet_enrg_5', 'Sprightly'), + ('pet_enrg_6', 'Active'), + ('furni_doormat_plain*4_desc', 'Available in a variety of colours'), + ('pet_enrg_3', 'Lazy'), + ('pet_enrg_4', 'Relaxed'), + ('furni_divider_poly3*6_desc', 'Blue Mode Bardesk Gate'), + ('pet_enrg_1', 'Slow'), + ('furni_glass_table*2_desc', 'Translucent beauty'), + ('pet_enrg_2', 'Sluggish'), + ('poster_1003_desc', 'get the lovely isles on your walls'), + ('furni_hc_djset_name', 'The Grammophon'), + ('pet_enrg_9', 'Tireless'), + ('furni_table_plasto_round*6_name', 'Round Dining Table'), + ('furni_sporttrack2*3_name', 'Sport corner grass'), + ('furni_footylamp_name', 'Football Lamp'), + ('furni_bed_silo_one_desc', 'Plain and simple'), + ('pet_enrg_0', 'Tired'), + ('furni_soft_sofachair_norja*7_name', 'Rural Iced Sofachair'), + ('furni_solarium_norja*9_desc', 'Rejuvenate your pixels!'), + ('furni_pillow*9_desc', 'Puffy, soft and VERY fluffy!'), + ('furni_plant_mazegate_snow_desc', 'There\'s snow way through!'), + ('furni_sound_set_8_name', 'Ambient 2'), + ('furni_divider_silo3*4_name', 'Beige Area Gate'), + ('previous', 'Previous'), + ('furni_glass_stool*3_desc', 'Translucent beauty'), + ('furni_bardeskcorner_polyfon*8_name', 'Yellow Mode Bardesk Corner'), + ('next_onearrowed', 'Next >'), + ('nav_venue_sw_lobby_expert_desc', 'For the William Tells and Robin Hoods of Snow Storming.'), + ('furni_bardeskcorner_polyfon*2_name', 'Black Mode Bardesk Corner'), + ('catalog_pet_unacceptable', 'Sorry, that name is unacceptable to Hotel Management'), + ('furni_sound_set_46_name', 'Club 1'), + ('nav_error_room_full', 'The room is full.'), + ('furni_queue_tile1*4_name', 'Gold Habbo Roller'), + ('furni_mocchamaster_desc', 'Wake up and smell it!'), + ('furni_gothic_stool*1_name', 'Gothic Stool Pink'), + ('furni_noob_chair*5_name', 'My first Habbo chair'), + ('furni_noob_rug*3_desc', 'Nice and neat sisal rug with aubergine edging'), + ('nav_venue_club_mammoth/0_name', 'Club Mammoth'), + ('pet_race_1_024', 'Cat Burglar'), + ('pet_race_1_022', 'Matted Moggy'), + ('poster_39_name', 'Screaming Furnies'), + ('pet_race_1_023', 'Indoor Alley Cat'), + ('furni_prizetrophy5*3_desc', 'Breathtaking bronze'), + ('pet_race_1_020', 'Caterwaul Kitty'), + ('NUF_mini_meet_people_room_tutor', 'The people wandering around are Habbos just like you.\\nClick on one of them to learn more about them- or on yourself to look in the mirror.'), + ('pet_race_1_021', 'Fabulous Feline'), + ('furni_arabian_tetbl_name', 'Hexagonal Tea Table'), + ('furni_grand_piano*4_name', 'Amber Grand Piano'), + ('poster_504_desc', 'The German flag'), + ('roomatic_name', 'Room name:'), + ('furni_sound_set_21_desc', 'Headbanging riffs'), + ('credit_redeem_info', 'More info about credit furni >>'), + ('furni_marquee*a_desc', 'It\'s both door and a shade!'), + ('furni_sound_set_33_name', 'Rock 3'), + ('furni_queue_tile1*5_desc', 'The power of movement'), + ('furni_doorD_name', 'Imperial Teleport'), + ('furni_rare_parasol*1_desc', 'Block those rays!'), + ('purse_youhave', 'You Have'), + ('nav_fullbutton', 'Full'), + ('furni_rare_fountain*2_desc', 'For our feathered friends'), + ('friend_request_accepted', 'Accepted!'), + ('tutorial_help_button_bubble', 'Click the blue question mark to open up the help menu to restart the tutorial.'), + ('furni_rubberchair*4_desc', 'Soft and tearproof!'), + ('furni_sound_set_9_desc', 'Mystical ambient soundscapes'), + ('furni_rare_fan*3_name', 'Purple Dragon Skin Fan'), + ('furni_table_plasto_square*8_desc', 'Hip plastic furniture'), + ('gs_choose_gametime', 'Choose Game duration:'), + ('furni_traffic_light*1_desc', 'Chill and wait your turn!'), + ('furni_sofachair_polyfon*6_desc', 'Blue Mode Armchair'), + ('furni_chair_norja*4_name', 'Urban Iced Chair'), + ('furni_val_teddy*2_name', 'Pink Share Bear'), + ('nav_venue_chill/0_name', 'Zen Garden'), + ('furni_table_plasto_square_name', 'Occasional Table'), + ('furni_bed_budget_name', 'Pura Bed'), + ('furni_solarium_norja_name', 'White Solarium'), + ('furni_noob_table*1_name', 'My first Habbo table'), + ('gs_5min', '5min'), + ('purse_credits', 'You have \\x1 Habbo Credit(s) in your purse.'), + ('furni_divider_poly3*5_name', 'Candy Hatch (Lockable)'), + ('furni_rare_icecream*6_name', 'Toffee Ice Cream Machine'), + ('furni_table_polyfon_med_name', 'Large Coffee Table'), + ('console_deselect_all', 'Deselect all'), + ('nav_venue_bb_lobby_amateur_8_name', 'Gevorderden Battle Ball 9'), + ('transaction_system_sms_win_kpn', 'KPN SMS'), + ('nav_venue_bb_lobby_intermediate_3/0_desc', ''), + ('furni_CFC_500_goldbar_desc', 'Worth 500 Credits'), + ('NUF_visiting_rooms', 'Visiting other players\' rooms'), + ('url_logout_timeout', 'http://%predefined%//account/disconnected?reason=logout'), + ('furni_table_silo_med*7_desc', 'Green Area Coffee Table'), + ('player_commands_no_args', 'You have not supplied any arguments!'), + ('furni_romantique_pianochair*2_name', 'Lime Romantique Piano Chair'), + ('pickup', 'Pick up'), + ('reg_tutorial_url', ''), + ('habboclub_confirm_body', 'You have %credits% credits'), + ('nav_venue_bb_lobby_beginner_12/0_desc', ''), + ('furni_rare_elephant_statue*1_name', 'Silver Elephant'), + ('help', 'Habbo Help'), + ('furni_soft_sofachair_norja*2_desc', 'Black Iced Sofachair'), + ('furni_table_plasto_round*1_desc', 'Hip plastic furniture'), + ('furni_sleepingbag*9_desc', 'Ultimate coziness'), + ('furni_arabian_tray2_desc', 'For those Arabian nights'), + ('NUF_visiting_rooms_hotelview_tutor', 'Hello. This time we are learning how to visit another user\'s room.'), + ('furni_traffic_light*6_name', 'Red Traffic Light'), + ('Alert_ChooseWhoToSentMessage', 'Please choose who to\\rsend your message to'), + ('poster_47_desc', 'Twinkle, twinkle'), + ('bb_title_finalScores', 'Final standings:'), + ('jukebox_song_author', 'by: %author%'), + ('poster_2003_name', 'Dodgy Geezer'), + ('poster_509_name', 'The Jamaican flag'), + ('poster_6_desc', 'But is it the right way up?'), + ('furni_toy1*1_name', 'Rubber Ball'), + ('nav_venue_bb_lobby_beginner_13_name', 'Beginners Battle Ball 14'), + ('furni_scifidoor*5_name', 'White Spaceship Door'), + ('credit_redeem_text', 'You are going to change Furni to %value% credits.'), + ('nav_venue_sw_lobby_amateur_0_name', 'Snow Slingers Lobby'), + ('club_txt_intro', 'Welcome to Habbo Club - the members only club that all the best Habbos belong to!\\r\\rMembers of Habbo Club get priority access to the hotel (so you can always get in), exclusive clothes, hair colours, rare furni and special guest room layouts. To see exactly what you\'ll be able to get your hands on as a Habbo Club member, take a look in the Catalogue.'), + ('nav_venue_bouncer_room_1_name', 'Beginners Battle Ball Arena'), + ('update_email_suggest', 'Habbo Hotel security supervisor requests you to update your email'), + ('furni_rare_dragonlamp*3_name', 'Silver Dragon Lamp'), + ('furni_scifiport*2_name', 'Blue Laser Gate'), + ('club_button_extend', 'Extend Membership'), + ('wallitem_val_heart_name', 'Heart Light'), + ('furni_pura_mdl3*7_name', 'Green Pura Module 3'), + ('furni_sound_set_61_desc', 'Straight from the heart'), + ('nav_venue_bb_lobby_expert_9/0_desc', ''), + ('furni_pura_mdl2*9_name', 'Red Pura Module 2'), + ('furni_hal_cauldron_name', 'Habboween Cauldron'), + ('furni_divider_nor1*2_name', 'Black Ice corner'), + ('send', 'Send'), + ('furni_couch_norja_desc', 'Two can perch comfortably'), + ('furni_pura_mdl4*5_name', 'beige pura module 4'), + ('pet_race_1_008', 'Mad Mouser'), + ('pet_race_1_009', 'Scaredy Kat'), + ('pet_race_1_006', 'Titchy Tiger'), + ('pet_race_1_007', 'Burmese Buddy'), + ('pet_race_1_004', 'Soft-Toed Sneaker'), + ('furni_divider_nor4*8_desc', 'Habbos, roll out!'), + ('furni_tile_desc', 'In a choice of colours'), + ('pet_race_1_005', 'Cat Astroflea'), + ('pet_race_1_002', 'Lesser Spotted Longhair'), + ('pet_race_1_003', 'Hidden Clause'), + ('pet_race_1_000', 'Sleepy Siamese'), + ('pet_race_1_001', 'Purr-Sian'), + ('furni_sound_set_53_name', 'Snowy Surprise'), + ('furni_rare_icecream*1_desc', 'Virtual blueberry rocks!'), + ('furni_table_plasto_round*15_name', 'Occasional Table'), + ('security', 'Security'), + ('furni_glass_chair*5_name', 'Glass chair'), + ('nav_venue_cunning_fox_gamehall/1_desc', 'It\'s one-on-one for five in a row'), + ('nav_venue_sw_lobby_tournament_4/0_desc', ''), + ('furni_carpet_soft_desc', 'Soft Wool Rug'), + ('poster_27_desc', 'Deck the halls!'), + ('furni_safe_silo*7_desc', 'Totally shatter-proof!'), + ('furni_table_silo_small*5_desc', 'Pink Area Occasional Table'), + ('furni_marquee*4_desc', 'It\'s both door and a shade!'), + ('furni_gothic_sofa*4_desc', 'Ghosts and Ghouls'), + ('furni_prizetrophy6*1_desc', 'Glittery gold'), + ('pet_race_1_019', 'Bobcat Wailer'), + ('furni_bardesk_polyfon*5_desc', 'For cute constructions'), + ('furni_carpet_polar*2_name', 'Blue Bear Rug'), + ('pet_race_1_017', 'Furry Friend'), + ('furni_soft_sofa_norja*6_desc', 'Blue Iced Sofa'), + ('furni_pura_mdl2*4_desc', 'Any way you like it!'), + ('pet_race_1_018', 'Trusting Tabby'), + ('pet_race_1_015', 'Haughty House Pet'), + ('chatlog.url', 'https://theallseeingeye.sulake.com/ase/habbo/uk/housekeeping/extra/hobba/chatlog.action?chatId='), + ('furni_ham2_name', 'Eaten Ham'), + ('pet_race_1_016', 'Curiousity - The Return!'), + ('pet_race_1_013', 'Felis Catus Allergicus'), + ('pet_race_1_014', 'Bushy Bobtail'), + ('pet_race_1_011', 'Egyptian Angora'), + ('pet_race_1_012', 'Freckled Feral'), + ('gs_choose_gamefield', 'Choose Game Arena:'), + ('furni_divider_nor5*6_desc', 'Cool cornering for your crib y0!'), + ('furni_summer_pool*2_name', 'Red Summer Pool'), + ('pet_race_1_010', 'Wannabe Wildcat'), + ('furni_rare_elephant_statue_desc', 'Say hello to Nelly'), + ('furni_sofa_silo*8_desc', 'Cushioned, understated comfort'), + ('furni_exe_rug_desc', 'Please remove your shoes!'), + ('NUF_meeting_people_roomlist_tutor', 'Let\'s visit one of the rooms and find out how to meet other users.'), + ('furni_chair_plasto*15_desc', 'Hip plastic furniture'), + ('nav_venue_habburger\'s_name', 'Habburgers'), + ('queue_current_2', 'You are in queue for the room.'), + ('queue_current_1', 'You are in Habbo Live queue...'), + ('furni_pura_mdl5*3_name', 'Black Pura Module 5'), + ('furni_hockey_score_name', 'Scoreboard'), + ('furni_sofachair_silo*5_desc', 'Pink Area Armchair'), + ('furni_hyacinth1_name', 'Pink Hyacinth'), + ('furni_pura_mdl1*6_desc', 'Any way you like it!'), + ('camera_open_dialog_heading', 'Camera'), + ('furni_prizetrophy5*2_name', 'Duo trophy'), + ('furni_glass_chair_desc', 'Translucent beauty'), + ('furni_rubberchair*3_desc', 'Soft and tearproof!'), + ('furni_exe_plant_name', 'Executive Plant'), + ('furni_pura_mdl2*3_desc', 'Any way you like it!'), + ('furni_pura_mdl1*2_name', 'Pink Pura Module 1'), + ('furni_plant_bonsai_desc', 'You can be sure it lives'), + ('furni_plant_valentinerose*4_desc', 'Be mine!'), + ('wallitem_hrella_poster_3_desc', 'Don\'t drift away!'), + ('furni_deadduck_name', 'Dead Duck'), + ('furni_summer_grill*3_desc', 'Plenty of steak on that barbie'), + ('modtool_extrainfo', 'Extra Info:'), + ('sound_machine_jukebox_window', 'Jukebox'), + ('gs_button_start', 'Start Game!'), + ('nav_venue_sw_lobby_beginner_5/0_desc', ''), + ('furni_romantique_chair*5_desc', 'What does this button do?'), + ('furni_table_plasto_4leg*9_desc', 'Hip plastic furniture'), + ('furni_soft_sofa_norja_desc', 'A soft iced sofa'), + ('furni_divider_nor4*9_name', 'Red Iced Auto Shutter'), + ('login_haventGotHabbo', 'Haven\'t got a Habbo yet?'), + ('furni_noob_stool*2_name', 'My first Habbo stool'), + ('furni_s_sound_machine*5_desc', 'Sound Machine Brown Desc'), + ('credit_redeem_window', 'Redeem credit furni'), + ('send_invitation_text', 'Want to meet someone from our Welcoming Party?'), + ('purse_vouchers_exitbutton', 'Cancel'), + ('furni_prizetrophy6*3_desc', 'Breathtaking bronze'), + ('nav_venue_cafe_gold/0_name', 'Kultakahvila'), + ('furni_fortune_name', 'Crystal Ball'), + ('poster_22_name', 'Butterfly Cabinet (blue)'), + ('object_displayer_link_badge', 'Edit Badge'), + ('furni_sound_set_15_name', 'RnB Grooves 6'), + ('Alert_NoNameSet', 'Check your Habbo name.'), + ('furni_hc_crpt_name', 'Persian Carpet'), + ('error_ok', 'OK->'), + ('game_chess_email', 'Receive game via email'), + ('sound_machine_confirm_save_list', 'Save playlist?'), + ('furni_noob_rug*2_desc', 'Nice and neat sisal rug with blue edging'), + ('queue_set.e1.alert', 'This room is currently available only to Habbos participating to the event.'), + ('furni_rare_icecream*0_desc', 'Virtual cherry rocks!'), + ('furni_arabian_chair_name', 'Green Blossom Chair'), + ('furni_divider_silo3*6_name', 'Blue Area Gate'), + ('furni_scifiport*4_desc', 'Energy beams. No trespassers!'), + ('furni_sofa_silo*4_desc', 'Beige Area Sofa'), + ('furni_one_way_door*4_desc', 'One at a time!'), + ('furni_chair_norja*5_desc', 'Sleek and chic for each cheek'), + ('furni_sound_set_19_desc', 'Shake your body!'), + ('poster_26_desc', 'See that halo gleam!'), + ('furni_doormat_plain*2_desc', 'Available in a variety of colours'), + ('furni_romantique_chair*1_name', 'Rose Quartz Chair'), + ('furni_hc_tv_name', 'Mega TV Set'), + ('pet.hotwords.follow_me', 'heel'), + ('furni_petfood3_desc', 'Fantastic 20% Saving!'), + ('furni_couch_norja*5_name', 'Pink Bench'), + ('furni_table_plasto_round*7_desc', 'Hip plastic furniture'), + ('furni_bed_armas_two_desc', 'King-sized pine comfort'), + ('modtool_days', 'Days'), + ('furni_one_way_door*7_name', 'Green One Way Gate'), + ('furni_table_norja_med*5_name', 'Large Coffee Table Pink'), + ('furni_sand_cstl_wall_name', 'sand_cstl_wall'), + ('nav_modify_doorstatus_givepw', 'Password for the room'), + ('NUF_getting_items_room_tutor', 'Nice room. Reminds me of a chic Parisian cafe in Slough. Open the Catalogue.'), + ('habbo_hand_prev', '<<<'), + ('pet.saying.generic.croco.3', 'Tick tock tick....'), + ('invitation_follow_failed', 'Sorry, your attempt to follow an invitation failed.'), + ('furni_sound_set_12_desc', 'Unusual as Standard'), + ('pet.saying.generic.croco.1', '*Mellow*'), + ('error_text', 'Error occured, press \'OK\' to restart program.\\r\\rPlease report bugs to:\\rwww.habbohotel.com/habbo/en/help/contact/bugs/ \\rSorry for the inconvenience.'), + ('pet.saying.generic.croco.2', 'I\'m so hungry I could eat you!'), + ('furni_divider_silo3*3_desc', 'Form following function'), + ('furni_table_plasto_4leg*2_desc', 'Hip plastic furniture'), + ('int_newmessages', 'New Message(s)'), + ('furni_rare_icecream*3_name', 'Blackcurrant Ice Cream Machine'), + ('bb_header_gameinfo', 'Game info'), + ('furni_scifiport*0_name', 'Red Laser Door'), + ('nav_venue_bb_lobby_beginner_7_name', 'Beginners Battle Ball 8'), + ('tx_history.description.bank_wallie', 'Wallie-card'), + ('nav_venue_hallway_name', 'Hallway'), + ('nav_venue_bb_lobby_amateur_11/0_desc', ''), + ('furni_bed_budget_one*5_desc', 'Prince sized comfort!'), + ('pet.saying.generic.croco.0', 'Rrrr....Grrrrrg....'), + ('nav_popup_go', '>>'), + ('furni_safe_silo*3_name', 'White Safe Minibar'), + ('furni_table_silo_small_name', 'Occasional Table'), + ('poll_confirm_window', 'Leave our poll'), + ('furni_table_norja_med*9_desc', 'For larger gatherings'), + ('furni_divider_nor4*6_desc', 'Habbos, roll out!'), + ('gs_3teams', '3 Teams Game'), + ('wallitem_post.it.limit', 'Only 50 stickies per room are allowed!'), + ('furni_scifidoor*4_desc', 'Protect your pot of gold!'), + ('furni_bed_polyfon_one*9_name', 'Red Single Bed'), + ('furni_soft_sofa_norja*2_desc', 'Black Iced Sofa'), + ('furni_corner_china_desc', 'Firm, fireproof foundation'), + ('hobba_pickup_go', 'Pick Up & Go!'), + ('furni_sporttrack3*2_desc', 'null'), + ('furni_rare_fan*6_name', 'Ochre Powered Fan'), + ('furni_sound_set_3_name', 'Electronic 1'), + ('NUF_mini_meet_people_user_tutor', 'Here you can chat to users directly. Ask a Habbo to be your friend by clicking on their Habbo and the button.\\nIf this is your first time, check your Hand to see a present to decorate your own room with, later.'), + ('furni_pura_mdl2*6_name', 'Blue Pura Module 2'), + ('furni_couch_norja*9_desc', 'Two can perch comfortably'), + ('furni_chair_plasty*9_desc', 'Hip plastic furniture'), + ('game_chess_white', 'White:'), + ('nav_venue_sw_lobby_intermediate_3/0_desc', 'Lumisota sen kuin vain kovenee.'), + ('furni_table_plasto_square*3_desc', 'Hip plastic furniture'), + ('nav_venue_theatredrome/0_desc', 'Perform your latest masterpiece!'), + ('nav_venue_the_den/0_desc', 'Has anyone seen my map?'), + ('furni_sound_set_40_name', 'Rock 4'), + ('remove', 'Remove'), + ('friend_request_decline_all', 'Decline all requests.'), + ('furni_rare_globe_name', 'Snow Globe'), + ('furni_bardesk_polyfon*8_name', 'Yellow Mode Bardesk'), + ('nav_venue_sw_lobby_free_6_name', 'Free Game Lobby'), + ('queue_change', 'Change queue'), + ('reg_parentemail_link_text2', 'Privacy Pledge'), + ('furni_rare_parasol*2_desc', 'Block those rays!'), + ('furni_romantique_pianochair*3_desc', 'null'), + ('reg_parentemail_link_text1', 'See the letter'), + ('sound_machine_list_save', 'Save Playlist'), + ('nav_public_helptext_hd', 'Public Spaces'), + ('furni_chair_plasty*2_desc', 'Hip plastic furniture'), + ('spectator_count', 'spectators %cnt%/%max%'), + ('reg_welcome2', 'Create Your Own Habbo'), + ('wallitem_roomdimmer_desc', 'Superior lighting for your room'), + ('furni_prizetrophy*3_name', 'Classic trophy'), + ('furni_plant_rose_name', 'Cut Roses'), + ('reg_welcome3', 'Now the fun begins! All you need to do is register and you\'re ready to start. It won\'t take long!\\rYou can change everything except your name and date of birth later. Come on!'), + ('furni_noob_table*5_name', 'My first Habbo table'), + ('nav_error_room_closed', 'The room is closed.'), + ('reg_changePassword', 'Change your password'), + ('furni_divider_nor5*3_desc', 'Cool cornering for your crib y0!'), + ('furni_doorC_name', 'Portaloo'), + ('furni_chair_plasty*10_name', 'Plastic Pod Chair'), + ('furni_pura_mdl1*9_name', 'Red Pura Module 1'), + ('furni_rare_stand_name', 'Speaker\'s Corner'), + ('furni_grunge_table_name', 'Grunge Table'), + ('furni_traffic_light*2_name', 'Blue Traffic Light'), + ('pet.saying.angry.croco.2', 'You have displeased me.'), + ('human_trading', 'Trading'), + ('furni_noob_stool*6_desc', 'Unfold me and take the weight off (green)'), + ('pet.saying.angry.croco.1', 'Rawwwr...rrr'), + ('nav_venue_sw_lobby_intermediate_5_name', 'Snow Bombardiers Lobby'), + ('gs_button_leavegame', 'Leave Game'), + ('pet.saying.angry.croco.0', 'Grrrrr...rrr'), + ('furni_s_sound_machine*1_name', 'Sound Machine Grey'), + ('pet.saying.angry.croco.4', 'Buuuuurrr..rrrrr'), + ('furni_chair_plasto*7_desc', 'Hip plastic furniture'), + ('pet.saying.angry.croco.3', 'Rowrrrr...rrrr'), + ('furni_soft_sofa_norja*9_desc', 'Red Iced Sofa'), + ('nav_venue_skylight_lobby_name', 'Skylight Lobby'), + ('furni_bed_polyfon_one*6_desc', 'Blue Mode Single Bed'), + ('furni_pillow*8_desc', 'Puffy, soft and huge'), + ('furni_hc_rntgn_name', 'X-Ray Divider'), + ('furni_table_silo_med*5_desc', 'Pink Area Coffee Table'), + ('furni_gothic_stool*2_desc', 'Be seated please..'), + ('furni_typingmachine_desc', 'Write that bestseller'), + ('furni_fridge_desc', 'Keep cool with a chilled snack or drink'), + ('nav_venue_cunning_fox_gamehall/4_desc', 'Get a hand like a foot? Keep a straight face and bluff it out'), + ('doorbell_rings', 'Rings the doorbell - Open the door?'), + ('furni_divider_silo1*9_desc', 'Red Area Small Table'), + ('nav_venue_bb_lobby_intermediate_7/0_desc', ''), + ('furni_prize1_name', 'Gold Trophy'), + ('poster_54_name', 'Hockey Stick'), + ('furni_sound_set_47_name', 'Club 2'), + ('furni_prizetrophy3*1_name', 'Globe trophy'), + ('purse_head2', 'ACCOUNT TRANSACTIONS'), + ('furni_soft_sofa_norja*5_name', 'Pink Iced Sofa'), + ('furni_prizetrophy9*1_desc', 'Glittery gold'), + ('buddyremove_next', 'Next >'), + ('reg_girl', 'Girl'), + ('furni_bed_budget_one*1_name', 'Aqua Pura Bed'), + ('NUF_visiting_rooms_roomlist_go', 'Click \'Go\' to go to a room.'), + ('poster_506_desc', 'To \'Finnish\' your decor...'), + ('furni_toy1_name', 'Rubber Ball'), + ('furni_sound_set_7_desc', 'Sound effects for Furni'), + ('sw_fieldname_6', 'Riverbank Siege'), + ('sw_fieldname_5', 'Polar Labyrinth'), + ('furni_bed_polyfon*4_desc', 'Beige Mode Double Bed'), + ('furni_pillow*4_name', 'Gold Feather Pillow'), + ('alert_duplicatesession', 'You are already logged in on another hotel! Log out before trying again.'), + ('sw_fieldname_7', 'Skull Falls Assault'), + ('sound_machine_alert_song_not_ready', 'Can\'t save song! Song not ready yet.'), + ('nav_venue_bb_lobby_beginner_5/0_desc', ''), + ('nav_venue_bb_lobby_tournament_4/0_desc', ''), + ('pet.saying.play.dog.1', 'woofWOOFwoofWOOFwoof'), + ('pet.saying.play.dog.0', 'rrr.. WOOF .rrr..'), + ('furni_cn_lamp_name', 'Lantern'), + ('furni_arabian_rug_name', 'Berber Kilim Rug'), + ('NUF_groups_hotelview_tutor', 'You have now opened the Group tutorial in the website window. Special!'), + ('gs_error_start_9', 'Team sizes can only differ by one player. This Game cannot start!'), + ('furni_divider_poly3*7_desc', 'Green Mode Bardesk Gate'), + ('furni_sofachair_silo*4_desc', 'Beige Area Armchair'), + ('poster_58_desc', 'whish you luck'), + ('furni_chair_basic*2_desc', 'It\'s a cracking design!'), + ('poster_516_name', 'The English flag'), + ('nav_venue_sw_lobby_tournament_2/0_desc', ''), + ('furni_gothic_carpet_name', 'Cobbled Path'), + ('sw_title', 'Snow Storm'), + ('furni_doormat_plain*5_name', 'Doormat'), + ('furni_pura_mdl4*4_desc', 'Any way you like it!'), + ('furni_sound_machine*1_name', 'Sound Machine'), + ('furni_sofa_silo*7_name', 'Green Area Sofa'), + ('nav_venue_sw_lobby_tournament_4_name', 'Tournament Lobby'), + ('gs_title_gamecreation', 'Game creation'), + ('furni_couch_norja*2_desc', 'Two can perch comfortably'), + ('furni_prizetrophy5_desc', 'Palkinto'), + ('furni_divider_nor3*9_desc', 'Red Iced gate'), + ('furni_present_gen_name', 'Gift'), + ('furni_prizetrophy7*3_name', 'Bronze Habbo trophy'), + ('alert_reg_parent_email', 'The email address you provided is unacceptable.'), + ('furni_bed_polyfon_girl_name', 'Double Bed'), + ('furni_rare_fountain_name', 'Bird Bath (red)'), + ('furni_pura_mdl3*3_name', 'Black Pura Module 3'), + ('furni_plant_pineapple_name', 'Pineapple Plant'), + ('furni_divider_nor2*8_name', 'Yellow Iced bar desk'), + ('messenger', 'Messenger'), + ('nav_venue_bb_arena_0_name', 'Battle Ball kaikille'), + ('sw_fieldname_2', 'Algid River'), + ('furni_bed_silo_two_desc', 'Plain and simple x2'), + ('sw_fieldname_1', 'Arctic Island'), + ('furni_pillow*1_desc', 'Puffy, soft and huge'), + ('sw_fieldname_4', 'Frosty Forest'), + ('sw_fieldname_3', 'Glacial Fort'), + ('furni_bar_basic_desc', 'A pura series 300 minibar'), + ('tutorial_welcome_M', 'Hi! I am your guide to Habbo Hotel. Please pick a topic to start.'), + ('tutorial_welcome_F', 'Hi there! I\'m your guide to Habbo Hotel. What would you like to learn today?'), + ('Alert_NoNameSetForLogo', 'Please give a name to your logo'), + ('furni_glass_table*5_name', 'Glass table'), + ('group_owner', 'Owner'), + ('console_target_friend_list_full', 'This user\'s friend list is full'), + ('furni_romantique_smalltabl*2_name', 'Lime Tray Table'), + ('ph_keys_spacebar', 'Spacebar'), + ('furni_noob_chair*3_name', 'My first Habbo chair'), + ('NUF_meeting_people_roomlist_publicTab', 'Click the Public Spaces tab to see the list of public rooms. To go to the room click the \'Go\' button.'), + ('furni_bed_polyfon*7_name', 'Green Mode Double Bed'), + ('furni_jukebox_ptv*1_name', 'Jukebox Pacha TV'), + ('poster_513_desc', 'Aussies rule!'), + ('poster_51_desc', '2 points for every basket'), + ('furni_toy1*2_name', 'Rubber Ball'), + ('furni_bartable_armas_name', 'Bardesk'), + ('nav_venue_sw_lobby_amateur_0/0_desc', ''), + ('NUF_mini_use_console_read_tutor', 'The Habbo Console lets you message with people you have added to your friends list.'), + ('nav_venue_bb_lobby_beginner_12_name', 'Beginners Battle Ball 13'), + ('poster_2002_name', 'Urho Kaleva Kekkonen'), + ('furni_sound_set_44_desc', 'Haunted Dimension'), + ('pet.saying.beg.dog.1', 'Oouh..oouh..snuh..ooo'), + ('furni_sporttrack2*1_name', 'Sport corner tartan'), + ('pet.saying.beg.dog.0', 'Oooo...Ouuu...oo...OUUU'), + ('furni_solarium_norja*5_desc', 'Rejuvenate your pixels!'), + ('pet.saying.beg.dog.2', '*whimpers *'), + ('reg_pledgelink', 'Hotel rules'), + ('habboclub_price1.days', '30'), + ('furni_glass_shelf_desc', 'Translucent beauty'), + ('furni_sofachair_polyfon*3_name', 'White Armchair'), + ('reg_verification_info', 'You must know the correct birthday and password before you\'re allowed to make these changes.'), + ('furni_carpet_soft*5_desc', 'Soft Wool Rug'), + ('furni_grunge_mattress_name', 'Grunge Mattress'), + ('furni_bed_polyfon_one_name', 'Single Bed'), + ('furni_sound_machine_pro_name', 'Sound Machine Pro'), + ('furni_chair_china_desc', 'The elegant beauty of tradition'), + ('furni_rare_icecream*7_desc', 'Virtual chocolate rocks!'), + ('furni_table_silo_med*8_name', 'Yellow Coffee Table'), + ('club_gift.message', 'Happy Habbo Club! Love Callie :)'), + ('furni_sw_raven_desc', 'My name is Otter'), + ('furni_noob_table*2_desc', 'Lightweight, practical and dark blue'), + ('furni_soft_sofachair_norja*3_desc', 'Soft Iced sofachair'), + ('sound_machine_confirm_delete', 'Delete song?'), + ('furni_plant_fruittree_name', 'Fruit Tree'), + ('nav_venue_bb_lobby_intermediate_1/0_desc', ''), + ('furni_heartsofa_name', 'Heart Sofa'), + ('furni_bed_budget_one*8_name', 'Yellow Pura Bed'), + ('NUF_getting_room', 'Making your own room'), + ('furni_rare_elephant_statue*2_name', 'Bronze Elephant'), + ('nav_venue_ballroom/0_desc', 'Come play ball!'), + ('nav_venue_sw_lobby_amateur_1_name', 'Snow Slingers Lobby'), + ('console_lasttime', 'Last Time'), + ('furni_md_sofa_desc', 'A decent recliner'), + ('furni_wooden_screen*6_name', 'Blue Oriental Screen'), + ('partner_registration_text', 'Click the link to finish your registration. When you have finished the registration click OK to continue to the hotel.'), + ('furni_sound_set_62_desc', 'Music of the Arabian night!'), + ('furni_arabian_divdr_name', 'Soft wooden screen'), + ('furni_tree1_desc', 'Dead christmas tree'), + ('furni_grand_piano*3_name', 'Pink Grand Piano'), + ('console_select_requests', 'Following users have asked to be your friend. Please accept or decline.'), + ('furni_divider_nor4*2_name', 'Black Iced Auto Shutter'), + ('furni_glass_chair*3_name', 'Glass chair'), + ('reg_passwordContainsNoNumber', 'Password must contain at least one number'), + ('buddyremove_invert', 'Invert Selection'), + ('furni_val_teddy*5_desc', 'The yellow bear of understanding'), + ('furni_sound_set_51_name', 'Club 6'), + ('poster_1_desc', 'The Noble and Silver Show'), + ('roomevent_create_name', 'Type the name of your event'), + ('Alert_unacceptableName', 'Sorry, that name is unacceptable to the Hotel Management'), + ('NUF_getting_room_go_tutor', 'Your room is now ready. Let\'s go see! I hope you have a bed...'), + ('poster_520_name', 'The Rainbow Flag'), + ('password', 'Password:'), + ('furni_bed_budget*8_name', 'Yellow Pura Double Bed'), + ('gs_header_gamelist', 'Game List'), + ('furni_chair_plasty_desc', 'Hip plastic furniture'), + ('url_purse_subscribe', 'http://%predefined%//credits?'), + ('furni_table_plasto_bigsquare*15_desc', 'Hip plastic furniture'), + ('furni_glass_stool*6_desc', 'Translucent beauty'), + ('error_report', 'Error Report'), + ('summer_chair_6_desc', 'Get decked'), + ('furni_chair_basic*5_name', 'chair_basic'), + ('room_remove_specs', 'Sorry! Now it\'s someone else\'s turn to watch this event.'), + ('furni_bunny_desc', 'Yours to cuddle up to'), + ('invitation_exists', 'You have already invited members of the Welcoming Party to your room.'), + ('purse_vouchers_furni_success', 'Voucher was successfully redeemed. You have been given the following furniture:'), + ('nav_rooms_popular', 'Popular rooms'), + ('nav_cancel', 'Cancel'), + ('alert_cross_domain_download', 'Cross domain content download prevented'), + ('furni_table_plasto_4leg*16_desc', 'Hip plastic furniture'), + ('url_pets', 'http://%predefined%//hotel/pets'), + ('furni_bardeskcorner_polyfon*9_desc', 'Tuck it away'), + ('gs_button_cancel', 'Cancel'), + ('furni_barchair_silo*7_name', 'Green Bar Stool'), + ('catalog_credits', 'You have \\x Credits in your purse.'), + ('furni_divider_nor3_name', 'Door (Lockable)'), + ('nav_modify_name', 'Name of the room'), + ('nav_venue_bb_lobby_amateur_7_name', 'Gevorderden Battle Ball 8'), + ('nav_venue_club_massiva/0_desc', 'Rest your dancing feet!'), + ('furni_gothrailing_desc', 'The dark side of Habbo'), + ('queue_set.na.alert', 'This Room is for Staff only.'), + ('nav_venue_bb_lobby_tournament_8_name', 'Competitie Battle Ball 9'), + ('furni_sound_set_29_name', 'Dance 2'), + ('console_msgs', 'msgs'), + ('furni_noob_lamp*6_name', 'My first Habbo lamp'), + ('furni_marquee*6_desc', 'It\'s both door and a shade!'), + ('furni_chair_plasto*16_desc', 'Hip plastic furniture'), + ('furni_chair_basic*9_desc', 'It\'s a cracking design!'), + ('summer_chair_2_name', 'Pink Deck Chair'), + ('alert_too_much_furnitures', 'Furni limit for room is exceeded. Not all furnitures are shown. Please remove some.'), + ('furni_pura_mdl5*4_name', 'White Pura Module 5'), + ('bus.full_msg', 'The FRANK bus is full at the moment, please come back later or visit the FRANK page below for more information.'), + ('furni_sound_set_22_name', 'SFX 3'), + ('furni_gothic_sofa*3_desc', 'The dark side of Habbo'), + ('furni_md_limukaappi_name', 'Habbo Cola Machine'), + ('poster_19_desc', 'Trying to get in or out?'), + ('gs_2min', '2min'), + ('poster_8_desc', 'Habbos come in all colours'), + ('furni_pillar*6_desc', 'Ancient and stately'), + ('furni_carpet_standard*3_desc', 'Available in a variety of colours'), + ('purse_vouchers_info', 'When you buy Habbo Credits with a mobile phone, you will receive a special voucher code. Enter the code in the box above, click \'Get Credits!\' and they\'ll be added to your purse.'), + ('furni_valeduck_name', 'Valentine\'s Duck'), + ('Alert_MessageFromAdmin', 'Message from Hotel Management:'), + ('furni_present_gen1_desc', 'What\'s inside?'), + ('reg_tutorial_txt', ''), + ('furni_tile_stella_name', 'Star Tile'), + ('furni_shelves_norja*4_name', 'Urban Iced Bookcase'), + ('transaction_system_creditcards_is', 'Creditcard'), + ('furni_shelves_polyfon_desc', 'For the arty pad'), + ('furni_tv_luxus_name', 'Digital TV'), + ('recycler_status_window_title', 'Recycling Status'), + ('furni_sleepingbag*6_name', 'Purple Sleeping Bag'), + ('gs_button_shrink', 'Minimize Window'), + ('furni_wcandleset_desc', 'Simple but stylish'), + ('furni_sleepingbag*3_desc', 'Ultimate coziness'), + ('object_displayer_show_actions', 'Show actions'), + ('hubu_t5_1', 'Lisetoa huumeista'), + ('song_disk_text_template', '%name%'), + ('hubu_t5_2', 'Huumeista-esite'), + ('queue_other_1', 'Habbo Live queue status'), + ('poster_33_name', 'Save the Panda'), + ('hubu_t5_3', 'Yleistietoa EOPH ry:st--------------'), + ('queue_other_2', 'Room queue status'), + ('furni_hcsohva_name', 'Throne Sofa'), + ('furni_sound_set_26_desc', 'Bollywood Beats!'), + ('furni_christmas_poop_name', 'Reindeer Droppings'), + ('furni_rare_dragonlamp*4_name', 'Serpent of Doom'), + ('nav_venue_bb_lobby_amateur_7/0_desc', ''), + ('purse_value', 'VALUE'), + ('furni_glass_sofa*5_desc', 'Translucent beauty'), + ('nav_venue_bb_lobby_tournament_15/0_desc', ''), + ('furni_glass_stool*2_desc', 'Translucent beauty'), + ('pet.saying.play.cat.1', 'Purrrr.. oo..Purrr'), + ('furni_pura_mdl4*7_name', 'Green Pura Module 4'), + ('nav_venue_cafe_ole/0_desc', 'Relax with friends over one of Marias specialty coffees'), + ('pet.saying.play.cat.0', 'Mew..MEOW..meow'), + ('furni_pumpkin_name', 'Pumpkin Lamp'), + ('furni_summer_chair*7_desc', 'Reserved!'), + ('ph_tickets_txt', 'Tickets can be used for BattleBall: Rebound!, SnowStorm, the Lido Diving and Wobble Squabble games. Tickets never expire.\\r\\rCurrently you have \\x1 ticket(s).'), + ('roomatic_onemoment', 'Please wait, we are going to your room...'), + ('furni_small_table_armas_name', 'Occasional Table'), + ('furni_table_polyfon_med_desc', 'For larger gatherings'), + ('nav_venue_bb_lobby_expert_3/0_desc', ''), + ('furni_chair_silo*6_desc', 'Blue Silo Dining Chair'), + ('furni_exe_globe_name', 'Power Globe'), + ('furni_bed_budget_one_name', 'bed_budget_one'), + ('furni_divider_silo1*2_desc', 'Neat and natty'), + ('nav_venue_bb_lobby_intermediate_0_name', 'Intermediate'), + ('furni_sofa_polyfon*9_desc', 'Comfort for stylish couples'), + ('furni_noob_lamp*3_desc', 'Get the light right where you want it (aubergine)'), + ('nav_showfull', 'Show Full Rooms'), + ('furni_divider_nor3*2_desc', 'Black Iced gate'), + ('reg_note_title', 'Warning!'), + ('hubu_answ_count', 'Replies'), + ('nav_recommended_rooms', 'Recommended Rooms'), + ('transaction_system_bank_nordea', 'Nordea'), + ('furni_sound_set_37_desc', ''), + ('poster_2006_desc', 'He is the magic Habbo'), + ('sw_link_gameRules_url', 'http://%predefined%//groups/56553/id'), + ('wave', 'Wave'), + ('furni_hc_djset_desc', 'Very old skool scratch\'n\'spin'), + ('furni_plant_maze_name', 'Maze Shrubbery'), + ('furni_scifirocket*3_name', 'Endor Smoke Machine'), + ('furni_val_teddy*1_name', 'Grey Share Bear'), + ('recycler_ready_outcome', 'Recycling reward: %outcome%'), + ('poster_4_desc', 'Fake of course!'), + ('poster_62_desc', 'We can\'t bear to lose them!'), + ('furni_glass_stool*9_desc', 'Translucent beauty'), + ('furni_goodie1_name', 'Marzipan Man'), + ('nav_modify_choosecategory', 'Choose a category for your room'), + ('object_displayer_link_home', 'User\'s home page'), + ('nav_venue_sw_lobby_tournament_8/0_desc', ''), + ('furni_xmasduck_name', 'Christmas Rubber Duck'), + ('help_txt_2', 'Password Reset'), + ('pet_mood_2', 'Blue'), + ('furni_queue_tile1*4_desc', 'The power of movement'), + ('help_txt_1', 'How do I get Credits?'), + ('pet_mood_3', 'Contented'), + ('nav_venue_bb_lobby_tournament_1_name', 'Competitie Battle Ball 2'), + ('furni_rare_daffodil_rug_name', 'Petal Patch'), + ('help_txt_4', 'The Habbo Way'), + ('pet_mood_0', 'Miserable'), + ('help_txt_3', 'Help with Habbo Hotel'), + ('pet_mood_1', 'Depressed'), + ('pet_mood_6', 'Ecstatic'), + ('furni_bed_budget*4_name', 'White Pura Double Bed'), + ('nav_venue_bb_lobby_amateur_0_name', 'Amateur'), + ('furni_sofachair_polyfon*7_desc', 'Green Mode Armchair'), + ('yes', 'Yes'), + ('pet_mood_4', 'Happy'), + ('pet_mood_5', 'Joyful'), + ('furni_sound_set_30_desc', 'Moments in love'), + ('furni_prizetrophy2*1_desc', 'Glittery gold'), + ('furni_wooden_screen*3_desc', 'Add an exotic touch to your room'), + ('transaction_system_bank_op', 'Osuuspankki'), + ('help_txt_6', 'Contact Us'), + ('help_txt_5', 'Safety Tips'), + ('furni_bardeskcorner_polyfon*2_desc', 'Black Mode Bardesk Corner'), + ('poster_15_desc', 'Marvellous mountains'), + ('room_areYouSurePlace', 'Warning! If you put something down in this room you will not be able to pick it up again.'), + ('nav_venue_bouncer_room_3_name', 'Semi-profs Battle Ball Arena'), + ('furni_chair_plasto*12_name', 'Chair'), + ('furni_gothic_chair*6_name', 'Gothic Chair Blue'), + ('furni_sofa_polyfon*2_desc', 'Black Mode Sofa'), + ('modtool_alertuser', 'Alert User'), + ('furni_toilet_desc', 'Loo Seat'), + ('furni_plant_cruddy_name', 'Aloe Vera'), + ('nav_venue_space_cafe/0_desc', 'In this space noone can see you ask for a soda!'), + ('nav_incorrectflatpw', 'Incorrect, try again.'), + ('furni_chair_plasto*13_desc', 'Hip plastic furniture'), + ('login_firstTimeHere', 'First time here?'), + ('furni_skullcandle_desc', 'Alas poor Yorrick...'), + ('NUF_mini_endtopic_step1_tutor', 'Well that\'s all from me. If you have any problems just click the little blue question mark to restart the tutorial and find our FAQs.\\nTo start exploring by yourself, click Close guide from the upper left corner.'), + ('furni_divider_poly3*3_name', 'White Hatch'), + ('help_callforhelp', 'Get Live Help'), + ('furni_rare_fountain*2_name', 'Bird Bath (green)'), + ('nav_venue_rooftop_name', 'Rooftop Cafe'), + ('furni_scifiport*7_name', 'Turquoise Sci-Fi Port'), + ('purse_back_to_credits', 'Back To Purse'), + ('room_ban', 'Kick & ban'), + ('furni_pura_mdl5*1_name', 'Aqua Pura Module 5'), + ('furni_val_teddy*4_name', 'Brown Share Bear'), + ('poster_40_name', 'Bonnie Blonde'), + ('NUF_getting_room_navigator_tutor', 'You want to click it real good. The \'Own room(s)\' tab I mean. Don\'t click yourself. It\'s unhygienic.'), + ('summer_chair_3_desc', 'Relax and enjoy the sun'), + ('furni_wooden_screen*2_name', 'RosewoodScreen'), + ('nav_venue_sun_terrace_name', 'Sun Terrace'), + ('furni_rare_fan*3_desc', 'Keeps the heat off St George!'), + ('nav_venue_sport_name', 'Power Gym'), + ('furni_toilet_red_desc', 'Loo Seat'), + ('retype_password', 'Retype Password:'), + ('furni_chair_basic*6_desc', 'It\'s a cracking design!'), + ('console_friends_helptext', 'This screen shows a list of all your Habbo Friends. It tells you where they are in the hotel, or, if they\'re not checked in, when their last visit was.'), + ('NUF_getting_items_room_', 'This is the Catalogue icon. Click to open it.'), + ('furni_grunge_barrel_desc', 'Beacon of light!'), + ('furni_soft_sofachair_norja*6_name', 'Blue Iced Sofachair'), + ('int_howtoget', 'How To get?'), + ('furni_sound_set_23_desc', 'Don\'t be afraid of the dark'), + ('nav_ok', 'OK'), + ('furni_sofachair_polyfon*6_name', 'Blue Mode Armchair'), + ('nav_venue_theatredrome_valentine_name', 'Theatredrome Valentine'), + ('furni_sofachair_polyfon_desc', 'Loft-style comfort'), + ('poster_83_name', 'Pöllö huhuilee'), + ('furni_soft_sofachair_norja*2_name', 'Black Iced Sofachair'), + ('roomdimmer_furni_limit', 'You can only have one roomdimmer per room'), + ('recycler_progress_timeleft', 'Time left: %hours% h and %minutes% min'), + ('furni_chair_plasto*3_name', 'Chair'), + ('NUF_getting_room_hotelview_tutor', 'Now you will learn how to make your own room. First go to the Guest Rooms area of the Navigator.'), + ('roomevent_create', 'Create'), + ('reg_year', 'Year'), + ('furni_divider_poly3_name', 'Hatch (Lockable)'), + ('furni_divider_nor1*7_name', 'Rural Iced Corner'), + ('furni_rare_beehive_bulb_name', 'Blue Amber Lamp'), + ('furni_waterbowl*2_name', 'Green Water Bowl'), + ('NUF_getting_room_room_hand', 'Open your hand!'), + ('furni_carpet_standard*6_desc', 'Available in a variety of colours'), + ('furni_CF_5_coin_silver_name', 'Silver Coin'), + ('furni_shelves_norja*7_name', 'Rural Iced Bookcase'), + ('opening_hours_text_disabled', 'The Hotel is shutting down really soon. To avoid confusion, purchasing of furniture, Habbo Club and game tickets have been disabled, as well as playing games and furniture trading. Try again tomorrow when the hotel is open!'), + ('nav_venue_bb_lobby_5_name', 'Battle Ball Kaikille'), + ('game_bs_congrat', 'Congratulations!'), + ('furni_arabian_tray2_name', 'Candle Tray'), + ('furni_giftflowers_desc', 'Guaranteed to stay fresh'), + ('club_button_1_period', 'Buy 1 >>>'), + ('furni_bed_polyfon_one*2_desc', 'Black Mode Single Bed'), + ('poster_47_name', 'Small silver star'), + ('furni_divider_nor3*5_desc', 'Pink Iced gate'), + ('furni_sofachair_polyfon_girl_desc', 'Think pink'), + ('furni_pura_mdl5*8_name', 'Yellow Pura Module 5'), + ('furni_hal_cauldron_desc', 'Eye of Habbo and toe of Mod!'), + ('poster_1006_name', 'Hoot Poster'), + ('furni_carpet_valentine_name', 'Red carpet'), + ('furni_floortile_name', 'Floor Tile'), + ('furni_divider_nor1*4_name', 'Urban Iced Corner'), + ('furni_bardeskcorner_polyfon*12_desc', 'Tuck it away'), + ('furni_table_plasto_bigsquare*3_desc', 'Hip plastic furniture'), + ('furni_traffic_light*6_desc', 'Chill and wait your turn!'), + ('club_general_prepaid', 'Prepaid Months'), + ('wallitem_val_heart_desc', 'Heartbroken... without your love!'), + ('furni_pura_mdl3*7_desc', 'Any way you like it!'), + ('furni_sound_set_58_name', 'RnB Grooves 4'), + ('furni_china_shelve_name', 'Chinese Lacquer Bookshelf'), + ('furni_divider_silo1*5_desc', 'Pink Area Corner Shelf'), + ('nav_venue_sw_lobby_tournament_desc', 'For stand-alone Tournaments.'), + ('furni_divider_silo2_name', 'Screen'), + ('furni_plant_mazegate_name', 'Maze Shrubbery Gate'), + ('poster_509_desc', 'The flag of Jamaica'), + ('furni_soft_sofachair_norja*9_name', 'Red Iced Sofachair'), + ('nav_venue_sw_arena_intermediate_name(0)', 'Playing intermediate game'), + ('furni_barchair_silo*4_name', 'Beige Bar Stool'), + ('furni_scifidoor*7_name', 'Aqua Spaceship Door'), + ('furni_CF_10_coin_gold_desc', 'Worth 10 Credits'), + ('furni_glass_sofa*8_desc', 'Translucent beauty'), + ('jukebox_reset', 'Reset Jukebox'), + ('nav_venue_sw_lobby_intermediate_desc', 'For the accomplished Snow Stormers.'), + ('furni_spotlight_desc', 'For the star of the show'), + ('furni_couch_norja_name', 'Bench'), + ('furni_romantique_divan*3_name', 'Turquoise Romantique Divan'), + ('furni_sleepingbag*7_desc', 'Ultimate coziness'), + ('roomatic_pws2', '24 hour access:'), + ('wallitem_jp_sheet1_desc', 'jp_sheet1'), + ('furni_table_silo_med*2_desc', 'Wipe clean and unobtrusive'), + ('furni_glass_table_desc', 'Translucent beauty'), + ('poster_502_desc', 'The US flag'), + ('pet_enrg_10', 'Mad'), + ('gs_scores_team_2', 'Blue Team:'), + ('pet_enrg_11', 'Nutcase'), + ('gs_scores_team_1', 'Red Team:'), + ('furni_cn_sofa_desc', 'Seating,Oriental style!'), + ('gs_scores_team_4', 'Green Team:'), + ('gs_scores_team_3', 'Yellow Team:'), + ('furni_table_silo_med*9_desc', 'Red Area Coffee Table'), + ('furni_hc_machine_name', 'Weird Science Machine'), + ('callhelp_writeyour', 'Write your question about Habbo Hotel here:'), + ('furni_table_silo_small*5_name', 'Pink Area Occasional Table'), + ('nav_addtofavourites', 'Add to favourites'), + ('furni_table_plasto_round*15_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_tournament_4_name', 'Competitie Battle Ball 5'), + ('furni_birdie_name', 'Pop-up Egg'), + ('furni_table_plasto_bigsquare_desc', 'Hip plastic furniture'), + ('furni_sound_set_33_desc', 'Guitar solo set'), + ('furni_romantique_divider*3_desc', 'Keeping things separated'), + ('furni_bed_budget*1_name', 'Aqua Pura Double Bed'), + ('furni_rare_beehive_bulb*2_desc', 'A honey-hued glow'), + ('furni_theatre_seat_desc', 'For Lazy boys and girls!'), + ('furni_hc_lmpst_desc', 'Somber and atmospheric'), + ('furni_divider_nor5*6_name', 'Blue Iced Angle'), + ('furni_summer_pool*2_desc', 'Fancy a dip?'), + ('poster_12_desc', 'a beautiful sunset'), + ('furni_carpet_polar*2_desc', 'Snuggle up on a Funky bear rug...'), + ('furni_md_rug_desc', 'Bubbles under your steps'), + ('Alert_InviteFriend', 'Invite your friends'), + ('nav_venue_bb_lobby_intermediate_4_name', 'Semi-profs Battle Ball 5'), + ('furni_hockey_score_desc', '...for keeping your score'), + ('furni_gothic_chair*3_name', 'Red Gothic Chair'), + ('wallitem_sw_stone_name', 'sw_stone'), + ('furni_pillow*7_name', 'Purple Velvet Pillow'), + ('nav_popup_header', 'Recommended rooms'), + ('nav_venue_sw_lobby_beginner_0_name', 'Snow Rookies Lobby'), + ('furni_table_norja_med*5_desc', 'For larger gatherings'), + ('furni_red_tv_name', 'Portable TV'), + ('reg_promise', '*Any personal information you supply will only be used by Habbo Ltd in accordance with the Habbo Pledge and will not be shared with third parties.'), + ('room_badge_choose', 'Modify Badge:'), + ('furni_table_plasto_square*15_desc', 'Hip plastic furniture'), + ('furni_sound_set_48_desc', 'Sweet party beat'), + ('nav_venue_ballroom_name', 'Ballroom'), + ('pet.hotwords.bad', 'bad'), + ('poster_55_desc', 'Save our trees!'), + ('furni_glass_chair_name', 'Glass chair'), + ('furni_prizetrophy5*2_desc', 'Shiny silver'), + ('furni_divider_poly3*4_desc', 'Beige Mode Bardesk Gate'), + ('tutorial_console_sample_message', 'Hello! This is a message sent to you from the Habbo Tutorial. To close and delete this message click delete. Sadly you cannot reply to this message as it is automated. Normally you can reply to messages by clicking the reply button.'), + ('furni_s_sound_machine*5_name', 'Sound Machine Brown'), + ('furni_divider_nor4*9_desc', 'Habbos, roll out!'); +INSERT INTO `external_texts` (`entry`, `text`) VALUES + ('furni_pura_mdl3*4_desc', 'Any way you like it!'), + ('NUF_getting_room_room_tutor', 'Tada! Nice room, although it\'s a little empty. Hey! Let\'s furnish it with something./nOpen your hand to check what you have, (if you have done this step before then you won\'t receive anything).'), + ('furni_fortune_desc', 'Gaze into the future'), + ('furni_soft_sofa_norja_name', 'iced sofa'), + ('furni_pura_mdl1*2_desc', 'Any way you like it!'), + ('nav_venue_sw_lobby_free_6/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('furni_divider_nor3*8_name', 'Yellow Iced gate'), + ('gs_title_finalscores', 'Final Standings:'), + ('gs_error_10', 'The hotel is closed or about to close. We look forward to welcoming you back tomorrow at (ADD LOCAL OPENING TIME).'), + ('furni_plant_bonsai_name', 'Bonsai Tree'), + ('furni_jukebox*1_name', 'Jukebox'), + ('room_loading', 'Loading room...'), + ('furni_hc_crpt_desc', 'Ultimate craftsmanship'), + ('furni_rare_hammock_desc', 'Eco bed'), + ('NUF_mini_use_console', 'Learn about messaging'), + ('furni_romantique_chair*1_desc', 'Elegant seating for elegant Habbos'), + ('transaction_system_bank_digiraha', 'Digiraha'), + ('NUH_messenger', 'Open your Console here - you might have messages or friend requests waiting.'), + ('furni_arabian_chair_desc', 'Exotic, soft seating'), + ('furni_noob_chair*6_name', 'My first Habbo chair'), + ('poster_510_desc', 'The flag of Italy'), + ('furni_carpet_standard*a_desc', 'Available in a variety of colours'), + ('queue_set.c.info', 'There are %c% Habbo Club member(s) in front of you. Be patient :)'), + ('furni_scifiport*4_name', 'Pink Sci-Fi Port'), + ('furni_sound_set_44_name', 'Graveyard Portal'), + ('furni_pura_mdl4*1_desc', 'Any way you like it!'), + ('furni_divider_silo3*6_desc', 'Blue Area Gate'), + ('furni_sound_machine*4_name', 'Blue Traxmachine'), + ('send_invitation_header', 'Get a warm welcome'), + ('game_TicTacToe', 'Boter kaas en eieren'), + ('nav_venue_sw_lobby_tournament_1_name', 'Tournament Lobby'), + ('furni_rare_fan*2_name', 'Green Powered Fan'), + ('furni_doormat_plain*2_name', 'Doormat'), + ('furni_table_plasto_square*7_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_intermediate_8/0_desc', ''), + ('furni_noob_table*6_desc', 'Lightweight, practical and green'), + ('win_callforhelp', 'Alert a Moderator'), + ('furni_prizetrophy8*1_desc', 'Glittery gold'), + ('furni_chair_norja*5_name', 'Pink Chair'), + ('furni_hc_tv_desc', 'Forget plasma, go HC!'), + ('furni_divider_arm1_name', 'Corner plinth'), + ('furni_table_plasto_round*7_name', 'Round Dining Table'), + ('furni_petfood3_name', 'Cabbage Mega Multipack'), + ('furni_carpet_standard*9_name', 'Floor Rug'), + ('opening_hours_title', 'Hotel Maintenance'), + ('console_noemail', 'Sorry,'), + ('furni_couch_norja*8_name', 'Yellow Bench'), + ('furni_s_sound_machine*1_desc', 'Sound Machine Grey Desc'), + ('furni_noob_stool*6_name', 'My first Habbo stool'), + ('purse_event', 'ACTIVITY'), + ('reg_readterms_alert', 'You have to read the Terms and Conditions\\r(scroll to the bottom of the text).'), + ('pet.hotwords.beg', 'beg'), + ('furni_jp_drawer_name', 'Japanese Drawer'), + ('gs_state_started', 'This Game has already started...'), + ('furni_sound_set_11_name', 'Dance 4'), + ('furni_divider_nor2*4_name', 'Urban Iced Bar'), + ('queue_set.e2.info', 'There are %e2% Habbos in front of you in the queue.'), + ('furni_bath_name', 'Bubble Bath'), + ('furni_rare_icecream*3_desc', 'Virtual blackcurrant rocks!'), + ('nav_modify_nameoftheroom', 'Name Of The Room'), + ('furni_scifiport*1_desc', 'Energy beams. No trespassers!'), + ('nav_venue_bb_lobby_amateur_12/0_desc', ''), + ('furni_table_silo_small*8_name', 'Yellow Occasional Table'), + ('furni_divider_silo3*3_name', 'White Area Gate'), + ('nav_venue_sw_lobby_amateur_7/0_desc', 'Astetta rankempaa lumisotaa.'), + ('reply', 'Reply'), + ('furni_toilet_yell_desc', 'Loo Seat'), + ('hobba_alert', 'Moderator Alert'), + ('You can play a bunch of exciting games, visit your friends\' rooms or even make your own place and decorate it to your heart\'s delight.', ''), + ('pet.saying.eat.croco.4', '*Buurrrrp*'), + ('furni_tree5_desc', 'Any presents under it yet?'), + ('pet.saying.eat.croco.2', '*Chomp chomp*'), + ('pet.saying.eat.croco.3', 'Mmmm mmmmm....'), + ('furni_divider_poly3*7_name', 'Green Mode Bardesk Gate'), + ('pet.saying.eat.croco.0', 'Mmmm yum yum'), + ('pet.saying.eat.croco.1', 'Ruff ruff ruff'), + ('furni_scifidoor*4_name', 'Emerald Spaceship Door'), + ('furni_edice_name', 'Holo-dice'), + ('furni_divider_nor4*6_name', 'Blue Iced Auto Shutter'), + ('furni_safe_silo*3_desc', 'Totally shatter-proof!'), + ('furni_table_silo_small_desc', 'For those random moments'), + ('gs_header_page', 'Page'), + ('furni_sporttrack3*2_name', 'Sport goal asphalt'), + ('furni_pura_mdl2*6_desc', 'Any way you like it!'), + ('furni_hcamme_name', 'Tubmaster'), + ('furni_carpet_soft*2_desc', 'Soft Wool Rug'), + ('furni_sound_set_12_name', 'Habbo Sounds 2'), + ('forgottenpw_done', 'If the email you gave during registration was correct, your password will be sent to you now.'), + ('navigator.no_category', 'No Category'), + ('login_whatsHabboCalled', 'What\'s your Habbo called?'), + ('furni_scifidoor*3_name', 'Lightblue Spaceship Door'), + ('game_poker', 'POKER'), + ('roomatic_pws', 'Password for selected'), + ('furni_glass_table*8_name', 'Glass table'), + ('furni_one_way_door*8_desc', 'One at a time!'), + ('furni_bardesk_polyfon*9_desc', 'Perfect for work or play'), + ('nav_venue_bb_lobby_tournament_13_name', 'Competitie Battle Ball 14'), + ('pet.hotwords.sit', 'sit'), + ('furni_arabian_tray3_desc', 'Indulge yourself!'), + ('furni_sound_set_40_desc', 'Dude? Cheese!'), + ('console_compose', 'Compose A Message'), + ('furni_table_plasto_square*3_name', 'Square Dining Table'), + ('furni_rclr_sofa_name', 'Polar Sofa'), + ('poster_2005_name', 'Infobus'), + ('furni_table_plasto_4leg*9_name', 'Occasional Table'), + ('furni_chair_norja*9_desc', 'Sleek and chic for each cheek'), + ('Room', 'Room:'), + ('furni_chair_plasty*2_name', 'Plastic Pod Chair'), + ('furni_romantique_pianochair*3_name', 'Turquoise Romantique Piano Chair'), + ('furni_rare_parasol*2_name', 'Orange Parasol'), + ('loading_project', 'Loading Habbo Hotel...'), + ('poster_505_name', 'The Maple Leaf'), + ('furni_traffic_light*2_desc', 'Chill and wait your turn!'), + ('nav_venue_sw_lobby_amateur_4_name', 'Snow Slingers Lobby'), + ('furni_grunge_shelf_name', 'Grunge Bookshelf'), + ('furni_sofa_polyfon*8_name', 'Yellow Mode Sofa'), + ('furni_doorC_desc', 'In a hurry?'), + ('roomatic_nomatch', 'Sorry. Your passwords don\'t match. Please enter them again.'), + ('furni_soft_sofa_norja*9_name', 'Red Iced Sofa'), + ('nav_venue_tv_studio_general/0_desc', 'Suosikki rules! Musaa, leffoja ja staroja!'), + ('nav_venue_sw_arena_amateur_name', 'Playing amateur game'), + ('interface_icon_events', 'Open the room event browser'), + ('furni_grunge_table_desc', 'Students of the round table!'), + ('furni_wooden_screen*9_name', 'Green Oriental Screen'), + ('NUF_getting_room_hotelview_nav', 'Click to open the Navigator.'), + ('furni_table_silo_med*5_name', 'Pink Area Coffee Table'), + ('furni_divider_silo1*9_name', 'Red Area Small Table'), + ('nav_venue_bb_lobby_amateur_4_name', 'Gevorderden Battle Ball 5'), + ('room_badge_hidden', 'Hidden'), + ('pet.saying.generic.cat.0', 'meow'), + ('furni_marquee*3_desc', 'It\'s both door and a shade!'), + ('pet.saying.generic.cat.1', 'meow...meOW'), + ('nav_venue_cunning_fox_gamehall/4_name', 'Chess'), + ('furni_present_gen_desc', 'What\'s inside?'), + ('pet.saying.generic.cat.2', 'muew..muew'), + ('pet.saying.generic.cat.3', 'Purrrrrrrrrr'), + ('furni_scifidoor*1_desc', 'There out of this world!'), + ('pet.saying.generic.cat.4', 'Purrrrr oow'), + ('furni_fridge_name', 'Pura Refridgerator'), + ('furni_rubberchair*2_name', 'Pink Inflatable Chair'), + ('furni_romantique_chair*4_name', 'Amber Chair'), + ('bb_fieldname_5', 'Barebones Classic'), + ('furni_sofa_silo*7_desc', 'Green Area Sofa'), + ('bb_fieldname_4', 'Gothic Hallway'), + ('furni_prizetrophy6*2_name', 'Champion trophy'), + ('bb_fieldname_3', 'Maze Park'), + ('bb_fieldname_2', 'Coral Beach'), + ('bb_fieldname_1', 'Sky Peak'), + ('furni_safe_silo_pb_name', 'postbank Safe'), + ('furni_solarium_norja*2_desc', 'Rejuvenate your pixels!'), + ('furni_table_plasto_bigsquare*7_desc', 'Hip plastic furniture'), + ('reg_check_age', 'Age'), + ('furni_exe_chair2_desc', 'You\'re fired!'), + ('furni_typingmachine_name', 'Typewriter'), + ('human_carrying', 'Carrying:'), + ('furni_grunge_sign_name', 'Road Sign'), + ('loading', 'Loading...'), + ('furni_bed_polyfon_one*6_name', 'Blue Mode Single Bed'), + ('furni_bed_budget_one*1_desc', 'Prince sized comfort!'), + ('furni_sofa_polyfon_name', 'Two-seater Sofa'), + ('furni_jp_lantern_desc', 'For a mellow Eastern glow'), + ('furni_gothic_stool*2_name', 'Golden Gothic Stool'), + ('roomevent_starttime', 'Started at:'), + ('furni_prize1_desc', 'Gorgeously glittery'), + ('furni_prizetrophy9*1_name', 'Champion trophy'), + ('wallitem_guitar_skull_desc', 'tilulilulaa'), + ('gs_title_bestplayer', 'Best player:'), + ('nav_removefavourites', 'Remove from favourites'), + ('furni_toy1_desc', 'it\'s bouncy-tastic'), + ('alert_shortenPW', 'Your password cannot be longer than 9 characters'), + ('normal_roomlayouts', '<< Back to normal room layouts'), + ('furni_noob_rug*1_name', 'My first Habbo rug'), + ('poster_58_name', 'Red knots poster'), + ('furni_divider_nor2*8_desc', 'Yellow Iced bar desk'), + ('furni_carpet_polar*1_name', 'Pink Faux-Fur Bear Rug'), + ('habboclub_continue_button', 'Buy one month'), + ('furni_divider_silo3_desc', 'Form following function'), + ('furni_sound_set_7_name', 'SFX 5'), + ('furni_soft_sofa_norja*5_desc', 'Pink Iced Sofa'), + ('furni_arabian_rug_desc', 'Green blossom design'), + ('restart_tutorial', 'Restart tutorial'), + ('gs_choose_numteams', 'Choose number of Teams:'), + ('hubu_info_t', 'The big FRANK Infobus'), + ('furni_divider_nor5*7_desc', 'Cool cornering for your crib!'), + ('furni_bed_polyfon*4_name', 'Beige Mode Double Bed'), + ('callhelp_allwillreceive', 'A member of community staff will investigate the situation and take appropriate action. This may include sending you a response with advice on dealing with your issue.'), + ('furni_pura_mdl4*4_name', 'White Pura Module 4'), + ('hubu_odotetaan', 'Waiting for replies from others...'), + ('furni_door_name', 'Telephone Box'), + ('furni_doormat_plain*5_desc', 'Available in a variety of colours'), + ('furni_gothic_carpet_desc', 'The path less travelled'), + ('poster_516_desc', 'Eng-er-land'), + ('furni_gothic_stool*6_desc', 'The dark side of Habbo'), + ('furni_traffic_light*3_desc', 'Chill and wait your turn!'), + ('furni_bartable_armas_desc', 'Bar-Style Table - essential for extra guests'), + ('club_isp_change', 'Change your subscription'), + ('furni_summer_grill*2_name', 'Red Barbeque Grill'), + ('poster_23_desc', 'flap, flap, screech, screech...'), + ('furni_prizetrophy7*3_desc', 'Bronze Habbo trophy'), + ('furni_couch_norja*2_name', 'Black Bench'), + ('nav_venue_cunning_fox_gamehall/0_desc', 'Pit your wits on the battlefield, the board or the baize - choose what to play here'), + ('furni_jp_tatami2_name', 'Large Tatami Mat'), + ('furni_pura_mdl3*3_desc', 'Any way you like it!'), + ('furni_house_name', 'Gingerbread House'), + ('furni_sound_set_54_name', 'Oh Blinging Tree'), + ('furni_table_plasto_4leg*1_name', 'Square Dining Table'), + ('furni_pillow*1_name', 'Pink Fluffy Pillow'), + ('NUF_console_hotelview_tutor', 'Oh! You have a message on your Habbo Console. Let\'s see who it is.'), + ('LoadingRoom', 'Loading room...'), + ('rotate', 'Rotate'), + ('nav_venue_sw_lobby_beginner_6_name', 'Snow Rookies Lobby'), + ('nav_venue_bb_lobby_amateur_1/0_desc', ''), + ('furni_jukebox_ptv*1_desc', 'Jukebox Pacha TV'), + ('nav_venue_star_lounge/0_desc', 'Chat with Sean Kingston here!'), + ('furni_chair_plasty*6_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_tournament_10/0_desc', ''), + ('NUF_mini_use_console_hotelview_tutor', 'Ah! You have a message on your Habbo Console. Let\'s see who it is.'), + ('furni_rare_xmas_screen_name', 'Lappland Greetings'), + ('summer_chair_9_name', 'Red Deck Chair'), + ('club_timefull', 'Sorry, you can only buy up to three months of Habbo Club subscription in advance.'), + ('poster_2002_desc', 'Presidentin muotokuva'), + ('poster_7_name', 'Hammer Cabinet'), + ('furni_gothic_chair*2_name', 'Golden Gothic Chair'), + ('bb_header_powerups', 'Powerups in game:'), + ('credit_redeem_url', 'http://%predefined%//help/19'), + ('furni_divider_silo3*2_name', 'Black Area Gate'), + ('furni_chair_plasto*16_name', 'Chair'), + ('catalog_itsurs', 'Yay! It\'s being delivered now..'), + ('hobba_pickandreply', 'Pick & Reply'), + ('reg_terms', 'Welcome to Habbo Hotel. If you are under 16, please check the Terms and Conditions with your parents/guardian before you agree to them. Get them to explain anything that you don\'t understand.\\rIn order to use the service you have to give valid information about yourself when registering. Please email us if any of your user information changes.\\rAs a user of Habbo Hotel - www.habbohotel.co.uk , you have to behave according to the Habbo Way (hotel rules) and the Terms and Conditions. Click the links below to read about them.\\rNever give your password or email address to anyone. If you do, your Habbo may get stolen.\\rRegistering with the hotel, making your own empty room and chatting is free of charge. For a small fee you can decorate your room with virtual furniture, play games and join the Habbo Club. If you wish to buy, you will need your parent\'s permission to do so.'), + ('furni_summer_pool*1_name', 'Blue Summer Pool'), + ('furni_heartsofa_desc', 'Perfect for snuggling up on'), + ('furni_scifiport*3_name', 'Jade Sci-Fi Port'), + ('furni_glass_chair*6_name', 'Blue Glass Chair'), + ('furni_sound_set_62_name', 'Alhambra Trax 1'), + ('win_voucher', 'Habbo Credit Code'), + ('furni_summer_chair*4_desc', 'White'), + ('furni_bed_polyfon_one_desc', 'Cot of the artistic'), + ('nav_venue_bb_lobby_tournament_5/0_desc', ''), + ('nav_venue_bb_lobby_beginner_3_name', 'Beginners Battle Ball 4'), + ('console_follow_not_friend', 'The user you tried to follow is not your friend anymore.'), + ('delete', 'Delete'), + ('furni_grunge_mattress_desc', 'Beats sleeping on the floor!'), + ('furni_rare_icecream*7_name', 'Chocolate Ice Cream Machine'), + ('sound_machine_alert_no_disks', 'You don\'t have any more discs!'), + ('furni_sofachair_silo_name', 'Armchair'), + ('nav_venue_sw_lobby_expert_0_name', 'Snow Marksmen Lobby'), + ('game_waitop', 'WAITING FOR THE OPPONENT'), + ('Alert_NameAlreadyUse', 'That name is already being used'), + ('furni_queue_tile1*1_desc', 'The power of movement'), + ('poster_18_name', 'Butterfly Cabinet 2'), + ('furni_wooden_screen*6_desc', 'Add an exotic touch to your room'), + ('furni_noob_table*2_name', 'My first Habbo table'), + ('furni_tree1_name', 'Dead tree'), + ('nav_venue_bouncer_room_0_name', 'Battle Ball Competitie Arena'), + ('furni_traffic_light*5_name', 'White Traffic Light'), + ('furni_sw_raven_name', 'Mrs Raven'), + ('cam_shoot.help', 'Shutter Release'), + ('furni_grand_piano*3_desc', 'Make sure you play in key!'), + ('nav_venue_sw_lobby_intermediate_2_name', 'Snow Bombardiers Lobby'), + ('interface_icon_purse', 'Purse, manage your coins'), + ('poll_alert_server_error', 'The poll isn\'t available anymore. Polls are only available at a certain public space for a certain duration.'), + ('sound_machine_confirm_delete_long', 'Are you sure you want to delete the selected song?'), + ('reg_check_confirm', 'Please check that your information is correct, especially your birthdate and Habbo name. You CANNOT change these later. If you want make any changes now, press the back button.'), + ('Alert_CheckBirthday', 'Please check your birthday'), + ('furni_shelves_norja*4_desc', 'For nic naks and tech books'), + ('club_expired_link', 'Click here to join Habbo Club'), + ('poster_520_desc', 'Every colour for everyone'), + ('nav_venue_bb_lobby_intermediate_desc', 'Intermediate battle ball!'), + ('tutorial_restart_button_bubble', 'Remember! Anytime you want to relive the fun click here to restart the tutorial!'), + ('poster_1_name', 'Comedy Poster'), + ('reg_verification_incorrectBirthday', 'Your birthday was incorrect'), + ('furni_glass_stool*6_name', 'Blue Glass Stool'), + ('furni_CFC_100_coin_gold_desc', 'Worth 100 Credits'), + ('buddyremove_list_full', 'Your friends list is full, you can\'t add new friends until you delete some. \\r\\The maximum number of friends you can have, is %mylimit% Habbos. Members of Habbo Club can have up to %clublimit% friends on their list.'), + ('furni_bunny_name', 'Squidgy Bunny'), + ('furni_small_chair_armas_name', 'Stool'), + ('nav_venue_sw_lobby_free_0/0_desc', ''), + ('furni_sofachair_silo*3_name', 'White Armchair'), + ('furni_sound_machine*2_desc', 'Dance to the Habbo Club beat!'), + ('nav_venue_gate_park/0_desc', 'Follow your path...'), + ('NUF_mini_use_console_hotelview_icon', 'Click the icon to open your Habbo Console.'), + ('nav_venue_eric\'s_eaterie/0_desc', 'Join Eric for a bite to eat'), + ('furni_table_silo_med*8_desc', 'Wipe clean and unobtrusive'), + ('poster_503_desc', 'There\'s no holes in this...'), + ('furni_bardeskcorner_polyfon*9_name', 'Red Corner Desk'), + ('furni_val_randomizer_desc', 'Surprise surprise! (Cilla Black not included)'), + ('furni_marquee*2_name', 'Red Dragon Marquee'), + ('furni_table_plasto_round_name', 'Round Dining Table'), + ('furni_summer_chair*3_name', 'Deck Chair'), + ('club_paycoins', 'Buy subscription'), + ('nav_venue_beauty_salon_general/0_desc', 'Join in the fun of Fashion Week! Check the homepage now for details.'), + ('furni_rare_dragonlamp*7_name', 'Sky Dragon Lamp'), + ('nav_venue_bb_lobby_beginner_6/0_desc', ''), + ('roomevent_quit', 'End event'), + ('console_search_habbo_lasthere', 'Last time'), + ('trading_title', 'Safe Trading'), + ('furni_glass_chair*7_desc', 'Habbo Club'), + ('gs_error_game_deleted', 'The Game has been deleted.'), + ('recycler_info_link_url', 'http://%predefined%/help/36'), + ('furni_pillar*6_name', 'Terracotta Pillar'), + ('furni_tile_stella_desc', '10% off the walk of fame!'), + ('transaction_system_sms_win_tmobile', 'T-Mobile SMS'), + ('buddyremove_names_ordered', 'Names Ordered By:'), + ('pet_race_2_010', 'Giggly Go-go'), + ('furni_table_plasto_bigsquare*6_name', 'Square Dining Table'), + ('pet_race_2_011', 'Petty Petsuchos'), + ('summer_chair_6_name', 'Blue Deck Chair'), + ('console_now', 'now:'), + ('gs_skill_changed', 'You have advanced to the next skill level. Your level is now %1!'), + ('roomatic_goyourroom', 'Go to your room'), + ('furni_carpet_soft*4_name', 'Soft Wool Rug'), + ('sound_machine_confirm_close_list', 'Close playlist editor?'), + ('pet.hotwords.good', 'good'), + ('furni_pura_mdl4*7_desc', 'Any way you like it!'), + ('furni_carpet_soft*1_name', 'Soft Wool Rug'), + ('furni_sound_set_22_desc', 'With a hamper full of sounds, not sarnies'), + ('nav_venue_sw_lobby_tournament_7_name', 'Tournament Lobby'), + ('furni_divider_nor3*6_desc', 'Blue Iced gate'), + ('furni_carpet_standard*3_name', 'Floor Rug'), + ('people', 'People'), + ('pet_race_2_007', 'Pretty Pui Pui'), + ('pet_race_2_008', 'Indifferent'), + ('pet_race_2_009', 'Swampy Siamese'), + ('furni_wcandle_name', 'White Candle'), + ('furni_sporttrack1*1_desc', 'null'), + ('furni_solarium_norja*1_name', 'Black Solarium'), + ('NUF_playing_games_gamecategories_tutor', 'Click the Beginner category to open it wide open. Like a melon!'), + ('pet_race_2_003', 'Silly Sobek'), + ('pet_race_2_004', 'Dirty Dundee'), + ('pet_race_2_005', 'Galled Gator'), + ('int_credits', 'Credits'), + ('furni_gothrailing_name', 'Gothic Railing'), + ('furni_sporttrack2*2_desc', 'null'), + ('pet_race_2_006', 'Confused Croc'), + ('furni_shelves_polyfon_name', 'Bookcase'), + ('pet_race_2_000', 'Endangered Albino'), + ('pet_race_2_001', 'Krazy Krokodilos'), + ('pet_race_2_002', 'Nile Dile'), + ('furni_divider_nor2*2_desc', 'Black Iced bar desk'), + ('log_problem_text', 'Oops.. Cannot connect to Habbo Hotel'), + ('furni_divider_nor2*5_desc', 'Pink Iced bar desk'), + ('nav_venue_sw_lobby_amateur_6/0_desc', 'Astetta rankempaa lumisotaa.'), + ('furni_rare_fountain_desc', 'For our feathered friends'), + ('furni_glass_sofa*5_name', 'Glass sofa'), + ('poster_33_desc', 'We can\'t bear to lose them'), + ('nav_venue_bb_lobby_tournament_14/0_desc', ''), + ('furni_summer_chair*6_name', 'Deck Chair'), + ('furni_hcsohva_desc', 'For royal bottoms...'), + ('furni_bed_budget*4_desc', 'King sized comfort!'), + ('furni_christmas_poop_desc', 'Bob?s magical fertilizer'), + ('furni_pura_mdl5*7_name', 'Green Pura Module 5'), + ('furni_barrier*1_desc', 'No escape this way!'), + ('nav_venue_bb_lobby_amateur_8/0_desc', ''), + ('furni_divider_arm2_desc', 'I wooden go there'), + ('furni_chair_plasty*11_desc', 'Hip plastic furniture'), + ('furni_small_table_armas_desc', 'Practical and beautiful'), + ('nav_venue_theatredrome_xmas_name', 'Theatredrome Xmas'), + ('poster_62_name', 'Save The Panda'), + ('reg_verification_currentPassword', 'Current password:'), + ('game_poker_change', 'Choose cards to change'), + ('NUF_getting_items_hotelview_nav', 'Click here to open the Navigator'), + ('furni_chair_basic*9_name', 'Red Pura Egg Chair'), + ('friend_request_failed', 'Failed!'), + ('furni_noob_chair*4_desc', 'Lightweight, practical, with light blue stripes'), + ('furni_table_silo_small*9_desc', 'Red Area Occasional Table'), + ('nav_hotelview', 'Hotel view'), + ('furni_toy1*3_desc', 'it\'s bouncy-tastic'), + ('furni_divider_nor3*2_name', 'Black Iced gate'), + ('furni_chair_silo*6_name', 'Blue Silo Dining Chair'), + ('update_password_suggest', 'Habbo Hotel security supervisor requests you to update your password'), + ('nav_venue_orient_name', 'Club Orient'), + ('Alert_NameTooLong', 'Sorry, that username is too long!'), + ('furni_sound_set_37_name', 'Sound set 37'), + ('furni_barchair_silo*7_desc', 'Practical and convenient'), + ('wallitem_wallmirror_name', 'Wallmirror'), + ('furni_chair_plasty*8_name', 'Plastic Pod Chair'), + ('sound_machine_confirm_close_list_long', 'Are you sure you want to exit playlist editor without saving?'), + ('furni_hc_frplc_name', 'Heavy Duty Fireplace'), + ('dance4', 'The Rollie'), + ('dance3', 'Duck Funk'), + ('furni_glass_stool*9_name', 'Glass stool'), + ('furni_sound_set_55_desc', 'Can you fill me in?'), + ('furni_carpet_standard*7_desc', 'Available in a variety of colours'), + ('poster_4_name', 'Bear Plaque'), + ('cam_zoom_out.help', 'Zoom Out'), + ('furni_sofa_polyfon*2_name', 'Black Mode Sofa'), + ('furni_prizetrophy2*1_name', 'Duck trophy'), + ('furni_scifirocket*3_desc', 'Caution! Unknown Location!'), + ('NUF_getting_items', 'Getting items'), + ('furni_val_teddy*1_desc', 'The grey bear of affection'), + ('furni_sofachair_polyfon*7_name', 'Green Mode Armchair'), + ('club_habbo.bottombar.link.member', '%days% days'), + ('habboclub_confirm_header', 'Subscription costs %price% credits'), + ('furni_rare_daffodil_rug_desc', 'A little bit of outdoors indoors..'), + ('poster_15_name', 'Himalayas Poster'), + ('furni_smooth_table_polyfon_desc', 'For larger gatherings'), + ('dance2', 'Pogo Mogo'), + ('furni_wooden_screen*3_name', 'Aqua Oriental Screen'), + ('furni_plant_cruddy_desc', 'Goodbye Bert...'), + ('dance1', 'Hab-Hop'), + ('furni_gothic_chair*6_desc', 'The dark side of Habbo'), + ('furni_table_plasto_square*9_name', 'Square Dining Table'), + ('nav_venue_bb_lobby_beginner_14/0_desc', ''), + ('furni_club_sofa_desc', 'Club sofa'), + ('roomevent_default_name', 'Event name..'), + ('game_poker_ok', 'Change cards'), + ('nav_venue_picnic_dudesons/0_desc', 'Duudsoneiden sponssaama oma Ranchi - www.extremeduudsonit.com'), + ('nav_venue_hallway/0_desc', 'Beware the ghosts and ghouls!'), + ('nav_venue_park/0_desc', 'Go for a stroll outdoors'), + ('console_fr_declined_count', 'Amount to be declined'), + ('furni_tree4_name', 'Christmas Tree 2'), + ('NUF_console_read_link', 'Click the link to open the message.'), + ('win_figurecreator', 'Habbo Details'), + ('furni_table_plasto_square*14_name', 'Occasional Table'), + ('furni_soft_sofachair_norja*6_desc', 'Blue Iced Sofachair'), + ('nav_venue_bb_lobby_beginner_0_name', 'Beginner'), + ('Alert_LogoNameAlreadyUse', 'That name is already being used'), + ('poster_25_name', 'Snowman Poster'), + ('furni_pura_mdl2*2_name', 'Pink Pura Module 2'), + ('furni_chair_plasto*13_name', 'Chair'), + ('furni_ticket_name', 'Small Ticket Bundle'), + ('furni_hc_lmpst_name', 'Victorian Street Light'), + ('furni_scifiport*7_desc', 'Energy beams. No trespassers!'), + ('jukebox_load_trax', 'Load Trax'), + ('furni_val_teddy*4_desc', 'The brown bear of naughtiness'), + ('reg_birthdayformat_update', 'Birthday (dd.mm.yyyy)'), + ('nav_venue_the_chromide_club_name', 'The Chromide Club'), + ('roomevent_not_available', 'Sorry, no events available'), + ('nav_venue_sw_lobby_beginner_0/0_desc', ''), + ('summer_chair_3_name', 'Black Deck Chair'), + ('int_newrequests', 'Friend Request(s)'), + ('console_profile_helptext', 'The Habbo Profile is a snapshot of your interests and hobbies - simply tick the things you like.'), + ('nav_roomnfo_hd_fav', 'Favourite Rooms'), + ('furni_chair_plasto*3_desc', 'Hip plastic furniture'), + ('furni_chair_basic*6_name', 'Blue Pura Egg Chair'), + ('number_4', '4'), + ('number_3', '3'), + ('number_2', '2'), + ('room_open_package', 'Open The Present'), + ('furni_grunge_barrel_name', 'Flaming Barrel'), + ('wallitem_photo_desc', 'Photo from Habbo'), + ('poster_30_desc', 'Pucker up'), + ('furni_glass_table*9_desc', 'Translucent beauty'), + ('nav_venue_sw_lobby_beginner_3_name', 'Snow Rookies Lobby'), + ('Alert_YouAreBanned', 'You have been banned for breaking the Habbo Way. This is why (if no ban reason is shown use the Contact Us form):'), + ('furni_gothic_sofa*2_name', 'Golden Gothic Sofa'), + ('NUF_getting_items_hotelview_tutor', 'Let us find out how to purchase items from the Hotel Catalogue. The Catalogue contains loads of cool stuff to decorate your Habbo room with. To begin open the Navigator.'), + ('furni_table_norja_med*2_desc', 'For larger gatherings'), + ('furni_sofa_silo*3_name', 'White Two-Seater Sofa'), + ('furni_pura_mdl5*5_desc', ''), + ('nav_venue_sw_lobby_beginner_desc', 'Yes, take a load of snowballs and hit the enemy Teams. Easy, isn\'t it?'), + ('furni_romantique_smalltabl*5_name', 'Onyx Tray Table'), + ('furni_divider_nor4_desc', 'Habbos, roll out!'), + ('furni_shelves_norja*7_desc', 'For nic naks and cookery books'), + ('nav_venue_sw_lobby_intermediate_4/0_desc', 'Lumisota sen kuin vain kovenee.'), + ('gs_text_spectate', 'You can watch this game'), + ('recycler_info_link', 'More information about Furni Recycler'), + ('furni_sofachair_polyfon_name', 'Armchair'), + ('club_intro_text', 'Members of Habbo Club get LOTS of cool stuff!\\rWith Habbo Club you get cool dances, access to Club Mammoth and The Blue Dragon Tavern, and a 500 limit on your friends list!'), + ('furni_divider_nor1*7_desc', 'The missing piece'), + ('url_helppledge', 'http://%predefined%//help/22'), + ('jukebox_song_name', '%name%'), + ('game_bs_won', 'WON!'), + ('furni_soft_jaggara_norja_name', 'Iced Sofachair'), + ('furni_rare_beehive_bulb_desc', 'A honey-hued glow'), + ('furni_chair_norja*8_name', 'Yellow Chair'), + ('poster_83_desc', 'Pöllö huhuilee, huhuu!'), + ('floodblocking', 'You are typing too fast - don\'t flood the room.'), + ('furni_CF_5_coin_silver_desc', 'Worth 5 Credits'), + ('sound_machine_confirm_clear', 'Clear the song?'), + ('furni_carpet_standard*6_name', 'Floor Rug'), + ('furni_waterbowl*2_desc', 'Aqua unlimited'), + ('sw_link_tournament_highScores_url', 'http://%predefined%//groups/56553/id'), + ('NUF_meeting_people_room_tutor', 'This is a Public Room. Your Habbo is in the doorway beneath the orange arrow. Click on another user to find out more about them.'), + ('furni_bottle_name', 'Empty Spinning Bottle'), + ('poster_512_name', 'The Irish flag'), + ('club_info_url', 'http://%predefined%//credits/habboclub'), + ('nav_venue_tv_studio_nike/0_desc', ''), + ('furni_couch_norja*6_desc', 'Two can perch comfortably'), + ('furni_pura_mdl5*8_desc', 'Any way you like it!'), + ('furni_carpet_valentine_desc', 'For making an appearance'), + ('furni_floortile_desc', 'In Variety of Colours'), + ('furni_pillar*9_name', 'Rock Pillar'), + ('furni_table_plasto_bigsquare*3_name', 'Square Dining Table'), + ('furni_bardeskcorner_polyfon*12_name', 'Corner Cabinet/Desk'), + ('furni_divider_nor1*4_desc', 'The missing piece'), + ('furni_chair_plasty*5_name', 'Plastic Pod Chair'), + ('furni_scifirocket*0_desc', 'See in 2007 with a bang!'), + ('poster_32_name', 'Siva Poster'), + ('club_button_2_period', 'Buy 3 >>>'), + ('furni_sound_set_58_desc', 'Sh-shake it!'), + ('furni_china_shelve_desc', 'To hold the mind\'s treasures'), + ('furni_scifidoor*7_desc', 'There out of this world!'), + ('furni_chair_silo*9_name', 'Red Silo Dining Chair'), + ('furni_gothic_stool*5_name', 'Green Gothic Stool'), + ('friend_request_massoperation_cancel', 'Back to request list.'), + ('furni_queue_tile1*0_name', 'White Quest Roller'), + ('furni_divider_nor3*5_name', 'Pink Iced gate'), + ('furni_sound_machine*5_desc', 'Heard the Habbo Bands new singles?'), + ('furni_glass_table*6_desc', 'Translucent beauty'), + ('furni_soft_sofachair_norja*9_desc', 'Red Iced Sofachair'), + ('furni_plant_mazegate_desc', 'Did we make it?'), + ('tickets_info_1', 'With 2 tickets you can play the following Games:\\r10 BattleBall:Rebound!\\r10 SnowStorm\\r20 Wobble Squabble or\\r20 Lido Diving'), + ('furni_barchair_silo*4_desc', 'Practical and convenient'), + ('furni_CF_10_coin_gold_name', 'Gold Coin'), + ('tickets_info_2', 'With 20 tickets you can play the following Games:\\r10 BattleBall:Rebound!\\r10 SnowStorm\\r20 Wobble Squabble or\\r20 Lido Diving'), + ('furni_sound_set_15_desc', 'Unadulterated essentials'), + ('handitem1', 'Tea'), + ('furni_romantique_divan*3_desc', 'null'), + ('furni_glass_sofa*8_name', 'Glass sofa'), + ('epsnotify_1001', 'The hotel is full at the moment. Please try again in a few minutes.'), + ('furni_table_silo_med*2_name', 'Black Coffee Table'), + ('furni_sleepingbag*7_name', 'Orange Sleeping Bag'), + ('furni_pillow*5_desc', 'Puffy, soft and huge'), + ('furni_bed_budget*1_desc', 'King sized comfort!'), + ('furni_bed_trad_one_name', 'Plain Single Bed'), + ('catalog_giftfor', 'This is a gift for:'), + ('furni_theatre_seat_name', 'Deluxe Theatre Chair'), + ('furni_romantique_divider*3_name', 'Turquoise Screen'), + ('furni_shelves_silo_desc', 'For nic naks and art deco books'), + ('handitem9', 'Decaff'), + ('handitem8', 'Regular'), + ('handitem7', 'Water'), + ('furni_glass_table_name', 'Glass table'), + ('console_selection_invert', 'Invert selection'), + ('handitem6', 'Blackcurrant'), + ('furni_hc_machine_desc', 'By and for mad inventors'), + ('handitem5', 'Milk'), + ('handitem4', 'Ice-cream'), + ('poster_40_desc', 'The one and only. Adore her!'), + ('nav_venue_sw_lobby_tournament_9/0_desc', ''), + ('handitem3', 'Carrot'), + ('handitem2', 'Juice'), + ('furni_cn_sofa_name', 'Chinese Sofa'), + ('nav_venue_bb_lobby_expert_4/0_desc', ''), + ('poster_502_name', 'The Stars and Stripes'), + ('furni_md_rug_name', 'Bubble Juice Floor'), + ('furni_table_plasto_bigsquare_name', 'Square Dining Table'), + ('furni_bed_polyfon*8_desc', 'Yellow Mode Double Bed'), + ('nav_venue_sw_lobby_amateur_7_name', 'Snow Slingers Lobby'), + ('furni_birdie_desc', 'Cheep (!) and cheerful'), + ('poster_12_name', 'Lapland Poster'), + ('club_desc_1_period', '1 Month (31 days) = 25 Credits'), + ('hobba_emergency_help', 'Call For Emergency Help:'), + ('reg_age_check_note', 'Enter your birthday. You will need your birthday information when changing your password or email.'), + ('furni_table_plasto_square*6_name', 'Square Dining Table'), + ('trade', 'Trade'), + ('furni_romantique_smalltabl*3_desc', 'Every tray needs a table...'), + ('reg_back', 'Back'), + ('furni_tree7_name', 'Snowy Christmas Tree'), + ('recycler_trader_open_alert', 'Recycling cannot begin while you are trading. Please close the safe trading box before recycling.'), + ('furni_rare_dragonlamp*8_desc', 'Scary and scorching!'), + ('furni_gothic_chair*3_desc', 'The head of the table'), + ('Alert_YourNameIstooShort', 'Habbo names must be at least 3 characters long.'), + ('furni_bed_budgetb_desc', 'Sweet dreams for two'), + ('furni_shelves_basic_name', 'Pura Shelves'), + ('console_messagemode_helptext', 'You can send an instant message to your Habbo Friends.'), + ('nav_venue_cunning_fox_gamehall/5_desc', 'Get a hand like a foot? Keep a straight face and bluff it out'), + ('furni_table_polyfon_small_name', 'Small Coffee Table'), + ('move_furniture', 'Move Furni'), + ('nav_searchbutton', 'Search'), + ('furni_habboween_grass_desc', 'Autumnal chills with each rotation!'), + ('furni_pura_mdl5*2_desc', 'Any way you like it!'), + ('NUF_meeting_people_user_tutor', 'The user you clicked on is shown in the corner of your screen. The buttons beneath the Habbo let you visit their Habbo Home, send them a Friend Request or ignore them if they look or act like a moron.'), + ('poster_55_name', 'Tree of Time'), + ('furni_soft_sofachair_norja*5_name', 'Pink Iced Sofachair'), + ('furni_sound_set_48_name', 'Club 3'), + ('furni_table_plasto_4leg_desc', 'Hip plastic furniture'), + ('furni_pura_mdl4*1_name', 'Aqua Pura Module 4'), + ('login_forgottenPassword_url', 'https://www.habbo.co.uk/account/password/forgot'), + ('nav_venue_floatinggarden/0_desc', 'Peace, tranquility and still waters'), + ('furni_sound_set_36_desc', 'For adult minded'), + ('poster_43_desc', 'Shake, rattle and roll'), + ('furni_gothic_stool*3_desc', 'The dark side of Habbo'), + ('room_alert_furni_limit', 'This room has the maximum amount of Furni.'), + ('furni_table_plasto_square*15_name', 'Occasional Table'), + ('furni_rare_hammock_name', 'Hammock'), + ('sound_machine_confirm_burn_long', 'Are you sure you want to burn this song to disc? Burning costs one credit.'), + ('furni_rclr_chair_desc', 'Watch out for coconuts'), + ('furni_chair_basic*3_desc', 'It\'s a cracking design!'), + ('furni_doormat_plain*6_name', 'Doormat'), + ('furni_sofachair_polyfon*9_name', 'Red Armchair'), + ('furni_jp_tray6_name', 'jp_tray6'), + ('furni_habbocake_name', 'Cake'), + ('poster_501_name', 'Jolly Roger'), + ('nav_goingprivate', 'Going to Guest room'), + ('furni_bed_budget_one*9_name', 'Red Pura Bed'), + ('alert_no_category', 'Your room has no category. Select one from the list.'), + ('nav_venue_theatredrome_easter/0_desc', ''), + ('gs_button_buytickets', 'Buy Tickets'), + ('nav_venue_bouncer_room_4_name', 'Experts Battle Ball Arena'), + ('close', 'Close'), + ('furni_carpet_standard*9_desc', 'Available in a variety of colours'), + ('furni_prizetrophy4*1_desc', 'Glittery gold'), + ('help_pointer_1', 'http://www.habbo.co.uk/help/'), + ('help_pointer_3', 'emergency_help'), + ('furni_rclr_lamp_name', 'Moon Lamp'), + ('help_pointer_2', 'http://www.habbohotel.co.uk/iot/go?lang=en&country=uk'), + ('furni_exe_sofa_desc', 'Relaxing leather comfort'), + ('furni_divider_silo1*4_name', 'Beige Area Corner Shelf'), + ('poster_2001_name', 'SeinNightitititititdiskotappaja'), + ('interface_icon_tv_close', 'Leave the Room and close the Habbovision mode.'), + ('furni_sound_machine*7_name', 'Red Traxmachine'), + ('game_bs_hit', 'A Hit!:'), + ('furni_rare_fan*2_desc', 'It\'ll blow you away!'), + ('win_place', 'Note!'), + ('nav_venue_bb_lobby_beginner_11_name', 'Beginners Battle Ball 12'), + ('furni_pillow*7_desc', 'Bonnie\'s pillow of choice!'), + ('furni_table_silo_small*8_desc', 'For those random moments'), + ('furni_divider_nor4*5_desc', 'Habbos, roll out!'), + ('hubu_vastaa', 'Answer the question'), + ('furni_pura_mdl4*8_name', 'yellow pura module 4'), + ('furni_glass_chair*9_name', 'Glass chair'), + ('furni_chair_silo*7_desc', 'Green Silo Dining Chair'), + ('furni_jp_drawer_desc', 'Spiritual home for odds and ends'), + ('tutorial_select_another_topic', 'Select another topic'), + ('furni_noob_lamp*4_desc', 'Get the light right where you want it (light blue)'), + ('nav_venue_beauty_salon_general_name', 'Beauty salon'), + ('furni_sofachair_polyfon*2_name', 'Black Mode Armchair'), + ('console_report_header', 'Report Abusive Message'), + ('club_buy_url', 'http://%predefined%//credits/habboclub'), + ('furni_prizetrophy*2_name', 'Classic trophy'), + ('furni_rare_icecream*4_name', 'Strawberry Ice Cream Machine'), + ('furni_barchair_silo*5_desc', 'Practical and convenient'), + ('furni_divider_nor2*4_desc', 'No way through'), + ('furni_xmas_cstl_gate_name', 'Ice Castle Gate'), + ('furni_noob_stool*5_desc', 'Unfold me and take the weight off (pink)'), + ('furni_bed_budgetb_one_name', 'Plain Single Bed'), + ('friend_request_accept_all', 'Accept all requests.'), + ('furni_val_choco_name', 'Heart Shaped Box'), + ('poster_514_desc', 'Be proud to be in the Union!'), + ('furni_carpet_legocourt_desc', 'Line up your slam dunk'), + ('furni_sofa_silo_name', 'Two-Seater Sofa'), + ('furni_chair_plasto*8_desc', 'Hip plastic furniture'), + ('furni_tree5_name', 'Christmas Tree 3'), + ('nav_venue_habbo_cinema/0_desc', 'Now showing: Kick Warz II - The revenge of Donnie Santini!'), + ('furni_couch_norja*4_name', 'Urban Iced Bench'), + ('poster_52_desc', 'whack that ball!'), + ('furni_sound_set_45_desc', 'The Bass? is the rhythm!'), + ('nav_venue_sun_terrace/0_name', 'Sun Terrace'), + ('queue_tile_limit', 'You can\'t fit more Habbo Rollers in this room!'), + ('BuddyRequesta', 'Friend Request(s)'), + ('transaction_system_sms_rl', 'Elisa'), + ('furni_prizetrophy4_desc', 'Palkinto'), + ('furni_hcamme_desc', 'Time for a soak'), + ('furni_scifirocket*2_name', 'Earth Smoke Machine'), + ('furni_divider_nor5*2_desc', 'Cool cornering for your crib y0!'), + ('forgottenpw', 'Forgotten your password?'), + ('furni_rclr_sofa_desc', 'Snuggle up together'), + ('furni_val_cauldron_desc', 'Cast a loving spell!'), + ('poster_3_name', 'Fish Plaque'), + ('furni_one_way_door*8_name', 'Yellow One Way Gate'), + ('furni_divider_nor3*8_desc', 'Yellow Iced gate'), + ('sw_link_highScores_url', 'http://%predefined%//groups/56553/id'), + ('furni_carpet_standard*2_desc', 'Available in a variety of colours'), + ('nav_venue_sport/0_name', 'The Power Gym'), + ('furni_scifidoor*3_desc', 'There out of this world!'), + ('furni_pillar*7_desc', 'Recovered from Habblantis'), + ('furni_arabian_tray3_name', 'Sweets Tray'), + ('furni_chair_plasto_name', 'Chair'), + ('nav_venue_pizza_name', 'Slice of Life'), + ('url_privacypledge', 'http://%predefined%//help/69'), + ('furni_one_way_door*3_desc', 'One way! The HC way!'), + ('catalog_purchase_not_allowed_hc', 'In order to buy this item you must be a Habbo Club member!'), + ('furni_pura_mdl3*4_name', 'White Pura Module 3'), + ('room_confirmDelete', 'Confirm'), + ('BuddyPrivateRoom', 'In A Guest Room'), + ('furni_marquee*7_desc', 'It\'s both door and a shade!'), + ('furni_bath_desc', 'The ultimate in pampering'), + ('furni_soft_sofa_norja*3_desc', 'Pristine white, keep it clean!'), + ('game_BattleShip', 'Battleships'), + ('furni_sound_set_11_desc', 'Music you can really sink your teeth into'), + ('furni_glass_chair*2_name', 'Glass chair'), + ('furni_sofa_silo*5_desc', 'Pink Area Sofa'), + ('furni_pura_mdl2*7_name', 'Green Pura Module 2'), + ('cam_film.help', 'Number Of Photos Left'), + ('nav_venue_bb_lobby_tournament_17/0_desc', ''), + ('roomatic_hway', 'Hotel guests are expected to follow the Habbo Way even if word filtering is switched off.'), + ('modify', 'Modify'), + ('furni_sofachair_silo*8_name', 'Yellow Armchair'), + ('alert_reg_blocked', 'A person under 11 years of age has tried to register from this machine recently.\\rRegistration is not possible for a while.'), + ('furni_sofa_polyfon*8_desc', 'Yellow Mode Sofa'), + ('furni_wooden_screen*9_desc', 'Add an exotic touch to your room'), + ('hobba_message_from', 'Your call has been responded to as follows:'), + ('win_help', 'Habbo Help'), + ('pet.saying.sniff.dog.1', 'snuh...SNUUUUUH'), + ('pet.saying.sniff.dog.0', 'snuuh..snuuh'), + ('sw_user_skill', 'Snow Storm Skill Level: \\x \\r (\\y points)'), + ('furni_rom_lamp_desc', 'Light up your life'), + ('console_profile_create', 'Create your Habbo Profile.'), + ('furni_CF_50_goldbar_desc', 'Worth 50 Credits'), + ('furni_romantique_chair*4_desc', 'What does this button do?'), + ('reg_use_allowed_chars', 'Use only these characters:'), + ('furni_bar_chair_armas_name', 'Barrel Stool'), + ('pet.saying.sniff.dog.2', '*sighs*'), + ('furni_sound_set_64_name', 'Alhambra Trax 3'), + ('furni_pillar*3_name', 'blue pillar'), + ('furni_glass_chair*4_desc', 'Translucent beauty'), + ('furni_pizza_desc', 'You dirty Habbo'), + ('opening_hours_text_shutdown', 'The Hotel will shut down in %d% minutes. To avoid confusion, purchasing of furniture, Habbo Club and game tickets will be disabled during that time, as well as playing Games and furniture trading. Thank you for visiting and welcome back tomorrow!'), + ('nav_venue_bb_lobby_tournament_10_name', 'Competitie Battle Ball 11'), + ('poster_521_desc', 'Ordem e progresso'), + ('furni_sound_set_52_desc', 'Under the mistletoe!'), + ('furni_shelves_norja*3_name', 'White Iced Bookcase'), + ('furni_scifiport*5_desc', 'Recovered from Roswell'), + ('help_emergency_writeyour', 'Give details of your emergency here:'), + ('furni_table_norja_med*6_name', 'Large Coffee Table Blue'), + ('nav_venue_bb_lobby_expert_3_name', 'Experts Battle Ball 4'), + ('photo_legend', 'Caption'), + ('furni_sofachair_silo_desc', 'Large, but worth it'), + ('console_youdonthavebuddies', 'You have no Friends on your list.\\rYou can send Friend Requests using\\rthe \'search\' button.'), + ('furni_table_plasto_4leg*6_name', 'Occasional table Table'), + ('furni_scifidoor*1_name', 'Pink Spaceship Door'), + ('furni_tile_brown_desc', '10% off downtown promenades & piazzas!'), + ('NUF_getting_room_go_button', 'Click here to go to your just created room!'), + ('dimmer_turn_on', 'Turn ON'), + ('furni_sofa_polyfon_desc', 'Comfort for stylish couples'), + ('furni_sound_set_50_name', 'Club 5'), + ('furni_doorB_name', 'Wardrobe'), + ('reg_agree1', 'Yes, my parents and I agree to the above terms. I am allowed to use Habbo Hotel.'), + ('furni_chair_silo*3_name', 'White Dining Chair'), + ('furni_CF_1_coin_bronze_desc', 'Worth 1 Credits'), + ('reg_agree2', 'Yes, I have read the Habbo Hotel Terms of Service and I accept them'), + ('you_have_pending_cfh', 'Your previous call for help has not been answered yet. To make a new one you must delete the old message.'), + ('furni_table_plasto_bigsquare*7_name', 'Square Dining Table'), + ('console_accept', 'Accept'), + ('furni_lamp_basic_name', 'Pura Lamp'), + ('console_friend_request_error', 'There was an error with friend requests'), + ('poster_11_desc', 'I obey the Habbo way!'), + ('furni_bardeskcorner_polyfon*6_name', 'Blue Mode Bardesk Corner'), + ('furni_plant_sunflower_name', 'Cut Sunflower'), + ('furni_traffic_light*3_name', 'Purple Traffic Light'), + ('furni_bed_polyfon_one*8_name', 'Yellow Mode Single Bed'), + ('furni_carpet_polar*1_desc', 'Cute'), + ('furni_noob_rug*1_desc', 'Nice and neat sisal rug with orange edging'), + ('furni_exe_bardesk_desc', 'Divide the profits!'), + ('furni_romantique_divider*4_desc', 'Keeping things separated'), + ('pet_status_dialog', '%name%'), + ('furni_jp_lantern_name', 'Japanese Lantern'), + ('furni_chair_norja*2_name', 'Black Chair'), + ('furni_jp_irori_desc', 'Traditional heating and eating'), + ('furni_bed_budget*5_name', 'Beige Pura Double Bed'), + ('furni_scifidoor*8_name', 'Purple Spaceship Door'), + ('nav_venue_sw_lobby_free_5_name', 'Free Game Lobby'), + ('wallitem_jp_sheet2_desc', 'jp_sheet2'), + ('furni_glass_sofa*9_desc', 'Translucent beauty'), + ('furni_divider_nor5*7_name', 'Rural Iced Angle'), + ('sound_machine_open_editor', 'Trax Editor'), + ('furni_jp_tatami2_desc', 'Shoes off please'), + ('furni_sound_set_16_name', 'Hip Hop Beats 3'), + ('console_recipients', 'Recipient(s)'), + ('catalog_page', 'page'), + ('poster_23_name', 'Bat Poster'), + ('furni_table_plasto_round*4_name', 'Square Dining Table'), + ('furni_rubberchair*2_desc', 'Soft and tearproof!'), + ('nav_venue_bb_lobby_beginner_16/0_desc', ''), + ('poster_1005_name', 'Johnny Squabble'), + ('furni_silo_studydesk_name', 'Area Quest Desk'), + ('furni_table_plasto_4leg*1_desc', 'Hip plastic furniture'), + ('nav_venue_basement_lobby/0_desc', 'For low level hanging'), + ('furni_rare_parasol*3_desc', 'Block those rays!'), + ('furni_arabian_wndw_name', 'Arabian Window Frame'), + ('Alert_ConnectionFailure', 'Disconnected'), + ('furni_house_desc', 'Good enough to eat'), + ('console_confirm_selected', 'Confirm the selections. Below are the amount of friend requests that will be accepted and declined. If you want, you can still modify the selections.'), + ('furni_table_plasto_4leg*4_name', 'Square Dining Table'), + ('furni_sound_set_57_name', 'RnB Grooves 3'), + ('hubu_h3', 'Huumetietobussi'), + ('furni_table_plasto_bigsquare*2_name', 'Square Dining Table'), + ('hubu_h4', 'Anna palautetta'), + ('hubu_h1', 'Puhelintuki'), + ('roomatic_bobbafilter', 'Bobba filter (filters out bad language)'), + ('hubu_h2', 'Harrastamaan!'), + ('furni_tv_luxus_desc', 'Bang up to date'), + ('hubu_h5', 'Huumetietoa'), + ('NUF_console_hotelview_icon', 'Click the button to open your Habbo Console.'), + ('modtool_banlength', 'Ban Length:'), + ('NUF_visiting_rooms_roomlist_tutor', 'Just pick any room you like. Click on the room to see a description of the room. ROOM!'), + ('reg_verification_newPassword', 'New password:'), + ('furni_wall_china_name', 'Dragon Screen'), + ('nav_venue_hallway_ii/0_desc', 'Beware witches and warlocks'), + ('jukebox_disk_add', 'Add Disc'), + ('furni_rare_xmas_screen_desc', 'Ho Ho Ho!'), + ('furni_table_plasto_round*2_name', 'Round Dining Table'), + ('furni_rubberchair*7_name', 'White Inflatable Chair'), + ('nav_favourites_helptext', 'These are your favourite rooms. Nice selection you have here...'), + ('nav_venue_sw_lobby_beginner_4_name', 'Snow Rookies Lobby'), + ('furni_gothic_chair*2_desc', 'The prince of Habbo'), + ('cam_save_nofilm', 'You have run out of film.\\rGet a roll (5 photos) from\\rthe Catalogue for 6 Credits.'), + ('furni_sofa_polyfon*6_desc', 'Blue Mode Sofa'), + ('furni_divider_silo3*2_desc', 'Form following function'), + ('furni_rare_beehive_bulb*1_name', 'Red Amber Lamp'), + ('furni_plant_small_cactus_desc', 'Even less watering than the real world'), + ('furni_triplecandle_name', 'Electric Candles'), + ('help_option_1', 'Playing Habbo'), + ('help_option_3', 'A serious issue (harassment, sexual behaviour)'), + ('furni_present_gen5_name', 'Gift'), + ('help_option_2', 'My Habbo account.'), + ('furni_shelves_norja*8_name', 'Yellow Bookcase'), + ('furni_legotrophy_desc', 'For the winning team'), + ('furni_rare_icecream*2_name', 'Pistachio Ice Cream Machine'), + ('furni_summer_pool*1_desc', 'Fancy a dip?'), + ('nav_venue_theatredrome_deli/0_desc', 'Join in all the fun of the fair!'), + ('game_newgame', 'New game'), + ('help_tour', 'Guided Tour'), + ('purse_vouchers_error3_url', 'http://%predefined%//credits'), + ('furni_marquee*5_name', 'Graphite Marquee'), + ('forgottenpw_explanation', 'If you have forgotten your password and you gave your correct email address when you registered, we can send your password to you.'), + ('furni_waterbowl*3_name', 'Yellow Water Bowl'), + ('roomatic_namedisp', 'Do you want your name to be displayed with the room?'), + ('poster_28_name', 'Silver Tinsel Bundle'), + ('Alert_BuyingOK', 'Buying Successful!'), + ('furni_summer_chair*4_name', 'Deck Chair'), + ('nav_venue_welcome_lounge_ii/0_desc', 'New? Lost? Get a warm welcome here from Habbo eXperts.'), + ('bb_title_gameCreation', 'Aloita uusi peli!'), + ('furni_sporttrack1*3_name', 'Sport track straight grass'), + ('furni_romantique_divan*2_name', 'Emerald Chaise-Longue'), + ('furni_divider_silo1*6_name', 'Blue Area Corner Shelf'), + ('NUF_about_hotel_about_tutor', 'Habbo is both a virtual world and an online community.'), + ('url_helpparents', 'http://%predefined%//help/73'), + ('furni_divider_silo3*7_name', 'Green Area Gate'), + ('poster_18_desc', 'Beautiful reproduction butterfly'), + ('furni_traffic_light*5_desc', 'Chill and wait your turn!'), + ('furni_scifirocket*6_desc', 'Too hot to handle!'), + ('pet.saying.angry.cat.0', 'Sssppp!'), + ('furni_bed_armas_one_desc', 'Rustic charm for one'), + ('pet.saying.angry.cat.3', '*hiss*'), + ('pet.saying.angry.cat.1', 'MrrRRRR'), + ('pet.saying.angry.cat.2', 'Tssssss!'), + ('furni_noob_rug*6_name', 'My first Habbo rug'), + ('club_habbo.bottombar.text.member', 'Habbo Club'), + ('furni_divider_silo1_name', 'Corner Shelf'), + ('nav_venue_bb_lobby_beginner_10/0_desc', ''), + ('recycler_info_progress', 'Recycling is currently in progress. The recycling process takes a total of %recyclinghours% hour. You can leave the catalogue and recycling will continue in the background.'), + ('furni_queue_tile1*1_name', 'Pink Habbo Roller'), + ('notickets_header', 'Buy game tickets to play this game'), + ('reg_underage', 'I am under 11 years old'), + ('nav_venue_sw_arena_intermediate_name', 'Playing intermediate game'), + ('furni_table_plasto_square*5_name', 'Square Dining Table'), + ('Alert_YouAreBanned_T', 'A Moderator kicked you out of the room.'), + ('buddyremove_moreoptions', 'More Options >>'), + ('furni_prizetrophy4*3_desc', 'Breathtaking bronze'), + ('furni_chair_silo*2_desc', 'Keep it simple'), + ('club_habbo.bottombar.link.notmember', 'Join!'), + ('poster_1000_name', 'Comedy Poster'), + ('room_badge_button', 'Badge'), + ('furni_soft_sofa_norja*8_desc', 'Yellow Iced Sofa'), + ('wallitem_torch_name', 'Gothic Torch'), + ('furni_scifirocket*7_name', 'Jupiter Smoke Machine'), + ('furni_romantique_tray1_desc', 'For a fast break'), + ('furni_rare_dragonlamp*0_desc', 'George and the...'), + ('furni_nest_desc', 'Night, night'), + ('furni_table_silo_small*2_name', 'Black Occasional Table'), + ('furni_prizetrophy7*2_name', 'Silver Habbo trophy'), + ('furni_sofachair_silo*3_desc', 'Large, but worth it'), + ('furni_divider_nor2*9_name', 'Red Iced bar desk'), + ('club_extend_title', 'Habbo Club membership can be extended VERY easily.'), + ('furni_rare_fan*0_desc', 'As red as Rudolph\'s nose'), + ('club_paybycash_url', '(leave this empty if you don\'t want to have this link displayed)'), + ('poster_57_name', 'Calligraphy poster'), + ('furni_CFC_50_coin_silver_desc', 'Worth 50 Credits'), + ('furni_pillow*5_name', 'Black Leather Pillow'), + ('furni_hc_chr_name', 'Majestic Chair'), + ('nav_venue_sw_arena_free_name', 'Playing free for all game'), + ('furni_active_placeholder_desc', 'This furniture is downloading...'), + ('nav_venue_welcome_lounge_name', 'Welcome Lounge'), + ('furni_soft_sofachair_norja*3_name', 'White Iced Sofachair'), + ('furni_bed_polyfon*3_desc', 'Give yourself space to stretch out'), + ('furni_pura_mdl4*3_name', 'Black Pura Module 4'), + ('furni_pillar*2_desc', 'Ancient and stately'), + ('furni_small_chair_armas_desc', 'Rustic charm at it\'s best'), + ('furni_table_plasto_round_desc', 'Hip plastic furniture'), + ('furni_marquee*2_desc', 'Dragons out and Davids in!'), + ('furni_wooden_screen*7_desc', 'Add an exotic touch to your room'), + ('furni_queue_tile1*8_name', 'Navy Habbo Roller'), + ('furni_arabian_pllw_desc', 'Exotic comfort'), + ('furni_sound_set_1_desc', 'Get the party started!'), + ('furni_gothic_stool*5_desc', 'The dark side of Habbo'), + ('furni_china_table_desc', 'Exotic and classy'), + ('song_disk_trade_info', '%name%'), + ('nav_venue_sw_lobby_beginner_9_name', 'Snow Rookies Lobby'), + ('console_modify', 'Modify'), + ('poster_36_desc', 'The Hotels girlband. Dream on!'), + ('furni_rare_dragonlamp*7_desc', 'Scary and scorching!'), + ('furni_sound_set_63_desc', 'Desert hits by the oasis!'), + ('nav_venue_cafe_gold_name', 'The Oasis'), + ('nav_venue_sw_lobby_tournament_3/0_desc', ''), + ('nav_venue_habbo_cinema_name', 'Habbo Cinema'), + ('furni_chair_plasty*4_name', 'Plastic Pod Chair'), + ('nav_venue_welcome_lounge_iii/0_desc', 'New? Lost? Get a warm welcome here from Habbo eXperts.'), + ('furni_carpet_soft*1_desc', 'Soft Wool Rug'), + ('furni_sporttrack1*1_name', 'Sport track straight'), + ('furni_divider_nor3*6_name', 'Blue Iced gate'), + ('furni_glass_chair*7_name', 'Green Glass Chair'), + ('club_confirm_gift_text', 'A new club gift has arrived. Please push OK if you want to receive it now. If you click cancel you will be asked again next time you log in to the Hotel.'), + ('furni_rubberchair*5_name', 'Lime Inflatable Chair'), + ('furni_plant_maze_snow_name', 'Snowy Maze Bundle 2'), + ('furni_table_silo_med*4_name', 'Beige Area Coffee Table'), + ('furni_solarium_norja*1_desc', 'Rejuvenate your pixels!'), + ('furni_divider_nor2*2_name', 'Black Iced bar desk'), + ('poster_45_desc', 'Needs a few more Habburgers'), + ('wallitem_habw_mirror_desc', 'Star of the show!'), + ('furni_pura_mdl3*9_name', 'Red Pura Module 3'), + ('furni_exe_corner_name', 'Executive Corner Desk'), + ('nav_venue_cunning_fox_gamehall/3_desc', 'Are you the new Deep Blue?'), + ('furni_rare_fan*7_desc', 'It\'ll blow you away!'), + ('furni_divider_nor1*5_desc', 'Pink Ice corner'), + ('wallitem_md_logo_wall_name', 'Bubble Juice Logo'), + ('furni_bardesk_polyfon_desc', 'Perfect for work or play'), + ('console_target_does_not_accept', 'This user does not accept friend requests at the moment'), + ('pet.saying.beg.croco.0', 'Mmmmmrrr'), + ('pet.saying.beg.croco.1', '*Emo tear*'), + ('messenger.email.header', ''), + ('pet.saying.beg.croco.2', 'Waarrrr...rrr'), + ('furni_carpet_polar*4_name', 'Green Bear Rug'), + ('furni_chair_plasto*6_name', 'Chair'), + ('furni_noob_rug*4_name', 'My first Habbo rug'), + ('furni_summer_chair*6_desc', 'Blue'), + ('rotate_furniture', 'Rotate Furni'), + ('poster_16_desc', 'Added security'), + ('furni_sofachair_silo*7_desc', 'Green Area Armchair'), + ('furni_divider_nor5*4_desc', 'Cool cornering for your crib!'), + ('furni_sand_cstl_twr_name', 'sand_cstl_twr'), + ('furni_safe_silo*4_name', 'Beige Safe Minibar'), + ('furni_chair_plasty*11_name', 'Plastic Pod Chair'), + ('furni_divider_arm2_name', 'Room divider'), + ('furni_sound_set_55_name', 'RnB Grooves 1'), + ('nav_venue_sw_lobby_intermediate_4_name', 'Snow Bombardiers Lobby'), + ('roomatic_canmodifysettings', '(You can change these settings later)'), + ('furni_pura_mdl5*7_desc', 'Any way you like it!'), + ('catalog_pet_name_length', 'Oops, pet\'s name is too long (max 15 characters)'), + ('furni_toy1*3_name', 'Rubber Ball'), + ('nav_venue_beauty_salon_loreal/0_desc', 'No Pixel Surgery, only natural make-ups!'), + ('furni_arabian_swords_name', 'Ancestral Scimitars'), + ('furni_summer_pool*4_name', 'Yellow Summer Pool'), + ('gs_error_create_0', 'This Lobby is full, please create a Game in another Lobby!'), + ('nav_venue_pizzeria/0_desc', 'Pizza; food of the hungry!'), + ('nav_roomnfo_hd_own', 'Own Rooms'), + ('furni_glass_sofa*4_desc', 'Translucent beauty'), + ('buddyremove_accept', 'Remove Friends'), + ('transaction_system_sms_win_orange', 'Orange SMS'), + ('gs_error_create_3', 'Your skill level isn\'t high enough for creating Games in this Lobby.'), + ('furni_goodie2_desc', 'For gourmet kittens'), + ('trading_youagree', 'You agree'), + ('furni_bench_lego_name', 'Team Bench'), + ('reg_verification_updateOK', 'Update successful'), + ('transaction_system_refunds', 'Refund'), + ('furni_carpet_standard*7_name', 'Floor Rug'), + ('poster_44_name', 'Mummy'), + ('furni_bed_polyfon_one*3_name', 'White Single Bed'), + ('furni_jp_tray1_name', 'jp_tray1'), + ('furni_jp_tatami_name', 'Small Tatami Mat'), + ('furni_bardesk_polyfon*2_name', 'Black Mode Bardesk'), + ('furni_hockey_light_desc', 'Set it off.'), + ('nav_venue_bb_lobby_intermediate_2/0_desc', ''), + ('wallitem_guitar_v_name', 'v guitar'), + ('reg_email', 'Email:'), + ('nav_venue_sw_lobby_tournament_0/0_desc', ''), + ('furni_club_sofa_name', 'Club sofa'), + ('furni_duck_name', 'Rubber Duck'), + ('furni_divider_nor5*9_name', 'Red Iced Angle'), + ('furni_smooth_table_polyfon_name', 'Large Dining Table'), + ('reg_forcedupdate', 'Please update your Habbo details!'), + ('transaction_system_stuff_store', 'Catalogue purchase'), + ('console_request_massoperation_title', 'You have %messageCount% friend requests waiting.'), + ('nav_venue_bb_lobby_expert_8/0_desc', ''), + ('roomatic_roomdescription', 'Room description:'), + ('reg_verification_invalidEmail', 'Check email address'), + ('furni_xmas_icelamp_desc', '20 lanterns for the price of 6!'), + ('wallitem_wallmirror_desc', 'Mirror, mirror on the wall...'), + ('furni_pura_mdl1*3_name', 'Black Pura Module 1'), + ('pet.saying.play.croco.1', 'Squeh Squeeeeh...'), + ('pet.saying.play.croco.0', ':)'), + ('nav_venue_theatredrome_halloween/0_desc', 'Warm welcome to Bullet For My Valentine!'), + ('nav_venue_bb_lobby_amateur_6_name', 'Gevorderden Battle Ball 7'), + ('cam_savetxt', 'Saving Photo...'), + ('nav_venue_bb_lobby_intermediate_1_name', 'Semi-profs Battle Ball 2'), + ('nav_modify_doorstatus', 'Door status'), + ('callhelp_sent', 'If you have questions about Habbo Hotel or your Habbo account, please write the details below and a member of community staff will respond as soon as possible.'), + ('wallitem_photo_name', 'Photo'), + ('poster_25_desc', 'A new use for carrots!'), + ('furni_chair_plasto*1_desc', 'Hip plastic furniture'), + ('furni_prizetrophy4*2_name', 'Fish trophy'), + ('furni_bar_armas_name', 'Barrel Minibar'), + ('nav_rooms_favourite', 'Favourites'), + ('furni_table_plasto_square*6_desc', 'Hip plastic furniture'), + ('furni_gothic_sofa*6_desc', 'The dark side of Habbo'), + ('jukebox_song_length', 'Song length: %time%'), + ('buddyremove_header', 'Choose %amount% friends to remove'), + ('furni_romantique_mirrortabl_desc', 'Get ready for your big date'), + ('wallitem_hrella_poster_2_name', 'Life Buoy'), + ('reg_boy', 'Boy'), + ('sound_machine_trax_name', 'Trax name:'), + ('purse_vouchers_error0', 'Technical error! Cannot redeem voucher.'), + ('furni_plant_valentinerose*3_name', 'Yellow Valentine Rose'), + ('purse_vouchers_error1', 'Invalid voucher code.'), + ('nav_venue_bb_lobby_expert_1_name', 'Experts Battle Ball 2'), + ('purse_vouchers_error2', 'Product delivery failed, please contact Customer Service'), + ('purse_vouchers_error3', 'This voucher must be redeemed on the Habbo website'), + ('furni_romantique_chair*2_desc', 'null'), + ('furni_prizetrophy7*1_desc', 'Gold Habbo trophy'), + ('furni_table_plasto_bigsquare*14_name', 'Occasional Table'), + ('furni_ticket_desc', 'A bundle of 5 gaming tickets'), + ('nav_venue_club_massiva_name', 'Club Massiva'), + ('roomatic_locked', 'Door locked - visitors have to ring doorbell'), + ('furni_table_silo_small*3_desc', 'For those random moments'), + ('furni_bed_trad_name', 'Plain Double Bed'), + ('summer_chair_5_name', 'Beige Deck Chair'), + ('buddyremove_select_all', 'Select All Friends'), + ('furni_plant_valentinerose*5_desc', 'For that special pixel'), + ('furni_glass_table*9_name', 'Glass table'), + ('furni_romantique_smalltabl*5_desc', 'Why is one leg different?'), + ('furni_pura_mdl5*5_name', 'beige pura module 5'), + ('poster_30_name', 'Mistletoe'), + ('furni_chair_basic*8_name', 'chair_basic'), + ('nav_venue_sw_lobby_amateur_2_name', 'Snow Slingers Lobby'), + ('Alert_ConnectionDisconnected', 'Please reload Habbo Hotel!\\r\\rIf this happens again, please wait a moment before reloading.'), + ('Alert_WrongPassword', 'Check password!'), + ('nav_modify_letothersmove', 'Let other people move and leave furniture in the room.'), + ('furni_rare_dragonlamp*1_name', 'Sea Dragon Lamp'), + ('furni_table_plasto_4leg*10_desc', 'Hip plastic furniture'), + ('furni_sound_set_28_name', 'Rock 2'), + ('furni_grand_piano*2_name', 'Black Grand Piano'), + ('furni_basket_desc', 'Eggs-actly what you want for Easter'), + ('furni_rare_fan*5_name', 'Yellow Powered Fan'), + ('furni_noob_lamp*2_name', 'My first Habbo lamp'), + ('furni_present_gen4_desc', 'What\'s inside?'), + ('furni_pillar*9_desc', 'Ancient and stately'), + ('furni_chair_norja*8_desc', 'Sleek and chic for each cheek'), + ('furni_pura_mdl2*2_desc', 'Any way you like it!'), + ('furni_glass_stool*5_desc', 'Translucent beauty'), + ('furni_hc_lmp_name', 'Oil Lamp'), + ('console_myinterests', 'My interests:'), + ('furni_val_teddy*6_desc', 'The blue bear of happiness'), + ('room_cant_set_item', 'You cannot place this in someone else\'s room!'), + ('poster_29_desc', '10 x Gold Tinsel'), + ('club_general_daysleft', 'Number of HC days left'), + ('nav_popup_nav_link', 'Open the Navigator'), + ('furni_sound_set_43_desc', 'Beware zombies!'), + ('furni_solarium_norja*6_name', 'Blue Solarium'), + ('furni_doormat_plain*1_name', 'Doormat'), + ('nav_venue_chill_name', 'Zen Garden'), + ('furni_one_way_door*5_desc', 'One at a time!'), + ('furni_table_plasto_round*3_desc', 'Hip plastic furniture?'), + ('furni_prizetrophy6_desc', 'Palkinto'), + ('furni_exe_s_table_name', 'Executive Glass Table'), + ('furni_noob_rug*5_desc', 'Nice and neat sisal rug with pink edging'), + ('furni_scifirocket*0_name', 'Mars Smoke Machine'), + ('furni_soft_jaggara_norja_desc', 'Soft Iced sofachair'), + ('nav_venue_bb_lobby_amateur_9/0_desc', ''), + ('furni_chair_plasty*5_desc', 'Hip plastic furniture'), + ('hobba_mark_emergency', 'Emergency Help'), + ('furni_djesko_turntable_name', 'Habbo Turntable'), + ('furni_shelves_norja*9_desc', 'For nic naks and art deco books'), + ('poll_confirm_cancel_long', 'Are you sure you want to stop answering the poll? You can\'t continue later.'), + ('poster_32_desc', 'The Auspicious One'), + ('opening_hours_text_opening_time', 'The Hotel will open again at %h%:%m%. We look forward to welcoming you back!'), + ('furni_bed_budget_one*7_name', 'Green Pura Bed'), + ('furni_pillow*0_desc', 'Minimalist comfort!'), + ('furni_divider_poly3*8_desc', 'Yellow Mode Bardesk Gate'), + ('nav_venue_bb_lobby_beginner_13/0_desc', ''), + ('furni_sound_set_6_name', 'Ambient 3'), + ('hubu_win', 'Bus - Info'), + ('furni_sound_machine*5_name', 'Brown Traxmachine'), + ('furni_sporttrack1*2_desc', 'null'), + ('bb_title_bouncingBall', 'Battle Ball'), + ('nav_venue_rooftop/0_desc', 'Hang out on the very rooftop of Habbo Hotel!'), + ('modtool_banreason', 'Ban Reason:'), + ('furni_chair_silo*9_desc', 'Red Silo Dining Chair'), + ('furni_bed_budget*6_desc', 'King sized comfort!'), + ('furni_s_sound_machine*4_desc', 'Sound Machine Blue Desc'), + ('furni_rubberchair*6_desc', 'Soft and tearproof!'), + ('nav_venue_sw_lobby_expert_1_name', 'Snow Marksmen Lobby'), + ('nav_venue_bb_lobby_beginner_7/0_desc', ''), + ('furni_table_plasto_4leg*5_desc', 'Hip plastic furniture'), + ('gen_youhave', 'You Have'), + ('furni_carpet_soft*6_name', 'Soft Wool Rug'), + ('furni_petfood2_desc', 'Fantastic 20% Saving!'), + ('group_privileges', 'Priviliges:'), + ('furni_samovar_name', 'Russian Samovar'), + ('furni_hal_grave_name', 'Haunted Grave'), + ('furni_bed_budget_one*2_desc', 'Princess sized comfort!'), + ('gs_error_1', 'You have entered invalid data!'), + ('reject', 'Reject'), + ('gs_error_4', 'You have reached your maximum number of daily Games!'), + ('nav_venue_sw_lobby_tournament_5_name', 'Tournament Lobby'), + ('gs_error_5', 'Tournament is only available for users living in the UK.'), + ('gs_error_2', 'You don\'t have enough Tickets!'), + ('gs_error_8', 'To start a Game, there must be at least two Teams of one player each!'), + ('sound_machine_alert_no_sound_sets', 'You don\'t have any sound sets available for song editing. \\rNote that the sets need to be in your inventory (hand).'), + ('furni_waterbowl*4_desc', 'Aqua unlimited'), + ('furni_doormat_love_desc', 'Welcome Habbos in style'), + ('gs_error_6', 'You have been removed from the Game!'), + ('furni_soft_sofachair_norja*4_desc', 'Sit back and relax'), + ('bb_powerup_desc_8', 'By using a vacuum cleaner, you can clear any tile in the field.'), + ('move', 'Move'), + ('furni_romantique_smalltabl*3_name', 'Turquoise Tray Table'), + ('furni_bed_polyfon*8_name', 'Yellow Mode Double Bed'), + ('furni_sofachair_polyfon*4_desc', 'Beige Mode Armchair'), + ('forgottenpw_email', 'Your email address'), + ('console_email', 'Email'), + ('bb_powerup_desc_1', 'Light bulb colours an area around it.'), + ('furni_divider_nor2_desc', 'Strong, yet soft looking'), + ('furni_bardeskcorner_polyfon*5_desc', 'For sweet corners!'), + ('say', 'Say'), + ('bb_powerup_desc_3', 'Flashlight colours a straight line ahead of you.'), + ('bb_powerup_desc_2', 'Bouncing on a spring locks tiles in a single jump.'), + ('bb_powerup_desc_5', 'Bouncing on a box of pins will burst your Battle Ball!'), + ('bb_powerup_desc_4', 'A shot with a cannon locks tiles on a straight line.'), + ('furni_chair_basic*1_name', 'chair_basic'), + ('bb_powerup_desc_7', 'A bomb will clear all tiles around it.'), + ('bb_powerup_desc_6', 'Harlequin effect makes everybody colour tiles for your team!'), + ('NUF_console_read_next', 'Click \'OK\' to mark message as read.'), + ('poster_50_name', 'Bat Poster'), + ('furni_table_plasto_4leg*15_name', 'Occasional Table'), + ('furni_tree7_desc', 'Walking in a winter wonderland!'), + ('poster_37_name', 'The Habbo Babes 3'), + ('furni_queue_tile1*7_desc', 'The power of movement'), + ('furni_bed_budgetb_name', 'Plain Double Bed'), + ('interface_icon_sound', 'Sound Off/On'), + ('pet.hotwords.come_here', 'come here'), + ('poster_10_name', 'Lapland Poster'), + ('win_delete_item', 'Remove Item'), + ('wallitem_hrella_poster_3_name', 'Anchor'), + ('furni_table_plasto_bigsquare*8_desc', 'Hip plastic furniture'), + ('furni_habboween_grass_name', 'Unholy Ground'), + ('furni_plant_valentinerose*4_name', 'Pink Valentine\'s Rose'), + ('nav_venue_skylight_lobby/0_desc', 'Lift your spirits on the top floor'), + ('buddyremove_alphabetical', 'Alphabetical Order'), + ('alert_win_coppa', 'You are blocked'), + ('nav_venue_bb_lobby_amateur_5_name', 'Gevorderden Battle Ball 6'), + ('reg_update_text', 'Never change your password or email just because somebody asks you to. He / she is most probably trying to steal your Habbo account and furni!'), + ('decision_ok', 'OK'), + ('furni_summer_grill*3_name', 'Yellow Barbeque Grill'), + ('nav_public_helptext', 'These are hotel\'s public rooms. What are you waiting for? Go and meet other Habbos!'), + ('tickets_button_info_2', 'Stuff you can do with these 20 tickets'), + ('furni_rclr_chair_name', 'Palm Chair'), + ('login_create1here', 'You can create one here.'), + ('tickets_button_info_1', 'Stuff you can do with these 2 tickets'), + ('furni_prizetrophy6*3_name', 'Champion trophy'), + ('furni_shelves_norja*2_desc', 'For nic naks and art deco books'), + ('purse_info', 'DESCRIPTION'), + ('bb_choose_powerups', 'Powerup select'), + ('purse_transaction', 'View Transactions'), + ('reg_birthdayformat', 'Birthday*: [dd][mm][yyyy]'), + ('Alert_YouMustAgree', 'You must accept the Terms and Conditions before proceeding.'), + ('jukebox_empty', 'Empty'), + ('purse_info_film', 'Films For Camera'), + ('furni_sofachair_polyfon*9_desc', 'Loft-style comfort'), + ('furni_habbocake_desc', 'Save me a slice!'), + ('furni_doormat_plain*6_desc', 'Available in a variety of colours'), + ('nav_venue_sun_terrace/0_desc', 'For lazy afternoons and super tan treatment!'), + ('poster_501_desc', 'For pirates everywhere'), + ('pet_thir_2', 'Thirsty'), + ('gs_error_watch_0', 'All The Spectator Seats Are Taken!'), + ('pet_thir_3', 'Not thirsty'), + ('camera_open_dialog_text', 'Would you like to take some photos\\ror put your camera in your room?'), + ('furni_bed_budget_one*9_desc', 'Prince sized comfort!'), + ('ph_goswimming', 'Go swimming!'), + ('furni_habboween_crypt_name', 'Creepy Crypt'), + ('gs_error_join_7', 'You have already joined this Game!'), + ('nav_venue_sw_lobby_amateur_3_name', 'Snow Slingers Lobby'), + ('furni_romantique_smalltabl*4_name', 'Amber Tray Table'), + ('gs_error_join_3', 'You either have too much or too little skill to join.'), + ('pet_thir_0', 'Gasping'), + ('gs_error_join_0', 'The team you selected is already full.'), + ('pet_thir_1', 'Parched'), + ('furni_gothic_stool*3_name', 'Gothic Stool Red'), + ('furni_wooden_screen*1_name', 'Pink Oriental screen'), + ('furni_sofa_silo*4_name', 'Beige Area Sofa'), + ('furni_queue_tile1*2_desc', 'The power of movement'), + ('buddyremove_continue', 'Remove Friend Now'), + ('nav_venue_bb_lobby_expert_2/0_desc', ''), + ('nav_loading', 'Loading...'), + ('furni_bed_armas_two_name', 'Double Bed'), + ('furni_prizetrophy4*1_name', 'Fish trophy'), + ('furni_sound_machine*7_desc', 'Red alert. Red alert. It\'s a party!'), + ('furni_glass_sofa_desc', 'Translucent beauty'), + ('furni_barchair_silo*5_name', 'Pink Bar Stool'), + ('furni_soft_sofachair_norja*5_desc', 'Pink Iced Sofachair'), + ('console_fr_accepted_count', 'Amount to be accepted'), + ('poster_2001_desc', 'Perinteinen ryijy,'), + ('furni_couch_norja*5_desc', 'Two can perch comfortably'), + ('furni_rclr_lamp_desc', 'Light your space'), + ('furni_sand_cstl_wall_desc', 'sand_cstl_wall'), + ('furni_one_way_door*4_name', 'Beige One Way Gate'), + ('furni_corner_china_name', 'Dragon Screen'), + ('nav_venue_sw_lobby_amateur_4/0_desc', 'Astetta rankempaa lumisotaa.'), + ('furni_chair_silo*7_name', 'Green Silo Dining Chair'), + ('transaction_system_messenger', 'Console SMS'), + ('furni_pura_mdl4*8_desc', ''), + ('console_reject_selected', 'Reject selected'), + ('furni_rare_icecream*4_desc', 'Virtual strawberry rocks!'), + ('furni_prizetrophy*2_desc', 'Shiny silver'), + ('furni_scifiport*0_desc', 'Energy beams. No trespassers!'), + ('paalu_ui2', 'Push'), + ('paalu_ui3', 'Moving'), + ('paalu_ui4', 'Stabilise'), + ('paalu_ui5', 'Balance'), + ('furni_sofa_polyfon*7_name', 'Green Mode Sofa'), + ('nav_error_toomanyfavrooms', 'You can\'t have more than 10 favourite rooms! Please remove an old favourite if you want to add a new one.'), + ('furni_noob_stool*5_name', 'My first Habbo stool'), + ('sound_machine_alert_missing_packages', 'You need the following Traxpacks to edit this song:'), + ('furni_grunge_bench_name', 'Bench'), + ('paalu_ui1', 'Balance'), + ('furni_sleepingbag*5_name', 'Graphite Sleeping Bag'), + ('furni_divider_nor2*3_name', 'White Iced Bar-Desk'), + ('bb_header_teams', 'Teams'), + ('wallitem_sw_swords_name', 'Swords'), + ('furni_val_choco_desc', 'One for them. Two for me!'), + ('nav_venue_bb_lobby_expert_5/0_desc', ''), + ('furni_soft_sofa_norja*2_name', 'Black Iced Sofa'), + ('furni_bed_budgetb_one_desc', 'All you need for a good night\'s kip'), + ('furni_carpet_standard*8_name', 'Floor Rug'), + ('furni_rare_dragonlamp*6_name', 'Gold Dragon Lamp'), + ('furni_sound_set_56_desc', 'Get down tonight!'), + ('furni_divider_nor5*2_name', 'Black Iced Angle'), + ('chat.curse_word', 'Bobba'), + ('furni_couch_norja*4_desc', 'Two can perch comfortably'), + ('furni_scifirocket*2_desc', 'A little closer to home!'), + ('furni_rare_fan*6_desc', 'It\'ll blow you away!'), + ('poster_514_name', 'The EU flag'), + ('club_desc_2_period', '3 Months (93 days) = 60 Credits'), + ('furni_glass_chair*9_desc', 'Translucent beauty'), + ('poster_1338_desc', 'If her age on the clock, she ready for the cock'), + ('nav_src_hd', 'Search Results.'), + ('console_unknown_sender', 'Unknown sender'), + ('furni_prizetrophy4_name', 'Pokaali'), + ('nav_venue_sunset_cafe/0_desc', 'Come and chat about Official Fansites and meet their staff!'), + ('furni_pura_mdl4*9_desc', 'Any way you like it!'), + ('furni_pillar*8_name', 'Roman Pillar'), + ('nav_venue_sport/0_desc', 'St Trinian\'s is out on DVD April 14th!'), + ('furni_pillar*7_name', 'Atlantean Pillar'), + ('club_extend_text', 'If you\'re subscribing again to Habbo Club, you won\'t lose any of the advantages or ongoing furni gifts. Club membership can be extended in advance.\\rRemember: one club month lasts 31 days.'), + ('sound_machine_confirm_eject', 'Remove cartridge?'), + ('shopping_got', 'You have xx in your Purse.'), + ('furni_rare_stand_desc', 'Stand and Deliver!'), + ('furni_chair_plasto_desc', 'Hip plastic furniture'), + ('furni_bed_polyfon_one*9_desc', 'Cot of the artistic'), + ('furni_couch_norja*9_name', 'Red Bench'), + ('poster_3_desc', 'Smells fishy, looks cool'), + ('paalu.winner', 'Winner:'), + ('NUF_meeting_people_room_wave', 'These buttons let you wave and dance. Click on your Habbo at anytime to see these buttons.'), + ('sound_machine_confirm_window', 'Sound Machine'), + ('furni_one_way_door*3_name', 'White HC Gate'), + ('furni_chair_plasty*9_name', 'Plastic Pod Chair'), + ('gs_timeleft', 'Time Left \\x'), + ('hobba_pickup', 'Pick Up'), + ('console_lastvisit', 'Last Visit'), + ('furni_rare_globe_desc', 'It\'s all white..'), + ('furni_val_cauldron_name', 'Valentine\'s Cauldron'), + ('poster_43_name', 'Chains'), + ('furni_bardesk_polyfon*8_desc', 'Yellow Mode Bardesk'), + ('furni_sound_set_36_name', 'Latin Love 1'), + ('dimmer_apply', 'Apply'), + ('furni_glass_chair*8_desc', 'Translucent beauty'), + ('furni_pura_mdl2*7_desc', 'Any way you like it!'), + ('furni_prizetrophy*3_desc', 'Breathtaking bronze'), + ('furni_marquee*1_name', 'Pink marquee'), + ('NUH_own_user', 'This is your Habbo. Click on the floor to move around.'), + ('furni_gothic_sofa*1_desc', 'The dark side of Habbo'), + ('furni_divider_nor5*3_name', 'White Iced Angle'), + ('furni_divider_nor4*5_name', 'Pink Iced Auto Shutter'), + ('furni_soft_sofa_norja*3_name', 'White Iced Sofa'), + ('furni_sofachair_silo*8_desc', 'Large, but worth it'), + ('furni_pura_mdl1*9_desc', 'Any way you like it!'), + ('furni_chair_plasto*7_name', 'Chair'), + ('furni_pura_mdl5*6_desc', 'Any way you like it!'), + ('emailpw', 'Send'), + ('sound_machine_playlist_window', 'Traxmachine Playlist Editor'), + ('furni_pura_mdl1*3_desc', 'Any way you like it!'), + ('furni_noob_table*5_desc', 'Lightweight, practical and pink'), + ('furni_scifirocket*6_name', 'Mercury Smoke Machine'), + ('furni_shelves_norja_name', 'Bookcase'), + ('poster_521_name', 'Flag of Brazil'), + ('sound_machine_jukebox_disk_window', 'Insert disc'), + ('furni_table_norja_med*6_desc', 'For larger gatherings'), + ('furni_pillow*6_name', 'Blue Cotton Pillow'), + ('furni_shelves_norja*3_desc', 'For nic naks and art deco books'), + ('queue_set.s.info', 'There are %d% Habbos in front of you in the queue to see the Habbo Live broadcast!'), + ('reg_parentemail_info', 'Because of your age, we need to let your parents know you are registering at Habbo Hotel. Please give the email address of one of your parents/guardians.'), + ('club_txt_paycash', 'Pay by Cash'), + ('furni_chair_plasto*11_name', 'Chair'), + ('furni_pizza_name', 'Pizza Box'), + ('furni_table_plasto_4leg*6_desc', 'Hip plastic furniture'), + ('furni_chair_silo*3_desc', 'Keep it simple'), + ('alert_reg_t', 'Please check these details:'), + ('nav_venue_theatredrome_name', 'Theatredrome'), + ('furni_hc_rntgn_desc', 'Believe it or not!'), + ('nav_venue_main_lobby_name', 'Main Lobby'), + ('furni_sound_set_64_desc', 'Make a little Jinn-gle!'), + ('nav_venue_sw_lobby_amateur_desc', 'Practice improves a Snow Stormer\'s aim... Ops, missed!'), + ('furni_scifiport*5_name', 'Security Fence'), + ('furni_lamp_basic_desc', 'Switch on the atmosphere with this sophisticated light'), + ('pet.saying.sniff.cat.0', 'snuh..snuh'), + ('poster_506_name', 'The flag of Finland'), + ('furni_bardeskcorner_polyfon*6_desc', 'Blue Mode Bardesk Corner'), + ('nav_venue_hotel_kitchen_name', 'Hotel Kitchen'), + ('furni_doorB_desc', 'Narnia this way!'), + ('poster_11_name', 'Certificate'), + ('furni_safe_silo_desc', 'Totally shatter-proof!'), + ('furni_bed_budget_one*3_desc', 'Prince sized comfort!'), + ('furni_romantique_divider*4_name', 'Ochre Screen'), + ('previous_onearrowed', '< Previous'), + ('nav_venue_bb_lobby_tournament_3_name', 'Competitie Battle Ball 4'), + ('furni_plant_sunflower_desc', 'For happy Habbos'), + ('furni_throne_desc', 'Important Habbos only'), + ('furni_exe_bardesk_name', 'Executive Bar Desk'), + ('furni_tree6_desc', 'The future\'s bright!'), + ('log_problem_title', 'Problems Connecting'), + ('furni_chair_basic*2_name', 'Pink Pura Egg Chair'), + ('game_chess_black', 'Black:'), + ('furni_glass_sofa*9_name', 'Glass sofa'), + ('furni_chair_norja*2_desc', 'Sleek and chic for each cheek'), + ('furni_pillar*3_desc', 'Ancient and stately'), + ('furni_scifidoor*8_desc', 'There out of this world!'), + ('alert_InvalidUserName', 'Don\'t use this character: \\x !'), + ('furni_rare_parasol*3_name', 'Violet Parasol'), + ('furni_bed_budget*5_desc', 'King sized comfort!'), + ('furni_chair_silo*8_name', 'Yellow Dining Chair'), + ('nav_tryingpw', 'Trying the password...'), + ('furni_cn_lamp_desc', 'Light of the East'), + ('furni_prizetrophy3*3_name', 'Globe trophy'), + ('furni_sound_set_16_desc', 'Ferry, ferry good!'), + ('furni_table_plasto_round*4_desc', 'Hip plastic furniture'), + ('poster_2007_desc', 'The legendary founder of the Hotel'), + ('sound_machine_insert', 'Add to mixer'), + ('furni_sound_machine*1_desc', 'Let the party begin!'), + ('furni_bed_polyfon_one*8_desc', 'Yellow Mode Single Bed'), + ('error_room_closed', 'Huone on suljettu.'), + ('pet.hotwords.play_dead', 'play dead'), + ('gs_button_go_finished', 'Scores'), + ('group_member', 'Member'), + ('sound_machine_confirm_save', 'Save the song?'), + ('furni_arabian_wndw_desc', 'Arabian days and nights'), + ('nav_venue_sw_lobby_expert_2_name', 'Snow Marksmen Lobby'), + ('furni_sound_set_57_desc', 'Feel the groove'), + ('furni_triplecandle_desc', 'No need to worry about wax drips'), + ('char_welcome', 'Welcome!'), + ('furni_sound_machine*6_desc', 'Add some effects to your room!'), + ('furni_sofachair_polyfon*3_desc', 'Loft-style comfort'), + ('nav_venue_bb_lobby_amateur_6/0_desc', ''), + ('group_logo_url_template', 'http://www.habbohotel.co.uk/habbo-imaging/badge-fill/%imagerdata%.gif'), + ('furni_table_plasto_bigsquare*2_desc', 'Hip plastic furniture'), + ('furni_glass_table*5_desc', 'Translucent beauty'), + ('url_purse_link', 'http://%predefined%//credits?'), + ('buddyremove_logintime', 'Last Login Time'), + ('NUF_meeting_people_hotelview_tutor', 'The Navigator lets you move between rooms in the Hotel, so open it up to get started!'), + ('furni_sofa_polyfon*6_name', 'Blue Mode Sofa'), + ('furni_scifirocket*1_desc', 'There is always space for this!'), + ('nav_venue_bb_lobby_amateur_10/0_desc', ''), + ('furni_prizetrophy5_name', 'Pokaali'), + ('purse_info_tickets', 'Gaming Tickets'), + ('poster_513_name', 'The Australian flag'), + ('furni_noob_chair*3_desc', 'Lightweight, practical, with red stripes'), + ('alert_old_client', 'You have an old version cached. Please empty your browser cache and login again.'), + ('furni_bar_basic_name', 'A Pura Minibar'), + ('furni_shelves_norja*8_desc', 'For nic naks and art deco books'), + ('sound_machine_save_window', 'Save your Trax'), + ('poster_51_name', 'Basketball Hoop'), + ('Alert_moderator_warning', ''), + ('furni_solarium_norja*5_name', 'Pink Solarium'), + ('furni_sporttrack2*1_desc', 'null'), + ('furni_rubberchair*7_desc', 'Soft and tearproof!'), + ('reg_parentemail_moreinfo', 'More information:'), + ('furni_present_gen5_desc', 'What\'s inside?'), + ('furni_bed_polyfon*9_desc', 'Give yourself space to stretch out'), + ('sound_machine_confirm_save_list_long', 'Are you sure you want to overwrite the current playlist?'), + ('cam_zoom_in.help', 'Zoom In'), + ('furni_carpet_soft*5_name', 'Soft Wool Rug'), + ('furni_plant_small_cactus_name', 'Small Cactus'), + ('console_creatingaprofile', 'Creating A Profile'), + ('console_select_all', 'Select all'), + ('hobba_reply_cfh', 'Reply to:'), + ('notickets_buygame', 'Buy a game'), + ('furni_sporttrack1*3_desc', 'null'), + ('furni_sleepingbag*1_desc', 'Ultimate coziness'), + ('furni_gothic_stool*4_name', 'Black Gothic Stool'), + ('nav_venue_bb_lobby_beginner_4/0_desc', ''), + ('nav_venue_netcafe/0_desc', 'Learn a foreign language and win Habbo Credits in our quests!'), + ('poster_31_desc', 'Pure and unbridled nu-metal'), + ('furni_sound_set_24_desc', 'It\'s all about the Pentiums, baby!'), + ('pet.saying.angry.dog.3', 'dog.1=Oouh..oouh..snuh..ooo'), + ('furni_bed_budget_one*8_desc', 'Prince sized comfort!'), + ('pet.saying.angry.dog.4', 'ARRR Grrr.. woof woof woof'), + ('pet.saying.angry.dog.1', 'Woof! Grrrr..woof woof'), + ('furni_sw_table_desc', ''), + ('pet.saying.angry.dog.2', 'grRRRRrr.r...r'), + ('pet.saying.angry.dog.0', 'Rrrr..woof.. Rrr'), + ('furni_chair_china_name', 'Chinese Lacquer Chair'), + ('furni_romantique_divan*2_desc', 'Recline in continental comfort'), + ('furni_divider_silo1*6_desc', 'Blue Area Corner Shelf'), + ('furni_sound_set_5_name', 'Ambient 4'), + ('roomevent_browser_create', 'Host an event'), + ('furni_noob_rug*6_desc', 'Nice and neat sisal rug with green edging'), + ('transaction_system_bank_luottokunta', 'Luottokortti'), + ('furni_bed_armas_one_name', 'Single Bed'), + ('furni_plant_fruittree_desc', 'Great yield and sweet fruit'), + ('furni_sound_machine_pro_desc', 'creating fancy sounds'), + ('nav_ownrooms_helptext', 'If you didn\'t know, these are your rooms. Here you can modify your rooms or create new ones if you feel like it.'), + ('furni_grunge_radiator_desc', 'Started cool but now it\'s hot!'), + ('furni_divider_silo3*7_desc', 'Green Area Gate'), + ('room_hold', 'Wait a second...\\rLoading room...'), + ('furni_sound_set_49_desc', 'You will belong'), + ('nav_venue_emperors/0_desc', 'Even the smallest of light... shines in the darkness'), + ('furni_nest_name', 'Basket'), + ('furni_noob_table*4_name', 'My first Habbo table'), + ('furni_sound_set_51_desc', 'Bop to the beat'), + ('furni_plant_maze_snow_desc', '20 x Snowy Maze Shrubbery'), + ('NUF_meeting_people_hotelview_icon', 'Click the Navigator button to start visiting the rooms!'), + ('furni_scifirocket*7_desc', 'Larger than life!'), + ('furni_table_plasto_round*9_name', 'Round Dining Table'), + ('furni_val_teddy*5_name', 'Yellow Share Bear'), + ('nav_venue_bb_lobby_expert_2_name', 'Experts Battle Ball 3'), + ('console_onfrontpage', 'Online'), + ('poster_1000_desc', 'The Noble and Silver Show'), + ('furni_rare_icecream*9_name', 'Bubblegum Ice Cream Machine'), + ('furni_rare_fan*0_name', 'Festive Fan'), + ('furni_carpet_polar_name', 'Faux-Fur Bear Rug'), + ('hobba_chatlog', 'See Chat Log >>'), + ('furni_romantique_chair*3_desc', 'null'), + ('hobba_pickedby', 'Picked Up By:'), + ('poster_24_desc', 'Trying to get in or out?'), + ('furni_table_silo_small*2_desc', 'For those random moments'), + ('furni_table_plasto_bigsquare*15_name', 'Occasional Table'), + ('furni_prizetrophy7*2_desc', 'Silver Habbo trophy'), + ('ph_keys_run', 'Run:'), + ('error_title', 'Oops, error!'), + ('furni_rare_dragonlamp*0_name', 'Fire Dragon Lamp'), + ('furni_CFC_50_coin_silver_name', 'Silver Coin (China)'), + ('furni_chair_plasty_name', 'Plastic Pod Chair'), + ('nav_roomInfo', 'Room info'), + ('furni_sound_set_63_name', 'Alhambra Trax 2'), + ('furni_divider_nor2*9_desc', 'Red Iced bar desk'), + ('furni_soft_sofa_norja*8_name', 'Yellow Iced Sofa'), + ('poster_57_desc', 'chinese calligraphy'), + ('furni_table_plasto_4leg*16_name', 'Occasional Table'), + ('accept', 'Accept'), + ('pet.saying.beg.cat.2', 'MEOW, MEOW, MEOW..'), + ('furni_waterbowl*3_desc', 'Aqua unlimited'), + ('furni_divider_poly3*2_name', 'Black Mode Bardesk Gate'), + ('furni_divider_nor3_desc', 'Do go through...'), + ('furni_table_plasto_square*5_desc', 'Hip plastic furniture'), + ('furni_rubberchair*1_desc', 'Soft and stylish HC chair'), + ('furni_divider_nor5*8_name', 'Yellow Iced Angle'), + ('furni_pura_mdl4*3_desc', 'Any way you like it!'), + ('nav_removerights_desc', 'Remove all rights to this room from other users.'), + ('furni_chair_norja*7_name', 'Rural Chair'), + ('furni_pillar*2_name', 'Nordic Pillar'), + ('furni_bed_polyfon*3_name', 'White Double Bed'), + ('furni_glass_chair*3_desc', 'Translucent beauty'), + ('wallitem_xmas_light_name', 'Xmas light'), + ('pet.saying.beg.cat.0', 'MaUUU...MEOW...meow'), + ('pet.saying.beg.cat.1', '*looks up with sad eyes*'), + ('reg_verification_newEmail', 'Your new email address:'), + ('furni_sound_set_29_desc', 'Electronic house'), + ('furni_joulutahti_desc', 'Christmas in a pot'), + ('furni_china_table_name', 'Chinese Lacquer Table'), + ('poster_507_desc', 'The French flag'), + ('NUF_visiting_rooms_hotelview_nav', 'Click the icon to open the Navigator.'), + ('dimmer_preset_1', 'Preset 1'), + ('nav_private_helptext', 'These are the rooms owned by Habbos. Select a category first and then browse some rooms and meet some people!'), + ('furni_queue_tile1*8_desc', 'The power of movement'), + ('dimmer_preset_2', 'Preset 2'), + ('furni_arabian_pllw_name', 'Green Blossom Pillow'), + ('nav_venue_bb_lobby_tournament_7/0_desc', ''), + ('furni_goodie1*1_desc', 'Crunchy Dog Treat'), + ('poster_36_name', 'The Habbo Babes 2'), + ('poll_window', 'Question'), + ('furni_md_limukaappi_desc', 'A sparkling and refreshing pixel drink!'), + ('nav_venue_rooftop_rumble_ii_name', 'Rooftop Rumble II'), + ('furni_wooden_screen*7_name', 'Purple Oriental Screen'), + ('furni_scifidoor*2_name', 'Yellow Spaceship Door'), + ('room_max_pet_limit', 'Too many pets in the room!'), + ('hobba_sent_to_helpers', 'Call re-assigned as emergency and sent to moderators'), + ('furni_table_silo_med*4_desc', 'Beige Area Coffee Table'), + ('furni_romantique_pianochair*5_name', 'Onyx Piano Stool'), + ('nav_modify_roomdescription', 'Room Description'), + ('furni_sound_set_10_name', 'Hip Hop Beats 1'), + ('furni_chair_silo*2_name', 'Black Dining Chair'), + ('furni_marquee*6_name', 'Blue Marquee'), + ('poster_8_name', 'Habbo Colours'), + ('transaction_system_htk_singledrop', 'Landline'), + ('furni_chair_plasty*4_desc', 'Hip plastic furniture'), + ('dimmer_preset_3', 'Preset 3'), + ('furni_exe_corner_desc', 'Tuck it away'), + ('nav_venue_welcome_lounge/0_desc', 'New? Lost? Get a warm welcome here from Habbo eXperts.'), + ('furni_sleepingbag*6_desc', 'Ultimate coziness'), + ('nav_venue_cunning_fox_gamehall/3_name', 'Batleships'), + ('console_mainhelp', 'Habbo Console Help'), + ('tickets_button_info_hide', 'Hide Ticket Info'), + ('furni_xmas_icelamp_name', 'Lantern Bundle 2'), + ('nav_venue_bb_lobby_amateur_0/0_desc', ''), + ('purse_header', 'Habbo Purse'), + ('furni_noob_lamp*3_name', 'My first Habbo lamp'), + ('nav_help_title', 'Want a room of your own?'), + ('buy', 'Buy'), + ('furni_pura_mdl1*8_name', 'yellow pura module 1'), + ('dimmer_title', 'Mood Light'), + ('NUF_mini_meet_people_hotelview_icon', 'Click the Navigator button to start visiting the rooms!'), + ('console_credits', 'Credits'), + ('bb_link_highScores_url', 'http://%predefined%/groups/56552/id'), + ('wallitem_md_logo_wall_desc', 'Bubble up your wall'), + ('furni_safe_silo*4_desc', 'Totally shatter-proof!'), + ('room_unignore', 'Listen'), + ('nav_venue_sw_lobby_amateur_1/0_desc', ''), + ('poster_16_name', 'Bars'), + ('furni_sofachair_silo*7_name', 'Green Area Armchair'), + ('furni_spyro_name', 'Dragon Egg'), + ('nav_venue_bb_lobby_beginner_19/0_desc', ''), + ('Alert_YourPasswordIsTooShort', 'Passwords must be at least 6 characters long.'), + ('room_cant_trade', 'You cannot trade this!'), + ('furni_door_desc', 'Dr Who?'), + ('gs_button_go_created', 'Join'), + ('poster_49_name', 'Large silver star'), + ('furni_glass_sofa*4_name', 'Glass sofa'), + ('furni_divider_arm3_desc', 'Knock, knock...'), + ('furni_sound_set_31_desc', 'House loops'), + ('reg_habboname', 'Habbo name:'), + ('habboclub_thanks', 'Yippee! You are now a member of Habbo Club! Your current email address is %email%. \\r\\rIf that\'s not the one you are using, please go to \'Update my Habbo ID\' and change it now. \\rThen we can contact you about your membership if need be.'), + ('console_follow_offline', 'Your friend is offline.'), + ('furni_divider_nor1*5_name', 'Pink Ice corner'), + ('nav_openbutton', 'Open'), + ('nav_venue_theatredrome_habbowood/0_desc', 'Home to the Habbowood Gala and HAFTA Awards!'), + ('nav_venue_ice_cafe/0_desc', 'Come here. And chill out.'), + ('furni_calippo_name', 'Calippo icecream machine'), + ('furni_bench_lego_desc', 'For your reserve players'), + ('poster_9_desc', 'Do your bit for the environment'), + ('furni_bed_polyfon_one*3_desc', 'Cot of the artistic'), + ('poster_44_desc', 'Beware the curse...'), + ('poster_2006_name', 'DJ Throne'), + ('furni_pura_mdl3*5_desc', ''), + ('furni_arabian_tray4_name', 'Fruit Tray'), + ('furni_divider_nor3*7_desc', 'Entrance or exit?'), + ('furni_sound_set_30_name', 'Instrumental 1'), + ('furni_romantique_tray1_name', 'Breakfast Tray'), + ('furni_jp_tray1_desc', 'jp_tray1'), + ('furni_plant_maze_desc', 'Build your maze!'), + ('console_getfriendrequest_2', 'If you accept this invitation (s)he will be added to your Friends List. Then you can send messages to each other.'), + ('furni_hockey_light_name', 'Lert'), + ('furni_goodie1_desc', 'Crunchy Dog Treat'), + ('console_getfriendrequest_1', 'has asked you to become his/her Friend.'), + ('furni_pura_mdl2*1_desc', 'Any way you like it!'), + ('score_board.text', 'POINTS'), + ('furni_one_way_door*9_name', 'Red One Way Gate'), + ('furni_sand_cstl_twr_desc', 'sand_cstl_twr desc'), + ('furni_divider_nor5*9_desc', 'Cool cornering for your crib y0!'), + ('furni_duck_desc', 'Every bather needs one'), + ('furni_bardesk_polyfon*2_desc', 'Black Mode Bardesk'), + ('console_request_2', '(S)he will be added into your Friends List if (s)he accepts it.'), + ('bb_link_join', 'Join Team'), + ('nav_createroom_hd', 'Here you can create your own room!'), + ('console_request_1', 'has been sent your Friend Request.'), + ('reg_check_info', 'CHECK YOUR INFO'), + ('furni_toy1*4_name', 'Rubber Ball'), + ('nav_venue_sw_lobby_free_0_name', 'Free Game Lobby'), + ('furni_chair_plasto*1_name', 'Chair'), + ('furni_toilet_name', 'Loo Seat'), + ('queue_set.dc.info', 'Number of Habbos in default queue is %d% and in Habbo Club queue %c%'), + ('furni_sofachair_silo*2_desc', 'Large, but worth it'), + ('furni_chair_plasto*12_desc', 'Hip plastic furniture'), + ('ph_tickets_buyfor', 'Buy Tickets for:'), + ('sound_machine_confirm_close', 'Close the editor?'), + ('furni_rare_fan*1_desc', 'It\'ll blow you away!'), + ('furni_divider_poly3*3_desc', 'Border control!'), + ('nav_venue_kattoterassi/0_desc', 'When push comes to shove...'), + ('furni_summer_grill*4_desc', 'Plenty of burgers on that barbie'), + ('furni_bar_armas_desc', 'It\'s a barrel of laughs and a great talking point'), + ('furni_toilet_red_name', 'Loo Seat'), + ('furni_hc_lmp_desc', 'Be enlightened'), + ('furni_romantique_mirrortabl_name', 'Dressing Table'), + ('furni_pura_mdl4*2_name', 'Pink Pura Module 4'), + ('summer_chair_5_desc', 'Enjoy the summer air'), + ('furni_plant_rose_desc', 'Sleek and chic'), + ('furni_skullcandle_name', 'Skull Candle Holder'), + ('Alert_no_credits', 'You don�t have enough Credits for this.'), + ('pet.hotwords.voice', 'speak'), + ('furni_prizetrophy4*2_desc', 'Shiny silver'), + ('furni_soft_sofachair_norja*4_name', 'Urban Iced Sofachair'), + ('furni_pura_mdl5*1_desc', 'Any way you like it!'), + ('furni_safe_silo*9_name', 'Red Safe Minibar'), + ('furni_bed_trad_desc', 'Sweet dreams for two'), + ('nav_venue_club_massiva_desc', 'Strut your funky stuff!'), + ('furni_rare_dragonlamp*1_desc', 'Out of the deep blue!'), + ('furni_wooden_screen*2_desc', 'Add an exotic touch to your room'), + ('furni_prizetrophy7*1_name', 'Gold Habbo trophy'), + ('furni_carpet_standard*2_name', 'Floor Rug'), + ('furni_arabian_teamk_desc', 'Quench that desert thirst'), + ('furni_romantique_chair*2_name', 'Lime Romantique Chair'), + ('nav_venue_sw_lobby_tournament_0_name', 'Tournament Lobby'), + ('invitation_expired', 'Sorry, all Welcoming Party members were busy.'), + ('gs_error_game_checkname', 'Please check the Game\'s name!'), + ('furni_sound_set_23_name', 'SFX 4'), + ('furni_grand_piano*2_desc', 'Black Grand Piano'), + ('tutorial_quit', 'Close guide'), + ('furni_chair_basic*8_desc', ''), + ('NUF_getting_room_roommatic_security_tutor', 'Finally you can choose the security settings to your room and whether other users can move your furniture.'), + ('nav_venue_bb_lobby_beginner_1/0_desc', ''), + ('nav_private_helptext_hd_main', 'Habbo Guest Rooms'), + ('club_price', 'One month costs 25 Habbo Credits.'), + ('NUF_playing_games_navigator_tutor', 'Click either SnowStorm or BattleBall to open up a list of the game lounges.'), + ('nav_venue_old_skool_name', 'Old Skool Habbo'), + ('nav_venue_bb_lobby_beginner_4_name', 'Beginners Battle Ball 5'), + ('nav_venue_bb_lobby_tournament_9_name', 'Competitie Battle Ball 10'), + ('sound_machine_alert_song_saved', 'Song "%name%" successfully saved.'), + ('nav_venue_sw_lobby_intermediate_3_name', 'Snow Bombardiers Lobby'), + ('nav_venue_club_massiva/1_desc', 'Strut your funky stuff'), + ('furni_gothic_chair*1_name', 'Gothic Chair Pink'), + ('furni_divider_poly3_desc', 'All bars should have one'), + ('furni_romantique_divan*1_name', 'Pink Romantique Divan'), + ('NUF_playing_games_hotelview_tutor', 'Now we find out where to locate the Habbo Games!'), + ('poster_29_name', 'Gold Tinsel Bundle'), + ('furni_present_gen4_name', 'Gift'), + ('furni_bardesk_polyfon*7_name', 'Green Mode Bardesk'), + ('furni_gothic_sofa*6_name', 'Gothic Sofa Blue'), + ('furni_glass_stool*5_name', 'Glass stool'), + ('nav_venue_sw_lobby_free_5/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('nav_fav_hd', 'Your Favourite Rooms.'), + ('NUF_console_read_tutor', 'The Habbo Console lets you message your Habbo friends, and check whether they are online.'), + ('furni_romantique_tray2_desc', 'Spoil Yourself'), + ('Alert_ModeratorWarning', 'Message from a Moderator:'), + ('furni_giftflowers_name', 'Vase of Flowers'), + ('furni_table_silo_small*7_name', 'Green Area Occasional Table'), + ('furni_menorah_name', 'Menorah'), + ('furni_bed_polyfon_one*2_name', 'Black Mode Single Bed'), + ('console_offline', 'Offline'), + ('gs_mouseover_player', '\\x\\r\\yp'), + ('nav_venue_bb_lobby_amateur_3/0_desc', ''), + ('nav_venue_bb_lobby_amateur_13/0_desc', ''), + ('furni_noob_chair*2_name', 'My first Habbo chair'), + ('furni_doormat_plain*1_desc', 'Available in a variety of colours'), + ('object_displayer_hide_tags', 'Hide tags'), + ('poster_17_desc', 'Beautiful reproduction butterfly'), + ('gs_joinedplayers', 'Players Who Joined: \\x'), + ('furni_table_plasto_round*3_name', 'Round Dining Table'), + ('furni_divider_poly3*8_name', 'Yellow Mode Bardesk Gate'), + ('furni_glass_table*4_name', 'Glass table'), + ('furni_solarium_norja*6_desc', 'Rejuvenate your pixels!'), + ('poster_1006_desc', 'The eyes follow you...'), + ('furni_noob_rug*5_name', 'My first Habbo rug'), + ('buddyremove_pagecounter', 'Page'), + ('poll_alert_answer_missing', 'Please give an answer'), + ('furni_summer_chair*5_desc', 'Beige'), + ('furni_table_plasto_4leg*10_name', 'Occasional Table'), + ('furni_divider_silo2_desc', 'Stylish sectioning'), + ('furni_djesko_turntable_desc', 'For the music-lovers'), + ('nav_remrightsconf', 'You are about to remove all rights from your room. This means that only you will have rights to move and place furni in the room.'), + ('furni_pillow*0_name', 'White Lace Pillow'), + ('sound_machine_eject', 'Eject'), + ('gs_button_ready', 'Ready'), + ('furni_divider_silo1*5_name', 'Pink Area Corner Shelf'), + ('NUF_habbo_home_hotelview_tutor', 'You have now opened a page on the Habbo Website that will give you plenty of information about how to make yourself a Habbo Home.'), + ('furni_traffic_light*4_desc', 'Chill and wait your turn!'), + ('nav_venue_$unit.name$/0_desc', 'Roam more of the hotel\'s corridors'), + ('furni_sporttrack1*2_name', 'Sport track straight asphalt'), + ('furni_sofachair_polyfon_girl_name', 'Armchair'), + ('furni_sound_set_6_desc', 'Background ambience loops'), + ('furni_hal_grave_desc', 'We\'re raising the dead!'), + ('recycler_ready_info', 'Your recycled Furniture is ready. Please either accept or cancel. If you accept, you will receive your recycling reward, detailed below. If you cancel, all your old Furniture will be restored to your hand.'), + ('wallitem_jp_sheet1_name', 'jp_sheet1'), + ('furni_petfood2_name', 'Sardines Mega Multipack'), + ('furni_spotlight_name', 'Habbowood Spotlight'), + ('furni_carpet_soft*6_desc', 'Soft Wool Rug'), + ('gs_lounge_skill', 'Level in this Lounge: \\x \\r (\\y-\\z points)'), + ('nav_help_text', 'Click the Public Spaces tab on the top left of this navigator to find gaming rooms!'), + ('furni_table_plasto_4leg*5_name', 'Occasional Table'), + ('nav_venue_bb_arena_1_name', 'Battle Ball Aloittelijat'), + ('furni_table_silo_med*9_name', 'Red Area Coffee Table'), + ('furni_bed_budget_one*2_name', 'Pink Pura Bed'), + ('nav_venue_sw_lobby_expert_2/0_desc', 'Todellisille lumisotureille.'), + ('furni_rubberchair*6_name', 'Violet Inflatable Chair'), + ('furni_bardeskcorner_polyfon*5_name', 'Candy Corner'), + ('bb_powerup_8', 'Vacuum cleaner'), + ('bb_powerup_6', 'Harlequin'), + ('furni_rare_beehive_bulb*2_name', 'Yellow Amber Lamp'), + ('bb_powerup_7', 'Bomb'), + ('furni_divider_nor2_name', 'Ice Bar-Desk'), + ('bb_powerup_4', 'Cannon'), + ('bb_powerup_5', 'Box of pins'), + ('bb_powerup_2', 'Spring'), + ('bb_powerup_3', 'Flashlight'), + ('console_report', 'Report'), + ('bb_powerup_1', 'Light bulb'), + ('furni_sound_set_43_name', 'SFX 1'), + ('poster_37_desc', 'The Hotels girlband. Dream on!'), + ('interface_icon_messenger', 'Messenger, friends & messages on here'), + ('interface_icon_hand', 'Hand, your inventory'), + ('furni_s_sound_machine*4_name', 'Sound Machine Blue'), + ('nav_venue_sunset_cafe_name', 'Sunset Cafe'), + ('wallitem_sw_stone_desc', 'sw_stone'), + ('reg_check_mail', 'Email'), + ('furni_queue_tile1*7_name', 'Purple Habbo Roller'), + ('pet.hotwords.nest', 'sleep'), + ('furni_sound_machine_desc', 'Creating fancy sounds'), + ('cancel', 'Cancel'), + ('furni_hyacinth2_desc', 'Beautiful bulb'), + ('nav_venue_library/0_name', 'Habbo Library'), + ('furni_waterbowl*1_desc', 'Aqua unlimited'), + ('furni_grand_piano*5_desc', 'Why is that key green?'), + ('furni_table_plasto_bigsquare*8_name', 'Square Dining Table'), + ('furni_nouvelle_trax_name', 'nouvelle_trax'), + ('help_choise_header', 'What do you need help with?'), + ('furni_bardeskcorner_polyfon*7_name', 'Green Mode Bardesk Corner'), + ('furni_pillar*4_name', 'Dark Ages Pillar'), + ('furni_queue_tile1*6_desc', 'The power of movement'), + ('club_intro_link', 'Learn more about Habbo Club!'), + ('furni_sandrug_desc', 'Your own paradise island'), + ('poster_10_desc', 'Beautiful sunset'), + ('furni_divider_nor1_name', 'Ice Corner'), + ('nav_venue_bb_lobby_tournament_6_name', 'Competitie Battle Ball 7'), + ('furni_redhologram_desc', 'You\'re her only hope...'), + ('poster_38_name', 'Smiling Headbangerz'), + ('furni_hc_crtn_name', 'Antique Drapery'), + ('furni_barchair_silo*9_name', 'Red Bar Stool'), + ('room_badge_visible', 'Visible'), + ('furni_sleepingbag*8_name', 'Golden Sleeping Bag'), + ('roomevent_invalid_input', 'You must give your event a name and a description.'), + ('furni_chair_plasto*14_name', 'HC chair'), + ('poster_522_desc', 'The flag of Japan'), + ('furni_shelves_norja*2_name', 'Black Bookcase'), + ('nav_venue_dusty_lounge_name', 'Dusty Lounge'), + ('furni_sound_set_53_desc', 'Break the icy silence'), + ('nav_venue_ice_cafe_name', 'Ice Cafe'), + ('click', 'OK to continue to the hotel.'), + ('nav_venue_sw_lobby_free_2/0_desc', ''), + ('furni_rare_dragonlamp*9_name', 'Purple Dragon Lamp'), + ('furni_statue_desc', 'Watch out for those arrows!'), + ('game_battles_turn', 'TURN'), + ('wallitem_jp_sheet3_desc', 'jp_sheet3'), + ('furni_edicehc_desc', 'Click and roll!'), + ('furni_bed_budget*6_name', 'Blue Pura Double Bed'), + ('furni_gothic_sofa*5_desc', 'The dark side of Habbo'), + ('furni_scifirocket*5_desc', 'From the unknown depths of space'), + ('game_poker_ready', 'READY'), + ('furni_queue_tile1*2_name', 'Red Habbo Roller'), + ('furni_rare_parasol_desc', 'Zon! Zon! Zon!'), + ('transaction_system_sms_dna', 'DNA'), + ('furni_bar_polyfon_name', 'Mini-Bar'), + ('furni_grand_piano*1_name', 'Turquoise Grand Piano'), + ('nav_venue_bb_lobby_expert_4_name', 'Experts Battle Ball 5'), + ('bb_link_highscores', 'Highscores'), + ('summer_chair_8_desc', 'The summer winds are creeping in'), + ('reg_parentemail_title2', 'Email address of parent/guardian:'), + ('error_report_explain', 'An error has occurred, please see the error code above.'), + ('console_noprofile', 'Habbo Profile Not Found'), + ('furni_glass_sofa*3_desc', 'Translucent beauty'), + ('furni_romantique_smalltabl*4_desc', 'Why is one leg different?'), + ('furni_table_plasto_4leg*14_name', 'HC table'), + ('nav_venue_bb_lobby_intermediate_2_name', 'Semi-profs Battle Ball 3'), + ('NUF_playing_games_gamerooms_tutor', 'Click the \'Go\' button to go to the Game Lounge.'), + ('habboclub_require_parent_permission', 'You need to tick the box to say that you are over 14 years or age, \\ror under 14 and have your parent/guardian\'s permission to join Habbo Club. \\rPlease go back and tick the box.'), + ('furni_wooden_screen*1_desc', 'Add an exotic touch to your room'), + ('nav_venue_bb_lobby_intermediate_4/0_desc', ''), + ('furni_glass_sofa*6_name', 'Blue Glass Sofa'), + ('furni_bench_armas_desc', 'To complete the dining set'), + ('furni_barchair_silo*2_name', 'Black Bar Stool'), + ('nav_venue_bb_lobby_expert_6/0_desc', ''), + ('furni_jp_tray2_desc', 'jp_tray2'), + ('furni_val_teddy*3_desc', 'The green bear of friendship'), + ('transaction_system_sms_win_vodafone', 'Vodafone SMS'), + ('furni_glass_sofa_name', 'Glass sofa'), + ('console_online', 'online:'), + ('poster_2004_desc', 'irie!'), + ('x', 'X'), + ('nav_venue_habbo_lido/0_desc', 'Pool is open for swimming and diving!'), + ('furni_soft_sofachair_norja_name', 'iced sofachair'), + ('furni_xmas_cstl_twr_name', 'Ice Castle Tower'), + ('nav_venue_park_name', 'Habbo Gardens'), + ('recycler_info_open', 'Ecotron is the place to visit if you want to recycle your old Furniture. Simply drag the old Furni from your hand to the empty slots below. Recyclable items display the green recyclable tag in your hand. Please note that you must own the Furniture for at least %quarantine_hours% hour before they can be recycled. Recycling takes a total of %total_hours% hours.'), + ('group_window_title', 'Habbo Groups'), + ('pet.saying.eat.dog.4', 'Mmmmm..'), + ('game_chess', 'Chess'), + ('pet.saying.eat.dog.2', 'slurp, slurp, slurp'), + ('roomatic_roomdesc', 'Room description:'), + ('furni_sofa_polyfon*7_desc', 'Green Mode Sofa'), + ('pet.saying.eat.dog.3', 'hrum, umm, umm grrr'), + ('pet.saying.eat.dog.0', 'hrum, hrum, crunch!'), + ('preview_downloading', 'Preview downloading...'), + ('sound_machine_confirm_close_long', 'Are you sure you want to leave the editor without saving the song?'), + ('partner_registration_title', 'Hey, I forgot to mention one thing..'), + ('pet.saying.eat.dog.1', 'crunch, crunch mmmm'), + ('nav_venue_bb_lobby_tournament_12/0_desc', ''), + ('furni_carpet_soft*3_name', 'Soft Wool Rug'), + ('furni_sound_set_56_name', 'RnB Grooves 2'), + ('reg_termslink', 'Terms and Conditions'), + ('wallitem_sw_swords_desc', 'Z for Zorro'), + ('furni_sleepingbag*10_name', 'Khaki Sleeping Bag'), + ('furni_hc_dsk_name', 'Study Desk'), + ('furni_chair_silo*8_desc', 'Keep it simple'), + ('furni_glass_chair*8_name', 'Glass chair'), + ('nav_venue_cafe_ole_name', 'Cafe ole'), + ('furni_sleepingbag*5_desc', 'Ultimate coziness'), + ('opening_hours_text_closed', 'The Hotel has been closed and will be open to the public again at %h%:%m%.'), + ('furni_grunge_bench_desc', 'Laid back seating'), + ('BuddyNotHere', 'Offline'), + ('furni_noob_lamp*5_desc', 'Get the light right where you want it (pink)'), + ('NUH_navigator', 'Use the Navigator to move around. There are literally thousands of rooms to explore!'), + ('poster_1338_name', 'Pedobear Seal of Approval'), + ('furni_queue_tile1*9_name', 'Green Habbo Roller'), + ('furni_habboween_crypt_desc', 'What lurks inside?'), + ('furni_sofachair_silo*9_name', 'Red Area Armchair'), + ('furni_exe_chair_name', 'Executive Sofa Chair'), + ('furni_rare_dragonlamp*6_desc', 'Scary and scorching!'), + ('furni_divider_nor2*3_desc', 'Strong, yet soft looking'), + ('furni_tile_yell_name', 'Floor Tiles'), + ('furni_plant_yukka_name', 'Yukka Plant'), + ('furni_wooden_screen*8_desc', 'Add an exotic touch to your room'), + ('furni_pillar*8_desc', 'All roads lead to Rome'), + ('trading_youoffer', 'You offer:'), + ('furni_marquee*8_desc', 'It\'s both door and a shade!'), + ('furni_pura_mdl4*9_name', 'Red Pura Module 4'), + ('roomatic_congrats', 'Congratulations! You\'re now the proud owner of your own Habbo Hotel room.'), + ('furni_tile_marble_name', 'Marble Tile'), + ('furni_bed_budget*3_desc', 'King sized comfort!'), + ('furni_sound_machine*3_desc', 'Top the Habbo Charts!'), + ('nav_venue_bb_lobby_beginner_10_name', 'Beginners Battle Ball 11'), + ('nav_venue_bb_lobby_tournament_1/0_desc', ''), + ('poster_2000_name', 'Suomen kartta'), + ('furni_solarium_norja*3_name', 'Urban Solarium'), + ('furni_present_gen3_desc', 'What\'s inside?'), + ('furni_glass_stool*4_desc', 'Translucent beauty'), + ('int_update_id', 'Update My Habbo ID >>'), + ('nav_venue_bb_lobby_beginner_8/0_desc', ''), + ('furni_carpet_standard*8_desc', 'Available in a variety of colours'), + ('furni_pillar*1_desc', 'Ancient and stately'), + ('receive_invitation_text', 'invites you his/her room. Accept invitation?'), + ('poll_offer_window', 'Welcome to our poll'), + ('furni_table_plasto_bigsquare*5_desc', 'Hip plastic furniture'), + ('furni_carpet_standard*1_desc', 'Available in a variety of colours'), + ('furni_hologram_name', 'Holopod'), + ('nav_venue_bb_lobby_amateur_desc', 'Amateur battle ball!'), + ('furni_barchair_silo*6_desc', 'Practical and convenient'), + ('furni_divider_nor5_desc', 'Cool cornering for your crib y0!'), + ('purse_vouchers_helpbutton', 'More about vouchers >>'), + ('furni_shelves_norja*6_desc', 'For nic naks and art deco books'), + ('nav_venue_sw_lobby_tournament_5/0_desc', ''), + ('furni_chair_basic*4_desc', 'It\'s a cracking design!'), + ('nav_hidefull', 'Hide Full Rooms'), + ('modtool_ban_computer', 'Ban Computer Also'), + ('furni_gothic_sofa*1_name', 'Gothic Sofa Pink'), + ('furni_carpet_standard*b_name', 'Floor Rug'), + ('queue_line', 'You are queueing right now...'), + ('furni_divider_nor1*6_desc', 'Blue Ice corner'), + ('nav_search_helptext', 'Looking for something? Here you can search other Habbo\'s rooms. Type the room name or the name of the Habbo to search for a room.'), + ('furni_marquee*1_desc', 'It\'s both door and a shade!'), + ('furni_rcandleset_desc', 'Simple but stylish'), + ('nav_room_banned', 'You are banned from this room.'), + ('furni_lamp_armas_name', 'Table Lamp'), + ('catalog_costs', '\\x1 costs \\x2 Credits'), + ('furni_drinks_desc', 'Are you a slob too?'), + ('furni_pura_mdl5*6_name', 'Blue Pura Module 5'), + ('summer_chair_1_desc', 'Gotta get up early to get one!'), + ('furni_prize3_desc', 'A weighty award'), + ('furni_soft_sofa_norja*7_name', 'Rural Iced Sofa'), + ('poster_518_name', 'The Welsh flag'), + ('furni_sofachair_polyfon*8_name', 'Yellow Mode Armchair'), + ('furni_prizetrophy3*3_desc', 'Breathtaking bronze'), + ('nav_venue_sw_lobby_amateur_6_name', 'Snow Slingers Lobby'), + ('furni_stand_polyfon_z_desc', 'Tidy up'), + ('furni_carpet_soft_tut_name', 'Welcome Mat'), + ('console_reject_all', 'Reject All'), + ('month12', 'December'), + ('month11', 'November'), + ('help_topics', 'Help Topics:'), + ('nav_venue_sw_lobby_beginner_8/0_desc', ''), + ('nav_rooms_own', 'Own Room(s)'), + ('reg_pwd_note', 'Choose a password that\'s hard to guess! So, don\'t use ANYONES name, or your favorite colour!'), + ('furni_wooden_screen*4_name', 'Golden Oriental Screen'), + ('nav_venue_sw_lobby_beginner_2/0_desc', ''), + ('furni_pillow*6_desc', 'Puffy, soft and huge'), + ('furni_bed_polyfon_one*4_desc', 'Beige Mode Single Bed'), + ('reg_email_note', 'Please enter your e-mail address, this is important! You\'ll only get customer support and special offers via email, if you enter a valid email address and verify it.'), + ('group_admin', 'Administrator'), + ('furni_scifirocket*8_name', 'Pluto Smoke Machine'), + ('furni_chair_plasto*11_desc', 'Hip plastic furniture'), + ('month10', 'October'), + ('furni_goth_table_name', 'Gothic table'), + ('month05', 'May'), + ('month04', 'April'), + ('nav_modify_maxvisitors', 'Choose maximum number of visitors'), + ('nav_venue_bb_lobby_amateur_2_name', 'Gevorderden Battle Ball 3'), + ('month07', 'July'), + ('habboclub_price1', '30'), + ('month06', 'June'), + ('month01', 'January'), + ('month03', 'March'), + ('month02', 'February'), + ('furni_summer_chair*2_desc', 'Pink'), + ('month09', 'September'), + ('month08', 'August'), + ('furni_bardeskcorner_polyfon*4_desc', 'Beige Mode Bardesk Corner'), + ('furni_tree6_name', 'Flashy Christmas Tree'), + ('furni_arabian_snake_name', 'Ornamental Urn'), + ('reg_verification_incorrectPassword', 'Your password was incorrect'), + ('NUF_visting_rooms_hotelview_tutor', 'Here we go again. This time we are learning how to visit another Habbos room.'), + ('furni_summer_chair*9_desc', 'Got your sunglasses?'), + ('furni_safe_silo_name', 'Safe Minibar'), + ('furni_throne_name', 'Throne'), + ('furni_soft_sofachair_norja*8_desc', 'Yellow Iced Sofachair'), + ('NUF_console_ready_tutor', 'You can now use the Console to find some of your friends, or you can continue the tutorial.'), + ('nav_venue_picnic/0_desc', 'Don\'t forget to grab a carrot or two!'), + ('furni_bardeskcorner_polyfon_name', 'Corner Cabinet/Desk'), + ('game_placeship', 'Place your ships:'), + ('furni_glass_table*7_desc', 'Habbo Club'), + ('poster_13_name', 'BW Skyline Poster'), + ('furni_jp_bamboo_name', 'Bamboo Forest'), + ('furni_plant_bulrush_name', 'Bulrush'), + ('furni_deadduck3_desc', 'With added ectoplasm'), + ('win_purse', 'Habbo Purse'), + ('furni_jp_tray5_name', 'jp_tray5'), + ('furni_hc_tbl_desc', 'Perfect for banquets'), + ('furni_shelves_norja_desc', 'For nic naks and art deco books'), + ('club_desc_3_period', '6 Months (186 days) = 105 Credits'), + ('furni_bed_budget_one*3_name', 'Black Pura Bed'), + ('poster_2_name', 'Carrot Plaque'), + ('furni_solarium_norja*7_desc', 'Fun in the sun!'), + ('poster_2007_name', 'The Father Of Habbo'), + ('gs_header_teams', 'Teams'), + ('furni_divider_poly3*9_desc', 'Border Control!'), + ('gs_button_creategame', 'Create A New Game'), + ('furni_sound_set_42_name', 'Haunted Mansion'), + ('poll_alert_invalid_selection', 'Please select fewer alternatives'), + ('furni_scifirocket*1_name', 'Saturn Smoke Machine'), + ('furni_scifidoor*10_name', 'Violet Spaceship Door'), + ('furni_sound_set_5_desc', 'The dark side of Habbo'), + ('club_confirm_gift_title', 'You have received a Habbo club gift!'), + ('bb_info_gamePrice', 'Play now for just 2 tickets.'), + ('furni_sound_machine*6_name', 'Purple Traxmachine'), + ('wallitem_arabian_swords_desc', 'Not for yielding'), + ('furni_divider_nor2*6_name', 'Blue Iced bar desk'), + ('nav_venue_sw_lobby_expert_0/0_desc', ''), + ('furni_noob_chair*1_name', 'My first Habbo chair'), + ('group_room_link', 'Group\'s room: %room_name% >>>'), + ('sound_machine_playlist', 'Playlist'), + ('nav_venue_bb_arena_2_name', 'Battle Ball Amatöörit'), + ('roomatic_create_error', 'Error in room creation process. Please try again!'), + ('furni_couch_norja*7_desc', 'Two can perch comfortably'), + ('gs_button_spectate', 'Watch Game!'), + ('furni_sofachair_silo*6_desc', 'Blue Area Armchair'), + ('credit_redeem_button', 'Redeem'), + ('furni_valentinescreen_desc', 'Peep through and smile!'), + ('poster_511_name', 'The Dutch flag'), + ('furni_shelves_armas_name', 'Bookcase'), + ('nav_venue_habbo_lido_name', 'Habbo Lido'), + ('furni_bed_polyfon*9_name', 'Red Double Bed'), + ('furni_sofa_silo*9_name', 'Red Area Sofa'), + ('furni_pura_mdl4*6_desc', 'Any way you like it!'), + ('console_mainhelptext', 'You can use the Habbo Console to keep in constant contact with your friends using instant messages.'), + ('wallitem_jp_ninjastars_name', 'Ninja Stars'), + ('ad_note', 'Clicking this advertisement will open a new window'), + ('ph_tickets_choise2', 'Buy 20 Tickets for 6 Credits.'), + ('ph_tickets_choise1', 'Buy 2 Tickets for 1 Credit.'), + ('reg_day', 'Day'), + ('nav_venue_cunning_fox_gamehall/2_name', 'Noughts&Crosses'), + ('nav_venue_sw_lobby_tournament_6_name', 'Tournament Lobby'), + ('furni_noob_lamp*1_name', 'My first Habbo lamp'), + ('furni_petfood1_name', 'Bones Mega Multipack'), + ('furni_table_silo_med*3_name', 'White Coffee Table'), + ('pet.hotwords.jump', 'jump'), + ('furni_sleepingbag*1_name', 'Red Sleeping Bag'), + ('nav_venue_main_lobby/0_desc', 'The heart of Habbo Hotel'), + ('pet_hungry', 'Hunger:'), + ('furni_rare_fan*4_name', 'SUPERLOVE Fan'), + ('furni_sw_table_name', 'sw_table'), + ('furni_CFC_200_moneybag_name', 'Sack of Credits (China)'), + ('room_ask_friend', 'Ask to be a Friend'), + ('furni_bed_polyfon*2_name', 'Black Mode Double Bed'), + ('furni_table_norja_med_desc', 'Elegance embodied'), + ('nav_removerights', 'Reset'), + ('wallitem_hrella_poster_1_name', 'Porthole'), + ('NUF_getting_items_purse_', 'Click this link to open the Habbo Credits page in the website window.'), + ('poster_31_name', 'System of a Ban'), + ('furni_sound_set_24_name', 'Habbo Sounds 4'), + ('furni_chair_basic*7_name', 'chair_basic'), + ('poster_56_name', 'Disco Sign'), + ('furni_rare_dragonlamp*2_name', 'Jade Dragon Lamp'), + ('furni_gothic_stool*4_desc', 'Witches and Warlocks'), + ('furni_sofa_silo*2_name', 'Black Two-Seater Sofa'), + ('furni_grunge_radiator_name', 'Radiator'), + ('nav_venue_bb_lobby_amateur_9_name', 'Gevorderden Battle Ball 10'), + ('summer_chair_4_name', 'White Deck Chair'), + ('furni_sound_set_49_name', 'Club 4'), + ('messenger.email.subject', ''), + ('furni_romantique_chair*3_name', 'Turquoise Romantique Chair'), + ('furni_s_sound_machine*7_desc', 'Sound Machine Red'), + ('furni_table_plasto_round*9_desc', 'Hip plastic furniture'), + ('furni_table_plasto_4leg*7_name', 'Occasional table'), + ('club_confirm_title', 'You are about to subscribe to Habbo Club. Wise choice!'), + ('furni_romantique_pianochair*1_desc', 'Here sat the legend of 1900'), + ('furni_sofa_silo*6_desc', 'Blue Area Sofa'), + ('nav_venue_bb_lobby_tournament_11_name', 'Competitie Battle Ball 12'), + ('furni_rare_icecream*9_desc', 'Virtual bubblegum rocks!'), + ('furni_romantique_divider*1_name', 'Rose Quartz Screen'), + ('NUF_playing_games_room_ruleslink', 'Click me! But only if you want to read the game FAQs in the website.'), + ('furni_chair_silo_name', 'Dining Chair'), + ('furni_sound_set_17_desc', 'Jive\'s Alive!'), + ('dance_choose', 'Choose Dance'), + ('wallitem_industrialfan_name', 'Industrial Turbine'), + ('sound_machine_alert_invalid_song_length', 'Can\'t burn an empty song!'), + ('furni_pura_mdl1*4_desc', 'Any way you like it!'), + ('wallitem_post.it.vd_desc', 'Heart Stickies'), + ('catalog_give_petname', 'Type your pet\'s name in the grey box.'), + ('furni_pura_mdl2*1_name', 'Aqua Pura Module 2'), + ('poster_24_name', 'Hole In The Wall'), + ('win_error', 'Notice!'), + ('furni_chair_plasto*2_desc', 'Hip plastic furniture'), + ('wallitem_xmas_light_desc', 'Xmas light'), + ('furni_rubberchair*1_name', 'Blue Inflatable Chair'), + ('NUF_getting_room_roommatic_details_tutor', 'Give a name to your room, choose a category and add a description. Don\'t worry, you can change it all later.'), + ('furni_divider_poly3*2_desc', 'Black Mode Bardesk Gate'), + ('furni_plant_valentinerose*2_desc', 'Your secret love'), + ('furni_table_norja_med*7_desc', 'For larger gatherings'), + ('furni_carpet_polar_desc', 'For cuddling up on'), + ('nav_venue_sw_lobby_free_8/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('furni_summer_grill*1_name', 'Blue Barbeque Grill'), + ('furni_chair_norja*7_desc', 'Sleek and chic for each cheek'), + ('furni_joulutahti_name', 'Poinsetta'), + ('furni_exe_table_name', 'Executive Desk'), + ('furni_divider_silo3*8_desc', 'Form following function'), + ('furni_gothiccandelabra_name', 'Gothic Candelabra'), + ('transaction_system_bibit', 'Credit card'), + ('nav_venue_tv_studio/0_desc', 'Sponsored by Bobbanet.com'), + ('furni_noob_table*4_desc', 'Lightweight, practical and light blue'), + ('furni_bardesk_polyfon*3_desc', 'Perfect for work or play'), + ('room_info_rated', 'Room rating:'), + ('nav_venue_bb_lobby_beginner_2/0_desc', ''), + ('help_emergency_explanation', 'If you are experiencing a situation which is making you feel uncomfortable or unsafe, please give details below and a member of community staff will reply as soon as possible.'), + ('furni_divider_nor5*8_desc', 'Cool cornering for your crib y0!'), + ('poster_507_name', 'The French Tricolore'), + ('nav_privateRooms', 'Rooms'), + ('furni_pura_mdl2*5_desc', ''), + ('furni_sporttrack3*3_name', 'Sport goal grass'), + ('furni_sound_set_10_desc', 'Made from real Boy Bands!'), + ('furni_chair_plasto*9_desc', 'Hip plastic furniture'), + ('furni_soft_sofa_norja*4_desc', 'Sit back and relax'), + ('furni_s_sound_machine*3_name', 'Sound Machine Green'), + ('reg_spam', 'Yes, I want to get the occasional email from the Hotel Manager.'), + ('shout', 'Shout'), + ('NUF_mini_use_console_read_link', 'Click here to view the message.'), + ('furni_scifidoor*2_desc', 'There out of this world!'), + ('furni_divider_nor3*3_name', 'White Iced Gate'), + ('pet_hung_0', 'Empty'), + ('furni_table_plasto_square*1_name', 'Occasional Table'), + ('pet_hung_6', 'Stuffed'), + ('pet_hung_5', 'Full'), + ('bb_user_skill', 'Skill Level: \\x\\rScore: \\y'), + ('login_welcome', 'Welcome'), + ('pet_hung_2', 'Rumbling'), + ('pet_hung_1', 'Hungry'), + ('poster_20_name', 'Bars'), + ('pet_hung_4', 'Satisfied'), + ('pet_hung_3', 'Peckish'), + ('Alert_WrongNameOrPassword', 'Wrong name or password - please try again!'), + ('furni_romantique_pianochair*5_desc', 'I can feel air coming through...'), + ('furni_carpet_armas_desc', 'Adds instant warmth'), + ('console_removefriend_2', 'from your Friends List?'), + ('console_removefriend_1', 'Are you sure you want to remove'), + ('furni_rare_parasol*0_name', 'Green Parasol'), + ('furni_sound_set_38_name', 'Rock 6'), + ('NUF_mini_meet_people_room_wave', 'These buttons let you wave and dance. Click on your Habbo at anytime to see these buttons.'), + ('gs_skill_changed_header', 'Congratulations!'), + ('furni_chair_plasty*7_name', 'Plastic Pod Chair'), + ('furni_safe_silo*5_desc', 'Totally shatter-proof!'), + ('furni_divider_silo1*3_name', 'White Corner Shelf'), + ('nav_venue_hallway_ii_name', 'Hallway II'), + ('cam_release.help', 'Cancel Photo'), + ('nav_venue_bb_lobby_amateur_14/0_desc', ''), + ('habbo_tv_title', 'Widescreen Habbovision'), + ('purse_noevents', 'You haven\'t made any transactions yet. Click the button below to find out how to get Habbo Credits.\\rRemember: you must ask your parents permission before you buy Habbo Credits.'), + ('furni_pura_mdl2*8_name', 'yellow pura module 2'), + ('furni_CFC_10_coin_bronze_name', 'Bronze Coin (China)'), + ('sound_machine_song_remove', 'Remove song'), + ('modtool_choose_length', 'Choose Length:'), + ('sound_machine_turn_off', 'Switch Off'), + ('furni_pura_mdl1*8_desc', ''), + ('furni_spyro_desc', 'The stuff of legend'), + ('furni_pillow*2_name', 'Red Silk Pillow'), + ('furni_table_armas_desc', 'For informal dining'), + ('furni_tree3_desc', 'Any presents under it yet?'), + ('object_displayer_link_looks', 'Change avatar looks'), + ('furni_barrier*2_name', 'White Road Barrier'), + ('furni_gothic_chair*5_desc', 'The dark side of Habbo'), + ('furni_divider_nor4*4_name', 'Urban Iced Shutter'), + ('furni_camera_name', 'Camera'), + ('next_arrows', 'Next >>'), + ('furni_sound_set_60_desc', 'Love and affection!'), + ('furni_bed_polyfon_girl_one_name', 'Single Bed'), + ('NUF_mini_meet_people_user_chatfield', 'Start typing here and press \'Enter\' to chat with others.'), + ('successfully_purchase_gift_for', 'Successfully purchased gift for user %user%!'), + ('poster_49_desc', 'All that glitters...'), + ('furni_glass_table*3_name', 'Glass table'), + ('furni_divider_silo3*5_desc', 'Pink Area Gate'), + ('furni_divider_arm3_name', 'Gate (lockable)'), + ('furni_table_plasto_4leg*3_name', 'Round Dining Table'), + ('roomatic_roomnumber', 'Room number:'), + ('nav_venue_bb_lobby_beginner_5_name', 'Beginners Battle Ball 6'), + ('reg_nameAndPassTooSimilar', 'Your name and password are too similar'), + ('nav_venue_theatredrome_easter_name', 'Theatredrome Easter'), + ('nav_venue_bb_lobby_beginner_11/0_desc', ''), + ('furni_fireplace_polyfon_name', 'Fireplace'), + ('queue_set.e1.info', 'There are %e1% Habbos in front of you in the queue.'), + ('more_info_link', 'Redeem Now'), + ('furni_bed_polyfon*6_desc', 'Blue Mode Double Bed'), + ('furni_rare_icecream*5_name', 'Vanilla Ice Cream Machine'), + ('poster_500_name', 'Union Jack'), + ('furni_chair_norja*3_name', 'White Iced Chair'), + ('furni_sound_set_31_name', 'Dance 3'), + ('furni_pura_mdl3*5_name', 'beige pura module 3'), + ('furni_sporttrack2*3_desc', 'null'), + ('furni_sound_set_46_desc', 'De bada bada bo!'), + ('poster_9_name', 'Rainforest Poster'), + ('furni_romantique_pianochair*4_name', 'Amber Piano Stool'), + ('poster_515_desc', 'Waved by Swedes everywhere'), + ('furni_scifidoor*9_desc', 'There out of this world!'), + ('furni_chair_plasty*3_name', 'Plastic Pod Chair'), + ('furni_table_plasto_round*5_name', 'Round Dining Table'), + ('furni_one_way_door*9_desc', 'One at a time!'), + ('furni_calippo_desc', 'Basic model'), + ('furni_footylamp_desc', 'Can you kick it?'), + ('furni_one_way_door*2_desc', 'One way! The HC way!'), + ('furni_arabian_tray4_desc', 'Sweet, juicy and ripe'), + ('furni_divider_nor3*7_name', 'Rural Iced gate'), + ('furni_couch_norja*3_name', 'White Iced Bench'), + ('furni_pillow*9_name', 'Green Wooly Pillow'), + ('game_chooseside', 'Choose your side'), + ('start', 'Start'), + ('furni_toy1*4_desc', 'it\'s bouncy-tastic'), + ('roomevent_host', 'Host:'), + ('nav_venue_rooftop_rumble_name', 'Rooftop Rumble'), + ('nav_venue_bb_lobby_expert_0/0_desc', ''), + ('nav_venue_rooftop_rumble_ii/0_desc', 'Are you ready?'), + ('error_report_trigger_message', 'Last message ID'), + ('furni_sofachair_silo*2_name', 'Black Armchair'), + ('furni_noob_chair*5_desc', 'Lightweight, practical, with pink stripes'), + ('pet_frnd_0', 'Hostile'), + ('furni_noob_rug*3_name', 'My first Habbo rug'), + ('pet_frnd_2', 'Suspicious'), + ('pet_frnd_1', 'Angry'), + ('furni_scifiport*6_desc', 'Energy beams. No trespassers!'), + ('pet_frnd_4', 'Calm'), + ('pet_frnd_3', 'Cool'), + ('pet_frnd_6', 'Warm'), + ('pet_frnd_5', 'Friendly'), + ('pet_frnd_8', 'Loving'), + ('credit_trade_value', 'Includes credit furnis worth %value% credits.'), + ('pet_frnd_7', 'Affectionate'), + ('pet_frnd_9', 'Loyal'), + ('NUF_getting_items_purse_tutor', 'Your Purse tells you how many Habbo Credits you have. If you have a voucher code you can redeem it here by clicking the \'Vouchers\' button.'), + ('furni_chair_norja*6_name', 'Blue Chair'), + ('sound_machine_alert_machine_full', 'You already have 4 Traxpacks loaded. Eject one before adding a new Traxpack.'), + ('nav_venue_club_mammoth/0_desc', 'Monumental and magnificent. For Habbo Club members only.'), + ('NUF_getting_room_hand_tutor', 'This is your hand. It contains all your furniture. I have given you a rug so that you can place it in your room- click and drag it to set it down.'), + ('reg_check_name', 'Name'), + ('furni_glass_stool*7_name', 'Green Glass Stool'), + ('poster_504_name', 'The Bundesflagge'), + ('poster_42_desc', 'Not something you want to run into'), + ('pet.saying.sleep.dog.6', '*dreaming*'), + ('pet.saying.sleep.dog.5', 'Zzzzz wuff! zzzzz'), + ('pet.saying.sleep.dog.4', 'hrrrrr...murrmm..'), + ('furni_pura_mdl4*2_desc', 'Any way you like it!'), + ('pet.saying.sleep.dog.3', 'bzz.. oof oof'), + ('furni_sofa_silo*5_name', 'Pink Area Sofa'), + ('pet.saying.sleep.dog.2', 'hrrr.. hrrr'), + ('pet.saying.sleep.dog.1', 'bzz.. bzzzzz'), + ('furni_petfood4_name', 'T-Bones Mega Multipack'), + ('nav_venue_club_mammoth_name', 'Club Mammoth'), + ('ph_keys_dive', 'Diving moves:'), + ('furni_noob_table*3_name', 'My first Habbo table'), + ('furni_romantique_divan*5_desc', 'Is that a cape hanging there?'), + ('furni_table_plasto_round*8_name', 'Round Dining Table'), + ('furni_rare_fan*1_name', 'Blue Powered Fan'), + ('reg_forcedupdate2', 'Update your Habbo info'), + ('furni_table_plasto_square*4_name', 'Square Dining Table'), + ('NUF_playing_games', 'Playing games'), + ('furni_prizetrophy2*2_name', 'Duck trophy'), + ('reg_forcedupdate3', 'The Habbo Hotel management requires all Habbos to read and agree to the service Terms and Conditions. It won\'t take long.\\rJust go through the registration, check your info and agree to the new terms. Thank you!'), + ('nav_venue_sw_lobby_tournament_2_name', 'Tournament Lobby'), + ('furni_carpet_standard*4_name', 'Floor Rug'), + ('furni_s_sound_machine*6_name', 'Sound Machine Purple'), + ('furni_prizetrophy5*1_desc', 'Glittery gold'), + ('furni_table_plasto_square_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_beginner_2_name', 'Beginners Battle Ball 3'), + ('furni_rubberchair*4_name', 'Ocean Inflatable Chair'), + ('furni_divider_poly3*5_desc', 'Keep the Pink in!'), + ('furni_arabian_teamk_name', 'Tea Maker'), + ('room_name', 'Room:'), + ('nav_venue_chill/0_desc', 'Come chill in the Zen Garden!'), + ('furni_summer_grill*4_name', 'Green Barbeque Grill'), + ('poster_1001_desc', 'even walls have ears'), + ('furni_rare_icecream*8_name', 'Peppermint Ice Cream Machine'), + ('furni_safe_silo*9_desc', 'Totally shatter-proof!'), + ('sound_machine_song_save', 'Save song'), + ('NUF_getting_room_navigator_ownrooms', 'Click the \'Own Room(s)\' tab to see your rooms.'), + ('furni_gothic_chair*1_desc', 'The dark side of Habbo'), + ('furni_table_plasto_square*8_name', 'Square Dining Table'), + ('furni_safe_silo*2_desc', 'Totally shatter-proof!'), + ('roomevent_create_description', 'Describe your event'), + ('purse_vouchers_success', 'Voucher was successfully redeemed. You have the Credits.'), + ('furni_gothic_carpet2_name', 'Dungeon Floor'), + ('furni_sofa_polyfon*3_name', 'White Two-seater Sofa'), + ('furni_romantique_tray2_name', 'Treats Tray'), + ('nav_modify_doorstatus_locked', 'Locked (visitors have to ring the bell)'), + ('NUF_visiting_rooms_categorylist_open', 'Click the \'Open\' button to open a category.'), + ('room_doorbell', 'Rings the doorbell - Open the door?'), + ('furni_sound_set_45_name', 'Lost_Beatness'), + ('nav_deleteroom', 'Delete'), + ('furni_barchair_silo_name', 'Bar Stool'), + ('furni_chair_plasto*5_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_tournament_14_name', 'Competitie Battle Ball 15'), + ('furni_pura_mdl1*1_desc', 'Any way you like it!'), + ('furni_rare_snowrug_desc', 'Chilled Elegance'), + ('poster_35_desc', 'The Hotel\'s girlband. Dream on!'), + ('furni_glass_stool_desc', 'Translucent beauty'), + ('furni_rare_fan*8_name', 'Habbo Wind Turbine'), + ('furni_menorah_desc', 'Light up your room'), + ('furni_table_silo_small*7_desc', 'Green Area Occasional Table'), + ('furni_divider_silo1*7_name', 'Green Area Corner Shelf'), + ('furni_romantique_divan*1_desc', 'null'), + ('furni_table_plasto_round*1_name', 'Round Dining Table'), + ('reg_changeEmail', 'Change your email'), + ('hobba_mark_normal', 'Send To Helpers'), + ('nav_venue_bb_lobby_tournament_8/0_desc', ''), + ('ph_tickets_have2', 'Tickets'), + ('nav_venue_sw_lobby_intermediate_0/0_desc', ''), + ('ph_tickets_have1', 'You Have'), + ('furni_bardesk_polyfon*7_desc', 'Green Mode Bardesk'), + ('console_inprivateroom', 'In A Guest Room'), + ('furni_sound_set_35_name', 'Dance 6'), + ('GoAway', 'Leave The Room'), + ('room_kick', 'Kick'), + ('furni_rubberchair*8_name', 'Black Inflatable Chair'), + ('poster_6_name', 'Abstract Poster'), + ('hubu_t1_3', ''), + ('NUF_meeting_people', 'Meeting people'), + ('nav_venue_bb_lobby_amateur_4/0_desc', ''), + ('nav_venue_bb_game/0_name', 'Battle Ball Arena'), + ('furni_pudding_name', 'Christmas Pudding'), + ('furni_tile_red_name', 'Floor Tiles'), + ('catalog_typeurname', 'Type your greetings here\\r(don\'t forget to put your name!):'), + ('furni_house2_name', 'Gingerbread House'), + ('hubu_t1_1', 'Kaupunkien pu_t2_2=Katso onko kotisi l_1=Tietoa Hubusta'), + ('furni_glass_table*4_desc', 'Translucent beauty'), + ('hubu_t1_2', ''), + ('nav_venue_club_massiva/1_name', 'Chill-out Room'), + ('furni_scifiport*2_desc', 'Get in the ring!'), + ('furni_traffic_light*4_name', 'Yellow Traffic Light'), + ('furni_tree2_name', 'Old Christmas Tree'), + ('furni_noob_stool*4_name', 'My first Habbo stool'), + ('done', 'Done'), + ('furni_goodie1*1_name', 'Marzipan Man'), + ('nav_venue_bb_lobby_tournament_18/0_desc', ''), + ('poster_17_name', 'Butterfly Cabinet 1'), + ('furni_summer_chair*5_name', 'Deck Chair'), + ('furni_prizetrophy*1_name', 'Classic trophy'), + ('furni_easterduck_desc', 'Can you tell what it is yet?'), + ('furni_barrier*3_desc', 'No trespassing, please!'), + ('furni_table_plasto_bigsquare*1_name', 'Square Dining Table'), + ('club_general_infolink', 'More Info About Habbo Club >>'), + ('furni_chair_silo*4_name', 'Beige Silo Dining Chair'), + ('roomatic_givename', 'Give your room a name!'), + ('furni_rare_icecream*1_name', 'Blueberry Ice Cream Machine'), + ('roomatic_open', 'Door open'), + ('NUF_getting_items_catalogue_tutor', 'Big! You can browse the products by clicking on the categories. There are loads of different types of furniture to decorate your room.'), + ('furni_marquee*4_name', 'Yellow Marquee'), + ('furni_bed_polyfon_one*7_name', 'Green Mode Single Bed'), + ('gs_button_go_started', 'Watch'), + ('poster_27_name', 'Holly Bundle 3'), + ('furni_divider_nor2*7_desc', 'No way through'), + ('furni_glass_chair*5_desc', 'Translucent beauty'), + ('nav_venue_basement_lobby_name', 'Basement Lobby'), + ('pick_furniture', 'Put Furni In Hand'), + ('nav_venue_bb_lobby_beginner_18/0_desc', ''), + ('furni_pura_mdl2*4_name', 'White Pura Module 2'), + ('club_status_title', 'You are currently a member of Habbo Club.'), + ('furni_rare_elephant_statue_name', 'Golden Elephant'), + ('furni_toy1*1_desc', 'it\'s bouncy-tastic'), + ('reg_doneheader', 'Congratulations!\\rYou\'re a Habbo!'), + ('furni_present_gen6_name', 'Gift'), + ('furni_noob_chair*2_desc', 'Lightweight, practical, with dark blue stripes'), + ('furni_sofachair_silo*5_name', 'Pink Area Armchair'), + ('BuddyNow', 'now:'), + ('furni_pura_mdl5*3_desc', 'Any way you like it!'), + ('furni_prizetrophy6*1_name', 'Champion trophy'), + ('BuddyEntry', 'On Hotel View'), + ('furni_scifiport*9_desc', 'Energy beams. No trespassers!'), + ('furni_table_polyfon_small_desc', 'For serving a stylish latte'), + ('furni_exe_rug_name', 'Executive Rug'), + ('nav_venue_the_dirty_duck_pub_name', 'The Dirty Duck Pub'), + ('nav_venue_bb_lobby_beginner_9_name', 'Beginners Battle Ball 10'), + ('nav_venue_sw_lobby_beginner_5_name', 'Snow Rookies Lobby'), + ('furni_pura_mdl5*2_name', 'Pink Pura Module 5'), + ('furni_bardeskcorner_polyfon*7_desc', 'Green Mode Bardesk Corner'), + ('alert_donate_content', 'The other Habbo has not put anything into the trade. Are you sure you want to give away your furni?'), + ('furni_hc_rllr_name', 'HC Rollers Set'), + ('furni_divider_nor1_desc', 'Looks squishy, but isn\'t'), + ('furni_nouvelle_trax_desc', ''), + ('wallitem_jp_sheet3_name', 'jp_sheet3'), + ('furni_hyacinth2_name', 'Blue Hyacinth'), + ('furni_sound_machine_name', 'Sound Machine'), + ('console_getmessage_sender', 'Sender:'), + ('furni_sandrug_name', 'Tropical Beach Rug'), + ('nav_updatenote_header', 'Note!'), + ('furni_pillar*4_desc', 'From the time of the Kick Warz'), + ('furni_waterbowl*1_name', 'Red Water Bowl'), + ('furni_grand_piano*5_name', 'Onyx Grand Piano'), + ('furni_redhologram_name', 'Holo-girl'), + ('sound_machine_alert_playlist_full', 'Could not save playlist! Playlists can have only %count% songs.'), + ('nav_rooms_search', 'Search'), + ('nav_venue_cunning_fox_gamehall/5_name', 'Poker'), + ('nav_venue_habbo_lido_ii_name', 'Habbo Lido II'), + ('furni_barchair_silo*9_desc', 'Practical and convenient'), + ('pet_nature', 'Nature:'), + ('furni_wood_tv_name', 'Large TV'), + ('poster_2008_desc', 'Once every four Habbo years!'), + ('poster_38_desc', 'For really TOUGH Habbos!'), + ('nav_venue_bb_lobby_expert_0_name', 'Expert'), + ('furni_chair_plasto*14_desc', 'Aqua chair'), + ('furni_queue_tile1*6_name', 'Blue Habbo Roller'), + ('poster_522_name', 'The flag of Japan'), + ('furni_chair_basic*3_name', 'Black Pura Egg Chair'), + ('nav_venue_pizza_desc', 'Tunnelmallinen pizzapaikka kiireettömään nautiskeluun.'), + ('furni_jp_tray6_desc', 'jp_tray6'), + ('furni_hc_btlr_desc', 'Your personal caretaker'), + ('furni_song_disk_desc', 'Burn, baby burn'), + ('furni_deadduck2_name', 'Dead Duck 2'), + ('furni_statue_name', 'Cupid Statue'), + ('furni_scifirocket*5_name', 'Uranus Smoke Machine'), + ('nav_gobutton', 'Go'), + ('recycler_furni_not_recyclable', 'This Furniture cannot be recycled. Please only use Furniture that has the recyclable tag in your hand.'), + ('furni_gothic_sofa*5_name', 'Green Gothic Sofa'), + ('furni_sound_set_32_desc', 'Piano concert set'), + ('furni_chair_plasto*10_name', 'Chair'), + ('nav_venue_bb_lobby_tournament_2_name', 'Competitie Battle Ball 3'), + ('furni_grand_piano*1_desc', 'Turquoise Grand Piano'), + ('buddyremove_windowheader', 'Your friends list is full.'), + ('furni_pillar*0_name', 'Greek Pillar'), + ('gs_title_countdown', 'Game Is About To Begin'), + ('furni_glass_sofa*3_name', 'Glass sofa'), + ('furni_hc_crtn_desc', 'Topnotch privacy protection'), + ('furni_waterbowl*5_desc', 'Aqua unlimited'), + ('furni_table_silo_small*4_desc', 'Beige Area Occasional Table'), + ('furni_jp_tray2_name', 'jp_tray2'), + ('furni_rare_moonrug_desc', 'Desolation rocks!'), + ('furni_val_teddy*3_name', 'Green Share Bear'), + ('furni_sleepingbag*10_desc', 'Ultimate coziness'), + ('furni_bar_polyfon_desc', 'You naughty Habbo!'), + ('furni_sofachair_polyfon*2_desc', 'Black Mode Armchair'), + ('furni_exe_sofa_name', 'Executive 3-Seater Sofa'), + ('furni_divider_silo1*4_desc', 'Beige Area Corner Shelf'), + ('poster_2004_name', 'Rasta Poster'), + ('furni_bench_armas_name', 'Bench'), + ('furni_soft_sofachair_norja_desc', 'Soft iced sofachair'), + ('nav_venue_bb_lobby_beginner_14_name', 'Beginners Battle Ball 15'), + ('gs_button_rejoin', 'Play again!'), + ('furni_marquee*8_name', 'Ultramarine Marquee'), + ('furni_tile_marble_desc', 'Slick sophistication; now 10% off!'), + ('hubu_info_url_1', 'http://www.habbohotel.co.uk/habbo/en/help/12'), + ('console_requests', 'Friend Request(s)'), + ('furni_sleepingbag*4_name', 'Army Sleeping Bag'), + ('furni_plant_yukka_desc', 'Easy to care for'), + ('NUF_getting_room_own_rooms_createroom', 'Empty? That\'s because you don\'t have any rooms yet. If it isn\'t empty then you already have made a room, which makes me wonder...'), + ('furni_glass_sofa*6_desc', 'Translucent beauty'), + ('ph_exit', 'Exit In Normal Clothes'), + ('pet_race_0_024', 'Black-eyed Boxer'), + ('furni_marquee*7_name', 'Purple Marquee'), + ('pet_race_0_023', 'Dotty Dalmatian'), + ('recycler_info_timeout', 'Your recycling was completed, but you did not accept it in time. Please press the cancel button below to have your recyclable items restored to your hand. To recycle these items you will need to begin the process again.'), + ('pet_race_0_022', 'Schnitzel Snatcher'), + ('hubu_info_url_2', 'http://www.talktofrank.com/'), + ('pet_race_0_021', 'Loyal Labrador'), + ('nav_venue_snowwar_lobby/0_desc', 'Snow Storm LobbyCome and be a Snow Stormer!'), + ('pet_race_0_020', 'Patchy Pup'), + ('furni_chair_plasto*8_name', 'Chair'), + ('furni_sofachair_silo*9_desc', 'Red Area Armchair'), + ('nav_venue_bb_lobby_beginner_17/0_desc', ''), + ('furni_hc_dsk_desc', 'For Habbo scholars'), + ('furni_wooden_screen*8_name', 'Night Blue Oriental Screen'), + ('gs_lounge_skill_no_min', 'No minimum'), + ('summer_chair_8_name', 'Yellow Deck Chair'), + ('gs_score_tie', 'The game ended in a tie!'), + ('nav_people', 'Who\'s in here?'), + ('furni_gothic_sofa*2_desc', 'Stylish seating for two'), + ('furni_summer_chair*8_name', 'Yellow Deck Chair'), + ('roomatic_roomname', 'Room name:'), + ('furni_ham_desc', 'Tuck in'), + ('nav_venue_star_lounge_desc', 'Is there a VIP visitor in the hotel?'), + ('furni_bardeskcorner_polyfon*3_name', 'White Corner Desk'), + ('gs_specnum', 'Number of spectators: \\x'), + ('furni_bed_budget*3_name', 'Black Pura Double Bed'), + ('furni_shelves_norja*6_name', 'Blue Bookcase'), + ('partner_registration_link', 'Finish registration'), + ('furni_pillar*1_name', 'Pink Marble Pillar'), + ('reg_olderage', 'I am 11 or older'), + ('furni_glass_stool*4_name', 'Glass stool'), + ('back', 'Back'), + ('furni_tile_yell_desc', 'In a choice of colours'), + ('club_confirm_text3', 'Buy more and pay less: 6 Months (186 days) of Habbo Club cost only 105 Credits. You have %credits% credits in your Purse.\\r\\r After buying the membership, you will immediately be part of the Habbo VIP Community.'), + ('furni_sofa_silo_desc', 'Cushioned, understated comfort'), + ('club_confirm_text1', '1 Habbo Club Month (31 days) costs 25 Credits. You have %credits% Credits in your Purse.\\r\\r After buying the membership, you will immediately be part of the Habbo VIP Community.'), + ('club_confirm_text2', 'Buy more and pay less: 3 Months (93 days) of Habbo Club cost only 60 Credits. You have %credits% credits in your Purse.\\r\\r After buying the membership, you will immediately be part of the Habbo VIP Community.'), + ('furni_carpet_legocourt_name', 'Basketball Court'), + ('furni_present_gen3_name', 'Gift'), + ('furni_sound_set_2_desc', 'Get the party started!'), + ('furni_barchair_silo*6_name', 'Blue Bar Stool'), + ('furni_arabian_bigtb_name', 'Amanjena Table'), + ('interface_icon_catalog', 'Catalogue, furnishing your room'), + ('furni_hologram_desc', 'As if by magic...'), + ('nav_venue_sw_lobby_expert_1/0_desc', ''), + ('furni_carpet_standard*1_name', 'Floor Rug'), + ('nav_owner', 'Owner'), + ('furni_glass_chair*2_desc', 'Translucent beauty'), + ('furni_rcandleset_name', 'Red Candle Plate'), + ('furni_divider_nor1*6_name', 'Blue Ice corner'), + ('nav_private_helptext_hd', 'Rooms'), + ('furni_sound_set_27_name', 'Groove 2'), + ('furni_drinks_name', 'Empty Cans'), + ('pet.saying.eat.cat.0', 'mmm...thumm, thumm'), + ('gs_title_nextround', 'Next game...'), + ('pet.saying.eat.cat.1', 'lap, lap, lap, lap'), + ('furni_scifirocket*9_desc', 'Something fishy is going on...'), + ('pet.saying.eat.cat.2', '*munch, munch*'), + ('pet.saying.sleep.dog.0', 'zzZZZzzz'), + ('furni_noob_lamp*4_name', 'My first Habbo lamp'), + ('nav_venue_sw_lobby_beginner_8_name', 'Snow Rookies Lobby'), + ('nav_venue_library/0_desc', 'Time to catch up on some studying'), + ('camera_dialog_open', 'Shoot'), + ('furni_lamp_armas_desc', 'Ambient lighting is essential'), + ('buddyremove_pleasewait', 'Please wait a second...'), + ('friend_request_options', 'Advanced options.'), + ('transaction_system_web_internal', 'Housekeeping purchase'), + ('furni_rare_dragonlamp*5_name', 'Elf Green Dragon Lamp'), + ('furni_bar_chair_armas_desc', 'The ultimate recycled furniture'), + ('room_ignore', 'Shutup'), + ('poster_518_desc', 'A fiery dragon for your wall'), + ('furni_soft_sofa_norja*7_desc', 'Sit back and relax'), + ('object_displayer_show_tags', 'Show tags'), + ('furni_goth_table_desc', 'The dark side of Habbo'), + ('club_txt_changesubscr', 'Change subscription'), + ('Alert_RememberSetYourPassword', 'Please check your password'), + ('reg_verification_checking', 'Checking...'), + ('furni_silo_studydesk_desc', 'For the true Habbo Scholars'), + ('room_give_rights', 'Give rights'), + ('furni_CF_50_goldbar_name', 'Gold Bar'), + ('furni_rom_lamp_name', 'Crystal Lamp'), + ('furni_sofachair_polyfon*8_desc', 'Yellow Mode Armchair'), + ('furni_deadduck3_name', 'Dead Duck 3'), + ('furni_bed_polyfon_one*4_name', 'Beige Mode Single Bed'), + ('furni_noob_stool*1_desc', 'Unfold me and take the weight off (orange)'), + ('furni_stand_polyfon_z_name', 'Shelf'), + ('furni_prize3_name', 'Bronze Trophy'), + ('club_status_text', 'Here you can see your Habbo Club membership status, number of elapsed months, pre-ordered months and status of the ongoing month.'), + ('furni_table_plasto_bigsquare*9_desc', 'Hip plastic furniture'), + ('furni_wooden_screen*4_desc', 'Add an exotic touch to your room'), + ('furni_sound_set_52_name', 'Christmas Party'), + ('furni_CF_1_coin_bronze_name', 'Bronze Coin'), + ('furni_tile_brown_name', 'Red Tile'), + ('nav_venue_bb_lobby_intermediate_5/0_desc', ''), + ('nav_venue_picnic/0_name', 'Picnic Garden'), + ('furni_sound_set_50_desc', 'The harder generation'), + ('furni_lamp2_armas_name', 'Lodge Candle'), + ('registration_disabled_text', 'You can\'t create new Habbos at the moment. Please try again [some date]..'), + ('catalog_selectproduct', 'Select product:'), + ('transaction_system_sms_telia', 'Telia'), + ('nav_venue_bb_lobby_intermediate_5_name', 'Semi-profs Battle Ball 6'), + ('furni_christmas_sleigh_name', 'Winter Sleigh'), + ('furni_scifirocket*8_desc', 'From a space far, far away!'), + ('furni_bed_budget*9_name', 'Red Pura Double Bed'), + ('poster_2000_desc', 'Suomen kartta'), + ('help_emergency_whathappens', 'A member of community staff will investigate the situation and take appropriate action. This may include sending you a response with advice on dealing with your issue.'), + ('purse_coins', 'Habbo Credits'), + ('furni_marquee*5_desc', 'It\'s both door and a shade!'), + ('club_txt_whatis', 'What is Habbo Club?'), + ('furni_present_gen2_name', 'Gift'), + ('trading', 'Trading'), + ('furni_sofa_silo*9_desc', 'Red Area Sofa'), + ('furni_summer_chair*9_name', 'Red Deck Chair'), + ('furni_shelves_armas_desc', 'For all those fire-side stories'), + ('purse_buy_coins', 'Buy Credits'), + ('room_confirmPlace', 'Are you sure?'), + ('furni_queue_tile1*3_desc', 'The power of movement'), + ('furni_soft_sofachair_norja*8_name', 'Yellow Iced Sofachair'), + ('furni_arabian_snake_desc', 'Beware the snake!'), + ('nav_venue_sw_lobby_tournament_6/0_desc', ''), + ('NUF_about_hotel', 'What\'s Habbo about?'), + ('furni_bardeskcorner_polyfon_desc', 'Tuck it away'), + ('furni_bardeskcorner_polyfon*4_name', 'Beige Mode Bardesk Corner'), + ('poster_13_desc', 'Arty black and white'), + ('nav_venue_bb_lobby_beginner_9/0_desc', ''), + ('nav_modify_nameshow', 'Show your name in the room info'), + ('NUF_mini_use_console_read_next', 'Click \'OK\' to mark message as read.'), + ('poster_1005_desc', 'The muscly movie hero'), + ('wallitem_jp_sheet2_name', 'jp_sheet2'), + ('furni_xmas_cstl_gate_desc', 'Let that icy draft out!'), + ('NUF_groups_url', 'http://d16-1.web.varoke.net/home/group-tutorial'), + ('furni_jp_irori_name', 'Irori'), + ('furni_jp_bamboo_desc', 'Watch out for pandas!'), + ('furni_christmas_reindeer_name', 'Reindeer'), + ('furni_glass_chair*4_name', 'Glass chair'), + ('furni_jp_tray5_desc', 'jp_tray5'), + ('furni_table_plasto_4leg*4_desc', 'Hip plastic furniture'), + ('NUF_getting_items_catalogue_purse', 'Click to open your Purse and find out how to get some Habbo Credits . You can use these to buy stuff!'), + ('furni_hc_tbl_name', 'Nordic Table'), + ('furni_bed_budget_one*6_name', 'Blue Pura Bed'), + ('furni_solarium_norja*7_name', 'Rural Solarium'), + ('console_newmessages', 'New Message(s)'), + ('poster_2_desc', 'Take pride in your veg!'), + ('furni_xmas_cstl_twr_desc', 'All I see from up here is snow!'), + ('hubu_info', 'Welcome to the FRANK Infobus! For the next three months FRANK advisors who know a lot about drugs, their effects and the risks involved, will be stepping aboard the Infobus to offer advice and support to any Habbo that wants to visit the bus. For more information click the link below:'), + ('furni_bardesk_polyfon*6_name', 'Blue Mode Bardesk'), + ('furni_summer_pool*3_name', 'Green Summer Pool'), + ('furni_pura_mdl3*8_name', 'yellow pura module 3'), + ('furni_valentinescreen_name', 'Holiday Romance'), + ('furni_rare_beehive_bulb*1_desc', 'A honey-hued glow'), + ('gs_link_gamerules', 'Game Rules'), + ('nav_venue_bb_lobby_tournament_11/0_desc', ''), + ('sound_machine_song_info', 'Song Info'), + ('wallitem_arabian_swords_name', 'Ancestral Scimitars'), + ('furni_one_way_door*6_desc', 'One way! The HC way!'), + ('furni_table_plasto_round*2_desc', 'Hip plastic furniture'), + ('credit', 'Credit'), + ('gs_lounge_skill_no_max', 'Infinite'), + ('furni_wall_china_desc', 'For your great wall'), + ('NUF_visiting_rooms_roomlist_add to fav', 'After clicking on a room you can click this button here to add it to favourites.'), + ('furni_carpet_polar*3_name', 'Yellow Bear Rug'), + ('poster_46_desc', 'Twinkle, twinkle'), + ('furni_petfood1_desc', 'Fantastic 20% Saving!'), + ('url_nobalance', 'http://%predefined%/credits?'), + ('furni_sofachair_silo*6_name', 'Blue Area Armchair'), + ('furni_noob_chair*1_desc', 'Lightweight, practical and yellow'), + ('nav_venue_bb_lobby_expert_7/0_desc', ''), + ('furni_pura_mdl1*7_name', 'Green Pura Module 1'), + ('furni_table_silo_small*6_name', 'Blue Area Occasional Table'), + ('club_thanks_title', 'Congratulations! You are now a member of Habbo Club.'), + ('furni_legotrophy_name', 'Basketball Trophy'), + ('roomatic_createyrown', 'Create Your Own Room'), + ('console_report_remove', 'Remove'), + ('furni_sound_set_42_desc', 'Bumps and Chills'), + ('furni_divider_nor5*5_desc', 'Cool cornering for your crib y0!'), + ('furni_rare_icecream*2_desc', 'Virtual pistachio rocks!'), + ('furni_pura_mdl4*6_name', 'Blue Pura Module 4'), + ('club_button_close', 'Close Window'), + ('wallitem_md_can_name', 'Bubble Juice Can'), + ('furni_prizetrophy7_desc', 'Palkinto'), + ('nav_venue_cunning_fox_gamehall/2_desc', 'Keep your head down, it\'s bombs away'), + ('poster_28_desc', '10 x Silver Tinsel'), + ('furni_rare_dragonlamp*2_desc', 'Oriental beast of legends'), + ('furni_glass_sofa*2_name', 'Glass sofa'), + ('modtool_hours', 'Hours'), + ('nav_venue_emperors_name', 'Emperor\'s hall'), + ('catalog_buyingSuccesfull', 'Buying Successful!'), + ('console_concurrency_error', 'There was a concurrency error while modifying friend list'), + ('furni_table_silo_med*3_desc', 'Wipe clean and unobtrusive'), + ('furni_sleepingbag*8_desc', 'Ultimate coziness for SnowStorm winners'), + ('poster_508_desc', 'The flag of Spain'), + ('furni_goodie1*2_desc', 'Crunchy Dog Treat'), + ('nav_venue_sw_lobby_free_3/0_desc', ''), + ('furni_chair_basic*7_desc', ''), + ('room_take_rights', 'Remove Rights'), + ('furni_hc_bkshlf_desc', 'For the scholarly ones'), + ('furni_bed_polyfon*2_desc', 'Black Mode Double Bed'), + ('furni_table_plasto_4leg_name', 'Occasional Table'), + ('furni_bed_budget*7_desc', 'King sized comfort!'), + ('win_partner_registration', 'Partner registration'), + ('summer_chair_4_desc', 'Please tan responsably'), + ('furni_table_norja_med_name', 'Coffee Table'), + ('nav_venue_club_massiva/2_desc', 'Make all the right moves'), + ('furni_divider_silo1_desc', 'Neat and natty'), + ('hobba_send_reply', 'Send Alert'), + ('shopping_nocash', 'You don\'t have enough Credits in your Purse.\\r Click \'OK\' to see the different ways of\\rgetting Habbo Credits.'), + ('furni_divider_poly3*9_name', 'Red Hatch'), + ('furni_rare_fountain*1_desc', 'For our feathered friends'), + ('poster_56_desc', 'Serious partying going on!'), + ('furni_scifiport*6_name', 'White Sci-Fi Port'), + ('furni_rclr_garden_desc', 'Self watering'), + ('furni_arabian_tray1_desc', 'Tea for every occasion'), + ('furni_rare_fountain*3_name', 'Bird Bath (blue)'), + ('furni_romantique_pianochair*1_name', 'Rose Quartz Piano Stool'), + ('furni_romantique_divider*1_desc', 'Beauty lies within'), + ('wallitem_post.it.vd_name', 'Heart Stickies'), + ('wallitem_torch_desc', 'The dark side of Habbo'), + ('roomatic_namedisplayed', 'Do you want your name to be displayed with the room?'), + ('furni_grunge_candle_name', 'Candle Box'), + ('furni_sound_set_17_name', 'Groove 3'), + ('furni_prizetrophy3*2_name', 'Globe trophy'), + ('furni_chair_silo_desc', 'Keep it simple'), + ('nav_venue_sw_lobby_beginner_7/0_desc', ''), + ('nav_venue_sw_lobby_beginner_3/0_desc', ''), + ('furni_hc_trll_name', 'Drinks Trolley'), + ('furni_bed_polyfon_one*7_desc', 'Green Mode Single Bed'), + ('furni_chair_plasto*2_name', 'Chair'), + ('furni_pura_mdl1*4_name', 'White Pura Module 1'), + ('furni_gothiccandelabra_desc', 'The dark side of Habbo'), + ('NUH_chat', 'Click here and type to chat to other Habbos.'), + ('furni_plant_valentinerose*2_name', 'White Valentine Rose'), + ('reg_privacypledge', 'Privacy Pledge'), + ('furni_exe_table_desc', 'Take a memo, Featherstone'), + ('hubu_info_link2', 'FRANK Website'), + ('furni_prizetrophy4*3_name', 'Fish trophy'), + ('furni_hc_chr_desc', 'Royal comfort'), + ('hubu_info_link1', 'FRANK Infobus Information'), + ('sound_machine_your_songs', 'Traxmachine Songs'), + ('furni_active_placeholder_name', 'This furniture is downloading...'), + ('furni_divider_silo3*8_name', 'Yellow Area Gate'), + ('NUF_visiting_rooms_categorylist_tutor', 'There are so many Guest Rooms we thought it would be a "hoot" to divide them into categories. Select a category to view its contents.'), + ('furni_sofa_silo*6_name', 'Blue Area Sofa'), + ('club_extend_failed', 'Sorry, we were unable to process the purchase. No Credits were charged!'), + ('furni_soft_sofa_norja*4_name', 'Urban Iced Sofa'), + ('furni_sporttrack3*3_desc', 'null'), + ('furni_sound_set_1_name', 'Habbo Sounds 1'), + ('furni_pura_mdl2*5_name', 'beige pura module 2'), + ('nav_venue_sw_lobby_intermediate_1/0_desc', ''), + ('furni_safe_silo*8_name', 'Yellow Safe Minibar'), + ('trading_agrees', 'agrees'), + ('alert_needpermission', 'You need your parent or guardian\'s permission to spend time in Habbo Hotel.'), + ('nav_modify', 'Modify'), + ('furni_noob_stool*4_desc', 'Unfold me and take the weight off (light blue)'), + ('catalog_length_trophymsg', 'Oops, your inscription is too long, so it won\'t fit on the trophy. \\rPlease type something shorter.'), + ('furni_s_sound_machine*3_desc', 'Sound Machine Green Desc'), + ('club_member', 'Member'), + ('modtool_ban_ip', 'Ban IP Also'), + ('bb_link_gamerules', 'Spelregels'), + ('furni_carpet_armas_name', 'Hand-Woven Rug'), + ('furni_rubberchair*5_desc', 'Soft and tearproof!'), + ('furni_table_plasto_square*1_desc', 'Hip plastic furniture'), + ('furni_divider_nor3*3_desc', 'Do go through...'), + ('nav_venue_habburger\'s/0_desc', 'Get food here!'), + ('reg_linkstitle', 'Full version of the documents:'), + ('roomevent_browser_title', 'Events'), + ('roomatic_security', 'Security'), + ('furni_table_plasto_4leg*7_desc', 'Hip plastic furniture'), + ('furni_table_plasto_round*14_desc', 'Hip plastic furniture'), + ('furni_sound_set_38_desc', 'Rock and Roses!'), + ('furni_rare_parasol*0_desc', 'Block those rays!'), + ('furni_pura_mdl3*6_desc', 'Any way you like it!'), + ('NUF_console', 'Learn about messaging'), + ('poster_45_name', 'Skeleton'), + ('furni_pura_mdl3*9_desc', 'Any way you like it!'), + ('pet_age', 'Age:'), + ('poster_48_name', 'Large gold star'), + ('open', 'Open'), + ('gs_3min', '3min'), + ('wallitem_habw_mirror_name', 'Habbowood Mirror'), + ('furni_carpet_polar*4_desc', 'Snuggle up on a Funky bear rug...'), + ('furni_table_armas_name', 'Dining Table'), + ('sw_gameprice', 'Play now for just 2 tickets!'), + ('furni_divider_nor5*4_name', 'Urban Iced Angle'), + ('navigator', 'Hotel Navigator'), + ('furni_pillow*2_desc', 'Puffy, soft and huge'), + ('purse_vouchers_checking', 'Checking code, please wait...'), + ('furni_noob_rug*4_desc', 'Nice and neat sisal rug with light blue edging'), + ('furni_safe_silo*5_name', 'Pink Safe Minibar'), + ('nav_venue_the_dirty_duck_pub/0_desc', 'The perfect place to chill!'), + ('furni_CFC_10_coin_bronze_desc', 'Worth 10 Credits'), + ('furni_teleport_door_desc', 'Magic doorway to anywhere!'), + ('furni_bardesk_polyfon_name', 'Bar/desk'), + ('login_password', 'Password'), + ('furni_pura_mdl2*8_desc', ''), + ('furni_divider_nor4*4_desc', 'Habbos, roll out!'), + ('furni_rare_fan*7_name', 'Brown Powered Fan'), + ('furni_bed_polyfon_girl_one_desc', 'Snuggle down in princess pink'), + ('club_general_elapsed', 'Elapsed Months'), + ('nav_venue_sw_lobby_free_1_name', 'Free Game Lobby'), + ('furni_gothic_chair*5_name', 'Green Gothic Chair'), + ('furni_sink_name', 'Sink'), + ('furni_bed_budget_one*4_desc', 'Prince sized comfort!'), + ('Alert_ForgotSetPassword', 'Please check your password'), + ('furni_chair_plasto*6_desc', 'Hip plastic furniture'), + ('furni_carpet_standard_desc', 'Available in a variety of colours'), + ('reg_update_text2', 'Only change them when you want to make sure that nobody can know or guess your password.'), + ('furni_arabian_swords_desc', 'Not for yielding'), + ('furni_divider_silo3*5_name', 'Pink Area Gate'), + ('furni_fireplace_polyfon_desc', 'Comfort in stainless steel'), + ('furni_glass_table*3_desc', 'Translucent beauty'), + ('furni_summer_pool*4_desc', 'Fancy a dip?'), + ('poster_500_desc', 'The UK flag'), + ('poster_1004_name', 'Eid Mubarak Poster'), + ('furni_rare_icecream*5_desc', 'Virtual vanilla rocks!'), + ('furni_one_way_door*2_name', 'Black HC Gate'), + ('furni_chair_plasty*3_desc', 'Hip plastic furniture'), + ('club_end_title', 'Your Habbo Club membership has now expired.'), + ('furni_table_polyfon_desc', 'For larger gatherings'), + ('furni_romantique_pianochair*4_desc', 'I can feel air coming through...'), + ('furni_bardesk_polyfon*3_name', 'White Bardesk'), + ('predefined_room_description', '%user_name% has entered the building'), + ('poster_53_desc', 'whack that ball!'), + ('poster_515_name', 'The Swedish flag'), + ('furni_rope_divider_desc', 'Rope Divider'), + ('furni_chair_norja*3_desc', 'Sleek and chic for each cheek'), + ('furni_scifidoor*9_name', 'Blue Spaceship Door'), + ('furni_goodie2_name', 'Chocolate Mouse'), + ('game_poker_logoff', 'Left the game'), + ('furni_bed_polyfon_desc', 'Give yourself space to stretch out'), + ('furni_table_plasto_round*5_desc', 'Hip plastic furniture'), + ('furni_couch_norja*3_desc', 'Two can perch comfortably'), + ('pet.saying.sleep.cat.2', 'Purrr... rrrr'), + ('pet.saying.sleep.cat.1', 'mrrrr..rrrr..'), + ('pet.saying.sleep.cat.0', 'hrrrrr....Mrrrrr'), + ('login_ok', 'OK'), + ('gs_button_expand', 'Expand Window'), + ('pet.saying.sleep.cat.4', 'mrrrr...muew..mrr'), + ('tutorial_next', 'Next:'), + ('pet.saying.sleep.cat.3', 'hurrr..hurrr'), + ('furni_jp_tatami_desc', 'Shoes off please'), + ('hobba_sent_to_moderators', 'Call re-assigned non-emergency, still visible to moderators'), + ('roomatic_choosecategory', ''), + ('wallitem_guitar_v_desc', 'tilulilulii'), + ('NUF_groups', 'Groups'), + ('bb_link_gameRules_url', 'http://%predefined%/groups/56552/id'), + ('nav_venue_theatredrome_halloween_name', 'Theatredrome Habboween'), + ('bb_buyTicketsButton', 'Buy tickets'), + ('furni_gothgate_desc', 'The dark side of Habbo'), + ('game_poker_waiting', 'Change done.\\rWaiting for the other players'), + ('furni_glass_stool*7_desc', 'Habbo Club'), + ('club_end_text', 'BUT, don\'t worry, you can still buy another month of Habbo Club and keep all your Habbo Club benefits,special Furni gifts and the shiny badge!'), + ('furni_sound_set_18_desc', 'Listen while you tan'), + ('furni_sound_set_35_desc', 'Groovelicious'), + ('furni_prizetrophy2*2_desc', 'Shiny silver'), + ('furni_plant_valentinerose*3_desc', 'Relight your passions'), + ('furni_romantique_divan*5_name', 'Onyx Chaise-Longue'), + ('furni_chair_norja*6_desc', 'Sleek and chic for each cheek'), + ('wallitem_hrella_poster_2_desc', 'For those scary Lido moments'), + ('furni_s_sound_machine*6_desc', 'Sound Machine Purple'), + ('game_bs_miss', 'Miss:'), + ('furni_carpet_standard*4_desc', 'Available in a variety of colours'), + ('furni_pura_mdl1*1_name', 'Aqua Pura Module 1'), + ('furni_rare_icecream*8_desc', 'Virtual peppermint rocks!'), + ('furni_petfood4_desc', 'Fantastic 20% Saving!'), + ('furni_table_silo_small*3_name', 'White Occasional Table'), + ('furni_table_plasto_round*8_desc', 'Hip plastic furniture'), + ('furni_chair_polyfon_desc', 'Metallic seating experience'), + ('furni_exe_drinks_desc', 'Give a warm welcome'), + ('nav_createroom', 'Create Own Room'), + ('furni_table_plasto_bigsquare*14_desc', 'Hip plastic furniture'), + ('poster_1001_name', 'Prince Charles Poster'), + ('furni_CF_20_moneybag_name', 'Sack of Credits'), + ('furni_prizetrophy5*1_name', 'Duo trophy'), + ('alert_reg_email', 'Email'), + ('pet_thirsty', 'Thirst:'), + ('nav_error_passwordtooshort', 'The password is too short.'), + ('nav_venue_sw_lobby_free_7_name', 'Free Game Lobby'), + ('furni_plant_valentinerose*5_name', 'Purple Valentine Rose'), + ('recycler_status_info', 'You have Furniture in recycling. The icon will blink when recycling is complete.'), + ('poster_52_name', 'Hockey Stick'), + ('win_doorbell', 'Doorbell'), + ('Unreadmessages', 'New Message(s)'), + ('furni_queue_tile1*9_desc', 'The power of movement'), + ('furni_rare_snowrug_name', 'Snow Rug'), + ('console_approve_selected', 'Accept selected'), + ('pet_race_0_009', 'Hound of Hull'), + ('poster_35_name', 'The Habbo Babes 1'), + ('pet_race_0_008', 'Springy Spaniel'), + ('furni_sofa_polyfon*3_desc', 'Comfort for stylish couples'), + ('furni_basket_name', 'Basket Of Eggs'), + ('pet_race_0_007', 'Slobber Don'), + ('pet_race_0_006', 'Stripy Setter'), + ('pet_race_0_005', 'Paws Forethought'), + ('pet_race_0_004', 'Droopy of Pawford'), + ('furni_barchair_silo_desc', 'Practical and convenient'), + ('furni_noob_lamp*2_desc', 'Get the light right where you want it (dark blue)'), + ('pet_race_0_003', 'Rescue Bernard'), + ('furni_glass_stool_name', 'Glass stool'), + ('pet_race_0_002', 'Joe Cocker Spaniel'), + ('pet_race_0_001', 'Habbo Husky'), + ('pet_race_0_000', 'Yappy Yorkie'), + ('NUF_mini_endtopic_step1_questionmark', 'Click to see our help menu and find our FAQs!'), + ('furni_sound_set_28_desc', 'Head for the pit!'), + ('nav_private_norooms', 'You dont have any rooms - create one?'), + ('furni_table_plasto_square*4_desc', 'Hip plastic furniture'), + ('furni_val_teddy*6_name', 'Blue Share Bear'), + ('furni_noob_table*3_desc', 'Lightweight, practical and aubergine'), + ('gs_state_finished', 'This Game is already over!'), + ('furni_rare_fan*8_desc', 'Stylish, Eco-Energy!'), + ('reg_parentemail_link_url1', 'http://%predefined%//help/parents_guide.html'), + ('furni_gothic_carpet2_desc', 'What lies beneath?'), + ('furni_rare_fan*5_desc', 'It\'ll blow you away!'), + ('modtool_kickuser', 'Kick User'), + ('furni_divider_silo1*7_desc', 'Green Area Corner Shelf'), + ('reg_parentemail_link_url2', 'http://%predefined%//footer_pages/privacy_policy.html'), + ('pet_race_0_019', 'Tiny Terrier'), + ('pet_race_0_018', 'Bushy Woofer'), + ('pet_race_0_017', 'Speckled Sheepdog'), + ('furni_rubberchair*8_desc', 'Soft and tearproof for HC!'), + ('pet_race_0_016', 'Murmurin\' Minimastiff'), + ('poster_42_name', 'Spiderweb'), + ('pet_race_0_015', 'Pixie Poodle'), + ('furni_safe_silo*2_name', 'Black Safe Minibar'), + ('pet_race_0_014', 'Whiffy Woofy'), + ('pet_race_0_013', 'Mangy Mutt'), + ('nav_publicRooms', 'Public Spaces'), + ('pet_race_0_012', 'Tawny Bleugh'), + ('pet_race_0_011', 'Lappy Lassie'), + ('pet_race_0_010', 'Furry McScottie'), + ('game_bs_toast', 'Toast!'), + ('furni_prizetrophy6_name', 'Pokaali'), + ('furni_pudding_desc', 'Will you get the lucky sixpence?'), + ('furni_tile_red_desc', 'In a choice of colours'), + ('nav_venue_sw_arena_expert_name', 'Playing expert game'), + ('pet.saying.sleep.croco.0', 'Zzzz... zzzzz...'), + ('poster_50_desc', 'flap, flap, screech, screech...'), + ('furni_shelves_norja*9_name', 'Red Bookcase'), + ('furni_sound_set_4_name', 'Ambient 1'), + ('furni_exe_s_table_desc', 'Get a clear reflection!'), + ('furni_present_gen6_desc', 'What\'s inside?'), + ('furni_one_way_door*5_name', 'Pink One Way Gate'), + ('nav_search_hd', 'Search rooms by Habbo name or room name.'), + ('poster_20_desc', 'high security for your room'), + ('buddyremove_messenger_updating', 'The console is updating, try again in a minute... Everything else is working fine!'), + ('pet.saying.sleep.croco.3', ':)'), + ('furni_house2_desc', 'Good enough to eat'), + ('pet.saying.sleep.croco.4', '*Snuh snuh*'), + ('tutorial_offtopic', 'Oops! You got off the topic. Please restart or select a new topic.'), + ('pet.saying.sleep.croco.1', 'Yrgh... Yrgh...'), + ('jukebox_now_playing', 'Now playing:'), + ('pet.saying.sleep.croco.2', 'Frgh... Frgh...'), + ('furni_sound_set_25_desc', 'Actually, it\'s Partay!'), + ('club_intro_header', 'Welcome to Habbo Club, the members-only club that all VIP Habbos belong to!'), + ('nav_venue_sw_lobby_amateur_3/0_desc', 'Astetta rankempaa lumisotaa.'), + ('pet.saying.sleep.croco.5', 'Rawwwwwwwwrrrm...'), + ('pet.saying.sleep.croco.6', 'Mmmm... Hooks...'), + ('furni_table_plasto_bigsquare*1_desc', 'Hip plastic furniture'), + ('nav_venue_sw_lobby_free_4_name', 'Free Game Lobby'), + ('alert_warning', 'Moderator says:'), + ('furni_barrier*3_name', 'Red Road Barrier'), + ('nav_venue_floatinggarden_name', 'Floating Garden'), + ('gs_error_nocredits', 'You need Habbo Credits to play a Game!'), + ('furni_chair_plasto*5_name', 'Chair'), + ('furni_tree2_desc', 'Old Christmas Tree'), + ('furni_bed_budget_one*7_desc', 'Prince sized comfort!'), + ('furni_romantique_clock_name', 'romantique_clock'), + ('room_banner_text', ''), + ('furni_sleepingbag*2_desc', 'Ultimate coziness'), + ('furni_divider_nor4*3_name', 'White Iced Auto Shutter'), + ('jukebox_song_remaining', 'Remaining time: %time%'), + ('reg_note_text', 'Never change your password or email\\rif someone else asks you to - they will\\rsteal your furni and Credits!'), + ('habbo_hand_next', '>>>'), + ('nav_venue_orient/0_desc', 'Tres chic with an Eastern twist. For Habbo Club members only.'), + ('furni_easterduck_name', 'Wannabe bunny'), + ('login_forgottenPassword', 'Forgotten your password?'), + ('furni_prizetrophy*1_desc', 'Glittery gold'), + ('hubu_t2_2', ''), + ('hubu_t2_3', 'Vapaa-ajan linkkejä'), + ('decision_cancel', 'Cancel'), + ('nav_venue_bb_lobby_tournament_2/0_desc', ''), + ('furni_samovar_desc', 'Click for a refreshing cuppa'), + ('furni_rcandle_name', 'Red Candle'), + ('furni_waterbowl*4_name', 'Blue Water Bowl'), + ('furni_table_norja_med*7_name', 'Rural Iced Coffee Table'), + ('NUF_playing_games_room_tutor', 'See some people wandering around? They are psyching themselves up for a game. Game Tickets are usually 2 Habbo Credits, but in this room the games are free.'), + ('furni_doormat_love_name', 'Doormat'), + ('bb_link_tournament_highScores_url', 'http://%predefined%//groups/56552/id'), + ('furni_sofachair_polyfon*4_name', 'Beige Mode Armchair'), + ('error_room_full', 'Huone on täynnä.'), + ('furni_chair_silo*4_desc', 'Beige Silo Dining Chair'), + ('furni_divider_nor2*7_name', 'Rural Iced Bar'), + ('hubu_t2_1', ''), + ('furni_divider_nor1*9_name', 'Red Ice corner'), + ('furni_wooden_screen*0_name', 'White Oriental Screen'), + ('furni_chair_basic*1_desc', ''), + ('gs_choose_gamename', 'Enter A Name For Your Game:'), + ('poll_question_number', 'Question %number%/%count%'), + ('furni_hc_rllr_desc', 'Highest class transportation'), + ('furni_table_plasto_4leg*15_desc', 'Hip plastic furniture'), + ('furni_scifiport*9_name', 'Violet Sci-Fi Port'), + ('furni_jukebox*1_desc', 'For your Happy Days!'), + ('furni_red_tv_desc', 'Don?t miss those soaps'), + ('furni_song_disk_name', 'Traxdisc'), + ('reg_agree_alert', 'You have to agree to the terms of service\\r(tick the box).'), + ('furni_summer_chair*1_desc', 'Got your swimming trunks?'), + ('poster_2008_name', 'Habbo Leap Day Poster'), + ('poster_505_desc', 'The Canadian flag'), + ('group_homepage', 'Groups\' Homepage >>>'), + ('furni_table_silo_med*6_desc', 'Blue Area Coffee Table'), + ('nav_venue_tearoom/0_name', 'Chinese Tea Room'), + ('dimmer_use_bg_only', 'Background only'), + ('furni_divider_poly3*4_name', 'Beige Mode Bardesk Gate'), + ('nav_venue_hotel_kitchen/0_desc', 'Beware the flying knives!'), + ('furni_divider_silo1*8_desc', 'Neat and natty'), + ('furni_hc_btlr_name', 'Electric Butler'), + ('furni_wooden_screen*5_name', 'Gray Oriental Screen'), + ('furni_scifiport*8_name', 'Purple Sci-Fi Port'), + ('furni_carpet_standard*5_name', 'Floor Rug'), + ('trading_offers', 'offers:'), + ('furni_prizetrophy2*3_name', 'Duck trophy'), + ('transaction_system_club_habbo', 'Habbo Club payment'), + ('nav_venue_bb_lobby_tournament_9/0_desc', ''), + ('poster_517_name', 'The Scottish flag'), + ('furni_wood_tv_desc', 'For family viewing'), + ('furni_deadduck2_desc', 'Someone forgot to feed me...'), + ('furni_sound_set_20_desc', 'Musical heaven'), + ('sound_machine_new', 'Create a New Song'), + ('nav_venue_the_chromide_club/0_desc', 'Ghetto Fabulous'), + ('nav_modify_doorstatus_pwagain', 'pw again:'), + ('furni_chair_plasto*10_desc', 'Hip plastic furniture'), + ('gs_idlewarning', 'You will be replaced if you don\'t start or join a Game soon!'), + ('purse_vouchers_entercode', 'Enter code here:'), + ('sound_machine_song_name', 'Untitled Trax'), + ('furni_sofa_polyfon*4_name', 'Beige Mode Sofa'), + ('furni_carpet_standard*a_name', 'Floor Rug'), + ('poster_510_name', 'The Italian flag'), + ('furni_table_plasto_square*7_name', 'Square Dining Table'), + ('furni_noob_chair*6_desc', 'Lightweight, practical with dark yellow stripes'), + ('forgottenpw_whatyou', 'What\'s your Habbo called?'), + ('nav_venue_bb_lobby_amateur_1_name', 'Gevorderden Battle Ball 2'), + ('furni_noob_table*6_name', 'My first Habbo table'), + ('furni_pillar*0_desc', 'Classy architect, for holding up ceilings!'), + ('poster_1002_desc', 'aw, bless...'), + ('furni_divider_arm1_desc', 'Good solid wood'), + ('furni_glass_stool*8_name', 'Glass stool'), + ('furni_rare_moonrug_name', 'Moon Patch'), + ('nav_venue_rooftop_rumble/0_desc', 'Are you ready?'), + ('transaction_system_sms_sonera', 'Sonera'), + ('furni_waterbowl*5_name', 'Brown Water Bowl'), + ('furni_sound_set_32_name', 'Instrumental 2'), + ('furni_table_silo_small*4_name', 'Beige Area Occasional Table'), + ('furni_prizetrophy8*1_name', 'Duo trophy'), + ('tutorial_menu', 'Get help with...'), + ('gs_2teams', '2 Teams Game'), + ('furni_sound_machine*4_desc', 'For Funky, Funky Fridays!'), + ('furni_romantique_divan*4_desc', 'Is that a cape hanging there?'), + ('furni_couch_norja*8_desc', 'Two can perch comfortably'), + ('console_usersnotfound', 'Habbo Not Found'), + ('nav_venue_bb_lobby_amateur_2/0_desc', ''), + ('furni_sleepingbag*4_desc', 'Ultimate coziness'), + ('furni_bed_budget_one*6_desc', 'Prince sized comfort!'), + ('furni_sw_chest_desc', ''), + ('nav_venue_bb_lobby_amateur_5/0_desc', ''), + ('NUF_visiting_rooms_room_tutor', 'This is a Guest Room. You can either quit the tutorial and start meeting people, or select the next topic.'), + ('furni_jp_pillow_name', 'Pillow Chair'), + ('url_logged_out', 'http://%predefined%/account/disconnected?reason=logout&origin=popup'), + ('furni_romantique_smalltabl*1_name', 'Rose Quartz Tray Table'), + ('friend_request_declined', 'Declined!'), + ('furni_grunge_shelf_desc', 'Scrap books and photo albums'), + ('furni_gothic_stool*6_name', 'Gothic Stool Blue'), + ('wallitem_gothicfountain_desc', 'Not suitable for drinking!'), + ('furni_scifiport*1_name', 'Gold Laser Gate'), + ('furni_sound_set_41_name', 'Rock 8'), + ('furni_toilet_yell_name', 'Loo Seat'), + ('console_fr_limit_exceeded_error', 'Too many friends selected. Please remove some first.'), + ('console_asktobecomeafriend', 'Ask To Become A Friend'), + ('console_friends', 'Friends'), + ('furni_table_plasto_bigsquare*4_desc', 'Hip plastic furniture'), + ('poster_2005_desc', 'The Special Infobus Poster'), + ('furni_summer_chair*8_desc', 'Got your sun cream?'), + ('furni_s_sound_machine*2_name', 'Sound Machine Ocean'), + ('nav_ringbell', 'The door is locked. Ringing the bell, and waiting...'), + ('console_profilematch', 'Habbo Profile match -'), + ('poster_14_name', 'Fox Poster'), + ('furni_bardeskcorner_polyfon*3_desc', 'Tuck it away'), + ('furni_carpet_soft*2_name', 'Soft Wool Rug'), + ('furni_ham_name', 'Joint of Ham'), + ('nav_venue_star_lounge_name', 'Star Lounge'), + ('nav_venue_bb_lobby_beginner_desc', 'Beginner battle ball'), + ('furni_doormat_plain*3_desc', 'Available in a variety of colours'), + ('furni_habbowood_chair_desc', 'Exclusively for Directors'), + ('nav_venue_bb_lobby_beginner_3/0_desc', ''), + ('furni_CF_20_moneybag_desc', 'Worth 20 Credits'), + ('furni_edice_desc', 'What\'s your lucky number?'), + ('furni_scifirocket*9_name', 'Neptune Smoke Machine'), + ('furni_bardesk_polyfon*9_name', 'Red Bardesk'), + ('furni_glass_table*8_desc', 'Translucent beauty'), + ('NUF_mini_endtopic', 'Find out more'), + ('pending_cfh_title', 'Your old message'), + ('nav_venue_sw_arena_tournament_name', 'Playing a tournament game!'), + ('furni_arabian_bigtb_desc', 'It must be Jinn-er time!'), + ('nav_venue_bb_lobby_beginner_0/0_desc', ''), + ('furni_pillow*3_name', 'Turquoise Satin Pillow'), + ('interface_icon_help', 'Help, need help?'), + ('nav_roomnfo_hd_src', 'Search Rooms'), + ('pet.saying.generic.dog.0', 'woof..woof'), + ('furni_chair_norja*9_name', 'Red Chair'), + ('NUF_getting_room_roommatic_start_tutor', 'This is the Room-O-Matic! Green! You use this to make your room.'), + ('furni_sound_set_2_name', 'Habbo Sounds 3'), + ('nav_venue_netcafe_name', 'My Habbo Home Netcafe'), + ('purse_voucherbutton', 'Vouchers'), + ('console_console', 'Console'), + ('game_poker_changed', 'changed'), + ('transaction_system_splashplastic', 'SplashPlastic'), + ('nav_venue_sw_lobby_free_7/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('furni_sporttrack3*1_desc', 'null'), + ('buddyremove_prev', '< Previous'), + ('roomatic_chooselayout', 'Choose the layout of your room'), + ('wallitem_item_placeholder_desc', 'This furniture is downloading...'), + ('purse_note', 'NOTE : The transactions are updated at 6 am every day.'), + ('poster_34_desc', 'Habbo-punk for the never-agreeing'), + ('furni_sound_set_27_desc', 'Jingle Bells will never be the same...'), + ('game_chess_start', 'Start Over'), + ('summer_chair_7_desc', 'A green deck chair'), + ('nav_venue_bb_lobby_beginner_6_name', 'Beginners Battle Ball 7'), + ('purse_link', 'Click here to see how to get Credits.'), + ('poster_59_desc', 'Torch - it gives you some light'), + ('room_info_rate_req', 'Rate this room'), + ('furni_rare_dragonlamp*5_desc', 'Roast your chestnuts here!'), + ('furni_divider_silo3*9_desc', 'Red Area Gate'), + ('more_roomlayouts', 'Extra room layouts for Habbo Club members >>'), + ('furni_grunge_chair_desc', 'Alternative chair for alternative people'), + ('furni_bed_budget*9_desc', 'King sized comfort!'), + ('furni_christmas_sleigh_desc', 'Ready for your Xmas cheer'), + ('furni_table_plasto_4leg*8_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_tournament_5_name', 'Competitie Battle Ball 6'), + ('furni_table_norja_med*4_name', 'Urban Iced Coffee Table'), + ('instant_friend_request_header', 'Friend Request'), + ('furni_marquee*3_name', 'Aqua Marquee'), + ('furni_noob_stool*1_name', 'My first Habbo stool'), + ('furni_rare_mnstr_desc', 'Don\'t get too close...'), + ('furni_safe_silo_pb_desc', 'Totally shatter-proof!'), + ('NUF_meeting_people_user_chatfield', 'Start typing here and press \'Enter\' to chat with others.'), + ('furni_prizetrophy6*2_desc', 'Shiny silver'), + ('furni_table_plasto_bigsquare*9_name', 'Square Dining Table'), + ('club_habbo.window.title', 'Habbo Club'), + ('recycler_info_ready', 'Recycling is complete. You have made a great environmentally friendly decision. All the recycled items you receive have been made from old items which helps to save natural resources and reduce pollution.'), + ('furni_shelves_norja*5_desc', 'For nic naks and art deco books'), + ('furni_table_silo_med_name', 'Coffee Table'), + ('furni_grunge_sign_desc', 'Bought legitimately from an M1 cafe.'), + ('roomevent_type_9', 'Group Events'), + ('roomevent_type_7', 'Dating'), + ('pet.saying.generic.dog.1', 'woof woof woof!!!'), + ('roomevent_type_8', 'Jobs'), + ('pet.saying.generic.dog.2', 'wooooof!'), + ('roomevent_type_5', 'Debates & Discussion'), + ('pet.saying.generic.dog.3', 'hooooowl'), + ('roomevent_type_6', 'Grand Openings'), + ('furni_solarium_norja*2_name', 'Beige Solarium'), + ('nav_venue_bb_lobby_intermediate_3_name', 'Semi-profs Battle Ball 4'), + ('console_searchfor', 'Search:'), + ('wallitem_arabian_wndw_desc', 'Arabian days and nights'), + ('furni_queue_tile1*3_name', 'Ice Habbo Roller'), + ('furni_lamp2_armas_desc', 'Wax lyrical with some old-world charm'), + ('furni_jp_tray3_desc', 'jp_tray3'), + ('wallitem_guitar_skull_name', 'skull guitar'), + ('roomevent_type_3', 'Games'), + ('furni_romantique_divider*2_desc', 'Keeping things separated'), + ('roomatic_owner', 'Owner:'), + ('url_helpterms', 'http://%predefined%//help/68'), + ('roomevent_type_4', 'Welcoming Party Events'), + ('furni_glass_chair*6_desc', 'Translucent beauty'), + ('furni_pillar*5_name', 'Pagan Pillar'), + ('roomevent_type_1', 'Parties & Music'), + ('roomevent_type_2', 'Trading'), + ('furni_present_gen2_desc', 'What\'s inside?'), + ('ph_tickets_title', 'Tickets'), + ('furni_table_norja_med*8_desc', 'For larger gatherings'), + ('furni_sound_set_54_desc', 'Tune into Christmas'), + ('poster_61_desc', 'The Auspicious One'), + ('furni_divider_silo3_name', 'Gate (lockable)'), + ('furni_scifirocket*4_desc', 'Welcome... to planet love'), + ('furni_plant_valentinerose*1_name', 'Red Valentine\'s Rose'), + ('furni_exe_chair2_name', 'Executive Boss Chair'), + ('alert_donate_ok', 'Give away my furni'), + ('furni_bardesk_polyfon*4_desc', 'Beige Mode Bardesk'), + ('furni_pura_mdl1*5_desc', ''), + ('hubu_close', 'Sulje kioski'), + ('gs_deathmatch', 'Every Habbo for himself!'), + ('summer_chair_9_desc', 'Sunbathing, why not?'), + ('furni_barchair_silo*8_name', 'Yellow Bar Stool'), + ('console_differentmessagemodes', 'Different Messages'), + ('furni_chair_silo*5_name', 'Pink Silo Dining Chair'), + ('callhelp_explanation', 'Thanks for reporting the problem'), + ('furni_chair_plasty*1_desc', 'Hip plastic furniture'), + ('furni_bed_budget*2_desc', 'Queen sized comfort!'), + ('furni_summer_grill*2_desc', 'Plenty of shrimp on that barbie'), + ('furni_heart_desc', 'Full of love'), + ('reg_donetext', 'Soon you\'ll see the Hotel Navigator, it shows you all the rooms you can go to -the guest rooms, clubs, caf�s, swimming pools and more!'), + ('poster_523_desc', 'The flag of India'), + ('furni_one_way_door*1_name', 'Aqua One Way Gate'), + ('furni_bardeskcorner_polyfon*13_desc', 'Tuck it away'), + ('nav_venue_sw_lobby_amateur_5/0_desc', 'Astetta rankempaa lumisotaa.'), + ('furni_gothic_chair*4_desc', 'Vampires and Wizards'), + ('furni_bardesk_polyfon*6_desc', 'Blue Mode Bardesk'), + ('transaction_system_sms_sra', 'Sonera'), + ('dimmer_turn_off', 'Turn OFF'), + ('furni_fireplace_armas_desc', 'Authentic, real flame fire'), + ('furni_chair_plasty*6_name', 'Plastic Pod Chair'), + ('furni_scifidoor*6_name', 'Black Monolith'), + ('furni_summer_pool*3_desc', 'Fancy a dip?'), + ('furni_christmas_reindeer_desc', 'Prancer becomes Rudolph in a click!'), + ('furni_chair_norja_name', 'Chair'), + ('furni_barchair_silo*3_name', 'White Bar Stool'), + ('nav_venue_bb_lobby_tournament_desc', 'Play battle ball tournament!'), + ('transaction_system_bank_sampo', 'Sampo'), + ('furni_sound_set_39_name', 'Rock 7'), + ('furni_pura_mdl3*8_desc', ''), + ('console_follow_prevented', 'Your friend has prevented others from following him/her.'), + ('poster_46_name', 'Small gold star'), + ('furni_sofa_polyfon_girl_name', 'Two-seater Sofa'), + ('furni_carpet_polar*3_desc', 'Snuggle up on a Funky bear rug...'), + ('modtool_rankerror', 'You do not have the rights for this action on this user!'), + ('furni_divider_nor3*4_name', 'Urban Iced Gate'), + ('nav_venue_theatredrome_valentine/0_desc', 'Hug A Friend, Its Valentines! Home Of Ralph (Wannabe Panda In Training)'), + ('furni_one_way_door*6_name', 'Blue HC Gate'), + ('poster_7_desc', 'For emergencies only'), + ('wallitem_hc_wall_lamp_name', 'Retro Wall Lamp'), + ('poster_508_name', 'The Spanish flag'), + ('help_emergency_example', 'Example: A Habbo wants to see me on webcam.'), + ('nav_venue_bb_lobby_expert_1/0_desc', ''), + ('furni_pura_mdl1*7_desc', 'Any way you like it!'), + ('wallitem_post.it_desc', 'Pad of stickies'), + ('nav_modify_doorstatus_passwordprotected', 'Let other people move and leave furniture in the room.'), + ('queue_set.queue_full.alert', 'The queue for this room is full. Please try again later.'), + ('nav_venue_bb_lobby_beginner_8_name', 'Beginners Battle Ball 9'), + ('nav_venue_sw_arena_amateur_name(0)', 'Playing amateur game'), + ('url_figure_editor', 'http://%predefined%//profile/profile.action'), + ('furni_noob_lamp*6_desc', 'Get the light right where you want it (canary yellow)'), + ('furni_divider_nor5*5_name', 'Pink Iced Angle'), + ('nav_venue_sw_lobby_free_desc', 'Come and play. It\'s free!'), + ('furni_table_silo_small*6_desc', 'Blue Area Occasional Table'), + ('NUF_getting_items_navigator_tutor', 'You need to be in a Habbo\'s room to access the Catalogue.'), + ('furni_safe_silo*6_desc', 'Totally shatter-proof!'), + ('furni_glass_sofa*7_name', 'Green Glass Sofa'), + ('wallitem_md_can_desc', 'Enough bubbling juice for one evening'), + ('furni_rare_fan*9_desc', 'It\'ll blow you away!'), + ('furni_prizetrophy7_name', 'Pokaali'), + ('furni_noob_stool*3_name', 'My first Habbo stool'), + ('furni_glass_sofa*2_desc', 'Translucent beauty'), + ('pet_frnd_10', 'Adoring'), + ('furni_turkey_desc', 'Where\'s the cranberry sauce?'), + ('pet_frnd_11', 'Devoted'), + ('Alert_ConnectionNotReady', 'Could not connect to the server'), + ('console_search_habbo_profilematch', 'Habbo Profile match -'), + ('furni_sound_set_59_desc', 'Urban break beats'), + ('poster_21_name', 'Butterfly Cabinet'), + ('credits', 'Credits'), + ('furni_sound_set_14_name', 'Hip Hop Beats 2'), + ('NUH_hand', 'Click here to open your inventory (aka the Big Hand). Drag and drop furniture to and from here to move it.'), + ('furni_pura_mdl3*1_desc', 'Any way you like it!'), + ('nav_modify_doorstatus_pwprotected', 'Password protected:'), + ('shopping_costs', 'XX costs XX Credit(s).\\rJust click \'buy\' once, it\'ll appear shortly.'), + ('NUF_mini_meet_people', 'Meet some people'), + ('furni_divider_nor1*3_name', 'White Iced Corner'), + ('furni_bed_budget*7_name', 'Green Pura Double Bed'), + ('furni_pura_mdl5*9_desc', 'Any way you like it!'), + ('nav_venue_club_massiva/2_name', 'Dancefloor'), + ('furni_scifiport*3_desc', 'Energy beams. No trespassers!'), + ('whisper', 'Whisper'), + ('furni_chair_plasto*4_name', 'Chair'), + ('furni_hc_bkshlf_name', 'Medieval Bookcase'), + ('furni_goodie1*2_name', 'Marzipan Man'), + ('furni_rare_fountain*1_name', 'Bird Bath (grey)'), + ('bb_text_hostInfo', 'Please choose a name for your Game and select the number of Teams.'), + ('hubu_t3_1', ''), + ('hubu_t3_2', 'Hubun kiertuekalenteri 2002'), + ('furni_sound_set_34_name', 'Rock 5'), + ('furni_rare_fountain*3_desc', 'For our feathered friends'), + ('nav_venue_sw_lobby_amateur_5_name', 'Snow Slingers Lobby'), + ('furni_pura_mdl3*2_name', 'Pink Pura Module 3'), + ('furni_xmas_cstl_wall_desc', 'Solid blocks of ice and snow'), + ('furni_arabian_tray1_name', 'Mint Tea Tray'), + ('furni_jp_tray4_name', 'jp_tray4'), + ('furni_grunge_candle_desc', 'Late night debate'), + ('furni_rclr_garden_name', 'Water Garden'), + ('furni_CFC_100_coin_gold_name', 'Gold Coin (China)'), + ('nav_venue_gate_park_name', 'Imperial Park'), + ('shopping_asagift', 'Buy As A Gift'), + ('furni_soft_sofachair_norja*7_desc', 'Sit back and relax'), + ('dance', 'Dance'), + ('roomatic_wrongpw', 'Oops! Sorry, your passwords don\'t match. Please enter them again.'), + ('furni_hc_trll_desc', 'For swanky dinners only'), + ('furni_prizetrophy3*2_desc', 'Shiny silver'), + ('modtool_roomkick', 'Room Kick'), + ('roomatic_letmove', 'Let other people move your furniture and place their own. (Furniture cannot be stolen.)'), + ('roomevent_default_description', ''), + ('nav_venue_sw_lobby_free_4/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('console_invalid_message', 'There was a message from a user that was probably removed your friend list. Note, user is removed from your friend list if you report a message to moderators.'), + ('poster_503_name', 'The Swiss flag'), + ('nav_venue_sw_arena_expert_name(0)', 'Playing expert game'), + ('poster_41_desc', 'For the best music-makers'), + ('furni_tile_name', 'Floor Tiles'), + ('furni_val_randomizer_name', 'Love Randomiser'), + ('nav_modify_doorstatus_open', 'Open'), + ('furni_plant_big_cactus_desc', 'Habbo Dreams monster in hiding! Shhhh'), + ('furni_safe_silo*8_desc', 'Totally shatter-proof!'), + ('wallitem_sw_hole_name', 'sw_hole'), + ('play_preview', 'Play preview of sounds'), + ('furni_table_plasto_round*14_name', 'Occasional Table'), + ('poll_thanks_window', 'Thanks!'), + ('wallitem_habbowheel_desc', 'So you gotta ask yourself "Do I feel lucky?"'), + ('furni_carpet_standard_name', 'Floor rug'), + ('furni_divider_nor1*8_name', 'Yellow Ice corner'), + ('nav_venue_bb_lobby_tournament_3/0_desc', ''), + ('buddyremove_ok_text', 'You have chosen enough friends to remove.'), + ('nav_venue_sw_lobby_intermediate_5/0_desc', 'Lumisota sen kuin vain kovenee.'), + ('furni_divider_nor4*7_desc', 'Habbos, roll out!'), + ('furni_summer_chair*3_desc', 'Black'), + ('furni_table_plasto_bigsquare*6_desc', 'Hip plastic furniture'), + ('gs_link_highscores', 'High Scores'), + ('Alert_purchasingerror', 'Buying unsuccessful'), + ('poster_5_desc', 'Quacking good design!'), + ('help_emergency_sent', 'A member of community staff will investigate the situation and take appropriate action. This may include sending you a response with advice on dealing with your issue.'), + ('room_user_page', 'Home Page'), + ('room_badge_window_title', 'Badge'), + ('login_name', 'Name of your Habbo'), + ('furni_divider_nor2*5_name', 'Pink Iced bar desk'), + ('nav_venue_habbo_lido_ii/0_desc', 'Dive right in!'), + ('furni_sporttrack2*2_name', 'Sport corner asphalt'), + ('roommatic_modify_size', 'Room size: %tileCount% tiles'), + ('pet.saying.sniff.croco.2', '*Sighs*'), + ('furni_prize2_name', 'Silver Trophy'), + ('Now you can find out how to get more cool Furniture for your room, or select another topic.', ''), + ('pet.saying.sniff.croco.0', 'Ewwwww....'), + ('pet.saying.sniff.croco.1', '*Sniff sniff*'), + ('furni_pura_mdl3*6_name', 'Blue Pura Module 3'), + ('poster_48_desc', 'All that glitters...'), + ('furni_wcandle_desc', 'Xmas tea light'), + ('nav_venue_bb_arena_3_name', 'Battle Ball Keskitaso'), + ('sound_machine_confirm_save_long', 'Are you sure you want to overwrite the current saved song?'), + ('purse_vouchers_helpurl', 'http://%predefined%/help/4'), + ('nav_venue_bouncer_room_2_name', 'Gevorderden Battle Ball Arena'), + ('furni_sand_cstl_gate_desc', 'sand_cstl_gate desc'), + ('furni_barrier*1_name', 'Yellow Maze Barrier'), + ('nav_venue_bb_lobby_tournament_0_name', 'Tournament'), + ('NUF_getting_room_roommatic_layout_tutor', 'Select what you want your room to look like. Use the arrows to cycle through different room layouts. Almost there, almost there...'), + ('poll_confirm_cancel', 'Stop answering?'), + ('furni_carpet_soft*4_desc', 'Soft Wool Rug'), + ('furni_rare_icecream_campaign_desc', 'Basic model'), + ('club_habbo.bottombar.text.notmember', 'Habbo Club'), + ('recycler_info_closed', 'Recycler is closed at the moment. Please check back later to recycle your Furniture.'), + ('furni_solarium_norja*8_desc', 'Rejuvenate your pixels!'), + ('callhelp_example', 'Example: How do I move my Furni?'), + ('furni_bed_budget_one*4_name', 'White Pura Bed'), + ('roomatic_givepwd', 'Password:'), + ('furni_teleport_door_name', 'Teleport Door'), + ('furni_table_silo_small*9_name', 'Red Area Occasional Table'), + ('furni_noob_chair*4_name', 'My first Habbo chair'), + ('furni_table_plasto_square*2_desc', 'Hip plastic furniture'), + ('room_waiting', 'Waiting to go in...'), + ('furni_sink_desc', 'Hot and cold thrown in for no charge'), + ('furni_doormat_plain_name', 'Doormat'), + ('nav_venue_eric\'s_eaterie_name', 'Eric\'s Eaterie'), + ('nav_venue_pizzeria_name', 'Slice of Life'), + ('poster_1004_desc', 'Celebrate with us'), + ('next', 'Next'), + ('furni_solarium_norja*9_name', 'Red Solarium'), + ('tutorial_quit_confirmation', 'You want to leave? Well I hope you learned something... something useful!'), + ('furni_val_teddy*2_desc', 'The pink bear of passion'), + ('poster_1003_name', 'UK Map'), + ('furni_glass_table*2_name', 'Glass table'), + ('NUF_habbo_home_url', 'http://d15-1.web.varoke.net/home/home-tutorial'), + ('furni_bed_silo_one_name', 'Single Bed'), + ('transaction_system_sms_win_btcellnet', 'O2 SMS'), + ('pet.hotwords.go_away', 'go away'), + ('furni_table_plasto_square*9_desc', 'Hip plastic furniture'), + ('furni_doormat_plain*4_name', 'Doormat'), + ('nav_venue_cunning_fox_gamehall_name', 'Cunning Fox Gamehall'), + ('furni_sound_machine*2_name', 'Ocean Traxmachine'), + ('furni_table_polyfon_name', 'Large Coffee Table'), + ('furni_hc_frplc_desc', 'Pixel-powered for maximum heating'), + ('console_request_massoperation_instruction', 'Use the options below to accept or decline ALL friend requests you have waiting.'), + ('nav_venue_bb_lobby_tournament_6/0_desc', ''), + ('furni_table_plasto_round*6_desc', 'Hip plastic furniture'), + ('trading_cancel', 'Cancel Trading'), + ('furni_glass_stool*3_name', 'Glass stool'), + ('furni_plant_mazegate_snow_name', 'Snowy Maze Gate'), + ('nav_venue_tv_studio_name', 'MuchMusic HQ'), + ('furni_table_norja_med*3_desc', 'For larger gatherings'), + ('furni_chair_plasty*8_desc', 'Hip plastic furniture'), + ('furni_bed_polyfon_name', 'Double Bed'), + ('gs_4teams', '4 Team Game'), + ('furni_sound_set_8_desc', 'Mellow electric grooves'), + ('ph_keys_jump', 'Jump:'), + ('reg_welcome', 'Welcome To Habbo Hotel!'), + ('purse_head', 'HABBO ACCOUNT ACTIVITY'), + ('nav_venue_bb_lobby_tournament_7_name', 'Competitie Battle Ball 8'), + ('reg_verification_newPasswordAgain', 'Retype new password:'), + ('furni_bardeskcorner_polyfon*8_desc', 'Yellow Mode Bardesk Corner'), + ('furni_sound_set_21_name', 'Rock 1'), + ('furni_gothic_stool*1_desc', 'The dark side of Habbo'), + ('furni_rope_divider_name', 'Rope Divider'), + ('poster_53_name', 'Hockey Stick'), + ('roomevent_default_desc', 'Event description..'), + ('nav_refresh_recoms', 'Refresh recommendations'), + ('nav_venue_sw_lobby_beginner_2_name', 'Snow Rookies Lobby'), + ('furni_divider_silo3*4_desc', 'Beige Area Gate'), + ('furni_divider_poly3*6_name', 'Blue Mode Bardesk Gate'), + ('reg_parentemail_title', 'Informing your parents'), + ('furni_gothgate_name', 'Gothic Portcullis'), + ('furni_mocchamaster_name', 'Mochamaster'), + ('modtool_message', 'Message:'), + ('furni_tree4_desc', 'Any presents under it yet?'), + ('furni_marquee*a_name', 'White Marquee'), + ('furni_queue_tile1*5_name', 'Knight Roller'), + ('furni_chair_polyfon_name', 'Dining Chair'), + ('furni_sleepingbag*9_name', 'Blue Sleeping Bag'), + ('furni_sound_set_9_name', 'Electronic 2'), + ('poster_39_desc', 'The rock masters of virtual music'), + ('furni_arabian_tetbl_desc', 'Serve up a treat'), + ('nav_venue_sw_lobby_free_9_name', 'Free Game Lobby'), + ('nav_venue_sw_arena_free_name(0)', 'Playing free for all game'), + ('furni_grand_piano*4_desc', 'Why is that key green?'), + ('furni_doorD_desc', 'Let\'s go over tzar!'), + ('purse_date', 'DATE'), + ('nav_venue_sw_lobby_beginner_6/0_desc', ''), + ('nav_venue_sw_lobby_beginner_4/0_desc', ''), + ('nav_venue_sw_lobby_intermediate_1_name', 'Snow Bombardiers Lobby'), + ('alert_reg_age', 'You are under 11 years old. Children under 11 can\'t enter Habbo Hotel.'), + ('nav_venue_bb_lobby_intermediate_9/0_desc', ''), + ('queue_set.c.alert', 'This room is for Habbo Club members only. In order to enter, you need to subscribe to Habbo Club.'), + ('sound_machine_confirm_clear_long', 'Are you sure you want to clear the current song?'), + ('furni_exe_drinks_name', 'Executive Drinks Tray'), + ('reg_bday_note', 'Please enter your correct date of birth, this is important! You\'ll need this information later on, if you want to change your password or e-mail.'), + ('modtool_roomalert', 'Room Alert'), + ('furni_rare_parasol*1_name', 'Yellow Parasol'), + ('furni_sound_set_18_name', 'Groove 4'), + ('sound_machine_window', 'Sound Machine Editor'), + ('furni_traffic_light*1_name', 'Classic Traffic Light'), + ('furni_chair_norja*4_desc', 'Sleek and chic for each cheek'), + ('furni_divider_nor1*2_desc', 'Black Ice corner'), + ('nav_venue_median_lobby_name', 'Median Lobby'), + ('furni_sofa_silo*3_desc', 'Cushioned, understated comfort'), + ('furni_bed_budget_desc', 'Comfortable, affordable!'), + ('furni_divider_nor4_name', 'Plain Iced Auto Shutter'), + ('furni_rare_icecream*6_desc', 'Virtual toffee rocks!'), + ('habboclub_txt1', 'You can buy Habbo Club one month at a time using Habbo Credits.'), + ('habboclub_txt3', 'Yes, I\'m over 14 years of age\\rOR\\rI\'m under 14 years of age and I have a permission from my parent/guardian to join Habbo Club.'), + ('furni_rare_dragonlamp*3_desc', 'Scary and scorching!'), + ('furni_noob_lamp*5_name', 'My first Habbo lamp'), + ('club_bottombar_text2', '(....)'), + ('furni_CFC_500_goldbar_name', 'Gold Bar (China)'), + ('club_bottombar_text1', 'Loading'), + ('furni_rare_elephant_statue*1_desc', 'Say hello to Nelly'), + ('furni_table_silo_med*7_name', 'Green Area Coffee Table'), + ('nav_venue_sw_lobby_free_1/0_desc', ''), + ('furni_bottle_desc', 'For interesting games!'), + ('furni_romantique_pianochair*2_desc', 'Let the music begin'), + ('furni_table_norja_med*2_name', 'Large Coffee Table Black'), + ('queue_set.e2.alert', 'This room is currently available only to Habbos participating to the event.'), + ('furni_solarium_norja_desc', 'Rejuvenate your pixels!'), + ('furni_table_plasto_square*14_desc', 'Hip plastic furniture'), + ('cam_save.help', 'Save & Print Photo'), + ('furni_sound_set_4_desc', 'Chilled out beats'), + ('furni_couch_norja*6_name', 'Blue Bench'), + ('poster_2003_desc', 'Would you trust this man?'), + ('hobba_cryforhelp', 'Call For Help:'), + ('furni_marquee*9_desc', 'It\'s both door and a shade!'), + ('nav_venue_bb_lobby_tournament_13/0_desc', ''), + ('poster_512_desc', 'The flag of Ireland'), + ('handitem12', 'Macchiato'), + ('object_displayer_hide_actions', 'Hide actions'), + ('furni_sound_set_25_name', 'Dance 1'), + ('handitem11', 'Mocha'), + ('handitem10', 'Latte'), + ('furni_sound_set_13_desc', 'Let Music be the food of Habbo'), + ('handitem16', 'Cappuccino'), + ('handitem15', 'Iced'), + ('handitem14', 'Filter'), + ('handitem13', 'Espresso'), + ('nav_venue_sw_lobby_free_2_name', 'Free Game Lobby'), + ('handitem19', 'Habbo Cola'), + ('nav_venue_sw_lobby_amateur_2/0_desc', ''), + ('handitem18', 'Tap'), + ('handitem17', 'Java'), + ('console_next_msg', 'Delete'), + ('furni_bardesk_polyfon*5_name', 'Candy Bar'), + ('furni_scifidoor*5_desc', 'There out of this world!'), + ('nav_roomispwprotected', 'The room is password protected.'), + ('furni_sleepingbag*2_name', 'Lime Sleeping Bag'), + ('furni_glass_table*6_name', 'Blue Glass Table'), + ('furni_divider_nor4*3_desc', 'Habbos, roll out!'), + ('furni_sound_set_61_name', 'Latin Love 3'), + ('nav_venue_pizza/0_desc', 'Pizza Palace'), + ('furni_romantique_clock_desc', ''), + ('furni_queue_tile1*0_desc', 'The power of movement'), + ('furni_pura_mdl2*9_desc', 'Any way you like it!'), + ('nav_venue_orient/0_name', 'Club Golden Dragon'), + ('furni_noob_table*1_desc', 'Lightweight, practical and orange'), + ('poster_22_desc', 'beautiful reproduction butterfly'), + ('furni_carpet_soft_name', 'Soft Wool Rug'), + ('Message', 'Message'), + ('furni_bed_trad_one_desc', 'All you need for a good night\'s kip'), + ('console_report_help', 'If the message you received was abusive or harassing, you can report it to the Moderators by clicking the Report button below. The Habbo will be removed from your Friends\' List automatically when you report. If you want to remove a Habbo from your Friends\' List without reporting their message, simply use the Remove button below.'), + ('furni_rcandle_desc', 'Xmas tea light'), + ('furni_sofa_silo*8_name', 'Yellow Two-Seater Sofa'), + ('furni_pura_mdl4*5_desc', ''), + ('NUF_mini_use_console_ready_tutor', 'You can now use the Console to find some of your friends, or you can continue the tutorial.'), + ('log_problem_link', 'Read FAQ\'s'), + ('furni_shelves_silo_name', 'Bookcase'), + ('gs_timetojoin', '\\x seconds to join'), + ('nav_venue_cunning_fox_gamehall/1_name', 'Gamehall Lobby'), + ('furni_safe_silo*7_name', 'Green Safe Minibar'), + ('NUF_mini_meet_people_hotelview_tutor', 'The Navigator lets you move between rooms in the Hotel. Open it up to get started!'), + ('purse_vouchers_sendbutton', 'Get Credits!'), + ('furni_gothic_sofa*4_name', 'Black Gothic Sofa'), + ('furni_wooden_screen*0_desc', 'Add an exotic touch to your room'), + ('catalog_give_trophymsg', 'You haven\'t engraved the trophy. Type \\ryour inscription in the grey box.'), + ('furni_prizetrophy5*3_name', 'Duo trophy'), + ('handitem23', 'Beetroot Habbo Soda'), + ('furni_rare_dragonlamp*8_name', 'Bronze Dragon Lamp'), + ('furni_divider_nor4*8_name', 'Yellow Iced Auto Shutter'), + ('handitem22', 'Lime Habbo Soda'), + ('furni_soft_sofa_norja*6_name', 'Blue Iced Sofa'), + ('handitem21', 'Hamburger'), + ('handitem20', 'Camera'), + ('furni_divider_nor1*9_desc', 'Red Ice corner'), + ('help_trouble', 'In Trouble?'), + ('handitem25', 'Love potion'), + ('handitem24', 'Bubble juice from 1999'), + ('furni_ham2_desc', 'Looks like you\'re too late!'), + ('nav_venue_bb_lobby_amateur_3_name', 'Gevorderden Battle Ball 4'), + ('furni_chair_plasto*15_name', 'Chair'), + ('furni_hyacinth1_desc', 'Beautiful bulb'), + ('furni_shelves_basic_desc', 'Pura series 404 shelves'), + ('furni_pura_mdl1*6_name', 'Blue Pura Module 1'), + ('nav_venue_cafe_gold/0_desc', 'Get the latest safety tips and tricks from Safety eXperts.'), + ('nav_venue_snowwar_lobby_name', 'Snow Storm Lobby'), + ('transaction_system_sms_slahti', 'Saunalahti'), + ('alert_tooLongPW', 'Your password is too long'), + ('furni_carpet_standard*5_desc', 'Available in a variety of colours'), + ('furni_deadduck_desc', 'Blood, but no guts'), + ('password.email.subject', 'Forgotten password'), + ('furni_prizetrophy2*3_desc', 'Breathtaking bronze'), + ('NUF_playing_games_hotelview_nav', 'Just click me to open the Navigator and get it over with...'), + ('furni_summer_chair*1_name', 'Aqua Deck Chair'), + ('furni_rubberchair*3_name', 'Orange Inflatable Chair'), + ('furni_exe_plant_desc', ''), + ('nav_venue_tearoom/0_desc', 'Chat with the people of Aoralia and meet a sprite or two!'), + ('nav_venue_sw_lobby_beginner_9/0_desc', ''), + ('furni_table_silo_med*6_name', 'Blue Area Coffee Table'), + ('nav_venue_sw_lobby_beginner_1/0_desc', ''), + ('furni_noob_stool*2_desc', 'Unfold me and take the weight off (dark blue)'), + ('camera_dialog_place', 'Move'), + ('furni_scifiport*8_desc', 'Energy beams. No trespassers!'), + ('url_peeloscore', 'http://%predefined%///groups/56555/id'), + ('console_follow_friend', 'Go to same room'), + ('sound_machine_alert_jukebox_list_full', 'The play list is full. Please wait until the current song has finished playing and try again.'), + ('poster_517_desc', 'Where\'s your kilt?'), + ('roomevent_type_11', 'Helpdesk'), + ('roomevent_type_10', 'Performance'), + ('furni_rare_dragonlamp*9_desc', 'Scary and scorching!'), + ('furni_pura_mdl2*3_name', 'Black Pura Module 2'), + ('url_help_1', 'http://%predefined%//credits'), + ('furni_edicehc_name', 'Dicemaster'), + ('furni_divider_silo1*8_name', 'Yellow Corner Shelf'), + ('furni_wooden_screen*5_desc', 'Add an exotic touch to your room'), + ('url_help_5', 'http://%predefined%/help/75'), + ('roomatic_intro2', 'Here\'s what one Habbo says about her room:'), + ('url_help_4', 'http://%predefined%//help/22'), + ('roomatic_intro1', 'You can decorate and furnish your room however you like and no one can tell you to tidy up or turn the music down. It\'s up to you if you let everyone in or just a chosen few, or lock the door and chill by yourself. Get creating and in a couple of minutes you\'ll have your own Habbo Hotel space.'), + ('url_help_3', 'http://%predefined%//help/'), + ('roomatic_intro3', 'My mates live miles away, but we can meet up in my room every Friday night and we don\'t have to worry about getting home afterwards.'), + ('url_help_2', 'http://%predefined%//profile?tab=4'), + ('furni_romantique_chair*5_name', 'Onyx Chair'), + ('url_help_6', 'http://www.habbohotel.co.uk/iot/go?lang=en&country=uk'), + ('furni_sound_set_20_name', 'SFX 2'), + ('furni_sofa_polyfon*4_desc', 'Beige Mode Sofa'), + ('sound_machine_alert_no_more_songs', 'Can\'t create new song! Traxmachine can have only %count% songs.'), + ('search', 'Search'), + ('room_preparing', '...Preparing room'), + ('nav_venue_bb_lobby_intermediate_0/0_desc', ''), + ('club_txt_renew2', 'You are Habbo Club member. If you want to change your subscription or leave the club, use the link below.'), + ('poster_1002_name', 'Queen Mum Poster'), + ('furni_barchair_silo*2_desc', 'Practical and convenient'), + ('reg_month', 'Month'), + ('club_txt_renew1', 'Your Habbo Club membership will be active for another %days% days. You can extend your membership by paying with Habbo Credits.'), + ('furni_rare_icecream*0_name', 'Cherry Ice Cream Machine'), + ('furni_sound_set_41_desc', 'Burning Riffs'), + ('nav_venue_beauty_salon_loreal_name', 'Beauty salon'), + ('poster_26_name', 'Angel Poster'), + ('furni_sound_set_19_name', 'Hip Hop Beats 4'), + ('furni_romantique_divan*4_name', 'Amber Chaise-Longue'), + ('furni_one_way_door*7_desc', 'One at a time!'), + ('sound_machine_confirm_eject_long', 'Are you sure you want to remove the Traxpack and it\'s samples from the song?'), + ('furni_glass_stool*8_desc', 'Translucent beauty'), + ('buddyremove_not_now', 'Cancel'), + ('no_user_for_gift', 'No user named %user% found. Gift not purchased.'), + ('buddyremove_lessoptions', 'Less Options <<'), + ('reg_legal_header1', 'Now you need to ask your parents/guardian to come to the computer. Read through the text (below) with your parents.'), + ('furni_carpet_soft*3_desc', 'Soft Wool Rug'), + ('reg_legal_header2', 'Read through the below text carefully. You must agree to the following terms before entering Habbo Hotel.'), + ('furni_sw_chest_name', 'sw_chest'), + ('nav_venue_sw_lobby_tournament_9_name', 'Tournament Lobby'), + ('messenger.email.footer', ''), + ('nav_venue_bb_arena_4_name', 'Battle Ball Expertit'), + ('club_change_url', 'http://%predefined%//credits/habboclub'), + ('furni_table_plasto_4leg*2_name', 'Occasional Table'), + ('ph_choosecolour', 'Choose Costume Colour'), + ('buddyremove_hc_more_info', 'More Info About Habbo Club >>'), + ('furni_romantique_smalltabl*1_desc', 'Every tray needs a table...'), + ('nav_venue_sw_lobby_tournament_8_name', 'Tournament Lobby'), + ('furni_divider_nor5_name', 'Plain Iced Angle'), + ('wallitem_roomdimmer_name', 'Mood Light'), + ('furni_bed_budget_one*5_name', 'Beige Pura Bed'), + ('furni_table_norja_med*9_name', 'Large Coffee Table Red'), + ('furni_pillow*3_desc', 'Puffy, soft and huge'), + ('furni_noob_rug*2_name', 'My first Habbo rug'), + ('nav_venue_sw_lobby_beginner_7_name', 'Snow Rookies Lobby'), + ('furni_exe_chair_desc', 'Relaxing leather comfort'), + ('furni_s_sound_machine*2_desc', 'Sound Machine Ocean Desc'), + ('nav_venue_dusty_lounge/0_desc', 'A dignified lounge for sitting back and enjoying a licorice pipe'), + ('game_bs_ship4', 'Destroyer(s)'), + ('game_bs_ship3', 'Cruiser(s)'), + ('game_bs_ship2', 'Battle Ship(s)'), + ('game_bs_ship1', 'An aircraft carrier'), + ('furni_table_plasto_bigsquare*4_name', 'Square Dining Table'), + ('openhrs_title', 'We are closing the hotel'), + ('furni_habbowood_chair_name', 'Director\'s Chair'), + ('roomatic_confirm', 'Confirm password:'), + ('poster_14_desc', 'A cunning painting'), + ('furni_doormat_plain*3_name', 'Doormat'), + ('furni_sound_set_3_desc', 'Chilled grooves'), + ('win_messenger', 'Habbo Console'), + ('summer_chair_7_name', 'Green Deck Chair'), + ('notickets_window_header', 'Tickets needed!'), + ('nav_updatenote', 'Updating your room properties may take a while. The changes have been made, but it\'ll take a few minutes until all Habbos can see them.'), + ('furni_table_plasto_bigsquare*5_name', 'Square Dining Table'), + ('url_purselink', 'http://%predefined%//credits?'), + ('console_follow_hotelview', 'Your friend is on the hotel view.'), + ('furni_solarium_norja*3_desc', 'Get the city look!'), + ('sound_machine_alert_song_name_missing', 'Please give your song a name.'), + ('furni_sound_machine*3_name', 'Green Traxmachine'), + ('jukebox_next_up', 'Next up:'), + ('trading_additems', 'Put items in boxes'), + ('furni_sporttrack3*1_name', 'Sport goal tartan'), + ('club_button_3_period', 'Buy 6 >>>'), + ('nav_delroom3', 'Room deleted!'), + ('nav_delroom2', 'Are you sure you want to delete this room? All the furniture left in it will also be deleted.'), + ('poster_34_name', 'Scamme\'d'), + ('go', 'Go >>'), + ('nav_delroom1', 'If you want to save the furniture in this room, move it to the giant hand before you continue.'), + ('console_habboprofile_arrowed', 'Habbo Profile >>'), + ('furni_chair_plasty*10_desc', 'Hip plastic furniture'), + ('cam_txtscreen.help', 'Caption'), + ('wallitem_item_placeholder_name', 'This furniture is downloading...'), + ('furni_carpet_standard*b_desc', 'Available in a variety of colours'), + ('poster_59_name', 'Torch'), + ('furni_chair_basic*4_name', 'White Pura Egg Chair'), + ('summer_chair_1_name', 'Aquamarine Deck Chair'), + ('nav_venue_space_cafe_name', 'Ten Forward'), + ('log_problem_url', 'http://%predefined%//help/faqs?faq_1_categoryId=14'), + ('group_homepage_url', 'http://%predefined%/groups/%groupid%/id'), + ('furni_heart_name', 'Giant Heart'), + ('nav_venue_sw_arena_beginner_name', 'Playing beginner game'), + ('furni_grunge_chair_name', 'Grunge Chair'), + ('nav_dooropens', 'Door opens! Go on in...'), + ('modtool_banuser', 'Ban User'), + ('furni_carpet_soft_tut_desc', 'Welcome, enjoy your stay!'), + ('furni_rare_mnstr_name', 'Venomus Habbolus'), + ('furni_divider_silo3*9_name', 'Red Area Gate'), + ('furni_pura_mdl3*1_name', 'Aqua Pura Module 3'), + ('Messages', 'Message(s)'), + ('wallitem_arabian_wndw_name', 'Arabian Window Frame'), + ('furni_prizetrophy3*1_desc', 'Glittery gold'), + ('furni_sound_set_47_desc', 'Storm the UKCharts!'), + ('poster_54_desc', 'whack that ball!'), + ('url_logout_concurrent', 'http://%predefined%//account/disconnected?reason=concurrentlogin&origin=popup'), + ('nav_venue_sw_lobby_beginner_1_name', 'Snow Rookies Lobby'), + ('furni_table_plasto_4leg*8_name', 'Occasional Table'), + ('sound_machine_turn_on', 'Switch On'), + ('furni_table_norja_med*4_desc', 'For larger gatherings'), + ('buddyremove_hc_info_url', 'http://www.habbo.co.uk/credits/habboclub'), + ('furni_romantique_divider*2_name', 'Green Screen'), + ('furni_pillar*5_desc', 'Find your natural roots'), + ('furni_table_silo_med_desc', 'Wipe clean and unobtrusive'), + ('furni_pillow*8_name', 'Navy Cord Pillow'), + ('room_owner', 'Owner:'), + ('furni_shelves_norja*5_name', 'Pink Bookcase'), + ('queue_set.d.info', 'There are %d% Habbos in front of you in the queue.'), + ('reg_retypepass', 'Retype Password:'), + ('furni_jp_tray3_name', 'jp_tray3'), + ('dance_stop', 'Stop Dancing'), + ('buddyremove_remove_text', 'You are about to remove %removeamount% friends from your friendlist.\\r\\r After removal, you\'ll have %amountleft% friends on your list:'), + ('nav_venue_bb_lobby_tournament_12_name', 'Competitie Battle Ball 13'), + ('furni_summer_chair*2_name', 'Deck Chair'), + ('furni_plant_valentinerose*1_desc', 'Secret admirer!'), + ('furni_sofachair_silo*4_name', 'Beige Area Armchair'), + ('poster_523_name', 'The flag of India'), + ('furni_scifirocket*4_name', 'Venus Smoke Machine'), + ('nav_venue_tearoom_name', 'Chinese Tea Room'), + ('furni_pura_mdl1*5_name', 'beige pura module 1'), + ('nav_venue_bb_lobby_tournament_0/0_desc', ''), + ('furni_chair_silo*5_desc', 'Pink Silo Dining Chair'), + ('club_txt_expired', 'Your Habbo Club membership has run out. You can join the club again by clicking the HC logo on the hotel view.\\rMembers of Habbo Club get priority access to the hotel (so you can always get in), exclusive clothes, hair colours, rare furni and special guest room layouts. To see exactly what you\'ll be able to get your hands on as a Habbo Club member, take a look in the Catalogue.'), + ('furni_glass_table*7_name', 'Green Glass Table'), + ('nav_prvrooms_notfound', 'Your search did not match any rooms'), + ('bb_title_BBscores2', 'Game over!'), + ('wallitem_gothicfountain_name', 'Gothic Ectoplasm Fountain'), + ('furni_one_way_door*1_desc', 'One at a time!'), + ('furni_chair_plasty*1_name', 'Plastic Pod Chair'), + ('furni_divider_nor3*9_name', 'Red Iced gate'), + ('sound_machine_time_2', '%min%:%sec%min'), + ('sound_machine_time_1', '%min%:%sec%min'), + ('furni_bardesk_polyfon*4_name', 'Beige Mode Bardesk'), + ('queue_set.queue_reset.alert', 'The queue for this room has been reset, please try again.'), + ('furni_jp_pillow_desc', 'Comfy and classical'), + ('nav_venue_sw_lobby_free_9/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('furni_barchair_silo*8_desc', 'Practical and convenient'), + ('delete_furniture', 'Delete Furniture (permanently)'), + ('furni_plant_bulrush_desc', 'Ideal for the riverside'), + ('poster_61_name', 'Siva Poster'), + ('furni_bed_silo_two_name', 'Double Bed'), + ('furni_plant_pineapple_desc', 'Needs loving glances'), + ('furni_bed_polyfon_girl_desc', 'Snuggle down in princess pink'), + ('furni_pillow*4_desc', 'Puffy, soft and huge'), + ('furni_table_norja_med*8_name', 'Large Coffee Table Yellow'), + ('transaction_system_tsms_win_tmobile', 'T-Mobile SMS'), + ('furni_scifidoor*10_desc', 'There out of this world!'), + ('furni_bed_polyfon*7_desc', 'Green Mode Double Bed'), + ('furni_toy1*2_desc', 'it\'s bouncy-tastic'), + ('transaction_system_sms_radiolinja', 'Elisa'), + ('furni_gothic_chair*4_name', 'Black Gothic Chair'), + ('furni_scifidoor*6_desc', 'Monolith goes up! Monolith goes down!'), + ('nav_venue_sw_lobby_free_3_name', 'Free Game Lobby'), + ('console_friend_request_not_found', 'There was an error finding the user for the friend request'), + ('furni_romantique_smalltabl*2_desc', 'Every tray needs a table...'), + ('furni_bed_budget*2_name', 'Pink Pura Double Bed'), + ('wallitem_post.it_name', 'Pad of stickies'), + ('gs_state_created', 'Waiting for players..'), + ('furni_divider_nor3*4_desc', 'Entrance or exit?'), + ('furni_sofa_polyfon_girl_desc', 'Romantic pink for two'), + ('locked', 'Locked (visitors have to ring bell)'), + ('alert_reg_birthday', 'Birthday'), + ('club_thanks_text', 'Here you can see your Habbo Club membership status, number of elapsed months, pre-ordered months and status of the ongoing month.'), + ('furni_sound_set_39_desc', 'Rock with a roll'), + ('nav_venue_old_skool/0_desc', 'A set of rooms inspired by the original and legendary Mobiles Disco, the progenitor of Habbo'), + ('poster_511_desc', 'The flag of The Netherlands'), + ('furni_couch_norja*7_name', 'Rural Iced Bench'), + ('furni_safe_silo*6_name', 'Blue Safe Minibar'), + ('furni_table_plasto_4leg*14_desc', 'Aqua table'), + ('room_sound_furni_limit', 'You can only place one sound furni per room'), + ('nav_venue_bb_lobby_beginner_15/0_desc', ''), + ('furni_glass_shelf_name', 'Glass shelf'), + ('furni_divider_nor2*6_desc', 'Blue Iced bar desk'), + ('furni_turkey_name', 'Roast Turkey'), + ('nav_venue_bb_lobby_tournament_16/0_desc', ''), + ('sw_timeleft', 'Time:'), + ('furni_rare_parasol_name', 'Parasol'), + ('furni_glass_sofa*7_desc', 'Habbo Club'), + ('furni_bardeskcorner_polyfon*13_name', 'Corner Cabinet/Desk'), + ('furni_rare_fan*9_name', 'Fucsia Powered Fan'), + ('furni_chair_plasto*4_desc', 'Hip plastic furniture'), + ('no', 'No'), + ('furni_rare_fan*4_desc', 'Fanning the fires of SUPERLOVE...'), + ('nav_venue_median_lobby/0_desc', 'A Mean place to hang'), + ('nav_venue_sw_lobby_intermediate_2/0_desc', ''), + ('furni_md_sofa_name', 'MD Sofa'), + ('furni_noob_lamp*1_desc', 'Get the light right where you want it (yellow)'), + ('login_connecting', 'Connecting...'), + ('furni_divider_nor1*3_desc', 'Looks squishy, but isn\'t!'), + ('furni_sound_set_14_desc', 'Rock them bodies'), + ('furni_sound_set_59_name', 'RnB Grooves 5'), + ('poster_21_desc', 'beautiful reproduction butterfly'), + ('wallitem_hc_wall_lamp_desc', 'Tres chic!'), + ('ok', 'OK'), + ('nav_venue_sw_lobby_tournament_1/0_desc', ''), + ('pet_happy', 'Happiness:'), + ('sound_machine_edit', 'Edit Song'), + ('furni_rare_elephant_statue*2_desc', 'Say hello to Nelly'), + ('furni_CFC_200_moneybag_desc', 'Worth 200 Credits'), + ('nav_venue_bb_lobby_intermediate_6/0_desc', ''), + ('console_buddylimit_requester', 'Friend could not be added. The request sender can not have anymore friends.'), + ('furni_sofa_silo*2_desc', 'Cushioned, understated comfort'), + ('sound_machine_alert_invalid_song_name', 'You have already burned another song with the same name. Please change the song name before trying again.'), + ('furni_fireplace_armas_name', 'Fireplace'), + ('furni_barchair_silo*3_desc', 'Practical and convenient'), + ('ph_ticket', 'Ticket'), + ('furni_arabian_divdr_desc', 'Carved Cedar Divider'), + ('wallitem_jp_ninjastars_desc', 'Not a frisbee'), + ('wallitem_hrella_poster_1_desc', 'Brighten up your cabin'), + ('furni_noob_stool*3_desc', 'Unfold me and take the weight off (aubergine)'), + ('furni_pura_mdl5*9_name', 'Red Pura Module 5'), + ('furni_divider_nor4*2_desc', 'Habbos, roll out!'), + ('NUF_mini_meet_people_roomlist_tutor', 'Click \'Open\' to open up a category and see what rooms are within. When you have found an interesting room, press \'Go\' to visit it.'), + ('poster_41_name', 'Habbo Golden Record'), + ('furni_jp_tray4_desc', 'jp_tray4'), + ('buddyremove_confirm', 'Yeah, it is done...'), + ('tutorial_topic_list_F', 'Choose a topic from the list below:'), + ('purse_time', 'TIME'), + ('nav_venue_sw_lobby_free_8_name', 'Free Game Lobby'), + ('tutorial_topic_list_M', 'Choose a topic from the list below:'), + ('furni_s_sound_machine*7_name', 'Sound Machine Red'), + ('interface_icon_navigator', 'Navigator, navigate around'), + ('furni_xmas_cstl_wall_name', 'Ice Castle Wall'), + ('nav_own_hd', 'Your Rooms.'), + ('modtool_aa_checkbox_text', 'Audio alert'), + ('wallitem_industrialfan_desc', 'Powerful and resilient'), + ('furni_bed_budget*8_desc', 'King sized comfort!'), + ('sound_machine_burn', 'Burn Song'), + ('nav_venue_sw_lobby_intermediate_0_name', 'Snow Bombardiers Lobby'), + ('nav_venue_bb_lobby_beginner_1_name', 'Beginners Battle Ball 2'), + ('furni_chair_basic*5_desc', ''), + ('password.email.prefix', 'Your password is:'), + ('furni_pura_mdl5*4_desc', 'Any way you like it!'), + ('furni_table_norja_med*3_name', 'White Iced Table'), + ('furni_pura_mdl3*2_desc', 'Any way you like it!'), + ('nav_venue_sw_lobby_tournament_3_name', 'Tournament Lobby'), + ('furni_sound_set_34_desc', 'For guitar heroes'), + ('furni_summer_grill*1_desc', 'Plenty of ribs on that barbie'), + ('hubu_t4_1', 'Anna palautetta Hubusta'), + ('furni_divider_nor1*8_desc', 'Yellow Ice corner'), + ('hubu_t4_2', 'Tsekkaa heebelin jorinat'), + ('poll_offer_title', 'Poll'), + ('summer_chair_2_desc', 'Leave your towel early'), + ('wallitem_habbowheel_name', 'The Wheel of Destiny!'), + ('reg_mission', 'Your Mission:'), + ('furni_sofa_polyfon*9_name', 'Red Two-seater Sofa'), + ('furni_bed_budget_one_desc', 'aquamarine'), + ('nav_venue_sw_lobby_tournament_7/0_desc', ''), + ('furni_gothic_sofa*3_name', 'Gothic Sofa Red'), + ('furni_chair_plasto*9_name', 'Chair'), + ('nav_venue_sw_arena_beginner_name(0)', 'Playing beginner game'), + ('notickets_text_2', 'Buy more tickets now and get a discount. You can also buy tickets as a present.'), + ('wallitem_sw_hole_desc', 'sw_hole'), + ('furni_plant_big_cactus_name', 'Mature Cactus'), + ('notickets_text_1', 'Game price is 1 credit. For that you get 2 tickets.'), + ('poster_19_name', 'Hole In The Wall'), + ('furni_divider_nor4*7_name', 'Rural Iced Shutter'), + ('email', ''), + ('furni_sound_set_13_name', 'Dance 5'), + ('furni_present_gen1_name', 'Gift'), + ('nav_venue_bb_lobby_tournament_19/0_desc', ''), + ('furni_chair_norja_desc', 'Sleek and chic for each cheek'), + ('furni_marquee*9_name', 'Green Marquee'), + ('sound_machine_alert_song_locked', 'The song you\'re editing can\'t be modified. Please save the song under another name to create a new copy.'), + ('furni_glass_stool*2_name', 'Glass stool'), + ('nav_venue_theatredrome_xmas/0_desc', ''), + ('poster_5_name', 'Duck Poster'), + ('furni_prize2_desc', 'Nice and shiny'), + ('furni_valeduck_desc', 'He\'s lovestruck'), + ('furni_chair_plasty*7_desc', 'Hip plastic furniture'), + ('closed', 'Closed'), + ('furni_wcandleset_name', 'White Candle Plate'), + ('furni_sleepingbag*3_name', 'Ocean Sleeping Bag'), + ('furni_tree3_name', 'Christmas Tree 1'), + ('furni_sound_set_26_name', 'Groove 1'), + ('furni_barrier*2_desc', 'No trespassing, please!'), + ('game_bs_turn1', 'Your Turn'), + ('nav_venue_bb_lobby_expert_desc', 'Expert battle ball!'), + ('alert_donate_topic', 'SCAM ALERT!'), + ('game_bs_turn2', 'The Enemy\'s Turn'), + ('furni_sand_cstl_gate_name', 'sand castle gate'), + ('furni_rare_dragonlamp*4_desc', 'Scary and scorching!'), + ('furni_camera_desc', 'Smile!'), + ('pet.hotwords.lie', 'lie down'), + ('furni_sound_set_60_name', 'Latin Love 2'), + ('console_accept_selected', 'Accept'), + ('furni_divider_silo1*3_desc', 'Neat and natty'), + ('furni_summer_chair*7_name', 'Green Deck Chair'), + ('furni_pumpkin_desc', 'Cast a spooky glow'), + ('reg_habboname_note', 'Now it\'s time to make your own Habbo character! To make your own Habbo, please start by choosing your Habbo Name.'), + ('furni_rare_icecream_campaign_name', 'Rare icecream white'), + ('furni_doormat_plain_desc', 'Available in a variety of colours'), + ('room_areYouSure', 'Are you sure you want to delete this item forever?'), + ('sound_machine_confirm_burn', 'Burn this song?'), + ('predefined_room_name', '%user_name%\'s room'), + ('furni_divider_silo1*2_name', 'Black Corner Shelf'), + ('furni_table_plasto_4leg*3_desc', 'Hip plastic furniture'), + ('furni_solarium_norja*8_name', 'Yellow Solarium'), + ('furni_exe_globe_desc', 'The power is yours!'), + ('furni_bed_polyfon*6_name', 'Blue Mode Double Bed'), + ('notickets_store_link', 'Go to ticket store >>>'), + ('NUF_habbo_home', 'Habbo Home'), + ('nav_venue_the_den_name', 'The Den'), + ('furni_table_plasto_square*2_name', 'Round Dining Table'), + ('modtool_header', 'The Tool'), + ('pet_enrg_7', 'Energetic'), + ('nav_noanswer', 'No answer'), + ('roommatic_hc_members_only', 'This Room Is For HC Members Only'), + ('furni_xmasduck_desc', 'A right Christmas quacker!'), + ('pet_enrg_8', 'Lively'), + ('NUF_getting_room_own_rooms_tutor', 'Click the \'Create own room\' button to start building your room. Don\'t worry, making your room is completely free.'), + ('pet_enrg_5', 'Sprightly'), + ('pet_enrg_6', 'Active'), + ('furni_doormat_plain*4_desc', 'Available in a variety of colours'), + ('pet_enrg_3', 'Lazy'), + ('pet_enrg_4', 'Relaxed'), + ('furni_divider_poly3*6_desc', 'Blue Mode Bardesk Gate'), + ('pet_enrg_1', 'Slow'), + ('furni_glass_table*2_desc', 'Translucent beauty'), + ('pet_enrg_2', 'Sluggish'), + ('poster_1003_desc', 'get the lovely isles on your walls'), + ('furni_hc_djset_name', 'The Grammophon'), + ('pet_enrg_9', 'Tireless'), + ('furni_table_plasto_round*6_name', 'Round Dining Table'), + ('furni_sporttrack2*3_name', 'Sport corner grass'), + ('furni_footylamp_name', 'Football Lamp'), + ('furni_bed_silo_one_desc', 'Plain and simple'), + ('pet_enrg_0', 'Tired'), + ('furni_soft_sofachair_norja*7_name', 'Rural Iced Sofachair'), + ('furni_solarium_norja*9_desc', 'Rejuvenate your pixels!'), + ('furni_pillow*9_desc', 'Puffy, soft and VERY fluffy!'), + ('furni_plant_mazegate_snow_desc', 'There\'s snow way through!'), + ('furni_sound_set_8_name', 'Ambient 2'), + ('furni_divider_silo3*4_name', 'Beige Area Gate'), + ('previous', 'Previous'), + ('furni_glass_stool*3_desc', 'Translucent beauty'), + ('furni_bardeskcorner_polyfon*8_name', 'Yellow Mode Bardesk Corner'), + ('next_onearrowed', 'Next >'), + ('nav_venue_sw_lobby_expert_desc', 'For the William Tells and Robin Hoods of Snow Storming.'), + ('furni_bardeskcorner_polyfon*2_name', 'Black Mode Bardesk Corner'), + ('catalog_pet_unacceptable', 'Sorry, that name is unacceptable to Hotel Management'), + ('furni_sound_set_46_name', 'Club 1'), + ('nav_error_room_full', 'The room is full.'), + ('furni_queue_tile1*4_name', 'Gold Habbo Roller'), + ('furni_mocchamaster_desc', 'Wake up and smell it!'), + ('furni_gothic_stool*1_name', 'Gothic Stool Pink'), + ('furni_noob_chair*5_name', 'My first Habbo chair'), + ('furni_noob_rug*3_desc', 'Nice and neat sisal rug with aubergine edging'), + ('nav_venue_club_mammoth/0_name', 'Club Mammoth'), + ('pet_race_1_024', 'Cat Burglar'), + ('pet_race_1_022', 'Matted Moggy'), + ('poster_39_name', 'Screaming Furnies'), + ('pet_race_1_023', 'Indoor Alley Cat'), + ('furni_prizetrophy5*3_desc', 'Breathtaking bronze'), + ('pet_race_1_020', 'Caterwaul Kitty'), + ('NUF_mini_meet_people_room_tutor', 'The people wandering around are Habbos just like you.\\nClick on one of them to learn more about them- or on yourself to look in the mirror.'), + ('pet_race_1_021', 'Fabulous Feline'), + ('furni_arabian_tetbl_name', 'Hexagonal Tea Table'), + ('furni_grand_piano*4_name', 'Amber Grand Piano'), + ('poster_504_desc', 'The German flag'), + ('roomatic_name', 'Room name:'), + ('furni_sound_set_21_desc', 'Headbanging riffs'), + ('credit_redeem_info', 'More info about credit furni >>'), + ('furni_marquee*a_desc', 'It\'s both door and a shade!'), + ('furni_sound_set_33_name', 'Rock 3'), + ('furni_queue_tile1*5_desc', 'The power of movement'), + ('furni_doorD_name', 'Imperial Teleport'), + ('furni_rare_parasol*1_desc', 'Block those rays!'), + ('purse_youhave', 'You Have'), + ('nav_fullbutton', 'Full'), + ('furni_rare_fountain*2_desc', 'For our feathered friends'), + ('friend_request_accepted', 'Accepted!'), + ('tutorial_help_button_bubble', 'Click the blue question mark to open up the help menu to restart the tutorial.'), + ('furni_rubberchair*4_desc', 'Soft and tearproof!'), + ('furni_sound_set_9_desc', 'Mystical ambient soundscapes'), + ('furni_rare_fan*3_name', 'Purple Dragon Skin Fan'), + ('furni_table_plasto_square*8_desc', 'Hip plastic furniture'), + ('gs_choose_gametime', 'Choose Game duration:'), + ('furni_traffic_light*1_desc', 'Chill and wait your turn!'), + ('furni_sofachair_polyfon*6_desc', 'Blue Mode Armchair'), + ('furni_chair_norja*4_name', 'Urban Iced Chair'), + ('furni_val_teddy*2_name', 'Pink Share Bear'), + ('nav_venue_chill/0_name', 'Zen Garden'), + ('furni_table_plasto_square_name', 'Occasional Table'), + ('furni_bed_budget_name', 'Pura Bed'), + ('furni_solarium_norja_name', 'White Solarium'), + ('furni_noob_table*1_name', 'My first Habbo table'), + ('gs_5min', '5min'), + ('purse_credits', 'You have \\x1 Habbo Credit(s) in your purse.'), + ('furni_divider_poly3*5_name', 'Candy Hatch (Lockable)'), + ('furni_rare_icecream*6_name', 'Toffee Ice Cream Machine'), + ('furni_table_polyfon_med_name', 'Large Coffee Table'), + ('console_deselect_all', 'Deselect all'), + ('nav_venue_bb_lobby_amateur_8_name', 'Gevorderden Battle Ball 9'), + ('transaction_system_sms_win_kpn', 'KPN SMS'), + ('nav_venue_bb_lobby_intermediate_3/0_desc', ''), + ('furni_CFC_500_goldbar_desc', 'Worth 500 Credits'), + ('NUF_visiting_rooms', 'Visiting other players\' rooms'), + ('url_logout_timeout', 'http://%predefined%//account/disconnected?reason=logout'), + ('furni_table_silo_med*7_desc', 'Green Area Coffee Table'), + ('player_commands_no_args', 'You have not supplied any arguments!'), + ('furni_romantique_pianochair*2_name', 'Lime Romantique Piano Chair'), + ('pickup', 'Pick up'), + ('reg_tutorial_url', ''), + ('habboclub_confirm_body', 'You have %credits% credits'), + ('nav_venue_bb_lobby_beginner_12/0_desc', ''), + ('furni_rare_elephant_statue*1_name', 'Silver Elephant'), + ('help', 'Habbo Help'), + ('furni_soft_sofachair_norja*2_desc', 'Black Iced Sofachair'), + ('furni_table_plasto_round*1_desc', 'Hip plastic furniture'), + ('furni_sleepingbag*9_desc', 'Ultimate coziness'), + ('furni_arabian_tray2_desc', 'For those Arabian nights'), + ('NUF_visiting_rooms_hotelview_tutor', 'Hello. This time we are learning how to visit another user\'s room.'), + ('furni_traffic_light*6_name', 'Red Traffic Light'), + ('Alert_ChooseWhoToSentMessage', 'Please choose who to\\rsend your message to'), + ('poster_47_desc', 'Twinkle, twinkle'), + ('bb_title_finalScores', 'Final standings:'), + ('jukebox_song_author', 'by: %author%'), + ('poster_2003_name', 'Dodgy Geezer'), + ('poster_509_name', 'The Jamaican flag'), + ('poster_6_desc', 'But is it the right way up?'), + ('furni_toy1*1_name', 'Rubber Ball'), + ('nav_venue_bb_lobby_beginner_13_name', 'Beginners Battle Ball 14'), + ('furni_scifidoor*5_name', 'White Spaceship Door'), + ('credit_redeem_text', 'You are going to change Furni to %value% credits.'), + ('nav_venue_sw_lobby_amateur_0_name', 'Snow Slingers Lobby'), + ('club_txt_intro', 'Welcome to Habbo Club - the members only club that all the best Habbos belong to!\\r\\rMembers of Habbo Club get priority access to the hotel (so you can always get in), exclusive clothes, hair colours, rare furni and special guest room layouts. To see exactly what you\'ll be able to get your hands on as a Habbo Club member, take a look in the Catalogue.'), + ('nav_venue_bouncer_room_1_name', 'Beginners Battle Ball Arena'), + ('update_email_suggest', 'Habbo Hotel security supervisor requests you to update your email'), + ('furni_rare_dragonlamp*3_name', 'Silver Dragon Lamp'), + ('furni_scifiport*2_name', 'Blue Laser Gate'), + ('club_button_extend', 'Extend Membership'), + ('wallitem_val_heart_name', 'Heart Light'), + ('furni_pura_mdl3*7_name', 'Green Pura Module 3'), + ('furni_sound_set_61_desc', 'Straight from the heart'), + ('nav_venue_bb_lobby_expert_9/0_desc', ''), + ('furni_pura_mdl2*9_name', 'Red Pura Module 2'), + ('furni_hal_cauldron_name', 'Habboween Cauldron'), + ('furni_divider_nor1*2_name', 'Black Ice corner'), + ('send', 'Send'), + ('furni_couch_norja_desc', 'Two can perch comfortably'), + ('furni_pura_mdl4*5_name', 'beige pura module 4'), + ('pet_race_1_008', 'Mad Mouser'), + ('pet_race_1_009', 'Scaredy Kat'), + ('pet_race_1_006', 'Titchy Tiger'), + ('pet_race_1_007', 'Burmese Buddy'), + ('pet_race_1_004', 'Soft-Toed Sneaker'), + ('furni_divider_nor4*8_desc', 'Habbos, roll out!'), + ('furni_tile_desc', 'In a choice of colours'), + ('pet_race_1_005', 'Cat Astroflea'), + ('pet_race_1_002', 'Lesser Spotted Longhair'), + ('pet_race_1_003', 'Hidden Clause'), + ('pet_race_1_000', 'Sleepy Siamese'), + ('pet_race_1_001', 'Purr-Sian'), + ('furni_sound_set_53_name', 'Snowy Surprise'), + ('furni_rare_icecream*1_desc', 'Virtual blueberry rocks!'), + ('furni_table_plasto_round*15_name', 'Occasional Table'), + ('security', 'Security'), + ('furni_glass_chair*5_name', 'Glass chair'), + ('nav_venue_cunning_fox_gamehall/1_desc', 'It\'s one-on-one for five in a row'), + ('nav_venue_sw_lobby_tournament_4/0_desc', ''), + ('furni_carpet_soft_desc', 'Soft Wool Rug'), + ('poster_27_desc', 'Deck the halls!'), + ('furni_safe_silo*7_desc', 'Totally shatter-proof!'), + ('furni_table_silo_small*5_desc', 'Pink Area Occasional Table'), + ('furni_marquee*4_desc', 'It\'s both door and a shade!'), + ('furni_gothic_sofa*4_desc', 'Ghosts and Ghouls'), + ('furni_prizetrophy6*1_desc', 'Glittery gold'), + ('pet_race_1_019', 'Bobcat Wailer'), + ('furni_bardesk_polyfon*5_desc', 'For cute constructions'), + ('furni_carpet_polar*2_name', 'Blue Bear Rug'), + ('pet_race_1_017', 'Furry Friend'), + ('furni_soft_sofa_norja*6_desc', 'Blue Iced Sofa'), + ('furni_pura_mdl2*4_desc', 'Any way you like it!'), + ('pet_race_1_018', 'Trusting Tabby'), + ('pet_race_1_015', 'Haughty House Pet'), + ('chatlog.url', 'https://theallseeingeye.sulake.com/ase/habbo/uk/housekeeping/extra/hobba/chatlog.action?chatId='), + ('furni_ham2_name', 'Eaten Ham'), + ('pet_race_1_016', 'Curiousity - The Return!'), + ('pet_race_1_013', 'Felis Catus Allergicus'), + ('pet_race_1_014', 'Bushy Bobtail'), + ('pet_race_1_011', 'Egyptian Angora'), + ('pet_race_1_012', 'Freckled Feral'), + ('gs_choose_gamefield', 'Choose Game Arena:'), + ('furni_divider_nor5*6_desc', 'Cool cornering for your crib y0!'), + ('furni_summer_pool*2_name', 'Red Summer Pool'), + ('pet_race_1_010', 'Wannabe Wildcat'), + ('furni_rare_elephant_statue_desc', 'Say hello to Nelly'), + ('furni_sofa_silo*8_desc', 'Cushioned, understated comfort'), + ('furni_exe_rug_desc', 'Please remove your shoes!'), + ('NUF_meeting_people_roomlist_tutor', 'Let\'s visit one of the rooms and find out how to meet other users.'), + ('furni_chair_plasto*15_desc', 'Hip plastic furniture'), + ('nav_venue_habburger\'s_name', 'Habburgers'), + ('queue_current_2', 'You are in queue for the room.'), + ('queue_current_1', 'You are in Habbo Live queue...'), + ('furni_pura_mdl5*3_name', 'Black Pura Module 5'), + ('furni_hockey_score_name', 'Scoreboard'), + ('furni_sofachair_silo*5_desc', 'Pink Area Armchair'), + ('furni_hyacinth1_name', 'Pink Hyacinth'), + ('furni_pura_mdl1*6_desc', 'Any way you like it!'), + ('camera_open_dialog_heading', 'Camera'), + ('furni_prizetrophy5*2_name', 'Duo trophy'), + ('furni_glass_chair_desc', 'Translucent beauty'), + ('furni_rubberchair*3_desc', 'Soft and tearproof!'), + ('furni_exe_plant_name', 'Executive Plant'), + ('furni_pura_mdl2*3_desc', 'Any way you like it!'), + ('furni_pura_mdl1*2_name', 'Pink Pura Module 1'), + ('furni_plant_bonsai_desc', 'You can be sure it lives'), + ('furni_plant_valentinerose*4_desc', 'Be mine!'), + ('wallitem_hrella_poster_3_desc', 'Don\'t drift away!'), + ('furni_deadduck_name', 'Dead Duck'), + ('furni_summer_grill*3_desc', 'Plenty of steak on that barbie'), + ('modtool_extrainfo', 'Extra Info:'), + ('sound_machine_jukebox_window', 'Jukebox'), + ('gs_button_start', 'Start Game!'), + ('nav_venue_sw_lobby_beginner_5/0_desc', ''), + ('furni_romantique_chair*5_desc', 'What does this button do?'), + ('furni_table_plasto_4leg*9_desc', 'Hip plastic furniture'), + ('furni_soft_sofa_norja_desc', 'A soft iced sofa'), + ('furni_divider_nor4*9_name', 'Red Iced Auto Shutter'), + ('login_haventGotHabbo', 'Haven\'t got a Habbo yet?'), + ('furni_noob_stool*2_name', 'My first Habbo stool'), + ('furni_s_sound_machine*5_desc', 'Sound Machine Brown Desc'), + ('credit_redeem_window', 'Redeem credit furni'), + ('send_invitation_text', 'Want to meet someone from our Welcoming Party?'), + ('purse_vouchers_exitbutton', 'Cancel'), + ('furni_prizetrophy6*3_desc', 'Breathtaking bronze'), + ('nav_venue_cafe_gold/0_name', 'Kultakahvila'), + ('furni_fortune_name', 'Crystal Ball'), + ('poster_22_name', 'Butterfly Cabinet (blue)'), + ('object_displayer_link_badge', 'Edit Badge'), + ('furni_sound_set_15_name', 'RnB Grooves 6'), + ('Alert_NoNameSet', 'Check your Habbo name.'), + ('furni_hc_crpt_name', 'Persian Carpet'), + ('error_ok', 'OK->'), + ('game_chess_email', 'Receive game via email'), + ('sound_machine_confirm_save_list', 'Save playlist?'), + ('furni_noob_rug*2_desc', 'Nice and neat sisal rug with blue edging'), + ('queue_set.e1.alert', 'This room is currently available only to Habbos participating to the event.'), + ('furni_rare_icecream*0_desc', 'Virtual cherry rocks!'), + ('furni_arabian_chair_name', 'Green Blossom Chair'), + ('furni_divider_silo3*6_name', 'Blue Area Gate'), + ('furni_scifiport*4_desc', 'Energy beams. No trespassers!'), + ('furni_sofa_silo*4_desc', 'Beige Area Sofa'), + ('furni_one_way_door*4_desc', 'One at a time!'), + ('furni_chair_norja*5_desc', 'Sleek and chic for each cheek'), + ('furni_sound_set_19_desc', 'Shake your body!'), + ('poster_26_desc', 'See that halo gleam!'), + ('furni_doormat_plain*2_desc', 'Available in a variety of colours'), + ('furni_romantique_chair*1_name', 'Rose Quartz Chair'), + ('furni_hc_tv_name', 'Mega TV Set'), + ('pet.hotwords.follow_me', 'heel'), + ('furni_petfood3_desc', 'Fantastic 20% Saving!'), + ('furni_couch_norja*5_name', 'Pink Bench'), + ('furni_table_plasto_round*7_desc', 'Hip plastic furniture'), + ('furni_bed_armas_two_desc', 'King-sized pine comfort'), + ('modtool_days', 'Days'), + ('furni_one_way_door*7_name', 'Green One Way Gate'), + ('furni_table_norja_med*5_name', 'Large Coffee Table Pink'), + ('furni_sand_cstl_wall_name', 'sand_cstl_wall'), + ('nav_modify_doorstatus_givepw', 'Password for the room'), + ('NUF_getting_items_room_tutor', 'Nice room. Reminds me of a chic Parisian cafe in Slough. Open the Catalogue.'), + ('habbo_hand_prev', '<<<'), + ('pet.saying.generic.croco.3', 'Tick tock tick....'), + ('invitation_follow_failed', 'Sorry, your attempt to follow an invitation failed.'), + ('furni_sound_set_12_desc', 'Unusual as Standard'), + ('pet.saying.generic.croco.1', '*Mellow*'), + ('error_text', 'Error occured, press \'OK\' to restart program.\\r\\rPlease report bugs to:\\rwww.habbohotel.com/habbo/en/help/contact/bugs/ \\rSorry for the inconvenience.'), + ('pet.saying.generic.croco.2', 'I\'m so hungry I could eat you!'), + ('furni_divider_silo3*3_desc', 'Form following function'), + ('furni_table_plasto_4leg*2_desc', 'Hip plastic furniture'), + ('int_newmessages', 'New Message(s)'), + ('furni_rare_icecream*3_name', 'Blackcurrant Ice Cream Machine'), + ('bb_header_gameinfo', 'Game info'), + ('furni_scifiport*0_name', 'Red Laser Door'), + ('nav_venue_bb_lobby_beginner_7_name', 'Beginners Battle Ball 8'), + ('tx_history.description.bank_wallie', 'Wallie-card'), + ('nav_venue_hallway_name', 'Hallway'), + ('nav_venue_bb_lobby_amateur_11/0_desc', ''), + ('furni_bed_budget_one*5_desc', 'Prince sized comfort!'), + ('pet.saying.generic.croco.0', 'Rrrr....Grrrrrg....'), + ('nav_popup_go', '>>'), + ('furni_safe_silo*3_name', 'White Safe Minibar'), + ('furni_table_silo_small_name', 'Occasional Table'), + ('poll_confirm_window', 'Leave our poll'), + ('furni_table_norja_med*9_desc', 'For larger gatherings'), + ('furni_divider_nor4*6_desc', 'Habbos, roll out!'), + ('gs_3teams', '3 Teams Game'), + ('wallitem_post.it.limit', 'Only 50 stickies per room are allowed!'), + ('furni_scifidoor*4_desc', 'Protect your pot of gold!'), + ('furni_bed_polyfon_one*9_name', 'Red Single Bed'), + ('furni_soft_sofa_norja*2_desc', 'Black Iced Sofa'), + ('furni_corner_china_desc', 'Firm, fireproof foundation'), + ('hobba_pickup_go', 'Pick Up & Go!'), + ('furni_sporttrack3*2_desc', 'null'), + ('furni_rare_fan*6_name', 'Ochre Powered Fan'), + ('furni_sound_set_3_name', 'Electronic 1'), + ('NUF_mini_meet_people_user_tutor', 'Here you can chat to users directly. Ask a Habbo to be your friend by clicking on their Habbo and the button.\\nIf this is your first time, check your Hand to see a present to decorate your own room with, later.'), + ('furni_pura_mdl2*6_name', 'Blue Pura Module 2'), + ('furni_couch_norja*9_desc', 'Two can perch comfortably'), + ('furni_chair_plasty*9_desc', 'Hip plastic furniture'), + ('game_chess_white', 'White:'), + ('nav_venue_sw_lobby_intermediate_3/0_desc', 'Lumisota sen kuin vain kovenee.'), + ('furni_table_plasto_square*3_desc', 'Hip plastic furniture'), + ('nav_venue_theatredrome/0_desc', 'Perform your latest masterpiece!'), + ('nav_venue_the_den/0_desc', 'Has anyone seen my map?'), + ('furni_sound_set_40_name', 'Rock 4'), + ('remove', 'Remove'), + ('friend_request_decline_all', 'Decline all requests.'), + ('furni_rare_globe_name', 'Snow Globe'), + ('furni_bardesk_polyfon*8_name', 'Yellow Mode Bardesk'), + ('nav_venue_sw_lobby_free_6_name', 'Free Game Lobby'), + ('queue_change', 'Change queue'), + ('reg_parentemail_link_text2', 'Privacy Pledge'), + ('furni_rare_parasol*2_desc', 'Block those rays!'), + ('furni_romantique_pianochair*3_desc', 'null'), + ('reg_parentemail_link_text1', 'See the letter'), + ('sound_machine_list_save', 'Save Playlist'), + ('nav_public_helptext_hd', 'Public Spaces'), + ('furni_chair_plasty*2_desc', 'Hip plastic furniture'), + ('spectator_count', 'spectators %cnt%/%max%'), + ('reg_welcome2', 'Create Your Own Habbo'), + ('wallitem_roomdimmer_desc', 'Superior lighting for your room'), + ('furni_prizetrophy*3_name', 'Classic trophy'), + ('furni_plant_rose_name', 'Cut Roses'), + ('reg_welcome3', 'Now the fun begins! All you need to do is register and you\'re ready to start. It won\'t take long!\\rYou can change everything except your name and date of birth later. Come on!'), + ('furni_noob_table*5_name', 'My first Habbo table'), + ('nav_error_room_closed', 'The room is closed.'), + ('reg_changePassword', 'Change your password'), + ('furni_divider_nor5*3_desc', 'Cool cornering for your crib y0!'), + ('furni_doorC_name', 'Portaloo'), + ('furni_chair_plasty*10_name', 'Plastic Pod Chair'), + ('furni_pura_mdl1*9_name', 'Red Pura Module 1'), + ('furni_rare_stand_name', 'Speaker\'s Corner'), + ('furni_grunge_table_name', 'Grunge Table'), + ('furni_traffic_light*2_name', 'Blue Traffic Light'), + ('pet.saying.angry.croco.2', 'You have displeased me.'), + ('human_trading', 'Trading'), + ('furni_noob_stool*6_desc', 'Unfold me and take the weight off (green)'), + ('pet.saying.angry.croco.1', 'Rawwwr...rrr'), + ('nav_venue_sw_lobby_intermediate_5_name', 'Snow Bombardiers Lobby'), + ('gs_button_leavegame', 'Leave Game'), + ('pet.saying.angry.croco.0', 'Grrrrr...rrr'), + ('furni_s_sound_machine*1_name', 'Sound Machine Grey'), + ('pet.saying.angry.croco.4', 'Buuuuurrr..rrrrr'), + ('furni_chair_plasto*7_desc', 'Hip plastic furniture'), + ('pet.saying.angry.croco.3', 'Rowrrrr...rrrr'), + ('furni_soft_sofa_norja*9_desc', 'Red Iced Sofa'), + ('nav_venue_skylight_lobby_name', 'Skylight Lobby'), + ('furni_bed_polyfon_one*6_desc', 'Blue Mode Single Bed'), + ('furni_pillow*8_desc', 'Puffy, soft and huge'), + ('furni_hc_rntgn_name', 'X-Ray Divider'), + ('furni_table_silo_med*5_desc', 'Pink Area Coffee Table'), + ('furni_gothic_stool*2_desc', 'Be seated please..'), + ('furni_typingmachine_desc', 'Write that bestseller'), + ('furni_fridge_desc', 'Keep cool with a chilled snack or drink'), + ('nav_venue_cunning_fox_gamehall/4_desc', 'Get a hand like a foot? Keep a straight face and bluff it out'), + ('doorbell_rings', 'Rings the doorbell - Open the door?'), + ('furni_divider_silo1*9_desc', 'Red Area Small Table'), + ('nav_venue_bb_lobby_intermediate_7/0_desc', ''), + ('furni_prize1_name', 'Gold Trophy'), + ('poster_54_name', 'Hockey Stick'), + ('furni_sound_set_47_name', 'Club 2'), + ('furni_prizetrophy3*1_name', 'Globe trophy'), + ('purse_head2', 'ACCOUNT TRANSACTIONS'), + ('furni_soft_sofa_norja*5_name', 'Pink Iced Sofa'), + ('furni_prizetrophy9*1_desc', 'Glittery gold'), + ('buddyremove_next', 'Next >'), + ('reg_girl', 'Girl'), + ('furni_bed_budget_one*1_name', 'Aqua Pura Bed'), + ('NUF_visiting_rooms_roomlist_go', 'Click \'Go\' to go to a room.'), + ('poster_506_desc', 'To \'Finnish\' your decor...'), + ('furni_toy1_name', 'Rubber Ball'), + ('furni_sound_set_7_desc', 'Sound effects for Furni'), + ('sw_fieldname_6', 'Riverbank Siege'), + ('sw_fieldname_5', 'Polar Labyrinth'), + ('furni_bed_polyfon*4_desc', 'Beige Mode Double Bed'), + ('furni_pillow*4_name', 'Gold Feather Pillow'), + ('alert_duplicatesession', 'You are already logged in on another hotel! Log out before trying again.'), + ('sw_fieldname_7', 'Skull Falls Assault'), + ('sound_machine_alert_song_not_ready', 'Can\'t save song! Song not ready yet.'), + ('nav_venue_bb_lobby_beginner_5/0_desc', ''), + ('nav_venue_bb_lobby_tournament_4/0_desc', ''), + ('pet.saying.play.dog.1', 'woofWOOFwoofWOOFwoof'), + ('pet.saying.play.dog.0', 'rrr.. WOOF .rrr..'), + ('furni_cn_lamp_name', 'Lantern'), + ('furni_arabian_rug_name', 'Berber Kilim Rug'), + ('NUF_groups_hotelview_tutor', 'You have now opened the Group tutorial in the website window. Special!'), + ('gs_error_start_9', 'Team sizes can only differ by one player. This Game cannot start!'), + ('furni_divider_poly3*7_desc', 'Green Mode Bardesk Gate'), + ('furni_sofachair_silo*4_desc', 'Beige Area Armchair'), + ('poster_58_desc', 'whish you luck'), + ('furni_chair_basic*2_desc', 'It\'s a cracking design!'), + ('poster_516_name', 'The English flag'), + ('nav_venue_sw_lobby_tournament_2/0_desc', ''), + ('furni_gothic_carpet_name', 'Cobbled Path'), + ('sw_title', 'Snow Storm'), + ('furni_doormat_plain*5_name', 'Doormat'), + ('furni_pura_mdl4*4_desc', 'Any way you like it!'), + ('furni_sound_machine*1_name', 'Sound Machine'), + ('furni_sofa_silo*7_name', 'Green Area Sofa'), + ('nav_venue_sw_lobby_tournament_4_name', 'Tournament Lobby'), + ('gs_title_gamecreation', 'Game creation'), + ('furni_couch_norja*2_desc', 'Two can perch comfortably'), + ('furni_prizetrophy5_desc', 'Palkinto'), + ('furni_divider_nor3*9_desc', 'Red Iced gate'), + ('furni_present_gen_name', 'Gift'), + ('furni_prizetrophy7*3_name', 'Bronze Habbo trophy'), + ('alert_reg_parent_email', 'The email address you provided is unacceptable.'), + ('furni_bed_polyfon_girl_name', 'Double Bed'), + ('furni_rare_fountain_name', 'Bird Bath (red)'), + ('furni_pura_mdl3*3_name', 'Black Pura Module 3'), + ('furni_plant_pineapple_name', 'Pineapple Plant'), + ('furni_divider_nor2*8_name', 'Yellow Iced bar desk'), + ('messenger', 'Messenger'), + ('nav_venue_bb_arena_0_name', 'Battle Ball kaikille'), + ('sw_fieldname_2', 'Algid River'), + ('furni_bed_silo_two_desc', 'Plain and simple x2'), + ('sw_fieldname_1', 'Arctic Island'), + ('furni_pillow*1_desc', 'Puffy, soft and huge'), + ('sw_fieldname_4', 'Frosty Forest'), + ('sw_fieldname_3', 'Glacial Fort'), + ('furni_bar_basic_desc', 'A pura series 300 minibar'), + ('tutorial_welcome_M', 'Hi! I am your guide to Habbo Hotel. Please pick a topic to start.'), + ('tutorial_welcome_F', 'Hi there! I\'m your guide to Habbo Hotel. What would you like to learn today?'), + ('Alert_NoNameSetForLogo', 'Please give a name to your logo'), + ('furni_glass_table*5_name', 'Glass table'), + ('group_owner', 'Owner'), + ('console_target_friend_list_full', 'This user\'s friend list is full'), + ('furni_romantique_smalltabl*2_name', 'Lime Tray Table'), + ('ph_keys_spacebar', 'Spacebar'), + ('furni_noob_chair*3_name', 'My first Habbo chair'), + ('NUF_meeting_people_roomlist_publicTab', 'Click the Public Spaces tab to see the list of public rooms. To go to the room click the \'Go\' button.'), + ('furni_bed_polyfon*7_name', 'Green Mode Double Bed'), + ('furni_jukebox_ptv*1_name', 'Jukebox Pacha TV'), + ('poster_513_desc', 'Aussies rule!'), + ('poster_51_desc', '2 points for every basket'), + ('furni_toy1*2_name', 'Rubber Ball'), + ('furni_bartable_armas_name', 'Bardesk'), + ('nav_venue_sw_lobby_amateur_0/0_desc', ''), + ('NUF_mini_use_console_read_tutor', 'The Habbo Console lets you message with people you have added to your friends list.'), + ('nav_venue_bb_lobby_beginner_12_name', 'Beginners Battle Ball 13'), + ('poster_2002_name', 'Urho Kaleva Kekkonen'), + ('furni_sound_set_44_desc', 'Haunted Dimension'), + ('pet.saying.beg.dog.1', 'Oouh..oouh..snuh..ooo'), + ('furni_sporttrack2*1_name', 'Sport corner tartan'), + ('pet.saying.beg.dog.0', 'Oooo...Ouuu...oo...OUUU'), + ('furni_solarium_norja*5_desc', 'Rejuvenate your pixels!'), + ('pet.saying.beg.dog.2', '*whimpers *'), + ('reg_pledgelink', 'Hotel rules'), + ('habboclub_price1.days', '30'), + ('furni_glass_shelf_desc', 'Translucent beauty'), + ('furni_sofachair_polyfon*3_name', 'White Armchair'), + ('reg_verification_info', 'You must know the correct birthday and password before you\'re allowed to make these changes.'), + ('furni_carpet_soft*5_desc', 'Soft Wool Rug'), + ('furni_grunge_mattress_name', 'Grunge Mattress'), + ('furni_bed_polyfon_one_name', 'Single Bed'), + ('furni_sound_machine_pro_name', 'Sound Machine Pro'), + ('furni_chair_china_desc', 'The elegant beauty of tradition'), + ('furni_rare_icecream*7_desc', 'Virtual chocolate rocks!'), + ('furni_table_silo_med*8_name', 'Yellow Coffee Table'), + ('club_gift.message', 'Happy Habbo Club! Love Callie :)'), + ('furni_sw_raven_desc', 'My name is Otter'), + ('furni_noob_table*2_desc', 'Lightweight, practical and dark blue'), + ('furni_soft_sofachair_norja*3_desc', 'Soft Iced sofachair'), + ('sound_machine_confirm_delete', 'Delete song?'), + ('furni_plant_fruittree_name', 'Fruit Tree'), + ('nav_venue_bb_lobby_intermediate_1/0_desc', ''), + ('furni_heartsofa_name', 'Heart Sofa'), + ('furni_bed_budget_one*8_name', 'Yellow Pura Bed'), + ('NUF_getting_room', 'Making your own room'), + ('furni_rare_elephant_statue*2_name', 'Bronze Elephant'), + ('nav_venue_ballroom/0_desc', 'Come play ball!'), + ('nav_venue_sw_lobby_amateur_1_name', 'Snow Slingers Lobby'), + ('console_lasttime', 'Last Time'), + ('furni_md_sofa_desc', 'A decent recliner'), + ('furni_wooden_screen*6_name', 'Blue Oriental Screen'), + ('partner_registration_text', 'Click the link to finish your registration. When you have finished the registration click OK to continue to the hotel.'), + ('furni_sound_set_62_desc', 'Music of the Arabian night!'), + ('furni_arabian_divdr_name', 'Soft wooden screen'), + ('furni_tree1_desc', 'Dead christmas tree'), + ('furni_grand_piano*3_name', 'Pink Grand Piano'), + ('console_select_requests', 'Following users have asked to be your friend. Please accept or decline.'), + ('furni_divider_nor4*2_name', 'Black Iced Auto Shutter'), + ('furni_glass_chair*3_name', 'Glass chair'), + ('reg_passwordContainsNoNumber', 'Password must contain at least one number'), + ('buddyremove_invert', 'Invert Selection'), + ('furni_val_teddy*5_desc', 'The yellow bear of understanding'), + ('furni_sound_set_51_name', 'Club 6'), + ('poster_1_desc', 'The Noble and Silver Show'), + ('roomevent_create_name', 'Type the name of your event'), + ('Alert_unacceptableName', 'Sorry, that name is unacceptable to the Hotel Management'), + ('NUF_getting_room_go_tutor', 'Your room is now ready. Let\'s go see! I hope you have a bed...'), + ('poster_520_name', 'The Rainbow Flag'), + ('password', 'Password:'), + ('furni_bed_budget*8_name', 'Yellow Pura Double Bed'), + ('gs_header_gamelist', 'Game List'), + ('furni_chair_plasty_desc', 'Hip plastic furniture'), + ('url_purse_subscribe', 'http://%predefined%//credits?'), + ('furni_table_plasto_bigsquare*15_desc', 'Hip plastic furniture'), + ('furni_glass_stool*6_desc', 'Translucent beauty'), + ('error_report', 'Error Report'), + ('summer_chair_6_desc', 'Get decked'), + ('furni_chair_basic*5_name', 'chair_basic'), + ('room_remove_specs', 'Sorry! Now it\'s someone else\'s turn to watch this event.'), + ('furni_bunny_desc', 'Yours to cuddle up to'), + ('invitation_exists', 'You have already invited members of the Welcoming Party to your room.'), + ('purse_vouchers_furni_success', 'Voucher was successfully redeemed. You have been given the following furniture:'), + ('nav_rooms_popular', 'Popular rooms'), + ('nav_cancel', 'Cancel'), + ('alert_cross_domain_download', 'Cross domain content download prevented'), + ('furni_table_plasto_4leg*16_desc', 'Hip plastic furniture'), + ('url_pets', 'http://%predefined%//hotel/pets'), + ('furni_bardeskcorner_polyfon*9_desc', 'Tuck it away'), + ('gs_button_cancel', 'Cancel'), + ('furni_barchair_silo*7_name', 'Green Bar Stool'), + ('catalog_credits', 'You have \\x Credits in your purse.'), + ('furni_divider_nor3_name', 'Door (Lockable)'), + ('nav_modify_name', 'Name of the room'), + ('nav_venue_bb_lobby_amateur_7_name', 'Gevorderden Battle Ball 8'), + ('nav_venue_club_massiva/0_desc', 'Rest your dancing feet!'), + ('furni_gothrailing_desc', 'The dark side of Habbo'), + ('queue_set.na.alert', 'This Room is for Staff only.'), + ('nav_venue_bb_lobby_tournament_8_name', 'Competitie Battle Ball 9'), + ('furni_sound_set_29_name', 'Dance 2'), + ('console_msgs', 'msgs'), + ('furni_noob_lamp*6_name', 'My first Habbo lamp'), + ('furni_marquee*6_desc', 'It\'s both door and a shade!'), + ('furni_chair_plasto*16_desc', 'Hip plastic furniture'), + ('furni_chair_basic*9_desc', 'It\'s a cracking design!'), + ('summer_chair_2_name', 'Pink Deck Chair'), + ('alert_too_much_furnitures', 'Furni limit for room is exceeded. Not all furnitures are shown. Please remove some.'), + ('furni_pura_mdl5*4_name', 'White Pura Module 5'), + ('bus.full_msg', 'The FRANK bus is full at the moment, please come back later or visit the FRANK page below for more information.'), + ('furni_sound_set_22_name', 'SFX 3'), + ('furni_gothic_sofa*3_desc', 'The dark side of Habbo'), + ('furni_md_limukaappi_name', 'Habbo Cola Machine'), + ('poster_19_desc', 'Trying to get in or out?'), + ('gs_2min', '2min'), + ('poster_8_desc', 'Habbos come in all colours'), + ('furni_pillar*6_desc', 'Ancient and stately'), + ('furni_carpet_standard*3_desc', 'Available in a variety of colours'), + ('purse_vouchers_info', 'When you buy Habbo Credits with a mobile phone, you will receive a special voucher code. Enter the code in the box above, click \'Get Credits!\' and they\'ll be added to your purse.'), + ('furni_valeduck_name', 'Valentine\'s Duck'), + ('Alert_MessageFromAdmin', 'Message from Hotel Management:'), + ('furni_present_gen1_desc', 'What\'s inside?'), + ('reg_tutorial_txt', ''), + ('furni_tile_stella_name', 'Star Tile'), + ('furni_shelves_norja*4_name', 'Urban Iced Bookcase'), + ('transaction_system_creditcards_is', 'Creditcard'), + ('furni_shelves_polyfon_desc', 'For the arty pad'), + ('furni_tv_luxus_name', 'Digital TV'), + ('recycler_status_window_title', 'Recycling Status'), + ('furni_sleepingbag*6_name', 'Purple Sleeping Bag'), + ('gs_button_shrink', 'Minimize Window'), + ('furni_wcandleset_desc', 'Simple but stylish'), + ('furni_sleepingbag*3_desc', 'Ultimate coziness'), + ('object_displayer_show_actions', 'Show actions'), + ('hubu_t5_1', 'Lisetoa huumeista'), + ('song_disk_text_template', '%name%'), + ('hubu_t5_2', 'Huumeista-esite'), + ('queue_other_1', 'Habbo Live queue status'), + ('poster_33_name', 'Save the Panda'), + ('hubu_t5_3', 'Yleistietoa EOPH ry:st--------------'), + ('queue_other_2', 'Room queue status'), + ('furni_hcsohva_name', 'Throne Sofa'), + ('furni_sound_set_26_desc', 'Bollywood Beats!'), + ('furni_christmas_poop_name', 'Reindeer Droppings'), + ('furni_rare_dragonlamp*4_name', 'Serpent of Doom'), + ('nav_venue_bb_lobby_amateur_7/0_desc', ''), + ('purse_value', 'VALUE'), + ('furni_glass_sofa*5_desc', 'Translucent beauty'), + ('nav_venue_bb_lobby_tournament_15/0_desc', ''), + ('furni_glass_stool*2_desc', 'Translucent beauty'), + ('pet.saying.play.cat.1', 'Purrrr.. oo..Purrr'), + ('furni_pura_mdl4*7_name', 'Green Pura Module 4'), + ('nav_venue_cafe_ole/0_desc', 'Relax with friends over one of Marias specialty coffees'), + ('pet.saying.play.cat.0', 'Mew..MEOW..meow'), + ('furni_pumpkin_name', 'Pumpkin Lamp'), + ('furni_summer_chair*7_desc', 'Reserved!'), + ('ph_tickets_txt', 'Tickets can be used for BattleBall: Rebound!, SnowStorm, the Lido Diving and Wobble Squabble games. Tickets never expire.\\r\\rCurrently you have \\x1 ticket(s).'), + ('roomatic_onemoment', 'Please wait, we are going to your room...'), + ('furni_small_table_armas_name', 'Occasional Table'), + ('furni_table_polyfon_med_desc', 'For larger gatherings'), + ('nav_venue_bb_lobby_expert_3/0_desc', ''), + ('furni_chair_silo*6_desc', 'Blue Silo Dining Chair'), + ('furni_exe_globe_name', 'Power Globe'), + ('furni_bed_budget_one_name', 'bed_budget_one'), + ('furni_divider_silo1*2_desc', 'Neat and natty'), + ('nav_venue_bb_lobby_intermediate_0_name', 'Intermediate'), + ('furni_sofa_polyfon*9_desc', 'Comfort for stylish couples'), + ('furni_noob_lamp*3_desc', 'Get the light right where you want it (aubergine)'), + ('nav_showfull', 'Show Full Rooms'), + ('furni_divider_nor3*2_desc', 'Black Iced gate'), + ('reg_note_title', 'Warning!'), + ('hubu_answ_count', 'Replies'), + ('nav_recommended_rooms', 'Recommended Rooms'), + ('transaction_system_bank_nordea', 'Nordea'), + ('furni_sound_set_37_desc', ''), + ('poster_2006_desc', 'He is the magic Habbo'), + ('sw_link_gameRules_url', 'http://%predefined%//groups/56553/id'), + ('wave', 'Wave'), + ('furni_hc_djset_desc', 'Very old skool scratch\'n\'spin'), + ('furni_plant_maze_name', 'Maze Shrubbery'), + ('furni_scifirocket*3_name', 'Endor Smoke Machine'), + ('furni_val_teddy*1_name', 'Grey Share Bear'), + ('recycler_ready_outcome', 'Recycling reward: %outcome%'), + ('poster_4_desc', 'Fake of course!'), + ('poster_62_desc', 'We can\'t bear to lose them!'), + ('furni_glass_stool*9_desc', 'Translucent beauty'), + ('furni_goodie1_name', 'Marzipan Man'), + ('nav_modify_choosecategory', 'Choose a category for your room'), + ('object_displayer_link_home', 'User\'s home page'), + ('nav_venue_sw_lobby_tournament_8/0_desc', ''), + ('furni_xmasduck_name', 'Christmas Rubber Duck'), + ('help_txt_2', 'Password Reset'), + ('pet_mood_2', 'Blue'), + ('furni_queue_tile1*4_desc', 'The power of movement'), + ('help_txt_1', 'How do I get Credits?'), + ('pet_mood_3', 'Contented'), + ('nav_venue_bb_lobby_tournament_1_name', 'Competitie Battle Ball 2'), + ('furni_rare_daffodil_rug_name', 'Petal Patch'), + ('help_txt_4', 'The Habbo Way'), + ('pet_mood_0', 'Miserable'), + ('help_txt_3', 'Help with Habbo Hotel'), + ('pet_mood_1', 'Depressed'), + ('pet_mood_6', 'Ecstatic'), + ('furni_bed_budget*4_name', 'White Pura Double Bed'), + ('nav_venue_bb_lobby_amateur_0_name', 'Amateur'), + ('furni_sofachair_polyfon*7_desc', 'Green Mode Armchair'), + ('yes', 'Yes'), + ('pet_mood_4', 'Happy'), + ('pet_mood_5', 'Joyful'), + ('furni_sound_set_30_desc', 'Moments in love'), + ('furni_prizetrophy2*1_desc', 'Glittery gold'), + ('furni_wooden_screen*3_desc', 'Add an exotic touch to your room'), + ('transaction_system_bank_op', 'Osuuspankki'), + ('help_txt_6', 'Contact Us'), + ('help_txt_5', 'Safety Tips'), + ('furni_bardeskcorner_polyfon*2_desc', 'Black Mode Bardesk Corner'), + ('poster_15_desc', 'Marvellous mountains'), + ('room_areYouSurePlace', 'Warning! If you put something down in this room you will not be able to pick it up again.'), + ('nav_venue_bouncer_room_3_name', 'Semi-profs Battle Ball Arena'), + ('furni_chair_plasto*12_name', 'Chair'), + ('furni_gothic_chair*6_name', 'Gothic Chair Blue'), + ('furni_sofa_polyfon*2_desc', 'Black Mode Sofa'), + ('modtool_alertuser', 'Alert User'), + ('furni_toilet_desc', 'Loo Seat'), + ('furni_plant_cruddy_name', 'Aloe Vera'), + ('nav_venue_space_cafe/0_desc', 'In this space noone can see you ask for a soda!'), + ('nav_incorrectflatpw', 'Incorrect, try again.'), + ('furni_chair_plasto*13_desc', 'Hip plastic furniture'), + ('login_firstTimeHere', 'First time here?'), + ('furni_skullcandle_desc', 'Alas poor Yorrick...'), + ('NUF_mini_endtopic_step1_tutor', 'Well that\'s all from me. If you have any problems just click the little blue question mark to restart the tutorial and find our FAQs.\\nTo start exploring by yourself, click Close guide from the upper left corner.'), + ('furni_divider_poly3*3_name', 'White Hatch'), + ('help_callforhelp', 'Get Live Help'), + ('furni_rare_fountain*2_name', 'Bird Bath (green)'), + ('nav_venue_rooftop_name', 'Rooftop Cafe'), + ('furni_scifiport*7_name', 'Turquoise Sci-Fi Port'), + ('purse_back_to_credits', 'Back To Purse'), + ('room_ban', 'Kick & ban'), + ('furni_pura_mdl5*1_name', 'Aqua Pura Module 5'), + ('furni_val_teddy*4_name', 'Brown Share Bear'), + ('poster_40_name', 'Bonnie Blonde'), + ('NUF_getting_room_navigator_tutor', 'You want to click it real good. The \'Own room(s)\' tab I mean. Don\'t click yourself. It\'s unhygienic.'), + ('summer_chair_3_desc', 'Relax and enjoy the sun'), + ('furni_wooden_screen*2_name', 'RosewoodScreen'), + ('nav_venue_sun_terrace_name', 'Sun Terrace'), + ('furni_rare_fan*3_desc', 'Keeps the heat off St George!'), + ('nav_venue_sport_name', 'Power Gym'), + ('furni_toilet_red_desc', 'Loo Seat'), + ('retype_password', 'Retype Password:'), + ('furni_chair_basic*6_desc', 'It\'s a cracking design!'), + ('console_friends_helptext', 'This screen shows a list of all your Habbo Friends. It tells you where they are in the hotel, or, if they\'re not checked in, when their last visit was.'), + ('NUF_getting_items_room_', 'This is the Catalogue icon. Click to open it.'), + ('furni_grunge_barrel_desc', 'Beacon of light!'), + ('furni_soft_sofachair_norja*6_name', 'Blue Iced Sofachair'), + ('int_howtoget', 'How To get?'), + ('furni_sound_set_23_desc', 'Don\'t be afraid of the dark'), + ('nav_ok', 'OK'), + ('furni_sofachair_polyfon*6_name', 'Blue Mode Armchair'), + ('nav_venue_theatredrome_valentine_name', 'Theatredrome Valentine'), + ('furni_sofachair_polyfon_desc', 'Loft-style comfort'), + ('poster_83_name', 'Pöllö huhuilee'), + ('furni_soft_sofachair_norja*2_name', 'Black Iced Sofachair'), + ('roomdimmer_furni_limit', 'You can only have one roomdimmer per room'), + ('recycler_progress_timeleft', 'Time left: %hours% h and %minutes% min'), + ('furni_chair_plasto*3_name', 'Chair'), + ('NUF_getting_room_hotelview_tutor', 'Now you will learn how to make your own room. First go to the Guest Rooms area of the Navigator.'), + ('roomevent_create', 'Create'), + ('reg_year', 'Year'), + ('furni_divider_poly3_name', 'Hatch (Lockable)'), + ('furni_divider_nor1*7_name', 'Rural Iced Corner'), + ('furni_rare_beehive_bulb_name', 'Blue Amber Lamp'), + ('furni_waterbowl*2_name', 'Green Water Bowl'), + ('NUF_getting_room_room_hand', 'Open your hand!'), + ('furni_carpet_standard*6_desc', 'Available in a variety of colours'), + ('furni_CF_5_coin_silver_name', 'Silver Coin'), + ('furni_shelves_norja*7_name', 'Rural Iced Bookcase'), + ('opening_hours_text_disabled', 'The Hotel is shutting down really soon. To avoid confusion, purchasing of furniture, Habbo Club and game tickets have been disabled, as well as playing games and furniture trading. Try again tomorrow when the hotel is open!'), + ('nav_venue_bb_lobby_5_name', 'Battle Ball Kaikille'), + ('game_bs_congrat', 'Congratulations!'), + ('furni_arabian_tray2_name', 'Candle Tray'), + ('furni_giftflowers_desc', 'Guaranteed to stay fresh'), + ('club_button_1_period', 'Buy 1 >>>'), + ('furni_bed_polyfon_one*2_desc', 'Black Mode Single Bed'), + ('poster_47_name', 'Small silver star'), + ('furni_divider_nor3*5_desc', 'Pink Iced gate'), + ('furni_sofachair_polyfon_girl_desc', 'Think pink'), + ('furni_pura_mdl5*8_name', 'Yellow Pura Module 5'), + ('furni_hal_cauldron_desc', 'Eye of Habbo and toe of Mod!'), + ('poster_1006_name', 'Hoot Poster'), + ('furni_carpet_valentine_name', 'Red carpet'), + ('furni_floortile_name', 'Floor Tile'), + ('furni_divider_nor1*4_name', 'Urban Iced Corner'), + ('furni_bardeskcorner_polyfon*12_desc', 'Tuck it away'), + ('furni_table_plasto_bigsquare*3_desc', 'Hip plastic furniture'), + ('furni_traffic_light*6_desc', 'Chill and wait your turn!'), + ('club_general_prepaid', 'Prepaid Months'), + ('wallitem_val_heart_desc', 'Heartbroken... without your love!'), + ('furni_pura_mdl3*7_desc', 'Any way you like it!'), + ('furni_sound_set_58_name', 'RnB Grooves 4'), + ('furni_china_shelve_name', 'Chinese Lacquer Bookshelf'), + ('furni_divider_silo1*5_desc', 'Pink Area Corner Shelf'), + ('nav_venue_sw_lobby_tournament_desc', 'For stand-alone Tournaments.'), + ('furni_divider_silo2_name', 'Screen'), + ('furni_plant_mazegate_name', 'Maze Shrubbery Gate'), + ('poster_509_desc', 'The flag of Jamaica'), + ('furni_soft_sofachair_norja*9_name', 'Red Iced Sofachair'), + ('nav_venue_sw_arena_intermediate_name(0)', 'Playing intermediate game'), + ('furni_barchair_silo*4_name', 'Beige Bar Stool'), + ('furni_scifidoor*7_name', 'Aqua Spaceship Door'), + ('furni_CF_10_coin_gold_desc', 'Worth 10 Credits'), + ('furni_glass_sofa*8_desc', 'Translucent beauty'), + ('jukebox_reset', 'Reset Jukebox'), + ('nav_venue_sw_lobby_intermediate_desc', 'For the accomplished Snow Stormers.'), + ('furni_spotlight_desc', 'For the star of the show'), + ('furni_couch_norja_name', 'Bench'), + ('furni_romantique_divan*3_name', 'Turquoise Romantique Divan'), + ('furni_sleepingbag*7_desc', 'Ultimate coziness'), + ('roomatic_pws2', '24 hour access:'), + ('wallitem_jp_sheet1_desc', 'jp_sheet1'), + ('furni_table_silo_med*2_desc', 'Wipe clean and unobtrusive'), + ('furni_glass_table_desc', 'Translucent beauty'), + ('poster_502_desc', 'The US flag'), + ('pet_enrg_10', 'Mad'), + ('gs_scores_team_2', 'Blue Team:'), + ('pet_enrg_11', 'Nutcase'), + ('gs_scores_team_1', 'Red Team:'), + ('furni_cn_sofa_desc', 'Seating,Oriental style!'), + ('gs_scores_team_4', 'Green Team:'), + ('gs_scores_team_3', 'Yellow Team:'), + ('furni_table_silo_med*9_desc', 'Red Area Coffee Table'), + ('furni_hc_machine_name', 'Weird Science Machine'), + ('callhelp_writeyour', 'Write your question about Habbo Hotel here:'), + ('furni_table_silo_small*5_name', 'Pink Area Occasional Table'), + ('nav_addtofavourites', 'Add to favourites'), + ('furni_table_plasto_round*15_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_tournament_4_name', 'Competitie Battle Ball 5'), + ('furni_birdie_name', 'Pop-up Egg'), + ('furni_table_plasto_bigsquare_desc', 'Hip plastic furniture'), + ('furni_sound_set_33_desc', 'Guitar solo set'), + ('furni_romantique_divider*3_desc', 'Keeping things separated'), + ('furni_bed_budget*1_name', 'Aqua Pura Double Bed'), + ('furni_rare_beehive_bulb*2_desc', 'A honey-hued glow'), + ('furni_theatre_seat_desc', 'For Lazy boys and girls!'), + ('furni_hc_lmpst_desc', 'Somber and atmospheric'), + ('furni_divider_nor5*6_name', 'Blue Iced Angle'), + ('furni_summer_pool*2_desc', 'Fancy a dip?'), + ('poster_12_desc', 'a beautiful sunset'), + ('furni_carpet_polar*2_desc', 'Snuggle up on a Funky bear rug...'), + ('furni_md_rug_desc', 'Bubbles under your steps'), + ('Alert_InviteFriend', 'Invite your friends'), + ('nav_venue_bb_lobby_intermediate_4_name', 'Semi-profs Battle Ball 5'), + ('furni_hockey_score_desc', '...for keeping your score'), + ('furni_gothic_chair*3_name', 'Red Gothic Chair'), + ('wallitem_sw_stone_name', 'sw_stone'), + ('furni_pillow*7_name', 'Purple Velvet Pillow'), + ('nav_popup_header', 'Recommended rooms'), + ('nav_venue_sw_lobby_beginner_0_name', 'Snow Rookies Lobby'), + ('furni_table_norja_med*5_desc', 'For larger gatherings'), + ('furni_red_tv_name', 'Portable TV'), + ('reg_promise', '*Any personal information you supply will only be used by Habbo Ltd in accordance with the Habbo Pledge and will not be shared with third parties.'), + ('room_badge_choose', 'Modify Badge:'), + ('furni_table_plasto_square*15_desc', 'Hip plastic furniture'), + ('furni_sound_set_48_desc', 'Sweet party beat'), + ('nav_venue_ballroom_name', 'Ballroom'), + ('pet.hotwords.bad', 'bad'), + ('poster_55_desc', 'Save our trees!'), + ('furni_glass_chair_name', 'Glass chair'), + ('furni_prizetrophy5*2_desc', 'Shiny silver'), + ('furni_divider_poly3*4_desc', 'Beige Mode Bardesk Gate'), + ('tutorial_console_sample_message', 'Hello! This is a message sent to you from the Habbo Tutorial. To close and delete this message click delete. Sadly you cannot reply to this message as it is automated. Normally you can reply to messages by clicking the reply button.'), + ('furni_s_sound_machine*5_name', 'Sound Machine Brown'), + ('furni_divider_nor4*9_desc', 'Habbos, roll out!'), + ('furni_pura_mdl3*4_desc', 'Any way you like it!'), + ('NUF_getting_room_room_tutor', 'Tada! Nice room, although it\'s a little empty. Hey! Let\'s furnish it with something./nOpen your hand to check what you have, (if you have done this step before then you won\'t receive anything).'), + ('furni_fortune_desc', 'Gaze into the future'), + ('furni_soft_sofa_norja_name', 'iced sofa'), + ('furni_pura_mdl1*2_desc', 'Any way you like it!'), + ('nav_venue_sw_lobby_free_6/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('furni_divider_nor3*8_name', 'Yellow Iced gate'), + ('gs_title_finalscores', 'Final Standings:'), + ('gs_error_10', 'The hotel is closed or about to close. We look forward to welcoming you back tomorrow at (ADD LOCAL OPENING TIME).'), + ('furni_plant_bonsai_name', 'Bonsai Tree'), + ('furni_jukebox*1_name', 'Jukebox'), + ('room_loading', 'Loading room...'), + ('furni_hc_crpt_desc', 'Ultimate craftsmanship'), + ('furni_rare_hammock_desc', 'Eco bed'), + ('NUF_mini_use_console', 'Learn about messaging'), + ('furni_romantique_chair*1_desc', 'Elegant seating for elegant Habbos'), + ('transaction_system_bank_digiraha', 'Digiraha'), + ('NUH_messenger', 'Open your Console here - you might have messages or friend requests waiting.'), + ('furni_arabian_chair_desc', 'Exotic, soft seating'), + ('furni_noob_chair*6_name', 'My first Habbo chair'), + ('poster_510_desc', 'The flag of Italy'), + ('furni_carpet_standard*a_desc', 'Available in a variety of colours'), + ('queue_set.c.info', 'There are %c% Habbo Club member(s) in front of you. Be patient :)'), + ('furni_scifiport*4_name', 'Pink Sci-Fi Port'), + ('furni_sound_set_44_name', 'Graveyard Portal'), + ('furni_pura_mdl4*1_desc', 'Any way you like it!'), + ('furni_divider_silo3*6_desc', 'Blue Area Gate'), + ('furni_sound_machine*4_name', 'Blue Traxmachine'), + ('send_invitation_header', 'Get a warm welcome'), + ('game_TicTacToe', 'Boter kaas en eieren'), + ('nav_venue_sw_lobby_tournament_1_name', 'Tournament Lobby'), + ('furni_rare_fan*2_name', 'Green Powered Fan'), + ('furni_doormat_plain*2_name', 'Doormat'), + ('furni_table_plasto_square*7_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_intermediate_8/0_desc', ''), + ('furni_noob_table*6_desc', 'Lightweight, practical and green'), + ('win_callforhelp', 'Alert a Moderator'), + ('furni_prizetrophy8*1_desc', 'Glittery gold'), + ('furni_chair_norja*5_name', 'Pink Chair'), + ('furni_hc_tv_desc', 'Forget plasma, go HC!'), + ('furni_divider_arm1_name', 'Corner plinth'), + ('furni_table_plasto_round*7_name', 'Round Dining Table'), + ('furni_petfood3_name', 'Cabbage Mega Multipack'), + ('furni_carpet_standard*9_name', 'Floor Rug'), + ('opening_hours_title', 'Hotel Maintenance'), + ('console_noemail', 'Sorry,'), + ('furni_couch_norja*8_name', 'Yellow Bench'), + ('furni_s_sound_machine*1_desc', 'Sound Machine Grey Desc'), + ('furni_noob_stool*6_name', 'My first Habbo stool'), + ('purse_event', 'ACTIVITY'), + ('reg_readterms_alert', 'You have to read the Terms and Conditions\\r(scroll to the bottom of the text).'), + ('pet.hotwords.beg', 'beg'), + ('furni_jp_drawer_name', 'Japanese Drawer'), + ('gs_state_started', 'This Game has already started...'), + ('furni_sound_set_11_name', 'Dance 4'), + ('furni_divider_nor2*4_name', 'Urban Iced Bar'), + ('queue_set.e2.info', 'There are %e2% Habbos in front of you in the queue.'), + ('furni_bath_name', 'Bubble Bath'), + ('furni_rare_icecream*3_desc', 'Virtual blackcurrant rocks!'), + ('nav_modify_nameoftheroom', 'Name Of The Room'), + ('furni_scifiport*1_desc', 'Energy beams. No trespassers!'), + ('nav_venue_bb_lobby_amateur_12/0_desc', ''), + ('furni_table_silo_small*8_name', 'Yellow Occasional Table'), + ('furni_divider_silo3*3_name', 'White Area Gate'), + ('nav_venue_sw_lobby_amateur_7/0_desc', 'Astetta rankempaa lumisotaa.'), + ('reply', 'Reply'), + ('furni_toilet_yell_desc', 'Loo Seat'), + ('hobba_alert', 'Moderator Alert'), + ('You can play a bunch of exciting games, visit your friends\' rooms or even make your own place and decorate it to your heart\'s delight.', ''), + ('pet.saying.eat.croco.4', '*Buurrrrp*'), + ('furni_tree5_desc', 'Any presents under it yet?'), + ('pet.saying.eat.croco.2', '*Chomp chomp*'), + ('pet.saying.eat.croco.3', 'Mmmm mmmmm....'), + ('furni_divider_poly3*7_name', 'Green Mode Bardesk Gate'), + ('pet.saying.eat.croco.0', 'Mmmm yum yum'), + ('pet.saying.eat.croco.1', 'Ruff ruff ruff'), + ('furni_scifidoor*4_name', 'Emerald Spaceship Door'), + ('furni_edice_name', 'Holo-dice'), + ('furni_divider_nor4*6_name', 'Blue Iced Auto Shutter'), + ('furni_safe_silo*3_desc', 'Totally shatter-proof!'), + ('furni_table_silo_small_desc', 'For those random moments'), + ('gs_header_page', 'Page'), + ('furni_sporttrack3*2_name', 'Sport goal asphalt'), + ('furni_pura_mdl2*6_desc', 'Any way you like it!'), + ('furni_hcamme_name', 'Tubmaster'), + ('furni_carpet_soft*2_desc', 'Soft Wool Rug'), + ('furni_sound_set_12_name', 'Habbo Sounds 2'), + ('forgottenpw_done', 'If the email you gave during registration was correct, your password will be sent to you now.'), + ('navigator.no_category', 'No Category'), + ('login_whatsHabboCalled', 'What\'s your Habbo called?'), + ('furni_scifidoor*3_name', 'Lightblue Spaceship Door'), + ('game_poker', 'POKER'), + ('roomatic_pws', 'Password for selected'), + ('furni_glass_table*8_name', 'Glass table'), + ('furni_one_way_door*8_desc', 'One at a time!'), + ('furni_bardesk_polyfon*9_desc', 'Perfect for work or play'), + ('nav_venue_bb_lobby_tournament_13_name', 'Competitie Battle Ball 14'), + ('pet.hotwords.sit', 'sit'), + ('furni_arabian_tray3_desc', 'Indulge yourself!'), + ('furni_sound_set_40_desc', 'Dude? Cheese!'), + ('console_compose', 'Compose A Message'), + ('furni_table_plasto_square*3_name', 'Square Dining Table'), + ('furni_rclr_sofa_name', 'Polar Sofa'), + ('poster_2005_name', 'Infobus'), + ('furni_table_plasto_4leg*9_name', 'Occasional Table'), + ('furni_chair_norja*9_desc', 'Sleek and chic for each cheek'), + ('Room', 'Room:'), + ('furni_chair_plasty*2_name', 'Plastic Pod Chair'), + ('furni_romantique_pianochair*3_name', 'Turquoise Romantique Piano Chair'), + ('furni_rare_parasol*2_name', 'Orange Parasol'), + ('loading_project', 'Loading Habbo Hotel...'), + ('poster_505_name', 'The Maple Leaf'), + ('furni_traffic_light*2_desc', 'Chill and wait your turn!'), + ('nav_venue_sw_lobby_amateur_4_name', 'Snow Slingers Lobby'), + ('furni_grunge_shelf_name', 'Grunge Bookshelf'), + ('furni_sofa_polyfon*8_name', 'Yellow Mode Sofa'), + ('furni_doorC_desc', 'In a hurry?'), + ('roomatic_nomatch', 'Sorry. Your passwords don\'t match. Please enter them again.'), + ('furni_soft_sofa_norja*9_name', 'Red Iced Sofa'), + ('nav_venue_tv_studio_general/0_desc', 'Suosikki rules! Musaa, leffoja ja staroja!'), + ('nav_venue_sw_arena_amateur_name', 'Playing amateur game'), + ('interface_icon_events', 'Open the room event browser'), + ('furni_grunge_table_desc', 'Students of the round table!'), + ('furni_wooden_screen*9_name', 'Green Oriental Screen'), + ('NUF_getting_room_hotelview_nav', 'Click to open the Navigator.'), + ('furni_table_silo_med*5_name', 'Pink Area Coffee Table'), + ('furni_divider_silo1*9_name', 'Red Area Small Table'), + ('nav_venue_bb_lobby_amateur_4_name', 'Gevorderden Battle Ball 5'), + ('room_badge_hidden', 'Hidden'), + ('pet.saying.generic.cat.0', 'meow'), + ('furni_marquee*3_desc', 'It\'s both door and a shade!'), + ('pet.saying.generic.cat.1', 'meow...meOW'), + ('nav_venue_cunning_fox_gamehall/4_name', 'Chess'), + ('furni_present_gen_desc', 'What\'s inside?'), + ('pet.saying.generic.cat.2', 'muew..muew'), + ('pet.saying.generic.cat.3', 'Purrrrrrrrrr'), + ('furni_scifidoor*1_desc', 'There out of this world!'), + ('pet.saying.generic.cat.4', 'Purrrrr oow'), + ('furni_fridge_name', 'Pura Refridgerator'), + ('furni_rubberchair*2_name', 'Pink Inflatable Chair'), + ('furni_romantique_chair*4_name', 'Amber Chair'), + ('bb_fieldname_5', 'Barebones Classic'), + ('furni_sofa_silo*7_desc', 'Green Area Sofa'), + ('bb_fieldname_4', 'Gothic Hallway'), + ('furni_prizetrophy6*2_name', 'Champion trophy'), + ('bb_fieldname_3', 'Maze Park'), + ('bb_fieldname_2', 'Coral Beach'), + ('bb_fieldname_1', 'Sky Peak'), + ('furni_safe_silo_pb_name', 'postbank Safe'), + ('furni_solarium_norja*2_desc', 'Rejuvenate your pixels!'), + ('furni_table_plasto_bigsquare*7_desc', 'Hip plastic furniture'), + ('reg_check_age', 'Age'), + ('furni_exe_chair2_desc', 'You\'re fired!'), + ('furni_typingmachine_name', 'Typewriter'), + ('human_carrying', 'Carrying:'), + ('furni_grunge_sign_name', 'Road Sign'), + ('loading', 'Loading...'), + ('furni_bed_polyfon_one*6_name', 'Blue Mode Single Bed'), + ('furni_bed_budget_one*1_desc', 'Prince sized comfort!'), + ('furni_sofa_polyfon_name', 'Two-seater Sofa'), + ('furni_jp_lantern_desc', 'For a mellow Eastern glow'), + ('furni_gothic_stool*2_name', 'Golden Gothic Stool'), + ('roomevent_starttime', 'Started at:'), + ('furni_prize1_desc', 'Gorgeously glittery'), + ('furni_prizetrophy9*1_name', 'Champion trophy'), + ('wallitem_guitar_skull_desc', 'tilulilulaa'), + ('gs_title_bestplayer', 'Best player:'), + ('nav_removefavourites', 'Remove from favourites'), + ('furni_toy1_desc', 'it\'s bouncy-tastic'), + ('alert_shortenPW', 'Your password cannot be longer than 9 characters'), + ('normal_roomlayouts', '<< Back to normal room layouts'), + ('furni_noob_rug*1_name', 'My first Habbo rug'), + ('poster_58_name', 'Red knots poster'), + ('furni_divider_nor2*8_desc', 'Yellow Iced bar desk'), + ('furni_carpet_polar*1_name', 'Pink Faux-Fur Bear Rug'), + ('habboclub_continue_button', 'Buy one month'), + ('furni_divider_silo3_desc', 'Form following function'), + ('furni_sound_set_7_name', 'SFX 5'), + ('furni_soft_sofa_norja*5_desc', 'Pink Iced Sofa'), + ('furni_arabian_rug_desc', 'Green blossom design'), + ('restart_tutorial', 'Restart tutorial'), + ('gs_choose_numteams', 'Choose number of Teams:'), + ('hubu_info_t', 'The big FRANK Infobus'), + ('furni_divider_nor5*7_desc', 'Cool cornering for your crib!'), + ('furni_bed_polyfon*4_name', 'Beige Mode Double Bed'), + ('callhelp_allwillreceive', 'A member of community staff will investigate the situation and take appropriate action. This may include sending you a response with advice on dealing with your issue.'), + ('furni_pura_mdl4*4_name', 'White Pura Module 4'), + ('hubu_odotetaan', 'Waiting for replies from others...'), + ('furni_door_name', 'Telephone Box'), + ('furni_doormat_plain*5_desc', 'Available in a variety of colours'), + ('furni_gothic_carpet_desc', 'The path less travelled'), + ('poster_516_desc', 'Eng-er-land'), + ('furni_gothic_stool*6_desc', 'The dark side of Habbo'), + ('furni_traffic_light*3_desc', 'Chill and wait your turn!'), + ('furni_bartable_armas_desc', 'Bar-Style Table - essential for extra guests'), + ('club_isp_change', 'Change your subscription'), + ('furni_summer_grill*2_name', 'Red Barbeque Grill'), + ('poster_23_desc', 'flap, flap, screech, screech...'), + ('furni_prizetrophy7*3_desc', 'Bronze Habbo trophy'), + ('furni_couch_norja*2_name', 'Black Bench'), + ('nav_venue_cunning_fox_gamehall/0_desc', 'Pit your wits on the battlefield, the board or the baize - choose what to play here'), + ('furni_jp_tatami2_name', 'Large Tatami Mat'), + ('furni_pura_mdl3*3_desc', 'Any way you like it!'), + ('furni_house_name', 'Gingerbread House'), + ('furni_sound_set_54_name', 'Oh Blinging Tree'), + ('furni_table_plasto_4leg*1_name', 'Square Dining Table'), + ('furni_pillow*1_name', 'Pink Fluffy Pillow'), + ('NUF_console_hotelview_tutor', 'Oh! You have a message on your Habbo Console. Let\'s see who it is.'), + ('LoadingRoom', 'Loading room...'), + ('rotate', 'Rotate'), + ('nav_venue_sw_lobby_beginner_6_name', 'Snow Rookies Lobby'), + ('nav_venue_bb_lobby_amateur_1/0_desc', ''), + ('furni_jukebox_ptv*1_desc', 'Jukebox Pacha TV'), + ('nav_venue_star_lounge/0_desc', 'Chat with Sean Kingston here!'), + ('furni_chair_plasty*6_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_tournament_10/0_desc', ''), + ('NUF_mini_use_console_hotelview_tutor', 'Ah! You have a message on your Habbo Console. Let\'s see who it is.'), + ('furni_rare_xmas_screen_name', 'Lappland Greetings'), + ('summer_chair_9_name', 'Red Deck Chair'), + ('club_timefull', 'Sorry, you can only buy up to three months of Habbo Club subscription in advance.'), + ('poster_2002_desc', 'Presidentin muotokuva'), + ('poster_7_name', 'Hammer Cabinet'), + ('furni_gothic_chair*2_name', 'Golden Gothic Chair'), + ('bb_header_powerups', 'Powerups in game:'), + ('credit_redeem_url', 'http://%predefined%//help/19'), + ('furni_divider_silo3*2_name', 'Black Area Gate'), + ('furni_chair_plasto*16_name', 'Chair'), + ('catalog_itsurs', 'Yay! It\'s being delivered now..'), + ('hobba_pickandreply', 'Pick & Reply'), + ('reg_terms', 'Welcome to Habbo Hotel. If you are under 16, please check the Terms and Conditions with your parents/guardian before you agree to them. Get them to explain anything that you don\'t understand.\\rIn order to use the service you have to give valid information about yourself when registering. Please email us if any of your user information changes.\\rAs a user of Habbo Hotel - www.habbohotel.co.uk , you have to behave according to the Habbo Way (hotel rules) and the Terms and Conditions. Click the links below to read about them.\\rNever give your password or email address to anyone. If you do, your Habbo may get stolen.\\rRegistering with the hotel, making your own empty room and chatting is free of charge. For a small fee you can decorate your room with virtual furniture, play games and join the Habbo Club. If you wish to buy, you will need your parent\'s permission to do so.'), + ('furni_summer_pool*1_name', 'Blue Summer Pool'), + ('furni_heartsofa_desc', 'Perfect for snuggling up on'), + ('furni_scifiport*3_name', 'Jade Sci-Fi Port'), + ('furni_glass_chair*6_name', 'Blue Glass Chair'), + ('furni_sound_set_62_name', 'Alhambra Trax 1'), + ('win_voucher', 'Habbo Credit Code'), + ('furni_summer_chair*4_desc', 'White'), + ('furni_bed_polyfon_one_desc', 'Cot of the artistic'), + ('nav_venue_bb_lobby_tournament_5/0_desc', ''), + ('nav_venue_bb_lobby_beginner_3_name', 'Beginners Battle Ball 4'), + ('console_follow_not_friend', 'The user you tried to follow is not your friend anymore.'), + ('delete', 'Delete'), + ('furni_grunge_mattress_desc', 'Beats sleeping on the floor!'), + ('furni_rare_icecream*7_name', 'Chocolate Ice Cream Machine'), + ('sound_machine_alert_no_disks', 'You don\'t have any more discs!'), + ('furni_sofachair_silo_name', 'Armchair'), + ('nav_venue_sw_lobby_expert_0_name', 'Snow Marksmen Lobby'), + ('game_waitop', 'WAITING FOR THE OPPONENT'), + ('Alert_NameAlreadyUse', 'That name is already being used'), + ('furni_queue_tile1*1_desc', 'The power of movement'), + ('poster_18_name', 'Butterfly Cabinet 2'), + ('furni_wooden_screen*6_desc', 'Add an exotic touch to your room'), + ('furni_noob_table*2_name', 'My first Habbo table'), + ('furni_tree1_name', 'Dead tree'), + ('nav_venue_bouncer_room_0_name', 'Battle Ball Competitie Arena'), + ('furni_traffic_light*5_name', 'White Traffic Light'), + ('furni_sw_raven_name', 'Mrs Raven'), + ('cam_shoot.help', 'Shutter Release'), + ('furni_grand_piano*3_desc', 'Make sure you play in key!'), + ('nav_venue_sw_lobby_intermediate_2_name', 'Snow Bombardiers Lobby'), + ('interface_icon_purse', 'Purse, manage your coins'), + ('poll_alert_server_error', 'The poll isn\'t available anymore. Polls are only available at a certain public space for a certain duration.'), + ('sound_machine_confirm_delete_long', 'Are you sure you want to delete the selected song?'), + ('reg_check_confirm', 'Please check that your information is correct, especially your birthdate and Habbo name. You CANNOT change these later. If you want make any changes now, press the back button.'), + ('Alert_CheckBirthday', 'Please check your birthday'), + ('furni_shelves_norja*4_desc', 'For nic naks and tech books'), + ('club_expired_link', 'Click here to join Habbo Club'), + ('poster_520_desc', 'Every colour for everyone'), + ('nav_venue_bb_lobby_intermediate_desc', 'Intermediate battle ball!'), + ('tutorial_restart_button_bubble', 'Remember! Anytime you want to relive the fun click here to restart the tutorial!'), + ('poster_1_name', 'Comedy Poster'), + ('reg_verification_incorrectBirthday', 'Your birthday was incorrect'), + ('furni_glass_stool*6_name', 'Blue Glass Stool'), + ('furni_CFC_100_coin_gold_desc', 'Worth 100 Credits'), + ('buddyremove_list_full', 'Your friends list is full, you can\'t add new friends until you delete some. \\r\\The maximum number of friends you can have, is %mylimit% Habbos. Members of Habbo Club can have up to %clublimit% friends on their list.'), + ('furni_bunny_name', 'Squidgy Bunny'), + ('furni_small_chair_armas_name', 'Stool'), + ('nav_venue_sw_lobby_free_0/0_desc', ''), + ('furni_sofachair_silo*3_name', 'White Armchair'), + ('furni_sound_machine*2_desc', 'Dance to the Habbo Club beat!'), + ('nav_venue_gate_park/0_desc', 'Follow your path...'), + ('NUF_mini_use_console_hotelview_icon', 'Click the icon to open your Habbo Console.'), + ('nav_venue_eric\'s_eaterie/0_desc', 'Join Eric for a bite to eat'), + ('furni_table_silo_med*8_desc', 'Wipe clean and unobtrusive'), + ('poster_503_desc', 'There\'s no holes in this...'), + ('furni_bardeskcorner_polyfon*9_name', 'Red Corner Desk'), + ('furni_val_randomizer_desc', 'Surprise surprise! (Cilla Black not included)'), + ('furni_marquee*2_name', 'Red Dragon Marquee'), + ('furni_table_plasto_round_name', 'Round Dining Table'), + ('furni_summer_chair*3_name', 'Deck Chair'), + ('club_paycoins', 'Buy subscription'), + ('nav_venue_beauty_salon_general/0_desc', 'Join in the fun of Fashion Week! Check the homepage now for details.'), + ('furni_rare_dragonlamp*7_name', 'Sky Dragon Lamp'), + ('nav_venue_bb_lobby_beginner_6/0_desc', ''), + ('roomevent_quit', 'End event'), + ('console_search_habbo_lasthere', 'Last time'), + ('trading_title', 'Safe Trading'), + ('furni_glass_chair*7_desc', 'Habbo Club'), + ('gs_error_game_deleted', 'The Game has been deleted.'), + ('recycler_info_link_url', 'http://%predefined%/help/36'), + ('furni_pillar*6_name', 'Terracotta Pillar'), + ('furni_tile_stella_desc', '10% off the walk of fame!'), + ('transaction_system_sms_win_tmobile', 'T-Mobile SMS'), + ('buddyremove_names_ordered', 'Names Ordered By:'), + ('pet_race_2_010', 'Giggly Go-go'), + ('furni_table_plasto_bigsquare*6_name', 'Square Dining Table'), + ('pet_race_2_011', 'Petty Petsuchos'), + ('summer_chair_6_name', 'Blue Deck Chair'), + ('console_now', 'now:'), + ('gs_skill_changed', 'You have advanced to the next skill level. Your level is now %1!'), + ('roomatic_goyourroom', 'Go to your room'), + ('furni_carpet_soft*4_name', 'Soft Wool Rug'), + ('sound_machine_confirm_close_list', 'Close playlist editor?'), + ('pet.hotwords.good', 'good'), + ('furni_pura_mdl4*7_desc', 'Any way you like it!'), + ('furni_carpet_soft*1_name', 'Soft Wool Rug'), + ('furni_sound_set_22_desc', 'With a hamper full of sounds, not sarnies'), + ('nav_venue_sw_lobby_tournament_7_name', 'Tournament Lobby'), + ('furni_divider_nor3*6_desc', 'Blue Iced gate'), + ('furni_carpet_standard*3_name', 'Floor Rug'), + ('people', 'People'), + ('pet_race_2_007', 'Pretty Pui Pui'), + ('pet_race_2_008', 'Indifferent'), + ('pet_race_2_009', 'Swampy Siamese'), + ('furni_wcandle_name', 'White Candle'), + ('furni_sporttrack1*1_desc', 'null'), + ('furni_solarium_norja*1_name', 'Black Solarium'), + ('NUF_playing_games_gamecategories_tutor', 'Click the Beginner category to open it wide open. Like a melon!'), + ('pet_race_2_003', 'Silly Sobek'), + ('pet_race_2_004', 'Dirty Dundee'), + ('pet_race_2_005', 'Galled Gator'), + ('int_credits', 'Credits'), + ('furni_gothrailing_name', 'Gothic Railing'), + ('furni_sporttrack2*2_desc', 'null'), + ('pet_race_2_006', 'Confused Croc'), + ('furni_shelves_polyfon_name', 'Bookcase'), + ('pet_race_2_000', 'Endangered Albino'), + ('pet_race_2_001', 'Krazy Krokodilos'), + ('pet_race_2_002', 'Nile Dile'), + ('furni_divider_nor2*2_desc', 'Black Iced bar desk'), + ('log_problem_text', 'Oops.. Cannot connect to Habbo Hotel'), + ('furni_divider_nor2*5_desc', 'Pink Iced bar desk'), + ('nav_venue_sw_lobby_amateur_6/0_desc', 'Astetta rankempaa lumisotaa.'), + ('furni_rare_fountain_desc', 'For our feathered friends'), + ('furni_glass_sofa*5_name', 'Glass sofa'), + ('poster_33_desc', 'We can\'t bear to lose them'), + ('nav_venue_bb_lobby_tournament_14/0_desc', ''), + ('furni_summer_chair*6_name', 'Deck Chair'), + ('furni_hcsohva_desc', 'For royal bottoms...'), + ('furni_bed_budget*4_desc', 'King sized comfort!'), + ('furni_christmas_poop_desc', 'Bob?s magical fertilizer'), + ('furni_pura_mdl5*7_name', 'Green Pura Module 5'), + ('furni_barrier*1_desc', 'No escape this way!'), + ('nav_venue_bb_lobby_amateur_8/0_desc', ''), + ('furni_divider_arm2_desc', 'I wooden go there'), + ('furni_chair_plasty*11_desc', 'Hip plastic furniture'), + ('furni_small_table_armas_desc', 'Practical and beautiful'), + ('nav_venue_theatredrome_xmas_name', 'Theatredrome Xmas'), + ('poster_62_name', 'Save The Panda'), + ('reg_verification_currentPassword', 'Current password:'), + ('game_poker_change', 'Choose cards to change'), + ('NUF_getting_items_hotelview_nav', 'Click here to open the Navigator'), + ('furni_chair_basic*9_name', 'Red Pura Egg Chair'), + ('friend_request_failed', 'Failed!'), + ('furni_noob_chair*4_desc', 'Lightweight, practical, with light blue stripes'), + ('furni_table_silo_small*9_desc', 'Red Area Occasional Table'), + ('nav_hotelview', 'Hotel view'), + ('furni_toy1*3_desc', 'it\'s bouncy-tastic'), + ('furni_divider_nor3*2_name', 'Black Iced gate'), + ('furni_chair_silo*6_name', 'Blue Silo Dining Chair'), + ('update_password_suggest', 'Habbo Hotel security supervisor requests you to update your password'), + ('nav_venue_orient_name', 'Club Orient'), + ('Alert_NameTooLong', 'Sorry, that username is too long!'), + ('furni_sound_set_37_name', 'Sound set 37'), + ('furni_barchair_silo*7_desc', 'Practical and convenient'), + ('wallitem_wallmirror_name', 'Wallmirror'), + ('furni_chair_plasty*8_name', 'Plastic Pod Chair'), + ('sound_machine_confirm_close_list_long', 'Are you sure you want to exit playlist editor without saving?'), + ('furni_hc_frplc_name', 'Heavy Duty Fireplace'), + ('dance4', 'The Rollie'), + ('dance3', 'Duck Funk'), + ('furni_glass_stool*9_name', 'Glass stool'), + ('furni_sound_set_55_desc', 'Can you fill me in?'), + ('furni_carpet_standard*7_desc', 'Available in a variety of colours'), + ('poster_4_name', 'Bear Plaque'), + ('cam_zoom_out.help', 'Zoom Out'), + ('furni_sofa_polyfon*2_name', 'Black Mode Sofa'), + ('furni_prizetrophy2*1_name', 'Duck trophy'), + ('furni_scifirocket*3_desc', 'Caution! Unknown Location!'), + ('NUF_getting_items', 'Getting items'), + ('furni_val_teddy*1_desc', 'The grey bear of affection'), + ('furni_sofachair_polyfon*7_name', 'Green Mode Armchair'), + ('club_habbo.bottombar.link.member', '%days% days'), + ('habboclub_confirm_header', 'Subscription costs %price% credits'), + ('furni_rare_daffodil_rug_desc', 'A little bit of outdoors indoors..'), + ('poster_15_name', 'Himalayas Poster'), + ('furni_smooth_table_polyfon_desc', 'For larger gatherings'), + ('dance2', 'Pogo Mogo'), + ('furni_wooden_screen*3_name', 'Aqua Oriental Screen'), + ('furni_plant_cruddy_desc', 'Goodbye Bert...'), + ('dance1', 'Hab-Hop'), + ('furni_gothic_chair*6_desc', 'The dark side of Habbo'), + ('furni_table_plasto_square*9_name', 'Square Dining Table'), + ('nav_venue_bb_lobby_beginner_14/0_desc', ''), + ('furni_club_sofa_desc', 'Club sofa'), + ('roomevent_default_name', 'Event name..'), + ('game_poker_ok', 'Change cards'), + ('nav_venue_picnic_dudesons/0_desc', 'Duudsoneiden sponssaama oma Ranchi - www.extremeduudsonit.com'), + ('nav_venue_hallway/0_desc', 'Beware the ghosts and ghouls!'), + ('nav_venue_park/0_desc', 'Go for a stroll outdoors'), + ('console_fr_declined_count', 'Amount to be declined'), + ('furni_tree4_name', 'Christmas Tree 2'), + ('NUF_console_read_link', 'Click the link to open the message.'), + ('win_figurecreator', 'Habbo Details'), + ('furni_table_plasto_square*14_name', 'Occasional Table'), + ('furni_soft_sofachair_norja*6_desc', 'Blue Iced Sofachair'), + ('nav_venue_bb_lobby_beginner_0_name', 'Beginner'), + ('Alert_LogoNameAlreadyUse', 'That name is already being used'), + ('poster_25_name', 'Snowman Poster'), + ('furni_pura_mdl2*2_name', 'Pink Pura Module 2'), + ('furni_chair_plasto*13_name', 'Chair'), + ('furni_ticket_name', 'Small Ticket Bundle'), + ('furni_hc_lmpst_name', 'Victorian Street Light'), + ('furni_scifiport*7_desc', 'Energy beams. No trespassers!'), + ('jukebox_load_trax', 'Load Trax'), + ('furni_val_teddy*4_desc', 'The brown bear of naughtiness'), + ('reg_birthdayformat_update', 'Birthday (dd.mm.yyyy)'), + ('nav_venue_the_chromide_club_name', 'The Chromide Club'), + ('roomevent_not_available', 'Sorry, no events available'), + ('nav_venue_sw_lobby_beginner_0/0_desc', ''), + ('summer_chair_3_name', 'Black Deck Chair'), + ('int_newrequests', 'Friend Request(s)'), + ('console_profile_helptext', 'The Habbo Profile is a snapshot of your interests and hobbies - simply tick the things you like.'), + ('nav_roomnfo_hd_fav', 'Favourite Rooms'), + ('furni_chair_plasto*3_desc', 'Hip plastic furniture'), + ('furni_chair_basic*6_name', 'Blue Pura Egg Chair'), + ('number_4', '4'), + ('number_3', '3'), + ('number_2', '2'), + ('room_open_package', 'Open The Present'), + ('furni_grunge_barrel_name', 'Flaming Barrel'), + ('wallitem_photo_desc', 'Photo from Habbo'), + ('poster_30_desc', 'Pucker up'), + ('furni_glass_table*9_desc', 'Translucent beauty'), + ('nav_venue_sw_lobby_beginner_3_name', 'Snow Rookies Lobby'), + ('Alert_YouAreBanned', 'You have been banned for breaking the Habbo Way. This is why (if no ban reason is shown use the Contact Us form):'), + ('furni_gothic_sofa*2_name', 'Golden Gothic Sofa'), + ('NUF_getting_items_hotelview_tutor', 'Let us find out how to purchase items from the Hotel Catalogue. The Catalogue contains loads of cool stuff to decorate your Habbo room with. To begin open the Navigator.'), + ('furni_table_norja_med*2_desc', 'For larger gatherings'), + ('furni_sofa_silo*3_name', 'White Two-Seater Sofa'), + ('furni_pura_mdl5*5_desc', ''), + ('nav_venue_sw_lobby_beginner_desc', 'Yes, take a load of snowballs and hit the enemy Teams. Easy, isn\'t it?'), + ('furni_romantique_smalltabl*5_name', 'Onyx Tray Table'), + ('furni_divider_nor4_desc', 'Habbos, roll out!'), + ('furni_shelves_norja*7_desc', 'For nic naks and cookery books'), + ('nav_venue_sw_lobby_intermediate_4/0_desc', 'Lumisota sen kuin vain kovenee.'), + ('gs_text_spectate', 'You can watch this game'), + ('recycler_info_link', 'More information about Furni Recycler'), + ('furni_sofachair_polyfon_name', 'Armchair'), + ('club_intro_text', 'Members of Habbo Club get LOTS of cool stuff!\\rWith Habbo Club you get cool dances, access to Club Mammoth and The Blue Dragon Tavern, and a 500 limit on your friends list!'), + ('furni_divider_nor1*7_desc', 'The missing piece'), + ('url_helppledge', 'http://%predefined%//help/22'), + ('jukebox_song_name', '%name%'), + ('game_bs_won', 'WON!'), + ('furni_soft_jaggara_norja_name', 'Iced Sofachair'), + ('furni_rare_beehive_bulb_desc', 'A honey-hued glow'), + ('furni_chair_norja*8_name', 'Yellow Chair'), + ('poster_83_desc', 'Pöllö huhuilee, huhuu!'), + ('floodblocking', 'You are typing too fast - don\'t flood the room.'), + ('furni_CF_5_coin_silver_desc', 'Worth 5 Credits'), + ('sound_machine_confirm_clear', 'Clear the song?'), + ('furni_carpet_standard*6_name', 'Floor Rug'), + ('furni_waterbowl*2_desc', 'Aqua unlimited'), + ('sw_link_tournament_highScores_url', 'http://%predefined%//groups/56553/id'), + ('NUF_meeting_people_room_tutor', 'This is a Public Room. Your Habbo is in the doorway beneath the orange arrow. Click on another user to find out more about them.'), + ('furni_bottle_name', 'Empty Spinning Bottle'), + ('poster_512_name', 'The Irish flag'), + ('club_info_url', 'http://%predefined%//credits/habboclub'), + ('nav_venue_tv_studio_nike/0_desc', ''), + ('furni_couch_norja*6_desc', 'Two can perch comfortably'), + ('furni_pura_mdl5*8_desc', 'Any way you like it!'), + ('furni_carpet_valentine_desc', 'For making an appearance'), + ('furni_floortile_desc', 'In Variety of Colours'), + ('furni_pillar*9_name', 'Rock Pillar'), + ('furni_table_plasto_bigsquare*3_name', 'Square Dining Table'), + ('furni_bardeskcorner_polyfon*12_name', 'Corner Cabinet/Desk'), + ('furni_divider_nor1*4_desc', 'The missing piece'), + ('furni_chair_plasty*5_name', 'Plastic Pod Chair'), + ('furni_scifirocket*0_desc', 'See in 2007 with a bang!'), + ('poster_32_name', 'Siva Poster'), + ('club_button_2_period', 'Buy 3 >>>'), + ('furni_sound_set_58_desc', 'Sh-shake it!'), + ('furni_china_shelve_desc', 'To hold the mind\'s treasures'), + ('furni_scifidoor*7_desc', 'There out of this world!'), + ('furni_chair_silo*9_name', 'Red Silo Dining Chair'), + ('furni_gothic_stool*5_name', 'Green Gothic Stool'), + ('friend_request_massoperation_cancel', 'Back to request list.'), + ('furni_queue_tile1*0_name', 'White Quest Roller'), + ('furni_divider_nor3*5_name', 'Pink Iced gate'), + ('furni_sound_machine*5_desc', 'Heard the Habbo Bands new singles?'), + ('furni_glass_table*6_desc', 'Translucent beauty'), + ('furni_soft_sofachair_norja*9_desc', 'Red Iced Sofachair'), + ('furni_plant_mazegate_desc', 'Did we make it?'), + ('tickets_info_1', 'With 2 tickets you can play the following Games:\\r10 BattleBall:Rebound!\\r10 SnowStorm\\r20 Wobble Squabble or\\r20 Lido Diving'), + ('furni_barchair_silo*4_desc', 'Practical and convenient'), + ('furni_CF_10_coin_gold_name', 'Gold Coin'), + ('tickets_info_2', 'With 20 tickets you can play the following Games:\\r10 BattleBall:Rebound!\\r10 SnowStorm\\r20 Wobble Squabble or\\r20 Lido Diving'), + ('furni_sound_set_15_desc', 'Unadulterated essentials'), + ('handitem1', 'Tea'), + ('furni_romantique_divan*3_desc', 'null'), + ('furni_glass_sofa*8_name', 'Glass sofa'), + ('epsnotify_1001', 'The hotel is full at the moment. Please try again in a few minutes.'), + ('furni_table_silo_med*2_name', 'Black Coffee Table'), + ('furni_sleepingbag*7_name', 'Orange Sleeping Bag'), + ('furni_pillow*5_desc', 'Puffy, soft and huge'), + ('furni_bed_budget*1_desc', 'King sized comfort!'), + ('furni_bed_trad_one_name', 'Plain Single Bed'), + ('catalog_giftfor', 'This is a gift for:'), + ('furni_theatre_seat_name', 'Deluxe Theatre Chair'), + ('furni_romantique_divider*3_name', 'Turquoise Screen'), + ('furni_shelves_silo_desc', 'For nic naks and art deco books'), + ('handitem9', 'Decaff'), + ('handitem8', 'Regular'), + ('handitem7', 'Water'), + ('furni_glass_table_name', 'Glass table'), + ('console_selection_invert', 'Invert selection'), + ('handitem6', 'Blackcurrant'), + ('furni_hc_machine_desc', 'By and for mad inventors'), + ('handitem5', 'Milk'), + ('handitem4', 'Ice-cream'), + ('poster_40_desc', 'The one and only. Adore her!'), + ('nav_venue_sw_lobby_tournament_9/0_desc', ''), + ('handitem3', 'Carrot'), + ('handitem2', 'Juice'), + ('furni_cn_sofa_name', 'Chinese Sofa'), + ('nav_venue_bb_lobby_expert_4/0_desc', ''), + ('poster_502_name', 'The Stars and Stripes'), + ('furni_md_rug_name', 'Bubble Juice Floor'), + ('furni_table_plasto_bigsquare_name', 'Square Dining Table'), + ('furni_bed_polyfon*8_desc', 'Yellow Mode Double Bed'), + ('nav_venue_sw_lobby_amateur_7_name', 'Snow Slingers Lobby'), + ('furni_birdie_desc', 'Cheep (!) and cheerful'), + ('poster_12_name', 'Lapland Poster'), + ('club_desc_1_period', '1 Month (31 days) = 25 Credits'), + ('hobba_emergency_help', 'Call For Emergency Help:'), + ('reg_age_check_note', 'Enter your birthday. You will need your birthday information when changing your password or email.'), + ('furni_table_plasto_square*6_name', 'Square Dining Table'), + ('trade', 'Trade'), + ('furni_romantique_smalltabl*3_desc', 'Every tray needs a table...'), + ('reg_back', 'Back'), + ('furni_tree7_name', 'Snowy Christmas Tree'), + ('recycler_trader_open_alert', 'Recycling cannot begin while you are trading. Please close the safe trading box before recycling.'), + ('furni_rare_dragonlamp*8_desc', 'Scary and scorching!'), + ('furni_gothic_chair*3_desc', 'The head of the table'), + ('Alert_YourNameIstooShort', 'Habbo names must be at least 3 characters long.'), + ('furni_bed_budgetb_desc', 'Sweet dreams for two'), + ('furni_shelves_basic_name', 'Pura Shelves'), + ('console_messagemode_helptext', 'You can send an instant message to your Habbo Friends.'), + ('nav_venue_cunning_fox_gamehall/5_desc', 'Get a hand like a foot? Keep a straight face and bluff it out'), + ('furni_table_polyfon_small_name', 'Small Coffee Table'), + ('move_furniture', 'Move Furni'), + ('nav_searchbutton', 'Search'), + ('furni_habboween_grass_desc', 'Autumnal chills with each rotation!'), + ('furni_pura_mdl5*2_desc', 'Any way you like it!'), + ('NUF_meeting_people_user_tutor', 'The user you clicked on is shown in the corner of your screen. The buttons beneath the Habbo let you visit their Habbo Home, send them a Friend Request or ignore them if they look or act like a moron.'), + ('poster_55_name', 'Tree of Time'), + ('furni_soft_sofachair_norja*5_name', 'Pink Iced Sofachair'), + ('furni_sound_set_48_name', 'Club 3'), + ('furni_table_plasto_4leg_desc', 'Hip plastic furniture'), + ('furni_pura_mdl4*1_name', 'Aqua Pura Module 4'), + ('login_forgottenPassword_url', 'https://www.habbo.co.uk/account/password/forgot'), + ('nav_venue_floatinggarden/0_desc', 'Peace, tranquility and still waters'), + ('furni_sound_set_36_desc', 'For adult minded'), + ('poster_43_desc', 'Shake, rattle and roll'), + ('furni_gothic_stool*3_desc', 'The dark side of Habbo'), + ('room_alert_furni_limit', 'This room has the maximum amount of Furni.'), + ('furni_table_plasto_square*15_name', 'Occasional Table'), + ('furni_rare_hammock_name', 'Hammock'), + ('sound_machine_confirm_burn_long', 'Are you sure you want to burn this song to disc? Burning costs one credit.'), + ('furni_rclr_chair_desc', 'Watch out for coconuts'), + ('furni_chair_basic*3_desc', 'It\'s a cracking design!'), + ('furni_doormat_plain*6_name', 'Doormat'), + ('furni_sofachair_polyfon*9_name', 'Red Armchair'), + ('furni_jp_tray6_name', 'jp_tray6'), + ('furni_habbocake_name', 'Cake'), + ('poster_501_name', 'Jolly Roger'), + ('nav_goingprivate', 'Going to Guest room'), + ('furni_bed_budget_one*9_name', 'Red Pura Bed'), + ('alert_no_category', 'Your room has no category. Select one from the list.'), + ('nav_venue_theatredrome_easter/0_desc', ''), + ('gs_button_buytickets', 'Buy Tickets'), + ('nav_venue_bouncer_room_4_name', 'Experts Battle Ball Arena'), + ('close', 'Close'), + ('furni_carpet_standard*9_desc', 'Available in a variety of colours'), + ('furni_prizetrophy4*1_desc', 'Glittery gold'), + ('help_pointer_1', 'http://www.habbo.co.uk/help/'), + ('help_pointer_3', 'emergency_help'), + ('furni_rclr_lamp_name', 'Moon Lamp'), + ('help_pointer_2', 'http://www.habbohotel.co.uk/iot/go?lang=en&country=uk'), + ('furni_exe_sofa_desc', 'Relaxing leather comfort'), + ('furni_divider_silo1*4_name', 'Beige Area Corner Shelf'), + ('poster_2001_name', 'SeinNightitititititdiskotappaja'), + ('interface_icon_tv_close', 'Leave the Room and close the Habbovision mode.'), + ('furni_sound_machine*7_name', 'Red Traxmachine'), + ('game_bs_hit', 'A Hit!:'), + ('furni_rare_fan*2_desc', 'It\'ll blow you away!'), + ('win_place', 'Note!'), + ('nav_venue_bb_lobby_beginner_11_name', 'Beginners Battle Ball 12'), + ('furni_pillow*7_desc', 'Bonnie\'s pillow of choice!'), + ('furni_table_silo_small*8_desc', 'For those random moments'), + ('furni_divider_nor4*5_desc', 'Habbos, roll out!'), + ('hubu_vastaa', 'Answer the question'), + ('furni_pura_mdl4*8_name', 'yellow pura module 4'), + ('furni_glass_chair*9_name', 'Glass chair'), + ('furni_chair_silo*7_desc', 'Green Silo Dining Chair'), + ('furni_jp_drawer_desc', 'Spiritual home for odds and ends'), + ('tutorial_select_another_topic', 'Select another topic'), + ('furni_noob_lamp*4_desc', 'Get the light right where you want it (light blue)'), + ('nav_venue_beauty_salon_general_name', 'Beauty salon'), + ('furni_sofachair_polyfon*2_name', 'Black Mode Armchair'), + ('console_report_header', 'Report Abusive Message'), + ('club_buy_url', 'http://%predefined%//credits/habboclub'), + ('furni_prizetrophy*2_name', 'Classic trophy'), + ('furni_rare_icecream*4_name', 'Strawberry Ice Cream Machine'), + ('furni_barchair_silo*5_desc', 'Practical and convenient'), + ('furni_divider_nor2*4_desc', 'No way through'), + ('furni_xmas_cstl_gate_name', 'Ice Castle Gate'), + ('furni_noob_stool*5_desc', 'Unfold me and take the weight off (pink)'), + ('furni_bed_budgetb_one_name', 'Plain Single Bed'), + ('friend_request_accept_all', 'Accept all requests.'), + ('furni_val_choco_name', 'Heart Shaped Box'), + ('poster_514_desc', 'Be proud to be in the Union!'), + ('furni_carpet_legocourt_desc', 'Line up your slam dunk'), + ('furni_sofa_silo_name', 'Two-Seater Sofa'), + ('furni_chair_plasto*8_desc', 'Hip plastic furniture'), + ('furni_tree5_name', 'Christmas Tree 3'), + ('nav_venue_habbo_cinema/0_desc', 'Now showing: Kick Warz II - The revenge of Donnie Santini!'), + ('furni_couch_norja*4_name', 'Urban Iced Bench'), + ('poster_52_desc', 'whack that ball!'), + ('furni_sound_set_45_desc', 'The Bass? is the rhythm!'), + ('nav_venue_sun_terrace/0_name', 'Sun Terrace'), + ('queue_tile_limit', 'You can\'t fit more Habbo Rollers in this room!'), + ('BuddyRequesta', 'Friend Request(s)'), + ('transaction_system_sms_rl', 'Elisa'), + ('furni_prizetrophy4_desc', 'Palkinto'), + ('furni_hcamme_desc', 'Time for a soak'), + ('furni_scifirocket*2_name', 'Earth Smoke Machine'), + ('furni_divider_nor5*2_desc', 'Cool cornering for your crib y0!'), + ('forgottenpw', 'Forgotten your password?'), + ('furni_rclr_sofa_desc', 'Snuggle up together'), + ('furni_val_cauldron_desc', 'Cast a loving spell!'), + ('poster_3_name', 'Fish Plaque'), + ('furni_one_way_door*8_name', 'Yellow One Way Gate'), + ('furni_divider_nor3*8_desc', 'Yellow Iced gate'), + ('sw_link_highScores_url', 'http://%predefined%//groups/56553/id'), + ('furni_carpet_standard*2_desc', 'Available in a variety of colours'), + ('nav_venue_sport/0_name', 'The Power Gym'), + ('furni_scifidoor*3_desc', 'There out of this world!'), + ('furni_pillar*7_desc', 'Recovered from Habblantis'), + ('furni_arabian_tray3_name', 'Sweets Tray'), + ('furni_chair_plasto_name', 'Chair'), + ('nav_venue_pizza_name', 'Slice of Life'), + ('url_privacypledge', 'http://%predefined%//help/69'), + ('furni_one_way_door*3_desc', 'One way! The HC way!'), + ('catalog_purchase_not_allowed_hc', 'In order to buy this item you must be a Habbo Club member!'), + ('furni_pura_mdl3*4_name', 'White Pura Module 3'), + ('room_confirmDelete', 'Confirm'), + ('BuddyPrivateRoom', 'In A Guest Room'), + ('furni_marquee*7_desc', 'It\'s both door and a shade!'), + ('furni_bath_desc', 'The ultimate in pampering'), + ('furni_soft_sofa_norja*3_desc', 'Pristine white, keep it clean!'), + ('game_BattleShip', 'Battleships'), + ('furni_sound_set_11_desc', 'Music you can really sink your teeth into'), + ('furni_glass_chair*2_name', 'Glass chair'), + ('furni_sofa_silo*5_desc', 'Pink Area Sofa'), + ('furni_pura_mdl2*7_name', 'Green Pura Module 2'), + ('cam_film.help', 'Number Of Photos Left'), + ('nav_venue_bb_lobby_tournament_17/0_desc', ''), + ('roomatic_hway', 'Hotel guests are expected to follow the Habbo Way even if word filtering is switched off.'), + ('modify', 'Modify'), + ('furni_sofachair_silo*8_name', 'Yellow Armchair'), + ('alert_reg_blocked', 'A person under 11 years of age has tried to register from this machine recently.\\rRegistration is not possible for a while.'), + ('furni_sofa_polyfon*8_desc', 'Yellow Mode Sofa'), + ('furni_wooden_screen*9_desc', 'Add an exotic touch to your room'), + ('hobba_message_from', 'Your call has been responded to as follows:'), + ('win_help', 'Habbo Help'), + ('pet.saying.sniff.dog.1', 'snuh...SNUUUUUH'), + ('pet.saying.sniff.dog.0', 'snuuh..snuuh'), + ('sw_user_skill', 'Snow Storm Skill Level: \\x \\r (\\y points)'), + ('furni_rom_lamp_desc', 'Light up your life'), + ('console_profile_create', 'Create your Habbo Profile.'), + ('furni_CF_50_goldbar_desc', 'Worth 50 Credits'), + ('furni_romantique_chair*4_desc', 'What does this button do?'), + ('reg_use_allowed_chars', 'Use only these characters:'), + ('furni_bar_chair_armas_name', 'Barrel Stool'), + ('pet.saying.sniff.dog.2', '*sighs*'), + ('furni_sound_set_64_name', 'Alhambra Trax 3'), + ('furni_pillar*3_name', 'blue pillar'), + ('furni_glass_chair*4_desc', 'Translucent beauty'), + ('furni_pizza_desc', 'You dirty Habbo'), + ('opening_hours_text_shutdown', 'The Hotel will shut down in %d% minutes. To avoid confusion, purchasing of furniture, Habbo Club and game tickets will be disabled during that time, as well as playing Games and furniture trading. Thank you for visiting and welcome back tomorrow!'), + ('nav_venue_bb_lobby_tournament_10_name', 'Competitie Battle Ball 11'), + ('poster_521_desc', 'Ordem e progresso'), + ('furni_sound_set_52_desc', 'Under the mistletoe!'), + ('furni_shelves_norja*3_name', 'White Iced Bookcase'), + ('furni_scifiport*5_desc', 'Recovered from Roswell'), + ('help_emergency_writeyour', 'Give details of your emergency here:'), + ('furni_table_norja_med*6_name', 'Large Coffee Table Blue'), + ('nav_venue_bb_lobby_expert_3_name', 'Experts Battle Ball 4'), + ('photo_legend', 'Caption'), + ('furni_sofachair_silo_desc', 'Large, but worth it'), + ('console_youdonthavebuddies', 'You have no Friends on your list.\\rYou can send Friend Requests using\\rthe \'search\' button.'), + ('furni_table_plasto_4leg*6_name', 'Occasional table Table'), + ('furni_scifidoor*1_name', 'Pink Spaceship Door'), + ('furni_tile_brown_desc', '10% off downtown promenades & piazzas!'), + ('NUF_getting_room_go_button', 'Click here to go to your just created room!'), + ('dimmer_turn_on', 'Turn ON'), + ('furni_sofa_polyfon_desc', 'Comfort for stylish couples'), + ('furni_sound_set_50_name', 'Club 5'), + ('furni_doorB_name', 'Wardrobe'), + ('reg_agree1', 'Yes, my parents and I agree to the above terms. I am allowed to use Habbo Hotel.'), + ('furni_chair_silo*3_name', 'White Dining Chair'), + ('furni_CF_1_coin_bronze_desc', 'Worth 1 Credits'), + ('reg_agree2', 'Yes, I have read the Habbo Hotel Terms of Service and I accept them'), + ('you_have_pending_cfh', 'Your previous call for help has not been answered yet. To make a new one you must delete the old message.'), + ('furni_table_plasto_bigsquare*7_name', 'Square Dining Table'), + ('console_accept', 'Accept'), + ('furni_lamp_basic_name', 'Pura Lamp'), + ('console_friend_request_error', 'There was an error with friend requests'), + ('poster_11_desc', 'I obey the Habbo way!'), + ('furni_bardeskcorner_polyfon*6_name', 'Blue Mode Bardesk Corner'), + ('furni_plant_sunflower_name', 'Cut Sunflower'), + ('furni_traffic_light*3_name', 'Purple Traffic Light'), + ('furni_bed_polyfon_one*8_name', 'Yellow Mode Single Bed'), + ('furni_carpet_polar*1_desc', 'Cute'), + ('furni_noob_rug*1_desc', 'Nice and neat sisal rug with orange edging'), + ('furni_exe_bardesk_desc', 'Divide the profits!'), + ('furni_romantique_divider*4_desc', 'Keeping things separated'), + ('pet_status_dialog', '%name%'), + ('furni_jp_lantern_name', 'Japanese Lantern'), + ('furni_chair_norja*2_name', 'Black Chair'), + ('furni_jp_irori_desc', 'Traditional heating and eating'), + ('furni_bed_budget*5_name', 'Beige Pura Double Bed'), + ('furni_scifidoor*8_name', 'Purple Spaceship Door'), + ('nav_venue_sw_lobby_free_5_name', 'Free Game Lobby'), + ('wallitem_jp_sheet2_desc', 'jp_sheet2'), + ('furni_glass_sofa*9_desc', 'Translucent beauty'), + ('furni_divider_nor5*7_name', 'Rural Iced Angle'), + ('sound_machine_open_editor', 'Trax Editor'), + ('furni_jp_tatami2_desc', 'Shoes off please'), + ('furni_sound_set_16_name', 'Hip Hop Beats 3'), + ('console_recipients', 'Recipient(s)'), + ('catalog_page', 'page'), + ('poster_23_name', 'Bat Poster'), + ('furni_table_plasto_round*4_name', 'Square Dining Table'), + ('furni_rubberchair*2_desc', 'Soft and tearproof!'), + ('nav_venue_bb_lobby_beginner_16/0_desc', ''), + ('poster_1005_name', 'Johnny Squabble'), + ('furni_silo_studydesk_name', 'Area Quest Desk'), + ('furni_table_plasto_4leg*1_desc', 'Hip plastic furniture'), + ('nav_venue_basement_lobby/0_desc', 'For low level hanging'), + ('furni_rare_parasol*3_desc', 'Block those rays!'), + ('furni_arabian_wndw_name', 'Arabian Window Frame'), + ('Alert_ConnectionFailure', 'Disconnected'), + ('furni_house_desc', 'Good enough to eat'), + ('console_confirm_selected', 'Confirm the selections. Below are the amount of friend requests that will be accepted and declined. If you want, you can still modify the selections.'), + ('furni_table_plasto_4leg*4_name', 'Square Dining Table'), + ('furni_sound_set_57_name', 'RnB Grooves 3'), + ('hubu_h3', 'Huumetietobussi'), + ('furni_table_plasto_bigsquare*2_name', 'Square Dining Table'), + ('hubu_h4', 'Anna palautetta'), + ('hubu_h1', 'Puhelintuki'), + ('roomatic_bobbafilter', 'Bobba filter (filters out bad language)'), + ('hubu_h2', 'Harrastamaan!'), + ('furni_tv_luxus_desc', 'Bang up to date'), + ('hubu_h5', 'Huumetietoa'), + ('NUF_console_hotelview_icon', 'Click the button to open your Habbo Console.'), + ('modtool_banlength', 'Ban Length:'), + ('NUF_visiting_rooms_roomlist_tutor', 'Just pick any room you like. Click on the room to see a description of the room. ROOM!'), + ('reg_verification_newPassword', 'New password:'), + ('furni_wall_china_name', 'Dragon Screen'), + ('nav_venue_hallway_ii/0_desc', 'Beware witches and warlocks'), + ('jukebox_disk_add', 'Add Disc'), + ('furni_rare_xmas_screen_desc', 'Ho Ho Ho!'), + ('furni_table_plasto_round*2_name', 'Round Dining Table'), + ('furni_rubberchair*7_name', 'White Inflatable Chair'), + ('nav_favourites_helptext', 'These are your favourite rooms. Nice selection you have here...'), + ('nav_venue_sw_lobby_beginner_4_name', 'Snow Rookies Lobby'), + ('furni_gothic_chair*2_desc', 'The prince of Habbo'), + ('cam_save_nofilm', 'You have run out of film.\\rGet a roll (5 photos) from\\rthe Catalogue for 6 Credits.'), + ('furni_sofa_polyfon*6_desc', 'Blue Mode Sofa'), + ('furni_divider_silo3*2_desc', 'Form following function'), + ('furni_rare_beehive_bulb*1_name', 'Red Amber Lamp'), + ('furni_plant_small_cactus_desc', 'Even less watering than the real world'), + ('furni_triplecandle_name', 'Electric Candles'), + ('help_option_1', 'Playing Habbo'), + ('help_option_3', 'A serious issue (harassment, sexual behaviour)'), + ('furni_present_gen5_name', 'Gift'), + ('help_option_2', 'My Habbo account.'), + ('furni_shelves_norja*8_name', 'Yellow Bookcase'), + ('furni_legotrophy_desc', 'For the winning team'), + ('furni_rare_icecream*2_name', 'Pistachio Ice Cream Machine'), + ('furni_summer_pool*1_desc', 'Fancy a dip?'), + ('nav_venue_theatredrome_deli/0_desc', 'Join in all the fun of the fair!'), + ('game_newgame', 'New game'), + ('help_tour', 'Guided Tour'), + ('purse_vouchers_error3_url', 'http://%predefined%//credits'), + ('furni_marquee*5_name', 'Graphite Marquee'), + ('forgottenpw_explanation', 'If you have forgotten your password and you gave your correct email address when you registered, we can send your password to you.'), + ('furni_waterbowl*3_name', 'Yellow Water Bowl'), + ('roomatic_namedisp', 'Do you want your name to be displayed with the room?'), + ('poster_28_name', 'Silver Tinsel Bundle'), + ('Alert_BuyingOK', 'Buying Successful!'), + ('furni_summer_chair*4_name', 'Deck Chair'), + ('nav_venue_welcome_lounge_ii/0_desc', 'New? Lost? Get a warm welcome here from Habbo eXperts.'), + ('bb_title_gameCreation', 'Aloita uusi peli!'), + ('furni_sporttrack1*3_name', 'Sport track straight grass'), + ('furni_romantique_divan*2_name', 'Emerald Chaise-Longue'), + ('furni_divider_silo1*6_name', 'Blue Area Corner Shelf'), + ('NUF_about_hotel_about_tutor', 'Habbo is both a virtual world and an online community.'), + ('url_helpparents', 'http://%predefined%//help/73'), + ('furni_divider_silo3*7_name', 'Green Area Gate'), + ('poster_18_desc', 'Beautiful reproduction butterfly'), + ('furni_traffic_light*5_desc', 'Chill and wait your turn!'), + ('furni_scifirocket*6_desc', 'Too hot to handle!'), + ('pet.saying.angry.cat.0', 'Sssppp!'), + ('furni_bed_armas_one_desc', 'Rustic charm for one'), + ('pet.saying.angry.cat.3', '*hiss*'), + ('pet.saying.angry.cat.1', 'MrrRRRR'), + ('pet.saying.angry.cat.2', 'Tssssss!'), + ('furni_noob_rug*6_name', 'My first Habbo rug'), + ('club_habbo.bottombar.text.member', 'Habbo Club'), + ('furni_divider_silo1_name', 'Corner Shelf'), + ('nav_venue_bb_lobby_beginner_10/0_desc', ''), + ('recycler_info_progress', 'Recycling is currently in progress. The recycling process takes a total of %recyclinghours% hour. You can leave the catalogue and recycling will continue in the background.'), + ('furni_queue_tile1*1_name', 'Pink Habbo Roller'), + ('notickets_header', 'Buy game tickets to play this game'), + ('reg_underage', 'I am under 11 years old'), + ('nav_venue_sw_arena_intermediate_name', 'Playing intermediate game'), + ('furni_table_plasto_square*5_name', 'Square Dining Table'), + ('Alert_YouAreBanned_T', 'A Moderator kicked you out of the room.'), + ('buddyremove_moreoptions', 'More Options >>'), + ('furni_prizetrophy4*3_desc', 'Breathtaking bronze'), + ('furni_chair_silo*2_desc', 'Keep it simple'), + ('club_habbo.bottombar.link.notmember', 'Join!'), + ('poster_1000_name', 'Comedy Poster'), + ('room_badge_button', 'Badge'), + ('furni_soft_sofa_norja*8_desc', 'Yellow Iced Sofa'), + ('wallitem_torch_name', 'Gothic Torch'), + ('furni_scifirocket*7_name', 'Jupiter Smoke Machine'), + ('furni_romantique_tray1_desc', 'For a fast break'), + ('furni_rare_dragonlamp*0_desc', 'George and the...'), + ('furni_nest_desc', 'Night, night'), + ('furni_table_silo_small*2_name', 'Black Occasional Table'), + ('furni_prizetrophy7*2_name', 'Silver Habbo trophy'), + ('furni_sofachair_silo*3_desc', 'Large, but worth it'), + ('furni_divider_nor2*9_name', 'Red Iced bar desk'), + ('club_extend_title', 'Habbo Club membership can be extended VERY easily.'), + ('furni_rare_fan*0_desc', 'As red as Rudolph\'s nose'), + ('club_paybycash_url', '(leave this empty if you don\'t want to have this link displayed)'), + ('poster_57_name', 'Calligraphy poster'), + ('furni_CFC_50_coin_silver_desc', 'Worth 50 Credits'), + ('furni_pillow*5_name', 'Black Leather Pillow'), + ('furni_hc_chr_name', 'Majestic Chair'), + ('nav_venue_sw_arena_free_name', 'Playing free for all game'), + ('furni_active_placeholder_desc', 'This furniture is downloading...'), + ('nav_venue_welcome_lounge_name', 'Welcome Lounge'), + ('furni_soft_sofachair_norja*3_name', 'White Iced Sofachair'), + ('furni_bed_polyfon*3_desc', 'Give yourself space to stretch out'), + ('furni_pura_mdl4*3_name', 'Black Pura Module 4'), + ('furni_pillar*2_desc', 'Ancient and stately'), + ('furni_small_chair_armas_desc', 'Rustic charm at it\'s best'), + ('furni_table_plasto_round_desc', 'Hip plastic furniture'), + ('furni_marquee*2_desc', 'Dragons out and Davids in!'), + ('furni_wooden_screen*7_desc', 'Add an exotic touch to your room'), + ('furni_queue_tile1*8_name', 'Navy Habbo Roller'), + ('furni_arabian_pllw_desc', 'Exotic comfort'), + ('furni_sound_set_1_desc', 'Get the party started!'), + ('furni_gothic_stool*5_desc', 'The dark side of Habbo'), + ('furni_china_table_desc', 'Exotic and classy'), + ('song_disk_trade_info', '%name%'), + ('nav_venue_sw_lobby_beginner_9_name', 'Snow Rookies Lobby'), + ('console_modify', 'Modify'), + ('poster_36_desc', 'The Hotels girlband. Dream on!'), + ('furni_rare_dragonlamp*7_desc', 'Scary and scorching!'), + ('furni_sound_set_63_desc', 'Desert hits by the oasis!'), + ('nav_venue_cafe_gold_name', 'The Oasis'), + ('nav_venue_sw_lobby_tournament_3/0_desc', ''), + ('nav_venue_habbo_cinema_name', 'Habbo Cinema'), + ('furni_chair_plasty*4_name', 'Plastic Pod Chair'), + ('nav_venue_welcome_lounge_iii/0_desc', 'New? Lost? Get a warm welcome here from Habbo eXperts.'), + ('furni_carpet_soft*1_desc', 'Soft Wool Rug'), + ('furni_sporttrack1*1_name', 'Sport track straight'), + ('furni_divider_nor3*6_name', 'Blue Iced gate'), + ('furni_glass_chair*7_name', 'Green Glass Chair'), + ('club_confirm_gift_text', 'A new club gift has arrived. Please push OK if you want to receive it now. If you click cancel you will be asked again next time you log in to the Hotel.'), + ('furni_rubberchair*5_name', 'Lime Inflatable Chair'), + ('furni_plant_maze_snow_name', 'Snowy Maze Bundle 2'), + ('furni_table_silo_med*4_name', 'Beige Area Coffee Table'), + ('furni_solarium_norja*1_desc', 'Rejuvenate your pixels!'), + ('furni_divider_nor2*2_name', 'Black Iced bar desk'), + ('poster_45_desc', 'Needs a few more Habburgers'), + ('wallitem_habw_mirror_desc', 'Star of the show!'), + ('furni_pura_mdl3*9_name', 'Red Pura Module 3'), + ('furni_exe_corner_name', 'Executive Corner Desk'), + ('nav_venue_cunning_fox_gamehall/3_desc', 'Are you the new Deep Blue?'), + ('furni_rare_fan*7_desc', 'It\'ll blow you away!'), + ('furni_divider_nor1*5_desc', 'Pink Ice corner'), + ('wallitem_md_logo_wall_name', 'Bubble Juice Logo'), + ('furni_bardesk_polyfon_desc', 'Perfect for work or play'), + ('console_target_does_not_accept', 'This user does not accept friend requests at the moment'), + ('pet.saying.beg.croco.0', 'Mmmmmrrr'), + ('pet.saying.beg.croco.1', '*Emo tear*'), + ('messenger.email.header', ''), + ('pet.saying.beg.croco.2', 'Waarrrr...rrr'), + ('furni_carpet_polar*4_name', 'Green Bear Rug'), + ('furni_chair_plasto*6_name', 'Chair'), + ('furni_noob_rug*4_name', 'My first Habbo rug'), + ('furni_summer_chair*6_desc', 'Blue'), + ('rotate_furniture', 'Rotate Furni'), + ('poster_16_desc', 'Added security'), + ('furni_sofachair_silo*7_desc', 'Green Area Armchair'), + ('furni_divider_nor5*4_desc', 'Cool cornering for your crib!'), + ('furni_sand_cstl_twr_name', 'sand_cstl_twr'), + ('furni_safe_silo*4_name', 'Beige Safe Minibar'), + ('furni_chair_plasty*11_name', 'Plastic Pod Chair'), + ('furni_divider_arm2_name', 'Room divider'), + ('furni_sound_set_55_name', 'RnB Grooves 1'), + ('nav_venue_sw_lobby_intermediate_4_name', 'Snow Bombardiers Lobby'), + ('roomatic_canmodifysettings', '(You can change these settings later)'), + ('furni_pura_mdl5*7_desc', 'Any way you like it!'), + ('catalog_pet_name_length', 'Oops, pet\'s name is too long (max 15 characters)'), + ('furni_toy1*3_name', 'Rubber Ball'), + ('nav_venue_beauty_salon_loreal/0_desc', 'No Pixel Surgery, only natural make-ups!'), + ('furni_arabian_swords_name', 'Ancestral Scimitars'), + ('furni_summer_pool*4_name', 'Yellow Summer Pool'), + ('gs_error_create_0', 'This Lobby is full, please create a Game in another Lobby!'), + ('nav_venue_pizzeria/0_desc', 'Pizza; food of the hungry!'), + ('nav_roomnfo_hd_own', 'Own Rooms'), + ('furni_glass_sofa*4_desc', 'Translucent beauty'), + ('buddyremove_accept', 'Remove Friends'), + ('transaction_system_sms_win_orange', 'Orange SMS'), + ('gs_error_create_3', 'Your skill level isn\'t high enough for creating Games in this Lobby.'), + ('furni_goodie2_desc', 'For gourmet kittens'), + ('trading_youagree', 'You agree'), + ('furni_bench_lego_name', 'Team Bench'), + ('reg_verification_updateOK', 'Update successful'), + ('transaction_system_refunds', 'Refund'), + ('furni_carpet_standard*7_name', 'Floor Rug'), + ('poster_44_name', 'Mummy'), + ('furni_bed_polyfon_one*3_name', 'White Single Bed'), + ('furni_jp_tray1_name', 'jp_tray1'), + ('furni_jp_tatami_name', 'Small Tatami Mat'), + ('furni_bardesk_polyfon*2_name', 'Black Mode Bardesk'), + ('furni_hockey_light_desc', 'Set it off.'), + ('nav_venue_bb_lobby_intermediate_2/0_desc', ''), + ('wallitem_guitar_v_name', 'v guitar'), + ('reg_email', 'Email:'), + ('nav_venue_sw_lobby_tournament_0/0_desc', ''), + ('furni_club_sofa_name', 'Club sofa'), + ('furni_duck_name', 'Rubber Duck'), + ('furni_divider_nor5*9_name', 'Red Iced Angle'), + ('furni_smooth_table_polyfon_name', 'Large Dining Table'), + ('reg_forcedupdate', 'Please update your Habbo details!'), + ('transaction_system_stuff_store', 'Catalogue purchase'), + ('console_request_massoperation_title', 'You have %messageCount% friend requests waiting.'), + ('nav_venue_bb_lobby_expert_8/0_desc', ''), + ('roomatic_roomdescription', 'Room description:'), + ('reg_verification_invalidEmail', 'Check email address'), + ('furni_xmas_icelamp_desc', '20 lanterns for the price of 6!'), + ('wallitem_wallmirror_desc', 'Mirror, mirror on the wall...'), + ('furni_pura_mdl1*3_name', 'Black Pura Module 1'), + ('pet.saying.play.croco.1', 'Squeh Squeeeeh...'), + ('pet.saying.play.croco.0', ':)'), + ('nav_venue_theatredrome_halloween/0_desc', 'Warm welcome to Bullet For My Valentine!'), + ('nav_venue_bb_lobby_amateur_6_name', 'Gevorderden Battle Ball 7'), + ('cam_savetxt', 'Saving Photo...'), + ('nav_venue_bb_lobby_intermediate_1_name', 'Semi-profs Battle Ball 2'), + ('nav_modify_doorstatus', 'Door status'), + ('callhelp_sent', 'If you have questions about Habbo Hotel or your Habbo account, please write the details below and a member of community staff will respond as soon as possible.'), + ('wallitem_photo_name', 'Photo'), + ('poster_25_desc', 'A new use for carrots!'), + ('furni_chair_plasto*1_desc', 'Hip plastic furniture'), + ('furni_prizetrophy4*2_name', 'Fish trophy'), + ('furni_bar_armas_name', 'Barrel Minibar'), + ('nav_rooms_favourite', 'Favourites'), + ('furni_table_plasto_square*6_desc', 'Hip plastic furniture'), + ('furni_gothic_sofa*6_desc', 'The dark side of Habbo'), + ('jukebox_song_length', 'Song length: %time%'), + ('buddyremove_header', 'Choose %amount% friends to remove'), + ('furni_romantique_mirrortabl_desc', 'Get ready for your big date'), + ('wallitem_hrella_poster_2_name', 'Life Buoy'), + ('reg_boy', 'Boy'), + ('sound_machine_trax_name', 'Trax name:'), + ('purse_vouchers_error0', 'Technical error! Cannot redeem voucher.'), + ('furni_plant_valentinerose*3_name', 'Yellow Valentine Rose'), + ('purse_vouchers_error1', 'Invalid voucher code.'), + ('nav_venue_bb_lobby_expert_1_name', 'Experts Battle Ball 2'), + ('purse_vouchers_error2', 'Product delivery failed, please contact Customer Service'), + ('purse_vouchers_error3', 'This voucher must be redeemed on the Habbo website'), + ('furni_romantique_chair*2_desc', 'null'), + ('furni_prizetrophy7*1_desc', 'Gold Habbo trophy'), + ('furni_table_plasto_bigsquare*14_name', 'Occasional Table'), + ('furni_ticket_desc', 'A bundle of 5 gaming tickets'), + ('nav_venue_club_massiva_name', 'Club Massiva'), + ('roomatic_locked', 'Door locked - visitors have to ring doorbell'), + ('furni_table_silo_small*3_desc', 'For those random moments'), + ('furni_bed_trad_name', 'Plain Double Bed'), + ('summer_chair_5_name', 'Beige Deck Chair'), + ('buddyremove_select_all', 'Select All Friends'), + ('furni_plant_valentinerose*5_desc', 'For that special pixel'), + ('furni_glass_table*9_name', 'Glass table'), + ('furni_romantique_smalltabl*5_desc', 'Why is one leg different?'), + ('furni_pura_mdl5*5_name', 'beige pura module 5'), + ('poster_30_name', 'Mistletoe'), + ('furni_chair_basic*8_name', 'chair_basic'), + ('nav_venue_sw_lobby_amateur_2_name', 'Snow Slingers Lobby'), + ('Alert_ConnectionDisconnected', 'Please reload Habbo Hotel!\\r\\rIf this happens again, please wait a moment before reloading.'), + ('Alert_WrongPassword', 'Check password!'), + ('nav_modify_letothersmove', 'Let other people move and leave furniture in the room.'), + ('furni_rare_dragonlamp*1_name', 'Sea Dragon Lamp'), + ('furni_table_plasto_4leg*10_desc', 'Hip plastic furniture'), + ('furni_sound_set_28_name', 'Rock 2'), + ('furni_grand_piano*2_name', 'Black Grand Piano'), + ('furni_basket_desc', 'Eggs-actly what you want for Easter'), + ('furni_rare_fan*5_name', 'Yellow Powered Fan'), + ('furni_noob_lamp*2_name', 'My first Habbo lamp'), + ('furni_present_gen4_desc', 'What\'s inside?'), + ('furni_pillar*9_desc', 'Ancient and stately'), + ('furni_chair_norja*8_desc', 'Sleek and chic for each cheek'), + ('furni_pura_mdl2*2_desc', 'Any way you like it!'), + ('furni_glass_stool*5_desc', 'Translucent beauty'), + ('furni_hc_lmp_name', 'Oil Lamp'), + ('console_myinterests', 'My interests:'), + ('furni_val_teddy*6_desc', 'The blue bear of happiness'), + ('room_cant_set_item', 'You cannot place this in someone else\'s room!'), + ('poster_29_desc', '10 x Gold Tinsel'), + ('club_general_daysleft', 'Number of HC days left'), + ('nav_popup_nav_link', 'Open the Navigator'), + ('furni_sound_set_43_desc', 'Beware zombies!'), + ('furni_solarium_norja*6_name', 'Blue Solarium'), + ('furni_doormat_plain*1_name', 'Doormat'), + ('nav_venue_chill_name', 'Zen Garden'), + ('furni_one_way_door*5_desc', 'One at a time!'), + ('furni_table_plasto_round*3_desc', 'Hip plastic furniture?'), + ('furni_prizetrophy6_desc', 'Palkinto'), + ('furni_exe_s_table_name', 'Executive Glass Table'), + ('furni_noob_rug*5_desc', 'Nice and neat sisal rug with pink edging'), + ('furni_scifirocket*0_name', 'Mars Smoke Machine'), + ('furni_soft_jaggara_norja_desc', 'Soft Iced sofachair'), + ('nav_venue_bb_lobby_amateur_9/0_desc', ''), + ('furni_chair_plasty*5_desc', 'Hip plastic furniture'), + ('hobba_mark_emergency', 'Emergency Help'), + ('furni_djesko_turntable_name', 'Habbo Turntable'), + ('furni_shelves_norja*9_desc', 'For nic naks and art deco books'), + ('poll_confirm_cancel_long', 'Are you sure you want to stop answering the poll? You can\'t continue later.'), + ('poster_32_desc', 'The Auspicious One'), + ('opening_hours_text_opening_time', 'The Hotel will open again at %h%:%m%. We look forward to welcoming you back!'), + ('furni_bed_budget_one*7_name', 'Green Pura Bed'), + ('furni_pillow*0_desc', 'Minimalist comfort!'), + ('furni_divider_poly3*8_desc', 'Yellow Mode Bardesk Gate'), + ('nav_venue_bb_lobby_beginner_13/0_desc', ''), + ('furni_sound_set_6_name', 'Ambient 3'), + ('hubu_win', 'Bus - Info'), + ('furni_sound_machine*5_name', 'Brown Traxmachine'), + ('furni_sporttrack1*2_desc', 'null'), + ('bb_title_bouncingBall', 'Battle Ball'), + ('nav_venue_rooftop/0_desc', 'Hang out on the very rooftop of Habbo Hotel!'), + ('modtool_banreason', 'Ban Reason:'), + ('furni_chair_silo*9_desc', 'Red Silo Dining Chair'), + ('furni_bed_budget*6_desc', 'King sized comfort!'), + ('furni_s_sound_machine*4_desc', 'Sound Machine Blue Desc'), + ('furni_rubberchair*6_desc', 'Soft and tearproof!'), + ('nav_venue_sw_lobby_expert_1_name', 'Snow Marksmen Lobby'), + ('nav_venue_bb_lobby_beginner_7/0_desc', ''), + ('furni_table_plasto_4leg*5_desc', 'Hip plastic furniture'), + ('gen_youhave', 'You Have'), + ('furni_carpet_soft*6_name', 'Soft Wool Rug'), + ('furni_petfood2_desc', 'Fantastic 20% Saving!'), + ('group_privileges', 'Priviliges:'), + ('furni_samovar_name', 'Russian Samovar'), + ('furni_hal_grave_name', 'Haunted Grave'), + ('furni_bed_budget_one*2_desc', 'Princess sized comfort!'), + ('gs_error_1', 'You have entered invalid data!'), + ('reject', 'Reject'), + ('gs_error_4', 'You have reached your maximum number of daily Games!'), + ('nav_venue_sw_lobby_tournament_5_name', 'Tournament Lobby'), + ('gs_error_5', 'Tournament is only available for users living in the UK.'), + ('gs_error_2', 'You don\'t have enough Tickets!'), + ('gs_error_8', 'To start a Game, there must be at least two Teams of one player each!'), + ('sound_machine_alert_no_sound_sets', 'You don\'t have any sound sets available for song editing. \\rNote that the sets need to be in your inventory (hand).'), + ('furni_waterbowl*4_desc', 'Aqua unlimited'), + ('furni_doormat_love_desc', 'Welcome Habbos in style'), + ('gs_error_6', 'You have been removed from the Game!'), + ('furni_soft_sofachair_norja*4_desc', 'Sit back and relax'), + ('bb_powerup_desc_8', 'By using a vacuum cleaner, you can clear any tile in the field.'), + ('move', 'Move'), + ('furni_romantique_smalltabl*3_name', 'Turquoise Tray Table'), + ('furni_bed_polyfon*8_name', 'Yellow Mode Double Bed'), + ('furni_sofachair_polyfon*4_desc', 'Beige Mode Armchair'), + ('forgottenpw_email', 'Your email address'), + ('console_email', 'Email'), + ('bb_powerup_desc_1', 'Light bulb colours an area around it.'), + ('furni_divider_nor2_desc', 'Strong, yet soft looking'), + ('furni_bardeskcorner_polyfon*5_desc', 'For sweet corners!'), + ('say', 'Say'), + ('bb_powerup_desc_3', 'Flashlight colours a straight line ahead of you.'), + ('bb_powerup_desc_2', 'Bouncing on a spring locks tiles in a single jump.'), + ('bb_powerup_desc_5', 'Bouncing on a box of pins will burst your Battle Ball!'), + ('bb_powerup_desc_4', 'A shot with a cannon locks tiles on a straight line.'), + ('furni_chair_basic*1_name', 'chair_basic'), + ('bb_powerup_desc_7', 'A bomb will clear all tiles around it.'), + ('bb_powerup_desc_6', 'Harlequin effect makes everybody colour tiles for your team!'), + ('NUF_console_read_next', 'Click \'OK\' to mark message as read.'), + ('poster_50_name', 'Bat Poster'), + ('furni_table_plasto_4leg*15_name', 'Occasional Table'), + ('furni_tree7_desc', 'Walking in a winter wonderland!'), + ('poster_37_name', 'The Habbo Babes 3'), + ('furni_queue_tile1*7_desc', 'The power of movement'), + ('furni_bed_budgetb_name', 'Plain Double Bed'), + ('interface_icon_sound', 'Sound Off/On'), + ('pet.hotwords.come_here', 'come here'), + ('poster_10_name', 'Lapland Poster'), + ('win_delete_item', 'Remove Item'), + ('wallitem_hrella_poster_3_name', 'Anchor'), + ('furni_table_plasto_bigsquare*8_desc', 'Hip plastic furniture'), + ('furni_habboween_grass_name', 'Unholy Ground'), + ('furni_plant_valentinerose*4_name', 'Pink Valentine\'s Rose'), + ('nav_venue_skylight_lobby/0_desc', 'Lift your spirits on the top floor'), + ('buddyremove_alphabetical', 'Alphabetical Order'), + ('alert_win_coppa', 'You are blocked'), + ('nav_venue_bb_lobby_amateur_5_name', 'Gevorderden Battle Ball 6'), + ('reg_update_text', 'Never change your password or email just because somebody asks you to. He / she is most probably trying to steal your Habbo account and furni!'), + ('decision_ok', 'OK'), + ('furni_summer_grill*3_name', 'Yellow Barbeque Grill'), + ('nav_public_helptext', 'These are hotel\'s public rooms. What are you waiting for? Go and meet other Habbos!'), + ('tickets_button_info_2', 'Stuff you can do with these 20 tickets'), + ('furni_rclr_chair_name', 'Palm Chair'), + ('login_create1here', 'You can create one here.'), + ('tickets_button_info_1', 'Stuff you can do with these 2 tickets'), + ('furni_prizetrophy6*3_name', 'Champion trophy'), + ('furni_shelves_norja*2_desc', 'For nic naks and art deco books'), + ('purse_info', 'DESCRIPTION'), + ('bb_choose_powerups', 'Powerup select'), + ('purse_transaction', 'View Transactions'), + ('reg_birthdayformat', 'Birthday*: [dd][mm][yyyy]'), + ('Alert_YouMustAgree', 'You must accept the Terms and Conditions before proceeding.'), + ('jukebox_empty', 'Empty'), + ('purse_info_film', 'Films For Camera'), + ('furni_sofachair_polyfon*9_desc', 'Loft-style comfort'), + ('furni_habbocake_desc', 'Save me a slice!'), + ('furni_doormat_plain*6_desc', 'Available in a variety of colours'), + ('nav_venue_sun_terrace/0_desc', 'For lazy afternoons and super tan treatment!'), + ('poster_501_desc', 'For pirates everywhere'), + ('pet_thir_2', 'Thirsty'), + ('gs_error_watch_0', 'All The Spectator Seats Are Taken!'), + ('pet_thir_3', 'Not thirsty'), + ('camera_open_dialog_text', 'Would you like to take some photos\\ror put your camera in your room?'), + ('furni_bed_budget_one*9_desc', 'Prince sized comfort!'), + ('ph_goswimming', 'Go swimming!'), + ('furni_habboween_crypt_name', 'Creepy Crypt'), + ('gs_error_join_7', 'You have already joined this Game!'), + ('nav_venue_sw_lobby_amateur_3_name', 'Snow Slingers Lobby'), + ('furni_romantique_smalltabl*4_name', 'Amber Tray Table'), + ('gs_error_join_3', 'You either have too much or too little skill to join.'), + ('pet_thir_0', 'Gasping'), + ('gs_error_join_0', 'The team you selected is already full.'), + ('pet_thir_1', 'Parched'), + ('furni_gothic_stool*3_name', 'Gothic Stool Red'), + ('furni_wooden_screen*1_name', 'Pink Oriental screen'), + ('furni_sofa_silo*4_name', 'Beige Area Sofa'), + ('furni_queue_tile1*2_desc', 'The power of movement'), + ('buddyremove_continue', 'Remove Friend Now'), + ('nav_venue_bb_lobby_expert_2/0_desc', ''), + ('nav_loading', 'Loading...'), + ('furni_bed_armas_two_name', 'Double Bed'), + ('furni_prizetrophy4*1_name', 'Fish trophy'), + ('furni_sound_machine*7_desc', 'Red alert. Red alert. It\'s a party!'), + ('furni_glass_sofa_desc', 'Translucent beauty'), + ('furni_barchair_silo*5_name', 'Pink Bar Stool'), + ('furni_soft_sofachair_norja*5_desc', 'Pink Iced Sofachair'), + ('console_fr_accepted_count', 'Amount to be accepted'), + ('poster_2001_desc', 'Perinteinen ryijy,'), + ('furni_couch_norja*5_desc', 'Two can perch comfortably'), + ('furni_rclr_lamp_desc', 'Light your space'), + ('furni_sand_cstl_wall_desc', 'sand_cstl_wall'), + ('furni_one_way_door*4_name', 'Beige One Way Gate'), + ('furni_corner_china_name', 'Dragon Screen'), + ('nav_venue_sw_lobby_amateur_4/0_desc', 'Astetta rankempaa lumisotaa.'), + ('furni_chair_silo*7_name', 'Green Silo Dining Chair'), + ('transaction_system_messenger', 'Console SMS'), + ('furni_pura_mdl4*8_desc', ''), + ('console_reject_selected', 'Reject selected'), + ('furni_rare_icecream*4_desc', 'Virtual strawberry rocks!'), + ('furni_prizetrophy*2_desc', 'Shiny silver'), + ('furni_scifiport*0_desc', 'Energy beams. No trespassers!'), + ('paalu_ui2', 'Push'), + ('paalu_ui3', 'Moving'), + ('paalu_ui4', 'Stabilise'), + ('paalu_ui5', 'Balance'), + ('furni_sofa_polyfon*7_name', 'Green Mode Sofa'), + ('nav_error_toomanyfavrooms', 'You can\'t have more than 10 favourite rooms! Please remove an old favourite if you want to add a new one.'), + ('furni_noob_stool*5_name', 'My first Habbo stool'), + ('sound_machine_alert_missing_packages', 'You need the following Traxpacks to edit this song:'), + ('furni_grunge_bench_name', 'Bench'), + ('paalu_ui1', 'Balance'), + ('furni_sleepingbag*5_name', 'Graphite Sleeping Bag'), + ('furni_divider_nor2*3_name', 'White Iced Bar-Desk'), + ('bb_header_teams', 'Teams'), + ('wallitem_sw_swords_name', 'Swords'), + ('furni_val_choco_desc', 'One for them. Two for me!'), + ('nav_venue_bb_lobby_expert_5/0_desc', ''), + ('furni_soft_sofa_norja*2_name', 'Black Iced Sofa'), + ('furni_bed_budgetb_one_desc', 'All you need for a good night\'s kip'), + ('furni_carpet_standard*8_name', 'Floor Rug'), + ('furni_rare_dragonlamp*6_name', 'Gold Dragon Lamp'), + ('furni_sound_set_56_desc', 'Get down tonight!'), + ('furni_divider_nor5*2_name', 'Black Iced Angle'), + ('chat.curse_word', 'Bobba'), + ('furni_couch_norja*4_desc', 'Two can perch comfortably'), + ('furni_scifirocket*2_desc', 'A little closer to home!'), + ('furni_rare_fan*6_desc', 'It\'ll blow you away!'), + ('poster_514_name', 'The EU flag'), + ('club_desc_2_period', '3 Months (93 days) = 60 Credits'), + ('furni_glass_chair*9_desc', 'Translucent beauty'), + ('poster_1338_desc', 'If her age on the clock, she ready for the cock'), + ('nav_src_hd', 'Search Results.'), + ('console_unknown_sender', 'Unknown sender'), + ('furni_prizetrophy4_name', 'Pokaali'), + ('nav_venue_sunset_cafe/0_desc', 'Come and chat about Official Fansites and meet their staff!'), + ('furni_pura_mdl4*9_desc', 'Any way you like it!'), + ('furni_pillar*8_name', 'Roman Pillar'), + ('nav_venue_sport/0_desc', 'St Trinian\'s is out on DVD April 14th!'), + ('furni_pillar*7_name', 'Atlantean Pillar'), + ('club_extend_text', 'If you\'re subscribing again to Habbo Club, you won\'t lose any of the advantages or ongoing furni gifts. Club membership can be extended in advance.\\rRemember: one club month lasts 31 days.'), + ('sound_machine_confirm_eject', 'Remove cartridge?'), + ('shopping_got', 'You have xx in your Purse.'), + ('furni_rare_stand_desc', 'Stand and Deliver!'), + ('furni_chair_plasto_desc', 'Hip plastic furniture'), + ('furni_bed_polyfon_one*9_desc', 'Cot of the artistic'), + ('furni_couch_norja*9_name', 'Red Bench'), + ('poster_3_desc', 'Smells fishy, looks cool'), + ('paalu.winner', 'Winner:'), + ('NUF_meeting_people_room_wave', 'These buttons let you wave and dance. Click on your Habbo at anytime to see these buttons.'), + ('sound_machine_confirm_window', 'Sound Machine'), + ('furni_one_way_door*3_name', 'White HC Gate'), + ('furni_chair_plasty*9_name', 'Plastic Pod Chair'), + ('gs_timeleft', 'Time Left \\x'), + ('hobba_pickup', 'Pick Up'), + ('console_lastvisit', 'Last Visit'), + ('furni_rare_globe_desc', 'It\'s all white..'), + ('furni_val_cauldron_name', 'Valentine\'s Cauldron'), + ('poster_43_name', 'Chains'), + ('furni_bardesk_polyfon*8_desc', 'Yellow Mode Bardesk'), + ('furni_sound_set_36_name', 'Latin Love 1'), + ('dimmer_apply', 'Apply'), + ('furni_glass_chair*8_desc', 'Translucent beauty'), + ('furni_pura_mdl2*7_desc', 'Any way you like it!'), + ('furni_prizetrophy*3_desc', 'Breathtaking bronze'), + ('furni_marquee*1_name', 'Pink marquee'), + ('NUH_own_user', 'This is your Habbo. Click on the floor to move around.'), + ('furni_gothic_sofa*1_desc', 'The dark side of Habbo'), + ('furni_divider_nor5*3_name', 'White Iced Angle'), + ('furni_divider_nor4*5_name', 'Pink Iced Auto Shutter'), + ('furni_soft_sofa_norja*3_name', 'White Iced Sofa'), + ('furni_sofachair_silo*8_desc', 'Large, but worth it'), + ('furni_pura_mdl1*9_desc', 'Any way you like it!'), + ('furni_chair_plasto*7_name', 'Chair'), + ('furni_pura_mdl5*6_desc', 'Any way you like it!'), + ('emailpw', 'Send'), + ('sound_machine_playlist_window', 'Traxmachine Playlist Editor'), + ('furni_pura_mdl1*3_desc', 'Any way you like it!'), + ('furni_noob_table*5_desc', 'Lightweight, practical and pink'), + ('furni_scifirocket*6_name', 'Mercury Smoke Machine'), + ('furni_shelves_norja_name', 'Bookcase'), + ('poster_521_name', 'Flag of Brazil'), + ('sound_machine_jukebox_disk_window', 'Insert disc'), + ('furni_table_norja_med*6_desc', 'For larger gatherings'), + ('furni_pillow*6_name', 'Blue Cotton Pillow'), + ('furni_shelves_norja*3_desc', 'For nic naks and art deco books'), + ('queue_set.s.info', 'There are %d% Habbos in front of you in the queue to see the Habbo Live broadcast!'), + ('reg_parentemail_info', 'Because of your age, we need to let your parents know you are registering at Habbo Hotel. Please give the email address of one of your parents/guardians.'), + ('club_txt_paycash', 'Pay by Cash'), + ('furni_chair_plasto*11_name', 'Chair'), + ('furni_pizza_name', 'Pizza Box'), + ('furni_table_plasto_4leg*6_desc', 'Hip plastic furniture'), + ('furni_chair_silo*3_desc', 'Keep it simple'), + ('alert_reg_t', 'Please check these details:'), + ('nav_venue_theatredrome_name', 'Theatredrome'), + ('furni_hc_rntgn_desc', 'Believe it or not!'), + ('nav_venue_main_lobby_name', 'Main Lobby'), + ('furni_sound_set_64_desc', 'Make a little Jinn-gle!'), + ('nav_venue_sw_lobby_amateur_desc', 'Practice improves a Snow Stormer\'s aim... Ops, missed!'), + ('furni_scifiport*5_name', 'Security Fence'), + ('furni_lamp_basic_desc', 'Switch on the atmosphere with this sophisticated light'), + ('pet.saying.sniff.cat.0', 'snuh..snuh'), + ('poster_506_name', 'The flag of Finland'), + ('furni_bardeskcorner_polyfon*6_desc', 'Blue Mode Bardesk Corner'), + ('nav_venue_hotel_kitchen_name', 'Hotel Kitchen'), + ('furni_doorB_desc', 'Narnia this way!'), + ('poster_11_name', 'Certificate'), + ('furni_safe_silo_desc', 'Totally shatter-proof!'), + ('furni_bed_budget_one*3_desc', 'Prince sized comfort!'), + ('furni_romantique_divider*4_name', 'Ochre Screen'), + ('previous_onearrowed', '< Previous'), + ('nav_venue_bb_lobby_tournament_3_name', 'Competitie Battle Ball 4'), + ('furni_plant_sunflower_desc', 'For happy Habbos'), + ('furni_throne_desc', 'Important Habbos only'), + ('furni_exe_bardesk_name', 'Executive Bar Desk'), + ('furni_tree6_desc', 'The future\'s bright!'), + ('log_problem_title', 'Problems Connecting'), + ('furni_chair_basic*2_name', 'Pink Pura Egg Chair'), + ('game_chess_black', 'Black:'), + ('furni_glass_sofa*9_name', 'Glass sofa'), + ('furni_chair_norja*2_desc', 'Sleek and chic for each cheek'), + ('furni_pillar*3_desc', 'Ancient and stately'), + ('furni_scifidoor*8_desc', 'There out of this world!'), + ('alert_InvalidUserName', 'Don\'t use this character: \\x !'), + ('furni_rare_parasol*3_name', 'Violet Parasol'), + ('furni_bed_budget*5_desc', 'King sized comfort!'), + ('furni_chair_silo*8_name', 'Yellow Dining Chair'), + ('nav_tryingpw', 'Trying the password...'), + ('furni_cn_lamp_desc', 'Light of the East'), + ('furni_prizetrophy3*3_name', 'Globe trophy'), + ('furni_sound_set_16_desc', 'Ferry, ferry good!'), + ('furni_table_plasto_round*4_desc', 'Hip plastic furniture'), + ('poster_2007_desc', 'The legendary founder of the Hotel'), + ('sound_machine_insert', 'Add to mixer'), + ('furni_sound_machine*1_desc', 'Let the party begin!'), + ('furni_bed_polyfon_one*8_desc', 'Yellow Mode Single Bed'), + ('error_room_closed', 'Huone on suljettu.'), + ('pet.hotwords.play_dead', 'play dead'), + ('gs_button_go_finished', 'Scores'), + ('group_member', 'Member'), + ('sound_machine_confirm_save', 'Save the song?'), + ('furni_arabian_wndw_desc', 'Arabian days and nights'), + ('nav_venue_sw_lobby_expert_2_name', 'Snow Marksmen Lobby'), + ('furni_sound_set_57_desc', 'Feel the groove'), + ('furni_triplecandle_desc', 'No need to worry about wax drips'), + ('char_welcome', 'Welcome!'), + ('furni_sound_machine*6_desc', 'Add some effects to your room!'), + ('furni_sofachair_polyfon*3_desc', 'Loft-style comfort'), + ('nav_venue_bb_lobby_amateur_6/0_desc', ''), + ('group_logo_url_template', 'http://www.habbohotel.co.uk/habbo-imaging/badge-fill/%imagerdata%.gif'), + ('furni_table_plasto_bigsquare*2_desc', 'Hip plastic furniture'), + ('furni_glass_table*5_desc', 'Translucent beauty'), + ('url_purse_link', 'http://%predefined%//credits?'), + ('buddyremove_logintime', 'Last Login Time'), + ('NUF_meeting_people_hotelview_tutor', 'The Navigator lets you move between rooms in the Hotel, so open it up to get started!'), + ('furni_sofa_polyfon*6_name', 'Blue Mode Sofa'), + ('furni_scifirocket*1_desc', 'There is always space for this!'), + ('nav_venue_bb_lobby_amateur_10/0_desc', ''), + ('furni_prizetrophy5_name', 'Pokaali'), + ('purse_info_tickets', 'Gaming Tickets'), + ('poster_513_name', 'The Australian flag'), + ('furni_noob_chair*3_desc', 'Lightweight, practical, with red stripes'), + ('alert_old_client', 'You have an old version cached. Please empty your browser cache and login again.'), + ('furni_bar_basic_name', 'A Pura Minibar'), + ('furni_shelves_norja*8_desc', 'For nic naks and art deco books'), + ('sound_machine_save_window', 'Save your Trax'), + ('poster_51_name', 'Basketball Hoop'), + ('Alert_moderator_warning', ''), + ('furni_solarium_norja*5_name', 'Pink Solarium'), + ('furni_sporttrack2*1_desc', 'null'), + ('furni_rubberchair*7_desc', 'Soft and tearproof!'), + ('reg_parentemail_moreinfo', 'More information:'), + ('furni_present_gen5_desc', 'What\'s inside?'), + ('furni_bed_polyfon*9_desc', 'Give yourself space to stretch out'), + ('sound_machine_confirm_save_list_long', 'Are you sure you want to overwrite the current playlist?'), + ('cam_zoom_in.help', 'Zoom In'), + ('furni_carpet_soft*5_name', 'Soft Wool Rug'), + ('furni_plant_small_cactus_name', 'Small Cactus'), + ('console_creatingaprofile', 'Creating A Profile'), + ('console_select_all', 'Select all'), + ('hobba_reply_cfh', 'Reply to:'), + ('notickets_buygame', 'Buy a game'), + ('furni_sporttrack1*3_desc', 'null'), + ('furni_sleepingbag*1_desc', 'Ultimate coziness'), + ('furni_gothic_stool*4_name', 'Black Gothic Stool'), + ('nav_venue_bb_lobby_beginner_4/0_desc', ''), + ('nav_venue_netcafe/0_desc', 'Learn a foreign language and win Habbo Credits in our quests!'), + ('poster_31_desc', 'Pure and unbridled nu-metal'), + ('furni_sound_set_24_desc', 'It\'s all about the Pentiums, baby!'), + ('pet.saying.angry.dog.3', 'dog.1=Oouh..oouh..snuh..ooo'), + ('furni_bed_budget_one*8_desc', 'Prince sized comfort!'), + ('pet.saying.angry.dog.4', 'ARRR Grrr.. woof woof woof'), + ('pet.saying.angry.dog.1', 'Woof! Grrrr..woof woof'), + ('furni_sw_table_desc', ''), + ('pet.saying.angry.dog.2', 'grRRRRrr.r...r'), + ('pet.saying.angry.dog.0', 'Rrrr..woof.. Rrr'), + ('furni_chair_china_name', 'Chinese Lacquer Chair'), + ('furni_romantique_divan*2_desc', 'Recline in continental comfort'), + ('furni_divider_silo1*6_desc', 'Blue Area Corner Shelf'), + ('furni_sound_set_5_name', 'Ambient 4'), + ('roomevent_browser_create', 'Host an event'), + ('furni_noob_rug*6_desc', 'Nice and neat sisal rug with green edging'), + ('transaction_system_bank_luottokunta', 'Luottokortti'), + ('furni_bed_armas_one_name', 'Single Bed'), + ('furni_plant_fruittree_desc', 'Great yield and sweet fruit'), + ('furni_sound_machine_pro_desc', 'creating fancy sounds'), + ('nav_ownrooms_helptext', 'If you didn\'t know, these are your rooms. Here you can modify your rooms or create new ones if you feel like it.'), + ('furni_grunge_radiator_desc', 'Started cool but now it\'s hot!'), + ('furni_divider_silo3*7_desc', 'Green Area Gate'), + ('room_hold', 'Wait a second...\\rLoading room...'), + ('furni_sound_set_49_desc', 'You will belong'), + ('nav_venue_emperors/0_desc', 'Even the smallest of light... shines in the darkness'), + ('furni_nest_name', 'Basket'), + ('furni_noob_table*4_name', 'My first Habbo table'), + ('furni_sound_set_51_desc', 'Bop to the beat'), + ('furni_plant_maze_snow_desc', '20 x Snowy Maze Shrubbery'), + ('NUF_meeting_people_hotelview_icon', 'Click the Navigator button to start visiting the rooms!'), + ('furni_scifirocket*7_desc', 'Larger than life!'), + ('furni_table_plasto_round*9_name', 'Round Dining Table'), + ('furni_val_teddy*5_name', 'Yellow Share Bear'), + ('nav_venue_bb_lobby_expert_2_name', 'Experts Battle Ball 3'), + ('console_onfrontpage', 'Online'), + ('poster_1000_desc', 'The Noble and Silver Show'), + ('furni_rare_icecream*9_name', 'Bubblegum Ice Cream Machine'), + ('furni_rare_fan*0_name', 'Festive Fan'), + ('furni_carpet_polar_name', 'Faux-Fur Bear Rug'), + ('hobba_chatlog', 'See Chat Log >>'), + ('furni_romantique_chair*3_desc', 'null'), + ('hobba_pickedby', 'Picked Up By:'), + ('poster_24_desc', 'Trying to get in or out?'), + ('furni_table_silo_small*2_desc', 'For those random moments'), + ('furni_table_plasto_bigsquare*15_name', 'Occasional Table'), + ('furni_prizetrophy7*2_desc', 'Silver Habbo trophy'), + ('ph_keys_run', 'Run:'), + ('error_title', 'Oops, error!'), + ('furni_rare_dragonlamp*0_name', 'Fire Dragon Lamp'), + ('furni_CFC_50_coin_silver_name', 'Silver Coin (China)'), + ('furni_chair_plasty_name', 'Plastic Pod Chair'), + ('nav_roomInfo', 'Room info'), + ('furni_sound_set_63_name', 'Alhambra Trax 2'), + ('furni_divider_nor2*9_desc', 'Red Iced bar desk'), + ('furni_soft_sofa_norja*8_name', 'Yellow Iced Sofa'), + ('poster_57_desc', 'chinese calligraphy'), + ('furni_table_plasto_4leg*16_name', 'Occasional Table'), + ('accept', 'Accept'), + ('pet.saying.beg.cat.2', 'MEOW, MEOW, MEOW..'), + ('furni_waterbowl*3_desc', 'Aqua unlimited'), + ('furni_divider_poly3*2_name', 'Black Mode Bardesk Gate'), + ('furni_divider_nor3_desc', 'Do go through...'), + ('furni_table_plasto_square*5_desc', 'Hip plastic furniture'), + ('furni_rubberchair*1_desc', 'Soft and stylish HC chair'), + ('furni_divider_nor5*8_name', 'Yellow Iced Angle'), + ('furni_pura_mdl4*3_desc', 'Any way you like it!'), + ('nav_removerights_desc', 'Remove all rights to this room from other users.'), + ('furni_chair_norja*7_name', 'Rural Chair'), + ('furni_pillar*2_name', 'Nordic Pillar'), + ('furni_bed_polyfon*3_name', 'White Double Bed'), + ('furni_glass_chair*3_desc', 'Translucent beauty'), + ('wallitem_xmas_light_name', 'Xmas light'), + ('pet.saying.beg.cat.0', 'MaUUU...MEOW...meow'), + ('pet.saying.beg.cat.1', '*looks up with sad eyes*'), + ('reg_verification_newEmail', 'Your new email address:'), + ('furni_sound_set_29_desc', 'Electronic house'), + ('furni_joulutahti_desc', 'Christmas in a pot'), + ('furni_china_table_name', 'Chinese Lacquer Table'), + ('poster_507_desc', 'The French flag'), + ('NUF_visiting_rooms_hotelview_nav', 'Click the icon to open the Navigator.'), + ('dimmer_preset_1', 'Preset 1'), + ('nav_private_helptext', 'These are the rooms owned by Habbos. Select a category first and then browse some rooms and meet some people!'), + ('furni_queue_tile1*8_desc', 'The power of movement'), + ('dimmer_preset_2', 'Preset 2'), + ('furni_arabian_pllw_name', 'Green Blossom Pillow'), + ('nav_venue_bb_lobby_tournament_7/0_desc', ''), + ('furni_goodie1*1_desc', 'Crunchy Dog Treat'), + ('poster_36_name', 'The Habbo Babes 2'), + ('poll_window', 'Question'), + ('furni_md_limukaappi_desc', 'A sparkling and refreshing pixel drink!'), + ('nav_venue_rooftop_rumble_ii_name', 'Rooftop Rumble II'), + ('furni_wooden_screen*7_name', 'Purple Oriental Screen'), + ('furni_scifidoor*2_name', 'Yellow Spaceship Door'), + ('room_max_pet_limit', 'Too many pets in the room!'), + ('hobba_sent_to_helpers', 'Call re-assigned as emergency and sent to moderators'), + ('furni_table_silo_med*4_desc', 'Beige Area Coffee Table'), + ('furni_romantique_pianochair*5_name', 'Onyx Piano Stool'), + ('nav_modify_roomdescription', 'Room Description'), + ('furni_sound_set_10_name', 'Hip Hop Beats 1'), + ('furni_chair_silo*2_name', 'Black Dining Chair'), + ('furni_marquee*6_name', 'Blue Marquee'), + ('poster_8_name', 'Habbo Colours'), + ('transaction_system_htk_singledrop', 'Landline'), + ('furni_chair_plasty*4_desc', 'Hip plastic furniture'), + ('dimmer_preset_3', 'Preset 3'), + ('furni_exe_corner_desc', 'Tuck it away'), + ('nav_venue_welcome_lounge/0_desc', 'New? Lost? Get a warm welcome here from Habbo eXperts.'), + ('furni_sleepingbag*6_desc', 'Ultimate coziness'), + ('nav_venue_cunning_fox_gamehall/3_name', 'Batleships'), + ('console_mainhelp', 'Habbo Console Help'), + ('tickets_button_info_hide', 'Hide Ticket Info'), + ('furni_xmas_icelamp_name', 'Lantern Bundle 2'), + ('nav_venue_bb_lobby_amateur_0/0_desc', ''), + ('purse_header', 'Habbo Purse'), + ('furni_noob_lamp*3_name', 'My first Habbo lamp'), + ('nav_help_title', 'Want a room of your own?'), + ('buy', 'Buy'), + ('furni_pura_mdl1*8_name', 'yellow pura module 1'), + ('dimmer_title', 'Mood Light'), + ('NUF_mini_meet_people_hotelview_icon', 'Click the Navigator button to start visiting the rooms!'), + ('console_credits', 'Credits'), + ('bb_link_highScores_url', 'http://%predefined%/groups/56552/id'), + ('wallitem_md_logo_wall_desc', 'Bubble up your wall'), + ('furni_safe_silo*4_desc', 'Totally shatter-proof!'), + ('room_unignore', 'Listen'), + ('nav_venue_sw_lobby_amateur_1/0_desc', ''), + ('poster_16_name', 'Bars'), + ('furni_sofachair_silo*7_name', 'Green Area Armchair'), + ('furni_spyro_name', 'Dragon Egg'), + ('nav_venue_bb_lobby_beginner_19/0_desc', ''), + ('Alert_YourPasswordIsTooShort', 'Passwords must be at least 6 characters long.'), + ('room_cant_trade', 'You cannot trade this!'), + ('furni_door_desc', 'Dr Who?'), + ('gs_button_go_created', 'Join'), + ('poster_49_name', 'Large silver star'), + ('furni_glass_sofa*4_name', 'Glass sofa'), + ('furni_divider_arm3_desc', 'Knock, knock...'), + ('furni_sound_set_31_desc', 'House loops'), + ('reg_habboname', 'Habbo name:'), + ('habboclub_thanks', 'Yippee! You are now a member of Habbo Club! Your current email address is %email%. \\r\\rIf that\'s not the one you are using, please go to \'Update my Habbo ID\' and change it now. \\rThen we can contact you about your membership if need be.'), + ('console_follow_offline', 'Your friend is offline.'), + ('furni_divider_nor1*5_name', 'Pink Ice corner'), + ('nav_openbutton', 'Open'), + ('nav_venue_theatredrome_habbowood/0_desc', 'Home to the Habbowood Gala and HAFTA Awards!'), + ('nav_venue_ice_cafe/0_desc', 'Come here. And chill out.'), + ('furni_calippo_name', 'Calippo icecream machine'), + ('furni_bench_lego_desc', 'For your reserve players'), + ('poster_9_desc', 'Do your bit for the environment'), + ('furni_bed_polyfon_one*3_desc', 'Cot of the artistic'), + ('poster_44_desc', 'Beware the curse...'), + ('poster_2006_name', 'DJ Throne'), + ('furni_pura_mdl3*5_desc', ''), + ('furni_arabian_tray4_name', 'Fruit Tray'), + ('furni_divider_nor3*7_desc', 'Entrance or exit?'), + ('furni_sound_set_30_name', 'Instrumental 1'), + ('furni_romantique_tray1_name', 'Breakfast Tray'), + ('furni_jp_tray1_desc', 'jp_tray1'), + ('furni_plant_maze_desc', 'Build your maze!'), + ('console_getfriendrequest_2', 'If you accept this invitation (s)he will be added to your Friends List. Then you can send messages to each other.'), + ('furni_hockey_light_name', 'Lert'), + ('furni_goodie1_desc', 'Crunchy Dog Treat'), + ('console_getfriendrequest_1', 'has asked you to become his/her Friend.'), + ('furni_pura_mdl2*1_desc', 'Any way you like it!'), + ('score_board.text', 'POINTS'), + ('furni_one_way_door*9_name', 'Red One Way Gate'), + ('furni_sand_cstl_twr_desc', 'sand_cstl_twr desc'), + ('furni_divider_nor5*9_desc', 'Cool cornering for your crib y0!'), + ('furni_duck_desc', 'Every bather needs one'), + ('furni_bardesk_polyfon*2_desc', 'Black Mode Bardesk'), + ('console_request_2', '(S)he will be added into your Friends List if (s)he accepts it.'), + ('bb_link_join', 'Join Team'), + ('nav_createroom_hd', 'Here you can create your own room!'), + ('console_request_1', 'has been sent your Friend Request.'), + ('reg_check_info', 'CHECK YOUR INFO'), + ('furni_toy1*4_name', 'Rubber Ball'), + ('nav_venue_sw_lobby_free_0_name', 'Free Game Lobby'), + ('furni_chair_plasto*1_name', 'Chair'), + ('furni_toilet_name', 'Loo Seat'), + ('queue_set.dc.info', 'Number of Habbos in default queue is %d% and in Habbo Club queue %c%'), + ('furni_sofachair_silo*2_desc', 'Large, but worth it'), + ('furni_chair_plasto*12_desc', 'Hip plastic furniture'), + ('ph_tickets_buyfor', 'Buy Tickets for:'), + ('sound_machine_confirm_close', 'Close the editor?'), + ('furni_rare_fan*1_desc', 'It\'ll blow you away!'), + ('furni_divider_poly3*3_desc', 'Border control!'), + ('nav_venue_kattoterassi/0_desc', 'When push comes to shove...'), + ('furni_summer_grill*4_desc', 'Plenty of burgers on that barbie'), + ('furni_bar_armas_desc', 'It\'s a barrel of laughs and a great talking point'), + ('furni_toilet_red_name', 'Loo Seat'), + ('furni_hc_lmp_desc', 'Be enlightened'), + ('furni_romantique_mirrortabl_name', 'Dressing Table'), + ('furni_pura_mdl4*2_name', 'Pink Pura Module 4'), + ('summer_chair_5_desc', 'Enjoy the summer air'), + ('furni_plant_rose_desc', 'Sleek and chic'), + ('furni_skullcandle_name', 'Skull Candle Holder'), + ('Alert_no_credits', 'You don�t have enough Credits for this.'), + ('pet.hotwords.voice', 'speak'), + ('furni_prizetrophy4*2_desc', 'Shiny silver'), + ('furni_soft_sofachair_norja*4_name', 'Urban Iced Sofachair'), + ('furni_pura_mdl5*1_desc', 'Any way you like it!'), + ('furni_safe_silo*9_name', 'Red Safe Minibar'), + ('furni_bed_trad_desc', 'Sweet dreams for two'), + ('nav_venue_club_massiva_desc', 'Strut your funky stuff!'), + ('furni_rare_dragonlamp*1_desc', 'Out of the deep blue!'), + ('furni_wooden_screen*2_desc', 'Add an exotic touch to your room'), + ('furni_prizetrophy7*1_name', 'Gold Habbo trophy'), + ('furni_carpet_standard*2_name', 'Floor Rug'), + ('furni_arabian_teamk_desc', 'Quench that desert thirst'), + ('furni_romantique_chair*2_name', 'Lime Romantique Chair'), + ('nav_venue_sw_lobby_tournament_0_name', 'Tournament Lobby'), + ('invitation_expired', 'Sorry, all Welcoming Party members were busy.'), + ('gs_error_game_checkname', 'Please check the Game\'s name!'), + ('furni_sound_set_23_name', 'SFX 4'), + ('furni_grand_piano*2_desc', 'Black Grand Piano'), + ('tutorial_quit', 'Close guide'), + ('furni_chair_basic*8_desc', ''), + ('NUF_getting_room_roommatic_security_tutor', 'Finally you can choose the security settings to your room and whether other users can move your furniture.'), + ('nav_venue_bb_lobby_beginner_1/0_desc', ''), + ('nav_private_helptext_hd_main', 'Habbo Guest Rooms'), + ('club_price', 'One month costs 25 Habbo Credits.'), + ('NUF_playing_games_navigator_tutor', 'Click either SnowStorm or BattleBall to open up a list of the game lounges.'), + ('nav_venue_old_skool_name', 'Old Skool Habbo'), + ('nav_venue_bb_lobby_beginner_4_name', 'Beginners Battle Ball 5'), + ('nav_venue_bb_lobby_tournament_9_name', 'Competitie Battle Ball 10'), + ('sound_machine_alert_song_saved', 'Song "%name%" successfully saved.'), + ('nav_venue_sw_lobby_intermediate_3_name', 'Snow Bombardiers Lobby'), + ('nav_venue_club_massiva/1_desc', 'Strut your funky stuff'), + ('furni_gothic_chair*1_name', 'Gothic Chair Pink'), + ('furni_divider_poly3_desc', 'All bars should have one'), + ('furni_romantique_divan*1_name', 'Pink Romantique Divan'), + ('NUF_playing_games_hotelview_tutor', 'Now we find out where to locate the Habbo Games!'), + ('poster_29_name', 'Gold Tinsel Bundle'), + ('furni_present_gen4_name', 'Gift'), + ('furni_bardesk_polyfon*7_name', 'Green Mode Bardesk'), + ('furni_gothic_sofa*6_name', 'Gothic Sofa Blue'), + ('furni_glass_stool*5_name', 'Glass stool'), + ('nav_venue_sw_lobby_free_5/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('nav_fav_hd', 'Your Favourite Rooms.'), + ('NUF_console_read_tutor', 'The Habbo Console lets you message your Habbo friends, and check whether they are online.'), + ('furni_romantique_tray2_desc', 'Spoil Yourself'), + ('Alert_ModeratorWarning', 'Message from a Moderator:'), + ('furni_giftflowers_name', 'Vase of Flowers'), + ('furni_table_silo_small*7_name', 'Green Area Occasional Table'), + ('furni_menorah_name', 'Menorah'), + ('furni_bed_polyfon_one*2_name', 'Black Mode Single Bed'), + ('console_offline', 'Offline'), + ('gs_mouseover_player', '\\x\\r\\yp'), + ('nav_venue_bb_lobby_amateur_3/0_desc', ''), + ('nav_venue_bb_lobby_amateur_13/0_desc', ''), + ('furni_noob_chair*2_name', 'My first Habbo chair'), + ('furni_doormat_plain*1_desc', 'Available in a variety of colours'), + ('object_displayer_hide_tags', 'Hide tags'), + ('poster_17_desc', 'Beautiful reproduction butterfly'), + ('gs_joinedplayers', 'Players Who Joined: \\x'), + ('furni_table_plasto_round*3_name', 'Round Dining Table'), + ('furni_divider_poly3*8_name', 'Yellow Mode Bardesk Gate'), + ('furni_glass_table*4_name', 'Glass table'), + ('furni_solarium_norja*6_desc', 'Rejuvenate your pixels!'), + ('poster_1006_desc', 'The eyes follow you...'), + ('furni_noob_rug*5_name', 'My first Habbo rug'), + ('buddyremove_pagecounter', 'Page'), + ('poll_alert_answer_missing', 'Please give an answer'), + ('furni_summer_chair*5_desc', 'Beige'), + ('furni_table_plasto_4leg*10_name', 'Occasional Table'), + ('furni_divider_silo2_desc', 'Stylish sectioning'), + ('furni_djesko_turntable_desc', 'For the music-lovers'), + ('nav_remrightsconf', 'You are about to remove all rights from your room. This means that only you will have rights to move and place furni in the room.'), + ('furni_pillow*0_name', 'White Lace Pillow'), + ('sound_machine_eject', 'Eject'), + ('gs_button_ready', 'Ready'), + ('furni_divider_silo1*5_name', 'Pink Area Corner Shelf'), + ('NUF_habbo_home_hotelview_tutor', 'You have now opened a page on the Habbo Website that will give you plenty of information about how to make yourself a Habbo Home.'), + ('furni_traffic_light*4_desc', 'Chill and wait your turn!'), + ('nav_venue_$unit.name$/0_desc', 'Roam more of the hotel\'s corridors'), + ('furni_sporttrack1*2_name', 'Sport track straight asphalt'), + ('furni_sofachair_polyfon_girl_name', 'Armchair'), + ('furni_sound_set_6_desc', 'Background ambience loops'), + ('furni_hal_grave_desc', 'We\'re raising the dead!'), + ('recycler_ready_info', 'Your recycled Furniture is ready. Please either accept or cancel. If you accept, you will receive your recycling reward, detailed below. If you cancel, all your old Furniture will be restored to your hand.'), + ('wallitem_jp_sheet1_name', 'jp_sheet1'), + ('furni_petfood2_name', 'Sardines Mega Multipack'), + ('furni_spotlight_name', 'Habbowood Spotlight'), + ('furni_carpet_soft*6_desc', 'Soft Wool Rug'), + ('gs_lounge_skill', 'Level in this Lounge: \\x \\r (\\y-\\z points)'), + ('nav_help_text', 'Click the Public Spaces tab on the top left of this navigator to find gaming rooms!'), + ('furni_table_plasto_4leg*5_name', 'Occasional Table'), + ('nav_venue_bb_arena_1_name', 'Battle Ball Aloittelijat'), + ('furni_table_silo_med*9_name', 'Red Area Coffee Table'), + ('furni_bed_budget_one*2_name', 'Pink Pura Bed'), + ('nav_venue_sw_lobby_expert_2/0_desc', 'Todellisille lumisotureille.'), + ('furni_rubberchair*6_name', 'Violet Inflatable Chair'), + ('furni_bardeskcorner_polyfon*5_name', 'Candy Corner'), + ('bb_powerup_8', 'Vacuum cleaner'), + ('bb_powerup_6', 'Harlequin'), + ('furni_rare_beehive_bulb*2_name', 'Yellow Amber Lamp'), + ('bb_powerup_7', 'Bomb'), + ('furni_divider_nor2_name', 'Ice Bar-Desk'), + ('bb_powerup_4', 'Cannon'), + ('bb_powerup_5', 'Box of pins'), + ('bb_powerup_2', 'Spring'), + ('bb_powerup_3', 'Flashlight'), + ('console_report', 'Report'), + ('bb_powerup_1', 'Light bulb'), + ('furni_sound_set_43_name', 'SFX 1'), + ('poster_37_desc', 'The Hotels girlband. Dream on!'), + ('interface_icon_messenger', 'Messenger, friends & messages on here'), + ('interface_icon_hand', 'Hand, your inventory'), + ('furni_s_sound_machine*4_name', 'Sound Machine Blue'), + ('nav_venue_sunset_cafe_name', 'Sunset Cafe'), + ('wallitem_sw_stone_desc', 'sw_stone'), + ('reg_check_mail', 'Email'), + ('furni_queue_tile1*7_name', 'Purple Habbo Roller'), + ('pet.hotwords.nest', 'sleep'), + ('furni_sound_machine_desc', 'Creating fancy sounds'), + ('cancel', 'Cancel'), + ('furni_hyacinth2_desc', 'Beautiful bulb'), + ('nav_venue_library/0_name', 'Habbo Library'), + ('furni_waterbowl*1_desc', 'Aqua unlimited'), + ('furni_grand_piano*5_desc', 'Why is that key green?'), + ('furni_table_plasto_bigsquare*8_name', 'Square Dining Table'), + ('furni_nouvelle_trax_name', 'nouvelle_trax'), + ('help_choise_header', 'What do you need help with?'), + ('furni_bardeskcorner_polyfon*7_name', 'Green Mode Bardesk Corner'), + ('furni_pillar*4_name', 'Dark Ages Pillar'), + ('furni_queue_tile1*6_desc', 'The power of movement'), + ('club_intro_link', 'Learn more about Habbo Club!'), + ('furni_sandrug_desc', 'Your own paradise island'), + ('poster_10_desc', 'Beautiful sunset'), + ('furni_divider_nor1_name', 'Ice Corner'), + ('nav_venue_bb_lobby_tournament_6_name', 'Competitie Battle Ball 7'), + ('furni_redhologram_desc', 'You\'re her only hope...'), + ('poster_38_name', 'Smiling Headbangerz'), + ('furni_hc_crtn_name', 'Antique Drapery'), + ('furni_barchair_silo*9_name', 'Red Bar Stool'), + ('room_badge_visible', 'Visible'), + ('furni_sleepingbag*8_name', 'Golden Sleeping Bag'), + ('roomevent_invalid_input', 'You must give your event a name and a description.'), + ('furni_chair_plasto*14_name', 'HC chair'), + ('poster_522_desc', 'The flag of Japan'), + ('furni_shelves_norja*2_name', 'Black Bookcase'), + ('nav_venue_dusty_lounge_name', 'Dusty Lounge'), + ('furni_sound_set_53_desc', 'Break the icy silence'), + ('nav_venue_ice_cafe_name', 'Ice Cafe'), + ('click', 'OK to continue to the hotel.'), + ('nav_venue_sw_lobby_free_2/0_desc', ''), + ('furni_rare_dragonlamp*9_name', 'Purple Dragon Lamp'), + ('furni_statue_desc', 'Watch out for those arrows!'), + ('game_battles_turn', 'TURN'), + ('wallitem_jp_sheet3_desc', 'jp_sheet3'), + ('furni_edicehc_desc', 'Click and roll!'), + ('furni_bed_budget*6_name', 'Blue Pura Double Bed'), + ('furni_gothic_sofa*5_desc', 'The dark side of Habbo'), + ('furni_scifirocket*5_desc', 'From the unknown depths of space'), + ('game_poker_ready', 'READY'), + ('furni_queue_tile1*2_name', 'Red Habbo Roller'), + ('furni_rare_parasol_desc', 'Zon! Zon! Zon!'), + ('transaction_system_sms_dna', 'DNA'), + ('furni_bar_polyfon_name', 'Mini-Bar'), + ('furni_grand_piano*1_name', 'Turquoise Grand Piano'), + ('nav_venue_bb_lobby_expert_4_name', 'Experts Battle Ball 5'), + ('bb_link_highscores', 'Highscores'), + ('summer_chair_8_desc', 'The summer winds are creeping in'), + ('reg_parentemail_title2', 'Email address of parent/guardian:'), + ('error_report_explain', 'An error has occurred, please see the error code above.'), + ('console_noprofile', 'Habbo Profile Not Found'), + ('furni_glass_sofa*3_desc', 'Translucent beauty'), + ('furni_romantique_smalltabl*4_desc', 'Why is one leg different?'), + ('furni_table_plasto_4leg*14_name', 'HC table'), + ('nav_venue_bb_lobby_intermediate_2_name', 'Semi-profs Battle Ball 3'), + ('NUF_playing_games_gamerooms_tutor', 'Click the \'Go\' button to go to the Game Lounge.'), + ('habboclub_require_parent_permission', 'You need to tick the box to say that you are over 14 years or age, \\ror under 14 and have your parent/guardian\'s permission to join Habbo Club. \\rPlease go back and tick the box.'), + ('furni_wooden_screen*1_desc', 'Add an exotic touch to your room'), + ('nav_venue_bb_lobby_intermediate_4/0_desc', ''), + ('furni_glass_sofa*6_name', 'Blue Glass Sofa'), + ('furni_bench_armas_desc', 'To complete the dining set'), + ('furni_barchair_silo*2_name', 'Black Bar Stool'), + ('nav_venue_bb_lobby_expert_6/0_desc', ''), + ('furni_jp_tray2_desc', 'jp_tray2'), + ('furni_val_teddy*3_desc', 'The green bear of friendship'), + ('transaction_system_sms_win_vodafone', 'Vodafone SMS'), + ('furni_glass_sofa_name', 'Glass sofa'), + ('console_online', 'online:'), + ('poster_2004_desc', 'irie!'), + ('x', 'X'), + ('nav_venue_habbo_lido/0_desc', 'Pool is open for swimming and diving!'), + ('furni_soft_sofachair_norja_name', 'iced sofachair'), + ('furni_xmas_cstl_twr_name', 'Ice Castle Tower'), + ('nav_venue_park_name', 'Habbo Gardens'), + ('recycler_info_open', 'Ecotron is the place to visit if you want to recycle your old Furniture. Simply drag the old Furni from your hand to the empty slots below. Recyclable items display the green recyclable tag in your hand. Please note that you must own the Furniture for at least %quarantine_hours% hour before they can be recycled. Recycling takes a total of %total_hours% hours.'), + ('group_window_title', 'Habbo Groups'), + ('pet.saying.eat.dog.4', 'Mmmmm..'), + ('game_chess', 'Chess'), + ('pet.saying.eat.dog.2', 'slurp, slurp, slurp'), + ('roomatic_roomdesc', 'Room description:'), + ('furni_sofa_polyfon*7_desc', 'Green Mode Sofa'), + ('pet.saying.eat.dog.3', 'hrum, umm, umm grrr'), + ('pet.saying.eat.dog.0', 'hrum, hrum, crunch!'), + ('preview_downloading', 'Preview downloading...'), + ('sound_machine_confirm_close_long', 'Are you sure you want to leave the editor without saving the song?'), + ('partner_registration_title', 'Hey, I forgot to mention one thing..'), + ('pet.saying.eat.dog.1', 'crunch, crunch mmmm'), + ('nav_venue_bb_lobby_tournament_12/0_desc', ''), + ('furni_carpet_soft*3_name', 'Soft Wool Rug'), + ('furni_sound_set_56_name', 'RnB Grooves 2'), + ('reg_termslink', 'Terms and Conditions'), + ('wallitem_sw_swords_desc', 'Z for Zorro'), + ('furni_sleepingbag*10_name', 'Khaki Sleeping Bag'), + ('furni_hc_dsk_name', 'Study Desk'), + ('furni_chair_silo*8_desc', 'Keep it simple'), + ('furni_glass_chair*8_name', 'Glass chair'), + ('nav_venue_cafe_ole_name', 'Cafe ole'), + ('furni_sleepingbag*5_desc', 'Ultimate coziness'), + ('opening_hours_text_closed', 'The Hotel has been closed and will be open to the public again at %h%:%m%.'), + ('furni_grunge_bench_desc', 'Laid back seating'), + ('BuddyNotHere', 'Offline'), + ('furni_noob_lamp*5_desc', 'Get the light right where you want it (pink)'), + ('NUH_navigator', 'Use the Navigator to move around. There are literally thousands of rooms to explore!'), + ('poster_1338_name', 'Pedobear Seal of Approval'), + ('furni_queue_tile1*9_name', 'Green Habbo Roller'), + ('furni_habboween_crypt_desc', 'What lurks inside?'), + ('furni_sofachair_silo*9_name', 'Red Area Armchair'), + ('furni_exe_chair_name', 'Executive Sofa Chair'), + ('furni_rare_dragonlamp*6_desc', 'Scary and scorching!'), + ('furni_divider_nor2*3_desc', 'Strong, yet soft looking'), + ('furni_tile_yell_name', 'Floor Tiles'), + ('furni_plant_yukka_name', 'Yukka Plant'), + ('furni_wooden_screen*8_desc', 'Add an exotic touch to your room'), + ('furni_pillar*8_desc', 'All roads lead to Rome'), + ('trading_youoffer', 'You offer:'), + ('furni_marquee*8_desc', 'It\'s both door and a shade!'), + ('furni_pura_mdl4*9_name', 'Red Pura Module 4'), + ('roomatic_congrats', 'Congratulations! You\'re now the proud owner of your own Habbo Hotel room.'), + ('furni_tile_marble_name', 'Marble Tile'), + ('furni_bed_budget*3_desc', 'King sized comfort!'), + ('furni_sound_machine*3_desc', 'Top the Habbo Charts!'), + ('nav_venue_bb_lobby_beginner_10_name', 'Beginners Battle Ball 11'), + ('nav_venue_bb_lobby_tournament_1/0_desc', ''), + ('poster_2000_name', 'Suomen kartta'), + ('furni_solarium_norja*3_name', 'Urban Solarium'), + ('furni_present_gen3_desc', 'What\'s inside?'), + ('furni_glass_stool*4_desc', 'Translucent beauty'), + ('int_update_id', 'Update My Habbo ID >>'), + ('nav_venue_bb_lobby_beginner_8/0_desc', ''), + ('furni_carpet_standard*8_desc', 'Available in a variety of colours'), + ('furni_pillar*1_desc', 'Ancient and stately'), + ('receive_invitation_text', 'invites you his/her room. Accept invitation?'), + ('poll_offer_window', 'Welcome to our poll'), + ('furni_table_plasto_bigsquare*5_desc', 'Hip plastic furniture'), + ('furni_carpet_standard*1_desc', 'Available in a variety of colours'), + ('furni_hologram_name', 'Holopod'), + ('nav_venue_bb_lobby_amateur_desc', 'Amateur battle ball!'), + ('furni_barchair_silo*6_desc', 'Practical and convenient'), + ('furni_divider_nor5_desc', 'Cool cornering for your crib y0!'), + ('purse_vouchers_helpbutton', 'More about vouchers >>'), + ('furni_shelves_norja*6_desc', 'For nic naks and art deco books'), + ('nav_venue_sw_lobby_tournament_5/0_desc', ''), + ('furni_chair_basic*4_desc', 'It\'s a cracking design!'), + ('nav_hidefull', 'Hide Full Rooms'), + ('modtool_ban_computer', 'Ban Computer Also'), + ('furni_gothic_sofa*1_name', 'Gothic Sofa Pink'), + ('furni_carpet_standard*b_name', 'Floor Rug'), + ('queue_line', 'You are queueing right now...'), + ('furni_divider_nor1*6_desc', 'Blue Ice corner'), + ('nav_search_helptext', 'Looking for something? Here you can search other Habbo\'s rooms. Type the room name or the name of the Habbo to search for a room.'), + ('furni_marquee*1_desc', 'It\'s both door and a shade!'), + ('furni_rcandleset_desc', 'Simple but stylish'), + ('nav_room_banned', 'You are banned from this room.'), + ('furni_lamp_armas_name', 'Table Lamp'), + ('catalog_costs', '\\x1 costs \\x2 Credits'), + ('furni_drinks_desc', 'Are you a slob too?'), + ('furni_pura_mdl5*6_name', 'Blue Pura Module 5'), + ('summer_chair_1_desc', 'Gotta get up early to get one!'), + ('furni_prize3_desc', 'A weighty award'), + ('furni_soft_sofa_norja*7_name', 'Rural Iced Sofa'), + ('poster_518_name', 'The Welsh flag'), + ('furni_sofachair_polyfon*8_name', 'Yellow Mode Armchair'), + ('furni_prizetrophy3*3_desc', 'Breathtaking bronze'), + ('nav_venue_sw_lobby_amateur_6_name', 'Snow Slingers Lobby'), + ('furni_stand_polyfon_z_desc', 'Tidy up'), + ('furni_carpet_soft_tut_name', 'Welcome Mat'), + ('console_reject_all', 'Reject All'), + ('month12', 'December'), + ('month11', 'November'), + ('help_topics', 'Help Topics:'), + ('nav_venue_sw_lobby_beginner_8/0_desc', ''), + ('nav_rooms_own', 'Own Room(s)'), + ('reg_pwd_note', 'Choose a password that\'s hard to guess! So, don\'t use ANYONES name, or your favorite colour!'), + ('furni_wooden_screen*4_name', 'Golden Oriental Screen'), + ('nav_venue_sw_lobby_beginner_2/0_desc', ''), + ('furni_pillow*6_desc', 'Puffy, soft and huge'), + ('furni_bed_polyfon_one*4_desc', 'Beige Mode Single Bed'), + ('reg_email_note', 'Please enter your e-mail address, this is important! You\'ll only get customer support and special offers via email, if you enter a valid email address and verify it.'), + ('group_admin', 'Administrator'), + ('furni_scifirocket*8_name', 'Pluto Smoke Machine'), + ('furni_chair_plasto*11_desc', 'Hip plastic furniture'), + ('month10', 'October'), + ('furni_goth_table_name', 'Gothic table'), + ('month05', 'May'), + ('month04', 'April'), + ('nav_modify_maxvisitors', 'Choose maximum number of visitors'), + ('nav_venue_bb_lobby_amateur_2_name', 'Gevorderden Battle Ball 3'), + ('month07', 'July'), + ('habboclub_price1', '30'), + ('month06', 'June'), + ('month01', 'January'), + ('month03', 'March'), + ('month02', 'February'), + ('furni_summer_chair*2_desc', 'Pink'), + ('month09', 'September'), + ('month08', 'August'), + ('furni_bardeskcorner_polyfon*4_desc', 'Beige Mode Bardesk Corner'), + ('furni_tree6_name', 'Flashy Christmas Tree'), + ('furni_arabian_snake_name', 'Ornamental Urn'), + ('reg_verification_incorrectPassword', 'Your password was incorrect'), + ('NUF_visting_rooms_hotelview_tutor', 'Here we go again. This time we are learning how to visit another Habbos room.'), + ('furni_summer_chair*9_desc', 'Got your sunglasses?'), + ('furni_safe_silo_name', 'Safe Minibar'), + ('furni_throne_name', 'Throne'), + ('furni_soft_sofachair_norja*8_desc', 'Yellow Iced Sofachair'), + ('NUF_console_ready_tutor', 'You can now use the Console to find some of your friends, or you can continue the tutorial.'), + ('nav_venue_picnic/0_desc', 'Don\'t forget to grab a carrot or two!'), + ('furni_bardeskcorner_polyfon_name', 'Corner Cabinet/Desk'), + ('game_placeship', 'Place your ships:'), + ('furni_glass_table*7_desc', 'Habbo Club'), + ('poster_13_name', 'BW Skyline Poster'), + ('furni_jp_bamboo_name', 'Bamboo Forest'), + ('furni_plant_bulrush_name', 'Bulrush'), + ('furni_deadduck3_desc', 'With added ectoplasm'), + ('win_purse', 'Habbo Purse'), + ('furni_jp_tray5_name', 'jp_tray5'), + ('furni_hc_tbl_desc', 'Perfect for banquets'), + ('furni_shelves_norja_desc', 'For nic naks and art deco books'), + ('club_desc_3_period', '6 Months (186 days) = 105 Credits'), + ('furni_bed_budget_one*3_name', 'Black Pura Bed'), + ('poster_2_name', 'Carrot Plaque'), + ('furni_solarium_norja*7_desc', 'Fun in the sun!'), + ('poster_2007_name', 'The Father Of Habbo'), + ('gs_header_teams', 'Teams'), + ('furni_divider_poly3*9_desc', 'Border Control!'), + ('gs_button_creategame', 'Create A New Game'), + ('furni_sound_set_42_name', 'Haunted Mansion'), + ('poll_alert_invalid_selection', 'Please select fewer alternatives'), + ('furni_scifirocket*1_name', 'Saturn Smoke Machine'), + ('furni_scifidoor*10_name', 'Violet Spaceship Door'), + ('furni_sound_set_5_desc', 'The dark side of Habbo'), + ('club_confirm_gift_title', 'You have received a Habbo club gift!'), + ('bb_info_gamePrice', 'Play now for just 2 tickets.'), + ('furni_sound_machine*6_name', 'Purple Traxmachine'), + ('wallitem_arabian_swords_desc', 'Not for yielding'), + ('furni_divider_nor2*6_name', 'Blue Iced bar desk'), + ('nav_venue_sw_lobby_expert_0/0_desc', ''), + ('furni_noob_chair*1_name', 'My first Habbo chair'), + ('group_room_link', 'Group\'s room: %room_name% >>>'), + ('sound_machine_playlist', 'Playlist'), + ('nav_venue_bb_arena_2_name', 'Battle Ball Amatöörit'), + ('roomatic_create_error', 'Error in room creation process. Please try again!'), + ('furni_couch_norja*7_desc', 'Two can perch comfortably'), + ('gs_button_spectate', 'Watch Game!'), + ('furni_sofachair_silo*6_desc', 'Blue Area Armchair'), + ('credit_redeem_button', 'Redeem'), + ('furni_valentinescreen_desc', 'Peep through and smile!'), + ('poster_511_name', 'The Dutch flag'), + ('furni_shelves_armas_name', 'Bookcase'), + ('nav_venue_habbo_lido_name', 'Habbo Lido'), + ('furni_bed_polyfon*9_name', 'Red Double Bed'), + ('furni_sofa_silo*9_name', 'Red Area Sofa'), + ('furni_pura_mdl4*6_desc', 'Any way you like it!'), + ('console_mainhelptext', 'You can use the Habbo Console to keep in constant contact with your friends using instant messages.'), + ('wallitem_jp_ninjastars_name', 'Ninja Stars'), + ('ad_note', 'Clicking this advertisement will open a new window'), + ('ph_tickets_choise2', 'Buy 20 Tickets for 6 Credits.'), + ('ph_tickets_choise1', 'Buy 2 Tickets for 1 Credit.'), + ('reg_day', 'Day'), + ('nav_venue_cunning_fox_gamehall/2_name', 'Noughts&Crosses'), + ('nav_venue_sw_lobby_tournament_6_name', 'Tournament Lobby'), + ('furni_noob_lamp*1_name', 'My first Habbo lamp'), + ('furni_petfood1_name', 'Bones Mega Multipack'), + ('furni_table_silo_med*3_name', 'White Coffee Table'), + ('pet.hotwords.jump', 'jump'), + ('furni_sleepingbag*1_name', 'Red Sleeping Bag'), + ('nav_venue_main_lobby/0_desc', 'The heart of Habbo Hotel'), + ('pet_hungry', 'Hunger:'), + ('furni_rare_fan*4_name', 'SUPERLOVE Fan'), + ('furni_sw_table_name', 'sw_table'), + ('furni_CFC_200_moneybag_name', 'Sack of Credits (China)'), + ('room_ask_friend', 'Ask to be a Friend'), + ('furni_bed_polyfon*2_name', 'Black Mode Double Bed'), + ('furni_table_norja_med_desc', 'Elegance embodied'), + ('nav_removerights', 'Reset'), + ('wallitem_hrella_poster_1_name', 'Porthole'), + ('NUF_getting_items_purse_', 'Click this link to open the Habbo Credits page in the website window.'), + ('poster_31_name', 'System of a Ban'), + ('furni_sound_set_24_name', 'Habbo Sounds 4'), + ('furni_chair_basic*7_name', 'chair_basic'), + ('poster_56_name', 'Disco Sign'), + ('furni_rare_dragonlamp*2_name', 'Jade Dragon Lamp'), + ('furni_gothic_stool*4_desc', 'Witches and Warlocks'), + ('furni_sofa_silo*2_name', 'Black Two-Seater Sofa'), + ('furni_grunge_radiator_name', 'Radiator'), + ('nav_venue_bb_lobby_amateur_9_name', 'Gevorderden Battle Ball 10'), + ('summer_chair_4_name', 'White Deck Chair'), + ('furni_sound_set_49_name', 'Club 4'), + ('messenger.email.subject', ''), + ('furni_romantique_chair*3_name', 'Turquoise Romantique Chair'), + ('furni_s_sound_machine*7_desc', 'Sound Machine Red'), + ('furni_table_plasto_round*9_desc', 'Hip plastic furniture'), + ('furni_table_plasto_4leg*7_name', 'Occasional table'), + ('club_confirm_title', 'You are about to subscribe to Habbo Club. Wise choice!'), + ('furni_romantique_pianochair*1_desc', 'Here sat the legend of 1900'), + ('furni_sofa_silo*6_desc', 'Blue Area Sofa'), + ('nav_venue_bb_lobby_tournament_11_name', 'Competitie Battle Ball 12'), + ('furni_rare_icecream*9_desc', 'Virtual bubblegum rocks!'), + ('furni_romantique_divider*1_name', 'Rose Quartz Screen'), + ('NUF_playing_games_room_ruleslink', 'Click me! But only if you want to read the game FAQs in the website.'), + ('furni_chair_silo_name', 'Dining Chair'), + ('furni_sound_set_17_desc', 'Jive\'s Alive!'), + ('dance_choose', 'Choose Dance'), + ('wallitem_industrialfan_name', 'Industrial Turbine'), + ('sound_machine_alert_invalid_song_length', 'Can\'t burn an empty song!'), + ('furni_pura_mdl1*4_desc', 'Any way you like it!'), + ('wallitem_post.it.vd_desc', 'Heart Stickies'), + ('catalog_give_petname', 'Type your pet\'s name in the grey box.'), + ('furni_pura_mdl2*1_name', 'Aqua Pura Module 2'), + ('poster_24_name', 'Hole In The Wall'), + ('win_error', 'Notice!'), + ('furni_chair_plasto*2_desc', 'Hip plastic furniture'), + ('wallitem_xmas_light_desc', 'Xmas light'), + ('furni_rubberchair*1_name', 'Blue Inflatable Chair'), + ('NUF_getting_room_roommatic_details_tutor', 'Give a name to your room, choose a category and add a description. Don\'t worry, you can change it all later.'), + ('furni_divider_poly3*2_desc', 'Black Mode Bardesk Gate'), + ('furni_plant_valentinerose*2_desc', 'Your secret love'), + ('furni_table_norja_med*7_desc', 'For larger gatherings'), + ('furni_carpet_polar_desc', 'For cuddling up on'), + ('nav_venue_sw_lobby_free_8/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('furni_summer_grill*1_name', 'Blue Barbeque Grill'), + ('furni_chair_norja*7_desc', 'Sleek and chic for each cheek'), + ('furni_joulutahti_name', 'Poinsetta'), + ('furni_exe_table_name', 'Executive Desk'), + ('furni_divider_silo3*8_desc', 'Form following function'), + ('furni_gothiccandelabra_name', 'Gothic Candelabra'), + ('transaction_system_bibit', 'Credit card'), + ('nav_venue_tv_studio/0_desc', 'Sponsored by Bobbanet.com'), + ('furni_noob_table*4_desc', 'Lightweight, practical and light blue'), + ('furni_bardesk_polyfon*3_desc', 'Perfect for work or play'), + ('room_info_rated', 'Room rating:'), + ('nav_venue_bb_lobby_beginner_2/0_desc', ''), + ('help_emergency_explanation', 'If you are experiencing a situation which is making you feel uncomfortable or unsafe, please give details below and a member of community staff will reply as soon as possible.'), + ('furni_divider_nor5*8_desc', 'Cool cornering for your crib y0!'), + ('poster_507_name', 'The French Tricolore'), + ('nav_privateRooms', 'Rooms'), + ('furni_pura_mdl2*5_desc', ''), + ('furni_sporttrack3*3_name', 'Sport goal grass'), + ('furni_sound_set_10_desc', 'Made from real Boy Bands!'), + ('furni_chair_plasto*9_desc', 'Hip plastic furniture'), + ('furni_soft_sofa_norja*4_desc', 'Sit back and relax'), + ('furni_s_sound_machine*3_name', 'Sound Machine Green'), + ('reg_spam', 'Yes, I want to get the occasional email from the Hotel Manager.'), + ('shout', 'Shout'), + ('NUF_mini_use_console_read_link', 'Click here to view the message.'), + ('furni_scifidoor*2_desc', 'There out of this world!'), + ('furni_divider_nor3*3_name', 'White Iced Gate'), + ('pet_hung_0', 'Empty'), + ('furni_table_plasto_square*1_name', 'Occasional Table'), + ('pet_hung_6', 'Stuffed'), + ('pet_hung_5', 'Full'), + ('bb_user_skill', 'Skill Level: \\x\\rScore: \\y'), + ('login_welcome', 'Welcome'), + ('pet_hung_2', 'Rumbling'), + ('pet_hung_1', 'Hungry'), + ('poster_20_name', 'Bars'), + ('pet_hung_4', 'Satisfied'), + ('pet_hung_3', 'Peckish'), + ('Alert_WrongNameOrPassword', 'Wrong name or password - please try again!'), + ('furni_romantique_pianochair*5_desc', 'I can feel air coming through...'), + ('furni_carpet_armas_desc', 'Adds instant warmth'), + ('console_removefriend_2', 'from your Friends List?'), + ('console_removefriend_1', 'Are you sure you want to remove'), + ('furni_rare_parasol*0_name', 'Green Parasol'), + ('furni_sound_set_38_name', 'Rock 6'), + ('NUF_mini_meet_people_room_wave', 'These buttons let you wave and dance. Click on your Habbo at anytime to see these buttons.'), + ('gs_skill_changed_header', 'Congratulations!'), + ('furni_chair_plasty*7_name', 'Plastic Pod Chair'), + ('furni_safe_silo*5_desc', 'Totally shatter-proof!'), + ('furni_divider_silo1*3_name', 'White Corner Shelf'), + ('nav_venue_hallway_ii_name', 'Hallway II'), + ('cam_release.help', 'Cancel Photo'), + ('nav_venue_bb_lobby_amateur_14/0_desc', ''), + ('habbo_tv_title', 'Widescreen Habbovision'), + ('purse_noevents', 'You haven\'t made any transactions yet. Click the button below to find out how to get Habbo Credits.\\rRemember: you must ask your parents permission before you buy Habbo Credits.'), + ('furni_pura_mdl2*8_name', 'yellow pura module 2'), + ('furni_CFC_10_coin_bronze_name', 'Bronze Coin (China)'), + ('sound_machine_song_remove', 'Remove song'), + ('modtool_choose_length', 'Choose Length:'), + ('sound_machine_turn_off', 'Switch Off'), + ('furni_pura_mdl1*8_desc', ''), + ('furni_spyro_desc', 'The stuff of legend'), + ('furni_pillow*2_name', 'Red Silk Pillow'), + ('furni_table_armas_desc', 'For informal dining'), + ('furni_tree3_desc', 'Any presents under it yet?'), + ('object_displayer_link_looks', 'Change avatar looks'), + ('furni_barrier*2_name', 'White Road Barrier'), + ('furni_gothic_chair*5_desc', 'The dark side of Habbo'), + ('furni_divider_nor4*4_name', 'Urban Iced Shutter'), + ('furni_camera_name', 'Camera'), + ('next_arrows', 'Next >>'), + ('furni_sound_set_60_desc', 'Love and affection!'), + ('furni_bed_polyfon_girl_one_name', 'Single Bed'), + ('NUF_mini_meet_people_user_chatfield', 'Start typing here and press \'Enter\' to chat with others.'), + ('successfully_purchase_gift_for', 'Successfully purchased gift for user %user%!'), + ('poster_49_desc', 'All that glitters...'), + ('furni_glass_table*3_name', 'Glass table'), + ('furni_divider_silo3*5_desc', 'Pink Area Gate'), + ('furni_divider_arm3_name', 'Gate (lockable)'), + ('furni_table_plasto_4leg*3_name', 'Round Dining Table'), + ('roomatic_roomnumber', 'Room number:'), + ('nav_venue_bb_lobby_beginner_5_name', 'Beginners Battle Ball 6'), + ('reg_nameAndPassTooSimilar', 'Your name and password are too similar'), + ('nav_venue_theatredrome_easter_name', 'Theatredrome Easter'), + ('nav_venue_bb_lobby_beginner_11/0_desc', ''), + ('furni_fireplace_polyfon_name', 'Fireplace'), + ('queue_set.e1.info', 'There are %e1% Habbos in front of you in the queue.'), + ('more_info_link', 'Redeem Now'), + ('furni_bed_polyfon*6_desc', 'Blue Mode Double Bed'), + ('furni_rare_icecream*5_name', 'Vanilla Ice Cream Machine'), + ('poster_500_name', 'Union Jack'), + ('furni_chair_norja*3_name', 'White Iced Chair'), + ('furni_sound_set_31_name', 'Dance 3'), + ('furni_pura_mdl3*5_name', 'beige pura module 3'), + ('furni_sporttrack2*3_desc', 'null'), + ('furni_sound_set_46_desc', 'De bada bada bo!'), + ('poster_9_name', 'Rainforest Poster'), + ('furni_romantique_pianochair*4_name', 'Amber Piano Stool'), + ('poster_515_desc', 'Waved by Swedes everywhere'), + ('furni_scifidoor*9_desc', 'There out of this world!'), + ('furni_chair_plasty*3_name', 'Plastic Pod Chair'), + ('furni_table_plasto_round*5_name', 'Round Dining Table'), + ('furni_one_way_door*9_desc', 'One at a time!'), + ('furni_calippo_desc', 'Basic model'), + ('furni_footylamp_desc', 'Can you kick it?'), + ('furni_one_way_door*2_desc', 'One way! The HC way!'), + ('furni_arabian_tray4_desc', 'Sweet, juicy and ripe'), + ('furni_divider_nor3*7_name', 'Rural Iced gate'), + ('furni_couch_norja*3_name', 'White Iced Bench'), + ('furni_pillow*9_name', 'Green Wooly Pillow'), + ('game_chooseside', 'Choose your side'), + ('start', 'Start'), + ('furni_toy1*4_desc', 'it\'s bouncy-tastic'), + ('roomevent_host', 'Host:'), + ('nav_venue_rooftop_rumble_name', 'Rooftop Rumble'), + ('nav_venue_bb_lobby_expert_0/0_desc', ''), + ('nav_venue_rooftop_rumble_ii/0_desc', 'Are you ready?'), + ('error_report_trigger_message', 'Last message ID'), + ('furni_sofachair_silo*2_name', 'Black Armchair'), + ('furni_noob_chair*5_desc', 'Lightweight, practical, with pink stripes'), + ('pet_frnd_0', 'Hostile'), + ('furni_noob_rug*3_name', 'My first Habbo rug'), + ('pet_frnd_2', 'Suspicious'), + ('pet_frnd_1', 'Angry'), + ('furni_scifiport*6_desc', 'Energy beams. No trespassers!'), + ('pet_frnd_4', 'Calm'), + ('pet_frnd_3', 'Cool'), + ('pet_frnd_6', 'Warm'), + ('pet_frnd_5', 'Friendly'), + ('pet_frnd_8', 'Loving'), + ('credit_trade_value', 'Includes credit furnis worth %value% credits.'), + ('pet_frnd_7', 'Affectionate'), + ('pet_frnd_9', 'Loyal'), + ('NUF_getting_items_purse_tutor', 'Your Purse tells you how many Habbo Credits you have. If you have a voucher code you can redeem it here by clicking the \'Vouchers\' button.'), + ('furni_chair_norja*6_name', 'Blue Chair'), + ('sound_machine_alert_machine_full', 'You already have 4 Traxpacks loaded. Eject one before adding a new Traxpack.'), + ('nav_venue_club_mammoth/0_desc', 'Monumental and magnificent. For Habbo Club members only.'), + ('NUF_getting_room_hand_tutor', 'This is your hand. It contains all your furniture. I have given you a rug so that you can place it in your room- click and drag it to set it down.'), + ('reg_check_name', 'Name'), + ('furni_glass_stool*7_name', 'Green Glass Stool'), + ('poster_504_name', 'The Bundesflagge'), + ('poster_42_desc', 'Not something you want to run into'), + ('pet.saying.sleep.dog.6', '*dreaming*'), + ('pet.saying.sleep.dog.5', 'Zzzzz wuff! zzzzz'), + ('pet.saying.sleep.dog.4', 'hrrrrr...murrmm..'), + ('furni_pura_mdl4*2_desc', 'Any way you like it!'), + ('pet.saying.sleep.dog.3', 'bzz.. oof oof'), + ('furni_sofa_silo*5_name', 'Pink Area Sofa'), + ('pet.saying.sleep.dog.2', 'hrrr.. hrrr'), + ('pet.saying.sleep.dog.1', 'bzz.. bzzzzz'), + ('furni_petfood4_name', 'T-Bones Mega Multipack'), + ('nav_venue_club_mammoth_name', 'Club Mammoth'), + ('ph_keys_dive', 'Diving moves:'), + ('furni_noob_table*3_name', 'My first Habbo table'), + ('furni_romantique_divan*5_desc', 'Is that a cape hanging there?'), + ('furni_table_plasto_round*8_name', 'Round Dining Table'), + ('furni_rare_fan*1_name', 'Blue Powered Fan'), + ('reg_forcedupdate2', 'Update your Habbo info'), + ('furni_table_plasto_square*4_name', 'Square Dining Table'), + ('NUF_playing_games', 'Playing games'), + ('furni_prizetrophy2*2_name', 'Duck trophy'), + ('reg_forcedupdate3', 'The Habbo Hotel management requires all Habbos to read and agree to the service Terms and Conditions. It won\'t take long.\\rJust go through the registration, check your info and agree to the new terms. Thank you!'), + ('nav_venue_sw_lobby_tournament_2_name', 'Tournament Lobby'), + ('furni_carpet_standard*4_name', 'Floor Rug'), + ('furni_s_sound_machine*6_name', 'Sound Machine Purple'), + ('furni_prizetrophy5*1_desc', 'Glittery gold'), + ('furni_table_plasto_square_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_beginner_2_name', 'Beginners Battle Ball 3'), + ('furni_rubberchair*4_name', 'Ocean Inflatable Chair'), + ('furni_divider_poly3*5_desc', 'Keep the Pink in!'), + ('furni_arabian_teamk_name', 'Tea Maker'), + ('room_name', 'Room:'), + ('nav_venue_chill/0_desc', 'Come chill in the Zen Garden!'), + ('furni_summer_grill*4_name', 'Green Barbeque Grill'), + ('poster_1001_desc', 'even walls have ears'), + ('furni_rare_icecream*8_name', 'Peppermint Ice Cream Machine'), + ('furni_safe_silo*9_desc', 'Totally shatter-proof!'), + ('sound_machine_song_save', 'Save song'), + ('NUF_getting_room_navigator_ownrooms', 'Click the \'Own Room(s)\' tab to see your rooms.'), + ('furni_gothic_chair*1_desc', 'The dark side of Habbo'), + ('furni_table_plasto_square*8_name', 'Square Dining Table'), + ('furni_safe_silo*2_desc', 'Totally shatter-proof!'), + ('roomevent_create_description', 'Describe your event'), + ('purse_vouchers_success', 'Voucher was successfully redeemed. You have the Credits.'), + ('furni_gothic_carpet2_name', 'Dungeon Floor'), + ('furni_sofa_polyfon*3_name', 'White Two-seater Sofa'), + ('furni_romantique_tray2_name', 'Treats Tray'), + ('nav_modify_doorstatus_locked', 'Locked (visitors have to ring the bell)'), + ('NUF_visiting_rooms_categorylist_open', 'Click the \'Open\' button to open a category.'), + ('room_doorbell', 'Rings the doorbell - Open the door?'), + ('furni_sound_set_45_name', 'Lost_Beatness'), + ('nav_deleteroom', 'Delete'), + ('furni_barchair_silo_name', 'Bar Stool'), + ('furni_chair_plasto*5_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_tournament_14_name', 'Competitie Battle Ball 15'), + ('furni_pura_mdl1*1_desc', 'Any way you like it!'), + ('furni_rare_snowrug_desc', 'Chilled Elegance'), + ('poster_35_desc', 'The Hotel\'s girlband. Dream on!'), + ('furni_glass_stool_desc', 'Translucent beauty'), + ('furni_rare_fan*8_name', 'Habbo Wind Turbine'), + ('furni_menorah_desc', 'Light up your room'), + ('furni_table_silo_small*7_desc', 'Green Area Occasional Table'), + ('furni_divider_silo1*7_name', 'Green Area Corner Shelf'), + ('furni_romantique_divan*1_desc', 'null'), + ('furni_table_plasto_round*1_name', 'Round Dining Table'), + ('reg_changeEmail', 'Change your email'), + ('hobba_mark_normal', 'Send To Helpers'), + ('nav_venue_bb_lobby_tournament_8/0_desc', ''), + ('ph_tickets_have2', 'Tickets'), + ('nav_venue_sw_lobby_intermediate_0/0_desc', ''), + ('ph_tickets_have1', 'You Have'), + ('furni_bardesk_polyfon*7_desc', 'Green Mode Bardesk'), + ('console_inprivateroom', 'In A Guest Room'), + ('furni_sound_set_35_name', 'Dance 6'), + ('GoAway', 'Leave The Room'), + ('room_kick', 'Kick'), + ('furni_rubberchair*8_name', 'Black Inflatable Chair'), + ('poster_6_name', 'Abstract Poster'), + ('hubu_t1_3', ''), + ('NUF_meeting_people', 'Meeting people'), + ('nav_venue_bb_lobby_amateur_4/0_desc', ''), + ('nav_venue_bb_game/0_name', 'Battle Ball Arena'), + ('furni_pudding_name', 'Christmas Pudding'), + ('furni_tile_red_name', 'Floor Tiles'), + ('catalog_typeurname', 'Type your greetings here\\r(don\'t forget to put your name!):'), + ('furni_house2_name', 'Gingerbread House'), + ('hubu_t1_1', 'Kaupunkien pu_t2_2=Katso onko kotisi l_1=Tietoa Hubusta'), + ('furni_glass_table*4_desc', 'Translucent beauty'), + ('hubu_t1_2', ''), + ('nav_venue_club_massiva/1_name', 'Chill-out Room'), + ('furni_scifiport*2_desc', 'Get in the ring!'), + ('furni_traffic_light*4_name', 'Yellow Traffic Light'), + ('furni_tree2_name', 'Old Christmas Tree'), + ('furni_noob_stool*4_name', 'My first Habbo stool'), + ('done', 'Done'), + ('furni_goodie1*1_name', 'Marzipan Man'), + ('nav_venue_bb_lobby_tournament_18/0_desc', ''), + ('poster_17_name', 'Butterfly Cabinet 1'), + ('furni_summer_chair*5_name', 'Deck Chair'), + ('furni_prizetrophy*1_name', 'Classic trophy'), + ('furni_easterduck_desc', 'Can you tell what it is yet?'), + ('furni_barrier*3_desc', 'No trespassing, please!'), + ('furni_table_plasto_bigsquare*1_name', 'Square Dining Table'), + ('club_general_infolink', 'More Info About Habbo Club >>'), + ('furni_chair_silo*4_name', 'Beige Silo Dining Chair'), + ('roomatic_givename', 'Give your room a name!'), + ('furni_rare_icecream*1_name', 'Blueberry Ice Cream Machine'), + ('roomatic_open', 'Door open'), + ('NUF_getting_items_catalogue_tutor', 'Big! You can browse the products by clicking on the categories. There are loads of different types of furniture to decorate your room.'), + ('furni_marquee*4_name', 'Yellow Marquee'), + ('furni_bed_polyfon_one*7_name', 'Green Mode Single Bed'), + ('gs_button_go_started', 'Watch'), + ('poster_27_name', 'Holly Bundle 3'), + ('furni_divider_nor2*7_desc', 'No way through'), + ('furni_glass_chair*5_desc', 'Translucent beauty'), + ('nav_venue_basement_lobby_name', 'Basement Lobby'), + ('pick_furniture', 'Put Furni In Hand'), + ('nav_venue_bb_lobby_beginner_18/0_desc', ''), + ('furni_pura_mdl2*4_name', 'White Pura Module 2'), + ('club_status_title', 'You are currently a member of Habbo Club.'), + ('furni_rare_elephant_statue_name', 'Golden Elephant'), + ('furni_toy1*1_desc', 'it\'s bouncy-tastic'), + ('reg_doneheader', 'Congratulations!\\rYou\'re a Habbo!'), + ('furni_present_gen6_name', 'Gift'), + ('furni_noob_chair*2_desc', 'Lightweight, practical, with dark blue stripes'), + ('furni_sofachair_silo*5_name', 'Pink Area Armchair'), + ('BuddyNow', 'now:'), + ('furni_pura_mdl5*3_desc', 'Any way you like it!'), + ('furni_prizetrophy6*1_name', 'Champion trophy'), + ('BuddyEntry', 'On Hotel View'), + ('furni_scifiport*9_desc', 'Energy beams. No trespassers!'), + ('furni_table_polyfon_small_desc', 'For serving a stylish latte'), + ('furni_exe_rug_name', 'Executive Rug'), + ('nav_venue_the_dirty_duck_pub_name', 'The Dirty Duck Pub'), + ('nav_venue_bb_lobby_beginner_9_name', 'Beginners Battle Ball 10'), + ('nav_venue_sw_lobby_beginner_5_name', 'Snow Rookies Lobby'), + ('furni_pura_mdl5*2_name', 'Pink Pura Module 5'), + ('furni_bardeskcorner_polyfon*7_desc', 'Green Mode Bardesk Corner'), + ('alert_donate_content', 'The other Habbo has not put anything into the trade. Are you sure you want to give away your furni?'), + ('furni_hc_rllr_name', 'HC Rollers Set'), + ('furni_divider_nor1_desc', 'Looks squishy, but isn\'t'), + ('furni_nouvelle_trax_desc', ''), + ('wallitem_jp_sheet3_name', 'jp_sheet3'), + ('furni_hyacinth2_name', 'Blue Hyacinth'), + ('furni_sound_machine_name', 'Sound Machine'), + ('console_getmessage_sender', 'Sender:'), + ('furni_sandrug_name', 'Tropical Beach Rug'), + ('nav_updatenote_header', 'Note!'), + ('furni_pillar*4_desc', 'From the time of the Kick Warz'), + ('furni_waterbowl*1_name', 'Red Water Bowl'), + ('furni_grand_piano*5_name', 'Onyx Grand Piano'), + ('furni_redhologram_name', 'Holo-girl'), + ('sound_machine_alert_playlist_full', 'Could not save playlist! Playlists can have only %count% songs.'), + ('nav_rooms_search', 'Search'), + ('nav_venue_cunning_fox_gamehall/5_name', 'Poker'), + ('nav_venue_habbo_lido_ii_name', 'Habbo Lido II'), + ('furni_barchair_silo*9_desc', 'Practical and convenient'), + ('pet_nature', 'Nature:'), + ('furni_wood_tv_name', 'Large TV'), + ('poster_2008_desc', 'Once every four Habbo years!'), + ('poster_38_desc', 'For really TOUGH Habbos!'), + ('nav_venue_bb_lobby_expert_0_name', 'Expert'), + ('furni_chair_plasto*14_desc', 'Aqua chair'), + ('furni_queue_tile1*6_name', 'Blue Habbo Roller'), + ('poster_522_name', 'The flag of Japan'), + ('furni_chair_basic*3_name', 'Black Pura Egg Chair'), + ('nav_venue_pizza_desc', 'Tunnelmallinen pizzapaikka kiireettömään nautiskeluun.'), + ('furni_jp_tray6_desc', 'jp_tray6'), + ('furni_hc_btlr_desc', 'Your personal caretaker'), + ('furni_song_disk_desc', 'Burn, baby burn'), + ('furni_deadduck2_name', 'Dead Duck 2'), + ('furni_statue_name', 'Cupid Statue'), + ('furni_scifirocket*5_name', 'Uranus Smoke Machine'), + ('nav_gobutton', 'Go'), + ('recycler_furni_not_recyclable', 'This Furniture cannot be recycled. Please only use Furniture that has the recyclable tag in your hand.'), + ('furni_gothic_sofa*5_name', 'Green Gothic Sofa'), + ('furni_sound_set_32_desc', 'Piano concert set'), + ('furni_chair_plasto*10_name', 'Chair'), + ('nav_venue_bb_lobby_tournament_2_name', 'Competitie Battle Ball 3'), + ('furni_grand_piano*1_desc', 'Turquoise Grand Piano'), + ('buddyremove_windowheader', 'Your friends list is full.'), + ('furni_pillar*0_name', 'Greek Pillar'), + ('gs_title_countdown', 'Game Is About To Begin'), + ('furni_glass_sofa*3_name', 'Glass sofa'), + ('furni_hc_crtn_desc', 'Topnotch privacy protection'), + ('furni_waterbowl*5_desc', 'Aqua unlimited'), + ('furni_table_silo_small*4_desc', 'Beige Area Occasional Table'), + ('furni_jp_tray2_name', 'jp_tray2'), + ('furni_rare_moonrug_desc', 'Desolation rocks!'), + ('furni_val_teddy*3_name', 'Green Share Bear'), + ('furni_sleepingbag*10_desc', 'Ultimate coziness'), + ('furni_bar_polyfon_desc', 'You naughty Habbo!'), + ('furni_sofachair_polyfon*2_desc', 'Black Mode Armchair'), + ('furni_exe_sofa_name', 'Executive 3-Seater Sofa'), + ('furni_divider_silo1*4_desc', 'Beige Area Corner Shelf'), + ('poster_2004_name', 'Rasta Poster'), + ('furni_bench_armas_name', 'Bench'), + ('furni_soft_sofachair_norja_desc', 'Soft iced sofachair'), + ('nav_venue_bb_lobby_beginner_14_name', 'Beginners Battle Ball 15'), + ('gs_button_rejoin', 'Play again!'), + ('furni_marquee*8_name', 'Ultramarine Marquee'), + ('furni_tile_marble_desc', 'Slick sophistication; now 10% off!'), + ('hubu_info_url_1', 'http://www.habbohotel.co.uk/habbo/en/help/12'), + ('console_requests', 'Friend Request(s)'), + ('furni_sleepingbag*4_name', 'Army Sleeping Bag'), + ('furni_plant_yukka_desc', 'Easy to care for'), + ('NUF_getting_room_own_rooms_createroom', 'Empty? That\'s because you don\'t have any rooms yet. If it isn\'t empty then you already have made a room, which makes me wonder...'), + ('furni_glass_sofa*6_desc', 'Translucent beauty'), + ('ph_exit', 'Exit In Normal Clothes'), + ('pet_race_0_024', 'Black-eyed Boxer'), + ('furni_marquee*7_name', 'Purple Marquee'), + ('pet_race_0_023', 'Dotty Dalmatian'), + ('recycler_info_timeout', 'Your recycling was completed, but you did not accept it in time. Please press the cancel button below to have your recyclable items restored to your hand. To recycle these items you will need to begin the process again.'), + ('pet_race_0_022', 'Schnitzel Snatcher'), + ('hubu_info_url_2', 'http://www.talktofrank.com/'), + ('pet_race_0_021', 'Loyal Labrador'), + ('nav_venue_snowwar_lobby/0_desc', 'Snow Storm LobbyCome and be a Snow Stormer!'), + ('pet_race_0_020', 'Patchy Pup'), + ('furni_chair_plasto*8_name', 'Chair'), + ('furni_sofachair_silo*9_desc', 'Red Area Armchair'), + ('nav_venue_bb_lobby_beginner_17/0_desc', ''), + ('furni_hc_dsk_desc', 'For Habbo scholars'), + ('furni_wooden_screen*8_name', 'Night Blue Oriental Screen'), + ('gs_lounge_skill_no_min', 'No minimum'), + ('summer_chair_8_name', 'Yellow Deck Chair'), + ('gs_score_tie', 'The game ended in a tie!'), + ('nav_people', 'Who\'s in here?'), + ('furni_gothic_sofa*2_desc', 'Stylish seating for two'), + ('furni_summer_chair*8_name', 'Yellow Deck Chair'), + ('roomatic_roomname', 'Room name:'), + ('furni_ham_desc', 'Tuck in'), + ('nav_venue_star_lounge_desc', 'Is there a VIP visitor in the hotel?'), + ('furni_bardeskcorner_polyfon*3_name', 'White Corner Desk'), + ('gs_specnum', 'Number of spectators: \\x'), + ('furni_bed_budget*3_name', 'Black Pura Double Bed'), + ('furni_shelves_norja*6_name', 'Blue Bookcase'), + ('partner_registration_link', 'Finish registration'), + ('furni_pillar*1_name', 'Pink Marble Pillar'), + ('reg_olderage', 'I am 11 or older'), + ('furni_glass_stool*4_name', 'Glass stool'), + ('back', 'Back'), + ('furni_tile_yell_desc', 'In a choice of colours'), + ('club_confirm_text3', 'Buy more and pay less: 6 Months (186 days) of Habbo Club cost only 105 Credits. You have %credits% credits in your Purse.\\r\\r After buying the membership, you will immediately be part of the Habbo VIP Community.'), + ('furni_sofa_silo_desc', 'Cushioned, understated comfort'), + ('club_confirm_text1', '1 Habbo Club Month (31 days) costs 25 Credits. You have %credits% Credits in your Purse.\\r\\r After buying the membership, you will immediately be part of the Habbo VIP Community.'), + ('club_confirm_text2', 'Buy more and pay less: 3 Months (93 days) of Habbo Club cost only 60 Credits. You have %credits% credits in your Purse.\\r\\r After buying the membership, you will immediately be part of the Habbo VIP Community.'), + ('furni_carpet_legocourt_name', 'Basketball Court'), + ('furni_present_gen3_name', 'Gift'), + ('furni_sound_set_2_desc', 'Get the party started!'), + ('furni_barchair_silo*6_name', 'Blue Bar Stool'), + ('furni_arabian_bigtb_name', 'Amanjena Table'), + ('interface_icon_catalog', 'Catalogue, furnishing your room'), + ('furni_hologram_desc', 'As if by magic...'), + ('nav_venue_sw_lobby_expert_1/0_desc', ''), + ('furni_carpet_standard*1_name', 'Floor Rug'), + ('nav_owner', 'Owner'), + ('furni_glass_chair*2_desc', 'Translucent beauty'), + ('furni_rcandleset_name', 'Red Candle Plate'), + ('furni_divider_nor1*6_name', 'Blue Ice corner'), + ('nav_private_helptext_hd', 'Rooms'), + ('furni_sound_set_27_name', 'Groove 2'), + ('furni_drinks_name', 'Empty Cans'), + ('pet.saying.eat.cat.0', 'mmm...thumm, thumm'), + ('gs_title_nextround', 'Next game...'), + ('pet.saying.eat.cat.1', 'lap, lap, lap, lap'), + ('furni_scifirocket*9_desc', 'Something fishy is going on...'), + ('pet.saying.eat.cat.2', '*munch, munch*'), + ('pet.saying.sleep.dog.0', 'zzZZZzzz'), + ('furni_noob_lamp*4_name', 'My first Habbo lamp'), + ('nav_venue_sw_lobby_beginner_8_name', 'Snow Rookies Lobby'), + ('nav_venue_library/0_desc', 'Time to catch up on some studying'), + ('camera_dialog_open', 'Shoot'), + ('furni_lamp_armas_desc', 'Ambient lighting is essential'), + ('buddyremove_pleasewait', 'Please wait a second...'), + ('friend_request_options', 'Advanced options.'), + ('transaction_system_web_internal', 'Housekeeping purchase'), + ('furni_rare_dragonlamp*5_name', 'Elf Green Dragon Lamp'), + ('furni_bar_chair_armas_desc', 'The ultimate recycled furniture'), + ('room_ignore', 'Shutup'), + ('poster_518_desc', 'A fiery dragon for your wall'), + ('furni_soft_sofa_norja*7_desc', 'Sit back and relax'), + ('object_displayer_show_tags', 'Show tags'), + ('furni_goth_table_desc', 'The dark side of Habbo'), + ('club_txt_changesubscr', 'Change subscription'), + ('Alert_RememberSetYourPassword', 'Please check your password'), + ('reg_verification_checking', 'Checking...'), + ('furni_silo_studydesk_desc', 'For the true Habbo Scholars'), + ('room_give_rights', 'Give rights'), + ('furni_CF_50_goldbar_name', 'Gold Bar'), + ('furni_rom_lamp_name', 'Crystal Lamp'), + ('furni_sofachair_polyfon*8_desc', 'Yellow Mode Armchair'), + ('furni_deadduck3_name', 'Dead Duck 3'), + ('furni_bed_polyfon_one*4_name', 'Beige Mode Single Bed'), + ('furni_noob_stool*1_desc', 'Unfold me and take the weight off (orange)'), + ('furni_stand_polyfon_z_name', 'Shelf'), + ('furni_prize3_name', 'Bronze Trophy'), + ('club_status_text', 'Here you can see your Habbo Club membership status, number of elapsed months, pre-ordered months and status of the ongoing month.'), + ('furni_table_plasto_bigsquare*9_desc', 'Hip plastic furniture'), + ('furni_wooden_screen*4_desc', 'Add an exotic touch to your room'), + ('furni_sound_set_52_name', 'Christmas Party'), + ('furni_CF_1_coin_bronze_name', 'Bronze Coin'), + ('furni_tile_brown_name', 'Red Tile'), + ('nav_venue_bb_lobby_intermediate_5/0_desc', ''), + ('nav_venue_picnic/0_name', 'Picnic Garden'), + ('furni_sound_set_50_desc', 'The harder generation'), + ('furni_lamp2_armas_name', 'Lodge Candle'), + ('registration_disabled_text', 'You can\'t create new Habbos at the moment. Please try again [some date]..'), + ('catalog_selectproduct', 'Select product:'), + ('transaction_system_sms_telia', 'Telia'), + ('nav_venue_bb_lobby_intermediate_5_name', 'Semi-profs Battle Ball 6'), + ('furni_christmas_sleigh_name', 'Winter Sleigh'), + ('furni_scifirocket*8_desc', 'From a space far, far away!'), + ('furni_bed_budget*9_name', 'Red Pura Double Bed'), + ('poster_2000_desc', 'Suomen kartta'), + ('help_emergency_whathappens', 'A member of community staff will investigate the situation and take appropriate action. This may include sending you a response with advice on dealing with your issue.'), + ('purse_coins', 'Habbo Credits'), + ('furni_marquee*5_desc', 'It\'s both door and a shade!'), + ('club_txt_whatis', 'What is Habbo Club?'), + ('furni_present_gen2_name', 'Gift'), + ('trading', 'Trading'), + ('furni_sofa_silo*9_desc', 'Red Area Sofa'), + ('furni_summer_chair*9_name', 'Red Deck Chair'), + ('furni_shelves_armas_desc', 'For all those fire-side stories'), + ('purse_buy_coins', 'Buy Credits'), + ('room_confirmPlace', 'Are you sure?'), + ('furni_queue_tile1*3_desc', 'The power of movement'), + ('furni_soft_sofachair_norja*8_name', 'Yellow Iced Sofachair'), + ('furni_arabian_snake_desc', 'Beware the snake!'), + ('nav_venue_sw_lobby_tournament_6/0_desc', ''), + ('NUF_about_hotel', 'What\'s Habbo about?'), + ('furni_bardeskcorner_polyfon_desc', 'Tuck it away'), + ('furni_bardeskcorner_polyfon*4_name', 'Beige Mode Bardesk Corner'), + ('poster_13_desc', 'Arty black and white'), + ('nav_venue_bb_lobby_beginner_9/0_desc', ''), + ('nav_modify_nameshow', 'Show your name in the room info'), + ('NUF_mini_use_console_read_next', 'Click \'OK\' to mark message as read.'), + ('poster_1005_desc', 'The muscly movie hero'), + ('wallitem_jp_sheet2_name', 'jp_sheet2'), + ('furni_xmas_cstl_gate_desc', 'Let that icy draft out!'), + ('NUF_groups_url', 'http://d16-1.web.varoke.net/home/group-tutorial'), + ('furni_jp_irori_name', 'Irori'), + ('furni_jp_bamboo_desc', 'Watch out for pandas!'), + ('furni_christmas_reindeer_name', 'Reindeer'), + ('furni_glass_chair*4_name', 'Glass chair'), + ('furni_jp_tray5_desc', 'jp_tray5'), + ('furni_table_plasto_4leg*4_desc', 'Hip plastic furniture'), + ('NUF_getting_items_catalogue_purse', 'Click to open your Purse and find out how to get some Habbo Credits . You can use these to buy stuff!'), + ('furni_hc_tbl_name', 'Nordic Table'), + ('furni_bed_budget_one*6_name', 'Blue Pura Bed'), + ('furni_solarium_norja*7_name', 'Rural Solarium'), + ('console_newmessages', 'New Message(s)'), + ('poster_2_desc', 'Take pride in your veg!'), + ('furni_xmas_cstl_twr_desc', 'All I see from up here is snow!'), + ('hubu_info', 'Welcome to the FRANK Infobus! For the next three months FRANK advisors who know a lot about drugs, their effects and the risks involved, will be stepping aboard the Infobus to offer advice and support to any Habbo that wants to visit the bus. For more information click the link below:'), + ('furni_bardesk_polyfon*6_name', 'Blue Mode Bardesk'), + ('furni_summer_pool*3_name', 'Green Summer Pool'), + ('furni_pura_mdl3*8_name', 'yellow pura module 3'), + ('furni_valentinescreen_name', 'Holiday Romance'), + ('furni_rare_beehive_bulb*1_desc', 'A honey-hued glow'), + ('gs_link_gamerules', 'Game Rules'), + ('nav_venue_bb_lobby_tournament_11/0_desc', ''), + ('sound_machine_song_info', 'Song Info'), + ('wallitem_arabian_swords_name', 'Ancestral Scimitars'), + ('furni_one_way_door*6_desc', 'One way! The HC way!'), + ('furni_table_plasto_round*2_desc', 'Hip plastic furniture'), + ('credit', 'Credit'), + ('gs_lounge_skill_no_max', 'Infinite'), + ('furni_wall_china_desc', 'For your great wall'), + ('NUF_visiting_rooms_roomlist_add to fav', 'After clicking on a room you can click this button here to add it to favourites.'), + ('furni_carpet_polar*3_name', 'Yellow Bear Rug'), + ('poster_46_desc', 'Twinkle, twinkle'), + ('furni_petfood1_desc', 'Fantastic 20% Saving!'), + ('url_nobalance', 'http://%predefined%/credits?'), + ('furni_sofachair_silo*6_name', 'Blue Area Armchair'), + ('furni_noob_chair*1_desc', 'Lightweight, practical and yellow'), + ('nav_venue_bb_lobby_expert_7/0_desc', ''), + ('furni_pura_mdl1*7_name', 'Green Pura Module 1'), + ('furni_table_silo_small*6_name', 'Blue Area Occasional Table'), + ('club_thanks_title', 'Congratulations! You are now a member of Habbo Club.'), + ('furni_legotrophy_name', 'Basketball Trophy'), + ('roomatic_createyrown', 'Create Your Own Room'), + ('console_report_remove', 'Remove'), + ('furni_sound_set_42_desc', 'Bumps and Chills'), + ('furni_divider_nor5*5_desc', 'Cool cornering for your crib y0!'), + ('furni_rare_icecream*2_desc', 'Virtual pistachio rocks!'), + ('furni_pura_mdl4*6_name', 'Blue Pura Module 4'), + ('club_button_close', 'Close Window'), + ('wallitem_md_can_name', 'Bubble Juice Can'), + ('furni_prizetrophy7_desc', 'Palkinto'), + ('nav_venue_cunning_fox_gamehall/2_desc', 'Keep your head down, it\'s bombs away'), + ('poster_28_desc', '10 x Silver Tinsel'), + ('furni_rare_dragonlamp*2_desc', 'Oriental beast of legends'), + ('furni_glass_sofa*2_name', 'Glass sofa'), + ('modtool_hours', 'Hours'), + ('nav_venue_emperors_name', 'Emperor\'s hall'), + ('catalog_buyingSuccesfull', 'Buying Successful!'), + ('console_concurrency_error', 'There was a concurrency error while modifying friend list'), + ('furni_table_silo_med*3_desc', 'Wipe clean and unobtrusive'), + ('furni_sleepingbag*8_desc', 'Ultimate coziness for SnowStorm winners'), + ('poster_508_desc', 'The flag of Spain'), + ('furni_goodie1*2_desc', 'Crunchy Dog Treat'), + ('nav_venue_sw_lobby_free_3/0_desc', ''), + ('furni_chair_basic*7_desc', ''), + ('room_take_rights', 'Remove Rights'), + ('furni_hc_bkshlf_desc', 'For the scholarly ones'), + ('furni_bed_polyfon*2_desc', 'Black Mode Double Bed'), + ('furni_table_plasto_4leg_name', 'Occasional Table'), + ('furni_bed_budget*7_desc', 'King sized comfort!'), + ('win_partner_registration', 'Partner registration'), + ('summer_chair_4_desc', 'Please tan responsably'), + ('furni_table_norja_med_name', 'Coffee Table'), + ('nav_venue_club_massiva/2_desc', 'Make all the right moves'), + ('furni_divider_silo1_desc', 'Neat and natty'), + ('hobba_send_reply', 'Send Alert'), + ('shopping_nocash', 'You don\'t have enough Credits in your Purse.\\r Click \'OK\' to see the different ways of\\rgetting Habbo Credits.'), + ('furni_divider_poly3*9_name', 'Red Hatch'), + ('furni_rare_fountain*1_desc', 'For our feathered friends'), + ('poster_56_desc', 'Serious partying going on!'), + ('furni_scifiport*6_name', 'White Sci-Fi Port'), + ('furni_rclr_garden_desc', 'Self watering'), + ('furni_arabian_tray1_desc', 'Tea for every occasion'), + ('furni_rare_fountain*3_name', 'Bird Bath (blue)'), + ('furni_romantique_pianochair*1_name', 'Rose Quartz Piano Stool'), + ('furni_romantique_divider*1_desc', 'Beauty lies within'), + ('wallitem_post.it.vd_name', 'Heart Stickies'), + ('wallitem_torch_desc', 'The dark side of Habbo'), + ('roomatic_namedisplayed', 'Do you want your name to be displayed with the room?'), + ('furni_grunge_candle_name', 'Candle Box'), + ('furni_sound_set_17_name', 'Groove 3'), + ('furni_prizetrophy3*2_name', 'Globe trophy'), + ('furni_chair_silo_desc', 'Keep it simple'), + ('nav_venue_sw_lobby_beginner_7/0_desc', ''), + ('nav_venue_sw_lobby_beginner_3/0_desc', ''), + ('furni_hc_trll_name', 'Drinks Trolley'), + ('furni_bed_polyfon_one*7_desc', 'Green Mode Single Bed'), + ('furni_chair_plasto*2_name', 'Chair'), + ('furni_pura_mdl1*4_name', 'White Pura Module 1'), + ('furni_gothiccandelabra_desc', 'The dark side of Habbo'), + ('NUH_chat', 'Click here and type to chat to other Habbos.'), + ('furni_plant_valentinerose*2_name', 'White Valentine Rose'), + ('reg_privacypledge', 'Privacy Pledge'), + ('furni_exe_table_desc', 'Take a memo, Featherstone'), + ('hubu_info_link2', 'FRANK Website'), + ('furni_prizetrophy4*3_name', 'Fish trophy'), + ('furni_hc_chr_desc', 'Royal comfort'), + ('hubu_info_link1', 'FRANK Infobus Information'), + ('sound_machine_your_songs', 'Traxmachine Songs'), + ('furni_active_placeholder_name', 'This furniture is downloading...'), + ('furni_divider_silo3*8_name', 'Yellow Area Gate'), + ('NUF_visiting_rooms_categorylist_tutor', 'There are so many Guest Rooms we thought it would be a "hoot" to divide them into categories. Select a category to view its contents.'), + ('furni_sofa_silo*6_name', 'Blue Area Sofa'), + ('club_extend_failed', 'Sorry, we were unable to process the purchase. No Credits were charged!'), + ('furni_soft_sofa_norja*4_name', 'Urban Iced Sofa'), + ('furni_sporttrack3*3_desc', 'null'), + ('furni_sound_set_1_name', 'Habbo Sounds 1'), + ('furni_pura_mdl2*5_name', 'beige pura module 2'), + ('nav_venue_sw_lobby_intermediate_1/0_desc', ''), + ('furni_safe_silo*8_name', 'Yellow Safe Minibar'), + ('trading_agrees', 'agrees'), + ('alert_needpermission', 'You need your parent or guardian\'s permission to spend time in Habbo Hotel.'), + ('nav_modify', 'Modify'), + ('furni_noob_stool*4_desc', 'Unfold me and take the weight off (light blue)'), + ('catalog_length_trophymsg', 'Oops, your inscription is too long, so it won\'t fit on the trophy. \\rPlease type something shorter.'), + ('furni_s_sound_machine*3_desc', 'Sound Machine Green Desc'), + ('club_member', 'Member'), + ('modtool_ban_ip', 'Ban IP Also'), + ('bb_link_gamerules', 'Spelregels'), + ('furni_carpet_armas_name', 'Hand-Woven Rug'), + ('furni_rubberchair*5_desc', 'Soft and tearproof!'), + ('furni_table_plasto_square*1_desc', 'Hip plastic furniture'), + ('furni_divider_nor3*3_desc', 'Do go through...'), + ('nav_venue_habburger\'s/0_desc', 'Get food here!'), + ('reg_linkstitle', 'Full version of the documents:'), + ('roomevent_browser_title', 'Events'), + ('roomatic_security', 'Security'), + ('furni_table_plasto_4leg*7_desc', 'Hip plastic furniture'), + ('furni_table_plasto_round*14_desc', 'Hip plastic furniture'), + ('furni_sound_set_38_desc', 'Rock and Roses!'), + ('furni_rare_parasol*0_desc', 'Block those rays!'), + ('furni_pura_mdl3*6_desc', 'Any way you like it!'), + ('NUF_console', 'Learn about messaging'), + ('poster_45_name', 'Skeleton'), + ('furni_pura_mdl3*9_desc', 'Any way you like it!'), + ('pet_age', 'Age:'), + ('poster_48_name', 'Large gold star'), + ('open', 'Open'), + ('gs_3min', '3min'), + ('wallitem_habw_mirror_name', 'Habbowood Mirror'), + ('furni_carpet_polar*4_desc', 'Snuggle up on a Funky bear rug...'), + ('furni_table_armas_name', 'Dining Table'), + ('sw_gameprice', 'Play now for just 2 tickets!'), + ('furni_divider_nor5*4_name', 'Urban Iced Angle'), + ('navigator', 'Hotel Navigator'), + ('furni_pillow*2_desc', 'Puffy, soft and huge'), + ('purse_vouchers_checking', 'Checking code, please wait...'), + ('furni_noob_rug*4_desc', 'Nice and neat sisal rug with light blue edging'), + ('furni_safe_silo*5_name', 'Pink Safe Minibar'), + ('nav_venue_the_dirty_duck_pub/0_desc', 'The perfect place to chill!'), + ('furni_CFC_10_coin_bronze_desc', 'Worth 10 Credits'), + ('furni_teleport_door_desc', 'Magic doorway to anywhere!'), + ('furni_bardesk_polyfon_name', 'Bar/desk'), + ('login_password', 'Password'), + ('furni_pura_mdl2*8_desc', ''), + ('furni_divider_nor4*4_desc', 'Habbos, roll out!'), + ('furni_rare_fan*7_name', 'Brown Powered Fan'), + ('furni_bed_polyfon_girl_one_desc', 'Snuggle down in princess pink'), + ('club_general_elapsed', 'Elapsed Months'), + ('nav_venue_sw_lobby_free_1_name', 'Free Game Lobby'), + ('furni_gothic_chair*5_name', 'Green Gothic Chair'), + ('furni_sink_name', 'Sink'), + ('furni_bed_budget_one*4_desc', 'Prince sized comfort!'), + ('Alert_ForgotSetPassword', 'Please check your password'), + ('furni_chair_plasto*6_desc', 'Hip plastic furniture'), + ('furni_carpet_standard_desc', 'Available in a variety of colours'), + ('reg_update_text2', 'Only change them when you want to make sure that nobody can know or guess your password.'), + ('furni_arabian_swords_desc', 'Not for yielding'), + ('furni_divider_silo3*5_name', 'Pink Area Gate'), + ('furni_fireplace_polyfon_desc', 'Comfort in stainless steel'), + ('furni_glass_table*3_desc', 'Translucent beauty'), + ('furni_summer_pool*4_desc', 'Fancy a dip?'), + ('poster_500_desc', 'The UK flag'), + ('poster_1004_name', 'Eid Mubarak Poster'), + ('furni_rare_icecream*5_desc', 'Virtual vanilla rocks!'), + ('furni_one_way_door*2_name', 'Black HC Gate'), + ('furni_chair_plasty*3_desc', 'Hip plastic furniture'), + ('club_end_title', 'Your Habbo Club membership has now expired.'), + ('furni_table_polyfon_desc', 'For larger gatherings'), + ('furni_romantique_pianochair*4_desc', 'I can feel air coming through...'), + ('furni_bardesk_polyfon*3_name', 'White Bardesk'), + ('predefined_room_description', '%user_name% has entered the building'), + ('poster_53_desc', 'whack that ball!'), + ('poster_515_name', 'The Swedish flag'), + ('furni_rope_divider_desc', 'Rope Divider'), + ('furni_chair_norja*3_desc', 'Sleek and chic for each cheek'), + ('furni_scifidoor*9_name', 'Blue Spaceship Door'), + ('furni_goodie2_name', 'Chocolate Mouse'), + ('game_poker_logoff', 'Left the game'), + ('furni_bed_polyfon_desc', 'Give yourself space to stretch out'), + ('furni_table_plasto_round*5_desc', 'Hip plastic furniture'), + ('furni_couch_norja*3_desc', 'Two can perch comfortably'), + ('pet.saying.sleep.cat.2', 'Purrr... rrrr'), + ('pet.saying.sleep.cat.1', 'mrrrr..rrrr..'), + ('pet.saying.sleep.cat.0', 'hrrrrr....Mrrrrr'), + ('login_ok', 'OK'), + ('gs_button_expand', 'Expand Window'), + ('pet.saying.sleep.cat.4', 'mrrrr...muew..mrr'), + ('tutorial_next', 'Next:'), + ('pet.saying.sleep.cat.3', 'hurrr..hurrr'), + ('furni_jp_tatami_desc', 'Shoes off please'), + ('hobba_sent_to_moderators', 'Call re-assigned non-emergency, still visible to moderators'), + ('roomatic_choosecategory', ''), + ('wallitem_guitar_v_desc', 'tilulilulii'), + ('NUF_groups', 'Groups'), + ('bb_link_gameRules_url', 'http://%predefined%/groups/56552/id'), + ('nav_venue_theatredrome_halloween_name', 'Theatredrome Habboween'), + ('bb_buyTicketsButton', 'Buy tickets'), + ('furni_gothgate_desc', 'The dark side of Habbo'), + ('game_poker_waiting', 'Change done.\\rWaiting for the other players'), + ('furni_glass_stool*7_desc', 'Habbo Club'), + ('club_end_text', 'BUT, don\'t worry, you can still buy another month of Habbo Club and keep all your Habbo Club benefits,special Furni gifts and the shiny badge!'), + ('furni_sound_set_18_desc', 'Listen while you tan'), + ('furni_sound_set_35_desc', 'Groovelicious'), + ('furni_prizetrophy2*2_desc', 'Shiny silver'), + ('furni_plant_valentinerose*3_desc', 'Relight your passions'), + ('furni_romantique_divan*5_name', 'Onyx Chaise-Longue'), + ('furni_chair_norja*6_desc', 'Sleek and chic for each cheek'), + ('wallitem_hrella_poster_2_desc', 'For those scary Lido moments'), + ('furni_s_sound_machine*6_desc', 'Sound Machine Purple'), + ('game_bs_miss', 'Miss:'), + ('furni_carpet_standard*4_desc', 'Available in a variety of colours'), + ('furni_pura_mdl1*1_name', 'Aqua Pura Module 1'), + ('furni_rare_icecream*8_desc', 'Virtual peppermint rocks!'), + ('furni_petfood4_desc', 'Fantastic 20% Saving!'), + ('furni_table_silo_small*3_name', 'White Occasional Table'), + ('furni_table_plasto_round*8_desc', 'Hip plastic furniture'), + ('furni_chair_polyfon_desc', 'Metallic seating experience'), + ('furni_exe_drinks_desc', 'Give a warm welcome'), + ('nav_createroom', 'Create Own Room'), + ('furni_table_plasto_bigsquare*14_desc', 'Hip plastic furniture'), + ('poster_1001_name', 'Prince Charles Poster'), + ('furni_CF_20_moneybag_name', 'Sack of Credits'), + ('furni_prizetrophy5*1_name', 'Duo trophy'), + ('alert_reg_email', 'Email'), + ('pet_thirsty', 'Thirst:'), + ('nav_error_passwordtooshort', 'The password is too short.'), + ('nav_venue_sw_lobby_free_7_name', 'Free Game Lobby'), + ('furni_plant_valentinerose*5_name', 'Purple Valentine Rose'), + ('recycler_status_info', 'You have Furniture in recycling. The icon will blink when recycling is complete.'), + ('poster_52_name', 'Hockey Stick'), + ('win_doorbell', 'Doorbell'), + ('Unreadmessages', 'New Message(s)'), + ('furni_queue_tile1*9_desc', 'The power of movement'), + ('furni_rare_snowrug_name', 'Snow Rug'), + ('console_approve_selected', 'Accept selected'), + ('pet_race_0_009', 'Hound of Hull'), + ('poster_35_name', 'The Habbo Babes 1'), + ('pet_race_0_008', 'Springy Spaniel'), + ('furni_sofa_polyfon*3_desc', 'Comfort for stylish couples'), + ('furni_basket_name', 'Basket Of Eggs'), + ('pet_race_0_007', 'Slobber Don'), + ('pet_race_0_006', 'Stripy Setter'), + ('pet_race_0_005', 'Paws Forethought'), + ('pet_race_0_004', 'Droopy of Pawford'), + ('furni_barchair_silo_desc', 'Practical and convenient'), + ('furni_noob_lamp*2_desc', 'Get the light right where you want it (dark blue)'), + ('pet_race_0_003', 'Rescue Bernard'), + ('furni_glass_stool_name', 'Glass stool'), + ('pet_race_0_002', 'Joe Cocker Spaniel'), + ('pet_race_0_001', 'Habbo Husky'), + ('pet_race_0_000', 'Yappy Yorkie'), + ('NUF_mini_endtopic_step1_questionmark', 'Click to see our help menu and find our FAQs!'), + ('furni_sound_set_28_desc', 'Head for the pit!'), + ('nav_private_norooms', 'You dont have any rooms - create one?'), + ('furni_table_plasto_square*4_desc', 'Hip plastic furniture'), + ('furni_val_teddy*6_name', 'Blue Share Bear'), + ('furni_noob_table*3_desc', 'Lightweight, practical and aubergine'), + ('gs_state_finished', 'This Game is already over!'), + ('furni_rare_fan*8_desc', 'Stylish, Eco-Energy!'), + ('reg_parentemail_link_url1', 'http://%predefined%//help/parents_guide.html'), + ('furni_gothic_carpet2_desc', 'What lies beneath?'), + ('furni_rare_fan*5_desc', 'It\'ll blow you away!'), + ('modtool_kickuser', 'Kick User'), + ('furni_divider_silo1*7_desc', 'Green Area Corner Shelf'), + ('reg_parentemail_link_url2', 'http://%predefined%//footer_pages/privacy_policy.html'), + ('pet_race_0_019', 'Tiny Terrier'), + ('pet_race_0_018', 'Bushy Woofer'), + ('pet_race_0_017', 'Speckled Sheepdog'), + ('furni_rubberchair*8_desc', 'Soft and tearproof for HC!'), + ('pet_race_0_016', 'Murmurin\' Minimastiff'), + ('poster_42_name', 'Spiderweb'), + ('pet_race_0_015', 'Pixie Poodle'), + ('furni_safe_silo*2_name', 'Black Safe Minibar'), + ('pet_race_0_014', 'Whiffy Woofy'), + ('pet_race_0_013', 'Mangy Mutt'), + ('nav_publicRooms', 'Public Spaces'), + ('pet_race_0_012', 'Tawny Bleugh'), + ('pet_race_0_011', 'Lappy Lassie'), + ('pet_race_0_010', 'Furry McScottie'), + ('game_bs_toast', 'Toast!'), + ('furni_prizetrophy6_name', 'Pokaali'), + ('furni_pudding_desc', 'Will you get the lucky sixpence?'), + ('furni_tile_red_desc', 'In a choice of colours'), + ('nav_venue_sw_arena_expert_name', 'Playing expert game'), + ('pet.saying.sleep.croco.0', 'Zzzz... zzzzz...'), + ('poster_50_desc', 'flap, flap, screech, screech...'), + ('furni_shelves_norja*9_name', 'Red Bookcase'), + ('furni_sound_set_4_name', 'Ambient 1'), + ('furni_exe_s_table_desc', 'Get a clear reflection!'), + ('furni_present_gen6_desc', 'What\'s inside?'), + ('furni_one_way_door*5_name', 'Pink One Way Gate'), + ('nav_search_hd', 'Search rooms by Habbo name or room name.'), + ('poster_20_desc', 'high security for your room'), + ('buddyremove_messenger_updating', 'The console is updating, try again in a minute... Everything else is working fine!'), + ('pet.saying.sleep.croco.3', ':)'), + ('furni_house2_desc', 'Good enough to eat'), + ('pet.saying.sleep.croco.4', '*Snuh snuh*'), + ('tutorial_offtopic', 'Oops! You got off the topic. Please restart or select a new topic.'), + ('pet.saying.sleep.croco.1', 'Yrgh... Yrgh...'), + ('jukebox_now_playing', 'Now playing:'), + ('pet.saying.sleep.croco.2', 'Frgh... Frgh...'), + ('furni_sound_set_25_desc', 'Actually, it\'s Partay!'), + ('club_intro_header', 'Welcome to Habbo Club, the members-only club that all VIP Habbos belong to!'), + ('nav_venue_sw_lobby_amateur_3/0_desc', 'Astetta rankempaa lumisotaa.'), + ('pet.saying.sleep.croco.5', 'Rawwwwwwwwrrrm...'), + ('pet.saying.sleep.croco.6', 'Mmmm... Hooks...'), + ('furni_table_plasto_bigsquare*1_desc', 'Hip plastic furniture'), + ('nav_venue_sw_lobby_free_4_name', 'Free Game Lobby'), + ('alert_warning', 'Moderator says:'), + ('furni_barrier*3_name', 'Red Road Barrier'), + ('nav_venue_floatinggarden_name', 'Floating Garden'), + ('gs_error_nocredits', 'You need Habbo Credits to play a Game!'), + ('furni_chair_plasto*5_name', 'Chair'), + ('furni_tree2_desc', 'Old Christmas Tree'), + ('furni_bed_budget_one*7_desc', 'Prince sized comfort!'), + ('furni_romantique_clock_name', 'romantique_clock'), + ('room_banner_text', ''), + ('furni_sleepingbag*2_desc', 'Ultimate coziness'), + ('furni_divider_nor4*3_name', 'White Iced Auto Shutter'), + ('jukebox_song_remaining', 'Remaining time: %time%'), + ('reg_note_text', 'Never change your password or email\\rif someone else asks you to - they will\\rsteal your furni and Credits!'), + ('habbo_hand_next', '>>>'), + ('nav_venue_orient/0_desc', 'Tres chic with an Eastern twist. For Habbo Club members only.'), + ('furni_easterduck_name', 'Wannabe bunny'), + ('login_forgottenPassword', 'Forgotten your password?'), + ('furni_prizetrophy*1_desc', 'Glittery gold'), + ('hubu_t2_2', ''), + ('hubu_t2_3', 'Vapaa-ajan linkkejä'), + ('decision_cancel', 'Cancel'), + ('nav_venue_bb_lobby_tournament_2/0_desc', ''), + ('furni_samovar_desc', 'Click for a refreshing cuppa'), + ('furni_rcandle_name', 'Red Candle'), + ('furni_waterbowl*4_name', 'Blue Water Bowl'), + ('furni_table_norja_med*7_name', 'Rural Iced Coffee Table'), + ('NUF_playing_games_room_tutor', 'See some people wandering around? They are psyching themselves up for a game. Game Tickets are usually 2 Habbo Credits, but in this room the games are free.'), + ('furni_doormat_love_name', 'Doormat'), + ('bb_link_tournament_highScores_url', 'http://%predefined%//groups/56552/id'), + ('furni_sofachair_polyfon*4_name', 'Beige Mode Armchair'), + ('error_room_full', 'Huone on täynnä.'), + ('furni_chair_silo*4_desc', 'Beige Silo Dining Chair'), + ('furni_divider_nor2*7_name', 'Rural Iced Bar'), + ('hubu_t2_1', ''), + ('furni_divider_nor1*9_name', 'Red Ice corner'), + ('furni_wooden_screen*0_name', 'White Oriental Screen'), + ('furni_chair_basic*1_desc', ''), + ('gs_choose_gamename', 'Enter A Name For Your Game:'), + ('poll_question_number', 'Question %number%/%count%'), + ('furni_hc_rllr_desc', 'Highest class transportation'), + ('furni_table_plasto_4leg*15_desc', 'Hip plastic furniture'), + ('furni_scifiport*9_name', 'Violet Sci-Fi Port'), + ('furni_jukebox*1_desc', 'For your Happy Days!'), + ('furni_red_tv_desc', 'Don?t miss those soaps'), + ('furni_song_disk_name', 'Traxdisc'), + ('reg_agree_alert', 'You have to agree to the terms of service\\r(tick the box).'), + ('furni_summer_chair*1_desc', 'Got your swimming trunks?'), + ('poster_2008_name', 'Habbo Leap Day Poster'), + ('poster_505_desc', 'The Canadian flag'), + ('group_homepage', 'Groups\' Homepage >>>'), + ('furni_table_silo_med*6_desc', 'Blue Area Coffee Table'), + ('nav_venue_tearoom/0_name', 'Chinese Tea Room'), + ('dimmer_use_bg_only', 'Background only'), + ('furni_divider_poly3*4_name', 'Beige Mode Bardesk Gate'), + ('nav_venue_hotel_kitchen/0_desc', 'Beware the flying knives!'), + ('furni_divider_silo1*8_desc', 'Neat and natty'), + ('furni_hc_btlr_name', 'Electric Butler'), + ('furni_wooden_screen*5_name', 'Gray Oriental Screen'), + ('furni_scifiport*8_name', 'Purple Sci-Fi Port'), + ('furni_carpet_standard*5_name', 'Floor Rug'), + ('trading_offers', 'offers:'), + ('furni_prizetrophy2*3_name', 'Duck trophy'), + ('transaction_system_club_habbo', 'Habbo Club payment'), + ('nav_venue_bb_lobby_tournament_9/0_desc', ''), + ('poster_517_name', 'The Scottish flag'), + ('furni_wood_tv_desc', 'For family viewing'), + ('furni_deadduck2_desc', 'Someone forgot to feed me...'), + ('furni_sound_set_20_desc', 'Musical heaven'), + ('sound_machine_new', 'Create a New Song'), + ('nav_venue_the_chromide_club/0_desc', 'Ghetto Fabulous'), + ('nav_modify_doorstatus_pwagain', 'pw again:'), + ('furni_chair_plasto*10_desc', 'Hip plastic furniture'), + ('gs_idlewarning', 'You will be replaced if you don\'t start or join a Game soon!'), + ('purse_vouchers_entercode', 'Enter code here:'), + ('sound_machine_song_name', 'Untitled Trax'), + ('furni_sofa_polyfon*4_name', 'Beige Mode Sofa'), + ('furni_carpet_standard*a_name', 'Floor Rug'), + ('poster_510_name', 'The Italian flag'), + ('furni_table_plasto_square*7_name', 'Square Dining Table'), + ('furni_noob_chair*6_desc', 'Lightweight, practical with dark yellow stripes'), + ('forgottenpw_whatyou', 'What\'s your Habbo called?'), + ('nav_venue_bb_lobby_amateur_1_name', 'Gevorderden Battle Ball 2'), + ('furni_noob_table*6_name', 'My first Habbo table'), + ('furni_pillar*0_desc', 'Classy architect, for holding up ceilings!'), + ('poster_1002_desc', 'aw, bless...'), + ('furni_divider_arm1_desc', 'Good solid wood'), + ('furni_glass_stool*8_name', 'Glass stool'), + ('furni_rare_moonrug_name', 'Moon Patch'), + ('nav_venue_rooftop_rumble/0_desc', 'Are you ready?'), + ('transaction_system_sms_sonera', 'Sonera'), + ('furni_waterbowl*5_name', 'Brown Water Bowl'), + ('furni_sound_set_32_name', 'Instrumental 2'), + ('furni_table_silo_small*4_name', 'Beige Area Occasional Table'), + ('furni_prizetrophy8*1_name', 'Duo trophy'), + ('tutorial_menu', 'Get help with...'), + ('gs_2teams', '2 Teams Game'), + ('furni_sound_machine*4_desc', 'For Funky, Funky Fridays!'), + ('furni_romantique_divan*4_desc', 'Is that a cape hanging there?'), + ('furni_couch_norja*8_desc', 'Two can perch comfortably'), + ('console_usersnotfound', 'Habbo Not Found'), + ('nav_venue_bb_lobby_amateur_2/0_desc', ''), + ('furni_sleepingbag*4_desc', 'Ultimate coziness'), + ('furni_bed_budget_one*6_desc', 'Prince sized comfort!'), + ('furni_sw_chest_desc', ''), + ('nav_venue_bb_lobby_amateur_5/0_desc', ''), + ('NUF_visiting_rooms_room_tutor', 'This is a Guest Room. You can either quit the tutorial and start meeting people, or select the next topic.'), + ('furni_jp_pillow_name', 'Pillow Chair'), + ('url_logged_out', 'http://%predefined%/account/disconnected?reason=logout&origin=popup'), + ('furni_romantique_smalltabl*1_name', 'Rose Quartz Tray Table'), + ('friend_request_declined', 'Declined!'), + ('furni_grunge_shelf_desc', 'Scrap books and photo albums'), + ('furni_gothic_stool*6_name', 'Gothic Stool Blue'), + ('wallitem_gothicfountain_desc', 'Not suitable for drinking!'), + ('furni_scifiport*1_name', 'Gold Laser Gate'), + ('furni_sound_set_41_name', 'Rock 8'), + ('furni_toilet_yell_name', 'Loo Seat'), + ('console_fr_limit_exceeded_error', 'Too many friends selected. Please remove some first.'), + ('console_asktobecomeafriend', 'Ask To Become A Friend'), + ('console_friends', 'Friends'), + ('furni_table_plasto_bigsquare*4_desc', 'Hip plastic furniture'), + ('poster_2005_desc', 'The Special Infobus Poster'), + ('furni_summer_chair*8_desc', 'Got your sun cream?'), + ('furni_s_sound_machine*2_name', 'Sound Machine Ocean'), + ('nav_ringbell', 'The door is locked. Ringing the bell, and waiting...'), + ('console_profilematch', 'Habbo Profile match -'), + ('poster_14_name', 'Fox Poster'), + ('furni_bardeskcorner_polyfon*3_desc', 'Tuck it away'), + ('furni_carpet_soft*2_name', 'Soft Wool Rug'), + ('furni_ham_name', 'Joint of Ham'), + ('nav_venue_star_lounge_name', 'Star Lounge'), + ('nav_venue_bb_lobby_beginner_desc', 'Beginner battle ball'), + ('furni_doormat_plain*3_desc', 'Available in a variety of colours'), + ('furni_habbowood_chair_desc', 'Exclusively for Directors'), + ('nav_venue_bb_lobby_beginner_3/0_desc', ''), + ('furni_CF_20_moneybag_desc', 'Worth 20 Credits'), + ('furni_edice_desc', 'What\'s your lucky number?'), + ('furni_scifirocket*9_name', 'Neptune Smoke Machine'), + ('furni_bardesk_polyfon*9_name', 'Red Bardesk'), + ('furni_glass_table*8_desc', 'Translucent beauty'), + ('NUF_mini_endtopic', 'Find out more'), + ('pending_cfh_title', 'Your old message'), + ('nav_venue_sw_arena_tournament_name', 'Playing a tournament game!'), + ('furni_arabian_bigtb_desc', 'It must be Jinn-er time!'), + ('nav_venue_bb_lobby_beginner_0/0_desc', ''), + ('furni_pillow*3_name', 'Turquoise Satin Pillow'), + ('interface_icon_help', 'Help, need help?'), + ('nav_roomnfo_hd_src', 'Search Rooms'), + ('pet.saying.generic.dog.0', 'woof..woof'), + ('furni_chair_norja*9_name', 'Red Chair'), + ('NUF_getting_room_roommatic_start_tutor', 'This is the Room-O-Matic! Green! You use this to make your room.'), + ('furni_sound_set_2_name', 'Habbo Sounds 3'), + ('nav_venue_netcafe_name', 'My Habbo Home Netcafe'), + ('purse_voucherbutton', 'Vouchers'), + ('console_console', 'Console'), + ('game_poker_changed', 'changed'), + ('transaction_system_splashplastic', 'SplashPlastic'), + ('nav_venue_sw_lobby_free_7/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('furni_sporttrack3*1_desc', 'null'), + ('buddyremove_prev', '< Previous'), + ('roomatic_chooselayout', 'Choose the layout of your room'), + ('wallitem_item_placeholder_desc', 'This furniture is downloading...'), + ('purse_note', 'NOTE : The transactions are updated at 6 am every day.'), + ('poster_34_desc', 'Habbo-punk for the never-agreeing'), + ('furni_sound_set_27_desc', 'Jingle Bells will never be the same...'), + ('game_chess_start', 'Start Over'), + ('summer_chair_7_desc', 'A green deck chair'), + ('nav_venue_bb_lobby_beginner_6_name', 'Beginners Battle Ball 7'), + ('purse_link', 'Click here to see how to get Credits.'), + ('poster_59_desc', 'Torch - it gives you some light'), + ('room_info_rate_req', 'Rate this room'), + ('furni_rare_dragonlamp*5_desc', 'Roast your chestnuts here!'), + ('furni_divider_silo3*9_desc', 'Red Area Gate'), + ('more_roomlayouts', 'Extra room layouts for Habbo Club members >>'), + ('furni_grunge_chair_desc', 'Alternative chair for alternative people'), + ('furni_bed_budget*9_desc', 'King sized comfort!'), + ('furni_christmas_sleigh_desc', 'Ready for your Xmas cheer'), + ('furni_table_plasto_4leg*8_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_tournament_5_name', 'Competitie Battle Ball 6'), + ('furni_table_norja_med*4_name', 'Urban Iced Coffee Table'), + ('instant_friend_request_header', 'Friend Request'), + ('furni_marquee*3_name', 'Aqua Marquee'), + ('furni_noob_stool*1_name', 'My first Habbo stool'), + ('furni_rare_mnstr_desc', 'Don\'t get too close...'), + ('furni_safe_silo_pb_desc', 'Totally shatter-proof!'), + ('NUF_meeting_people_user_chatfield', 'Start typing here and press \'Enter\' to chat with others.'), + ('furni_prizetrophy6*2_desc', 'Shiny silver'), + ('furni_table_plasto_bigsquare*9_name', 'Square Dining Table'), + ('club_habbo.window.title', 'Habbo Club'), + ('recycler_info_ready', 'Recycling is complete. You have made a great environmentally friendly decision. All the recycled items you receive have been made from old items which helps to save natural resources and reduce pollution.'), + ('furni_shelves_norja*5_desc', 'For nic naks and art deco books'), + ('furni_table_silo_med_name', 'Coffee Table'), + ('furni_grunge_sign_desc', 'Bought legitimately from an M1 cafe.'), + ('roomevent_type_9', 'Group Events'), + ('roomevent_type_7', 'Dating'), + ('pet.saying.generic.dog.1', 'woof woof woof!!!'), + ('roomevent_type_8', 'Jobs'), + ('pet.saying.generic.dog.2', 'wooooof!'), + ('roomevent_type_5', 'Debates & Discussion'), + ('pet.saying.generic.dog.3', 'hooooowl'), + ('roomevent_type_6', 'Grand Openings'), + ('furni_solarium_norja*2_name', 'Beige Solarium'), + ('nav_venue_bb_lobby_intermediate_3_name', 'Semi-profs Battle Ball 4'), + ('console_searchfor', 'Search:'), + ('wallitem_arabian_wndw_desc', 'Arabian days and nights'), + ('furni_queue_tile1*3_name', 'Ice Habbo Roller'), + ('furni_lamp2_armas_desc', 'Wax lyrical with some old-world charm'), + ('furni_jp_tray3_desc', 'jp_tray3'), + ('wallitem_guitar_skull_name', 'skull guitar'), + ('roomevent_type_3', 'Games'), + ('furni_romantique_divider*2_desc', 'Keeping things separated'), + ('roomatic_owner', 'Owner:'), + ('url_helpterms', 'http://%predefined%//help/68'), + ('roomevent_type_4', 'Welcoming Party Events'), + ('furni_glass_chair*6_desc', 'Translucent beauty'), + ('furni_pillar*5_name', 'Pagan Pillar'), + ('roomevent_type_1', 'Parties & Music'), + ('roomevent_type_2', 'Trading'), + ('furni_present_gen2_desc', 'What\'s inside?'), + ('ph_tickets_title', 'Tickets'), + ('furni_table_norja_med*8_desc', 'For larger gatherings'), + ('furni_sound_set_54_desc', 'Tune into Christmas'), + ('poster_61_desc', 'The Auspicious One'), + ('furni_divider_silo3_name', 'Gate (lockable)'), + ('furni_scifirocket*4_desc', 'Welcome... to planet love'), + ('furni_plant_valentinerose*1_name', 'Red Valentine\'s Rose'), + ('furni_exe_chair2_name', 'Executive Boss Chair'), + ('alert_donate_ok', 'Give away my furni'), + ('furni_bardesk_polyfon*4_desc', 'Beige Mode Bardesk'), + ('furni_pura_mdl1*5_desc', ''), + ('hubu_close', 'Sulje kioski'), + ('gs_deathmatch', 'Every Habbo for himself!'), + ('summer_chair_9_desc', 'Sunbathing, why not?'), + ('furni_barchair_silo*8_name', 'Yellow Bar Stool'), + ('console_differentmessagemodes', 'Different Messages'), + ('furni_chair_silo*5_name', 'Pink Silo Dining Chair'), + ('callhelp_explanation', 'Thanks for reporting the problem'), + ('furni_chair_plasty*1_desc', 'Hip plastic furniture'), + ('furni_bed_budget*2_desc', 'Queen sized comfort!'), + ('furni_summer_grill*2_desc', 'Plenty of shrimp on that barbie'), + ('furni_heart_desc', 'Full of love'), + ('reg_donetext', 'Soon you\'ll see the Hotel Navigator, it shows you all the rooms you can go to -the guest rooms, clubs, caf�s, swimming pools and more!'), + ('poster_523_desc', 'The flag of India'), + ('furni_one_way_door*1_name', 'Aqua One Way Gate'), + ('furni_bardeskcorner_polyfon*13_desc', 'Tuck it away'), + ('nav_venue_sw_lobby_amateur_5/0_desc', 'Astetta rankempaa lumisotaa.'), + ('furni_gothic_chair*4_desc', 'Vampires and Wizards'), + ('furni_bardesk_polyfon*6_desc', 'Blue Mode Bardesk'), + ('transaction_system_sms_sra', 'Sonera'), + ('dimmer_turn_off', 'Turn OFF'), + ('furni_fireplace_armas_desc', 'Authentic, real flame fire'), + ('furni_chair_plasty*6_name', 'Plastic Pod Chair'), + ('furni_scifidoor*6_name', 'Black Monolith'), + ('furni_summer_pool*3_desc', 'Fancy a dip?'), + ('furni_christmas_reindeer_desc', 'Prancer becomes Rudolph in a click!'), + ('furni_chair_norja_name', 'Chair'), + ('furni_barchair_silo*3_name', 'White Bar Stool'), + ('nav_venue_bb_lobby_tournament_desc', 'Play battle ball tournament!'), + ('transaction_system_bank_sampo', 'Sampo'), + ('furni_sound_set_39_name', 'Rock 7'), + ('furni_pura_mdl3*8_desc', ''), + ('console_follow_prevented', 'Your friend has prevented others from following him/her.'), + ('poster_46_name', 'Small gold star'), + ('furni_sofa_polyfon_girl_name', 'Two-seater Sofa'), + ('furni_carpet_polar*3_desc', 'Snuggle up on a Funky bear rug...'), + ('modtool_rankerror', 'You do not have the rights for this action on this user!'), + ('furni_divider_nor3*4_name', 'Urban Iced Gate'), + ('nav_venue_theatredrome_valentine/0_desc', 'Hug A Friend, Its Valentines! Home Of Ralph (Wannabe Panda In Training)'), + ('furni_one_way_door*6_name', 'Blue HC Gate'), + ('poster_7_desc', 'For emergencies only'), + ('wallitem_hc_wall_lamp_name', 'Retro Wall Lamp'), + ('poster_508_name', 'The Spanish flag'), + ('help_emergency_example', 'Example: A Habbo wants to see me on webcam.'), + ('nav_venue_bb_lobby_expert_1/0_desc', ''), + ('furni_pura_mdl1*7_desc', 'Any way you like it!'), + ('wallitem_post.it_desc', 'Pad of stickies'), + ('nav_modify_doorstatus_passwordprotected', 'Let other people move and leave furniture in the room.'), + ('queue_set.queue_full.alert', 'The queue for this room is full. Please try again later.'), + ('nav_venue_bb_lobby_beginner_8_name', 'Beginners Battle Ball 9'), + ('nav_venue_sw_arena_amateur_name(0)', 'Playing amateur game'), + ('url_figure_editor', 'http://%predefined%//profile/profile.action'), + ('furni_noob_lamp*6_desc', 'Get the light right where you want it (canary yellow)'), + ('furni_divider_nor5*5_name', 'Pink Iced Angle'), + ('nav_venue_sw_lobby_free_desc', 'Come and play. It\'s free!'), + ('furni_table_silo_small*6_desc', 'Blue Area Occasional Table'), + ('NUF_getting_items_navigator_tutor', 'You need to be in a Habbo\'s room to access the Catalogue.'), + ('furni_safe_silo*6_desc', 'Totally shatter-proof!'), + ('furni_glass_sofa*7_name', 'Green Glass Sofa'), + ('wallitem_md_can_desc', 'Enough bubbling juice for one evening'), + ('furni_rare_fan*9_desc', 'It\'ll blow you away!'), + ('furni_prizetrophy7_name', 'Pokaali'), + ('furni_noob_stool*3_name', 'My first Habbo stool'), + ('furni_glass_sofa*2_desc', 'Translucent beauty'), + ('pet_frnd_10', 'Adoring'), + ('furni_turkey_desc', 'Where\'s the cranberry sauce?'), + ('pet_frnd_11', 'Devoted'), + ('Alert_ConnectionNotReady', 'Could not connect to the server'), + ('console_search_habbo_profilematch', 'Habbo Profile match -'), + ('furni_sound_set_59_desc', 'Urban break beats'), + ('poster_21_name', 'Butterfly Cabinet'), + ('credits', 'Credits'), + ('furni_sound_set_14_name', 'Hip Hop Beats 2'), + ('NUH_hand', 'Click here to open your inventory (aka the Big Hand). Drag and drop furniture to and from here to move it.'), + ('furni_pura_mdl3*1_desc', 'Any way you like it!'), + ('nav_modify_doorstatus_pwprotected', 'Password protected:'), + ('shopping_costs', 'XX costs XX Credit(s).\\rJust click \'buy\' once, it\'ll appear shortly.'), + ('NUF_mini_meet_people', 'Meet some people'), + ('furni_divider_nor1*3_name', 'White Iced Corner'), + ('furni_bed_budget*7_name', 'Green Pura Double Bed'), + ('furni_pura_mdl5*9_desc', 'Any way you like it!'), + ('nav_venue_club_massiva/2_name', 'Dancefloor'), + ('furni_scifiport*3_desc', 'Energy beams. No trespassers!'), + ('whisper', 'Whisper'), + ('furni_chair_plasto*4_name', 'Chair'), + ('furni_hc_bkshlf_name', 'Medieval Bookcase'), + ('furni_goodie1*2_name', 'Marzipan Man'), + ('furni_rare_fountain*1_name', 'Bird Bath (grey)'), + ('bb_text_hostInfo', 'Please choose a name for your Game and select the number of Teams.'), + ('hubu_t3_1', ''), + ('hubu_t3_2', 'Hubun kiertuekalenteri 2002'), + ('furni_sound_set_34_name', 'Rock 5'), + ('furni_rare_fountain*3_desc', 'For our feathered friends'), + ('nav_venue_sw_lobby_amateur_5_name', 'Snow Slingers Lobby'), + ('furni_pura_mdl3*2_name', 'Pink Pura Module 3'), + ('furni_xmas_cstl_wall_desc', 'Solid blocks of ice and snow'), + ('furni_arabian_tray1_name', 'Mint Tea Tray'), + ('furni_jp_tray4_name', 'jp_tray4'), + ('furni_grunge_candle_desc', 'Late night debate'), + ('furni_rclr_garden_name', 'Water Garden'), + ('furni_CFC_100_coin_gold_name', 'Gold Coin (China)'), + ('nav_venue_gate_park_name', 'Imperial Park'), + ('shopping_asagift', 'Buy As A Gift'), + ('furni_soft_sofachair_norja*7_desc', 'Sit back and relax'), + ('dance', 'Dance'), + ('roomatic_wrongpw', 'Oops! Sorry, your passwords don\'t match. Please enter them again.'), + ('furni_hc_trll_desc', 'For swanky dinners only'), + ('furni_prizetrophy3*2_desc', 'Shiny silver'), + ('modtool_roomkick', 'Room Kick'), + ('roomatic_letmove', 'Let other people move your furniture and place their own. (Furniture cannot be stolen.)'), + ('roomevent_default_description', ''), + ('nav_venue_sw_lobby_free_4/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('console_invalid_message', 'There was a message from a user that was probably removed your friend list. Note, user is removed from your friend list if you report a message to moderators.'), + ('poster_503_name', 'The Swiss flag'), + ('nav_venue_sw_arena_expert_name(0)', 'Playing expert game'), + ('poster_41_desc', 'For the best music-makers'), + ('furni_tile_name', 'Floor Tiles'), + ('furni_val_randomizer_name', 'Love Randomiser'), + ('nav_modify_doorstatus_open', 'Open'), + ('furni_plant_big_cactus_desc', 'Habbo Dreams monster in hiding! Shhhh'), + ('furni_safe_silo*8_desc', 'Totally shatter-proof!'), + ('wallitem_sw_hole_name', 'sw_hole'), + ('play_preview', 'Play preview of sounds'), + ('furni_table_plasto_round*14_name', 'Occasional Table'), + ('poll_thanks_window', 'Thanks!'), + ('wallitem_habbowheel_desc', 'So you gotta ask yourself "Do I feel lucky?"'), + ('furni_carpet_standard_name', 'Floor rug'), + ('furni_divider_nor1*8_name', 'Yellow Ice corner'), + ('nav_venue_bb_lobby_tournament_3/0_desc', ''), + ('buddyremove_ok_text', 'You have chosen enough friends to remove.'), + ('nav_venue_sw_lobby_intermediate_5/0_desc', 'Lumisota sen kuin vain kovenee.'), + ('furni_divider_nor4*7_desc', 'Habbos, roll out!'), + ('furni_summer_chair*3_desc', 'Black'), + ('furni_table_plasto_bigsquare*6_desc', 'Hip plastic furniture'), + ('gs_link_highscores', 'High Scores'), + ('Alert_purchasingerror', 'Buying unsuccessful'), + ('poster_5_desc', 'Quacking good design!'), + ('help_emergency_sent', 'A member of community staff will investigate the situation and take appropriate action. This may include sending you a response with advice on dealing with your issue.'), + ('room_user_page', 'Home Page'), + ('room_badge_window_title', 'Badge'), + ('login_name', 'Name of your Habbo'), + ('furni_divider_nor2*5_name', 'Pink Iced bar desk'), + ('nav_venue_habbo_lido_ii/0_desc', 'Dive right in!'), + ('furni_sporttrack2*2_name', 'Sport corner asphalt'), + ('roommatic_modify_size', 'Room size: %tileCount% tiles'), + ('pet.saying.sniff.croco.2', '*Sighs*'), + ('furni_prize2_name', 'Silver Trophy'), + ('Now you can find out how to get more cool Furniture for your room, or select another topic.', ''), + ('pet.saying.sniff.croco.0', 'Ewwwww....'), + ('pet.saying.sniff.croco.1', '*Sniff sniff*'), + ('furni_pura_mdl3*6_name', 'Blue Pura Module 3'), + ('poster_48_desc', 'All that glitters...'), + ('furni_wcandle_desc', 'Xmas tea light'), + ('nav_venue_bb_arena_3_name', 'Battle Ball Keskitaso'), + ('sound_machine_confirm_save_long', 'Are you sure you want to overwrite the current saved song?'), + ('purse_vouchers_helpurl', 'http://%predefined%/help/4'), + ('nav_venue_bouncer_room_2_name', 'Gevorderden Battle Ball Arena'), + ('furni_sand_cstl_gate_desc', 'sand_cstl_gate desc'), + ('furni_barrier*1_name', 'Yellow Maze Barrier'), + ('nav_venue_bb_lobby_tournament_0_name', 'Tournament'), + ('NUF_getting_room_roommatic_layout_tutor', 'Select what you want your room to look like. Use the arrows to cycle through different room layouts. Almost there, almost there...'), + ('poll_confirm_cancel', 'Stop answering?'), + ('furni_carpet_soft*4_desc', 'Soft Wool Rug'), + ('furni_rare_icecream_campaign_desc', 'Basic model'), + ('club_habbo.bottombar.text.notmember', 'Habbo Club'), + ('recycler_info_closed', 'Recycler is closed at the moment. Please check back later to recycle your Furniture.'), + ('furni_solarium_norja*8_desc', 'Rejuvenate your pixels!'), + ('callhelp_example', 'Example: How do I move my Furni?'), + ('furni_bed_budget_one*4_name', 'White Pura Bed'), + ('roomatic_givepwd', 'Password:'), + ('furni_teleport_door_name', 'Teleport Door'), + ('furni_table_silo_small*9_name', 'Red Area Occasional Table'), + ('furni_noob_chair*4_name', 'My first Habbo chair'), + ('furni_table_plasto_square*2_desc', 'Hip plastic furniture'), + ('room_waiting', 'Waiting to go in...'), + ('furni_sink_desc', 'Hot and cold thrown in for no charge'), + ('furni_doormat_plain_name', 'Doormat'), + ('nav_venue_eric\'s_eaterie_name', 'Eric\'s Eaterie'), + ('nav_venue_pizzeria_name', 'Slice of Life'), + ('poster_1004_desc', 'Celebrate with us'), + ('next', 'Next'), + ('furni_solarium_norja*9_name', 'Red Solarium'), + ('tutorial_quit_confirmation', 'You want to leave? Well I hope you learned something... something useful!'), + ('furni_val_teddy*2_desc', 'The pink bear of passion'), + ('poster_1003_name', 'UK Map'), + ('furni_glass_table*2_name', 'Glass table'), + ('NUF_habbo_home_url', 'http://d15-1.web.varoke.net/home/home-tutorial'), + ('furni_bed_silo_one_name', 'Single Bed'), + ('transaction_system_sms_win_btcellnet', 'O2 SMS'), + ('pet.hotwords.go_away', 'go away'), + ('furni_table_plasto_square*9_desc', 'Hip plastic furniture'), + ('furni_doormat_plain*4_name', 'Doormat'), + ('nav_venue_cunning_fox_gamehall_name', 'Cunning Fox Gamehall'), + ('furni_sound_machine*2_name', 'Ocean Traxmachine'), + ('furni_table_polyfon_name', 'Large Coffee Table'), + ('furni_hc_frplc_desc', 'Pixel-powered for maximum heating'), + ('console_request_massoperation_instruction', 'Use the options below to accept or decline ALL friend requests you have waiting.'), + ('nav_venue_bb_lobby_tournament_6/0_desc', ''), + ('furni_table_plasto_round*6_desc', 'Hip plastic furniture'), + ('trading_cancel', 'Cancel Trading'), + ('furni_glass_stool*3_name', 'Glass stool'), + ('furni_plant_mazegate_snow_name', 'Snowy Maze Gate'), + ('nav_venue_tv_studio_name', 'MuchMusic HQ'), + ('furni_table_norja_med*3_desc', 'For larger gatherings'), + ('furni_chair_plasty*8_desc', 'Hip plastic furniture'), + ('furni_bed_polyfon_name', 'Double Bed'), + ('gs_4teams', '4 Team Game'), + ('furni_sound_set_8_desc', 'Mellow electric grooves'), + ('ph_keys_jump', 'Jump:'), + ('reg_welcome', 'Welcome To Habbo Hotel!'), + ('purse_head', 'HABBO ACCOUNT ACTIVITY'), + ('nav_venue_bb_lobby_tournament_7_name', 'Competitie Battle Ball 8'), + ('reg_verification_newPasswordAgain', 'Retype new password:'), + ('furni_bardeskcorner_polyfon*8_desc', 'Yellow Mode Bardesk Corner'), + ('furni_sound_set_21_name', 'Rock 1'), + ('furni_gothic_stool*1_desc', 'The dark side of Habbo'), + ('furni_rope_divider_name', 'Rope Divider'), + ('poster_53_name', 'Hockey Stick'), + ('roomevent_default_desc', 'Event description..'), + ('nav_refresh_recoms', 'Refresh recommendations'), + ('nav_venue_sw_lobby_beginner_2_name', 'Snow Rookies Lobby'), + ('furni_divider_silo3*4_desc', 'Beige Area Gate'), + ('furni_divider_poly3*6_name', 'Blue Mode Bardesk Gate'), + ('reg_parentemail_title', 'Informing your parents'), + ('furni_gothgate_name', 'Gothic Portcullis'), + ('furni_mocchamaster_name', 'Mochamaster'), + ('modtool_message', 'Message:'), + ('furni_tree4_desc', 'Any presents under it yet?'), + ('furni_marquee*a_name', 'White Marquee'), + ('furni_queue_tile1*5_name', 'Knight Roller'), + ('furni_chair_polyfon_name', 'Dining Chair'), + ('furni_sleepingbag*9_name', 'Blue Sleeping Bag'), + ('furni_sound_set_9_name', 'Electronic 2'), + ('poster_39_desc', 'The rock masters of virtual music'), + ('furni_arabian_tetbl_desc', 'Serve up a treat'), + ('nav_venue_sw_lobby_free_9_name', 'Free Game Lobby'), + ('nav_venue_sw_arena_free_name(0)', 'Playing free for all game'), + ('furni_grand_piano*4_desc', 'Why is that key green?'), + ('furni_doorD_desc', 'Let\'s go over tzar!'), + ('purse_date', 'DATE'), + ('nav_venue_sw_lobby_beginner_6/0_desc', ''), + ('nav_venue_sw_lobby_beginner_4/0_desc', ''), + ('nav_venue_sw_lobby_intermediate_1_name', 'Snow Bombardiers Lobby'), + ('alert_reg_age', 'You are under 11 years old. Children under 11 can\'t enter Habbo Hotel.'), + ('nav_venue_bb_lobby_intermediate_9/0_desc', ''), + ('queue_set.c.alert', 'This room is for Habbo Club members only. In order to enter, you need to subscribe to Habbo Club.'), + ('sound_machine_confirm_clear_long', 'Are you sure you want to clear the current song?'), + ('furni_exe_drinks_name', 'Executive Drinks Tray'), + ('reg_bday_note', 'Please enter your correct date of birth, this is important! You\'ll need this information later on, if you want to change your password or e-mail.'), + ('modtool_roomalert', 'Room Alert'), + ('furni_rare_parasol*1_name', 'Yellow Parasol'), + ('furni_sound_set_18_name', 'Groove 4'), + ('sound_machine_window', 'Sound Machine Editor'), + ('furni_traffic_light*1_name', 'Classic Traffic Light'), + ('furni_chair_norja*4_desc', 'Sleek and chic for each cheek'), + ('furni_divider_nor1*2_desc', 'Black Ice corner'), + ('nav_venue_median_lobby_name', 'Median Lobby'), + ('furni_sofa_silo*3_desc', 'Cushioned, understated comfort'), + ('furni_bed_budget_desc', 'Comfortable, affordable!'), + ('furni_divider_nor4_name', 'Plain Iced Auto Shutter'), + ('furni_rare_icecream*6_desc', 'Virtual toffee rocks!'), + ('habboclub_txt1', 'You can buy Habbo Club one month at a time using Habbo Credits.'), + ('habboclub_txt3', 'Yes, I\'m over 14 years of age\\rOR\\rI\'m under 14 years of age and I have a permission from my parent/guardian to join Habbo Club.'), + ('furni_rare_dragonlamp*3_desc', 'Scary and scorching!'), + ('furni_noob_lamp*5_name', 'My first Habbo lamp'), + ('club_bottombar_text2', '(....)'), + ('furni_CFC_500_goldbar_name', 'Gold Bar (China)'), + ('club_bottombar_text1', 'Loading'), + ('furni_rare_elephant_statue*1_desc', 'Say hello to Nelly'), + ('furni_table_silo_med*7_name', 'Green Area Coffee Table'), + ('nav_venue_sw_lobby_free_1/0_desc', ''), + ('furni_bottle_desc', 'For interesting games!'), + ('furni_romantique_pianochair*2_desc', 'Let the music begin'), + ('furni_table_norja_med*2_name', 'Large Coffee Table Black'), + ('queue_set.e2.alert', 'This room is currently available only to Habbos participating to the event.'), + ('furni_solarium_norja_desc', 'Rejuvenate your pixels!'), + ('furni_table_plasto_square*14_desc', 'Hip plastic furniture'), + ('cam_save.help', 'Save & Print Photo'), + ('furni_sound_set_4_desc', 'Chilled out beats'), + ('furni_couch_norja*6_name', 'Blue Bench'), + ('poster_2003_desc', 'Would you trust this man?'), + ('hobba_cryforhelp', 'Call For Help:'), + ('furni_marquee*9_desc', 'It\'s both door and a shade!'), + ('nav_venue_bb_lobby_tournament_13/0_desc', ''), + ('poster_512_desc', 'The flag of Ireland'), + ('handitem12', 'Macchiato'), + ('object_displayer_hide_actions', 'Hide actions'), + ('furni_sound_set_25_name', 'Dance 1'), + ('handitem11', 'Mocha'), + ('handitem10', 'Latte'), + ('furni_sound_set_13_desc', 'Let Music be the food of Habbo'), + ('handitem16', 'Cappuccino'), + ('handitem15', 'Iced'), + ('handitem14', 'Filter'), + ('handitem13', 'Espresso'), + ('nav_venue_sw_lobby_free_2_name', 'Free Game Lobby'), + ('handitem19', 'Habbo Cola'), + ('nav_venue_sw_lobby_amateur_2/0_desc', ''), + ('handitem18', 'Tap'), + ('handitem17', 'Java'), + ('console_next_msg', 'Delete'), + ('furni_bardesk_polyfon*5_name', 'Candy Bar'), + ('furni_scifidoor*5_desc', 'There out of this world!'), + ('nav_roomispwprotected', 'The room is password protected.'), + ('furni_sleepingbag*2_name', 'Lime Sleeping Bag'), + ('furni_glass_table*6_name', 'Blue Glass Table'), + ('furni_divider_nor4*3_desc', 'Habbos, roll out!'), + ('furni_sound_set_61_name', 'Latin Love 3'), + ('nav_venue_pizza/0_desc', 'Pizza Palace'), + ('furni_romantique_clock_desc', ''), + ('furni_queue_tile1*0_desc', 'The power of movement'), + ('furni_pura_mdl2*9_desc', 'Any way you like it!'), + ('nav_venue_orient/0_name', 'Club Golden Dragon'), + ('furni_noob_table*1_desc', 'Lightweight, practical and orange'), + ('poster_22_desc', 'beautiful reproduction butterfly'), + ('furni_carpet_soft_name', 'Soft Wool Rug'), + ('Message', 'Message'), + ('furni_bed_trad_one_desc', 'All you need for a good night\'s kip'), + ('console_report_help', 'If the message you received was abusive or harassing, you can report it to the Moderators by clicking the Report button below. The Habbo will be removed from your Friends\' List automatically when you report. If you want to remove a Habbo from your Friends\' List without reporting their message, simply use the Remove button below.'), + ('furni_rcandle_desc', 'Xmas tea light'), + ('furni_sofa_silo*8_name', 'Yellow Two-Seater Sofa'), + ('furni_pura_mdl4*5_desc', ''), + ('NUF_mini_use_console_ready_tutor', 'You can now use the Console to find some of your friends, or you can continue the tutorial.'), + ('log_problem_link', 'Read FAQ\'s'), + ('furni_shelves_silo_name', 'Bookcase'), + ('gs_timetojoin', '\\x seconds to join'), + ('nav_venue_cunning_fox_gamehall/1_name', 'Gamehall Lobby'), + ('furni_safe_silo*7_name', 'Green Safe Minibar'), + ('NUF_mini_meet_people_hotelview_tutor', 'The Navigator lets you move between rooms in the Hotel. Open it up to get started!'), + ('purse_vouchers_sendbutton', 'Get Credits!'), + ('furni_gothic_sofa*4_name', 'Black Gothic Sofa'), + ('furni_wooden_screen*0_desc', 'Add an exotic touch to your room'), + ('catalog_give_trophymsg', 'You haven\'t engraved the trophy. Type \\ryour inscription in the grey box.'), + ('furni_prizetrophy5*3_name', 'Duo trophy'), + ('handitem23', 'Beetroot Habbo Soda'), + ('furni_rare_dragonlamp*8_name', 'Bronze Dragon Lamp'), + ('furni_divider_nor4*8_name', 'Yellow Iced Auto Shutter'), + ('handitem22', 'Lime Habbo Soda'), + ('furni_soft_sofa_norja*6_name', 'Blue Iced Sofa'), + ('handitem21', 'Hamburger'), + ('handitem20', 'Camera'), + ('furni_divider_nor1*9_desc', 'Red Ice corner'), + ('help_trouble', 'In Trouble?'), + ('handitem25', 'Love potion'), + ('handitem24', 'Bubble juice from 1999'), + ('furni_ham2_desc', 'Looks like you\'re too late!'), + ('nav_venue_bb_lobby_amateur_3_name', 'Gevorderden Battle Ball 4'), + ('furni_chair_plasto*15_name', 'Chair'), + ('furni_hyacinth1_desc', 'Beautiful bulb'), + ('furni_shelves_basic_desc', 'Pura series 404 shelves'), + ('furni_pura_mdl1*6_name', 'Blue Pura Module 1'), + ('nav_venue_cafe_gold/0_desc', 'Get the latest safety tips and tricks from Safety eXperts.'), + ('nav_venue_snowwar_lobby_name', 'Snow Storm Lobby'), + ('transaction_system_sms_slahti', 'Saunalahti'), + ('alert_tooLongPW', 'Your password is too long'), + ('furni_carpet_standard*5_desc', 'Available in a variety of colours'), + ('furni_deadduck_desc', 'Blood, but no guts'), + ('password.email.subject', 'Forgotten password'), + ('furni_prizetrophy2*3_desc', 'Breathtaking bronze'), + ('NUF_playing_games_hotelview_nav', 'Just click me to open the Navigator and get it over with...'), + ('furni_summer_chair*1_name', 'Aqua Deck Chair'), + ('furni_rubberchair*3_name', 'Orange Inflatable Chair'), + ('furni_exe_plant_desc', ''), + ('nav_venue_tearoom/0_desc', 'Chat with the people of Aoralia and meet a sprite or two!'), + ('nav_venue_sw_lobby_beginner_9/0_desc', ''), + ('furni_table_silo_med*6_name', 'Blue Area Coffee Table'), + ('nav_venue_sw_lobby_beginner_1/0_desc', ''), + ('furni_noob_stool*2_desc', 'Unfold me and take the weight off (dark blue)'), + ('camera_dialog_place', 'Move'), + ('furni_scifiport*8_desc', 'Energy beams. No trespassers!'), + ('url_peeloscore', 'http://%predefined%///groups/56555/id'), + ('console_follow_friend', 'Go to same room'), + ('sound_machine_alert_jukebox_list_full', 'The play list is full. Please wait until the current song has finished playing and try again.'), + ('poster_517_desc', 'Where\'s your kilt?'), + ('roomevent_type_11', 'Helpdesk'), + ('roomevent_type_10', 'Performance'), + ('furni_rare_dragonlamp*9_desc', 'Scary and scorching!'), + ('furni_pura_mdl2*3_name', 'Black Pura Module 2'), + ('url_help_1', 'http://%predefined%//credits'), + ('furni_edicehc_name', 'Dicemaster'), + ('furni_divider_silo1*8_name', 'Yellow Corner Shelf'), + ('furni_wooden_screen*5_desc', 'Add an exotic touch to your room'), + ('url_help_5', 'http://%predefined%/help/75'), + ('roomatic_intro2', 'Here\'s what one Habbo says about her room:'), + ('url_help_4', 'http://%predefined%//help/22'), + ('roomatic_intro1', 'You can decorate and furnish your room however you like and no one can tell you to tidy up or turn the music down. It\'s up to you if you let everyone in or just a chosen few, or lock the door and chill by yourself. Get creating and in a couple of minutes you\'ll have your own Habbo Hotel space.'), + ('url_help_3', 'http://%predefined%//help/'), + ('roomatic_intro3', 'My mates live miles away, but we can meet up in my room every Friday night and we don\'t have to worry about getting home afterwards.'), + ('url_help_2', 'http://%predefined%//profile?tab=4'), + ('furni_romantique_chair*5_name', 'Onyx Chair'), + ('url_help_6', 'http://www.habbohotel.co.uk/iot/go?lang=en&country=uk'), + ('furni_sound_set_20_name', 'SFX 2'), + ('furni_sofa_polyfon*4_desc', 'Beige Mode Sofa'), + ('sound_machine_alert_no_more_songs', 'Can\'t create new song! Traxmachine can have only %count% songs.'), + ('search', 'Search'), + ('room_preparing', '...Preparing room'), + ('nav_venue_bb_lobby_intermediate_0/0_desc', ''), + ('club_txt_renew2', 'You are Habbo Club member. If you want to change your subscription or leave the club, use the link below.'), + ('poster_1002_name', 'Queen Mum Poster'), + ('furni_barchair_silo*2_desc', 'Practical and convenient'), + ('reg_month', 'Month'), + ('club_txt_renew1', 'Your Habbo Club membership will be active for another %days% days. You can extend your membership by paying with Habbo Credits.'), + ('furni_rare_icecream*0_name', 'Cherry Ice Cream Machine'), + ('furni_sound_set_41_desc', 'Burning Riffs'), + ('nav_venue_beauty_salon_loreal_name', 'Beauty salon'), + ('poster_26_name', 'Angel Poster'), + ('furni_sound_set_19_name', 'Hip Hop Beats 4'), + ('furni_romantique_divan*4_name', 'Amber Chaise-Longue'), + ('furni_one_way_door*7_desc', 'One at a time!'), + ('sound_machine_confirm_eject_long', 'Are you sure you want to remove the Traxpack and it\'s samples from the song?'), + ('furni_glass_stool*8_desc', 'Translucent beauty'), + ('buddyremove_not_now', 'Cancel'), + ('no_user_for_gift', 'No user named %user% found. Gift not purchased.'), + ('buddyremove_lessoptions', 'Less Options <<'), + ('reg_legal_header1', 'Now you need to ask your parents/guardian to come to the computer. Read through the text (below) with your parents.'), + ('furni_carpet_soft*3_desc', 'Soft Wool Rug'), + ('reg_legal_header2', 'Read through the below text carefully. You must agree to the following terms before entering Habbo Hotel.'), + ('furni_sw_chest_name', 'sw_chest'), + ('nav_venue_sw_lobby_tournament_9_name', 'Tournament Lobby'), + ('messenger.email.footer', ''), + ('nav_venue_bb_arena_4_name', 'Battle Ball Expertit'), + ('club_change_url', 'http://%predefined%//credits/habboclub'), + ('furni_table_plasto_4leg*2_name', 'Occasional Table'), + ('ph_choosecolour', 'Choose Costume Colour'), + ('buddyremove_hc_more_info', 'More Info About Habbo Club >>'), + ('furni_romantique_smalltabl*1_desc', 'Every tray needs a table...'), + ('nav_venue_sw_lobby_tournament_8_name', 'Tournament Lobby'), + ('furni_divider_nor5_name', 'Plain Iced Angle'), + ('wallitem_roomdimmer_name', 'Mood Light'), + ('furni_bed_budget_one*5_name', 'Beige Pura Bed'), + ('furni_table_norja_med*9_name', 'Large Coffee Table Red'), + ('furni_pillow*3_desc', 'Puffy, soft and huge'), + ('furni_noob_rug*2_name', 'My first Habbo rug'), + ('nav_venue_sw_lobby_beginner_7_name', 'Snow Rookies Lobby'), + ('furni_exe_chair_desc', 'Relaxing leather comfort'), + ('furni_s_sound_machine*2_desc', 'Sound Machine Ocean Desc'), + ('nav_venue_dusty_lounge/0_desc', 'A dignified lounge for sitting back and enjoying a licorice pipe'), + ('game_bs_ship4', 'Destroyer(s)'), + ('game_bs_ship3', 'Cruiser(s)'), + ('game_bs_ship2', 'Battle Ship(s)'), + ('game_bs_ship1', 'An aircraft carrier'), + ('furni_table_plasto_bigsquare*4_name', 'Square Dining Table'), + ('openhrs_title', 'We are closing the hotel'), + ('furni_habbowood_chair_name', 'Director\'s Chair'), + ('roomatic_confirm', 'Confirm password:'), + ('poster_14_desc', 'A cunning painting'), + ('furni_doormat_plain*3_name', 'Doormat'), + ('furni_sound_set_3_desc', 'Chilled grooves'), + ('win_messenger', 'Habbo Console'), + ('summer_chair_7_name', 'Green Deck Chair'), + ('notickets_window_header', 'Tickets needed!'), + ('nav_updatenote', 'Updating your room properties may take a while. The changes have been made, but it\'ll take a few minutes until all Habbos can see them.'), + ('furni_table_plasto_bigsquare*5_name', 'Square Dining Table'), + ('url_purselink', 'http://%predefined%//credits?'), + ('console_follow_hotelview', 'Your friend is on the hotel view.'), + ('furni_solarium_norja*3_desc', 'Get the city look!'), + ('sound_machine_alert_song_name_missing', 'Please give your song a name.'), + ('furni_sound_machine*3_name', 'Green Traxmachine'), + ('jukebox_next_up', 'Next up:'), + ('trading_additems', 'Put items in boxes'), + ('furni_sporttrack3*1_name', 'Sport goal tartan'), + ('club_button_3_period', 'Buy 6 >>>'), + ('nav_delroom3', 'Room deleted!'), + ('nav_delroom2', 'Are you sure you want to delete this room? All the furniture left in it will also be deleted.'), + ('poster_34_name', 'Scamme\'d'), + ('go', 'Go >>'), + ('nav_delroom1', 'If you want to save the furniture in this room, move it to the giant hand before you continue.'), + ('console_habboprofile_arrowed', 'Habbo Profile >>'), + ('furni_chair_plasty*10_desc', 'Hip plastic furniture'), + ('cam_txtscreen.help', 'Caption'), + ('wallitem_item_placeholder_name', 'This furniture is downloading...'), + ('furni_carpet_standard*b_desc', 'Available in a variety of colours'), + ('poster_59_name', 'Torch'), + ('furni_chair_basic*4_name', 'White Pura Egg Chair'), + ('summer_chair_1_name', 'Aquamarine Deck Chair'), + ('nav_venue_space_cafe_name', 'Ten Forward'), + ('log_problem_url', 'http://%predefined%//help/faqs?faq_1_categoryId=14'), + ('group_homepage_url', 'http://%predefined%/groups/%groupid%/id'), + ('furni_heart_name', 'Giant Heart'), + ('nav_venue_sw_arena_beginner_name', 'Playing beginner game'), + ('furni_grunge_chair_name', 'Grunge Chair'), + ('nav_dooropens', 'Door opens! Go on in...'), + ('modtool_banuser', 'Ban User'), + ('furni_carpet_soft_tut_desc', 'Welcome, enjoy your stay!'), + ('furni_rare_mnstr_name', 'Venomus Habbolus'), + ('furni_divider_silo3*9_name', 'Red Area Gate'), + ('furni_pura_mdl3*1_name', 'Aqua Pura Module 3'), + ('Messages', 'Message(s)'), + ('wallitem_arabian_wndw_name', 'Arabian Window Frame'), + ('furni_prizetrophy3*1_desc', 'Glittery gold'), + ('furni_sound_set_47_desc', 'Storm the UKCharts!'), + ('poster_54_desc', 'whack that ball!'), + ('url_logout_concurrent', 'http://%predefined%//account/disconnected?reason=concurrentlogin&origin=popup'), + ('nav_venue_sw_lobby_beginner_1_name', 'Snow Rookies Lobby'), + ('furni_table_plasto_4leg*8_name', 'Occasional Table'), + ('sound_machine_turn_on', 'Switch On'), + ('furni_table_norja_med*4_desc', 'For larger gatherings'), + ('buddyremove_hc_info_url', 'http://www.habbo.co.uk/credits/habboclub'), + ('furni_romantique_divider*2_name', 'Green Screen'), + ('furni_pillar*5_desc', 'Find your natural roots'), + ('furni_table_silo_med_desc', 'Wipe clean and unobtrusive'), + ('furni_pillow*8_name', 'Navy Cord Pillow'), + ('room_owner', 'Owner:'), + ('furni_shelves_norja*5_name', 'Pink Bookcase'), + ('queue_set.d.info', 'There are %d% Habbos in front of you in the queue.'), + ('reg_retypepass', 'Retype Password:'), + ('furni_jp_tray3_name', 'jp_tray3'), + ('dance_stop', 'Stop Dancing'), + ('buddyremove_remove_text', 'You are about to remove %removeamount% friends from your friendlist.\\r\\r After removal, you\'ll have %amountleft% friends on your list:'), + ('nav_venue_bb_lobby_tournament_12_name', 'Competitie Battle Ball 13'), + ('furni_summer_chair*2_name', 'Deck Chair'), + ('furni_plant_valentinerose*1_desc', 'Secret admirer!'), + ('furni_sofachair_silo*4_name', 'Beige Area Armchair'), + ('poster_523_name', 'The flag of India'), + ('furni_scifirocket*4_name', 'Venus Smoke Machine'), + ('nav_venue_tearoom_name', 'Chinese Tea Room'), + ('furni_pura_mdl1*5_name', 'beige pura module 1'), + ('nav_venue_bb_lobby_tournament_0/0_desc', ''), + ('furni_chair_silo*5_desc', 'Pink Silo Dining Chair'), + ('club_txt_expired', 'Your Habbo Club membership has run out. You can join the club again by clicking the HC logo on the hotel view.\\rMembers of Habbo Club get priority access to the hotel (so you can always get in), exclusive clothes, hair colours, rare furni and special guest room layouts. To see exactly what you\'ll be able to get your hands on as a Habbo Club member, take a look in the Catalogue.'), + ('furni_glass_table*7_name', 'Green Glass Table'), + ('nav_prvrooms_notfound', 'Your search did not match any rooms'), + ('bb_title_BBscores2', 'Game over!'), + ('wallitem_gothicfountain_name', 'Gothic Ectoplasm Fountain'), + ('furni_one_way_door*1_desc', 'One at a time!'), + ('furni_chair_plasty*1_name', 'Plastic Pod Chair'), + ('furni_divider_nor3*9_name', 'Red Iced gate'), + ('sound_machine_time_2', '%min%:%sec%min'), + ('sound_machine_time_1', '%min%:%sec%min'), + ('furni_bardesk_polyfon*4_name', 'Beige Mode Bardesk'), + ('queue_set.queue_reset.alert', 'The queue for this room has been reset, please try again.'), + ('furni_jp_pillow_desc', 'Comfy and classical'), + ('nav_venue_sw_lobby_free_9/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('furni_barchair_silo*8_desc', 'Practical and convenient'), + ('delete_furniture', 'Delete Furniture (permanently)'), + ('furni_plant_bulrush_desc', 'Ideal for the riverside'), + ('poster_61_name', 'Siva Poster'), + ('furni_bed_silo_two_name', 'Double Bed'), + ('furni_plant_pineapple_desc', 'Needs loving glances'), + ('furni_bed_polyfon_girl_desc', 'Snuggle down in princess pink'), + ('furni_pillow*4_desc', 'Puffy, soft and huge'), + ('furni_table_norja_med*8_name', 'Large Coffee Table Yellow'), + ('transaction_system_tsms_win_tmobile', 'T-Mobile SMS'), + ('furni_scifidoor*10_desc', 'There out of this world!'), + ('furni_bed_polyfon*7_desc', 'Green Mode Double Bed'), + ('furni_toy1*2_desc', 'it\'s bouncy-tastic'), + ('transaction_system_sms_radiolinja', 'Elisa'), + ('furni_gothic_chair*4_name', 'Black Gothic Chair'), + ('furni_scifidoor*6_desc', 'Monolith goes up! Monolith goes down!'), + ('nav_venue_sw_lobby_free_3_name', 'Free Game Lobby'), + ('console_friend_request_not_found', 'There was an error finding the user for the friend request'), + ('furni_romantique_smalltabl*2_desc', 'Every tray needs a table...'), + ('furni_bed_budget*2_name', 'Pink Pura Double Bed'), + ('wallitem_post.it_name', 'Pad of stickies'), + ('gs_state_created', 'Waiting for players..'), + ('furni_divider_nor3*4_desc', 'Entrance or exit?'), + ('furni_sofa_polyfon_girl_desc', 'Romantic pink for two'), + ('locked', 'Locked (visitors have to ring bell)'), + ('alert_reg_birthday', 'Birthday'), + ('club_thanks_text', 'Here you can see your Habbo Club membership status, number of elapsed months, pre-ordered months and status of the ongoing month.'), + ('furni_sound_set_39_desc', 'Rock with a roll'), + ('nav_venue_old_skool/0_desc', 'A set of rooms inspired by the original and legendary Mobiles Disco, the progenitor of Habbo'), + ('poster_511_desc', 'The flag of The Netherlands'), + ('furni_couch_norja*7_name', 'Rural Iced Bench'), + ('furni_safe_silo*6_name', 'Blue Safe Minibar'), + ('furni_table_plasto_4leg*14_desc', 'Aqua table'), + ('room_sound_furni_limit', 'You can only place one sound furni per room'), + ('nav_venue_bb_lobby_beginner_15/0_desc', ''), + ('furni_glass_shelf_name', 'Glass shelf'), + ('furni_divider_nor2*6_desc', 'Blue Iced bar desk'), + ('furni_turkey_name', 'Roast Turkey'), + ('nav_venue_bb_lobby_tournament_16/0_desc', ''), + ('sw_timeleft', 'Time:'), + ('furni_rare_parasol_name', 'Parasol'), + ('furni_glass_sofa*7_desc', 'Habbo Club'), + ('furni_bardeskcorner_polyfon*13_name', 'Corner Cabinet/Desk'), + ('furni_rare_fan*9_name', 'Fucsia Powered Fan'), + ('furni_chair_plasto*4_desc', 'Hip plastic furniture'), + ('no', 'No'), + ('furni_rare_fan*4_desc', 'Fanning the fires of SUPERLOVE...'), + ('nav_venue_median_lobby/0_desc', 'A Mean place to hang'), + ('nav_venue_sw_lobby_intermediate_2/0_desc', ''), + ('furni_md_sofa_name', 'MD Sofa'), + ('furni_noob_lamp*1_desc', 'Get the light right where you want it (yellow)'), + ('login_connecting', 'Connecting...'), + ('furni_divider_nor1*3_desc', 'Looks squishy, but isn\'t!'), + ('furni_sound_set_14_desc', 'Rock them bodies'), + ('furni_sound_set_59_name', 'RnB Grooves 5'), + ('poster_21_desc', 'beautiful reproduction butterfly'), + ('wallitem_hc_wall_lamp_desc', 'Tres chic!'), + ('ok', 'OK'), + ('nav_venue_sw_lobby_tournament_1/0_desc', ''), + ('pet_happy', 'Happiness:'), + ('sound_machine_edit', 'Edit Song'), + ('furni_rare_elephant_statue*2_desc', 'Say hello to Nelly'), + ('furni_CFC_200_moneybag_desc', 'Worth 200 Credits'), + ('nav_venue_bb_lobby_intermediate_6/0_desc', ''), + ('console_buddylimit_requester', 'Friend could not be added. The request sender can not have anymore friends.'), + ('furni_sofa_silo*2_desc', 'Cushioned, understated comfort'), + ('sound_machine_alert_invalid_song_name', 'You have already burned another song with the same name. Please change the song name before trying again.'), + ('furni_fireplace_armas_name', 'Fireplace'), + ('furni_barchair_silo*3_desc', 'Practical and convenient'), + ('ph_ticket', 'Ticket'), + ('furni_arabian_divdr_desc', 'Carved Cedar Divider'), + ('wallitem_jp_ninjastars_desc', 'Not a frisbee'), + ('wallitem_hrella_poster_1_desc', 'Brighten up your cabin'), + ('furni_noob_stool*3_desc', 'Unfold me and take the weight off (aubergine)'), + ('furni_pura_mdl5*9_name', 'Red Pura Module 5'), + ('furni_divider_nor4*2_desc', 'Habbos, roll out!'), + ('NUF_mini_meet_people_roomlist_tutor', 'Click \'Open\' to open up a category and see what rooms are within. When you have found an interesting room, press \'Go\' to visit it.'), + ('poster_41_name', 'Habbo Golden Record'), + ('furni_jp_tray4_desc', 'jp_tray4'), + ('buddyremove_confirm', 'Yeah, it is done...'), + ('tutorial_topic_list_F', 'Choose a topic from the list below:'), + ('purse_time', 'TIME'), + ('nav_venue_sw_lobby_free_8_name', 'Free Game Lobby'), + ('tutorial_topic_list_M', 'Choose a topic from the list below:'), + ('furni_s_sound_machine*7_name', 'Sound Machine Red'), + ('interface_icon_navigator', 'Navigator, navigate around'), + ('furni_xmas_cstl_wall_name', 'Ice Castle Wall'), + ('nav_own_hd', 'Your Rooms.'), + ('modtool_aa_checkbox_text', 'Audio alert'), + ('wallitem_industrialfan_desc', 'Powerful and resilient'), + ('furni_bed_budget*8_desc', 'King sized comfort!'), + ('sound_machine_burn', 'Burn Song'), + ('nav_venue_sw_lobby_intermediate_0_name', 'Snow Bombardiers Lobby'), + ('nav_venue_bb_lobby_beginner_1_name', 'Beginners Battle Ball 2'), + ('furni_chair_basic*5_desc', ''), + ('password.email.prefix', 'Your password is:'), + ('furni_pura_mdl5*4_desc', 'Any way you like it!'), + ('furni_table_norja_med*3_name', 'White Iced Table'), + ('furni_pura_mdl3*2_desc', 'Any way you like it!'), + ('nav_venue_sw_lobby_tournament_3_name', 'Tournament Lobby'), + ('furni_sound_set_34_desc', 'For guitar heroes'), + ('furni_summer_grill*1_desc', 'Plenty of ribs on that barbie'), + ('hubu_t4_1', 'Anna palautetta Hubusta'), + ('furni_divider_nor1*8_desc', 'Yellow Ice corner'), + ('hubu_t4_2', 'Tsekkaa heebelin jorinat'), + ('poll_offer_title', 'Poll'), + ('summer_chair_2_desc', 'Leave your towel early'), + ('wallitem_habbowheel_name', 'The Wheel of Destiny!'), + ('reg_mission', 'Your Mission:'), + ('furni_sofa_polyfon*9_name', 'Red Two-seater Sofa'), + ('furni_bed_budget_one_desc', 'aquamarine'), + ('nav_venue_sw_lobby_tournament_7/0_desc', ''), + ('furni_gothic_sofa*3_name', 'Gothic Sofa Red'), + ('furni_chair_plasto*9_name', 'Chair'), + ('nav_venue_sw_arena_beginner_name(0)', 'Playing beginner game'), + ('notickets_text_2', 'Buy more tickets now and get a discount. You can also buy tickets as a present.'), + ('wallitem_sw_hole_desc', 'sw_hole'), + ('furni_plant_big_cactus_name', 'Mature Cactus'), + ('notickets_text_1', 'Game price is 1 credit. For that you get 2 tickets.'), + ('poster_19_name', 'Hole In The Wall'), + ('furni_divider_nor4*7_name', 'Rural Iced Shutter'), + ('email', ''), + ('furni_sound_set_13_name', 'Dance 5'), + ('furni_present_gen1_name', 'Gift'), + ('nav_venue_bb_lobby_tournament_19/0_desc', ''), + ('furni_chair_norja_desc', 'Sleek and chic for each cheek'), + ('furni_marquee*9_name', 'Green Marquee'), + ('sound_machine_alert_song_locked', 'The song you\'re editing can\'t be modified. Please save the song under another name to create a new copy.'), + ('furni_glass_stool*2_name', 'Glass stool'), + ('nav_venue_theatredrome_xmas/0_desc', ''), + ('poster_5_name', 'Duck Poster'), + ('furni_prize2_desc', 'Nice and shiny'), + ('furni_valeduck_desc', 'He\'s lovestruck'), + ('furni_chair_plasty*7_desc', 'Hip plastic furniture'), + ('closed', 'Closed'), + ('furni_wcandleset_name', 'White Candle Plate'), + ('furni_sleepingbag*3_name', 'Ocean Sleeping Bag'), + ('furni_tree3_name', 'Christmas Tree 1'), + ('furni_sound_set_26_name', 'Groove 1'), + ('furni_barrier*2_desc', 'No trespassing, please!'), + ('game_bs_turn1', 'Your Turn'), + ('nav_venue_bb_lobby_expert_desc', 'Expert battle ball!'), + ('alert_donate_topic', 'SCAM ALERT!'), + ('game_bs_turn2', 'The Enemy\'s Turn'), + ('furni_sand_cstl_gate_name', 'sand castle gate'), + ('furni_rare_dragonlamp*4_desc', 'Scary and scorching!'), + ('furni_camera_desc', 'Smile!'), + ('pet.hotwords.lie', 'lie down'), + ('furni_sound_set_60_name', 'Latin Love 2'), + ('console_accept_selected', 'Accept'), + ('furni_divider_silo1*3_desc', 'Neat and natty'), + ('furni_summer_chair*7_name', 'Green Deck Chair'), + ('furni_pumpkin_desc', 'Cast a spooky glow'), + ('reg_habboname_note', 'Now it\'s time to make your own Habbo character! To make your own Habbo, please start by choosing your Habbo Name.'), + ('furni_rare_icecream_campaign_name', 'Rare icecream white'), + ('furni_doormat_plain_desc', 'Available in a variety of colours'), + ('room_areYouSure', 'Are you sure you want to delete this item forever?'), + ('sound_machine_confirm_burn', 'Burn this song?'), + ('predefined_room_name', '%user_name%\'s room'), + ('furni_divider_silo1*2_name', 'Black Corner Shelf'), + ('furni_table_plasto_4leg*3_desc', 'Hip plastic furniture'), + ('furni_solarium_norja*8_name', 'Yellow Solarium'), + ('furni_exe_globe_desc', 'The power is yours!'), + ('furni_bed_polyfon*6_name', 'Blue Mode Double Bed'), + ('notickets_store_link', 'Go to ticket store >>>'), + ('NUF_habbo_home', 'Habbo Home'), + ('nav_venue_the_den_name', 'The Den'), + ('furni_table_plasto_square*2_name', 'Round Dining Table'), + ('modtool_header', 'The Tool'), + ('pet_enrg_7', 'Energetic'), + ('nav_noanswer', 'No answer'), + ('roommatic_hc_members_only', 'This Room Is For HC Members Only'), + ('furni_xmasduck_desc', 'A right Christmas quacker!'), + ('pet_enrg_8', 'Lively'), + ('NUF_getting_room_own_rooms_tutor', 'Click the \'Create own room\' button to start building your room. Don\'t worry, making your room is completely free.'), + ('pet_enrg_5', 'Sprightly'), + ('pet_enrg_6', 'Active'), + ('furni_doormat_plain*4_desc', 'Available in a variety of colours'), + ('pet_enrg_3', 'Lazy'), + ('pet_enrg_4', 'Relaxed'), + ('furni_divider_poly3*6_desc', 'Blue Mode Bardesk Gate'), + ('pet_enrg_1', 'Slow'), + ('furni_glass_table*2_desc', 'Translucent beauty'), + ('pet_enrg_2', 'Sluggish'), + ('poster_1003_desc', 'get the lovely isles on your walls'), + ('furni_hc_djset_name', 'The Grammophon'), + ('pet_enrg_9', 'Tireless'), + ('furni_table_plasto_round*6_name', 'Round Dining Table'), + ('furni_sporttrack2*3_name', 'Sport corner grass'), + ('furni_footylamp_name', 'Football Lamp'), + ('furni_bed_silo_one_desc', 'Plain and simple'), + ('pet_enrg_0', 'Tired'), + ('furni_soft_sofachair_norja*7_name', 'Rural Iced Sofachair'), + ('furni_solarium_norja*9_desc', 'Rejuvenate your pixels!'), + ('furni_pillow*9_desc', 'Puffy, soft and VERY fluffy!'), + ('furni_plant_mazegate_snow_desc', 'There\'s snow way through!'), + ('furni_sound_set_8_name', 'Ambient 2'), + ('furni_divider_silo3*4_name', 'Beige Area Gate'), + ('previous', 'Previous'), + ('furni_glass_stool*3_desc', 'Translucent beauty'), + ('furni_bardeskcorner_polyfon*8_name', 'Yellow Mode Bardesk Corner'), + ('next_onearrowed', 'Next >'), + ('nav_venue_sw_lobby_expert_desc', 'For the William Tells and Robin Hoods of Snow Storming.'), + ('furni_bardeskcorner_polyfon*2_name', 'Black Mode Bardesk Corner'), + ('catalog_pet_unacceptable', 'Sorry, that name is unacceptable to Hotel Management'), + ('furni_sound_set_46_name', 'Club 1'), + ('nav_error_room_full', 'The room is full.'), + ('furni_queue_tile1*4_name', 'Gold Habbo Roller'), + ('furni_mocchamaster_desc', 'Wake up and smell it!'), + ('furni_gothic_stool*1_name', 'Gothic Stool Pink'), + ('furni_noob_chair*5_name', 'My first Habbo chair'), + ('furni_noob_rug*3_desc', 'Nice and neat sisal rug with aubergine edging'), + ('nav_venue_club_mammoth/0_name', 'Club Mammoth'), + ('pet_race_1_024', 'Cat Burglar'), + ('pet_race_1_022', 'Matted Moggy'), + ('poster_39_name', 'Screaming Furnies'), + ('pet_race_1_023', 'Indoor Alley Cat'), + ('furni_prizetrophy5*3_desc', 'Breathtaking bronze'), + ('pet_race_1_020', 'Caterwaul Kitty'), + ('NUF_mini_meet_people_room_tutor', 'The people wandering around are Habbos just like you.\\nClick on one of them to learn more about them- or on yourself to look in the mirror.'), + ('pet_race_1_021', 'Fabulous Feline'), + ('furni_arabian_tetbl_name', 'Hexagonal Tea Table'), + ('furni_grand_piano*4_name', 'Amber Grand Piano'), + ('poster_504_desc', 'The German flag'), + ('roomatic_name', 'Room name:'), + ('furni_sound_set_21_desc', 'Headbanging riffs'), + ('credit_redeem_info', 'More info about credit furni >>'), + ('furni_marquee*a_desc', 'It\'s both door and a shade!'), + ('furni_sound_set_33_name', 'Rock 3'), + ('furni_queue_tile1*5_desc', 'The power of movement'), + ('furni_doorD_name', 'Imperial Teleport'), + ('furni_rare_parasol*1_desc', 'Block those rays!'), + ('purse_youhave', 'You Have'), + ('nav_fullbutton', 'Full'), + ('furni_rare_fountain*2_desc', 'For our feathered friends'), + ('friend_request_accepted', 'Accepted!'), + ('tutorial_help_button_bubble', 'Click the blue question mark to open up the help menu to restart the tutorial.'), + ('furni_rubberchair*4_desc', 'Soft and tearproof!'), + ('furni_sound_set_9_desc', 'Mystical ambient soundscapes'), + ('furni_rare_fan*3_name', 'Purple Dragon Skin Fan'), + ('furni_table_plasto_square*8_desc', 'Hip plastic furniture'), + ('gs_choose_gametime', 'Choose Game duration:'), + ('furni_traffic_light*1_desc', 'Chill and wait your turn!'), + ('furni_sofachair_polyfon*6_desc', 'Blue Mode Armchair'), + ('furni_chair_norja*4_name', 'Urban Iced Chair'), + ('furni_val_teddy*2_name', 'Pink Share Bear'), + ('nav_venue_chill/0_name', 'Zen Garden'), + ('furni_table_plasto_square_name', 'Occasional Table'), + ('furni_bed_budget_name', 'Pura Bed'), + ('furni_solarium_norja_name', 'White Solarium'), + ('furni_noob_table*1_name', 'My first Habbo table'), + ('gs_5min', '5min'), + ('purse_credits', 'You have \\x1 Habbo Credit(s) in your purse.'), + ('furni_divider_poly3*5_name', 'Candy Hatch (Lockable)'), + ('furni_rare_icecream*6_name', 'Toffee Ice Cream Machine'), + ('furni_table_polyfon_med_name', 'Large Coffee Table'), + ('console_deselect_all', 'Deselect all'), + ('nav_venue_bb_lobby_amateur_8_name', 'Gevorderden Battle Ball 9'), + ('transaction_system_sms_win_kpn', 'KPN SMS'), + ('nav_venue_bb_lobby_intermediate_3/0_desc', ''), + ('furni_CFC_500_goldbar_desc', 'Worth 500 Credits'), + ('NUF_visiting_rooms', 'Visiting other players\' rooms'), + ('url_logout_timeout', 'http://%predefined%//account/disconnected?reason=logout'), + ('furni_table_silo_med*7_desc', 'Green Area Coffee Table'), + ('player_commands_no_args', 'You have not supplied any arguments!'), + ('furni_romantique_pianochair*2_name', 'Lime Romantique Piano Chair'), + ('pickup', 'Pick up'), + ('reg_tutorial_url', ''), + ('habboclub_confirm_body', 'You have %credits% credits'), + ('nav_venue_bb_lobby_beginner_12/0_desc', ''), + ('furni_rare_elephant_statue*1_name', 'Silver Elephant'), + ('help', 'Habbo Help'), + ('furni_soft_sofachair_norja*2_desc', 'Black Iced Sofachair'), + ('furni_table_plasto_round*1_desc', 'Hip plastic furniture'), + ('furni_sleepingbag*9_desc', 'Ultimate coziness'), + ('furni_arabian_tray2_desc', 'For those Arabian nights'), + ('NUF_visiting_rooms_hotelview_tutor', 'Hello. This time we are learning how to visit another user\'s room.'), + ('furni_traffic_light*6_name', 'Red Traffic Light'), + ('Alert_ChooseWhoToSentMessage', 'Please choose who to\\rsend your message to'), + ('poster_47_desc', 'Twinkle, twinkle'), + ('bb_title_finalScores', 'Final standings:'), + ('jukebox_song_author', 'by: %author%'), + ('poster_2003_name', 'Dodgy Geezer'), + ('poster_509_name', 'The Jamaican flag'), + ('poster_6_desc', 'But is it the right way up?'), + ('furni_toy1*1_name', 'Rubber Ball'), + ('nav_venue_bb_lobby_beginner_13_name', 'Beginners Battle Ball 14'), + ('furni_scifidoor*5_name', 'White Spaceship Door'), + ('credit_redeem_text', 'You are going to change Furni to %value% credits.'), + ('nav_venue_sw_lobby_amateur_0_name', 'Snow Slingers Lobby'), + ('club_txt_intro', 'Welcome to Habbo Club - the members only club that all the best Habbos belong to!\\r\\rMembers of Habbo Club get priority access to the hotel (so you can always get in), exclusive clothes, hair colours, rare furni and special guest room layouts. To see exactly what you\'ll be able to get your hands on as a Habbo Club member, take a look in the Catalogue.'), + ('nav_venue_bouncer_room_1_name', 'Beginners Battle Ball Arena'), + ('update_email_suggest', 'Habbo Hotel security supervisor requests you to update your email'), + ('furni_rare_dragonlamp*3_name', 'Silver Dragon Lamp'), + ('furni_scifiport*2_name', 'Blue Laser Gate'), + ('club_button_extend', 'Extend Membership'), + ('wallitem_val_heart_name', 'Heart Light'), + ('furni_pura_mdl3*7_name', 'Green Pura Module 3'), + ('furni_sound_set_61_desc', 'Straight from the heart'), + ('nav_venue_bb_lobby_expert_9/0_desc', ''), + ('furni_pura_mdl2*9_name', 'Red Pura Module 2'), + ('furni_hal_cauldron_name', 'Habboween Cauldron'), + ('furni_divider_nor1*2_name', 'Black Ice corner'), + ('send', 'Send'), + ('furni_couch_norja_desc', 'Two can perch comfortably'), + ('furni_pura_mdl4*5_name', 'beige pura module 4'), + ('pet_race_1_008', 'Mad Mouser'), + ('pet_race_1_009', 'Scaredy Kat'), + ('pet_race_1_006', 'Titchy Tiger'), + ('pet_race_1_007', 'Burmese Buddy'), + ('pet_race_1_004', 'Soft-Toed Sneaker'), + ('furni_divider_nor4*8_desc', 'Habbos, roll out!'), + ('furni_tile_desc', 'In a choice of colours'), + ('pet_race_1_005', 'Cat Astroflea'), + ('pet_race_1_002', 'Lesser Spotted Longhair'), + ('pet_race_1_003', 'Hidden Clause'), + ('pet_race_1_000', 'Sleepy Siamese'), + ('pet_race_1_001', 'Purr-Sian'), + ('furni_sound_set_53_name', 'Snowy Surprise'), + ('furni_rare_icecream*1_desc', 'Virtual blueberry rocks!'), + ('furni_table_plasto_round*15_name', 'Occasional Table'), + ('security', 'Security'), + ('furni_glass_chair*5_name', 'Glass chair'), + ('nav_venue_cunning_fox_gamehall/1_desc', 'It\'s one-on-one for five in a row'), + ('nav_venue_sw_lobby_tournament_4/0_desc', ''), + ('furni_carpet_soft_desc', 'Soft Wool Rug'), + ('poster_27_desc', 'Deck the halls!'), + ('furni_safe_silo*7_desc', 'Totally shatter-proof!'), + ('furni_table_silo_small*5_desc', 'Pink Area Occasional Table'), + ('furni_marquee*4_desc', 'It\'s both door and a shade!'), + ('furni_gothic_sofa*4_desc', 'Ghosts and Ghouls'), + ('furni_prizetrophy6*1_desc', 'Glittery gold'), + ('pet_race_1_019', 'Bobcat Wailer'), + ('furni_bardesk_polyfon*5_desc', 'For cute constructions'), + ('furni_carpet_polar*2_name', 'Blue Bear Rug'), + ('pet_race_1_017', 'Furry Friend'), + ('furni_soft_sofa_norja*6_desc', 'Blue Iced Sofa'), + ('furni_pura_mdl2*4_desc', 'Any way you like it!'), + ('pet_race_1_018', 'Trusting Tabby'), + ('pet_race_1_015', 'Haughty House Pet'), + ('chatlog.url', 'https://theallseeingeye.sulake.com/ase/habbo/uk/housekeeping/extra/hobba/chatlog.action?chatId='), + ('furni_ham2_name', 'Eaten Ham'), + ('pet_race_1_016', 'Curiousity - The Return!'), + ('pet_race_1_013', 'Felis Catus Allergicus'), + ('pet_race_1_014', 'Bushy Bobtail'), + ('pet_race_1_011', 'Egyptian Angora'), + ('pet_race_1_012', 'Freckled Feral'), + ('gs_choose_gamefield', 'Choose Game Arena:'), + ('furni_divider_nor5*6_desc', 'Cool cornering for your crib y0!'), + ('furni_summer_pool*2_name', 'Red Summer Pool'), + ('pet_race_1_010', 'Wannabe Wildcat'), + ('furni_rare_elephant_statue_desc', 'Say hello to Nelly'), + ('furni_sofa_silo*8_desc', 'Cushioned, understated comfort'), + ('furni_exe_rug_desc', 'Please remove your shoes!'), + ('NUF_meeting_people_roomlist_tutor', 'Let\'s visit one of the rooms and find out how to meet other users.'), + ('furni_chair_plasto*15_desc', 'Hip plastic furniture'), + ('nav_venue_habburger\'s_name', 'Habburgers'), + ('queue_current_2', 'You are in queue for the room.'), + ('queue_current_1', 'You are in Habbo Live queue...'), + ('furni_pura_mdl5*3_name', 'Black Pura Module 5'), + ('furni_hockey_score_name', 'Scoreboard'), + ('furni_sofachair_silo*5_desc', 'Pink Area Armchair'), + ('furni_hyacinth1_name', 'Pink Hyacinth'), + ('furni_pura_mdl1*6_desc', 'Any way you like it!'), + ('camera_open_dialog_heading', 'Camera'), + ('furni_prizetrophy5*2_name', 'Duo trophy'), + ('furni_glass_chair_desc', 'Translucent beauty'), + ('furni_rubberchair*3_desc', 'Soft and tearproof!'), + ('furni_exe_plant_name', 'Executive Plant'), + ('furni_pura_mdl2*3_desc', 'Any way you like it!'), + ('furni_pura_mdl1*2_name', 'Pink Pura Module 1'), + ('furni_plant_bonsai_desc', 'You can be sure it lives'), + ('furni_plant_valentinerose*4_desc', 'Be mine!'), + ('wallitem_hrella_poster_3_desc', 'Don\'t drift away!'), + ('furni_deadduck_name', 'Dead Duck'), + ('furni_summer_grill*3_desc', 'Plenty of steak on that barbie'), + ('modtool_extrainfo', 'Extra Info:'), + ('sound_machine_jukebox_window', 'Jukebox'), + ('gs_button_start', 'Start Game!'), + ('nav_venue_sw_lobby_beginner_5/0_desc', ''), + ('furni_romantique_chair*5_desc', 'What does this button do?'), + ('furni_table_plasto_4leg*9_desc', 'Hip plastic furniture'), + ('furni_soft_sofa_norja_desc', 'A soft iced sofa'), + ('furni_divider_nor4*9_name', 'Red Iced Auto Shutter'), + ('login_haventGotHabbo', 'Haven\'t got a Habbo yet?'), + ('furni_noob_stool*2_name', 'My first Habbo stool'), + ('furni_s_sound_machine*5_desc', 'Sound Machine Brown Desc'), + ('credit_redeem_window', 'Redeem credit furni'), + ('send_invitation_text', 'Want to meet someone from our Welcoming Party?'), + ('purse_vouchers_exitbutton', 'Cancel'), + ('furni_prizetrophy6*3_desc', 'Breathtaking bronze'), + ('nav_venue_cafe_gold/0_name', 'Kultakahvila'), + ('furni_fortune_name', 'Crystal Ball'), + ('poster_22_name', 'Butterfly Cabinet (blue)'), + ('object_displayer_link_badge', 'Edit Badge'), + ('furni_sound_set_15_name', 'RnB Grooves 6'), + ('Alert_NoNameSet', 'Check your Habbo name.'), + ('furni_hc_crpt_name', 'Persian Carpet'), + ('error_ok', 'OK->'), + ('game_chess_email', 'Receive game via email'), + ('sound_machine_confirm_save_list', 'Save playlist?'), + ('furni_noob_rug*2_desc', 'Nice and neat sisal rug with blue edging'), + ('queue_set.e1.alert', 'This room is currently available only to Habbos participating to the event.'), + ('furni_rare_icecream*0_desc', 'Virtual cherry rocks!'), + ('furni_arabian_chair_name', 'Green Blossom Chair'), + ('furni_divider_silo3*6_name', 'Blue Area Gate'), + ('furni_scifiport*4_desc', 'Energy beams. No trespassers!'), + ('furni_sofa_silo*4_desc', 'Beige Area Sofa'), + ('furni_one_way_door*4_desc', 'One at a time!'), + ('furni_chair_norja*5_desc', 'Sleek and chic for each cheek'), + ('furni_sound_set_19_desc', 'Shake your body!'), + ('poster_26_desc', 'See that halo gleam!'), + ('furni_doormat_plain*2_desc', 'Available in a variety of colours'), + ('furni_romantique_chair*1_name', 'Rose Quartz Chair'), + ('furni_hc_tv_name', 'Mega TV Set'), + ('pet.hotwords.follow_me', 'heel'), + ('furni_petfood3_desc', 'Fantastic 20% Saving!'), + ('furni_couch_norja*5_name', 'Pink Bench'), + ('furni_table_plasto_round*7_desc', 'Hip plastic furniture'), + ('furni_bed_armas_two_desc', 'King-sized pine comfort'), + ('modtool_days', 'Days'), + ('furni_one_way_door*7_name', 'Green One Way Gate'), + ('furni_table_norja_med*5_name', 'Large Coffee Table Pink'), + ('furni_sand_cstl_wall_name', 'sand_cstl_wall'), + ('nav_modify_doorstatus_givepw', 'Password for the room'), + ('NUF_getting_items_room_tutor', 'Nice room. Reminds me of a chic Parisian cafe in Slough. Open the Catalogue.'), + ('habbo_hand_prev', '<<<'), + ('pet.saying.generic.croco.3', 'Tick tock tick....'), + ('invitation_follow_failed', 'Sorry, your attempt to follow an invitation failed.'), + ('furni_sound_set_12_desc', 'Unusual as Standard'), + ('pet.saying.generic.croco.1', '*Mellow*'), + ('error_text', 'Error occured, press \'OK\' to restart program.\\r\\rPlease report bugs to:\\rwww.habbohotel.com/habbo/en/help/contact/bugs/ \\rSorry for the inconvenience.'), + ('pet.saying.generic.croco.2', 'I\'m so hungry I could eat you!'), + ('furni_divider_silo3*3_desc', 'Form following function'), + ('furni_table_plasto_4leg*2_desc', 'Hip plastic furniture'), + ('int_newmessages', 'New Message(s)'), + ('furni_rare_icecream*3_name', 'Blackcurrant Ice Cream Machine'), + ('bb_header_gameinfo', 'Game info'), + ('furni_scifiport*0_name', 'Red Laser Door'), + ('nav_venue_bb_lobby_beginner_7_name', 'Beginners Battle Ball 8'), + ('tx_history.description.bank_wallie', 'Wallie-card'), + ('nav_venue_hallway_name', 'Hallway'), + ('nav_venue_bb_lobby_amateur_11/0_desc', ''), + ('furni_bed_budget_one*5_desc', 'Prince sized comfort!'), + ('pet.saying.generic.croco.0', 'Rrrr....Grrrrrg....'), + ('nav_popup_go', '>>'), + ('furni_safe_silo*3_name', 'White Safe Minibar'), + ('furni_table_silo_small_name', 'Occasional Table'), + ('poll_confirm_window', 'Leave our poll'), + ('furni_table_norja_med*9_desc', 'For larger gatherings'), + ('furni_divider_nor4*6_desc', 'Habbos, roll out!'), + ('gs_3teams', '3 Teams Game'), + ('wallitem_post.it.limit', 'Only 50 stickies per room are allowed!'), + ('furni_scifidoor*4_desc', 'Protect your pot of gold!'), + ('furni_bed_polyfon_one*9_name', 'Red Single Bed'), + ('furni_soft_sofa_norja*2_desc', 'Black Iced Sofa'), + ('furni_corner_china_desc', 'Firm, fireproof foundation'), + ('hobba_pickup_go', 'Pick Up & Go!'), + ('furni_sporttrack3*2_desc', 'null'), + ('furni_rare_fan*6_name', 'Ochre Powered Fan'), + ('furni_sound_set_3_name', 'Electronic 1'), + ('NUF_mini_meet_people_user_tutor', 'Here you can chat to users directly. Ask a Habbo to be your friend by clicking on their Habbo and the button.\\nIf this is your first time, check your Hand to see a present to decorate your own room with, later.'), + ('furni_pura_mdl2*6_name', 'Blue Pura Module 2'), + ('furni_couch_norja*9_desc', 'Two can perch comfortably'), + ('furni_chair_plasty*9_desc', 'Hip plastic furniture'), + ('game_chess_white', 'White:'), + ('nav_venue_sw_lobby_intermediate_3/0_desc', 'Lumisota sen kuin vain kovenee.'), + ('furni_table_plasto_square*3_desc', 'Hip plastic furniture'), + ('nav_venue_theatredrome/0_desc', 'Perform your latest masterpiece!'), + ('nav_venue_the_den/0_desc', 'Has anyone seen my map?'), + ('furni_sound_set_40_name', 'Rock 4'), + ('remove', 'Remove'), + ('friend_request_decline_all', 'Decline all requests.'), + ('furni_rare_globe_name', 'Snow Globe'), + ('furni_bardesk_polyfon*8_name', 'Yellow Mode Bardesk'), + ('nav_venue_sw_lobby_free_6_name', 'Free Game Lobby'), + ('queue_change', 'Change queue'), + ('reg_parentemail_link_text2', 'Privacy Pledge'), + ('furni_rare_parasol*2_desc', 'Block those rays!'), + ('furni_romantique_pianochair*3_desc', 'null'), + ('reg_parentemail_link_text1', 'See the letter'), + ('sound_machine_list_save', 'Save Playlist'), + ('nav_public_helptext_hd', 'Public Spaces'), + ('furni_chair_plasty*2_desc', 'Hip plastic furniture'), + ('spectator_count', 'spectators %cnt%/%max%'), + ('reg_welcome2', 'Create Your Own Habbo'), + ('wallitem_roomdimmer_desc', 'Superior lighting for your room'), + ('furni_prizetrophy*3_name', 'Classic trophy'), + ('furni_plant_rose_name', 'Cut Roses'), + ('reg_welcome3', 'Now the fun begins! All you need to do is register and you\'re ready to start. It won\'t take long!\\rYou can change everything except your name and date of birth later. Come on!'), + ('furni_noob_table*5_name', 'My first Habbo table'), + ('nav_error_room_closed', 'The room is closed.'), + ('reg_changePassword', 'Change your password'), + ('furni_divider_nor5*3_desc', 'Cool cornering for your crib y0!'), + ('furni_doorC_name', 'Portaloo'), + ('furni_chair_plasty*10_name', 'Plastic Pod Chair'), + ('furni_pura_mdl1*9_name', 'Red Pura Module 1'), + ('furni_rare_stand_name', 'Speaker\'s Corner'), + ('furni_grunge_table_name', 'Grunge Table'), + ('furni_traffic_light*2_name', 'Blue Traffic Light'), + ('pet.saying.angry.croco.2', 'You have displeased me.'), + ('human_trading', 'Trading'), + ('furni_noob_stool*6_desc', 'Unfold me and take the weight off (green)'), + ('pet.saying.angry.croco.1', 'Rawwwr...rrr'), + ('nav_venue_sw_lobby_intermediate_5_name', 'Snow Bombardiers Lobby'), + ('gs_button_leavegame', 'Leave Game'), + ('pet.saying.angry.croco.0', 'Grrrrr...rrr'), + ('furni_s_sound_machine*1_name', 'Sound Machine Grey'), + ('pet.saying.angry.croco.4', 'Buuuuurrr..rrrrr'), + ('furni_chair_plasto*7_desc', 'Hip plastic furniture'), + ('pet.saying.angry.croco.3', 'Rowrrrr...rrrr'), + ('furni_soft_sofa_norja*9_desc', 'Red Iced Sofa'), + ('nav_venue_skylight_lobby_name', 'Skylight Lobby'), + ('furni_bed_polyfon_one*6_desc', 'Blue Mode Single Bed'), + ('furni_pillow*8_desc', 'Puffy, soft and huge'), + ('furni_hc_rntgn_name', 'X-Ray Divider'), + ('furni_table_silo_med*5_desc', 'Pink Area Coffee Table'), + ('furni_gothic_stool*2_desc', 'Be seated please..'), + ('furni_typingmachine_desc', 'Write that bestseller'), + ('furni_fridge_desc', 'Keep cool with a chilled snack or drink'), + ('nav_venue_cunning_fox_gamehall/4_desc', 'Get a hand like a foot? Keep a straight face and bluff it out'), + ('doorbell_rings', 'Rings the doorbell - Open the door?'), + ('furni_divider_silo1*9_desc', 'Red Area Small Table'), + ('nav_venue_bb_lobby_intermediate_7/0_desc', ''), + ('furni_prize1_name', 'Gold Trophy'), + ('poster_54_name', 'Hockey Stick'), + ('furni_sound_set_47_name', 'Club 2'), + ('furni_prizetrophy3*1_name', 'Globe trophy'), + ('purse_head2', 'ACCOUNT TRANSACTIONS'), + ('furni_soft_sofa_norja*5_name', 'Pink Iced Sofa'), + ('furni_prizetrophy9*1_desc', 'Glittery gold'), + ('buddyremove_next', 'Next >'), + ('reg_girl', 'Girl'), + ('furni_bed_budget_one*1_name', 'Aqua Pura Bed'), + ('NUF_visiting_rooms_roomlist_go', 'Click \'Go\' to go to a room.'), + ('poster_506_desc', 'To \'Finnish\' your decor...'), + ('furni_toy1_name', 'Rubber Ball'), + ('furni_sound_set_7_desc', 'Sound effects for Furni'), + ('sw_fieldname_6', 'Riverbank Siege'), + ('sw_fieldname_5', 'Polar Labyrinth'), + ('furni_bed_polyfon*4_desc', 'Beige Mode Double Bed'), + ('furni_pillow*4_name', 'Gold Feather Pillow'), + ('alert_duplicatesession', 'You are already logged in on another hotel! Log out before trying again.'), + ('sw_fieldname_7', 'Skull Falls Assault'), + ('sound_machine_alert_song_not_ready', 'Can\'t save song! Song not ready yet.'), + ('nav_venue_bb_lobby_beginner_5/0_desc', ''), + ('nav_venue_bb_lobby_tournament_4/0_desc', ''), + ('pet.saying.play.dog.1', 'woofWOOFwoofWOOFwoof'), + ('pet.saying.play.dog.0', 'rrr.. WOOF .rrr..'), + ('furni_cn_lamp_name', 'Lantern'), + ('furni_arabian_rug_name', 'Berber Kilim Rug'), + ('NUF_groups_hotelview_tutor', 'You have now opened the Group tutorial in the website window. Special!'), + ('gs_error_start_9', 'Team sizes can only differ by one player. This Game cannot start!'), + ('furni_divider_poly3*7_desc', 'Green Mode Bardesk Gate'), + ('furni_sofachair_silo*4_desc', 'Beige Area Armchair'), + ('poster_58_desc', 'whish you luck'), + ('furni_chair_basic*2_desc', 'It\'s a cracking design!'), + ('poster_516_name', 'The English flag'), + ('nav_venue_sw_lobby_tournament_2/0_desc', ''), + ('furni_gothic_carpet_name', 'Cobbled Path'), + ('sw_title', 'Snow Storm'), + ('furni_doormat_plain*5_name', 'Doormat'), + ('furni_pura_mdl4*4_desc', 'Any way you like it!'), + ('furni_sound_machine*1_name', 'Sound Machine'), + ('furni_sofa_silo*7_name', 'Green Area Sofa'), + ('nav_venue_sw_lobby_tournament_4_name', 'Tournament Lobby'), + ('gs_title_gamecreation', 'Game creation'), + ('furni_couch_norja*2_desc', 'Two can perch comfortably'), + ('furni_prizetrophy5_desc', 'Palkinto'), + ('furni_divider_nor3*9_desc', 'Red Iced gate'), + ('furni_present_gen_name', 'Gift'), + ('furni_prizetrophy7*3_name', 'Bronze Habbo trophy'), + ('alert_reg_parent_email', 'The email address you provided is unacceptable.'), + ('furni_bed_polyfon_girl_name', 'Double Bed'), + ('furni_rare_fountain_name', 'Bird Bath (red)'), + ('furni_pura_mdl3*3_name', 'Black Pura Module 3'), + ('furni_plant_pineapple_name', 'Pineapple Plant'), + ('furni_divider_nor2*8_name', 'Yellow Iced bar desk'), + ('messenger', 'Messenger'), + ('nav_venue_bb_arena_0_name', 'Battle Ball kaikille'), + ('sw_fieldname_2', 'Algid River'), + ('furni_bed_silo_two_desc', 'Plain and simple x2'), + ('sw_fieldname_1', 'Arctic Island'), + ('furni_pillow*1_desc', 'Puffy, soft and huge'), + ('sw_fieldname_4', 'Frosty Forest'), + ('sw_fieldname_3', 'Glacial Fort'), + ('furni_bar_basic_desc', 'A pura series 300 minibar'), + ('tutorial_welcome_M', 'Hi! I am your guide to Habbo Hotel. Please pick a topic to start.'), + ('tutorial_welcome_F', 'Hi there! I\'m your guide to Habbo Hotel. What would you like to learn today?'), + ('Alert_NoNameSetForLogo', 'Please give a name to your logo'), + ('furni_glass_table*5_name', 'Glass table'), + ('group_owner', 'Owner'), + ('console_target_friend_list_full', 'This user\'s friend list is full'), + ('furni_romantique_smalltabl*2_name', 'Lime Tray Table'), + ('ph_keys_spacebar', 'Spacebar'), + ('furni_noob_chair*3_name', 'My first Habbo chair'), + ('NUF_meeting_people_roomlist_publicTab', 'Click the Public Spaces tab to see the list of public rooms. To go to the room click the \'Go\' button.'), + ('furni_bed_polyfon*7_name', 'Green Mode Double Bed'), + ('furni_jukebox_ptv*1_name', 'Jukebox Pacha TV'), + ('poster_513_desc', 'Aussies rule!'), + ('poster_51_desc', '2 points for every basket'), + ('furni_toy1*2_name', 'Rubber Ball'), + ('furni_bartable_armas_name', 'Bardesk'), + ('nav_venue_sw_lobby_amateur_0/0_desc', ''), + ('NUF_mini_use_console_read_tutor', 'The Habbo Console lets you message with people you have added to your friends list.'), + ('nav_venue_bb_lobby_beginner_12_name', 'Beginners Battle Ball 13'), + ('poster_2002_name', 'Urho Kaleva Kekkonen'), + ('furni_sound_set_44_desc', 'Haunted Dimension'), + ('pet.saying.beg.dog.1', 'Oouh..oouh..snuh..ooo'), + ('furni_sporttrack2*1_name', 'Sport corner tartan'), + ('pet.saying.beg.dog.0', 'Oooo...Ouuu...oo...OUUU'), + ('furni_solarium_norja*5_desc', 'Rejuvenate your pixels!'), + ('pet.saying.beg.dog.2', '*whimpers *'), + ('reg_pledgelink', 'Hotel rules'), + ('habboclub_price1.days', '30'), + ('furni_glass_shelf_desc', 'Translucent beauty'), + ('furni_sofachair_polyfon*3_name', 'White Armchair'), + ('reg_verification_info', 'You must know the correct birthday and password before you\'re allowed to make these changes.'), + ('furni_carpet_soft*5_desc', 'Soft Wool Rug'), + ('furni_grunge_mattress_name', 'Grunge Mattress'), + ('furni_bed_polyfon_one_name', 'Single Bed'), + ('furni_sound_machine_pro_name', 'Sound Machine Pro'), + ('furni_chair_china_desc', 'The elegant beauty of tradition'), + ('furni_rare_icecream*7_desc', 'Virtual chocolate rocks!'), + ('furni_table_silo_med*8_name', 'Yellow Coffee Table'), + ('club_gift.message', 'Happy Habbo Club! Love Callie :)'), + ('furni_sw_raven_desc', 'My name is Otter'), + ('furni_noob_table*2_desc', 'Lightweight, practical and dark blue'), + ('furni_soft_sofachair_norja*3_desc', 'Soft Iced sofachair'), + ('sound_machine_confirm_delete', 'Delete song?'), + ('furni_plant_fruittree_name', 'Fruit Tree'), + ('nav_venue_bb_lobby_intermediate_1/0_desc', ''), + ('furni_heartsofa_name', 'Heart Sofa'), + ('furni_bed_budget_one*8_name', 'Yellow Pura Bed'), + ('NUF_getting_room', 'Making your own room'), + ('furni_rare_elephant_statue*2_name', 'Bronze Elephant'), + ('nav_venue_ballroom/0_desc', 'Come play ball!'), + ('nav_venue_sw_lobby_amateur_1_name', 'Snow Slingers Lobby'), + ('console_lasttime', 'Last Time'), + ('furni_md_sofa_desc', 'A decent recliner'), + ('furni_wooden_screen*6_name', 'Blue Oriental Screen'), + ('partner_registration_text', 'Click the link to finish your registration. When you have finished the registration click OK to continue to the hotel.'), + ('furni_sound_set_62_desc', 'Music of the Arabian night!'), + ('furni_arabian_divdr_name', 'Soft wooden screen'), + ('furni_tree1_desc', 'Dead christmas tree'), + ('furni_grand_piano*3_name', 'Pink Grand Piano'), + ('console_select_requests', 'Following users have asked to be your friend. Please accept or decline.'), + ('furni_divider_nor4*2_name', 'Black Iced Auto Shutter'), + ('furni_glass_chair*3_name', 'Glass chair'), + ('reg_passwordContainsNoNumber', 'Password must contain at least one number'), + ('buddyremove_invert', 'Invert Selection'), + ('furni_val_teddy*5_desc', 'The yellow bear of understanding'), + ('furni_sound_set_51_name', 'Club 6'), + ('poster_1_desc', 'The Noble and Silver Show'), + ('roomevent_create_name', 'Type the name of your event'), + ('Alert_unacceptableName', 'Sorry, that name is unacceptable to the Hotel Management'), + ('NUF_getting_room_go_tutor', 'Your room is now ready. Let\'s go see! I hope you have a bed...'), + ('poster_520_name', 'The Rainbow Flag'), + ('password', 'Password:'), + ('furni_bed_budget*8_name', 'Yellow Pura Double Bed'), + ('gs_header_gamelist', 'Game List'), + ('furni_chair_plasty_desc', 'Hip plastic furniture'), + ('url_purse_subscribe', 'http://%predefined%//credits?'), + ('furni_table_plasto_bigsquare*15_desc', 'Hip plastic furniture'), + ('furni_glass_stool*6_desc', 'Translucent beauty'), + ('error_report', 'Error Report'), + ('summer_chair_6_desc', 'Get decked'), + ('furni_chair_basic*5_name', 'chair_basic'), + ('room_remove_specs', 'Sorry! Now it\'s someone else\'s turn to watch this event.'), + ('furni_bunny_desc', 'Yours to cuddle up to'), + ('invitation_exists', 'You have already invited members of the Welcoming Party to your room.'), + ('purse_vouchers_furni_success', 'Voucher was successfully redeemed. You have been given the following furniture:'), + ('nav_rooms_popular', 'Popular rooms'), + ('nav_cancel', 'Cancel'), + ('alert_cross_domain_download', 'Cross domain content download prevented'), + ('furni_table_plasto_4leg*16_desc', 'Hip plastic furniture'), + ('url_pets', 'http://%predefined%//hotel/pets'), + ('furni_bardeskcorner_polyfon*9_desc', 'Tuck it away'), + ('gs_button_cancel', 'Cancel'), + ('furni_barchair_silo*7_name', 'Green Bar Stool'), + ('catalog_credits', 'You have \\x Credits in your purse.'), + ('furni_divider_nor3_name', 'Door (Lockable)'), + ('nav_modify_name', 'Name of the room'), + ('nav_venue_bb_lobby_amateur_7_name', 'Gevorderden Battle Ball 8'), + ('nav_venue_club_massiva/0_desc', 'Rest your dancing feet!'), + ('furni_gothrailing_desc', 'The dark side of Habbo'), + ('queue_set.na.alert', 'This Room is for Staff only.'), + ('nav_venue_bb_lobby_tournament_8_name', 'Competitie Battle Ball 9'), + ('furni_sound_set_29_name', 'Dance 2'), + ('console_msgs', 'msgs'), + ('furni_noob_lamp*6_name', 'My first Habbo lamp'), + ('furni_marquee*6_desc', 'It\'s both door and a shade!'), + ('furni_chair_plasto*16_desc', 'Hip plastic furniture'), + ('furni_chair_basic*9_desc', 'It\'s a cracking design!'), + ('summer_chair_2_name', 'Pink Deck Chair'), + ('alert_too_much_furnitures', 'Furni limit for room is exceeded. Not all furnitures are shown. Please remove some.'), + ('furni_pura_mdl5*4_name', 'White Pura Module 5'), + ('bus.full_msg', 'The FRANK bus is full at the moment, please come back later or visit the FRANK page below for more information.'), + ('furni_sound_set_22_name', 'SFX 3'), + ('furni_gothic_sofa*3_desc', 'The dark side of Habbo'), + ('furni_md_limukaappi_name', 'Habbo Cola Machine'), + ('poster_19_desc', 'Trying to get in or out?'), + ('gs_2min', '2min'), + ('poster_8_desc', 'Habbos come in all colours'), + ('furni_pillar*6_desc', 'Ancient and stately'), + ('furni_carpet_standard*3_desc', 'Available in a variety of colours'), + ('purse_vouchers_info', 'When you buy Habbo Credits with a mobile phone, you will receive a special voucher code. Enter the code in the box above, click \'Get Credits!\' and they\'ll be added to your purse.'), + ('furni_valeduck_name', 'Valentine\'s Duck'), + ('Alert_MessageFromAdmin', 'Message from Hotel Management:'), + ('furni_present_gen1_desc', 'What\'s inside?'), + ('reg_tutorial_txt', ''), + ('furni_tile_stella_name', 'Star Tile'), + ('furni_shelves_norja*4_name', 'Urban Iced Bookcase'), + ('transaction_system_creditcards_is', 'Creditcard'), + ('furni_shelves_polyfon_desc', 'For the arty pad'), + ('furni_tv_luxus_name', 'Digital TV'), + ('recycler_status_window_title', 'Recycling Status'), + ('furni_sleepingbag*6_name', 'Purple Sleeping Bag'), + ('gs_button_shrink', 'Minimize Window'), + ('furni_wcandleset_desc', 'Simple but stylish'), + ('furni_sleepingbag*3_desc', 'Ultimate coziness'), + ('object_displayer_show_actions', 'Show actions'), + ('hubu_t5_1', 'Lisetoa huumeista'), + ('song_disk_text_template', '%name%'), + ('hubu_t5_2', 'Huumeista-esite'), + ('queue_other_1', 'Habbo Live queue status'), + ('poster_33_name', 'Save the Panda'), + ('hubu_t5_3', 'Yleistietoa EOPH ry:st--------------'), + ('queue_other_2', 'Room queue status'), + ('furni_hcsohva_name', 'Throne Sofa'), + ('furni_sound_set_26_desc', 'Bollywood Beats!'), + ('furni_christmas_poop_name', 'Reindeer Droppings'), + ('furni_rare_dragonlamp*4_name', 'Serpent of Doom'), + ('nav_venue_bb_lobby_amateur_7/0_desc', ''), + ('purse_value', 'VALUE'), + ('furni_glass_sofa*5_desc', 'Translucent beauty'), + ('nav_venue_bb_lobby_tournament_15/0_desc', ''), + ('furni_glass_stool*2_desc', 'Translucent beauty'), + ('pet.saying.play.cat.1', 'Purrrr.. oo..Purrr'), + ('furni_pura_mdl4*7_name', 'Green Pura Module 4'), + ('nav_venue_cafe_ole/0_desc', 'Relax with friends over one of Marias specialty coffees'), + ('pet.saying.play.cat.0', 'Mew..MEOW..meow'), + ('furni_pumpkin_name', 'Pumpkin Lamp'), + ('furni_summer_chair*7_desc', 'Reserved!'), + ('ph_tickets_txt', 'Tickets can be used for BattleBall: Rebound!, SnowStorm, the Lido Diving and Wobble Squabble games. Tickets never expire.\\r\\rCurrently you have \\x1 ticket(s).'), + ('roomatic_onemoment', 'Please wait, we are going to your room...'), + ('furni_small_table_armas_name', 'Occasional Table'), + ('furni_table_polyfon_med_desc', 'For larger gatherings'), + ('nav_venue_bb_lobby_expert_3/0_desc', ''), + ('furni_chair_silo*6_desc', 'Blue Silo Dining Chair'), + ('furni_exe_globe_name', 'Power Globe'), + ('furni_bed_budget_one_name', 'bed_budget_one'), + ('furni_divider_silo1*2_desc', 'Neat and natty'), + ('nav_venue_bb_lobby_intermediate_0_name', 'Intermediate'), + ('furni_sofa_polyfon*9_desc', 'Comfort for stylish couples'), + ('furni_noob_lamp*3_desc', 'Get the light right where you want it (aubergine)'), + ('nav_showfull', 'Show Full Rooms'), + ('furni_divider_nor3*2_desc', 'Black Iced gate'), + ('reg_note_title', 'Warning!'), + ('hubu_answ_count', 'Replies'), + ('nav_recommended_rooms', 'Recommended Rooms'), + ('transaction_system_bank_nordea', 'Nordea'), + ('furni_sound_set_37_desc', ''), + ('poster_2006_desc', 'He is the magic Habbo'), + ('sw_link_gameRules_url', 'http://%predefined%//groups/56553/id'), + ('wave', 'Wave'), + ('furni_hc_djset_desc', 'Very old skool scratch\'n\'spin'), + ('furni_plant_maze_name', 'Maze Shrubbery'), + ('furni_scifirocket*3_name', 'Endor Smoke Machine'), + ('furni_val_teddy*1_name', 'Grey Share Bear'), + ('recycler_ready_outcome', 'Recycling reward: %outcome%'), + ('poster_4_desc', 'Fake of course!'), + ('poster_62_desc', 'We can\'t bear to lose them!'), + ('furni_glass_stool*9_desc', 'Translucent beauty'), + ('furni_goodie1_name', 'Marzipan Man'), + ('nav_modify_choosecategory', 'Choose a category for your room'), + ('object_displayer_link_home', 'User\'s home page'), + ('nav_venue_sw_lobby_tournament_8/0_desc', ''), + ('furni_xmasduck_name', 'Christmas Rubber Duck'), + ('help_txt_2', 'Password Reset'), + ('pet_mood_2', 'Blue'), + ('furni_queue_tile1*4_desc', 'The power of movement'), + ('help_txt_1', 'How do I get Credits?'), + ('pet_mood_3', 'Contented'), + ('nav_venue_bb_lobby_tournament_1_name', 'Competitie Battle Ball 2'), + ('furni_rare_daffodil_rug_name', 'Petal Patch'), + ('help_txt_4', 'The Habbo Way'), + ('pet_mood_0', 'Miserable'), + ('help_txt_3', 'Help with Habbo Hotel'), + ('pet_mood_1', 'Depressed'), + ('pet_mood_6', 'Ecstatic'), + ('furni_bed_budget*4_name', 'White Pura Double Bed'), + ('nav_venue_bb_lobby_amateur_0_name', 'Amateur'), + ('furni_sofachair_polyfon*7_desc', 'Green Mode Armchair'), + ('yes', 'Yes'), + ('pet_mood_4', 'Happy'), + ('pet_mood_5', 'Joyful'), + ('furni_sound_set_30_desc', 'Moments in love'), + ('furni_prizetrophy2*1_desc', 'Glittery gold'), + ('furni_wooden_screen*3_desc', 'Add an exotic touch to your room'), + ('transaction_system_bank_op', 'Osuuspankki'), + ('help_txt_6', 'Contact Us'), + ('help_txt_5', 'Safety Tips'), + ('furni_bardeskcorner_polyfon*2_desc', 'Black Mode Bardesk Corner'), + ('poster_15_desc', 'Marvellous mountains'), + ('room_areYouSurePlace', 'Warning! If you put something down in this room you will not be able to pick it up again.'), + ('nav_venue_bouncer_room_3_name', 'Semi-profs Battle Ball Arena'), + ('furni_chair_plasto*12_name', 'Chair'), + ('furni_gothic_chair*6_name', 'Gothic Chair Blue'), + ('furni_sofa_polyfon*2_desc', 'Black Mode Sofa'), + ('modtool_alertuser', 'Alert User'), + ('furni_toilet_desc', 'Loo Seat'), + ('furni_plant_cruddy_name', 'Aloe Vera'), + ('nav_venue_space_cafe/0_desc', 'In this space noone can see you ask for a soda!'), + ('nav_incorrectflatpw', 'Incorrect, try again.'), + ('furni_chair_plasto*13_desc', 'Hip plastic furniture'), + ('login_firstTimeHere', 'First time here?'), + ('furni_skullcandle_desc', 'Alas poor Yorrick...'), + ('NUF_mini_endtopic_step1_tutor', 'Well that\'s all from me. If you have any problems just click the little blue question mark to restart the tutorial and find our FAQs.\\nTo start exploring by yourself, click Close guide from the upper left corner.'), + ('furni_divider_poly3*3_name', 'White Hatch'), + ('help_callforhelp', 'Get Live Help'), + ('furni_rare_fountain*2_name', 'Bird Bath (green)'), + ('nav_venue_rooftop_name', 'Rooftop Cafe'), + ('furni_scifiport*7_name', 'Turquoise Sci-Fi Port'), + ('purse_back_to_credits', 'Back To Purse'), + ('room_ban', 'Kick & ban'), + ('furni_pura_mdl5*1_name', 'Aqua Pura Module 5'), + ('furni_val_teddy*4_name', 'Brown Share Bear'), + ('poster_40_name', 'Bonnie Blonde'), + ('NUF_getting_room_navigator_tutor', 'You want to click it real good. The \'Own room(s)\' tab I mean. Don\'t click yourself. It\'s unhygienic.'), + ('summer_chair_3_desc', 'Relax and enjoy the sun'), + ('furni_wooden_screen*2_name', 'RosewoodScreen'), + ('nav_venue_sun_terrace_name', 'Sun Terrace'), + ('furni_rare_fan*3_desc', 'Keeps the heat off St George!'), + ('nav_venue_sport_name', 'Power Gym'), + ('furni_toilet_red_desc', 'Loo Seat'), + ('retype_password', 'Retype Password:'), + ('furni_chair_basic*6_desc', 'It\'s a cracking design!'), + ('console_friends_helptext', 'This screen shows a list of all your Habbo Friends. It tells you where they are in the hotel, or, if they\'re not checked in, when their last visit was.'), + ('NUF_getting_items_room_', 'This is the Catalogue icon. Click to open it.'), + ('furni_grunge_barrel_desc', 'Beacon of light!'), + ('furni_soft_sofachair_norja*6_name', 'Blue Iced Sofachair'), + ('int_howtoget', 'How To get?'), + ('furni_sound_set_23_desc', 'Don\'t be afraid of the dark'), + ('nav_ok', 'OK'), + ('furni_sofachair_polyfon*6_name', 'Blue Mode Armchair'), + ('nav_venue_theatredrome_valentine_name', 'Theatredrome Valentine'), + ('furni_sofachair_polyfon_desc', 'Loft-style comfort'), + ('poster_83_name', 'Pöllö huhuilee'), + ('furni_soft_sofachair_norja*2_name', 'Black Iced Sofachair'), + ('roomdimmer_furni_limit', 'You can only have one roomdimmer per room'), + ('recycler_progress_timeleft', 'Time left: %hours% h and %minutes% min'), + ('furni_chair_plasto*3_name', 'Chair'), + ('NUF_getting_room_hotelview_tutor', 'Now you will learn how to make your own room. First go to the Guest Rooms area of the Navigator.'), + ('roomevent_create', 'Create'), + ('reg_year', 'Year'), + ('furni_divider_poly3_name', 'Hatch (Lockable)'), + ('furni_divider_nor1*7_name', 'Rural Iced Corner'), + ('furni_rare_beehive_bulb_name', 'Blue Amber Lamp'), + ('furni_waterbowl*2_name', 'Green Water Bowl'), + ('NUF_getting_room_room_hand', 'Open your hand!'), + ('furni_carpet_standard*6_desc', 'Available in a variety of colours'), + ('furni_CF_5_coin_silver_name', 'Silver Coin'), + ('furni_shelves_norja*7_name', 'Rural Iced Bookcase'), + ('opening_hours_text_disabled', 'The Hotel is shutting down really soon. To avoid confusion, purchasing of furniture, Habbo Club and game tickets have been disabled, as well as playing games and furniture trading. Try again tomorrow when the hotel is open!'), + ('nav_venue_bb_lobby_5_name', 'Battle Ball Kaikille'), + ('game_bs_congrat', 'Congratulations!'), + ('furni_arabian_tray2_name', 'Candle Tray'), + ('furni_giftflowers_desc', 'Guaranteed to stay fresh'), + ('club_button_1_period', 'Buy 1 >>>'), + ('furni_bed_polyfon_one*2_desc', 'Black Mode Single Bed'), + ('poster_47_name', 'Small silver star'), + ('furni_divider_nor3*5_desc', 'Pink Iced gate'), + ('furni_sofachair_polyfon_girl_desc', 'Think pink'), + ('furni_pura_mdl5*8_name', 'Yellow Pura Module 5'), + ('furni_hal_cauldron_desc', 'Eye of Habbo and toe of Mod!'), + ('poster_1006_name', 'Hoot Poster'), + ('furni_carpet_valentine_name', 'Red carpet'), + ('furni_floortile_name', 'Floor Tile'), + ('furni_divider_nor1*4_name', 'Urban Iced Corner'), + ('furni_bardeskcorner_polyfon*12_desc', 'Tuck it away'), + ('furni_table_plasto_bigsquare*3_desc', 'Hip plastic furniture'), + ('furni_traffic_light*6_desc', 'Chill and wait your turn!'), + ('club_general_prepaid', 'Prepaid Months'), + ('wallitem_val_heart_desc', 'Heartbroken... without your love!'), + ('furni_pura_mdl3*7_desc', 'Any way you like it!'), + ('furni_sound_set_58_name', 'RnB Grooves 4'), + ('furni_china_shelve_name', 'Chinese Lacquer Bookshelf'), + ('furni_divider_silo1*5_desc', 'Pink Area Corner Shelf'), + ('nav_venue_sw_lobby_tournament_desc', 'For stand-alone Tournaments.'), + ('furni_divider_silo2_name', 'Screen'), + ('furni_plant_mazegate_name', 'Maze Shrubbery Gate'), + ('poster_509_desc', 'The flag of Jamaica'), + ('furni_soft_sofachair_norja*9_name', 'Red Iced Sofachair'), + ('nav_venue_sw_arena_intermediate_name(0)', 'Playing intermediate game'), + ('furni_barchair_silo*4_name', 'Beige Bar Stool'), + ('furni_scifidoor*7_name', 'Aqua Spaceship Door'), + ('furni_CF_10_coin_gold_desc', 'Worth 10 Credits'), + ('furni_glass_sofa*8_desc', 'Translucent beauty'), + ('jukebox_reset', 'Reset Jukebox'), + ('nav_venue_sw_lobby_intermediate_desc', 'For the accomplished Snow Stormers.'), + ('furni_spotlight_desc', 'For the star of the show'), + ('furni_couch_norja_name', 'Bench'), + ('furni_romantique_divan*3_name', 'Turquoise Romantique Divan'), + ('furni_sleepingbag*7_desc', 'Ultimate coziness'), + ('roomatic_pws2', '24 hour access:'), + ('wallitem_jp_sheet1_desc', 'jp_sheet1'), + ('furni_table_silo_med*2_desc', 'Wipe clean and unobtrusive'), + ('furni_glass_table_desc', 'Translucent beauty'), + ('poster_502_desc', 'The US flag'), + ('pet_enrg_10', 'Mad'), + ('gs_scores_team_2', 'Blue Team:'), + ('pet_enrg_11', 'Nutcase'), + ('gs_scores_team_1', 'Red Team:'), + ('furni_cn_sofa_desc', 'Seating,Oriental style!'), + ('gs_scores_team_4', 'Green Team:'), + ('gs_scores_team_3', 'Yellow Team:'), + ('furni_table_silo_med*9_desc', 'Red Area Coffee Table'), + ('furni_hc_machine_name', 'Weird Science Machine'), + ('callhelp_writeyour', 'Write your question about Habbo Hotel here:'), + ('furni_table_silo_small*5_name', 'Pink Area Occasional Table'), + ('nav_addtofavourites', 'Add to favourites'), + ('furni_table_plasto_round*15_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_tournament_4_name', 'Competitie Battle Ball 5'), + ('furni_birdie_name', 'Pop-up Egg'), + ('furni_table_plasto_bigsquare_desc', 'Hip plastic furniture'), + ('furni_sound_set_33_desc', 'Guitar solo set'), + ('furni_romantique_divider*3_desc', 'Keeping things separated'), + ('furni_bed_budget*1_name', 'Aqua Pura Double Bed'), + ('furni_rare_beehive_bulb*2_desc', 'A honey-hued glow'), + ('furni_theatre_seat_desc', 'For Lazy boys and girls!'), + ('furni_hc_lmpst_desc', 'Somber and atmospheric'), + ('furni_divider_nor5*6_name', 'Blue Iced Angle'), + ('furni_summer_pool*2_desc', 'Fancy a dip?'), + ('poster_12_desc', 'a beautiful sunset'), + ('furni_carpet_polar*2_desc', 'Snuggle up on a Funky bear rug...'), + ('furni_md_rug_desc', 'Bubbles under your steps'), + ('Alert_InviteFriend', 'Invite your friends'), + ('nav_venue_bb_lobby_intermediate_4_name', 'Semi-profs Battle Ball 5'), + ('furni_hockey_score_desc', '...for keeping your score'), + ('furni_gothic_chair*3_name', 'Red Gothic Chair'), + ('wallitem_sw_stone_name', 'sw_stone'), + ('furni_pillow*7_name', 'Purple Velvet Pillow'), + ('nav_popup_header', 'Recommended rooms'), + ('nav_venue_sw_lobby_beginner_0_name', 'Snow Rookies Lobby'), + ('furni_table_norja_med*5_desc', 'For larger gatherings'), + ('furni_red_tv_name', 'Portable TV'), + ('reg_promise', '*Any personal information you supply will only be used by Habbo Ltd in accordance with the Habbo Pledge and will not be shared with third parties.'), + ('room_badge_choose', 'Modify Badge:'), + ('furni_table_plasto_square*15_desc', 'Hip plastic furniture'), + ('furni_sound_set_48_desc', 'Sweet party beat'), + ('nav_venue_ballroom_name', 'Ballroom'), + ('pet.hotwords.bad', 'bad'), + ('poster_55_desc', 'Save our trees!'), + ('furni_glass_chair_name', 'Glass chair'), + ('furni_prizetrophy5*2_desc', 'Shiny silver'), + ('furni_divider_poly3*4_desc', 'Beige Mode Bardesk Gate'), + ('tutorial_console_sample_message', 'Hello! This is a message sent to you from the Habbo Tutorial. To close and delete this message click delete. Sadly you cannot reply to this message as it is automated. Normally you can reply to messages by clicking the reply button.'), + ('furni_s_sound_machine*5_name', 'Sound Machine Brown'), + ('furni_divider_nor4*9_desc', 'Habbos, roll out!'), + ('furni_pura_mdl3*4_desc', 'Any way you like it!'), + ('NUF_getting_room_room_tutor', 'Tada! Nice room, although it\'s a little empty. Hey! Let\'s furnish it with something./nOpen your hand to check what you have, (if you have done this step before then you won\'t receive anything).'), + ('furni_fortune_desc', 'Gaze into the future'), + ('furni_soft_sofa_norja_name', 'iced sofa'), + ('furni_pura_mdl1*2_desc', 'Any way you like it!'), + ('nav_venue_sw_lobby_free_6/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('furni_divider_nor3*8_name', 'Yellow Iced gate'), + ('gs_title_finalscores', 'Final Standings:'), + ('gs_error_10', 'The hotel is closed or about to close. We look forward to welcoming you back tomorrow at (ADD LOCAL OPENING TIME).'), + ('furni_plant_bonsai_name', 'Bonsai Tree'), + ('furni_jukebox*1_name', 'Jukebox'), + ('room_loading', 'Loading room...'), + ('furni_hc_crpt_desc', 'Ultimate craftsmanship'), + ('furni_rare_hammock_desc', 'Eco bed'), + ('NUF_mini_use_console', 'Learn about messaging'), + ('furni_romantique_chair*1_desc', 'Elegant seating for elegant Habbos'), + ('transaction_system_bank_digiraha', 'Digiraha'), + ('NUH_messenger', 'Open your Console here - you might have messages or friend requests waiting.'), + ('furni_arabian_chair_desc', 'Exotic, soft seating'), + ('furni_noob_chair*6_name', 'My first Habbo chair'), + ('poster_510_desc', 'The flag of Italy'), + ('furni_carpet_standard*a_desc', 'Available in a variety of colours'), + ('queue_set.c.info', 'There are %c% Habbo Club member(s) in front of you. Be patient :)'), + ('furni_scifiport*4_name', 'Pink Sci-Fi Port'), + ('furni_sound_set_44_name', 'Graveyard Portal'), + ('furni_pura_mdl4*1_desc', 'Any way you like it!'), + ('furni_divider_silo3*6_desc', 'Blue Area Gate'), + ('furni_sound_machine*4_name', 'Blue Traxmachine'), + ('send_invitation_header', 'Get a warm welcome'), + ('game_TicTacToe', 'Boter kaas en eieren'), + ('nav_venue_sw_lobby_tournament_1_name', 'Tournament Lobby'), + ('furni_rare_fan*2_name', 'Green Powered Fan'), + ('furni_doormat_plain*2_name', 'Doormat'), + ('furni_table_plasto_square*7_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_intermediate_8/0_desc', ''), + ('furni_noob_table*6_desc', 'Lightweight, practical and green'), + ('win_callforhelp', 'Alert a Moderator'), + ('furni_prizetrophy8*1_desc', 'Glittery gold'), + ('furni_chair_norja*5_name', 'Pink Chair'), + ('furni_hc_tv_desc', 'Forget plasma, go HC!'), + ('furni_divider_arm1_name', 'Corner plinth'), + ('furni_table_plasto_round*7_name', 'Round Dining Table'), + ('furni_petfood3_name', 'Cabbage Mega Multipack'), + ('furni_carpet_standard*9_name', 'Floor Rug'), + ('opening_hours_title', 'Hotel Maintenance'), + ('console_noemail', 'Sorry,'), + ('furni_couch_norja*8_name', 'Yellow Bench'), + ('furni_s_sound_machine*1_desc', 'Sound Machine Grey Desc'), + ('furni_noob_stool*6_name', 'My first Habbo stool'), + ('purse_event', 'ACTIVITY'), + ('reg_readterms_alert', 'You have to read the Terms and Conditions\\r(scroll to the bottom of the text).'), + ('pet.hotwords.beg', 'beg'), + ('furni_jp_drawer_name', 'Japanese Drawer'), + ('gs_state_started', 'This Game has already started...'), + ('furni_sound_set_11_name', 'Dance 4'), + ('furni_divider_nor2*4_name', 'Urban Iced Bar'), + ('queue_set.e2.info', 'There are %e2% Habbos in front of you in the queue.'), + ('furni_bath_name', 'Bubble Bath'), + ('furni_rare_icecream*3_desc', 'Virtual blackcurrant rocks!'), + ('nav_modify_nameoftheroom', 'Name Of The Room'), + ('furni_scifiport*1_desc', 'Energy beams. No trespassers!'), + ('nav_venue_bb_lobby_amateur_12/0_desc', ''), + ('furni_table_silo_small*8_name', 'Yellow Occasional Table'), + ('furni_divider_silo3*3_name', 'White Area Gate'), + ('nav_venue_sw_lobby_amateur_7/0_desc', 'Astetta rankempaa lumisotaa.'), + ('reply', 'Reply'), + ('furni_toilet_yell_desc', 'Loo Seat'), + ('hobba_alert', 'Moderator Alert'), + ('You can play a bunch of exciting games, visit your friends\' rooms or even make your own place and decorate it to your heart\'s delight.', ''), + ('pet.saying.eat.croco.4', '*Buurrrrp*'), + ('furni_tree5_desc', 'Any presents under it yet?'), + ('pet.saying.eat.croco.2', '*Chomp chomp*'), + ('pet.saying.eat.croco.3', 'Mmmm mmmmm....'), + ('furni_divider_poly3*7_name', 'Green Mode Bardesk Gate'), + ('pet.saying.eat.croco.0', 'Mmmm yum yum'), + ('pet.saying.eat.croco.1', 'Ruff ruff ruff'), + ('furni_scifidoor*4_name', 'Emerald Spaceship Door'), + ('furni_edice_name', 'Holo-dice'), + ('furni_divider_nor4*6_name', 'Blue Iced Auto Shutter'), + ('furni_safe_silo*3_desc', 'Totally shatter-proof!'), + ('furni_table_silo_small_desc', 'For those random moments'), + ('gs_header_page', 'Page'), + ('furni_sporttrack3*2_name', 'Sport goal asphalt'), + ('furni_pura_mdl2*6_desc', 'Any way you like it!'), + ('furni_hcamme_name', 'Tubmaster'), + ('furni_carpet_soft*2_desc', 'Soft Wool Rug'), + ('furni_sound_set_12_name', 'Habbo Sounds 2'), + ('forgottenpw_done', 'If the email you gave during registration was correct, your password will be sent to you now.'), + ('navigator.no_category', 'No Category'), + ('login_whatsHabboCalled', 'What\'s your Habbo called?'), + ('furni_scifidoor*3_name', 'Lightblue Spaceship Door'), + ('game_poker', 'POKER'), + ('roomatic_pws', 'Password for selected'), + ('furni_glass_table*8_name', 'Glass table'), + ('furni_one_way_door*8_desc', 'One at a time!'), + ('furni_bardesk_polyfon*9_desc', 'Perfect for work or play'), + ('nav_venue_bb_lobby_tournament_13_name', 'Competitie Battle Ball 14'), + ('pet.hotwords.sit', 'sit'), + ('furni_arabian_tray3_desc', 'Indulge yourself!'), + ('furni_sound_set_40_desc', 'Dude? Cheese!'), + ('console_compose', 'Compose A Message'), + ('furni_table_plasto_square*3_name', 'Square Dining Table'), + ('furni_rclr_sofa_name', 'Polar Sofa'), + ('poster_2005_name', 'Infobus'), + ('furni_table_plasto_4leg*9_name', 'Occasional Table'), + ('furni_chair_norja*9_desc', 'Sleek and chic for each cheek'), + ('Room', 'Room:'), + ('furni_chair_plasty*2_name', 'Plastic Pod Chair'), + ('furni_romantique_pianochair*3_name', 'Turquoise Romantique Piano Chair'), + ('furni_rare_parasol*2_name', 'Orange Parasol'), + ('loading_project', 'Loading Habbo Hotel...'), + ('poster_505_name', 'The Maple Leaf'), + ('furni_traffic_light*2_desc', 'Chill and wait your turn!'), + ('nav_venue_sw_lobby_amateur_4_name', 'Snow Slingers Lobby'), + ('furni_grunge_shelf_name', 'Grunge Bookshelf'), + ('furni_sofa_polyfon*8_name', 'Yellow Mode Sofa'), + ('furni_doorC_desc', 'In a hurry?'), + ('roomatic_nomatch', 'Sorry. Your passwords don\'t match. Please enter them again.'), + ('furni_soft_sofa_norja*9_name', 'Red Iced Sofa'), + ('nav_venue_tv_studio_general/0_desc', 'Suosikki rules! Musaa, leffoja ja staroja!'), + ('nav_venue_sw_arena_amateur_name', 'Playing amateur game'), + ('interface_icon_events', 'Open the room event browser'), + ('furni_grunge_table_desc', 'Students of the round table!'), + ('furni_wooden_screen*9_name', 'Green Oriental Screen'), + ('NUF_getting_room_hotelview_nav', 'Click to open the Navigator.'), + ('furni_table_silo_med*5_name', 'Pink Area Coffee Table'), + ('furni_divider_silo1*9_name', 'Red Area Small Table'), + ('nav_venue_bb_lobby_amateur_4_name', 'Gevorderden Battle Ball 5'), + ('room_badge_hidden', 'Hidden'), + ('pet.saying.generic.cat.0', 'meow'), + ('furni_marquee*3_desc', 'It\'s both door and a shade!'), + ('pet.saying.generic.cat.1', 'meow...meOW'), + ('nav_venue_cunning_fox_gamehall/4_name', 'Chess'), + ('furni_present_gen_desc', 'What\'s inside?'), + ('pet.saying.generic.cat.2', 'muew..muew'), + ('pet.saying.generic.cat.3', 'Purrrrrrrrrr'), + ('furni_scifidoor*1_desc', 'There out of this world!'), + ('pet.saying.generic.cat.4', 'Purrrrr oow'), + ('furni_fridge_name', 'Pura Refridgerator'), + ('furni_rubberchair*2_name', 'Pink Inflatable Chair'), + ('furni_romantique_chair*4_name', 'Amber Chair'), + ('bb_fieldname_5', 'Barebones Classic'), + ('furni_sofa_silo*7_desc', 'Green Area Sofa'), + ('bb_fieldname_4', 'Gothic Hallway'), + ('furni_prizetrophy6*2_name', 'Champion trophy'), + ('bb_fieldname_3', 'Maze Park'), + ('bb_fieldname_2', 'Coral Beach'), + ('bb_fieldname_1', 'Sky Peak'), + ('furni_safe_silo_pb_name', 'postbank Safe'), + ('furni_solarium_norja*2_desc', 'Rejuvenate your pixels!'), + ('furni_table_plasto_bigsquare*7_desc', 'Hip plastic furniture'), + ('reg_check_age', 'Age'), + ('furni_exe_chair2_desc', 'You\'re fired!'), + ('furni_typingmachine_name', 'Typewriter'), + ('human_carrying', 'Carrying:'), + ('furni_grunge_sign_name', 'Road Sign'), + ('loading', 'Loading...'), + ('furni_bed_polyfon_one*6_name', 'Blue Mode Single Bed'), + ('furni_bed_budget_one*1_desc', 'Prince sized comfort!'), + ('furni_sofa_polyfon_name', 'Two-seater Sofa'), + ('furni_jp_lantern_desc', 'For a mellow Eastern glow'), + ('furni_gothic_stool*2_name', 'Golden Gothic Stool'), + ('roomevent_starttime', 'Started at:'), + ('furni_prize1_desc', 'Gorgeously glittery'), + ('furni_prizetrophy9*1_name', 'Champion trophy'), + ('wallitem_guitar_skull_desc', 'tilulilulaa'), + ('gs_title_bestplayer', 'Best player:'), + ('nav_removefavourites', 'Remove from favourites'), + ('furni_toy1_desc', 'it\'s bouncy-tastic'), + ('alert_shortenPW', 'Your password cannot be longer than 9 characters'), + ('normal_roomlayouts', '<< Back to normal room layouts'), + ('furni_noob_rug*1_name', 'My first Habbo rug'), + ('poster_58_name', 'Red knots poster'), + ('furni_divider_nor2*8_desc', 'Yellow Iced bar desk'), + ('furni_carpet_polar*1_name', 'Pink Faux-Fur Bear Rug'), + ('habboclub_continue_button', 'Buy one month'), + ('furni_divider_silo3_desc', 'Form following function'), + ('furni_sound_set_7_name', 'SFX 5'), + ('furni_soft_sofa_norja*5_desc', 'Pink Iced Sofa'), + ('furni_arabian_rug_desc', 'Green blossom design'), + ('restart_tutorial', 'Restart tutorial'), + ('gs_choose_numteams', 'Choose number of Teams:'), + ('hubu_info_t', 'The big FRANK Infobus'), + ('furni_divider_nor5*7_desc', 'Cool cornering for your crib!'), + ('furni_bed_polyfon*4_name', 'Beige Mode Double Bed'), + ('callhelp_allwillreceive', 'A member of community staff will investigate the situation and take appropriate action. This may include sending you a response with advice on dealing with your issue.'), + ('furni_pura_mdl4*4_name', 'White Pura Module 4'), + ('hubu_odotetaan', 'Waiting for replies from others...'), + ('furni_door_name', 'Telephone Box'), + ('furni_doormat_plain*5_desc', 'Available in a variety of colours'), + ('furni_gothic_carpet_desc', 'The path less travelled'), + ('poster_516_desc', 'Eng-er-land'), + ('furni_gothic_stool*6_desc', 'The dark side of Habbo'), + ('furni_traffic_light*3_desc', 'Chill and wait your turn!'), + ('furni_bartable_armas_desc', 'Bar-Style Table - essential for extra guests'), + ('club_isp_change', 'Change your subscription'), + ('furni_summer_grill*2_name', 'Red Barbeque Grill'), + ('poster_23_desc', 'flap, flap, screech, screech...'), + ('furni_prizetrophy7*3_desc', 'Bronze Habbo trophy'), + ('furni_couch_norja*2_name', 'Black Bench'), + ('nav_venue_cunning_fox_gamehall/0_desc', 'Pit your wits on the battlefield, the board or the baize - choose what to play here'), + ('furni_jp_tatami2_name', 'Large Tatami Mat'), + ('furni_pura_mdl3*3_desc', 'Any way you like it!'), + ('furni_house_name', 'Gingerbread House'), + ('furni_sound_set_54_name', 'Oh Blinging Tree'), + ('furni_table_plasto_4leg*1_name', 'Square Dining Table'), + ('furni_pillow*1_name', 'Pink Fluffy Pillow'), + ('NUF_console_hotelview_tutor', 'Oh! You have a message on your Habbo Console. Let\'s see who it is.'), + ('LoadingRoom', 'Loading room...'), + ('rotate', 'Rotate'), + ('nav_venue_sw_lobby_beginner_6_name', 'Snow Rookies Lobby'), + ('nav_venue_bb_lobby_amateur_1/0_desc', ''), + ('furni_jukebox_ptv*1_desc', 'Jukebox Pacha TV'), + ('nav_venue_star_lounge/0_desc', 'Chat with Sean Kingston here!'), + ('furni_chair_plasty*6_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_tournament_10/0_desc', ''), + ('NUF_mini_use_console_hotelview_tutor', 'Ah! You have a message on your Habbo Console. Let\'s see who it is.'), + ('furni_rare_xmas_screen_name', 'Lappland Greetings'), + ('summer_chair_9_name', 'Red Deck Chair'), + ('club_timefull', 'Sorry, you can only buy up to three months of Habbo Club subscription in advance.'), + ('poster_2002_desc', 'Presidentin muotokuva'), + ('poster_7_name', 'Hammer Cabinet'), + ('furni_gothic_chair*2_name', 'Golden Gothic Chair'), + ('bb_header_powerups', 'Powerups in game:'), + ('credit_redeem_url', 'http://%predefined%//help/19'), + ('furni_divider_silo3*2_name', 'Black Area Gate'), + ('furni_chair_plasto*16_name', 'Chair'), + ('catalog_itsurs', 'Yay! It\'s being delivered now..'), + ('hobba_pickandreply', 'Pick & Reply'), + ('reg_terms', 'Welcome to Habbo Hotel. If you are under 16, please check the Terms and Conditions with your parents/guardian before you agree to them. Get them to explain anything that you don\'t understand.\\rIn order to use the service you have to give valid information about yourself when registering. Please email us if any of your user information changes.\\rAs a user of Habbo Hotel - www.habbohotel.co.uk , you have to behave according to the Habbo Way (hotel rules) and the Terms and Conditions. Click the links below to read about them.\\rNever give your password or email address to anyone. If you do, your Habbo may get stolen.\\rRegistering with the hotel, making your own empty room and chatting is free of charge. For a small fee you can decorate your room with virtual furniture, play games and join the Habbo Club. If you wish to buy, you will need your parent\'s permission to do so.'), + ('furni_summer_pool*1_name', 'Blue Summer Pool'), + ('furni_heartsofa_desc', 'Perfect for snuggling up on'), + ('furni_scifiport*3_name', 'Jade Sci-Fi Port'), + ('furni_glass_chair*6_name', 'Blue Glass Chair'), + ('furni_sound_set_62_name', 'Alhambra Trax 1'), + ('win_voucher', 'Habbo Credit Code'), + ('furni_summer_chair*4_desc', 'White'), + ('furni_bed_polyfon_one_desc', 'Cot of the artistic'), + ('nav_venue_bb_lobby_tournament_5/0_desc', ''), + ('nav_venue_bb_lobby_beginner_3_name', 'Beginners Battle Ball 4'), + ('console_follow_not_friend', 'The user you tried to follow is not your friend anymore.'), + ('delete', 'Delete'), + ('furni_grunge_mattress_desc', 'Beats sleeping on the floor!'), + ('furni_rare_icecream*7_name', 'Chocolate Ice Cream Machine'), + ('sound_machine_alert_no_disks', 'You don\'t have any more discs!'), + ('furni_sofachair_silo_name', 'Armchair'), + ('nav_venue_sw_lobby_expert_0_name', 'Snow Marksmen Lobby'), + ('game_waitop', 'WAITING FOR THE OPPONENT'), + ('Alert_NameAlreadyUse', 'That name is already being used'), + ('furni_queue_tile1*1_desc', 'The power of movement'), + ('poster_18_name', 'Butterfly Cabinet 2'), + ('furni_wooden_screen*6_desc', 'Add an exotic touch to your room'), + ('furni_noob_table*2_name', 'My first Habbo table'), + ('furni_tree1_name', 'Dead tree'), + ('nav_venue_bouncer_room_0_name', 'Battle Ball Competitie Arena'), + ('furni_traffic_light*5_name', 'White Traffic Light'), + ('furni_sw_raven_name', 'Mrs Raven'), + ('cam_shoot.help', 'Shutter Release'), + ('furni_grand_piano*3_desc', 'Make sure you play in key!'), + ('nav_venue_sw_lobby_intermediate_2_name', 'Snow Bombardiers Lobby'), + ('interface_icon_purse', 'Purse, manage your coins'), + ('poll_alert_server_error', 'The poll isn\'t available anymore. Polls are only available at a certain public space for a certain duration.'), + ('sound_machine_confirm_delete_long', 'Are you sure you want to delete the selected song?'), + ('reg_check_confirm', 'Please check that your information is correct, especially your birthdate and Habbo name. You CANNOT change these later. If you want make any changes now, press the back button.'), + ('Alert_CheckBirthday', 'Please check your birthday'), + ('furni_shelves_norja*4_desc', 'For nic naks and tech books'), + ('club_expired_link', 'Click here to join Habbo Club'), + ('poster_520_desc', 'Every colour for everyone'), + ('nav_venue_bb_lobby_intermediate_desc', 'Intermediate battle ball!'), + ('tutorial_restart_button_bubble', 'Remember! Anytime you want to relive the fun click here to restart the tutorial!'), + ('poster_1_name', 'Comedy Poster'), + ('reg_verification_incorrectBirthday', 'Your birthday was incorrect'), + ('furni_glass_stool*6_name', 'Blue Glass Stool'), + ('furni_CFC_100_coin_gold_desc', 'Worth 100 Credits'), + ('buddyremove_list_full', 'Your friends list is full, you can\'t add new friends until you delete some. \\r\\The maximum number of friends you can have, is %mylimit% Habbos. Members of Habbo Club can have up to %clublimit% friends on their list.'), + ('furni_bunny_name', 'Squidgy Bunny'), + ('furni_small_chair_armas_name', 'Stool'), + ('nav_venue_sw_lobby_free_0/0_desc', ''), + ('furni_sofachair_silo*3_name', 'White Armchair'), + ('furni_sound_machine*2_desc', 'Dance to the Habbo Club beat!'), + ('nav_venue_gate_park/0_desc', 'Follow your path...'), + ('NUF_mini_use_console_hotelview_icon', 'Click the icon to open your Habbo Console.'), + ('nav_venue_eric\'s_eaterie/0_desc', 'Join Eric for a bite to eat'), + ('furni_table_silo_med*8_desc', 'Wipe clean and unobtrusive'), + ('poster_503_desc', 'There\'s no holes in this...'), + ('furni_bardeskcorner_polyfon*9_name', 'Red Corner Desk'), + ('furni_val_randomizer_desc', 'Surprise surprise! (Cilla Black not included)'), + ('furni_marquee*2_name', 'Red Dragon Marquee'), + ('furni_table_plasto_round_name', 'Round Dining Table'), + ('furni_summer_chair*3_name', 'Deck Chair'), + ('club_paycoins', 'Buy subscription'), + ('nav_venue_beauty_salon_general/0_desc', 'Join in the fun of Fashion Week! Check the homepage now for details.'), + ('furni_rare_dragonlamp*7_name', 'Sky Dragon Lamp'), + ('nav_venue_bb_lobby_beginner_6/0_desc', ''), + ('roomevent_quit', 'End event'), + ('console_search_habbo_lasthere', 'Last time'), + ('trading_title', 'Safe Trading'), + ('furni_glass_chair*7_desc', 'Habbo Club'), + ('gs_error_game_deleted', 'The Game has been deleted.'), + ('recycler_info_link_url', 'http://%predefined%/help/36'), + ('furni_pillar*6_name', 'Terracotta Pillar'), + ('furni_tile_stella_desc', '10% off the walk of fame!'), + ('transaction_system_sms_win_tmobile', 'T-Mobile SMS'), + ('buddyremove_names_ordered', 'Names Ordered By:'), + ('pet_race_2_010', 'Giggly Go-go'), + ('furni_table_plasto_bigsquare*6_name', 'Square Dining Table'), + ('pet_race_2_011', 'Petty Petsuchos'), + ('summer_chair_6_name', 'Blue Deck Chair'), + ('console_now', 'now:'), + ('gs_skill_changed', 'You have advanced to the next skill level. Your level is now %1!'), + ('roomatic_goyourroom', 'Go to your room'), + ('furni_carpet_soft*4_name', 'Soft Wool Rug'), + ('sound_machine_confirm_close_list', 'Close playlist editor?'), + ('pet.hotwords.good', 'good'), + ('furni_pura_mdl4*7_desc', 'Any way you like it!'), + ('furni_carpet_soft*1_name', 'Soft Wool Rug'), + ('furni_sound_set_22_desc', 'With a hamper full of sounds, not sarnies'), + ('nav_venue_sw_lobby_tournament_7_name', 'Tournament Lobby'), + ('furni_divider_nor3*6_desc', 'Blue Iced gate'), + ('furni_carpet_standard*3_name', 'Floor Rug'), + ('people', 'People'), + ('pet_race_2_007', 'Pretty Pui Pui'), + ('pet_race_2_008', 'Indifferent'), + ('pet_race_2_009', 'Swampy Siamese'), + ('furni_wcandle_name', 'White Candle'), + ('furni_sporttrack1*1_desc', 'null'), + ('furni_solarium_norja*1_name', 'Black Solarium'), + ('NUF_playing_games_gamecategories_tutor', 'Click the Beginner category to open it wide open. Like a melon!'), + ('pet_race_2_003', 'Silly Sobek'), + ('pet_race_2_004', 'Dirty Dundee'), + ('pet_race_2_005', 'Galled Gator'), + ('int_credits', 'Credits'), + ('furni_gothrailing_name', 'Gothic Railing'), + ('furni_sporttrack2*2_desc', 'null'), + ('pet_race_2_006', 'Confused Croc'), + ('furni_shelves_polyfon_name', 'Bookcase'), + ('pet_race_2_000', 'Endangered Albino'), + ('pet_race_2_001', 'Krazy Krokodilos'), + ('pet_race_2_002', 'Nile Dile'), + ('furni_divider_nor2*2_desc', 'Black Iced bar desk'), + ('log_problem_text', 'Oops.. Cannot connect to Habbo Hotel'), + ('furni_divider_nor2*5_desc', 'Pink Iced bar desk'), + ('nav_venue_sw_lobby_amateur_6/0_desc', 'Astetta rankempaa lumisotaa.'), + ('furni_rare_fountain_desc', 'For our feathered friends'), + ('furni_glass_sofa*5_name', 'Glass sofa'), + ('poster_33_desc', 'We can\'t bear to lose them'), + ('nav_venue_bb_lobby_tournament_14/0_desc', ''), + ('furni_summer_chair*6_name', 'Deck Chair'), + ('furni_hcsohva_desc', 'For royal bottoms...'), + ('furni_bed_budget*4_desc', 'King sized comfort!'), + ('furni_christmas_poop_desc', 'Bob?s magical fertilizer'), + ('furni_pura_mdl5*7_name', 'Green Pura Module 5'), + ('furni_barrier*1_desc', 'No escape this way!'), + ('nav_venue_bb_lobby_amateur_8/0_desc', ''), + ('furni_divider_arm2_desc', 'I wooden go there'), + ('furni_chair_plasty*11_desc', 'Hip plastic furniture'), + ('furni_small_table_armas_desc', 'Practical and beautiful'), + ('nav_venue_theatredrome_xmas_name', 'Theatredrome Xmas'), + ('poster_62_name', 'Save The Panda'), + ('reg_verification_currentPassword', 'Current password:'), + ('game_poker_change', 'Choose cards to change'), + ('NUF_getting_items_hotelview_nav', 'Click here to open the Navigator'), + ('furni_chair_basic*9_name', 'Red Pura Egg Chair'), + ('friend_request_failed', 'Failed!'), + ('furni_noob_chair*4_desc', 'Lightweight, practical, with light blue stripes'), + ('furni_table_silo_small*9_desc', 'Red Area Occasional Table'), + ('nav_hotelview', 'Hotel view'), + ('furni_toy1*3_desc', 'it\'s bouncy-tastic'), + ('furni_divider_nor3*2_name', 'Black Iced gate'), + ('furni_chair_silo*6_name', 'Blue Silo Dining Chair'), + ('update_password_suggest', 'Habbo Hotel security supervisor requests you to update your password'), + ('nav_venue_orient_name', 'Club Orient'), + ('Alert_NameTooLong', 'Sorry, that username is too long!'), + ('furni_sound_set_37_name', 'Sound set 37'), + ('furni_barchair_silo*7_desc', 'Practical and convenient'), + ('wallitem_wallmirror_name', 'Wallmirror'), + ('furni_chair_plasty*8_name', 'Plastic Pod Chair'), + ('sound_machine_confirm_close_list_long', 'Are you sure you want to exit playlist editor without saving?'), + ('furni_hc_frplc_name', 'Heavy Duty Fireplace'), + ('dance4', 'The Rollie'), + ('dance3', 'Duck Funk'), + ('furni_glass_stool*9_name', 'Glass stool'), + ('furni_sound_set_55_desc', 'Can you fill me in?'), + ('furni_carpet_standard*7_desc', 'Available in a variety of colours'), + ('poster_4_name', 'Bear Plaque'), + ('cam_zoom_out.help', 'Zoom Out'), + ('furni_sofa_polyfon*2_name', 'Black Mode Sofa'), + ('furni_prizetrophy2*1_name', 'Duck trophy'), + ('furni_scifirocket*3_desc', 'Caution! Unknown Location!'), + ('NUF_getting_items', 'Getting items'), + ('furni_val_teddy*1_desc', 'The grey bear of affection'), + ('furni_sofachair_polyfon*7_name', 'Green Mode Armchair'), + ('club_habbo.bottombar.link.member', '%days% days'), + ('habboclub_confirm_header', 'Subscription costs %price% credits'), + ('furni_rare_daffodil_rug_desc', 'A little bit of outdoors indoors..'), + ('poster_15_name', 'Himalayas Poster'), + ('furni_smooth_table_polyfon_desc', 'For larger gatherings'), + ('dance2', 'Pogo Mogo'), + ('furni_wooden_screen*3_name', 'Aqua Oriental Screen'), + ('furni_plant_cruddy_desc', 'Goodbye Bert...'), + ('dance1', 'Hab-Hop'), + ('furni_gothic_chair*6_desc', 'The dark side of Habbo'), + ('furni_table_plasto_square*9_name', 'Square Dining Table'), + ('nav_venue_bb_lobby_beginner_14/0_desc', ''), + ('furni_club_sofa_desc', 'Club sofa'), + ('roomevent_default_name', 'Event name..'), + ('game_poker_ok', 'Change cards'), + ('nav_venue_picnic_dudesons/0_desc', 'Duudsoneiden sponssaama oma Ranchi - www.extremeduudsonit.com'), + ('nav_venue_hallway/0_desc', 'Beware the ghosts and ghouls!'), + ('nav_venue_park/0_desc', 'Go for a stroll outdoors'), + ('console_fr_declined_count', 'Amount to be declined'), + ('furni_tree4_name', 'Christmas Tree 2'), + ('NUF_console_read_link', 'Click the link to open the message.'), + ('win_figurecreator', 'Habbo Details'), + ('furni_table_plasto_square*14_name', 'Occasional Table'), + ('furni_soft_sofachair_norja*6_desc', 'Blue Iced Sofachair'), + ('nav_venue_bb_lobby_beginner_0_name', 'Beginner'), + ('Alert_LogoNameAlreadyUse', 'That name is already being used'), + ('poster_25_name', 'Snowman Poster'), + ('furni_pura_mdl2*2_name', 'Pink Pura Module 2'), + ('furni_chair_plasto*13_name', 'Chair'), + ('furni_ticket_name', 'Small Ticket Bundle'), + ('furni_hc_lmpst_name', 'Victorian Street Light'), + ('furni_scifiport*7_desc', 'Energy beams. No trespassers!'), + ('jukebox_load_trax', 'Load Trax'), + ('furni_val_teddy*4_desc', 'The brown bear of naughtiness'), + ('reg_birthdayformat_update', 'Birthday (dd.mm.yyyy)'), + ('nav_venue_the_chromide_club_name', 'The Chromide Club'), + ('roomevent_not_available', 'Sorry, no events available'), + ('nav_venue_sw_lobby_beginner_0/0_desc', ''), + ('summer_chair_3_name', 'Black Deck Chair'), + ('int_newrequests', 'Friend Request(s)'), + ('console_profile_helptext', 'The Habbo Profile is a snapshot of your interests and hobbies - simply tick the things you like.'), + ('nav_roomnfo_hd_fav', 'Favourite Rooms'), + ('furni_chair_plasto*3_desc', 'Hip plastic furniture'), + ('furni_chair_basic*6_name', 'Blue Pura Egg Chair'), + ('number_4', '4'), + ('number_3', '3'), + ('number_2', '2'), + ('room_open_package', 'Open The Present'), + ('furni_grunge_barrel_name', 'Flaming Barrel'), + ('wallitem_photo_desc', 'Photo from Habbo'), + ('poster_30_desc', 'Pucker up'), + ('furni_glass_table*9_desc', 'Translucent beauty'), + ('nav_venue_sw_lobby_beginner_3_name', 'Snow Rookies Lobby'), + ('Alert_YouAreBanned', 'You have been banned for breaking the Habbo Way. This is why (if no ban reason is shown use the Contact Us form):'), + ('furni_gothic_sofa*2_name', 'Golden Gothic Sofa'), + ('NUF_getting_items_hotelview_tutor', 'Let us find out how to purchase items from the Hotel Catalogue. The Catalogue contains loads of cool stuff to decorate your Habbo room with. To begin open the Navigator.'), + ('furni_table_norja_med*2_desc', 'For larger gatherings'), + ('furni_sofa_silo*3_name', 'White Two-Seater Sofa'), + ('furni_pura_mdl5*5_desc', ''), + ('nav_venue_sw_lobby_beginner_desc', 'Yes, take a load of snowballs and hit the enemy Teams. Easy, isn\'t it?'), + ('furni_romantique_smalltabl*5_name', 'Onyx Tray Table'), + ('furni_divider_nor4_desc', 'Habbos, roll out!'), + ('furni_shelves_norja*7_desc', 'For nic naks and cookery books'), + ('nav_venue_sw_lobby_intermediate_4/0_desc', 'Lumisota sen kuin vain kovenee.'), + ('gs_text_spectate', 'You can watch this game'), + ('recycler_info_link', 'More information about Furni Recycler'), + ('furni_sofachair_polyfon_name', 'Armchair'), + ('club_intro_text', 'Members of Habbo Club get LOTS of cool stuff!\\rWith Habbo Club you get cool dances, access to Club Mammoth and The Blue Dragon Tavern, and a 500 limit on your friends list!'), + ('furni_divider_nor1*7_desc', 'The missing piece'), + ('url_helppledge', 'http://%predefined%//help/22'), + ('jukebox_song_name', '%name%'), + ('game_bs_won', 'WON!'), + ('furni_soft_jaggara_norja_name', 'Iced Sofachair'), + ('furni_rare_beehive_bulb_desc', 'A honey-hued glow'), + ('furni_chair_norja*8_name', 'Yellow Chair'), + ('poster_83_desc', 'Pöllö huhuilee, huhuu!'), + ('floodblocking', 'You are typing too fast - don\'t flood the room.'), + ('furni_CF_5_coin_silver_desc', 'Worth 5 Credits'), + ('sound_machine_confirm_clear', 'Clear the song?'), + ('furni_carpet_standard*6_name', 'Floor Rug'), + ('furni_waterbowl*2_desc', 'Aqua unlimited'), + ('sw_link_tournament_highScores_url', 'http://%predefined%//groups/56553/id'), + ('NUF_meeting_people_room_tutor', 'This is a Public Room. Your Habbo is in the doorway beneath the orange arrow. Click on another user to find out more about them.'), + ('furni_bottle_name', 'Empty Spinning Bottle'), + ('poster_512_name', 'The Irish flag'), + ('club_info_url', 'http://%predefined%//credits/habboclub'), + ('nav_venue_tv_studio_nike/0_desc', ''), + ('furni_couch_norja*6_desc', 'Two can perch comfortably'), + ('furni_pura_mdl5*8_desc', 'Any way you like it!'), + ('furni_carpet_valentine_desc', 'For making an appearance'), + ('furni_floortile_desc', 'In Variety of Colours'), + ('furni_pillar*9_name', 'Rock Pillar'), + ('furni_table_plasto_bigsquare*3_name', 'Square Dining Table'), + ('furni_bardeskcorner_polyfon*12_name', 'Corner Cabinet/Desk'), + ('furni_divider_nor1*4_desc', 'The missing piece'), + ('furni_chair_plasty*5_name', 'Plastic Pod Chair'), + ('furni_scifirocket*0_desc', 'See in 2007 with a bang!'), + ('poster_32_name', 'Siva Poster'), + ('club_button_2_period', 'Buy 3 >>>'), + ('furni_sound_set_58_desc', 'Sh-shake it!'), + ('furni_china_shelve_desc', 'To hold the mind\'s treasures'), + ('furni_scifidoor*7_desc', 'There out of this world!'), + ('furni_chair_silo*9_name', 'Red Silo Dining Chair'), + ('furni_gothic_stool*5_name', 'Green Gothic Stool'), + ('friend_request_massoperation_cancel', 'Back to request list.'), + ('furni_queue_tile1*0_name', 'White Quest Roller'), + ('furni_divider_nor3*5_name', 'Pink Iced gate'), + ('furni_sound_machine*5_desc', 'Heard the Habbo Bands new singles?'), + ('furni_glass_table*6_desc', 'Translucent beauty'), + ('furni_soft_sofachair_norja*9_desc', 'Red Iced Sofachair'), + ('furni_plant_mazegate_desc', 'Did we make it?'), + ('tickets_info_1', 'With 2 tickets you can play the following Games:\\r10 BattleBall:Rebound!\\r10 SnowStorm\\r20 Wobble Squabble or\\r20 Lido Diving'), + ('furni_barchair_silo*4_desc', 'Practical and convenient'), + ('furni_CF_10_coin_gold_name', 'Gold Coin'), + ('tickets_info_2', 'With 20 tickets you can play the following Games:\\r10 BattleBall:Rebound!\\r10 SnowStorm\\r20 Wobble Squabble or\\r20 Lido Diving'), + ('furni_sound_set_15_desc', 'Unadulterated essentials'), + ('handitem1', 'Tea'), + ('furni_romantique_divan*3_desc', 'null'), + ('furni_glass_sofa*8_name', 'Glass sofa'), + ('epsnotify_1001', 'The hotel is full at the moment. Please try again in a few minutes.'), + ('furni_table_silo_med*2_name', 'Black Coffee Table'), + ('furni_sleepingbag*7_name', 'Orange Sleeping Bag'), + ('furni_pillow*5_desc', 'Puffy, soft and huge'), + ('furni_bed_budget*1_desc', 'King sized comfort!'), + ('furni_bed_trad_one_name', 'Plain Single Bed'), + ('catalog_giftfor', 'This is a gift for:'), + ('furni_theatre_seat_name', 'Deluxe Theatre Chair'), + ('furni_romantique_divider*3_name', 'Turquoise Screen'), + ('furni_shelves_silo_desc', 'For nic naks and art deco books'), + ('handitem9', 'Decaff'), + ('handitem8', 'Regular'), + ('handitem7', 'Water'), + ('furni_glass_table_name', 'Glass table'), + ('console_selection_invert', 'Invert selection'), + ('handitem6', 'Blackcurrant'), + ('furni_hc_machine_desc', 'By and for mad inventors'), + ('handitem5', 'Milk'), + ('handitem4', 'Ice-cream'), + ('poster_40_desc', 'The one and only. Adore her!'), + ('nav_venue_sw_lobby_tournament_9/0_desc', ''), + ('handitem3', 'Carrot'), + ('handitem2', 'Juice'), + ('furni_cn_sofa_name', 'Chinese Sofa'), + ('nav_venue_bb_lobby_expert_4/0_desc', ''), + ('poster_502_name', 'The Stars and Stripes'), + ('furni_md_rug_name', 'Bubble Juice Floor'), + ('furni_table_plasto_bigsquare_name', 'Square Dining Table'), + ('furni_bed_polyfon*8_desc', 'Yellow Mode Double Bed'), + ('nav_venue_sw_lobby_amateur_7_name', 'Snow Slingers Lobby'), + ('furni_birdie_desc', 'Cheep (!) and cheerful'), + ('poster_12_name', 'Lapland Poster'), + ('club_desc_1_period', '1 Month (31 days) = 25 Credits'), + ('hobba_emergency_help', 'Call For Emergency Help:'), + ('reg_age_check_note', 'Enter your birthday. You will need your birthday information when changing your password or email.'), + ('furni_table_plasto_square*6_name', 'Square Dining Table'), + ('trade', 'Trade'), + ('furni_romantique_smalltabl*3_desc', 'Every tray needs a table...'), + ('reg_back', 'Back'), + ('furni_tree7_name', 'Snowy Christmas Tree'), + ('recycler_trader_open_alert', 'Recycling cannot begin while you are trading. Please close the safe trading box before recycling.'), + ('furni_rare_dragonlamp*8_desc', 'Scary and scorching!'), + ('furni_gothic_chair*3_desc', 'The head of the table'), + ('Alert_YourNameIstooShort', 'Habbo names must be at least 3 characters long.'), + ('furni_bed_budgetb_desc', 'Sweet dreams for two'), + ('furni_shelves_basic_name', 'Pura Shelves'), + ('console_messagemode_helptext', 'You can send an instant message to your Habbo Friends.'), + ('nav_venue_cunning_fox_gamehall/5_desc', 'Get a hand like a foot? Keep a straight face and bluff it out'), + ('furni_table_polyfon_small_name', 'Small Coffee Table'), + ('move_furniture', 'Move Furni'), + ('nav_searchbutton', 'Search'), + ('furni_habboween_grass_desc', 'Autumnal chills with each rotation!'), + ('furni_pura_mdl5*2_desc', 'Any way you like it!'), + ('NUF_meeting_people_user_tutor', 'The user you clicked on is shown in the corner of your screen. The buttons beneath the Habbo let you visit their Habbo Home, send them a Friend Request or ignore them if they look or act like a moron.'), + ('poster_55_name', 'Tree of Time'), + ('furni_soft_sofachair_norja*5_name', 'Pink Iced Sofachair'), + ('furni_sound_set_48_name', 'Club 3'), + ('furni_table_plasto_4leg_desc', 'Hip plastic furniture'), + ('furni_pura_mdl4*1_name', 'Aqua Pura Module 4'), + ('login_forgottenPassword_url', 'https://www.habbo.co.uk/account/password/forgot'), + ('nav_venue_floatinggarden/0_desc', 'Peace, tranquility and still waters'), + ('furni_sound_set_36_desc', 'For adult minded'), + ('poster_43_desc', 'Shake, rattle and roll'), + ('furni_gothic_stool*3_desc', 'The dark side of Habbo'), + ('room_alert_furni_limit', 'This room has the maximum amount of Furni.'), + ('furni_table_plasto_square*15_name', 'Occasional Table'), + ('furni_rare_hammock_name', 'Hammock'), + ('sound_machine_confirm_burn_long', 'Are you sure you want to burn this song to disc? Burning costs one credit.'), + ('furni_rclr_chair_desc', 'Watch out for coconuts'), + ('furni_chair_basic*3_desc', 'It\'s a cracking design!'), + ('furni_doormat_plain*6_name', 'Doormat'), + ('furni_sofachair_polyfon*9_name', 'Red Armchair'), + ('furni_jp_tray6_name', 'jp_tray6'), + ('furni_habbocake_name', 'Cake'), + ('poster_501_name', 'Jolly Roger'), + ('nav_goingprivate', 'Going to Guest room'), + ('furni_bed_budget_one*9_name', 'Red Pura Bed'), + ('alert_no_category', 'Your room has no category. Select one from the list.'), + ('nav_venue_theatredrome_easter/0_desc', ''), + ('gs_button_buytickets', 'Buy Tickets'), + ('nav_venue_bouncer_room_4_name', 'Experts Battle Ball Arena'), + ('close', 'Close'), + ('furni_carpet_standard*9_desc', 'Available in a variety of colours'), + ('furni_prizetrophy4*1_desc', 'Glittery gold'), + ('help_pointer_1', 'http://www.habbo.co.uk/help/'), + ('help_pointer_3', 'emergency_help'), + ('furni_rclr_lamp_name', 'Moon Lamp'), + ('help_pointer_2', 'http://www.habbohotel.co.uk/iot/go?lang=en&country=uk'), + ('furni_exe_sofa_desc', 'Relaxing leather comfort'), + ('furni_divider_silo1*4_name', 'Beige Area Corner Shelf'), + ('poster_2001_name', 'SeinNightitititititdiskotappaja'), + ('interface_icon_tv_close', 'Leave the Room and close the Habbovision mode.'), + ('furni_sound_machine*7_name', 'Red Traxmachine'), + ('game_bs_hit', 'A Hit!:'), + ('furni_rare_fan*2_desc', 'It\'ll blow you away!'), + ('win_place', 'Note!'), + ('nav_venue_bb_lobby_beginner_11_name', 'Beginners Battle Ball 12'), + ('furni_pillow*7_desc', 'Bonnie\'s pillow of choice!'), + ('furni_table_silo_small*8_desc', 'For those random moments'), + ('furni_divider_nor4*5_desc', 'Habbos, roll out!'), + ('hubu_vastaa', 'Answer the question'), + ('furni_pura_mdl4*8_name', 'yellow pura module 4'), + ('furni_glass_chair*9_name', 'Glass chair'), + ('furni_chair_silo*7_desc', 'Green Silo Dining Chair'), + ('furni_jp_drawer_desc', 'Spiritual home for odds and ends'), + ('tutorial_select_another_topic', 'Select another topic'), + ('furni_noob_lamp*4_desc', 'Get the light right where you want it (light blue)'), + ('nav_venue_beauty_salon_general_name', 'Beauty salon'), + ('furni_sofachair_polyfon*2_name', 'Black Mode Armchair'), + ('console_report_header', 'Report Abusive Message'), + ('club_buy_url', 'http://%predefined%//credits/habboclub'), + ('furni_prizetrophy*2_name', 'Classic trophy'), + ('furni_rare_icecream*4_name', 'Strawberry Ice Cream Machine'), + ('furni_barchair_silo*5_desc', 'Practical and convenient'), + ('furni_divider_nor2*4_desc', 'No way through'), + ('furni_xmas_cstl_gate_name', 'Ice Castle Gate'), + ('furni_noob_stool*5_desc', 'Unfold me and take the weight off (pink)'), + ('furni_bed_budgetb_one_name', 'Plain Single Bed'), + ('friend_request_accept_all', 'Accept all requests.'), + ('furni_val_choco_name', 'Heart Shaped Box'), + ('poster_514_desc', 'Be proud to be in the Union!'), + ('furni_carpet_legocourt_desc', 'Line up your slam dunk'), + ('furni_sofa_silo_name', 'Two-Seater Sofa'), + ('furni_chair_plasto*8_desc', 'Hip plastic furniture'), + ('furni_tree5_name', 'Christmas Tree 3'), + ('nav_venue_habbo_cinema/0_desc', 'Now showing: Kick Warz II - The revenge of Donnie Santini!'), + ('furni_couch_norja*4_name', 'Urban Iced Bench'), + ('poster_52_desc', 'whack that ball!'), + ('furni_sound_set_45_desc', 'The Bass? is the rhythm!'), + ('nav_venue_sun_terrace/0_name', 'Sun Terrace'), + ('queue_tile_limit', 'You can\'t fit more Habbo Rollers in this room!'), + ('BuddyRequesta', 'Friend Request(s)'), + ('transaction_system_sms_rl', 'Elisa'), + ('furni_prizetrophy4_desc', 'Palkinto'), + ('furni_hcamme_desc', 'Time for a soak'), + ('furni_scifirocket*2_name', 'Earth Smoke Machine'), + ('furni_divider_nor5*2_desc', 'Cool cornering for your crib y0!'), + ('forgottenpw', 'Forgotten your password?'), + ('furni_rclr_sofa_desc', 'Snuggle up together'), + ('furni_val_cauldron_desc', 'Cast a loving spell!'), + ('poster_3_name', 'Fish Plaque'), + ('furni_one_way_door*8_name', 'Yellow One Way Gate'), + ('furni_divider_nor3*8_desc', 'Yellow Iced gate'), + ('sw_link_highScores_url', 'http://%predefined%//groups/56553/id'), + ('furni_carpet_standard*2_desc', 'Available in a variety of colours'), + ('nav_venue_sport/0_name', 'The Power Gym'), + ('furni_scifidoor*3_desc', 'There out of this world!'), + ('furni_pillar*7_desc', 'Recovered from Habblantis'), + ('furni_arabian_tray3_name', 'Sweets Tray'), + ('furni_chair_plasto_name', 'Chair'), + ('nav_venue_pizza_name', 'Slice of Life'), + ('url_privacypledge', 'http://%predefined%//help/69'), + ('furni_one_way_door*3_desc', 'One way! The HC way!'), + ('catalog_purchase_not_allowed_hc', 'In order to buy this item you must be a Habbo Club member!'), + ('furni_pura_mdl3*4_name', 'White Pura Module 3'), + ('room_confirmDelete', 'Confirm'), + ('BuddyPrivateRoom', 'In A Guest Room'), + ('furni_marquee*7_desc', 'It\'s both door and a shade!'), + ('furni_bath_desc', 'The ultimate in pampering'), + ('furni_soft_sofa_norja*3_desc', 'Pristine white, keep it clean!'), + ('game_BattleShip', 'Battleships'), + ('furni_sound_set_11_desc', 'Music you can really sink your teeth into'), + ('furni_glass_chair*2_name', 'Glass chair'), + ('furni_sofa_silo*5_desc', 'Pink Area Sofa'), + ('furni_pura_mdl2*7_name', 'Green Pura Module 2'), + ('cam_film.help', 'Number Of Photos Left'), + ('nav_venue_bb_lobby_tournament_17/0_desc', ''), + ('roomatic_hway', 'Hotel guests are expected to follow the Habbo Way even if word filtering is switched off.'), + ('modify', 'Modify'), + ('furni_sofachair_silo*8_name', 'Yellow Armchair'), + ('alert_reg_blocked', 'A person under 11 years of age has tried to register from this machine recently.\\rRegistration is not possible for a while.'), + ('furni_sofa_polyfon*8_desc', 'Yellow Mode Sofa'), + ('furni_wooden_screen*9_desc', 'Add an exotic touch to your room'), + ('hobba_message_from', 'Your call has been responded to as follows:'), + ('win_help', 'Habbo Help'), + ('pet.saying.sniff.dog.1', 'snuh...SNUUUUUH'), + ('pet.saying.sniff.dog.0', 'snuuh..snuuh'), + ('sw_user_skill', 'Snow Storm Skill Level: \\x \\r (\\y points)'), + ('furni_rom_lamp_desc', 'Light up your life'), + ('console_profile_create', 'Create your Habbo Profile.'), + ('furni_CF_50_goldbar_desc', 'Worth 50 Credits'), + ('furni_romantique_chair*4_desc', 'What does this button do?'), + ('reg_use_allowed_chars', 'Use only these characters:'), + ('furni_bar_chair_armas_name', 'Barrel Stool'), + ('pet.saying.sniff.dog.2', '*sighs*'), + ('furni_sound_set_64_name', 'Alhambra Trax 3'), + ('furni_pillar*3_name', 'blue pillar'), + ('furni_glass_chair*4_desc', 'Translucent beauty'), + ('furni_pizza_desc', 'You dirty Habbo'), + ('opening_hours_text_shutdown', 'The Hotel will shut down in %d% minutes. To avoid confusion, purchasing of furniture, Habbo Club and game tickets will be disabled during that time, as well as playing Games and furniture trading. Thank you for visiting and welcome back tomorrow!'), + ('nav_venue_bb_lobby_tournament_10_name', 'Competitie Battle Ball 11'), + ('poster_521_desc', 'Ordem e progresso'), + ('furni_sound_set_52_desc', 'Under the mistletoe!'), + ('furni_shelves_norja*3_name', 'White Iced Bookcase'), + ('furni_scifiport*5_desc', 'Recovered from Roswell'), + ('help_emergency_writeyour', 'Give details of your emergency here:'), + ('furni_table_norja_med*6_name', 'Large Coffee Table Blue'), + ('nav_venue_bb_lobby_expert_3_name', 'Experts Battle Ball 4'), + ('photo_legend', 'Caption'), + ('furni_sofachair_silo_desc', 'Large, but worth it'), + ('console_youdonthavebuddies', 'You have no Friends on your list.\\rYou can send Friend Requests using\\rthe \'search\' button.'), + ('furni_table_plasto_4leg*6_name', 'Occasional table Table'), + ('furni_scifidoor*1_name', 'Pink Spaceship Door'), + ('furni_tile_brown_desc', '10% off downtown promenades & piazzas!'), + ('NUF_getting_room_go_button', 'Click here to go to your just created room!'), + ('dimmer_turn_on', 'Turn ON'), + ('furni_sofa_polyfon_desc', 'Comfort for stylish couples'), + ('furni_sound_set_50_name', 'Club 5'), + ('furni_doorB_name', 'Wardrobe'), + ('reg_agree1', 'Yes, my parents and I agree to the above terms. I am allowed to use Habbo Hotel.'), + ('furni_chair_silo*3_name', 'White Dining Chair'), + ('furni_CF_1_coin_bronze_desc', 'Worth 1 Credits'), + ('reg_agree2', 'Yes, I have read the Habbo Hotel Terms of Service and I accept them'), + ('you_have_pending_cfh', 'Your previous call for help has not been answered yet. To make a new one you must delete the old message.'), + ('furni_table_plasto_bigsquare*7_name', 'Square Dining Table'), + ('console_accept', 'Accept'), + ('furni_lamp_basic_name', 'Pura Lamp'), + ('console_friend_request_error', 'There was an error with friend requests'), + ('poster_11_desc', 'I obey the Habbo way!'), + ('furni_bardeskcorner_polyfon*6_name', 'Blue Mode Bardesk Corner'), + ('furni_plant_sunflower_name', 'Cut Sunflower'), + ('furni_traffic_light*3_name', 'Purple Traffic Light'), + ('furni_bed_polyfon_one*8_name', 'Yellow Mode Single Bed'), + ('furni_carpet_polar*1_desc', 'Cute'), + ('furni_noob_rug*1_desc', 'Nice and neat sisal rug with orange edging'), + ('furni_exe_bardesk_desc', 'Divide the profits!'), + ('furni_romantique_divider*4_desc', 'Keeping things separated'), + ('pet_status_dialog', '%name%'), + ('furni_jp_lantern_name', 'Japanese Lantern'), + ('furni_chair_norja*2_name', 'Black Chair'), + ('furni_jp_irori_desc', 'Traditional heating and eating'), + ('furni_bed_budget*5_name', 'Beige Pura Double Bed'), + ('furni_scifidoor*8_name', 'Purple Spaceship Door'), + ('nav_venue_sw_lobby_free_5_name', 'Free Game Lobby'), + ('wallitem_jp_sheet2_desc', 'jp_sheet2'), + ('furni_glass_sofa*9_desc', 'Translucent beauty'), + ('furni_divider_nor5*7_name', 'Rural Iced Angle'), + ('sound_machine_open_editor', 'Trax Editor'), + ('furni_jp_tatami2_desc', 'Shoes off please'), + ('furni_sound_set_16_name', 'Hip Hop Beats 3'), + ('console_recipients', 'Recipient(s)'), + ('catalog_page', 'page'), + ('poster_23_name', 'Bat Poster'), + ('furni_table_plasto_round*4_name', 'Square Dining Table'), + ('furni_rubberchair*2_desc', 'Soft and tearproof!'), + ('nav_venue_bb_lobby_beginner_16/0_desc', ''), + ('poster_1005_name', 'Johnny Squabble'), + ('furni_silo_studydesk_name', 'Area Quest Desk'), + ('furni_table_plasto_4leg*1_desc', 'Hip plastic furniture'), + ('nav_venue_basement_lobby/0_desc', 'For low level hanging'), + ('furni_rare_parasol*3_desc', 'Block those rays!'), + ('furni_arabian_wndw_name', 'Arabian Window Frame'), + ('Alert_ConnectionFailure', 'Disconnected'), + ('furni_house_desc', 'Good enough to eat'), + ('console_confirm_selected', 'Confirm the selections. Below are the amount of friend requests that will be accepted and declined. If you want, you can still modify the selections.'), + ('furni_table_plasto_4leg*4_name', 'Square Dining Table'), + ('furni_sound_set_57_name', 'RnB Grooves 3'), + ('hubu_h3', 'Huumetietobussi'), + ('furni_table_plasto_bigsquare*2_name', 'Square Dining Table'), + ('hubu_h4', 'Anna palautetta'), + ('hubu_h1', 'Puhelintuki'), + ('roomatic_bobbafilter', 'Bobba filter (filters out bad language)'), + ('hubu_h2', 'Harrastamaan!'), + ('furni_tv_luxus_desc', 'Bang up to date'), + ('hubu_h5', 'Huumetietoa'), + ('NUF_console_hotelview_icon', 'Click the button to open your Habbo Console.'), + ('modtool_banlength', 'Ban Length:'), + ('NUF_visiting_rooms_roomlist_tutor', 'Just pick any room you like. Click on the room to see a description of the room. ROOM!'), + ('reg_verification_newPassword', 'New password:'), + ('furni_wall_china_name', 'Dragon Screen'), + ('nav_venue_hallway_ii/0_desc', 'Beware witches and warlocks'), + ('jukebox_disk_add', 'Add Disc'), + ('furni_rare_xmas_screen_desc', 'Ho Ho Ho!'), + ('furni_table_plasto_round*2_name', 'Round Dining Table'), + ('furni_rubberchair*7_name', 'White Inflatable Chair'), + ('nav_favourites_helptext', 'These are your favourite rooms. Nice selection you have here...'), + ('nav_venue_sw_lobby_beginner_4_name', 'Snow Rookies Lobby'), + ('furni_gothic_chair*2_desc', 'The prince of Habbo'), + ('cam_save_nofilm', 'You have run out of film.\\rGet a roll (5 photos) from\\rthe Catalogue for 6 Credits.'), + ('furni_sofa_polyfon*6_desc', 'Blue Mode Sofa'), + ('furni_divider_silo3*2_desc', 'Form following function'), + ('furni_rare_beehive_bulb*1_name', 'Red Amber Lamp'), + ('furni_plant_small_cactus_desc', 'Even less watering than the real world'), + ('furni_triplecandle_name', 'Electric Candles'), + ('help_option_1', 'Playing Habbo'), + ('help_option_3', 'A serious issue (harassment, sexual behaviour)'), + ('furni_present_gen5_name', 'Gift'), + ('help_option_2', 'My Habbo account.'), + ('furni_shelves_norja*8_name', 'Yellow Bookcase'), + ('furni_legotrophy_desc', 'For the winning team'), + ('furni_rare_icecream*2_name', 'Pistachio Ice Cream Machine'), + ('furni_summer_pool*1_desc', 'Fancy a dip?'), + ('nav_venue_theatredrome_deli/0_desc', 'Join in all the fun of the fair!'), + ('game_newgame', 'New game'), + ('help_tour', 'Guided Tour'), + ('purse_vouchers_error3_url', 'http://%predefined%//credits'), + ('furni_marquee*5_name', 'Graphite Marquee'), + ('forgottenpw_explanation', 'If you have forgotten your password and you gave your correct email address when you registered, we can send your password to you.'), + ('furni_waterbowl*3_name', 'Yellow Water Bowl'), + ('roomatic_namedisp', 'Do you want your name to be displayed with the room?'), + ('poster_28_name', 'Silver Tinsel Bundle'), + ('Alert_BuyingOK', 'Buying Successful!'), + ('furni_summer_chair*4_name', 'Deck Chair'), + ('nav_venue_welcome_lounge_ii/0_desc', 'New? Lost? Get a warm welcome here from Habbo eXperts.'), + ('bb_title_gameCreation', 'Aloita uusi peli!'), + ('furni_sporttrack1*3_name', 'Sport track straight grass'), + ('furni_romantique_divan*2_name', 'Emerald Chaise-Longue'), + ('furni_divider_silo1*6_name', 'Blue Area Corner Shelf'), + ('NUF_about_hotel_about_tutor', 'Habbo is both a virtual world and an online community.'), + ('url_helpparents', 'http://%predefined%//help/73'), + ('furni_divider_silo3*7_name', 'Green Area Gate'), + ('poster_18_desc', 'Beautiful reproduction butterfly'), + ('furni_traffic_light*5_desc', 'Chill and wait your turn!'), + ('furni_scifirocket*6_desc', 'Too hot to handle!'), + ('pet.saying.angry.cat.0', 'Sssppp!'), + ('furni_bed_armas_one_desc', 'Rustic charm for one'), + ('pet.saying.angry.cat.3', '*hiss*'), + ('pet.saying.angry.cat.1', 'MrrRRRR'), + ('pet.saying.angry.cat.2', 'Tssssss!'), + ('furni_noob_rug*6_name', 'My first Habbo rug'), + ('club_habbo.bottombar.text.member', 'Habbo Club'), + ('furni_divider_silo1_name', 'Corner Shelf'), + ('nav_venue_bb_lobby_beginner_10/0_desc', ''), + ('recycler_info_progress', 'Recycling is currently in progress. The recycling process takes a total of %recyclinghours% hour. You can leave the catalogue and recycling will continue in the background.'), + ('furni_queue_tile1*1_name', 'Pink Habbo Roller'), + ('notickets_header', 'Buy game tickets to play this game'), + ('reg_underage', 'I am under 11 years old'), + ('nav_venue_sw_arena_intermediate_name', 'Playing intermediate game'), + ('furni_table_plasto_square*5_name', 'Square Dining Table'), + ('Alert_YouAreBanned_T', 'A Moderator kicked you out of the room.'), + ('buddyremove_moreoptions', 'More Options >>'), + ('furni_prizetrophy4*3_desc', 'Breathtaking bronze'), + ('furni_chair_silo*2_desc', 'Keep it simple'), + ('club_habbo.bottombar.link.notmember', 'Join!'), + ('poster_1000_name', 'Comedy Poster'), + ('room_badge_button', 'Badge'), + ('furni_soft_sofa_norja*8_desc', 'Yellow Iced Sofa'), + ('wallitem_torch_name', 'Gothic Torch'), + ('furni_scifirocket*7_name', 'Jupiter Smoke Machine'), + ('furni_romantique_tray1_desc', 'For a fast break'), + ('furni_rare_dragonlamp*0_desc', 'George and the...'), + ('furni_nest_desc', 'Night, night'), + ('furni_table_silo_small*2_name', 'Black Occasional Table'), + ('furni_prizetrophy7*2_name', 'Silver Habbo trophy'), + ('furni_sofachair_silo*3_desc', 'Large, but worth it'), + ('furni_divider_nor2*9_name', 'Red Iced bar desk'), + ('club_extend_title', 'Habbo Club membership can be extended VERY easily.'), + ('furni_rare_fan*0_desc', 'As red as Rudolph\'s nose'), + ('club_paybycash_url', '(leave this empty if you don\'t want to have this link displayed)'), + ('poster_57_name', 'Calligraphy poster'), + ('furni_CFC_50_coin_silver_desc', 'Worth 50 Credits'), + ('furni_pillow*5_name', 'Black Leather Pillow'), + ('furni_hc_chr_name', 'Majestic Chair'), + ('nav_venue_sw_arena_free_name', 'Playing free for all game'), + ('furni_active_placeholder_desc', 'This furniture is downloading...'), + ('nav_venue_welcome_lounge_name', 'Welcome Lounge'), + ('furni_soft_sofachair_norja*3_name', 'White Iced Sofachair'), + ('furni_bed_polyfon*3_desc', 'Give yourself space to stretch out'), + ('furni_pura_mdl4*3_name', 'Black Pura Module 4'), + ('furni_pillar*2_desc', 'Ancient and stately'), + ('furni_small_chair_armas_desc', 'Rustic charm at it\'s best'), + ('furni_table_plasto_round_desc', 'Hip plastic furniture'), + ('furni_marquee*2_desc', 'Dragons out and Davids in!'), + ('furni_wooden_screen*7_desc', 'Add an exotic touch to your room'), + ('furni_queue_tile1*8_name', 'Navy Habbo Roller'), + ('furni_arabian_pllw_desc', 'Exotic comfort'), + ('furni_sound_set_1_desc', 'Get the party started!'), + ('furni_gothic_stool*5_desc', 'The dark side of Habbo'), + ('furni_china_table_desc', 'Exotic and classy'), + ('song_disk_trade_info', '%name%'), + ('nav_venue_sw_lobby_beginner_9_name', 'Snow Rookies Lobby'), + ('console_modify', 'Modify'), + ('poster_36_desc', 'The Hotels girlband. Dream on!'), + ('furni_rare_dragonlamp*7_desc', 'Scary and scorching!'), + ('furni_sound_set_63_desc', 'Desert hits by the oasis!'), + ('nav_venue_cafe_gold_name', 'The Oasis'), + ('nav_venue_sw_lobby_tournament_3/0_desc', ''), + ('nav_venue_habbo_cinema_name', 'Habbo Cinema'), + ('furni_chair_plasty*4_name', 'Plastic Pod Chair'), + ('nav_venue_welcome_lounge_iii/0_desc', 'New? Lost? Get a warm welcome here from Habbo eXperts.'), + ('furni_carpet_soft*1_desc', 'Soft Wool Rug'), + ('furni_sporttrack1*1_name', 'Sport track straight'), + ('furni_divider_nor3*6_name', 'Blue Iced gate'), + ('furni_glass_chair*7_name', 'Green Glass Chair'), + ('club_confirm_gift_text', 'A new club gift has arrived. Please push OK if you want to receive it now. If you click cancel you will be asked again next time you log in to the Hotel.'), + ('furni_rubberchair*5_name', 'Lime Inflatable Chair'), + ('furni_plant_maze_snow_name', 'Snowy Maze Bundle 2'), + ('furni_table_silo_med*4_name', 'Beige Area Coffee Table'), + ('furni_solarium_norja*1_desc', 'Rejuvenate your pixels!'), + ('furni_divider_nor2*2_name', 'Black Iced bar desk'), + ('poster_45_desc', 'Needs a few more Habburgers'), + ('wallitem_habw_mirror_desc', 'Star of the show!'), + ('furni_pura_mdl3*9_name', 'Red Pura Module 3'), + ('furni_exe_corner_name', 'Executive Corner Desk'), + ('nav_venue_cunning_fox_gamehall/3_desc', 'Are you the new Deep Blue?'), + ('furni_rare_fan*7_desc', 'It\'ll blow you away!'), + ('furni_divider_nor1*5_desc', 'Pink Ice corner'), + ('wallitem_md_logo_wall_name', 'Bubble Juice Logo'), + ('furni_bardesk_polyfon_desc', 'Perfect for work or play'), + ('console_target_does_not_accept', 'This user does not accept friend requests at the moment'), + ('pet.saying.beg.croco.0', 'Mmmmmrrr'), + ('pet.saying.beg.croco.1', '*Emo tear*'), + ('messenger.email.header', ''), + ('pet.saying.beg.croco.2', 'Waarrrr...rrr'), + ('furni_carpet_polar*4_name', 'Green Bear Rug'), + ('furni_chair_plasto*6_name', 'Chair'), + ('furni_noob_rug*4_name', 'My first Habbo rug'), + ('furni_summer_chair*6_desc', 'Blue'), + ('rotate_furniture', 'Rotate Furni'), + ('poster_16_desc', 'Added security'), + ('furni_sofachair_silo*7_desc', 'Green Area Armchair'), + ('furni_divider_nor5*4_desc', 'Cool cornering for your crib!'), + ('furni_sand_cstl_twr_name', 'sand_cstl_twr'), + ('furni_safe_silo*4_name', 'Beige Safe Minibar'), + ('furni_chair_plasty*11_name', 'Plastic Pod Chair'), + ('furni_divider_arm2_name', 'Room divider'), + ('furni_sound_set_55_name', 'RnB Grooves 1'), + ('nav_venue_sw_lobby_intermediate_4_name', 'Snow Bombardiers Lobby'), + ('roomatic_canmodifysettings', '(You can change these settings later)'), + ('furni_pura_mdl5*7_desc', 'Any way you like it!'), + ('catalog_pet_name_length', 'Oops, pet\'s name is too long (max 15 characters)'), + ('furni_toy1*3_name', 'Rubber Ball'), + ('nav_venue_beauty_salon_loreal/0_desc', 'No Pixel Surgery, only natural make-ups!'), + ('furni_arabian_swords_name', 'Ancestral Scimitars'), + ('furni_summer_pool*4_name', 'Yellow Summer Pool'), + ('gs_error_create_0', 'This Lobby is full, please create a Game in another Lobby!'), + ('nav_venue_pizzeria/0_desc', 'Pizza; food of the hungry!'), + ('nav_roomnfo_hd_own', 'Own Rooms'), + ('furni_glass_sofa*4_desc', 'Translucent beauty'), + ('buddyremove_accept', 'Remove Friends'), + ('transaction_system_sms_win_orange', 'Orange SMS'), + ('gs_error_create_3', 'Your skill level isn\'t high enough for creating Games in this Lobby.'), + ('furni_goodie2_desc', 'For gourmet kittens'), + ('trading_youagree', 'You agree'), + ('furni_bench_lego_name', 'Team Bench'), + ('reg_verification_updateOK', 'Update successful'), + ('transaction_system_refunds', 'Refund'), + ('furni_carpet_standard*7_name', 'Floor Rug'), + ('poster_44_name', 'Mummy'), + ('furni_bed_polyfon_one*3_name', 'White Single Bed'), + ('furni_jp_tray1_name', 'jp_tray1'), + ('furni_jp_tatami_name', 'Small Tatami Mat'), + ('furni_bardesk_polyfon*2_name', 'Black Mode Bardesk'), + ('furni_hockey_light_desc', 'Set it off.'), + ('nav_venue_bb_lobby_intermediate_2/0_desc', ''), + ('wallitem_guitar_v_name', 'v guitar'), + ('reg_email', 'Email:'), + ('nav_venue_sw_lobby_tournament_0/0_desc', ''), + ('furni_club_sofa_name', 'Club sofa'), + ('furni_duck_name', 'Rubber Duck'), + ('furni_divider_nor5*9_name', 'Red Iced Angle'), + ('furni_smooth_table_polyfon_name', 'Large Dining Table'), + ('reg_forcedupdate', 'Please update your Habbo details!'), + ('transaction_system_stuff_store', 'Catalogue purchase'), + ('console_request_massoperation_title', 'You have %messageCount% friend requests waiting.'), + ('nav_venue_bb_lobby_expert_8/0_desc', ''), + ('roomatic_roomdescription', 'Room description:'), + ('reg_verification_invalidEmail', 'Check email address'), + ('furni_xmas_icelamp_desc', '20 lanterns for the price of 6!'), + ('wallitem_wallmirror_desc', 'Mirror, mirror on the wall...'), + ('furni_pura_mdl1*3_name', 'Black Pura Module 1'), + ('pet.saying.play.croco.1', 'Squeh Squeeeeh...'), + ('pet.saying.play.croco.0', ':)'), + ('nav_venue_theatredrome_halloween/0_desc', 'Warm welcome to Bullet For My Valentine!'), + ('nav_venue_bb_lobby_amateur_6_name', 'Gevorderden Battle Ball 7'), + ('cam_savetxt', 'Saving Photo...'), + ('nav_venue_bb_lobby_intermediate_1_name', 'Semi-profs Battle Ball 2'), + ('nav_modify_doorstatus', 'Door status'), + ('callhelp_sent', 'If you have questions about Habbo Hotel or your Habbo account, please write the details below and a member of community staff will respond as soon as possible.'), + ('wallitem_photo_name', 'Photo'), + ('poster_25_desc', 'A new use for carrots!'), + ('furni_chair_plasto*1_desc', 'Hip plastic furniture'), + ('furni_prizetrophy4*2_name', 'Fish trophy'), + ('furni_bar_armas_name', 'Barrel Minibar'), + ('nav_rooms_favourite', 'Favourites'), + ('furni_table_plasto_square*6_desc', 'Hip plastic furniture'), + ('furni_gothic_sofa*6_desc', 'The dark side of Habbo'), + ('jukebox_song_length', 'Song length: %time%'), + ('buddyremove_header', 'Choose %amount% friends to remove'), + ('furni_romantique_mirrortabl_desc', 'Get ready for your big date'), + ('wallitem_hrella_poster_2_name', 'Life Buoy'), + ('reg_boy', 'Boy'), + ('sound_machine_trax_name', 'Trax name:'), + ('purse_vouchers_error0', 'Technical error! Cannot redeem voucher.'), + ('furni_plant_valentinerose*3_name', 'Yellow Valentine Rose'), + ('purse_vouchers_error1', 'Invalid voucher code.'), + ('nav_venue_bb_lobby_expert_1_name', 'Experts Battle Ball 2'), + ('purse_vouchers_error2', 'Product delivery failed, please contact Customer Service'), + ('purse_vouchers_error3', 'This voucher must be redeemed on the Habbo website'), + ('furni_romantique_chair*2_desc', 'null'), + ('furni_prizetrophy7*1_desc', 'Gold Habbo trophy'), + ('furni_table_plasto_bigsquare*14_name', 'Occasional Table'), + ('furni_ticket_desc', 'A bundle of 5 gaming tickets'), + ('nav_venue_club_massiva_name', 'Club Massiva'), + ('roomatic_locked', 'Door locked - visitors have to ring doorbell'), + ('furni_table_silo_small*3_desc', 'For those random moments'), + ('furni_bed_trad_name', 'Plain Double Bed'), + ('summer_chair_5_name', 'Beige Deck Chair'), + ('buddyremove_select_all', 'Select All Friends'), + ('furni_plant_valentinerose*5_desc', 'For that special pixel'), + ('furni_glass_table*9_name', 'Glass table'), + ('furni_romantique_smalltabl*5_desc', 'Why is one leg different?'), + ('furni_pura_mdl5*5_name', 'beige pura module 5'), + ('poster_30_name', 'Mistletoe'), + ('furni_chair_basic*8_name', 'chair_basic'), + ('nav_venue_sw_lobby_amateur_2_name', 'Snow Slingers Lobby'), + ('Alert_ConnectionDisconnected', 'Please reload Habbo Hotel!\\r\\rIf this happens again, please wait a moment before reloading.'), + ('Alert_WrongPassword', 'Check password!'), + ('nav_modify_letothersmove', 'Let other people move and leave furniture in the room.'), + ('furni_rare_dragonlamp*1_name', 'Sea Dragon Lamp'), + ('furni_table_plasto_4leg*10_desc', 'Hip plastic furniture'), + ('furni_sound_set_28_name', 'Rock 2'), + ('furni_grand_piano*2_name', 'Black Grand Piano'), + ('furni_basket_desc', 'Eggs-actly what you want for Easter'), + ('furni_rare_fan*5_name', 'Yellow Powered Fan'), + ('furni_noob_lamp*2_name', 'My first Habbo lamp'), + ('furni_present_gen4_desc', 'What\'s inside?'), + ('furni_pillar*9_desc', 'Ancient and stately'), + ('furni_chair_norja*8_desc', 'Sleek and chic for each cheek'), + ('furni_pura_mdl2*2_desc', 'Any way you like it!'), + ('furni_glass_stool*5_desc', 'Translucent beauty'), + ('furni_hc_lmp_name', 'Oil Lamp'), + ('console_myinterests', 'My interests:'), + ('furni_val_teddy*6_desc', 'The blue bear of happiness'), + ('room_cant_set_item', 'You cannot place this in someone else\'s room!'), + ('poster_29_desc', '10 x Gold Tinsel'), + ('club_general_daysleft', 'Number of HC days left'), + ('nav_popup_nav_link', 'Open the Navigator'), + ('furni_sound_set_43_desc', 'Beware zombies!'), + ('furni_solarium_norja*6_name', 'Blue Solarium'), + ('furni_doormat_plain*1_name', 'Doormat'), + ('nav_venue_chill_name', 'Zen Garden'), + ('furni_one_way_door*5_desc', 'One at a time!'), + ('furni_table_plasto_round*3_desc', 'Hip plastic furniture?'), + ('furni_prizetrophy6_desc', 'Palkinto'), + ('furni_exe_s_table_name', 'Executive Glass Table'), + ('furni_noob_rug*5_desc', 'Nice and neat sisal rug with pink edging'), + ('furni_scifirocket*0_name', 'Mars Smoke Machine'), + ('furni_soft_jaggara_norja_desc', 'Soft Iced sofachair'), + ('nav_venue_bb_lobby_amateur_9/0_desc', ''), + ('furni_chair_plasty*5_desc', 'Hip plastic furniture'), + ('hobba_mark_emergency', 'Emergency Help'), + ('furni_djesko_turntable_name', 'Habbo Turntable'), + ('furni_shelves_norja*9_desc', 'For nic naks and art deco books'), + ('poll_confirm_cancel_long', 'Are you sure you want to stop answering the poll? You can\'t continue later.'), + ('poster_32_desc', 'The Auspicious One'), + ('opening_hours_text_opening_time', 'The Hotel will open again at %h%:%m%. We look forward to welcoming you back!'), + ('furni_bed_budget_one*7_name', 'Green Pura Bed'), + ('furni_pillow*0_desc', 'Minimalist comfort!'), + ('furni_divider_poly3*8_desc', 'Yellow Mode Bardesk Gate'), + ('nav_venue_bb_lobby_beginner_13/0_desc', ''), + ('furni_sound_set_6_name', 'Ambient 3'), + ('hubu_win', 'Bus - Info'), + ('furni_sound_machine*5_name', 'Brown Traxmachine'), + ('furni_sporttrack1*2_desc', 'null'), + ('bb_title_bouncingBall', 'Battle Ball'), + ('nav_venue_rooftop/0_desc', 'Hang out on the very rooftop of Habbo Hotel!'), + ('modtool_banreason', 'Ban Reason:'), + ('furni_chair_silo*9_desc', 'Red Silo Dining Chair'), + ('furni_bed_budget*6_desc', 'King sized comfort!'), + ('furni_s_sound_machine*4_desc', 'Sound Machine Blue Desc'), + ('furni_rubberchair*6_desc', 'Soft and tearproof!'), + ('nav_venue_sw_lobby_expert_1_name', 'Snow Marksmen Lobby'), + ('nav_venue_bb_lobby_beginner_7/0_desc', ''), + ('furni_table_plasto_4leg*5_desc', 'Hip plastic furniture'), + ('gen_youhave', 'You Have'), + ('furni_carpet_soft*6_name', 'Soft Wool Rug'), + ('furni_petfood2_desc', 'Fantastic 20% Saving!'), + ('group_privileges', 'Priviliges:'), + ('furni_samovar_name', 'Russian Samovar'), + ('furni_hal_grave_name', 'Haunted Grave'), + ('furni_bed_budget_one*2_desc', 'Princess sized comfort!'), + ('gs_error_1', 'You have entered invalid data!'), + ('reject', 'Reject'), + ('gs_error_4', 'You have reached your maximum number of daily Games!'), + ('nav_venue_sw_lobby_tournament_5_name', 'Tournament Lobby'), + ('gs_error_5', 'Tournament is only available for users living in the UK.'), + ('gs_error_2', 'You don\'t have enough Tickets!'), + ('gs_error_8', 'To start a Game, there must be at least two Teams of one player each!'), + ('sound_machine_alert_no_sound_sets', 'You don\'t have any sound sets available for song editing. \\rNote that the sets need to be in your inventory (hand).'), + ('furni_waterbowl*4_desc', 'Aqua unlimited'), + ('furni_doormat_love_desc', 'Welcome Habbos in style'), + ('gs_error_6', 'You have been removed from the Game!'), + ('furni_soft_sofachair_norja*4_desc', 'Sit back and relax'), + ('bb_powerup_desc_8', 'By using a vacuum cleaner, you can clear any tile in the field.'), + ('move', 'Move'), + ('furni_romantique_smalltabl*3_name', 'Turquoise Tray Table'), + ('furni_bed_polyfon*8_name', 'Yellow Mode Double Bed'), + ('furni_sofachair_polyfon*4_desc', 'Beige Mode Armchair'), + ('forgottenpw_email', 'Your email address'), + ('console_email', 'Email'), + ('bb_powerup_desc_1', 'Light bulb colours an area around it.'), + ('furni_divider_nor2_desc', 'Strong, yet soft looking'), + ('furni_bardeskcorner_polyfon*5_desc', 'For sweet corners!'), + ('say', 'Say'), + ('bb_powerup_desc_3', 'Flashlight colours a straight line ahead of you.'), + ('bb_powerup_desc_2', 'Bouncing on a spring locks tiles in a single jump.'), + ('bb_powerup_desc_5', 'Bouncing on a box of pins will burst your Battle Ball!'), + ('bb_powerup_desc_4', 'A shot with a cannon locks tiles on a straight line.'), + ('furni_chair_basic*1_name', 'chair_basic'), + ('bb_powerup_desc_7', 'A bomb will clear all tiles around it.'), + ('bb_powerup_desc_6', 'Harlequin effect makes everybody colour tiles for your team!'), + ('NUF_console_read_next', 'Click \'OK\' to mark message as read.'), + ('poster_50_name', 'Bat Poster'), + ('furni_table_plasto_4leg*15_name', 'Occasional Table'), + ('furni_tree7_desc', 'Walking in a winter wonderland!'), + ('poster_37_name', 'The Habbo Babes 3'), + ('furni_queue_tile1*7_desc', 'The power of movement'), + ('furni_bed_budgetb_name', 'Plain Double Bed'), + ('interface_icon_sound', 'Sound Off/On'), + ('pet.hotwords.come_here', 'come here'), + ('poster_10_name', 'Lapland Poster'), + ('win_delete_item', 'Remove Item'), + ('wallitem_hrella_poster_3_name', 'Anchor'), + ('furni_table_plasto_bigsquare*8_desc', 'Hip plastic furniture'), + ('furni_habboween_grass_name', 'Unholy Ground'), + ('furni_plant_valentinerose*4_name', 'Pink Valentine\'s Rose'), + ('nav_venue_skylight_lobby/0_desc', 'Lift your spirits on the top floor'), + ('buddyremove_alphabetical', 'Alphabetical Order'), + ('alert_win_coppa', 'You are blocked'), + ('nav_venue_bb_lobby_amateur_5_name', 'Gevorderden Battle Ball 6'), + ('reg_update_text', 'Never change your password or email just because somebody asks you to. He / she is most probably trying to steal your Habbo account and furni!'), + ('decision_ok', 'OK'), + ('furni_summer_grill*3_name', 'Yellow Barbeque Grill'), + ('nav_public_helptext', 'These are hotel\'s public rooms. What are you waiting for? Go and meet other Habbos!'), + ('tickets_button_info_2', 'Stuff you can do with these 20 tickets'), + ('furni_rclr_chair_name', 'Palm Chair'), + ('login_create1here', 'You can create one here.'), + ('tickets_button_info_1', 'Stuff you can do with these 2 tickets'), + ('furni_prizetrophy6*3_name', 'Champion trophy'), + ('furni_shelves_norja*2_desc', 'For nic naks and art deco books'), + ('purse_info', 'DESCRIPTION'), + ('bb_choose_powerups', 'Powerup select'), + ('purse_transaction', 'View Transactions'), + ('reg_birthdayformat', 'Birthday*: [dd][mm][yyyy]'), + ('Alert_YouMustAgree', 'You must accept the Terms and Conditions before proceeding.'), + ('jukebox_empty', 'Empty'), + ('purse_info_film', 'Films For Camera'), + ('furni_sofachair_polyfon*9_desc', 'Loft-style comfort'), + ('furni_habbocake_desc', 'Save me a slice!'), + ('furni_doormat_plain*6_desc', 'Available in a variety of colours'), + ('nav_venue_sun_terrace/0_desc', 'For lazy afternoons and super tan treatment!'), + ('poster_501_desc', 'For pirates everywhere'), + ('pet_thir_2', 'Thirsty'), + ('gs_error_watch_0', 'All The Spectator Seats Are Taken!'), + ('pet_thir_3', 'Not thirsty'), + ('camera_open_dialog_text', 'Would you like to take some photos\\ror put your camera in your room?'), + ('furni_bed_budget_one*9_desc', 'Prince sized comfort!'), + ('ph_goswimming', 'Go swimming!'), + ('furni_habboween_crypt_name', 'Creepy Crypt'), + ('gs_error_join_7', 'You have already joined this Game!'), + ('nav_venue_sw_lobby_amateur_3_name', 'Snow Slingers Lobby'), + ('furni_romantique_smalltabl*4_name', 'Amber Tray Table'), + ('gs_error_join_3', 'You either have too much or too little skill to join.'), + ('pet_thir_0', 'Gasping'), + ('gs_error_join_0', 'The team you selected is already full.'), + ('pet_thir_1', 'Parched'), + ('furni_gothic_stool*3_name', 'Gothic Stool Red'), + ('furni_wooden_screen*1_name', 'Pink Oriental screen'), + ('furni_sofa_silo*4_name', 'Beige Area Sofa'), + ('furni_queue_tile1*2_desc', 'The power of movement'), + ('buddyremove_continue', 'Remove Friend Now'), + ('nav_venue_bb_lobby_expert_2/0_desc', ''), + ('nav_loading', 'Loading...'), + ('furni_bed_armas_two_name', 'Double Bed'), + ('furni_prizetrophy4*1_name', 'Fish trophy'), + ('furni_sound_machine*7_desc', 'Red alert. Red alert. It\'s a party!'), + ('furni_glass_sofa_desc', 'Translucent beauty'), + ('furni_barchair_silo*5_name', 'Pink Bar Stool'), + ('furni_soft_sofachair_norja*5_desc', 'Pink Iced Sofachair'), + ('console_fr_accepted_count', 'Amount to be accepted'), + ('poster_2001_desc', 'Perinteinen ryijy,'), + ('furni_couch_norja*5_desc', 'Two can perch comfortably'), + ('furni_rclr_lamp_desc', 'Light your space'), + ('furni_sand_cstl_wall_desc', 'sand_cstl_wall'), + ('furni_one_way_door*4_name', 'Beige One Way Gate'), + ('furni_corner_china_name', 'Dragon Screen'), + ('nav_venue_sw_lobby_amateur_4/0_desc', 'Astetta rankempaa lumisotaa.'), + ('furni_chair_silo*7_name', 'Green Silo Dining Chair'), + ('transaction_system_messenger', 'Console SMS'), + ('furni_pura_mdl4*8_desc', ''), + ('console_reject_selected', 'Reject selected'), + ('furni_rare_icecream*4_desc', 'Virtual strawberry rocks!'), + ('furni_prizetrophy*2_desc', 'Shiny silver'), + ('furni_scifiport*0_desc', 'Energy beams. No trespassers!'), + ('paalu_ui2', 'Push'), + ('paalu_ui3', 'Moving'), + ('paalu_ui4', 'Stabilise'), + ('paalu_ui5', 'Balance'), + ('furni_sofa_polyfon*7_name', 'Green Mode Sofa'), + ('nav_error_toomanyfavrooms', 'You can\'t have more than 10 favourite rooms! Please remove an old favourite if you want to add a new one.'), + ('furni_noob_stool*5_name', 'My first Habbo stool'), + ('sound_machine_alert_missing_packages', 'You need the following Traxpacks to edit this song:'), + ('furni_grunge_bench_name', 'Bench'), + ('paalu_ui1', 'Balance'), + ('furni_sleepingbag*5_name', 'Graphite Sleeping Bag'), + ('furni_divider_nor2*3_name', 'White Iced Bar-Desk'), + ('bb_header_teams', 'Teams'), + ('wallitem_sw_swords_name', 'Swords'), + ('furni_val_choco_desc', 'One for them. Two for me!'), + ('nav_venue_bb_lobby_expert_5/0_desc', ''), + ('furni_soft_sofa_norja*2_name', 'Black Iced Sofa'), + ('furni_bed_budgetb_one_desc', 'All you need for a good night\'s kip'), + ('furni_carpet_standard*8_name', 'Floor Rug'), + ('furni_rare_dragonlamp*6_name', 'Gold Dragon Lamp'), + ('furni_sound_set_56_desc', 'Get down tonight!'), + ('furni_divider_nor5*2_name', 'Black Iced Angle'), + ('chat.curse_word', 'Bobba'), + ('furni_couch_norja*4_desc', 'Two can perch comfortably'), + ('furni_scifirocket*2_desc', 'A little closer to home!'), + ('furni_rare_fan*6_desc', 'It\'ll blow you away!'), + ('poster_514_name', 'The EU flag'), + ('club_desc_2_period', '3 Months (93 days) = 60 Credits'), + ('furni_glass_chair*9_desc', 'Translucent beauty'), + ('poster_1338_desc', 'If her age on the clock, she ready for the cock'), + ('nav_src_hd', 'Search Results.'), + ('console_unknown_sender', 'Unknown sender'), + ('furni_prizetrophy4_name', 'Pokaali'), + ('nav_venue_sunset_cafe/0_desc', 'Come and chat about Official Fansites and meet their staff!'), + ('furni_pura_mdl4*9_desc', 'Any way you like it!'), + ('furni_pillar*8_name', 'Roman Pillar'), + ('nav_venue_sport/0_desc', 'St Trinian\'s is out on DVD April 14th!'), + ('furni_pillar*7_name', 'Atlantean Pillar'), + ('club_extend_text', 'If you\'re subscribing again to Habbo Club, you won\'t lose any of the advantages or ongoing furni gifts. Club membership can be extended in advance.\\rRemember: one club month lasts 31 days.'), + ('sound_machine_confirm_eject', 'Remove cartridge?'), + ('shopping_got', 'You have xx in your Purse.'), + ('furni_rare_stand_desc', 'Stand and Deliver!'), + ('furni_chair_plasto_desc', 'Hip plastic furniture'), + ('furni_bed_polyfon_one*9_desc', 'Cot of the artistic'), + ('furni_couch_norja*9_name', 'Red Bench'), + ('poster_3_desc', 'Smells fishy, looks cool'), + ('paalu.winner', 'Winner:'), + ('NUF_meeting_people_room_wave', 'These buttons let you wave and dance. Click on your Habbo at anytime to see these buttons.'), + ('sound_machine_confirm_window', 'Sound Machine'), + ('furni_one_way_door*3_name', 'White HC Gate'), + ('furni_chair_plasty*9_name', 'Plastic Pod Chair'), + ('gs_timeleft', 'Time Left \\x'), + ('hobba_pickup', 'Pick Up'), + ('console_lastvisit', 'Last Visit'), + ('furni_rare_globe_desc', 'It\'s all white..'), + ('furni_val_cauldron_name', 'Valentine\'s Cauldron'), + ('poster_43_name', 'Chains'), + ('furni_bardesk_polyfon*8_desc', 'Yellow Mode Bardesk'), + ('furni_sound_set_36_name', 'Latin Love 1'), + ('dimmer_apply', 'Apply'), + ('furni_glass_chair*8_desc', 'Translucent beauty'), + ('furni_pura_mdl2*7_desc', 'Any way you like it!'), + ('furni_prizetrophy*3_desc', 'Breathtaking bronze'), + ('furni_marquee*1_name', 'Pink marquee'), + ('NUH_own_user', 'This is your Habbo. Click on the floor to move around.'), + ('furni_gothic_sofa*1_desc', 'The dark side of Habbo'), + ('furni_divider_nor5*3_name', 'White Iced Angle'), + ('furni_divider_nor4*5_name', 'Pink Iced Auto Shutter'), + ('furni_soft_sofa_norja*3_name', 'White Iced Sofa'), + ('furni_sofachair_silo*8_desc', 'Large, but worth it'), + ('furni_pura_mdl1*9_desc', 'Any way you like it!'), + ('furni_chair_plasto*7_name', 'Chair'), + ('furni_pura_mdl5*6_desc', 'Any way you like it!'), + ('emailpw', 'Send'), + ('sound_machine_playlist_window', 'Traxmachine Playlist Editor'), + ('furni_pura_mdl1*3_desc', 'Any way you like it!'), + ('furni_noob_table*5_desc', 'Lightweight, practical and pink'), + ('furni_scifirocket*6_name', 'Mercury Smoke Machine'), + ('furni_shelves_norja_name', 'Bookcase'), + ('poster_521_name', 'Flag of Brazil'), + ('sound_machine_jukebox_disk_window', 'Insert disc'), + ('furni_table_norja_med*6_desc', 'For larger gatherings'), + ('furni_pillow*6_name', 'Blue Cotton Pillow'), + ('furni_shelves_norja*3_desc', 'For nic naks and art deco books'), + ('queue_set.s.info', 'There are %d% Habbos in front of you in the queue to see the Habbo Live broadcast!'), + ('reg_parentemail_info', 'Because of your age, we need to let your parents know you are registering at Habbo Hotel. Please give the email address of one of your parents/guardians.'), + ('club_txt_paycash', 'Pay by Cash'), + ('furni_chair_plasto*11_name', 'Chair'), + ('furni_pizza_name', 'Pizza Box'), + ('furni_table_plasto_4leg*6_desc', 'Hip plastic furniture'), + ('furni_chair_silo*3_desc', 'Keep it simple'), + ('alert_reg_t', 'Please check these details:'), + ('nav_venue_theatredrome_name', 'Theatredrome'), + ('furni_hc_rntgn_desc', 'Believe it or not!'), + ('nav_venue_main_lobby_name', 'Main Lobby'), + ('furni_sound_set_64_desc', 'Make a little Jinn-gle!'), + ('nav_venue_sw_lobby_amateur_desc', 'Practice improves a Snow Stormer\'s aim... Ops, missed!'), + ('furni_scifiport*5_name', 'Security Fence'), + ('furni_lamp_basic_desc', 'Switch on the atmosphere with this sophisticated light'), + ('pet.saying.sniff.cat.0', 'snuh..snuh'), + ('poster_506_name', 'The flag of Finland'), + ('furni_bardeskcorner_polyfon*6_desc', 'Blue Mode Bardesk Corner'), + ('nav_venue_hotel_kitchen_name', 'Hotel Kitchen'), + ('furni_doorB_desc', 'Narnia this way!'), + ('poster_11_name', 'Certificate'), + ('furni_safe_silo_desc', 'Totally shatter-proof!'), + ('furni_bed_budget_one*3_desc', 'Prince sized comfort!'), + ('furni_romantique_divider*4_name', 'Ochre Screen'), + ('previous_onearrowed', '< Previous'), + ('nav_venue_bb_lobby_tournament_3_name', 'Competitie Battle Ball 4'), + ('furni_plant_sunflower_desc', 'For happy Habbos'), + ('furni_throne_desc', 'Important Habbos only'), + ('furni_exe_bardesk_name', 'Executive Bar Desk'), + ('furni_tree6_desc', 'The future\'s bright!'), + ('log_problem_title', 'Problems Connecting'), + ('furni_chair_basic*2_name', 'Pink Pura Egg Chair'), + ('game_chess_black', 'Black:'), + ('furni_glass_sofa*9_name', 'Glass sofa'), + ('furni_chair_norja*2_desc', 'Sleek and chic for each cheek'), + ('furni_pillar*3_desc', 'Ancient and stately'), + ('furni_scifidoor*8_desc', 'There out of this world!'), + ('alert_InvalidUserName', 'Don\'t use this character: \\x !'), + ('furni_rare_parasol*3_name', 'Violet Parasol'), + ('furni_bed_budget*5_desc', 'King sized comfort!'), + ('furni_chair_silo*8_name', 'Yellow Dining Chair'), + ('nav_tryingpw', 'Trying the password...'), + ('furni_cn_lamp_desc', 'Light of the East'), + ('furni_prizetrophy3*3_name', 'Globe trophy'), + ('furni_sound_set_16_desc', 'Ferry, ferry good!'), + ('furni_table_plasto_round*4_desc', 'Hip plastic furniture'), + ('poster_2007_desc', 'The legendary founder of the Hotel'), + ('sound_machine_insert', 'Add to mixer'), + ('furni_sound_machine*1_desc', 'Let the party begin!'), + ('furni_bed_polyfon_one*8_desc', 'Yellow Mode Single Bed'), + ('error_room_closed', 'Huone on suljettu.'), + ('pet.hotwords.play_dead', 'play dead'), + ('gs_button_go_finished', 'Scores'), + ('group_member', 'Member'), + ('sound_machine_confirm_save', 'Save the song?'), + ('furni_arabian_wndw_desc', 'Arabian days and nights'), + ('nav_venue_sw_lobby_expert_2_name', 'Snow Marksmen Lobby'), + ('furni_sound_set_57_desc', 'Feel the groove'), + ('furni_triplecandle_desc', 'No need to worry about wax drips'), + ('char_welcome', 'Welcome!'), + ('furni_sound_machine*6_desc', 'Add some effects to your room!'), + ('furni_sofachair_polyfon*3_desc', 'Loft-style comfort'), + ('nav_venue_bb_lobby_amateur_6/0_desc', ''), + ('group_logo_url_template', 'http://www.habbohotel.co.uk/habbo-imaging/badge-fill/%imagerdata%.gif'), + ('furni_table_plasto_bigsquare*2_desc', 'Hip plastic furniture'), + ('furni_glass_table*5_desc', 'Translucent beauty'), + ('url_purse_link', 'http://%predefined%//credits?'), + ('buddyremove_logintime', 'Last Login Time'), + ('NUF_meeting_people_hotelview_tutor', 'The Navigator lets you move between rooms in the Hotel, so open it up to get started!'), + ('furni_sofa_polyfon*6_name', 'Blue Mode Sofa'), + ('furni_scifirocket*1_desc', 'There is always space for this!'), + ('nav_venue_bb_lobby_amateur_10/0_desc', ''), + ('furni_prizetrophy5_name', 'Pokaali'), + ('purse_info_tickets', 'Gaming Tickets'), + ('poster_513_name', 'The Australian flag'), + ('furni_noob_chair*3_desc', 'Lightweight, practical, with red stripes'), + ('alert_old_client', 'You have an old version cached. Please empty your browser cache and login again.'), + ('furni_bar_basic_name', 'A Pura Minibar'), + ('furni_shelves_norja*8_desc', 'For nic naks and art deco books'), + ('sound_machine_save_window', 'Save your Trax'), + ('poster_51_name', 'Basketball Hoop'), + ('Alert_moderator_warning', ''), + ('furni_solarium_norja*5_name', 'Pink Solarium'), + ('furni_sporttrack2*1_desc', 'null'), + ('furni_rubberchair*7_desc', 'Soft and tearproof!'), + ('reg_parentemail_moreinfo', 'More information:'), + ('furni_present_gen5_desc', 'What\'s inside?'), + ('furni_bed_polyfon*9_desc', 'Give yourself space to stretch out'), + ('sound_machine_confirm_save_list_long', 'Are you sure you want to overwrite the current playlist?'), + ('cam_zoom_in.help', 'Zoom In'), + ('furni_carpet_soft*5_name', 'Soft Wool Rug'), + ('furni_plant_small_cactus_name', 'Small Cactus'), + ('console_creatingaprofile', 'Creating A Profile'), + ('console_select_all', 'Select all'), + ('hobba_reply_cfh', 'Reply to:'), + ('notickets_buygame', 'Buy a game'), + ('furni_sporttrack1*3_desc', 'null'), + ('furni_sleepingbag*1_desc', 'Ultimate coziness'), + ('furni_gothic_stool*4_name', 'Black Gothic Stool'), + ('nav_venue_bb_lobby_beginner_4/0_desc', ''), + ('nav_venue_netcafe/0_desc', 'Learn a foreign language and win Habbo Credits in our quests!'), + ('poster_31_desc', 'Pure and unbridled nu-metal'), + ('furni_sound_set_24_desc', 'It\'s all about the Pentiums, baby!'), + ('pet.saying.angry.dog.3', 'dog.1=Oouh..oouh..snuh..ooo'), + ('furni_bed_budget_one*8_desc', 'Prince sized comfort!'), + ('pet.saying.angry.dog.4', 'ARRR Grrr.. woof woof woof'), + ('pet.saying.angry.dog.1', 'Woof! Grrrr..woof woof'), + ('furni_sw_table_desc', ''), + ('pet.saying.angry.dog.2', 'grRRRRrr.r...r'), + ('pet.saying.angry.dog.0', 'Rrrr..woof.. Rrr'), + ('furni_chair_china_name', 'Chinese Lacquer Chair'), + ('furni_romantique_divan*2_desc', 'Recline in continental comfort'), + ('furni_divider_silo1*6_desc', 'Blue Area Corner Shelf'), + ('furni_sound_set_5_name', 'Ambient 4'), + ('roomevent_browser_create', 'Host an event'), + ('furni_noob_rug*6_desc', 'Nice and neat sisal rug with green edging'), + ('transaction_system_bank_luottokunta', 'Luottokortti'), + ('furni_bed_armas_one_name', 'Single Bed'), + ('furni_plant_fruittree_desc', 'Great yield and sweet fruit'), + ('furni_sound_machine_pro_desc', 'creating fancy sounds'), + ('nav_ownrooms_helptext', 'If you didn\'t know, these are your rooms. Here you can modify your rooms or create new ones if you feel like it.'), + ('furni_grunge_radiator_desc', 'Started cool but now it\'s hot!'), + ('furni_divider_silo3*7_desc', 'Green Area Gate'), + ('room_hold', 'Wait a second...\\rLoading room...'), + ('furni_sound_set_49_desc', 'You will belong'), + ('nav_venue_emperors/0_desc', 'Even the smallest of light... shines in the darkness'), + ('furni_nest_name', 'Basket'), + ('furni_noob_table*4_name', 'My first Habbo table'), + ('furni_sound_set_51_desc', 'Bop to the beat'), + ('furni_plant_maze_snow_desc', '20 x Snowy Maze Shrubbery'), + ('NUF_meeting_people_hotelview_icon', 'Click the Navigator button to start visiting the rooms!'), + ('furni_scifirocket*7_desc', 'Larger than life!'), + ('furni_table_plasto_round*9_name', 'Round Dining Table'), + ('furni_val_teddy*5_name', 'Yellow Share Bear'), + ('nav_venue_bb_lobby_expert_2_name', 'Experts Battle Ball 3'), + ('console_onfrontpage', 'Online'), + ('poster_1000_desc', 'The Noble and Silver Show'), + ('furni_rare_icecream*9_name', 'Bubblegum Ice Cream Machine'), + ('furni_rare_fan*0_name', 'Festive Fan'), + ('furni_carpet_polar_name', 'Faux-Fur Bear Rug'), + ('hobba_chatlog', 'See Chat Log >>'), + ('furni_romantique_chair*3_desc', 'null'), + ('hobba_pickedby', 'Picked Up By:'), + ('poster_24_desc', 'Trying to get in or out?'), + ('furni_table_silo_small*2_desc', 'For those random moments'), + ('furni_table_plasto_bigsquare*15_name', 'Occasional Table'), + ('furni_prizetrophy7*2_desc', 'Silver Habbo trophy'), + ('ph_keys_run', 'Run:'), + ('error_title', 'Oops, error!'), + ('furni_rare_dragonlamp*0_name', 'Fire Dragon Lamp'), + ('furni_CFC_50_coin_silver_name', 'Silver Coin (China)'), + ('furni_chair_plasty_name', 'Plastic Pod Chair'), + ('nav_roomInfo', 'Room info'), + ('furni_sound_set_63_name', 'Alhambra Trax 2'), + ('furni_divider_nor2*9_desc', 'Red Iced bar desk'), + ('furni_soft_sofa_norja*8_name', 'Yellow Iced Sofa'), + ('poster_57_desc', 'chinese calligraphy'), + ('furni_table_plasto_4leg*16_name', 'Occasional Table'), + ('accept', 'Accept'), + ('pet.saying.beg.cat.2', 'MEOW, MEOW, MEOW..'), + ('furni_waterbowl*3_desc', 'Aqua unlimited'), + ('furni_divider_poly3*2_name', 'Black Mode Bardesk Gate'), + ('furni_divider_nor3_desc', 'Do go through...'), + ('furni_table_plasto_square*5_desc', 'Hip plastic furniture'), + ('furni_rubberchair*1_desc', 'Soft and stylish HC chair'), + ('furni_divider_nor5*8_name', 'Yellow Iced Angle'), + ('furni_pura_mdl4*3_desc', 'Any way you like it!'), + ('nav_removerights_desc', 'Remove all rights to this room from other users.'), + ('furni_chair_norja*7_name', 'Rural Chair'), + ('furni_pillar*2_name', 'Nordic Pillar'), + ('furni_bed_polyfon*3_name', 'White Double Bed'), + ('furni_glass_chair*3_desc', 'Translucent beauty'), + ('wallitem_xmas_light_name', 'Xmas light'), + ('pet.saying.beg.cat.0', 'MaUUU...MEOW...meow'), + ('pet.saying.beg.cat.1', '*looks up with sad eyes*'), + ('reg_verification_newEmail', 'Your new email address:'), + ('furni_sound_set_29_desc', 'Electronic house'), + ('furni_joulutahti_desc', 'Christmas in a pot'), + ('furni_china_table_name', 'Chinese Lacquer Table'), + ('poster_507_desc', 'The French flag'), + ('NUF_visiting_rooms_hotelview_nav', 'Click the icon to open the Navigator.'), + ('dimmer_preset_1', 'Preset 1'), + ('nav_private_helptext', 'These are the rooms owned by Habbos. Select a category first and then browse some rooms and meet some people!'), + ('furni_queue_tile1*8_desc', 'The power of movement'), + ('dimmer_preset_2', 'Preset 2'), + ('furni_arabian_pllw_name', 'Green Blossom Pillow'), + ('nav_venue_bb_lobby_tournament_7/0_desc', ''), + ('furni_goodie1*1_desc', 'Crunchy Dog Treat'), + ('poster_36_name', 'The Habbo Babes 2'), + ('poll_window', 'Question'), + ('furni_md_limukaappi_desc', 'A sparkling and refreshing pixel drink!'), + ('nav_venue_rooftop_rumble_ii_name', 'Rooftop Rumble II'), + ('furni_wooden_screen*7_name', 'Purple Oriental Screen'), + ('furni_scifidoor*2_name', 'Yellow Spaceship Door'), + ('room_max_pet_limit', 'Too many pets in the room!'), + ('hobba_sent_to_helpers', 'Call re-assigned as emergency and sent to moderators'), + ('furni_table_silo_med*4_desc', 'Beige Area Coffee Table'), + ('furni_romantique_pianochair*5_name', 'Onyx Piano Stool'), + ('nav_modify_roomdescription', 'Room Description'), + ('furni_sound_set_10_name', 'Hip Hop Beats 1'), + ('furni_chair_silo*2_name', 'Black Dining Chair'), + ('furni_marquee*6_name', 'Blue Marquee'), + ('poster_8_name', 'Habbo Colours'), + ('transaction_system_htk_singledrop', 'Landline'), + ('furni_chair_plasty*4_desc', 'Hip plastic furniture'), + ('dimmer_preset_3', 'Preset 3'), + ('furni_exe_corner_desc', 'Tuck it away'), + ('nav_venue_welcome_lounge/0_desc', 'New? Lost? Get a warm welcome here from Habbo eXperts.'), + ('furni_sleepingbag*6_desc', 'Ultimate coziness'), + ('nav_venue_cunning_fox_gamehall/3_name', 'Batleships'), + ('console_mainhelp', 'Habbo Console Help'), + ('tickets_button_info_hide', 'Hide Ticket Info'), + ('furni_xmas_icelamp_name', 'Lantern Bundle 2'), + ('nav_venue_bb_lobby_amateur_0/0_desc', ''), + ('purse_header', 'Habbo Purse'), + ('furni_noob_lamp*3_name', 'My first Habbo lamp'), + ('nav_help_title', 'Want a room of your own?'), + ('buy', 'Buy'), + ('furni_pura_mdl1*8_name', 'yellow pura module 1'), + ('dimmer_title', 'Mood Light'), + ('NUF_mini_meet_people_hotelview_icon', 'Click the Navigator button to start visiting the rooms!'), + ('console_credits', 'Credits'), + ('bb_link_highScores_url', 'http://%predefined%/groups/56552/id'), + ('wallitem_md_logo_wall_desc', 'Bubble up your wall'), + ('furni_safe_silo*4_desc', 'Totally shatter-proof!'), + ('room_unignore', 'Listen'), + ('nav_venue_sw_lobby_amateur_1/0_desc', ''), + ('poster_16_name', 'Bars'), + ('furni_sofachair_silo*7_name', 'Green Area Armchair'), + ('furni_spyro_name', 'Dragon Egg'), + ('nav_venue_bb_lobby_beginner_19/0_desc', ''), + ('Alert_YourPasswordIsTooShort', 'Passwords must be at least 6 characters long.'), + ('room_cant_trade', 'You cannot trade this!'), + ('furni_door_desc', 'Dr Who?'), + ('gs_button_go_created', 'Join'), + ('poster_49_name', 'Large silver star'), + ('furni_glass_sofa*4_name', 'Glass sofa'), + ('furni_divider_arm3_desc', 'Knock, knock...'), + ('furni_sound_set_31_desc', 'House loops'), + ('reg_habboname', 'Habbo name:'), + ('habboclub_thanks', 'Yippee! You are now a member of Habbo Club! Your current email address is %email%. \\r\\rIf that\'s not the one you are using, please go to \'Update my Habbo ID\' and change it now. \\rThen we can contact you about your membership if need be.'), + ('console_follow_offline', 'Your friend is offline.'), + ('furni_divider_nor1*5_name', 'Pink Ice corner'), + ('nav_openbutton', 'Open'), + ('nav_venue_theatredrome_habbowood/0_desc', 'Home to the Habbowood Gala and HAFTA Awards!'), + ('nav_venue_ice_cafe/0_desc', 'Come here. And chill out.'), + ('furni_calippo_name', 'Calippo icecream machine'), + ('furni_bench_lego_desc', 'For your reserve players'), + ('poster_9_desc', 'Do your bit for the environment'), + ('furni_bed_polyfon_one*3_desc', 'Cot of the artistic'), + ('poster_44_desc', 'Beware the curse...'), + ('poster_2006_name', 'DJ Throne'), + ('furni_pura_mdl3*5_desc', ''), + ('furni_arabian_tray4_name', 'Fruit Tray'), + ('furni_divider_nor3*7_desc', 'Entrance or exit?'), + ('furni_sound_set_30_name', 'Instrumental 1'), + ('furni_romantique_tray1_name', 'Breakfast Tray'), + ('furni_jp_tray1_desc', 'jp_tray1'), + ('furni_plant_maze_desc', 'Build your maze!'), + ('console_getfriendrequest_2', 'If you accept this invitation (s)he will be added to your Friends List. Then you can send messages to each other.'), + ('furni_hockey_light_name', 'Lert'), + ('furni_goodie1_desc', 'Crunchy Dog Treat'), + ('console_getfriendrequest_1', 'has asked you to become his/her Friend.'), + ('furni_pura_mdl2*1_desc', 'Any way you like it!'), + ('score_board.text', 'POINTS'), + ('furni_one_way_door*9_name', 'Red One Way Gate'), + ('furni_sand_cstl_twr_desc', 'sand_cstl_twr desc'), + ('furni_divider_nor5*9_desc', 'Cool cornering for your crib y0!'), + ('furni_duck_desc', 'Every bather needs one'), + ('furni_bardesk_polyfon*2_desc', 'Black Mode Bardesk'), + ('console_request_2', '(S)he will be added into your Friends List if (s)he accepts it.'), + ('bb_link_join', 'Join Team'), + ('nav_createroom_hd', 'Here you can create your own room!'), + ('console_request_1', 'has been sent your Friend Request.'), + ('reg_check_info', 'CHECK YOUR INFO'), + ('furni_toy1*4_name', 'Rubber Ball'), + ('nav_venue_sw_lobby_free_0_name', 'Free Game Lobby'), + ('furni_chair_plasto*1_name', 'Chair'), + ('furni_toilet_name', 'Loo Seat'), + ('queue_set.dc.info', 'Number of Habbos in default queue is %d% and in Habbo Club queue %c%'), + ('furni_sofachair_silo*2_desc', 'Large, but worth it'), + ('furni_chair_plasto*12_desc', 'Hip plastic furniture'), + ('ph_tickets_buyfor', 'Buy Tickets for:'), + ('sound_machine_confirm_close', 'Close the editor?'), + ('furni_rare_fan*1_desc', 'It\'ll blow you away!'), + ('furni_divider_poly3*3_desc', 'Border control!'), + ('nav_venue_kattoterassi/0_desc', 'When push comes to shove...'), + ('furni_summer_grill*4_desc', 'Plenty of burgers on that barbie'), + ('furni_bar_armas_desc', 'It\'s a barrel of laughs and a great talking point'), + ('furni_toilet_red_name', 'Loo Seat'), + ('furni_hc_lmp_desc', 'Be enlightened'), + ('furni_romantique_mirrortabl_name', 'Dressing Table'), + ('furni_pura_mdl4*2_name', 'Pink Pura Module 4'), + ('summer_chair_5_desc', 'Enjoy the summer air'), + ('furni_plant_rose_desc', 'Sleek and chic'), + ('furni_skullcandle_name', 'Skull Candle Holder'), + ('Alert_no_credits', 'You don�t have enough Credits for this.'), + ('pet.hotwords.voice', 'speak'), + ('furni_prizetrophy4*2_desc', 'Shiny silver'), + ('furni_soft_sofachair_norja*4_name', 'Urban Iced Sofachair'), + ('furni_pura_mdl5*1_desc', 'Any way you like it!'), + ('furni_safe_silo*9_name', 'Red Safe Minibar'), + ('furni_bed_trad_desc', 'Sweet dreams for two'), + ('nav_venue_club_massiva_desc', 'Strut your funky stuff!'), + ('furni_rare_dragonlamp*1_desc', 'Out of the deep blue!'), + ('furni_wooden_screen*2_desc', 'Add an exotic touch to your room'), + ('furni_prizetrophy7*1_name', 'Gold Habbo trophy'), + ('furni_carpet_standard*2_name', 'Floor Rug'), + ('furni_arabian_teamk_desc', 'Quench that desert thirst'), + ('furni_romantique_chair*2_name', 'Lime Romantique Chair'), + ('nav_venue_sw_lobby_tournament_0_name', 'Tournament Lobby'), + ('invitation_expired', 'Sorry, all Welcoming Party members were busy.'), + ('gs_error_game_checkname', 'Please check the Game\'s name!'), + ('furni_sound_set_23_name', 'SFX 4'), + ('furni_grand_piano*2_desc', 'Black Grand Piano'), + ('tutorial_quit', 'Close guide'), + ('furni_chair_basic*8_desc', ''), + ('NUF_getting_room_roommatic_security_tutor', 'Finally you can choose the security settings to your room and whether other users can move your furniture.'), + ('nav_venue_bb_lobby_beginner_1/0_desc', ''), + ('nav_private_helptext_hd_main', 'Habbo Guest Rooms'), + ('club_price', 'One month costs 25 Habbo Credits.'), + ('NUF_playing_games_navigator_tutor', 'Click either SnowStorm or BattleBall to open up a list of the game lounges.'), + ('nav_venue_old_skool_name', 'Old Skool Habbo'), + ('nav_venue_bb_lobby_beginner_4_name', 'Beginners Battle Ball 5'), + ('nav_venue_bb_lobby_tournament_9_name', 'Competitie Battle Ball 10'), + ('sound_machine_alert_song_saved', 'Song "%name%" successfully saved.'), + ('nav_venue_sw_lobby_intermediate_3_name', 'Snow Bombardiers Lobby'), + ('nav_venue_club_massiva/1_desc', 'Strut your funky stuff'), + ('furni_gothic_chair*1_name', 'Gothic Chair Pink'), + ('furni_divider_poly3_desc', 'All bars should have one'), + ('furni_romantique_divan*1_name', 'Pink Romantique Divan'), + ('NUF_playing_games_hotelview_tutor', 'Now we find out where to locate the Habbo Games!'), + ('poster_29_name', 'Gold Tinsel Bundle'), + ('furni_present_gen4_name', 'Gift'), + ('furni_bardesk_polyfon*7_name', 'Green Mode Bardesk'), + ('furni_gothic_sofa*6_name', 'Gothic Sofa Blue'), + ('furni_glass_stool*5_name', 'Glass stool'), + ('nav_venue_sw_lobby_free_5/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('nav_fav_hd', 'Your Favourite Rooms.'), + ('NUF_console_read_tutor', 'The Habbo Console lets you message your Habbo friends, and check whether they are online.'), + ('furni_romantique_tray2_desc', 'Spoil Yourself'), + ('Alert_ModeratorWarning', 'Message from a Moderator:'), + ('furni_giftflowers_name', 'Vase of Flowers'), + ('furni_table_silo_small*7_name', 'Green Area Occasional Table'), + ('furni_menorah_name', 'Menorah'), + ('furni_bed_polyfon_one*2_name', 'Black Mode Single Bed'), + ('console_offline', 'Offline'), + ('gs_mouseover_player', '\\x\\r\\yp'), + ('nav_venue_bb_lobby_amateur_3/0_desc', ''), + ('nav_venue_bb_lobby_amateur_13/0_desc', ''), + ('furni_noob_chair*2_name', 'My first Habbo chair'), + ('furni_doormat_plain*1_desc', 'Available in a variety of colours'), + ('object_displayer_hide_tags', 'Hide tags'), + ('poster_17_desc', 'Beautiful reproduction butterfly'), + ('gs_joinedplayers', 'Players Who Joined: \\x'), + ('furni_table_plasto_round*3_name', 'Round Dining Table'), + ('furni_divider_poly3*8_name', 'Yellow Mode Bardesk Gate'), + ('furni_glass_table*4_name', 'Glass table'), + ('furni_solarium_norja*6_desc', 'Rejuvenate your pixels!'), + ('poster_1006_desc', 'The eyes follow you...'), + ('furni_noob_rug*5_name', 'My first Habbo rug'), + ('buddyremove_pagecounter', 'Page'), + ('poll_alert_answer_missing', 'Please give an answer'), + ('furni_summer_chair*5_desc', 'Beige'), + ('furni_table_plasto_4leg*10_name', 'Occasional Table'), + ('furni_divider_silo2_desc', 'Stylish sectioning'), + ('furni_djesko_turntable_desc', 'For the music-lovers'), + ('nav_remrightsconf', 'You are about to remove all rights from your room. This means that only you will have rights to move and place furni in the room.'), + ('furni_pillow*0_name', 'White Lace Pillow'), + ('sound_machine_eject', 'Eject'), + ('gs_button_ready', 'Ready'), + ('furni_divider_silo1*5_name', 'Pink Area Corner Shelf'), + ('NUF_habbo_home_hotelview_tutor', 'You have now opened a page on the Habbo Website that will give you plenty of information about how to make yourself a Habbo Home.'), + ('furni_traffic_light*4_desc', 'Chill and wait your turn!'), + ('nav_venue_$unit.name$/0_desc', 'Roam more of the hotel\'s corridors'), + ('furni_sporttrack1*2_name', 'Sport track straight asphalt'), + ('furni_sofachair_polyfon_girl_name', 'Armchair'), + ('furni_sound_set_6_desc', 'Background ambience loops'), + ('furni_hal_grave_desc', 'We\'re raising the dead!'), + ('recycler_ready_info', 'Your recycled Furniture is ready. Please either accept or cancel. If you accept, you will receive your recycling reward, detailed below. If you cancel, all your old Furniture will be restored to your hand.'), + ('wallitem_jp_sheet1_name', 'jp_sheet1'), + ('furni_petfood2_name', 'Sardines Mega Multipack'), + ('furni_spotlight_name', 'Habbowood Spotlight'), + ('furni_carpet_soft*6_desc', 'Soft Wool Rug'), + ('gs_lounge_skill', 'Level in this Lounge: \\x \\r (\\y-\\z points)'), + ('nav_help_text', 'Click the Public Spaces tab on the top left of this navigator to find gaming rooms!'), + ('furni_table_plasto_4leg*5_name', 'Occasional Table'), + ('nav_venue_bb_arena_1_name', 'Battle Ball Aloittelijat'), + ('furni_table_silo_med*9_name', 'Red Area Coffee Table'), + ('furni_bed_budget_one*2_name', 'Pink Pura Bed'), + ('nav_venue_sw_lobby_expert_2/0_desc', 'Todellisille lumisotureille.'), + ('furni_rubberchair*6_name', 'Violet Inflatable Chair'), + ('furni_bardeskcorner_polyfon*5_name', 'Candy Corner'), + ('bb_powerup_8', 'Vacuum cleaner'), + ('bb_powerup_6', 'Harlequin'), + ('furni_rare_beehive_bulb*2_name', 'Yellow Amber Lamp'), + ('bb_powerup_7', 'Bomb'), + ('furni_divider_nor2_name', 'Ice Bar-Desk'), + ('bb_powerup_4', 'Cannon'), + ('bb_powerup_5', 'Box of pins'), + ('bb_powerup_2', 'Spring'), + ('bb_powerup_3', 'Flashlight'), + ('console_report', 'Report'), + ('bb_powerup_1', 'Light bulb'), + ('furni_sound_set_43_name', 'SFX 1'), + ('poster_37_desc', 'The Hotels girlband. Dream on!'), + ('interface_icon_messenger', 'Messenger, friends & messages on here'), + ('interface_icon_hand', 'Hand, your inventory'), + ('furni_s_sound_machine*4_name', 'Sound Machine Blue'), + ('nav_venue_sunset_cafe_name', 'Sunset Cafe'), + ('wallitem_sw_stone_desc', 'sw_stone'), + ('reg_check_mail', 'Email'), + ('furni_queue_tile1*7_name', 'Purple Habbo Roller'), + ('pet.hotwords.nest', 'sleep'), + ('furni_sound_machine_desc', 'Creating fancy sounds'), + ('cancel', 'Cancel'), + ('furni_hyacinth2_desc', 'Beautiful bulb'), + ('nav_venue_library/0_name', 'Habbo Library'), + ('furni_waterbowl*1_desc', 'Aqua unlimited'), + ('furni_grand_piano*5_desc', 'Why is that key green?'), + ('furni_table_plasto_bigsquare*8_name', 'Square Dining Table'), + ('furni_nouvelle_trax_name', 'nouvelle_trax'), + ('help_choise_header', 'What do you need help with?'), + ('furni_bardeskcorner_polyfon*7_name', 'Green Mode Bardesk Corner'), + ('furni_pillar*4_name', 'Dark Ages Pillar'), + ('furni_queue_tile1*6_desc', 'The power of movement'), + ('club_intro_link', 'Learn more about Habbo Club!'), + ('furni_sandrug_desc', 'Your own paradise island'), + ('poster_10_desc', 'Beautiful sunset'), + ('furni_divider_nor1_name', 'Ice Corner'), + ('nav_venue_bb_lobby_tournament_6_name', 'Competitie Battle Ball 7'), + ('furni_redhologram_desc', 'You\'re her only hope...'), + ('poster_38_name', 'Smiling Headbangerz'), + ('furni_hc_crtn_name', 'Antique Drapery'), + ('furni_barchair_silo*9_name', 'Red Bar Stool'), + ('room_badge_visible', 'Visible'), + ('furni_sleepingbag*8_name', 'Golden Sleeping Bag'), + ('roomevent_invalid_input', 'You must give your event a name and a description.'), + ('furni_chair_plasto*14_name', 'HC chair'), + ('poster_522_desc', 'The flag of Japan'), + ('furni_shelves_norja*2_name', 'Black Bookcase'), + ('nav_venue_dusty_lounge_name', 'Dusty Lounge'), + ('furni_sound_set_53_desc', 'Break the icy silence'), + ('nav_venue_ice_cafe_name', 'Ice Cafe'), + ('click', 'OK to continue to the hotel.'), + ('nav_venue_sw_lobby_free_2/0_desc', ''), + ('furni_rare_dragonlamp*9_name', 'Purple Dragon Lamp'), + ('furni_statue_desc', 'Watch out for those arrows!'), + ('game_battles_turn', 'TURN'), + ('wallitem_jp_sheet3_desc', 'jp_sheet3'), + ('furni_edicehc_desc', 'Click and roll!'), + ('furni_bed_budget*6_name', 'Blue Pura Double Bed'), + ('furni_gothic_sofa*5_desc', 'The dark side of Habbo'), + ('furni_scifirocket*5_desc', 'From the unknown depths of space'), + ('game_poker_ready', 'READY'), + ('furni_queue_tile1*2_name', 'Red Habbo Roller'), + ('furni_rare_parasol_desc', 'Zon! Zon! Zon!'), + ('transaction_system_sms_dna', 'DNA'), + ('furni_bar_polyfon_name', 'Mini-Bar'), + ('furni_grand_piano*1_name', 'Turquoise Grand Piano'), + ('nav_venue_bb_lobby_expert_4_name', 'Experts Battle Ball 5'), + ('bb_link_highscores', 'Highscores'), + ('summer_chair_8_desc', 'The summer winds are creeping in'), + ('reg_parentemail_title2', 'Email address of parent/guardian:'), + ('error_report_explain', 'An error has occurred, please see the error code above.'), + ('console_noprofile', 'Habbo Profile Not Found'), + ('furni_glass_sofa*3_desc', 'Translucent beauty'), + ('furni_romantique_smalltabl*4_desc', 'Why is one leg different?'), + ('furni_table_plasto_4leg*14_name', 'HC table'), + ('nav_venue_bb_lobby_intermediate_2_name', 'Semi-profs Battle Ball 3'), + ('NUF_playing_games_gamerooms_tutor', 'Click the \'Go\' button to go to the Game Lounge.'), + ('habboclub_require_parent_permission', 'You need to tick the box to say that you are over 14 years or age, \\ror under 14 and have your parent/guardian\'s permission to join Habbo Club. \\rPlease go back and tick the box.'), + ('furni_wooden_screen*1_desc', 'Add an exotic touch to your room'), + ('nav_venue_bb_lobby_intermediate_4/0_desc', ''), + ('furni_glass_sofa*6_name', 'Blue Glass Sofa'), + ('furni_bench_armas_desc', 'To complete the dining set'), + ('furni_barchair_silo*2_name', 'Black Bar Stool'), + ('nav_venue_bb_lobby_expert_6/0_desc', ''), + ('furni_jp_tray2_desc', 'jp_tray2'), + ('furni_val_teddy*3_desc', 'The green bear of friendship'), + ('transaction_system_sms_win_vodafone', 'Vodafone SMS'), + ('furni_glass_sofa_name', 'Glass sofa'), + ('console_online', 'online:'), + ('poster_2004_desc', 'irie!'), + ('x', 'X'), + ('nav_venue_habbo_lido/0_desc', 'Pool is open for swimming and diving!'), + ('furni_soft_sofachair_norja_name', 'iced sofachair'), + ('furni_xmas_cstl_twr_name', 'Ice Castle Tower'), + ('nav_venue_park_name', 'Habbo Gardens'), + ('recycler_info_open', 'Ecotron is the place to visit if you want to recycle your old Furniture. Simply drag the old Furni from your hand to the empty slots below. Recyclable items display the green recyclable tag in your hand. Please note that you must own the Furniture for at least %quarantine_hours% hour before they can be recycled. Recycling takes a total of %total_hours% hours.'), + ('group_window_title', 'Habbo Groups'), + ('pet.saying.eat.dog.4', 'Mmmmm..'), + ('game_chess', 'Chess'), + ('pet.saying.eat.dog.2', 'slurp, slurp, slurp'), + ('roomatic_roomdesc', 'Room description:'), + ('furni_sofa_polyfon*7_desc', 'Green Mode Sofa'), + ('pet.saying.eat.dog.3', 'hrum, umm, umm grrr'), + ('pet.saying.eat.dog.0', 'hrum, hrum, crunch!'), + ('preview_downloading', 'Preview downloading...'), + ('sound_machine_confirm_close_long', 'Are you sure you want to leave the editor without saving the song?'), + ('partner_registration_title', 'Hey, I forgot to mention one thing..'), + ('pet.saying.eat.dog.1', 'crunch, crunch mmmm'), + ('nav_venue_bb_lobby_tournament_12/0_desc', ''), + ('furni_carpet_soft*3_name', 'Soft Wool Rug'), + ('furni_sound_set_56_name', 'RnB Grooves 2'), + ('reg_termslink', 'Terms and Conditions'), + ('wallitem_sw_swords_desc', 'Z for Zorro'), + ('furni_sleepingbag*10_name', 'Khaki Sleeping Bag'), + ('furni_hc_dsk_name', 'Study Desk'), + ('furni_chair_silo*8_desc', 'Keep it simple'), + ('furni_glass_chair*8_name', 'Glass chair'), + ('nav_venue_cafe_ole_name', 'Cafe ole'), + ('furni_sleepingbag*5_desc', 'Ultimate coziness'), + ('opening_hours_text_closed', 'The Hotel has been closed and will be open to the public again at %h%:%m%.'), + ('furni_grunge_bench_desc', 'Laid back seating'), + ('BuddyNotHere', 'Offline'), + ('furni_noob_lamp*5_desc', 'Get the light right where you want it (pink)'), + ('NUH_navigator', 'Use the Navigator to move around. There are literally thousands of rooms to explore!'), + ('poster_1338_name', 'Pedobear Seal of Approval'), + ('furni_queue_tile1*9_name', 'Green Habbo Roller'), + ('furni_habboween_crypt_desc', 'What lurks inside?'), + ('furni_sofachair_silo*9_name', 'Red Area Armchair'), + ('furni_exe_chair_name', 'Executive Sofa Chair'), + ('furni_rare_dragonlamp*6_desc', 'Scary and scorching!'), + ('furni_divider_nor2*3_desc', 'Strong, yet soft looking'), + ('furni_tile_yell_name', 'Floor Tiles'), + ('furni_plant_yukka_name', 'Yukka Plant'), + ('furni_wooden_screen*8_desc', 'Add an exotic touch to your room'), + ('furni_pillar*8_desc', 'All roads lead to Rome'), + ('trading_youoffer', 'You offer:'), + ('furni_marquee*8_desc', 'It\'s both door and a shade!'), + ('furni_pura_mdl4*9_name', 'Red Pura Module 4'), + ('roomatic_congrats', 'Congratulations! You\'re now the proud owner of your own Habbo Hotel room.'), + ('furni_tile_marble_name', 'Marble Tile'), + ('furni_bed_budget*3_desc', 'King sized comfort!'), + ('furni_sound_machine*3_desc', 'Top the Habbo Charts!'), + ('nav_venue_bb_lobby_beginner_10_name', 'Beginners Battle Ball 11'), + ('nav_venue_bb_lobby_tournament_1/0_desc', ''), + ('poster_2000_name', 'Suomen kartta'), + ('furni_solarium_norja*3_name', 'Urban Solarium'), + ('furni_present_gen3_desc', 'What\'s inside?'), + ('furni_glass_stool*4_desc', 'Translucent beauty'), + ('int_update_id', 'Update My Habbo ID >>'), + ('nav_venue_bb_lobby_beginner_8/0_desc', ''), + ('furni_carpet_standard*8_desc', 'Available in a variety of colours'), + ('furni_pillar*1_desc', 'Ancient and stately'), + ('receive_invitation_text', 'invites you his/her room. Accept invitation?'), + ('poll_offer_window', 'Welcome to our poll'), + ('furni_table_plasto_bigsquare*5_desc', 'Hip plastic furniture'), + ('furni_carpet_standard*1_desc', 'Available in a variety of colours'), + ('furni_hologram_name', 'Holopod'), + ('nav_venue_bb_lobby_amateur_desc', 'Amateur battle ball!'), + ('furni_barchair_silo*6_desc', 'Practical and convenient'), + ('furni_divider_nor5_desc', 'Cool cornering for your crib y0!'), + ('purse_vouchers_helpbutton', 'More about vouchers >>'), + ('furni_shelves_norja*6_desc', 'For nic naks and art deco books'), + ('nav_venue_sw_lobby_tournament_5/0_desc', ''), + ('furni_chair_basic*4_desc', 'It\'s a cracking design!'), + ('nav_hidefull', 'Hide Full Rooms'), + ('modtool_ban_computer', 'Ban Computer Also'), + ('furni_gothic_sofa*1_name', 'Gothic Sofa Pink'), + ('furni_carpet_standard*b_name', 'Floor Rug'), + ('queue_line', 'You are queueing right now...'), + ('furni_divider_nor1*6_desc', 'Blue Ice corner'), + ('nav_search_helptext', 'Looking for something? Here you can search other Habbo\'s rooms. Type the room name or the name of the Habbo to search for a room.'), + ('furni_marquee*1_desc', 'It\'s both door and a shade!'), + ('furni_rcandleset_desc', 'Simple but stylish'), + ('nav_room_banned', 'You are banned from this room.'), + ('furni_lamp_armas_name', 'Table Lamp'), + ('catalog_costs', '\\x1 costs \\x2 Credits'), + ('furni_drinks_desc', 'Are you a slob too?'), + ('furni_pura_mdl5*6_name', 'Blue Pura Module 5'), + ('summer_chair_1_desc', 'Gotta get up early to get one!'), + ('furni_prize3_desc', 'A weighty award'), + ('furni_soft_sofa_norja*7_name', 'Rural Iced Sofa'), + ('poster_518_name', 'The Welsh flag'), + ('furni_sofachair_polyfon*8_name', 'Yellow Mode Armchair'), + ('furni_prizetrophy3*3_desc', 'Breathtaking bronze'), + ('nav_venue_sw_lobby_amateur_6_name', 'Snow Slingers Lobby'), + ('furni_stand_polyfon_z_desc', 'Tidy up'), + ('furni_carpet_soft_tut_name', 'Welcome Mat'), + ('console_reject_all', 'Reject All'), + ('month12', 'December'), + ('month11', 'November'), + ('help_topics', 'Help Topics:'), + ('nav_venue_sw_lobby_beginner_8/0_desc', ''), + ('nav_rooms_own', 'Own Room(s)'), + ('reg_pwd_note', 'Choose a password that\'s hard to guess! So, don\'t use ANYONES name, or your favorite colour!'), + ('furni_wooden_screen*4_name', 'Golden Oriental Screen'), + ('nav_venue_sw_lobby_beginner_2/0_desc', ''), + ('furni_pillow*6_desc', 'Puffy, soft and huge'), + ('furni_bed_polyfon_one*4_desc', 'Beige Mode Single Bed'), + ('reg_email_note', 'Please enter your e-mail address, this is important! You\'ll only get customer support and special offers via email, if you enter a valid email address and verify it.'), + ('group_admin', 'Administrator'), + ('furni_scifirocket*8_name', 'Pluto Smoke Machine'), + ('furni_chair_plasto*11_desc', 'Hip plastic furniture'), + ('month10', 'October'), + ('furni_goth_table_name', 'Gothic table'), + ('month05', 'May'), + ('month04', 'April'), + ('nav_modify_maxvisitors', 'Choose maximum number of visitors'), + ('nav_venue_bb_lobby_amateur_2_name', 'Gevorderden Battle Ball 3'), + ('month07', 'July'), + ('habboclub_price1', '30'), + ('month06', 'June'), + ('month01', 'January'), + ('month03', 'March'), + ('month02', 'February'), + ('furni_summer_chair*2_desc', 'Pink'), + ('month09', 'September'), + ('month08', 'August'), + ('furni_bardeskcorner_polyfon*4_desc', 'Beige Mode Bardesk Corner'), + ('furni_tree6_name', 'Flashy Christmas Tree'), + ('furni_arabian_snake_name', 'Ornamental Urn'), + ('reg_verification_incorrectPassword', 'Your password was incorrect'), + ('NUF_visting_rooms_hotelview_tutor', 'Here we go again. This time we are learning how to visit another Habbos room.'), + ('furni_summer_chair*9_desc', 'Got your sunglasses?'), + ('furni_safe_silo_name', 'Safe Minibar'), + ('furni_throne_name', 'Throne'), + ('furni_soft_sofachair_norja*8_desc', 'Yellow Iced Sofachair'), + ('NUF_console_ready_tutor', 'You can now use the Console to find some of your friends, or you can continue the tutorial.'), + ('nav_venue_picnic/0_desc', 'Don\'t forget to grab a carrot or two!'), + ('furni_bardeskcorner_polyfon_name', 'Corner Cabinet/Desk'), + ('game_placeship', 'Place your ships:'), + ('furni_glass_table*7_desc', 'Habbo Club'), + ('poster_13_name', 'BW Skyline Poster'), + ('furni_jp_bamboo_name', 'Bamboo Forest'), + ('furni_plant_bulrush_name', 'Bulrush'), + ('furni_deadduck3_desc', 'With added ectoplasm'), + ('win_purse', 'Habbo Purse'), + ('furni_jp_tray5_name', 'jp_tray5'), + ('furni_hc_tbl_desc', 'Perfect for banquets'), + ('furni_shelves_norja_desc', 'For nic naks and art deco books'), + ('club_desc_3_period', '6 Months (186 days) = 105 Credits'), + ('furni_bed_budget_one*3_name', 'Black Pura Bed'), + ('poster_2_name', 'Carrot Plaque'), + ('furni_solarium_norja*7_desc', 'Fun in the sun!'), + ('poster_2007_name', 'The Father Of Habbo'), + ('gs_header_teams', 'Teams'), + ('furni_divider_poly3*9_desc', 'Border Control!'), + ('gs_button_creategame', 'Create A New Game'), + ('furni_sound_set_42_name', 'Haunted Mansion'), + ('poll_alert_invalid_selection', 'Please select fewer alternatives'), + ('furni_scifirocket*1_name', 'Saturn Smoke Machine'), + ('furni_scifidoor*10_name', 'Violet Spaceship Door'), + ('furni_sound_set_5_desc', 'The dark side of Habbo'), + ('club_confirm_gift_title', 'You have received a Habbo club gift!'), + ('bb_info_gamePrice', 'Play now for just 2 tickets.'), + ('furni_sound_machine*6_name', 'Purple Traxmachine'), + ('wallitem_arabian_swords_desc', 'Not for yielding'), + ('furni_divider_nor2*6_name', 'Blue Iced bar desk'), + ('nav_venue_sw_lobby_expert_0/0_desc', ''), + ('furni_noob_chair*1_name', 'My first Habbo chair'), + ('group_room_link', 'Group\'s room: %room_name% >>>'), + ('sound_machine_playlist', 'Playlist'), + ('nav_venue_bb_arena_2_name', 'Battle Ball Amatöörit'), + ('roomatic_create_error', 'Error in room creation process. Please try again!'), + ('furni_couch_norja*7_desc', 'Two can perch comfortably'), + ('gs_button_spectate', 'Watch Game!'), + ('furni_sofachair_silo*6_desc', 'Blue Area Armchair'), + ('credit_redeem_button', 'Redeem'), + ('furni_valentinescreen_desc', 'Peep through and smile!'), + ('poster_511_name', 'The Dutch flag'), + ('furni_shelves_armas_name', 'Bookcase'), + ('nav_venue_habbo_lido_name', 'Habbo Lido'), + ('furni_bed_polyfon*9_name', 'Red Double Bed'), + ('furni_sofa_silo*9_name', 'Red Area Sofa'), + ('furni_pura_mdl4*6_desc', 'Any way you like it!'), + ('console_mainhelptext', 'You can use the Habbo Console to keep in constant contact with your friends using instant messages.'), + ('wallitem_jp_ninjastars_name', 'Ninja Stars'), + ('ad_note', 'Clicking this advertisement will open a new window'), + ('ph_tickets_choise2', 'Buy 20 Tickets for 6 Credits.'), + ('ph_tickets_choise1', 'Buy 2 Tickets for 1 Credit.'), + ('reg_day', 'Day'), + ('nav_venue_cunning_fox_gamehall/2_name', 'Noughts&Crosses'), + ('nav_venue_sw_lobby_tournament_6_name', 'Tournament Lobby'), + ('furni_noob_lamp*1_name', 'My first Habbo lamp'), + ('furni_petfood1_name', 'Bones Mega Multipack'), + ('furni_table_silo_med*3_name', 'White Coffee Table'), + ('pet.hotwords.jump', 'jump'), + ('furni_sleepingbag*1_name', 'Red Sleeping Bag'), + ('nav_venue_main_lobby/0_desc', 'The heart of Habbo Hotel'), + ('pet_hungry', 'Hunger:'), + ('furni_rare_fan*4_name', 'SUPERLOVE Fan'), + ('furni_sw_table_name', 'sw_table'), + ('furni_CFC_200_moneybag_name', 'Sack of Credits (China)'), + ('room_ask_friend', 'Ask to be a Friend'), + ('furni_bed_polyfon*2_name', 'Black Mode Double Bed'), + ('furni_table_norja_med_desc', 'Elegance embodied'), + ('nav_removerights', 'Reset'), + ('wallitem_hrella_poster_1_name', 'Porthole'), + ('NUF_getting_items_purse_', 'Click this link to open the Habbo Credits page in the website window.'), + ('poster_31_name', 'System of a Ban'), + ('furni_sound_set_24_name', 'Habbo Sounds 4'), + ('furni_chair_basic*7_name', 'chair_basic'), + ('poster_56_name', 'Disco Sign'), + ('furni_rare_dragonlamp*2_name', 'Jade Dragon Lamp'), + ('furni_gothic_stool*4_desc', 'Witches and Warlocks'), + ('furni_sofa_silo*2_name', 'Black Two-Seater Sofa'), + ('furni_grunge_radiator_name', 'Radiator'), + ('nav_venue_bb_lobby_amateur_9_name', 'Gevorderden Battle Ball 10'), + ('summer_chair_4_name', 'White Deck Chair'), + ('furni_sound_set_49_name', 'Club 4'), + ('messenger.email.subject', ''), + ('furni_romantique_chair*3_name', 'Turquoise Romantique Chair'), + ('furni_s_sound_machine*7_desc', 'Sound Machine Red'), + ('furni_table_plasto_round*9_desc', 'Hip plastic furniture'), + ('furni_table_plasto_4leg*7_name', 'Occasional table'), + ('club_confirm_title', 'You are about to subscribe to Habbo Club. Wise choice!'), + ('furni_romantique_pianochair*1_desc', 'Here sat the legend of 1900'), + ('furni_sofa_silo*6_desc', 'Blue Area Sofa'), + ('nav_venue_bb_lobby_tournament_11_name', 'Competitie Battle Ball 12'), + ('furni_rare_icecream*9_desc', 'Virtual bubblegum rocks!'), + ('furni_romantique_divider*1_name', 'Rose Quartz Screen'), + ('NUF_playing_games_room_ruleslink', 'Click me! But only if you want to read the game FAQs in the website.'), + ('furni_chair_silo_name', 'Dining Chair'), + ('furni_sound_set_17_desc', 'Jive\'s Alive!'), + ('dance_choose', 'Choose Dance'), + ('wallitem_industrialfan_name', 'Industrial Turbine'), + ('sound_machine_alert_invalid_song_length', 'Can\'t burn an empty song!'), + ('furni_pura_mdl1*4_desc', 'Any way you like it!'), + ('wallitem_post.it.vd_desc', 'Heart Stickies'), + ('catalog_give_petname', 'Type your pet\'s name in the grey box.'), + ('furni_pura_mdl2*1_name', 'Aqua Pura Module 2'), + ('poster_24_name', 'Hole In The Wall'), + ('win_error', 'Notice!'), + ('furni_chair_plasto*2_desc', 'Hip plastic furniture'), + ('wallitem_xmas_light_desc', 'Xmas light'), + ('furni_rubberchair*1_name', 'Blue Inflatable Chair'), + ('NUF_getting_room_roommatic_details_tutor', 'Give a name to your room, choose a category and add a description. Don\'t worry, you can change it all later.'), + ('furni_divider_poly3*2_desc', 'Black Mode Bardesk Gate'), + ('furni_plant_valentinerose*2_desc', 'Your secret love'), + ('furni_table_norja_med*7_desc', 'For larger gatherings'), + ('furni_carpet_polar_desc', 'For cuddling up on'), + ('nav_venue_sw_lobby_free_8/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('furni_summer_grill*1_name', 'Blue Barbeque Grill'), + ('furni_chair_norja*7_desc', 'Sleek and chic for each cheek'), + ('furni_joulutahti_name', 'Poinsetta'), + ('furni_exe_table_name', 'Executive Desk'), + ('furni_divider_silo3*8_desc', 'Form following function'), + ('furni_gothiccandelabra_name', 'Gothic Candelabra'), + ('transaction_system_bibit', 'Credit card'), + ('nav_venue_tv_studio/0_desc', 'Sponsored by Bobbanet.com'), + ('furni_noob_table*4_desc', 'Lightweight, practical and light blue'), + ('furni_bardesk_polyfon*3_desc', 'Perfect for work or play'), + ('room_info_rated', 'Room rating:'), + ('nav_venue_bb_lobby_beginner_2/0_desc', ''), + ('help_emergency_explanation', 'If you are experiencing a situation which is making you feel uncomfortable or unsafe, please give details below and a member of community staff will reply as soon as possible.'), + ('furni_divider_nor5*8_desc', 'Cool cornering for your crib y0!'), + ('poster_507_name', 'The French Tricolore'), + ('nav_privateRooms', 'Rooms'), + ('furni_pura_mdl2*5_desc', ''), + ('furni_sporttrack3*3_name', 'Sport goal grass'), + ('furni_sound_set_10_desc', 'Made from real Boy Bands!'), + ('furni_chair_plasto*9_desc', 'Hip plastic furniture'), + ('furni_soft_sofa_norja*4_desc', 'Sit back and relax'), + ('furni_s_sound_machine*3_name', 'Sound Machine Green'), + ('reg_spam', 'Yes, I want to get the occasional email from the Hotel Manager.'), + ('shout', 'Shout'), + ('NUF_mini_use_console_read_link', 'Click here to view the message.'), + ('furni_scifidoor*2_desc', 'There out of this world!'), + ('furni_divider_nor3*3_name', 'White Iced Gate'), + ('pet_hung_0', 'Empty'), + ('furni_table_plasto_square*1_name', 'Occasional Table'), + ('pet_hung_6', 'Stuffed'), + ('pet_hung_5', 'Full'), + ('bb_user_skill', 'Skill Level: \\x\\rScore: \\y'), + ('login_welcome', 'Welcome'), + ('pet_hung_2', 'Rumbling'), + ('pet_hung_1', 'Hungry'), + ('poster_20_name', 'Bars'), + ('pet_hung_4', 'Satisfied'), + ('pet_hung_3', 'Peckish'), + ('Alert_WrongNameOrPassword', 'Wrong name or password - please try again!'), + ('furni_romantique_pianochair*5_desc', 'I can feel air coming through...'), + ('furni_carpet_armas_desc', 'Adds instant warmth'), + ('console_removefriend_2', 'from your Friends List?'), + ('console_removefriend_1', 'Are you sure you want to remove'), + ('furni_rare_parasol*0_name', 'Green Parasol'), + ('furni_sound_set_38_name', 'Rock 6'), + ('NUF_mini_meet_people_room_wave', 'These buttons let you wave and dance. Click on your Habbo at anytime to see these buttons.'), + ('gs_skill_changed_header', 'Congratulations!'), + ('furni_chair_plasty*7_name', 'Plastic Pod Chair'), + ('furni_safe_silo*5_desc', 'Totally shatter-proof!'), + ('furni_divider_silo1*3_name', 'White Corner Shelf'), + ('nav_venue_hallway_ii_name', 'Hallway II'), + ('cam_release.help', 'Cancel Photo'), + ('nav_venue_bb_lobby_amateur_14/0_desc', ''), + ('habbo_tv_title', 'Widescreen Habbovision'), + ('purse_noevents', 'You haven\'t made any transactions yet. Click the button below to find out how to get Habbo Credits.\\rRemember: you must ask your parents permission before you buy Habbo Credits.'), + ('furni_pura_mdl2*8_name', 'yellow pura module 2'), + ('furni_CFC_10_coin_bronze_name', 'Bronze Coin (China)'), + ('sound_machine_song_remove', 'Remove song'), + ('modtool_choose_length', 'Choose Length:'), + ('sound_machine_turn_off', 'Switch Off'), + ('furni_pura_mdl1*8_desc', ''), + ('furni_spyro_desc', 'The stuff of legend'), + ('furni_pillow*2_name', 'Red Silk Pillow'), + ('furni_table_armas_desc', 'For informal dining'), + ('furni_tree3_desc', 'Any presents under it yet?'), + ('object_displayer_link_looks', 'Change avatar looks'), + ('furni_barrier*2_name', 'White Road Barrier'), + ('furni_gothic_chair*5_desc', 'The dark side of Habbo'), + ('furni_divider_nor4*4_name', 'Urban Iced Shutter'), + ('furni_camera_name', 'Camera'), + ('next_arrows', 'Next >>'), + ('furni_sound_set_60_desc', 'Love and affection!'), + ('furni_bed_polyfon_girl_one_name', 'Single Bed'), + ('NUF_mini_meet_people_user_chatfield', 'Start typing here and press \'Enter\' to chat with others.'), + ('successfully_purchase_gift_for', 'Successfully purchased gift for user %user%!'), + ('poster_49_desc', 'All that glitters...'), + ('furni_glass_table*3_name', 'Glass table'), + ('furni_divider_silo3*5_desc', 'Pink Area Gate'), + ('furni_divider_arm3_name', 'Gate (lockable)'), + ('furni_table_plasto_4leg*3_name', 'Round Dining Table'), + ('roomatic_roomnumber', 'Room number:'), + ('nav_venue_bb_lobby_beginner_5_name', 'Beginners Battle Ball 6'), + ('reg_nameAndPassTooSimilar', 'Your name and password are too similar'), + ('nav_venue_theatredrome_easter_name', 'Theatredrome Easter'), + ('nav_venue_bb_lobby_beginner_11/0_desc', ''), + ('furni_fireplace_polyfon_name', 'Fireplace'), + ('queue_set.e1.info', 'There are %e1% Habbos in front of you in the queue.'), + ('more_info_link', 'Redeem Now'), + ('furni_bed_polyfon*6_desc', 'Blue Mode Double Bed'), + ('furni_rare_icecream*5_name', 'Vanilla Ice Cream Machine'), + ('poster_500_name', 'Union Jack'), + ('furni_chair_norja*3_name', 'White Iced Chair'), + ('furni_sound_set_31_name', 'Dance 3'), + ('furni_pura_mdl3*5_name', 'beige pura module 3'), + ('furni_sporttrack2*3_desc', 'null'), + ('furni_sound_set_46_desc', 'De bada bada bo!'), + ('poster_9_name', 'Rainforest Poster'), + ('furni_romantique_pianochair*4_name', 'Amber Piano Stool'), + ('poster_515_desc', 'Waved by Swedes everywhere'), + ('furni_scifidoor*9_desc', 'There out of this world!'), + ('furni_chair_plasty*3_name', 'Plastic Pod Chair'), + ('furni_table_plasto_round*5_name', 'Round Dining Table'), + ('furni_one_way_door*9_desc', 'One at a time!'), + ('furni_calippo_desc', 'Basic model'), + ('furni_footylamp_desc', 'Can you kick it?'), + ('furni_one_way_door*2_desc', 'One way! The HC way!'), + ('furni_arabian_tray4_desc', 'Sweet, juicy and ripe'), + ('furni_divider_nor3*7_name', 'Rural Iced gate'), + ('furni_couch_norja*3_name', 'White Iced Bench'), + ('furni_pillow*9_name', 'Green Wooly Pillow'), + ('game_chooseside', 'Choose your side'), + ('start', 'Start'), + ('furni_toy1*4_desc', 'it\'s bouncy-tastic'), + ('roomevent_host', 'Host:'), + ('nav_venue_rooftop_rumble_name', 'Rooftop Rumble'), + ('nav_venue_bb_lobby_expert_0/0_desc', ''), + ('nav_venue_rooftop_rumble_ii/0_desc', 'Are you ready?'), + ('error_report_trigger_message', 'Last message ID'), + ('furni_sofachair_silo*2_name', 'Black Armchair'), + ('furni_noob_chair*5_desc', 'Lightweight, practical, with pink stripes'), + ('pet_frnd_0', 'Hostile'), + ('furni_noob_rug*3_name', 'My first Habbo rug'), + ('pet_frnd_2', 'Suspicious'), + ('pet_frnd_1', 'Angry'), + ('furni_scifiport*6_desc', 'Energy beams. No trespassers!'), + ('pet_frnd_4', 'Calm'), + ('pet_frnd_3', 'Cool'), + ('pet_frnd_6', 'Warm'), + ('pet_frnd_5', 'Friendly'), + ('pet_frnd_8', 'Loving'), + ('credit_trade_value', 'Includes credit furnis worth %value% credits.'), + ('pet_frnd_7', 'Affectionate'), + ('pet_frnd_9', 'Loyal'), + ('NUF_getting_items_purse_tutor', 'Your Purse tells you how many Habbo Credits you have. If you have a voucher code you can redeem it here by clicking the \'Vouchers\' button.'), + ('furni_chair_norja*6_name', 'Blue Chair'), + ('sound_machine_alert_machine_full', 'You already have 4 Traxpacks loaded. Eject one before adding a new Traxpack.'), + ('nav_venue_club_mammoth/0_desc', 'Monumental and magnificent. For Habbo Club members only.'), + ('NUF_getting_room_hand_tutor', 'This is your hand. It contains all your furniture. I have given you a rug so that you can place it in your room- click and drag it to set it down.'), + ('reg_check_name', 'Name'), + ('furni_glass_stool*7_name', 'Green Glass Stool'), + ('poster_504_name', 'The Bundesflagge'), + ('poster_42_desc', 'Not something you want to run into'), + ('pet.saying.sleep.dog.6', '*dreaming*'), + ('pet.saying.sleep.dog.5', 'Zzzzz wuff! zzzzz'), + ('pet.saying.sleep.dog.4', 'hrrrrr...murrmm..'), + ('furni_pura_mdl4*2_desc', 'Any way you like it!'), + ('pet.saying.sleep.dog.3', 'bzz.. oof oof'), + ('furni_sofa_silo*5_name', 'Pink Area Sofa'), + ('pet.saying.sleep.dog.2', 'hrrr.. hrrr'), + ('pet.saying.sleep.dog.1', 'bzz.. bzzzzz'), + ('furni_petfood4_name', 'T-Bones Mega Multipack'), + ('nav_venue_club_mammoth_name', 'Club Mammoth'), + ('ph_keys_dive', 'Diving moves:'), + ('furni_noob_table*3_name', 'My first Habbo table'), + ('furni_romantique_divan*5_desc', 'Is that a cape hanging there?'), + ('furni_table_plasto_round*8_name', 'Round Dining Table'), + ('furni_rare_fan*1_name', 'Blue Powered Fan'), + ('reg_forcedupdate2', 'Update your Habbo info'), + ('furni_table_plasto_square*4_name', 'Square Dining Table'), + ('NUF_playing_games', 'Playing games'), + ('furni_prizetrophy2*2_name', 'Duck trophy'), + ('reg_forcedupdate3', 'The Habbo Hotel management requires all Habbos to read and agree to the service Terms and Conditions. It won\'t take long.\\rJust go through the registration, check your info and agree to the new terms. Thank you!'), + ('nav_venue_sw_lobby_tournament_2_name', 'Tournament Lobby'), + ('furni_carpet_standard*4_name', 'Floor Rug'), + ('furni_s_sound_machine*6_name', 'Sound Machine Purple'), + ('furni_prizetrophy5*1_desc', 'Glittery gold'), + ('furni_table_plasto_square_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_beginner_2_name', 'Beginners Battle Ball 3'), + ('furni_rubberchair*4_name', 'Ocean Inflatable Chair'), + ('furni_divider_poly3*5_desc', 'Keep the Pink in!'), + ('furni_arabian_teamk_name', 'Tea Maker'), + ('room_name', 'Room:'), + ('nav_venue_chill/0_desc', 'Come chill in the Zen Garden!'), + ('furni_summer_grill*4_name', 'Green Barbeque Grill'), + ('poster_1001_desc', 'even walls have ears'), + ('furni_rare_icecream*8_name', 'Peppermint Ice Cream Machine'), + ('furni_safe_silo*9_desc', 'Totally shatter-proof!'), + ('sound_machine_song_save', 'Save song'), + ('NUF_getting_room_navigator_ownrooms', 'Click the \'Own Room(s)\' tab to see your rooms.'), + ('furni_gothic_chair*1_desc', 'The dark side of Habbo'), + ('furni_table_plasto_square*8_name', 'Square Dining Table'), + ('furni_safe_silo*2_desc', 'Totally shatter-proof!'), + ('roomevent_create_description', 'Describe your event'), + ('purse_vouchers_success', 'Voucher was successfully redeemed. You have the Credits.'), + ('furni_gothic_carpet2_name', 'Dungeon Floor'), + ('furni_sofa_polyfon*3_name', 'White Two-seater Sofa'), + ('furni_romantique_tray2_name', 'Treats Tray'), + ('nav_modify_doorstatus_locked', 'Locked (visitors have to ring the bell)'), + ('NUF_visiting_rooms_categorylist_open', 'Click the \'Open\' button to open a category.'), + ('room_doorbell', 'Rings the doorbell - Open the door?'), + ('furni_sound_set_45_name', 'Lost_Beatness'), + ('nav_deleteroom', 'Delete'), + ('furni_barchair_silo_name', 'Bar Stool'), + ('furni_chair_plasto*5_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_tournament_14_name', 'Competitie Battle Ball 15'), + ('furni_pura_mdl1*1_desc', 'Any way you like it!'), + ('furni_rare_snowrug_desc', 'Chilled Elegance'), + ('poster_35_desc', 'The Hotel\'s girlband. Dream on!'), + ('furni_glass_stool_desc', 'Translucent beauty'), + ('furni_rare_fan*8_name', 'Habbo Wind Turbine'), + ('furni_menorah_desc', 'Light up your room'), + ('furni_table_silo_small*7_desc', 'Green Area Occasional Table'), + ('furni_divider_silo1*7_name', 'Green Area Corner Shelf'), + ('furni_romantique_divan*1_desc', 'null'), + ('furni_table_plasto_round*1_name', 'Round Dining Table'), + ('reg_changeEmail', 'Change your email'), + ('hobba_mark_normal', 'Send To Helpers'), + ('nav_venue_bb_lobby_tournament_8/0_desc', ''), + ('ph_tickets_have2', 'Tickets'), + ('nav_venue_sw_lobby_intermediate_0/0_desc', ''), + ('ph_tickets_have1', 'You Have'), + ('furni_bardesk_polyfon*7_desc', 'Green Mode Bardesk'), + ('console_inprivateroom', 'In A Guest Room'), + ('furni_sound_set_35_name', 'Dance 6'), + ('GoAway', 'Leave The Room'), + ('room_kick', 'Kick'), + ('furni_rubberchair*8_name', 'Black Inflatable Chair'), + ('poster_6_name', 'Abstract Poster'), + ('hubu_t1_3', ''), + ('NUF_meeting_people', 'Meeting people'), + ('nav_venue_bb_lobby_amateur_4/0_desc', ''), + ('nav_venue_bb_game/0_name', 'Battle Ball Arena'), + ('furni_pudding_name', 'Christmas Pudding'), + ('furni_tile_red_name', 'Floor Tiles'), + ('catalog_typeurname', 'Type your greetings here\\r(don\'t forget to put your name!):'), + ('furni_house2_name', 'Gingerbread House'), + ('hubu_t1_1', 'Kaupunkien pu_t2_2=Katso onko kotisi l_1=Tietoa Hubusta'), + ('furni_glass_table*4_desc', 'Translucent beauty'), + ('hubu_t1_2', ''), + ('nav_venue_club_massiva/1_name', 'Chill-out Room'), + ('furni_scifiport*2_desc', 'Get in the ring!'), + ('furni_traffic_light*4_name', 'Yellow Traffic Light'), + ('furni_tree2_name', 'Old Christmas Tree'), + ('furni_noob_stool*4_name', 'My first Habbo stool'), + ('done', 'Done'), + ('furni_goodie1*1_name', 'Marzipan Man'), + ('nav_venue_bb_lobby_tournament_18/0_desc', ''), + ('poster_17_name', 'Butterfly Cabinet 1'), + ('furni_summer_chair*5_name', 'Deck Chair'), + ('furni_prizetrophy*1_name', 'Classic trophy'), + ('furni_easterduck_desc', 'Can you tell what it is yet?'), + ('furni_barrier*3_desc', 'No trespassing, please!'), + ('furni_table_plasto_bigsquare*1_name', 'Square Dining Table'), + ('club_general_infolink', 'More Info About Habbo Club >>'), + ('furni_chair_silo*4_name', 'Beige Silo Dining Chair'), + ('roomatic_givename', 'Give your room a name!'), + ('furni_rare_icecream*1_name', 'Blueberry Ice Cream Machine'), + ('roomatic_open', 'Door open'), + ('NUF_getting_items_catalogue_tutor', 'Big! You can browse the products by clicking on the categories. There are loads of different types of furniture to decorate your room.'), + ('furni_marquee*4_name', 'Yellow Marquee'), + ('furni_bed_polyfon_one*7_name', 'Green Mode Single Bed'), + ('gs_button_go_started', 'Watch'), + ('poster_27_name', 'Holly Bundle 3'), + ('furni_divider_nor2*7_desc', 'No way through'), + ('furni_glass_chair*5_desc', 'Translucent beauty'), + ('nav_venue_basement_lobby_name', 'Basement Lobby'), + ('pick_furniture', 'Put Furni In Hand'), + ('nav_venue_bb_lobby_beginner_18/0_desc', ''), + ('furni_pura_mdl2*4_name', 'White Pura Module 2'), + ('club_status_title', 'You are currently a member of Habbo Club.'), + ('furni_rare_elephant_statue_name', 'Golden Elephant'), + ('furni_toy1*1_desc', 'it\'s bouncy-tastic'), + ('reg_doneheader', 'Congratulations!\\rYou\'re a Habbo!'), + ('furni_present_gen6_name', 'Gift'), + ('furni_noob_chair*2_desc', 'Lightweight, practical, with dark blue stripes'), + ('furni_sofachair_silo*5_name', 'Pink Area Armchair'), + ('BuddyNow', 'now:'), + ('furni_pura_mdl5*3_desc', 'Any way you like it!'), + ('furni_prizetrophy6*1_name', 'Champion trophy'), + ('BuddyEntry', 'On Hotel View'), + ('furni_scifiport*9_desc', 'Energy beams. No trespassers!'), + ('furni_table_polyfon_small_desc', 'For serving a stylish latte'), + ('furni_exe_rug_name', 'Executive Rug'), + ('nav_venue_the_dirty_duck_pub_name', 'The Dirty Duck Pub'), + ('nav_venue_bb_lobby_beginner_9_name', 'Beginners Battle Ball 10'), + ('nav_venue_sw_lobby_beginner_5_name', 'Snow Rookies Lobby'), + ('furni_pura_mdl5*2_name', 'Pink Pura Module 5'), + ('furni_bardeskcorner_polyfon*7_desc', 'Green Mode Bardesk Corner'), + ('alert_donate_content', 'The other Habbo has not put anything into the trade. Are you sure you want to give away your furni?'), + ('furni_hc_rllr_name', 'HC Rollers Set'), + ('furni_divider_nor1_desc', 'Looks squishy, but isn\'t'), + ('furni_nouvelle_trax_desc', ''), + ('wallitem_jp_sheet3_name', 'jp_sheet3'), + ('furni_hyacinth2_name', 'Blue Hyacinth'), + ('furni_sound_machine_name', 'Sound Machine'), + ('console_getmessage_sender', 'Sender:'), + ('furni_sandrug_name', 'Tropical Beach Rug'), + ('nav_updatenote_header', 'Note!'), + ('furni_pillar*4_desc', 'From the time of the Kick Warz'), + ('furni_waterbowl*1_name', 'Red Water Bowl'), + ('furni_grand_piano*5_name', 'Onyx Grand Piano'), + ('furni_redhologram_name', 'Holo-girl'), + ('sound_machine_alert_playlist_full', 'Could not save playlist! Playlists can have only %count% songs.'), + ('nav_rooms_search', 'Search'), + ('nav_venue_cunning_fox_gamehall/5_name', 'Poker'), + ('nav_venue_habbo_lido_ii_name', 'Habbo Lido II'), + ('furni_barchair_silo*9_desc', 'Practical and convenient'), + ('pet_nature', 'Nature:'), + ('furni_wood_tv_name', 'Large TV'), + ('poster_2008_desc', 'Once every four Habbo years!'), + ('poster_38_desc', 'For really TOUGH Habbos!'), + ('nav_venue_bb_lobby_expert_0_name', 'Expert'), + ('furni_chair_plasto*14_desc', 'Aqua chair'), + ('furni_queue_tile1*6_name', 'Blue Habbo Roller'), + ('poster_522_name', 'The flag of Japan'), + ('furni_chair_basic*3_name', 'Black Pura Egg Chair'), + ('nav_venue_pizza_desc', 'Tunnelmallinen pizzapaikka kiireettömään nautiskeluun.'), + ('furni_jp_tray6_desc', 'jp_tray6'), + ('furni_hc_btlr_desc', 'Your personal caretaker'), + ('furni_song_disk_desc', 'Burn, baby burn'), + ('furni_deadduck2_name', 'Dead Duck 2'), + ('furni_statue_name', 'Cupid Statue'), + ('furni_scifirocket*5_name', 'Uranus Smoke Machine'), + ('nav_gobutton', 'Go'), + ('recycler_furni_not_recyclable', 'This Furniture cannot be recycled. Please only use Furniture that has the recyclable tag in your hand.'), + ('furni_gothic_sofa*5_name', 'Green Gothic Sofa'), + ('furni_sound_set_32_desc', 'Piano concert set'), + ('furni_chair_plasto*10_name', 'Chair'), + ('nav_venue_bb_lobby_tournament_2_name', 'Competitie Battle Ball 3'), + ('furni_grand_piano*1_desc', 'Turquoise Grand Piano'), + ('buddyremove_windowheader', 'Your friends list is full.'), + ('furni_pillar*0_name', 'Greek Pillar'), + ('gs_title_countdown', 'Game Is About To Begin'), + ('furni_glass_sofa*3_name', 'Glass sofa'), + ('furni_hc_crtn_desc', 'Topnotch privacy protection'), + ('furni_waterbowl*5_desc', 'Aqua unlimited'), + ('furni_table_silo_small*4_desc', 'Beige Area Occasional Table'), + ('furni_jp_tray2_name', 'jp_tray2'), + ('furni_rare_moonrug_desc', 'Desolation rocks!'), + ('furni_val_teddy*3_name', 'Green Share Bear'), + ('furni_sleepingbag*10_desc', 'Ultimate coziness'), + ('furni_bar_polyfon_desc', 'You naughty Habbo!'), + ('furni_sofachair_polyfon*2_desc', 'Black Mode Armchair'), + ('furni_exe_sofa_name', 'Executive 3-Seater Sofa'), + ('furni_divider_silo1*4_desc', 'Beige Area Corner Shelf'), + ('poster_2004_name', 'Rasta Poster'), + ('furni_bench_armas_name', 'Bench'), + ('furni_soft_sofachair_norja_desc', 'Soft iced sofachair'), + ('nav_venue_bb_lobby_beginner_14_name', 'Beginners Battle Ball 15'), + ('gs_button_rejoin', 'Play again!'), + ('furni_marquee*8_name', 'Ultramarine Marquee'), + ('furni_tile_marble_desc', 'Slick sophistication; now 10% off!'), + ('hubu_info_url_1', 'http://www.habbohotel.co.uk/habbo/en/help/12'), + ('console_requests', 'Friend Request(s)'), + ('furni_sleepingbag*4_name', 'Army Sleeping Bag'), + ('furni_plant_yukka_desc', 'Easy to care for'), + ('NUF_getting_room_own_rooms_createroom', 'Empty? That\'s because you don\'t have any rooms yet. If it isn\'t empty then you already have made a room, which makes me wonder...'), + ('furni_glass_sofa*6_desc', 'Translucent beauty'), + ('ph_exit', 'Exit In Normal Clothes'), + ('pet_race_0_024', 'Black-eyed Boxer'), + ('furni_marquee*7_name', 'Purple Marquee'), + ('pet_race_0_023', 'Dotty Dalmatian'), + ('recycler_info_timeout', 'Your recycling was completed, but you did not accept it in time. Please press the cancel button below to have your recyclable items restored to your hand. To recycle these items you will need to begin the process again.'), + ('pet_race_0_022', 'Schnitzel Snatcher'), + ('hubu_info_url_2', 'http://www.talktofrank.com/'), + ('pet_race_0_021', 'Loyal Labrador'), + ('nav_venue_snowwar_lobby/0_desc', 'Snow Storm LobbyCome and be a Snow Stormer!'), + ('pet_race_0_020', 'Patchy Pup'), + ('furni_chair_plasto*8_name', 'Chair'), + ('furni_sofachair_silo*9_desc', 'Red Area Armchair'), + ('nav_venue_bb_lobby_beginner_17/0_desc', ''), + ('furni_hc_dsk_desc', 'For Habbo scholars'), + ('furni_wooden_screen*8_name', 'Night Blue Oriental Screen'), + ('gs_lounge_skill_no_min', 'No minimum'), + ('summer_chair_8_name', 'Yellow Deck Chair'), + ('gs_score_tie', 'The game ended in a tie!'), + ('nav_people', 'Who\'s in here?'), + ('furni_gothic_sofa*2_desc', 'Stylish seating for two'), + ('furni_summer_chair*8_name', 'Yellow Deck Chair'), + ('roomatic_roomname', 'Room name:'), + ('furni_ham_desc', 'Tuck in'), + ('nav_venue_star_lounge_desc', 'Is there a VIP visitor in the hotel?'), + ('furni_bardeskcorner_polyfon*3_name', 'White Corner Desk'), + ('gs_specnum', 'Number of spectators: \\x'), + ('furni_bed_budget*3_name', 'Black Pura Double Bed'), + ('furni_shelves_norja*6_name', 'Blue Bookcase'), + ('partner_registration_link', 'Finish registration'), + ('furni_pillar*1_name', 'Pink Marble Pillar'), + ('reg_olderage', 'I am 11 or older'), + ('furni_glass_stool*4_name', 'Glass stool'), + ('back', 'Back'), + ('furni_tile_yell_desc', 'In a choice of colours'), + ('club_confirm_text3', 'Buy more and pay less: 6 Months (186 days) of Habbo Club cost only 105 Credits. You have %credits% credits in your Purse.\\r\\r After buying the membership, you will immediately be part of the Habbo VIP Community.'), + ('furni_sofa_silo_desc', 'Cushioned, understated comfort'), + ('club_confirm_text1', '1 Habbo Club Month (31 days) costs 25 Credits. You have %credits% Credits in your Purse.\\r\\r After buying the membership, you will immediately be part of the Habbo VIP Community.'), + ('club_confirm_text2', 'Buy more and pay less: 3 Months (93 days) of Habbo Club cost only 60 Credits. You have %credits% credits in your Purse.\\r\\r After buying the membership, you will immediately be part of the Habbo VIP Community.'), + ('furni_carpet_legocourt_name', 'Basketball Court'), + ('furni_present_gen3_name', 'Gift'), + ('furni_sound_set_2_desc', 'Get the party started!'), + ('furni_barchair_silo*6_name', 'Blue Bar Stool'), + ('furni_arabian_bigtb_name', 'Amanjena Table'), + ('interface_icon_catalog', 'Catalogue, furnishing your room'), + ('furni_hologram_desc', 'As if by magic...'), + ('nav_venue_sw_lobby_expert_1/0_desc', ''), + ('furni_carpet_standard*1_name', 'Floor Rug'), + ('nav_owner', 'Owner'), + ('furni_glass_chair*2_desc', 'Translucent beauty'), + ('furni_rcandleset_name', 'Red Candle Plate'), + ('furni_divider_nor1*6_name', 'Blue Ice corner'), + ('nav_private_helptext_hd', 'Rooms'), + ('furni_sound_set_27_name', 'Groove 2'), + ('furni_drinks_name', 'Empty Cans'), + ('pet.saying.eat.cat.0', 'mmm...thumm, thumm'), + ('gs_title_nextround', 'Next game...'), + ('pet.saying.eat.cat.1', 'lap, lap, lap, lap'), + ('furni_scifirocket*9_desc', 'Something fishy is going on...'), + ('pet.saying.eat.cat.2', '*munch, munch*'), + ('pet.saying.sleep.dog.0', 'zzZZZzzz'), + ('furni_noob_lamp*4_name', 'My first Habbo lamp'), + ('nav_venue_sw_lobby_beginner_8_name', 'Snow Rookies Lobby'), + ('nav_venue_library/0_desc', 'Time to catch up on some studying'), + ('camera_dialog_open', 'Shoot'), + ('furni_lamp_armas_desc', 'Ambient lighting is essential'), + ('buddyremove_pleasewait', 'Please wait a second...'), + ('friend_request_options', 'Advanced options.'), + ('transaction_system_web_internal', 'Housekeeping purchase'), + ('furni_rare_dragonlamp*5_name', 'Elf Green Dragon Lamp'), + ('furni_bar_chair_armas_desc', 'The ultimate recycled furniture'), + ('room_ignore', 'Shutup'), + ('poster_518_desc', 'A fiery dragon for your wall'), + ('furni_soft_sofa_norja*7_desc', 'Sit back and relax'), + ('object_displayer_show_tags', 'Show tags'), + ('furni_goth_table_desc', 'The dark side of Habbo'), + ('club_txt_changesubscr', 'Change subscription'), + ('Alert_RememberSetYourPassword', 'Please check your password'), + ('reg_verification_checking', 'Checking...'), + ('furni_silo_studydesk_desc', 'For the true Habbo Scholars'), + ('room_give_rights', 'Give rights'), + ('furni_CF_50_goldbar_name', 'Gold Bar'), + ('furni_rom_lamp_name', 'Crystal Lamp'), + ('furni_sofachair_polyfon*8_desc', 'Yellow Mode Armchair'), + ('furni_deadduck3_name', 'Dead Duck 3'), + ('furni_bed_polyfon_one*4_name', 'Beige Mode Single Bed'), + ('furni_noob_stool*1_desc', 'Unfold me and take the weight off (orange)'), + ('furni_stand_polyfon_z_name', 'Shelf'), + ('furni_prize3_name', 'Bronze Trophy'), + ('club_status_text', 'Here you can see your Habbo Club membership status, number of elapsed months, pre-ordered months and status of the ongoing month.'), + ('furni_table_plasto_bigsquare*9_desc', 'Hip plastic furniture'), + ('furni_wooden_screen*4_desc', 'Add an exotic touch to your room'), + ('furni_sound_set_52_name', 'Christmas Party'), + ('furni_CF_1_coin_bronze_name', 'Bronze Coin'), + ('furni_tile_brown_name', 'Red Tile'), + ('nav_venue_bb_lobby_intermediate_5/0_desc', ''), + ('nav_venue_picnic/0_name', 'Picnic Garden'), + ('furni_sound_set_50_desc', 'The harder generation'), + ('furni_lamp2_armas_name', 'Lodge Candle'), + ('registration_disabled_text', 'You can\'t create new Habbos at the moment. Please try again [some date]..'), + ('catalog_selectproduct', 'Select product:'), + ('transaction_system_sms_telia', 'Telia'), + ('nav_venue_bb_lobby_intermediate_5_name', 'Semi-profs Battle Ball 6'), + ('furni_christmas_sleigh_name', 'Winter Sleigh'), + ('furni_scifirocket*8_desc', 'From a space far, far away!'), + ('furni_bed_budget*9_name', 'Red Pura Double Bed'), + ('poster_2000_desc', 'Suomen kartta'), + ('help_emergency_whathappens', 'A member of community staff will investigate the situation and take appropriate action. This may include sending you a response with advice on dealing with your issue.'), + ('purse_coins', 'Habbo Credits'), + ('furni_marquee*5_desc', 'It\'s both door and a shade!'), + ('club_txt_whatis', 'What is Habbo Club?'), + ('furni_present_gen2_name', 'Gift'), + ('trading', 'Trading'), + ('furni_sofa_silo*9_desc', 'Red Area Sofa'), + ('furni_summer_chair*9_name', 'Red Deck Chair'), + ('furni_shelves_armas_desc', 'For all those fire-side stories'), + ('purse_buy_coins', 'Buy Credits'), + ('room_confirmPlace', 'Are you sure?'), + ('furni_queue_tile1*3_desc', 'The power of movement'), + ('furni_soft_sofachair_norja*8_name', 'Yellow Iced Sofachair'), + ('furni_arabian_snake_desc', 'Beware the snake!'), + ('nav_venue_sw_lobby_tournament_6/0_desc', ''), + ('NUF_about_hotel', 'What\'s Habbo about?'), + ('furni_bardeskcorner_polyfon_desc', 'Tuck it away'), + ('furni_bardeskcorner_polyfon*4_name', 'Beige Mode Bardesk Corner'), + ('poster_13_desc', 'Arty black and white'), + ('nav_venue_bb_lobby_beginner_9/0_desc', ''), + ('nav_modify_nameshow', 'Show your name in the room info'), + ('NUF_mini_use_console_read_next', 'Click \'OK\' to mark message as read.'), + ('poster_1005_desc', 'The muscly movie hero'), + ('wallitem_jp_sheet2_name', 'jp_sheet2'), + ('furni_xmas_cstl_gate_desc', 'Let that icy draft out!'), + ('NUF_groups_url', 'http://d16-1.web.varoke.net/home/group-tutorial'), + ('furni_jp_irori_name', 'Irori'), + ('furni_jp_bamboo_desc', 'Watch out for pandas!'), + ('furni_christmas_reindeer_name', 'Reindeer'), + ('furni_glass_chair*4_name', 'Glass chair'), + ('furni_jp_tray5_desc', 'jp_tray5'), + ('furni_table_plasto_4leg*4_desc', 'Hip plastic furniture'), + ('NUF_getting_items_catalogue_purse', 'Click to open your Purse and find out how to get some Habbo Credits . You can use these to buy stuff!'), + ('furni_hc_tbl_name', 'Nordic Table'), + ('furni_bed_budget_one*6_name', 'Blue Pura Bed'), + ('furni_solarium_norja*7_name', 'Rural Solarium'), + ('console_newmessages', 'New Message(s)'), + ('poster_2_desc', 'Take pride in your veg!'), + ('furni_xmas_cstl_twr_desc', 'All I see from up here is snow!'), + ('hubu_info', 'Welcome to the FRANK Infobus! For the next three months FRANK advisors who know a lot about drugs, their effects and the risks involved, will be stepping aboard the Infobus to offer advice and support to any Habbo that wants to visit the bus. For more information click the link below:'), + ('furni_bardesk_polyfon*6_name', 'Blue Mode Bardesk'), + ('furni_summer_pool*3_name', 'Green Summer Pool'), + ('furni_pura_mdl3*8_name', 'yellow pura module 3'), + ('furni_valentinescreen_name', 'Holiday Romance'), + ('furni_rare_beehive_bulb*1_desc', 'A honey-hued glow'), + ('gs_link_gamerules', 'Game Rules'), + ('nav_venue_bb_lobby_tournament_11/0_desc', ''), + ('sound_machine_song_info', 'Song Info'), + ('wallitem_arabian_swords_name', 'Ancestral Scimitars'), + ('furni_one_way_door*6_desc', 'One way! The HC way!'), + ('furni_table_plasto_round*2_desc', 'Hip plastic furniture'), + ('credit', 'Credit'), + ('gs_lounge_skill_no_max', 'Infinite'), + ('furni_wall_china_desc', 'For your great wall'), + ('NUF_visiting_rooms_roomlist_add to fav', 'After clicking on a room you can click this button here to add it to favourites.'), + ('furni_carpet_polar*3_name', 'Yellow Bear Rug'), + ('poster_46_desc', 'Twinkle, twinkle'), + ('furni_petfood1_desc', 'Fantastic 20% Saving!'), + ('url_nobalance', 'http://%predefined%/credits?'), + ('furni_sofachair_silo*6_name', 'Blue Area Armchair'), + ('furni_noob_chair*1_desc', 'Lightweight, practical and yellow'), + ('nav_venue_bb_lobby_expert_7/0_desc', ''), + ('furni_pura_mdl1*7_name', 'Green Pura Module 1'), + ('furni_table_silo_small*6_name', 'Blue Area Occasional Table'), + ('club_thanks_title', 'Congratulations! You are now a member of Habbo Club.'), + ('furni_legotrophy_name', 'Basketball Trophy'), + ('roomatic_createyrown', 'Create Your Own Room'), + ('console_report_remove', 'Remove'), + ('furni_sound_set_42_desc', 'Bumps and Chills'), + ('furni_divider_nor5*5_desc', 'Cool cornering for your crib y0!'), + ('furni_rare_icecream*2_desc', 'Virtual pistachio rocks!'), + ('furni_pura_mdl4*6_name', 'Blue Pura Module 4'), + ('club_button_close', 'Close Window'), + ('wallitem_md_can_name', 'Bubble Juice Can'), + ('furni_prizetrophy7_desc', 'Palkinto'), + ('nav_venue_cunning_fox_gamehall/2_desc', 'Keep your head down, it\'s bombs away'), + ('poster_28_desc', '10 x Silver Tinsel'), + ('furni_rare_dragonlamp*2_desc', 'Oriental beast of legends'), + ('furni_glass_sofa*2_name', 'Glass sofa'), + ('modtool_hours', 'Hours'), + ('nav_venue_emperors_name', 'Emperor\'s hall'), + ('catalog_buyingSuccesfull', 'Buying Successful!'), + ('console_concurrency_error', 'There was a concurrency error while modifying friend list'), + ('furni_table_silo_med*3_desc', 'Wipe clean and unobtrusive'), + ('furni_sleepingbag*8_desc', 'Ultimate coziness for SnowStorm winners'), + ('poster_508_desc', 'The flag of Spain'), + ('furni_goodie1*2_desc', 'Crunchy Dog Treat'), + ('nav_venue_sw_lobby_free_3/0_desc', ''), + ('furni_chair_basic*7_desc', ''), + ('room_take_rights', 'Remove Rights'), + ('furni_hc_bkshlf_desc', 'For the scholarly ones'), + ('furni_bed_polyfon*2_desc', 'Black Mode Double Bed'), + ('furni_table_plasto_4leg_name', 'Occasional Table'), + ('furni_bed_budget*7_desc', 'King sized comfort!'), + ('win_partner_registration', 'Partner registration'), + ('summer_chair_4_desc', 'Please tan responsably'), + ('furni_table_norja_med_name', 'Coffee Table'), + ('nav_venue_club_massiva/2_desc', 'Make all the right moves'), + ('furni_divider_silo1_desc', 'Neat and natty'), + ('hobba_send_reply', 'Send Alert'), + ('shopping_nocash', 'You don\'t have enough Credits in your Purse.\\r Click \'OK\' to see the different ways of\\rgetting Habbo Credits.'), + ('furni_divider_poly3*9_name', 'Red Hatch'), + ('furni_rare_fountain*1_desc', 'For our feathered friends'), + ('poster_56_desc', 'Serious partying going on!'), + ('furni_scifiport*6_name', 'White Sci-Fi Port'), + ('furni_rclr_garden_desc', 'Self watering'), + ('furni_arabian_tray1_desc', 'Tea for every occasion'), + ('furni_rare_fountain*3_name', 'Bird Bath (blue)'), + ('furni_romantique_pianochair*1_name', 'Rose Quartz Piano Stool'), + ('furni_romantique_divider*1_desc', 'Beauty lies within'), + ('wallitem_post.it.vd_name', 'Heart Stickies'), + ('wallitem_torch_desc', 'The dark side of Habbo'), + ('roomatic_namedisplayed', 'Do you want your name to be displayed with the room?'), + ('furni_grunge_candle_name', 'Candle Box'), + ('furni_sound_set_17_name', 'Groove 3'), + ('furni_prizetrophy3*2_name', 'Globe trophy'), + ('furni_chair_silo_desc', 'Keep it simple'), + ('nav_venue_sw_lobby_beginner_7/0_desc', ''), + ('nav_venue_sw_lobby_beginner_3/0_desc', ''), + ('furni_hc_trll_name', 'Drinks Trolley'), + ('furni_bed_polyfon_one*7_desc', 'Green Mode Single Bed'), + ('furni_chair_plasto*2_name', 'Chair'), + ('furni_pura_mdl1*4_name', 'White Pura Module 1'), + ('furni_gothiccandelabra_desc', 'The dark side of Habbo'), + ('NUH_chat', 'Click here and type to chat to other Habbos.'), + ('furni_plant_valentinerose*2_name', 'White Valentine Rose'), + ('reg_privacypledge', 'Privacy Pledge'), + ('furni_exe_table_desc', 'Take a memo, Featherstone'), + ('hubu_info_link2', 'FRANK Website'), + ('furni_prizetrophy4*3_name', 'Fish trophy'), + ('furni_hc_chr_desc', 'Royal comfort'), + ('hubu_info_link1', 'FRANK Infobus Information'), + ('sound_machine_your_songs', 'Traxmachine Songs'), + ('furni_active_placeholder_name', 'This furniture is downloading...'), + ('furni_divider_silo3*8_name', 'Yellow Area Gate'), + ('NUF_visiting_rooms_categorylist_tutor', 'There are so many Guest Rooms we thought it would be a "hoot" to divide them into categories. Select a category to view its contents.'), + ('furni_sofa_silo*6_name', 'Blue Area Sofa'), + ('club_extend_failed', 'Sorry, we were unable to process the purchase. No Credits were charged!'), + ('furni_soft_sofa_norja*4_name', 'Urban Iced Sofa'), + ('furni_sporttrack3*3_desc', 'null'), + ('furni_sound_set_1_name', 'Habbo Sounds 1'), + ('furni_pura_mdl2*5_name', 'beige pura module 2'), + ('nav_venue_sw_lobby_intermediate_1/0_desc', ''), + ('furni_safe_silo*8_name', 'Yellow Safe Minibar'), + ('trading_agrees', 'agrees'), + ('alert_needpermission', 'You need your parent or guardian\'s permission to spend time in Habbo Hotel.'), + ('nav_modify', 'Modify'), + ('furni_noob_stool*4_desc', 'Unfold me and take the weight off (light blue)'), + ('catalog_length_trophymsg', 'Oops, your inscription is too long, so it won\'t fit on the trophy. \\rPlease type something shorter.'), + ('furni_s_sound_machine*3_desc', 'Sound Machine Green Desc'), + ('club_member', 'Member'), + ('modtool_ban_ip', 'Ban IP Also'), + ('bb_link_gamerules', 'Spelregels'), + ('furni_carpet_armas_name', 'Hand-Woven Rug'), + ('furni_rubberchair*5_desc', 'Soft and tearproof!'), + ('furni_table_plasto_square*1_desc', 'Hip plastic furniture'), + ('furni_divider_nor3*3_desc', 'Do go through...'), + ('nav_venue_habburger\'s/0_desc', 'Get food here!'), + ('reg_linkstitle', 'Full version of the documents:'), + ('roomevent_browser_title', 'Events'), + ('roomatic_security', 'Security'), + ('furni_table_plasto_4leg*7_desc', 'Hip plastic furniture'), + ('furni_table_plasto_round*14_desc', 'Hip plastic furniture'), + ('furni_sound_set_38_desc', 'Rock and Roses!'), + ('furni_rare_parasol*0_desc', 'Block those rays!'), + ('furni_pura_mdl3*6_desc', 'Any way you like it!'), + ('NUF_console', 'Learn about messaging'), + ('poster_45_name', 'Skeleton'), + ('furni_pura_mdl3*9_desc', 'Any way you like it!'), + ('pet_age', 'Age:'), + ('poster_48_name', 'Large gold star'), + ('open', 'Open'), + ('gs_3min', '3min'), + ('wallitem_habw_mirror_name', 'Habbowood Mirror'), + ('furni_carpet_polar*4_desc', 'Snuggle up on a Funky bear rug...'), + ('furni_table_armas_name', 'Dining Table'), + ('sw_gameprice', 'Play now for just 2 tickets!'), + ('furni_divider_nor5*4_name', 'Urban Iced Angle'), + ('navigator', 'Hotel Navigator'), + ('furni_pillow*2_desc', 'Puffy, soft and huge'), + ('purse_vouchers_checking', 'Checking code, please wait...'), + ('furni_noob_rug*4_desc', 'Nice and neat sisal rug with light blue edging'), + ('furni_safe_silo*5_name', 'Pink Safe Minibar'), + ('nav_venue_the_dirty_duck_pub/0_desc', 'The perfect place to chill!'), + ('furni_CFC_10_coin_bronze_desc', 'Worth 10 Credits'), + ('furni_teleport_door_desc', 'Magic doorway to anywhere!'), + ('furni_bardesk_polyfon_name', 'Bar/desk'), + ('login_password', 'Password'), + ('furni_pura_mdl2*8_desc', ''), + ('furni_divider_nor4*4_desc', 'Habbos, roll out!'), + ('furni_rare_fan*7_name', 'Brown Powered Fan'), + ('furni_bed_polyfon_girl_one_desc', 'Snuggle down in princess pink'), + ('club_general_elapsed', 'Elapsed Months'), + ('nav_venue_sw_lobby_free_1_name', 'Free Game Lobby'), + ('furni_gothic_chair*5_name', 'Green Gothic Chair'), + ('furni_sink_name', 'Sink'), + ('furni_bed_budget_one*4_desc', 'Prince sized comfort!'), + ('Alert_ForgotSetPassword', 'Please check your password'), + ('furni_chair_plasto*6_desc', 'Hip plastic furniture'), + ('furni_carpet_standard_desc', 'Available in a variety of colours'), + ('reg_update_text2', 'Only change them when you want to make sure that nobody can know or guess your password.'), + ('furni_arabian_swords_desc', 'Not for yielding'), + ('furni_divider_silo3*5_name', 'Pink Area Gate'), + ('furni_fireplace_polyfon_desc', 'Comfort in stainless steel'), + ('furni_glass_table*3_desc', 'Translucent beauty'), + ('furni_summer_pool*4_desc', 'Fancy a dip?'), + ('poster_500_desc', 'The UK flag'), + ('poster_1004_name', 'Eid Mubarak Poster'), + ('furni_rare_icecream*5_desc', 'Virtual vanilla rocks!'), + ('furni_one_way_door*2_name', 'Black HC Gate'), + ('furni_chair_plasty*3_desc', 'Hip plastic furniture'), + ('club_end_title', 'Your Habbo Club membership has now expired.'), + ('furni_table_polyfon_desc', 'For larger gatherings'), + ('furni_romantique_pianochair*4_desc', 'I can feel air coming through...'), + ('furni_bardesk_polyfon*3_name', 'White Bardesk'), + ('predefined_room_description', '%user_name% has entered the building'), + ('poster_53_desc', 'whack that ball!'), + ('poster_515_name', 'The Swedish flag'), + ('furni_rope_divider_desc', 'Rope Divider'), + ('furni_chair_norja*3_desc', 'Sleek and chic for each cheek'), + ('furni_scifidoor*9_name', 'Blue Spaceship Door'), + ('furni_goodie2_name', 'Chocolate Mouse'), + ('game_poker_logoff', 'Left the game'), + ('furni_bed_polyfon_desc', 'Give yourself space to stretch out'), + ('furni_table_plasto_round*5_desc', 'Hip plastic furniture'), + ('furni_couch_norja*3_desc', 'Two can perch comfortably'), + ('pet.saying.sleep.cat.2', 'Purrr... rrrr'), + ('pet.saying.sleep.cat.1', 'mrrrr..rrrr..'), + ('pet.saying.sleep.cat.0', 'hrrrrr....Mrrrrr'), + ('login_ok', 'OK'), + ('gs_button_expand', 'Expand Window'), + ('pet.saying.sleep.cat.4', 'mrrrr...muew..mrr'), + ('tutorial_next', 'Next:'), + ('pet.saying.sleep.cat.3', 'hurrr..hurrr'), + ('furni_jp_tatami_desc', 'Shoes off please'), + ('hobba_sent_to_moderators', 'Call re-assigned non-emergency, still visible to moderators'), + ('roomatic_choosecategory', ''), + ('wallitem_guitar_v_desc', 'tilulilulii'), + ('NUF_groups', 'Groups'), + ('bb_link_gameRules_url', 'http://%predefined%/groups/56552/id'), + ('nav_venue_theatredrome_halloween_name', 'Theatredrome Habboween'), + ('bb_buyTicketsButton', 'Buy tickets'), + ('furni_gothgate_desc', 'The dark side of Habbo'), + ('game_poker_waiting', 'Change done.\\rWaiting for the other players'), + ('furni_glass_stool*7_desc', 'Habbo Club'), + ('club_end_text', 'BUT, don\'t worry, you can still buy another month of Habbo Club and keep all your Habbo Club benefits,special Furni gifts and the shiny badge!'), + ('furni_sound_set_18_desc', 'Listen while you tan'), + ('furni_sound_set_35_desc', 'Groovelicious'), + ('furni_prizetrophy2*2_desc', 'Shiny silver'), + ('furni_plant_valentinerose*3_desc', 'Relight your passions'), + ('furni_romantique_divan*5_name', 'Onyx Chaise-Longue'), + ('furni_chair_norja*6_desc', 'Sleek and chic for each cheek'), + ('wallitem_hrella_poster_2_desc', 'For those scary Lido moments'), + ('furni_s_sound_machine*6_desc', 'Sound Machine Purple'), + ('game_bs_miss', 'Miss:'), + ('furni_carpet_standard*4_desc', 'Available in a variety of colours'), + ('furni_pura_mdl1*1_name', 'Aqua Pura Module 1'), + ('furni_rare_icecream*8_desc', 'Virtual peppermint rocks!'), + ('furni_petfood4_desc', 'Fantastic 20% Saving!'), + ('furni_table_silo_small*3_name', 'White Occasional Table'), + ('furni_table_plasto_round*8_desc', 'Hip plastic furniture'), + ('furni_chair_polyfon_desc', 'Metallic seating experience'), + ('furni_exe_drinks_desc', 'Give a warm welcome'), + ('nav_createroom', 'Create Own Room'), + ('furni_table_plasto_bigsquare*14_desc', 'Hip plastic furniture'), + ('poster_1001_name', 'Prince Charles Poster'), + ('furni_CF_20_moneybag_name', 'Sack of Credits'), + ('furni_prizetrophy5*1_name', 'Duo trophy'), + ('alert_reg_email', 'Email'), + ('pet_thirsty', 'Thirst:'), + ('nav_error_passwordtooshort', 'The password is too short.'), + ('nav_venue_sw_lobby_free_7_name', 'Free Game Lobby'), + ('furni_plant_valentinerose*5_name', 'Purple Valentine Rose'), + ('recycler_status_info', 'You have Furniture in recycling. The icon will blink when recycling is complete.'), + ('poster_52_name', 'Hockey Stick'), + ('win_doorbell', 'Doorbell'), + ('Unreadmessages', 'New Message(s)'), + ('furni_queue_tile1*9_desc', 'The power of movement'), + ('furni_rare_snowrug_name', 'Snow Rug'), + ('console_approve_selected', 'Accept selected'), + ('pet_race_0_009', 'Hound of Hull'), + ('poster_35_name', 'The Habbo Babes 1'), + ('pet_race_0_008', 'Springy Spaniel'), + ('furni_sofa_polyfon*3_desc', 'Comfort for stylish couples'), + ('furni_basket_name', 'Basket Of Eggs'), + ('pet_race_0_007', 'Slobber Don'), + ('pet_race_0_006', 'Stripy Setter'), + ('pet_race_0_005', 'Paws Forethought'), + ('pet_race_0_004', 'Droopy of Pawford'), + ('furni_barchair_silo_desc', 'Practical and convenient'), + ('furni_noob_lamp*2_desc', 'Get the light right where you want it (dark blue)'), + ('pet_race_0_003', 'Rescue Bernard'), + ('furni_glass_stool_name', 'Glass stool'), + ('pet_race_0_002', 'Joe Cocker Spaniel'), + ('pet_race_0_001', 'Habbo Husky'), + ('pet_race_0_000', 'Yappy Yorkie'), + ('NUF_mini_endtopic_step1_questionmark', 'Click to see our help menu and find our FAQs!'), + ('furni_sound_set_28_desc', 'Head for the pit!'), + ('nav_private_norooms', 'You dont have any rooms - create one?'), + ('furni_table_plasto_square*4_desc', 'Hip plastic furniture'), + ('furni_val_teddy*6_name', 'Blue Share Bear'), + ('furni_noob_table*3_desc', 'Lightweight, practical and aubergine'), + ('gs_state_finished', 'This Game is already over!'), + ('furni_rare_fan*8_desc', 'Stylish, Eco-Energy!'), + ('reg_parentemail_link_url1', 'http://%predefined%//help/parents_guide.html'), + ('furni_gothic_carpet2_desc', 'What lies beneath?'), + ('furni_rare_fan*5_desc', 'It\'ll blow you away!'), + ('modtool_kickuser', 'Kick User'), + ('furni_divider_silo1*7_desc', 'Green Area Corner Shelf'), + ('reg_parentemail_link_url2', 'http://%predefined%//footer_pages/privacy_policy.html'), + ('pet_race_0_019', 'Tiny Terrier'), + ('pet_race_0_018', 'Bushy Woofer'), + ('pet_race_0_017', 'Speckled Sheepdog'), + ('furni_rubberchair*8_desc', 'Soft and tearproof for HC!'), + ('pet_race_0_016', 'Murmurin\' Minimastiff'), + ('poster_42_name', 'Spiderweb'), + ('pet_race_0_015', 'Pixie Poodle'), + ('furni_safe_silo*2_name', 'Black Safe Minibar'), + ('pet_race_0_014', 'Whiffy Woofy'), + ('pet_race_0_013', 'Mangy Mutt'), + ('nav_publicRooms', 'Public Spaces'), + ('pet_race_0_012', 'Tawny Bleugh'), + ('pet_race_0_011', 'Lappy Lassie'), + ('pet_race_0_010', 'Furry McScottie'), + ('game_bs_toast', 'Toast!'), + ('furni_prizetrophy6_name', 'Pokaali'), + ('furni_pudding_desc', 'Will you get the lucky sixpence?'), + ('furni_tile_red_desc', 'In a choice of colours'), + ('nav_venue_sw_arena_expert_name', 'Playing expert game'), + ('pet.saying.sleep.croco.0', 'Zzzz... zzzzz...'), + ('poster_50_desc', 'flap, flap, screech, screech...'), + ('furni_shelves_norja*9_name', 'Red Bookcase'), + ('furni_sound_set_4_name', 'Ambient 1'), + ('furni_exe_s_table_desc', 'Get a clear reflection!'), + ('furni_present_gen6_desc', 'What\'s inside?'), + ('furni_one_way_door*5_name', 'Pink One Way Gate'), + ('nav_search_hd', 'Search rooms by Habbo name or room name.'), + ('poster_20_desc', 'high security for your room'), + ('buddyremove_messenger_updating', 'The console is updating, try again in a minute... Everything else is working fine!'), + ('pet.saying.sleep.croco.3', ':)'), + ('furni_house2_desc', 'Good enough to eat'), + ('pet.saying.sleep.croco.4', '*Snuh snuh*'), + ('tutorial_offtopic', 'Oops! You got off the topic. Please restart or select a new topic.'), + ('pet.saying.sleep.croco.1', 'Yrgh... Yrgh...'), + ('jukebox_now_playing', 'Now playing:'), + ('pet.saying.sleep.croco.2', 'Frgh... Frgh...'), + ('furni_sound_set_25_desc', 'Actually, it\'s Partay!'), + ('club_intro_header', 'Welcome to Habbo Club, the members-only club that all VIP Habbos belong to!'), + ('nav_venue_sw_lobby_amateur_3/0_desc', 'Astetta rankempaa lumisotaa.'), + ('pet.saying.sleep.croco.5', 'Rawwwwwwwwrrrm...'), + ('pet.saying.sleep.croco.6', 'Mmmm... Hooks...'), + ('furni_table_plasto_bigsquare*1_desc', 'Hip plastic furniture'), + ('nav_venue_sw_lobby_free_4_name', 'Free Game Lobby'), + ('alert_warning', 'Moderator says:'), + ('furni_barrier*3_name', 'Red Road Barrier'), + ('nav_venue_floatinggarden_name', 'Floating Garden'), + ('gs_error_nocredits', 'You need Habbo Credits to play a Game!'), + ('furni_chair_plasto*5_name', 'Chair'), + ('furni_tree2_desc', 'Old Christmas Tree'), + ('furni_bed_budget_one*7_desc', 'Prince sized comfort!'), + ('furni_romantique_clock_name', 'romantique_clock'), + ('room_banner_text', ''), + ('furni_sleepingbag*2_desc', 'Ultimate coziness'), + ('furni_divider_nor4*3_name', 'White Iced Auto Shutter'), + ('jukebox_song_remaining', 'Remaining time: %time%'), + ('reg_note_text', 'Never change your password or email\\rif someone else asks you to - they will\\rsteal your furni and Credits!'), + ('habbo_hand_next', '>>>'), + ('nav_venue_orient/0_desc', 'Tres chic with an Eastern twist. For Habbo Club members only.'), + ('furni_easterduck_name', 'Wannabe bunny'), + ('login_forgottenPassword', 'Forgotten your password?'), + ('furni_prizetrophy*1_desc', 'Glittery gold'), + ('hubu_t2_2', ''), + ('hubu_t2_3', 'Vapaa-ajan linkkejä'), + ('decision_cancel', 'Cancel'), + ('nav_venue_bb_lobby_tournament_2/0_desc', ''), + ('furni_samovar_desc', 'Click for a refreshing cuppa'), + ('furni_rcandle_name', 'Red Candle'), + ('furni_waterbowl*4_name', 'Blue Water Bowl'), + ('furni_table_norja_med*7_name', 'Rural Iced Coffee Table'), + ('NUF_playing_games_room_tutor', 'See some people wandering around? They are psyching themselves up for a game. Game Tickets are usually 2 Habbo Credits, but in this room the games are free.'), + ('furni_doormat_love_name', 'Doormat'), + ('bb_link_tournament_highScores_url', 'http://%predefined%//groups/56552/id'), + ('furni_sofachair_polyfon*4_name', 'Beige Mode Armchair'), + ('error_room_full', 'Huone on täynnä.'), + ('furni_chair_silo*4_desc', 'Beige Silo Dining Chair'), + ('furni_divider_nor2*7_name', 'Rural Iced Bar'), + ('hubu_t2_1', ''), + ('furni_divider_nor1*9_name', 'Red Ice corner'), + ('furni_wooden_screen*0_name', 'White Oriental Screen'), + ('furni_chair_basic*1_desc', ''), + ('gs_choose_gamename', 'Enter A Name For Your Game:'), + ('poll_question_number', 'Question %number%/%count%'), + ('furni_hc_rllr_desc', 'Highest class transportation'), + ('furni_table_plasto_4leg*15_desc', 'Hip plastic furniture'), + ('furni_scifiport*9_name', 'Violet Sci-Fi Port'), + ('furni_jukebox*1_desc', 'For your Happy Days!'), + ('furni_red_tv_desc', 'Don?t miss those soaps'), + ('furni_song_disk_name', 'Traxdisc'), + ('reg_agree_alert', 'You have to agree to the terms of service\\r(tick the box).'), + ('furni_summer_chair*1_desc', 'Got your swimming trunks?'), + ('poster_2008_name', 'Habbo Leap Day Poster'), + ('poster_505_desc', 'The Canadian flag'), + ('group_homepage', 'Groups\' Homepage >>>'), + ('furni_table_silo_med*6_desc', 'Blue Area Coffee Table'), + ('nav_venue_tearoom/0_name', 'Chinese Tea Room'), + ('dimmer_use_bg_only', 'Background only'), + ('furni_divider_poly3*4_name', 'Beige Mode Bardesk Gate'), + ('nav_venue_hotel_kitchen/0_desc', 'Beware the flying knives!'), + ('furni_divider_silo1*8_desc', 'Neat and natty'), + ('furni_hc_btlr_name', 'Electric Butler'), + ('furni_wooden_screen*5_name', 'Gray Oriental Screen'), + ('furni_scifiport*8_name', 'Purple Sci-Fi Port'), + ('furni_carpet_standard*5_name', 'Floor Rug'), + ('trading_offers', 'offers:'), + ('furni_prizetrophy2*3_name', 'Duck trophy'), + ('transaction_system_club_habbo', 'Habbo Club payment'), + ('nav_venue_bb_lobby_tournament_9/0_desc', ''), + ('poster_517_name', 'The Scottish flag'), + ('furni_wood_tv_desc', 'For family viewing'), + ('furni_deadduck2_desc', 'Someone forgot to feed me...'), + ('furni_sound_set_20_desc', 'Musical heaven'), + ('sound_machine_new', 'Create a New Song'), + ('nav_venue_the_chromide_club/0_desc', 'Ghetto Fabulous'), + ('nav_modify_doorstatus_pwagain', 'pw again:'), + ('furni_chair_plasto*10_desc', 'Hip plastic furniture'), + ('gs_idlewarning', 'You will be replaced if you don\'t start or join a Game soon!'), + ('purse_vouchers_entercode', 'Enter code here:'), + ('sound_machine_song_name', 'Untitled Trax'), + ('furni_sofa_polyfon*4_name', 'Beige Mode Sofa'), + ('furni_carpet_standard*a_name', 'Floor Rug'), + ('poster_510_name', 'The Italian flag'), + ('furni_table_plasto_square*7_name', 'Square Dining Table'), + ('furni_noob_chair*6_desc', 'Lightweight, practical with dark yellow stripes'), + ('forgottenpw_whatyou', 'What\'s your Habbo called?'), + ('nav_venue_bb_lobby_amateur_1_name', 'Gevorderden Battle Ball 2'), + ('furni_noob_table*6_name', 'My first Habbo table'), + ('furni_pillar*0_desc', 'Classy architect, for holding up ceilings!'), + ('poster_1002_desc', 'aw, bless...'), + ('furni_divider_arm1_desc', 'Good solid wood'), + ('furni_glass_stool*8_name', 'Glass stool'), + ('furni_rare_moonrug_name', 'Moon Patch'), + ('nav_venue_rooftop_rumble/0_desc', 'Are you ready?'), + ('transaction_system_sms_sonera', 'Sonera'), + ('furni_waterbowl*5_name', 'Brown Water Bowl'), + ('furni_sound_set_32_name', 'Instrumental 2'), + ('furni_table_silo_small*4_name', 'Beige Area Occasional Table'), + ('furni_prizetrophy8*1_name', 'Duo trophy'), + ('tutorial_menu', 'Get help with...'), + ('gs_2teams', '2 Teams Game'), + ('furni_sound_machine*4_desc', 'For Funky, Funky Fridays!'), + ('furni_romantique_divan*4_desc', 'Is that a cape hanging there?'), + ('furni_couch_norja*8_desc', 'Two can perch comfortably'), + ('console_usersnotfound', 'Habbo Not Found'), + ('nav_venue_bb_lobby_amateur_2/0_desc', ''), + ('furni_sleepingbag*4_desc', 'Ultimate coziness'), + ('furni_bed_budget_one*6_desc', 'Prince sized comfort!'), + ('furni_sw_chest_desc', ''), + ('nav_venue_bb_lobby_amateur_5/0_desc', ''), + ('NUF_visiting_rooms_room_tutor', 'This is a Guest Room. You can either quit the tutorial and start meeting people, or select the next topic.'), + ('furni_jp_pillow_name', 'Pillow Chair'), + ('url_logged_out', 'http://%predefined%/account/disconnected?reason=logout&origin=popup'), + ('furni_romantique_smalltabl*1_name', 'Rose Quartz Tray Table'), + ('friend_request_declined', 'Declined!'), + ('furni_grunge_shelf_desc', 'Scrap books and photo albums'), + ('furni_gothic_stool*6_name', 'Gothic Stool Blue'), + ('wallitem_gothicfountain_desc', 'Not suitable for drinking!'), + ('furni_scifiport*1_name', 'Gold Laser Gate'), + ('furni_sound_set_41_name', 'Rock 8'), + ('furni_toilet_yell_name', 'Loo Seat'), + ('console_fr_limit_exceeded_error', 'Too many friends selected. Please remove some first.'), + ('console_asktobecomeafriend', 'Ask To Become A Friend'), + ('console_friends', 'Friends'), + ('furni_table_plasto_bigsquare*4_desc', 'Hip plastic furniture'), + ('poster_2005_desc', 'The Special Infobus Poster'), + ('furni_summer_chair*8_desc', 'Got your sun cream?'), + ('furni_s_sound_machine*2_name', 'Sound Machine Ocean'), + ('nav_ringbell', 'The door is locked. Ringing the bell, and waiting...'), + ('console_profilematch', 'Habbo Profile match -'), + ('poster_14_name', 'Fox Poster'), + ('furni_bardeskcorner_polyfon*3_desc', 'Tuck it away'), + ('furni_carpet_soft*2_name', 'Soft Wool Rug'), + ('furni_ham_name', 'Joint of Ham'), + ('nav_venue_star_lounge_name', 'Star Lounge'), + ('nav_venue_bb_lobby_beginner_desc', 'Beginner battle ball'), + ('furni_doormat_plain*3_desc', 'Available in a variety of colours'), + ('furni_habbowood_chair_desc', 'Exclusively for Directors'), + ('nav_venue_bb_lobby_beginner_3/0_desc', ''), + ('furni_CF_20_moneybag_desc', 'Worth 20 Credits'), + ('furni_edice_desc', 'What\'s your lucky number?'), + ('furni_scifirocket*9_name', 'Neptune Smoke Machine'), + ('furni_bardesk_polyfon*9_name', 'Red Bardesk'), + ('furni_glass_table*8_desc', 'Translucent beauty'), + ('NUF_mini_endtopic', 'Find out more'), + ('pending_cfh_title', 'Your old message'), + ('nav_venue_sw_arena_tournament_name', 'Playing a tournament game!'), + ('furni_arabian_bigtb_desc', 'It must be Jinn-er time!'), + ('nav_venue_bb_lobby_beginner_0/0_desc', ''), + ('furni_pillow*3_name', 'Turquoise Satin Pillow'), + ('interface_icon_help', 'Help, need help?'), + ('nav_roomnfo_hd_src', 'Search Rooms'), + ('pet.saying.generic.dog.0', 'woof..woof'), + ('furni_chair_norja*9_name', 'Red Chair'), + ('NUF_getting_room_roommatic_start_tutor', 'This is the Room-O-Matic! Green! You use this to make your room.'), + ('furni_sound_set_2_name', 'Habbo Sounds 3'), + ('nav_venue_netcafe_name', 'My Habbo Home Netcafe'), + ('purse_voucherbutton', 'Vouchers'), + ('console_console', 'Console'), + ('game_poker_changed', 'changed'), + ('transaction_system_splashplastic', 'SplashPlastic'), + ('nav_venue_sw_lobby_free_7/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('furni_sporttrack3*1_desc', 'null'), + ('buddyremove_prev', '< Previous'), + ('roomatic_chooselayout', 'Choose the layout of your room'), + ('wallitem_item_placeholder_desc', 'This furniture is downloading...'), + ('purse_note', 'NOTE : The transactions are updated at 6 am every day.'), + ('poster_34_desc', 'Habbo-punk for the never-agreeing'), + ('furni_sound_set_27_desc', 'Jingle Bells will never be the same...'), + ('game_chess_start', 'Start Over'), + ('summer_chair_7_desc', 'A green deck chair'), + ('nav_venue_bb_lobby_beginner_6_name', 'Beginners Battle Ball 7'), + ('purse_link', 'Click here to see how to get Credits.'), + ('poster_59_desc', 'Torch - it gives you some light'), + ('room_info_rate_req', 'Rate this room'), + ('furni_rare_dragonlamp*5_desc', 'Roast your chestnuts here!'), + ('furni_divider_silo3*9_desc', 'Red Area Gate'), + ('more_roomlayouts', 'Extra room layouts for Habbo Club members >>'), + ('furni_grunge_chair_desc', 'Alternative chair for alternative people'), + ('furni_bed_budget*9_desc', 'King sized comfort!'), + ('furni_christmas_sleigh_desc', 'Ready for your Xmas cheer'), + ('furni_table_plasto_4leg*8_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_tournament_5_name', 'Competitie Battle Ball 6'), + ('furni_table_norja_med*4_name', 'Urban Iced Coffee Table'), + ('instant_friend_request_header', 'Friend Request'), + ('furni_marquee*3_name', 'Aqua Marquee'), + ('furni_noob_stool*1_name', 'My first Habbo stool'), + ('furni_rare_mnstr_desc', 'Don\'t get too close...'), + ('furni_safe_silo_pb_desc', 'Totally shatter-proof!'), + ('NUF_meeting_people_user_chatfield', 'Start typing here and press \'Enter\' to chat with others.'), + ('furni_prizetrophy6*2_desc', 'Shiny silver'), + ('furni_table_plasto_bigsquare*9_name', 'Square Dining Table'), + ('club_habbo.window.title', 'Habbo Club'), + ('recycler_info_ready', 'Recycling is complete. You have made a great environmentally friendly decision. All the recycled items you receive have been made from old items which helps to save natural resources and reduce pollution.'), + ('furni_shelves_norja*5_desc', 'For nic naks and art deco books'), + ('furni_table_silo_med_name', 'Coffee Table'), + ('furni_grunge_sign_desc', 'Bought legitimately from an M1 cafe.'), + ('roomevent_type_9', 'Group Events'), + ('roomevent_type_7', 'Dating'), + ('pet.saying.generic.dog.1', 'woof woof woof!!!'), + ('roomevent_type_8', 'Jobs'), + ('pet.saying.generic.dog.2', 'wooooof!'), + ('roomevent_type_5', 'Debates & Discussion'), + ('pet.saying.generic.dog.3', 'hooooowl'), + ('roomevent_type_6', 'Grand Openings'), + ('furni_solarium_norja*2_name', 'Beige Solarium'), + ('nav_venue_bb_lobby_intermediate_3_name', 'Semi-profs Battle Ball 4'), + ('console_searchfor', 'Search:'), + ('wallitem_arabian_wndw_desc', 'Arabian days and nights'), + ('furni_queue_tile1*3_name', 'Ice Habbo Roller'), + ('furni_lamp2_armas_desc', 'Wax lyrical with some old-world charm'), + ('furni_jp_tray3_desc', 'jp_tray3'), + ('wallitem_guitar_skull_name', 'skull guitar'), + ('roomevent_type_3', 'Games'), + ('furni_romantique_divider*2_desc', 'Keeping things separated'), + ('roomatic_owner', 'Owner:'), + ('url_helpterms', 'http://%predefined%//help/68'), + ('roomevent_type_4', 'Welcoming Party Events'), + ('furni_glass_chair*6_desc', 'Translucent beauty'), + ('furni_pillar*5_name', 'Pagan Pillar'), + ('roomevent_type_1', 'Parties & Music'), + ('roomevent_type_2', 'Trading'), + ('furni_present_gen2_desc', 'What\'s inside?'), + ('ph_tickets_title', 'Tickets'), + ('furni_table_norja_med*8_desc', 'For larger gatherings'), + ('furni_sound_set_54_desc', 'Tune into Christmas'), + ('poster_61_desc', 'The Auspicious One'), + ('furni_divider_silo3_name', 'Gate (lockable)'), + ('furni_scifirocket*4_desc', 'Welcome... to planet love'), + ('furni_plant_valentinerose*1_name', 'Red Valentine\'s Rose'), + ('furni_exe_chair2_name', 'Executive Boss Chair'), + ('alert_donate_ok', 'Give away my furni'), + ('furni_bardesk_polyfon*4_desc', 'Beige Mode Bardesk'), + ('furni_pura_mdl1*5_desc', ''), + ('hubu_close', 'Sulje kioski'), + ('gs_deathmatch', 'Every Habbo for himself!'), + ('summer_chair_9_desc', 'Sunbathing, why not?'), + ('furni_barchair_silo*8_name', 'Yellow Bar Stool'), + ('console_differentmessagemodes', 'Different Messages'), + ('furni_chair_silo*5_name', 'Pink Silo Dining Chair'), + ('callhelp_explanation', 'Thanks for reporting the problem'), + ('furni_chair_plasty*1_desc', 'Hip plastic furniture'), + ('furni_bed_budget*2_desc', 'Queen sized comfort!'), + ('furni_summer_grill*2_desc', 'Plenty of shrimp on that barbie'), + ('furni_heart_desc', 'Full of love'), + ('reg_donetext', 'Soon you\'ll see the Hotel Navigator, it shows you all the rooms you can go to -the guest rooms, clubs, caf�s, swimming pools and more!'), + ('poster_523_desc', 'The flag of India'), + ('furni_one_way_door*1_name', 'Aqua One Way Gate'), + ('furni_bardeskcorner_polyfon*13_desc', 'Tuck it away'), + ('nav_venue_sw_lobby_amateur_5/0_desc', 'Astetta rankempaa lumisotaa.'), + ('furni_gothic_chair*4_desc', 'Vampires and Wizards'), + ('furni_bardesk_polyfon*6_desc', 'Blue Mode Bardesk'), + ('transaction_system_sms_sra', 'Sonera'), + ('dimmer_turn_off', 'Turn OFF'), + ('furni_fireplace_armas_desc', 'Authentic, real flame fire'), + ('furni_chair_plasty*6_name', 'Plastic Pod Chair'), + ('furni_scifidoor*6_name', 'Black Monolith'), + ('furni_summer_pool*3_desc', 'Fancy a dip?'), + ('furni_christmas_reindeer_desc', 'Prancer becomes Rudolph in a click!'), + ('furni_chair_norja_name', 'Chair'), + ('furni_barchair_silo*3_name', 'White Bar Stool'), + ('nav_venue_bb_lobby_tournament_desc', 'Play battle ball tournament!'), + ('transaction_system_bank_sampo', 'Sampo'), + ('furni_sound_set_39_name', 'Rock 7'), + ('furni_pura_mdl3*8_desc', ''), + ('console_follow_prevented', 'Your friend has prevented others from following him/her.'), + ('poster_46_name', 'Small gold star'), + ('furni_sofa_polyfon_girl_name', 'Two-seater Sofa'), + ('furni_carpet_polar*3_desc', 'Snuggle up on a Funky bear rug...'), + ('modtool_rankerror', 'You do not have the rights for this action on this user!'), + ('furni_divider_nor3*4_name', 'Urban Iced Gate'), + ('nav_venue_theatredrome_valentine/0_desc', 'Hug A Friend, Its Valentines! Home Of Ralph (Wannabe Panda In Training)'), + ('furni_one_way_door*6_name', 'Blue HC Gate'), + ('poster_7_desc', 'For emergencies only'), + ('wallitem_hc_wall_lamp_name', 'Retro Wall Lamp'), + ('poster_508_name', 'The Spanish flag'), + ('help_emergency_example', 'Example: A Habbo wants to see me on webcam.'), + ('nav_venue_bb_lobby_expert_1/0_desc', ''), + ('furni_pura_mdl1*7_desc', 'Any way you like it!'), + ('wallitem_post.it_desc', 'Pad of stickies'), + ('nav_modify_doorstatus_passwordprotected', 'Let other people move and leave furniture in the room.'), + ('queue_set.queue_full.alert', 'The queue for this room is full. Please try again later.'), + ('nav_venue_bb_lobby_beginner_8_name', 'Beginners Battle Ball 9'), + ('nav_venue_sw_arena_amateur_name(0)', 'Playing amateur game'), + ('url_figure_editor', 'http://%predefined%//profile/profile.action'), + ('furni_noob_lamp*6_desc', 'Get the light right where you want it (canary yellow)'), + ('furni_divider_nor5*5_name', 'Pink Iced Angle'), + ('nav_venue_sw_lobby_free_desc', 'Come and play. It\'s free!'), + ('furni_table_silo_small*6_desc', 'Blue Area Occasional Table'), + ('NUF_getting_items_navigator_tutor', 'You need to be in a Habbo\'s room to access the Catalogue.'), + ('furni_safe_silo*6_desc', 'Totally shatter-proof!'), + ('furni_glass_sofa*7_name', 'Green Glass Sofa'), + ('wallitem_md_can_desc', 'Enough bubbling juice for one evening'), + ('furni_rare_fan*9_desc', 'It\'ll blow you away!'), + ('furni_prizetrophy7_name', 'Pokaali'), + ('furni_noob_stool*3_name', 'My first Habbo stool'), + ('furni_glass_sofa*2_desc', 'Translucent beauty'), + ('pet_frnd_10', 'Adoring'), + ('furni_turkey_desc', 'Where\'s the cranberry sauce?'), + ('pet_frnd_11', 'Devoted'), + ('Alert_ConnectionNotReady', 'Could not connect to the server'), + ('console_search_habbo_profilematch', 'Habbo Profile match -'), + ('furni_sound_set_59_desc', 'Urban break beats'), + ('poster_21_name', 'Butterfly Cabinet'), + ('credits', 'Credits'), + ('furni_sound_set_14_name', 'Hip Hop Beats 2'), + ('NUH_hand', 'Click here to open your inventory (aka the Big Hand). Drag and drop furniture to and from here to move it.'), + ('furni_pura_mdl3*1_desc', 'Any way you like it!'), + ('nav_modify_doorstatus_pwprotected', 'Password protected:'), + ('shopping_costs', 'XX costs XX Credit(s).\\rJust click \'buy\' once, it\'ll appear shortly.'), + ('NUF_mini_meet_people', 'Meet some people'), + ('furni_divider_nor1*3_name', 'White Iced Corner'), + ('furni_bed_budget*7_name', 'Green Pura Double Bed'), + ('furni_pura_mdl5*9_desc', 'Any way you like it!'), + ('nav_venue_club_massiva/2_name', 'Dancefloor'), + ('furni_scifiport*3_desc', 'Energy beams. No trespassers!'), + ('whisper', 'Whisper'), + ('furni_chair_plasto*4_name', 'Chair'), + ('furni_hc_bkshlf_name', 'Medieval Bookcase'), + ('furni_goodie1*2_name', 'Marzipan Man'), + ('furni_rare_fountain*1_name', 'Bird Bath (grey)'), + ('bb_text_hostInfo', 'Please choose a name for your Game and select the number of Teams.'), + ('hubu_t3_1', ''), + ('hubu_t3_2', 'Hubun kiertuekalenteri 2002'), + ('furni_sound_set_34_name', 'Rock 5'), + ('furni_rare_fountain*3_desc', 'For our feathered friends'), + ('nav_venue_sw_lobby_amateur_5_name', 'Snow Slingers Lobby'), + ('furni_pura_mdl3*2_name', 'Pink Pura Module 3'), + ('furni_xmas_cstl_wall_desc', 'Solid blocks of ice and snow'), + ('furni_arabian_tray1_name', 'Mint Tea Tray'), + ('furni_jp_tray4_name', 'jp_tray4'), + ('furni_grunge_candle_desc', 'Late night debate'), + ('furni_rclr_garden_name', 'Water Garden'), + ('furni_CFC_100_coin_gold_name', 'Gold Coin (China)'), + ('nav_venue_gate_park_name', 'Imperial Park'), + ('shopping_asagift', 'Buy As A Gift'), + ('furni_soft_sofachair_norja*7_desc', 'Sit back and relax'), + ('dance', 'Dance'), + ('roomatic_wrongpw', 'Oops! Sorry, your passwords don\'t match. Please enter them again.'), + ('furni_hc_trll_desc', 'For swanky dinners only'), + ('furni_prizetrophy3*2_desc', 'Shiny silver'), + ('modtool_roomkick', 'Room Kick'), + ('roomatic_letmove', 'Let other people move your furniture and place their own. (Furniture cannot be stolen.)'), + ('roomevent_default_description', ''), + ('nav_venue_sw_lobby_free_4/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('console_invalid_message', 'There was a message from a user that was probably removed your friend list. Note, user is removed from your friend list if you report a message to moderators.'), + ('poster_503_name', 'The Swiss flag'), + ('nav_venue_sw_arena_expert_name(0)', 'Playing expert game'), + ('poster_41_desc', 'For the best music-makers'), + ('furni_tile_name', 'Floor Tiles'), + ('furni_val_randomizer_name', 'Love Randomiser'), + ('nav_modify_doorstatus_open', 'Open'), + ('furni_plant_big_cactus_desc', 'Habbo Dreams monster in hiding! Shhhh'), + ('furni_safe_silo*8_desc', 'Totally shatter-proof!'), + ('wallitem_sw_hole_name', 'sw_hole'), + ('play_preview', 'Play preview of sounds'), + ('furni_table_plasto_round*14_name', 'Occasional Table'), + ('poll_thanks_window', 'Thanks!'), + ('wallitem_habbowheel_desc', 'So you gotta ask yourself "Do I feel lucky?"'), + ('furni_carpet_standard_name', 'Floor rug'), + ('furni_divider_nor1*8_name', 'Yellow Ice corner'), + ('nav_venue_bb_lobby_tournament_3/0_desc', ''), + ('buddyremove_ok_text', 'You have chosen enough friends to remove.'), + ('nav_venue_sw_lobby_intermediate_5/0_desc', 'Lumisota sen kuin vain kovenee.'), + ('furni_divider_nor4*7_desc', 'Habbos, roll out!'), + ('furni_summer_chair*3_desc', 'Black'), + ('furni_table_plasto_bigsquare*6_desc', 'Hip plastic furniture'), + ('gs_link_highscores', 'High Scores'), + ('Alert_purchasingerror', 'Buying unsuccessful'), + ('poster_5_desc', 'Quacking good design!'), + ('help_emergency_sent', 'A member of community staff will investigate the situation and take appropriate action. This may include sending you a response with advice on dealing with your issue.'), + ('room_user_page', 'Home Page'), + ('room_badge_window_title', 'Badge'), + ('login_name', 'Name of your Habbo'), + ('furni_divider_nor2*5_name', 'Pink Iced bar desk'), + ('nav_venue_habbo_lido_ii/0_desc', 'Dive right in!'), + ('furni_sporttrack2*2_name', 'Sport corner asphalt'), + ('roommatic_modify_size', 'Room size: %tileCount% tiles'), + ('pet.saying.sniff.croco.2', '*Sighs*'), + ('furni_prize2_name', 'Silver Trophy'), + ('Now you can find out how to get more cool Furniture for your room, or select another topic.', ''), + ('pet.saying.sniff.croco.0', 'Ewwwww....'), + ('pet.saying.sniff.croco.1', '*Sniff sniff*'), + ('furni_pura_mdl3*6_name', 'Blue Pura Module 3'), + ('poster_48_desc', 'All that glitters...'), + ('furni_wcandle_desc', 'Xmas tea light'), + ('nav_venue_bb_arena_3_name', 'Battle Ball Keskitaso'), + ('sound_machine_confirm_save_long', 'Are you sure you want to overwrite the current saved song?'), + ('purse_vouchers_helpurl', 'http://%predefined%/help/4'), + ('nav_venue_bouncer_room_2_name', 'Gevorderden Battle Ball Arena'), + ('furni_sand_cstl_gate_desc', 'sand_cstl_gate desc'), + ('furni_barrier*1_name', 'Yellow Maze Barrier'), + ('nav_venue_bb_lobby_tournament_0_name', 'Tournament'), + ('NUF_getting_room_roommatic_layout_tutor', 'Select what you want your room to look like. Use the arrows to cycle through different room layouts. Almost there, almost there...'), + ('poll_confirm_cancel', 'Stop answering?'), + ('furni_carpet_soft*4_desc', 'Soft Wool Rug'), + ('furni_rare_icecream_campaign_desc', 'Basic model'), + ('club_habbo.bottombar.text.notmember', 'Habbo Club'), + ('recycler_info_closed', 'Recycler is closed at the moment. Please check back later to recycle your Furniture.'), + ('furni_solarium_norja*8_desc', 'Rejuvenate your pixels!'), + ('callhelp_example', 'Example: How do I move my Furni?'), + ('furni_bed_budget_one*4_name', 'White Pura Bed'), + ('roomatic_givepwd', 'Password:'), + ('furni_teleport_door_name', 'Teleport Door'), + ('furni_table_silo_small*9_name', 'Red Area Occasional Table'), + ('furni_noob_chair*4_name', 'My first Habbo chair'), + ('furni_table_plasto_square*2_desc', 'Hip plastic furniture'), + ('room_waiting', 'Waiting to go in...'), + ('furni_sink_desc', 'Hot and cold thrown in for no charge'), + ('furni_doormat_plain_name', 'Doormat'), + ('nav_venue_eric\'s_eaterie_name', 'Eric\'s Eaterie'), + ('nav_venue_pizzeria_name', 'Slice of Life'), + ('poster_1004_desc', 'Celebrate with us'), + ('next', 'Next'), + ('furni_solarium_norja*9_name', 'Red Solarium'), + ('tutorial_quit_confirmation', 'You want to leave? Well I hope you learned something... something useful!'), + ('furni_val_teddy*2_desc', 'The pink bear of passion'), + ('poster_1003_name', 'UK Map'), + ('furni_glass_table*2_name', 'Glass table'), + ('NUF_habbo_home_url', 'http://d15-1.web.varoke.net/home/home-tutorial'), + ('furni_bed_silo_one_name', 'Single Bed'), + ('transaction_system_sms_win_btcellnet', 'O2 SMS'), + ('pet.hotwords.go_away', 'go away'), + ('furni_table_plasto_square*9_desc', 'Hip plastic furniture'), + ('furni_doormat_plain*4_name', 'Doormat'), + ('nav_venue_cunning_fox_gamehall_name', 'Cunning Fox Gamehall'), + ('furni_sound_machine*2_name', 'Ocean Traxmachine'), + ('furni_table_polyfon_name', 'Large Coffee Table'), + ('furni_hc_frplc_desc', 'Pixel-powered for maximum heating'), + ('console_request_massoperation_instruction', 'Use the options below to accept or decline ALL friend requests you have waiting.'), + ('nav_venue_bb_lobby_tournament_6/0_desc', ''), + ('furni_table_plasto_round*6_desc', 'Hip plastic furniture'), + ('trading_cancel', 'Cancel Trading'), + ('furni_glass_stool*3_name', 'Glass stool'), + ('furni_plant_mazegate_snow_name', 'Snowy Maze Gate'), + ('nav_venue_tv_studio_name', 'MuchMusic HQ'), + ('furni_table_norja_med*3_desc', 'For larger gatherings'), + ('furni_chair_plasty*8_desc', 'Hip plastic furniture'), + ('furni_bed_polyfon_name', 'Double Bed'), + ('gs_4teams', '4 Team Game'), + ('furni_sound_set_8_desc', 'Mellow electric grooves'), + ('ph_keys_jump', 'Jump:'), + ('reg_welcome', 'Welcome To Habbo Hotel!'), + ('purse_head', 'HABBO ACCOUNT ACTIVITY'), + ('nav_venue_bb_lobby_tournament_7_name', 'Competitie Battle Ball 8'), + ('reg_verification_newPasswordAgain', 'Retype new password:'), + ('furni_bardeskcorner_polyfon*8_desc', 'Yellow Mode Bardesk Corner'), + ('furni_sound_set_21_name', 'Rock 1'), + ('furni_gothic_stool*1_desc', 'The dark side of Habbo'), + ('furni_rope_divider_name', 'Rope Divider'), + ('poster_53_name', 'Hockey Stick'), + ('roomevent_default_desc', 'Event description..'), + ('nav_refresh_recoms', 'Refresh recommendations'), + ('nav_venue_sw_lobby_beginner_2_name', 'Snow Rookies Lobby'), + ('furni_divider_silo3*4_desc', 'Beige Area Gate'), + ('furni_divider_poly3*6_name', 'Blue Mode Bardesk Gate'), + ('reg_parentemail_title', 'Informing your parents'), + ('furni_gothgate_name', 'Gothic Portcullis'), + ('furni_mocchamaster_name', 'Mochamaster'), + ('modtool_message', 'Message:'), + ('furni_tree4_desc', 'Any presents under it yet?'), + ('furni_marquee*a_name', 'White Marquee'), + ('furni_queue_tile1*5_name', 'Knight Roller'), + ('furni_chair_polyfon_name', 'Dining Chair'), + ('furni_sleepingbag*9_name', 'Blue Sleeping Bag'), + ('furni_sound_set_9_name', 'Electronic 2'), + ('poster_39_desc', 'The rock masters of virtual music'), + ('furni_arabian_tetbl_desc', 'Serve up a treat'), + ('nav_venue_sw_lobby_free_9_name', 'Free Game Lobby'), + ('nav_venue_sw_arena_free_name(0)', 'Playing free for all game'), + ('furni_grand_piano*4_desc', 'Why is that key green?'), + ('furni_doorD_desc', 'Let\'s go over tzar!'), + ('purse_date', 'DATE'), + ('nav_venue_sw_lobby_beginner_6/0_desc', ''), + ('nav_venue_sw_lobby_beginner_4/0_desc', ''), + ('nav_venue_sw_lobby_intermediate_1_name', 'Snow Bombardiers Lobby'), + ('alert_reg_age', 'You are under 11 years old. Children under 11 can\'t enter Habbo Hotel.'), + ('nav_venue_bb_lobby_intermediate_9/0_desc', ''), + ('queue_set.c.alert', 'This room is for Habbo Club members only. In order to enter, you need to subscribe to Habbo Club.'), + ('sound_machine_confirm_clear_long', 'Are you sure you want to clear the current song?'), + ('furni_exe_drinks_name', 'Executive Drinks Tray'), + ('reg_bday_note', 'Please enter your correct date of birth, this is important! You\'ll need this information later on, if you want to change your password or e-mail.'), + ('modtool_roomalert', 'Room Alert'), + ('furni_rare_parasol*1_name', 'Yellow Parasol'), + ('furni_sound_set_18_name', 'Groove 4'), + ('sound_machine_window', 'Sound Machine Editor'), + ('furni_traffic_light*1_name', 'Classic Traffic Light'), + ('furni_chair_norja*4_desc', 'Sleek and chic for each cheek'), + ('furni_divider_nor1*2_desc', 'Black Ice corner'), + ('nav_venue_median_lobby_name', 'Median Lobby'), + ('furni_sofa_silo*3_desc', 'Cushioned, understated comfort'), + ('furni_bed_budget_desc', 'Comfortable, affordable!'), + ('furni_divider_nor4_name', 'Plain Iced Auto Shutter'), + ('furni_rare_icecream*6_desc', 'Virtual toffee rocks!'), + ('habboclub_txt1', 'You can buy Habbo Club one month at a time using Habbo Credits.'), + ('habboclub_txt3', 'Yes, I\'m over 14 years of age\\rOR\\rI\'m under 14 years of age and I have a permission from my parent/guardian to join Habbo Club.'), + ('furni_rare_dragonlamp*3_desc', 'Scary and scorching!'), + ('furni_noob_lamp*5_name', 'My first Habbo lamp'), + ('club_bottombar_text2', '(....)'), + ('furni_CFC_500_goldbar_name', 'Gold Bar (China)'), + ('club_bottombar_text1', 'Loading'), + ('furni_rare_elephant_statue*1_desc', 'Say hello to Nelly'), + ('furni_table_silo_med*7_name', 'Green Area Coffee Table'), + ('nav_venue_sw_lobby_free_1/0_desc', ''), + ('furni_bottle_desc', 'For interesting games!'), + ('furni_romantique_pianochair*2_desc', 'Let the music begin'), + ('furni_table_norja_med*2_name', 'Large Coffee Table Black'), + ('queue_set.e2.alert', 'This room is currently available only to Habbos participating to the event.'), + ('furni_solarium_norja_desc', 'Rejuvenate your pixels!'), + ('furni_table_plasto_square*14_desc', 'Hip plastic furniture'), + ('cam_save.help', 'Save & Print Photo'), + ('furni_sound_set_4_desc', 'Chilled out beats'), + ('furni_couch_norja*6_name', 'Blue Bench'), + ('poster_2003_desc', 'Would you trust this man?'), + ('hobba_cryforhelp', 'Call For Help:'), + ('furni_marquee*9_desc', 'It\'s both door and a shade!'), + ('nav_venue_bb_lobby_tournament_13/0_desc', ''), + ('poster_512_desc', 'The flag of Ireland'), + ('handitem12', 'Macchiato'), + ('object_displayer_hide_actions', 'Hide actions'), + ('furni_sound_set_25_name', 'Dance 1'), + ('handitem11', 'Mocha'), + ('handitem10', 'Latte'), + ('furni_sound_set_13_desc', 'Let Music be the food of Habbo'), + ('handitem16', 'Cappuccino'), + ('handitem15', 'Iced'), + ('handitem14', 'Filter'), + ('handitem13', 'Espresso'), + ('nav_venue_sw_lobby_free_2_name', 'Free Game Lobby'), + ('handitem19', 'Habbo Cola'), + ('nav_venue_sw_lobby_amateur_2/0_desc', ''), + ('handitem18', 'Tap'), + ('handitem17', 'Java'), + ('console_next_msg', 'Delete'), + ('furni_bardesk_polyfon*5_name', 'Candy Bar'), + ('furni_scifidoor*5_desc', 'There out of this world!'), + ('nav_roomispwprotected', 'The room is password protected.'), + ('furni_sleepingbag*2_name', 'Lime Sleeping Bag'), + ('furni_glass_table*6_name', 'Blue Glass Table'), + ('furni_divider_nor4*3_desc', 'Habbos, roll out!'), + ('furni_sound_set_61_name', 'Latin Love 3'), + ('nav_venue_pizza/0_desc', 'Pizza Palace'), + ('furni_romantique_clock_desc', ''), + ('furni_queue_tile1*0_desc', 'The power of movement'), + ('furni_pura_mdl2*9_desc', 'Any way you like it!'), + ('nav_venue_orient/0_name', 'Club Golden Dragon'), + ('furni_noob_table*1_desc', 'Lightweight, practical and orange'), + ('poster_22_desc', 'beautiful reproduction butterfly'), + ('furni_carpet_soft_name', 'Soft Wool Rug'), + ('Message', 'Message'), + ('furni_bed_trad_one_desc', 'All you need for a good night\'s kip'), + ('console_report_help', 'If the message you received was abusive or harassing, you can report it to the Moderators by clicking the Report button below. The Habbo will be removed from your Friends\' List automatically when you report. If you want to remove a Habbo from your Friends\' List without reporting their message, simply use the Remove button below.'), + ('furni_rcandle_desc', 'Xmas tea light'), + ('furni_sofa_silo*8_name', 'Yellow Two-Seater Sofa'), + ('furni_pura_mdl4*5_desc', ''), + ('NUF_mini_use_console_ready_tutor', 'You can now use the Console to find some of your friends, or you can continue the tutorial.'), + ('log_problem_link', 'Read FAQ\'s'), + ('furni_shelves_silo_name', 'Bookcase'), + ('gs_timetojoin', '\\x seconds to join'), + ('nav_venue_cunning_fox_gamehall/1_name', 'Gamehall Lobby'), + ('furni_safe_silo*7_name', 'Green Safe Minibar'), + ('NUF_mini_meet_people_hotelview_tutor', 'The Navigator lets you move between rooms in the Hotel. Open it up to get started!'), + ('purse_vouchers_sendbutton', 'Get Credits!'), + ('furni_gothic_sofa*4_name', 'Black Gothic Sofa'), + ('furni_wooden_screen*0_desc', 'Add an exotic touch to your room'), + ('catalog_give_trophymsg', 'You haven\'t engraved the trophy. Type \\ryour inscription in the grey box.'), + ('furni_prizetrophy5*3_name', 'Duo trophy'), + ('handitem23', 'Beetroot Habbo Soda'), + ('furni_rare_dragonlamp*8_name', 'Bronze Dragon Lamp'), + ('furni_divider_nor4*8_name', 'Yellow Iced Auto Shutter'), + ('handitem22', 'Lime Habbo Soda'), + ('furni_soft_sofa_norja*6_name', 'Blue Iced Sofa'), + ('handitem21', 'Hamburger'), + ('handitem20', 'Camera'), + ('furni_divider_nor1*9_desc', 'Red Ice corner'), + ('help_trouble', 'In Trouble?'), + ('handitem25', 'Love potion'), + ('handitem24', 'Bubble juice from 1999'), + ('furni_ham2_desc', 'Looks like you\'re too late!'), + ('nav_venue_bb_lobby_amateur_3_name', 'Gevorderden Battle Ball 4'), + ('furni_chair_plasto*15_name', 'Chair'), + ('furni_hyacinth1_desc', 'Beautiful bulb'), + ('furni_shelves_basic_desc', 'Pura series 404 shelves'), + ('furni_pura_mdl1*6_name', 'Blue Pura Module 1'), + ('nav_venue_cafe_gold/0_desc', 'Get the latest safety tips and tricks from Safety eXperts.'), + ('nav_venue_snowwar_lobby_name', 'Snow Storm Lobby'), + ('transaction_system_sms_slahti', 'Saunalahti'), + ('alert_tooLongPW', 'Your password is too long'), + ('furni_carpet_standard*5_desc', 'Available in a variety of colours'), + ('furni_deadduck_desc', 'Blood, but no guts'), + ('password.email.subject', 'Forgotten password'), + ('furni_prizetrophy2*3_desc', 'Breathtaking bronze'), + ('NUF_playing_games_hotelview_nav', 'Just click me to open the Navigator and get it over with...'), + ('furni_summer_chair*1_name', 'Aqua Deck Chair'), + ('furni_rubberchair*3_name', 'Orange Inflatable Chair'), + ('furni_exe_plant_desc', ''), + ('nav_venue_tearoom/0_desc', 'Chat with the people of Aoralia and meet a sprite or two!'), + ('nav_venue_sw_lobby_beginner_9/0_desc', ''), + ('furni_table_silo_med*6_name', 'Blue Area Coffee Table'), + ('nav_venue_sw_lobby_beginner_1/0_desc', ''), + ('furni_noob_stool*2_desc', 'Unfold me and take the weight off (dark blue)'), + ('camera_dialog_place', 'Move'), + ('furni_scifiport*8_desc', 'Energy beams. No trespassers!'), + ('url_peeloscore', 'http://%predefined%///groups/56555/id'), + ('console_follow_friend', 'Go to same room'), + ('sound_machine_alert_jukebox_list_full', 'The play list is full. Please wait until the current song has finished playing and try again.'), + ('poster_517_desc', 'Where\'s your kilt?'), + ('roomevent_type_11', 'Helpdesk'), + ('roomevent_type_10', 'Performance'), + ('furni_rare_dragonlamp*9_desc', 'Scary and scorching!'), + ('furni_pura_mdl2*3_name', 'Black Pura Module 2'), + ('url_help_1', 'http://%predefined%//credits'), + ('furni_edicehc_name', 'Dicemaster'), + ('furni_divider_silo1*8_name', 'Yellow Corner Shelf'), + ('furni_wooden_screen*5_desc', 'Add an exotic touch to your room'), + ('url_help_5', 'http://%predefined%/help/75'), + ('roomatic_intro2', 'Here\'s what one Habbo says about her room:'), + ('url_help_4', 'http://%predefined%//help/22'), + ('roomatic_intro1', 'You can decorate and furnish your room however you like and no one can tell you to tidy up or turn the music down. It\'s up to you if you let everyone in or just a chosen few, or lock the door and chill by yourself. Get creating and in a couple of minutes you\'ll have your own Habbo Hotel space.'), + ('url_help_3', 'http://%predefined%//help/'), + ('roomatic_intro3', 'My mates live miles away, but we can meet up in my room every Friday night and we don\'t have to worry about getting home afterwards.'), + ('url_help_2', 'http://%predefined%//profile?tab=4'), + ('furni_romantique_chair*5_name', 'Onyx Chair'), + ('url_help_6', 'http://www.habbohotel.co.uk/iot/go?lang=en&country=uk'), + ('furni_sound_set_20_name', 'SFX 2'), + ('furni_sofa_polyfon*4_desc', 'Beige Mode Sofa'), + ('sound_machine_alert_no_more_songs', 'Can\'t create new song! Traxmachine can have only %count% songs.'), + ('search', 'Search'), + ('room_preparing', '...Preparing room'), + ('nav_venue_bb_lobby_intermediate_0/0_desc', ''), + ('club_txt_renew2', 'You are Habbo Club member. If you want to change your subscription or leave the club, use the link below.'), + ('poster_1002_name', 'Queen Mum Poster'), + ('furni_barchair_silo*2_desc', 'Practical and convenient'), + ('reg_month', 'Month'), + ('club_txt_renew1', 'Your Habbo Club membership will be active for another %days% days. You can extend your membership by paying with Habbo Credits.'), + ('furni_rare_icecream*0_name', 'Cherry Ice Cream Machine'), + ('furni_sound_set_41_desc', 'Burning Riffs'), + ('nav_venue_beauty_salon_loreal_name', 'Beauty salon'), + ('poster_26_name', 'Angel Poster'), + ('furni_sound_set_19_name', 'Hip Hop Beats 4'), + ('furni_romantique_divan*4_name', 'Amber Chaise-Longue'), + ('furni_one_way_door*7_desc', 'One at a time!'), + ('sound_machine_confirm_eject_long', 'Are you sure you want to remove the Traxpack and it\'s samples from the song?'), + ('furni_glass_stool*8_desc', 'Translucent beauty'), + ('buddyremove_not_now', 'Cancel'), + ('no_user_for_gift', 'No user named %user% found. Gift not purchased.'), + ('buddyremove_lessoptions', 'Less Options <<'), + ('reg_legal_header1', 'Now you need to ask your parents/guardian to come to the computer. Read through the text (below) with your parents.'), + ('furni_carpet_soft*3_desc', 'Soft Wool Rug'), + ('reg_legal_header2', 'Read through the below text carefully. You must agree to the following terms before entering Habbo Hotel.'), + ('furni_sw_chest_name', 'sw_chest'), + ('nav_venue_sw_lobby_tournament_9_name', 'Tournament Lobby'), + ('messenger.email.footer', ''), + ('nav_venue_bb_arena_4_name', 'Battle Ball Expertit'), + ('club_change_url', 'http://%predefined%//credits/habboclub'), + ('furni_table_plasto_4leg*2_name', 'Occasional Table'), + ('ph_choosecolour', 'Choose Costume Colour'), + ('buddyremove_hc_more_info', 'More Info About Habbo Club >>'), + ('furni_romantique_smalltabl*1_desc', 'Every tray needs a table...'), + ('nav_venue_sw_lobby_tournament_8_name', 'Tournament Lobby'), + ('furni_divider_nor5_name', 'Plain Iced Angle'), + ('wallitem_roomdimmer_name', 'Mood Light'), + ('furni_bed_budget_one*5_name', 'Beige Pura Bed'), + ('furni_table_norja_med*9_name', 'Large Coffee Table Red'), + ('furni_pillow*3_desc', 'Puffy, soft and huge'), + ('furni_noob_rug*2_name', 'My first Habbo rug'), + ('nav_venue_sw_lobby_beginner_7_name', 'Snow Rookies Lobby'), + ('furni_exe_chair_desc', 'Relaxing leather comfort'), + ('furni_s_sound_machine*2_desc', 'Sound Machine Ocean Desc'), + ('nav_venue_dusty_lounge/0_desc', 'A dignified lounge for sitting back and enjoying a licorice pipe'), + ('game_bs_ship4', 'Destroyer(s)'), + ('game_bs_ship3', 'Cruiser(s)'), + ('game_bs_ship2', 'Battle Ship(s)'), + ('game_bs_ship1', 'An aircraft carrier'), + ('furni_table_plasto_bigsquare*4_name', 'Square Dining Table'), + ('openhrs_title', 'We are closing the hotel'), + ('furni_habbowood_chair_name', 'Director\'s Chair'), + ('roomatic_confirm', 'Confirm password:'), + ('poster_14_desc', 'A cunning painting'), + ('furni_doormat_plain*3_name', 'Doormat'), + ('furni_sound_set_3_desc', 'Chilled grooves'), + ('win_messenger', 'Habbo Console'), + ('summer_chair_7_name', 'Green Deck Chair'), + ('notickets_window_header', 'Tickets needed!'), + ('nav_updatenote', 'Updating your room properties may take a while. The changes have been made, but it\'ll take a few minutes until all Habbos can see them.'), + ('furni_table_plasto_bigsquare*5_name', 'Square Dining Table'), + ('url_purselink', 'http://%predefined%//credits?'), + ('console_follow_hotelview', 'Your friend is on the hotel view.'), + ('furni_solarium_norja*3_desc', 'Get the city look!'), + ('sound_machine_alert_song_name_missing', 'Please give your song a name.'), + ('furni_sound_machine*3_name', 'Green Traxmachine'), + ('jukebox_next_up', 'Next up:'), + ('trading_additems', 'Put items in boxes'), + ('furni_sporttrack3*1_name', 'Sport goal tartan'), + ('club_button_3_period', 'Buy 6 >>>'), + ('nav_delroom3', 'Room deleted!'), + ('nav_delroom2', 'Are you sure you want to delete this room? All the furniture left in it will also be deleted.'), + ('poster_34_name', 'Scamme\'d'), + ('go', 'Go >>'), + ('nav_delroom1', 'If you want to save the furniture in this room, move it to the giant hand before you continue.'), + ('console_habboprofile_arrowed', 'Habbo Profile >>'), + ('furni_chair_plasty*10_desc', 'Hip plastic furniture'), + ('cam_txtscreen.help', 'Caption'), + ('wallitem_item_placeholder_name', 'This furniture is downloading...'), + ('furni_carpet_standard*b_desc', 'Available in a variety of colours'), + ('poster_59_name', 'Torch'), + ('furni_chair_basic*4_name', 'White Pura Egg Chair'), + ('summer_chair_1_name', 'Aquamarine Deck Chair'), + ('nav_venue_space_cafe_name', 'Ten Forward'), + ('log_problem_url', 'http://%predefined%//help/faqs?faq_1_categoryId=14'), + ('group_homepage_url', 'http://%predefined%/groups/%groupid%/id'), + ('furni_heart_name', 'Giant Heart'), + ('nav_venue_sw_arena_beginner_name', 'Playing beginner game'), + ('furni_grunge_chair_name', 'Grunge Chair'), + ('nav_dooropens', 'Door opens! Go on in...'), + ('modtool_banuser', 'Ban User'), + ('furni_carpet_soft_tut_desc', 'Welcome, enjoy your stay!'), + ('furni_rare_mnstr_name', 'Venomus Habbolus'), + ('furni_divider_silo3*9_name', 'Red Area Gate'), + ('furni_pura_mdl3*1_name', 'Aqua Pura Module 3'), + ('Messages', 'Message(s)'), + ('wallitem_arabian_wndw_name', 'Arabian Window Frame'), + ('furni_prizetrophy3*1_desc', 'Glittery gold'), + ('furni_sound_set_47_desc', 'Storm the UKCharts!'), + ('poster_54_desc', 'whack that ball!'), + ('url_logout_concurrent', 'http://%predefined%//account/disconnected?reason=concurrentlogin&origin=popup'), + ('nav_venue_sw_lobby_beginner_1_name', 'Snow Rookies Lobby'), + ('furni_table_plasto_4leg*8_name', 'Occasional Table'), + ('sound_machine_turn_on', 'Switch On'), + ('furni_table_norja_med*4_desc', 'For larger gatherings'), + ('buddyremove_hc_info_url', 'http://www.habbo.co.uk/credits/habboclub'), + ('furni_romantique_divider*2_name', 'Green Screen'), + ('furni_pillar*5_desc', 'Find your natural roots'), + ('furni_table_silo_med_desc', 'Wipe clean and unobtrusive'), + ('furni_pillow*8_name', 'Navy Cord Pillow'), + ('room_owner', 'Owner:'), + ('furni_shelves_norja*5_name', 'Pink Bookcase'), + ('queue_set.d.info', 'There are %d% Habbos in front of you in the queue.'), + ('reg_retypepass', 'Retype Password:'), + ('furni_jp_tray3_name', 'jp_tray3'), + ('dance_stop', 'Stop Dancing'), + ('buddyremove_remove_text', 'You are about to remove %removeamount% friends from your friendlist.\\r\\r After removal, you\'ll have %amountleft% friends on your list:'), + ('nav_venue_bb_lobby_tournament_12_name', 'Competitie Battle Ball 13'), + ('furni_summer_chair*2_name', 'Deck Chair'), + ('furni_plant_valentinerose*1_desc', 'Secret admirer!'), + ('furni_sofachair_silo*4_name', 'Beige Area Armchair'), + ('poster_523_name', 'The flag of India'), + ('furni_scifirocket*4_name', 'Venus Smoke Machine'), + ('nav_venue_tearoom_name', 'Chinese Tea Room'), + ('furni_pura_mdl1*5_name', 'beige pura module 1'), + ('nav_venue_bb_lobby_tournament_0/0_desc', ''), + ('furni_chair_silo*5_desc', 'Pink Silo Dining Chair'), + ('club_txt_expired', 'Your Habbo Club membership has run out. You can join the club again by clicking the HC logo on the hotel view.\\rMembers of Habbo Club get priority access to the hotel (so you can always get in), exclusive clothes, hair colours, rare furni and special guest room layouts. To see exactly what you\'ll be able to get your hands on as a Habbo Club member, take a look in the Catalogue.'), + ('furni_glass_table*7_name', 'Green Glass Table'), + ('nav_prvrooms_notfound', 'Your search did not match any rooms'), + ('bb_title_BBscores2', 'Game over!'), + ('wallitem_gothicfountain_name', 'Gothic Ectoplasm Fountain'), + ('furni_one_way_door*1_desc', 'One at a time!'), + ('furni_chair_plasty*1_name', 'Plastic Pod Chair'), + ('furni_divider_nor3*9_name', 'Red Iced gate'), + ('sound_machine_time_2', '%min%:%sec%min'), + ('sound_machine_time_1', '%min%:%sec%min'), + ('furni_bardesk_polyfon*4_name', 'Beige Mode Bardesk'), + ('queue_set.queue_reset.alert', 'The queue for this room has been reset, please try again.'), + ('furni_jp_pillow_desc', 'Comfy and classical'), + ('nav_venue_sw_lobby_free_9/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('furni_barchair_silo*8_desc', 'Practical and convenient'), + ('delete_furniture', 'Delete Furniture (permanently)'), + ('furni_plant_bulrush_desc', 'Ideal for the riverside'), + ('poster_61_name', 'Siva Poster'), + ('furni_bed_silo_two_name', 'Double Bed'), + ('furni_plant_pineapple_desc', 'Needs loving glances'), + ('furni_bed_polyfon_girl_desc', 'Snuggle down in princess pink'), + ('furni_pillow*4_desc', 'Puffy, soft and huge'), + ('furni_table_norja_med*8_name', 'Large Coffee Table Yellow'), + ('transaction_system_tsms_win_tmobile', 'T-Mobile SMS'), + ('furni_scifidoor*10_desc', 'There out of this world!'), + ('furni_bed_polyfon*7_desc', 'Green Mode Double Bed'), + ('furni_toy1*2_desc', 'it\'s bouncy-tastic'), + ('transaction_system_sms_radiolinja', 'Elisa'), + ('furni_gothic_chair*4_name', 'Black Gothic Chair'), + ('furni_scifidoor*6_desc', 'Monolith goes up! Monolith goes down!'), + ('nav_venue_sw_lobby_free_3_name', 'Free Game Lobby'), + ('console_friend_request_not_found', 'There was an error finding the user for the friend request'), + ('furni_romantique_smalltabl*2_desc', 'Every tray needs a table...'), + ('furni_bed_budget*2_name', 'Pink Pura Double Bed'), + ('wallitem_post.it_name', 'Pad of stickies'), + ('gs_state_created', 'Waiting for players..'), + ('furni_divider_nor3*4_desc', 'Entrance or exit?'), + ('furni_sofa_polyfon_girl_desc', 'Romantic pink for two'), + ('locked', 'Locked (visitors have to ring bell)'), + ('alert_reg_birthday', 'Birthday'), + ('club_thanks_text', 'Here you can see your Habbo Club membership status, number of elapsed months, pre-ordered months and status of the ongoing month.'), + ('furni_sound_set_39_desc', 'Rock with a roll'), + ('nav_venue_old_skool/0_desc', 'A set of rooms inspired by the original and legendary Mobiles Disco, the progenitor of Habbo'), + ('poster_511_desc', 'The flag of The Netherlands'), + ('furni_couch_norja*7_name', 'Rural Iced Bench'), + ('furni_safe_silo*6_name', 'Blue Safe Minibar'), + ('furni_table_plasto_4leg*14_desc', 'Aqua table'), + ('room_sound_furni_limit', 'You can only place one sound furni per room'), + ('nav_venue_bb_lobby_beginner_15/0_desc', ''), + ('furni_glass_shelf_name', 'Glass shelf'), + ('furni_divider_nor2*6_desc', 'Blue Iced bar desk'), + ('furni_turkey_name', 'Roast Turkey'), + ('nav_venue_bb_lobby_tournament_16/0_desc', ''), + ('sw_timeleft', 'Time:'), + ('furni_rare_parasol_name', 'Parasol'), + ('furni_glass_sofa*7_desc', 'Habbo Club'), + ('furni_bardeskcorner_polyfon*13_name', 'Corner Cabinet/Desk'), + ('furni_rare_fan*9_name', 'Fucsia Powered Fan'), + ('furni_chair_plasto*4_desc', 'Hip plastic furniture'), + ('no', 'No'), + ('furni_rare_fan*4_desc', 'Fanning the fires of SUPERLOVE...'), + ('nav_venue_median_lobby/0_desc', 'A Mean place to hang'), + ('nav_venue_sw_lobby_intermediate_2/0_desc', ''), + ('furni_md_sofa_name', 'MD Sofa'), + ('furni_noob_lamp*1_desc', 'Get the light right where you want it (yellow)'), + ('login_connecting', 'Connecting...'), + ('furni_divider_nor1*3_desc', 'Looks squishy, but isn\'t!'), + ('furni_sound_set_14_desc', 'Rock them bodies'), + ('furni_sound_set_59_name', 'RnB Grooves 5'), + ('poster_21_desc', 'beautiful reproduction butterfly'), + ('wallitem_hc_wall_lamp_desc', 'Tres chic!'), + ('ok', 'OK'), + ('nav_venue_sw_lobby_tournament_1/0_desc', ''), + ('pet_happy', 'Happiness:'), + ('sound_machine_edit', 'Edit Song'), + ('furni_rare_elephant_statue*2_desc', 'Say hello to Nelly'), + ('furni_CFC_200_moneybag_desc', 'Worth 200 Credits'), + ('nav_venue_bb_lobby_intermediate_6/0_desc', ''), + ('console_buddylimit_requester', 'Friend could not be added. The request sender can not have anymore friends.'), + ('furni_sofa_silo*2_desc', 'Cushioned, understated comfort'), + ('sound_machine_alert_invalid_song_name', 'You have already burned another song with the same name. Please change the song name before trying again.'), + ('furni_fireplace_armas_name', 'Fireplace'), + ('furni_barchair_silo*3_desc', 'Practical and convenient'), + ('ph_ticket', 'Ticket'), + ('furni_arabian_divdr_desc', 'Carved Cedar Divider'), + ('wallitem_jp_ninjastars_desc', 'Not a frisbee'), + ('wallitem_hrella_poster_1_desc', 'Brighten up your cabin'), + ('furni_noob_stool*3_desc', 'Unfold me and take the weight off (aubergine)'), + ('furni_pura_mdl5*9_name', 'Red Pura Module 5'), + ('furni_divider_nor4*2_desc', 'Habbos, roll out!'), + ('NUF_mini_meet_people_roomlist_tutor', 'Click \'Open\' to open up a category and see what rooms are within. When you have found an interesting room, press \'Go\' to visit it.'), + ('poster_41_name', 'Habbo Golden Record'), + ('furni_jp_tray4_desc', 'jp_tray4'), + ('buddyremove_confirm', 'Yeah, it is done...'), + ('tutorial_topic_list_F', 'Choose a topic from the list below:'), + ('purse_time', 'TIME'), + ('nav_venue_sw_lobby_free_8_name', 'Free Game Lobby'), + ('tutorial_topic_list_M', 'Choose a topic from the list below:'), + ('furni_s_sound_machine*7_name', 'Sound Machine Red'), + ('interface_icon_navigator', 'Navigator, navigate around'), + ('furni_xmas_cstl_wall_name', 'Ice Castle Wall'), + ('nav_own_hd', 'Your Rooms.'), + ('modtool_aa_checkbox_text', 'Audio alert'), + ('wallitem_industrialfan_desc', 'Powerful and resilient'), + ('furni_bed_budget*8_desc', 'King sized comfort!'), + ('sound_machine_burn', 'Burn Song'), + ('nav_venue_sw_lobby_intermediate_0_name', 'Snow Bombardiers Lobby'), + ('nav_venue_bb_lobby_beginner_1_name', 'Beginners Battle Ball 2'), + ('furni_chair_basic*5_desc', ''), + ('password.email.prefix', 'Your password is:'), + ('furni_pura_mdl5*4_desc', 'Any way you like it!'), + ('furni_table_norja_med*3_name', 'White Iced Table'), + ('furni_pura_mdl3*2_desc', 'Any way you like it!'), + ('nav_venue_sw_lobby_tournament_3_name', 'Tournament Lobby'), + ('furni_sound_set_34_desc', 'For guitar heroes'), + ('furni_summer_grill*1_desc', 'Plenty of ribs on that barbie'), + ('hubu_t4_1', 'Anna palautetta Hubusta'), + ('furni_divider_nor1*8_desc', 'Yellow Ice corner'), + ('hubu_t4_2', 'Tsekkaa heebelin jorinat'), + ('poll_offer_title', 'Poll'), + ('summer_chair_2_desc', 'Leave your towel early'), + ('wallitem_habbowheel_name', 'The Wheel of Destiny!'), + ('reg_mission', 'Your Mission:'), + ('furni_sofa_polyfon*9_name', 'Red Two-seater Sofa'), + ('furni_bed_budget_one_desc', 'aquamarine'), + ('nav_venue_sw_lobby_tournament_7/0_desc', ''), + ('furni_gothic_sofa*3_name', 'Gothic Sofa Red'), + ('furni_chair_plasto*9_name', 'Chair'), + ('nav_venue_sw_arena_beginner_name(0)', 'Playing beginner game'), + ('notickets_text_2', 'Buy more tickets now and get a discount. You can also buy tickets as a present.'), + ('wallitem_sw_hole_desc', 'sw_hole'), + ('furni_plant_big_cactus_name', 'Mature Cactus'), + ('notickets_text_1', 'Game price is 1 credit. For that you get 2 tickets.'), + ('poster_19_name', 'Hole In The Wall'), + ('furni_divider_nor4*7_name', 'Rural Iced Shutter'), + ('email', ''), + ('furni_sound_set_13_name', 'Dance 5'), + ('furni_present_gen1_name', 'Gift'), + ('nav_venue_bb_lobby_tournament_19/0_desc', ''), + ('furni_chair_norja_desc', 'Sleek and chic for each cheek'), + ('furni_marquee*9_name', 'Green Marquee'), + ('sound_machine_alert_song_locked', 'The song you\'re editing can\'t be modified. Please save the song under another name to create a new copy.'), + ('furni_glass_stool*2_name', 'Glass stool'), + ('nav_venue_theatredrome_xmas/0_desc', ''), + ('poster_5_name', 'Duck Poster'), + ('furni_prize2_desc', 'Nice and shiny'), + ('furni_valeduck_desc', 'He\'s lovestruck'), + ('furni_chair_plasty*7_desc', 'Hip plastic furniture'), + ('closed', 'Closed'), + ('furni_wcandleset_name', 'White Candle Plate'), + ('furni_sleepingbag*3_name', 'Ocean Sleeping Bag'), + ('furni_tree3_name', 'Christmas Tree 1'), + ('furni_sound_set_26_name', 'Groove 1'), + ('furni_barrier*2_desc', 'No trespassing, please!'), + ('game_bs_turn1', 'Your Turn'), + ('nav_venue_bb_lobby_expert_desc', 'Expert battle ball!'), + ('alert_donate_topic', 'SCAM ALERT!'), + ('game_bs_turn2', 'The Enemy\'s Turn'), + ('furni_sand_cstl_gate_name', 'sand castle gate'), + ('furni_rare_dragonlamp*4_desc', 'Scary and scorching!'), + ('furni_camera_desc', 'Smile!'), + ('pet.hotwords.lie', 'lie down'), + ('furni_sound_set_60_name', 'Latin Love 2'), + ('console_accept_selected', 'Accept'), + ('furni_divider_silo1*3_desc', 'Neat and natty'), + ('furni_summer_chair*7_name', 'Green Deck Chair'), + ('furni_pumpkin_desc', 'Cast a spooky glow'), + ('reg_habboname_note', 'Now it\'s time to make your own Habbo character! To make your own Habbo, please start by choosing your Habbo Name.'), + ('furni_rare_icecream_campaign_name', 'Rare icecream white'), + ('furni_doormat_plain_desc', 'Available in a variety of colours'), + ('room_areYouSure', 'Are you sure you want to delete this item forever?'), + ('sound_machine_confirm_burn', 'Burn this song?'), + ('predefined_room_name', '%user_name%\'s room'), + ('furni_divider_silo1*2_name', 'Black Corner Shelf'), + ('furni_table_plasto_4leg*3_desc', 'Hip plastic furniture'), + ('furni_solarium_norja*8_name', 'Yellow Solarium'), + ('furni_exe_globe_desc', 'The power is yours!'), + ('furni_bed_polyfon*6_name', 'Blue Mode Double Bed'), + ('notickets_store_link', 'Go to ticket store >>>'), + ('NUF_habbo_home', 'Habbo Home'), + ('nav_venue_the_den_name', 'The Den'), + ('furni_table_plasto_square*2_name', 'Round Dining Table'), + ('modtool_header', 'The Tool'), + ('pet_enrg_7', 'Energetic'), + ('nav_noanswer', 'No answer'), + ('roommatic_hc_members_only', 'This Room Is For HC Members Only'), + ('furni_xmasduck_desc', 'A right Christmas quacker!'), + ('pet_enrg_8', 'Lively'), + ('NUF_getting_room_own_rooms_tutor', 'Click the \'Create own room\' button to start building your room. Don\'t worry, making your room is completely free.'), + ('pet_enrg_5', 'Sprightly'), + ('pet_enrg_6', 'Active'), + ('furni_doormat_plain*4_desc', 'Available in a variety of colours'), + ('pet_enrg_3', 'Lazy'), + ('pet_enrg_4', 'Relaxed'), + ('furni_divider_poly3*6_desc', 'Blue Mode Bardesk Gate'), + ('pet_enrg_1', 'Slow'), + ('furni_glass_table*2_desc', 'Translucent beauty'), + ('pet_enrg_2', 'Sluggish'), + ('poster_1003_desc', 'get the lovely isles on your walls'), + ('furni_hc_djset_name', 'The Grammophon'), + ('pet_enrg_9', 'Tireless'), + ('furni_table_plasto_round*6_name', 'Round Dining Table'), + ('furni_sporttrack2*3_name', 'Sport corner grass'), + ('furni_footylamp_name', 'Football Lamp'), + ('furni_bed_silo_one_desc', 'Plain and simple'), + ('pet_enrg_0', 'Tired'), + ('furni_soft_sofachair_norja*7_name', 'Rural Iced Sofachair'), + ('furni_solarium_norja*9_desc', 'Rejuvenate your pixels!'), + ('furni_pillow*9_desc', 'Puffy, soft and VERY fluffy!'), + ('furni_plant_mazegate_snow_desc', 'There\'s snow way through!'), + ('furni_sound_set_8_name', 'Ambient 2'), + ('furni_divider_silo3*4_name', 'Beige Area Gate'), + ('previous', 'Previous'), + ('furni_glass_stool*3_desc', 'Translucent beauty'), + ('furni_bardeskcorner_polyfon*8_name', 'Yellow Mode Bardesk Corner'), + ('next_onearrowed', 'Next >'), + ('nav_venue_sw_lobby_expert_desc', 'For the William Tells and Robin Hoods of Snow Storming.'), + ('furni_bardeskcorner_polyfon*2_name', 'Black Mode Bardesk Corner'), + ('catalog_pet_unacceptable', 'Sorry, that name is unacceptable to Hotel Management'), + ('furni_sound_set_46_name', 'Club 1'), + ('nav_error_room_full', 'The room is full.'), + ('furni_queue_tile1*4_name', 'Gold Habbo Roller'), + ('furni_mocchamaster_desc', 'Wake up and smell it!'), + ('furni_gothic_stool*1_name', 'Gothic Stool Pink'), + ('furni_noob_chair*5_name', 'My first Habbo chair'), + ('furni_noob_rug*3_desc', 'Nice and neat sisal rug with aubergine edging'), + ('nav_venue_club_mammoth/0_name', 'Club Mammoth'), + ('pet_race_1_024', 'Cat Burglar'), + ('pet_race_1_022', 'Matted Moggy'), + ('poster_39_name', 'Screaming Furnies'), + ('pet_race_1_023', 'Indoor Alley Cat'), + ('furni_prizetrophy5*3_desc', 'Breathtaking bronze'), + ('pet_race_1_020', 'Caterwaul Kitty'), + ('NUF_mini_meet_people_room_tutor', 'The people wandering around are Habbos just like you.\\nClick on one of them to learn more about them- or on yourself to look in the mirror.'), + ('pet_race_1_021', 'Fabulous Feline'), + ('furni_arabian_tetbl_name', 'Hexagonal Tea Table'), + ('furni_grand_piano*4_name', 'Amber Grand Piano'), + ('poster_504_desc', 'The German flag'), + ('roomatic_name', 'Room name:'), + ('furni_sound_set_21_desc', 'Headbanging riffs'), + ('credit_redeem_info', 'More info about credit furni >>'), + ('furni_marquee*a_desc', 'It\'s both door and a shade!'), + ('furni_sound_set_33_name', 'Rock 3'), + ('furni_queue_tile1*5_desc', 'The power of movement'), + ('furni_doorD_name', 'Imperial Teleport'), + ('furni_rare_parasol*1_desc', 'Block those rays!'), + ('purse_youhave', 'You Have'), + ('nav_fullbutton', 'Full'), + ('furni_rare_fountain*2_desc', 'For our feathered friends'), + ('friend_request_accepted', 'Accepted!'), + ('tutorial_help_button_bubble', 'Click the blue question mark to open up the help menu to restart the tutorial.'), + ('furni_rubberchair*4_desc', 'Soft and tearproof!'), + ('furni_sound_set_9_desc', 'Mystical ambient soundscapes'), + ('furni_rare_fan*3_name', 'Purple Dragon Skin Fan'), + ('furni_table_plasto_square*8_desc', 'Hip plastic furniture'), + ('gs_choose_gametime', 'Choose Game duration:'), + ('furni_traffic_light*1_desc', 'Chill and wait your turn!'), + ('furni_sofachair_polyfon*6_desc', 'Blue Mode Armchair'), + ('furni_chair_norja*4_name', 'Urban Iced Chair'), + ('furni_val_teddy*2_name', 'Pink Share Bear'), + ('nav_venue_chill/0_name', 'Zen Garden'), + ('furni_table_plasto_square_name', 'Occasional Table'), + ('furni_bed_budget_name', 'Pura Bed'), + ('furni_solarium_norja_name', 'White Solarium'), + ('furni_noob_table*1_name', 'My first Habbo table'), + ('gs_5min', '5min'), + ('purse_credits', 'You have \\x1 Habbo Credit(s) in your purse.'), + ('furni_divider_poly3*5_name', 'Candy Hatch (Lockable)'), + ('furni_rare_icecream*6_name', 'Toffee Ice Cream Machine'), + ('furni_table_polyfon_med_name', 'Large Coffee Table'), + ('console_deselect_all', 'Deselect all'), + ('nav_venue_bb_lobby_amateur_8_name', 'Gevorderden Battle Ball 9'), + ('transaction_system_sms_win_kpn', 'KPN SMS'), + ('nav_venue_bb_lobby_intermediate_3/0_desc', ''), + ('furni_CFC_500_goldbar_desc', 'Worth 500 Credits'), + ('NUF_visiting_rooms', 'Visiting other players\' rooms'), + ('url_logout_timeout', 'http://%predefined%//account/disconnected?reason=logout'), + ('furni_table_silo_med*7_desc', 'Green Area Coffee Table'), + ('player_commands_no_args', 'You have not supplied any arguments!'), + ('furni_romantique_pianochair*2_name', 'Lime Romantique Piano Chair'), + ('pickup', 'Pick up'), + ('reg_tutorial_url', ''), + ('habboclub_confirm_body', 'You have %credits% credits'), + ('nav_venue_bb_lobby_beginner_12/0_desc', ''), + ('furni_rare_elephant_statue*1_name', 'Silver Elephant'), + ('help', 'Habbo Help'), + ('furni_soft_sofachair_norja*2_desc', 'Black Iced Sofachair'), + ('furni_table_plasto_round*1_desc', 'Hip plastic furniture'), + ('furni_sleepingbag*9_desc', 'Ultimate coziness'), + ('furni_arabian_tray2_desc', 'For those Arabian nights'), + ('NUF_visiting_rooms_hotelview_tutor', 'Hello. This time we are learning how to visit another user\'s room.'), + ('furni_traffic_light*6_name', 'Red Traffic Light'), + ('Alert_ChooseWhoToSentMessage', 'Please choose who to\\rsend your message to'), + ('poster_47_desc', 'Twinkle, twinkle'), + ('bb_title_finalScores', 'Final standings:'), + ('jukebox_song_author', 'by: %author%'), + ('poster_2003_name', 'Dodgy Geezer'), + ('poster_509_name', 'The Jamaican flag'), + ('poster_6_desc', 'But is it the right way up?'), + ('furni_toy1*1_name', 'Rubber Ball'), + ('nav_venue_bb_lobby_beginner_13_name', 'Beginners Battle Ball 14'), + ('furni_scifidoor*5_name', 'White Spaceship Door'), + ('credit_redeem_text', 'You are going to change Furni to %value% credits.'), + ('nav_venue_sw_lobby_amateur_0_name', 'Snow Slingers Lobby'), + ('club_txt_intro', 'Welcome to Habbo Club - the members only club that all the best Habbos belong to!\\r\\rMembers of Habbo Club get priority access to the hotel (so you can always get in), exclusive clothes, hair colours, rare furni and special guest room layouts. To see exactly what you\'ll be able to get your hands on as a Habbo Club member, take a look in the Catalogue.'), + ('nav_venue_bouncer_room_1_name', 'Beginners Battle Ball Arena'), + ('update_email_suggest', 'Habbo Hotel security supervisor requests you to update your email'), + ('furni_rare_dragonlamp*3_name', 'Silver Dragon Lamp'), + ('furni_scifiport*2_name', 'Blue Laser Gate'), + ('club_button_extend', 'Extend Membership'), + ('wallitem_val_heart_name', 'Heart Light'), + ('furni_pura_mdl3*7_name', 'Green Pura Module 3'), + ('furni_sound_set_61_desc', 'Straight from the heart'), + ('nav_venue_bb_lobby_expert_9/0_desc', ''), + ('furni_pura_mdl2*9_name', 'Red Pura Module 2'), + ('furni_hal_cauldron_name', 'Habboween Cauldron'), + ('furni_divider_nor1*2_name', 'Black Ice corner'), + ('send', 'Send'), + ('furni_couch_norja_desc', 'Two can perch comfortably'), + ('furni_pura_mdl4*5_name', 'beige pura module 4'), + ('pet_race_1_008', 'Mad Mouser'), + ('pet_race_1_009', 'Scaredy Kat'), + ('pet_race_1_006', 'Titchy Tiger'), + ('pet_race_1_007', 'Burmese Buddy'), + ('pet_race_1_004', 'Soft-Toed Sneaker'), + ('furni_divider_nor4*8_desc', 'Habbos, roll out!'), + ('furni_tile_desc', 'In a choice of colours'), + ('pet_race_1_005', 'Cat Astroflea'), + ('pet_race_1_002', 'Lesser Spotted Longhair'), + ('pet_race_1_003', 'Hidden Clause'), + ('pet_race_1_000', 'Sleepy Siamese'), + ('pet_race_1_001', 'Purr-Sian'), + ('furni_sound_set_53_name', 'Snowy Surprise'), + ('furni_rare_icecream*1_desc', 'Virtual blueberry rocks!'), + ('furni_table_plasto_round*15_name', 'Occasional Table'), + ('security', 'Security'), + ('furni_glass_chair*5_name', 'Glass chair'), + ('nav_venue_cunning_fox_gamehall/1_desc', 'It\'s one-on-one for five in a row'), + ('nav_venue_sw_lobby_tournament_4/0_desc', ''), + ('furni_carpet_soft_desc', 'Soft Wool Rug'), + ('poster_27_desc', 'Deck the halls!'), + ('furni_safe_silo*7_desc', 'Totally shatter-proof!'), + ('furni_table_silo_small*5_desc', 'Pink Area Occasional Table'), + ('furni_marquee*4_desc', 'It\'s both door and a shade!'), + ('furni_gothic_sofa*4_desc', 'Ghosts and Ghouls'), + ('furni_prizetrophy6*1_desc', 'Glittery gold'), + ('pet_race_1_019', 'Bobcat Wailer'), + ('furni_bardesk_polyfon*5_desc', 'For cute constructions'), + ('furni_carpet_polar*2_name', 'Blue Bear Rug'), + ('pet_race_1_017', 'Furry Friend'), + ('furni_soft_sofa_norja*6_desc', 'Blue Iced Sofa'), + ('furni_pura_mdl2*4_desc', 'Any way you like it!'), + ('pet_race_1_018', 'Trusting Tabby'), + ('pet_race_1_015', 'Haughty House Pet'), + ('chatlog.url', 'https://theallseeingeye.sulake.com/ase/habbo/uk/housekeeping/extra/hobba/chatlog.action?chatId='), + ('furni_ham2_name', 'Eaten Ham'), + ('pet_race_1_016', 'Curiousity - The Return!'), + ('pet_race_1_013', 'Felis Catus Allergicus'), + ('pet_race_1_014', 'Bushy Bobtail'), + ('pet_race_1_011', 'Egyptian Angora'), + ('pet_race_1_012', 'Freckled Feral'), + ('gs_choose_gamefield', 'Choose Game Arena:'), + ('furni_divider_nor5*6_desc', 'Cool cornering for your crib y0!'), + ('furni_summer_pool*2_name', 'Red Summer Pool'), + ('pet_race_1_010', 'Wannabe Wildcat'), + ('furni_rare_elephant_statue_desc', 'Say hello to Nelly'), + ('furni_sofa_silo*8_desc', 'Cushioned, understated comfort'), + ('furni_exe_rug_desc', 'Please remove your shoes!'), + ('NUF_meeting_people_roomlist_tutor', 'Let\'s visit one of the rooms and find out how to meet other users.'), + ('furni_chair_plasto*15_desc', 'Hip plastic furniture'), + ('nav_venue_habburger\'s_name', 'Habburgers'), + ('queue_current_2', 'You are in queue for the room.'), + ('queue_current_1', 'You are in Habbo Live queue...'), + ('furni_pura_mdl5*3_name', 'Black Pura Module 5'), + ('furni_hockey_score_name', 'Scoreboard'), + ('furni_sofachair_silo*5_desc', 'Pink Area Armchair'), + ('furni_hyacinth1_name', 'Pink Hyacinth'), + ('furni_pura_mdl1*6_desc', 'Any way you like it!'), + ('camera_open_dialog_heading', 'Camera'), + ('furni_prizetrophy5*2_name', 'Duo trophy'), + ('furni_glass_chair_desc', 'Translucent beauty'), + ('furni_rubberchair*3_desc', 'Soft and tearproof!'), + ('furni_exe_plant_name', 'Executive Plant'), + ('furni_pura_mdl2*3_desc', 'Any way you like it!'), + ('furni_pura_mdl1*2_name', 'Pink Pura Module 1'), + ('furni_plant_bonsai_desc', 'You can be sure it lives'), + ('furni_plant_valentinerose*4_desc', 'Be mine!'), + ('wallitem_hrella_poster_3_desc', 'Don\'t drift away!'), + ('furni_deadduck_name', 'Dead Duck'), + ('furni_summer_grill*3_desc', 'Plenty of steak on that barbie'), + ('modtool_extrainfo', 'Extra Info:'), + ('sound_machine_jukebox_window', 'Jukebox'), + ('gs_button_start', 'Start Game!'), + ('nav_venue_sw_lobby_beginner_5/0_desc', ''), + ('furni_romantique_chair*5_desc', 'What does this button do?'), + ('furni_table_plasto_4leg*9_desc', 'Hip plastic furniture'), + ('furni_soft_sofa_norja_desc', 'A soft iced sofa'), + ('furni_divider_nor4*9_name', 'Red Iced Auto Shutter'), + ('login_haventGotHabbo', 'Haven\'t got a Habbo yet?'), + ('furni_noob_stool*2_name', 'My first Habbo stool'), + ('furni_s_sound_machine*5_desc', 'Sound Machine Brown Desc'), + ('credit_redeem_window', 'Redeem credit furni'), + ('send_invitation_text', 'Want to meet someone from our Welcoming Party?'), + ('purse_vouchers_exitbutton', 'Cancel'), + ('furni_prizetrophy6*3_desc', 'Breathtaking bronze'), + ('nav_venue_cafe_gold/0_name', 'Kultakahvila'), + ('furni_fortune_name', 'Crystal Ball'), + ('poster_22_name', 'Butterfly Cabinet (blue)'), + ('object_displayer_link_badge', 'Edit Badge'), + ('furni_sound_set_15_name', 'RnB Grooves 6'), + ('Alert_NoNameSet', 'Check your Habbo name.'), + ('furni_hc_crpt_name', 'Persian Carpet'), + ('error_ok', 'OK->'), + ('game_chess_email', 'Receive game via email'), + ('sound_machine_confirm_save_list', 'Save playlist?'), + ('furni_noob_rug*2_desc', 'Nice and neat sisal rug with blue edging'), + ('queue_set.e1.alert', 'This room is currently available only to Habbos participating to the event.'), + ('furni_rare_icecream*0_desc', 'Virtual cherry rocks!'), + ('furni_arabian_chair_name', 'Green Blossom Chair'), + ('furni_divider_silo3*6_name', 'Blue Area Gate'), + ('furni_scifiport*4_desc', 'Energy beams. No trespassers!'), + ('furni_sofa_silo*4_desc', 'Beige Area Sofa'), + ('furni_one_way_door*4_desc', 'One at a time!'), + ('furni_chair_norja*5_desc', 'Sleek and chic for each cheek'), + ('furni_sound_set_19_desc', 'Shake your body!'), + ('poster_26_desc', 'See that halo gleam!'), + ('furni_doormat_plain*2_desc', 'Available in a variety of colours'), + ('furni_romantique_chair*1_name', 'Rose Quartz Chair'), + ('furni_hc_tv_name', 'Mega TV Set'), + ('pet.hotwords.follow_me', 'heel'), + ('furni_petfood3_desc', 'Fantastic 20% Saving!'), + ('furni_couch_norja*5_name', 'Pink Bench'), + ('furni_table_plasto_round*7_desc', 'Hip plastic furniture'), + ('furni_bed_armas_two_desc', 'King-sized pine comfort'), + ('modtool_days', 'Days'), + ('furni_one_way_door*7_name', 'Green One Way Gate'), + ('furni_table_norja_med*5_name', 'Large Coffee Table Pink'), + ('furni_sand_cstl_wall_name', 'sand_cstl_wall'), + ('nav_modify_doorstatus_givepw', 'Password for the room'), + ('NUF_getting_items_room_tutor', 'Nice room. Reminds me of a chic Parisian cafe in Slough. Open the Catalogue.'), + ('habbo_hand_prev', '<<<'), + ('pet.saying.generic.croco.3', 'Tick tock tick....'), + ('invitation_follow_failed', 'Sorry, your attempt to follow an invitation failed.'), + ('furni_sound_set_12_desc', 'Unusual as Standard'), + ('pet.saying.generic.croco.1', '*Mellow*'), + ('error_text', 'Error occured, press \'OK\' to restart program.\\r\\rPlease report bugs to:\\rwww.habbohotel.com/habbo/en/help/contact/bugs/ \\rSorry for the inconvenience.'), + ('pet.saying.generic.croco.2', 'I\'m so hungry I could eat you!'), + ('furni_divider_silo3*3_desc', 'Form following function'), + ('furni_table_plasto_4leg*2_desc', 'Hip plastic furniture'), + ('int_newmessages', 'New Message(s)'), + ('furni_rare_icecream*3_name', 'Blackcurrant Ice Cream Machine'), + ('bb_header_gameinfo', 'Game info'), + ('furni_scifiport*0_name', 'Red Laser Door'), + ('nav_venue_bb_lobby_beginner_7_name', 'Beginners Battle Ball 8'), + ('tx_history.description.bank_wallie', 'Wallie-card'), + ('nav_venue_hallway_name', 'Hallway'), + ('nav_venue_bb_lobby_amateur_11/0_desc', ''), + ('furni_bed_budget_one*5_desc', 'Prince sized comfort!'), + ('pet.saying.generic.croco.0', 'Rrrr....Grrrrrg....'), + ('nav_popup_go', '>>'), + ('furni_safe_silo*3_name', 'White Safe Minibar'), + ('furni_table_silo_small_name', 'Occasional Table'), + ('poll_confirm_window', 'Leave our poll'), + ('furni_table_norja_med*9_desc', 'For larger gatherings'), + ('furni_divider_nor4*6_desc', 'Habbos, roll out!'), + ('gs_3teams', '3 Teams Game'), + ('wallitem_post.it.limit', 'Only 50 stickies per room are allowed!'), + ('furni_scifidoor*4_desc', 'Protect your pot of gold!'), + ('furni_bed_polyfon_one*9_name', 'Red Single Bed'), + ('furni_soft_sofa_norja*2_desc', 'Black Iced Sofa'), + ('furni_corner_china_desc', 'Firm, fireproof foundation'), + ('hobba_pickup_go', 'Pick Up & Go!'), + ('furni_sporttrack3*2_desc', 'null'), + ('furni_rare_fan*6_name', 'Ochre Powered Fan'), + ('furni_sound_set_3_name', 'Electronic 1'), + ('NUF_mini_meet_people_user_tutor', 'Here you can chat to users directly. Ask a Habbo to be your friend by clicking on their Habbo and the button.\\nIf this is your first time, check your Hand to see a present to decorate your own room with, later.'), + ('furni_pura_mdl2*6_name', 'Blue Pura Module 2'), + ('furni_couch_norja*9_desc', 'Two can perch comfortably'), + ('furni_chair_plasty*9_desc', 'Hip plastic furniture'), + ('game_chess_white', 'White:'), + ('nav_venue_sw_lobby_intermediate_3/0_desc', 'Lumisota sen kuin vain kovenee.'), + ('furni_table_plasto_square*3_desc', 'Hip plastic furniture'), + ('nav_venue_theatredrome/0_desc', 'Perform your latest masterpiece!'), + ('nav_venue_the_den/0_desc', 'Has anyone seen my map?'), + ('furni_sound_set_40_name', 'Rock 4'), + ('remove', 'Remove'), + ('friend_request_decline_all', 'Decline all requests.'), + ('furni_rare_globe_name', 'Snow Globe'), + ('furni_bardesk_polyfon*8_name', 'Yellow Mode Bardesk'), + ('nav_venue_sw_lobby_free_6_name', 'Free Game Lobby'), + ('queue_change', 'Change queue'), + ('reg_parentemail_link_text2', 'Privacy Pledge'), + ('furni_rare_parasol*2_desc', 'Block those rays!'), + ('furni_romantique_pianochair*3_desc', 'null'), + ('reg_parentemail_link_text1', 'See the letter'), + ('sound_machine_list_save', 'Save Playlist'), + ('nav_public_helptext_hd', 'Public Spaces'), + ('furni_chair_plasty*2_desc', 'Hip plastic furniture'), + ('spectator_count', 'spectators %cnt%/%max%'), + ('reg_welcome2', 'Create Your Own Habbo'), + ('wallitem_roomdimmer_desc', 'Superior lighting for your room'), + ('furni_prizetrophy*3_name', 'Classic trophy'), + ('furni_plant_rose_name', 'Cut Roses'), + ('reg_welcome3', 'Now the fun begins! All you need to do is register and you\'re ready to start. It won\'t take long!\\rYou can change everything except your name and date of birth later. Come on!'), + ('furni_noob_table*5_name', 'My first Habbo table'), + ('nav_error_room_closed', 'The room is closed.'), + ('reg_changePassword', 'Change your password'), + ('furni_divider_nor5*3_desc', 'Cool cornering for your crib y0!'), + ('furni_doorC_name', 'Portaloo'), + ('furni_chair_plasty*10_name', 'Plastic Pod Chair'), + ('furni_pura_mdl1*9_name', 'Red Pura Module 1'), + ('furni_rare_stand_name', 'Speaker\'s Corner'), + ('furni_grunge_table_name', 'Grunge Table'), + ('furni_traffic_light*2_name', 'Blue Traffic Light'), + ('pet.saying.angry.croco.2', 'You have displeased me.'), + ('human_trading', 'Trading'), + ('furni_noob_stool*6_desc', 'Unfold me and take the weight off (green)'), + ('pet.saying.angry.croco.1', 'Rawwwr...rrr'), + ('nav_venue_sw_lobby_intermediate_5_name', 'Snow Bombardiers Lobby'), + ('gs_button_leavegame', 'Leave Game'), + ('pet.saying.angry.croco.0', 'Grrrrr...rrr'), + ('furni_s_sound_machine*1_name', 'Sound Machine Grey'), + ('pet.saying.angry.croco.4', 'Buuuuurrr..rrrrr'), + ('furni_chair_plasto*7_desc', 'Hip plastic furniture'), + ('pet.saying.angry.croco.3', 'Rowrrrr...rrrr'), + ('furni_soft_sofa_norja*9_desc', 'Red Iced Sofa'), + ('nav_venue_skylight_lobby_name', 'Skylight Lobby'), + ('furni_bed_polyfon_one*6_desc', 'Blue Mode Single Bed'), + ('furni_pillow*8_desc', 'Puffy, soft and huge'), + ('furni_hc_rntgn_name', 'X-Ray Divider'), + ('furni_table_silo_med*5_desc', 'Pink Area Coffee Table'), + ('furni_gothic_stool*2_desc', 'Be seated please..'), + ('furni_typingmachine_desc', 'Write that bestseller'), + ('furni_fridge_desc', 'Keep cool with a chilled snack or drink'), + ('nav_venue_cunning_fox_gamehall/4_desc', 'Get a hand like a foot? Keep a straight face and bluff it out'), + ('doorbell_rings', 'Rings the doorbell - Open the door?'), + ('furni_divider_silo1*9_desc', 'Red Area Small Table'), + ('nav_venue_bb_lobby_intermediate_7/0_desc', ''), + ('furni_prize1_name', 'Gold Trophy'), + ('poster_54_name', 'Hockey Stick'), + ('furni_sound_set_47_name', 'Club 2'), + ('furni_prizetrophy3*1_name', 'Globe trophy'), + ('purse_head2', 'ACCOUNT TRANSACTIONS'), + ('furni_soft_sofa_norja*5_name', 'Pink Iced Sofa'), + ('furni_prizetrophy9*1_desc', 'Glittery gold'), + ('buddyremove_next', 'Next >'), + ('reg_girl', 'Girl'), + ('furni_bed_budget_one*1_name', 'Aqua Pura Bed'), + ('NUF_visiting_rooms_roomlist_go', 'Click \'Go\' to go to a room.'), + ('poster_506_desc', 'To \'Finnish\' your decor...'), + ('furni_toy1_name', 'Rubber Ball'), + ('furni_sound_set_7_desc', 'Sound effects for Furni'), + ('sw_fieldname_6', 'Riverbank Siege'), + ('sw_fieldname_5', 'Polar Labyrinth'), + ('furni_bed_polyfon*4_desc', 'Beige Mode Double Bed'), + ('furni_pillow*4_name', 'Gold Feather Pillow'), + ('alert_duplicatesession', 'You are already logged in on another hotel! Log out before trying again.'), + ('sw_fieldname_7', 'Skull Falls Assault'), + ('sound_machine_alert_song_not_ready', 'Can\'t save song! Song not ready yet.'), + ('nav_venue_bb_lobby_beginner_5/0_desc', ''), + ('nav_venue_bb_lobby_tournament_4/0_desc', ''), + ('pet.saying.play.dog.1', 'woofWOOFwoofWOOFwoof'), + ('pet.saying.play.dog.0', 'rrr.. WOOF .rrr..'), + ('furni_cn_lamp_name', 'Lantern'), + ('furni_arabian_rug_name', 'Berber Kilim Rug'), + ('NUF_groups_hotelview_tutor', 'You have now opened the Group tutorial in the website window. Special!'), + ('gs_error_start_9', 'Team sizes can only differ by one player. This Game cannot start!'), + ('furni_divider_poly3*7_desc', 'Green Mode Bardesk Gate'), + ('furni_sofachair_silo*4_desc', 'Beige Area Armchair'), + ('poster_58_desc', 'whish you luck'), + ('furni_chair_basic*2_desc', 'It\'s a cracking design!'), + ('poster_516_name', 'The English flag'), + ('nav_venue_sw_lobby_tournament_2/0_desc', ''), + ('furni_gothic_carpet_name', 'Cobbled Path'), + ('sw_title', 'Snow Storm'), + ('furni_doormat_plain*5_name', 'Doormat'), + ('furni_pura_mdl4*4_desc', 'Any way you like it!'), + ('furni_sound_machine*1_name', 'Sound Machine'), + ('furni_sofa_silo*7_name', 'Green Area Sofa'), + ('nav_venue_sw_lobby_tournament_4_name', 'Tournament Lobby'), + ('gs_title_gamecreation', 'Game creation'), + ('furni_couch_norja*2_desc', 'Two can perch comfortably'), + ('furni_prizetrophy5_desc', 'Palkinto'), + ('furni_divider_nor3*9_desc', 'Red Iced gate'), + ('furni_present_gen_name', 'Gift'), + ('furni_prizetrophy7*3_name', 'Bronze Habbo trophy'), + ('alert_reg_parent_email', 'The email address you provided is unacceptable.'), + ('furni_bed_polyfon_girl_name', 'Double Bed'), + ('furni_rare_fountain_name', 'Bird Bath (red)'), + ('furni_pura_mdl3*3_name', 'Black Pura Module 3'), + ('furni_plant_pineapple_name', 'Pineapple Plant'), + ('furni_divider_nor2*8_name', 'Yellow Iced bar desk'), + ('messenger', 'Messenger'), + ('nav_venue_bb_arena_0_name', 'Battle Ball kaikille'), + ('sw_fieldname_2', 'Algid River'), + ('furni_bed_silo_two_desc', 'Plain and simple x2'), + ('sw_fieldname_1', 'Arctic Island'), + ('furni_pillow*1_desc', 'Puffy, soft and huge'), + ('sw_fieldname_4', 'Frosty Forest'), + ('sw_fieldname_3', 'Glacial Fort'), + ('furni_bar_basic_desc', 'A pura series 300 minibar'), + ('tutorial_welcome_M', 'Hi! I am your guide to Habbo Hotel. Please pick a topic to start.'), + ('tutorial_welcome_F', 'Hi there! I\'m your guide to Habbo Hotel. What would you like to learn today?'), + ('Alert_NoNameSetForLogo', 'Please give a name to your logo'), + ('furni_glass_table*5_name', 'Glass table'), + ('group_owner', 'Owner'), + ('console_target_friend_list_full', 'This user\'s friend list is full'), + ('furni_romantique_smalltabl*2_name', 'Lime Tray Table'), + ('ph_keys_spacebar', 'Spacebar'), + ('furni_noob_chair*3_name', 'My first Habbo chair'), + ('NUF_meeting_people_roomlist_publicTab', 'Click the Public Spaces tab to see the list of public rooms. To go to the room click the \'Go\' button.'), + ('furni_bed_polyfon*7_name', 'Green Mode Double Bed'), + ('furni_jukebox_ptv*1_name', 'Jukebox Pacha TV'), + ('poster_513_desc', 'Aussies rule!'), + ('poster_51_desc', '2 points for every basket'), + ('furni_toy1*2_name', 'Rubber Ball'), + ('furni_bartable_armas_name', 'Bardesk'), + ('nav_venue_sw_lobby_amateur_0/0_desc', ''), + ('NUF_mini_use_console_read_tutor', 'The Habbo Console lets you message with people you have added to your friends list.'), + ('nav_venue_bb_lobby_beginner_12_name', 'Beginners Battle Ball 13'), + ('poster_2002_name', 'Urho Kaleva Kekkonen'), + ('furni_sound_set_44_desc', 'Haunted Dimension'), + ('pet.saying.beg.dog.1', 'Oouh..oouh..snuh..ooo'), + ('furni_sporttrack2*1_name', 'Sport corner tartan'), + ('pet.saying.beg.dog.0', 'Oooo...Ouuu...oo...OUUU'), + ('furni_solarium_norja*5_desc', 'Rejuvenate your pixels!'), + ('pet.saying.beg.dog.2', '*whimpers *'), + ('reg_pledgelink', 'Hotel rules'), + ('habboclub_price1.days', '30'), + ('furni_glass_shelf_desc', 'Translucent beauty'), + ('furni_sofachair_polyfon*3_name', 'White Armchair'), + ('reg_verification_info', 'You must know the correct birthday and password before you\'re allowed to make these changes.'), + ('furni_carpet_soft*5_desc', 'Soft Wool Rug'), + ('furni_grunge_mattress_name', 'Grunge Mattress'), + ('furni_bed_polyfon_one_name', 'Single Bed'), + ('furni_sound_machine_pro_name', 'Sound Machine Pro'), + ('furni_chair_china_desc', 'The elegant beauty of tradition'), + ('furni_rare_icecream*7_desc', 'Virtual chocolate rocks!'), + ('furni_table_silo_med*8_name', 'Yellow Coffee Table'), + ('club_gift.message', 'Happy Habbo Club! Love Callie :)'), + ('furni_sw_raven_desc', 'My name is Otter'), + ('furni_noob_table*2_desc', 'Lightweight, practical and dark blue'), + ('furni_soft_sofachair_norja*3_desc', 'Soft Iced sofachair'), + ('sound_machine_confirm_delete', 'Delete song?'), + ('furni_plant_fruittree_name', 'Fruit Tree'), + ('nav_venue_bb_lobby_intermediate_1/0_desc', ''), + ('furni_heartsofa_name', 'Heart Sofa'), + ('furni_bed_budget_one*8_name', 'Yellow Pura Bed'), + ('NUF_getting_room', 'Making your own room'), + ('furni_rare_elephant_statue*2_name', 'Bronze Elephant'), + ('nav_venue_ballroom/0_desc', 'Come play ball!'), + ('nav_venue_sw_lobby_amateur_1_name', 'Snow Slingers Lobby'), + ('console_lasttime', 'Last Time'), + ('furni_md_sofa_desc', 'A decent recliner'), + ('furni_wooden_screen*6_name', 'Blue Oriental Screen'), + ('partner_registration_text', 'Click the link to finish your registration. When you have finished the registration click OK to continue to the hotel.'), + ('furni_sound_set_62_desc', 'Music of the Arabian night!'), + ('furni_arabian_divdr_name', 'Soft wooden screen'), + ('furni_tree1_desc', 'Dead christmas tree'), + ('furni_grand_piano*3_name', 'Pink Grand Piano'), + ('console_select_requests', 'Following users have asked to be your friend. Please accept or decline.'), + ('furni_divider_nor4*2_name', 'Black Iced Auto Shutter'), + ('furni_glass_chair*3_name', 'Glass chair'), + ('reg_passwordContainsNoNumber', 'Password must contain at least one number'), + ('buddyremove_invert', 'Invert Selection'), + ('furni_val_teddy*5_desc', 'The yellow bear of understanding'), + ('furni_sound_set_51_name', 'Club 6'), + ('poster_1_desc', 'The Noble and Silver Show'), + ('roomevent_create_name', 'Type the name of your event'), + ('Alert_unacceptableName', 'Sorry, that name is unacceptable to the Hotel Management'), + ('NUF_getting_room_go_tutor', 'Your room is now ready. Let\'s go see! I hope you have a bed...'), + ('poster_520_name', 'The Rainbow Flag'), + ('password', 'Password:'), + ('furni_bed_budget*8_name', 'Yellow Pura Double Bed'), + ('gs_header_gamelist', 'Game List'), + ('furni_chair_plasty_desc', 'Hip plastic furniture'), + ('url_purse_subscribe', 'http://%predefined%//credits?'), + ('furni_table_plasto_bigsquare*15_desc', 'Hip plastic furniture'), + ('furni_glass_stool*6_desc', 'Translucent beauty'), + ('error_report', 'Error Report'), + ('summer_chair_6_desc', 'Get decked'), + ('furni_chair_basic*5_name', 'chair_basic'), + ('room_remove_specs', 'Sorry! Now it\'s someone else\'s turn to watch this event.'), + ('furni_bunny_desc', 'Yours to cuddle up to'), + ('invitation_exists', 'You have already invited members of the Welcoming Party to your room.'), + ('purse_vouchers_furni_success', 'Voucher was successfully redeemed. You have been given the following furniture:'), + ('nav_rooms_popular', 'Popular rooms'), + ('nav_cancel', 'Cancel'), + ('alert_cross_domain_download', 'Cross domain content download prevented'), + ('furni_table_plasto_4leg*16_desc', 'Hip plastic furniture'), + ('url_pets', 'http://%predefined%//hotel/pets'), + ('furni_bardeskcorner_polyfon*9_desc', 'Tuck it away'), + ('gs_button_cancel', 'Cancel'), + ('furni_barchair_silo*7_name', 'Green Bar Stool'), + ('catalog_credits', 'You have \\x Credits in your purse.'), + ('furni_divider_nor3_name', 'Door (Lockable)'), + ('nav_modify_name', 'Name of the room'), + ('nav_venue_bb_lobby_amateur_7_name', 'Gevorderden Battle Ball 8'), + ('nav_venue_club_massiva/0_desc', 'Rest your dancing feet!'), + ('furni_gothrailing_desc', 'The dark side of Habbo'), + ('queue_set.na.alert', 'This Room is for Staff only.'), + ('nav_venue_bb_lobby_tournament_8_name', 'Competitie Battle Ball 9'), + ('furni_sound_set_29_name', 'Dance 2'), + ('console_msgs', 'msgs'), + ('furni_noob_lamp*6_name', 'My first Habbo lamp'), + ('furni_marquee*6_desc', 'It\'s both door and a shade!'), + ('furni_chair_plasto*16_desc', 'Hip plastic furniture'), + ('furni_chair_basic*9_desc', 'It\'s a cracking design!'), + ('summer_chair_2_name', 'Pink Deck Chair'), + ('alert_too_much_furnitures', 'Furni limit for room is exceeded. Not all furnitures are shown. Please remove some.'), + ('furni_pura_mdl5*4_name', 'White Pura Module 5'), + ('bus.full_msg', 'The FRANK bus is full at the moment, please come back later or visit the FRANK page below for more information.'), + ('furni_sound_set_22_name', 'SFX 3'), + ('furni_gothic_sofa*3_desc', 'The dark side of Habbo'), + ('furni_md_limukaappi_name', 'Habbo Cola Machine'), + ('poster_19_desc', 'Trying to get in or out?'), + ('gs_2min', '2min'), + ('poster_8_desc', 'Habbos come in all colours'), + ('furni_pillar*6_desc', 'Ancient and stately'), + ('furni_carpet_standard*3_desc', 'Available in a variety of colours'), + ('purse_vouchers_info', 'When you buy Habbo Credits with a mobile phone, you will receive a special voucher code. Enter the code in the box above, click \'Get Credits!\' and they\'ll be added to your purse.'), + ('furni_valeduck_name', 'Valentine\'s Duck'), + ('Alert_MessageFromAdmin', 'Message from Hotel Management:'), + ('furni_present_gen1_desc', 'What\'s inside?'), + ('reg_tutorial_txt', ''), + ('furni_tile_stella_name', 'Star Tile'), + ('furni_shelves_norja*4_name', 'Urban Iced Bookcase'), + ('transaction_system_creditcards_is', 'Creditcard'), + ('furni_shelves_polyfon_desc', 'For the arty pad'), + ('furni_tv_luxus_name', 'Digital TV'), + ('recycler_status_window_title', 'Recycling Status'), + ('furni_sleepingbag*6_name', 'Purple Sleeping Bag'), + ('gs_button_shrink', 'Minimize Window'), + ('furni_wcandleset_desc', 'Simple but stylish'), + ('furni_sleepingbag*3_desc', 'Ultimate coziness'), + ('object_displayer_show_actions', 'Show actions'), + ('hubu_t5_1', 'Lisetoa huumeista'), + ('song_disk_text_template', '%name%'), + ('hubu_t5_2', 'Huumeista-esite'), + ('queue_other_1', 'Habbo Live queue status'), + ('poster_33_name', 'Save the Panda'), + ('hubu_t5_3', 'Yleistietoa EOPH ry:st--------------'), + ('queue_other_2', 'Room queue status'), + ('furni_hcsohva_name', 'Throne Sofa'), + ('furni_sound_set_26_desc', 'Bollywood Beats!'), + ('furni_christmas_poop_name', 'Reindeer Droppings'), + ('furni_rare_dragonlamp*4_name', 'Serpent of Doom'), + ('nav_venue_bb_lobby_amateur_7/0_desc', ''), + ('purse_value', 'VALUE'), + ('furni_glass_sofa*5_desc', 'Translucent beauty'), + ('nav_venue_bb_lobby_tournament_15/0_desc', ''), + ('furni_glass_stool*2_desc', 'Translucent beauty'), + ('pet.saying.play.cat.1', 'Purrrr.. oo..Purrr'), + ('furni_pura_mdl4*7_name', 'Green Pura Module 4'), + ('nav_venue_cafe_ole/0_desc', 'Relax with friends over one of Marias specialty coffees'), + ('pet.saying.play.cat.0', 'Mew..MEOW..meow'), + ('furni_pumpkin_name', 'Pumpkin Lamp'), + ('furni_summer_chair*7_desc', 'Reserved!'), + ('ph_tickets_txt', 'Tickets can be used for BattleBall: Rebound!, SnowStorm, the Lido Diving and Wobble Squabble games. Tickets never expire.\\r\\rCurrently you have \\x1 ticket(s).'), + ('roomatic_onemoment', 'Please wait, we are going to your room...'), + ('furni_small_table_armas_name', 'Occasional Table'), + ('furni_table_polyfon_med_desc', 'For larger gatherings'), + ('nav_venue_bb_lobby_expert_3/0_desc', ''), + ('furni_chair_silo*6_desc', 'Blue Silo Dining Chair'), + ('furni_exe_globe_name', 'Power Globe'), + ('furni_bed_budget_one_name', 'bed_budget_one'), + ('furni_divider_silo1*2_desc', 'Neat and natty'), + ('nav_venue_bb_lobby_intermediate_0_name', 'Intermediate'), + ('furni_sofa_polyfon*9_desc', 'Comfort for stylish couples'), + ('furni_noob_lamp*3_desc', 'Get the light right where you want it (aubergine)'), + ('nav_showfull', 'Show Full Rooms'), + ('furni_divider_nor3*2_desc', 'Black Iced gate'), + ('reg_note_title', 'Warning!'), + ('hubu_answ_count', 'Replies'), + ('nav_recommended_rooms', 'Recommended Rooms'), + ('transaction_system_bank_nordea', 'Nordea'), + ('furni_sound_set_37_desc', ''), + ('poster_2006_desc', 'He is the magic Habbo'), + ('sw_link_gameRules_url', 'http://%predefined%//groups/56553/id'), + ('wave', 'Wave'), + ('furni_hc_djset_desc', 'Very old skool scratch\'n\'spin'), + ('furni_plant_maze_name', 'Maze Shrubbery'), + ('furni_scifirocket*3_name', 'Endor Smoke Machine'), + ('furni_val_teddy*1_name', 'Grey Share Bear'), + ('recycler_ready_outcome', 'Recycling reward: %outcome%'), + ('poster_4_desc', 'Fake of course!'), + ('poster_62_desc', 'We can\'t bear to lose them!'), + ('furni_glass_stool*9_desc', 'Translucent beauty'), + ('furni_goodie1_name', 'Marzipan Man'), + ('nav_modify_choosecategory', 'Choose a category for your room'), + ('object_displayer_link_home', 'User\'s home page'), + ('nav_venue_sw_lobby_tournament_8/0_desc', ''), + ('furni_xmasduck_name', 'Christmas Rubber Duck'), + ('help_txt_2', 'Password Reset'), + ('pet_mood_2', 'Blue'), + ('furni_queue_tile1*4_desc', 'The power of movement'), + ('help_txt_1', 'How do I get Credits?'), + ('pet_mood_3', 'Contented'), + ('nav_venue_bb_lobby_tournament_1_name', 'Competitie Battle Ball 2'), + ('furni_rare_daffodil_rug_name', 'Petal Patch'), + ('help_txt_4', 'The Habbo Way'), + ('pet_mood_0', 'Miserable'), + ('help_txt_3', 'Help with Habbo Hotel'), + ('pet_mood_1', 'Depressed'), + ('pet_mood_6', 'Ecstatic'), + ('furni_bed_budget*4_name', 'White Pura Double Bed'), + ('nav_venue_bb_lobby_amateur_0_name', 'Amateur'), + ('furni_sofachair_polyfon*7_desc', 'Green Mode Armchair'), + ('yes', 'Yes'), + ('pet_mood_4', 'Happy'), + ('pet_mood_5', 'Joyful'), + ('furni_sound_set_30_desc', 'Moments in love'), + ('furni_prizetrophy2*1_desc', 'Glittery gold'), + ('furni_wooden_screen*3_desc', 'Add an exotic touch to your room'), + ('transaction_system_bank_op', 'Osuuspankki'), + ('help_txt_6', 'Contact Us'), + ('help_txt_5', 'Safety Tips'), + ('furni_bardeskcorner_polyfon*2_desc', 'Black Mode Bardesk Corner'), + ('poster_15_desc', 'Marvellous mountains'), + ('room_areYouSurePlace', 'Warning! If you put something down in this room you will not be able to pick it up again.'), + ('nav_venue_bouncer_room_3_name', 'Semi-profs Battle Ball Arena'), + ('furni_chair_plasto*12_name', 'Chair'), + ('furni_gothic_chair*6_name', 'Gothic Chair Blue'), + ('furni_sofa_polyfon*2_desc', 'Black Mode Sofa'), + ('modtool_alertuser', 'Alert User'), + ('furni_toilet_desc', 'Loo Seat'), + ('furni_plant_cruddy_name', 'Aloe Vera'), + ('nav_venue_space_cafe/0_desc', 'In this space noone can see you ask for a soda!'), + ('nav_incorrectflatpw', 'Incorrect, try again.'), + ('furni_chair_plasto*13_desc', 'Hip plastic furniture'), + ('login_firstTimeHere', 'First time here?'), + ('furni_skullcandle_desc', 'Alas poor Yorrick...'), + ('NUF_mini_endtopic_step1_tutor', 'Well that\'s all from me. If you have any problems just click the little blue question mark to restart the tutorial and find our FAQs.\\nTo start exploring by yourself, click Close guide from the upper left corner.'), + ('furni_divider_poly3*3_name', 'White Hatch'), + ('help_callforhelp', 'Get Live Help'), + ('furni_rare_fountain*2_name', 'Bird Bath (green)'), + ('nav_venue_rooftop_name', 'Rooftop Cafe'), + ('furni_scifiport*7_name', 'Turquoise Sci-Fi Port'), + ('purse_back_to_credits', 'Back To Purse'), + ('room_ban', 'Kick & ban'), + ('furni_pura_mdl5*1_name', 'Aqua Pura Module 5'), + ('furni_val_teddy*4_name', 'Brown Share Bear'), + ('poster_40_name', 'Bonnie Blonde'), + ('NUF_getting_room_navigator_tutor', 'You want to click it real good. The \'Own room(s)\' tab I mean. Don\'t click yourself. It\'s unhygienic.'), + ('summer_chair_3_desc', 'Relax and enjoy the sun'), + ('furni_wooden_screen*2_name', 'RosewoodScreen'), + ('nav_venue_sun_terrace_name', 'Sun Terrace'), + ('furni_rare_fan*3_desc', 'Keeps the heat off St George!'), + ('nav_venue_sport_name', 'Power Gym'), + ('furni_toilet_red_desc', 'Loo Seat'), + ('retype_password', 'Retype Password:'), + ('furni_chair_basic*6_desc', 'It\'s a cracking design!'), + ('console_friends_helptext', 'This screen shows a list of all your Habbo Friends. It tells you where they are in the hotel, or, if they\'re not checked in, when their last visit was.'), + ('NUF_getting_items_room_', 'This is the Catalogue icon. Click to open it.'), + ('furni_grunge_barrel_desc', 'Beacon of light!'), + ('furni_soft_sofachair_norja*6_name', 'Blue Iced Sofachair'), + ('int_howtoget', 'How To get?'), + ('furni_sound_set_23_desc', 'Don\'t be afraid of the dark'), + ('nav_ok', 'OK'), + ('furni_sofachair_polyfon*6_name', 'Blue Mode Armchair'), + ('nav_venue_theatredrome_valentine_name', 'Theatredrome Valentine'), + ('furni_sofachair_polyfon_desc', 'Loft-style comfort'), + ('poster_83_name', 'Pöllö huhuilee'), + ('furni_soft_sofachair_norja*2_name', 'Black Iced Sofachair'), + ('roomdimmer_furni_limit', 'You can only have one roomdimmer per room'), + ('recycler_progress_timeleft', 'Time left: %hours% h and %minutes% min'), + ('furni_chair_plasto*3_name', 'Chair'), + ('NUF_getting_room_hotelview_tutor', 'Now you will learn how to make your own room. First go to the Guest Rooms area of the Navigator.'), + ('roomevent_create', 'Create'), + ('reg_year', 'Year'), + ('furni_divider_poly3_name', 'Hatch (Lockable)'), + ('furni_divider_nor1*7_name', 'Rural Iced Corner'), + ('furni_rare_beehive_bulb_name', 'Blue Amber Lamp'), + ('furni_waterbowl*2_name', 'Green Water Bowl'), + ('NUF_getting_room_room_hand', 'Open your hand!'), + ('furni_carpet_standard*6_desc', 'Available in a variety of colours'), + ('furni_CF_5_coin_silver_name', 'Silver Coin'), + ('furni_shelves_norja*7_name', 'Rural Iced Bookcase'), + ('opening_hours_text_disabled', 'The Hotel is shutting down really soon. To avoid confusion, purchasing of furniture, Habbo Club and game tickets have been disabled, as well as playing games and furniture trading. Try again tomorrow when the hotel is open!'), + ('nav_venue_bb_lobby_5_name', 'Battle Ball Kaikille'), + ('game_bs_congrat', 'Congratulations!'), + ('furni_arabian_tray2_name', 'Candle Tray'), + ('furni_giftflowers_desc', 'Guaranteed to stay fresh'), + ('club_button_1_period', 'Buy 1 >>>'), + ('furni_bed_polyfon_one*2_desc', 'Black Mode Single Bed'), + ('poster_47_name', 'Small silver star'), + ('furni_divider_nor3*5_desc', 'Pink Iced gate'), + ('furni_sofachair_polyfon_girl_desc', 'Think pink'), + ('furni_pura_mdl5*8_name', 'Yellow Pura Module 5'), + ('furni_hal_cauldron_desc', 'Eye of Habbo and toe of Mod!'), + ('poster_1006_name', 'Hoot Poster'), + ('furni_carpet_valentine_name', 'Red carpet'), + ('furni_floortile_name', 'Floor Tile'), + ('furni_divider_nor1*4_name', 'Urban Iced Corner'), + ('furni_bardeskcorner_polyfon*12_desc', 'Tuck it away'), + ('furni_table_plasto_bigsquare*3_desc', 'Hip plastic furniture'), + ('furni_traffic_light*6_desc', 'Chill and wait your turn!'), + ('club_general_prepaid', 'Prepaid Months'), + ('wallitem_val_heart_desc', 'Heartbroken... without your love!'), + ('furni_pura_mdl3*7_desc', 'Any way you like it!'), + ('furni_sound_set_58_name', 'RnB Grooves 4'), + ('furni_china_shelve_name', 'Chinese Lacquer Bookshelf'), + ('furni_divider_silo1*5_desc', 'Pink Area Corner Shelf'), + ('nav_venue_sw_lobby_tournament_desc', 'For stand-alone Tournaments.'), + ('furni_divider_silo2_name', 'Screen'), + ('furni_plant_mazegate_name', 'Maze Shrubbery Gate'), + ('poster_509_desc', 'The flag of Jamaica'), + ('furni_soft_sofachair_norja*9_name', 'Red Iced Sofachair'), + ('nav_venue_sw_arena_intermediate_name(0)', 'Playing intermediate game'), + ('furni_barchair_silo*4_name', 'Beige Bar Stool'), + ('furni_scifidoor*7_name', 'Aqua Spaceship Door'), + ('furni_CF_10_coin_gold_desc', 'Worth 10 Credits'), + ('furni_glass_sofa*8_desc', 'Translucent beauty'), + ('jukebox_reset', 'Reset Jukebox'), + ('nav_venue_sw_lobby_intermediate_desc', 'For the accomplished Snow Stormers.'), + ('furni_spotlight_desc', 'For the star of the show'), + ('furni_couch_norja_name', 'Bench'), + ('furni_romantique_divan*3_name', 'Turquoise Romantique Divan'), + ('furni_sleepingbag*7_desc', 'Ultimate coziness'), + ('roomatic_pws2', '24 hour access:'), + ('wallitem_jp_sheet1_desc', 'jp_sheet1'), + ('furni_table_silo_med*2_desc', 'Wipe clean and unobtrusive'), + ('furni_glass_table_desc', 'Translucent beauty'), + ('poster_502_desc', 'The US flag'), + ('pet_enrg_10', 'Mad'), + ('gs_scores_team_2', 'Blue Team:'), + ('pet_enrg_11', 'Nutcase'), + ('gs_scores_team_1', 'Red Team:'), + ('furni_cn_sofa_desc', 'Seating,Oriental style!'), + ('gs_scores_team_4', 'Green Team:'), + ('gs_scores_team_3', 'Yellow Team:'), + ('furni_table_silo_med*9_desc', 'Red Area Coffee Table'), + ('furni_hc_machine_name', 'Weird Science Machine'), + ('callhelp_writeyour', 'Write your question about Habbo Hotel here:'), + ('furni_table_silo_small*5_name', 'Pink Area Occasional Table'), + ('nav_addtofavourites', 'Add to favourites'), + ('furni_table_plasto_round*15_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_tournament_4_name', 'Competitie Battle Ball 5'), + ('furni_birdie_name', 'Pop-up Egg'), + ('furni_table_plasto_bigsquare_desc', 'Hip plastic furniture'), + ('furni_sound_set_33_desc', 'Guitar solo set'), + ('furni_romantique_divider*3_desc', 'Keeping things separated'), + ('furni_bed_budget*1_name', 'Aqua Pura Double Bed'), + ('furni_rare_beehive_bulb*2_desc', 'A honey-hued glow'), + ('furni_theatre_seat_desc', 'For Lazy boys and girls!'), + ('furni_hc_lmpst_desc', 'Somber and atmospheric'), + ('furni_divider_nor5*6_name', 'Blue Iced Angle'), + ('furni_summer_pool*2_desc', 'Fancy a dip?'), + ('poster_12_desc', 'a beautiful sunset'), + ('furni_carpet_polar*2_desc', 'Snuggle up on a Funky bear rug...'), + ('furni_md_rug_desc', 'Bubbles under your steps'), + ('Alert_InviteFriend', 'Invite your friends'), + ('nav_venue_bb_lobby_intermediate_4_name', 'Semi-profs Battle Ball 5'), + ('furni_hockey_score_desc', '...for keeping your score'), + ('furni_gothic_chair*3_name', 'Red Gothic Chair'), + ('wallitem_sw_stone_name', 'sw_stone'), + ('furni_pillow*7_name', 'Purple Velvet Pillow'), + ('nav_popup_header', 'Recommended rooms'), + ('nav_venue_sw_lobby_beginner_0_name', 'Snow Rookies Lobby'), + ('furni_table_norja_med*5_desc', 'For larger gatherings'), + ('furni_red_tv_name', 'Portable TV'), + ('reg_promise', '*Any personal information you supply will only be used by Habbo Ltd in accordance with the Habbo Pledge and will not be shared with third parties.'), + ('room_badge_choose', 'Modify Badge:'), + ('furni_table_plasto_square*15_desc', 'Hip plastic furniture'), + ('furni_sound_set_48_desc', 'Sweet party beat'), + ('nav_venue_ballroom_name', 'Ballroom'), + ('pet.hotwords.bad', 'bad'), + ('poster_55_desc', 'Save our trees!'), + ('furni_glass_chair_name', 'Glass chair'), + ('furni_prizetrophy5*2_desc', 'Shiny silver'), + ('furni_divider_poly3*4_desc', 'Beige Mode Bardesk Gate'), + ('tutorial_console_sample_message', 'Hello! This is a message sent to you from the Habbo Tutorial. To close and delete this message click delete. Sadly you cannot reply to this message as it is automated. Normally you can reply to messages by clicking the reply button.'), + ('furni_s_sound_machine*5_name', 'Sound Machine Brown'), + ('furni_divider_nor4*9_desc', 'Habbos, roll out!'), + ('furni_pura_mdl3*4_desc', 'Any way you like it!'), + ('NUF_getting_room_room_tutor', 'Tada! Nice room, although it\'s a little empty. Hey! Let\'s furnish it with something./nOpen your hand to check what you have, (if you have done this step before then you won\'t receive anything).'), + ('furni_fortune_desc', 'Gaze into the future'), + ('furni_soft_sofa_norja_name', 'iced sofa'), + ('furni_pura_mdl1*2_desc', 'Any way you like it!'), + ('nav_venue_sw_lobby_free_6/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('furni_divider_nor3*8_name', 'Yellow Iced gate'), + ('gs_title_finalscores', 'Final Standings:'), + ('gs_error_10', 'The hotel is closed or about to close. We look forward to welcoming you back tomorrow at (ADD LOCAL OPENING TIME).'), + ('furni_plant_bonsai_name', 'Bonsai Tree'), + ('furni_jukebox*1_name', 'Jukebox'), + ('room_loading', 'Loading room...'), + ('furni_hc_crpt_desc', 'Ultimate craftsmanship'), + ('furni_rare_hammock_desc', 'Eco bed'), + ('NUF_mini_use_console', 'Learn about messaging'), + ('furni_romantique_chair*1_desc', 'Elegant seating for elegant Habbos'), + ('transaction_system_bank_digiraha', 'Digiraha'), + ('NUH_messenger', 'Open your Console here - you might have messages or friend requests waiting.'), + ('furni_arabian_chair_desc', 'Exotic, soft seating'), + ('furni_noob_chair*6_name', 'My first Habbo chair'), + ('poster_510_desc', 'The flag of Italy'), + ('furni_carpet_standard*a_desc', 'Available in a variety of colours'), + ('queue_set.c.info', 'There are %c% Habbo Club member(s) in front of you. Be patient :)'), + ('furni_scifiport*4_name', 'Pink Sci-Fi Port'), + ('furni_sound_set_44_name', 'Graveyard Portal'), + ('furni_pura_mdl4*1_desc', 'Any way you like it!'), + ('furni_divider_silo3*6_desc', 'Blue Area Gate'), + ('furni_sound_machine*4_name', 'Blue Traxmachine'), + ('send_invitation_header', 'Get a warm welcome'), + ('game_TicTacToe', 'Boter kaas en eieren'), + ('nav_venue_sw_lobby_tournament_1_name', 'Tournament Lobby'), + ('furni_rare_fan*2_name', 'Green Powered Fan'), + ('furni_doormat_plain*2_name', 'Doormat'), + ('furni_table_plasto_square*7_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_intermediate_8/0_desc', ''), + ('furni_noob_table*6_desc', 'Lightweight, practical and green'), + ('win_callforhelp', 'Alert a Moderator'), + ('furni_prizetrophy8*1_desc', 'Glittery gold'), + ('furni_chair_norja*5_name', 'Pink Chair'), + ('furni_hc_tv_desc', 'Forget plasma, go HC!'), + ('furni_divider_arm1_name', 'Corner plinth'), + ('furni_table_plasto_round*7_name', 'Round Dining Table'), + ('furni_petfood3_name', 'Cabbage Mega Multipack'), + ('furni_carpet_standard*9_name', 'Floor Rug'), + ('opening_hours_title', 'Hotel Maintenance'), + ('console_noemail', 'Sorry,'), + ('furni_couch_norja*8_name', 'Yellow Bench'), + ('furni_s_sound_machine*1_desc', 'Sound Machine Grey Desc'), + ('furni_noob_stool*6_name', 'My first Habbo stool'), + ('purse_event', 'ACTIVITY'), + ('reg_readterms_alert', 'You have to read the Terms and Conditions\\r(scroll to the bottom of the text).'), + ('pet.hotwords.beg', 'beg'), + ('furni_jp_drawer_name', 'Japanese Drawer'), + ('gs_state_started', 'This Game has already started...'), + ('furni_sound_set_11_name', 'Dance 4'), + ('furni_divider_nor2*4_name', 'Urban Iced Bar'), + ('queue_set.e2.info', 'There are %e2% Habbos in front of you in the queue.'), + ('furni_bath_name', 'Bubble Bath'), + ('furni_rare_icecream*3_desc', 'Virtual blackcurrant rocks!'), + ('nav_modify_nameoftheroom', 'Name Of The Room'), + ('furni_scifiport*1_desc', 'Energy beams. No trespassers!'), + ('nav_venue_bb_lobby_amateur_12/0_desc', ''), + ('furni_table_silo_small*8_name', 'Yellow Occasional Table'), + ('furni_divider_silo3*3_name', 'White Area Gate'), + ('nav_venue_sw_lobby_amateur_7/0_desc', 'Astetta rankempaa lumisotaa.'), + ('reply', 'Reply'), + ('furni_toilet_yell_desc', 'Loo Seat'), + ('hobba_alert', 'Moderator Alert'), + ('You can play a bunch of exciting games, visit your friends\' rooms or even make your own place and decorate it to your heart\'s delight.', ''), + ('pet.saying.eat.croco.4', '*Buurrrrp*'), + ('furni_tree5_desc', 'Any presents under it yet?'), + ('pet.saying.eat.croco.2', '*Chomp chomp*'), + ('pet.saying.eat.croco.3', 'Mmmm mmmmm....'), + ('furni_divider_poly3*7_name', 'Green Mode Bardesk Gate'), + ('pet.saying.eat.croco.0', 'Mmmm yum yum'), + ('pet.saying.eat.croco.1', 'Ruff ruff ruff'), + ('furni_scifidoor*4_name', 'Emerald Spaceship Door'), + ('furni_edice_name', 'Holo-dice'), + ('furni_divider_nor4*6_name', 'Blue Iced Auto Shutter'), + ('furni_safe_silo*3_desc', 'Totally shatter-proof!'), + ('furni_table_silo_small_desc', 'For those random moments'), + ('gs_header_page', 'Page'), + ('furni_sporttrack3*2_name', 'Sport goal asphalt'), + ('furni_pura_mdl2*6_desc', 'Any way you like it!'), + ('furni_hcamme_name', 'Tubmaster'), + ('furni_carpet_soft*2_desc', 'Soft Wool Rug'), + ('furni_sound_set_12_name', 'Habbo Sounds 2'), + ('forgottenpw_done', 'If the email you gave during registration was correct, your password will be sent to you now.'), + ('navigator.no_category', 'No Category'), + ('login_whatsHabboCalled', 'What\'s your Habbo called?'), + ('furni_scifidoor*3_name', 'Lightblue Spaceship Door'), + ('game_poker', 'POKER'), + ('roomatic_pws', 'Password for selected'), + ('furni_glass_table*8_name', 'Glass table'), + ('furni_one_way_door*8_desc', 'One at a time!'), + ('furni_bardesk_polyfon*9_desc', 'Perfect for work or play'), + ('nav_venue_bb_lobby_tournament_13_name', 'Competitie Battle Ball 14'), + ('pet.hotwords.sit', 'sit'), + ('furni_arabian_tray3_desc', 'Indulge yourself!'), + ('furni_sound_set_40_desc', 'Dude? Cheese!'), + ('console_compose', 'Compose A Message'), + ('furni_table_plasto_square*3_name', 'Square Dining Table'), + ('furni_rclr_sofa_name', 'Polar Sofa'), + ('poster_2005_name', 'Infobus'), + ('furni_table_plasto_4leg*9_name', 'Occasional Table'), + ('furni_chair_norja*9_desc', 'Sleek and chic for each cheek'), + ('Room', 'Room:'), + ('furni_chair_plasty*2_name', 'Plastic Pod Chair'), + ('furni_romantique_pianochair*3_name', 'Turquoise Romantique Piano Chair'), + ('furni_rare_parasol*2_name', 'Orange Parasol'), + ('loading_project', 'Loading Habbo Hotel...'), + ('poster_505_name', 'The Maple Leaf'), + ('furni_traffic_light*2_desc', 'Chill and wait your turn!'), + ('nav_venue_sw_lobby_amateur_4_name', 'Snow Slingers Lobby'), + ('furni_grunge_shelf_name', 'Grunge Bookshelf'), + ('furni_sofa_polyfon*8_name', 'Yellow Mode Sofa'), + ('furni_doorC_desc', 'In a hurry?'), + ('roomatic_nomatch', 'Sorry. Your passwords don\'t match. Please enter them again.'), + ('furni_soft_sofa_norja*9_name', 'Red Iced Sofa'), + ('nav_venue_tv_studio_general/0_desc', 'Suosikki rules! Musaa, leffoja ja staroja!'), + ('nav_venue_sw_arena_amateur_name', 'Playing amateur game'), + ('interface_icon_events', 'Open the room event browser'), + ('furni_grunge_table_desc', 'Students of the round table!'), + ('furni_wooden_screen*9_name', 'Green Oriental Screen'), + ('NUF_getting_room_hotelview_nav', 'Click to open the Navigator.'), + ('furni_table_silo_med*5_name', 'Pink Area Coffee Table'), + ('furni_divider_silo1*9_name', 'Red Area Small Table'), + ('nav_venue_bb_lobby_amateur_4_name', 'Gevorderden Battle Ball 5'), + ('room_badge_hidden', 'Hidden'), + ('pet.saying.generic.cat.0', 'meow'), + ('furni_marquee*3_desc', 'It\'s both door and a shade!'), + ('pet.saying.generic.cat.1', 'meow...meOW'), + ('nav_venue_cunning_fox_gamehall/4_name', 'Chess'), + ('furni_present_gen_desc', 'What\'s inside?'), + ('pet.saying.generic.cat.2', 'muew..muew'), + ('pet.saying.generic.cat.3', 'Purrrrrrrrrr'), + ('furni_scifidoor*1_desc', 'There out of this world!'), + ('pet.saying.generic.cat.4', 'Purrrrr oow'), + ('furni_fridge_name', 'Pura Refridgerator'), + ('furni_rubberchair*2_name', 'Pink Inflatable Chair'), + ('furni_romantique_chair*4_name', 'Amber Chair'), + ('bb_fieldname_5', 'Barebones Classic'), + ('furni_sofa_silo*7_desc', 'Green Area Sofa'), + ('bb_fieldname_4', 'Gothic Hallway'), + ('furni_prizetrophy6*2_name', 'Champion trophy'), + ('bb_fieldname_3', 'Maze Park'), + ('bb_fieldname_2', 'Coral Beach'), + ('bb_fieldname_1', 'Sky Peak'), + ('furni_safe_silo_pb_name', 'postbank Safe'), + ('furni_solarium_norja*2_desc', 'Rejuvenate your pixels!'), + ('furni_table_plasto_bigsquare*7_desc', 'Hip plastic furniture'), + ('reg_check_age', 'Age'), + ('furni_exe_chair2_desc', 'You\'re fired!'), + ('furni_typingmachine_name', 'Typewriter'), + ('human_carrying', 'Carrying:'), + ('furni_grunge_sign_name', 'Road Sign'), + ('loading', 'Loading...'), + ('furni_bed_polyfon_one*6_name', 'Blue Mode Single Bed'), + ('furni_bed_budget_one*1_desc', 'Prince sized comfort!'), + ('furni_sofa_polyfon_name', 'Two-seater Sofa'), + ('furni_jp_lantern_desc', 'For a mellow Eastern glow'), + ('furni_gothic_stool*2_name', 'Golden Gothic Stool'), + ('roomevent_starttime', 'Started at:'), + ('furni_prize1_desc', 'Gorgeously glittery'), + ('furni_prizetrophy9*1_name', 'Champion trophy'), + ('wallitem_guitar_skull_desc', 'tilulilulaa'), + ('gs_title_bestplayer', 'Best player:'), + ('nav_removefavourites', 'Remove from favourites'), + ('furni_toy1_desc', 'it\'s bouncy-tastic'), + ('alert_shortenPW', 'Your password cannot be longer than 9 characters'), + ('normal_roomlayouts', '<< Back to normal room layouts'), + ('furni_noob_rug*1_name', 'My first Habbo rug'), + ('poster_58_name', 'Red knots poster'), + ('furni_divider_nor2*8_desc', 'Yellow Iced bar desk'), + ('furni_carpet_polar*1_name', 'Pink Faux-Fur Bear Rug'), + ('habboclub_continue_button', 'Buy one month'), + ('furni_divider_silo3_desc', 'Form following function'), + ('furni_sound_set_7_name', 'SFX 5'), + ('furni_soft_sofa_norja*5_desc', 'Pink Iced Sofa'), + ('furni_arabian_rug_desc', 'Green blossom design'), + ('restart_tutorial', 'Restart tutorial'), + ('gs_choose_numteams', 'Choose number of Teams:'), + ('hubu_info_t', 'The big FRANK Infobus'), + ('furni_divider_nor5*7_desc', 'Cool cornering for your crib!'), + ('furni_bed_polyfon*4_name', 'Beige Mode Double Bed'), + ('callhelp_allwillreceive', 'A member of community staff will investigate the situation and take appropriate action. This may include sending you a response with advice on dealing with your issue.'), + ('furni_pura_mdl4*4_name', 'White Pura Module 4'), + ('hubu_odotetaan', 'Waiting for replies from others...'), + ('furni_door_name', 'Telephone Box'), + ('furni_doormat_plain*5_desc', 'Available in a variety of colours'), + ('furni_gothic_carpet_desc', 'The path less travelled'), + ('poster_516_desc', 'Eng-er-land'), + ('furni_gothic_stool*6_desc', 'The dark side of Habbo'), + ('furni_traffic_light*3_desc', 'Chill and wait your turn!'), + ('furni_bartable_armas_desc', 'Bar-Style Table - essential for extra guests'), + ('club_isp_change', 'Change your subscription'), + ('furni_summer_grill*2_name', 'Red Barbeque Grill'), + ('poster_23_desc', 'flap, flap, screech, screech...'), + ('furni_prizetrophy7*3_desc', 'Bronze Habbo trophy'), + ('furni_couch_norja*2_name', 'Black Bench'), + ('nav_venue_cunning_fox_gamehall/0_desc', 'Pit your wits on the battlefield, the board or the baize - choose what to play here'), + ('furni_jp_tatami2_name', 'Large Tatami Mat'), + ('furni_pura_mdl3*3_desc', 'Any way you like it!'), + ('furni_house_name', 'Gingerbread House'), + ('furni_sound_set_54_name', 'Oh Blinging Tree'), + ('furni_table_plasto_4leg*1_name', 'Square Dining Table'), + ('furni_pillow*1_name', 'Pink Fluffy Pillow'), + ('NUF_console_hotelview_tutor', 'Oh! You have a message on your Habbo Console. Let\'s see who it is.'), + ('LoadingRoom', 'Loading room...'), + ('rotate', 'Rotate'), + ('nav_venue_sw_lobby_beginner_6_name', 'Snow Rookies Lobby'), + ('nav_venue_bb_lobby_amateur_1/0_desc', ''), + ('furni_jukebox_ptv*1_desc', 'Jukebox Pacha TV'), + ('nav_venue_star_lounge/0_desc', 'Chat with Sean Kingston here!'), + ('furni_chair_plasty*6_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_tournament_10/0_desc', ''), + ('NUF_mini_use_console_hotelview_tutor', 'Ah! You have a message on your Habbo Console. Let\'s see who it is.'), + ('furni_rare_xmas_screen_name', 'Lappland Greetings'), + ('summer_chair_9_name', 'Red Deck Chair'), + ('club_timefull', 'Sorry, you can only buy up to three months of Habbo Club subscription in advance.'), + ('poster_2002_desc', 'Presidentin muotokuva'), + ('poster_7_name', 'Hammer Cabinet'), + ('furni_gothic_chair*2_name', 'Golden Gothic Chair'), + ('bb_header_powerups', 'Powerups in game:'), + ('credit_redeem_url', 'http://%predefined%//help/19'), + ('furni_divider_silo3*2_name', 'Black Area Gate'), + ('furni_chair_plasto*16_name', 'Chair'), + ('catalog_itsurs', 'Yay! It\'s being delivered now..'), + ('hobba_pickandreply', 'Pick & Reply'), + ('reg_terms', 'Welcome to Habbo Hotel. If you are under 16, please check the Terms and Conditions with your parents/guardian before you agree to them. Get them to explain anything that you don\'t understand.\\rIn order to use the service you have to give valid information about yourself when registering. Please email us if any of your user information changes.\\rAs a user of Habbo Hotel - www.habbohotel.co.uk , you have to behave according to the Habbo Way (hotel rules) and the Terms and Conditions. Click the links below to read about them.\\rNever give your password or email address to anyone. If you do, your Habbo may get stolen.\\rRegistering with the hotel, making your own empty room and chatting is free of charge. For a small fee you can decorate your room with virtual furniture, play games and join the Habbo Club. If you wish to buy, you will need your parent\'s permission to do so.'), + ('furni_summer_pool*1_name', 'Blue Summer Pool'), + ('furni_heartsofa_desc', 'Perfect for snuggling up on'), + ('furni_scifiport*3_name', 'Jade Sci-Fi Port'), + ('furni_glass_chair*6_name', 'Blue Glass Chair'), + ('furni_sound_set_62_name', 'Alhambra Trax 1'), + ('win_voucher', 'Habbo Credit Code'), + ('furni_summer_chair*4_desc', 'White'), + ('furni_bed_polyfon_one_desc', 'Cot of the artistic'), + ('nav_venue_bb_lobby_tournament_5/0_desc', ''), + ('nav_venue_bb_lobby_beginner_3_name', 'Beginners Battle Ball 4'), + ('console_follow_not_friend', 'The user you tried to follow is not your friend anymore.'), + ('delete', 'Delete'), + ('furni_grunge_mattress_desc', 'Beats sleeping on the floor!'), + ('furni_rare_icecream*7_name', 'Chocolate Ice Cream Machine'), + ('sound_machine_alert_no_disks', 'You don\'t have any more discs!'), + ('furni_sofachair_silo_name', 'Armchair'), + ('nav_venue_sw_lobby_expert_0_name', 'Snow Marksmen Lobby'), + ('game_waitop', 'WAITING FOR THE OPPONENT'), + ('Alert_NameAlreadyUse', 'That name is already being used'), + ('furni_queue_tile1*1_desc', 'The power of movement'), + ('poster_18_name', 'Butterfly Cabinet 2'), + ('furni_wooden_screen*6_desc', 'Add an exotic touch to your room'), + ('furni_noob_table*2_name', 'My first Habbo table'), + ('furni_tree1_name', 'Dead tree'), + ('nav_venue_bouncer_room_0_name', 'Battle Ball Competitie Arena'), + ('furni_traffic_light*5_name', 'White Traffic Light'), + ('furni_sw_raven_name', 'Mrs Raven'), + ('cam_shoot.help', 'Shutter Release'), + ('furni_grand_piano*3_desc', 'Make sure you play in key!'), + ('nav_venue_sw_lobby_intermediate_2_name', 'Snow Bombardiers Lobby'), + ('interface_icon_purse', 'Purse, manage your coins'), + ('poll_alert_server_error', 'The poll isn\'t available anymore. Polls are only available at a certain public space for a certain duration.'), + ('sound_machine_confirm_delete_long', 'Are you sure you want to delete the selected song?'), + ('reg_check_confirm', 'Please check that your information is correct, especially your birthdate and Habbo name. You CANNOT change these later. If you want make any changes now, press the back button.'), + ('Alert_CheckBirthday', 'Please check your birthday'), + ('furni_shelves_norja*4_desc', 'For nic naks and tech books'), + ('club_expired_link', 'Click here to join Habbo Club'), + ('poster_520_desc', 'Every colour for everyone'), + ('nav_venue_bb_lobby_intermediate_desc', 'Intermediate battle ball!'), + ('tutorial_restart_button_bubble', 'Remember! Anytime you want to relive the fun click here to restart the tutorial!'), + ('poster_1_name', 'Comedy Poster'), + ('reg_verification_incorrectBirthday', 'Your birthday was incorrect'), + ('furni_glass_stool*6_name', 'Blue Glass Stool'), + ('furni_CFC_100_coin_gold_desc', 'Worth 100 Credits'), + ('buddyremove_list_full', 'Your friends list is full, you can\'t add new friends until you delete some. \\r\\The maximum number of friends you can have, is %mylimit% Habbos. Members of Habbo Club can have up to %clublimit% friends on their list.'), + ('furni_bunny_name', 'Squidgy Bunny'), + ('furni_small_chair_armas_name', 'Stool'), + ('nav_venue_sw_lobby_free_0/0_desc', ''), + ('furni_sofachair_silo*3_name', 'White Armchair'), + ('furni_sound_machine*2_desc', 'Dance to the Habbo Club beat!'), + ('nav_venue_gate_park/0_desc', 'Follow your path...'), + ('NUF_mini_use_console_hotelview_icon', 'Click the icon to open your Habbo Console.'), + ('nav_venue_eric\'s_eaterie/0_desc', 'Join Eric for a bite to eat'), + ('furni_table_silo_med*8_desc', 'Wipe clean and unobtrusive'), + ('poster_503_desc', 'There\'s no holes in this...'), + ('furni_bardeskcorner_polyfon*9_name', 'Red Corner Desk'), + ('furni_val_randomizer_desc', 'Surprise surprise! (Cilla Black not included)'), + ('furni_marquee*2_name', 'Red Dragon Marquee'), + ('furni_table_plasto_round_name', 'Round Dining Table'), + ('furni_summer_chair*3_name', 'Deck Chair'), + ('club_paycoins', 'Buy subscription'), + ('nav_venue_beauty_salon_general/0_desc', 'Join in the fun of Fashion Week! Check the homepage now for details.'), + ('furni_rare_dragonlamp*7_name', 'Sky Dragon Lamp'), + ('nav_venue_bb_lobby_beginner_6/0_desc', ''), + ('roomevent_quit', 'End event'), + ('console_search_habbo_lasthere', 'Last time'), + ('trading_title', 'Safe Trading'), + ('furni_glass_chair*7_desc', 'Habbo Club'), + ('gs_error_game_deleted', 'The Game has been deleted.'), + ('recycler_info_link_url', 'http://%predefined%/help/36'), + ('furni_pillar*6_name', 'Terracotta Pillar'), + ('furni_tile_stella_desc', '10% off the walk of fame!'), + ('transaction_system_sms_win_tmobile', 'T-Mobile SMS'), + ('buddyremove_names_ordered', 'Names Ordered By:'), + ('pet_race_2_010', 'Giggly Go-go'), + ('furni_table_plasto_bigsquare*6_name', 'Square Dining Table'), + ('pet_race_2_011', 'Petty Petsuchos'), + ('summer_chair_6_name', 'Blue Deck Chair'), + ('console_now', 'now:'), + ('gs_skill_changed', 'You have advanced to the next skill level. Your level is now %1!'), + ('roomatic_goyourroom', 'Go to your room'), + ('furni_carpet_soft*4_name', 'Soft Wool Rug'), + ('sound_machine_confirm_close_list', 'Close playlist editor?'), + ('pet.hotwords.good', 'good'), + ('furni_pura_mdl4*7_desc', 'Any way you like it!'), + ('furni_carpet_soft*1_name', 'Soft Wool Rug'), + ('furni_sound_set_22_desc', 'With a hamper full of sounds, not sarnies'), + ('nav_venue_sw_lobby_tournament_7_name', 'Tournament Lobby'), + ('furni_divider_nor3*6_desc', 'Blue Iced gate'), + ('furni_carpet_standard*3_name', 'Floor Rug'), + ('people', 'People'), + ('pet_race_2_007', 'Pretty Pui Pui'), + ('pet_race_2_008', 'Indifferent'), + ('pet_race_2_009', 'Swampy Siamese'), + ('furni_wcandle_name', 'White Candle'), + ('furni_sporttrack1*1_desc', 'null'), + ('furni_solarium_norja*1_name', 'Black Solarium'), + ('NUF_playing_games_gamecategories_tutor', 'Click the Beginner category to open it wide open. Like a melon!'), + ('pet_race_2_003', 'Silly Sobek'), + ('pet_race_2_004', 'Dirty Dundee'), + ('pet_race_2_005', 'Galled Gator'), + ('int_credits', 'Credits'), + ('furni_gothrailing_name', 'Gothic Railing'), + ('furni_sporttrack2*2_desc', 'null'), + ('pet_race_2_006', 'Confused Croc'), + ('furni_shelves_polyfon_name', 'Bookcase'), + ('pet_race_2_000', 'Endangered Albino'), + ('pet_race_2_001', 'Krazy Krokodilos'), + ('pet_race_2_002', 'Nile Dile'), + ('furni_divider_nor2*2_desc', 'Black Iced bar desk'), + ('log_problem_text', 'Oops.. Cannot connect to Habbo Hotel'), + ('furni_divider_nor2*5_desc', 'Pink Iced bar desk'), + ('nav_venue_sw_lobby_amateur_6/0_desc', 'Astetta rankempaa lumisotaa.'), + ('furni_rare_fountain_desc', 'For our feathered friends'), + ('furni_glass_sofa*5_name', 'Glass sofa'), + ('poster_33_desc', 'We can\'t bear to lose them'), + ('nav_venue_bb_lobby_tournament_14/0_desc', ''), + ('furni_summer_chair*6_name', 'Deck Chair'), + ('furni_hcsohva_desc', 'For royal bottoms...'), + ('furni_bed_budget*4_desc', 'King sized comfort!'), + ('furni_christmas_poop_desc', 'Bob?s magical fertilizer'), + ('furni_pura_mdl5*7_name', 'Green Pura Module 5'), + ('furni_barrier*1_desc', 'No escape this way!'), + ('nav_venue_bb_lobby_amateur_8/0_desc', ''), + ('furni_divider_arm2_desc', 'I wooden go there'), + ('furni_chair_plasty*11_desc', 'Hip plastic furniture'), + ('furni_small_table_armas_desc', 'Practical and beautiful'), + ('nav_venue_theatredrome_xmas_name', 'Theatredrome Xmas'), + ('poster_62_name', 'Save The Panda'), + ('reg_verification_currentPassword', 'Current password:'), + ('game_poker_change', 'Choose cards to change'), + ('NUF_getting_items_hotelview_nav', 'Click here to open the Navigator'), + ('furni_chair_basic*9_name', 'Red Pura Egg Chair'), + ('friend_request_failed', 'Failed!'), + ('furni_noob_chair*4_desc', 'Lightweight, practical, with light blue stripes'), + ('furni_table_silo_small*9_desc', 'Red Area Occasional Table'), + ('nav_hotelview', 'Hotel view'), + ('furni_toy1*3_desc', 'it\'s bouncy-tastic'), + ('furni_divider_nor3*2_name', 'Black Iced gate'), + ('furni_chair_silo*6_name', 'Blue Silo Dining Chair'), + ('update_password_suggest', 'Habbo Hotel security supervisor requests you to update your password'), + ('nav_venue_orient_name', 'Club Orient'), + ('Alert_NameTooLong', 'Sorry, that username is too long!'), + ('furni_sound_set_37_name', 'Sound set 37'), + ('furni_barchair_silo*7_desc', 'Practical and convenient'), + ('wallitem_wallmirror_name', 'Wallmirror'), + ('furni_chair_plasty*8_name', 'Plastic Pod Chair'), + ('sound_machine_confirm_close_list_long', 'Are you sure you want to exit playlist editor without saving?'), + ('furni_hc_frplc_name', 'Heavy Duty Fireplace'), + ('dance4', 'The Rollie'), + ('dance3', 'Duck Funk'), + ('furni_glass_stool*9_name', 'Glass stool'), + ('furni_sound_set_55_desc', 'Can you fill me in?'), + ('furni_carpet_standard*7_desc', 'Available in a variety of colours'), + ('poster_4_name', 'Bear Plaque'), + ('cam_zoom_out.help', 'Zoom Out'), + ('furni_sofa_polyfon*2_name', 'Black Mode Sofa'), + ('furni_prizetrophy2*1_name', 'Duck trophy'), + ('furni_scifirocket*3_desc', 'Caution! Unknown Location!'), + ('NUF_getting_items', 'Getting items'), + ('furni_val_teddy*1_desc', 'The grey bear of affection'), + ('furni_sofachair_polyfon*7_name', 'Green Mode Armchair'), + ('club_habbo.bottombar.link.member', '%days% days'), + ('habboclub_confirm_header', 'Subscription costs %price% credits'), + ('furni_rare_daffodil_rug_desc', 'A little bit of outdoors indoors..'), + ('poster_15_name', 'Himalayas Poster'), + ('furni_smooth_table_polyfon_desc', 'For larger gatherings'), + ('dance2', 'Pogo Mogo'), + ('furni_wooden_screen*3_name', 'Aqua Oriental Screen'), + ('furni_plant_cruddy_desc', 'Goodbye Bert...'), + ('dance1', 'Hab-Hop'), + ('furni_gothic_chair*6_desc', 'The dark side of Habbo'), + ('furni_table_plasto_square*9_name', 'Square Dining Table'), + ('nav_venue_bb_lobby_beginner_14/0_desc', ''), + ('furni_club_sofa_desc', 'Club sofa'), + ('roomevent_default_name', 'Event name..'), + ('game_poker_ok', 'Change cards'), + ('nav_venue_picnic_dudesons/0_desc', 'Duudsoneiden sponssaama oma Ranchi - www.extremeduudsonit.com'), + ('nav_venue_hallway/0_desc', 'Beware the ghosts and ghouls!'), + ('nav_venue_park/0_desc', 'Go for a stroll outdoors'), + ('console_fr_declined_count', 'Amount to be declined'), + ('furni_tree4_name', 'Christmas Tree 2'), + ('NUF_console_read_link', 'Click the link to open the message.'), + ('win_figurecreator', 'Habbo Details'), + ('furni_table_plasto_square*14_name', 'Occasional Table'), + ('furni_soft_sofachair_norja*6_desc', 'Blue Iced Sofachair'), + ('nav_venue_bb_lobby_beginner_0_name', 'Beginner'), + ('Alert_LogoNameAlreadyUse', 'That name is already being used'), + ('poster_25_name', 'Snowman Poster'), + ('furni_pura_mdl2*2_name', 'Pink Pura Module 2'), + ('furni_chair_plasto*13_name', 'Chair'), + ('furni_ticket_name', 'Small Ticket Bundle'), + ('furni_hc_lmpst_name', 'Victorian Street Light'), + ('furni_scifiport*7_desc', 'Energy beams. No trespassers!'), + ('jukebox_load_trax', 'Load Trax'), + ('furni_val_teddy*4_desc', 'The brown bear of naughtiness'), + ('reg_birthdayformat_update', 'Birthday (dd.mm.yyyy)'), + ('nav_venue_the_chromide_club_name', 'The Chromide Club'), + ('roomevent_not_available', 'Sorry, no events available'), + ('nav_venue_sw_lobby_beginner_0/0_desc', ''), + ('summer_chair_3_name', 'Black Deck Chair'), + ('int_newrequests', 'Friend Request(s)'), + ('console_profile_helptext', 'The Habbo Profile is a snapshot of your interests and hobbies - simply tick the things you like.'), + ('nav_roomnfo_hd_fav', 'Favourite Rooms'), + ('furni_chair_plasto*3_desc', 'Hip plastic furniture'), + ('furni_chair_basic*6_name', 'Blue Pura Egg Chair'), + ('number_4', '4'), + ('number_3', '3'), + ('number_2', '2'), + ('room_open_package', 'Open The Present'), + ('furni_grunge_barrel_name', 'Flaming Barrel'), + ('wallitem_photo_desc', 'Photo from Habbo'), + ('poster_30_desc', 'Pucker up'), + ('furni_glass_table*9_desc', 'Translucent beauty'), + ('nav_venue_sw_lobby_beginner_3_name', 'Snow Rookies Lobby'), + ('Alert_YouAreBanned', 'You have been banned for breaking the Habbo Way. This is why (if no ban reason is shown use the Contact Us form):'), + ('furni_gothic_sofa*2_name', 'Golden Gothic Sofa'), + ('NUF_getting_items_hotelview_tutor', 'Let us find out how to purchase items from the Hotel Catalogue. The Catalogue contains loads of cool stuff to decorate your Habbo room with. To begin open the Navigator.'), + ('furni_table_norja_med*2_desc', 'For larger gatherings'), + ('furni_sofa_silo*3_name', 'White Two-Seater Sofa'), + ('furni_pura_mdl5*5_desc', ''), + ('nav_venue_sw_lobby_beginner_desc', 'Yes, take a load of snowballs and hit the enemy Teams. Easy, isn\'t it?'), + ('furni_romantique_smalltabl*5_name', 'Onyx Tray Table'), + ('furni_divider_nor4_desc', 'Habbos, roll out!'), + ('furni_shelves_norja*7_desc', 'For nic naks and cookery books'), + ('nav_venue_sw_lobby_intermediate_4/0_desc', 'Lumisota sen kuin vain kovenee.'), + ('gs_text_spectate', 'You can watch this game'), + ('recycler_info_link', 'More information about Furni Recycler'), + ('furni_sofachair_polyfon_name', 'Armchair'), + ('club_intro_text', 'Members of Habbo Club get LOTS of cool stuff!\\rWith Habbo Club you get cool dances, access to Club Mammoth and The Blue Dragon Tavern, and a 500 limit on your friends list!'), + ('furni_divider_nor1*7_desc', 'The missing piece'), + ('url_helppledge', 'http://%predefined%//help/22'), + ('jukebox_song_name', '%name%'), + ('game_bs_won', 'WON!'), + ('furni_soft_jaggara_norja_name', 'Iced Sofachair'), + ('furni_rare_beehive_bulb_desc', 'A honey-hued glow'), + ('furni_chair_norja*8_name', 'Yellow Chair'), + ('poster_83_desc', 'Pöllö huhuilee, huhuu!'), + ('floodblocking', 'You are typing too fast - don\'t flood the room.'), + ('furni_CF_5_coin_silver_desc', 'Worth 5 Credits'), + ('sound_machine_confirm_clear', 'Clear the song?'), + ('furni_carpet_standard*6_name', 'Floor Rug'), + ('furni_waterbowl*2_desc', 'Aqua unlimited'), + ('sw_link_tournament_highScores_url', 'http://%predefined%//groups/56553/id'), + ('NUF_meeting_people_room_tutor', 'This is a Public Room. Your Habbo is in the doorway beneath the orange arrow. Click on another user to find out more about them.'), + ('furni_bottle_name', 'Empty Spinning Bottle'), + ('poster_512_name', 'The Irish flag'), + ('club_info_url', 'http://%predefined%//credits/habboclub'), + ('nav_venue_tv_studio_nike/0_desc', ''), + ('furni_couch_norja*6_desc', 'Two can perch comfortably'), + ('furni_pura_mdl5*8_desc', 'Any way you like it!'), + ('furni_carpet_valentine_desc', 'For making an appearance'), + ('furni_floortile_desc', 'In Variety of Colours'), + ('furni_pillar*9_name', 'Rock Pillar'), + ('furni_table_plasto_bigsquare*3_name', 'Square Dining Table'), + ('furni_bardeskcorner_polyfon*12_name', 'Corner Cabinet/Desk'), + ('furni_divider_nor1*4_desc', 'The missing piece'), + ('furni_chair_plasty*5_name', 'Plastic Pod Chair'), + ('furni_scifirocket*0_desc', 'See in 2007 with a bang!'), + ('poster_32_name', 'Siva Poster'), + ('club_button_2_period', 'Buy 3 >>>'), + ('furni_sound_set_58_desc', 'Sh-shake it!'), + ('furni_china_shelve_desc', 'To hold the mind\'s treasures'), + ('furni_scifidoor*7_desc', 'There out of this world!'), + ('furni_chair_silo*9_name', 'Red Silo Dining Chair'), + ('furni_gothic_stool*5_name', 'Green Gothic Stool'), + ('friend_request_massoperation_cancel', 'Back to request list.'), + ('furni_queue_tile1*0_name', 'White Quest Roller'), + ('furni_divider_nor3*5_name', 'Pink Iced gate'), + ('furni_sound_machine*5_desc', 'Heard the Habbo Bands new singles?'), + ('furni_glass_table*6_desc', 'Translucent beauty'), + ('furni_soft_sofachair_norja*9_desc', 'Red Iced Sofachair'), + ('furni_plant_mazegate_desc', 'Did we make it?'), + ('tickets_info_1', 'With 2 tickets you can play the following Games:\\r10 BattleBall:Rebound!\\r10 SnowStorm\\r20 Wobble Squabble or\\r20 Lido Diving'), + ('furni_barchair_silo*4_desc', 'Practical and convenient'), + ('furni_CF_10_coin_gold_name', 'Gold Coin'), + ('tickets_info_2', 'With 20 tickets you can play the following Games:\\r10 BattleBall:Rebound!\\r10 SnowStorm\\r20 Wobble Squabble or\\r20 Lido Diving'), + ('furni_sound_set_15_desc', 'Unadulterated essentials'), + ('handitem1', 'Tea'), + ('furni_romantique_divan*3_desc', 'null'), + ('furni_glass_sofa*8_name', 'Glass sofa'), + ('epsnotify_1001', 'The hotel is full at the moment. Please try again in a few minutes.'), + ('furni_table_silo_med*2_name', 'Black Coffee Table'), + ('furni_sleepingbag*7_name', 'Orange Sleeping Bag'), + ('furni_pillow*5_desc', 'Puffy, soft and huge'), + ('furni_bed_budget*1_desc', 'King sized comfort!'), + ('furni_bed_trad_one_name', 'Plain Single Bed'), + ('catalog_giftfor', 'This is a gift for:'), + ('furni_theatre_seat_name', 'Deluxe Theatre Chair'), + ('furni_romantique_divider*3_name', 'Turquoise Screen'), + ('furni_shelves_silo_desc', 'For nic naks and art deco books'), + ('handitem9', 'Decaff'), + ('handitem8', 'Regular'), + ('handitem7', 'Water'), + ('furni_glass_table_name', 'Glass table'), + ('console_selection_invert', 'Invert selection'), + ('handitem6', 'Blackcurrant'), + ('furni_hc_machine_desc', 'By and for mad inventors'), + ('handitem5', 'Milk'), + ('handitem4', 'Ice-cream'), + ('poster_40_desc', 'The one and only. Adore her!'), + ('nav_venue_sw_lobby_tournament_9/0_desc', ''), + ('handitem3', 'Carrot'), + ('handitem2', 'Juice'), + ('furni_cn_sofa_name', 'Chinese Sofa'), + ('nav_venue_bb_lobby_expert_4/0_desc', ''), + ('poster_502_name', 'The Stars and Stripes'), + ('furni_md_rug_name', 'Bubble Juice Floor'), + ('furni_table_plasto_bigsquare_name', 'Square Dining Table'), + ('furni_bed_polyfon*8_desc', 'Yellow Mode Double Bed'), + ('nav_venue_sw_lobby_amateur_7_name', 'Snow Slingers Lobby'), + ('furni_birdie_desc', 'Cheep (!) and cheerful'), + ('poster_12_name', 'Lapland Poster'), + ('club_desc_1_period', '1 Month (31 days) = 25 Credits'), + ('hobba_emergency_help', 'Call For Emergency Help:'), + ('reg_age_check_note', 'Enter your birthday. You will need your birthday information when changing your password or email.'), + ('furni_table_plasto_square*6_name', 'Square Dining Table'), + ('trade', 'Trade'), + ('furni_romantique_smalltabl*3_desc', 'Every tray needs a table...'), + ('reg_back', 'Back'), + ('furni_tree7_name', 'Snowy Christmas Tree'), + ('recycler_trader_open_alert', 'Recycling cannot begin while you are trading. Please close the safe trading box before recycling.'), + ('furni_rare_dragonlamp*8_desc', 'Scary and scorching!'), + ('furni_gothic_chair*3_desc', 'The head of the table'), + ('Alert_YourNameIstooShort', 'Habbo names must be at least 3 characters long.'), + ('furni_bed_budgetb_desc', 'Sweet dreams for two'), + ('furni_shelves_basic_name', 'Pura Shelves'), + ('console_messagemode_helptext', 'You can send an instant message to your Habbo Friends.'), + ('nav_venue_cunning_fox_gamehall/5_desc', 'Get a hand like a foot? Keep a straight face and bluff it out'), + ('furni_table_polyfon_small_name', 'Small Coffee Table'), + ('move_furniture', 'Move Furni'), + ('nav_searchbutton', 'Search'), + ('furni_habboween_grass_desc', 'Autumnal chills with each rotation!'), + ('furni_pura_mdl5*2_desc', 'Any way you like it!'), + ('NUF_meeting_people_user_tutor', 'The user you clicked on is shown in the corner of your screen. The buttons beneath the Habbo let you visit their Habbo Home, send them a Friend Request or ignore them if they look or act like a moron.'), + ('poster_55_name', 'Tree of Time'), + ('furni_soft_sofachair_norja*5_name', 'Pink Iced Sofachair'), + ('furni_sound_set_48_name', 'Club 3'), + ('furni_table_plasto_4leg_desc', 'Hip plastic furniture'), + ('furni_pura_mdl4*1_name', 'Aqua Pura Module 4'), + ('login_forgottenPassword_url', 'https://www.habbo.co.uk/account/password/forgot'), + ('nav_venue_floatinggarden/0_desc', 'Peace, tranquility and still waters'), + ('furni_sound_set_36_desc', 'For adult minded'), + ('poster_43_desc', 'Shake, rattle and roll'), + ('furni_gothic_stool*3_desc', 'The dark side of Habbo'), + ('room_alert_furni_limit', 'This room has the maximum amount of Furni.'), + ('furni_table_plasto_square*15_name', 'Occasional Table'), + ('furni_rare_hammock_name', 'Hammock'), + ('sound_machine_confirm_burn_long', 'Are you sure you want to burn this song to disc? Burning costs one credit.'), + ('furni_rclr_chair_desc', 'Watch out for coconuts'), + ('furni_chair_basic*3_desc', 'It\'s a cracking design!'), + ('furni_doormat_plain*6_name', 'Doormat'), + ('furni_sofachair_polyfon*9_name', 'Red Armchair'), + ('furni_jp_tray6_name', 'jp_tray6'), + ('furni_habbocake_name', 'Cake'), + ('poster_501_name', 'Jolly Roger'), + ('nav_goingprivate', 'Going to Guest room'), + ('furni_bed_budget_one*9_name', 'Red Pura Bed'), + ('alert_no_category', 'Your room has no category. Select one from the list.'), + ('nav_venue_theatredrome_easter/0_desc', ''), + ('gs_button_buytickets', 'Buy Tickets'), + ('nav_venue_bouncer_room_4_name', 'Experts Battle Ball Arena'), + ('close', 'Close'), + ('furni_carpet_standard*9_desc', 'Available in a variety of colours'), + ('furni_prizetrophy4*1_desc', 'Glittery gold'), + ('help_pointer_1', 'http://www.habbo.co.uk/help/'), + ('help_pointer_3', 'emergency_help'), + ('furni_rclr_lamp_name', 'Moon Lamp'), + ('help_pointer_2', 'http://www.habbohotel.co.uk/iot/go?lang=en&country=uk'), + ('furni_exe_sofa_desc', 'Relaxing leather comfort'), + ('furni_divider_silo1*4_name', 'Beige Area Corner Shelf'), + ('poster_2001_name', 'SeinNightitititititdiskotappaja'), + ('interface_icon_tv_close', 'Leave the Room and close the Habbovision mode.'), + ('furni_sound_machine*7_name', 'Red Traxmachine'), + ('game_bs_hit', 'A Hit!:'), + ('furni_rare_fan*2_desc', 'It\'ll blow you away!'), + ('win_place', 'Note!'), + ('nav_venue_bb_lobby_beginner_11_name', 'Beginners Battle Ball 12'), + ('furni_pillow*7_desc', 'Bonnie\'s pillow of choice!'), + ('furni_table_silo_small*8_desc', 'For those random moments'), + ('furni_divider_nor4*5_desc', 'Habbos, roll out!'), + ('hubu_vastaa', 'Answer the question'), + ('furni_pura_mdl4*8_name', 'yellow pura module 4'), + ('furni_glass_chair*9_name', 'Glass chair'), + ('furni_chair_silo*7_desc', 'Green Silo Dining Chair'), + ('furni_jp_drawer_desc', 'Spiritual home for odds and ends'), + ('tutorial_select_another_topic', 'Select another topic'), + ('furni_noob_lamp*4_desc', 'Get the light right where you want it (light blue)'), + ('nav_venue_beauty_salon_general_name', 'Beauty salon'), + ('furni_sofachair_polyfon*2_name', 'Black Mode Armchair'), + ('console_report_header', 'Report Abusive Message'), + ('club_buy_url', 'http://%predefined%//credits/habboclub'), + ('furni_prizetrophy*2_name', 'Classic trophy'), + ('furni_rare_icecream*4_name', 'Strawberry Ice Cream Machine'), + ('furni_barchair_silo*5_desc', 'Practical and convenient'), + ('furni_divider_nor2*4_desc', 'No way through'), + ('furni_xmas_cstl_gate_name', 'Ice Castle Gate'), + ('furni_noob_stool*5_desc', 'Unfold me and take the weight off (pink)'), + ('furni_bed_budgetb_one_name', 'Plain Single Bed'), + ('friend_request_accept_all', 'Accept all requests.'), + ('furni_val_choco_name', 'Heart Shaped Box'), + ('poster_514_desc', 'Be proud to be in the Union!'), + ('furni_carpet_legocourt_desc', 'Line up your slam dunk'), + ('furni_sofa_silo_name', 'Two-Seater Sofa'), + ('furni_chair_plasto*8_desc', 'Hip plastic furniture'), + ('furni_tree5_name', 'Christmas Tree 3'), + ('nav_venue_habbo_cinema/0_desc', 'Now showing: Kick Warz II - The revenge of Donnie Santini!'), + ('furni_couch_norja*4_name', 'Urban Iced Bench'), + ('poster_52_desc', 'whack that ball!'), + ('furni_sound_set_45_desc', 'The Bass? is the rhythm!'), + ('nav_venue_sun_terrace/0_name', 'Sun Terrace'), + ('queue_tile_limit', 'You can\'t fit more Habbo Rollers in this room!'), + ('BuddyRequesta', 'Friend Request(s)'), + ('transaction_system_sms_rl', 'Elisa'), + ('furni_prizetrophy4_desc', 'Palkinto'), + ('furni_hcamme_desc', 'Time for a soak'), + ('furni_scifirocket*2_name', 'Earth Smoke Machine'), + ('furni_divider_nor5*2_desc', 'Cool cornering for your crib y0!'), + ('forgottenpw', 'Forgotten your password?'), + ('furni_rclr_sofa_desc', 'Snuggle up together'), + ('furni_val_cauldron_desc', 'Cast a loving spell!'), + ('poster_3_name', 'Fish Plaque'), + ('furni_one_way_door*8_name', 'Yellow One Way Gate'), + ('furni_divider_nor3*8_desc', 'Yellow Iced gate'), + ('sw_link_highScores_url', 'http://%predefined%//groups/56553/id'), + ('furni_carpet_standard*2_desc', 'Available in a variety of colours'), + ('nav_venue_sport/0_name', 'The Power Gym'), + ('furni_scifidoor*3_desc', 'There out of this world!'), + ('furni_pillar*7_desc', 'Recovered from Habblantis'), + ('furni_arabian_tray3_name', 'Sweets Tray'), + ('furni_chair_plasto_name', 'Chair'), + ('nav_venue_pizza_name', 'Slice of Life'), + ('url_privacypledge', 'http://%predefined%//help/69'), + ('furni_one_way_door*3_desc', 'One way! The HC way!'), + ('catalog_purchase_not_allowed_hc', 'In order to buy this item you must be a Habbo Club member!'), + ('furni_pura_mdl3*4_name', 'White Pura Module 3'), + ('room_confirmDelete', 'Confirm'), + ('BuddyPrivateRoom', 'In A Guest Room'), + ('furni_marquee*7_desc', 'It\'s both door and a shade!'), + ('furni_bath_desc', 'The ultimate in pampering'), + ('furni_soft_sofa_norja*3_desc', 'Pristine white, keep it clean!'), + ('game_BattleShip', 'Battleships'), + ('furni_sound_set_11_desc', 'Music you can really sink your teeth into'), + ('furni_glass_chair*2_name', 'Glass chair'), + ('furni_sofa_silo*5_desc', 'Pink Area Sofa'), + ('furni_pura_mdl2*7_name', 'Green Pura Module 2'), + ('cam_film.help', 'Number Of Photos Left'), + ('nav_venue_bb_lobby_tournament_17/0_desc', ''), + ('roomatic_hway', 'Hotel guests are expected to follow the Habbo Way even if word filtering is switched off.'), + ('modify', 'Modify'), + ('furni_sofachair_silo*8_name', 'Yellow Armchair'), + ('alert_reg_blocked', 'A person under 11 years of age has tried to register from this machine recently.\\rRegistration is not possible for a while.'), + ('furni_sofa_polyfon*8_desc', 'Yellow Mode Sofa'), + ('furni_wooden_screen*9_desc', 'Add an exotic touch to your room'), + ('hobba_message_from', 'Your call has been responded to as follows:'), + ('win_help', 'Habbo Help'), + ('pet.saying.sniff.dog.1', 'snuh...SNUUUUUH'), + ('pet.saying.sniff.dog.0', 'snuuh..snuuh'), + ('sw_user_skill', 'Snow Storm Skill Level: \\x \\r (\\y points)'), + ('furni_rom_lamp_desc', 'Light up your life'), + ('console_profile_create', 'Create your Habbo Profile.'), + ('furni_CF_50_goldbar_desc', 'Worth 50 Credits'), + ('furni_romantique_chair*4_desc', 'What does this button do?'), + ('reg_use_allowed_chars', 'Use only these characters:'), + ('furni_bar_chair_armas_name', 'Barrel Stool'), + ('pet.saying.sniff.dog.2', '*sighs*'), + ('furni_sound_set_64_name', 'Alhambra Trax 3'), + ('furni_pillar*3_name', 'blue pillar'), + ('furni_glass_chair*4_desc', 'Translucent beauty'), + ('furni_pizza_desc', 'You dirty Habbo'), + ('opening_hours_text_shutdown', 'The Hotel will shut down in %d% minutes. To avoid confusion, purchasing of furniture, Habbo Club and game tickets will be disabled during that time, as well as playing Games and furniture trading. Thank you for visiting and welcome back tomorrow!'), + ('nav_venue_bb_lobby_tournament_10_name', 'Competitie Battle Ball 11'), + ('poster_521_desc', 'Ordem e progresso'), + ('furni_sound_set_52_desc', 'Under the mistletoe!'), + ('furni_shelves_norja*3_name', 'White Iced Bookcase'), + ('furni_scifiport*5_desc', 'Recovered from Roswell'), + ('help_emergency_writeyour', 'Give details of your emergency here:'), + ('furni_table_norja_med*6_name', 'Large Coffee Table Blue'), + ('nav_venue_bb_lobby_expert_3_name', 'Experts Battle Ball 4'), + ('photo_legend', 'Caption'), + ('furni_sofachair_silo_desc', 'Large, but worth it'), + ('console_youdonthavebuddies', 'You have no Friends on your list.\\rYou can send Friend Requests using\\rthe \'search\' button.'), + ('furni_table_plasto_4leg*6_name', 'Occasional table Table'), + ('furni_scifidoor*1_name', 'Pink Spaceship Door'), + ('furni_tile_brown_desc', '10% off downtown promenades & piazzas!'), + ('NUF_getting_room_go_button', 'Click here to go to your just created room!'), + ('dimmer_turn_on', 'Turn ON'), + ('furni_sofa_polyfon_desc', 'Comfort for stylish couples'), + ('furni_sound_set_50_name', 'Club 5'), + ('furni_doorB_name', 'Wardrobe'), + ('reg_agree1', 'Yes, my parents and I agree to the above terms. I am allowed to use Habbo Hotel.'), + ('furni_chair_silo*3_name', 'White Dining Chair'), + ('furni_CF_1_coin_bronze_desc', 'Worth 1 Credits'), + ('reg_agree2', 'Yes, I have read the Habbo Hotel Terms of Service and I accept them'), + ('you_have_pending_cfh', 'Your previous call for help has not been answered yet. To make a new one you must delete the old message.'), + ('furni_table_plasto_bigsquare*7_name', 'Square Dining Table'), + ('console_accept', 'Accept'), + ('furni_lamp_basic_name', 'Pura Lamp'), + ('console_friend_request_error', 'There was an error with friend requests'), + ('poster_11_desc', 'I obey the Habbo way!'), + ('furni_bardeskcorner_polyfon*6_name', 'Blue Mode Bardesk Corner'), + ('furni_plant_sunflower_name', 'Cut Sunflower'), + ('furni_traffic_light*3_name', 'Purple Traffic Light'), + ('furni_bed_polyfon_one*8_name', 'Yellow Mode Single Bed'), + ('furni_carpet_polar*1_desc', 'Cute'), + ('furni_noob_rug*1_desc', 'Nice and neat sisal rug with orange edging'), + ('furni_exe_bardesk_desc', 'Divide the profits!'), + ('furni_romantique_divider*4_desc', 'Keeping things separated'), + ('pet_status_dialog', '%name%'), + ('furni_jp_lantern_name', 'Japanese Lantern'), + ('furni_chair_norja*2_name', 'Black Chair'), + ('furni_jp_irori_desc', 'Traditional heating and eating'), + ('furni_bed_budget*5_name', 'Beige Pura Double Bed'), + ('furni_scifidoor*8_name', 'Purple Spaceship Door'), + ('nav_venue_sw_lobby_free_5_name', 'Free Game Lobby'), + ('wallitem_jp_sheet2_desc', 'jp_sheet2'), + ('furni_glass_sofa*9_desc', 'Translucent beauty'), + ('furni_divider_nor5*7_name', 'Rural Iced Angle'), + ('sound_machine_open_editor', 'Trax Editor'), + ('furni_jp_tatami2_desc', 'Shoes off please'), + ('furni_sound_set_16_name', 'Hip Hop Beats 3'), + ('console_recipients', 'Recipient(s)'), + ('catalog_page', 'page'), + ('poster_23_name', 'Bat Poster'), + ('furni_table_plasto_round*4_name', 'Square Dining Table'), + ('furni_rubberchair*2_desc', 'Soft and tearproof!'), + ('nav_venue_bb_lobby_beginner_16/0_desc', ''), + ('poster_1005_name', 'Johnny Squabble'), + ('furni_silo_studydesk_name', 'Area Quest Desk'), + ('furni_table_plasto_4leg*1_desc', 'Hip plastic furniture'), + ('nav_venue_basement_lobby/0_desc', 'For low level hanging'), + ('furni_rare_parasol*3_desc', 'Block those rays!'), + ('furni_arabian_wndw_name', 'Arabian Window Frame'), + ('Alert_ConnectionFailure', 'Disconnected'), + ('furni_house_desc', 'Good enough to eat'), + ('console_confirm_selected', 'Confirm the selections. Below are the amount of friend requests that will be accepted and declined. If you want, you can still modify the selections.'), + ('furni_table_plasto_4leg*4_name', 'Square Dining Table'), + ('furni_sound_set_57_name', 'RnB Grooves 3'), + ('hubu_h3', 'Huumetietobussi'), + ('furni_table_plasto_bigsquare*2_name', 'Square Dining Table'), + ('hubu_h4', 'Anna palautetta'), + ('hubu_h1', 'Puhelintuki'), + ('roomatic_bobbafilter', 'Bobba filter (filters out bad language)'), + ('hubu_h2', 'Harrastamaan!'), + ('furni_tv_luxus_desc', 'Bang up to date'), + ('hubu_h5', 'Huumetietoa'), + ('NUF_console_hotelview_icon', 'Click the button to open your Habbo Console.'), + ('modtool_banlength', 'Ban Length:'), + ('NUF_visiting_rooms_roomlist_tutor', 'Just pick any room you like. Click on the room to see a description of the room. ROOM!'), + ('reg_verification_newPassword', 'New password:'), + ('furni_wall_china_name', 'Dragon Screen'), + ('nav_venue_hallway_ii/0_desc', 'Beware witches and warlocks'), + ('jukebox_disk_add', 'Add Disc'), + ('furni_rare_xmas_screen_desc', 'Ho Ho Ho!'), + ('furni_table_plasto_round*2_name', 'Round Dining Table'), + ('furni_rubberchair*7_name', 'White Inflatable Chair'), + ('nav_favourites_helptext', 'These are your favourite rooms. Nice selection you have here...'), + ('nav_venue_sw_lobby_beginner_4_name', 'Snow Rookies Lobby'), + ('furni_gothic_chair*2_desc', 'The prince of Habbo'), + ('cam_save_nofilm', 'You have run out of film.\\rGet a roll (5 photos) from\\rthe Catalogue for 6 Credits.'), + ('furni_sofa_polyfon*6_desc', 'Blue Mode Sofa'), + ('furni_divider_silo3*2_desc', 'Form following function'), + ('furni_rare_beehive_bulb*1_name', 'Red Amber Lamp'), + ('furni_plant_small_cactus_desc', 'Even less watering than the real world'), + ('furni_triplecandle_name', 'Electric Candles'), + ('help_option_1', 'Playing Habbo'), + ('help_option_3', 'A serious issue (harassment, sexual behaviour)'), + ('furni_present_gen5_name', 'Gift'), + ('help_option_2', 'My Habbo account.'), + ('furni_shelves_norja*8_name', 'Yellow Bookcase'), + ('furni_legotrophy_desc', 'For the winning team'), + ('furni_rare_icecream*2_name', 'Pistachio Ice Cream Machine'), + ('furni_summer_pool*1_desc', 'Fancy a dip?'), + ('nav_venue_theatredrome_deli/0_desc', 'Join in all the fun of the fair!'), + ('game_newgame', 'New game'), + ('help_tour', 'Guided Tour'), + ('purse_vouchers_error3_url', 'http://%predefined%//credits'), + ('furni_marquee*5_name', 'Graphite Marquee'), + ('forgottenpw_explanation', 'If you have forgotten your password and you gave your correct email address when you registered, we can send your password to you.'), + ('furni_waterbowl*3_name', 'Yellow Water Bowl'), + ('roomatic_namedisp', 'Do you want your name to be displayed with the room?'), + ('poster_28_name', 'Silver Tinsel Bundle'), + ('Alert_BuyingOK', 'Buying Successful!'), + ('furni_summer_chair*4_name', 'Deck Chair'), + ('nav_venue_welcome_lounge_ii/0_desc', 'New? Lost? Get a warm welcome here from Habbo eXperts.'), + ('bb_title_gameCreation', 'Aloita uusi peli!'), + ('furni_sporttrack1*3_name', 'Sport track straight grass'), + ('furni_romantique_divan*2_name', 'Emerald Chaise-Longue'), + ('furni_divider_silo1*6_name', 'Blue Area Corner Shelf'), + ('NUF_about_hotel_about_tutor', 'Habbo is both a virtual world and an online community.'), + ('url_helpparents', 'http://%predefined%//help/73'), + ('furni_divider_silo3*7_name', 'Green Area Gate'), + ('poster_18_desc', 'Beautiful reproduction butterfly'), + ('furni_traffic_light*5_desc', 'Chill and wait your turn!'), + ('furni_scifirocket*6_desc', 'Too hot to handle!'), + ('pet.saying.angry.cat.0', 'Sssppp!'), + ('furni_bed_armas_one_desc', 'Rustic charm for one'), + ('pet.saying.angry.cat.3', '*hiss*'), + ('pet.saying.angry.cat.1', 'MrrRRRR'), + ('pet.saying.angry.cat.2', 'Tssssss!'), + ('furni_noob_rug*6_name', 'My first Habbo rug'), + ('club_habbo.bottombar.text.member', 'Habbo Club'), + ('furni_divider_silo1_name', 'Corner Shelf'), + ('nav_venue_bb_lobby_beginner_10/0_desc', ''), + ('recycler_info_progress', 'Recycling is currently in progress. The recycling process takes a total of %recyclinghours% hour. You can leave the catalogue and recycling will continue in the background.'), + ('furni_queue_tile1*1_name', 'Pink Habbo Roller'), + ('notickets_header', 'Buy game tickets to play this game'), + ('reg_underage', 'I am under 11 years old'), + ('nav_venue_sw_arena_intermediate_name', 'Playing intermediate game'), + ('furni_table_plasto_square*5_name', 'Square Dining Table'), + ('Alert_YouAreBanned_T', 'A Moderator kicked you out of the room.'), + ('buddyremove_moreoptions', 'More Options >>'), + ('furni_prizetrophy4*3_desc', 'Breathtaking bronze'), + ('furni_chair_silo*2_desc', 'Keep it simple'), + ('club_habbo.bottombar.link.notmember', 'Join!'), + ('poster_1000_name', 'Comedy Poster'), + ('room_badge_button', 'Badge'), + ('furni_soft_sofa_norja*8_desc', 'Yellow Iced Sofa'), + ('wallitem_torch_name', 'Gothic Torch'), + ('furni_scifirocket*7_name', 'Jupiter Smoke Machine'), + ('furni_romantique_tray1_desc', 'For a fast break'), + ('furni_rare_dragonlamp*0_desc', 'George and the...'), + ('furni_nest_desc', 'Night, night'), + ('furni_table_silo_small*2_name', 'Black Occasional Table'), + ('furni_prizetrophy7*2_name', 'Silver Habbo trophy'), + ('furni_sofachair_silo*3_desc', 'Large, but worth it'), + ('furni_divider_nor2*9_name', 'Red Iced bar desk'), + ('club_extend_title', 'Habbo Club membership can be extended VERY easily.'), + ('furni_rare_fan*0_desc', 'As red as Rudolph\'s nose'), + ('club_paybycash_url', '(leave this empty if you don\'t want to have this link displayed)'), + ('poster_57_name', 'Calligraphy poster'), + ('furni_CFC_50_coin_silver_desc', 'Worth 50 Credits'), + ('furni_pillow*5_name', 'Black Leather Pillow'), + ('furni_hc_chr_name', 'Majestic Chair'), + ('nav_venue_sw_arena_free_name', 'Playing free for all game'), + ('furni_active_placeholder_desc', 'This furniture is downloading...'), + ('nav_venue_welcome_lounge_name', 'Welcome Lounge'), + ('furni_soft_sofachair_norja*3_name', 'White Iced Sofachair'), + ('furni_bed_polyfon*3_desc', 'Give yourself space to stretch out'), + ('furni_pura_mdl4*3_name', 'Black Pura Module 4'), + ('furni_pillar*2_desc', 'Ancient and stately'), + ('furni_small_chair_armas_desc', 'Rustic charm at it\'s best'), + ('furni_table_plasto_round_desc', 'Hip plastic furniture'), + ('furni_marquee*2_desc', 'Dragons out and Davids in!'), + ('furni_wooden_screen*7_desc', 'Add an exotic touch to your room'), + ('furni_queue_tile1*8_name', 'Navy Habbo Roller'), + ('furni_arabian_pllw_desc', 'Exotic comfort'), + ('furni_sound_set_1_desc', 'Get the party started!'), + ('furni_gothic_stool*5_desc', 'The dark side of Habbo'), + ('furni_china_table_desc', 'Exotic and classy'), + ('song_disk_trade_info', '%name%'), + ('nav_venue_sw_lobby_beginner_9_name', 'Snow Rookies Lobby'), + ('console_modify', 'Modify'), + ('poster_36_desc', 'The Hotels girlband. Dream on!'), + ('furni_rare_dragonlamp*7_desc', 'Scary and scorching!'), + ('furni_sound_set_63_desc', 'Desert hits by the oasis!'), + ('nav_venue_cafe_gold_name', 'The Oasis'), + ('nav_venue_sw_lobby_tournament_3/0_desc', ''), + ('nav_venue_habbo_cinema_name', 'Habbo Cinema'), + ('furni_chair_plasty*4_name', 'Plastic Pod Chair'), + ('nav_venue_welcome_lounge_iii/0_desc', 'New? Lost? Get a warm welcome here from Habbo eXperts.'), + ('furni_carpet_soft*1_desc', 'Soft Wool Rug'), + ('furni_sporttrack1*1_name', 'Sport track straight'), + ('furni_divider_nor3*6_name', 'Blue Iced gate'), + ('furni_glass_chair*7_name', 'Green Glass Chair'), + ('club_confirm_gift_text', 'A new club gift has arrived. Please push OK if you want to receive it now. If you click cancel you will be asked again next time you log in to the Hotel.'), + ('furni_rubberchair*5_name', 'Lime Inflatable Chair'), + ('furni_plant_maze_snow_name', 'Snowy Maze Bundle 2'), + ('furni_table_silo_med*4_name', 'Beige Area Coffee Table'), + ('furni_solarium_norja*1_desc', 'Rejuvenate your pixels!'), + ('furni_divider_nor2*2_name', 'Black Iced bar desk'), + ('poster_45_desc', 'Needs a few more Habburgers'), + ('wallitem_habw_mirror_desc', 'Star of the show!'), + ('furni_pura_mdl3*9_name', 'Red Pura Module 3'), + ('furni_exe_corner_name', 'Executive Corner Desk'), + ('nav_venue_cunning_fox_gamehall/3_desc', 'Are you the new Deep Blue?'), + ('furni_rare_fan*7_desc', 'It\'ll blow you away!'), + ('furni_divider_nor1*5_desc', 'Pink Ice corner'), + ('wallitem_md_logo_wall_name', 'Bubble Juice Logo'), + ('furni_bardesk_polyfon_desc', 'Perfect for work or play'), + ('console_target_does_not_accept', 'This user does not accept friend requests at the moment'), + ('pet.saying.beg.croco.0', 'Mmmmmrrr'), + ('pet.saying.beg.croco.1', '*Emo tear*'), + ('messenger.email.header', ''), + ('pet.saying.beg.croco.2', 'Waarrrr...rrr'), + ('furni_carpet_polar*4_name', 'Green Bear Rug'), + ('furni_chair_plasto*6_name', 'Chair'), + ('furni_noob_rug*4_name', 'My first Habbo rug'), + ('furni_summer_chair*6_desc', 'Blue'), + ('rotate_furniture', 'Rotate Furni'), + ('poster_16_desc', 'Added security'), + ('furni_sofachair_silo*7_desc', 'Green Area Armchair'), + ('furni_divider_nor5*4_desc', 'Cool cornering for your crib!'), + ('furni_sand_cstl_twr_name', 'sand_cstl_twr'), + ('furni_safe_silo*4_name', 'Beige Safe Minibar'), + ('furni_chair_plasty*11_name', 'Plastic Pod Chair'), + ('furni_divider_arm2_name', 'Room divider'), + ('furni_sound_set_55_name', 'RnB Grooves 1'), + ('nav_venue_sw_lobby_intermediate_4_name', 'Snow Bombardiers Lobby'), + ('roomatic_canmodifysettings', '(You can change these settings later)'), + ('furni_pura_mdl5*7_desc', 'Any way you like it!'), + ('catalog_pet_name_length', 'Oops, pet\'s name is too long (max 15 characters)'), + ('furni_toy1*3_name', 'Rubber Ball'), + ('nav_venue_beauty_salon_loreal/0_desc', 'No Pixel Surgery, only natural make-ups!'), + ('furni_arabian_swords_name', 'Ancestral Scimitars'), + ('furni_summer_pool*4_name', 'Yellow Summer Pool'), + ('gs_error_create_0', 'This Lobby is full, please create a Game in another Lobby!'), + ('nav_venue_pizzeria/0_desc', 'Pizza; food of the hungry!'), + ('nav_roomnfo_hd_own', 'Own Rooms'), + ('furni_glass_sofa*4_desc', 'Translucent beauty'), + ('buddyremove_accept', 'Remove Friends'), + ('transaction_system_sms_win_orange', 'Orange SMS'), + ('gs_error_create_3', 'Your skill level isn\'t high enough for creating Games in this Lobby.'), + ('furni_goodie2_desc', 'For gourmet kittens'), + ('trading_youagree', 'You agree'), + ('furni_bench_lego_name', 'Team Bench'), + ('reg_verification_updateOK', 'Update successful'), + ('transaction_system_refunds', 'Refund'), + ('furni_carpet_standard*7_name', 'Floor Rug'), + ('poster_44_name', 'Mummy'), + ('furni_bed_polyfon_one*3_name', 'White Single Bed'), + ('furni_jp_tray1_name', 'jp_tray1'), + ('furni_jp_tatami_name', 'Small Tatami Mat'), + ('furni_bardesk_polyfon*2_name', 'Black Mode Bardesk'), + ('furni_hockey_light_desc', 'Set it off.'), + ('nav_venue_bb_lobby_intermediate_2/0_desc', ''), + ('wallitem_guitar_v_name', 'v guitar'), + ('reg_email', 'Email:'), + ('nav_venue_sw_lobby_tournament_0/0_desc', ''), + ('furni_club_sofa_name', 'Club sofa'), + ('furni_duck_name', 'Rubber Duck'), + ('furni_divider_nor5*9_name', 'Red Iced Angle'), + ('furni_smooth_table_polyfon_name', 'Large Dining Table'), + ('reg_forcedupdate', 'Please update your Habbo details!'), + ('transaction_system_stuff_store', 'Catalogue purchase'), + ('console_request_massoperation_title', 'You have %messageCount% friend requests waiting.'), + ('nav_venue_bb_lobby_expert_8/0_desc', ''), + ('roomatic_roomdescription', 'Room description:'), + ('reg_verification_invalidEmail', 'Check email address'), + ('furni_xmas_icelamp_desc', '20 lanterns for the price of 6!'), + ('wallitem_wallmirror_desc', 'Mirror, mirror on the wall...'), + ('furni_pura_mdl1*3_name', 'Black Pura Module 1'), + ('pet.saying.play.croco.1', 'Squeh Squeeeeh...'), + ('pet.saying.play.croco.0', ':)'), + ('nav_venue_theatredrome_halloween/0_desc', 'Warm welcome to Bullet For My Valentine!'), + ('nav_venue_bb_lobby_amateur_6_name', 'Gevorderden Battle Ball 7'), + ('cam_savetxt', 'Saving Photo...'), + ('nav_venue_bb_lobby_intermediate_1_name', 'Semi-profs Battle Ball 2'), + ('nav_modify_doorstatus', 'Door status'), + ('callhelp_sent', 'If you have questions about Habbo Hotel or your Habbo account, please write the details below and a member of community staff will respond as soon as possible.'), + ('wallitem_photo_name', 'Photo'), + ('poster_25_desc', 'A new use for carrots!'), + ('furni_chair_plasto*1_desc', 'Hip plastic furniture'), + ('furni_prizetrophy4*2_name', 'Fish trophy'), + ('furni_bar_armas_name', 'Barrel Minibar'), + ('nav_rooms_favourite', 'Favourites'), + ('furni_table_plasto_square*6_desc', 'Hip plastic furniture'), + ('furni_gothic_sofa*6_desc', 'The dark side of Habbo'), + ('jukebox_song_length', 'Song length: %time%'), + ('buddyremove_header', 'Choose %amount% friends to remove'), + ('furni_romantique_mirrortabl_desc', 'Get ready for your big date'), + ('wallitem_hrella_poster_2_name', 'Life Buoy'), + ('reg_boy', 'Boy'), + ('sound_machine_trax_name', 'Trax name:'), + ('purse_vouchers_error0', 'Technical error! Cannot redeem voucher.'), + ('furni_plant_valentinerose*3_name', 'Yellow Valentine Rose'), + ('purse_vouchers_error1', 'Invalid voucher code.'), + ('nav_venue_bb_lobby_expert_1_name', 'Experts Battle Ball 2'), + ('purse_vouchers_error2', 'Product delivery failed, please contact Customer Service'), + ('purse_vouchers_error3', 'This voucher must be redeemed on the Habbo website'), + ('furni_romantique_chair*2_desc', 'null'), + ('furni_prizetrophy7*1_desc', 'Gold Habbo trophy'), + ('furni_table_plasto_bigsquare*14_name', 'Occasional Table'), + ('furni_ticket_desc', 'A bundle of 5 gaming tickets'), + ('nav_venue_club_massiva_name', 'Club Massiva'), + ('roomatic_locked', 'Door locked - visitors have to ring doorbell'), + ('furni_table_silo_small*3_desc', 'For those random moments'), + ('furni_bed_trad_name', 'Plain Double Bed'), + ('summer_chair_5_name', 'Beige Deck Chair'), + ('buddyremove_select_all', 'Select All Friends'), + ('furni_plant_valentinerose*5_desc', 'For that special pixel'), + ('furni_glass_table*9_name', 'Glass table'), + ('furni_romantique_smalltabl*5_desc', 'Why is one leg different?'), + ('furni_pura_mdl5*5_name', 'beige pura module 5'), + ('poster_30_name', 'Mistletoe'), + ('furni_chair_basic*8_name', 'chair_basic'), + ('nav_venue_sw_lobby_amateur_2_name', 'Snow Slingers Lobby'), + ('Alert_ConnectionDisconnected', 'Please reload Habbo Hotel!\\r\\rIf this happens again, please wait a moment before reloading.'), + ('Alert_WrongPassword', 'Check password!'), + ('nav_modify_letothersmove', 'Let other people move and leave furniture in the room.'), + ('furni_rare_dragonlamp*1_name', 'Sea Dragon Lamp'), + ('furni_table_plasto_4leg*10_desc', 'Hip plastic furniture'), + ('furni_sound_set_28_name', 'Rock 2'), + ('furni_grand_piano*2_name', 'Black Grand Piano'), + ('furni_basket_desc', 'Eggs-actly what you want for Easter'), + ('furni_rare_fan*5_name', 'Yellow Powered Fan'), + ('furni_noob_lamp*2_name', 'My first Habbo lamp'), + ('furni_present_gen4_desc', 'What\'s inside?'), + ('furni_pillar*9_desc', 'Ancient and stately'), + ('furni_chair_norja*8_desc', 'Sleek and chic for each cheek'), + ('furni_pura_mdl2*2_desc', 'Any way you like it!'), + ('furni_glass_stool*5_desc', 'Translucent beauty'), + ('furni_hc_lmp_name', 'Oil Lamp'), + ('console_myinterests', 'My interests:'), + ('furni_val_teddy*6_desc', 'The blue bear of happiness'), + ('room_cant_set_item', 'You cannot place this in someone else\'s room!'), + ('poster_29_desc', '10 x Gold Tinsel'), + ('club_general_daysleft', 'Number of HC days left'), + ('nav_popup_nav_link', 'Open the Navigator'), + ('furni_sound_set_43_desc', 'Beware zombies!'), + ('furni_solarium_norja*6_name', 'Blue Solarium'), + ('furni_doormat_plain*1_name', 'Doormat'), + ('nav_venue_chill_name', 'Zen Garden'), + ('furni_one_way_door*5_desc', 'One at a time!'), + ('furni_table_plasto_round*3_desc', 'Hip plastic furniture?'), + ('furni_prizetrophy6_desc', 'Palkinto'), + ('furni_exe_s_table_name', 'Executive Glass Table'), + ('furni_noob_rug*5_desc', 'Nice and neat sisal rug with pink edging'), + ('furni_scifirocket*0_name', 'Mars Smoke Machine'), + ('furni_soft_jaggara_norja_desc', 'Soft Iced sofachair'), + ('nav_venue_bb_lobby_amateur_9/0_desc', ''), + ('furni_chair_plasty*5_desc', 'Hip plastic furniture'), + ('hobba_mark_emergency', 'Emergency Help'), + ('furni_djesko_turntable_name', 'Habbo Turntable'), + ('furni_shelves_norja*9_desc', 'For nic naks and art deco books'), + ('poll_confirm_cancel_long', 'Are you sure you want to stop answering the poll? You can\'t continue later.'), + ('poster_32_desc', 'The Auspicious One'), + ('opening_hours_text_opening_time', 'The Hotel will open again at %h%:%m%. We look forward to welcoming you back!'), + ('furni_bed_budget_one*7_name', 'Green Pura Bed'), + ('furni_pillow*0_desc', 'Minimalist comfort!'), + ('furni_divider_poly3*8_desc', 'Yellow Mode Bardesk Gate'), + ('nav_venue_bb_lobby_beginner_13/0_desc', ''), + ('furni_sound_set_6_name', 'Ambient 3'), + ('hubu_win', 'Bus - Info'), + ('furni_sound_machine*5_name', 'Brown Traxmachine'), + ('furni_sporttrack1*2_desc', 'null'), + ('bb_title_bouncingBall', 'Battle Ball'), + ('nav_venue_rooftop/0_desc', 'Hang out on the very rooftop of Habbo Hotel!'), + ('modtool_banreason', 'Ban Reason:'), + ('furni_chair_silo*9_desc', 'Red Silo Dining Chair'), + ('furni_bed_budget*6_desc', 'King sized comfort!'), + ('furni_s_sound_machine*4_desc', 'Sound Machine Blue Desc'), + ('furni_rubberchair*6_desc', 'Soft and tearproof!'), + ('nav_venue_sw_lobby_expert_1_name', 'Snow Marksmen Lobby'), + ('nav_venue_bb_lobby_beginner_7/0_desc', ''), + ('furni_table_plasto_4leg*5_desc', 'Hip plastic furniture'), + ('gen_youhave', 'You Have'), + ('furni_carpet_soft*6_name', 'Soft Wool Rug'), + ('furni_petfood2_desc', 'Fantastic 20% Saving!'), + ('group_privileges', 'Priviliges:'), + ('furni_samovar_name', 'Russian Samovar'), + ('furni_hal_grave_name', 'Haunted Grave'), + ('furni_bed_budget_one*2_desc', 'Princess sized comfort!'), + ('gs_error_1', 'You have entered invalid data!'), + ('reject', 'Reject'), + ('gs_error_4', 'You have reached your maximum number of daily Games!'), + ('nav_venue_sw_lobby_tournament_5_name', 'Tournament Lobby'), + ('gs_error_5', 'Tournament is only available for users living in the UK.'), + ('gs_error_2', 'You don\'t have enough Tickets!'), + ('gs_error_8', 'To start a Game, there must be at least two Teams of one player each!'), + ('sound_machine_alert_no_sound_sets', 'You don\'t have any sound sets available for song editing. \\rNote that the sets need to be in your inventory (hand).'), + ('furni_waterbowl*4_desc', 'Aqua unlimited'), + ('furni_doormat_love_desc', 'Welcome Habbos in style'), + ('gs_error_6', 'You have been removed from the Game!'), + ('furni_soft_sofachair_norja*4_desc', 'Sit back and relax'), + ('bb_powerup_desc_8', 'By using a vacuum cleaner, you can clear any tile in the field.'), + ('move', 'Move'), + ('furni_romantique_smalltabl*3_name', 'Turquoise Tray Table'), + ('furni_bed_polyfon*8_name', 'Yellow Mode Double Bed'), + ('furni_sofachair_polyfon*4_desc', 'Beige Mode Armchair'), + ('forgottenpw_email', 'Your email address'), + ('console_email', 'Email'), + ('bb_powerup_desc_1', 'Light bulb colours an area around it.'), + ('furni_divider_nor2_desc', 'Strong, yet soft looking'), + ('furni_bardeskcorner_polyfon*5_desc', 'For sweet corners!'), + ('say', 'Say'), + ('bb_powerup_desc_3', 'Flashlight colours a straight line ahead of you.'), + ('bb_powerup_desc_2', 'Bouncing on a spring locks tiles in a single jump.'), + ('bb_powerup_desc_5', 'Bouncing on a box of pins will burst your Battle Ball!'), + ('bb_powerup_desc_4', 'A shot with a cannon locks tiles on a straight line.'), + ('furni_chair_basic*1_name', 'chair_basic'), + ('bb_powerup_desc_7', 'A bomb will clear all tiles around it.'), + ('bb_powerup_desc_6', 'Harlequin effect makes everybody colour tiles for your team!'), + ('NUF_console_read_next', 'Click \'OK\' to mark message as read.'), + ('poster_50_name', 'Bat Poster'), + ('furni_table_plasto_4leg*15_name', 'Occasional Table'), + ('furni_tree7_desc', 'Walking in a winter wonderland!'), + ('poster_37_name', 'The Habbo Babes 3'), + ('furni_queue_tile1*7_desc', 'The power of movement'), + ('furni_bed_budgetb_name', 'Plain Double Bed'), + ('interface_icon_sound', 'Sound Off/On'), + ('pet.hotwords.come_here', 'come here'), + ('poster_10_name', 'Lapland Poster'), + ('win_delete_item', 'Remove Item'), + ('wallitem_hrella_poster_3_name', 'Anchor'), + ('furni_table_plasto_bigsquare*8_desc', 'Hip plastic furniture'), + ('furni_habboween_grass_name', 'Unholy Ground'), + ('furni_plant_valentinerose*4_name', 'Pink Valentine\'s Rose'), + ('nav_venue_skylight_lobby/0_desc', 'Lift your spirits on the top floor'), + ('buddyremove_alphabetical', 'Alphabetical Order'), + ('alert_win_coppa', 'You are blocked'), + ('nav_venue_bb_lobby_amateur_5_name', 'Gevorderden Battle Ball 6'), + ('reg_update_text', 'Never change your password or email just because somebody asks you to. He / she is most probably trying to steal your Habbo account and furni!'), + ('decision_ok', 'OK'), + ('furni_summer_grill*3_name', 'Yellow Barbeque Grill'), + ('nav_public_helptext', 'These are hotel\'s public rooms. What are you waiting for? Go and meet other Habbos!'), + ('tickets_button_info_2', 'Stuff you can do with these 20 tickets'), + ('furni_rclr_chair_name', 'Palm Chair'), + ('login_create1here', 'You can create one here.'), + ('tickets_button_info_1', 'Stuff you can do with these 2 tickets'), + ('furni_prizetrophy6*3_name', 'Champion trophy'), + ('furni_shelves_norja*2_desc', 'For nic naks and art deco books'), + ('purse_info', 'DESCRIPTION'), + ('bb_choose_powerups', 'Powerup select'), + ('purse_transaction', 'View Transactions'), + ('reg_birthdayformat', 'Birthday*: [dd][mm][yyyy]'), + ('Alert_YouMustAgree', 'You must accept the Terms and Conditions before proceeding.'), + ('jukebox_empty', 'Empty'), + ('purse_info_film', 'Films For Camera'), + ('furni_sofachair_polyfon*9_desc', 'Loft-style comfort'), + ('furni_habbocake_desc', 'Save me a slice!'), + ('furni_doormat_plain*6_desc', 'Available in a variety of colours'), + ('nav_venue_sun_terrace/0_desc', 'For lazy afternoons and super tan treatment!'), + ('poster_501_desc', 'For pirates everywhere'), + ('pet_thir_2', 'Thirsty'), + ('gs_error_watch_0', 'All The Spectator Seats Are Taken!'), + ('pet_thir_3', 'Not thirsty'), + ('camera_open_dialog_text', 'Would you like to take some photos\\ror put your camera in your room?'), + ('furni_bed_budget_one*9_desc', 'Prince sized comfort!'), + ('ph_goswimming', 'Go swimming!'), + ('furni_habboween_crypt_name', 'Creepy Crypt'), + ('gs_error_join_7', 'You have already joined this Game!'), + ('nav_venue_sw_lobby_amateur_3_name', 'Snow Slingers Lobby'), + ('furni_romantique_smalltabl*4_name', 'Amber Tray Table'), + ('gs_error_join_3', 'You either have too much or too little skill to join.'), + ('pet_thir_0', 'Gasping'), + ('gs_error_join_0', 'The team you selected is already full.'), + ('pet_thir_1', 'Parched'), + ('furni_gothic_stool*3_name', 'Gothic Stool Red'), + ('furni_wooden_screen*1_name', 'Pink Oriental screen'), + ('furni_sofa_silo*4_name', 'Beige Area Sofa'), + ('furni_queue_tile1*2_desc', 'The power of movement'), + ('buddyremove_continue', 'Remove Friend Now'), + ('nav_venue_bb_lobby_expert_2/0_desc', ''), + ('nav_loading', 'Loading...'), + ('furni_bed_armas_two_name', 'Double Bed'), + ('furni_prizetrophy4*1_name', 'Fish trophy'), + ('furni_sound_machine*7_desc', 'Red alert. Red alert. It\'s a party!'), + ('furni_glass_sofa_desc', 'Translucent beauty'), + ('furni_barchair_silo*5_name', 'Pink Bar Stool'), + ('furni_soft_sofachair_norja*5_desc', 'Pink Iced Sofachair'), + ('console_fr_accepted_count', 'Amount to be accepted'), + ('poster_2001_desc', 'Perinteinen ryijy,'), + ('furni_couch_norja*5_desc', 'Two can perch comfortably'), + ('furni_rclr_lamp_desc', 'Light your space'), + ('furni_sand_cstl_wall_desc', 'sand_cstl_wall'), + ('furni_one_way_door*4_name', 'Beige One Way Gate'), + ('furni_corner_china_name', 'Dragon Screen'), + ('nav_venue_sw_lobby_amateur_4/0_desc', 'Astetta rankempaa lumisotaa.'), + ('furni_chair_silo*7_name', 'Green Silo Dining Chair'), + ('transaction_system_messenger', 'Console SMS'), + ('furni_pura_mdl4*8_desc', ''), + ('console_reject_selected', 'Reject selected'), + ('furni_rare_icecream*4_desc', 'Virtual strawberry rocks!'), + ('furni_prizetrophy*2_desc', 'Shiny silver'), + ('furni_scifiport*0_desc', 'Energy beams. No trespassers!'), + ('paalu_ui2', 'Push'), + ('paalu_ui3', 'Moving'), + ('paalu_ui4', 'Stabilise'), + ('paalu_ui5', 'Balance'), + ('furni_sofa_polyfon*7_name', 'Green Mode Sofa'), + ('nav_error_toomanyfavrooms', 'You can\'t have more than 10 favourite rooms! Please remove an old favourite if you want to add a new one.'), + ('furni_noob_stool*5_name', 'My first Habbo stool'), + ('sound_machine_alert_missing_packages', 'You need the following Traxpacks to edit this song:'), + ('furni_grunge_bench_name', 'Bench'), + ('paalu_ui1', 'Balance'), + ('furni_sleepingbag*5_name', 'Graphite Sleeping Bag'), + ('furni_divider_nor2*3_name', 'White Iced Bar-Desk'), + ('bb_header_teams', 'Teams'), + ('wallitem_sw_swords_name', 'Swords'), + ('furni_val_choco_desc', 'One for them. Two for me!'), + ('nav_venue_bb_lobby_expert_5/0_desc', ''), + ('furni_soft_sofa_norja*2_name', 'Black Iced Sofa'), + ('furni_bed_budgetb_one_desc', 'All you need for a good night\'s kip'), + ('furni_carpet_standard*8_name', 'Floor Rug'), + ('furni_rare_dragonlamp*6_name', 'Gold Dragon Lamp'), + ('furni_sound_set_56_desc', 'Get down tonight!'), + ('furni_divider_nor5*2_name', 'Black Iced Angle'), + ('chat.curse_word', 'Bobba'), + ('furni_couch_norja*4_desc', 'Two can perch comfortably'), + ('furni_scifirocket*2_desc', 'A little closer to home!'), + ('furni_rare_fan*6_desc', 'It\'ll blow you away!'), + ('poster_514_name', 'The EU flag'), + ('club_desc_2_period', '3 Months (93 days) = 60 Credits'), + ('furni_glass_chair*9_desc', 'Translucent beauty'), + ('poster_1338_desc', 'If her age on the clock, she ready for the cock'), + ('nav_src_hd', 'Search Results.'), + ('console_unknown_sender', 'Unknown sender'), + ('furni_prizetrophy4_name', 'Pokaali'), + ('nav_venue_sunset_cafe/0_desc', 'Come and chat about Official Fansites and meet their staff!'), + ('furni_pura_mdl4*9_desc', 'Any way you like it!'), + ('furni_pillar*8_name', 'Roman Pillar'), + ('nav_venue_sport/0_desc', 'St Trinian\'s is out on DVD April 14th!'), + ('furni_pillar*7_name', 'Atlantean Pillar'), + ('club_extend_text', 'If you\'re subscribing again to Habbo Club, you won\'t lose any of the advantages or ongoing furni gifts. Club membership can be extended in advance.\\rRemember: one club month lasts 31 days.'), + ('sound_machine_confirm_eject', 'Remove cartridge?'), + ('shopping_got', 'You have xx in your Purse.'), + ('furni_rare_stand_desc', 'Stand and Deliver!'), + ('furni_chair_plasto_desc', 'Hip plastic furniture'), + ('furni_bed_polyfon_one*9_desc', 'Cot of the artistic'), + ('furni_couch_norja*9_name', 'Red Bench'), + ('poster_3_desc', 'Smells fishy, looks cool'), + ('paalu.winner', 'Winner:'), + ('NUF_meeting_people_room_wave', 'These buttons let you wave and dance. Click on your Habbo at anytime to see these buttons.'), + ('sound_machine_confirm_window', 'Sound Machine'), + ('furni_one_way_door*3_name', 'White HC Gate'), + ('furni_chair_plasty*9_name', 'Plastic Pod Chair'), + ('gs_timeleft', 'Time Left \\x'), + ('hobba_pickup', 'Pick Up'), + ('console_lastvisit', 'Last Visit'), + ('furni_rare_globe_desc', 'It\'s all white..'), + ('furni_val_cauldron_name', 'Valentine\'s Cauldron'), + ('poster_43_name', 'Chains'), + ('furni_bardesk_polyfon*8_desc', 'Yellow Mode Bardesk'), + ('furni_sound_set_36_name', 'Latin Love 1'), + ('dimmer_apply', 'Apply'), + ('furni_glass_chair*8_desc', 'Translucent beauty'), + ('furni_pura_mdl2*7_desc', 'Any way you like it!'), + ('furni_prizetrophy*3_desc', 'Breathtaking bronze'), + ('furni_marquee*1_name', 'Pink marquee'), + ('NUH_own_user', 'This is your Habbo. Click on the floor to move around.'), + ('furni_gothic_sofa*1_desc', 'The dark side of Habbo'), + ('furni_divider_nor5*3_name', 'White Iced Angle'), + ('furni_divider_nor4*5_name', 'Pink Iced Auto Shutter'), + ('furni_soft_sofa_norja*3_name', 'White Iced Sofa'), + ('furni_sofachair_silo*8_desc', 'Large, but worth it'), + ('furni_pura_mdl1*9_desc', 'Any way you like it!'), + ('furni_chair_plasto*7_name', 'Chair'), + ('furni_pura_mdl5*6_desc', 'Any way you like it!'), + ('emailpw', 'Send'), + ('sound_machine_playlist_window', 'Traxmachine Playlist Editor'), + ('furni_pura_mdl1*3_desc', 'Any way you like it!'), + ('furni_noob_table*5_desc', 'Lightweight, practical and pink'), + ('furni_scifirocket*6_name', 'Mercury Smoke Machine'), + ('furni_shelves_norja_name', 'Bookcase'), + ('poster_521_name', 'Flag of Brazil'), + ('sound_machine_jukebox_disk_window', 'Insert disc'), + ('furni_table_norja_med*6_desc', 'For larger gatherings'), + ('furni_pillow*6_name', 'Blue Cotton Pillow'), + ('furni_shelves_norja*3_desc', 'For nic naks and art deco books'), + ('queue_set.s.info', 'There are %d% Habbos in front of you in the queue to see the Habbo Live broadcast!'), + ('reg_parentemail_info', 'Because of your age, we need to let your parents know you are registering at Habbo Hotel. Please give the email address of one of your parents/guardians.'), + ('club_txt_paycash', 'Pay by Cash'), + ('furni_chair_plasto*11_name', 'Chair'), + ('furni_pizza_name', 'Pizza Box'), + ('furni_table_plasto_4leg*6_desc', 'Hip plastic furniture'), + ('furni_chair_silo*3_desc', 'Keep it simple'), + ('alert_reg_t', 'Please check these details:'), + ('nav_venue_theatredrome_name', 'Theatredrome'), + ('furni_hc_rntgn_desc', 'Believe it or not!'), + ('nav_venue_main_lobby_name', 'Main Lobby'), + ('furni_sound_set_64_desc', 'Make a little Jinn-gle!'), + ('nav_venue_sw_lobby_amateur_desc', 'Practice improves a Snow Stormer\'s aim... Ops, missed!'), + ('furni_scifiport*5_name', 'Security Fence'), + ('furni_lamp_basic_desc', 'Switch on the atmosphere with this sophisticated light'), + ('pet.saying.sniff.cat.0', 'snuh..snuh'), + ('poster_506_name', 'The flag of Finland'), + ('furni_bardeskcorner_polyfon*6_desc', 'Blue Mode Bardesk Corner'), + ('nav_venue_hotel_kitchen_name', 'Hotel Kitchen'), + ('furni_doorB_desc', 'Narnia this way!'), + ('poster_11_name', 'Certificate'), + ('furni_safe_silo_desc', 'Totally shatter-proof!'), + ('furni_bed_budget_one*3_desc', 'Prince sized comfort!'), + ('furni_romantique_divider*4_name', 'Ochre Screen'), + ('previous_onearrowed', '< Previous'), + ('nav_venue_bb_lobby_tournament_3_name', 'Competitie Battle Ball 4'), + ('furni_plant_sunflower_desc', 'For happy Habbos'), + ('furni_throne_desc', 'Important Habbos only'), + ('furni_exe_bardesk_name', 'Executive Bar Desk'), + ('furni_tree6_desc', 'The future\'s bright!'), + ('log_problem_title', 'Problems Connecting'), + ('furni_chair_basic*2_name', 'Pink Pura Egg Chair'), + ('game_chess_black', 'Black:'), + ('furni_glass_sofa*9_name', 'Glass sofa'), + ('furni_chair_norja*2_desc', 'Sleek and chic for each cheek'), + ('furni_pillar*3_desc', 'Ancient and stately'), + ('furni_scifidoor*8_desc', 'There out of this world!'), + ('alert_InvalidUserName', 'Don\'t use this character: \\x !'), + ('furni_rare_parasol*3_name', 'Violet Parasol'), + ('furni_bed_budget*5_desc', 'King sized comfort!'), + ('furni_chair_silo*8_name', 'Yellow Dining Chair'), + ('nav_tryingpw', 'Trying the password...'), + ('furni_cn_lamp_desc', 'Light of the East'), + ('furni_prizetrophy3*3_name', 'Globe trophy'), + ('furni_sound_set_16_desc', 'Ferry, ferry good!'), + ('furni_table_plasto_round*4_desc', 'Hip plastic furniture'), + ('poster_2007_desc', 'The legendary founder of the Hotel'), + ('sound_machine_insert', 'Add to mixer'), + ('furni_sound_machine*1_desc', 'Let the party begin!'), + ('furni_bed_polyfon_one*8_desc', 'Yellow Mode Single Bed'), + ('error_room_closed', 'Huone on suljettu.'), + ('pet.hotwords.play_dead', 'play dead'), + ('gs_button_go_finished', 'Scores'), + ('group_member', 'Member'), + ('sound_machine_confirm_save', 'Save the song?'), + ('furni_arabian_wndw_desc', 'Arabian days and nights'), + ('nav_venue_sw_lobby_expert_2_name', 'Snow Marksmen Lobby'), + ('furni_sound_set_57_desc', 'Feel the groove'), + ('furni_triplecandle_desc', 'No need to worry about wax drips'), + ('char_welcome', 'Welcome!'), + ('furni_sound_machine*6_desc', 'Add some effects to your room!'), + ('furni_sofachair_polyfon*3_desc', 'Loft-style comfort'), + ('nav_venue_bb_lobby_amateur_6/0_desc', ''), + ('group_logo_url_template', 'http://www.habbohotel.co.uk/habbo-imaging/badge-fill/%imagerdata%.gif'), + ('furni_table_plasto_bigsquare*2_desc', 'Hip plastic furniture'), + ('furni_glass_table*5_desc', 'Translucent beauty'), + ('url_purse_link', 'http://%predefined%//credits?'), + ('buddyremove_logintime', 'Last Login Time'), + ('NUF_meeting_people_hotelview_tutor', 'The Navigator lets you move between rooms in the Hotel, so open it up to get started!'), + ('furni_sofa_polyfon*6_name', 'Blue Mode Sofa'), + ('furni_scifirocket*1_desc', 'There is always space for this!'), + ('nav_venue_bb_lobby_amateur_10/0_desc', ''), + ('furni_prizetrophy5_name', 'Pokaali'), + ('purse_info_tickets', 'Gaming Tickets'), + ('poster_513_name', 'The Australian flag'), + ('furni_noob_chair*3_desc', 'Lightweight, practical, with red stripes'), + ('alert_old_client', 'You have an old version cached. Please empty your browser cache and login again.'), + ('furni_bar_basic_name', 'A Pura Minibar'), + ('furni_shelves_norja*8_desc', 'For nic naks and art deco books'), + ('sound_machine_save_window', 'Save your Trax'), + ('poster_51_name', 'Basketball Hoop'), + ('Alert_moderator_warning', ''), + ('furni_solarium_norja*5_name', 'Pink Solarium'), + ('furni_sporttrack2*1_desc', 'null'), + ('furni_rubberchair*7_desc', 'Soft and tearproof!'), + ('reg_parentemail_moreinfo', 'More information:'), + ('furni_present_gen5_desc', 'What\'s inside?'), + ('furni_bed_polyfon*9_desc', 'Give yourself space to stretch out'), + ('sound_machine_confirm_save_list_long', 'Are you sure you want to overwrite the current playlist?'), + ('cam_zoom_in.help', 'Zoom In'), + ('furni_carpet_soft*5_name', 'Soft Wool Rug'), + ('furni_plant_small_cactus_name', 'Small Cactus'), + ('console_creatingaprofile', 'Creating A Profile'), + ('console_select_all', 'Select all'), + ('hobba_reply_cfh', 'Reply to:'), + ('notickets_buygame', 'Buy a game'), + ('furni_sporttrack1*3_desc', 'null'), + ('furni_sleepingbag*1_desc', 'Ultimate coziness'), + ('furni_gothic_stool*4_name', 'Black Gothic Stool'), + ('nav_venue_bb_lobby_beginner_4/0_desc', ''), + ('nav_venue_netcafe/0_desc', 'Learn a foreign language and win Habbo Credits in our quests!'), + ('poster_31_desc', 'Pure and unbridled nu-metal'), + ('furni_sound_set_24_desc', 'It\'s all about the Pentiums, baby!'), + ('pet.saying.angry.dog.3', 'dog.1=Oouh..oouh..snuh..ooo'), + ('furni_bed_budget_one*8_desc', 'Prince sized comfort!'), + ('pet.saying.angry.dog.4', 'ARRR Grrr.. woof woof woof'), + ('pet.saying.angry.dog.1', 'Woof! Grrrr..woof woof'), + ('furni_sw_table_desc', ''), + ('pet.saying.angry.dog.2', 'grRRRRrr.r...r'), + ('pet.saying.angry.dog.0', 'Rrrr..woof.. Rrr'), + ('furni_chair_china_name', 'Chinese Lacquer Chair'), + ('furni_romantique_divan*2_desc', 'Recline in continental comfort'), + ('furni_divider_silo1*6_desc', 'Blue Area Corner Shelf'), + ('furni_sound_set_5_name', 'Ambient 4'), + ('roomevent_browser_create', 'Host an event'), + ('furni_noob_rug*6_desc', 'Nice and neat sisal rug with green edging'), + ('transaction_system_bank_luottokunta', 'Luottokortti'), + ('furni_bed_armas_one_name', 'Single Bed'), + ('furni_plant_fruittree_desc', 'Great yield and sweet fruit'), + ('furni_sound_machine_pro_desc', 'creating fancy sounds'), + ('nav_ownrooms_helptext', 'If you didn\'t know, these are your rooms. Here you can modify your rooms or create new ones if you feel like it.'), + ('furni_grunge_radiator_desc', 'Started cool but now it\'s hot!'), + ('furni_divider_silo3*7_desc', 'Green Area Gate'), + ('room_hold', 'Wait a second...\\rLoading room...'), + ('furni_sound_set_49_desc', 'You will belong'), + ('nav_venue_emperors/0_desc', 'Even the smallest of light... shines in the darkness'), + ('furni_nest_name', 'Basket'), + ('furni_noob_table*4_name', 'My first Habbo table'), + ('furni_sound_set_51_desc', 'Bop to the beat'), + ('furni_plant_maze_snow_desc', '20 x Snowy Maze Shrubbery'), + ('NUF_meeting_people_hotelview_icon', 'Click the Navigator button to start visiting the rooms!'), + ('furni_scifirocket*7_desc', 'Larger than life!'), + ('furni_table_plasto_round*9_name', 'Round Dining Table'), + ('furni_val_teddy*5_name', 'Yellow Share Bear'), + ('nav_venue_bb_lobby_expert_2_name', 'Experts Battle Ball 3'), + ('console_onfrontpage', 'Online'), + ('poster_1000_desc', 'The Noble and Silver Show'), + ('furni_rare_icecream*9_name', 'Bubblegum Ice Cream Machine'), + ('furni_rare_fan*0_name', 'Festive Fan'), + ('furni_carpet_polar_name', 'Faux-Fur Bear Rug'), + ('hobba_chatlog', 'See Chat Log >>'), + ('furni_romantique_chair*3_desc', 'null'), + ('hobba_pickedby', 'Picked Up By:'), + ('poster_24_desc', 'Trying to get in or out?'), + ('furni_table_silo_small*2_desc', 'For those random moments'), + ('furni_table_plasto_bigsquare*15_name', 'Occasional Table'), + ('furni_prizetrophy7*2_desc', 'Silver Habbo trophy'), + ('ph_keys_run', 'Run:'), + ('error_title', 'Oops, error!'), + ('furni_rare_dragonlamp*0_name', 'Fire Dragon Lamp'), + ('furni_CFC_50_coin_silver_name', 'Silver Coin (China)'), + ('furni_chair_plasty_name', 'Plastic Pod Chair'), + ('nav_roomInfo', 'Room info'), + ('furni_sound_set_63_name', 'Alhambra Trax 2'), + ('furni_divider_nor2*9_desc', 'Red Iced bar desk'), + ('furni_soft_sofa_norja*8_name', 'Yellow Iced Sofa'), + ('poster_57_desc', 'chinese calligraphy'), + ('furni_table_plasto_4leg*16_name', 'Occasional Table'), + ('accept', 'Accept'), + ('pet.saying.beg.cat.2', 'MEOW, MEOW, MEOW..'), + ('furni_waterbowl*3_desc', 'Aqua unlimited'), + ('furni_divider_poly3*2_name', 'Black Mode Bardesk Gate'), + ('furni_divider_nor3_desc', 'Do go through...'), + ('furni_table_plasto_square*5_desc', 'Hip plastic furniture'), + ('furni_rubberchair*1_desc', 'Soft and stylish HC chair'), + ('furni_divider_nor5*8_name', 'Yellow Iced Angle'), + ('furni_pura_mdl4*3_desc', 'Any way you like it!'), + ('nav_removerights_desc', 'Remove all rights to this room from other users.'), + ('furni_chair_norja*7_name', 'Rural Chair'), + ('furni_pillar*2_name', 'Nordic Pillar'), + ('furni_bed_polyfon*3_name', 'White Double Bed'), + ('furni_glass_chair*3_desc', 'Translucent beauty'), + ('wallitem_xmas_light_name', 'Xmas light'), + ('pet.saying.beg.cat.0', 'MaUUU...MEOW...meow'), + ('pet.saying.beg.cat.1', '*looks up with sad eyes*'), + ('reg_verification_newEmail', 'Your new email address:'), + ('furni_sound_set_29_desc', 'Electronic house'), + ('furni_joulutahti_desc', 'Christmas in a pot'), + ('furni_china_table_name', 'Chinese Lacquer Table'), + ('poster_507_desc', 'The French flag'), + ('NUF_visiting_rooms_hotelview_nav', 'Click the icon to open the Navigator.'), + ('dimmer_preset_1', 'Preset 1'), + ('nav_private_helptext', 'These are the rooms owned by Habbos. Select a category first and then browse some rooms and meet some people!'), + ('furni_queue_tile1*8_desc', 'The power of movement'), + ('dimmer_preset_2', 'Preset 2'), + ('furni_arabian_pllw_name', 'Green Blossom Pillow'), + ('nav_venue_bb_lobby_tournament_7/0_desc', ''), + ('furni_goodie1*1_desc', 'Crunchy Dog Treat'), + ('poster_36_name', 'The Habbo Babes 2'), + ('poll_window', 'Question'), + ('furni_md_limukaappi_desc', 'A sparkling and refreshing pixel drink!'), + ('nav_venue_rooftop_rumble_ii_name', 'Rooftop Rumble II'), + ('furni_wooden_screen*7_name', 'Purple Oriental Screen'), + ('furni_scifidoor*2_name', 'Yellow Spaceship Door'), + ('room_max_pet_limit', 'Too many pets in the room!'), + ('hobba_sent_to_helpers', 'Call re-assigned as emergency and sent to moderators'), + ('furni_table_silo_med*4_desc', 'Beige Area Coffee Table'), + ('furni_romantique_pianochair*5_name', 'Onyx Piano Stool'), + ('nav_modify_roomdescription', 'Room Description'), + ('furni_sound_set_10_name', 'Hip Hop Beats 1'), + ('furni_chair_silo*2_name', 'Black Dining Chair'), + ('furni_marquee*6_name', 'Blue Marquee'), + ('poster_8_name', 'Habbo Colours'), + ('transaction_system_htk_singledrop', 'Landline'), + ('furni_chair_plasty*4_desc', 'Hip plastic furniture'), + ('dimmer_preset_3', 'Preset 3'), + ('furni_exe_corner_desc', 'Tuck it away'), + ('nav_venue_welcome_lounge/0_desc', 'New? Lost? Get a warm welcome here from Habbo eXperts.'), + ('furni_sleepingbag*6_desc', 'Ultimate coziness'), + ('nav_venue_cunning_fox_gamehall/3_name', 'Batleships'), + ('console_mainhelp', 'Habbo Console Help'), + ('tickets_button_info_hide', 'Hide Ticket Info'), + ('furni_xmas_icelamp_name', 'Lantern Bundle 2'), + ('nav_venue_bb_lobby_amateur_0/0_desc', ''), + ('purse_header', 'Habbo Purse'), + ('furni_noob_lamp*3_name', 'My first Habbo lamp'), + ('nav_help_title', 'Want a room of your own?'), + ('buy', 'Buy'), + ('furni_pura_mdl1*8_name', 'yellow pura module 1'), + ('dimmer_title', 'Mood Light'), + ('NUF_mini_meet_people_hotelview_icon', 'Click the Navigator button to start visiting the rooms!'), + ('console_credits', 'Credits'), + ('bb_link_highScores_url', 'http://%predefined%/groups/56552/id'), + ('wallitem_md_logo_wall_desc', 'Bubble up your wall'), + ('furni_safe_silo*4_desc', 'Totally shatter-proof!'), + ('room_unignore', 'Listen'), + ('nav_venue_sw_lobby_amateur_1/0_desc', ''), + ('poster_16_name', 'Bars'), + ('furni_sofachair_silo*7_name', 'Green Area Armchair'), + ('furni_spyro_name', 'Dragon Egg'), + ('nav_venue_bb_lobby_beginner_19/0_desc', ''), + ('Alert_YourPasswordIsTooShort', 'Passwords must be at least 6 characters long.'), + ('room_cant_trade', 'You cannot trade this!'), + ('furni_door_desc', 'Dr Who?'), + ('gs_button_go_created', 'Join'), + ('poster_49_name', 'Large silver star'), + ('furni_glass_sofa*4_name', 'Glass sofa'), + ('furni_divider_arm3_desc', 'Knock, knock...'), + ('furni_sound_set_31_desc', 'House loops'), + ('reg_habboname', 'Habbo name:'), + ('habboclub_thanks', 'Yippee! You are now a member of Habbo Club! Your current email address is %email%. \\r\\rIf that\'s not the one you are using, please go to \'Update my Habbo ID\' and change it now. \\rThen we can contact you about your membership if need be.'), + ('console_follow_offline', 'Your friend is offline.'), + ('furni_divider_nor1*5_name', 'Pink Ice corner'), + ('nav_openbutton', 'Open'), + ('nav_venue_theatredrome_habbowood/0_desc', 'Home to the Habbowood Gala and HAFTA Awards!'), + ('nav_venue_ice_cafe/0_desc', 'Come here. And chill out.'), + ('furni_calippo_name', 'Calippo icecream machine'), + ('furni_bench_lego_desc', 'For your reserve players'), + ('poster_9_desc', 'Do your bit for the environment'), + ('furni_bed_polyfon_one*3_desc', 'Cot of the artistic'), + ('poster_44_desc', 'Beware the curse...'), + ('poster_2006_name', 'DJ Throne'), + ('furni_pura_mdl3*5_desc', ''), + ('furni_arabian_tray4_name', 'Fruit Tray'), + ('furni_divider_nor3*7_desc', 'Entrance or exit?'), + ('furni_sound_set_30_name', 'Instrumental 1'), + ('furni_romantique_tray1_name', 'Breakfast Tray'), + ('furni_jp_tray1_desc', 'jp_tray1'), + ('furni_plant_maze_desc', 'Build your maze!'), + ('console_getfriendrequest_2', 'If you accept this invitation (s)he will be added to your Friends List. Then you can send messages to each other.'), + ('furni_hockey_light_name', 'Lert'), + ('furni_goodie1_desc', 'Crunchy Dog Treat'), + ('console_getfriendrequest_1', 'has asked you to become his/her Friend.'), + ('furni_pura_mdl2*1_desc', 'Any way you like it!'), + ('score_board.text', 'POINTS'), + ('furni_one_way_door*9_name', 'Red One Way Gate'), + ('furni_sand_cstl_twr_desc', 'sand_cstl_twr desc'), + ('furni_divider_nor5*9_desc', 'Cool cornering for your crib y0!'), + ('furni_duck_desc', 'Every bather needs one'), + ('furni_bardesk_polyfon*2_desc', 'Black Mode Bardesk'), + ('console_request_2', '(S)he will be added into your Friends List if (s)he accepts it.'), + ('bb_link_join', 'Join Team'), + ('nav_createroom_hd', 'Here you can create your own room!'), + ('console_request_1', 'has been sent your Friend Request.'), + ('reg_check_info', 'CHECK YOUR INFO'), + ('furni_toy1*4_name', 'Rubber Ball'), + ('nav_venue_sw_lobby_free_0_name', 'Free Game Lobby'), + ('furni_chair_plasto*1_name', 'Chair'), + ('furni_toilet_name', 'Loo Seat'), + ('queue_set.dc.info', 'Number of Habbos in default queue is %d% and in Habbo Club queue %c%'), + ('furni_sofachair_silo*2_desc', 'Large, but worth it'), + ('furni_chair_plasto*12_desc', 'Hip plastic furniture'), + ('ph_tickets_buyfor', 'Buy Tickets for:'), + ('sound_machine_confirm_close', 'Close the editor?'), + ('furni_rare_fan*1_desc', 'It\'ll blow you away!'), + ('furni_divider_poly3*3_desc', 'Border control!'), + ('nav_venue_kattoterassi/0_desc', 'When push comes to shove...'), + ('furni_summer_grill*4_desc', 'Plenty of burgers on that barbie'), + ('furni_bar_armas_desc', 'It\'s a barrel of laughs and a great talking point'), + ('furni_toilet_red_name', 'Loo Seat'), + ('furni_hc_lmp_desc', 'Be enlightened'), + ('furni_romantique_mirrortabl_name', 'Dressing Table'), + ('furni_pura_mdl4*2_name', 'Pink Pura Module 4'), + ('summer_chair_5_desc', 'Enjoy the summer air'), + ('furni_plant_rose_desc', 'Sleek and chic'), + ('furni_skullcandle_name', 'Skull Candle Holder'), + ('Alert_no_credits', 'You don�t have enough Credits for this.'), + ('pet.hotwords.voice', 'speak'), + ('furni_prizetrophy4*2_desc', 'Shiny silver'), + ('furni_soft_sofachair_norja*4_name', 'Urban Iced Sofachair'), + ('furni_pura_mdl5*1_desc', 'Any way you like it!'), + ('furni_safe_silo*9_name', 'Red Safe Minibar'), + ('furni_bed_trad_desc', 'Sweet dreams for two'), + ('nav_venue_club_massiva_desc', 'Strut your funky stuff!'), + ('furni_rare_dragonlamp*1_desc', 'Out of the deep blue!'), + ('furni_wooden_screen*2_desc', 'Add an exotic touch to your room'), + ('furni_prizetrophy7*1_name', 'Gold Habbo trophy'), + ('furni_carpet_standard*2_name', 'Floor Rug'), + ('furni_arabian_teamk_desc', 'Quench that desert thirst'), + ('furni_romantique_chair*2_name', 'Lime Romantique Chair'), + ('nav_venue_sw_lobby_tournament_0_name', 'Tournament Lobby'), + ('invitation_expired', 'Sorry, all Welcoming Party members were busy.'), + ('gs_error_game_checkname', 'Please check the Game\'s name!'), + ('furni_sound_set_23_name', 'SFX 4'), + ('furni_grand_piano*2_desc', 'Black Grand Piano'), + ('tutorial_quit', 'Close guide'), + ('furni_chair_basic*8_desc', ''), + ('NUF_getting_room_roommatic_security_tutor', 'Finally you can choose the security settings to your room and whether other users can move your furniture.'), + ('nav_venue_bb_lobby_beginner_1/0_desc', ''), + ('nav_private_helptext_hd_main', 'Habbo Guest Rooms'), + ('club_price', 'One month costs 25 Habbo Credits.'), + ('NUF_playing_games_navigator_tutor', 'Click either SnowStorm or BattleBall to open up a list of the game lounges.'), + ('nav_venue_old_skool_name', 'Old Skool Habbo'), + ('nav_venue_bb_lobby_beginner_4_name', 'Beginners Battle Ball 5'), + ('nav_venue_bb_lobby_tournament_9_name', 'Competitie Battle Ball 10'), + ('sound_machine_alert_song_saved', 'Song "%name%" successfully saved.'), + ('nav_venue_sw_lobby_intermediate_3_name', 'Snow Bombardiers Lobby'), + ('nav_venue_club_massiva/1_desc', 'Strut your funky stuff'), + ('furni_gothic_chair*1_name', 'Gothic Chair Pink'), + ('furni_divider_poly3_desc', 'All bars should have one'), + ('furni_romantique_divan*1_name', 'Pink Romantique Divan'), + ('NUF_playing_games_hotelview_tutor', 'Now we find out where to locate the Habbo Games!'), + ('poster_29_name', 'Gold Tinsel Bundle'), + ('furni_present_gen4_name', 'Gift'), + ('furni_bardesk_polyfon*7_name', 'Green Mode Bardesk'), + ('furni_gothic_sofa*6_name', 'Gothic Sofa Blue'), + ('furni_glass_stool*5_name', 'Glass stool'), + ('nav_venue_sw_lobby_free_5/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('nav_fav_hd', 'Your Favourite Rooms.'), + ('NUF_console_read_tutor', 'The Habbo Console lets you message your Habbo friends, and check whether they are online.'), + ('furni_romantique_tray2_desc', 'Spoil Yourself'), + ('Alert_ModeratorWarning', 'Message from a Moderator:'), + ('furni_giftflowers_name', 'Vase of Flowers'), + ('furni_table_silo_small*7_name', 'Green Area Occasional Table'), + ('furni_menorah_name', 'Menorah'), + ('furni_bed_polyfon_one*2_name', 'Black Mode Single Bed'), + ('console_offline', 'Offline'), + ('gs_mouseover_player', '\\x\\r\\yp'), + ('nav_venue_bb_lobby_amateur_3/0_desc', ''), + ('nav_venue_bb_lobby_amateur_13/0_desc', ''), + ('furni_noob_chair*2_name', 'My first Habbo chair'), + ('furni_doormat_plain*1_desc', 'Available in a variety of colours'), + ('object_displayer_hide_tags', 'Hide tags'), + ('poster_17_desc', 'Beautiful reproduction butterfly'), + ('gs_joinedplayers', 'Players Who Joined: \\x'), + ('furni_table_plasto_round*3_name', 'Round Dining Table'), + ('furni_divider_poly3*8_name', 'Yellow Mode Bardesk Gate'), + ('furni_glass_table*4_name', 'Glass table'), + ('furni_solarium_norja*6_desc', 'Rejuvenate your pixels!'), + ('poster_1006_desc', 'The eyes follow you...'), + ('furni_noob_rug*5_name', 'My first Habbo rug'), + ('buddyremove_pagecounter', 'Page'), + ('poll_alert_answer_missing', 'Please give an answer'), + ('furni_summer_chair*5_desc', 'Beige'), + ('furni_table_plasto_4leg*10_name', 'Occasional Table'), + ('furni_divider_silo2_desc', 'Stylish sectioning'), + ('furni_djesko_turntable_desc', 'For the music-lovers'), + ('nav_remrightsconf', 'You are about to remove all rights from your room. This means that only you will have rights to move and place furni in the room.'), + ('furni_pillow*0_name', 'White Lace Pillow'), + ('sound_machine_eject', 'Eject'), + ('gs_button_ready', 'Ready'), + ('furni_divider_silo1*5_name', 'Pink Area Corner Shelf'), + ('NUF_habbo_home_hotelview_tutor', 'You have now opened a page on the Habbo Website that will give you plenty of information about how to make yourself a Habbo Home.'), + ('furni_traffic_light*4_desc', 'Chill and wait your turn!'), + ('nav_venue_$unit.name$/0_desc', 'Roam more of the hotel\'s corridors'), + ('furni_sporttrack1*2_name', 'Sport track straight asphalt'), + ('furni_sofachair_polyfon_girl_name', 'Armchair'), + ('furni_sound_set_6_desc', 'Background ambience loops'), + ('furni_hal_grave_desc', 'We\'re raising the dead!'), + ('recycler_ready_info', 'Your recycled Furniture is ready. Please either accept or cancel. If you accept, you will receive your recycling reward, detailed below. If you cancel, all your old Furniture will be restored to your hand.'), + ('wallitem_jp_sheet1_name', 'jp_sheet1'), + ('furni_petfood2_name', 'Sardines Mega Multipack'), + ('furni_spotlight_name', 'Habbowood Spotlight'), + ('furni_carpet_soft*6_desc', 'Soft Wool Rug'), + ('gs_lounge_skill', 'Level in this Lounge: \\x \\r (\\y-\\z points)'), + ('nav_help_text', 'Click the Public Spaces tab on the top left of this navigator to find gaming rooms!'), + ('furni_table_plasto_4leg*5_name', 'Occasional Table'), + ('nav_venue_bb_arena_1_name', 'Battle Ball Aloittelijat'), + ('furni_table_silo_med*9_name', 'Red Area Coffee Table'), + ('furni_bed_budget_one*2_name', 'Pink Pura Bed'), + ('nav_venue_sw_lobby_expert_2/0_desc', 'Todellisille lumisotureille.'), + ('furni_rubberchair*6_name', 'Violet Inflatable Chair'), + ('furni_bardeskcorner_polyfon*5_name', 'Candy Corner'), + ('bb_powerup_8', 'Vacuum cleaner'), + ('bb_powerup_6', 'Harlequin'), + ('furni_rare_beehive_bulb*2_name', 'Yellow Amber Lamp'), + ('bb_powerup_7', 'Bomb'), + ('furni_divider_nor2_name', 'Ice Bar-Desk'), + ('bb_powerup_4', 'Cannon'), + ('bb_powerup_5', 'Box of pins'), + ('bb_powerup_2', 'Spring'), + ('bb_powerup_3', 'Flashlight'), + ('console_report', 'Report'), + ('bb_powerup_1', 'Light bulb'), + ('furni_sound_set_43_name', 'SFX 1'), + ('poster_37_desc', 'The Hotels girlband. Dream on!'), + ('interface_icon_messenger', 'Messenger, friends & messages on here'), + ('interface_icon_hand', 'Hand, your inventory'), + ('furni_s_sound_machine*4_name', 'Sound Machine Blue'), + ('nav_venue_sunset_cafe_name', 'Sunset Cafe'), + ('wallitem_sw_stone_desc', 'sw_stone'), + ('reg_check_mail', 'Email'), + ('furni_queue_tile1*7_name', 'Purple Habbo Roller'), + ('pet.hotwords.nest', 'sleep'), + ('furni_sound_machine_desc', 'Creating fancy sounds'), + ('cancel', 'Cancel'), + ('furni_hyacinth2_desc', 'Beautiful bulb'), + ('nav_venue_library/0_name', 'Habbo Library'), + ('furni_waterbowl*1_desc', 'Aqua unlimited'), + ('furni_grand_piano*5_desc', 'Why is that key green?'), + ('furni_table_plasto_bigsquare*8_name', 'Square Dining Table'), + ('furni_nouvelle_trax_name', 'nouvelle_trax'), + ('help_choise_header', 'What do you need help with?'), + ('furni_bardeskcorner_polyfon*7_name', 'Green Mode Bardesk Corner'), + ('furni_pillar*4_name', 'Dark Ages Pillar'), + ('furni_queue_tile1*6_desc', 'The power of movement'), + ('club_intro_link', 'Learn more about Habbo Club!'), + ('furni_sandrug_desc', 'Your own paradise island'), + ('poster_10_desc', 'Beautiful sunset'), + ('furni_divider_nor1_name', 'Ice Corner'), + ('nav_venue_bb_lobby_tournament_6_name', 'Competitie Battle Ball 7'), + ('furni_redhologram_desc', 'You\'re her only hope...'), + ('poster_38_name', 'Smiling Headbangerz'), + ('furni_hc_crtn_name', 'Antique Drapery'), + ('furni_barchair_silo*9_name', 'Red Bar Stool'), + ('room_badge_visible', 'Visible'), + ('furni_sleepingbag*8_name', 'Golden Sleeping Bag'), + ('roomevent_invalid_input', 'You must give your event a name and a description.'), + ('furni_chair_plasto*14_name', 'HC chair'), + ('poster_522_desc', 'The flag of Japan'), + ('furni_shelves_norja*2_name', 'Black Bookcase'), + ('nav_venue_dusty_lounge_name', 'Dusty Lounge'), + ('furni_sound_set_53_desc', 'Break the icy silence'), + ('nav_venue_ice_cafe_name', 'Ice Cafe'), + ('click', 'OK to continue to the hotel.'), + ('nav_venue_sw_lobby_free_2/0_desc', ''), + ('furni_rare_dragonlamp*9_name', 'Purple Dragon Lamp'), + ('furni_statue_desc', 'Watch out for those arrows!'), + ('game_battles_turn', 'TURN'), + ('wallitem_jp_sheet3_desc', 'jp_sheet3'), + ('furni_edicehc_desc', 'Click and roll!'), + ('furni_bed_budget*6_name', 'Blue Pura Double Bed'), + ('furni_gothic_sofa*5_desc', 'The dark side of Habbo'), + ('furni_scifirocket*5_desc', 'From the unknown depths of space'), + ('game_poker_ready', 'READY'), + ('furni_queue_tile1*2_name', 'Red Habbo Roller'), + ('furni_rare_parasol_desc', 'Zon! Zon! Zon!'), + ('transaction_system_sms_dna', 'DNA'), + ('furni_bar_polyfon_name', 'Mini-Bar'), + ('furni_grand_piano*1_name', 'Turquoise Grand Piano'), + ('nav_venue_bb_lobby_expert_4_name', 'Experts Battle Ball 5'), + ('bb_link_highscores', 'Highscores'), + ('summer_chair_8_desc', 'The summer winds are creeping in'), + ('reg_parentemail_title2', 'Email address of parent/guardian:'), + ('error_report_explain', 'An error has occurred, please see the error code above.'), + ('console_noprofile', 'Habbo Profile Not Found'), + ('furni_glass_sofa*3_desc', 'Translucent beauty'), + ('furni_romantique_smalltabl*4_desc', 'Why is one leg different?'), + ('furni_table_plasto_4leg*14_name', 'HC table'), + ('nav_venue_bb_lobby_intermediate_2_name', 'Semi-profs Battle Ball 3'), + ('NUF_playing_games_gamerooms_tutor', 'Click the \'Go\' button to go to the Game Lounge.'), + ('habboclub_require_parent_permission', 'You need to tick the box to say that you are over 14 years or age, \\ror under 14 and have your parent/guardian\'s permission to join Habbo Club. \\rPlease go back and tick the box.'), + ('furni_wooden_screen*1_desc', 'Add an exotic touch to your room'), + ('nav_venue_bb_lobby_intermediate_4/0_desc', ''), + ('furni_glass_sofa*6_name', 'Blue Glass Sofa'), + ('furni_bench_armas_desc', 'To complete the dining set'), + ('furni_barchair_silo*2_name', 'Black Bar Stool'), + ('nav_venue_bb_lobby_expert_6/0_desc', ''), + ('furni_jp_tray2_desc', 'jp_tray2'), + ('furni_val_teddy*3_desc', 'The green bear of friendship'), + ('transaction_system_sms_win_vodafone', 'Vodafone SMS'), + ('furni_glass_sofa_name', 'Glass sofa'), + ('console_online', 'online:'), + ('poster_2004_desc', 'irie!'), + ('x', 'X'), + ('nav_venue_habbo_lido/0_desc', 'Pool is open for swimming and diving!'), + ('furni_soft_sofachair_norja_name', 'iced sofachair'), + ('furni_xmas_cstl_twr_name', 'Ice Castle Tower'), + ('nav_venue_park_name', 'Habbo Gardens'), + ('recycler_info_open', 'Ecotron is the place to visit if you want to recycle your old Furniture. Simply drag the old Furni from your hand to the empty slots below. Recyclable items display the green recyclable tag in your hand. Please note that you must own the Furniture for at least %quarantine_hours% hour before they can be recycled. Recycling takes a total of %total_hours% hours.'), + ('group_window_title', 'Habbo Groups'), + ('pet.saying.eat.dog.4', 'Mmmmm..'), + ('game_chess', 'Chess'), + ('pet.saying.eat.dog.2', 'slurp, slurp, slurp'), + ('roomatic_roomdesc', 'Room description:'), + ('furni_sofa_polyfon*7_desc', 'Green Mode Sofa'), + ('pet.saying.eat.dog.3', 'hrum, umm, umm grrr'), + ('pet.saying.eat.dog.0', 'hrum, hrum, crunch!'), + ('preview_downloading', 'Preview downloading...'), + ('sound_machine_confirm_close_long', 'Are you sure you want to leave the editor without saving the song?'), + ('partner_registration_title', 'Hey, I forgot to mention one thing..'), + ('pet.saying.eat.dog.1', 'crunch, crunch mmmm'), + ('nav_venue_bb_lobby_tournament_12/0_desc', ''), + ('furni_carpet_soft*3_name', 'Soft Wool Rug'), + ('furni_sound_set_56_name', 'RnB Grooves 2'), + ('reg_termslink', 'Terms and Conditions'), + ('wallitem_sw_swords_desc', 'Z for Zorro'), + ('furni_sleepingbag*10_name', 'Khaki Sleeping Bag'), + ('furni_hc_dsk_name', 'Study Desk'), + ('furni_chair_silo*8_desc', 'Keep it simple'), + ('furni_glass_chair*8_name', 'Glass chair'), + ('nav_venue_cafe_ole_name', 'Cafe ole'), + ('furni_sleepingbag*5_desc', 'Ultimate coziness'), + ('opening_hours_text_closed', 'The Hotel has been closed and will be open to the public again at %h%:%m%.'), + ('furni_grunge_bench_desc', 'Laid back seating'), + ('BuddyNotHere', 'Offline'), + ('furni_noob_lamp*5_desc', 'Get the light right where you want it (pink)'), + ('NUH_navigator', 'Use the Navigator to move around. There are literally thousands of rooms to explore!'), + ('poster_1338_name', 'Pedobear Seal of Approval'), + ('furni_queue_tile1*9_name', 'Green Habbo Roller'), + ('furni_habboween_crypt_desc', 'What lurks inside?'), + ('furni_sofachair_silo*9_name', 'Red Area Armchair'), + ('furni_exe_chair_name', 'Executive Sofa Chair'), + ('furni_rare_dragonlamp*6_desc', 'Scary and scorching!'), + ('furni_divider_nor2*3_desc', 'Strong, yet soft looking'), + ('furni_tile_yell_name', 'Floor Tiles'), + ('furni_plant_yukka_name', 'Yukka Plant'), + ('furni_wooden_screen*8_desc', 'Add an exotic touch to your room'), + ('furni_pillar*8_desc', 'All roads lead to Rome'), + ('trading_youoffer', 'You offer:'), + ('furni_marquee*8_desc', 'It\'s both door and a shade!'), + ('furni_pura_mdl4*9_name', 'Red Pura Module 4'), + ('roomatic_congrats', 'Congratulations! You\'re now the proud owner of your own Habbo Hotel room.'), + ('furni_tile_marble_name', 'Marble Tile'), + ('furni_bed_budget*3_desc', 'King sized comfort!'), + ('furni_sound_machine*3_desc', 'Top the Habbo Charts!'), + ('nav_venue_bb_lobby_beginner_10_name', 'Beginners Battle Ball 11'), + ('nav_venue_bb_lobby_tournament_1/0_desc', ''), + ('poster_2000_name', 'Suomen kartta'), + ('furni_solarium_norja*3_name', 'Urban Solarium'), + ('furni_present_gen3_desc', 'What\'s inside?'), + ('furni_glass_stool*4_desc', 'Translucent beauty'), + ('int_update_id', 'Update My Habbo ID >>'), + ('nav_venue_bb_lobby_beginner_8/0_desc', ''), + ('furni_carpet_standard*8_desc', 'Available in a variety of colours'), + ('furni_pillar*1_desc', 'Ancient and stately'), + ('receive_invitation_text', 'invites you his/her room. Accept invitation?'), + ('poll_offer_window', 'Welcome to our poll'), + ('furni_table_plasto_bigsquare*5_desc', 'Hip plastic furniture'), + ('furni_carpet_standard*1_desc', 'Available in a variety of colours'), + ('furni_hologram_name', 'Holopod'), + ('nav_venue_bb_lobby_amateur_desc', 'Amateur battle ball!'), + ('furni_barchair_silo*6_desc', 'Practical and convenient'), + ('furni_divider_nor5_desc', 'Cool cornering for your crib y0!'), + ('purse_vouchers_helpbutton', 'More about vouchers >>'), + ('furni_shelves_norja*6_desc', 'For nic naks and art deco books'), + ('nav_venue_sw_lobby_tournament_5/0_desc', ''), + ('furni_chair_basic*4_desc', 'It\'s a cracking design!'), + ('nav_hidefull', 'Hide Full Rooms'), + ('modtool_ban_computer', 'Ban Computer Also'), + ('furni_gothic_sofa*1_name', 'Gothic Sofa Pink'), + ('furni_carpet_standard*b_name', 'Floor Rug'), + ('queue_line', 'You are queueing right now...'), + ('furni_divider_nor1*6_desc', 'Blue Ice corner'), + ('nav_search_helptext', 'Looking for something? Here you can search other Habbo\'s rooms. Type the room name or the name of the Habbo to search for a room.'), + ('furni_marquee*1_desc', 'It\'s both door and a shade!'), + ('furni_rcandleset_desc', 'Simple but stylish'), + ('nav_room_banned', 'You are banned from this room.'), + ('furni_lamp_armas_name', 'Table Lamp'), + ('catalog_costs', '\\x1 costs \\x2 Credits'), + ('furni_drinks_desc', 'Are you a slob too?'), + ('furni_pura_mdl5*6_name', 'Blue Pura Module 5'), + ('summer_chair_1_desc', 'Gotta get up early to get one!'), + ('furni_prize3_desc', 'A weighty award'), + ('furni_soft_sofa_norja*7_name', 'Rural Iced Sofa'), + ('poster_518_name', 'The Welsh flag'), + ('furni_sofachair_polyfon*8_name', 'Yellow Mode Armchair'), + ('furni_prizetrophy3*3_desc', 'Breathtaking bronze'), + ('nav_venue_sw_lobby_amateur_6_name', 'Snow Slingers Lobby'), + ('furni_stand_polyfon_z_desc', 'Tidy up'), + ('furni_carpet_soft_tut_name', 'Welcome Mat'), + ('console_reject_all', 'Reject All'), + ('month12', 'December'), + ('month11', 'November'), + ('help_topics', 'Help Topics:'), + ('nav_venue_sw_lobby_beginner_8/0_desc', ''), + ('nav_rooms_own', 'Own Room(s)'), + ('reg_pwd_note', 'Choose a password that\'s hard to guess! So, don\'t use ANYONES name, or your favorite colour!'), + ('furni_wooden_screen*4_name', 'Golden Oriental Screen'), + ('nav_venue_sw_lobby_beginner_2/0_desc', ''), + ('furni_pillow*6_desc', 'Puffy, soft and huge'), + ('furni_bed_polyfon_one*4_desc', 'Beige Mode Single Bed'), + ('reg_email_note', 'Please enter your e-mail address, this is important! You\'ll only get customer support and special offers via email, if you enter a valid email address and verify it.'), + ('group_admin', 'Administrator'), + ('furni_scifirocket*8_name', 'Pluto Smoke Machine'), + ('furni_chair_plasto*11_desc', 'Hip plastic furniture'), + ('month10', 'October'), + ('furni_goth_table_name', 'Gothic table'), + ('month05', 'May'), + ('month04', 'April'), + ('nav_modify_maxvisitors', 'Choose maximum number of visitors'), + ('nav_venue_bb_lobby_amateur_2_name', 'Gevorderden Battle Ball 3'), + ('month07', 'July'), + ('habboclub_price1', '30'), + ('month06', 'June'), + ('month01', 'January'), + ('month03', 'March'), + ('month02', 'February'), + ('furni_summer_chair*2_desc', 'Pink'), + ('month09', 'September'), + ('month08', 'August'), + ('furni_bardeskcorner_polyfon*4_desc', 'Beige Mode Bardesk Corner'), + ('furni_tree6_name', 'Flashy Christmas Tree'), + ('furni_arabian_snake_name', 'Ornamental Urn'), + ('reg_verification_incorrectPassword', 'Your password was incorrect'), + ('NUF_visting_rooms_hotelview_tutor', 'Here we go again. This time we are learning how to visit another Habbos room.'), + ('furni_summer_chair*9_desc', 'Got your sunglasses?'), + ('furni_safe_silo_name', 'Safe Minibar'), + ('furni_throne_name', 'Throne'), + ('furni_soft_sofachair_norja*8_desc', 'Yellow Iced Sofachair'), + ('NUF_console_ready_tutor', 'You can now use the Console to find some of your friends, or you can continue the tutorial.'), + ('nav_venue_picnic/0_desc', 'Don\'t forget to grab a carrot or two!'), + ('furni_bardeskcorner_polyfon_name', 'Corner Cabinet/Desk'), + ('game_placeship', 'Place your ships:'), + ('furni_glass_table*7_desc', 'Habbo Club'), + ('poster_13_name', 'BW Skyline Poster'), + ('furni_jp_bamboo_name', 'Bamboo Forest'), + ('furni_plant_bulrush_name', 'Bulrush'), + ('furni_deadduck3_desc', 'With added ectoplasm'), + ('win_purse', 'Habbo Purse'), + ('furni_jp_tray5_name', 'jp_tray5'), + ('furni_hc_tbl_desc', 'Perfect for banquets'), + ('furni_shelves_norja_desc', 'For nic naks and art deco books'), + ('club_desc_3_period', '6 Months (186 days) = 105 Credits'), + ('furni_bed_budget_one*3_name', 'Black Pura Bed'), + ('poster_2_name', 'Carrot Plaque'), + ('furni_solarium_norja*7_desc', 'Fun in the sun!'), + ('poster_2007_name', 'The Father Of Habbo'), + ('gs_header_teams', 'Teams'), + ('furni_divider_poly3*9_desc', 'Border Control!'), + ('gs_button_creategame', 'Create A New Game'), + ('furni_sound_set_42_name', 'Haunted Mansion'), + ('poll_alert_invalid_selection', 'Please select fewer alternatives'), + ('furni_scifirocket*1_name', 'Saturn Smoke Machine'), + ('furni_scifidoor*10_name', 'Violet Spaceship Door'), + ('furni_sound_set_5_desc', 'The dark side of Habbo'), + ('club_confirm_gift_title', 'You have received a Habbo club gift!'), + ('bb_info_gamePrice', 'Play now for just 2 tickets.'), + ('furni_sound_machine*6_name', 'Purple Traxmachine'), + ('wallitem_arabian_swords_desc', 'Not for yielding'), + ('furni_divider_nor2*6_name', 'Blue Iced bar desk'), + ('nav_venue_sw_lobby_expert_0/0_desc', ''), + ('furni_noob_chair*1_name', 'My first Habbo chair'), + ('group_room_link', 'Group\'s room: %room_name% >>>'), + ('sound_machine_playlist', 'Playlist'), + ('nav_venue_bb_arena_2_name', 'Battle Ball Amatöörit'), + ('roomatic_create_error', 'Error in room creation process. Please try again!'), + ('furni_couch_norja*7_desc', 'Two can perch comfortably'), + ('gs_button_spectate', 'Watch Game!'), + ('furni_sofachair_silo*6_desc', 'Blue Area Armchair'), + ('credit_redeem_button', 'Redeem'), + ('furni_valentinescreen_desc', 'Peep through and smile!'), + ('poster_511_name', 'The Dutch flag'), + ('furni_shelves_armas_name', 'Bookcase'), + ('nav_venue_habbo_lido_name', 'Habbo Lido'), + ('furni_bed_polyfon*9_name', 'Red Double Bed'), + ('furni_sofa_silo*9_name', 'Red Area Sofa'), + ('furni_pura_mdl4*6_desc', 'Any way you like it!'), + ('console_mainhelptext', 'You can use the Habbo Console to keep in constant contact with your friends using instant messages.'), + ('wallitem_jp_ninjastars_name', 'Ninja Stars'), + ('ad_note', 'Clicking this advertisement will open a new window'), + ('ph_tickets_choise2', 'Buy 20 Tickets for 6 Credits.'), + ('ph_tickets_choise1', 'Buy 2 Tickets for 1 Credit.'), + ('reg_day', 'Day'), + ('nav_venue_cunning_fox_gamehall/2_name', 'Noughts&Crosses'), + ('nav_venue_sw_lobby_tournament_6_name', 'Tournament Lobby'), + ('furni_noob_lamp*1_name', 'My first Habbo lamp'), + ('furni_petfood1_name', 'Bones Mega Multipack'), + ('furni_table_silo_med*3_name', 'White Coffee Table'), + ('pet.hotwords.jump', 'jump'), + ('furni_sleepingbag*1_name', 'Red Sleeping Bag'), + ('nav_venue_main_lobby/0_desc', 'The heart of Habbo Hotel'), + ('pet_hungry', 'Hunger:'), + ('furni_rare_fan*4_name', 'SUPERLOVE Fan'), + ('furni_sw_table_name', 'sw_table'), + ('furni_CFC_200_moneybag_name', 'Sack of Credits (China)'), + ('room_ask_friend', 'Ask to be a Friend'), + ('furni_bed_polyfon*2_name', 'Black Mode Double Bed'), + ('furni_table_norja_med_desc', 'Elegance embodied'), + ('nav_removerights', 'Reset'), + ('wallitem_hrella_poster_1_name', 'Porthole'), + ('NUF_getting_items_purse_', 'Click this link to open the Habbo Credits page in the website window.'), + ('poster_31_name', 'System of a Ban'), + ('furni_sound_set_24_name', 'Habbo Sounds 4'), + ('furni_chair_basic*7_name', 'chair_basic'), + ('poster_56_name', 'Disco Sign'), + ('furni_rare_dragonlamp*2_name', 'Jade Dragon Lamp'), + ('furni_gothic_stool*4_desc', 'Witches and Warlocks'), + ('furni_sofa_silo*2_name', 'Black Two-Seater Sofa'), + ('furni_grunge_radiator_name', 'Radiator'), + ('nav_venue_bb_lobby_amateur_9_name', 'Gevorderden Battle Ball 10'), + ('summer_chair_4_name', 'White Deck Chair'), + ('furni_sound_set_49_name', 'Club 4'), + ('messenger.email.subject', ''), + ('furni_romantique_chair*3_name', 'Turquoise Romantique Chair'), + ('furni_s_sound_machine*7_desc', 'Sound Machine Red'), + ('furni_table_plasto_round*9_desc', 'Hip plastic furniture'), + ('furni_table_plasto_4leg*7_name', 'Occasional table'), + ('club_confirm_title', 'You are about to subscribe to Habbo Club. Wise choice!'), + ('furni_romantique_pianochair*1_desc', 'Here sat the legend of 1900'), + ('furni_sofa_silo*6_desc', 'Blue Area Sofa'), + ('nav_venue_bb_lobby_tournament_11_name', 'Competitie Battle Ball 12'), + ('furni_rare_icecream*9_desc', 'Virtual bubblegum rocks!'), + ('furni_romantique_divider*1_name', 'Rose Quartz Screen'), + ('NUF_playing_games_room_ruleslink', 'Click me! But only if you want to read the game FAQs in the website.'), + ('furni_chair_silo_name', 'Dining Chair'), + ('furni_sound_set_17_desc', 'Jive\'s Alive!'), + ('dance_choose', 'Choose Dance'), + ('wallitem_industrialfan_name', 'Industrial Turbine'), + ('sound_machine_alert_invalid_song_length', 'Can\'t burn an empty song!'), + ('furni_pura_mdl1*4_desc', 'Any way you like it!'), + ('wallitem_post.it.vd_desc', 'Heart Stickies'), + ('catalog_give_petname', 'Type your pet\'s name in the grey box.'), + ('furni_pura_mdl2*1_name', 'Aqua Pura Module 2'), + ('poster_24_name', 'Hole In The Wall'), + ('win_error', 'Notice!'), + ('furni_chair_plasto*2_desc', 'Hip plastic furniture'), + ('wallitem_xmas_light_desc', 'Xmas light'), + ('furni_rubberchair*1_name', 'Blue Inflatable Chair'), + ('NUF_getting_room_roommatic_details_tutor', 'Give a name to your room, choose a category and add a description. Don\'t worry, you can change it all later.'), + ('furni_divider_poly3*2_desc', 'Black Mode Bardesk Gate'), + ('furni_plant_valentinerose*2_desc', 'Your secret love'), + ('furni_table_norja_med*7_desc', 'For larger gatherings'), + ('furni_carpet_polar_desc', 'For cuddling up on'), + ('nav_venue_sw_lobby_free_8/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('furni_summer_grill*1_name', 'Blue Barbeque Grill'), + ('furni_chair_norja*7_desc', 'Sleek and chic for each cheek'), + ('furni_joulutahti_name', 'Poinsetta'), + ('furni_exe_table_name', 'Executive Desk'), + ('furni_divider_silo3*8_desc', 'Form following function'), + ('furni_gothiccandelabra_name', 'Gothic Candelabra'), + ('transaction_system_bibit', 'Credit card'), + ('nav_venue_tv_studio/0_desc', 'Sponsored by Bobbanet.com'), + ('furni_noob_table*4_desc', 'Lightweight, practical and light blue'), + ('furni_bardesk_polyfon*3_desc', 'Perfect for work or play'), + ('room_info_rated', 'Room rating:'), + ('nav_venue_bb_lobby_beginner_2/0_desc', ''), + ('help_emergency_explanation', 'If you are experiencing a situation which is making you feel uncomfortable or unsafe, please give details below and a member of community staff will reply as soon as possible.'), + ('furni_divider_nor5*8_desc', 'Cool cornering for your crib y0!'), + ('poster_507_name', 'The French Tricolore'), + ('nav_privateRooms', 'Rooms'), + ('furni_pura_mdl2*5_desc', ''), + ('furni_sporttrack3*3_name', 'Sport goal grass'), + ('furni_sound_set_10_desc', 'Made from real Boy Bands!'), + ('furni_chair_plasto*9_desc', 'Hip plastic furniture'), + ('furni_soft_sofa_norja*4_desc', 'Sit back and relax'), + ('furni_s_sound_machine*3_name', 'Sound Machine Green'), + ('reg_spam', 'Yes, I want to get the occasional email from the Hotel Manager.'), + ('shout', 'Shout'), + ('NUF_mini_use_console_read_link', 'Click here to view the message.'), + ('furni_scifidoor*2_desc', 'There out of this world!'), + ('furni_divider_nor3*3_name', 'White Iced Gate'), + ('pet_hung_0', 'Empty'), + ('furni_table_plasto_square*1_name', 'Occasional Table'), + ('pet_hung_6', 'Stuffed'), + ('pet_hung_5', 'Full'), + ('bb_user_skill', 'Skill Level: \\x\\rScore: \\y'), + ('login_welcome', 'Welcome'), + ('pet_hung_2', 'Rumbling'), + ('pet_hung_1', 'Hungry'), + ('poster_20_name', 'Bars'), + ('pet_hung_4', 'Satisfied'), + ('pet_hung_3', 'Peckish'), + ('Alert_WrongNameOrPassword', 'Wrong name or password - please try again!'), + ('furni_romantique_pianochair*5_desc', 'I can feel air coming through...'), + ('furni_carpet_armas_desc', 'Adds instant warmth'), + ('console_removefriend_2', 'from your Friends List?'), + ('console_removefriend_1', 'Are you sure you want to remove'), + ('furni_rare_parasol*0_name', 'Green Parasol'), + ('furni_sound_set_38_name', 'Rock 6'), + ('NUF_mini_meet_people_room_wave', 'These buttons let you wave and dance. Click on your Habbo at anytime to see these buttons.'), + ('gs_skill_changed_header', 'Congratulations!'), + ('furni_chair_plasty*7_name', 'Plastic Pod Chair'), + ('furni_safe_silo*5_desc', 'Totally shatter-proof!'), + ('furni_divider_silo1*3_name', 'White Corner Shelf'), + ('nav_venue_hallway_ii_name', 'Hallway II'), + ('cam_release.help', 'Cancel Photo'), + ('nav_venue_bb_lobby_amateur_14/0_desc', ''), + ('habbo_tv_title', 'Widescreen Habbovision'), + ('purse_noevents', 'You haven\'t made any transactions yet. Click the button below to find out how to get Habbo Credits.\\rRemember: you must ask your parents permission before you buy Habbo Credits.'), + ('furni_pura_mdl2*8_name', 'yellow pura module 2'), + ('furni_CFC_10_coin_bronze_name', 'Bronze Coin (China)'), + ('sound_machine_song_remove', 'Remove song'), + ('modtool_choose_length', 'Choose Length:'), + ('sound_machine_turn_off', 'Switch Off'), + ('furni_pura_mdl1*8_desc', ''), + ('furni_spyro_desc', 'The stuff of legend'), + ('furni_pillow*2_name', 'Red Silk Pillow'), + ('furni_table_armas_desc', 'For informal dining'), + ('furni_tree3_desc', 'Any presents under it yet?'), + ('object_displayer_link_looks', 'Change avatar looks'), + ('furni_barrier*2_name', 'White Road Barrier'), + ('furni_gothic_chair*5_desc', 'The dark side of Habbo'), + ('furni_divider_nor4*4_name', 'Urban Iced Shutter'), + ('furni_camera_name', 'Camera'), + ('next_arrows', 'Next >>'), + ('furni_sound_set_60_desc', 'Love and affection!'), + ('furni_bed_polyfon_girl_one_name', 'Single Bed'), + ('NUF_mini_meet_people_user_chatfield', 'Start typing here and press \'Enter\' to chat with others.'), + ('successfully_purchase_gift_for', 'Successfully purchased gift for user %user%!'), + ('poster_49_desc', 'All that glitters...'), + ('furni_glass_table*3_name', 'Glass table'), + ('furni_divider_silo3*5_desc', 'Pink Area Gate'), + ('furni_divider_arm3_name', 'Gate (lockable)'), + ('furni_table_plasto_4leg*3_name', 'Round Dining Table'), + ('roomatic_roomnumber', 'Room number:'), + ('nav_venue_bb_lobby_beginner_5_name', 'Beginners Battle Ball 6'), + ('reg_nameAndPassTooSimilar', 'Your name and password are too similar'), + ('nav_venue_theatredrome_easter_name', 'Theatredrome Easter'), + ('nav_venue_bb_lobby_beginner_11/0_desc', ''), + ('furni_fireplace_polyfon_name', 'Fireplace'), + ('queue_set.e1.info', 'There are %e1% Habbos in front of you in the queue.'), + ('more_info_link', 'Redeem Now'), + ('furni_bed_polyfon*6_desc', 'Blue Mode Double Bed'), + ('furni_rare_icecream*5_name', 'Vanilla Ice Cream Machine'), + ('poster_500_name', 'Union Jack'), + ('furni_chair_norja*3_name', 'White Iced Chair'), + ('furni_sound_set_31_name', 'Dance 3'), + ('furni_pura_mdl3*5_name', 'beige pura module 3'), + ('furni_sporttrack2*3_desc', 'null'), + ('furni_sound_set_46_desc', 'De bada bada bo!'), + ('poster_9_name', 'Rainforest Poster'), + ('furni_romantique_pianochair*4_name', 'Amber Piano Stool'), + ('poster_515_desc', 'Waved by Swedes everywhere'), + ('furni_scifidoor*9_desc', 'There out of this world!'), + ('furni_chair_plasty*3_name', 'Plastic Pod Chair'), + ('furni_table_plasto_round*5_name', 'Round Dining Table'), + ('furni_one_way_door*9_desc', 'One at a time!'), + ('furni_calippo_desc', 'Basic model'), + ('furni_footylamp_desc', 'Can you kick it?'), + ('furni_one_way_door*2_desc', 'One way! The HC way!'), + ('furni_arabian_tray4_desc', 'Sweet, juicy and ripe'), + ('furni_divider_nor3*7_name', 'Rural Iced gate'), + ('furni_couch_norja*3_name', 'White Iced Bench'), + ('furni_pillow*9_name', 'Green Wooly Pillow'), + ('game_chooseside', 'Choose your side'), + ('start', 'Start'), + ('furni_toy1*4_desc', 'it\'s bouncy-tastic'), + ('roomevent_host', 'Host:'), + ('nav_venue_rooftop_rumble_name', 'Rooftop Rumble'), + ('nav_venue_bb_lobby_expert_0/0_desc', ''), + ('nav_venue_rooftop_rumble_ii/0_desc', 'Are you ready?'), + ('error_report_trigger_message', 'Last message ID'), + ('furni_sofachair_silo*2_name', 'Black Armchair'), + ('furni_noob_chair*5_desc', 'Lightweight, practical, with pink stripes'), + ('pet_frnd_0', 'Hostile'), + ('furni_noob_rug*3_name', 'My first Habbo rug'), + ('pet_frnd_2', 'Suspicious'), + ('pet_frnd_1', 'Angry'), + ('furni_scifiport*6_desc', 'Energy beams. No trespassers!'), + ('pet_frnd_4', 'Calm'), + ('pet_frnd_3', 'Cool'), + ('pet_frnd_6', 'Warm'), + ('pet_frnd_5', 'Friendly'), + ('pet_frnd_8', 'Loving'), + ('credit_trade_value', 'Includes credit furnis worth %value% credits.'), + ('pet_frnd_7', 'Affectionate'), + ('pet_frnd_9', 'Loyal'), + ('NUF_getting_items_purse_tutor', 'Your Purse tells you how many Habbo Credits you have. If you have a voucher code you can redeem it here by clicking the \'Vouchers\' button.'), + ('furni_chair_norja*6_name', 'Blue Chair'), + ('sound_machine_alert_machine_full', 'You already have 4 Traxpacks loaded. Eject one before adding a new Traxpack.'), + ('nav_venue_club_mammoth/0_desc', 'Monumental and magnificent. For Habbo Club members only.'), + ('NUF_getting_room_hand_tutor', 'This is your hand. It contains all your furniture. I have given you a rug so that you can place it in your room- click and drag it to set it down.'), + ('reg_check_name', 'Name'), + ('furni_glass_stool*7_name', 'Green Glass Stool'), + ('poster_504_name', 'The Bundesflagge'), + ('poster_42_desc', 'Not something you want to run into'), + ('pet.saying.sleep.dog.6', '*dreaming*'), + ('pet.saying.sleep.dog.5', 'Zzzzz wuff! zzzzz'), + ('pet.saying.sleep.dog.4', 'hrrrrr...murrmm..'), + ('furni_pura_mdl4*2_desc', 'Any way you like it!'), + ('pet.saying.sleep.dog.3', 'bzz.. oof oof'), + ('furni_sofa_silo*5_name', 'Pink Area Sofa'), + ('pet.saying.sleep.dog.2', 'hrrr.. hrrr'), + ('pet.saying.sleep.dog.1', 'bzz.. bzzzzz'), + ('furni_petfood4_name', 'T-Bones Mega Multipack'), + ('nav_venue_club_mammoth_name', 'Club Mammoth'), + ('ph_keys_dive', 'Diving moves:'), + ('furni_noob_table*3_name', 'My first Habbo table'), + ('furni_romantique_divan*5_desc', 'Is that a cape hanging there?'), + ('furni_table_plasto_round*8_name', 'Round Dining Table'), + ('furni_rare_fan*1_name', 'Blue Powered Fan'), + ('reg_forcedupdate2', 'Update your Habbo info'), + ('furni_table_plasto_square*4_name', 'Square Dining Table'), + ('NUF_playing_games', 'Playing games'), + ('furni_prizetrophy2*2_name', 'Duck trophy'), + ('reg_forcedupdate3', 'The Habbo Hotel management requires all Habbos to read and agree to the service Terms and Conditions. It won\'t take long.\\rJust go through the registration, check your info and agree to the new terms. Thank you!'), + ('nav_venue_sw_lobby_tournament_2_name', 'Tournament Lobby'), + ('furni_carpet_standard*4_name', 'Floor Rug'), + ('furni_s_sound_machine*6_name', 'Sound Machine Purple'), + ('furni_prizetrophy5*1_desc', 'Glittery gold'), + ('furni_table_plasto_square_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_beginner_2_name', 'Beginners Battle Ball 3'), + ('furni_rubberchair*4_name', 'Ocean Inflatable Chair'), + ('furni_divider_poly3*5_desc', 'Keep the Pink in!'), + ('furni_arabian_teamk_name', 'Tea Maker'), + ('room_name', 'Room:'), + ('nav_venue_chill/0_desc', 'Come chill in the Zen Garden!'), + ('furni_summer_grill*4_name', 'Green Barbeque Grill'), + ('poster_1001_desc', 'even walls have ears'), + ('furni_rare_icecream*8_name', 'Peppermint Ice Cream Machine'), + ('furni_safe_silo*9_desc', 'Totally shatter-proof!'), + ('sound_machine_song_save', 'Save song'), + ('NUF_getting_room_navigator_ownrooms', 'Click the \'Own Room(s)\' tab to see your rooms.'), + ('furni_gothic_chair*1_desc', 'The dark side of Habbo'), + ('furni_table_plasto_square*8_name', 'Square Dining Table'), + ('furni_safe_silo*2_desc', 'Totally shatter-proof!'), + ('roomevent_create_description', 'Describe your event'), + ('purse_vouchers_success', 'Voucher was successfully redeemed. You have the Credits.'), + ('furni_gothic_carpet2_name', 'Dungeon Floor'), + ('furni_sofa_polyfon*3_name', 'White Two-seater Sofa'), + ('furni_romantique_tray2_name', 'Treats Tray'), + ('nav_modify_doorstatus_locked', 'Locked (visitors have to ring the bell)'), + ('NUF_visiting_rooms_categorylist_open', 'Click the \'Open\' button to open a category.'), + ('room_doorbell', 'Rings the doorbell - Open the door?'), + ('furni_sound_set_45_name', 'Lost_Beatness'), + ('nav_deleteroom', 'Delete'), + ('furni_barchair_silo_name', 'Bar Stool'), + ('furni_chair_plasto*5_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_tournament_14_name', 'Competitie Battle Ball 15'), + ('furni_pura_mdl1*1_desc', 'Any way you like it!'), + ('furni_rare_snowrug_desc', 'Chilled Elegance'), + ('poster_35_desc', 'The Hotel\'s girlband. Dream on!'), + ('furni_glass_stool_desc', 'Translucent beauty'), + ('furni_rare_fan*8_name', 'Habbo Wind Turbine'), + ('furni_menorah_desc', 'Light up your room'), + ('furni_table_silo_small*7_desc', 'Green Area Occasional Table'), + ('furni_divider_silo1*7_name', 'Green Area Corner Shelf'), + ('furni_romantique_divan*1_desc', 'null'), + ('furni_table_plasto_round*1_name', 'Round Dining Table'), + ('reg_changeEmail', 'Change your email'), + ('hobba_mark_normal', 'Send To Helpers'), + ('nav_venue_bb_lobby_tournament_8/0_desc', ''), + ('ph_tickets_have2', 'Tickets'), + ('nav_venue_sw_lobby_intermediate_0/0_desc', ''), + ('ph_tickets_have1', 'You Have'), + ('furni_bardesk_polyfon*7_desc', 'Green Mode Bardesk'), + ('console_inprivateroom', 'In A Guest Room'), + ('furni_sound_set_35_name', 'Dance 6'), + ('GoAway', 'Leave The Room'), + ('room_kick', 'Kick'), + ('furni_rubberchair*8_name', 'Black Inflatable Chair'), + ('poster_6_name', 'Abstract Poster'), + ('hubu_t1_3', ''), + ('NUF_meeting_people', 'Meeting people'), + ('nav_venue_bb_lobby_amateur_4/0_desc', ''), + ('nav_venue_bb_game/0_name', 'Battle Ball Arena'), + ('furni_pudding_name', 'Christmas Pudding'), + ('furni_tile_red_name', 'Floor Tiles'), + ('catalog_typeurname', 'Type your greetings here\\r(don\'t forget to put your name!):'), + ('furni_house2_name', 'Gingerbread House'), + ('hubu_t1_1', 'Kaupunkien pu_t2_2=Katso onko kotisi l_1=Tietoa Hubusta'), + ('furni_glass_table*4_desc', 'Translucent beauty'), + ('hubu_t1_2', ''), + ('nav_venue_club_massiva/1_name', 'Chill-out Room'), + ('furni_scifiport*2_desc', 'Get in the ring!'), + ('furni_traffic_light*4_name', 'Yellow Traffic Light'), + ('furni_tree2_name', 'Old Christmas Tree'), + ('furni_noob_stool*4_name', 'My first Habbo stool'), + ('done', 'Done'), + ('furni_goodie1*1_name', 'Marzipan Man'), + ('nav_venue_bb_lobby_tournament_18/0_desc', ''), + ('poster_17_name', 'Butterfly Cabinet 1'), + ('furni_summer_chair*5_name', 'Deck Chair'), + ('furni_prizetrophy*1_name', 'Classic trophy'), + ('furni_easterduck_desc', 'Can you tell what it is yet?'), + ('furni_barrier*3_desc', 'No trespassing, please!'), + ('furni_table_plasto_bigsquare*1_name', 'Square Dining Table'), + ('club_general_infolink', 'More Info About Habbo Club >>'), + ('furni_chair_silo*4_name', 'Beige Silo Dining Chair'), + ('roomatic_givename', 'Give your room a name!'), + ('furni_rare_icecream*1_name', 'Blueberry Ice Cream Machine'), + ('roomatic_open', 'Door open'), + ('NUF_getting_items_catalogue_tutor', 'Big! You can browse the products by clicking on the categories. There are loads of different types of furniture to decorate your room.'), + ('furni_marquee*4_name', 'Yellow Marquee'), + ('furni_bed_polyfon_one*7_name', 'Green Mode Single Bed'), + ('gs_button_go_started', 'Watch'), + ('poster_27_name', 'Holly Bundle 3'), + ('furni_divider_nor2*7_desc', 'No way through'), + ('furni_glass_chair*5_desc', 'Translucent beauty'), + ('nav_venue_basement_lobby_name', 'Basement Lobby'), + ('pick_furniture', 'Put Furni In Hand'), + ('nav_venue_bb_lobby_beginner_18/0_desc', ''), + ('furni_pura_mdl2*4_name', 'White Pura Module 2'), + ('club_status_title', 'You are currently a member of Habbo Club.'), + ('furni_rare_elephant_statue_name', 'Golden Elephant'), + ('furni_toy1*1_desc', 'it\'s bouncy-tastic'), + ('reg_doneheader', 'Congratulations!\\rYou\'re a Habbo!'), + ('furni_present_gen6_name', 'Gift'), + ('furni_noob_chair*2_desc', 'Lightweight, practical, with dark blue stripes'), + ('furni_sofachair_silo*5_name', 'Pink Area Armchair'), + ('BuddyNow', 'now:'), + ('furni_pura_mdl5*3_desc', 'Any way you like it!'), + ('furni_prizetrophy6*1_name', 'Champion trophy'), + ('BuddyEntry', 'On Hotel View'), + ('furni_scifiport*9_desc', 'Energy beams. No trespassers!'), + ('furni_table_polyfon_small_desc', 'For serving a stylish latte'), + ('furni_exe_rug_name', 'Executive Rug'), + ('nav_venue_the_dirty_duck_pub_name', 'The Dirty Duck Pub'), + ('nav_venue_bb_lobby_beginner_9_name', 'Beginners Battle Ball 10'), + ('nav_venue_sw_lobby_beginner_5_name', 'Snow Rookies Lobby'), + ('furni_pura_mdl5*2_name', 'Pink Pura Module 5'), + ('furni_bardeskcorner_polyfon*7_desc', 'Green Mode Bardesk Corner'), + ('alert_donate_content', 'The other Habbo has not put anything into the trade. Are you sure you want to give away your furni?'), + ('furni_hc_rllr_name', 'HC Rollers Set'), + ('furni_divider_nor1_desc', 'Looks squishy, but isn\'t'), + ('furni_nouvelle_trax_desc', ''), + ('wallitem_jp_sheet3_name', 'jp_sheet3'), + ('furni_hyacinth2_name', 'Blue Hyacinth'), + ('furni_sound_machine_name', 'Sound Machine'), + ('console_getmessage_sender', 'Sender:'), + ('furni_sandrug_name', 'Tropical Beach Rug'), + ('nav_updatenote_header', 'Note!'), + ('furni_pillar*4_desc', 'From the time of the Kick Warz'), + ('furni_waterbowl*1_name', 'Red Water Bowl'), + ('furni_grand_piano*5_name', 'Onyx Grand Piano'), + ('furni_redhologram_name', 'Holo-girl'), + ('sound_machine_alert_playlist_full', 'Could not save playlist! Playlists can have only %count% songs.'), + ('nav_rooms_search', 'Search'), + ('nav_venue_cunning_fox_gamehall/5_name', 'Poker'), + ('nav_venue_habbo_lido_ii_name', 'Habbo Lido II'), + ('furni_barchair_silo*9_desc', 'Practical and convenient'), + ('pet_nature', 'Nature:'), + ('furni_wood_tv_name', 'Large TV'), + ('poster_2008_desc', 'Once every four Habbo years!'), + ('poster_38_desc', 'For really TOUGH Habbos!'), + ('nav_venue_bb_lobby_expert_0_name', 'Expert'), + ('furni_chair_plasto*14_desc', 'Aqua chair'), + ('furni_queue_tile1*6_name', 'Blue Habbo Roller'), + ('poster_522_name', 'The flag of Japan'), + ('furni_chair_basic*3_name', 'Black Pura Egg Chair'), + ('nav_venue_pizza_desc', 'Tunnelmallinen pizzapaikka kiireettömään nautiskeluun.'), + ('furni_jp_tray6_desc', 'jp_tray6'), + ('furni_hc_btlr_desc', 'Your personal caretaker'), + ('furni_song_disk_desc', 'Burn, baby burn'), + ('furni_deadduck2_name', 'Dead Duck 2'), + ('furni_statue_name', 'Cupid Statue'), + ('furni_scifirocket*5_name', 'Uranus Smoke Machine'), + ('nav_gobutton', 'Go'), + ('recycler_furni_not_recyclable', 'This Furniture cannot be recycled. Please only use Furniture that has the recyclable tag in your hand.'), + ('furni_gothic_sofa*5_name', 'Green Gothic Sofa'), + ('furni_sound_set_32_desc', 'Piano concert set'), + ('furni_chair_plasto*10_name', 'Chair'), + ('nav_venue_bb_lobby_tournament_2_name', 'Competitie Battle Ball 3'), + ('furni_grand_piano*1_desc', 'Turquoise Grand Piano'), + ('buddyremove_windowheader', 'Your friends list is full.'), + ('furni_pillar*0_name', 'Greek Pillar'), + ('gs_title_countdown', 'Game Is About To Begin'), + ('furni_glass_sofa*3_name', 'Glass sofa'), + ('furni_hc_crtn_desc', 'Topnotch privacy protection'), + ('furni_waterbowl*5_desc', 'Aqua unlimited'), + ('furni_table_silo_small*4_desc', 'Beige Area Occasional Table'), + ('furni_jp_tray2_name', 'jp_tray2'), + ('furni_rare_moonrug_desc', 'Desolation rocks!'), + ('furni_val_teddy*3_name', 'Green Share Bear'), + ('furni_sleepingbag*10_desc', 'Ultimate coziness'), + ('furni_bar_polyfon_desc', 'You naughty Habbo!'), + ('furni_sofachair_polyfon*2_desc', 'Black Mode Armchair'), + ('furni_exe_sofa_name', 'Executive 3-Seater Sofa'), + ('furni_divider_silo1*4_desc', 'Beige Area Corner Shelf'), + ('poster_2004_name', 'Rasta Poster'), + ('furni_bench_armas_name', 'Bench'), + ('furni_soft_sofachair_norja_desc', 'Soft iced sofachair'), + ('nav_venue_bb_lobby_beginner_14_name', 'Beginners Battle Ball 15'), + ('gs_button_rejoin', 'Play again!'), + ('furni_marquee*8_name', 'Ultramarine Marquee'), + ('furni_tile_marble_desc', 'Slick sophistication; now 10% off!'), + ('hubu_info_url_1', 'http://www.habbohotel.co.uk/habbo/en/help/12'), + ('console_requests', 'Friend Request(s)'), + ('furni_sleepingbag*4_name', 'Army Sleeping Bag'), + ('furni_plant_yukka_desc', 'Easy to care for'), + ('NUF_getting_room_own_rooms_createroom', 'Empty? That\'s because you don\'t have any rooms yet. If it isn\'t empty then you already have made a room, which makes me wonder...'), + ('furni_glass_sofa*6_desc', 'Translucent beauty'), + ('ph_exit', 'Exit In Normal Clothes'), + ('pet_race_0_024', 'Black-eyed Boxer'), + ('furni_marquee*7_name', 'Purple Marquee'), + ('pet_race_0_023', 'Dotty Dalmatian'), + ('recycler_info_timeout', 'Your recycling was completed, but you did not accept it in time. Please press the cancel button below to have your recyclable items restored to your hand. To recycle these items you will need to begin the process again.'), + ('pet_race_0_022', 'Schnitzel Snatcher'), + ('hubu_info_url_2', 'http://www.talktofrank.com/'), + ('pet_race_0_021', 'Loyal Labrador'), + ('nav_venue_snowwar_lobby/0_desc', 'Snow Storm LobbyCome and be a Snow Stormer!'), + ('pet_race_0_020', 'Patchy Pup'), + ('furni_chair_plasto*8_name', 'Chair'), + ('furni_sofachair_silo*9_desc', 'Red Area Armchair'), + ('nav_venue_bb_lobby_beginner_17/0_desc', ''), + ('furni_hc_dsk_desc', 'For Habbo scholars'), + ('furni_wooden_screen*8_name', 'Night Blue Oriental Screen'), + ('gs_lounge_skill_no_min', 'No minimum'), + ('summer_chair_8_name', 'Yellow Deck Chair'), + ('gs_score_tie', 'The game ended in a tie!'), + ('nav_people', 'Who\'s in here?'), + ('furni_gothic_sofa*2_desc', 'Stylish seating for two'), + ('furni_summer_chair*8_name', 'Yellow Deck Chair'), + ('roomatic_roomname', 'Room name:'), + ('furni_ham_desc', 'Tuck in'), + ('nav_venue_star_lounge_desc', 'Is there a VIP visitor in the hotel?'), + ('furni_bardeskcorner_polyfon*3_name', 'White Corner Desk'), + ('gs_specnum', 'Number of spectators: \\x'), + ('furni_bed_budget*3_name', 'Black Pura Double Bed'), + ('furni_shelves_norja*6_name', 'Blue Bookcase'), + ('partner_registration_link', 'Finish registration'), + ('furni_pillar*1_name', 'Pink Marble Pillar'), + ('reg_olderage', 'I am 11 or older'), + ('furni_glass_stool*4_name', 'Glass stool'), + ('back', 'Back'), + ('furni_tile_yell_desc', 'In a choice of colours'), + ('club_confirm_text3', 'Buy more and pay less: 6 Months (186 days) of Habbo Club cost only 105 Credits. You have %credits% credits in your Purse.\\r\\r After buying the membership, you will immediately be part of the Habbo VIP Community.'), + ('furni_sofa_silo_desc', 'Cushioned, understated comfort'), + ('club_confirm_text1', '1 Habbo Club Month (31 days) costs 25 Credits. You have %credits% Credits in your Purse.\\r\\r After buying the membership, you will immediately be part of the Habbo VIP Community.'), + ('club_confirm_text2', 'Buy more and pay less: 3 Months (93 days) of Habbo Club cost only 60 Credits. You have %credits% credits in your Purse.\\r\\r After buying the membership, you will immediately be part of the Habbo VIP Community.'), + ('furni_carpet_legocourt_name', 'Basketball Court'), + ('furni_present_gen3_name', 'Gift'), + ('furni_sound_set_2_desc', 'Get the party started!'), + ('furni_barchair_silo*6_name', 'Blue Bar Stool'), + ('furni_arabian_bigtb_name', 'Amanjena Table'), + ('interface_icon_catalog', 'Catalogue, furnishing your room'), + ('furni_hologram_desc', 'As if by magic...'), + ('nav_venue_sw_lobby_expert_1/0_desc', ''), + ('furni_carpet_standard*1_name', 'Floor Rug'), + ('nav_owner', 'Owner'), + ('furni_glass_chair*2_desc', 'Translucent beauty'), + ('furni_rcandleset_name', 'Red Candle Plate'), + ('furni_divider_nor1*6_name', 'Blue Ice corner'), + ('nav_private_helptext_hd', 'Rooms'), + ('furni_sound_set_27_name', 'Groove 2'), + ('furni_drinks_name', 'Empty Cans'), + ('pet.saying.eat.cat.0', 'mmm...thumm, thumm'), + ('gs_title_nextround', 'Next game...'), + ('pet.saying.eat.cat.1', 'lap, lap, lap, lap'), + ('furni_scifirocket*9_desc', 'Something fishy is going on...'), + ('pet.saying.eat.cat.2', '*munch, munch*'), + ('pet.saying.sleep.dog.0', 'zzZZZzzz'), + ('furni_noob_lamp*4_name', 'My first Habbo lamp'), + ('nav_venue_sw_lobby_beginner_8_name', 'Snow Rookies Lobby'), + ('nav_venue_library/0_desc', 'Time to catch up on some studying'), + ('camera_dialog_open', 'Shoot'), + ('furni_lamp_armas_desc', 'Ambient lighting is essential'), + ('buddyremove_pleasewait', 'Please wait a second...'), + ('friend_request_options', 'Advanced options.'), + ('transaction_system_web_internal', 'Housekeeping purchase'), + ('furni_rare_dragonlamp*5_name', 'Elf Green Dragon Lamp'), + ('furni_bar_chair_armas_desc', 'The ultimate recycled furniture'), + ('room_ignore', 'Shutup'), + ('poster_518_desc', 'A fiery dragon for your wall'), + ('furni_soft_sofa_norja*7_desc', 'Sit back and relax'), + ('object_displayer_show_tags', 'Show tags'), + ('furni_goth_table_desc', 'The dark side of Habbo'), + ('club_txt_changesubscr', 'Change subscription'), + ('Alert_RememberSetYourPassword', 'Please check your password'), + ('reg_verification_checking', 'Checking...'), + ('furni_silo_studydesk_desc', 'For the true Habbo Scholars'), + ('room_give_rights', 'Give rights'), + ('furni_CF_50_goldbar_name', 'Gold Bar'), + ('furni_rom_lamp_name', 'Crystal Lamp'), + ('furni_sofachair_polyfon*8_desc', 'Yellow Mode Armchair'), + ('furni_deadduck3_name', 'Dead Duck 3'), + ('furni_bed_polyfon_one*4_name', 'Beige Mode Single Bed'), + ('furni_noob_stool*1_desc', 'Unfold me and take the weight off (orange)'), + ('furni_stand_polyfon_z_name', 'Shelf'), + ('furni_prize3_name', 'Bronze Trophy'), + ('club_status_text', 'Here you can see your Habbo Club membership status, number of elapsed months, pre-ordered months and status of the ongoing month.'), + ('furni_table_plasto_bigsquare*9_desc', 'Hip plastic furniture'), + ('furni_wooden_screen*4_desc', 'Add an exotic touch to your room'), + ('furni_sound_set_52_name', 'Christmas Party'), + ('furni_CF_1_coin_bronze_name', 'Bronze Coin'), + ('furni_tile_brown_name', 'Red Tile'), + ('nav_venue_bb_lobby_intermediate_5/0_desc', ''), + ('nav_venue_picnic/0_name', 'Picnic Garden'), + ('furni_sound_set_50_desc', 'The harder generation'), + ('furni_lamp2_armas_name', 'Lodge Candle'), + ('registration_disabled_text', 'You can\'t create new Habbos at the moment. Please try again [some date]..'), + ('catalog_selectproduct', 'Select product:'), + ('transaction_system_sms_telia', 'Telia'), + ('nav_venue_bb_lobby_intermediate_5_name', 'Semi-profs Battle Ball 6'), + ('furni_christmas_sleigh_name', 'Winter Sleigh'), + ('furni_scifirocket*8_desc', 'From a space far, far away!'), + ('furni_bed_budget*9_name', 'Red Pura Double Bed'), + ('poster_2000_desc', 'Suomen kartta'), + ('help_emergency_whathappens', 'A member of community staff will investigate the situation and take appropriate action. This may include sending you a response with advice on dealing with your issue.'), + ('purse_coins', 'Habbo Credits'), + ('furni_marquee*5_desc', 'It\'s both door and a shade!'), + ('club_txt_whatis', 'What is Habbo Club?'), + ('furni_present_gen2_name', 'Gift'), + ('trading', 'Trading'), + ('furni_sofa_silo*9_desc', 'Red Area Sofa'), + ('furni_summer_chair*9_name', 'Red Deck Chair'), + ('furni_shelves_armas_desc', 'For all those fire-side stories'), + ('purse_buy_coins', 'Buy Credits'), + ('room_confirmPlace', 'Are you sure?'), + ('furni_queue_tile1*3_desc', 'The power of movement'), + ('furni_soft_sofachair_norja*8_name', 'Yellow Iced Sofachair'), + ('furni_arabian_snake_desc', 'Beware the snake!'), + ('nav_venue_sw_lobby_tournament_6/0_desc', ''), + ('NUF_about_hotel', 'What\'s Habbo about?'), + ('furni_bardeskcorner_polyfon_desc', 'Tuck it away'), + ('furni_bardeskcorner_polyfon*4_name', 'Beige Mode Bardesk Corner'), + ('poster_13_desc', 'Arty black and white'), + ('nav_venue_bb_lobby_beginner_9/0_desc', ''), + ('nav_modify_nameshow', 'Show your name in the room info'), + ('NUF_mini_use_console_read_next', 'Click \'OK\' to mark message as read.'), + ('poster_1005_desc', 'The muscly movie hero'), + ('wallitem_jp_sheet2_name', 'jp_sheet2'), + ('furni_xmas_cstl_gate_desc', 'Let that icy draft out!'), + ('NUF_groups_url', 'http://d16-1.web.varoke.net/home/group-tutorial'), + ('furni_jp_irori_name', 'Irori'), + ('furni_jp_bamboo_desc', 'Watch out for pandas!'), + ('furni_christmas_reindeer_name', 'Reindeer'), + ('furni_glass_chair*4_name', 'Glass chair'), + ('furni_jp_tray5_desc', 'jp_tray5'), + ('furni_table_plasto_4leg*4_desc', 'Hip plastic furniture'), + ('NUF_getting_items_catalogue_purse', 'Click to open your Purse and find out how to get some Habbo Credits . You can use these to buy stuff!'), + ('furni_hc_tbl_name', 'Nordic Table'), + ('furni_bed_budget_one*6_name', 'Blue Pura Bed'), + ('furni_solarium_norja*7_name', 'Rural Solarium'), + ('console_newmessages', 'New Message(s)'), + ('poster_2_desc', 'Take pride in your veg!'), + ('furni_xmas_cstl_twr_desc', 'All I see from up here is snow!'), + ('hubu_info', 'Welcome to the FRANK Infobus! For the next three months FRANK advisors who know a lot about drugs, their effects and the risks involved, will be stepping aboard the Infobus to offer advice and support to any Habbo that wants to visit the bus. For more information click the link below:'), + ('furni_bardesk_polyfon*6_name', 'Blue Mode Bardesk'), + ('furni_summer_pool*3_name', 'Green Summer Pool'), + ('furni_pura_mdl3*8_name', 'yellow pura module 3'), + ('furni_valentinescreen_name', 'Holiday Romance'), + ('furni_rare_beehive_bulb*1_desc', 'A honey-hued glow'), + ('gs_link_gamerules', 'Game Rules'), + ('nav_venue_bb_lobby_tournament_11/0_desc', ''), + ('sound_machine_song_info', 'Song Info'), + ('wallitem_arabian_swords_name', 'Ancestral Scimitars'), + ('furni_one_way_door*6_desc', 'One way! The HC way!'), + ('furni_table_plasto_round*2_desc', 'Hip plastic furniture'), + ('credit', 'Credit'), + ('gs_lounge_skill_no_max', 'Infinite'), + ('furni_wall_china_desc', 'For your great wall'), + ('NUF_visiting_rooms_roomlist_add to fav', 'After clicking on a room you can click this button here to add it to favourites.'), + ('furni_carpet_polar*3_name', 'Yellow Bear Rug'), + ('poster_46_desc', 'Twinkle, twinkle'), + ('furni_petfood1_desc', 'Fantastic 20% Saving!'), + ('url_nobalance', 'http://%predefined%/credits?'), + ('furni_sofachair_silo*6_name', 'Blue Area Armchair'), + ('furni_noob_chair*1_desc', 'Lightweight, practical and yellow'), + ('nav_venue_bb_lobby_expert_7/0_desc', ''), + ('furni_pura_mdl1*7_name', 'Green Pura Module 1'), + ('furni_table_silo_small*6_name', 'Blue Area Occasional Table'), + ('club_thanks_title', 'Congratulations! You are now a member of Habbo Club.'), + ('furni_legotrophy_name', 'Basketball Trophy'), + ('roomatic_createyrown', 'Create Your Own Room'), + ('console_report_remove', 'Remove'), + ('furni_sound_set_42_desc', 'Bumps and Chills'), + ('furni_divider_nor5*5_desc', 'Cool cornering for your crib y0!'), + ('furni_rare_icecream*2_desc', 'Virtual pistachio rocks!'), + ('furni_pura_mdl4*6_name', 'Blue Pura Module 4'), + ('club_button_close', 'Close Window'), + ('wallitem_md_can_name', 'Bubble Juice Can'), + ('furni_prizetrophy7_desc', 'Palkinto'), + ('nav_venue_cunning_fox_gamehall/2_desc', 'Keep your head down, it\'s bombs away'), + ('poster_28_desc', '10 x Silver Tinsel'), + ('furni_rare_dragonlamp*2_desc', 'Oriental beast of legends'), + ('furni_glass_sofa*2_name', 'Glass sofa'), + ('modtool_hours', 'Hours'), + ('nav_venue_emperors_name', 'Emperor\'s hall'), + ('catalog_buyingSuccesfull', 'Buying Successful!'), + ('console_concurrency_error', 'There was a concurrency error while modifying friend list'), + ('furni_table_silo_med*3_desc', 'Wipe clean and unobtrusive'), + ('furni_sleepingbag*8_desc', 'Ultimate coziness for SnowStorm winners'), + ('poster_508_desc', 'The flag of Spain'), + ('furni_goodie1*2_desc', 'Crunchy Dog Treat'), + ('nav_venue_sw_lobby_free_3/0_desc', ''), + ('furni_chair_basic*7_desc', ''), + ('room_take_rights', 'Remove Rights'), + ('furni_hc_bkshlf_desc', 'For the scholarly ones'), + ('furni_bed_polyfon*2_desc', 'Black Mode Double Bed'), + ('furni_table_plasto_4leg_name', 'Occasional Table'), + ('furni_bed_budget*7_desc', 'King sized comfort!'), + ('win_partner_registration', 'Partner registration'), + ('summer_chair_4_desc', 'Please tan responsably'), + ('furni_table_norja_med_name', 'Coffee Table'), + ('nav_venue_club_massiva/2_desc', 'Make all the right moves'), + ('furni_divider_silo1_desc', 'Neat and natty'), + ('hobba_send_reply', 'Send Alert'), + ('shopping_nocash', 'You don\'t have enough Credits in your Purse.\\r Click \'OK\' to see the different ways of\\rgetting Habbo Credits.'), + ('furni_divider_poly3*9_name', 'Red Hatch'), + ('furni_rare_fountain*1_desc', 'For our feathered friends'), + ('poster_56_desc', 'Serious partying going on!'), + ('furni_scifiport*6_name', 'White Sci-Fi Port'), + ('furni_rclr_garden_desc', 'Self watering'), + ('furni_arabian_tray1_desc', 'Tea for every occasion'), + ('furni_rare_fountain*3_name', 'Bird Bath (blue)'), + ('furni_romantique_pianochair*1_name', 'Rose Quartz Piano Stool'), + ('furni_romantique_divider*1_desc', 'Beauty lies within'), + ('wallitem_post.it.vd_name', 'Heart Stickies'), + ('wallitem_torch_desc', 'The dark side of Habbo'), + ('roomatic_namedisplayed', 'Do you want your name to be displayed with the room?'), + ('furni_grunge_candle_name', 'Candle Box'), + ('furni_sound_set_17_name', 'Groove 3'), + ('furni_prizetrophy3*2_name', 'Globe trophy'), + ('furni_chair_silo_desc', 'Keep it simple'), + ('nav_venue_sw_lobby_beginner_7/0_desc', ''), + ('nav_venue_sw_lobby_beginner_3/0_desc', ''), + ('furni_hc_trll_name', 'Drinks Trolley'), + ('furni_bed_polyfon_one*7_desc', 'Green Mode Single Bed'), + ('furni_chair_plasto*2_name', 'Chair'), + ('furni_pura_mdl1*4_name', 'White Pura Module 1'), + ('furni_gothiccandelabra_desc', 'The dark side of Habbo'), + ('NUH_chat', 'Click here and type to chat to other Habbos.'), + ('furni_plant_valentinerose*2_name', 'White Valentine Rose'), + ('reg_privacypledge', 'Privacy Pledge'), + ('furni_exe_table_desc', 'Take a memo, Featherstone'), + ('hubu_info_link2', 'FRANK Website'), + ('furni_prizetrophy4*3_name', 'Fish trophy'), + ('furni_hc_chr_desc', 'Royal comfort'), + ('hubu_info_link1', 'FRANK Infobus Information'), + ('sound_machine_your_songs', 'Traxmachine Songs'), + ('furni_active_placeholder_name', 'This furniture is downloading...'), + ('furni_divider_silo3*8_name', 'Yellow Area Gate'), + ('NUF_visiting_rooms_categorylist_tutor', 'There are so many Guest Rooms we thought it would be a "hoot" to divide them into categories. Select a category to view its contents.'), + ('furni_sofa_silo*6_name', 'Blue Area Sofa'), + ('club_extend_failed', 'Sorry, we were unable to process the purchase. No Credits were charged!'), + ('furni_soft_sofa_norja*4_name', 'Urban Iced Sofa'), + ('furni_sporttrack3*3_desc', 'null'), + ('furni_sound_set_1_name', 'Habbo Sounds 1'), + ('furni_pura_mdl2*5_name', 'beige pura module 2'), + ('nav_venue_sw_lobby_intermediate_1/0_desc', ''), + ('furni_safe_silo*8_name', 'Yellow Safe Minibar'), + ('trading_agrees', 'agrees'), + ('alert_needpermission', 'You need your parent or guardian\'s permission to spend time in Habbo Hotel.'), + ('nav_modify', 'Modify'), + ('furni_noob_stool*4_desc', 'Unfold me and take the weight off (light blue)'), + ('catalog_length_trophymsg', 'Oops, your inscription is too long, so it won\'t fit on the trophy. \\rPlease type something shorter.'), + ('furni_s_sound_machine*3_desc', 'Sound Machine Green Desc'), + ('club_member', 'Member'), + ('modtool_ban_ip', 'Ban IP Also'), + ('bb_link_gamerules', 'Spelregels'), + ('furni_carpet_armas_name', 'Hand-Woven Rug'), + ('furni_rubberchair*5_desc', 'Soft and tearproof!'), + ('furni_table_plasto_square*1_desc', 'Hip plastic furniture'), + ('furni_divider_nor3*3_desc', 'Do go through...'), + ('nav_venue_habburger\'s/0_desc', 'Get food here!'), + ('reg_linkstitle', 'Full version of the documents:'), + ('roomevent_browser_title', 'Events'), + ('roomatic_security', 'Security'), + ('furni_table_plasto_4leg*7_desc', 'Hip plastic furniture'), + ('furni_table_plasto_round*14_desc', 'Hip plastic furniture'), + ('furni_sound_set_38_desc', 'Rock and Roses!'), + ('furni_rare_parasol*0_desc', 'Block those rays!'), + ('furni_pura_mdl3*6_desc', 'Any way you like it!'), + ('NUF_console', 'Learn about messaging'), + ('poster_45_name', 'Skeleton'), + ('furni_pura_mdl3*9_desc', 'Any way you like it!'), + ('pet_age', 'Age:'), + ('poster_48_name', 'Large gold star'), + ('open', 'Open'), + ('gs_3min', '3min'), + ('wallitem_habw_mirror_name', 'Habbowood Mirror'), + ('furni_carpet_polar*4_desc', 'Snuggle up on a Funky bear rug...'), + ('furni_table_armas_name', 'Dining Table'), + ('sw_gameprice', 'Play now for just 2 tickets!'), + ('furni_divider_nor5*4_name', 'Urban Iced Angle'), + ('navigator', 'Hotel Navigator'), + ('furni_pillow*2_desc', 'Puffy, soft and huge'), + ('purse_vouchers_checking', 'Checking code, please wait...'), + ('furni_noob_rug*4_desc', 'Nice and neat sisal rug with light blue edging'), + ('furni_safe_silo*5_name', 'Pink Safe Minibar'), + ('nav_venue_the_dirty_duck_pub/0_desc', 'The perfect place to chill!'), + ('furni_CFC_10_coin_bronze_desc', 'Worth 10 Credits'), + ('furni_teleport_door_desc', 'Magic doorway to anywhere!'), + ('furni_bardesk_polyfon_name', 'Bar/desk'), + ('login_password', 'Password'), + ('furni_pura_mdl2*8_desc', ''), + ('furni_divider_nor4*4_desc', 'Habbos, roll out!'), + ('furni_rare_fan*7_name', 'Brown Powered Fan'), + ('furni_bed_polyfon_girl_one_desc', 'Snuggle down in princess pink'), + ('club_general_elapsed', 'Elapsed Months'), + ('nav_venue_sw_lobby_free_1_name', 'Free Game Lobby'), + ('furni_gothic_chair*5_name', 'Green Gothic Chair'), + ('furni_sink_name', 'Sink'), + ('furni_bed_budget_one*4_desc', 'Prince sized comfort!'), + ('Alert_ForgotSetPassword', 'Please check your password'), + ('furni_chair_plasto*6_desc', 'Hip plastic furniture'), + ('furni_carpet_standard_desc', 'Available in a variety of colours'), + ('reg_update_text2', 'Only change them when you want to make sure that nobody can know or guess your password.'), + ('furni_arabian_swords_desc', 'Not for yielding'), + ('furni_divider_silo3*5_name', 'Pink Area Gate'), + ('furni_fireplace_polyfon_desc', 'Comfort in stainless steel'), + ('furni_glass_table*3_desc', 'Translucent beauty'), + ('furni_summer_pool*4_desc', 'Fancy a dip?'), + ('poster_500_desc', 'The UK flag'), + ('poster_1004_name', 'Eid Mubarak Poster'), + ('furni_rare_icecream*5_desc', 'Virtual vanilla rocks!'), + ('furni_one_way_door*2_name', 'Black HC Gate'), + ('furni_chair_plasty*3_desc', 'Hip plastic furniture'), + ('club_end_title', 'Your Habbo Club membership has now expired.'), + ('furni_table_polyfon_desc', 'For larger gatherings'), + ('furni_romantique_pianochair*4_desc', 'I can feel air coming through...'), + ('furni_bardesk_polyfon*3_name', 'White Bardesk'), + ('predefined_room_description', '%user_name% has entered the building'), + ('poster_53_desc', 'whack that ball!'), + ('poster_515_name', 'The Swedish flag'), + ('furni_rope_divider_desc', 'Rope Divider'), + ('furni_chair_norja*3_desc', 'Sleek and chic for each cheek'), + ('furni_scifidoor*9_name', 'Blue Spaceship Door'), + ('furni_goodie2_name', 'Chocolate Mouse'), + ('game_poker_logoff', 'Left the game'), + ('furni_bed_polyfon_desc', 'Give yourself space to stretch out'), + ('furni_table_plasto_round*5_desc', 'Hip plastic furniture'), + ('furni_couch_norja*3_desc', 'Two can perch comfortably'), + ('pet.saying.sleep.cat.2', 'Purrr... rrrr'), + ('pet.saying.sleep.cat.1', 'mrrrr..rrrr..'), + ('pet.saying.sleep.cat.0', 'hrrrrr....Mrrrrr'), + ('login_ok', 'OK'), + ('gs_button_expand', 'Expand Window'), + ('pet.saying.sleep.cat.4', 'mrrrr...muew..mrr'), + ('tutorial_next', 'Next:'), + ('pet.saying.sleep.cat.3', 'hurrr..hurrr'), + ('furni_jp_tatami_desc', 'Shoes off please'), + ('hobba_sent_to_moderators', 'Call re-assigned non-emergency, still visible to moderators'), + ('roomatic_choosecategory', ''), + ('wallitem_guitar_v_desc', 'tilulilulii'), + ('NUF_groups', 'Groups'), + ('bb_link_gameRules_url', 'http://%predefined%/groups/56552/id'), + ('nav_venue_theatredrome_halloween_name', 'Theatredrome Habboween'), + ('bb_buyTicketsButton', 'Buy tickets'), + ('furni_gothgate_desc', 'The dark side of Habbo'), + ('game_poker_waiting', 'Change done.\\rWaiting for the other players'), + ('furni_glass_stool*7_desc', 'Habbo Club'), + ('club_end_text', 'BUT, don\'t worry, you can still buy another month of Habbo Club and keep all your Habbo Club benefits,special Furni gifts and the shiny badge!'), + ('furni_sound_set_18_desc', 'Listen while you tan'), + ('furni_sound_set_35_desc', 'Groovelicious'), + ('furni_prizetrophy2*2_desc', 'Shiny silver'), + ('furni_plant_valentinerose*3_desc', 'Relight your passions'), + ('furni_romantique_divan*5_name', 'Onyx Chaise-Longue'), + ('furni_chair_norja*6_desc', 'Sleek and chic for each cheek'), + ('wallitem_hrella_poster_2_desc', 'For those scary Lido moments'), + ('furni_s_sound_machine*6_desc', 'Sound Machine Purple'), + ('game_bs_miss', 'Miss:'), + ('furni_carpet_standard*4_desc', 'Available in a variety of colours'), + ('furni_pura_mdl1*1_name', 'Aqua Pura Module 1'), + ('furni_rare_icecream*8_desc', 'Virtual peppermint rocks!'), + ('furni_petfood4_desc', 'Fantastic 20% Saving!'), + ('furni_table_silo_small*3_name', 'White Occasional Table'), + ('furni_table_plasto_round*8_desc', 'Hip plastic furniture'), + ('furni_chair_polyfon_desc', 'Metallic seating experience'), + ('furni_exe_drinks_desc', 'Give a warm welcome'), + ('nav_createroom', 'Create Own Room'), + ('furni_table_plasto_bigsquare*14_desc', 'Hip plastic furniture'), + ('poster_1001_name', 'Prince Charles Poster'), + ('furni_CF_20_moneybag_name', 'Sack of Credits'), + ('furni_prizetrophy5*1_name', 'Duo trophy'), + ('alert_reg_email', 'Email'), + ('pet_thirsty', 'Thirst:'), + ('nav_error_passwordtooshort', 'The password is too short.'), + ('nav_venue_sw_lobby_free_7_name', 'Free Game Lobby'), + ('furni_plant_valentinerose*5_name', 'Purple Valentine Rose'), + ('recycler_status_info', 'You have Furniture in recycling. The icon will blink when recycling is complete.'), + ('poster_52_name', 'Hockey Stick'), + ('win_doorbell', 'Doorbell'), + ('Unreadmessages', 'New Message(s)'), + ('furni_queue_tile1*9_desc', 'The power of movement'), + ('furni_rare_snowrug_name', 'Snow Rug'), + ('console_approve_selected', 'Accept selected'), + ('pet_race_0_009', 'Hound of Hull'), + ('poster_35_name', 'The Habbo Babes 1'), + ('pet_race_0_008', 'Springy Spaniel'), + ('furni_sofa_polyfon*3_desc', 'Comfort for stylish couples'), + ('furni_basket_name', 'Basket Of Eggs'), + ('pet_race_0_007', 'Slobber Don'), + ('pet_race_0_006', 'Stripy Setter'), + ('pet_race_0_005', 'Paws Forethought'), + ('pet_race_0_004', 'Droopy of Pawford'), + ('furni_barchair_silo_desc', 'Practical and convenient'), + ('furni_noob_lamp*2_desc', 'Get the light right where you want it (dark blue)'), + ('pet_race_0_003', 'Rescue Bernard'), + ('furni_glass_stool_name', 'Glass stool'), + ('pet_race_0_002', 'Joe Cocker Spaniel'), + ('pet_race_0_001', 'Habbo Husky'), + ('pet_race_0_000', 'Yappy Yorkie'), + ('NUF_mini_endtopic_step1_questionmark', 'Click to see our help menu and find our FAQs!'), + ('furni_sound_set_28_desc', 'Head for the pit!'), + ('nav_private_norooms', 'You dont have any rooms - create one?'), + ('furni_table_plasto_square*4_desc', 'Hip plastic furniture'), + ('furni_val_teddy*6_name', 'Blue Share Bear'), + ('furni_noob_table*3_desc', 'Lightweight, practical and aubergine'), + ('gs_state_finished', 'This Game is already over!'), + ('furni_rare_fan*8_desc', 'Stylish, Eco-Energy!'), + ('reg_parentemail_link_url1', 'http://%predefined%//help/parents_guide.html'), + ('furni_gothic_carpet2_desc', 'What lies beneath?'), + ('furni_rare_fan*5_desc', 'It\'ll blow you away!'), + ('modtool_kickuser', 'Kick User'), + ('furni_divider_silo1*7_desc', 'Green Area Corner Shelf'), + ('reg_parentemail_link_url2', 'http://%predefined%//footer_pages/privacy_policy.html'), + ('pet_race_0_019', 'Tiny Terrier'), + ('pet_race_0_018', 'Bushy Woofer'), + ('pet_race_0_017', 'Speckled Sheepdog'), + ('furni_rubberchair*8_desc', 'Soft and tearproof for HC!'), + ('pet_race_0_016', 'Murmurin\' Minimastiff'), + ('poster_42_name', 'Spiderweb'), + ('pet_race_0_015', 'Pixie Poodle'), + ('furni_safe_silo*2_name', 'Black Safe Minibar'), + ('pet_race_0_014', 'Whiffy Woofy'), + ('pet_race_0_013', 'Mangy Mutt'), + ('nav_publicRooms', 'Public Spaces'), + ('pet_race_0_012', 'Tawny Bleugh'), + ('pet_race_0_011', 'Lappy Lassie'), + ('pet_race_0_010', 'Furry McScottie'), + ('game_bs_toast', 'Toast!'), + ('furni_prizetrophy6_name', 'Pokaali'), + ('furni_pudding_desc', 'Will you get the lucky sixpence?'), + ('furni_tile_red_desc', 'In a choice of colours'), + ('nav_venue_sw_arena_expert_name', 'Playing expert game'), + ('pet.saying.sleep.croco.0', 'Zzzz... zzzzz...'), + ('poster_50_desc', 'flap, flap, screech, screech...'), + ('furni_shelves_norja*9_name', 'Red Bookcase'), + ('furni_sound_set_4_name', 'Ambient 1'), + ('furni_exe_s_table_desc', 'Get a clear reflection!'), + ('furni_present_gen6_desc', 'What\'s inside?'), + ('furni_one_way_door*5_name', 'Pink One Way Gate'), + ('nav_search_hd', 'Search rooms by Habbo name or room name.'), + ('poster_20_desc', 'high security for your room'), + ('buddyremove_messenger_updating', 'The console is updating, try again in a minute... Everything else is working fine!'), + ('pet.saying.sleep.croco.3', ':)'), + ('furni_house2_desc', 'Good enough to eat'), + ('pet.saying.sleep.croco.4', '*Snuh snuh*'), + ('tutorial_offtopic', 'Oops! You got off the topic. Please restart or select a new topic.'), + ('pet.saying.sleep.croco.1', 'Yrgh... Yrgh...'), + ('jukebox_now_playing', 'Now playing:'), + ('pet.saying.sleep.croco.2', 'Frgh... Frgh...'), + ('furni_sound_set_25_desc', 'Actually, it\'s Partay!'), + ('club_intro_header', 'Welcome to Habbo Club, the members-only club that all VIP Habbos belong to!'), + ('nav_venue_sw_lobby_amateur_3/0_desc', 'Astetta rankempaa lumisotaa.'), + ('pet.saying.sleep.croco.5', 'Rawwwwwwwwrrrm...'), + ('pet.saying.sleep.croco.6', 'Mmmm... Hooks...'), + ('furni_table_plasto_bigsquare*1_desc', 'Hip plastic furniture'), + ('nav_venue_sw_lobby_free_4_name', 'Free Game Lobby'), + ('alert_warning', 'Moderator says:'), + ('furni_barrier*3_name', 'Red Road Barrier'), + ('nav_venue_floatinggarden_name', 'Floating Garden'), + ('gs_error_nocredits', 'You need Habbo Credits to play a Game!'), + ('furni_chair_plasto*5_name', 'Chair'), + ('furni_tree2_desc', 'Old Christmas Tree'), + ('furni_bed_budget_one*7_desc', 'Prince sized comfort!'), + ('furni_romantique_clock_name', 'romantique_clock'), + ('room_banner_text', ''), + ('furni_sleepingbag*2_desc', 'Ultimate coziness'), + ('furni_divider_nor4*3_name', 'White Iced Auto Shutter'), + ('jukebox_song_remaining', 'Remaining time: %time%'), + ('reg_note_text', 'Never change your password or email\\rif someone else asks you to - they will\\rsteal your furni and Credits!'); +INSERT INTO `external_texts` (`entry`, `text`) VALUES + ('habbo_hand_next', '>>>'), + ('nav_venue_orient/0_desc', 'Tres chic with an Eastern twist. For Habbo Club members only.'), + ('furni_easterduck_name', 'Wannabe bunny'), + ('login_forgottenPassword', 'Forgotten your password?'), + ('furni_prizetrophy*1_desc', 'Glittery gold'), + ('hubu_t2_2', ''), + ('hubu_t2_3', 'Vapaa-ajan linkkejä'), + ('decision_cancel', 'Cancel'), + ('nav_venue_bb_lobby_tournament_2/0_desc', ''), + ('furni_samovar_desc', 'Click for a refreshing cuppa'), + ('furni_rcandle_name', 'Red Candle'), + ('furni_waterbowl*4_name', 'Blue Water Bowl'), + ('furni_table_norja_med*7_name', 'Rural Iced Coffee Table'), + ('NUF_playing_games_room_tutor', 'See some people wandering around? They are psyching themselves up for a game. Game Tickets are usually 2 Habbo Credits, but in this room the games are free.'), + ('furni_doormat_love_name', 'Doormat'), + ('bb_link_tournament_highScores_url', 'http://%predefined%//groups/56552/id'), + ('furni_sofachair_polyfon*4_name', 'Beige Mode Armchair'), + ('error_room_full', 'Huone on täynnä.'), + ('furni_chair_silo*4_desc', 'Beige Silo Dining Chair'), + ('furni_divider_nor2*7_name', 'Rural Iced Bar'), + ('hubu_t2_1', ''), + ('furni_divider_nor1*9_name', 'Red Ice corner'), + ('furni_wooden_screen*0_name', 'White Oriental Screen'), + ('furni_chair_basic*1_desc', ''), + ('gs_choose_gamename', 'Enter A Name For Your Game:'), + ('poll_question_number', 'Question %number%/%count%'), + ('furni_hc_rllr_desc', 'Highest class transportation'), + ('furni_table_plasto_4leg*15_desc', 'Hip plastic furniture'), + ('furni_scifiport*9_name', 'Violet Sci-Fi Port'), + ('furni_jukebox*1_desc', 'For your Happy Days!'), + ('furni_red_tv_desc', 'Don?t miss those soaps'), + ('furni_song_disk_name', 'Traxdisc'), + ('reg_agree_alert', 'You have to agree to the terms of service\\r(tick the box).'), + ('furni_summer_chair*1_desc', 'Got your swimming trunks?'), + ('poster_2008_name', 'Habbo Leap Day Poster'), + ('poster_505_desc', 'The Canadian flag'), + ('group_homepage', 'Groups\' Homepage >>>'), + ('furni_table_silo_med*6_desc', 'Blue Area Coffee Table'), + ('nav_venue_tearoom/0_name', 'Chinese Tea Room'), + ('dimmer_use_bg_only', 'Background only'), + ('furni_divider_poly3*4_name', 'Beige Mode Bardesk Gate'), + ('nav_venue_hotel_kitchen/0_desc', 'Beware the flying knives!'), + ('furni_divider_silo1*8_desc', 'Neat and natty'), + ('furni_hc_btlr_name', 'Electric Butler'), + ('furni_wooden_screen*5_name', 'Gray Oriental Screen'), + ('furni_scifiport*8_name', 'Purple Sci-Fi Port'), + ('furni_carpet_standard*5_name', 'Floor Rug'), + ('trading_offers', 'offers:'), + ('furni_prizetrophy2*3_name', 'Duck trophy'), + ('transaction_system_club_habbo', 'Habbo Club payment'), + ('nav_venue_bb_lobby_tournament_9/0_desc', ''), + ('poster_517_name', 'The Scottish flag'), + ('furni_wood_tv_desc', 'For family viewing'), + ('furni_deadduck2_desc', 'Someone forgot to feed me...'), + ('furni_sound_set_20_desc', 'Musical heaven'), + ('sound_machine_new', 'Create a New Song'), + ('nav_venue_the_chromide_club/0_desc', 'Ghetto Fabulous'), + ('nav_modify_doorstatus_pwagain', 'pw again:'), + ('furni_chair_plasto*10_desc', 'Hip plastic furniture'), + ('gs_idlewarning', 'You will be replaced if you don\'t start or join a Game soon!'), + ('purse_vouchers_entercode', 'Enter code here:'), + ('sound_machine_song_name', 'Untitled Trax'), + ('furni_sofa_polyfon*4_name', 'Beige Mode Sofa'), + ('furni_carpet_standard*a_name', 'Floor Rug'), + ('poster_510_name', 'The Italian flag'), + ('furni_table_plasto_square*7_name', 'Square Dining Table'), + ('furni_noob_chair*6_desc', 'Lightweight, practical with dark yellow stripes'), + ('forgottenpw_whatyou', 'What\'s your Habbo called?'), + ('nav_venue_bb_lobby_amateur_1_name', 'Gevorderden Battle Ball 2'), + ('furni_noob_table*6_name', 'My first Habbo table'), + ('furni_pillar*0_desc', 'Classy architect, for holding up ceilings!'), + ('poster_1002_desc', 'aw, bless...'), + ('furni_divider_arm1_desc', 'Good solid wood'), + ('furni_glass_stool*8_name', 'Glass stool'), + ('furni_rare_moonrug_name', 'Moon Patch'), + ('nav_venue_rooftop_rumble/0_desc', 'Are you ready?'), + ('transaction_system_sms_sonera', 'Sonera'), + ('furni_waterbowl*5_name', 'Brown Water Bowl'), + ('furni_sound_set_32_name', 'Instrumental 2'), + ('furni_table_silo_small*4_name', 'Beige Area Occasional Table'), + ('furni_prizetrophy8*1_name', 'Duo trophy'), + ('tutorial_menu', 'Get help with...'), + ('gs_2teams', '2 Teams Game'), + ('furni_sound_machine*4_desc', 'For Funky, Funky Fridays!'), + ('furni_romantique_divan*4_desc', 'Is that a cape hanging there?'), + ('furni_couch_norja*8_desc', 'Two can perch comfortably'), + ('console_usersnotfound', 'Habbo Not Found'), + ('nav_venue_bb_lobby_amateur_2/0_desc', ''), + ('furni_sleepingbag*4_desc', 'Ultimate coziness'), + ('furni_bed_budget_one*6_desc', 'Prince sized comfort!'), + ('furni_sw_chest_desc', ''), + ('nav_venue_bb_lobby_amateur_5/0_desc', ''), + ('NUF_visiting_rooms_room_tutor', 'This is a Guest Room. You can either quit the tutorial and start meeting people, or select the next topic.'), + ('furni_jp_pillow_name', 'Pillow Chair'), + ('url_logged_out', 'http://%predefined%/account/disconnected?reason=logout&origin=popup'), + ('furni_romantique_smalltabl*1_name', 'Rose Quartz Tray Table'), + ('friend_request_declined', 'Declined!'), + ('furni_grunge_shelf_desc', 'Scrap books and photo albums'), + ('furni_gothic_stool*6_name', 'Gothic Stool Blue'), + ('wallitem_gothicfountain_desc', 'Not suitable for drinking!'), + ('furni_scifiport*1_name', 'Gold Laser Gate'), + ('furni_sound_set_41_name', 'Rock 8'), + ('furni_toilet_yell_name', 'Loo Seat'), + ('console_fr_limit_exceeded_error', 'Too many friends selected. Please remove some first.'), + ('console_asktobecomeafriend', 'Ask To Become A Friend'), + ('console_friends', 'Friends'), + ('furni_table_plasto_bigsquare*4_desc', 'Hip plastic furniture'), + ('poster_2005_desc', 'The Special Infobus Poster'), + ('furni_summer_chair*8_desc', 'Got your sun cream?'), + ('furni_s_sound_machine*2_name', 'Sound Machine Ocean'), + ('nav_ringbell', 'The door is locked. Ringing the bell, and waiting...'), + ('console_profilematch', 'Habbo Profile match -'), + ('poster_14_name', 'Fox Poster'), + ('furni_bardeskcorner_polyfon*3_desc', 'Tuck it away'), + ('furni_carpet_soft*2_name', 'Soft Wool Rug'), + ('furni_ham_name', 'Joint of Ham'), + ('nav_venue_star_lounge_name', 'Star Lounge'), + ('nav_venue_bb_lobby_beginner_desc', 'Beginner battle ball'), + ('furni_doormat_plain*3_desc', 'Available in a variety of colours'), + ('furni_habbowood_chair_desc', 'Exclusively for Directors'), + ('nav_venue_bb_lobby_beginner_3/0_desc', ''), + ('furni_CF_20_moneybag_desc', 'Worth 20 Credits'), + ('furni_edice_desc', 'What\'s your lucky number?'), + ('furni_scifirocket*9_name', 'Neptune Smoke Machine'), + ('furni_bardesk_polyfon*9_name', 'Red Bardesk'), + ('furni_glass_table*8_desc', 'Translucent beauty'), + ('NUF_mini_endtopic', 'Find out more'), + ('pending_cfh_title', 'Your old message'), + ('nav_venue_sw_arena_tournament_name', 'Playing a tournament game!'), + ('furni_arabian_bigtb_desc', 'It must be Jinn-er time!'), + ('nav_venue_bb_lobby_beginner_0/0_desc', ''), + ('furni_pillow*3_name', 'Turquoise Satin Pillow'), + ('interface_icon_help', 'Help, need help?'), + ('nav_roomnfo_hd_src', 'Search Rooms'), + ('pet.saying.generic.dog.0', 'woof..woof'), + ('furni_chair_norja*9_name', 'Red Chair'), + ('NUF_getting_room_roommatic_start_tutor', 'This is the Room-O-Matic! Green! You use this to make your room.'), + ('furni_sound_set_2_name', 'Habbo Sounds 3'), + ('nav_venue_netcafe_name', 'My Habbo Home Netcafe'), + ('purse_voucherbutton', 'Vouchers'), + ('console_console', 'Console'), + ('game_poker_changed', 'changed'), + ('transaction_system_splashplastic', 'SplashPlastic'), + ('nav_venue_sw_lobby_free_7/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('furni_sporttrack3*1_desc', 'null'), + ('buddyremove_prev', '< Previous'), + ('roomatic_chooselayout', 'Choose the layout of your room'), + ('wallitem_item_placeholder_desc', 'This furniture is downloading...'), + ('purse_note', 'NOTE : The transactions are updated at 6 am every day.'), + ('poster_34_desc', 'Habbo-punk for the never-agreeing'), + ('furni_sound_set_27_desc', 'Jingle Bells will never be the same...'), + ('game_chess_start', 'Start Over'), + ('summer_chair_7_desc', 'A green deck chair'), + ('nav_venue_bb_lobby_beginner_6_name', 'Beginners Battle Ball 7'), + ('purse_link', 'Click here to see how to get Credits.'), + ('poster_59_desc', 'Torch - it gives you some light'), + ('room_info_rate_req', 'Rate this room'), + ('furni_rare_dragonlamp*5_desc', 'Roast your chestnuts here!'), + ('furni_divider_silo3*9_desc', 'Red Area Gate'), + ('more_roomlayouts', 'Extra room layouts for Habbo Club members >>'), + ('furni_grunge_chair_desc', 'Alternative chair for alternative people'), + ('furni_bed_budget*9_desc', 'King sized comfort!'), + ('furni_christmas_sleigh_desc', 'Ready for your Xmas cheer'), + ('furni_table_plasto_4leg*8_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_tournament_5_name', 'Competitie Battle Ball 6'), + ('furni_table_norja_med*4_name', 'Urban Iced Coffee Table'), + ('instant_friend_request_header', 'Friend Request'), + ('furni_marquee*3_name', 'Aqua Marquee'), + ('furni_noob_stool*1_name', 'My first Habbo stool'), + ('furni_rare_mnstr_desc', 'Don\'t get too close...'), + ('furni_safe_silo_pb_desc', 'Totally shatter-proof!'), + ('NUF_meeting_people_user_chatfield', 'Start typing here and press \'Enter\' to chat with others.'), + ('furni_prizetrophy6*2_desc', 'Shiny silver'), + ('furni_table_plasto_bigsquare*9_name', 'Square Dining Table'), + ('club_habbo.window.title', 'Habbo Club'), + ('recycler_info_ready', 'Recycling is complete. You have made a great environmentally friendly decision. All the recycled items you receive have been made from old items which helps to save natural resources and reduce pollution.'), + ('furni_shelves_norja*5_desc', 'For nic naks and art deco books'), + ('furni_table_silo_med_name', 'Coffee Table'), + ('furni_grunge_sign_desc', 'Bought legitimately from an M1 cafe.'), + ('roomevent_type_9', 'Group Events'), + ('roomevent_type_7', 'Dating'), + ('pet.saying.generic.dog.1', 'woof woof woof!!!'), + ('roomevent_type_8', 'Jobs'), + ('pet.saying.generic.dog.2', 'wooooof!'), + ('roomevent_type_5', 'Debates & Discussion'), + ('pet.saying.generic.dog.3', 'hooooowl'), + ('roomevent_type_6', 'Grand Openings'), + ('furni_solarium_norja*2_name', 'Beige Solarium'), + ('nav_venue_bb_lobby_intermediate_3_name', 'Semi-profs Battle Ball 4'), + ('console_searchfor', 'Search:'), + ('wallitem_arabian_wndw_desc', 'Arabian days and nights'), + ('furni_queue_tile1*3_name', 'Ice Habbo Roller'), + ('furni_lamp2_armas_desc', 'Wax lyrical with some old-world charm'), + ('furni_jp_tray3_desc', 'jp_tray3'), + ('wallitem_guitar_skull_name', 'skull guitar'), + ('roomevent_type_3', 'Games'), + ('furni_romantique_divider*2_desc', 'Keeping things separated'), + ('roomatic_owner', 'Owner:'), + ('url_helpterms', 'http://%predefined%//help/68'), + ('roomevent_type_4', 'Welcoming Party Events'), + ('furni_glass_chair*6_desc', 'Translucent beauty'), + ('furni_pillar*5_name', 'Pagan Pillar'), + ('roomevent_type_1', 'Parties & Music'), + ('roomevent_type_2', 'Trading'), + ('furni_present_gen2_desc', 'What\'s inside?'), + ('ph_tickets_title', 'Tickets'), + ('furni_table_norja_med*8_desc', 'For larger gatherings'), + ('furni_sound_set_54_desc', 'Tune into Christmas'), + ('poster_61_desc', 'The Auspicious One'), + ('furni_divider_silo3_name', 'Gate (lockable)'), + ('furni_scifirocket*4_desc', 'Welcome... to planet love'), + ('furni_plant_valentinerose*1_name', 'Red Valentine\'s Rose'), + ('furni_exe_chair2_name', 'Executive Boss Chair'), + ('alert_donate_ok', 'Give away my furni'), + ('furni_bardesk_polyfon*4_desc', 'Beige Mode Bardesk'), + ('furni_pura_mdl1*5_desc', ''), + ('hubu_close', 'Sulje kioski'), + ('gs_deathmatch', 'Every Habbo for himself!'), + ('summer_chair_9_desc', 'Sunbathing, why not?'), + ('furni_barchair_silo*8_name', 'Yellow Bar Stool'), + ('console_differentmessagemodes', 'Different Messages'), + ('furni_chair_silo*5_name', 'Pink Silo Dining Chair'), + ('callhelp_explanation', 'Thanks for reporting the problem'), + ('furni_chair_plasty*1_desc', 'Hip plastic furniture'), + ('furni_bed_budget*2_desc', 'Queen sized comfort!'), + ('furni_summer_grill*2_desc', 'Plenty of shrimp on that barbie'), + ('furni_heart_desc', 'Full of love'), + ('reg_donetext', 'Soon you\'ll see the Hotel Navigator, it shows you all the rooms you can go to -the guest rooms, clubs, caf�s, swimming pools and more!'), + ('poster_523_desc', 'The flag of India'), + ('furni_one_way_door*1_name', 'Aqua One Way Gate'), + ('furni_bardeskcorner_polyfon*13_desc', 'Tuck it away'), + ('nav_venue_sw_lobby_amateur_5/0_desc', 'Astetta rankempaa lumisotaa.'), + ('furni_gothic_chair*4_desc', 'Vampires and Wizards'), + ('furni_bardesk_polyfon*6_desc', 'Blue Mode Bardesk'), + ('transaction_system_sms_sra', 'Sonera'), + ('dimmer_turn_off', 'Turn OFF'), + ('furni_fireplace_armas_desc', 'Authentic, real flame fire'), + ('furni_chair_plasty*6_name', 'Plastic Pod Chair'), + ('furni_scifidoor*6_name', 'Black Monolith'), + ('furni_summer_pool*3_desc', 'Fancy a dip?'), + ('furni_christmas_reindeer_desc', 'Prancer becomes Rudolph in a click!'), + ('furni_chair_norja_name', 'Chair'), + ('furni_barchair_silo*3_name', 'White Bar Stool'), + ('nav_venue_bb_lobby_tournament_desc', 'Play battle ball tournament!'), + ('transaction_system_bank_sampo', 'Sampo'), + ('furni_sound_set_39_name', 'Rock 7'), + ('furni_pura_mdl3*8_desc', ''), + ('console_follow_prevented', 'Your friend has prevented others from following him/her.'), + ('poster_46_name', 'Small gold star'), + ('furni_sofa_polyfon_girl_name', 'Two-seater Sofa'), + ('furni_carpet_polar*3_desc', 'Snuggle up on a Funky bear rug...'), + ('modtool_rankerror', 'You do not have the rights for this action on this user!'), + ('furni_divider_nor3*4_name', 'Urban Iced Gate'), + ('nav_venue_theatredrome_valentine/0_desc', 'Hug A Friend, Its Valentines! Home Of Ralph (Wannabe Panda In Training)'), + ('furni_one_way_door*6_name', 'Blue HC Gate'), + ('poster_7_desc', 'For emergencies only'), + ('wallitem_hc_wall_lamp_name', 'Retro Wall Lamp'), + ('poster_508_name', 'The Spanish flag'), + ('help_emergency_example', 'Example: A Habbo wants to see me on webcam.'), + ('nav_venue_bb_lobby_expert_1/0_desc', ''), + ('furni_pura_mdl1*7_desc', 'Any way you like it!'), + ('wallitem_post.it_desc', 'Pad of stickies'), + ('nav_modify_doorstatus_passwordprotected', 'Let other people move and leave furniture in the room.'), + ('queue_set.queue_full.alert', 'The queue for this room is full. Please try again later.'), + ('nav_venue_bb_lobby_beginner_8_name', 'Beginners Battle Ball 9'), + ('nav_venue_sw_arena_amateur_name(0)', 'Playing amateur game'), + ('url_figure_editor', 'http://%predefined%//profile/profile.action'), + ('furni_noob_lamp*6_desc', 'Get the light right where you want it (canary yellow)'), + ('furni_divider_nor5*5_name', 'Pink Iced Angle'), + ('nav_venue_sw_lobby_free_desc', 'Come and play. It\'s free!'), + ('furni_table_silo_small*6_desc', 'Blue Area Occasional Table'), + ('NUF_getting_items_navigator_tutor', 'You need to be in a Habbo\'s room to access the Catalogue.'), + ('furni_safe_silo*6_desc', 'Totally shatter-proof!'), + ('furni_glass_sofa*7_name', 'Green Glass Sofa'), + ('wallitem_md_can_desc', 'Enough bubbling juice for one evening'), + ('furni_rare_fan*9_desc', 'It\'ll blow you away!'), + ('furni_prizetrophy7_name', 'Pokaali'), + ('furni_noob_stool*3_name', 'My first Habbo stool'), + ('furni_glass_sofa*2_desc', 'Translucent beauty'), + ('pet_frnd_10', 'Adoring'), + ('furni_turkey_desc', 'Where\'s the cranberry sauce?'), + ('pet_frnd_11', 'Devoted'), + ('Alert_ConnectionNotReady', 'Could not connect to the server'), + ('console_search_habbo_profilematch', 'Habbo Profile match -'), + ('furni_sound_set_59_desc', 'Urban break beats'), + ('poster_21_name', 'Butterfly Cabinet'), + ('credits', 'Credits'), + ('furni_sound_set_14_name', 'Hip Hop Beats 2'), + ('NUH_hand', 'Click here to open your inventory (aka the Big Hand). Drag and drop furniture to and from here to move it.'), + ('furni_pura_mdl3*1_desc', 'Any way you like it!'), + ('nav_modify_doorstatus_pwprotected', 'Password protected:'), + ('shopping_costs', 'XX costs XX Credit(s).\\rJust click \'buy\' once, it\'ll appear shortly.'), + ('NUF_mini_meet_people', 'Meet some people'), + ('furni_divider_nor1*3_name', 'White Iced Corner'), + ('furni_bed_budget*7_name', 'Green Pura Double Bed'), + ('furni_pura_mdl5*9_desc', 'Any way you like it!'), + ('nav_venue_club_massiva/2_name', 'Dancefloor'), + ('furni_scifiport*3_desc', 'Energy beams. No trespassers!'), + ('whisper', 'Whisper'), + ('furni_chair_plasto*4_name', 'Chair'), + ('furni_hc_bkshlf_name', 'Medieval Bookcase'), + ('furni_goodie1*2_name', 'Marzipan Man'), + ('furni_rare_fountain*1_name', 'Bird Bath (grey)'), + ('bb_text_hostInfo', 'Please choose a name for your Game and select the number of Teams.'), + ('hubu_t3_1', ''), + ('hubu_t3_2', 'Hubun kiertuekalenteri 2002'), + ('furni_sound_set_34_name', 'Rock 5'), + ('furni_rare_fountain*3_desc', 'For our feathered friends'), + ('nav_venue_sw_lobby_amateur_5_name', 'Snow Slingers Lobby'), + ('furni_pura_mdl3*2_name', 'Pink Pura Module 3'), + ('furni_xmas_cstl_wall_desc', 'Solid blocks of ice and snow'), + ('furni_arabian_tray1_name', 'Mint Tea Tray'), + ('furni_jp_tray4_name', 'jp_tray4'), + ('furni_grunge_candle_desc', 'Late night debate'), + ('furni_rclr_garden_name', 'Water Garden'), + ('furni_CFC_100_coin_gold_name', 'Gold Coin (China)'), + ('nav_venue_gate_park_name', 'Imperial Park'), + ('shopping_asagift', 'Buy As A Gift'), + ('furni_soft_sofachair_norja*7_desc', 'Sit back and relax'), + ('dance', 'Dance'), + ('roomatic_wrongpw', 'Oops! Sorry, your passwords don\'t match. Please enter them again.'), + ('furni_hc_trll_desc', 'For swanky dinners only'), + ('furni_prizetrophy3*2_desc', 'Shiny silver'), + ('modtool_roomkick', 'Room Kick'), + ('roomatic_letmove', 'Let other people move your furniture and place their own. (Furniture cannot be stolen.)'), + ('roomevent_default_description', ''), + ('nav_venue_sw_lobby_free_4/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('console_invalid_message', 'There was a message from a user that was probably removed your friend list. Note, user is removed from your friend list if you report a message to moderators.'), + ('poster_503_name', 'The Swiss flag'), + ('nav_venue_sw_arena_expert_name(0)', 'Playing expert game'), + ('poster_41_desc', 'For the best music-makers'), + ('furni_tile_name', 'Floor Tiles'), + ('furni_val_randomizer_name', 'Love Randomiser'), + ('nav_modify_doorstatus_open', 'Open'), + ('furni_plant_big_cactus_desc', 'Habbo Dreams monster in hiding! Shhhh'), + ('furni_safe_silo*8_desc', 'Totally shatter-proof!'), + ('wallitem_sw_hole_name', 'sw_hole'), + ('play_preview', 'Play preview of sounds'), + ('furni_table_plasto_round*14_name', 'Occasional Table'), + ('poll_thanks_window', 'Thanks!'), + ('wallitem_habbowheel_desc', 'So you gotta ask yourself "Do I feel lucky?"'), + ('furni_carpet_standard_name', 'Floor rug'), + ('furni_divider_nor1*8_name', 'Yellow Ice corner'), + ('nav_venue_bb_lobby_tournament_3/0_desc', ''), + ('buddyremove_ok_text', 'You have chosen enough friends to remove.'), + ('nav_venue_sw_lobby_intermediate_5/0_desc', 'Lumisota sen kuin vain kovenee.'), + ('furni_divider_nor4*7_desc', 'Habbos, roll out!'), + ('furni_summer_chair*3_desc', 'Black'), + ('furni_table_plasto_bigsquare*6_desc', 'Hip plastic furniture'), + ('gs_link_highscores', 'High Scores'), + ('Alert_purchasingerror', 'Buying unsuccessful'), + ('poster_5_desc', 'Quacking good design!'), + ('help_emergency_sent', 'A member of community staff will investigate the situation and take appropriate action. This may include sending you a response with advice on dealing with your issue.'), + ('room_user_page', 'Home Page'), + ('room_badge_window_title', 'Badge'), + ('login_name', 'Name of your Habbo'), + ('furni_divider_nor2*5_name', 'Pink Iced bar desk'), + ('nav_venue_habbo_lido_ii/0_desc', 'Dive right in!'), + ('furni_sporttrack2*2_name', 'Sport corner asphalt'), + ('roommatic_modify_size', 'Room size: %tileCount% tiles'), + ('pet.saying.sniff.croco.2', '*Sighs*'), + ('furni_prize2_name', 'Silver Trophy'), + ('Now you can find out how to get more cool Furniture for your room, or select another topic.', ''), + ('pet.saying.sniff.croco.0', 'Ewwwww....'), + ('pet.saying.sniff.croco.1', '*Sniff sniff*'), + ('furni_pura_mdl3*6_name', 'Blue Pura Module 3'), + ('poster_48_desc', 'All that glitters...'), + ('furni_wcandle_desc', 'Xmas tea light'), + ('nav_venue_bb_arena_3_name', 'Battle Ball Keskitaso'), + ('sound_machine_confirm_save_long', 'Are you sure you want to overwrite the current saved song?'), + ('purse_vouchers_helpurl', 'http://%predefined%/help/4'), + ('nav_venue_bouncer_room_2_name', 'Gevorderden Battle Ball Arena'), + ('furni_sand_cstl_gate_desc', 'sand_cstl_gate desc'), + ('furni_barrier*1_name', 'Yellow Maze Barrier'), + ('nav_venue_bb_lobby_tournament_0_name', 'Tournament'), + ('NUF_getting_room_roommatic_layout_tutor', 'Select what you want your room to look like. Use the arrows to cycle through different room layouts. Almost there, almost there...'), + ('poll_confirm_cancel', 'Stop answering?'), + ('furni_carpet_soft*4_desc', 'Soft Wool Rug'), + ('furni_rare_icecream_campaign_desc', 'Basic model'), + ('club_habbo.bottombar.text.notmember', 'Habbo Club'), + ('recycler_info_closed', 'Recycler is closed at the moment. Please check back later to recycle your Furniture.'), + ('furni_solarium_norja*8_desc', 'Rejuvenate your pixels!'), + ('callhelp_example', 'Example: How do I move my Furni?'), + ('furni_bed_budget_one*4_name', 'White Pura Bed'), + ('roomatic_givepwd', 'Password:'), + ('furni_teleport_door_name', 'Teleport Door'), + ('furni_table_silo_small*9_name', 'Red Area Occasional Table'), + ('furni_noob_chair*4_name', 'My first Habbo chair'), + ('furni_table_plasto_square*2_desc', 'Hip plastic furniture'), + ('room_waiting', 'Waiting to go in...'), + ('furni_sink_desc', 'Hot and cold thrown in for no charge'), + ('furni_doormat_plain_name', 'Doormat'), + ('nav_venue_eric\'s_eaterie_name', 'Eric\'s Eaterie'), + ('nav_venue_pizzeria_name', 'Slice of Life'), + ('poster_1004_desc', 'Celebrate with us'), + ('next', 'Next'), + ('furni_solarium_norja*9_name', 'Red Solarium'), + ('tutorial_quit_confirmation', 'You want to leave? Well I hope you learned something... something useful!'), + ('furni_val_teddy*2_desc', 'The pink bear of passion'), + ('poster_1003_name', 'UK Map'), + ('furni_glass_table*2_name', 'Glass table'), + ('NUF_habbo_home_url', 'http://d15-1.web.varoke.net/home/home-tutorial'), + ('furni_bed_silo_one_name', 'Single Bed'), + ('transaction_system_sms_win_btcellnet', 'O2 SMS'), + ('pet.hotwords.go_away', 'go away'), + ('furni_table_plasto_square*9_desc', 'Hip plastic furniture'), + ('furni_doormat_plain*4_name', 'Doormat'), + ('nav_venue_cunning_fox_gamehall_name', 'Cunning Fox Gamehall'), + ('furni_sound_machine*2_name', 'Ocean Traxmachine'), + ('furni_table_polyfon_name', 'Large Coffee Table'), + ('furni_hc_frplc_desc', 'Pixel-powered for maximum heating'), + ('console_request_massoperation_instruction', 'Use the options below to accept or decline ALL friend requests you have waiting.'), + ('nav_venue_bb_lobby_tournament_6/0_desc', ''), + ('furni_table_plasto_round*6_desc', 'Hip plastic furniture'), + ('trading_cancel', 'Cancel Trading'), + ('furni_glass_stool*3_name', 'Glass stool'), + ('furni_plant_mazegate_snow_name', 'Snowy Maze Gate'), + ('nav_venue_tv_studio_name', 'MuchMusic HQ'), + ('furni_table_norja_med*3_desc', 'For larger gatherings'), + ('furni_chair_plasty*8_desc', 'Hip plastic furniture'), + ('furni_bed_polyfon_name', 'Double Bed'), + ('gs_4teams', '4 Team Game'), + ('furni_sound_set_8_desc', 'Mellow electric grooves'), + ('ph_keys_jump', 'Jump:'), + ('reg_welcome', 'Welcome To Habbo Hotel!'), + ('purse_head', 'HABBO ACCOUNT ACTIVITY'), + ('nav_venue_bb_lobby_tournament_7_name', 'Competitie Battle Ball 8'), + ('reg_verification_newPasswordAgain', 'Retype new password:'), + ('furni_bardeskcorner_polyfon*8_desc', 'Yellow Mode Bardesk Corner'), + ('furni_sound_set_21_name', 'Rock 1'), + ('furni_gothic_stool*1_desc', 'The dark side of Habbo'), + ('furni_rope_divider_name', 'Rope Divider'), + ('poster_53_name', 'Hockey Stick'), + ('roomevent_default_desc', 'Event description..'), + ('nav_refresh_recoms', 'Refresh recommendations'), + ('nav_venue_sw_lobby_beginner_2_name', 'Snow Rookies Lobby'), + ('furni_divider_silo3*4_desc', 'Beige Area Gate'), + ('furni_divider_poly3*6_name', 'Blue Mode Bardesk Gate'), + ('reg_parentemail_title', 'Informing your parents'), + ('furni_gothgate_name', 'Gothic Portcullis'), + ('furni_mocchamaster_name', 'Mochamaster'), + ('modtool_message', 'Message:'), + ('furni_tree4_desc', 'Any presents under it yet?'), + ('furni_marquee*a_name', 'White Marquee'), + ('furni_queue_tile1*5_name', 'Knight Roller'), + ('furni_chair_polyfon_name', 'Dining Chair'), + ('furni_sleepingbag*9_name', 'Blue Sleeping Bag'), + ('furni_sound_set_9_name', 'Electronic 2'), + ('poster_39_desc', 'The rock masters of virtual music'), + ('furni_arabian_tetbl_desc', 'Serve up a treat'), + ('nav_venue_sw_lobby_free_9_name', 'Free Game Lobby'), + ('nav_venue_sw_arena_free_name(0)', 'Playing free for all game'), + ('furni_grand_piano*4_desc', 'Why is that key green?'), + ('furni_doorD_desc', 'Let\'s go over tzar!'), + ('purse_date', 'DATE'), + ('nav_venue_sw_lobby_beginner_6/0_desc', ''), + ('nav_venue_sw_lobby_beginner_4/0_desc', ''), + ('nav_venue_sw_lobby_intermediate_1_name', 'Snow Bombardiers Lobby'), + ('alert_reg_age', 'You are under 11 years old. Children under 11 can\'t enter Habbo Hotel.'), + ('nav_venue_bb_lobby_intermediate_9/0_desc', ''), + ('queue_set.c.alert', 'This room is for Habbo Club members only. In order to enter, you need to subscribe to Habbo Club.'), + ('sound_machine_confirm_clear_long', 'Are you sure you want to clear the current song?'), + ('furni_exe_drinks_name', 'Executive Drinks Tray'), + ('reg_bday_note', 'Please enter your correct date of birth, this is important! You\'ll need this information later on, if you want to change your password or e-mail.'), + ('modtool_roomalert', 'Room Alert'), + ('furni_rare_parasol*1_name', 'Yellow Parasol'), + ('furni_sound_set_18_name', 'Groove 4'), + ('sound_machine_window', 'Sound Machine Editor'), + ('furni_traffic_light*1_name', 'Classic Traffic Light'), + ('furni_chair_norja*4_desc', 'Sleek and chic for each cheek'), + ('furni_divider_nor1*2_desc', 'Black Ice corner'), + ('nav_venue_median_lobby_name', 'Median Lobby'), + ('furni_sofa_silo*3_desc', 'Cushioned, understated comfort'), + ('furni_bed_budget_desc', 'Comfortable, affordable!'), + ('furni_divider_nor4_name', 'Plain Iced Auto Shutter'), + ('furni_rare_icecream*6_desc', 'Virtual toffee rocks!'), + ('habboclub_txt1', 'You can buy Habbo Club one month at a time using Habbo Credits.'), + ('habboclub_txt3', 'Yes, I\'m over 14 years of age\\rOR\\rI\'m under 14 years of age and I have a permission from my parent/guardian to join Habbo Club.'), + ('furni_rare_dragonlamp*3_desc', 'Scary and scorching!'), + ('furni_noob_lamp*5_name', 'My first Habbo lamp'), + ('club_bottombar_text2', '(....)'), + ('furni_CFC_500_goldbar_name', 'Gold Bar (China)'), + ('club_bottombar_text1', 'Loading'), + ('furni_rare_elephant_statue*1_desc', 'Say hello to Nelly'), + ('furni_table_silo_med*7_name', 'Green Area Coffee Table'), + ('nav_venue_sw_lobby_free_1/0_desc', ''), + ('furni_bottle_desc', 'For interesting games!'), + ('furni_romantique_pianochair*2_desc', 'Let the music begin'), + ('furni_table_norja_med*2_name', 'Large Coffee Table Black'), + ('queue_set.e2.alert', 'This room is currently available only to Habbos participating to the event.'), + ('furni_solarium_norja_desc', 'Rejuvenate your pixels!'), + ('furni_table_plasto_square*14_desc', 'Hip plastic furniture'), + ('cam_save.help', 'Save & Print Photo'), + ('furni_sound_set_4_desc', 'Chilled out beats'), + ('furni_couch_norja*6_name', 'Blue Bench'), + ('poster_2003_desc', 'Would you trust this man?'), + ('hobba_cryforhelp', 'Call For Help:'), + ('furni_marquee*9_desc', 'It\'s both door and a shade!'), + ('nav_venue_bb_lobby_tournament_13/0_desc', ''), + ('poster_512_desc', 'The flag of Ireland'), + ('handitem12', 'Macchiato'), + ('object_displayer_hide_actions', 'Hide actions'), + ('furni_sound_set_25_name', 'Dance 1'), + ('handitem11', 'Mocha'), + ('handitem10', 'Latte'), + ('furni_sound_set_13_desc', 'Let Music be the food of Habbo'), + ('handitem16', 'Cappuccino'), + ('handitem15', 'Iced'), + ('handitem14', 'Filter'), + ('handitem13', 'Espresso'), + ('nav_venue_sw_lobby_free_2_name', 'Free Game Lobby'), + ('handitem19', 'Habbo Cola'), + ('nav_venue_sw_lobby_amateur_2/0_desc', ''), + ('handitem18', 'Tap'), + ('handitem17', 'Java'), + ('console_next_msg', 'Delete'), + ('furni_bardesk_polyfon*5_name', 'Candy Bar'), + ('furni_scifidoor*5_desc', 'There out of this world!'), + ('nav_roomispwprotected', 'The room is password protected.'), + ('furni_sleepingbag*2_name', 'Lime Sleeping Bag'), + ('furni_glass_table*6_name', 'Blue Glass Table'), + ('furni_divider_nor4*3_desc', 'Habbos, roll out!'), + ('furni_sound_set_61_name', 'Latin Love 3'), + ('nav_venue_pizza/0_desc', 'Pizza Palace'), + ('furni_romantique_clock_desc', ''), + ('furni_queue_tile1*0_desc', 'The power of movement'), + ('furni_pura_mdl2*9_desc', 'Any way you like it!'), + ('nav_venue_orient/0_name', 'Club Golden Dragon'), + ('furni_noob_table*1_desc', 'Lightweight, practical and orange'), + ('poster_22_desc', 'beautiful reproduction butterfly'), + ('furni_carpet_soft_name', 'Soft Wool Rug'), + ('Message', 'Message'), + ('furni_bed_trad_one_desc', 'All you need for a good night\'s kip'), + ('console_report_help', 'If the message you received was abusive or harassing, you can report it to the Moderators by clicking the Report button below. The Habbo will be removed from your Friends\' List automatically when you report. If you want to remove a Habbo from your Friends\' List without reporting their message, simply use the Remove button below.'), + ('furni_rcandle_desc', 'Xmas tea light'), + ('furni_sofa_silo*8_name', 'Yellow Two-Seater Sofa'), + ('furni_pura_mdl4*5_desc', ''), + ('NUF_mini_use_console_ready_tutor', 'You can now use the Console to find some of your friends, or you can continue the tutorial.'), + ('log_problem_link', 'Read FAQ\'s'), + ('furni_shelves_silo_name', 'Bookcase'), + ('gs_timetojoin', '\\x seconds to join'), + ('nav_venue_cunning_fox_gamehall/1_name', 'Gamehall Lobby'), + ('furni_safe_silo*7_name', 'Green Safe Minibar'), + ('NUF_mini_meet_people_hotelview_tutor', 'The Navigator lets you move between rooms in the Hotel. Open it up to get started!'), + ('purse_vouchers_sendbutton', 'Get Credits!'), + ('furni_gothic_sofa*4_name', 'Black Gothic Sofa'), + ('furni_wooden_screen*0_desc', 'Add an exotic touch to your room'), + ('catalog_give_trophymsg', 'You haven\'t engraved the trophy. Type \\ryour inscription in the grey box.'), + ('furni_prizetrophy5*3_name', 'Duo trophy'), + ('handitem23', 'Beetroot Habbo Soda'), + ('furni_rare_dragonlamp*8_name', 'Bronze Dragon Lamp'), + ('furni_divider_nor4*8_name', 'Yellow Iced Auto Shutter'), + ('handitem22', 'Lime Habbo Soda'), + ('furni_soft_sofa_norja*6_name', 'Blue Iced Sofa'), + ('handitem21', 'Hamburger'), + ('handitem20', 'Camera'), + ('furni_divider_nor1*9_desc', 'Red Ice corner'), + ('help_trouble', 'In Trouble?'), + ('handitem25', 'Love potion'), + ('handitem24', 'Bubble juice from 1999'), + ('furni_ham2_desc', 'Looks like you\'re too late!'), + ('nav_venue_bb_lobby_amateur_3_name', 'Gevorderden Battle Ball 4'), + ('furni_chair_plasto*15_name', 'Chair'), + ('furni_hyacinth1_desc', 'Beautiful bulb'), + ('furni_shelves_basic_desc', 'Pura series 404 shelves'), + ('furni_pura_mdl1*6_name', 'Blue Pura Module 1'), + ('nav_venue_cafe_gold/0_desc', 'Get the latest safety tips and tricks from Safety eXperts.'), + ('nav_venue_snowwar_lobby_name', 'Snow Storm Lobby'), + ('transaction_system_sms_slahti', 'Saunalahti'), + ('alert_tooLongPW', 'Your password is too long'), + ('furni_carpet_standard*5_desc', 'Available in a variety of colours'), + ('furni_deadduck_desc', 'Blood, but no guts'), + ('password.email.subject', 'Forgotten password'), + ('furni_prizetrophy2*3_desc', 'Breathtaking bronze'), + ('NUF_playing_games_hotelview_nav', 'Just click me to open the Navigator and get it over with...'), + ('furni_summer_chair*1_name', 'Aqua Deck Chair'), + ('furni_rubberchair*3_name', 'Orange Inflatable Chair'), + ('furni_exe_plant_desc', ''), + ('nav_venue_tearoom/0_desc', 'Chat with the people of Aoralia and meet a sprite or two!'), + ('nav_venue_sw_lobby_beginner_9/0_desc', ''), + ('furni_table_silo_med*6_name', 'Blue Area Coffee Table'), + ('nav_venue_sw_lobby_beginner_1/0_desc', ''), + ('furni_noob_stool*2_desc', 'Unfold me and take the weight off (dark blue)'), + ('camera_dialog_place', 'Move'), + ('furni_scifiport*8_desc', 'Energy beams. No trespassers!'), + ('url_peeloscore', 'http://%predefined%///groups/56555/id'), + ('console_follow_friend', 'Go to same room'), + ('sound_machine_alert_jukebox_list_full', 'The play list is full. Please wait until the current song has finished playing and try again.'), + ('poster_517_desc', 'Where\'s your kilt?'), + ('roomevent_type_11', 'Helpdesk'), + ('roomevent_type_10', 'Performance'), + ('furni_rare_dragonlamp*9_desc', 'Scary and scorching!'), + ('furni_pura_mdl2*3_name', 'Black Pura Module 2'), + ('url_help_1', 'http://%predefined%//credits'), + ('furni_edicehc_name', 'Dicemaster'), + ('furni_divider_silo1*8_name', 'Yellow Corner Shelf'), + ('furni_wooden_screen*5_desc', 'Add an exotic touch to your room'), + ('url_help_5', 'http://%predefined%/help/75'), + ('roomatic_intro2', 'Here\'s what one Habbo says about her room:'), + ('url_help_4', 'http://%predefined%//help/22'), + ('roomatic_intro1', 'You can decorate and furnish your room however you like and no one can tell you to tidy up or turn the music down. It\'s up to you if you let everyone in or just a chosen few, or lock the door and chill by yourself. Get creating and in a couple of minutes you\'ll have your own Habbo Hotel space.'), + ('url_help_3', 'http://%predefined%//help/'), + ('roomatic_intro3', 'My mates live miles away, but we can meet up in my room every Friday night and we don\'t have to worry about getting home afterwards.'), + ('url_help_2', 'http://%predefined%//profile?tab=4'), + ('furni_romantique_chair*5_name', 'Onyx Chair'), + ('url_help_6', 'http://www.habbohotel.co.uk/iot/go?lang=en&country=uk'), + ('furni_sound_set_20_name', 'SFX 2'), + ('furni_sofa_polyfon*4_desc', 'Beige Mode Sofa'), + ('sound_machine_alert_no_more_songs', 'Can\'t create new song! Traxmachine can have only %count% songs.'), + ('search', 'Search'), + ('room_preparing', '...Preparing room'), + ('nav_venue_bb_lobby_intermediate_0/0_desc', ''), + ('club_txt_renew2', 'You are Habbo Club member. If you want to change your subscription or leave the club, use the link below.'), + ('poster_1002_name', 'Queen Mum Poster'), + ('furni_barchair_silo*2_desc', 'Practical and convenient'), + ('reg_month', 'Month'), + ('club_txt_renew1', 'Your Habbo Club membership will be active for another %days% days. You can extend your membership by paying with Habbo Credits.'), + ('furni_rare_icecream*0_name', 'Cherry Ice Cream Machine'), + ('furni_sound_set_41_desc', 'Burning Riffs'), + ('nav_venue_beauty_salon_loreal_name', 'Beauty salon'), + ('poster_26_name', 'Angel Poster'), + ('furni_sound_set_19_name', 'Hip Hop Beats 4'), + ('furni_romantique_divan*4_name', 'Amber Chaise-Longue'), + ('furni_one_way_door*7_desc', 'One at a time!'), + ('sound_machine_confirm_eject_long', 'Are you sure you want to remove the Traxpack and it\'s samples from the song?'), + ('furni_glass_stool*8_desc', 'Translucent beauty'), + ('buddyremove_not_now', 'Cancel'), + ('no_user_for_gift', 'No user named %user% found. Gift not purchased.'), + ('buddyremove_lessoptions', 'Less Options <<'), + ('reg_legal_header1', 'Now you need to ask your parents/guardian to come to the computer. Read through the text (below) with your parents.'), + ('furni_carpet_soft*3_desc', 'Soft Wool Rug'), + ('reg_legal_header2', 'Read through the below text carefully. You must agree to the following terms before entering Habbo Hotel.'), + ('furni_sw_chest_name', 'sw_chest'), + ('nav_venue_sw_lobby_tournament_9_name', 'Tournament Lobby'), + ('messenger.email.footer', ''), + ('nav_venue_bb_arena_4_name', 'Battle Ball Expertit'), + ('club_change_url', 'http://%predefined%//credits/habboclub'), + ('furni_table_plasto_4leg*2_name', 'Occasional Table'), + ('ph_choosecolour', 'Choose Costume Colour'), + ('buddyremove_hc_more_info', 'More Info About Habbo Club >>'), + ('furni_romantique_smalltabl*1_desc', 'Every tray needs a table...'), + ('nav_venue_sw_lobby_tournament_8_name', 'Tournament Lobby'), + ('furni_divider_nor5_name', 'Plain Iced Angle'), + ('wallitem_roomdimmer_name', 'Mood Light'), + ('furni_bed_budget_one*5_name', 'Beige Pura Bed'), + ('furni_table_norja_med*9_name', 'Large Coffee Table Red'), + ('furni_pillow*3_desc', 'Puffy, soft and huge'), + ('furni_noob_rug*2_name', 'My first Habbo rug'), + ('nav_venue_sw_lobby_beginner_7_name', 'Snow Rookies Lobby'), + ('furni_exe_chair_desc', 'Relaxing leather comfort'), + ('furni_s_sound_machine*2_desc', 'Sound Machine Ocean Desc'), + ('nav_venue_dusty_lounge/0_desc', 'A dignified lounge for sitting back and enjoying a licorice pipe'), + ('game_bs_ship4', 'Destroyer(s)'), + ('game_bs_ship3', 'Cruiser(s)'), + ('game_bs_ship2', 'Battle Ship(s)'), + ('game_bs_ship1', 'An aircraft carrier'), + ('furni_table_plasto_bigsquare*4_name', 'Square Dining Table'), + ('openhrs_title', 'We are closing the hotel'), + ('furni_habbowood_chair_name', 'Director\'s Chair'), + ('roomatic_confirm', 'Confirm password:'), + ('poster_14_desc', 'A cunning painting'), + ('furni_doormat_plain*3_name', 'Doormat'), + ('furni_sound_set_3_desc', 'Chilled grooves'), + ('win_messenger', 'Habbo Console'), + ('summer_chair_7_name', 'Green Deck Chair'), + ('notickets_window_header', 'Tickets needed!'), + ('nav_updatenote', 'Updating your room properties may take a while. The changes have been made, but it\'ll take a few minutes until all Habbos can see them.'), + ('furni_table_plasto_bigsquare*5_name', 'Square Dining Table'), + ('url_purselink', 'http://%predefined%//credits?'), + ('console_follow_hotelview', 'Your friend is on the hotel view.'), + ('furni_solarium_norja*3_desc', 'Get the city look!'), + ('sound_machine_alert_song_name_missing', 'Please give your song a name.'), + ('furni_sound_machine*3_name', 'Green Traxmachine'), + ('jukebox_next_up', 'Next up:'), + ('trading_additems', 'Put items in boxes'), + ('furni_sporttrack3*1_name', 'Sport goal tartan'), + ('club_button_3_period', 'Buy 6 >>>'), + ('nav_delroom3', 'Room deleted!'), + ('nav_delroom2', 'Are you sure you want to delete this room? All the furniture left in it will also be deleted.'), + ('poster_34_name', 'Scamme\'d'), + ('go', 'Go >>'), + ('nav_delroom1', 'If you want to save the furniture in this room, move it to the giant hand before you continue.'), + ('console_habboprofile_arrowed', 'Habbo Profile >>'), + ('furni_chair_plasty*10_desc', 'Hip plastic furniture'), + ('cam_txtscreen.help', 'Caption'), + ('wallitem_item_placeholder_name', 'This furniture is downloading...'), + ('furni_carpet_standard*b_desc', 'Available in a variety of colours'), + ('poster_59_name', 'Torch'), + ('furni_chair_basic*4_name', 'White Pura Egg Chair'), + ('summer_chair_1_name', 'Aquamarine Deck Chair'), + ('nav_venue_space_cafe_name', 'Ten Forward'), + ('log_problem_url', 'http://%predefined%//help/faqs?faq_1_categoryId=14'), + ('group_homepage_url', 'http://%predefined%/groups/%groupid%/id'), + ('furni_heart_name', 'Giant Heart'), + ('nav_venue_sw_arena_beginner_name', 'Playing beginner game'), + ('furni_grunge_chair_name', 'Grunge Chair'), + ('nav_dooropens', 'Door opens! Go on in...'), + ('modtool_banuser', 'Ban User'), + ('furni_carpet_soft_tut_desc', 'Welcome, enjoy your stay!'), + ('furni_rare_mnstr_name', 'Venomus Habbolus'), + ('furni_divider_silo3*9_name', 'Red Area Gate'), + ('furni_pura_mdl3*1_name', 'Aqua Pura Module 3'), + ('Messages', 'Message(s)'), + ('wallitem_arabian_wndw_name', 'Arabian Window Frame'), + ('furni_prizetrophy3*1_desc', 'Glittery gold'), + ('furni_sound_set_47_desc', 'Storm the UKCharts!'), + ('poster_54_desc', 'whack that ball!'), + ('url_logout_concurrent', 'http://%predefined%//account/disconnected?reason=concurrentlogin&origin=popup'), + ('nav_venue_sw_lobby_beginner_1_name', 'Snow Rookies Lobby'), + ('furni_table_plasto_4leg*8_name', 'Occasional Table'), + ('sound_machine_turn_on', 'Switch On'), + ('furni_table_norja_med*4_desc', 'For larger gatherings'), + ('buddyremove_hc_info_url', 'http://www.habbo.co.uk/credits/habboclub'), + ('furni_romantique_divider*2_name', 'Green Screen'), + ('furni_pillar*5_desc', 'Find your natural roots'), + ('furni_table_silo_med_desc', 'Wipe clean and unobtrusive'), + ('furni_pillow*8_name', 'Navy Cord Pillow'), + ('room_owner', 'Owner:'), + ('furni_shelves_norja*5_name', 'Pink Bookcase'), + ('queue_set.d.info', 'There are %d% Habbos in front of you in the queue.'), + ('reg_retypepass', 'Retype Password:'), + ('furni_jp_tray3_name', 'jp_tray3'), + ('dance_stop', 'Stop Dancing'), + ('buddyremove_remove_text', 'You are about to remove %removeamount% friends from your friendlist.\\r\\r After removal, you\'ll have %amountleft% friends on your list:'), + ('nav_venue_bb_lobby_tournament_12_name', 'Competitie Battle Ball 13'), + ('furni_summer_chair*2_name', 'Deck Chair'), + ('furni_plant_valentinerose*1_desc', 'Secret admirer!'), + ('furni_sofachair_silo*4_name', 'Beige Area Armchair'), + ('poster_523_name', 'The flag of India'), + ('furni_scifirocket*4_name', 'Venus Smoke Machine'), + ('nav_venue_tearoom_name', 'Chinese Tea Room'), + ('furni_pura_mdl1*5_name', 'beige pura module 1'), + ('nav_venue_bb_lobby_tournament_0/0_desc', ''), + ('furni_chair_silo*5_desc', 'Pink Silo Dining Chair'), + ('club_txt_expired', 'Your Habbo Club membership has run out. You can join the club again by clicking the HC logo on the hotel view.\\rMembers of Habbo Club get priority access to the hotel (so you can always get in), exclusive clothes, hair colours, rare furni and special guest room layouts. To see exactly what you\'ll be able to get your hands on as a Habbo Club member, take a look in the Catalogue.'), + ('furni_glass_table*7_name', 'Green Glass Table'), + ('nav_prvrooms_notfound', 'Your search did not match any rooms'), + ('bb_title_BBscores2', 'Game over!'), + ('wallitem_gothicfountain_name', 'Gothic Ectoplasm Fountain'), + ('furni_one_way_door*1_desc', 'One at a time!'), + ('furni_chair_plasty*1_name', 'Plastic Pod Chair'), + ('furni_divider_nor3*9_name', 'Red Iced gate'), + ('sound_machine_time_2', '%min%:%sec%min'), + ('sound_machine_time_1', '%min%:%sec%min'), + ('furni_bardesk_polyfon*4_name', 'Beige Mode Bardesk'), + ('queue_set.queue_reset.alert', 'The queue for this room has been reset, please try again.'), + ('furni_jp_pillow_desc', 'Comfy and classical'), + ('nav_venue_sw_lobby_free_9/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('furni_barchair_silo*8_desc', 'Practical and convenient'), + ('delete_furniture', 'Delete Furniture (permanently)'), + ('furni_plant_bulrush_desc', 'Ideal for the riverside'), + ('poster_61_name', 'Siva Poster'), + ('furni_bed_silo_two_name', 'Double Bed'), + ('furni_plant_pineapple_desc', 'Needs loving glances'), + ('furni_bed_polyfon_girl_desc', 'Snuggle down in princess pink'), + ('furni_pillow*4_desc', 'Puffy, soft and huge'), + ('furni_table_norja_med*8_name', 'Large Coffee Table Yellow'), + ('transaction_system_tsms_win_tmobile', 'T-Mobile SMS'), + ('furni_scifidoor*10_desc', 'There out of this world!'), + ('furni_bed_polyfon*7_desc', 'Green Mode Double Bed'), + ('furni_toy1*2_desc', 'it\'s bouncy-tastic'), + ('transaction_system_sms_radiolinja', 'Elisa'), + ('furni_gothic_chair*4_name', 'Black Gothic Chair'), + ('furni_scifidoor*6_desc', 'Monolith goes up! Monolith goes down!'), + ('nav_venue_sw_lobby_free_3_name', 'Free Game Lobby'), + ('console_friend_request_not_found', 'There was an error finding the user for the friend request'), + ('furni_romantique_smalltabl*2_desc', 'Every tray needs a table...'), + ('furni_bed_budget*2_name', 'Pink Pura Double Bed'), + ('wallitem_post.it_name', 'Pad of stickies'), + ('gs_state_created', 'Waiting for players..'), + ('furni_divider_nor3*4_desc', 'Entrance or exit?'), + ('furni_sofa_polyfon_girl_desc', 'Romantic pink for two'), + ('locked', 'Locked (visitors have to ring bell)'), + ('alert_reg_birthday', 'Birthday'), + ('club_thanks_text', 'Here you can see your Habbo Club membership status, number of elapsed months, pre-ordered months and status of the ongoing month.'), + ('furni_sound_set_39_desc', 'Rock with a roll'), + ('nav_venue_old_skool/0_desc', 'A set of rooms inspired by the original and legendary Mobiles Disco, the progenitor of Habbo'), + ('poster_511_desc', 'The flag of The Netherlands'), + ('furni_couch_norja*7_name', 'Rural Iced Bench'), + ('furni_safe_silo*6_name', 'Blue Safe Minibar'), + ('furni_table_plasto_4leg*14_desc', 'Aqua table'), + ('room_sound_furni_limit', 'You can only place one sound furni per room'), + ('nav_venue_bb_lobby_beginner_15/0_desc', ''), + ('furni_glass_shelf_name', 'Glass shelf'), + ('furni_divider_nor2*6_desc', 'Blue Iced bar desk'), + ('furni_turkey_name', 'Roast Turkey'), + ('nav_venue_bb_lobby_tournament_16/0_desc', ''), + ('sw_timeleft', 'Time:'), + ('furni_rare_parasol_name', 'Parasol'), + ('furni_glass_sofa*7_desc', 'Habbo Club'), + ('furni_bardeskcorner_polyfon*13_name', 'Corner Cabinet/Desk'), + ('furni_rare_fan*9_name', 'Fucsia Powered Fan'), + ('furni_chair_plasto*4_desc', 'Hip plastic furniture'), + ('no', 'No'), + ('furni_rare_fan*4_desc', 'Fanning the fires of SUPERLOVE...'), + ('nav_venue_median_lobby/0_desc', 'A Mean place to hang'), + ('nav_venue_sw_lobby_intermediate_2/0_desc', ''), + ('furni_md_sofa_name', 'MD Sofa'), + ('furni_noob_lamp*1_desc', 'Get the light right where you want it (yellow)'), + ('login_connecting', 'Connecting...'), + ('furni_divider_nor1*3_desc', 'Looks squishy, but isn\'t!'), + ('furni_sound_set_14_desc', 'Rock them bodies'), + ('furni_sound_set_59_name', 'RnB Grooves 5'), + ('poster_21_desc', 'beautiful reproduction butterfly'), + ('wallitem_hc_wall_lamp_desc', 'Tres chic!'), + ('ok', 'OK'), + ('nav_venue_sw_lobby_tournament_1/0_desc', ''), + ('pet_happy', 'Happiness:'), + ('sound_machine_edit', 'Edit Song'), + ('furni_rare_elephant_statue*2_desc', 'Say hello to Nelly'), + ('furni_CFC_200_moneybag_desc', 'Worth 200 Credits'), + ('nav_venue_bb_lobby_intermediate_6/0_desc', ''), + ('console_buddylimit_requester', 'Friend could not be added. The request sender can not have anymore friends.'), + ('furni_sofa_silo*2_desc', 'Cushioned, understated comfort'), + ('sound_machine_alert_invalid_song_name', 'You have already burned another song with the same name. Please change the song name before trying again.'), + ('furni_fireplace_armas_name', 'Fireplace'), + ('furni_barchair_silo*3_desc', 'Practical and convenient'), + ('ph_ticket', 'Ticket'), + ('furni_arabian_divdr_desc', 'Carved Cedar Divider'), + ('wallitem_jp_ninjastars_desc', 'Not a frisbee'), + ('wallitem_hrella_poster_1_desc', 'Brighten up your cabin'), + ('furni_noob_stool*3_desc', 'Unfold me and take the weight off (aubergine)'), + ('furni_pura_mdl5*9_name', 'Red Pura Module 5'), + ('furni_divider_nor4*2_desc', 'Habbos, roll out!'), + ('NUF_mini_meet_people_roomlist_tutor', 'Click \'Open\' to open up a category and see what rooms are within. When you have found an interesting room, press \'Go\' to visit it.'), + ('poster_41_name', 'Habbo Golden Record'), + ('furni_jp_tray4_desc', 'jp_tray4'), + ('buddyremove_confirm', 'Yeah, it is done...'), + ('tutorial_topic_list_F', 'Choose a topic from the list below:'), + ('purse_time', 'TIME'), + ('nav_venue_sw_lobby_free_8_name', 'Free Game Lobby'), + ('tutorial_topic_list_M', 'Choose a topic from the list below:'), + ('furni_s_sound_machine*7_name', 'Sound Machine Red'), + ('interface_icon_navigator', 'Navigator, navigate around'), + ('furni_xmas_cstl_wall_name', 'Ice Castle Wall'), + ('nav_own_hd', 'Your Rooms.'), + ('modtool_aa_checkbox_text', 'Audio alert'), + ('wallitem_industrialfan_desc', 'Powerful and resilient'), + ('furni_bed_budget*8_desc', 'King sized comfort!'), + ('sound_machine_burn', 'Burn Song'), + ('nav_venue_sw_lobby_intermediate_0_name', 'Snow Bombardiers Lobby'), + ('nav_venue_bb_lobby_beginner_1_name', 'Beginners Battle Ball 2'), + ('furni_chair_basic*5_desc', ''), + ('password.email.prefix', 'Your password is:'), + ('furni_pura_mdl5*4_desc', 'Any way you like it!'), + ('furni_table_norja_med*3_name', 'White Iced Table'), + ('furni_pura_mdl3*2_desc', 'Any way you like it!'), + ('nav_venue_sw_lobby_tournament_3_name', 'Tournament Lobby'), + ('furni_sound_set_34_desc', 'For guitar heroes'), + ('furni_summer_grill*1_desc', 'Plenty of ribs on that barbie'), + ('hubu_t4_1', 'Anna palautetta Hubusta'), + ('furni_divider_nor1*8_desc', 'Yellow Ice corner'), + ('hubu_t4_2', 'Tsekkaa heebelin jorinat'), + ('poll_offer_title', 'Poll'), + ('summer_chair_2_desc', 'Leave your towel early'), + ('wallitem_habbowheel_name', 'The Wheel of Destiny!'), + ('reg_mission', 'Your Mission:'), + ('furni_sofa_polyfon*9_name', 'Red Two-seater Sofa'), + ('furni_bed_budget_one_desc', 'aquamarine'), + ('nav_venue_sw_lobby_tournament_7/0_desc', ''), + ('furni_gothic_sofa*3_name', 'Gothic Sofa Red'), + ('furni_chair_plasto*9_name', 'Chair'), + ('nav_venue_sw_arena_beginner_name(0)', 'Playing beginner game'), + ('notickets_text_2', 'Buy more tickets now and get a discount. You can also buy tickets as a present.'), + ('wallitem_sw_hole_desc', 'sw_hole'), + ('furni_plant_big_cactus_name', 'Mature Cactus'), + ('notickets_text_1', 'Game price is 1 credit. For that you get 2 tickets.'), + ('poster_19_name', 'Hole In The Wall'), + ('furni_divider_nor4*7_name', 'Rural Iced Shutter'), + ('email', ''), + ('furni_sound_set_13_name', 'Dance 5'), + ('furni_present_gen1_name', 'Gift'), + ('nav_venue_bb_lobby_tournament_19/0_desc', ''), + ('furni_chair_norja_desc', 'Sleek and chic for each cheek'), + ('furni_marquee*9_name', 'Green Marquee'), + ('sound_machine_alert_song_locked', 'The song you\'re editing can\'t be modified. Please save the song under another name to create a new copy.'), + ('furni_glass_stool*2_name', 'Glass stool'), + ('nav_venue_theatredrome_xmas/0_desc', ''), + ('poster_5_name', 'Duck Poster'), + ('furni_prize2_desc', 'Nice and shiny'), + ('furni_valeduck_desc', 'He\'s lovestruck'), + ('furni_chair_plasty*7_desc', 'Hip plastic furniture'), + ('closed', 'Closed'), + ('furni_wcandleset_name', 'White Candle Plate'), + ('furni_sleepingbag*3_name', 'Ocean Sleeping Bag'), + ('furni_tree3_name', 'Christmas Tree 1'), + ('furni_sound_set_26_name', 'Groove 1'), + ('furni_barrier*2_desc', 'No trespassing, please!'), + ('game_bs_turn1', 'Your Turn'), + ('nav_venue_bb_lobby_expert_desc', 'Expert battle ball!'), + ('alert_donate_topic', 'SCAM ALERT!'), + ('game_bs_turn2', 'The Enemy\'s Turn'), + ('furni_sand_cstl_gate_name', 'sand castle gate'), + ('furni_rare_dragonlamp*4_desc', 'Scary and scorching!'), + ('furni_camera_desc', 'Smile!'), + ('pet.hotwords.lie', 'lie down'), + ('furni_sound_set_60_name', 'Latin Love 2'), + ('console_accept_selected', 'Accept'), + ('furni_divider_silo1*3_desc', 'Neat and natty'), + ('furni_summer_chair*7_name', 'Green Deck Chair'), + ('furni_pumpkin_desc', 'Cast a spooky glow'), + ('reg_habboname_note', 'Now it\'s time to make your own Habbo character! To make your own Habbo, please start by choosing your Habbo Name.'), + ('furni_rare_icecream_campaign_name', 'Rare icecream white'), + ('furni_doormat_plain_desc', 'Available in a variety of colours'), + ('room_areYouSure', 'Are you sure you want to delete this item forever?'), + ('sound_machine_confirm_burn', 'Burn this song?'), + ('predefined_room_name', '%user_name%\'s room'), + ('furni_divider_silo1*2_name', 'Black Corner Shelf'), + ('furni_table_plasto_4leg*3_desc', 'Hip plastic furniture'), + ('furni_solarium_norja*8_name', 'Yellow Solarium'), + ('furni_exe_globe_desc', 'The power is yours!'), + ('furni_bed_polyfon*6_name', 'Blue Mode Double Bed'), + ('notickets_store_link', 'Go to ticket store >>>'), + ('NUF_habbo_home', 'Habbo Home'), + ('nav_venue_the_den_name', 'The Den'), + ('furni_table_plasto_square*2_name', 'Round Dining Table'), + ('modtool_header', 'The Tool'), + ('pet_enrg_7', 'Energetic'), + ('nav_noanswer', 'No answer'), + ('roommatic_hc_members_only', 'This Room Is For HC Members Only'), + ('furni_xmasduck_desc', 'A right Christmas quacker!'), + ('pet_enrg_8', 'Lively'), + ('NUF_getting_room_own_rooms_tutor', 'Click the \'Create own room\' button to start building your room. Don\'t worry, making your room is completely free.'), + ('pet_enrg_5', 'Sprightly'), + ('pet_enrg_6', 'Active'), + ('furni_doormat_plain*4_desc', 'Available in a variety of colours'), + ('pet_enrg_3', 'Lazy'), + ('pet_enrg_4', 'Relaxed'), + ('furni_divider_poly3*6_desc', 'Blue Mode Bardesk Gate'), + ('pet_enrg_1', 'Slow'), + ('furni_glass_table*2_desc', 'Translucent beauty'), + ('pet_enrg_2', 'Sluggish'), + ('poster_1003_desc', 'get the lovely isles on your walls'), + ('furni_hc_djset_name', 'The Grammophon'), + ('pet_enrg_9', 'Tireless'), + ('furni_table_plasto_round*6_name', 'Round Dining Table'), + ('furni_sporttrack2*3_name', 'Sport corner grass'), + ('furni_footylamp_name', 'Football Lamp'), + ('furni_bed_silo_one_desc', 'Plain and simple'), + ('pet_enrg_0', 'Tired'), + ('furni_soft_sofachair_norja*7_name', 'Rural Iced Sofachair'), + ('furni_solarium_norja*9_desc', 'Rejuvenate your pixels!'), + ('furni_pillow*9_desc', 'Puffy, soft and VERY fluffy!'), + ('furni_plant_mazegate_snow_desc', 'There\'s snow way through!'), + ('furni_sound_set_8_name', 'Ambient 2'), + ('furni_divider_silo3*4_name', 'Beige Area Gate'), + ('previous', 'Previous'), + ('furni_glass_stool*3_desc', 'Translucent beauty'), + ('furni_bardeskcorner_polyfon*8_name', 'Yellow Mode Bardesk Corner'), + ('next_onearrowed', 'Next >'), + ('nav_venue_sw_lobby_expert_desc', 'For the William Tells and Robin Hoods of Snow Storming.'), + ('furni_bardeskcorner_polyfon*2_name', 'Black Mode Bardesk Corner'), + ('catalog_pet_unacceptable', 'Sorry, that name is unacceptable to Hotel Management'), + ('furni_sound_set_46_name', 'Club 1'), + ('nav_error_room_full', 'The room is full.'), + ('furni_queue_tile1*4_name', 'Gold Habbo Roller'), + ('furni_mocchamaster_desc', 'Wake up and smell it!'), + ('furni_gothic_stool*1_name', 'Gothic Stool Pink'), + ('furni_noob_chair*5_name', 'My first Habbo chair'), + ('furni_noob_rug*3_desc', 'Nice and neat sisal rug with aubergine edging'), + ('nav_venue_club_mammoth/0_name', 'Club Mammoth'), + ('pet_race_1_024', 'Cat Burglar'), + ('pet_race_1_022', 'Matted Moggy'), + ('poster_39_name', 'Screaming Furnies'), + ('pet_race_1_023', 'Indoor Alley Cat'), + ('furni_prizetrophy5*3_desc', 'Breathtaking bronze'), + ('pet_race_1_020', 'Caterwaul Kitty'), + ('NUF_mini_meet_people_room_tutor', 'The people wandering around are Habbos just like you.\\nClick on one of them to learn more about them- or on yourself to look in the mirror.'), + ('pet_race_1_021', 'Fabulous Feline'), + ('furni_arabian_tetbl_name', 'Hexagonal Tea Table'), + ('furni_grand_piano*4_name', 'Amber Grand Piano'), + ('poster_504_desc', 'The German flag'), + ('roomatic_name', 'Room name:'), + ('furni_sound_set_21_desc', 'Headbanging riffs'), + ('credit_redeem_info', 'More info about credit furni >>'), + ('furni_marquee*a_desc', 'It\'s both door and a shade!'), + ('furni_sound_set_33_name', 'Rock 3'), + ('furni_queue_tile1*5_desc', 'The power of movement'), + ('furni_doorD_name', 'Imperial Teleport'), + ('furni_rare_parasol*1_desc', 'Block those rays!'), + ('purse_youhave', 'You Have'), + ('nav_fullbutton', 'Full'), + ('furni_rare_fountain*2_desc', 'For our feathered friends'), + ('friend_request_accepted', 'Accepted!'), + ('tutorial_help_button_bubble', 'Click the blue question mark to open up the help menu to restart the tutorial.'), + ('furni_rubberchair*4_desc', 'Soft and tearproof!'), + ('furni_sound_set_9_desc', 'Mystical ambient soundscapes'), + ('furni_rare_fan*3_name', 'Purple Dragon Skin Fan'), + ('furni_table_plasto_square*8_desc', 'Hip plastic furniture'), + ('gs_choose_gametime', 'Choose Game duration:'), + ('furni_traffic_light*1_desc', 'Chill and wait your turn!'), + ('furni_sofachair_polyfon*6_desc', 'Blue Mode Armchair'), + ('furni_chair_norja*4_name', 'Urban Iced Chair'), + ('furni_val_teddy*2_name', 'Pink Share Bear'), + ('nav_venue_chill/0_name', 'Zen Garden'), + ('furni_table_plasto_square_name', 'Occasional Table'), + ('furni_bed_budget_name', 'Pura Bed'), + ('furni_solarium_norja_name', 'White Solarium'), + ('furni_noob_table*1_name', 'My first Habbo table'), + ('gs_5min', '5min'), + ('purse_credits', 'You have \\x1 Habbo Credit(s) in your purse.'), + ('furni_divider_poly3*5_name', 'Candy Hatch (Lockable)'), + ('furni_rare_icecream*6_name', 'Toffee Ice Cream Machine'), + ('furni_table_polyfon_med_name', 'Large Coffee Table'), + ('console_deselect_all', 'Deselect all'), + ('nav_venue_bb_lobby_amateur_8_name', 'Gevorderden Battle Ball 9'), + ('transaction_system_sms_win_kpn', 'KPN SMS'), + ('nav_venue_bb_lobby_intermediate_3/0_desc', ''), + ('furni_CFC_500_goldbar_desc', 'Worth 500 Credits'), + ('NUF_visiting_rooms', 'Visiting other players\' rooms'), + ('url_logout_timeout', 'http://%predefined%//account/disconnected?reason=logout'), + ('furni_table_silo_med*7_desc', 'Green Area Coffee Table'), + ('player_commands_no_args', 'You have not supplied any arguments!'), + ('furni_romantique_pianochair*2_name', 'Lime Romantique Piano Chair'), + ('pickup', 'Pick up'), + ('reg_tutorial_url', ''), + ('habboclub_confirm_body', 'You have %credits% credits'), + ('nav_venue_bb_lobby_beginner_12/0_desc', ''), + ('furni_rare_elephant_statue*1_name', 'Silver Elephant'), + ('help', 'Habbo Help'), + ('furni_soft_sofachair_norja*2_desc', 'Black Iced Sofachair'), + ('furni_table_plasto_round*1_desc', 'Hip plastic furniture'), + ('furni_sleepingbag*9_desc', 'Ultimate coziness'), + ('furni_arabian_tray2_desc', 'For those Arabian nights'), + ('NUF_visiting_rooms_hotelview_tutor', 'Hello. This time we are learning how to visit another user\'s room.'), + ('furni_traffic_light*6_name', 'Red Traffic Light'), + ('Alert_ChooseWhoToSentMessage', 'Please choose who to\\rsend your message to'), + ('poster_47_desc', 'Twinkle, twinkle'), + ('bb_title_finalScores', 'Final standings:'), + ('jukebox_song_author', 'by: %author%'), + ('poster_2003_name', 'Dodgy Geezer'), + ('poster_509_name', 'The Jamaican flag'), + ('poster_6_desc', 'But is it the right way up?'), + ('furni_toy1*1_name', 'Rubber Ball'), + ('nav_venue_bb_lobby_beginner_13_name', 'Beginners Battle Ball 14'), + ('furni_scifidoor*5_name', 'White Spaceship Door'), + ('credit_redeem_text', 'You are going to change Furni to %value% credits.'), + ('nav_venue_sw_lobby_amateur_0_name', 'Snow Slingers Lobby'), + ('club_txt_intro', 'Welcome to Habbo Club - the members only club that all the best Habbos belong to!\\r\\rMembers of Habbo Club get priority access to the hotel (so you can always get in), exclusive clothes, hair colours, rare furni and special guest room layouts. To see exactly what you\'ll be able to get your hands on as a Habbo Club member, take a look in the Catalogue.'), + ('nav_venue_bouncer_room_1_name', 'Beginners Battle Ball Arena'), + ('update_email_suggest', 'Habbo Hotel security supervisor requests you to update your email'), + ('furni_rare_dragonlamp*3_name', 'Silver Dragon Lamp'), + ('furni_scifiport*2_name', 'Blue Laser Gate'), + ('club_button_extend', 'Extend Membership'), + ('wallitem_val_heart_name', 'Heart Light'), + ('furni_pura_mdl3*7_name', 'Green Pura Module 3'), + ('furni_sound_set_61_desc', 'Straight from the heart'), + ('nav_venue_bb_lobby_expert_9/0_desc', ''), + ('furni_pura_mdl2*9_name', 'Red Pura Module 2'), + ('furni_hal_cauldron_name', 'Habboween Cauldron'), + ('furni_divider_nor1*2_name', 'Black Ice corner'), + ('send', 'Send'), + ('furni_couch_norja_desc', 'Two can perch comfortably'), + ('furni_pura_mdl4*5_name', 'beige pura module 4'), + ('pet_race_1_008', 'Mad Mouser'), + ('pet_race_1_009', 'Scaredy Kat'), + ('pet_race_1_006', 'Titchy Tiger'), + ('pet_race_1_007', 'Burmese Buddy'), + ('pet_race_1_004', 'Soft-Toed Sneaker'), + ('furni_divider_nor4*8_desc', 'Habbos, roll out!'), + ('furni_tile_desc', 'In a choice of colours'), + ('pet_race_1_005', 'Cat Astroflea'), + ('pet_race_1_002', 'Lesser Spotted Longhair'), + ('pet_race_1_003', 'Hidden Clause'), + ('pet_race_1_000', 'Sleepy Siamese'), + ('pet_race_1_001', 'Purr-Sian'), + ('furni_sound_set_53_name', 'Snowy Surprise'), + ('furni_rare_icecream*1_desc', 'Virtual blueberry rocks!'), + ('furni_table_plasto_round*15_name', 'Occasional Table'), + ('security', 'Security'), + ('furni_glass_chair*5_name', 'Glass chair'), + ('nav_venue_cunning_fox_gamehall/1_desc', 'It\'s one-on-one for five in a row'), + ('nav_venue_sw_lobby_tournament_4/0_desc', ''), + ('furni_carpet_soft_desc', 'Soft Wool Rug'), + ('poster_27_desc', 'Deck the halls!'), + ('furni_safe_silo*7_desc', 'Totally shatter-proof!'), + ('furni_table_silo_small*5_desc', 'Pink Area Occasional Table'), + ('furni_marquee*4_desc', 'It\'s both door and a shade!'), + ('furni_gothic_sofa*4_desc', 'Ghosts and Ghouls'), + ('furni_prizetrophy6*1_desc', 'Glittery gold'), + ('pet_race_1_019', 'Bobcat Wailer'), + ('furni_bardesk_polyfon*5_desc', 'For cute constructions'), + ('furni_carpet_polar*2_name', 'Blue Bear Rug'), + ('pet_race_1_017', 'Furry Friend'), + ('furni_soft_sofa_norja*6_desc', 'Blue Iced Sofa'), + ('furni_pura_mdl2*4_desc', 'Any way you like it!'), + ('pet_race_1_018', 'Trusting Tabby'), + ('pet_race_1_015', 'Haughty House Pet'), + ('chatlog.url', 'https://theallseeingeye.sulake.com/ase/habbo/uk/housekeeping/extra/hobba/chatlog.action?chatId='), + ('furni_ham2_name', 'Eaten Ham'), + ('pet_race_1_016', 'Curiousity - The Return!'), + ('pet_race_1_013', 'Felis Catus Allergicus'), + ('pet_race_1_014', 'Bushy Bobtail'), + ('pet_race_1_011', 'Egyptian Angora'), + ('pet_race_1_012', 'Freckled Feral'), + ('gs_choose_gamefield', 'Choose Game Arena:'), + ('furni_divider_nor5*6_desc', 'Cool cornering for your crib y0!'), + ('furni_summer_pool*2_name', 'Red Summer Pool'), + ('pet_race_1_010', 'Wannabe Wildcat'), + ('furni_rare_elephant_statue_desc', 'Say hello to Nelly'), + ('furni_sofa_silo*8_desc', 'Cushioned, understated comfort'), + ('furni_exe_rug_desc', 'Please remove your shoes!'), + ('NUF_meeting_people_roomlist_tutor', 'Let\'s visit one of the rooms and find out how to meet other users.'), + ('furni_chair_plasto*15_desc', 'Hip plastic furniture'), + ('nav_venue_habburger\'s_name', 'Habburgers'), + ('queue_current_2', 'You are in queue for the room.'), + ('queue_current_1', 'You are in Habbo Live queue...'), + ('furni_pura_mdl5*3_name', 'Black Pura Module 5'), + ('furni_hockey_score_name', 'Scoreboard'), + ('furni_sofachair_silo*5_desc', 'Pink Area Armchair'), + ('furni_hyacinth1_name', 'Pink Hyacinth'), + ('furni_pura_mdl1*6_desc', 'Any way you like it!'), + ('camera_open_dialog_heading', 'Camera'), + ('furni_prizetrophy5*2_name', 'Duo trophy'), + ('furni_glass_chair_desc', 'Translucent beauty'), + ('furni_rubberchair*3_desc', 'Soft and tearproof!'), + ('furni_exe_plant_name', 'Executive Plant'), + ('furni_pura_mdl2*3_desc', 'Any way you like it!'), + ('furni_pura_mdl1*2_name', 'Pink Pura Module 1'), + ('furni_plant_bonsai_desc', 'You can be sure it lives'), + ('furni_plant_valentinerose*4_desc', 'Be mine!'), + ('wallitem_hrella_poster_3_desc', 'Don\'t drift away!'), + ('furni_deadduck_name', 'Dead Duck'), + ('furni_summer_grill*3_desc', 'Plenty of steak on that barbie'), + ('modtool_extrainfo', 'Extra Info:'), + ('sound_machine_jukebox_window', 'Jukebox'), + ('gs_button_start', 'Start Game!'), + ('nav_venue_sw_lobby_beginner_5/0_desc', ''), + ('furni_romantique_chair*5_desc', 'What does this button do?'), + ('furni_table_plasto_4leg*9_desc', 'Hip plastic furniture'), + ('furni_soft_sofa_norja_desc', 'A soft iced sofa'), + ('furni_divider_nor4*9_name', 'Red Iced Auto Shutter'), + ('login_haventGotHabbo', 'Haven\'t got a Habbo yet?'), + ('furni_noob_stool*2_name', 'My first Habbo stool'), + ('furni_s_sound_machine*5_desc', 'Sound Machine Brown Desc'), + ('credit_redeem_window', 'Redeem credit furni'), + ('send_invitation_text', 'Want to meet someone from our Welcoming Party?'), + ('purse_vouchers_exitbutton', 'Cancel'), + ('furni_prizetrophy6*3_desc', 'Breathtaking bronze'), + ('nav_venue_cafe_gold/0_name', 'Kultakahvila'), + ('furni_fortune_name', 'Crystal Ball'), + ('poster_22_name', 'Butterfly Cabinet (blue)'), + ('object_displayer_link_badge', 'Edit Badge'), + ('furni_sound_set_15_name', 'RnB Grooves 6'), + ('Alert_NoNameSet', 'Check your Habbo name.'), + ('furni_hc_crpt_name', 'Persian Carpet'), + ('error_ok', 'OK->'), + ('game_chess_email', 'Receive game via email'), + ('sound_machine_confirm_save_list', 'Save playlist?'), + ('furni_noob_rug*2_desc', 'Nice and neat sisal rug with blue edging'), + ('queue_set.e1.alert', 'This room is currently available only to Habbos participating to the event.'), + ('furni_rare_icecream*0_desc', 'Virtual cherry rocks!'), + ('furni_arabian_chair_name', 'Green Blossom Chair'), + ('furni_divider_silo3*6_name', 'Blue Area Gate'), + ('furni_scifiport*4_desc', 'Energy beams. No trespassers!'), + ('furni_sofa_silo*4_desc', 'Beige Area Sofa'), + ('furni_one_way_door*4_desc', 'One at a time!'), + ('furni_chair_norja*5_desc', 'Sleek and chic for each cheek'), + ('furni_sound_set_19_desc', 'Shake your body!'), + ('poster_26_desc', 'See that halo gleam!'), + ('furni_doormat_plain*2_desc', 'Available in a variety of colours'), + ('furni_romantique_chair*1_name', 'Rose Quartz Chair'), + ('furni_hc_tv_name', 'Mega TV Set'), + ('pet.hotwords.follow_me', 'heel'), + ('furni_petfood3_desc', 'Fantastic 20% Saving!'), + ('furni_couch_norja*5_name', 'Pink Bench'), + ('furni_table_plasto_round*7_desc', 'Hip plastic furniture'), + ('furni_bed_armas_two_desc', 'King-sized pine comfort'), + ('modtool_days', 'Days'), + ('furni_one_way_door*7_name', 'Green One Way Gate'), + ('furni_table_norja_med*5_name', 'Large Coffee Table Pink'), + ('furni_sand_cstl_wall_name', 'sand_cstl_wall'), + ('nav_modify_doorstatus_givepw', 'Password for the room'), + ('NUF_getting_items_room_tutor', 'Nice room. Reminds me of a chic Parisian cafe in Slough. Open the Catalogue.'), + ('habbo_hand_prev', '<<<'), + ('pet.saying.generic.croco.3', 'Tick tock tick....'), + ('invitation_follow_failed', 'Sorry, your attempt to follow an invitation failed.'), + ('furni_sound_set_12_desc', 'Unusual as Standard'), + ('pet.saying.generic.croco.1', '*Mellow*'), + ('error_text', 'Error occured, press \'OK\' to restart program.\\r\\rPlease report bugs to:\\rwww.habbohotel.com/habbo/en/help/contact/bugs/ \\rSorry for the inconvenience.'), + ('pet.saying.generic.croco.2', 'I\'m so hungry I could eat you!'), + ('furni_divider_silo3*3_desc', 'Form following function'), + ('furni_table_plasto_4leg*2_desc', 'Hip plastic furniture'), + ('int_newmessages', 'New Message(s)'), + ('furni_rare_icecream*3_name', 'Blackcurrant Ice Cream Machine'), + ('bb_header_gameinfo', 'Game info'), + ('furni_scifiport*0_name', 'Red Laser Door'), + ('nav_venue_bb_lobby_beginner_7_name', 'Beginners Battle Ball 8'), + ('tx_history.description.bank_wallie', 'Wallie-card'), + ('nav_venue_hallway_name', 'Hallway'), + ('nav_venue_bb_lobby_amateur_11/0_desc', ''), + ('furni_bed_budget_one*5_desc', 'Prince sized comfort!'), + ('pet.saying.generic.croco.0', 'Rrrr....Grrrrrg....'), + ('nav_popup_go', '>>'), + ('furni_safe_silo*3_name', 'White Safe Minibar'), + ('furni_table_silo_small_name', 'Occasional Table'), + ('poll_confirm_window', 'Leave our poll'), + ('furni_table_norja_med*9_desc', 'For larger gatherings'), + ('furni_divider_nor4*6_desc', 'Habbos, roll out!'), + ('gs_3teams', '3 Teams Game'), + ('wallitem_post.it.limit', 'Only 50 stickies per room are allowed!'), + ('furni_scifidoor*4_desc', 'Protect your pot of gold!'), + ('furni_bed_polyfon_one*9_name', 'Red Single Bed'), + ('furni_soft_sofa_norja*2_desc', 'Black Iced Sofa'), + ('furni_corner_china_desc', 'Firm, fireproof foundation'), + ('hobba_pickup_go', 'Pick Up & Go!'), + ('furni_sporttrack3*2_desc', 'null'), + ('furni_rare_fan*6_name', 'Ochre Powered Fan'), + ('furni_sound_set_3_name', 'Electronic 1'), + ('NUF_mini_meet_people_user_tutor', 'Here you can chat to users directly. Ask a Habbo to be your friend by clicking on their Habbo and the button.\\nIf this is your first time, check your Hand to see a present to decorate your own room with, later.'), + ('furni_pura_mdl2*6_name', 'Blue Pura Module 2'), + ('furni_couch_norja*9_desc', 'Two can perch comfortably'), + ('furni_chair_plasty*9_desc', 'Hip plastic furniture'), + ('game_chess_white', 'White:'), + ('nav_venue_sw_lobby_intermediate_3/0_desc', 'Lumisota sen kuin vain kovenee.'), + ('furni_table_plasto_square*3_desc', 'Hip plastic furniture'), + ('nav_venue_theatredrome/0_desc', 'Perform your latest masterpiece!'), + ('nav_venue_the_den/0_desc', 'Has anyone seen my map?'), + ('furni_sound_set_40_name', 'Rock 4'), + ('remove', 'Remove'), + ('friend_request_decline_all', 'Decline all requests.'), + ('furni_rare_globe_name', 'Snow Globe'), + ('furni_bardesk_polyfon*8_name', 'Yellow Mode Bardesk'), + ('nav_venue_sw_lobby_free_6_name', 'Free Game Lobby'), + ('queue_change', 'Change queue'), + ('reg_parentemail_link_text2', 'Privacy Pledge'), + ('furni_rare_parasol*2_desc', 'Block those rays!'), + ('furni_romantique_pianochair*3_desc', 'null'), + ('reg_parentemail_link_text1', 'See the letter'), + ('sound_machine_list_save', 'Save Playlist'), + ('nav_public_helptext_hd', 'Public Spaces'), + ('furni_chair_plasty*2_desc', 'Hip plastic furniture'), + ('spectator_count', 'spectators %cnt%/%max%'), + ('reg_welcome2', 'Create Your Own Habbo'), + ('wallitem_roomdimmer_desc', 'Superior lighting for your room'), + ('furni_prizetrophy*3_name', 'Classic trophy'), + ('furni_plant_rose_name', 'Cut Roses'), + ('reg_welcome3', 'Now the fun begins! All you need to do is register and you\'re ready to start. It won\'t take long!\\rYou can change everything except your name and date of birth later. Come on!'), + ('furni_noob_table*5_name', 'My first Habbo table'), + ('nav_error_room_closed', 'The room is closed.'), + ('reg_changePassword', 'Change your password'), + ('furni_divider_nor5*3_desc', 'Cool cornering for your crib y0!'), + ('furni_doorC_name', 'Portaloo'), + ('furni_chair_plasty*10_name', 'Plastic Pod Chair'), + ('furni_pura_mdl1*9_name', 'Red Pura Module 1'), + ('furni_rare_stand_name', 'Speaker\'s Corner'), + ('furni_grunge_table_name', 'Grunge Table'), + ('furni_traffic_light*2_name', 'Blue Traffic Light'), + ('pet.saying.angry.croco.2', 'You have displeased me.'), + ('human_trading', 'Trading'), + ('furni_noob_stool*6_desc', 'Unfold me and take the weight off (green)'), + ('pet.saying.angry.croco.1', 'Rawwwr...rrr'), + ('nav_venue_sw_lobby_intermediate_5_name', 'Snow Bombardiers Lobby'), + ('gs_button_leavegame', 'Leave Game'), + ('pet.saying.angry.croco.0', 'Grrrrr...rrr'), + ('furni_s_sound_machine*1_name', 'Sound Machine Grey'), + ('pet.saying.angry.croco.4', 'Buuuuurrr..rrrrr'), + ('furni_chair_plasto*7_desc', 'Hip plastic furniture'), + ('pet.saying.angry.croco.3', 'Rowrrrr...rrrr'), + ('furni_soft_sofa_norja*9_desc', 'Red Iced Sofa'), + ('nav_venue_skylight_lobby_name', 'Skylight Lobby'), + ('furni_bed_polyfon_one*6_desc', 'Blue Mode Single Bed'), + ('furni_pillow*8_desc', 'Puffy, soft and huge'), + ('furni_hc_rntgn_name', 'X-Ray Divider'), + ('furni_table_silo_med*5_desc', 'Pink Area Coffee Table'), + ('furni_gothic_stool*2_desc', 'Be seated please..'), + ('furni_typingmachine_desc', 'Write that bestseller'), + ('furni_fridge_desc', 'Keep cool with a chilled snack or drink'), + ('nav_venue_cunning_fox_gamehall/4_desc', 'Get a hand like a foot? Keep a straight face and bluff it out'), + ('doorbell_rings', 'Rings the doorbell - Open the door?'), + ('furni_divider_silo1*9_desc', 'Red Area Small Table'), + ('nav_venue_bb_lobby_intermediate_7/0_desc', ''), + ('furni_prize1_name', 'Gold Trophy'), + ('poster_54_name', 'Hockey Stick'), + ('furni_sound_set_47_name', 'Club 2'), + ('furni_prizetrophy3*1_name', 'Globe trophy'), + ('purse_head2', 'ACCOUNT TRANSACTIONS'), + ('furni_soft_sofa_norja*5_name', 'Pink Iced Sofa'), + ('furni_prizetrophy9*1_desc', 'Glittery gold'), + ('buddyremove_next', 'Next >'), + ('reg_girl', 'Girl'), + ('furni_bed_budget_one*1_name', 'Aqua Pura Bed'), + ('NUF_visiting_rooms_roomlist_go', 'Click \'Go\' to go to a room.'), + ('poster_506_desc', 'To \'Finnish\' your decor...'), + ('furni_toy1_name', 'Rubber Ball'), + ('furni_sound_set_7_desc', 'Sound effects for Furni'), + ('sw_fieldname_6', 'Riverbank Siege'), + ('sw_fieldname_5', 'Polar Labyrinth'), + ('furni_bed_polyfon*4_desc', 'Beige Mode Double Bed'), + ('furni_pillow*4_name', 'Gold Feather Pillow'), + ('alert_duplicatesession', 'You are already logged in on another hotel! Log out before trying again.'), + ('sw_fieldname_7', 'Skull Falls Assault'), + ('sound_machine_alert_song_not_ready', 'Can\'t save song! Song not ready yet.'), + ('nav_venue_bb_lobby_beginner_5/0_desc', ''), + ('nav_venue_bb_lobby_tournament_4/0_desc', ''), + ('pet.saying.play.dog.1', 'woofWOOFwoofWOOFwoof'), + ('pet.saying.play.dog.0', 'rrr.. WOOF .rrr..'), + ('furni_cn_lamp_name', 'Lantern'), + ('furni_arabian_rug_name', 'Berber Kilim Rug'), + ('NUF_groups_hotelview_tutor', 'You have now opened the Group tutorial in the website window. Special!'), + ('gs_error_start_9', 'Team sizes can only differ by one player. This Game cannot start!'), + ('furni_divider_poly3*7_desc', 'Green Mode Bardesk Gate'), + ('furni_sofachair_silo*4_desc', 'Beige Area Armchair'), + ('poster_58_desc', 'whish you luck'), + ('furni_chair_basic*2_desc', 'It\'s a cracking design!'), + ('poster_516_name', 'The English flag'), + ('nav_venue_sw_lobby_tournament_2/0_desc', ''), + ('furni_gothic_carpet_name', 'Cobbled Path'), + ('sw_title', 'Snow Storm'), + ('furni_doormat_plain*5_name', 'Doormat'), + ('furni_pura_mdl4*4_desc', 'Any way you like it!'), + ('furni_sound_machine*1_name', 'Sound Machine'), + ('furni_sofa_silo*7_name', 'Green Area Sofa'), + ('nav_venue_sw_lobby_tournament_4_name', 'Tournament Lobby'), + ('gs_title_gamecreation', 'Game creation'), + ('furni_couch_norja*2_desc', 'Two can perch comfortably'), + ('furni_prizetrophy5_desc', 'Palkinto'), + ('furni_divider_nor3*9_desc', 'Red Iced gate'), + ('furni_present_gen_name', 'Gift'), + ('furni_prizetrophy7*3_name', 'Bronze Habbo trophy'), + ('alert_reg_parent_email', 'The email address you provided is unacceptable.'), + ('furni_bed_polyfon_girl_name', 'Double Bed'), + ('furni_rare_fountain_name', 'Bird Bath (red)'), + ('furni_pura_mdl3*3_name', 'Black Pura Module 3'), + ('furni_plant_pineapple_name', 'Pineapple Plant'), + ('furni_divider_nor2*8_name', 'Yellow Iced bar desk'), + ('messenger', 'Messenger'), + ('nav_venue_bb_arena_0_name', 'Battle Ball kaikille'), + ('sw_fieldname_2', 'Algid River'), + ('furni_bed_silo_two_desc', 'Plain and simple x2'), + ('sw_fieldname_1', 'Arctic Island'), + ('furni_pillow*1_desc', 'Puffy, soft and huge'), + ('sw_fieldname_4', 'Frosty Forest'), + ('sw_fieldname_3', 'Glacial Fort'), + ('furni_bar_basic_desc', 'A pura series 300 minibar'), + ('tutorial_welcome_M', 'Hi! I am your guide to Habbo Hotel. Please pick a topic to start.'), + ('tutorial_welcome_F', 'Hi there! I\'m your guide to Habbo Hotel. What would you like to learn today?'), + ('Alert_NoNameSetForLogo', 'Please give a name to your logo'), + ('furni_glass_table*5_name', 'Glass table'), + ('group_owner', 'Owner'), + ('console_target_friend_list_full', 'This user\'s friend list is full'), + ('furni_romantique_smalltabl*2_name', 'Lime Tray Table'), + ('ph_keys_spacebar', 'Spacebar'), + ('furni_noob_chair*3_name', 'My first Habbo chair'), + ('NUF_meeting_people_roomlist_publicTab', 'Click the Public Spaces tab to see the list of public rooms. To go to the room click the \'Go\' button.'), + ('furni_bed_polyfon*7_name', 'Green Mode Double Bed'), + ('furni_jukebox_ptv*1_name', 'Jukebox Pacha TV'), + ('poster_513_desc', 'Aussies rule!'), + ('poster_51_desc', '2 points for every basket'), + ('furni_toy1*2_name', 'Rubber Ball'), + ('furni_bartable_armas_name', 'Bardesk'), + ('nav_venue_sw_lobby_amateur_0/0_desc', ''), + ('NUF_mini_use_console_read_tutor', 'The Habbo Console lets you message with people you have added to your friends list.'), + ('nav_venue_bb_lobby_beginner_12_name', 'Beginners Battle Ball 13'), + ('poster_2002_name', 'Urho Kaleva Kekkonen'), + ('furni_sound_set_44_desc', 'Haunted Dimension'), + ('pet.saying.beg.dog.1', 'Oouh..oouh..snuh..ooo'), + ('furni_sporttrack2*1_name', 'Sport corner tartan'), + ('pet.saying.beg.dog.0', 'Oooo...Ouuu...oo...OUUU'), + ('furni_solarium_norja*5_desc', 'Rejuvenate your pixels!'), + ('pet.saying.beg.dog.2', '*whimpers *'), + ('reg_pledgelink', 'Hotel rules'), + ('habboclub_price1.days', '30'), + ('furni_glass_shelf_desc', 'Translucent beauty'), + ('furni_sofachair_polyfon*3_name', 'White Armchair'), + ('reg_verification_info', 'You must know the correct birthday and password before you\'re allowed to make these changes.'), + ('furni_carpet_soft*5_desc', 'Soft Wool Rug'), + ('furni_grunge_mattress_name', 'Grunge Mattress'), + ('furni_bed_polyfon_one_name', 'Single Bed'), + ('furni_sound_machine_pro_name', 'Sound Machine Pro'), + ('furni_chair_china_desc', 'The elegant beauty of tradition'), + ('furni_rare_icecream*7_desc', 'Virtual chocolate rocks!'), + ('furni_table_silo_med*8_name', 'Yellow Coffee Table'), + ('club_gift.message', 'Happy Habbo Club! Love Callie :)'), + ('furni_sw_raven_desc', 'My name is Otter'), + ('furni_noob_table*2_desc', 'Lightweight, practical and dark blue'), + ('furni_soft_sofachair_norja*3_desc', 'Soft Iced sofachair'), + ('sound_machine_confirm_delete', 'Delete song?'), + ('furni_plant_fruittree_name', 'Fruit Tree'), + ('nav_venue_bb_lobby_intermediate_1/0_desc', ''), + ('furni_heartsofa_name', 'Heart Sofa'), + ('furni_bed_budget_one*8_name', 'Yellow Pura Bed'), + ('NUF_getting_room', 'Making your own room'), + ('furni_rare_elephant_statue*2_name', 'Bronze Elephant'), + ('nav_venue_ballroom/0_desc', 'Come play ball!'), + ('nav_venue_sw_lobby_amateur_1_name', 'Snow Slingers Lobby'), + ('console_lasttime', 'Last Time'), + ('furni_md_sofa_desc', 'A decent recliner'), + ('furni_wooden_screen*6_name', 'Blue Oriental Screen'), + ('partner_registration_text', 'Click the link to finish your registration. When you have finished the registration click OK to continue to the hotel.'), + ('furni_sound_set_62_desc', 'Music of the Arabian night!'), + ('furni_arabian_divdr_name', 'Soft wooden screen'), + ('furni_tree1_desc', 'Dead christmas tree'), + ('furni_grand_piano*3_name', 'Pink Grand Piano'), + ('console_select_requests', 'Following users have asked to be your friend. Please accept or decline.'), + ('furni_divider_nor4*2_name', 'Black Iced Auto Shutter'), + ('furni_glass_chair*3_name', 'Glass chair'), + ('reg_passwordContainsNoNumber', 'Password must contain at least one number'), + ('buddyremove_invert', 'Invert Selection'), + ('furni_val_teddy*5_desc', 'The yellow bear of understanding'), + ('furni_sound_set_51_name', 'Club 6'), + ('poster_1_desc', 'The Noble and Silver Show'), + ('roomevent_create_name', 'Type the name of your event'), + ('Alert_unacceptableName', 'Sorry, that name is unacceptable to the Hotel Management'), + ('NUF_getting_room_go_tutor', 'Your room is now ready. Let\'s go see! I hope you have a bed...'), + ('poster_520_name', 'The Rainbow Flag'), + ('password', 'Password:'), + ('furni_bed_budget*8_name', 'Yellow Pura Double Bed'), + ('gs_header_gamelist', 'Game List'), + ('furni_chair_plasty_desc', 'Hip plastic furniture'), + ('url_purse_subscribe', 'http://%predefined%//credits?'), + ('furni_table_plasto_bigsquare*15_desc', 'Hip plastic furniture'), + ('furni_glass_stool*6_desc', 'Translucent beauty'), + ('error_report', 'Error Report'), + ('summer_chair_6_desc', 'Get decked'), + ('furni_chair_basic*5_name', 'chair_basic'), + ('room_remove_specs', 'Sorry! Now it\'s someone else\'s turn to watch this event.'), + ('furni_bunny_desc', 'Yours to cuddle up to'), + ('invitation_exists', 'You have already invited members of the Welcoming Party to your room.'), + ('purse_vouchers_furni_success', 'Voucher was successfully redeemed. You have been given the following furniture:'), + ('nav_rooms_popular', 'Popular rooms'), + ('nav_cancel', 'Cancel'), + ('alert_cross_domain_download', 'Cross domain content download prevented'), + ('furni_table_plasto_4leg*16_desc', 'Hip plastic furniture'), + ('url_pets', 'http://%predefined%//hotel/pets'), + ('furni_bardeskcorner_polyfon*9_desc', 'Tuck it away'), + ('gs_button_cancel', 'Cancel'), + ('furni_barchair_silo*7_name', 'Green Bar Stool'), + ('catalog_credits', 'You have \\x Credits in your purse.'), + ('furni_divider_nor3_name', 'Door (Lockable)'), + ('nav_modify_name', 'Name of the room'), + ('nav_venue_bb_lobby_amateur_7_name', 'Gevorderden Battle Ball 8'), + ('nav_venue_club_massiva/0_desc', 'Rest your dancing feet!'), + ('furni_gothrailing_desc', 'The dark side of Habbo'), + ('queue_set.na.alert', 'This Room is for Staff only.'), + ('nav_venue_bb_lobby_tournament_8_name', 'Competitie Battle Ball 9'), + ('furni_sound_set_29_name', 'Dance 2'), + ('console_msgs', 'msgs'), + ('furni_noob_lamp*6_name', 'My first Habbo lamp'), + ('furni_marquee*6_desc', 'It\'s both door and a shade!'), + ('furni_chair_plasto*16_desc', 'Hip plastic furniture'), + ('furni_chair_basic*9_desc', 'It\'s a cracking design!'), + ('summer_chair_2_name', 'Pink Deck Chair'), + ('alert_too_much_furnitures', 'Furni limit for room is exceeded. Not all furnitures are shown. Please remove some.'), + ('furni_pura_mdl5*4_name', 'White Pura Module 5'), + ('bus.full_msg', 'The FRANK bus is full at the moment, please come back later or visit the FRANK page below for more information.'), + ('furni_sound_set_22_name', 'SFX 3'), + ('furni_gothic_sofa*3_desc', 'The dark side of Habbo'), + ('furni_md_limukaappi_name', 'Habbo Cola Machine'), + ('poster_19_desc', 'Trying to get in or out?'), + ('gs_2min', '2min'), + ('poster_8_desc', 'Habbos come in all colours'), + ('furni_pillar*6_desc', 'Ancient and stately'), + ('furni_carpet_standard*3_desc', 'Available in a variety of colours'), + ('purse_vouchers_info', 'When you buy Habbo Credits with a mobile phone, you will receive a special voucher code. Enter the code in the box above, click \'Get Credits!\' and they\'ll be added to your purse.'), + ('furni_valeduck_name', 'Valentine\'s Duck'), + ('Alert_MessageFromAdmin', 'Message from Hotel Management:'), + ('furni_present_gen1_desc', 'What\'s inside?'), + ('reg_tutorial_txt', ''), + ('furni_tile_stella_name', 'Star Tile'), + ('furni_shelves_norja*4_name', 'Urban Iced Bookcase'), + ('transaction_system_creditcards_is', 'Creditcard'), + ('furni_shelves_polyfon_desc', 'For the arty pad'), + ('furni_tv_luxus_name', 'Digital TV'), + ('recycler_status_window_title', 'Recycling Status'), + ('furni_sleepingbag*6_name', 'Purple Sleeping Bag'), + ('gs_button_shrink', 'Minimize Window'), + ('furni_wcandleset_desc', 'Simple but stylish'), + ('furni_sleepingbag*3_desc', 'Ultimate coziness'), + ('object_displayer_show_actions', 'Show actions'), + ('hubu_t5_1', 'Lisetoa huumeista'), + ('song_disk_text_template', '%name%'), + ('hubu_t5_2', 'Huumeista-esite'), + ('queue_other_1', 'Habbo Live queue status'), + ('poster_33_name', 'Save the Panda'), + ('hubu_t5_3', 'Yleistietoa EOPH ry:st--------------'), + ('queue_other_2', 'Room queue status'), + ('furni_hcsohva_name', 'Throne Sofa'), + ('furni_sound_set_26_desc', 'Bollywood Beats!'), + ('furni_christmas_poop_name', 'Reindeer Droppings'), + ('furni_rare_dragonlamp*4_name', 'Serpent of Doom'), + ('nav_venue_bb_lobby_amateur_7/0_desc', ''), + ('purse_value', 'VALUE'), + ('furni_glass_sofa*5_desc', 'Translucent beauty'), + ('nav_venue_bb_lobby_tournament_15/0_desc', ''), + ('furni_glass_stool*2_desc', 'Translucent beauty'), + ('pet.saying.play.cat.1', 'Purrrr.. oo..Purrr'), + ('furni_pura_mdl4*7_name', 'Green Pura Module 4'), + ('nav_venue_cafe_ole/0_desc', 'Relax with friends over one of Marias specialty coffees'), + ('pet.saying.play.cat.0', 'Mew..MEOW..meow'), + ('furni_pumpkin_name', 'Pumpkin Lamp'), + ('furni_summer_chair*7_desc', 'Reserved!'), + ('ph_tickets_txt', 'Tickets can be used for BattleBall: Rebound!, SnowStorm, the Lido Diving and Wobble Squabble games. Tickets never expire.\\r\\rCurrently you have \\x1 ticket(s).'), + ('roomatic_onemoment', 'Please wait, we are going to your room...'), + ('furni_small_table_armas_name', 'Occasional Table'), + ('furni_table_polyfon_med_desc', 'For larger gatherings'), + ('nav_venue_bb_lobby_expert_3/0_desc', ''), + ('furni_chair_silo*6_desc', 'Blue Silo Dining Chair'), + ('furni_exe_globe_name', 'Power Globe'), + ('furni_bed_budget_one_name', 'bed_budget_one'), + ('furni_divider_silo1*2_desc', 'Neat and natty'), + ('nav_venue_bb_lobby_intermediate_0_name', 'Intermediate'), + ('furni_sofa_polyfon*9_desc', 'Comfort for stylish couples'), + ('furni_noob_lamp*3_desc', 'Get the light right where you want it (aubergine)'), + ('nav_showfull', 'Show Full Rooms'), + ('furni_divider_nor3*2_desc', 'Black Iced gate'), + ('reg_note_title', 'Warning!'), + ('hubu_answ_count', 'Replies'), + ('nav_recommended_rooms', 'Recommended Rooms'), + ('transaction_system_bank_nordea', 'Nordea'), + ('furni_sound_set_37_desc', ''), + ('poster_2006_desc', 'He is the magic Habbo'), + ('sw_link_gameRules_url', 'http://%predefined%//groups/56553/id'), + ('wave', 'Wave'), + ('furni_hc_djset_desc', 'Very old skool scratch\'n\'spin'), + ('furni_plant_maze_name', 'Maze Shrubbery'), + ('furni_scifirocket*3_name', 'Endor Smoke Machine'), + ('furni_val_teddy*1_name', 'Grey Share Bear'), + ('recycler_ready_outcome', 'Recycling reward: %outcome%'), + ('poster_4_desc', 'Fake of course!'), + ('poster_62_desc', 'We can\'t bear to lose them!'), + ('furni_glass_stool*9_desc', 'Translucent beauty'), + ('furni_goodie1_name', 'Marzipan Man'), + ('nav_modify_choosecategory', 'Choose a category for your room'), + ('object_displayer_link_home', 'User\'s home page'), + ('nav_venue_sw_lobby_tournament_8/0_desc', ''), + ('furni_xmasduck_name', 'Christmas Rubber Duck'), + ('help_txt_2', 'Password Reset'), + ('pet_mood_2', 'Blue'), + ('furni_queue_tile1*4_desc', 'The power of movement'), + ('help_txt_1', 'How do I get Credits?'), + ('pet_mood_3', 'Contented'), + ('nav_venue_bb_lobby_tournament_1_name', 'Competitie Battle Ball 2'), + ('furni_rare_daffodil_rug_name', 'Petal Patch'), + ('help_txt_4', 'The Habbo Way'), + ('pet_mood_0', 'Miserable'), + ('help_txt_3', 'Help with Habbo Hotel'), + ('pet_mood_1', 'Depressed'), + ('pet_mood_6', 'Ecstatic'), + ('furni_bed_budget*4_name', 'White Pura Double Bed'), + ('nav_venue_bb_lobby_amateur_0_name', 'Amateur'), + ('furni_sofachair_polyfon*7_desc', 'Green Mode Armchair'), + ('yes', 'Yes'), + ('pet_mood_4', 'Happy'), + ('pet_mood_5', 'Joyful'), + ('furni_sound_set_30_desc', 'Moments in love'), + ('furni_prizetrophy2*1_desc', 'Glittery gold'), + ('furni_wooden_screen*3_desc', 'Add an exotic touch to your room'), + ('transaction_system_bank_op', 'Osuuspankki'), + ('help_txt_6', 'Contact Us'), + ('help_txt_5', 'Safety Tips'), + ('furni_bardeskcorner_polyfon*2_desc', 'Black Mode Bardesk Corner'), + ('poster_15_desc', 'Marvellous mountains'), + ('room_areYouSurePlace', 'Warning! If you put something down in this room you will not be able to pick it up again.'), + ('nav_venue_bouncer_room_3_name', 'Semi-profs Battle Ball Arena'), + ('furni_chair_plasto*12_name', 'Chair'), + ('furni_gothic_chair*6_name', 'Gothic Chair Blue'), + ('furni_sofa_polyfon*2_desc', 'Black Mode Sofa'), + ('modtool_alertuser', 'Alert User'), + ('furni_toilet_desc', 'Loo Seat'), + ('furni_plant_cruddy_name', 'Aloe Vera'), + ('nav_venue_space_cafe/0_desc', 'In this space noone can see you ask for a soda!'), + ('nav_incorrectflatpw', 'Incorrect, try again.'), + ('furni_chair_plasto*13_desc', 'Hip plastic furniture'), + ('login_firstTimeHere', 'First time here?'), + ('furni_skullcandle_desc', 'Alas poor Yorrick...'), + ('NUF_mini_endtopic_step1_tutor', 'Well that\'s all from me. If you have any problems just click the little blue question mark to restart the tutorial and find our FAQs.\\nTo start exploring by yourself, click Close guide from the upper left corner.'), + ('furni_divider_poly3*3_name', 'White Hatch'), + ('help_callforhelp', 'Get Live Help'), + ('furni_rare_fountain*2_name', 'Bird Bath (green)'), + ('nav_venue_rooftop_name', 'Rooftop Cafe'), + ('furni_scifiport*7_name', 'Turquoise Sci-Fi Port'), + ('purse_back_to_credits', 'Back To Purse'), + ('room_ban', 'Kick & ban'), + ('furni_pura_mdl5*1_name', 'Aqua Pura Module 5'), + ('furni_val_teddy*4_name', 'Brown Share Bear'), + ('poster_40_name', 'Bonnie Blonde'), + ('NUF_getting_room_navigator_tutor', 'You want to click it real good. The \'Own room(s)\' tab I mean. Don\'t click yourself. It\'s unhygienic.'), + ('summer_chair_3_desc', 'Relax and enjoy the sun'), + ('furni_wooden_screen*2_name', 'RosewoodScreen'), + ('nav_venue_sun_terrace_name', 'Sun Terrace'), + ('furni_rare_fan*3_desc', 'Keeps the heat off St George!'), + ('nav_venue_sport_name', 'Power Gym'), + ('furni_toilet_red_desc', 'Loo Seat'), + ('retype_password', 'Retype Password:'), + ('furni_chair_basic*6_desc', 'It\'s a cracking design!'), + ('console_friends_helptext', 'This screen shows a list of all your Habbo Friends. It tells you where they are in the hotel, or, if they\'re not checked in, when their last visit was.'), + ('NUF_getting_items_room_', 'This is the Catalogue icon. Click to open it.'), + ('furni_grunge_barrel_desc', 'Beacon of light!'), + ('furni_soft_sofachair_norja*6_name', 'Blue Iced Sofachair'), + ('int_howtoget', 'How To get?'), + ('furni_sound_set_23_desc', 'Don\'t be afraid of the dark'), + ('nav_ok', 'OK'), + ('furni_sofachair_polyfon*6_name', 'Blue Mode Armchair'), + ('nav_venue_theatredrome_valentine_name', 'Theatredrome Valentine'), + ('furni_sofachair_polyfon_desc', 'Loft-style comfort'), + ('poster_83_name', 'Pöllö huhuilee'), + ('furni_soft_sofachair_norja*2_name', 'Black Iced Sofachair'), + ('roomdimmer_furni_limit', 'You can only have one roomdimmer per room'), + ('recycler_progress_timeleft', 'Time left: %hours% h and %minutes% min'), + ('furni_chair_plasto*3_name', 'Chair'), + ('NUF_getting_room_hotelview_tutor', 'Now you will learn how to make your own room. First go to the Guest Rooms area of the Navigator.'), + ('roomevent_create', 'Create'), + ('reg_year', 'Year'), + ('furni_divider_poly3_name', 'Hatch (Lockable)'), + ('furni_divider_nor1*7_name', 'Rural Iced Corner'), + ('furni_rare_beehive_bulb_name', 'Blue Amber Lamp'), + ('furni_waterbowl*2_name', 'Green Water Bowl'), + ('NUF_getting_room_room_hand', 'Open your hand!'), + ('furni_carpet_standard*6_desc', 'Available in a variety of colours'), + ('furni_CF_5_coin_silver_name', 'Silver Coin'), + ('furni_shelves_norja*7_name', 'Rural Iced Bookcase'), + ('opening_hours_text_disabled', 'The Hotel is shutting down really soon. To avoid confusion, purchasing of furniture, Habbo Club and game tickets have been disabled, as well as playing games and furniture trading. Try again tomorrow when the hotel is open!'), + ('nav_venue_bb_lobby_5_name', 'Battle Ball Kaikille'), + ('game_bs_congrat', 'Congratulations!'), + ('furni_arabian_tray2_name', 'Candle Tray'), + ('furni_giftflowers_desc', 'Guaranteed to stay fresh'), + ('club_button_1_period', 'Buy 1 >>>'), + ('furni_bed_polyfon_one*2_desc', 'Black Mode Single Bed'), + ('poster_47_name', 'Small silver star'), + ('furni_divider_nor3*5_desc', 'Pink Iced gate'), + ('furni_sofachair_polyfon_girl_desc', 'Think pink'), + ('furni_pura_mdl5*8_name', 'Yellow Pura Module 5'), + ('furni_hal_cauldron_desc', 'Eye of Habbo and toe of Mod!'), + ('poster_1006_name', 'Hoot Poster'), + ('furni_carpet_valentine_name', 'Red carpet'), + ('furni_floortile_name', 'Floor Tile'), + ('furni_divider_nor1*4_name', 'Urban Iced Corner'), + ('furni_bardeskcorner_polyfon*12_desc', 'Tuck it away'), + ('furni_table_plasto_bigsquare*3_desc', 'Hip plastic furniture'), + ('furni_traffic_light*6_desc', 'Chill and wait your turn!'), + ('club_general_prepaid', 'Prepaid Months'), + ('wallitem_val_heart_desc', 'Heartbroken... without your love!'), + ('furni_pura_mdl3*7_desc', 'Any way you like it!'), + ('furni_sound_set_58_name', 'RnB Grooves 4'), + ('furni_china_shelve_name', 'Chinese Lacquer Bookshelf'), + ('furni_divider_silo1*5_desc', 'Pink Area Corner Shelf'), + ('nav_venue_sw_lobby_tournament_desc', 'For stand-alone Tournaments.'), + ('furni_divider_silo2_name', 'Screen'), + ('furni_plant_mazegate_name', 'Maze Shrubbery Gate'), + ('poster_509_desc', 'The flag of Jamaica'), + ('furni_soft_sofachair_norja*9_name', 'Red Iced Sofachair'), + ('nav_venue_sw_arena_intermediate_name(0)', 'Playing intermediate game'), + ('furni_barchair_silo*4_name', 'Beige Bar Stool'), + ('furni_scifidoor*7_name', 'Aqua Spaceship Door'), + ('furni_CF_10_coin_gold_desc', 'Worth 10 Credits'), + ('furni_glass_sofa*8_desc', 'Translucent beauty'), + ('jukebox_reset', 'Reset Jukebox'), + ('nav_venue_sw_lobby_intermediate_desc', 'For the accomplished Snow Stormers.'), + ('furni_spotlight_desc', 'For the star of the show'), + ('furni_couch_norja_name', 'Bench'), + ('furni_romantique_divan*3_name', 'Turquoise Romantique Divan'), + ('furni_sleepingbag*7_desc', 'Ultimate coziness'), + ('roomatic_pws2', '24 hour access:'), + ('wallitem_jp_sheet1_desc', 'jp_sheet1'), + ('furni_table_silo_med*2_desc', 'Wipe clean and unobtrusive'), + ('furni_glass_table_desc', 'Translucent beauty'), + ('poster_502_desc', 'The US flag'), + ('pet_enrg_10', 'Mad'), + ('gs_scores_team_2', 'Blue Team:'), + ('pet_enrg_11', 'Nutcase'), + ('gs_scores_team_1', 'Red Team:'), + ('furni_cn_sofa_desc', 'Seating,Oriental style!'), + ('gs_scores_team_4', 'Green Team:'), + ('gs_scores_team_3', 'Yellow Team:'), + ('furni_table_silo_med*9_desc', 'Red Area Coffee Table'), + ('furni_hc_machine_name', 'Weird Science Machine'), + ('callhelp_writeyour', 'Write your question about Habbo Hotel here:'), + ('furni_table_silo_small*5_name', 'Pink Area Occasional Table'), + ('nav_addtofavourites', 'Add to favourites'), + ('furni_table_plasto_round*15_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_tournament_4_name', 'Competitie Battle Ball 5'), + ('furni_birdie_name', 'Pop-up Egg'), + ('furni_table_plasto_bigsquare_desc', 'Hip plastic furniture'), + ('furni_sound_set_33_desc', 'Guitar solo set'), + ('furni_romantique_divider*3_desc', 'Keeping things separated'), + ('furni_bed_budget*1_name', 'Aqua Pura Double Bed'), + ('furni_rare_beehive_bulb*2_desc', 'A honey-hued glow'), + ('furni_theatre_seat_desc', 'For Lazy boys and girls!'), + ('furni_hc_lmpst_desc', 'Somber and atmospheric'), + ('furni_divider_nor5*6_name', 'Blue Iced Angle'), + ('furni_summer_pool*2_desc', 'Fancy a dip?'), + ('poster_12_desc', 'a beautiful sunset'), + ('furni_carpet_polar*2_desc', 'Snuggle up on a Funky bear rug...'), + ('furni_md_rug_desc', 'Bubbles under your steps'), + ('Alert_InviteFriend', 'Invite your friends'), + ('nav_venue_bb_lobby_intermediate_4_name', 'Semi-profs Battle Ball 5'), + ('furni_hockey_score_desc', '...for keeping your score'), + ('furni_gothic_chair*3_name', 'Red Gothic Chair'), + ('wallitem_sw_stone_name', 'sw_stone'), + ('furni_pillow*7_name', 'Purple Velvet Pillow'), + ('nav_popup_header', 'Recommended rooms'), + ('nav_venue_sw_lobby_beginner_0_name', 'Snow Rookies Lobby'), + ('furni_table_norja_med*5_desc', 'For larger gatherings'), + ('furni_red_tv_name', 'Portable TV'), + ('reg_promise', '*Any personal information you supply will only be used by Habbo Ltd in accordance with the Habbo Pledge and will not be shared with third parties.'), + ('room_badge_choose', 'Modify Badge:'), + ('furni_table_plasto_square*15_desc', 'Hip plastic furniture'), + ('furni_sound_set_48_desc', 'Sweet party beat'), + ('nav_venue_ballroom_name', 'Ballroom'), + ('pet.hotwords.bad', 'bad'), + ('poster_55_desc', 'Save our trees!'), + ('furni_glass_chair_name', 'Glass chair'), + ('furni_prizetrophy5*2_desc', 'Shiny silver'), + ('furni_divider_poly3*4_desc', 'Beige Mode Bardesk Gate'), + ('tutorial_console_sample_message', 'Hello! This is a message sent to you from the Habbo Tutorial. To close and delete this message click delete. Sadly you cannot reply to this message as it is automated. Normally you can reply to messages by clicking the reply button.'), + ('furni_s_sound_machine*5_name', 'Sound Machine Brown'), + ('furni_divider_nor4*9_desc', 'Habbos, roll out!'), + ('furni_pura_mdl3*4_desc', 'Any way you like it!'), + ('NUF_getting_room_room_tutor', 'Tada! Nice room, although it\'s a little empty. Hey! Let\'s furnish it with something./nOpen your hand to check what you have, (if you have done this step before then you won\'t receive anything).'), + ('furni_fortune_desc', 'Gaze into the future'), + ('furni_soft_sofa_norja_name', 'iced sofa'), + ('furni_pura_mdl1*2_desc', 'Any way you like it!'), + ('nav_venue_sw_lobby_free_6/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('furni_divider_nor3*8_name', 'Yellow Iced gate'), + ('gs_title_finalscores', 'Final Standings:'), + ('gs_error_10', 'The hotel is closed or about to close. We look forward to welcoming you back tomorrow at (ADD LOCAL OPENING TIME).'), + ('furni_plant_bonsai_name', 'Bonsai Tree'), + ('furni_jukebox*1_name', 'Jukebox'), + ('room_loading', 'Loading room...'), + ('furni_hc_crpt_desc', 'Ultimate craftsmanship'), + ('furni_rare_hammock_desc', 'Eco bed'), + ('NUF_mini_use_console', 'Learn about messaging'), + ('furni_romantique_chair*1_desc', 'Elegant seating for elegant Habbos'), + ('transaction_system_bank_digiraha', 'Digiraha'), + ('NUH_messenger', 'Open your Console here - you might have messages or friend requests waiting.'), + ('furni_arabian_chair_desc', 'Exotic, soft seating'), + ('furni_noob_chair*6_name', 'My first Habbo chair'), + ('poster_510_desc', 'The flag of Italy'), + ('furni_carpet_standard*a_desc', 'Available in a variety of colours'), + ('queue_set.c.info', 'There are %c% Habbo Club member(s) in front of you. Be patient :)'), + ('furni_scifiport*4_name', 'Pink Sci-Fi Port'), + ('furni_sound_set_44_name', 'Graveyard Portal'), + ('furni_pura_mdl4*1_desc', 'Any way you like it!'), + ('furni_divider_silo3*6_desc', 'Blue Area Gate'), + ('furni_sound_machine*4_name', 'Blue Traxmachine'), + ('send_invitation_header', 'Get a warm welcome'), + ('game_TicTacToe', 'Boter kaas en eieren'), + ('nav_venue_sw_lobby_tournament_1_name', 'Tournament Lobby'), + ('furni_rare_fan*2_name', 'Green Powered Fan'), + ('furni_doormat_plain*2_name', 'Doormat'), + ('furni_table_plasto_square*7_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_intermediate_8/0_desc', ''), + ('furni_noob_table*6_desc', 'Lightweight, practical and green'), + ('win_callforhelp', 'Alert a Moderator'), + ('furni_prizetrophy8*1_desc', 'Glittery gold'), + ('furni_chair_norja*5_name', 'Pink Chair'), + ('furni_hc_tv_desc', 'Forget plasma, go HC!'), + ('furni_divider_arm1_name', 'Corner plinth'), + ('furni_table_plasto_round*7_name', 'Round Dining Table'), + ('furni_petfood3_name', 'Cabbage Mega Multipack'), + ('furni_carpet_standard*9_name', 'Floor Rug'), + ('opening_hours_title', 'Hotel Maintenance'), + ('console_noemail', 'Sorry,'), + ('furni_couch_norja*8_name', 'Yellow Bench'), + ('furni_s_sound_machine*1_desc', 'Sound Machine Grey Desc'), + ('furni_noob_stool*6_name', 'My first Habbo stool'), + ('purse_event', 'ACTIVITY'), + ('reg_readterms_alert', 'You have to read the Terms and Conditions\\r(scroll to the bottom of the text).'), + ('pet.hotwords.beg', 'beg'), + ('furni_jp_drawer_name', 'Japanese Drawer'), + ('gs_state_started', 'This Game has already started...'), + ('furni_sound_set_11_name', 'Dance 4'), + ('furni_divider_nor2*4_name', 'Urban Iced Bar'), + ('queue_set.e2.info', 'There are %e2% Habbos in front of you in the queue.'), + ('furni_bath_name', 'Bubble Bath'), + ('furni_rare_icecream*3_desc', 'Virtual blackcurrant rocks!'), + ('nav_modify_nameoftheroom', 'Name Of The Room'), + ('furni_scifiport*1_desc', 'Energy beams. No trespassers!'), + ('nav_venue_bb_lobby_amateur_12/0_desc', ''), + ('furni_table_silo_small*8_name', 'Yellow Occasional Table'), + ('furni_divider_silo3*3_name', 'White Area Gate'), + ('nav_venue_sw_lobby_amateur_7/0_desc', 'Astetta rankempaa lumisotaa.'), + ('reply', 'Reply'), + ('furni_toilet_yell_desc', 'Loo Seat'), + ('hobba_alert', 'Moderator Alert'), + ('You can play a bunch of exciting games, visit your friends\' rooms or even make your own place and decorate it to your heart\'s delight.', ''), + ('pet.saying.eat.croco.4', '*Buurrrrp*'), + ('furni_tree5_desc', 'Any presents under it yet?'), + ('pet.saying.eat.croco.2', '*Chomp chomp*'), + ('pet.saying.eat.croco.3', 'Mmmm mmmmm....'), + ('furni_divider_poly3*7_name', 'Green Mode Bardesk Gate'), + ('pet.saying.eat.croco.0', 'Mmmm yum yum'), + ('pet.saying.eat.croco.1', 'Ruff ruff ruff'), + ('furni_scifidoor*4_name', 'Emerald Spaceship Door'), + ('furni_edice_name', 'Holo-dice'), + ('furni_divider_nor4*6_name', 'Blue Iced Auto Shutter'), + ('furni_safe_silo*3_desc', 'Totally shatter-proof!'), + ('furni_table_silo_small_desc', 'For those random moments'), + ('gs_header_page', 'Page'), + ('furni_sporttrack3*2_name', 'Sport goal asphalt'), + ('furni_pura_mdl2*6_desc', 'Any way you like it!'), + ('furni_hcamme_name', 'Tubmaster'), + ('furni_carpet_soft*2_desc', 'Soft Wool Rug'), + ('furni_sound_set_12_name', 'Habbo Sounds 2'), + ('forgottenpw_done', 'If the email you gave during registration was correct, your password will be sent to you now.'), + ('navigator.no_category', 'No Category'), + ('login_whatsHabboCalled', 'What\'s your Habbo called?'), + ('furni_scifidoor*3_name', 'Lightblue Spaceship Door'), + ('game_poker', 'POKER'), + ('roomatic_pws', 'Password for selected'), + ('furni_glass_table*8_name', 'Glass table'), + ('furni_one_way_door*8_desc', 'One at a time!'), + ('furni_bardesk_polyfon*9_desc', 'Perfect for work or play'), + ('nav_venue_bb_lobby_tournament_13_name', 'Competitie Battle Ball 14'), + ('pet.hotwords.sit', 'sit'), + ('furni_arabian_tray3_desc', 'Indulge yourself!'), + ('furni_sound_set_40_desc', 'Dude? Cheese!'), + ('console_compose', 'Compose A Message'), + ('furni_table_plasto_square*3_name', 'Square Dining Table'), + ('furni_rclr_sofa_name', 'Polar Sofa'), + ('poster_2005_name', 'Infobus'), + ('furni_table_plasto_4leg*9_name', 'Occasional Table'), + ('furni_chair_norja*9_desc', 'Sleek and chic for each cheek'), + ('Room', 'Room:'), + ('furni_chair_plasty*2_name', 'Plastic Pod Chair'), + ('furni_romantique_pianochair*3_name', 'Turquoise Romantique Piano Chair'), + ('furni_rare_parasol*2_name', 'Orange Parasol'), + ('loading_project', 'Loading Habbo Hotel...'), + ('poster_505_name', 'The Maple Leaf'), + ('furni_traffic_light*2_desc', 'Chill and wait your turn!'), + ('nav_venue_sw_lobby_amateur_4_name', 'Snow Slingers Lobby'), + ('furni_grunge_shelf_name', 'Grunge Bookshelf'), + ('furni_sofa_polyfon*8_name', 'Yellow Mode Sofa'), + ('furni_doorC_desc', 'In a hurry?'), + ('roomatic_nomatch', 'Sorry. Your passwords don\'t match. Please enter them again.'), + ('furni_soft_sofa_norja*9_name', 'Red Iced Sofa'), + ('nav_venue_tv_studio_general/0_desc', 'Suosikki rules! Musaa, leffoja ja staroja!'), + ('nav_venue_sw_arena_amateur_name', 'Playing amateur game'), + ('interface_icon_events', 'Open the room event browser'), + ('furni_grunge_table_desc', 'Students of the round table!'), + ('furni_wooden_screen*9_name', 'Green Oriental Screen'), + ('NUF_getting_room_hotelview_nav', 'Click to open the Navigator.'), + ('furni_table_silo_med*5_name', 'Pink Area Coffee Table'), + ('furni_divider_silo1*9_name', 'Red Area Small Table'), + ('nav_venue_bb_lobby_amateur_4_name', 'Gevorderden Battle Ball 5'), + ('room_badge_hidden', 'Hidden'), + ('pet.saying.generic.cat.0', 'meow'), + ('furni_marquee*3_desc', 'It\'s both door and a shade!'), + ('pet.saying.generic.cat.1', 'meow...meOW'), + ('nav_venue_cunning_fox_gamehall/4_name', 'Chess'), + ('furni_present_gen_desc', 'What\'s inside?'), + ('pet.saying.generic.cat.2', 'muew..muew'), + ('pet.saying.generic.cat.3', 'Purrrrrrrrrr'), + ('furni_scifidoor*1_desc', 'There out of this world!'), + ('pet.saying.generic.cat.4', 'Purrrrr oow'), + ('furni_fridge_name', 'Pura Refridgerator'), + ('furni_rubberchair*2_name', 'Pink Inflatable Chair'), + ('furni_romantique_chair*4_name', 'Amber Chair'), + ('bb_fieldname_5', 'Barebones Classic'), + ('furni_sofa_silo*7_desc', 'Green Area Sofa'), + ('bb_fieldname_4', 'Gothic Hallway'), + ('furni_prizetrophy6*2_name', 'Champion trophy'), + ('bb_fieldname_3', 'Maze Park'), + ('bb_fieldname_2', 'Coral Beach'), + ('bb_fieldname_1', 'Sky Peak'), + ('furni_safe_silo_pb_name', 'postbank Safe'), + ('furni_solarium_norja*2_desc', 'Rejuvenate your pixels!'), + ('furni_table_plasto_bigsquare*7_desc', 'Hip plastic furniture'), + ('reg_check_age', 'Age'), + ('furni_exe_chair2_desc', 'You\'re fired!'), + ('furni_typingmachine_name', 'Typewriter'), + ('human_carrying', 'Carrying:'), + ('furni_grunge_sign_name', 'Road Sign'), + ('loading', 'Loading...'), + ('furni_bed_polyfon_one*6_name', 'Blue Mode Single Bed'), + ('furni_bed_budget_one*1_desc', 'Prince sized comfort!'), + ('furni_sofa_polyfon_name', 'Two-seater Sofa'), + ('furni_jp_lantern_desc', 'For a mellow Eastern glow'), + ('furni_gothic_stool*2_name', 'Golden Gothic Stool'), + ('roomevent_starttime', 'Started at:'), + ('furni_prize1_desc', 'Gorgeously glittery'), + ('furni_prizetrophy9*1_name', 'Champion trophy'), + ('wallitem_guitar_skull_desc', 'tilulilulaa'), + ('gs_title_bestplayer', 'Best player:'), + ('nav_removefavourites', 'Remove from favourites'), + ('furni_toy1_desc', 'it\'s bouncy-tastic'), + ('alert_shortenPW', 'Your password cannot be longer than 9 characters'), + ('normal_roomlayouts', '<< Back to normal room layouts'), + ('furni_noob_rug*1_name', 'My first Habbo rug'), + ('poster_58_name', 'Red knots poster'), + ('furni_divider_nor2*8_desc', 'Yellow Iced bar desk'), + ('furni_carpet_polar*1_name', 'Pink Faux-Fur Bear Rug'), + ('habboclub_continue_button', 'Buy one month'), + ('furni_divider_silo3_desc', 'Form following function'), + ('furni_sound_set_7_name', 'SFX 5'), + ('furni_soft_sofa_norja*5_desc', 'Pink Iced Sofa'), + ('furni_arabian_rug_desc', 'Green blossom design'), + ('restart_tutorial', 'Restart tutorial'), + ('gs_choose_numteams', 'Choose number of Teams:'), + ('hubu_info_t', 'The big FRANK Infobus'), + ('furni_divider_nor5*7_desc', 'Cool cornering for your crib!'), + ('furni_bed_polyfon*4_name', 'Beige Mode Double Bed'), + ('callhelp_allwillreceive', 'A member of community staff will investigate the situation and take appropriate action. This may include sending you a response with advice on dealing with your issue.'), + ('furni_pura_mdl4*4_name', 'White Pura Module 4'), + ('hubu_odotetaan', 'Waiting for replies from others...'), + ('furni_door_name', 'Telephone Box'), + ('furni_doormat_plain*5_desc', 'Available in a variety of colours'), + ('furni_gothic_carpet_desc', 'The path less travelled'), + ('poster_516_desc', 'Eng-er-land'), + ('furni_gothic_stool*6_desc', 'The dark side of Habbo'), + ('furni_traffic_light*3_desc', 'Chill and wait your turn!'), + ('furni_bartable_armas_desc', 'Bar-Style Table - essential for extra guests'), + ('club_isp_change', 'Change your subscription'), + ('furni_summer_grill*2_name', 'Red Barbeque Grill'), + ('poster_23_desc', 'flap, flap, screech, screech...'), + ('furni_prizetrophy7*3_desc', 'Bronze Habbo trophy'), + ('furni_couch_norja*2_name', 'Black Bench'), + ('nav_venue_cunning_fox_gamehall/0_desc', 'Pit your wits on the battlefield, the board or the baize - choose what to play here'), + ('furni_jp_tatami2_name', 'Large Tatami Mat'), + ('furni_pura_mdl3*3_desc', 'Any way you like it!'), + ('furni_house_name', 'Gingerbread House'), + ('furni_sound_set_54_name', 'Oh Blinging Tree'), + ('furni_table_plasto_4leg*1_name', 'Square Dining Table'), + ('furni_pillow*1_name', 'Pink Fluffy Pillow'), + ('NUF_console_hotelview_tutor', 'Oh! You have a message on your Habbo Console. Let\'s see who it is.'), + ('LoadingRoom', 'Loading room...'), + ('rotate', 'Rotate'), + ('nav_venue_sw_lobby_beginner_6_name', 'Snow Rookies Lobby'), + ('nav_venue_bb_lobby_amateur_1/0_desc', ''), + ('furni_jukebox_ptv*1_desc', 'Jukebox Pacha TV'), + ('nav_venue_star_lounge/0_desc', 'Chat with Sean Kingston here!'), + ('furni_chair_plasty*6_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_tournament_10/0_desc', ''), + ('NUF_mini_use_console_hotelview_tutor', 'Ah! You have a message on your Habbo Console. Let\'s see who it is.'), + ('furni_rare_xmas_screen_name', 'Lappland Greetings'), + ('summer_chair_9_name', 'Red Deck Chair'), + ('club_timefull', 'Sorry, you can only buy up to three months of Habbo Club subscription in advance.'), + ('poster_2002_desc', 'Presidentin muotokuva'), + ('poster_7_name', 'Hammer Cabinet'), + ('furni_gothic_chair*2_name', 'Golden Gothic Chair'), + ('bb_header_powerups', 'Powerups in game:'), + ('credit_redeem_url', 'http://%predefined%//help/19'), + ('furni_divider_silo3*2_name', 'Black Area Gate'), + ('furni_chair_plasto*16_name', 'Chair'), + ('catalog_itsurs', 'Yay! It\'s being delivered now..'), + ('hobba_pickandreply', 'Pick & Reply'), + ('reg_terms', 'Welcome to Habbo Hotel. If you are under 16, please check the Terms and Conditions with your parents/guardian before you agree to them. Get them to explain anything that you don\'t understand.\\rIn order to use the service you have to give valid information about yourself when registering. Please email us if any of your user information changes.\\rAs a user of Habbo Hotel - www.habbohotel.co.uk , you have to behave according to the Habbo Way (hotel rules) and the Terms and Conditions. Click the links below to read about them.\\rNever give your password or email address to anyone. If you do, your Habbo may get stolen.\\rRegistering with the hotel, making your own empty room and chatting is free of charge. For a small fee you can decorate your room with virtual furniture, play games and join the Habbo Club. If you wish to buy, you will need your parent\'s permission to do so.'), + ('furni_summer_pool*1_name', 'Blue Summer Pool'), + ('furni_heartsofa_desc', 'Perfect for snuggling up on'), + ('furni_scifiport*3_name', 'Jade Sci-Fi Port'), + ('furni_glass_chair*6_name', 'Blue Glass Chair'), + ('furni_sound_set_62_name', 'Alhambra Trax 1'), + ('win_voucher', 'Habbo Credit Code'), + ('furni_summer_chair*4_desc', 'White'), + ('furni_bed_polyfon_one_desc', 'Cot of the artistic'), + ('nav_venue_bb_lobby_tournament_5/0_desc', ''), + ('nav_venue_bb_lobby_beginner_3_name', 'Beginners Battle Ball 4'), + ('console_follow_not_friend', 'The user you tried to follow is not your friend anymore.'), + ('delete', 'Delete'), + ('furni_grunge_mattress_desc', 'Beats sleeping on the floor!'), + ('furni_rare_icecream*7_name', 'Chocolate Ice Cream Machine'), + ('sound_machine_alert_no_disks', 'You don\'t have any more discs!'), + ('furni_sofachair_silo_name', 'Armchair'), + ('nav_venue_sw_lobby_expert_0_name', 'Snow Marksmen Lobby'), + ('game_waitop', 'WAITING FOR THE OPPONENT'), + ('Alert_NameAlreadyUse', 'That name is already being used'), + ('furni_queue_tile1*1_desc', 'The power of movement'), + ('poster_18_name', 'Butterfly Cabinet 2'), + ('furni_wooden_screen*6_desc', 'Add an exotic touch to your room'), + ('furni_noob_table*2_name', 'My first Habbo table'), + ('furni_tree1_name', 'Dead tree'), + ('nav_venue_bouncer_room_0_name', 'Battle Ball Competitie Arena'), + ('furni_traffic_light*5_name', 'White Traffic Light'), + ('furni_sw_raven_name', 'Mrs Raven'), + ('cam_shoot.help', 'Shutter Release'), + ('furni_grand_piano*3_desc', 'Make sure you play in key!'), + ('nav_venue_sw_lobby_intermediate_2_name', 'Snow Bombardiers Lobby'), + ('interface_icon_purse', 'Purse, manage your coins'), + ('poll_alert_server_error', 'The poll isn\'t available anymore. Polls are only available at a certain public space for a certain duration.'), + ('sound_machine_confirm_delete_long', 'Are you sure you want to delete the selected song?'), + ('reg_check_confirm', 'Please check that your information is correct, especially your birthdate and Habbo name. You CANNOT change these later. If you want make any changes now, press the back button.'), + ('Alert_CheckBirthday', 'Please check your birthday'), + ('furni_shelves_norja*4_desc', 'For nic naks and tech books'), + ('club_expired_link', 'Click here to join Habbo Club'), + ('poster_520_desc', 'Every colour for everyone'), + ('nav_venue_bb_lobby_intermediate_desc', 'Intermediate battle ball!'), + ('tutorial_restart_button_bubble', 'Remember! Anytime you want to relive the fun click here to restart the tutorial!'), + ('poster_1_name', 'Comedy Poster'), + ('reg_verification_incorrectBirthday', 'Your birthday was incorrect'), + ('furni_glass_stool*6_name', 'Blue Glass Stool'), + ('furni_CFC_100_coin_gold_desc', 'Worth 100 Credits'), + ('buddyremove_list_full', 'Your friends list is full, you can\'t add new friends until you delete some. \\r\\The maximum number of friends you can have, is %mylimit% Habbos. Members of Habbo Club can have up to %clublimit% friends on their list.'), + ('furni_bunny_name', 'Squidgy Bunny'), + ('furni_small_chair_armas_name', 'Stool'), + ('nav_venue_sw_lobby_free_0/0_desc', ''), + ('furni_sofachair_silo*3_name', 'White Armchair'), + ('furni_sound_machine*2_desc', 'Dance to the Habbo Club beat!'), + ('nav_venue_gate_park/0_desc', 'Follow your path...'), + ('NUF_mini_use_console_hotelview_icon', 'Click the icon to open your Habbo Console.'), + ('nav_venue_eric\'s_eaterie/0_desc', 'Join Eric for a bite to eat'), + ('furni_table_silo_med*8_desc', 'Wipe clean and unobtrusive'), + ('poster_503_desc', 'There\'s no holes in this...'), + ('furni_bardeskcorner_polyfon*9_name', 'Red Corner Desk'), + ('furni_val_randomizer_desc', 'Surprise surprise! (Cilla Black not included)'), + ('furni_marquee*2_name', 'Red Dragon Marquee'), + ('furni_table_plasto_round_name', 'Round Dining Table'), + ('furni_summer_chair*3_name', 'Deck Chair'), + ('club_paycoins', 'Buy subscription'), + ('nav_venue_beauty_salon_general/0_desc', 'Join in the fun of Fashion Week! Check the homepage now for details.'), + ('furni_rare_dragonlamp*7_name', 'Sky Dragon Lamp'), + ('nav_venue_bb_lobby_beginner_6/0_desc', ''), + ('roomevent_quit', 'End event'), + ('console_search_habbo_lasthere', 'Last time'), + ('trading_title', 'Safe Trading'), + ('furni_glass_chair*7_desc', 'Habbo Club'), + ('gs_error_game_deleted', 'The Game has been deleted.'), + ('recycler_info_link_url', 'http://%predefined%/help/36'), + ('furni_pillar*6_name', 'Terracotta Pillar'), + ('furni_tile_stella_desc', '10% off the walk of fame!'), + ('transaction_system_sms_win_tmobile', 'T-Mobile SMS'), + ('buddyremove_names_ordered', 'Names Ordered By:'), + ('pet_race_2_010', 'Giggly Go-go'), + ('furni_table_plasto_bigsquare*6_name', 'Square Dining Table'), + ('pet_race_2_011', 'Petty Petsuchos'), + ('summer_chair_6_name', 'Blue Deck Chair'), + ('console_now', 'now:'), + ('gs_skill_changed', 'You have advanced to the next skill level. Your level is now %1!'), + ('roomatic_goyourroom', 'Go to your room'), + ('furni_carpet_soft*4_name', 'Soft Wool Rug'), + ('sound_machine_confirm_close_list', 'Close playlist editor?'), + ('pet.hotwords.good', 'good'), + ('furni_pura_mdl4*7_desc', 'Any way you like it!'), + ('furni_carpet_soft*1_name', 'Soft Wool Rug'), + ('furni_sound_set_22_desc', 'With a hamper full of sounds, not sarnies'), + ('nav_venue_sw_lobby_tournament_7_name', 'Tournament Lobby'), + ('furni_divider_nor3*6_desc', 'Blue Iced gate'), + ('furni_carpet_standard*3_name', 'Floor Rug'), + ('people', 'People'), + ('pet_race_2_007', 'Pretty Pui Pui'), + ('pet_race_2_008', 'Indifferent'), + ('pet_race_2_009', 'Swampy Siamese'), + ('furni_wcandle_name', 'White Candle'), + ('furni_sporttrack1*1_desc', 'null'), + ('furni_solarium_norja*1_name', 'Black Solarium'), + ('NUF_playing_games_gamecategories_tutor', 'Click the Beginner category to open it wide open. Like a melon!'), + ('pet_race_2_003', 'Silly Sobek'), + ('pet_race_2_004', 'Dirty Dundee'), + ('pet_race_2_005', 'Galled Gator'), + ('int_credits', 'Credits'), + ('furni_gothrailing_name', 'Gothic Railing'), + ('furni_sporttrack2*2_desc', 'null'), + ('pet_race_2_006', 'Confused Croc'), + ('furni_shelves_polyfon_name', 'Bookcase'), + ('pet_race_2_000', 'Endangered Albino'), + ('pet_race_2_001', 'Krazy Krokodilos'), + ('pet_race_2_002', 'Nile Dile'), + ('furni_divider_nor2*2_desc', 'Black Iced bar desk'), + ('log_problem_text', 'Oops.. Cannot connect to Habbo Hotel'), + ('furni_divider_nor2*5_desc', 'Pink Iced bar desk'), + ('nav_venue_sw_lobby_amateur_6/0_desc', 'Astetta rankempaa lumisotaa.'), + ('furni_rare_fountain_desc', 'For our feathered friends'), + ('furni_glass_sofa*5_name', 'Glass sofa'), + ('poster_33_desc', 'We can\'t bear to lose them'), + ('nav_venue_bb_lobby_tournament_14/0_desc', ''), + ('furni_summer_chair*6_name', 'Deck Chair'), + ('furni_hcsohva_desc', 'For royal bottoms...'), + ('furni_bed_budget*4_desc', 'King sized comfort!'), + ('furni_christmas_poop_desc', 'Bob?s magical fertilizer'), + ('furni_pura_mdl5*7_name', 'Green Pura Module 5'), + ('furni_barrier*1_desc', 'No escape this way!'), + ('nav_venue_bb_lobby_amateur_8/0_desc', ''), + ('furni_divider_arm2_desc', 'I wooden go there'), + ('furni_chair_plasty*11_desc', 'Hip plastic furniture'), + ('furni_small_table_armas_desc', 'Practical and beautiful'), + ('nav_venue_theatredrome_xmas_name', 'Theatredrome Xmas'), + ('poster_62_name', 'Save The Panda'), + ('reg_verification_currentPassword', 'Current password:'), + ('game_poker_change', 'Choose cards to change'), + ('NUF_getting_items_hotelview_nav', 'Click here to open the Navigator'), + ('furni_chair_basic*9_name', 'Red Pura Egg Chair'), + ('friend_request_failed', 'Failed!'), + ('furni_noob_chair*4_desc', 'Lightweight, practical, with light blue stripes'), + ('furni_table_silo_small*9_desc', 'Red Area Occasional Table'), + ('nav_hotelview', 'Hotel view'), + ('furni_toy1*3_desc', 'it\'s bouncy-tastic'), + ('furni_divider_nor3*2_name', 'Black Iced gate'), + ('furni_chair_silo*6_name', 'Blue Silo Dining Chair'), + ('update_password_suggest', 'Habbo Hotel security supervisor requests you to update your password'), + ('nav_venue_orient_name', 'Club Orient'), + ('Alert_NameTooLong', 'Sorry, that username is too long!'), + ('furni_sound_set_37_name', 'Sound set 37'), + ('furni_barchair_silo*7_desc', 'Practical and convenient'), + ('wallitem_wallmirror_name', 'Wallmirror'), + ('furni_chair_plasty*8_name', 'Plastic Pod Chair'), + ('sound_machine_confirm_close_list_long', 'Are you sure you want to exit playlist editor without saving?'), + ('furni_hc_frplc_name', 'Heavy Duty Fireplace'), + ('dance4', 'The Rollie'), + ('dance3', 'Duck Funk'), + ('furni_glass_stool*9_name', 'Glass stool'), + ('furni_sound_set_55_desc', 'Can you fill me in?'), + ('furni_carpet_standard*7_desc', 'Available in a variety of colours'), + ('poster_4_name', 'Bear Plaque'), + ('cam_zoom_out.help', 'Zoom Out'), + ('furni_sofa_polyfon*2_name', 'Black Mode Sofa'), + ('furni_prizetrophy2*1_name', 'Duck trophy'), + ('furni_scifirocket*3_desc', 'Caution! Unknown Location!'), + ('NUF_getting_items', 'Getting items'), + ('furni_val_teddy*1_desc', 'The grey bear of affection'), + ('furni_sofachair_polyfon*7_name', 'Green Mode Armchair'), + ('club_habbo.bottombar.link.member', '%days% days'), + ('habboclub_confirm_header', 'Subscription costs %price% credits'), + ('furni_rare_daffodil_rug_desc', 'A little bit of outdoors indoors..'), + ('poster_15_name', 'Himalayas Poster'), + ('furni_smooth_table_polyfon_desc', 'For larger gatherings'), + ('dance2', 'Pogo Mogo'), + ('furni_wooden_screen*3_name', 'Aqua Oriental Screen'), + ('furni_plant_cruddy_desc', 'Goodbye Bert...'), + ('dance1', 'Hab-Hop'), + ('furni_gothic_chair*6_desc', 'The dark side of Habbo'), + ('furni_table_plasto_square*9_name', 'Square Dining Table'), + ('nav_venue_bb_lobby_beginner_14/0_desc', ''), + ('furni_club_sofa_desc', 'Club sofa'), + ('roomevent_default_name', 'Event name..'), + ('game_poker_ok', 'Change cards'), + ('nav_venue_picnic_dudesons/0_desc', 'Duudsoneiden sponssaama oma Ranchi - www.extremeduudsonit.com'), + ('nav_venue_hallway/0_desc', 'Beware the ghosts and ghouls!'), + ('nav_venue_park/0_desc', 'Go for a stroll outdoors'), + ('console_fr_declined_count', 'Amount to be declined'), + ('furni_tree4_name', 'Christmas Tree 2'), + ('NUF_console_read_link', 'Click the link to open the message.'), + ('win_figurecreator', 'Habbo Details'), + ('furni_table_plasto_square*14_name', 'Occasional Table'), + ('furni_soft_sofachair_norja*6_desc', 'Blue Iced Sofachair'), + ('nav_venue_bb_lobby_beginner_0_name', 'Beginner'), + ('Alert_LogoNameAlreadyUse', 'That name is already being used'), + ('poster_25_name', 'Snowman Poster'), + ('furni_pura_mdl2*2_name', 'Pink Pura Module 2'), + ('furni_chair_plasto*13_name', 'Chair'), + ('furni_ticket_name', 'Small Ticket Bundle'), + ('furni_hc_lmpst_name', 'Victorian Street Light'), + ('furni_scifiport*7_desc', 'Energy beams. No trespassers!'), + ('jukebox_load_trax', 'Load Trax'), + ('furni_val_teddy*4_desc', 'The brown bear of naughtiness'), + ('reg_birthdayformat_update', 'Birthday (dd.mm.yyyy)'), + ('nav_venue_the_chromide_club_name', 'The Chromide Club'), + ('roomevent_not_available', 'Sorry, no events available'), + ('nav_venue_sw_lobby_beginner_0/0_desc', ''), + ('summer_chair_3_name', 'Black Deck Chair'), + ('int_newrequests', 'Friend Request(s)'), + ('console_profile_helptext', 'The Habbo Profile is a snapshot of your interests and hobbies - simply tick the things you like.'), + ('nav_roomnfo_hd_fav', 'Favourite Rooms'), + ('furni_chair_plasto*3_desc', 'Hip plastic furniture'), + ('furni_chair_basic*6_name', 'Blue Pura Egg Chair'), + ('number_4', '4'), + ('number_3', '3'), + ('number_2', '2'), + ('room_open_package', 'Open The Present'), + ('furni_grunge_barrel_name', 'Flaming Barrel'), + ('wallitem_photo_desc', 'Photo from Habbo'), + ('poster_30_desc', 'Pucker up'), + ('furni_glass_table*9_desc', 'Translucent beauty'), + ('nav_venue_sw_lobby_beginner_3_name', 'Snow Rookies Lobby'), + ('Alert_YouAreBanned', 'You have been banned for breaking the Habbo Way. This is why (if no ban reason is shown use the Contact Us form):'), + ('furni_gothic_sofa*2_name', 'Golden Gothic Sofa'), + ('NUF_getting_items_hotelview_tutor', 'Let us find out how to purchase items from the Hotel Catalogue. The Catalogue contains loads of cool stuff to decorate your Habbo room with. To begin open the Navigator.'), + ('furni_table_norja_med*2_desc', 'For larger gatherings'), + ('furni_sofa_silo*3_name', 'White Two-Seater Sofa'), + ('furni_pura_mdl5*5_desc', ''), + ('nav_venue_sw_lobby_beginner_desc', 'Yes, take a load of snowballs and hit the enemy Teams. Easy, isn\'t it?'), + ('furni_romantique_smalltabl*5_name', 'Onyx Tray Table'), + ('furni_divider_nor4_desc', 'Habbos, roll out!'), + ('furni_shelves_norja*7_desc', 'For nic naks and cookery books'), + ('nav_venue_sw_lobby_intermediate_4/0_desc', 'Lumisota sen kuin vain kovenee.'), + ('gs_text_spectate', 'You can watch this game'), + ('recycler_info_link', 'More information about Furni Recycler'), + ('furni_sofachair_polyfon_name', 'Armchair'), + ('club_intro_text', 'Members of Habbo Club get LOTS of cool stuff!\\rWith Habbo Club you get cool dances, access to Club Mammoth and The Blue Dragon Tavern, and a 500 limit on your friends list!'), + ('furni_divider_nor1*7_desc', 'The missing piece'), + ('url_helppledge', 'http://%predefined%//help/22'), + ('jukebox_song_name', '%name%'), + ('game_bs_won', 'WON!'), + ('furni_soft_jaggara_norja_name', 'Iced Sofachair'), + ('furni_rare_beehive_bulb_desc', 'A honey-hued glow'), + ('furni_chair_norja*8_name', 'Yellow Chair'), + ('poster_83_desc', 'Pöllö huhuilee, huhuu!'), + ('floodblocking', 'You are typing too fast - don\'t flood the room.'), + ('furni_CF_5_coin_silver_desc', 'Worth 5 Credits'), + ('sound_machine_confirm_clear', 'Clear the song?'), + ('furni_carpet_standard*6_name', 'Floor Rug'), + ('furni_waterbowl*2_desc', 'Aqua unlimited'), + ('sw_link_tournament_highScores_url', 'http://%predefined%//groups/56553/id'), + ('NUF_meeting_people_room_tutor', 'This is a Public Room. Your Habbo is in the doorway beneath the orange arrow. Click on another user to find out more about them.'), + ('furni_bottle_name', 'Empty Spinning Bottle'), + ('poster_512_name', 'The Irish flag'), + ('club_info_url', 'http://%predefined%//credits/habboclub'), + ('nav_venue_tv_studio_nike/0_desc', ''), + ('furni_couch_norja*6_desc', 'Two can perch comfortably'), + ('furni_pura_mdl5*8_desc', 'Any way you like it!'), + ('furni_carpet_valentine_desc', 'For making an appearance'), + ('furni_floortile_desc', 'In Variety of Colours'), + ('furni_pillar*9_name', 'Rock Pillar'), + ('furni_table_plasto_bigsquare*3_name', 'Square Dining Table'), + ('furni_bardeskcorner_polyfon*12_name', 'Corner Cabinet/Desk'), + ('furni_divider_nor1*4_desc', 'The missing piece'), + ('furni_chair_plasty*5_name', 'Plastic Pod Chair'), + ('furni_scifirocket*0_desc', 'See in 2007 with a bang!'), + ('poster_32_name', 'Siva Poster'), + ('club_button_2_period', 'Buy 3 >>>'), + ('furni_sound_set_58_desc', 'Sh-shake it!'), + ('furni_china_shelve_desc', 'To hold the mind\'s treasures'), + ('furni_scifidoor*7_desc', 'There out of this world!'), + ('furni_chair_silo*9_name', 'Red Silo Dining Chair'), + ('furni_gothic_stool*5_name', 'Green Gothic Stool'), + ('friend_request_massoperation_cancel', 'Back to request list.'), + ('furni_queue_tile1*0_name', 'White Quest Roller'), + ('furni_divider_nor3*5_name', 'Pink Iced gate'), + ('furni_sound_machine*5_desc', 'Heard the Habbo Bands new singles?'), + ('furni_glass_table*6_desc', 'Translucent beauty'), + ('furni_soft_sofachair_norja*9_desc', 'Red Iced Sofachair'), + ('furni_plant_mazegate_desc', 'Did we make it?'), + ('tickets_info_1', 'With 2 tickets you can play the following Games:\\r10 BattleBall:Rebound!\\r10 SnowStorm\\r20 Wobble Squabble or\\r20 Lido Diving'), + ('furni_barchair_silo*4_desc', 'Practical and convenient'), + ('furni_CF_10_coin_gold_name', 'Gold Coin'), + ('tickets_info_2', 'With 20 tickets you can play the following Games:\\r10 BattleBall:Rebound!\\r10 SnowStorm\\r20 Wobble Squabble or\\r20 Lido Diving'), + ('furni_sound_set_15_desc', 'Unadulterated essentials'), + ('handitem1', 'Tea'), + ('furni_romantique_divan*3_desc', 'null'), + ('furni_glass_sofa*8_name', 'Glass sofa'), + ('epsnotify_1001', 'The hotel is full at the moment. Please try again in a few minutes.'), + ('furni_table_silo_med*2_name', 'Black Coffee Table'), + ('furni_sleepingbag*7_name', 'Orange Sleeping Bag'), + ('furni_pillow*5_desc', 'Puffy, soft and huge'), + ('furni_bed_budget*1_desc', 'King sized comfort!'), + ('furni_bed_trad_one_name', 'Plain Single Bed'), + ('catalog_giftfor', 'This is a gift for:'), + ('furni_theatre_seat_name', 'Deluxe Theatre Chair'), + ('furni_romantique_divider*3_name', 'Turquoise Screen'), + ('furni_shelves_silo_desc', 'For nic naks and art deco books'), + ('handitem9', 'Decaff'), + ('handitem8', 'Regular'), + ('handitem7', 'Water'), + ('furni_glass_table_name', 'Glass table'), + ('console_selection_invert', 'Invert selection'), + ('handitem6', 'Blackcurrant'), + ('furni_hc_machine_desc', 'By and for mad inventors'), + ('handitem5', 'Milk'), + ('handitem4', 'Ice-cream'), + ('poster_40_desc', 'The one and only. Adore her!'), + ('nav_venue_sw_lobby_tournament_9/0_desc', ''), + ('handitem3', 'Carrot'), + ('handitem2', 'Juice'), + ('furni_cn_sofa_name', 'Chinese Sofa'), + ('nav_venue_bb_lobby_expert_4/0_desc', ''), + ('poster_502_name', 'The Stars and Stripes'), + ('furni_md_rug_name', 'Bubble Juice Floor'), + ('furni_table_plasto_bigsquare_name', 'Square Dining Table'), + ('furni_bed_polyfon*8_desc', 'Yellow Mode Double Bed'), + ('nav_venue_sw_lobby_amateur_7_name', 'Snow Slingers Lobby'), + ('furni_birdie_desc', 'Cheep (!) and cheerful'), + ('poster_12_name', 'Lapland Poster'), + ('club_desc_1_period', '1 Month (31 days) = 25 Credits'), + ('hobba_emergency_help', 'Call For Emergency Help:'), + ('reg_age_check_note', 'Enter your birthday. You will need your birthday information when changing your password or email.'), + ('furni_table_plasto_square*6_name', 'Square Dining Table'), + ('trade', 'Trade'), + ('furni_romantique_smalltabl*3_desc', 'Every tray needs a table...'), + ('reg_back', 'Back'), + ('furni_tree7_name', 'Snowy Christmas Tree'), + ('recycler_trader_open_alert', 'Recycling cannot begin while you are trading. Please close the safe trading box before recycling.'), + ('furni_rare_dragonlamp*8_desc', 'Scary and scorching!'), + ('furni_gothic_chair*3_desc', 'The head of the table'), + ('Alert_YourNameIstooShort', 'Habbo names must be at least 3 characters long.'), + ('furni_bed_budgetb_desc', 'Sweet dreams for two'), + ('furni_shelves_basic_name', 'Pura Shelves'), + ('console_messagemode_helptext', 'You can send an instant message to your Habbo Friends.'), + ('nav_venue_cunning_fox_gamehall/5_desc', 'Get a hand like a foot? Keep a straight face and bluff it out'), + ('furni_table_polyfon_small_name', 'Small Coffee Table'), + ('move_furniture', 'Move Furni'), + ('nav_searchbutton', 'Search'), + ('furni_habboween_grass_desc', 'Autumnal chills with each rotation!'), + ('furni_pura_mdl5*2_desc', 'Any way you like it!'), + ('NUF_meeting_people_user_tutor', 'The user you clicked on is shown in the corner of your screen. The buttons beneath the Habbo let you visit their Habbo Home, send them a Friend Request or ignore them if they look or act like a moron.'), + ('poster_55_name', 'Tree of Time'), + ('furni_soft_sofachair_norja*5_name', 'Pink Iced Sofachair'), + ('furni_sound_set_48_name', 'Club 3'), + ('furni_table_plasto_4leg_desc', 'Hip plastic furniture'), + ('furni_pura_mdl4*1_name', 'Aqua Pura Module 4'), + ('login_forgottenPassword_url', 'https://www.habbo.co.uk/account/password/forgot'), + ('nav_venue_floatinggarden/0_desc', 'Peace, tranquility and still waters'), + ('furni_sound_set_36_desc', 'For adult minded'), + ('poster_43_desc', 'Shake, rattle and roll'), + ('furni_gothic_stool*3_desc', 'The dark side of Habbo'), + ('room_alert_furni_limit', 'This room has the maximum amount of Furni.'), + ('furni_table_plasto_square*15_name', 'Occasional Table'), + ('furni_rare_hammock_name', 'Hammock'), + ('sound_machine_confirm_burn_long', 'Are you sure you want to burn this song to disc? Burning costs one credit.'), + ('furni_rclr_chair_desc', 'Watch out for coconuts'), + ('furni_chair_basic*3_desc', 'It\'s a cracking design!'), + ('furni_doormat_plain*6_name', 'Doormat'), + ('furni_sofachair_polyfon*9_name', 'Red Armchair'), + ('furni_jp_tray6_name', 'jp_tray6'), + ('furni_habbocake_name', 'Cake'), + ('poster_501_name', 'Jolly Roger'), + ('nav_goingprivate', 'Going to Guest room'), + ('furni_bed_budget_one*9_name', 'Red Pura Bed'), + ('alert_no_category', 'Your room has no category. Select one from the list.'), + ('nav_venue_theatredrome_easter/0_desc', ''), + ('gs_button_buytickets', 'Buy Tickets'), + ('nav_venue_bouncer_room_4_name', 'Experts Battle Ball Arena'), + ('close', 'Close'), + ('furni_carpet_standard*9_desc', 'Available in a variety of colours'), + ('furni_prizetrophy4*1_desc', 'Glittery gold'), + ('help_pointer_1', 'http://www.habbo.co.uk/help/'), + ('help_pointer_3', 'emergency_help'), + ('furni_rclr_lamp_name', 'Moon Lamp'), + ('help_pointer_2', 'http://www.habbohotel.co.uk/iot/go?lang=en&country=uk'), + ('furni_exe_sofa_desc', 'Relaxing leather comfort'), + ('furni_divider_silo1*4_name', 'Beige Area Corner Shelf'), + ('poster_2001_name', 'SeinNightitititititdiskotappaja'), + ('interface_icon_tv_close', 'Leave the Room and close the Habbovision mode.'), + ('furni_sound_machine*7_name', 'Red Traxmachine'), + ('game_bs_hit', 'A Hit!:'), + ('furni_rare_fan*2_desc', 'It\'ll blow you away!'), + ('win_place', 'Note!'), + ('nav_venue_bb_lobby_beginner_11_name', 'Beginners Battle Ball 12'), + ('furni_pillow*7_desc', 'Bonnie\'s pillow of choice!'), + ('furni_table_silo_small*8_desc', 'For those random moments'), + ('furni_divider_nor4*5_desc', 'Habbos, roll out!'), + ('hubu_vastaa', 'Answer the question'), + ('furni_pura_mdl4*8_name', 'yellow pura module 4'), + ('furni_glass_chair*9_name', 'Glass chair'), + ('furni_chair_silo*7_desc', 'Green Silo Dining Chair'), + ('furni_jp_drawer_desc', 'Spiritual home for odds and ends'), + ('tutorial_select_another_topic', 'Select another topic'), + ('furni_noob_lamp*4_desc', 'Get the light right where you want it (light blue)'), + ('nav_venue_beauty_salon_general_name', 'Beauty salon'), + ('furni_sofachair_polyfon*2_name', 'Black Mode Armchair'), + ('console_report_header', 'Report Abusive Message'), + ('club_buy_url', 'http://%predefined%//credits/habboclub'), + ('furni_prizetrophy*2_name', 'Classic trophy'), + ('furni_rare_icecream*4_name', 'Strawberry Ice Cream Machine'), + ('furni_barchair_silo*5_desc', 'Practical and convenient'), + ('furni_divider_nor2*4_desc', 'No way through'), + ('furni_xmas_cstl_gate_name', 'Ice Castle Gate'), + ('furni_noob_stool*5_desc', 'Unfold me and take the weight off (pink)'), + ('furni_bed_budgetb_one_name', 'Plain Single Bed'), + ('friend_request_accept_all', 'Accept all requests.'), + ('furni_val_choco_name', 'Heart Shaped Box'), + ('poster_514_desc', 'Be proud to be in the Union!'), + ('furni_carpet_legocourt_desc', 'Line up your slam dunk'), + ('furni_sofa_silo_name', 'Two-Seater Sofa'), + ('furni_chair_plasto*8_desc', 'Hip plastic furniture'), + ('furni_tree5_name', 'Christmas Tree 3'), + ('nav_venue_habbo_cinema/0_desc', 'Now showing: Kick Warz II - The revenge of Donnie Santini!'), + ('furni_couch_norja*4_name', 'Urban Iced Bench'), + ('poster_52_desc', 'whack that ball!'), + ('furni_sound_set_45_desc', 'The Bass? is the rhythm!'), + ('nav_venue_sun_terrace/0_name', 'Sun Terrace'), + ('queue_tile_limit', 'You can\'t fit more Habbo Rollers in this room!'), + ('BuddyRequesta', 'Friend Request(s)'), + ('transaction_system_sms_rl', 'Elisa'), + ('furni_prizetrophy4_desc', 'Palkinto'), + ('furni_hcamme_desc', 'Time for a soak'), + ('furni_scifirocket*2_name', 'Earth Smoke Machine'), + ('furni_divider_nor5*2_desc', 'Cool cornering for your crib y0!'), + ('forgottenpw', 'Forgotten your password?'), + ('furni_rclr_sofa_desc', 'Snuggle up together'), + ('furni_val_cauldron_desc', 'Cast a loving spell!'), + ('poster_3_name', 'Fish Plaque'), + ('furni_one_way_door*8_name', 'Yellow One Way Gate'), + ('furni_divider_nor3*8_desc', 'Yellow Iced gate'), + ('sw_link_highScores_url', 'http://%predefined%//groups/56553/id'), + ('furni_carpet_standard*2_desc', 'Available in a variety of colours'), + ('nav_venue_sport/0_name', 'The Power Gym'), + ('furni_scifidoor*3_desc', 'There out of this world!'), + ('furni_pillar*7_desc', 'Recovered from Habblantis'), + ('furni_arabian_tray3_name', 'Sweets Tray'), + ('furni_chair_plasto_name', 'Chair'), + ('nav_venue_pizza_name', 'Slice of Life'), + ('url_privacypledge', 'http://%predefined%//help/69'), + ('furni_one_way_door*3_desc', 'One way! The HC way!'), + ('catalog_purchase_not_allowed_hc', 'In order to buy this item you must be a Habbo Club member!'), + ('furni_pura_mdl3*4_name', 'White Pura Module 3'), + ('room_confirmDelete', 'Confirm'), + ('BuddyPrivateRoom', 'In A Guest Room'), + ('furni_marquee*7_desc', 'It\'s both door and a shade!'), + ('furni_bath_desc', 'The ultimate in pampering'), + ('furni_soft_sofa_norja*3_desc', 'Pristine white, keep it clean!'), + ('game_BattleShip', 'Battleships'), + ('furni_sound_set_11_desc', 'Music you can really sink your teeth into'), + ('furni_glass_chair*2_name', 'Glass chair'), + ('furni_sofa_silo*5_desc', 'Pink Area Sofa'), + ('furni_pura_mdl2*7_name', 'Green Pura Module 2'), + ('cam_film.help', 'Number Of Photos Left'), + ('nav_venue_bb_lobby_tournament_17/0_desc', ''), + ('roomatic_hway', 'Hotel guests are expected to follow the Habbo Way even if word filtering is switched off.'), + ('modify', 'Modify'), + ('furni_sofachair_silo*8_name', 'Yellow Armchair'), + ('alert_reg_blocked', 'A person under 11 years of age has tried to register from this machine recently.\\rRegistration is not possible for a while.'), + ('furni_sofa_polyfon*8_desc', 'Yellow Mode Sofa'), + ('furni_wooden_screen*9_desc', 'Add an exotic touch to your room'), + ('hobba_message_from', 'Your call has been responded to as follows:'), + ('win_help', 'Habbo Help'), + ('pet.saying.sniff.dog.1', 'snuh...SNUUUUUH'), + ('pet.saying.sniff.dog.0', 'snuuh..snuuh'), + ('sw_user_skill', 'Snow Storm Skill Level: \\x \\r (\\y points)'), + ('furni_rom_lamp_desc', 'Light up your life'), + ('console_profile_create', 'Create your Habbo Profile.'), + ('furni_CF_50_goldbar_desc', 'Worth 50 Credits'), + ('furni_romantique_chair*4_desc', 'What does this button do?'), + ('reg_use_allowed_chars', 'Use only these characters:'), + ('furni_bar_chair_armas_name', 'Barrel Stool'), + ('pet.saying.sniff.dog.2', '*sighs*'), + ('furni_sound_set_64_name', 'Alhambra Trax 3'), + ('furni_pillar*3_name', 'blue pillar'), + ('furni_glass_chair*4_desc', 'Translucent beauty'), + ('furni_pizza_desc', 'You dirty Habbo'), + ('opening_hours_text_shutdown', 'The Hotel will shut down in %d% minutes. To avoid confusion, purchasing of furniture, Habbo Club and game tickets will be disabled during that time, as well as playing Games and furniture trading. Thank you for visiting and welcome back tomorrow!'), + ('nav_venue_bb_lobby_tournament_10_name', 'Competitie Battle Ball 11'), + ('poster_521_desc', 'Ordem e progresso'), + ('furni_sound_set_52_desc', 'Under the mistletoe!'), + ('furni_shelves_norja*3_name', 'White Iced Bookcase'), + ('furni_scifiport*5_desc', 'Recovered from Roswell'), + ('help_emergency_writeyour', 'Give details of your emergency here:'), + ('furni_table_norja_med*6_name', 'Large Coffee Table Blue'), + ('nav_venue_bb_lobby_expert_3_name', 'Experts Battle Ball 4'), + ('photo_legend', 'Caption'), + ('furni_sofachair_silo_desc', 'Large, but worth it'), + ('console_youdonthavebuddies', 'You have no Friends on your list.\\rYou can send Friend Requests using\\rthe \'search\' button.'), + ('furni_table_plasto_4leg*6_name', 'Occasional table Table'), + ('furni_scifidoor*1_name', 'Pink Spaceship Door'), + ('furni_tile_brown_desc', '10% off downtown promenades & piazzas!'), + ('NUF_getting_room_go_button', 'Click here to go to your just created room!'), + ('dimmer_turn_on', 'Turn ON'), + ('furni_sofa_polyfon_desc', 'Comfort for stylish couples'), + ('furni_sound_set_50_name', 'Club 5'), + ('furni_doorB_name', 'Wardrobe'), + ('reg_agree1', 'Yes, my parents and I agree to the above terms. I am allowed to use Habbo Hotel.'), + ('furni_chair_silo*3_name', 'White Dining Chair'), + ('furni_CF_1_coin_bronze_desc', 'Worth 1 Credits'), + ('reg_agree2', 'Yes, I have read the Habbo Hotel Terms of Service and I accept them'), + ('you_have_pending_cfh', 'Your previous call for help has not been answered yet. To make a new one you must delete the old message.'), + ('furni_table_plasto_bigsquare*7_name', 'Square Dining Table'), + ('console_accept', 'Accept'), + ('furni_lamp_basic_name', 'Pura Lamp'), + ('console_friend_request_error', 'There was an error with friend requests'), + ('poster_11_desc', 'I obey the Habbo way!'), + ('furni_bardeskcorner_polyfon*6_name', 'Blue Mode Bardesk Corner'), + ('furni_plant_sunflower_name', 'Cut Sunflower'), + ('furni_traffic_light*3_name', 'Purple Traffic Light'), + ('furni_bed_polyfon_one*8_name', 'Yellow Mode Single Bed'), + ('furni_carpet_polar*1_desc', 'Cute'), + ('furni_noob_rug*1_desc', 'Nice and neat sisal rug with orange edging'), + ('furni_exe_bardesk_desc', 'Divide the profits!'), + ('furni_romantique_divider*4_desc', 'Keeping things separated'), + ('pet_status_dialog', '%name%'), + ('furni_jp_lantern_name', 'Japanese Lantern'), + ('furni_chair_norja*2_name', 'Black Chair'), + ('furni_jp_irori_desc', 'Traditional heating and eating'), + ('furni_bed_budget*5_name', 'Beige Pura Double Bed'), + ('furni_scifidoor*8_name', 'Purple Spaceship Door'), + ('nav_venue_sw_lobby_free_5_name', 'Free Game Lobby'), + ('wallitem_jp_sheet2_desc', 'jp_sheet2'), + ('furni_glass_sofa*9_desc', 'Translucent beauty'), + ('furni_divider_nor5*7_name', 'Rural Iced Angle'), + ('sound_machine_open_editor', 'Trax Editor'), + ('furni_jp_tatami2_desc', 'Shoes off please'), + ('furni_sound_set_16_name', 'Hip Hop Beats 3'), + ('console_recipients', 'Recipient(s)'), + ('catalog_page', 'page'), + ('poster_23_name', 'Bat Poster'), + ('furni_table_plasto_round*4_name', 'Square Dining Table'), + ('furni_rubberchair*2_desc', 'Soft and tearproof!'), + ('nav_venue_bb_lobby_beginner_16/0_desc', ''), + ('poster_1005_name', 'Johnny Squabble'), + ('furni_silo_studydesk_name', 'Area Quest Desk'), + ('furni_table_plasto_4leg*1_desc', 'Hip plastic furniture'), + ('nav_venue_basement_lobby/0_desc', 'For low level hanging'), + ('furni_rare_parasol*3_desc', 'Block those rays!'), + ('furni_arabian_wndw_name', 'Arabian Window Frame'), + ('Alert_ConnectionFailure', 'Disconnected'), + ('furni_house_desc', 'Good enough to eat'), + ('console_confirm_selected', 'Confirm the selections. Below are the amount of friend requests that will be accepted and declined. If you want, you can still modify the selections.'), + ('furni_table_plasto_4leg*4_name', 'Square Dining Table'), + ('furni_sound_set_57_name', 'RnB Grooves 3'), + ('hubu_h3', 'Huumetietobussi'), + ('furni_table_plasto_bigsquare*2_name', 'Square Dining Table'), + ('hubu_h4', 'Anna palautetta'), + ('hubu_h1', 'Puhelintuki'), + ('roomatic_bobbafilter', 'Bobba filter (filters out bad language)'), + ('hubu_h2', 'Harrastamaan!'), + ('furni_tv_luxus_desc', 'Bang up to date'), + ('hubu_h5', 'Huumetietoa'), + ('NUF_console_hotelview_icon', 'Click the button to open your Habbo Console.'), + ('modtool_banlength', 'Ban Length:'), + ('NUF_visiting_rooms_roomlist_tutor', 'Just pick any room you like. Click on the room to see a description of the room. ROOM!'), + ('reg_verification_newPassword', 'New password:'), + ('furni_wall_china_name', 'Dragon Screen'), + ('nav_venue_hallway_ii/0_desc', 'Beware witches and warlocks'), + ('jukebox_disk_add', 'Add Disc'), + ('furni_rare_xmas_screen_desc', 'Ho Ho Ho!'), + ('furni_table_plasto_round*2_name', 'Round Dining Table'), + ('furni_rubberchair*7_name', 'White Inflatable Chair'), + ('nav_favourites_helptext', 'These are your favourite rooms. Nice selection you have here...'), + ('nav_venue_sw_lobby_beginner_4_name', 'Snow Rookies Lobby'), + ('furni_gothic_chair*2_desc', 'The prince of Habbo'), + ('cam_save_nofilm', 'You have run out of film.\\rGet a roll (5 photos) from\\rthe Catalogue for 6 Credits.'), + ('furni_sofa_polyfon*6_desc', 'Blue Mode Sofa'), + ('furni_divider_silo3*2_desc', 'Form following function'), + ('furni_rare_beehive_bulb*1_name', 'Red Amber Lamp'), + ('furni_plant_small_cactus_desc', 'Even less watering than the real world'), + ('furni_triplecandle_name', 'Electric Candles'), + ('help_option_1', 'Playing Habbo'), + ('help_option_3', 'A serious issue (harassment, sexual behaviour)'), + ('furni_present_gen5_name', 'Gift'), + ('help_option_2', 'My Habbo account.'), + ('furni_shelves_norja*8_name', 'Yellow Bookcase'), + ('furni_legotrophy_desc', 'For the winning team'), + ('furni_rare_icecream*2_name', 'Pistachio Ice Cream Machine'), + ('furni_summer_pool*1_desc', 'Fancy a dip?'), + ('nav_venue_theatredrome_deli/0_desc', 'Join in all the fun of the fair!'), + ('game_newgame', 'New game'), + ('help_tour', 'Guided Tour'), + ('purse_vouchers_error3_url', 'http://%predefined%//credits'), + ('furni_marquee*5_name', 'Graphite Marquee'), + ('forgottenpw_explanation', 'If you have forgotten your password and you gave your correct email address when you registered, we can send your password to you.'), + ('furni_waterbowl*3_name', 'Yellow Water Bowl'), + ('roomatic_namedisp', 'Do you want your name to be displayed with the room?'), + ('poster_28_name', 'Silver Tinsel Bundle'), + ('Alert_BuyingOK', 'Buying Successful!'), + ('furni_summer_chair*4_name', 'Deck Chair'), + ('nav_venue_welcome_lounge_ii/0_desc', 'New? Lost? Get a warm welcome here from Habbo eXperts.'), + ('bb_title_gameCreation', 'Aloita uusi peli!'), + ('furni_sporttrack1*3_name', 'Sport track straight grass'), + ('furni_romantique_divan*2_name', 'Emerald Chaise-Longue'), + ('furni_divider_silo1*6_name', 'Blue Area Corner Shelf'), + ('NUF_about_hotel_about_tutor', 'Habbo is both a virtual world and an online community.'), + ('url_helpparents', 'http://%predefined%//help/73'), + ('furni_divider_silo3*7_name', 'Green Area Gate'), + ('poster_18_desc', 'Beautiful reproduction butterfly'), + ('furni_traffic_light*5_desc', 'Chill and wait your turn!'), + ('furni_scifirocket*6_desc', 'Too hot to handle!'), + ('pet.saying.angry.cat.0', 'Sssppp!'), + ('furni_bed_armas_one_desc', 'Rustic charm for one'), + ('pet.saying.angry.cat.3', '*hiss*'), + ('pet.saying.angry.cat.1', 'MrrRRRR'), + ('pet.saying.angry.cat.2', 'Tssssss!'), + ('furni_noob_rug*6_name', 'My first Habbo rug'), + ('club_habbo.bottombar.text.member', 'Habbo Club'), + ('furni_divider_silo1_name', 'Corner Shelf'), + ('nav_venue_bb_lobby_beginner_10/0_desc', ''), + ('recycler_info_progress', 'Recycling is currently in progress. The recycling process takes a total of %recyclinghours% hour. You can leave the catalogue and recycling will continue in the background.'), + ('furni_queue_tile1*1_name', 'Pink Habbo Roller'), + ('notickets_header', 'Buy game tickets to play this game'), + ('reg_underage', 'I am under 11 years old'), + ('nav_venue_sw_arena_intermediate_name', 'Playing intermediate game'), + ('furni_table_plasto_square*5_name', 'Square Dining Table'), + ('Alert_YouAreBanned_T', 'A Moderator kicked you out of the room.'), + ('buddyremove_moreoptions', 'More Options >>'), + ('furni_prizetrophy4*3_desc', 'Breathtaking bronze'), + ('furni_chair_silo*2_desc', 'Keep it simple'), + ('club_habbo.bottombar.link.notmember', 'Join!'), + ('poster_1000_name', 'Comedy Poster'), + ('room_badge_button', 'Badge'), + ('furni_soft_sofa_norja*8_desc', 'Yellow Iced Sofa'), + ('wallitem_torch_name', 'Gothic Torch'), + ('furni_scifirocket*7_name', 'Jupiter Smoke Machine'), + ('furni_romantique_tray1_desc', 'For a fast break'), + ('furni_rare_dragonlamp*0_desc', 'George and the...'), + ('furni_nest_desc', 'Night, night'), + ('furni_table_silo_small*2_name', 'Black Occasional Table'), + ('furni_prizetrophy7*2_name', 'Silver Habbo trophy'), + ('furni_sofachair_silo*3_desc', 'Large, but worth it'), + ('furni_divider_nor2*9_name', 'Red Iced bar desk'), + ('club_extend_title', 'Habbo Club membership can be extended VERY easily.'), + ('furni_rare_fan*0_desc', 'As red as Rudolph\'s nose'), + ('club_paybycash_url', '(leave this empty if you don\'t want to have this link displayed)'), + ('poster_57_name', 'Calligraphy poster'), + ('furni_CFC_50_coin_silver_desc', 'Worth 50 Credits'), + ('furni_pillow*5_name', 'Black Leather Pillow'), + ('furni_hc_chr_name', 'Majestic Chair'), + ('nav_venue_sw_arena_free_name', 'Playing free for all game'), + ('furni_active_placeholder_desc', 'This furniture is downloading...'), + ('nav_venue_welcome_lounge_name', 'Welcome Lounge'), + ('furni_soft_sofachair_norja*3_name', 'White Iced Sofachair'), + ('furni_bed_polyfon*3_desc', 'Give yourself space to stretch out'), + ('furni_pura_mdl4*3_name', 'Black Pura Module 4'), + ('furni_pillar*2_desc', 'Ancient and stately'), + ('furni_small_chair_armas_desc', 'Rustic charm at it\'s best'), + ('furni_table_plasto_round_desc', 'Hip plastic furniture'), + ('furni_marquee*2_desc', 'Dragons out and Davids in!'), + ('furni_wooden_screen*7_desc', 'Add an exotic touch to your room'), + ('furni_queue_tile1*8_name', 'Navy Habbo Roller'), + ('furni_arabian_pllw_desc', 'Exotic comfort'), + ('furni_sound_set_1_desc', 'Get the party started!'), + ('furni_gothic_stool*5_desc', 'The dark side of Habbo'), + ('furni_china_table_desc', 'Exotic and classy'), + ('song_disk_trade_info', '%name%'), + ('nav_venue_sw_lobby_beginner_9_name', 'Snow Rookies Lobby'), + ('console_modify', 'Modify'), + ('poster_36_desc', 'The Hotels girlband. Dream on!'), + ('furni_rare_dragonlamp*7_desc', 'Scary and scorching!'), + ('furni_sound_set_63_desc', 'Desert hits by the oasis!'), + ('nav_venue_cafe_gold_name', 'The Oasis'), + ('nav_venue_sw_lobby_tournament_3/0_desc', ''), + ('nav_venue_habbo_cinema_name', 'Habbo Cinema'), + ('furni_chair_plasty*4_name', 'Plastic Pod Chair'), + ('nav_venue_welcome_lounge_iii/0_desc', 'New? Lost? Get a warm welcome here from Habbo eXperts.'), + ('furni_carpet_soft*1_desc', 'Soft Wool Rug'), + ('furni_sporttrack1*1_name', 'Sport track straight'), + ('furni_divider_nor3*6_name', 'Blue Iced gate'), + ('furni_glass_chair*7_name', 'Green Glass Chair'), + ('club_confirm_gift_text', 'A new club gift has arrived. Please push OK if you want to receive it now. If you click cancel you will be asked again next time you log in to the Hotel.'), + ('furni_rubberchair*5_name', 'Lime Inflatable Chair'), + ('furni_plant_maze_snow_name', 'Snowy Maze Bundle 2'), + ('furni_table_silo_med*4_name', 'Beige Area Coffee Table'), + ('furni_solarium_norja*1_desc', 'Rejuvenate your pixels!'), + ('furni_divider_nor2*2_name', 'Black Iced bar desk'), + ('poster_45_desc', 'Needs a few more Habburgers'), + ('wallitem_habw_mirror_desc', 'Star of the show!'), + ('furni_pura_mdl3*9_name', 'Red Pura Module 3'), + ('furni_exe_corner_name', 'Executive Corner Desk'), + ('nav_venue_cunning_fox_gamehall/3_desc', 'Are you the new Deep Blue?'), + ('furni_rare_fan*7_desc', 'It\'ll blow you away!'), + ('furni_divider_nor1*5_desc', 'Pink Ice corner'), + ('wallitem_md_logo_wall_name', 'Bubble Juice Logo'), + ('furni_bardesk_polyfon_desc', 'Perfect for work or play'), + ('console_target_does_not_accept', 'This user does not accept friend requests at the moment'), + ('pet.saying.beg.croco.0', 'Mmmmmrrr'), + ('pet.saying.beg.croco.1', '*Emo tear*'), + ('messenger.email.header', ''), + ('pet.saying.beg.croco.2', 'Waarrrr...rrr'), + ('furni_carpet_polar*4_name', 'Green Bear Rug'), + ('furni_chair_plasto*6_name', 'Chair'), + ('furni_noob_rug*4_name', 'My first Habbo rug'), + ('furni_summer_chair*6_desc', 'Blue'), + ('rotate_furniture', 'Rotate Furni'), + ('poster_16_desc', 'Added security'), + ('furni_sofachair_silo*7_desc', 'Green Area Armchair'), + ('furni_divider_nor5*4_desc', 'Cool cornering for your crib!'), + ('furni_sand_cstl_twr_name', 'sand_cstl_twr'), + ('furni_safe_silo*4_name', 'Beige Safe Minibar'), + ('furni_chair_plasty*11_name', 'Plastic Pod Chair'), + ('furni_divider_arm2_name', 'Room divider'), + ('furni_sound_set_55_name', 'RnB Grooves 1'), + ('nav_venue_sw_lobby_intermediate_4_name', 'Snow Bombardiers Lobby'), + ('roomatic_canmodifysettings', '(You can change these settings later)'), + ('furni_pura_mdl5*7_desc', 'Any way you like it!'), + ('catalog_pet_name_length', 'Oops, pet\'s name is too long (max 15 characters)'), + ('furni_toy1*3_name', 'Rubber Ball'), + ('nav_venue_beauty_salon_loreal/0_desc', 'No Pixel Surgery, only natural make-ups!'), + ('furni_arabian_swords_name', 'Ancestral Scimitars'), + ('furni_summer_pool*4_name', 'Yellow Summer Pool'), + ('gs_error_create_0', 'This Lobby is full, please create a Game in another Lobby!'), + ('nav_venue_pizzeria/0_desc', 'Pizza; food of the hungry!'), + ('nav_roomnfo_hd_own', 'Own Rooms'), + ('furni_glass_sofa*4_desc', 'Translucent beauty'), + ('buddyremove_accept', 'Remove Friends'), + ('transaction_system_sms_win_orange', 'Orange SMS'), + ('gs_error_create_3', 'Your skill level isn\'t high enough for creating Games in this Lobby.'), + ('furni_goodie2_desc', 'For gourmet kittens'), + ('trading_youagree', 'You agree'), + ('furni_bench_lego_name', 'Team Bench'), + ('reg_verification_updateOK', 'Update successful'), + ('transaction_system_refunds', 'Refund'), + ('furni_carpet_standard*7_name', 'Floor Rug'), + ('poster_44_name', 'Mummy'), + ('furni_bed_polyfon_one*3_name', 'White Single Bed'), + ('furni_jp_tray1_name', 'jp_tray1'), + ('furni_jp_tatami_name', 'Small Tatami Mat'), + ('furni_bardesk_polyfon*2_name', 'Black Mode Bardesk'), + ('furni_hockey_light_desc', 'Set it off.'), + ('nav_venue_bb_lobby_intermediate_2/0_desc', ''), + ('wallitem_guitar_v_name', 'v guitar'), + ('reg_email', 'Email:'), + ('nav_venue_sw_lobby_tournament_0/0_desc', ''), + ('furni_club_sofa_name', 'Club sofa'), + ('furni_duck_name', 'Rubber Duck'), + ('furni_divider_nor5*9_name', 'Red Iced Angle'), + ('furni_smooth_table_polyfon_name', 'Large Dining Table'), + ('reg_forcedupdate', 'Please update your Habbo details!'), + ('transaction_system_stuff_store', 'Catalogue purchase'), + ('console_request_massoperation_title', 'You have %messageCount% friend requests waiting.'), + ('nav_venue_bb_lobby_expert_8/0_desc', ''), + ('roomatic_roomdescription', 'Room description:'), + ('reg_verification_invalidEmail', 'Check email address'), + ('furni_xmas_icelamp_desc', '20 lanterns for the price of 6!'), + ('wallitem_wallmirror_desc', 'Mirror, mirror on the wall...'), + ('furni_pura_mdl1*3_name', 'Black Pura Module 1'), + ('pet.saying.play.croco.1', 'Squeh Squeeeeh...'), + ('pet.saying.play.croco.0', ':)'), + ('nav_venue_theatredrome_halloween/0_desc', 'Warm welcome to Bullet For My Valentine!'), + ('nav_venue_bb_lobby_amateur_6_name', 'Gevorderden Battle Ball 7'), + ('cam_savetxt', 'Saving Photo...'), + ('nav_venue_bb_lobby_intermediate_1_name', 'Semi-profs Battle Ball 2'), + ('nav_modify_doorstatus', 'Door status'), + ('callhelp_sent', 'If you have questions about Habbo Hotel or your Habbo account, please write the details below and a member of community staff will respond as soon as possible.'), + ('wallitem_photo_name', 'Photo'), + ('poster_25_desc', 'A new use for carrots!'), + ('furni_chair_plasto*1_desc', 'Hip plastic furniture'), + ('furni_prizetrophy4*2_name', 'Fish trophy'), + ('furni_bar_armas_name', 'Barrel Minibar'), + ('nav_rooms_favourite', 'Favourites'), + ('furni_table_plasto_square*6_desc', 'Hip plastic furniture'), + ('furni_gothic_sofa*6_desc', 'The dark side of Habbo'), + ('jukebox_song_length', 'Song length: %time%'), + ('buddyremove_header', 'Choose %amount% friends to remove'), + ('furni_romantique_mirrortabl_desc', 'Get ready for your big date'), + ('wallitem_hrella_poster_2_name', 'Life Buoy'), + ('reg_boy', 'Boy'), + ('sound_machine_trax_name', 'Trax name:'), + ('purse_vouchers_error0', 'Technical error! Cannot redeem voucher.'), + ('furni_plant_valentinerose*3_name', 'Yellow Valentine Rose'), + ('purse_vouchers_error1', 'Invalid voucher code.'), + ('nav_venue_bb_lobby_expert_1_name', 'Experts Battle Ball 2'), + ('purse_vouchers_error2', 'Product delivery failed, please contact Customer Service'), + ('purse_vouchers_error3', 'This voucher must be redeemed on the Habbo website'), + ('furni_romantique_chair*2_desc', 'null'), + ('furni_prizetrophy7*1_desc', 'Gold Habbo trophy'), + ('furni_table_plasto_bigsquare*14_name', 'Occasional Table'), + ('furni_ticket_desc', 'A bundle of 5 gaming tickets'), + ('nav_venue_club_massiva_name', 'Club Massiva'), + ('roomatic_locked', 'Door locked - visitors have to ring doorbell'), + ('furni_table_silo_small*3_desc', 'For those random moments'), + ('furni_bed_trad_name', 'Plain Double Bed'), + ('summer_chair_5_name', 'Beige Deck Chair'), + ('buddyremove_select_all', 'Select All Friends'), + ('furni_plant_valentinerose*5_desc', 'For that special pixel'), + ('furni_glass_table*9_name', 'Glass table'), + ('furni_romantique_smalltabl*5_desc', 'Why is one leg different?'), + ('furni_pura_mdl5*5_name', 'beige pura module 5'), + ('poster_30_name', 'Mistletoe'), + ('furni_chair_basic*8_name', 'chair_basic'), + ('nav_venue_sw_lobby_amateur_2_name', 'Snow Slingers Lobby'), + ('Alert_ConnectionDisconnected', 'Please reload Habbo Hotel!\\r\\rIf this happens again, please wait a moment before reloading.'), + ('Alert_WrongPassword', 'Check password!'), + ('nav_modify_letothersmove', 'Let other people move and leave furniture in the room.'), + ('furni_rare_dragonlamp*1_name', 'Sea Dragon Lamp'), + ('furni_table_plasto_4leg*10_desc', 'Hip plastic furniture'), + ('furni_sound_set_28_name', 'Rock 2'), + ('furni_grand_piano*2_name', 'Black Grand Piano'), + ('furni_basket_desc', 'Eggs-actly what you want for Easter'), + ('furni_rare_fan*5_name', 'Yellow Powered Fan'), + ('furni_noob_lamp*2_name', 'My first Habbo lamp'), + ('furni_present_gen4_desc', 'What\'s inside?'), + ('furni_pillar*9_desc', 'Ancient and stately'), + ('furni_chair_norja*8_desc', 'Sleek and chic for each cheek'), + ('furni_pura_mdl2*2_desc', 'Any way you like it!'), + ('furni_glass_stool*5_desc', 'Translucent beauty'), + ('furni_hc_lmp_name', 'Oil Lamp'), + ('console_myinterests', 'My interests:'), + ('furni_val_teddy*6_desc', 'The blue bear of happiness'), + ('room_cant_set_item', 'You cannot place this in someone else\'s room!'), + ('poster_29_desc', '10 x Gold Tinsel'), + ('club_general_daysleft', 'Number of HC days left'), + ('nav_popup_nav_link', 'Open the Navigator'), + ('furni_sound_set_43_desc', 'Beware zombies!'), + ('furni_solarium_norja*6_name', 'Blue Solarium'), + ('furni_doormat_plain*1_name', 'Doormat'), + ('nav_venue_chill_name', 'Zen Garden'), + ('furni_one_way_door*5_desc', 'One at a time!'), + ('furni_table_plasto_round*3_desc', 'Hip plastic furniture?'), + ('furni_prizetrophy6_desc', 'Palkinto'), + ('furni_exe_s_table_name', 'Executive Glass Table'), + ('furni_noob_rug*5_desc', 'Nice and neat sisal rug with pink edging'), + ('furni_scifirocket*0_name', 'Mars Smoke Machine'), + ('furni_soft_jaggara_norja_desc', 'Soft Iced sofachair'), + ('nav_venue_bb_lobby_amateur_9/0_desc', ''), + ('furni_chair_plasty*5_desc', 'Hip plastic furniture'), + ('hobba_mark_emergency', 'Emergency Help'), + ('furni_djesko_turntable_name', 'Habbo Turntable'), + ('furni_shelves_norja*9_desc', 'For nic naks and art deco books'), + ('poll_confirm_cancel_long', 'Are you sure you want to stop answering the poll? You can\'t continue later.'), + ('poster_32_desc', 'The Auspicious One'), + ('opening_hours_text_opening_time', 'The Hotel will open again at %h%:%m%. We look forward to welcoming you back!'), + ('furni_bed_budget_one*7_name', 'Green Pura Bed'), + ('furni_pillow*0_desc', 'Minimalist comfort!'), + ('furni_divider_poly3*8_desc', 'Yellow Mode Bardesk Gate'), + ('nav_venue_bb_lobby_beginner_13/0_desc', ''), + ('furni_sound_set_6_name', 'Ambient 3'), + ('hubu_win', 'Bus - Info'), + ('furni_sound_machine*5_name', 'Brown Traxmachine'), + ('furni_sporttrack1*2_desc', 'null'), + ('bb_title_bouncingBall', 'Battle Ball'), + ('nav_venue_rooftop/0_desc', 'Hang out on the very rooftop of Habbo Hotel!'), + ('modtool_banreason', 'Ban Reason:'), + ('furni_chair_silo*9_desc', 'Red Silo Dining Chair'), + ('furni_bed_budget*6_desc', 'King sized comfort!'), + ('furni_s_sound_machine*4_desc', 'Sound Machine Blue Desc'), + ('furni_rubberchair*6_desc', 'Soft and tearproof!'), + ('nav_venue_sw_lobby_expert_1_name', 'Snow Marksmen Lobby'), + ('nav_venue_bb_lobby_beginner_7/0_desc', ''), + ('furni_table_plasto_4leg*5_desc', 'Hip plastic furniture'), + ('gen_youhave', 'You Have'), + ('furni_carpet_soft*6_name', 'Soft Wool Rug'), + ('furni_petfood2_desc', 'Fantastic 20% Saving!'), + ('group_privileges', 'Priviliges:'), + ('furni_samovar_name', 'Russian Samovar'), + ('furni_hal_grave_name', 'Haunted Grave'), + ('furni_bed_budget_one*2_desc', 'Princess sized comfort!'), + ('gs_error_1', 'You have entered invalid data!'), + ('reject', 'Reject'), + ('gs_error_4', 'You have reached your maximum number of daily Games!'), + ('nav_venue_sw_lobby_tournament_5_name', 'Tournament Lobby'), + ('gs_error_5', 'Tournament is only available for users living in the UK.'), + ('gs_error_2', 'You don\'t have enough Tickets!'), + ('gs_error_8', 'To start a Game, there must be at least two Teams of one player each!'), + ('sound_machine_alert_no_sound_sets', 'You don\'t have any sound sets available for song editing. \\rNote that the sets need to be in your inventory (hand).'), + ('furni_waterbowl*4_desc', 'Aqua unlimited'), + ('furni_doormat_love_desc', 'Welcome Habbos in style'), + ('gs_error_6', 'You have been removed from the Game!'), + ('furni_soft_sofachair_norja*4_desc', 'Sit back and relax'), + ('bb_powerup_desc_8', 'By using a vacuum cleaner, you can clear any tile in the field.'), + ('move', 'Move'), + ('furni_romantique_smalltabl*3_name', 'Turquoise Tray Table'), + ('furni_bed_polyfon*8_name', 'Yellow Mode Double Bed'), + ('furni_sofachair_polyfon*4_desc', 'Beige Mode Armchair'), + ('forgottenpw_email', 'Your email address'), + ('console_email', 'Email'), + ('bb_powerup_desc_1', 'Light bulb colours an area around it.'), + ('furni_divider_nor2_desc', 'Strong, yet soft looking'), + ('furni_bardeskcorner_polyfon*5_desc', 'For sweet corners!'), + ('say', 'Say'), + ('bb_powerup_desc_3', 'Flashlight colours a straight line ahead of you.'), + ('bb_powerup_desc_2', 'Bouncing on a spring locks tiles in a single jump.'), + ('bb_powerup_desc_5', 'Bouncing on a box of pins will burst your Battle Ball!'), + ('bb_powerup_desc_4', 'A shot with a cannon locks tiles on a straight line.'), + ('furni_chair_basic*1_name', 'chair_basic'), + ('bb_powerup_desc_7', 'A bomb will clear all tiles around it.'), + ('bb_powerup_desc_6', 'Harlequin effect makes everybody colour tiles for your team!'), + ('NUF_console_read_next', 'Click \'OK\' to mark message as read.'), + ('poster_50_name', 'Bat Poster'), + ('furni_table_plasto_4leg*15_name', 'Occasional Table'), + ('furni_tree7_desc', 'Walking in a winter wonderland!'), + ('poster_37_name', 'The Habbo Babes 3'), + ('furni_queue_tile1*7_desc', 'The power of movement'), + ('furni_bed_budgetb_name', 'Plain Double Bed'), + ('interface_icon_sound', 'Sound Off/On'), + ('pet.hotwords.come_here', 'come here'), + ('poster_10_name', 'Lapland Poster'), + ('win_delete_item', 'Remove Item'), + ('wallitem_hrella_poster_3_name', 'Anchor'), + ('furni_table_plasto_bigsquare*8_desc', 'Hip plastic furniture'), + ('furni_habboween_grass_name', 'Unholy Ground'), + ('furni_plant_valentinerose*4_name', 'Pink Valentine\'s Rose'), + ('nav_venue_skylight_lobby/0_desc', 'Lift your spirits on the top floor'), + ('buddyremove_alphabetical', 'Alphabetical Order'), + ('alert_win_coppa', 'You are blocked'), + ('nav_venue_bb_lobby_amateur_5_name', 'Gevorderden Battle Ball 6'), + ('reg_update_text', 'Never change your password or email just because somebody asks you to. He / she is most probably trying to steal your Habbo account and furni!'), + ('decision_ok', 'OK'), + ('furni_summer_grill*3_name', 'Yellow Barbeque Grill'), + ('nav_public_helptext', 'These are hotel\'s public rooms. What are you waiting for? Go and meet other Habbos!'), + ('tickets_button_info_2', 'Stuff you can do with these 20 tickets'), + ('furni_rclr_chair_name', 'Palm Chair'), + ('login_create1here', 'You can create one here.'), + ('tickets_button_info_1', 'Stuff you can do with these 2 tickets'), + ('furni_prizetrophy6*3_name', 'Champion trophy'), + ('furni_shelves_norja*2_desc', 'For nic naks and art deco books'), + ('purse_info', 'DESCRIPTION'), + ('bb_choose_powerups', 'Powerup select'), + ('purse_transaction', 'View Transactions'), + ('reg_birthdayformat', 'Birthday*: [dd][mm][yyyy]'), + ('Alert_YouMustAgree', 'You must accept the Terms and Conditions before proceeding.'), + ('jukebox_empty', 'Empty'), + ('purse_info_film', 'Films For Camera'), + ('furni_sofachair_polyfon*9_desc', 'Loft-style comfort'), + ('furni_habbocake_desc', 'Save me a slice!'), + ('furni_doormat_plain*6_desc', 'Available in a variety of colours'), + ('nav_venue_sun_terrace/0_desc', 'For lazy afternoons and super tan treatment!'), + ('poster_501_desc', 'For pirates everywhere'), + ('pet_thir_2', 'Thirsty'), + ('gs_error_watch_0', 'All The Spectator Seats Are Taken!'), + ('pet_thir_3', 'Not thirsty'), + ('camera_open_dialog_text', 'Would you like to take some photos\\ror put your camera in your room?'), + ('furni_bed_budget_one*9_desc', 'Prince sized comfort!'), + ('ph_goswimming', 'Go swimming!'), + ('furni_habboween_crypt_name', 'Creepy Crypt'), + ('gs_error_join_7', 'You have already joined this Game!'), + ('nav_venue_sw_lobby_amateur_3_name', 'Snow Slingers Lobby'), + ('furni_romantique_smalltabl*4_name', 'Amber Tray Table'), + ('gs_error_join_3', 'You either have too much or too little skill to join.'), + ('pet_thir_0', 'Gasping'), + ('gs_error_join_0', 'The team you selected is already full.'), + ('pet_thir_1', 'Parched'), + ('furni_gothic_stool*3_name', 'Gothic Stool Red'), + ('furni_wooden_screen*1_name', 'Pink Oriental screen'), + ('furni_sofa_silo*4_name', 'Beige Area Sofa'), + ('furni_queue_tile1*2_desc', 'The power of movement'), + ('buddyremove_continue', 'Remove Friend Now'), + ('nav_venue_bb_lobby_expert_2/0_desc', ''), + ('nav_loading', 'Loading...'), + ('furni_bed_armas_two_name', 'Double Bed'), + ('furni_prizetrophy4*1_name', 'Fish trophy'), + ('furni_sound_machine*7_desc', 'Red alert. Red alert. It\'s a party!'), + ('furni_glass_sofa_desc', 'Translucent beauty'), + ('furni_barchair_silo*5_name', 'Pink Bar Stool'), + ('furni_soft_sofachair_norja*5_desc', 'Pink Iced Sofachair'), + ('console_fr_accepted_count', 'Amount to be accepted'), + ('poster_2001_desc', 'Perinteinen ryijy,'), + ('furni_couch_norja*5_desc', 'Two can perch comfortably'), + ('furni_rclr_lamp_desc', 'Light your space'), + ('furni_sand_cstl_wall_desc', 'sand_cstl_wall'), + ('furni_one_way_door*4_name', 'Beige One Way Gate'), + ('furni_corner_china_name', 'Dragon Screen'), + ('nav_venue_sw_lobby_amateur_4/0_desc', 'Astetta rankempaa lumisotaa.'), + ('furni_chair_silo*7_name', 'Green Silo Dining Chair'), + ('transaction_system_messenger', 'Console SMS'), + ('furni_pura_mdl4*8_desc', ''), + ('console_reject_selected', 'Reject selected'), + ('furni_rare_icecream*4_desc', 'Virtual strawberry rocks!'), + ('furni_prizetrophy*2_desc', 'Shiny silver'), + ('furni_scifiport*0_desc', 'Energy beams. No trespassers!'), + ('paalu_ui2', 'Push'), + ('paalu_ui3', 'Moving'), + ('paalu_ui4', 'Stabilise'), + ('paalu_ui5', 'Balance'), + ('furni_sofa_polyfon*7_name', 'Green Mode Sofa'), + ('nav_error_toomanyfavrooms', 'You can\'t have more than 10 favourite rooms! Please remove an old favourite if you want to add a new one.'), + ('furni_noob_stool*5_name', 'My first Habbo stool'), + ('sound_machine_alert_missing_packages', 'You need the following Traxpacks to edit this song:'), + ('furni_grunge_bench_name', 'Bench'), + ('paalu_ui1', 'Balance'), + ('furni_sleepingbag*5_name', 'Graphite Sleeping Bag'), + ('furni_divider_nor2*3_name', 'White Iced Bar-Desk'), + ('bb_header_teams', 'Teams'), + ('wallitem_sw_swords_name', 'Swords'), + ('furni_val_choco_desc', 'One for them. Two for me!'), + ('nav_venue_bb_lobby_expert_5/0_desc', ''), + ('furni_soft_sofa_norja*2_name', 'Black Iced Sofa'), + ('furni_bed_budgetb_one_desc', 'All you need for a good night\'s kip'), + ('furni_carpet_standard*8_name', 'Floor Rug'), + ('furni_rare_dragonlamp*6_name', 'Gold Dragon Lamp'), + ('furni_sound_set_56_desc', 'Get down tonight!'), + ('furni_divider_nor5*2_name', 'Black Iced Angle'), + ('chat.curse_word', 'Bobba'), + ('furni_couch_norja*4_desc', 'Two can perch comfortably'), + ('furni_scifirocket*2_desc', 'A little closer to home!'), + ('furni_rare_fan*6_desc', 'It\'ll blow you away!'), + ('poster_514_name', 'The EU flag'), + ('club_desc_2_period', '3 Months (93 days) = 60 Credits'), + ('furni_glass_chair*9_desc', 'Translucent beauty'), + ('poster_1338_desc', 'If her age on the clock, she ready for the cock'), + ('nav_src_hd', 'Search Results.'), + ('console_unknown_sender', 'Unknown sender'), + ('furni_prizetrophy4_name', 'Pokaali'), + ('nav_venue_sunset_cafe/0_desc', 'Come and chat about Official Fansites and meet their staff!'), + ('furni_pura_mdl4*9_desc', 'Any way you like it!'), + ('furni_pillar*8_name', 'Roman Pillar'), + ('nav_venue_sport/0_desc', 'St Trinian\'s is out on DVD April 14th!'), + ('furni_pillar*7_name', 'Atlantean Pillar'), + ('club_extend_text', 'If you\'re subscribing again to Habbo Club, you won\'t lose any of the advantages or ongoing furni gifts. Club membership can be extended in advance.\\rRemember: one club month lasts 31 days.'), + ('sound_machine_confirm_eject', 'Remove cartridge?'), + ('shopping_got', 'You have xx in your Purse.'), + ('furni_rare_stand_desc', 'Stand and Deliver!'), + ('furni_chair_plasto_desc', 'Hip plastic furniture'), + ('furni_bed_polyfon_one*9_desc', 'Cot of the artistic'), + ('furni_couch_norja*9_name', 'Red Bench'), + ('poster_3_desc', 'Smells fishy, looks cool'), + ('paalu.winner', 'Winner:'), + ('NUF_meeting_people_room_wave', 'These buttons let you wave and dance. Click on your Habbo at anytime to see these buttons.'), + ('sound_machine_confirm_window', 'Sound Machine'), + ('furni_one_way_door*3_name', 'White HC Gate'), + ('furni_chair_plasty*9_name', 'Plastic Pod Chair'), + ('gs_timeleft', 'Time Left \\x'), + ('hobba_pickup', 'Pick Up'), + ('console_lastvisit', 'Last Visit'), + ('furni_rare_globe_desc', 'It\'s all white..'), + ('furni_val_cauldron_name', 'Valentine\'s Cauldron'), + ('poster_43_name', 'Chains'), + ('furni_bardesk_polyfon*8_desc', 'Yellow Mode Bardesk'), + ('furni_sound_set_36_name', 'Latin Love 1'), + ('dimmer_apply', 'Apply'), + ('furni_glass_chair*8_desc', 'Translucent beauty'), + ('furni_pura_mdl2*7_desc', 'Any way you like it!'), + ('furni_prizetrophy*3_desc', 'Breathtaking bronze'), + ('furni_marquee*1_name', 'Pink marquee'), + ('NUH_own_user', 'This is your Habbo. Click on the floor to move around.'), + ('furni_gothic_sofa*1_desc', 'The dark side of Habbo'), + ('furni_divider_nor5*3_name', 'White Iced Angle'), + ('furni_divider_nor4*5_name', 'Pink Iced Auto Shutter'), + ('furni_soft_sofa_norja*3_name', 'White Iced Sofa'), + ('furni_sofachair_silo*8_desc', 'Large, but worth it'), + ('furni_pura_mdl1*9_desc', 'Any way you like it!'), + ('furni_chair_plasto*7_name', 'Chair'), + ('furni_pura_mdl5*6_desc', 'Any way you like it!'), + ('emailpw', 'Send'), + ('sound_machine_playlist_window', 'Traxmachine Playlist Editor'), + ('furni_pura_mdl1*3_desc', 'Any way you like it!'), + ('furni_noob_table*5_desc', 'Lightweight, practical and pink'), + ('furni_scifirocket*6_name', 'Mercury Smoke Machine'), + ('furni_shelves_norja_name', 'Bookcase'), + ('poster_521_name', 'Flag of Brazil'), + ('sound_machine_jukebox_disk_window', 'Insert disc'), + ('furni_table_norja_med*6_desc', 'For larger gatherings'), + ('furni_pillow*6_name', 'Blue Cotton Pillow'), + ('furni_shelves_norja*3_desc', 'For nic naks and art deco books'), + ('queue_set.s.info', 'There are %d% Habbos in front of you in the queue to see the Habbo Live broadcast!'), + ('reg_parentemail_info', 'Because of your age, we need to let your parents know you are registering at Habbo Hotel. Please give the email address of one of your parents/guardians.'), + ('club_txt_paycash', 'Pay by Cash'), + ('furni_chair_plasto*11_name', 'Chair'), + ('furni_pizza_name', 'Pizza Box'), + ('furni_table_plasto_4leg*6_desc', 'Hip plastic furniture'), + ('furni_chair_silo*3_desc', 'Keep it simple'), + ('alert_reg_t', 'Please check these details:'), + ('nav_venue_theatredrome_name', 'Theatredrome'), + ('furni_hc_rntgn_desc', 'Believe it or not!'), + ('nav_venue_main_lobby_name', 'Main Lobby'), + ('furni_sound_set_64_desc', 'Make a little Jinn-gle!'), + ('nav_venue_sw_lobby_amateur_desc', 'Practice improves a Snow Stormer\'s aim... Ops, missed!'), + ('furni_scifiport*5_name', 'Security Fence'), + ('furni_lamp_basic_desc', 'Switch on the atmosphere with this sophisticated light'), + ('pet.saying.sniff.cat.0', 'snuh..snuh'), + ('poster_506_name', 'The flag of Finland'), + ('furni_bardeskcorner_polyfon*6_desc', 'Blue Mode Bardesk Corner'), + ('nav_venue_hotel_kitchen_name', 'Hotel Kitchen'), + ('furni_doorB_desc', 'Narnia this way!'), + ('poster_11_name', 'Certificate'), + ('furni_safe_silo_desc', 'Totally shatter-proof!'), + ('furni_bed_budget_one*3_desc', 'Prince sized comfort!'), + ('furni_romantique_divider*4_name', 'Ochre Screen'), + ('previous_onearrowed', '< Previous'), + ('nav_venue_bb_lobby_tournament_3_name', 'Competitie Battle Ball 4'), + ('furni_plant_sunflower_desc', 'For happy Habbos'), + ('furni_throne_desc', 'Important Habbos only'), + ('furni_exe_bardesk_name', 'Executive Bar Desk'), + ('furni_tree6_desc', 'The future\'s bright!'), + ('log_problem_title', 'Problems Connecting'), + ('furni_chair_basic*2_name', 'Pink Pura Egg Chair'), + ('game_chess_black', 'Black:'), + ('furni_glass_sofa*9_name', 'Glass sofa'), + ('furni_chair_norja*2_desc', 'Sleek and chic for each cheek'), + ('furni_pillar*3_desc', 'Ancient and stately'), + ('furni_scifidoor*8_desc', 'There out of this world!'), + ('alert_InvalidUserName', 'Don\'t use this character: \\x !'), + ('furni_rare_parasol*3_name', 'Violet Parasol'), + ('furni_bed_budget*5_desc', 'King sized comfort!'), + ('furni_chair_silo*8_name', 'Yellow Dining Chair'), + ('nav_tryingpw', 'Trying the password...'), + ('furni_cn_lamp_desc', 'Light of the East'), + ('furni_prizetrophy3*3_name', 'Globe trophy'), + ('furni_sound_set_16_desc', 'Ferry, ferry good!'), + ('furni_table_plasto_round*4_desc', 'Hip plastic furniture'), + ('poster_2007_desc', 'The legendary founder of the Hotel'), + ('sound_machine_insert', 'Add to mixer'), + ('furni_sound_machine*1_desc', 'Let the party begin!'), + ('furni_bed_polyfon_one*8_desc', 'Yellow Mode Single Bed'), + ('error_room_closed', 'Huone on suljettu.'), + ('pet.hotwords.play_dead', 'play dead'), + ('gs_button_go_finished', 'Scores'), + ('group_member', 'Member'), + ('sound_machine_confirm_save', 'Save the song?'), + ('furni_arabian_wndw_desc', 'Arabian days and nights'), + ('nav_venue_sw_lobby_expert_2_name', 'Snow Marksmen Lobby'), + ('furni_sound_set_57_desc', 'Feel the groove'), + ('furni_triplecandle_desc', 'No need to worry about wax drips'), + ('char_welcome', 'Welcome!'), + ('furni_sound_machine*6_desc', 'Add some effects to your room!'), + ('furni_sofachair_polyfon*3_desc', 'Loft-style comfort'), + ('nav_venue_bb_lobby_amateur_6/0_desc', ''), + ('group_logo_url_template', 'http://www.habbohotel.co.uk/habbo-imaging/badge-fill/%imagerdata%.gif'), + ('furni_table_plasto_bigsquare*2_desc', 'Hip plastic furniture'), + ('furni_glass_table*5_desc', 'Translucent beauty'), + ('url_purse_link', 'http://%predefined%//credits?'), + ('buddyremove_logintime', 'Last Login Time'), + ('NUF_meeting_people_hotelview_tutor', 'The Navigator lets you move between rooms in the Hotel, so open it up to get started!'), + ('furni_sofa_polyfon*6_name', 'Blue Mode Sofa'), + ('furni_scifirocket*1_desc', 'There is always space for this!'), + ('nav_venue_bb_lobby_amateur_10/0_desc', ''), + ('furni_prizetrophy5_name', 'Pokaali'), + ('purse_info_tickets', 'Gaming Tickets'), + ('poster_513_name', 'The Australian flag'), + ('furni_noob_chair*3_desc', 'Lightweight, practical, with red stripes'), + ('alert_old_client', 'You have an old version cached. Please empty your browser cache and login again.'), + ('furni_bar_basic_name', 'A Pura Minibar'), + ('furni_shelves_norja*8_desc', 'For nic naks and art deco books'), + ('sound_machine_save_window', 'Save your Trax'), + ('poster_51_name', 'Basketball Hoop'), + ('Alert_moderator_warning', ''), + ('furni_solarium_norja*5_name', 'Pink Solarium'), + ('furni_sporttrack2*1_desc', 'null'), + ('furni_rubberchair*7_desc', 'Soft and tearproof!'), + ('reg_parentemail_moreinfo', 'More information:'), + ('furni_present_gen5_desc', 'What\'s inside?'), + ('furni_bed_polyfon*9_desc', 'Give yourself space to stretch out'), + ('sound_machine_confirm_save_list_long', 'Are you sure you want to overwrite the current playlist?'), + ('cam_zoom_in.help', 'Zoom In'), + ('furni_carpet_soft*5_name', 'Soft Wool Rug'), + ('furni_plant_small_cactus_name', 'Small Cactus'), + ('console_creatingaprofile', 'Creating A Profile'), + ('console_select_all', 'Select all'), + ('hobba_reply_cfh', 'Reply to:'), + ('notickets_buygame', 'Buy a game'), + ('furni_sporttrack1*3_desc', 'null'), + ('furni_sleepingbag*1_desc', 'Ultimate coziness'), + ('furni_gothic_stool*4_name', 'Black Gothic Stool'), + ('nav_venue_bb_lobby_beginner_4/0_desc', ''), + ('nav_venue_netcafe/0_desc', 'Learn a foreign language and win Habbo Credits in our quests!'), + ('poster_31_desc', 'Pure and unbridled nu-metal'), + ('furni_sound_set_24_desc', 'It\'s all about the Pentiums, baby!'), + ('pet.saying.angry.dog.3', 'dog.1=Oouh..oouh..snuh..ooo'), + ('furni_bed_budget_one*8_desc', 'Prince sized comfort!'), + ('pet.saying.angry.dog.4', 'ARRR Grrr.. woof woof woof'), + ('pet.saying.angry.dog.1', 'Woof! Grrrr..woof woof'), + ('furni_sw_table_desc', ''), + ('pet.saying.angry.dog.2', 'grRRRRrr.r...r'), + ('pet.saying.angry.dog.0', 'Rrrr..woof.. Rrr'), + ('furni_chair_china_name', 'Chinese Lacquer Chair'), + ('furni_romantique_divan*2_desc', 'Recline in continental comfort'), + ('furni_divider_silo1*6_desc', 'Blue Area Corner Shelf'), + ('furni_sound_set_5_name', 'Ambient 4'), + ('roomevent_browser_create', 'Host an event'), + ('furni_noob_rug*6_desc', 'Nice and neat sisal rug with green edging'), + ('transaction_system_bank_luottokunta', 'Luottokortti'), + ('furni_bed_armas_one_name', 'Single Bed'), + ('furni_plant_fruittree_desc', 'Great yield and sweet fruit'), + ('furni_sound_machine_pro_desc', 'creating fancy sounds'), + ('nav_ownrooms_helptext', 'If you didn\'t know, these are your rooms. Here you can modify your rooms or create new ones if you feel like it.'), + ('furni_grunge_radiator_desc', 'Started cool but now it\'s hot!'), + ('furni_divider_silo3*7_desc', 'Green Area Gate'), + ('room_hold', 'Wait a second...\\rLoading room...'), + ('furni_sound_set_49_desc', 'You will belong'), + ('nav_venue_emperors/0_desc', 'Even the smallest of light... shines in the darkness'), + ('furni_nest_name', 'Basket'), + ('furni_noob_table*4_name', 'My first Habbo table'), + ('furni_sound_set_51_desc', 'Bop to the beat'), + ('furni_plant_maze_snow_desc', '20 x Snowy Maze Shrubbery'), + ('NUF_meeting_people_hotelview_icon', 'Click the Navigator button to start visiting the rooms!'), + ('furni_scifirocket*7_desc', 'Larger than life!'), + ('furni_table_plasto_round*9_name', 'Round Dining Table'), + ('furni_val_teddy*5_name', 'Yellow Share Bear'), + ('nav_venue_bb_lobby_expert_2_name', 'Experts Battle Ball 3'), + ('console_onfrontpage', 'Online'), + ('poster_1000_desc', 'The Noble and Silver Show'), + ('furni_rare_icecream*9_name', 'Bubblegum Ice Cream Machine'), + ('furni_rare_fan*0_name', 'Festive Fan'), + ('furni_carpet_polar_name', 'Faux-Fur Bear Rug'), + ('hobba_chatlog', 'See Chat Log >>'), + ('furni_romantique_chair*3_desc', 'null'), + ('hobba_pickedby', 'Picked Up By:'), + ('poster_24_desc', 'Trying to get in or out?'), + ('furni_table_silo_small*2_desc', 'For those random moments'), + ('furni_table_plasto_bigsquare*15_name', 'Occasional Table'), + ('furni_prizetrophy7*2_desc', 'Silver Habbo trophy'), + ('ph_keys_run', 'Run:'), + ('error_title', 'Oops, error!'), + ('furni_rare_dragonlamp*0_name', 'Fire Dragon Lamp'), + ('furni_CFC_50_coin_silver_name', 'Silver Coin (China)'), + ('furni_chair_plasty_name', 'Plastic Pod Chair'), + ('nav_roomInfo', 'Room info'), + ('furni_sound_set_63_name', 'Alhambra Trax 2'), + ('furni_divider_nor2*9_desc', 'Red Iced bar desk'), + ('furni_soft_sofa_norja*8_name', 'Yellow Iced Sofa'), + ('poster_57_desc', 'chinese calligraphy'), + ('furni_table_plasto_4leg*16_name', 'Occasional Table'), + ('accept', 'Accept'), + ('pet.saying.beg.cat.2', 'MEOW, MEOW, MEOW..'), + ('furni_waterbowl*3_desc', 'Aqua unlimited'), + ('furni_divider_poly3*2_name', 'Black Mode Bardesk Gate'), + ('furni_divider_nor3_desc', 'Do go through...'), + ('furni_table_plasto_square*5_desc', 'Hip plastic furniture'), + ('furni_rubberchair*1_desc', 'Soft and stylish HC chair'), + ('furni_divider_nor5*8_name', 'Yellow Iced Angle'), + ('furni_pura_mdl4*3_desc', 'Any way you like it!'), + ('nav_removerights_desc', 'Remove all rights to this room from other users.'), + ('furni_chair_norja*7_name', 'Rural Chair'), + ('furni_pillar*2_name', 'Nordic Pillar'), + ('furni_bed_polyfon*3_name', 'White Double Bed'), + ('furni_glass_chair*3_desc', 'Translucent beauty'), + ('wallitem_xmas_light_name', 'Xmas light'), + ('pet.saying.beg.cat.0', 'MaUUU...MEOW...meow'), + ('pet.saying.beg.cat.1', '*looks up with sad eyes*'), + ('reg_verification_newEmail', 'Your new email address:'), + ('furni_sound_set_29_desc', 'Electronic house'), + ('furni_joulutahti_desc', 'Christmas in a pot'), + ('furni_china_table_name', 'Chinese Lacquer Table'), + ('poster_507_desc', 'The French flag'), + ('NUF_visiting_rooms_hotelview_nav', 'Click the icon to open the Navigator.'), + ('dimmer_preset_1', 'Preset 1'), + ('nav_private_helptext', 'These are the rooms owned by Habbos. Select a category first and then browse some rooms and meet some people!'), + ('furni_queue_tile1*8_desc', 'The power of movement'), + ('dimmer_preset_2', 'Preset 2'), + ('furni_arabian_pllw_name', 'Green Blossom Pillow'), + ('nav_venue_bb_lobby_tournament_7/0_desc', ''), + ('furni_goodie1*1_desc', 'Crunchy Dog Treat'), + ('poster_36_name', 'The Habbo Babes 2'), + ('poll_window', 'Question'), + ('furni_md_limukaappi_desc', 'A sparkling and refreshing pixel drink!'), + ('nav_venue_rooftop_rumble_ii_name', 'Rooftop Rumble II'), + ('furni_wooden_screen*7_name', 'Purple Oriental Screen'), + ('furni_scifidoor*2_name', 'Yellow Spaceship Door'), + ('room_max_pet_limit', 'Too many pets in the room!'), + ('hobba_sent_to_helpers', 'Call re-assigned as emergency and sent to moderators'), + ('furni_table_silo_med*4_desc', 'Beige Area Coffee Table'), + ('furni_romantique_pianochair*5_name', 'Onyx Piano Stool'), + ('nav_modify_roomdescription', 'Room Description'), + ('furni_sound_set_10_name', 'Hip Hop Beats 1'), + ('furni_chair_silo*2_name', 'Black Dining Chair'), + ('furni_marquee*6_name', 'Blue Marquee'), + ('poster_8_name', 'Habbo Colours'), + ('transaction_system_htk_singledrop', 'Landline'), + ('furni_chair_plasty*4_desc', 'Hip plastic furniture'), + ('dimmer_preset_3', 'Preset 3'), + ('furni_exe_corner_desc', 'Tuck it away'), + ('nav_venue_welcome_lounge/0_desc', 'New? Lost? Get a warm welcome here from Habbo eXperts.'), + ('furni_sleepingbag*6_desc', 'Ultimate coziness'), + ('nav_venue_cunning_fox_gamehall/3_name', 'Batleships'), + ('console_mainhelp', 'Habbo Console Help'), + ('tickets_button_info_hide', 'Hide Ticket Info'), + ('furni_xmas_icelamp_name', 'Lantern Bundle 2'), + ('nav_venue_bb_lobby_amateur_0/0_desc', ''), + ('purse_header', 'Habbo Purse'), + ('furni_noob_lamp*3_name', 'My first Habbo lamp'), + ('nav_help_title', 'Want a room of your own?'), + ('buy', 'Buy'), + ('furni_pura_mdl1*8_name', 'yellow pura module 1'), + ('dimmer_title', 'Mood Light'), + ('NUF_mini_meet_people_hotelview_icon', 'Click the Navigator button to start visiting the rooms!'), + ('console_credits', 'Credits'), + ('bb_link_highScores_url', 'http://%predefined%/groups/56552/id'), + ('wallitem_md_logo_wall_desc', 'Bubble up your wall'), + ('furni_safe_silo*4_desc', 'Totally shatter-proof!'), + ('room_unignore', 'Listen'), + ('nav_venue_sw_lobby_amateur_1/0_desc', ''), + ('poster_16_name', 'Bars'), + ('furni_sofachair_silo*7_name', 'Green Area Armchair'), + ('furni_spyro_name', 'Dragon Egg'), + ('nav_venue_bb_lobby_beginner_19/0_desc', ''), + ('Alert_YourPasswordIsTooShort', 'Passwords must be at least 6 characters long.'), + ('room_cant_trade', 'You cannot trade this!'), + ('furni_door_desc', 'Dr Who?'), + ('gs_button_go_created', 'Join'), + ('poster_49_name', 'Large silver star'), + ('furni_glass_sofa*4_name', 'Glass sofa'), + ('furni_divider_arm3_desc', 'Knock, knock...'), + ('furni_sound_set_31_desc', 'House loops'), + ('reg_habboname', 'Habbo name:'), + ('habboclub_thanks', 'Yippee! You are now a member of Habbo Club! Your current email address is %email%. \\r\\rIf that\'s not the one you are using, please go to \'Update my Habbo ID\' and change it now. \\rThen we can contact you about your membership if need be.'), + ('console_follow_offline', 'Your friend is offline.'), + ('furni_divider_nor1*5_name', 'Pink Ice corner'), + ('nav_openbutton', 'Open'), + ('nav_venue_theatredrome_habbowood/0_desc', 'Home to the Habbowood Gala and HAFTA Awards!'), + ('nav_venue_ice_cafe/0_desc', 'Come here. And chill out.'), + ('furni_calippo_name', 'Calippo icecream machine'), + ('furni_bench_lego_desc', 'For your reserve players'), + ('poster_9_desc', 'Do your bit for the environment'), + ('furni_bed_polyfon_one*3_desc', 'Cot of the artistic'), + ('poster_44_desc', 'Beware the curse...'), + ('poster_2006_name', 'DJ Throne'), + ('furni_pura_mdl3*5_desc', ''), + ('furni_arabian_tray4_name', 'Fruit Tray'), + ('furni_divider_nor3*7_desc', 'Entrance or exit?'), + ('furni_sound_set_30_name', 'Instrumental 1'), + ('furni_romantique_tray1_name', 'Breakfast Tray'), + ('furni_jp_tray1_desc', 'jp_tray1'), + ('furni_plant_maze_desc', 'Build your maze!'), + ('console_getfriendrequest_2', 'If you accept this invitation (s)he will be added to your Friends List. Then you can send messages to each other.'), + ('furni_hockey_light_name', 'Lert'), + ('furni_goodie1_desc', 'Crunchy Dog Treat'), + ('console_getfriendrequest_1', 'has asked you to become his/her Friend.'), + ('furni_pura_mdl2*1_desc', 'Any way you like it!'), + ('score_board.text', 'POINTS'), + ('furni_one_way_door*9_name', 'Red One Way Gate'), + ('furni_sand_cstl_twr_desc', 'sand_cstl_twr desc'), + ('furni_divider_nor5*9_desc', 'Cool cornering for your crib y0!'), + ('furni_duck_desc', 'Every bather needs one'), + ('furni_bardesk_polyfon*2_desc', 'Black Mode Bardesk'), + ('console_request_2', '(S)he will be added into your Friends List if (s)he accepts it.'), + ('bb_link_join', 'Join Team'), + ('nav_createroom_hd', 'Here you can create your own room!'), + ('console_request_1', 'has been sent your Friend Request.'), + ('reg_check_info', 'CHECK YOUR INFO'), + ('furni_toy1*4_name', 'Rubber Ball'), + ('nav_venue_sw_lobby_free_0_name', 'Free Game Lobby'), + ('furni_chair_plasto*1_name', 'Chair'), + ('furni_toilet_name', 'Loo Seat'), + ('queue_set.dc.info', 'Number of Habbos in default queue is %d% and in Habbo Club queue %c%'), + ('furni_sofachair_silo*2_desc', 'Large, but worth it'), + ('furni_chair_plasto*12_desc', 'Hip plastic furniture'), + ('ph_tickets_buyfor', 'Buy Tickets for:'), + ('sound_machine_confirm_close', 'Close the editor?'), + ('furni_rare_fan*1_desc', 'It\'ll blow you away!'), + ('furni_divider_poly3*3_desc', 'Border control!'), + ('nav_venue_kattoterassi/0_desc', 'When push comes to shove...'), + ('furni_summer_grill*4_desc', 'Plenty of burgers on that barbie'), + ('furni_bar_armas_desc', 'It\'s a barrel of laughs and a great talking point'), + ('furni_toilet_red_name', 'Loo Seat'), + ('furni_hc_lmp_desc', 'Be enlightened'), + ('furni_romantique_mirrortabl_name', 'Dressing Table'), + ('furni_pura_mdl4*2_name', 'Pink Pura Module 4'), + ('summer_chair_5_desc', 'Enjoy the summer air'), + ('furni_plant_rose_desc', 'Sleek and chic'), + ('furni_skullcandle_name', 'Skull Candle Holder'), + ('Alert_no_credits', 'You don�t have enough Credits for this.'), + ('pet.hotwords.voice', 'speak'), + ('furni_prizetrophy4*2_desc', 'Shiny silver'), + ('furni_soft_sofachair_norja*4_name', 'Urban Iced Sofachair'), + ('furni_pura_mdl5*1_desc', 'Any way you like it!'), + ('furni_safe_silo*9_name', 'Red Safe Minibar'), + ('furni_bed_trad_desc', 'Sweet dreams for two'), + ('nav_venue_club_massiva_desc', 'Strut your funky stuff!'), + ('furni_rare_dragonlamp*1_desc', 'Out of the deep blue!'), + ('furni_wooden_screen*2_desc', 'Add an exotic touch to your room'), + ('furni_prizetrophy7*1_name', 'Gold Habbo trophy'), + ('furni_carpet_standard*2_name', 'Floor Rug'), + ('furni_arabian_teamk_desc', 'Quench that desert thirst'), + ('furni_romantique_chair*2_name', 'Lime Romantique Chair'), + ('nav_venue_sw_lobby_tournament_0_name', 'Tournament Lobby'), + ('invitation_expired', 'Sorry, all Welcoming Party members were busy.'), + ('gs_error_game_checkname', 'Please check the Game\'s name!'), + ('furni_sound_set_23_name', 'SFX 4'), + ('furni_grand_piano*2_desc', 'Black Grand Piano'), + ('tutorial_quit', 'Close guide'), + ('furni_chair_basic*8_desc', ''), + ('NUF_getting_room_roommatic_security_tutor', 'Finally you can choose the security settings to your room and whether other users can move your furniture.'), + ('nav_venue_bb_lobby_beginner_1/0_desc', ''), + ('nav_private_helptext_hd_main', 'Habbo Guest Rooms'), + ('club_price', 'One month costs 25 Habbo Credits.'), + ('NUF_playing_games_navigator_tutor', 'Click either SnowStorm or BattleBall to open up a list of the game lounges.'), + ('nav_venue_old_skool_name', 'Old Skool Habbo'), + ('nav_venue_bb_lobby_beginner_4_name', 'Beginners Battle Ball 5'), + ('nav_venue_bb_lobby_tournament_9_name', 'Competitie Battle Ball 10'), + ('sound_machine_alert_song_saved', 'Song "%name%" successfully saved.'), + ('nav_venue_sw_lobby_intermediate_3_name', 'Snow Bombardiers Lobby'), + ('nav_venue_club_massiva/1_desc', 'Strut your funky stuff'), + ('furni_gothic_chair*1_name', 'Gothic Chair Pink'), + ('furni_divider_poly3_desc', 'All bars should have one'), + ('furni_romantique_divan*1_name', 'Pink Romantique Divan'), + ('NUF_playing_games_hotelview_tutor', 'Now we find out where to locate the Habbo Games!'), + ('poster_29_name', 'Gold Tinsel Bundle'), + ('furni_present_gen4_name', 'Gift'), + ('furni_bardesk_polyfon*7_name', 'Green Mode Bardesk'), + ('furni_gothic_sofa*6_name', 'Gothic Sofa Blue'), + ('furni_glass_stool*5_name', 'Glass stool'), + ('nav_venue_sw_lobby_free_5/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('nav_fav_hd', 'Your Favourite Rooms.'), + ('NUF_console_read_tutor', 'The Habbo Console lets you message your Habbo friends, and check whether they are online.'), + ('furni_romantique_tray2_desc', 'Spoil Yourself'), + ('Alert_ModeratorWarning', 'Message from a Moderator:'), + ('furni_giftflowers_name', 'Vase of Flowers'), + ('furni_table_silo_small*7_name', 'Green Area Occasional Table'), + ('furni_menorah_name', 'Menorah'), + ('furni_bed_polyfon_one*2_name', 'Black Mode Single Bed'), + ('console_offline', 'Offline'), + ('gs_mouseover_player', '\\x\\r\\yp'), + ('nav_venue_bb_lobby_amateur_3/0_desc', ''), + ('nav_venue_bb_lobby_amateur_13/0_desc', ''), + ('furni_noob_chair*2_name', 'My first Habbo chair'), + ('furni_doormat_plain*1_desc', 'Available in a variety of colours'), + ('object_displayer_hide_tags', 'Hide tags'), + ('poster_17_desc', 'Beautiful reproduction butterfly'), + ('gs_joinedplayers', 'Players Who Joined: \\x'), + ('furni_table_plasto_round*3_name', 'Round Dining Table'), + ('furni_divider_poly3*8_name', 'Yellow Mode Bardesk Gate'), + ('furni_glass_table*4_name', 'Glass table'), + ('furni_solarium_norja*6_desc', 'Rejuvenate your pixels!'), + ('poster_1006_desc', 'The eyes follow you...'), + ('furni_noob_rug*5_name', 'My first Habbo rug'), + ('buddyremove_pagecounter', 'Page'), + ('poll_alert_answer_missing', 'Please give an answer'), + ('furni_summer_chair*5_desc', 'Beige'), + ('furni_table_plasto_4leg*10_name', 'Occasional Table'), + ('furni_divider_silo2_desc', 'Stylish sectioning'), + ('furni_djesko_turntable_desc', 'For the music-lovers'), + ('nav_remrightsconf', 'You are about to remove all rights from your room. This means that only you will have rights to move and place furni in the room.'), + ('furni_pillow*0_name', 'White Lace Pillow'), + ('sound_machine_eject', 'Eject'), + ('gs_button_ready', 'Ready'), + ('furni_divider_silo1*5_name', 'Pink Area Corner Shelf'), + ('NUF_habbo_home_hotelview_tutor', 'You have now opened a page on the Habbo Website that will give you plenty of information about how to make yourself a Habbo Home.'), + ('furni_traffic_light*4_desc', 'Chill and wait your turn!'), + ('nav_venue_$unit.name$/0_desc', 'Roam more of the hotel\'s corridors'), + ('furni_sporttrack1*2_name', 'Sport track straight asphalt'), + ('furni_sofachair_polyfon_girl_name', 'Armchair'), + ('furni_sound_set_6_desc', 'Background ambience loops'), + ('furni_hal_grave_desc', 'We\'re raising the dead!'), + ('recycler_ready_info', 'Your recycled Furniture is ready. Please either accept or cancel. If you accept, you will receive your recycling reward, detailed below. If you cancel, all your old Furniture will be restored to your hand.'), + ('wallitem_jp_sheet1_name', 'jp_sheet1'), + ('furni_petfood2_name', 'Sardines Mega Multipack'), + ('furni_spotlight_name', 'Habbowood Spotlight'), + ('furni_carpet_soft*6_desc', 'Soft Wool Rug'), + ('gs_lounge_skill', 'Level in this Lounge: \\x \\r (\\y-\\z points)'), + ('nav_help_text', 'Click the Public Spaces tab on the top left of this navigator to find gaming rooms!'), + ('furni_table_plasto_4leg*5_name', 'Occasional Table'), + ('nav_venue_bb_arena_1_name', 'Battle Ball Aloittelijat'), + ('furni_table_silo_med*9_name', 'Red Area Coffee Table'), + ('furni_bed_budget_one*2_name', 'Pink Pura Bed'), + ('nav_venue_sw_lobby_expert_2/0_desc', 'Todellisille lumisotureille.'), + ('furni_rubberchair*6_name', 'Violet Inflatable Chair'), + ('furni_bardeskcorner_polyfon*5_name', 'Candy Corner'), + ('bb_powerup_8', 'Vacuum cleaner'), + ('bb_powerup_6', 'Harlequin'), + ('furni_rare_beehive_bulb*2_name', 'Yellow Amber Lamp'), + ('bb_powerup_7', 'Bomb'), + ('furni_divider_nor2_name', 'Ice Bar-Desk'), + ('bb_powerup_4', 'Cannon'), + ('bb_powerup_5', 'Box of pins'), + ('bb_powerup_2', 'Spring'), + ('bb_powerup_3', 'Flashlight'), + ('console_report', 'Report'), + ('bb_powerup_1', 'Light bulb'), + ('furni_sound_set_43_name', 'SFX 1'), + ('poster_37_desc', 'The Hotels girlband. Dream on!'), + ('interface_icon_messenger', 'Messenger, friends & messages on here'), + ('interface_icon_hand', 'Hand, your inventory'), + ('furni_s_sound_machine*4_name', 'Sound Machine Blue'), + ('nav_venue_sunset_cafe_name', 'Sunset Cafe'), + ('wallitem_sw_stone_desc', 'sw_stone'), + ('reg_check_mail', 'Email'), + ('furni_queue_tile1*7_name', 'Purple Habbo Roller'), + ('pet.hotwords.nest', 'sleep'), + ('furni_sound_machine_desc', 'Creating fancy sounds'), + ('cancel', 'Cancel'), + ('furni_hyacinth2_desc', 'Beautiful bulb'), + ('nav_venue_library/0_name', 'Habbo Library'), + ('furni_waterbowl*1_desc', 'Aqua unlimited'), + ('furni_grand_piano*5_desc', 'Why is that key green?'), + ('furni_table_plasto_bigsquare*8_name', 'Square Dining Table'), + ('furni_nouvelle_trax_name', 'nouvelle_trax'), + ('help_choise_header', 'What do you need help with?'), + ('furni_bardeskcorner_polyfon*7_name', 'Green Mode Bardesk Corner'), + ('furni_pillar*4_name', 'Dark Ages Pillar'), + ('furni_queue_tile1*6_desc', 'The power of movement'), + ('club_intro_link', 'Learn more about Habbo Club!'), + ('furni_sandrug_desc', 'Your own paradise island'), + ('poster_10_desc', 'Beautiful sunset'), + ('furni_divider_nor1_name', 'Ice Corner'), + ('nav_venue_bb_lobby_tournament_6_name', 'Competitie Battle Ball 7'), + ('furni_redhologram_desc', 'You\'re her only hope...'), + ('poster_38_name', 'Smiling Headbangerz'), + ('furni_hc_crtn_name', 'Antique Drapery'), + ('furni_barchair_silo*9_name', 'Red Bar Stool'), + ('room_badge_visible', 'Visible'), + ('furni_sleepingbag*8_name', 'Golden Sleeping Bag'), + ('roomevent_invalid_input', 'You must give your event a name and a description.'), + ('furni_chair_plasto*14_name', 'HC chair'), + ('poster_522_desc', 'The flag of Japan'), + ('furni_shelves_norja*2_name', 'Black Bookcase'), + ('nav_venue_dusty_lounge_name', 'Dusty Lounge'), + ('furni_sound_set_53_desc', 'Break the icy silence'), + ('nav_venue_ice_cafe_name', 'Ice Cafe'), + ('click', 'OK to continue to the hotel.'), + ('nav_venue_sw_lobby_free_2/0_desc', ''), + ('furni_rare_dragonlamp*9_name', 'Purple Dragon Lamp'), + ('furni_statue_desc', 'Watch out for those arrows!'), + ('game_battles_turn', 'TURN'), + ('wallitem_jp_sheet3_desc', 'jp_sheet3'), + ('furni_edicehc_desc', 'Click and roll!'), + ('furni_bed_budget*6_name', 'Blue Pura Double Bed'), + ('furni_gothic_sofa*5_desc', 'The dark side of Habbo'), + ('furni_scifirocket*5_desc', 'From the unknown depths of space'), + ('game_poker_ready', 'READY'), + ('furni_queue_tile1*2_name', 'Red Habbo Roller'), + ('furni_rare_parasol_desc', 'Zon! Zon! Zon!'), + ('transaction_system_sms_dna', 'DNA'), + ('furni_bar_polyfon_name', 'Mini-Bar'), + ('furni_grand_piano*1_name', 'Turquoise Grand Piano'), + ('nav_venue_bb_lobby_expert_4_name', 'Experts Battle Ball 5'), + ('bb_link_highscores', 'Highscores'), + ('summer_chair_8_desc', 'The summer winds are creeping in'), + ('reg_parentemail_title2', 'Email address of parent/guardian:'), + ('error_report_explain', 'An error has occurred, please see the error code above.'), + ('console_noprofile', 'Habbo Profile Not Found'), + ('furni_glass_sofa*3_desc', 'Translucent beauty'), + ('furni_romantique_smalltabl*4_desc', 'Why is one leg different?'), + ('furni_table_plasto_4leg*14_name', 'HC table'), + ('nav_venue_bb_lobby_intermediate_2_name', 'Semi-profs Battle Ball 3'), + ('NUF_playing_games_gamerooms_tutor', 'Click the \'Go\' button to go to the Game Lounge.'), + ('habboclub_require_parent_permission', 'You need to tick the box to say that you are over 14 years or age, \\ror under 14 and have your parent/guardian\'s permission to join Habbo Club. \\rPlease go back and tick the box.'), + ('furni_wooden_screen*1_desc', 'Add an exotic touch to your room'), + ('nav_venue_bb_lobby_intermediate_4/0_desc', ''), + ('furni_glass_sofa*6_name', 'Blue Glass Sofa'), + ('furni_bench_armas_desc', 'To complete the dining set'), + ('furni_barchair_silo*2_name', 'Black Bar Stool'), + ('nav_venue_bb_lobby_expert_6/0_desc', ''), + ('furni_jp_tray2_desc', 'jp_tray2'), + ('furni_val_teddy*3_desc', 'The green bear of friendship'), + ('transaction_system_sms_win_vodafone', 'Vodafone SMS'), + ('furni_glass_sofa_name', 'Glass sofa'), + ('console_online', 'online:'), + ('poster_2004_desc', 'irie!'), + ('x', 'X'), + ('nav_venue_habbo_lido/0_desc', 'Pool is open for swimming and diving!'), + ('furni_soft_sofachair_norja_name', 'iced sofachair'), + ('furni_xmas_cstl_twr_name', 'Ice Castle Tower'), + ('nav_venue_park_name', 'Habbo Gardens'), + ('recycler_info_open', 'Ecotron is the place to visit if you want to recycle your old Furniture. Simply drag the old Furni from your hand to the empty slots below. Recyclable items display the green recyclable tag in your hand. Please note that you must own the Furniture for at least %quarantine_hours% hour before they can be recycled. Recycling takes a total of %total_hours% hours.'), + ('group_window_title', 'Habbo Groups'), + ('pet.saying.eat.dog.4', 'Mmmmm..'), + ('game_chess', 'Chess'), + ('pet.saying.eat.dog.2', 'slurp, slurp, slurp'), + ('roomatic_roomdesc', 'Room description:'), + ('furni_sofa_polyfon*7_desc', 'Green Mode Sofa'), + ('pet.saying.eat.dog.3', 'hrum, umm, umm grrr'), + ('pet.saying.eat.dog.0', 'hrum, hrum, crunch!'), + ('preview_downloading', 'Preview downloading...'), + ('sound_machine_confirm_close_long', 'Are you sure you want to leave the editor without saving the song?'), + ('partner_registration_title', 'Hey, I forgot to mention one thing..'), + ('pet.saying.eat.dog.1', 'crunch, crunch mmmm'), + ('nav_venue_bb_lobby_tournament_12/0_desc', ''), + ('furni_carpet_soft*3_name', 'Soft Wool Rug'), + ('furni_sound_set_56_name', 'RnB Grooves 2'), + ('reg_termslink', 'Terms and Conditions'), + ('wallitem_sw_swords_desc', 'Z for Zorro'), + ('furni_sleepingbag*10_name', 'Khaki Sleeping Bag'), + ('furni_hc_dsk_name', 'Study Desk'), + ('furni_chair_silo*8_desc', 'Keep it simple'), + ('furni_glass_chair*8_name', 'Glass chair'), + ('nav_venue_cafe_ole_name', 'Cafe ole'), + ('furni_sleepingbag*5_desc', 'Ultimate coziness'), + ('opening_hours_text_closed', 'The Hotel has been closed and will be open to the public again at %h%:%m%.'), + ('furni_grunge_bench_desc', 'Laid back seating'), + ('BuddyNotHere', 'Offline'), + ('furni_noob_lamp*5_desc', 'Get the light right where you want it (pink)'), + ('NUH_navigator', 'Use the Navigator to move around. There are literally thousands of rooms to explore!'), + ('poster_1338_name', 'Pedobear Seal of Approval'), + ('furni_queue_tile1*9_name', 'Green Habbo Roller'), + ('furni_habboween_crypt_desc', 'What lurks inside?'), + ('furni_sofachair_silo*9_name', 'Red Area Armchair'), + ('furni_exe_chair_name', 'Executive Sofa Chair'), + ('furni_rare_dragonlamp*6_desc', 'Scary and scorching!'), + ('furni_divider_nor2*3_desc', 'Strong, yet soft looking'), + ('furni_tile_yell_name', 'Floor Tiles'), + ('furni_plant_yukka_name', 'Yukka Plant'), + ('furni_wooden_screen*8_desc', 'Add an exotic touch to your room'), + ('furni_pillar*8_desc', 'All roads lead to Rome'), + ('trading_youoffer', 'You offer:'), + ('furni_marquee*8_desc', 'It\'s both door and a shade!'), + ('furni_pura_mdl4*9_name', 'Red Pura Module 4'), + ('roomatic_congrats', 'Congratulations! You\'re now the proud owner of your own Habbo Hotel room.'), + ('furni_tile_marble_name', 'Marble Tile'), + ('furni_bed_budget*3_desc', 'King sized comfort!'), + ('furni_sound_machine*3_desc', 'Top the Habbo Charts!'), + ('nav_venue_bb_lobby_beginner_10_name', 'Beginners Battle Ball 11'), + ('nav_venue_bb_lobby_tournament_1/0_desc', ''), + ('poster_2000_name', 'Suomen kartta'), + ('furni_solarium_norja*3_name', 'Urban Solarium'), + ('furni_present_gen3_desc', 'What\'s inside?'), + ('furni_glass_stool*4_desc', 'Translucent beauty'), + ('int_update_id', 'Update My Habbo ID >>'), + ('nav_venue_bb_lobby_beginner_8/0_desc', ''), + ('furni_carpet_standard*8_desc', 'Available in a variety of colours'), + ('furni_pillar*1_desc', 'Ancient and stately'), + ('receive_invitation_text', 'invites you his/her room. Accept invitation?'), + ('poll_offer_window', 'Welcome to our poll'), + ('furni_table_plasto_bigsquare*5_desc', 'Hip plastic furniture'), + ('furni_carpet_standard*1_desc', 'Available in a variety of colours'), + ('furni_hologram_name', 'Holopod'), + ('nav_venue_bb_lobby_amateur_desc', 'Amateur battle ball!'), + ('furni_barchair_silo*6_desc', 'Practical and convenient'), + ('furni_divider_nor5_desc', 'Cool cornering for your crib y0!'), + ('purse_vouchers_helpbutton', 'More about vouchers >>'), + ('furni_shelves_norja*6_desc', 'For nic naks and art deco books'), + ('nav_venue_sw_lobby_tournament_5/0_desc', ''), + ('furni_chair_basic*4_desc', 'It\'s a cracking design!'), + ('nav_hidefull', 'Hide Full Rooms'), + ('modtool_ban_computer', 'Ban Computer Also'), + ('furni_gothic_sofa*1_name', 'Gothic Sofa Pink'), + ('furni_carpet_standard*b_name', 'Floor Rug'), + ('queue_line', 'You are queueing right now...'), + ('furni_divider_nor1*6_desc', 'Blue Ice corner'), + ('nav_search_helptext', 'Looking for something? Here you can search other Habbo\'s rooms. Type the room name or the name of the Habbo to search for a room.'), + ('furni_marquee*1_desc', 'It\'s both door and a shade!'), + ('furni_rcandleset_desc', 'Simple but stylish'), + ('nav_room_banned', 'You are banned from this room.'), + ('furni_lamp_armas_name', 'Table Lamp'), + ('catalog_costs', '\\x1 costs \\x2 Credits'), + ('furni_drinks_desc', 'Are you a slob too?'), + ('furni_pura_mdl5*6_name', 'Blue Pura Module 5'), + ('summer_chair_1_desc', 'Gotta get up early to get one!'), + ('furni_prize3_desc', 'A weighty award'), + ('furni_soft_sofa_norja*7_name', 'Rural Iced Sofa'), + ('poster_518_name', 'The Welsh flag'), + ('furni_sofachair_polyfon*8_name', 'Yellow Mode Armchair'), + ('furni_prizetrophy3*3_desc', 'Breathtaking bronze'), + ('nav_venue_sw_lobby_amateur_6_name', 'Snow Slingers Lobby'), + ('furni_stand_polyfon_z_desc', 'Tidy up'), + ('furni_carpet_soft_tut_name', 'Welcome Mat'), + ('console_reject_all', 'Reject All'), + ('month12', 'December'), + ('month11', 'November'), + ('help_topics', 'Help Topics:'), + ('nav_venue_sw_lobby_beginner_8/0_desc', ''), + ('nav_rooms_own', 'Own Room(s)'), + ('reg_pwd_note', 'Choose a password that\'s hard to guess! So, don\'t use ANYONES name, or your favorite colour!'), + ('furni_wooden_screen*4_name', 'Golden Oriental Screen'), + ('nav_venue_sw_lobby_beginner_2/0_desc', ''), + ('furni_pillow*6_desc', 'Puffy, soft and huge'), + ('furni_bed_polyfon_one*4_desc', 'Beige Mode Single Bed'), + ('reg_email_note', 'Please enter your e-mail address, this is important! You\'ll only get customer support and special offers via email, if you enter a valid email address and verify it.'), + ('group_admin', 'Administrator'), + ('furni_scifirocket*8_name', 'Pluto Smoke Machine'), + ('furni_chair_plasto*11_desc', 'Hip plastic furniture'), + ('month10', 'October'), + ('furni_goth_table_name', 'Gothic table'), + ('month05', 'May'), + ('month04', 'April'), + ('nav_modify_maxvisitors', 'Choose maximum number of visitors'), + ('nav_venue_bb_lobby_amateur_2_name', 'Gevorderden Battle Ball 3'), + ('month07', 'July'), + ('habboclub_price1', '30'), + ('month06', 'June'), + ('month01', 'January'), + ('month03', 'March'), + ('month02', 'February'), + ('furni_summer_chair*2_desc', 'Pink'), + ('month09', 'September'), + ('month08', 'August'), + ('furni_bardeskcorner_polyfon*4_desc', 'Beige Mode Bardesk Corner'), + ('furni_tree6_name', 'Flashy Christmas Tree'), + ('furni_arabian_snake_name', 'Ornamental Urn'), + ('reg_verification_incorrectPassword', 'Your password was incorrect'), + ('NUF_visting_rooms_hotelview_tutor', 'Here we go again. This time we are learning how to visit another Habbos room.'), + ('furni_summer_chair*9_desc', 'Got your sunglasses?'), + ('furni_safe_silo_name', 'Safe Minibar'), + ('furni_throne_name', 'Throne'), + ('furni_soft_sofachair_norja*8_desc', 'Yellow Iced Sofachair'), + ('NUF_console_ready_tutor', 'You can now use the Console to find some of your friends, or you can continue the tutorial.'), + ('nav_venue_picnic/0_desc', 'Don\'t forget to grab a carrot or two!'), + ('furni_bardeskcorner_polyfon_name', 'Corner Cabinet/Desk'), + ('game_placeship', 'Place your ships:'), + ('furni_glass_table*7_desc', 'Habbo Club'), + ('poster_13_name', 'BW Skyline Poster'), + ('furni_jp_bamboo_name', 'Bamboo Forest'), + ('furni_plant_bulrush_name', 'Bulrush'), + ('furni_deadduck3_desc', 'With added ectoplasm'), + ('win_purse', 'Habbo Purse'), + ('furni_jp_tray5_name', 'jp_tray5'), + ('furni_hc_tbl_desc', 'Perfect for banquets'), + ('furni_shelves_norja_desc', 'For nic naks and art deco books'), + ('club_desc_3_period', '6 Months (186 days) = 105 Credits'), + ('furni_bed_budget_one*3_name', 'Black Pura Bed'), + ('poster_2_name', 'Carrot Plaque'), + ('furni_solarium_norja*7_desc', 'Fun in the sun!'), + ('poster_2007_name', 'The Father Of Habbo'), + ('gs_header_teams', 'Teams'), + ('furni_divider_poly3*9_desc', 'Border Control!'), + ('gs_button_creategame', 'Create A New Game'), + ('furni_sound_set_42_name', 'Haunted Mansion'), + ('poll_alert_invalid_selection', 'Please select fewer alternatives'), + ('furni_scifirocket*1_name', 'Saturn Smoke Machine'), + ('furni_scifidoor*10_name', 'Violet Spaceship Door'), + ('furni_sound_set_5_desc', 'The dark side of Habbo'), + ('club_confirm_gift_title', 'You have received a Habbo club gift!'), + ('bb_info_gamePrice', 'Play now for just 2 tickets.'), + ('furni_sound_machine*6_name', 'Purple Traxmachine'), + ('wallitem_arabian_swords_desc', 'Not for yielding'), + ('furni_divider_nor2*6_name', 'Blue Iced bar desk'), + ('nav_venue_sw_lobby_expert_0/0_desc', ''), + ('furni_noob_chair*1_name', 'My first Habbo chair'), + ('group_room_link', 'Group\'s room: %room_name% >>>'), + ('sound_machine_playlist', 'Playlist'), + ('nav_venue_bb_arena_2_name', 'Battle Ball Amatöörit'), + ('roomatic_create_error', 'Error in room creation process. Please try again!'), + ('furni_couch_norja*7_desc', 'Two can perch comfortably'), + ('gs_button_spectate', 'Watch Game!'), + ('furni_sofachair_silo*6_desc', 'Blue Area Armchair'), + ('credit_redeem_button', 'Redeem'), + ('furni_valentinescreen_desc', 'Peep through and smile!'), + ('poster_511_name', 'The Dutch flag'), + ('furni_shelves_armas_name', 'Bookcase'), + ('nav_venue_habbo_lido_name', 'Habbo Lido'), + ('furni_bed_polyfon*9_name', 'Red Double Bed'), + ('furni_sofa_silo*9_name', 'Red Area Sofa'), + ('furni_pura_mdl4*6_desc', 'Any way you like it!'), + ('console_mainhelptext', 'You can use the Habbo Console to keep in constant contact with your friends using instant messages.'), + ('wallitem_jp_ninjastars_name', 'Ninja Stars'), + ('ad_note', 'Clicking this advertisement will open a new window'), + ('ph_tickets_choise2', 'Buy 20 Tickets for 6 Credits.'), + ('ph_tickets_choise1', 'Buy 2 Tickets for 1 Credit.'), + ('reg_day', 'Day'), + ('nav_venue_cunning_fox_gamehall/2_name', 'Noughts&Crosses'), + ('nav_venue_sw_lobby_tournament_6_name', 'Tournament Lobby'), + ('furni_noob_lamp*1_name', 'My first Habbo lamp'), + ('furni_petfood1_name', 'Bones Mega Multipack'), + ('furni_table_silo_med*3_name', 'White Coffee Table'), + ('pet.hotwords.jump', 'jump'), + ('furni_sleepingbag*1_name', 'Red Sleeping Bag'), + ('nav_venue_main_lobby/0_desc', 'The heart of Habbo Hotel'), + ('pet_hungry', 'Hunger:'), + ('furni_rare_fan*4_name', 'SUPERLOVE Fan'), + ('furni_sw_table_name', 'sw_table'), + ('furni_CFC_200_moneybag_name', 'Sack of Credits (China)'), + ('room_ask_friend', 'Ask to be a Friend'), + ('furni_bed_polyfon*2_name', 'Black Mode Double Bed'), + ('furni_table_norja_med_desc', 'Elegance embodied'), + ('nav_removerights', 'Reset'), + ('wallitem_hrella_poster_1_name', 'Porthole'), + ('NUF_getting_items_purse_', 'Click this link to open the Habbo Credits page in the website window.'), + ('poster_31_name', 'System of a Ban'), + ('furni_sound_set_24_name', 'Habbo Sounds 4'), + ('furni_chair_basic*7_name', 'chair_basic'), + ('poster_56_name', 'Disco Sign'), + ('furni_rare_dragonlamp*2_name', 'Jade Dragon Lamp'), + ('furni_gothic_stool*4_desc', 'Witches and Warlocks'), + ('furni_sofa_silo*2_name', 'Black Two-Seater Sofa'), + ('furni_grunge_radiator_name', 'Radiator'), + ('nav_venue_bb_lobby_amateur_9_name', 'Gevorderden Battle Ball 10'), + ('summer_chair_4_name', 'White Deck Chair'), + ('furni_sound_set_49_name', 'Club 4'), + ('messenger.email.subject', ''), + ('furni_romantique_chair*3_name', 'Turquoise Romantique Chair'), + ('furni_s_sound_machine*7_desc', 'Sound Machine Red'), + ('furni_table_plasto_round*9_desc', 'Hip plastic furniture'), + ('furni_table_plasto_4leg*7_name', 'Occasional table'), + ('club_confirm_title', 'You are about to subscribe to Habbo Club. Wise choice!'), + ('furni_romantique_pianochair*1_desc', 'Here sat the legend of 1900'), + ('furni_sofa_silo*6_desc', 'Blue Area Sofa'), + ('nav_venue_bb_lobby_tournament_11_name', 'Competitie Battle Ball 12'), + ('furni_rare_icecream*9_desc', 'Virtual bubblegum rocks!'), + ('furni_romantique_divider*1_name', 'Rose Quartz Screen'), + ('NUF_playing_games_room_ruleslink', 'Click me! But only if you want to read the game FAQs in the website.'), + ('furni_chair_silo_name', 'Dining Chair'), + ('furni_sound_set_17_desc', 'Jive\'s Alive!'), + ('dance_choose', 'Choose Dance'), + ('wallitem_industrialfan_name', 'Industrial Turbine'), + ('sound_machine_alert_invalid_song_length', 'Can\'t burn an empty song!'), + ('furni_pura_mdl1*4_desc', 'Any way you like it!'), + ('wallitem_post.it.vd_desc', 'Heart Stickies'), + ('catalog_give_petname', 'Type your pet\'s name in the grey box.'), + ('furni_pura_mdl2*1_name', 'Aqua Pura Module 2'), + ('poster_24_name', 'Hole In The Wall'), + ('win_error', 'Notice!'), + ('furni_chair_plasto*2_desc', 'Hip plastic furniture'), + ('wallitem_xmas_light_desc', 'Xmas light'), + ('furni_rubberchair*1_name', 'Blue Inflatable Chair'), + ('NUF_getting_room_roommatic_details_tutor', 'Give a name to your room, choose a category and add a description. Don\'t worry, you can change it all later.'), + ('furni_divider_poly3*2_desc', 'Black Mode Bardesk Gate'), + ('furni_plant_valentinerose*2_desc', 'Your secret love'), + ('furni_table_norja_med*7_desc', 'For larger gatherings'), + ('furni_carpet_polar_desc', 'For cuddling up on'), + ('nav_venue_sw_lobby_free_8/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('furni_summer_grill*1_name', 'Blue Barbeque Grill'), + ('furni_chair_norja*7_desc', 'Sleek and chic for each cheek'), + ('furni_joulutahti_name', 'Poinsetta'), + ('furni_exe_table_name', 'Executive Desk'), + ('furni_divider_silo3*8_desc', 'Form following function'), + ('furni_gothiccandelabra_name', 'Gothic Candelabra'), + ('transaction_system_bibit', 'Credit card'), + ('nav_venue_tv_studio/0_desc', 'Sponsored by Bobbanet.com'), + ('furni_noob_table*4_desc', 'Lightweight, practical and light blue'), + ('furni_bardesk_polyfon*3_desc', 'Perfect for work or play'), + ('room_info_rated', 'Room rating:'), + ('nav_venue_bb_lobby_beginner_2/0_desc', ''), + ('help_emergency_explanation', 'If you are experiencing a situation which is making you feel uncomfortable or unsafe, please give details below and a member of community staff will reply as soon as possible.'), + ('furni_divider_nor5*8_desc', 'Cool cornering for your crib y0!'), + ('poster_507_name', 'The French Tricolore'), + ('nav_privateRooms', 'Rooms'), + ('furni_pura_mdl2*5_desc', ''), + ('furni_sporttrack3*3_name', 'Sport goal grass'), + ('furni_sound_set_10_desc', 'Made from real Boy Bands!'), + ('furni_chair_plasto*9_desc', 'Hip plastic furniture'), + ('furni_soft_sofa_norja*4_desc', 'Sit back and relax'), + ('furni_s_sound_machine*3_name', 'Sound Machine Green'), + ('reg_spam', 'Yes, I want to get the occasional email from the Hotel Manager.'), + ('shout', 'Shout'), + ('NUF_mini_use_console_read_link', 'Click here to view the message.'), + ('furni_scifidoor*2_desc', 'There out of this world!'), + ('furni_divider_nor3*3_name', 'White Iced Gate'), + ('pet_hung_0', 'Empty'), + ('furni_table_plasto_square*1_name', 'Occasional Table'), + ('pet_hung_6', 'Stuffed'), + ('pet_hung_5', 'Full'), + ('bb_user_skill', 'Skill Level: \\x\\rScore: \\y'), + ('login_welcome', 'Welcome'), + ('pet_hung_2', 'Rumbling'), + ('pet_hung_1', 'Hungry'), + ('poster_20_name', 'Bars'), + ('pet_hung_4', 'Satisfied'), + ('pet_hung_3', 'Peckish'), + ('Alert_WrongNameOrPassword', 'Wrong name or password - please try again!'), + ('furni_romantique_pianochair*5_desc', 'I can feel air coming through...'), + ('furni_carpet_armas_desc', 'Adds instant warmth'), + ('console_removefriend_2', 'from your Friends List?'), + ('console_removefriend_1', 'Are you sure you want to remove'), + ('furni_rare_parasol*0_name', 'Green Parasol'), + ('furni_sound_set_38_name', 'Rock 6'), + ('NUF_mini_meet_people_room_wave', 'These buttons let you wave and dance. Click on your Habbo at anytime to see these buttons.'), + ('gs_skill_changed_header', 'Congratulations!'), + ('furni_chair_plasty*7_name', 'Plastic Pod Chair'), + ('furni_safe_silo*5_desc', 'Totally shatter-proof!'), + ('furni_divider_silo1*3_name', 'White Corner Shelf'), + ('nav_venue_hallway_ii_name', 'Hallway II'), + ('cam_release.help', 'Cancel Photo'), + ('nav_venue_bb_lobby_amateur_14/0_desc', ''), + ('habbo_tv_title', 'Widescreen Habbovision'), + ('purse_noevents', 'You haven\'t made any transactions yet. Click the button below to find out how to get Habbo Credits.\\rRemember: you must ask your parents permission before you buy Habbo Credits.'), + ('furni_pura_mdl2*8_name', 'yellow pura module 2'), + ('furni_CFC_10_coin_bronze_name', 'Bronze Coin (China)'), + ('sound_machine_song_remove', 'Remove song'), + ('modtool_choose_length', 'Choose Length:'), + ('sound_machine_turn_off', 'Switch Off'), + ('furni_pura_mdl1*8_desc', ''), + ('furni_spyro_desc', 'The stuff of legend'), + ('furni_pillow*2_name', 'Red Silk Pillow'), + ('furni_table_armas_desc', 'For informal dining'), + ('furni_tree3_desc', 'Any presents under it yet?'), + ('object_displayer_link_looks', 'Change avatar looks'), + ('furni_barrier*2_name', 'White Road Barrier'), + ('furni_gothic_chair*5_desc', 'The dark side of Habbo'), + ('furni_divider_nor4*4_name', 'Urban Iced Shutter'), + ('furni_camera_name', 'Camera'), + ('next_arrows', 'Next >>'), + ('furni_sound_set_60_desc', 'Love and affection!'), + ('furni_bed_polyfon_girl_one_name', 'Single Bed'), + ('NUF_mini_meet_people_user_chatfield', 'Start typing here and press \'Enter\' to chat with others.'), + ('successfully_purchase_gift_for', 'Successfully purchased gift for user %user%!'), + ('poster_49_desc', 'All that glitters...'), + ('furni_glass_table*3_name', 'Glass table'), + ('furni_divider_silo3*5_desc', 'Pink Area Gate'), + ('furni_divider_arm3_name', 'Gate (lockable)'), + ('furni_table_plasto_4leg*3_name', 'Round Dining Table'), + ('roomatic_roomnumber', 'Room number:'), + ('nav_venue_bb_lobby_beginner_5_name', 'Beginners Battle Ball 6'), + ('reg_nameAndPassTooSimilar', 'Your name and password are too similar'), + ('nav_venue_theatredrome_easter_name', 'Theatredrome Easter'), + ('nav_venue_bb_lobby_beginner_11/0_desc', ''), + ('furni_fireplace_polyfon_name', 'Fireplace'), + ('queue_set.e1.info', 'There are %e1% Habbos in front of you in the queue.'), + ('more_info_link', 'Redeem Now'), + ('furni_bed_polyfon*6_desc', 'Blue Mode Double Bed'), + ('furni_rare_icecream*5_name', 'Vanilla Ice Cream Machine'), + ('poster_500_name', 'Union Jack'), + ('furni_chair_norja*3_name', 'White Iced Chair'), + ('furni_sound_set_31_name', 'Dance 3'), + ('furni_pura_mdl3*5_name', 'beige pura module 3'), + ('furni_sporttrack2*3_desc', 'null'), + ('furni_sound_set_46_desc', 'De bada bada bo!'), + ('poster_9_name', 'Rainforest Poster'), + ('furni_romantique_pianochair*4_name', 'Amber Piano Stool'), + ('poster_515_desc', 'Waved by Swedes everywhere'), + ('furni_scifidoor*9_desc', 'There out of this world!'), + ('furni_chair_plasty*3_name', 'Plastic Pod Chair'), + ('furni_table_plasto_round*5_name', 'Round Dining Table'), + ('furni_one_way_door*9_desc', 'One at a time!'), + ('furni_calippo_desc', 'Basic model'), + ('furni_footylamp_desc', 'Can you kick it?'), + ('furni_one_way_door*2_desc', 'One way! The HC way!'), + ('furni_arabian_tray4_desc', 'Sweet, juicy and ripe'), + ('furni_divider_nor3*7_name', 'Rural Iced gate'), + ('furni_couch_norja*3_name', 'White Iced Bench'), + ('furni_pillow*9_name', 'Green Wooly Pillow'), + ('game_chooseside', 'Choose your side'), + ('start', 'Start'), + ('furni_toy1*4_desc', 'it\'s bouncy-tastic'), + ('roomevent_host', 'Host:'), + ('nav_venue_rooftop_rumble_name', 'Rooftop Rumble'), + ('nav_venue_bb_lobby_expert_0/0_desc', ''), + ('nav_venue_rooftop_rumble_ii/0_desc', 'Are you ready?'), + ('error_report_trigger_message', 'Last message ID'), + ('furni_sofachair_silo*2_name', 'Black Armchair'), + ('furni_noob_chair*5_desc', 'Lightweight, practical, with pink stripes'), + ('pet_frnd_0', 'Hostile'), + ('furni_noob_rug*3_name', 'My first Habbo rug'), + ('pet_frnd_2', 'Suspicious'), + ('pet_frnd_1', 'Angry'), + ('furni_scifiport*6_desc', 'Energy beams. No trespassers!'), + ('pet_frnd_4', 'Calm'), + ('pet_frnd_3', 'Cool'), + ('pet_frnd_6', 'Warm'), + ('pet_frnd_5', 'Friendly'), + ('pet_frnd_8', 'Loving'), + ('credit_trade_value', 'Includes credit furnis worth %value% credits.'), + ('pet_frnd_7', 'Affectionate'), + ('pet_frnd_9', 'Loyal'), + ('NUF_getting_items_purse_tutor', 'Your Purse tells you how many Habbo Credits you have. If you have a voucher code you can redeem it here by clicking the \'Vouchers\' button.'), + ('furni_chair_norja*6_name', 'Blue Chair'), + ('sound_machine_alert_machine_full', 'You already have 4 Traxpacks loaded. Eject one before adding a new Traxpack.'), + ('nav_venue_club_mammoth/0_desc', 'Monumental and magnificent. For Habbo Club members only.'), + ('NUF_getting_room_hand_tutor', 'This is your hand. It contains all your furniture. I have given you a rug so that you can place it in your room- click and drag it to set it down.'), + ('reg_check_name', 'Name'), + ('furni_glass_stool*7_name', 'Green Glass Stool'), + ('poster_504_name', 'The Bundesflagge'), + ('poster_42_desc', 'Not something you want to run into'), + ('pet.saying.sleep.dog.6', '*dreaming*'), + ('pet.saying.sleep.dog.5', 'Zzzzz wuff! zzzzz'), + ('pet.saying.sleep.dog.4', 'hrrrrr...murrmm..'), + ('furni_pura_mdl4*2_desc', 'Any way you like it!'), + ('pet.saying.sleep.dog.3', 'bzz.. oof oof'), + ('furni_sofa_silo*5_name', 'Pink Area Sofa'), + ('pet.saying.sleep.dog.2', 'hrrr.. hrrr'), + ('pet.saying.sleep.dog.1', 'bzz.. bzzzzz'), + ('furni_petfood4_name', 'T-Bones Mega Multipack'), + ('nav_venue_club_mammoth_name', 'Club Mammoth'), + ('ph_keys_dive', 'Diving moves:'), + ('furni_noob_table*3_name', 'My first Habbo table'), + ('furni_romantique_divan*5_desc', 'Is that a cape hanging there?'), + ('furni_table_plasto_round*8_name', 'Round Dining Table'), + ('furni_rare_fan*1_name', 'Blue Powered Fan'), + ('reg_forcedupdate2', 'Update your Habbo info'), + ('furni_table_plasto_square*4_name', 'Square Dining Table'), + ('NUF_playing_games', 'Playing games'), + ('furni_prizetrophy2*2_name', 'Duck trophy'), + ('reg_forcedupdate3', 'The Habbo Hotel management requires all Habbos to read and agree to the service Terms and Conditions. It won\'t take long.\\rJust go through the registration, check your info and agree to the new terms. Thank you!'), + ('nav_venue_sw_lobby_tournament_2_name', 'Tournament Lobby'), + ('furni_carpet_standard*4_name', 'Floor Rug'), + ('furni_s_sound_machine*6_name', 'Sound Machine Purple'), + ('furni_prizetrophy5*1_desc', 'Glittery gold'), + ('furni_table_plasto_square_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_beginner_2_name', 'Beginners Battle Ball 3'), + ('furni_rubberchair*4_name', 'Ocean Inflatable Chair'), + ('furni_divider_poly3*5_desc', 'Keep the Pink in!'), + ('furni_arabian_teamk_name', 'Tea Maker'), + ('room_name', 'Room:'), + ('nav_venue_chill/0_desc', 'Come chill in the Zen Garden!'), + ('furni_summer_grill*4_name', 'Green Barbeque Grill'), + ('poster_1001_desc', 'even walls have ears'), + ('furni_rare_icecream*8_name', 'Peppermint Ice Cream Machine'), + ('furni_safe_silo*9_desc', 'Totally shatter-proof!'), + ('sound_machine_song_save', 'Save song'), + ('NUF_getting_room_navigator_ownrooms', 'Click the \'Own Room(s)\' tab to see your rooms.'), + ('furni_gothic_chair*1_desc', 'The dark side of Habbo'), + ('furni_table_plasto_square*8_name', 'Square Dining Table'), + ('furni_safe_silo*2_desc', 'Totally shatter-proof!'), + ('roomevent_create_description', 'Describe your event'), + ('purse_vouchers_success', 'Voucher was successfully redeemed. You have the Credits.'), + ('furni_gothic_carpet2_name', 'Dungeon Floor'), + ('furni_sofa_polyfon*3_name', 'White Two-seater Sofa'), + ('furni_romantique_tray2_name', 'Treats Tray'), + ('nav_modify_doorstatus_locked', 'Locked (visitors have to ring the bell)'), + ('NUF_visiting_rooms_categorylist_open', 'Click the \'Open\' button to open a category.'), + ('room_doorbell', 'Rings the doorbell - Open the door?'), + ('furni_sound_set_45_name', 'Lost_Beatness'), + ('nav_deleteroom', 'Delete'), + ('furni_barchair_silo_name', 'Bar Stool'), + ('furni_chair_plasto*5_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_tournament_14_name', 'Competitie Battle Ball 15'), + ('furni_pura_mdl1*1_desc', 'Any way you like it!'), + ('furni_rare_snowrug_desc', 'Chilled Elegance'), + ('poster_35_desc', 'The Hotel\'s girlband. Dream on!'), + ('furni_glass_stool_desc', 'Translucent beauty'), + ('furni_rare_fan*8_name', 'Habbo Wind Turbine'), + ('furni_menorah_desc', 'Light up your room'), + ('furni_table_silo_small*7_desc', 'Green Area Occasional Table'), + ('furni_divider_silo1*7_name', 'Green Area Corner Shelf'), + ('furni_romantique_divan*1_desc', 'null'), + ('furni_table_plasto_round*1_name', 'Round Dining Table'), + ('reg_changeEmail', 'Change your email'), + ('hobba_mark_normal', 'Send To Helpers'), + ('nav_venue_bb_lobby_tournament_8/0_desc', ''), + ('ph_tickets_have2', 'Tickets'), + ('nav_venue_sw_lobby_intermediate_0/0_desc', ''), + ('ph_tickets_have1', 'You Have'), + ('furni_bardesk_polyfon*7_desc', 'Green Mode Bardesk'), + ('console_inprivateroom', 'In A Guest Room'), + ('furni_sound_set_35_name', 'Dance 6'), + ('GoAway', 'Leave The Room'), + ('room_kick', 'Kick'), + ('furni_rubberchair*8_name', 'Black Inflatable Chair'), + ('poster_6_name', 'Abstract Poster'), + ('hubu_t1_3', ''), + ('NUF_meeting_people', 'Meeting people'), + ('nav_venue_bb_lobby_amateur_4/0_desc', ''), + ('nav_venue_bb_game/0_name', 'Battle Ball Arena'), + ('furni_pudding_name', 'Christmas Pudding'), + ('furni_tile_red_name', 'Floor Tiles'), + ('catalog_typeurname', 'Type your greetings here\\r(don\'t forget to put your name!):'), + ('furni_house2_name', 'Gingerbread House'), + ('hubu_t1_1', 'Kaupunkien pu_t2_2=Katso onko kotisi l_1=Tietoa Hubusta'), + ('furni_glass_table*4_desc', 'Translucent beauty'), + ('hubu_t1_2', ''), + ('nav_venue_club_massiva/1_name', 'Chill-out Room'), + ('furni_scifiport*2_desc', 'Get in the ring!'), + ('furni_traffic_light*4_name', 'Yellow Traffic Light'), + ('furni_tree2_name', 'Old Christmas Tree'), + ('furni_noob_stool*4_name', 'My first Habbo stool'), + ('done', 'Done'), + ('furni_goodie1*1_name', 'Marzipan Man'), + ('nav_venue_bb_lobby_tournament_18/0_desc', ''), + ('poster_17_name', 'Butterfly Cabinet 1'), + ('furni_summer_chair*5_name', 'Deck Chair'), + ('furni_prizetrophy*1_name', 'Classic trophy'), + ('furni_easterduck_desc', 'Can you tell what it is yet?'), + ('furni_barrier*3_desc', 'No trespassing, please!'), + ('furni_table_plasto_bigsquare*1_name', 'Square Dining Table'), + ('club_general_infolink', 'More Info About Habbo Club >>'), + ('furni_chair_silo*4_name', 'Beige Silo Dining Chair'), + ('roomatic_givename', 'Give your room a name!'), + ('furni_rare_icecream*1_name', 'Blueberry Ice Cream Machine'), + ('roomatic_open', 'Door open'), + ('NUF_getting_items_catalogue_tutor', 'Big! You can browse the products by clicking on the categories. There are loads of different types of furniture to decorate your room.'), + ('furni_marquee*4_name', 'Yellow Marquee'), + ('furni_bed_polyfon_one*7_name', 'Green Mode Single Bed'), + ('gs_button_go_started', 'Watch'), + ('poster_27_name', 'Holly Bundle 3'), + ('furni_divider_nor2*7_desc', 'No way through'), + ('furni_glass_chair*5_desc', 'Translucent beauty'), + ('nav_venue_basement_lobby_name', 'Basement Lobby'), + ('pick_furniture', 'Put Furni In Hand'), + ('nav_venue_bb_lobby_beginner_18/0_desc', ''), + ('furni_pura_mdl2*4_name', 'White Pura Module 2'), + ('club_status_title', 'You are currently a member of Habbo Club.'), + ('furni_rare_elephant_statue_name', 'Golden Elephant'), + ('furni_toy1*1_desc', 'it\'s bouncy-tastic'), + ('reg_doneheader', 'Congratulations!\\rYou\'re a Habbo!'), + ('furni_present_gen6_name', 'Gift'), + ('furni_noob_chair*2_desc', 'Lightweight, practical, with dark blue stripes'), + ('furni_sofachair_silo*5_name', 'Pink Area Armchair'), + ('BuddyNow', 'now:'), + ('furni_pura_mdl5*3_desc', 'Any way you like it!'), + ('furni_prizetrophy6*1_name', 'Champion trophy'), + ('BuddyEntry', 'On Hotel View'), + ('furni_scifiport*9_desc', 'Energy beams. No trespassers!'), + ('furni_table_polyfon_small_desc', 'For serving a stylish latte'), + ('furni_exe_rug_name', 'Executive Rug'), + ('nav_venue_the_dirty_duck_pub_name', 'The Dirty Duck Pub'), + ('nav_venue_bb_lobby_beginner_9_name', 'Beginners Battle Ball 10'), + ('nav_venue_sw_lobby_beginner_5_name', 'Snow Rookies Lobby'), + ('furni_pura_mdl5*2_name', 'Pink Pura Module 5'), + ('furni_bardeskcorner_polyfon*7_desc', 'Green Mode Bardesk Corner'), + ('alert_donate_content', 'The other Habbo has not put anything into the trade. Are you sure you want to give away your furni?'), + ('furni_hc_rllr_name', 'HC Rollers Set'), + ('furni_divider_nor1_desc', 'Looks squishy, but isn\'t'), + ('furni_nouvelle_trax_desc', ''), + ('wallitem_jp_sheet3_name', 'jp_sheet3'), + ('furni_hyacinth2_name', 'Blue Hyacinth'), + ('furni_sound_machine_name', 'Sound Machine'), + ('console_getmessage_sender', 'Sender:'), + ('furni_sandrug_name', 'Tropical Beach Rug'), + ('nav_updatenote_header', 'Note!'), + ('furni_pillar*4_desc', 'From the time of the Kick Warz'), + ('furni_waterbowl*1_name', 'Red Water Bowl'), + ('furni_grand_piano*5_name', 'Onyx Grand Piano'), + ('furni_redhologram_name', 'Holo-girl'), + ('sound_machine_alert_playlist_full', 'Could not save playlist! Playlists can have only %count% songs.'), + ('nav_rooms_search', 'Search'), + ('nav_venue_cunning_fox_gamehall/5_name', 'Poker'), + ('nav_venue_habbo_lido_ii_name', 'Habbo Lido II'), + ('furni_barchair_silo*9_desc', 'Practical and convenient'), + ('pet_nature', 'Nature:'), + ('furni_wood_tv_name', 'Large TV'), + ('poster_2008_desc', 'Once every four Habbo years!'), + ('poster_38_desc', 'For really TOUGH Habbos!'), + ('nav_venue_bb_lobby_expert_0_name', 'Expert'), + ('furni_chair_plasto*14_desc', 'Aqua chair'), + ('furni_queue_tile1*6_name', 'Blue Habbo Roller'), + ('poster_522_name', 'The flag of Japan'), + ('furni_chair_basic*3_name', 'Black Pura Egg Chair'), + ('nav_venue_pizza_desc', 'Tunnelmallinen pizzapaikka kiireettömään nautiskeluun.'), + ('furni_jp_tray6_desc', 'jp_tray6'), + ('furni_hc_btlr_desc', 'Your personal caretaker'), + ('furni_song_disk_desc', 'Burn, baby burn'), + ('furni_deadduck2_name', 'Dead Duck 2'), + ('furni_statue_name', 'Cupid Statue'), + ('furni_scifirocket*5_name', 'Uranus Smoke Machine'), + ('nav_gobutton', 'Go'), + ('recycler_furni_not_recyclable', 'This Furniture cannot be recycled. Please only use Furniture that has the recyclable tag in your hand.'), + ('furni_gothic_sofa*5_name', 'Green Gothic Sofa'), + ('furni_sound_set_32_desc', 'Piano concert set'), + ('furni_chair_plasto*10_name', 'Chair'), + ('nav_venue_bb_lobby_tournament_2_name', 'Competitie Battle Ball 3'), + ('furni_grand_piano*1_desc', 'Turquoise Grand Piano'), + ('buddyremove_windowheader', 'Your friends list is full.'), + ('furni_pillar*0_name', 'Greek Pillar'), + ('gs_title_countdown', 'Game Is About To Begin'), + ('furni_glass_sofa*3_name', 'Glass sofa'), + ('furni_hc_crtn_desc', 'Topnotch privacy protection'), + ('furni_waterbowl*5_desc', 'Aqua unlimited'), + ('furni_table_silo_small*4_desc', 'Beige Area Occasional Table'), + ('furni_jp_tray2_name', 'jp_tray2'), + ('furni_rare_moonrug_desc', 'Desolation rocks!'), + ('furni_val_teddy*3_name', 'Green Share Bear'), + ('furni_sleepingbag*10_desc', 'Ultimate coziness'), + ('furni_bar_polyfon_desc', 'You naughty Habbo!'), + ('furni_sofachair_polyfon*2_desc', 'Black Mode Armchair'), + ('furni_exe_sofa_name', 'Executive 3-Seater Sofa'), + ('furni_divider_silo1*4_desc', 'Beige Area Corner Shelf'), + ('poster_2004_name', 'Rasta Poster'), + ('furni_bench_armas_name', 'Bench'), + ('furni_soft_sofachair_norja_desc', 'Soft iced sofachair'), + ('nav_venue_bb_lobby_beginner_14_name', 'Beginners Battle Ball 15'), + ('gs_button_rejoin', 'Play again!'), + ('furni_marquee*8_name', 'Ultramarine Marquee'), + ('furni_tile_marble_desc', 'Slick sophistication; now 10% off!'), + ('hubu_info_url_1', 'http://www.habbohotel.co.uk/habbo/en/help/12'), + ('console_requests', 'Friend Request(s)'), + ('furni_sleepingbag*4_name', 'Army Sleeping Bag'), + ('furni_plant_yukka_desc', 'Easy to care for'), + ('NUF_getting_room_own_rooms_createroom', 'Empty? That\'s because you don\'t have any rooms yet. If it isn\'t empty then you already have made a room, which makes me wonder...'), + ('furni_glass_sofa*6_desc', 'Translucent beauty'), + ('ph_exit', 'Exit In Normal Clothes'), + ('pet_race_0_024', 'Black-eyed Boxer'), + ('furni_marquee*7_name', 'Purple Marquee'), + ('pet_race_0_023', 'Dotty Dalmatian'), + ('recycler_info_timeout', 'Your recycling was completed, but you did not accept it in time. Please press the cancel button below to have your recyclable items restored to your hand. To recycle these items you will need to begin the process again.'), + ('pet_race_0_022', 'Schnitzel Snatcher'), + ('hubu_info_url_2', 'http://www.talktofrank.com/'), + ('pet_race_0_021', 'Loyal Labrador'), + ('nav_venue_snowwar_lobby/0_desc', 'Snow Storm LobbyCome and be a Snow Stormer!'), + ('pet_race_0_020', 'Patchy Pup'), + ('furni_chair_plasto*8_name', 'Chair'), + ('furni_sofachair_silo*9_desc', 'Red Area Armchair'), + ('nav_venue_bb_lobby_beginner_17/0_desc', ''), + ('furni_hc_dsk_desc', 'For Habbo scholars'), + ('furni_wooden_screen*8_name', 'Night Blue Oriental Screen'), + ('gs_lounge_skill_no_min', 'No minimum'), + ('summer_chair_8_name', 'Yellow Deck Chair'), + ('gs_score_tie', 'The game ended in a tie!'), + ('nav_people', 'Who\'s in here?'), + ('furni_gothic_sofa*2_desc', 'Stylish seating for two'), + ('furni_summer_chair*8_name', 'Yellow Deck Chair'), + ('roomatic_roomname', 'Room name:'), + ('furni_ham_desc', 'Tuck in'), + ('nav_venue_star_lounge_desc', 'Is there a VIP visitor in the hotel?'), + ('furni_bardeskcorner_polyfon*3_name', 'White Corner Desk'), + ('gs_specnum', 'Number of spectators: \\x'), + ('furni_bed_budget*3_name', 'Black Pura Double Bed'), + ('furni_shelves_norja*6_name', 'Blue Bookcase'), + ('partner_registration_link', 'Finish registration'), + ('furni_pillar*1_name', 'Pink Marble Pillar'), + ('reg_olderage', 'I am 11 or older'), + ('furni_glass_stool*4_name', 'Glass stool'), + ('back', 'Back'), + ('furni_tile_yell_desc', 'In a choice of colours'), + ('club_confirm_text3', 'Buy more and pay less: 6 Months (186 days) of Habbo Club cost only 105 Credits. You have %credits% credits in your Purse.\\r\\r After buying the membership, you will immediately be part of the Habbo VIP Community.'), + ('furni_sofa_silo_desc', 'Cushioned, understated comfort'), + ('club_confirm_text1', '1 Habbo Club Month (31 days) costs 25 Credits. You have %credits% Credits in your Purse.\\r\\r After buying the membership, you will immediately be part of the Habbo VIP Community.'), + ('club_confirm_text2', 'Buy more and pay less: 3 Months (93 days) of Habbo Club cost only 60 Credits. You have %credits% credits in your Purse.\\r\\r After buying the membership, you will immediately be part of the Habbo VIP Community.'), + ('furni_carpet_legocourt_name', 'Basketball Court'), + ('furni_present_gen3_name', 'Gift'), + ('furni_sound_set_2_desc', 'Get the party started!'), + ('furni_barchair_silo*6_name', 'Blue Bar Stool'), + ('furni_arabian_bigtb_name', 'Amanjena Table'), + ('interface_icon_catalog', 'Catalogue, furnishing your room'), + ('furni_hologram_desc', 'As if by magic...'), + ('nav_venue_sw_lobby_expert_1/0_desc', ''), + ('furni_carpet_standard*1_name', 'Floor Rug'), + ('nav_owner', 'Owner'), + ('furni_glass_chair*2_desc', 'Translucent beauty'), + ('furni_rcandleset_name', 'Red Candle Plate'), + ('furni_divider_nor1*6_name', 'Blue Ice corner'), + ('nav_private_helptext_hd', 'Rooms'), + ('furni_sound_set_27_name', 'Groove 2'), + ('furni_drinks_name', 'Empty Cans'), + ('pet.saying.eat.cat.0', 'mmm...thumm, thumm'), + ('gs_title_nextround', 'Next game...'), + ('pet.saying.eat.cat.1', 'lap, lap, lap, lap'), + ('furni_scifirocket*9_desc', 'Something fishy is going on...'), + ('pet.saying.eat.cat.2', '*munch, munch*'), + ('pet.saying.sleep.dog.0', 'zzZZZzzz'), + ('furni_noob_lamp*4_name', 'My first Habbo lamp'), + ('nav_venue_sw_lobby_beginner_8_name', 'Snow Rookies Lobby'), + ('nav_venue_library/0_desc', 'Time to catch up on some studying'), + ('camera_dialog_open', 'Shoot'), + ('furni_lamp_armas_desc', 'Ambient lighting is essential'), + ('buddyremove_pleasewait', 'Please wait a second...'), + ('friend_request_options', 'Advanced options.'), + ('transaction_system_web_internal', 'Housekeeping purchase'), + ('furni_rare_dragonlamp*5_name', 'Elf Green Dragon Lamp'), + ('furni_bar_chair_armas_desc', 'The ultimate recycled furniture'), + ('room_ignore', 'Shutup'), + ('poster_518_desc', 'A fiery dragon for your wall'), + ('furni_soft_sofa_norja*7_desc', 'Sit back and relax'), + ('object_displayer_show_tags', 'Show tags'), + ('furni_goth_table_desc', 'The dark side of Habbo'), + ('club_txt_changesubscr', 'Change subscription'), + ('Alert_RememberSetYourPassword', 'Please check your password'), + ('reg_verification_checking', 'Checking...'), + ('furni_silo_studydesk_desc', 'For the true Habbo Scholars'), + ('room_give_rights', 'Give rights'), + ('furni_CF_50_goldbar_name', 'Gold Bar'), + ('furni_rom_lamp_name', 'Crystal Lamp'), + ('furni_sofachair_polyfon*8_desc', 'Yellow Mode Armchair'), + ('furni_deadduck3_name', 'Dead Duck 3'), + ('furni_bed_polyfon_one*4_name', 'Beige Mode Single Bed'), + ('furni_noob_stool*1_desc', 'Unfold me and take the weight off (orange)'), + ('furni_stand_polyfon_z_name', 'Shelf'), + ('furni_prize3_name', 'Bronze Trophy'), + ('club_status_text', 'Here you can see your Habbo Club membership status, number of elapsed months, pre-ordered months and status of the ongoing month.'), + ('furni_table_plasto_bigsquare*9_desc', 'Hip plastic furniture'), + ('furni_wooden_screen*4_desc', 'Add an exotic touch to your room'), + ('furni_sound_set_52_name', 'Christmas Party'), + ('furni_CF_1_coin_bronze_name', 'Bronze Coin'), + ('furni_tile_brown_name', 'Red Tile'), + ('nav_venue_bb_lobby_intermediate_5/0_desc', ''), + ('nav_venue_picnic/0_name', 'Picnic Garden'), + ('furni_sound_set_50_desc', 'The harder generation'), + ('furni_lamp2_armas_name', 'Lodge Candle'), + ('registration_disabled_text', 'You can\'t create new Habbos at the moment. Please try again [some date]..'), + ('catalog_selectproduct', 'Select product:'), + ('transaction_system_sms_telia', 'Telia'), + ('nav_venue_bb_lobby_intermediate_5_name', 'Semi-profs Battle Ball 6'), + ('furni_christmas_sleigh_name', 'Winter Sleigh'), + ('furni_scifirocket*8_desc', 'From a space far, far away!'), + ('furni_bed_budget*9_name', 'Red Pura Double Bed'), + ('poster_2000_desc', 'Suomen kartta'), + ('help_emergency_whathappens', 'A member of community staff will investigate the situation and take appropriate action. This may include sending you a response with advice on dealing with your issue.'), + ('purse_coins', 'Habbo Credits'), + ('furni_marquee*5_desc', 'It\'s both door and a shade!'), + ('club_txt_whatis', 'What is Habbo Club?'), + ('furni_present_gen2_name', 'Gift'), + ('trading', 'Trading'), + ('furni_sofa_silo*9_desc', 'Red Area Sofa'), + ('furni_summer_chair*9_name', 'Red Deck Chair'), + ('furni_shelves_armas_desc', 'For all those fire-side stories'), + ('purse_buy_coins', 'Buy Credits'), + ('room_confirmPlace', 'Are you sure?'), + ('furni_queue_tile1*3_desc', 'The power of movement'), + ('furni_soft_sofachair_norja*8_name', 'Yellow Iced Sofachair'), + ('furni_arabian_snake_desc', 'Beware the snake!'), + ('nav_venue_sw_lobby_tournament_6/0_desc', ''), + ('NUF_about_hotel', 'What\'s Habbo about?'), + ('furni_bardeskcorner_polyfon_desc', 'Tuck it away'), + ('furni_bardeskcorner_polyfon*4_name', 'Beige Mode Bardesk Corner'), + ('poster_13_desc', 'Arty black and white'), + ('nav_venue_bb_lobby_beginner_9/0_desc', ''), + ('nav_modify_nameshow', 'Show your name in the room info'), + ('NUF_mini_use_console_read_next', 'Click \'OK\' to mark message as read.'), + ('poster_1005_desc', 'The muscly movie hero'), + ('wallitem_jp_sheet2_name', 'jp_sheet2'), + ('furni_xmas_cstl_gate_desc', 'Let that icy draft out!'), + ('NUF_groups_url', 'http://d16-1.web.varoke.net/home/group-tutorial'), + ('furni_jp_irori_name', 'Irori'), + ('furni_jp_bamboo_desc', 'Watch out for pandas!'), + ('furni_christmas_reindeer_name', 'Reindeer'), + ('furni_glass_chair*4_name', 'Glass chair'), + ('furni_jp_tray5_desc', 'jp_tray5'), + ('furni_table_plasto_4leg*4_desc', 'Hip plastic furniture'), + ('NUF_getting_items_catalogue_purse', 'Click to open your Purse and find out how to get some Habbo Credits . You can use these to buy stuff!'), + ('furni_hc_tbl_name', 'Nordic Table'), + ('furni_bed_budget_one*6_name', 'Blue Pura Bed'), + ('furni_solarium_norja*7_name', 'Rural Solarium'), + ('console_newmessages', 'New Message(s)'), + ('poster_2_desc', 'Take pride in your veg!'), + ('furni_xmas_cstl_twr_desc', 'All I see from up here is snow!'), + ('hubu_info', 'Welcome to the FRANK Infobus! For the next three months FRANK advisors who know a lot about drugs, their effects and the risks involved, will be stepping aboard the Infobus to offer advice and support to any Habbo that wants to visit the bus. For more information click the link below:'), + ('furni_bardesk_polyfon*6_name', 'Blue Mode Bardesk'), + ('furni_summer_pool*3_name', 'Green Summer Pool'), + ('furni_pura_mdl3*8_name', 'yellow pura module 3'), + ('furni_valentinescreen_name', 'Holiday Romance'), + ('furni_rare_beehive_bulb*1_desc', 'A honey-hued glow'), + ('gs_link_gamerules', 'Game Rules'), + ('nav_venue_bb_lobby_tournament_11/0_desc', ''), + ('sound_machine_song_info', 'Song Info'), + ('wallitem_arabian_swords_name', 'Ancestral Scimitars'), + ('furni_one_way_door*6_desc', 'One way! The HC way!'), + ('furni_table_plasto_round*2_desc', 'Hip plastic furniture'), + ('credit', 'Credit'), + ('gs_lounge_skill_no_max', 'Infinite'), + ('furni_wall_china_desc', 'For your great wall'), + ('NUF_visiting_rooms_roomlist_add to fav', 'After clicking on a room you can click this button here to add it to favourites.'), + ('furni_carpet_polar*3_name', 'Yellow Bear Rug'), + ('poster_46_desc', 'Twinkle, twinkle'), + ('furni_petfood1_desc', 'Fantastic 20% Saving!'), + ('url_nobalance', 'http://%predefined%/credits?'), + ('furni_sofachair_silo*6_name', 'Blue Area Armchair'), + ('furni_noob_chair*1_desc', 'Lightweight, practical and yellow'), + ('nav_venue_bb_lobby_expert_7/0_desc', ''), + ('furni_pura_mdl1*7_name', 'Green Pura Module 1'), + ('furni_table_silo_small*6_name', 'Blue Area Occasional Table'), + ('club_thanks_title', 'Congratulations! You are now a member of Habbo Club.'), + ('furni_legotrophy_name', 'Basketball Trophy'), + ('roomatic_createyrown', 'Create Your Own Room'), + ('console_report_remove', 'Remove'), + ('furni_sound_set_42_desc', 'Bumps and Chills'), + ('furni_divider_nor5*5_desc', 'Cool cornering for your crib y0!'), + ('furni_rare_icecream*2_desc', 'Virtual pistachio rocks!'), + ('furni_pura_mdl4*6_name', 'Blue Pura Module 4'), + ('club_button_close', 'Close Window'), + ('wallitem_md_can_name', 'Bubble Juice Can'), + ('furni_prizetrophy7_desc', 'Palkinto'), + ('nav_venue_cunning_fox_gamehall/2_desc', 'Keep your head down, it\'s bombs away'), + ('poster_28_desc', '10 x Silver Tinsel'), + ('furni_rare_dragonlamp*2_desc', 'Oriental beast of legends'), + ('furni_glass_sofa*2_name', 'Glass sofa'), + ('modtool_hours', 'Hours'), + ('nav_venue_emperors_name', 'Emperor\'s hall'), + ('catalog_buyingSuccesfull', 'Buying Successful!'), + ('console_concurrency_error', 'There was a concurrency error while modifying friend list'), + ('furni_table_silo_med*3_desc', 'Wipe clean and unobtrusive'), + ('furni_sleepingbag*8_desc', 'Ultimate coziness for SnowStorm winners'), + ('poster_508_desc', 'The flag of Spain'), + ('furni_goodie1*2_desc', 'Crunchy Dog Treat'), + ('nav_venue_sw_lobby_free_3/0_desc', ''), + ('furni_chair_basic*7_desc', ''), + ('room_take_rights', 'Remove Rights'), + ('furni_hc_bkshlf_desc', 'For the scholarly ones'), + ('furni_bed_polyfon*2_desc', 'Black Mode Double Bed'), + ('furni_table_plasto_4leg_name', 'Occasional Table'), + ('furni_bed_budget*7_desc', 'King sized comfort!'), + ('win_partner_registration', 'Partner registration'), + ('summer_chair_4_desc', 'Please tan responsably'), + ('furni_table_norja_med_name', 'Coffee Table'), + ('nav_venue_club_massiva/2_desc', 'Make all the right moves'), + ('furni_divider_silo1_desc', 'Neat and natty'), + ('hobba_send_reply', 'Send Alert'), + ('shopping_nocash', 'You don\'t have enough Credits in your Purse.\\r Click \'OK\' to see the different ways of\\rgetting Habbo Credits.'), + ('furni_divider_poly3*9_name', 'Red Hatch'), + ('furni_rare_fountain*1_desc', 'For our feathered friends'), + ('poster_56_desc', 'Serious partying going on!'), + ('furni_scifiport*6_name', 'White Sci-Fi Port'), + ('furni_rclr_garden_desc', 'Self watering'), + ('furni_arabian_tray1_desc', 'Tea for every occasion'), + ('furni_rare_fountain*3_name', 'Bird Bath (blue)'), + ('furni_romantique_pianochair*1_name', 'Rose Quartz Piano Stool'), + ('furni_romantique_divider*1_desc', 'Beauty lies within'), + ('wallitem_post.it.vd_name', 'Heart Stickies'), + ('wallitem_torch_desc', 'The dark side of Habbo'), + ('roomatic_namedisplayed', 'Do you want your name to be displayed with the room?'), + ('furni_grunge_candle_name', 'Candle Box'), + ('furni_sound_set_17_name', 'Groove 3'), + ('furni_prizetrophy3*2_name', 'Globe trophy'), + ('furni_chair_silo_desc', 'Keep it simple'), + ('nav_venue_sw_lobby_beginner_7/0_desc', ''), + ('nav_venue_sw_lobby_beginner_3/0_desc', ''), + ('furni_hc_trll_name', 'Drinks Trolley'), + ('furni_bed_polyfon_one*7_desc', 'Green Mode Single Bed'), + ('furni_chair_plasto*2_name', 'Chair'), + ('furni_pura_mdl1*4_name', 'White Pura Module 1'), + ('furni_gothiccandelabra_desc', 'The dark side of Habbo'), + ('NUH_chat', 'Click here and type to chat to other Habbos.'), + ('furni_plant_valentinerose*2_name', 'White Valentine Rose'), + ('reg_privacypledge', 'Privacy Pledge'), + ('furni_exe_table_desc', 'Take a memo, Featherstone'), + ('hubu_info_link2', 'FRANK Website'), + ('furni_prizetrophy4*3_name', 'Fish trophy'), + ('furni_hc_chr_desc', 'Royal comfort'), + ('hubu_info_link1', 'FRANK Infobus Information'), + ('sound_machine_your_songs', 'Traxmachine Songs'), + ('furni_active_placeholder_name', 'This furniture is downloading...'), + ('furni_divider_silo3*8_name', 'Yellow Area Gate'), + ('NUF_visiting_rooms_categorylist_tutor', 'There are so many Guest Rooms we thought it would be a "hoot" to divide them into categories. Select a category to view its contents.'), + ('furni_sofa_silo*6_name', 'Blue Area Sofa'), + ('club_extend_failed', 'Sorry, we were unable to process the purchase. No Credits were charged!'), + ('furni_soft_sofa_norja*4_name', 'Urban Iced Sofa'), + ('furni_sporttrack3*3_desc', 'null'), + ('furni_sound_set_1_name', 'Habbo Sounds 1'), + ('furni_pura_mdl2*5_name', 'beige pura module 2'), + ('nav_venue_sw_lobby_intermediate_1/0_desc', ''), + ('furni_safe_silo*8_name', 'Yellow Safe Minibar'), + ('trading_agrees', 'agrees'), + ('alert_needpermission', 'You need your parent or guardian\'s permission to spend time in Habbo Hotel.'), + ('nav_modify', 'Modify'), + ('furni_noob_stool*4_desc', 'Unfold me and take the weight off (light blue)'), + ('catalog_length_trophymsg', 'Oops, your inscription is too long, so it won\'t fit on the trophy. \\rPlease type something shorter.'), + ('furni_s_sound_machine*3_desc', 'Sound Machine Green Desc'), + ('club_member', 'Member'), + ('modtool_ban_ip', 'Ban IP Also'), + ('bb_link_gamerules', 'Spelregels'), + ('furni_carpet_armas_name', 'Hand-Woven Rug'), + ('furni_rubberchair*5_desc', 'Soft and tearproof!'), + ('furni_table_plasto_square*1_desc', 'Hip plastic furniture'), + ('furni_divider_nor3*3_desc', 'Do go through...'), + ('nav_venue_habburger\'s/0_desc', 'Get food here!'), + ('reg_linkstitle', 'Full version of the documents:'), + ('roomevent_browser_title', 'Events'), + ('roomatic_security', 'Security'), + ('furni_table_plasto_4leg*7_desc', 'Hip plastic furniture'), + ('furni_table_plasto_round*14_desc', 'Hip plastic furniture'), + ('furni_sound_set_38_desc', 'Rock and Roses!'), + ('furni_rare_parasol*0_desc', 'Block those rays!'), + ('furni_pura_mdl3*6_desc', 'Any way you like it!'), + ('NUF_console', 'Learn about messaging'), + ('poster_45_name', 'Skeleton'), + ('furni_pura_mdl3*9_desc', 'Any way you like it!'), + ('pet_age', 'Age:'), + ('poster_48_name', 'Large gold star'), + ('open', 'Open'), + ('gs_3min', '3min'), + ('wallitem_habw_mirror_name', 'Habbowood Mirror'), + ('furni_carpet_polar*4_desc', 'Snuggle up on a Funky bear rug...'), + ('furni_table_armas_name', 'Dining Table'), + ('sw_gameprice', 'Play now for just 2 tickets!'), + ('furni_divider_nor5*4_name', 'Urban Iced Angle'), + ('navigator', 'Hotel Navigator'), + ('furni_pillow*2_desc', 'Puffy, soft and huge'), + ('purse_vouchers_checking', 'Checking code, please wait...'), + ('furni_noob_rug*4_desc', 'Nice and neat sisal rug with light blue edging'), + ('furni_safe_silo*5_name', 'Pink Safe Minibar'), + ('nav_venue_the_dirty_duck_pub/0_desc', 'The perfect place to chill!'), + ('furni_CFC_10_coin_bronze_desc', 'Worth 10 Credits'), + ('furni_teleport_door_desc', 'Magic doorway to anywhere!'), + ('furni_bardesk_polyfon_name', 'Bar/desk'), + ('login_password', 'Password'), + ('furni_pura_mdl2*8_desc', ''), + ('furni_divider_nor4*4_desc', 'Habbos, roll out!'), + ('furni_rare_fan*7_name', 'Brown Powered Fan'), + ('furni_bed_polyfon_girl_one_desc', 'Snuggle down in princess pink'), + ('club_general_elapsed', 'Elapsed Months'), + ('nav_venue_sw_lobby_free_1_name', 'Free Game Lobby'), + ('furni_gothic_chair*5_name', 'Green Gothic Chair'), + ('furni_sink_name', 'Sink'), + ('furni_bed_budget_one*4_desc', 'Prince sized comfort!'), + ('Alert_ForgotSetPassword', 'Please check your password'), + ('furni_chair_plasto*6_desc', 'Hip plastic furniture'), + ('furni_carpet_standard_desc', 'Available in a variety of colours'), + ('reg_update_text2', 'Only change them when you want to make sure that nobody can know or guess your password.'), + ('furni_arabian_swords_desc', 'Not for yielding'), + ('furni_divider_silo3*5_name', 'Pink Area Gate'), + ('furni_fireplace_polyfon_desc', 'Comfort in stainless steel'), + ('furni_glass_table*3_desc', 'Translucent beauty'), + ('furni_summer_pool*4_desc', 'Fancy a dip?'), + ('poster_500_desc', 'The UK flag'), + ('poster_1004_name', 'Eid Mubarak Poster'), + ('furni_rare_icecream*5_desc', 'Virtual vanilla rocks!'), + ('furni_one_way_door*2_name', 'Black HC Gate'), + ('furni_chair_plasty*3_desc', 'Hip plastic furniture'), + ('club_end_title', 'Your Habbo Club membership has now expired.'), + ('furni_table_polyfon_desc', 'For larger gatherings'), + ('furni_romantique_pianochair*4_desc', 'I can feel air coming through...'), + ('furni_bardesk_polyfon*3_name', 'White Bardesk'), + ('predefined_room_description', '%user_name% has entered the building'), + ('poster_53_desc', 'whack that ball!'), + ('poster_515_name', 'The Swedish flag'), + ('furni_rope_divider_desc', 'Rope Divider'), + ('furni_chair_norja*3_desc', 'Sleek and chic for each cheek'), + ('furni_scifidoor*9_name', 'Blue Spaceship Door'), + ('furni_goodie2_name', 'Chocolate Mouse'), + ('game_poker_logoff', 'Left the game'), + ('furni_bed_polyfon_desc', 'Give yourself space to stretch out'), + ('furni_table_plasto_round*5_desc', 'Hip plastic furniture'), + ('furni_couch_norja*3_desc', 'Two can perch comfortably'), + ('pet.saying.sleep.cat.2', 'Purrr... rrrr'), + ('pet.saying.sleep.cat.1', 'mrrrr..rrrr..'), + ('pet.saying.sleep.cat.0', 'hrrrrr....Mrrrrr'), + ('login_ok', 'OK'), + ('gs_button_expand', 'Expand Window'), + ('pet.saying.sleep.cat.4', 'mrrrr...muew..mrr'), + ('tutorial_next', 'Next:'), + ('pet.saying.sleep.cat.3', 'hurrr..hurrr'), + ('furni_jp_tatami_desc', 'Shoes off please'), + ('hobba_sent_to_moderators', 'Call re-assigned non-emergency, still visible to moderators'), + ('roomatic_choosecategory', ''), + ('wallitem_guitar_v_desc', 'tilulilulii'), + ('NUF_groups', 'Groups'), + ('bb_link_gameRules_url', 'http://%predefined%/groups/56552/id'), + ('nav_venue_theatredrome_halloween_name', 'Theatredrome Habboween'), + ('bb_buyTicketsButton', 'Buy tickets'), + ('furni_gothgate_desc', 'The dark side of Habbo'), + ('game_poker_waiting', 'Change done.\\rWaiting for the other players'), + ('furni_glass_stool*7_desc', 'Habbo Club'), + ('club_end_text', 'BUT, don\'t worry, you can still buy another month of Habbo Club and keep all your Habbo Club benefits,special Furni gifts and the shiny badge!'), + ('furni_sound_set_18_desc', 'Listen while you tan'), + ('furni_sound_set_35_desc', 'Groovelicious'), + ('furni_prizetrophy2*2_desc', 'Shiny silver'), + ('furni_plant_valentinerose*3_desc', 'Relight your passions'), + ('furni_romantique_divan*5_name', 'Onyx Chaise-Longue'), + ('furni_chair_norja*6_desc', 'Sleek and chic for each cheek'), + ('wallitem_hrella_poster_2_desc', 'For those scary Lido moments'), + ('furni_s_sound_machine*6_desc', 'Sound Machine Purple'), + ('game_bs_miss', 'Miss:'), + ('furni_carpet_standard*4_desc', 'Available in a variety of colours'), + ('furni_pura_mdl1*1_name', 'Aqua Pura Module 1'), + ('furni_rare_icecream*8_desc', 'Virtual peppermint rocks!'), + ('furni_petfood4_desc', 'Fantastic 20% Saving!'), + ('furni_table_silo_small*3_name', 'White Occasional Table'), + ('furni_table_plasto_round*8_desc', 'Hip plastic furniture'), + ('furni_chair_polyfon_desc', 'Metallic seating experience'), + ('furni_exe_drinks_desc', 'Give a warm welcome'), + ('nav_createroom', 'Create Own Room'), + ('furni_table_plasto_bigsquare*14_desc', 'Hip plastic furniture'), + ('poster_1001_name', 'Prince Charles Poster'), + ('furni_CF_20_moneybag_name', 'Sack of Credits'), + ('furni_prizetrophy5*1_name', 'Duo trophy'), + ('alert_reg_email', 'Email'), + ('pet_thirsty', 'Thirst:'), + ('nav_error_passwordtooshort', 'The password is too short.'), + ('nav_venue_sw_lobby_free_7_name', 'Free Game Lobby'), + ('furni_plant_valentinerose*5_name', 'Purple Valentine Rose'), + ('recycler_status_info', 'You have Furniture in recycling. The icon will blink when recycling is complete.'), + ('poster_52_name', 'Hockey Stick'), + ('win_doorbell', 'Doorbell'), + ('Unreadmessages', 'New Message(s)'), + ('furni_queue_tile1*9_desc', 'The power of movement'), + ('furni_rare_snowrug_name', 'Snow Rug'), + ('console_approve_selected', 'Accept selected'), + ('pet_race_0_009', 'Hound of Hull'), + ('poster_35_name', 'The Habbo Babes 1'), + ('pet_race_0_008', 'Springy Spaniel'), + ('furni_sofa_polyfon*3_desc', 'Comfort for stylish couples'), + ('furni_basket_name', 'Basket Of Eggs'), + ('pet_race_0_007', 'Slobber Don'), + ('pet_race_0_006', 'Stripy Setter'), + ('pet_race_0_005', 'Paws Forethought'), + ('pet_race_0_004', 'Droopy of Pawford'), + ('furni_barchair_silo_desc', 'Practical and convenient'), + ('furni_noob_lamp*2_desc', 'Get the light right where you want it (dark blue)'), + ('pet_race_0_003', 'Rescue Bernard'), + ('furni_glass_stool_name', 'Glass stool'), + ('pet_race_0_002', 'Joe Cocker Spaniel'), + ('pet_race_0_001', 'Habbo Husky'), + ('pet_race_0_000', 'Yappy Yorkie'), + ('NUF_mini_endtopic_step1_questionmark', 'Click to see our help menu and find our FAQs!'), + ('furni_sound_set_28_desc', 'Head for the pit!'), + ('nav_private_norooms', 'You dont have any rooms - create one?'), + ('furni_table_plasto_square*4_desc', 'Hip plastic furniture'), + ('furni_val_teddy*6_name', 'Blue Share Bear'), + ('furni_noob_table*3_desc', 'Lightweight, practical and aubergine'), + ('gs_state_finished', 'This Game is already over!'), + ('furni_rare_fan*8_desc', 'Stylish, Eco-Energy!'), + ('reg_parentemail_link_url1', 'http://%predefined%//help/parents_guide.html'), + ('furni_gothic_carpet2_desc', 'What lies beneath?'), + ('furni_rare_fan*5_desc', 'It\'ll blow you away!'), + ('modtool_kickuser', 'Kick User'), + ('furni_divider_silo1*7_desc', 'Green Area Corner Shelf'), + ('reg_parentemail_link_url2', 'http://%predefined%//footer_pages/privacy_policy.html'), + ('pet_race_0_019', 'Tiny Terrier'), + ('pet_race_0_018', 'Bushy Woofer'), + ('pet_race_0_017', 'Speckled Sheepdog'), + ('furni_rubberchair*8_desc', 'Soft and tearproof for HC!'), + ('pet_race_0_016', 'Murmurin\' Minimastiff'), + ('poster_42_name', 'Spiderweb'), + ('pet_race_0_015', 'Pixie Poodle'), + ('furni_safe_silo*2_name', 'Black Safe Minibar'), + ('pet_race_0_014', 'Whiffy Woofy'), + ('pet_race_0_013', 'Mangy Mutt'), + ('nav_publicRooms', 'Public Spaces'), + ('pet_race_0_012', 'Tawny Bleugh'), + ('pet_race_0_011', 'Lappy Lassie'), + ('pet_race_0_010', 'Furry McScottie'), + ('game_bs_toast', 'Toast!'), + ('furni_prizetrophy6_name', 'Pokaali'), + ('furni_pudding_desc', 'Will you get the lucky sixpence?'), + ('furni_tile_red_desc', 'In a choice of colours'), + ('nav_venue_sw_arena_expert_name', 'Playing expert game'), + ('pet.saying.sleep.croco.0', 'Zzzz... zzzzz...'), + ('poster_50_desc', 'flap, flap, screech, screech...'), + ('furni_shelves_norja*9_name', 'Red Bookcase'), + ('furni_sound_set_4_name', 'Ambient 1'), + ('furni_exe_s_table_desc', 'Get a clear reflection!'), + ('furni_present_gen6_desc', 'What\'s inside?'), + ('furni_one_way_door*5_name', 'Pink One Way Gate'), + ('nav_search_hd', 'Search rooms by Habbo name or room name.'), + ('poster_20_desc', 'high security for your room'), + ('buddyremove_messenger_updating', 'The console is updating, try again in a minute... Everything else is working fine!'), + ('pet.saying.sleep.croco.3', ':)'), + ('furni_house2_desc', 'Good enough to eat'), + ('pet.saying.sleep.croco.4', '*Snuh snuh*'), + ('tutorial_offtopic', 'Oops! You got off the topic. Please restart or select a new topic.'), + ('pet.saying.sleep.croco.1', 'Yrgh... Yrgh...'), + ('jukebox_now_playing', 'Now playing:'), + ('pet.saying.sleep.croco.2', 'Frgh... Frgh...'), + ('furni_sound_set_25_desc', 'Actually, it\'s Partay!'), + ('club_intro_header', 'Welcome to Habbo Club, the members-only club that all VIP Habbos belong to!'), + ('nav_venue_sw_lobby_amateur_3/0_desc', 'Astetta rankempaa lumisotaa.'), + ('pet.saying.sleep.croco.5', 'Rawwwwwwwwrrrm...'), + ('pet.saying.sleep.croco.6', 'Mmmm... Hooks...'), + ('furni_table_plasto_bigsquare*1_desc', 'Hip plastic furniture'), + ('nav_venue_sw_lobby_free_4_name', 'Free Game Lobby'), + ('alert_warning', 'Moderator says:'), + ('furni_barrier*3_name', 'Red Road Barrier'), + ('nav_venue_floatinggarden_name', 'Floating Garden'), + ('gs_error_nocredits', 'You need Habbo Credits to play a Game!'), + ('furni_chair_plasto*5_name', 'Chair'), + ('furni_tree2_desc', 'Old Christmas Tree'), + ('furni_bed_budget_one*7_desc', 'Prince sized comfort!'), + ('furni_romantique_clock_name', 'romantique_clock'), + ('room_banner_text', ''), + ('furni_sleepingbag*2_desc', 'Ultimate coziness'), + ('furni_divider_nor4*3_name', 'White Iced Auto Shutter'), + ('jukebox_song_remaining', 'Remaining time: %time%'), + ('reg_note_text', 'Never change your password or email\\rif someone else asks you to - they will\\rsteal your furni and Credits!'), + ('habbo_hand_next', '>>>'), + ('nav_venue_orient/0_desc', 'Tres chic with an Eastern twist. For Habbo Club members only.'), + ('furni_easterduck_name', 'Wannabe bunny'), + ('login_forgottenPassword', 'Forgotten your password?'), + ('furni_prizetrophy*1_desc', 'Glittery gold'), + ('hubu_t2_2', ''), + ('hubu_t2_3', 'Vapaa-ajan linkkejä'), + ('decision_cancel', 'Cancel'), + ('nav_venue_bb_lobby_tournament_2/0_desc', ''), + ('furni_samovar_desc', 'Click for a refreshing cuppa'), + ('furni_rcandle_name', 'Red Candle'), + ('furni_waterbowl*4_name', 'Blue Water Bowl'), + ('furni_table_norja_med*7_name', 'Rural Iced Coffee Table'), + ('NUF_playing_games_room_tutor', 'See some people wandering around? They are psyching themselves up for a game. Game Tickets are usually 2 Habbo Credits, but in this room the games are free.'), + ('furni_doormat_love_name', 'Doormat'), + ('bb_link_tournament_highScores_url', 'http://%predefined%//groups/56552/id'), + ('furni_sofachair_polyfon*4_name', 'Beige Mode Armchair'), + ('error_room_full', 'Huone on täynnä.'), + ('furni_chair_silo*4_desc', 'Beige Silo Dining Chair'), + ('furni_divider_nor2*7_name', 'Rural Iced Bar'), + ('hubu_t2_1', ''), + ('furni_divider_nor1*9_name', 'Red Ice corner'), + ('furni_wooden_screen*0_name', 'White Oriental Screen'), + ('furni_chair_basic*1_desc', ''), + ('gs_choose_gamename', 'Enter A Name For Your Game:'), + ('poll_question_number', 'Question %number%/%count%'), + ('furni_hc_rllr_desc', 'Highest class transportation'), + ('furni_table_plasto_4leg*15_desc', 'Hip plastic furniture'), + ('furni_scifiport*9_name', 'Violet Sci-Fi Port'), + ('furni_jukebox*1_desc', 'For your Happy Days!'), + ('furni_red_tv_desc', 'Don?t miss those soaps'), + ('furni_song_disk_name', 'Traxdisc'), + ('reg_agree_alert', 'You have to agree to the terms of service\\r(tick the box).'), + ('furni_summer_chair*1_desc', 'Got your swimming trunks?'), + ('poster_2008_name', 'Habbo Leap Day Poster'), + ('poster_505_desc', 'The Canadian flag'), + ('group_homepage', 'Groups\' Homepage >>>'), + ('furni_table_silo_med*6_desc', 'Blue Area Coffee Table'), + ('nav_venue_tearoom/0_name', 'Chinese Tea Room'), + ('dimmer_use_bg_only', 'Background only'), + ('furni_divider_poly3*4_name', 'Beige Mode Bardesk Gate'), + ('nav_venue_hotel_kitchen/0_desc', 'Beware the flying knives!'), + ('furni_divider_silo1*8_desc', 'Neat and natty'), + ('furni_hc_btlr_name', 'Electric Butler'), + ('furni_wooden_screen*5_name', 'Gray Oriental Screen'), + ('furni_scifiport*8_name', 'Purple Sci-Fi Port'), + ('furni_carpet_standard*5_name', 'Floor Rug'), + ('trading_offers', 'offers:'), + ('furni_prizetrophy2*3_name', 'Duck trophy'), + ('transaction_system_club_habbo', 'Habbo Club payment'), + ('nav_venue_bb_lobby_tournament_9/0_desc', ''), + ('poster_517_name', 'The Scottish flag'), + ('furni_wood_tv_desc', 'For family viewing'), + ('furni_deadduck2_desc', 'Someone forgot to feed me...'), + ('furni_sound_set_20_desc', 'Musical heaven'), + ('sound_machine_new', 'Create a New Song'), + ('nav_venue_the_chromide_club/0_desc', 'Ghetto Fabulous'), + ('nav_modify_doorstatus_pwagain', 'pw again:'), + ('furni_chair_plasto*10_desc', 'Hip plastic furniture'), + ('gs_idlewarning', 'You will be replaced if you don\'t start or join a Game soon!'), + ('purse_vouchers_entercode', 'Enter code here:'), + ('sound_machine_song_name', 'Untitled Trax'), + ('furni_sofa_polyfon*4_name', 'Beige Mode Sofa'), + ('furni_carpet_standard*a_name', 'Floor Rug'), + ('poster_510_name', 'The Italian flag'), + ('furni_table_plasto_square*7_name', 'Square Dining Table'), + ('furni_noob_chair*6_desc', 'Lightweight, practical with dark yellow stripes'), + ('forgottenpw_whatyou', 'What\'s your Habbo called?'), + ('nav_venue_bb_lobby_amateur_1_name', 'Gevorderden Battle Ball 2'), + ('furni_noob_table*6_name', 'My first Habbo table'), + ('furni_pillar*0_desc', 'Classy architect, for holding up ceilings!'), + ('poster_1002_desc', 'aw, bless...'), + ('furni_divider_arm1_desc', 'Good solid wood'), + ('furni_glass_stool*8_name', 'Glass stool'), + ('furni_rare_moonrug_name', 'Moon Patch'), + ('nav_venue_rooftop_rumble/0_desc', 'Are you ready?'), + ('transaction_system_sms_sonera', 'Sonera'), + ('furni_waterbowl*5_name', 'Brown Water Bowl'), + ('furni_sound_set_32_name', 'Instrumental 2'), + ('furni_table_silo_small*4_name', 'Beige Area Occasional Table'), + ('furni_prizetrophy8*1_name', 'Duo trophy'), + ('tutorial_menu', 'Get help with...'), + ('gs_2teams', '2 Teams Game'), + ('furni_sound_machine*4_desc', 'For Funky, Funky Fridays!'), + ('furni_romantique_divan*4_desc', 'Is that a cape hanging there?'), + ('furni_couch_norja*8_desc', 'Two can perch comfortably'), + ('console_usersnotfound', 'Habbo Not Found'), + ('nav_venue_bb_lobby_amateur_2/0_desc', ''), + ('furni_sleepingbag*4_desc', 'Ultimate coziness'), + ('furni_bed_budget_one*6_desc', 'Prince sized comfort!'), + ('furni_sw_chest_desc', ''), + ('nav_venue_bb_lobby_amateur_5/0_desc', ''), + ('NUF_visiting_rooms_room_tutor', 'This is a Guest Room. You can either quit the tutorial and start meeting people, or select the next topic.'), + ('furni_jp_pillow_name', 'Pillow Chair'), + ('url_logged_out', 'http://%predefined%/account/disconnected?reason=logout&origin=popup'), + ('furni_romantique_smalltabl*1_name', 'Rose Quartz Tray Table'), + ('friend_request_declined', 'Declined!'), + ('furni_grunge_shelf_desc', 'Scrap books and photo albums'), + ('furni_gothic_stool*6_name', 'Gothic Stool Blue'), + ('wallitem_gothicfountain_desc', 'Not suitable for drinking!'), + ('furni_scifiport*1_name', 'Gold Laser Gate'), + ('furni_sound_set_41_name', 'Rock 8'), + ('furni_toilet_yell_name', 'Loo Seat'), + ('console_fr_limit_exceeded_error', 'Too many friends selected. Please remove some first.'), + ('console_asktobecomeafriend', 'Ask To Become A Friend'), + ('console_friends', 'Friends'), + ('furni_table_plasto_bigsquare*4_desc', 'Hip plastic furniture'), + ('poster_2005_desc', 'The Special Infobus Poster'), + ('furni_summer_chair*8_desc', 'Got your sun cream?'), + ('furni_s_sound_machine*2_name', 'Sound Machine Ocean'), + ('nav_ringbell', 'The door is locked. Ringing the bell, and waiting...'), + ('console_profilematch', 'Habbo Profile match -'), + ('poster_14_name', 'Fox Poster'), + ('furni_bardeskcorner_polyfon*3_desc', 'Tuck it away'), + ('furni_carpet_soft*2_name', 'Soft Wool Rug'), + ('furni_ham_name', 'Joint of Ham'), + ('nav_venue_star_lounge_name', 'Star Lounge'), + ('nav_venue_bb_lobby_beginner_desc', 'Beginner battle ball'), + ('furni_doormat_plain*3_desc', 'Available in a variety of colours'), + ('furni_habbowood_chair_desc', 'Exclusively for Directors'), + ('nav_venue_bb_lobby_beginner_3/0_desc', ''), + ('furni_CF_20_moneybag_desc', 'Worth 20 Credits'), + ('furni_edice_desc', 'What\'s your lucky number?'), + ('furni_scifirocket*9_name', 'Neptune Smoke Machine'), + ('furni_bardesk_polyfon*9_name', 'Red Bardesk'), + ('furni_glass_table*8_desc', 'Translucent beauty'), + ('NUF_mini_endtopic', 'Find out more'), + ('pending_cfh_title', 'Your old message'), + ('nav_venue_sw_arena_tournament_name', 'Playing a tournament game!'), + ('furni_arabian_bigtb_desc', 'It must be Jinn-er time!'), + ('nav_venue_bb_lobby_beginner_0/0_desc', ''), + ('furni_pillow*3_name', 'Turquoise Satin Pillow'), + ('interface_icon_help', 'Help, need help?'), + ('nav_roomnfo_hd_src', 'Search Rooms'), + ('pet.saying.generic.dog.0', 'woof..woof'), + ('furni_chair_norja*9_name', 'Red Chair'), + ('NUF_getting_room_roommatic_start_tutor', 'This is the Room-O-Matic! Green! You use this to make your room.'), + ('furni_sound_set_2_name', 'Habbo Sounds 3'), + ('nav_venue_netcafe_name', 'My Habbo Home Netcafe'), + ('purse_voucherbutton', 'Vouchers'), + ('console_console', 'Console'), + ('game_poker_changed', 'changed'), + ('transaction_system_splashplastic', 'SplashPlastic'), + ('nav_venue_sw_lobby_free_7/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('furni_sporttrack3*1_desc', 'null'), + ('buddyremove_prev', '< Previous'), + ('roomatic_chooselayout', 'Choose the layout of your room'), + ('wallitem_item_placeholder_desc', 'This furniture is downloading...'), + ('purse_note', 'NOTE : The transactions are updated at 6 am every day.'), + ('poster_34_desc', 'Habbo-punk for the never-agreeing'), + ('furni_sound_set_27_desc', 'Jingle Bells will never be the same...'), + ('game_chess_start', 'Start Over'), + ('summer_chair_7_desc', 'A green deck chair'), + ('nav_venue_bb_lobby_beginner_6_name', 'Beginners Battle Ball 7'), + ('purse_link', 'Click here to see how to get Credits.'), + ('poster_59_desc', 'Torch - it gives you some light'), + ('room_info_rate_req', 'Rate this room'), + ('furni_rare_dragonlamp*5_desc', 'Roast your chestnuts here!'), + ('furni_divider_silo3*9_desc', 'Red Area Gate'), + ('more_roomlayouts', 'Extra room layouts for Habbo Club members >>'), + ('furni_grunge_chair_desc', 'Alternative chair for alternative people'), + ('furni_bed_budget*9_desc', 'King sized comfort!'), + ('furni_christmas_sleigh_desc', 'Ready for your Xmas cheer'), + ('furni_table_plasto_4leg*8_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_tournament_5_name', 'Competitie Battle Ball 6'), + ('furni_table_norja_med*4_name', 'Urban Iced Coffee Table'), + ('instant_friend_request_header', 'Friend Request'), + ('furni_marquee*3_name', 'Aqua Marquee'), + ('furni_noob_stool*1_name', 'My first Habbo stool'), + ('furni_rare_mnstr_desc', 'Don\'t get too close...'), + ('furni_safe_silo_pb_desc', 'Totally shatter-proof!'), + ('NUF_meeting_people_user_chatfield', 'Start typing here and press \'Enter\' to chat with others.'), + ('furni_prizetrophy6*2_desc', 'Shiny silver'), + ('furni_table_plasto_bigsquare*9_name', 'Square Dining Table'), + ('club_habbo.window.title', 'Habbo Club'), + ('recycler_info_ready', 'Recycling is complete. You have made a great environmentally friendly decision. All the recycled items you receive have been made from old items which helps to save natural resources and reduce pollution.'), + ('furni_shelves_norja*5_desc', 'For nic naks and art deco books'), + ('furni_table_silo_med_name', 'Coffee Table'), + ('furni_grunge_sign_desc', 'Bought legitimately from an M1 cafe.'), + ('roomevent_type_9', 'Group Events'), + ('roomevent_type_7', 'Dating'), + ('pet.saying.generic.dog.1', 'woof woof woof!!!'), + ('roomevent_type_8', 'Jobs'), + ('pet.saying.generic.dog.2', 'wooooof!'), + ('roomevent_type_5', 'Debates & Discussion'), + ('pet.saying.generic.dog.3', 'hooooowl'), + ('roomevent_type_6', 'Grand Openings'), + ('furni_solarium_norja*2_name', 'Beige Solarium'), + ('nav_venue_bb_lobby_intermediate_3_name', 'Semi-profs Battle Ball 4'), + ('console_searchfor', 'Search:'), + ('wallitem_arabian_wndw_desc', 'Arabian days and nights'), + ('furni_queue_tile1*3_name', 'Ice Habbo Roller'), + ('furni_lamp2_armas_desc', 'Wax lyrical with some old-world charm'), + ('furni_jp_tray3_desc', 'jp_tray3'), + ('wallitem_guitar_skull_name', 'skull guitar'), + ('roomevent_type_3', 'Games'), + ('furni_romantique_divider*2_desc', 'Keeping things separated'), + ('roomatic_owner', 'Owner:'), + ('url_helpterms', 'http://%predefined%//help/68'), + ('roomevent_type_4', 'Welcoming Party Events'), + ('furni_glass_chair*6_desc', 'Translucent beauty'), + ('furni_pillar*5_name', 'Pagan Pillar'), + ('roomevent_type_1', 'Parties & Music'), + ('roomevent_type_2', 'Trading'), + ('furni_present_gen2_desc', 'What\'s inside?'), + ('ph_tickets_title', 'Tickets'), + ('furni_table_norja_med*8_desc', 'For larger gatherings'), + ('furni_sound_set_54_desc', 'Tune into Christmas'), + ('poster_61_desc', 'The Auspicious One'), + ('furni_divider_silo3_name', 'Gate (lockable)'), + ('furni_scifirocket*4_desc', 'Welcome... to planet love'), + ('furni_plant_valentinerose*1_name', 'Red Valentine\'s Rose'), + ('furni_exe_chair2_name', 'Executive Boss Chair'), + ('alert_donate_ok', 'Give away my furni'), + ('furni_bardesk_polyfon*4_desc', 'Beige Mode Bardesk'), + ('furni_pura_mdl1*5_desc', ''), + ('hubu_close', 'Sulje kioski'), + ('gs_deathmatch', 'Every Habbo for himself!'), + ('summer_chair_9_desc', 'Sunbathing, why not?'), + ('furni_barchair_silo*8_name', 'Yellow Bar Stool'), + ('console_differentmessagemodes', 'Different Messages'), + ('furni_chair_silo*5_name', 'Pink Silo Dining Chair'), + ('callhelp_explanation', 'Thanks for reporting the problem'), + ('furni_chair_plasty*1_desc', 'Hip plastic furniture'), + ('furni_bed_budget*2_desc', 'Queen sized comfort!'), + ('furni_summer_grill*2_desc', 'Plenty of shrimp on that barbie'), + ('furni_heart_desc', 'Full of love'), + ('reg_donetext', 'Soon you\'ll see the Hotel Navigator, it shows you all the rooms you can go to -the guest rooms, clubs, caf�s, swimming pools and more!'), + ('poster_523_desc', 'The flag of India'), + ('furni_one_way_door*1_name', 'Aqua One Way Gate'), + ('furni_bardeskcorner_polyfon*13_desc', 'Tuck it away'), + ('nav_venue_sw_lobby_amateur_5/0_desc', 'Astetta rankempaa lumisotaa.'), + ('furni_gothic_chair*4_desc', 'Vampires and Wizards'), + ('furni_bardesk_polyfon*6_desc', 'Blue Mode Bardesk'), + ('transaction_system_sms_sra', 'Sonera'), + ('dimmer_turn_off', 'Turn OFF'), + ('furni_fireplace_armas_desc', 'Authentic, real flame fire'), + ('furni_chair_plasty*6_name', 'Plastic Pod Chair'), + ('furni_scifidoor*6_name', 'Black Monolith'), + ('furni_summer_pool*3_desc', 'Fancy a dip?'), + ('furni_christmas_reindeer_desc', 'Prancer becomes Rudolph in a click!'), + ('furni_chair_norja_name', 'Chair'), + ('furni_barchair_silo*3_name', 'White Bar Stool'), + ('nav_venue_bb_lobby_tournament_desc', 'Play battle ball tournament!'), + ('transaction_system_bank_sampo', 'Sampo'), + ('furni_sound_set_39_name', 'Rock 7'), + ('furni_pura_mdl3*8_desc', ''), + ('console_follow_prevented', 'Your friend has prevented others from following him/her.'), + ('poster_46_name', 'Small gold star'), + ('furni_sofa_polyfon_girl_name', 'Two-seater Sofa'), + ('furni_carpet_polar*3_desc', 'Snuggle up on a Funky bear rug...'), + ('modtool_rankerror', 'You do not have the rights for this action on this user!'), + ('furni_divider_nor3*4_name', 'Urban Iced Gate'), + ('nav_venue_theatredrome_valentine/0_desc', 'Hug A Friend, Its Valentines! Home Of Ralph (Wannabe Panda In Training)'), + ('furni_one_way_door*6_name', 'Blue HC Gate'), + ('poster_7_desc', 'For emergencies only'), + ('wallitem_hc_wall_lamp_name', 'Retro Wall Lamp'), + ('poster_508_name', 'The Spanish flag'), + ('help_emergency_example', 'Example: A Habbo wants to see me on webcam.'), + ('nav_venue_bb_lobby_expert_1/0_desc', ''), + ('furni_pura_mdl1*7_desc', 'Any way you like it!'), + ('wallitem_post.it_desc', 'Pad of stickies'), + ('nav_modify_doorstatus_passwordprotected', 'Let other people move and leave furniture in the room.'), + ('queue_set.queue_full.alert', 'The queue for this room is full. Please try again later.'), + ('nav_venue_bb_lobby_beginner_8_name', 'Beginners Battle Ball 9'), + ('nav_venue_sw_arena_amateur_name(0)', 'Playing amateur game'), + ('url_figure_editor', 'http://%predefined%//profile/profile.action'), + ('furni_noob_lamp*6_desc', 'Get the light right where you want it (canary yellow)'), + ('furni_divider_nor5*5_name', 'Pink Iced Angle'), + ('nav_venue_sw_lobby_free_desc', 'Come and play. It\'s free!'), + ('furni_table_silo_small*6_desc', 'Blue Area Occasional Table'), + ('NUF_getting_items_navigator_tutor', 'You need to be in a Habbo\'s room to access the Catalogue.'), + ('furni_safe_silo*6_desc', 'Totally shatter-proof!'), + ('furni_glass_sofa*7_name', 'Green Glass Sofa'), + ('wallitem_md_can_desc', 'Enough bubbling juice for one evening'), + ('furni_rare_fan*9_desc', 'It\'ll blow you away!'), + ('furni_prizetrophy7_name', 'Pokaali'), + ('furni_noob_stool*3_name', 'My first Habbo stool'), + ('furni_glass_sofa*2_desc', 'Translucent beauty'), + ('pet_frnd_10', 'Adoring'), + ('furni_turkey_desc', 'Where\'s the cranberry sauce?'), + ('pet_frnd_11', 'Devoted'), + ('Alert_ConnectionNotReady', 'Could not connect to the server'), + ('console_search_habbo_profilematch', 'Habbo Profile match -'), + ('furni_sound_set_59_desc', 'Urban break beats'), + ('poster_21_name', 'Butterfly Cabinet'), + ('credits', 'Credits'), + ('furni_sound_set_14_name', 'Hip Hop Beats 2'), + ('NUH_hand', 'Click here to open your inventory (aka the Big Hand). Drag and drop furniture to and from here to move it.'), + ('furni_pura_mdl3*1_desc', 'Any way you like it!'), + ('nav_modify_doorstatus_pwprotected', 'Password protected:'), + ('shopping_costs', 'XX costs XX Credit(s).\\rJust click \'buy\' once, it\'ll appear shortly.'), + ('NUF_mini_meet_people', 'Meet some people'), + ('furni_divider_nor1*3_name', 'White Iced Corner'), + ('furni_bed_budget*7_name', 'Green Pura Double Bed'), + ('furni_pura_mdl5*9_desc', 'Any way you like it!'), + ('nav_venue_club_massiva/2_name', 'Dancefloor'), + ('furni_scifiport*3_desc', 'Energy beams. No trespassers!'), + ('whisper', 'Whisper'), + ('furni_chair_plasto*4_name', 'Chair'), + ('furni_hc_bkshlf_name', 'Medieval Bookcase'), + ('furni_goodie1*2_name', 'Marzipan Man'), + ('furni_rare_fountain*1_name', 'Bird Bath (grey)'), + ('bb_text_hostInfo', 'Please choose a name for your Game and select the number of Teams.'), + ('hubu_t3_1', ''), + ('hubu_t3_2', 'Hubun kiertuekalenteri 2002'), + ('furni_sound_set_34_name', 'Rock 5'), + ('furni_rare_fountain*3_desc', 'For our feathered friends'), + ('nav_venue_sw_lobby_amateur_5_name', 'Snow Slingers Lobby'), + ('furni_pura_mdl3*2_name', 'Pink Pura Module 3'), + ('furni_xmas_cstl_wall_desc', 'Solid blocks of ice and snow'), + ('furni_arabian_tray1_name', 'Mint Tea Tray'), + ('furni_jp_tray4_name', 'jp_tray4'), + ('furni_grunge_candle_desc', 'Late night debate'), + ('furni_rclr_garden_name', 'Water Garden'), + ('furni_CFC_100_coin_gold_name', 'Gold Coin (China)'), + ('nav_venue_gate_park_name', 'Imperial Park'), + ('shopping_asagift', 'Buy As A Gift'), + ('furni_soft_sofachair_norja*7_desc', 'Sit back and relax'), + ('dance', 'Dance'), + ('roomatic_wrongpw', 'Oops! Sorry, your passwords don\'t match. Please enter them again.'), + ('furni_hc_trll_desc', 'For swanky dinners only'), + ('furni_prizetrophy3*2_desc', 'Shiny silver'), + ('modtool_roomkick', 'Room Kick'), + ('roomatic_letmove', 'Let other people move your furniture and place their own. (Furniture cannot be stolen.)'), + ('roomevent_default_description', ''), + ('nav_venue_sw_lobby_free_4/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('console_invalid_message', 'There was a message from a user that was probably removed your friend list. Note, user is removed from your friend list if you report a message to moderators.'), + ('poster_503_name', 'The Swiss flag'), + ('nav_venue_sw_arena_expert_name(0)', 'Playing expert game'), + ('poster_41_desc', 'For the best music-makers'), + ('furni_tile_name', 'Floor Tiles'), + ('furni_val_randomizer_name', 'Love Randomiser'), + ('nav_modify_doorstatus_open', 'Open'), + ('furni_plant_big_cactus_desc', 'Habbo Dreams monster in hiding! Shhhh'), + ('furni_safe_silo*8_desc', 'Totally shatter-proof!'), + ('wallitem_sw_hole_name', 'sw_hole'), + ('play_preview', 'Play preview of sounds'), + ('furni_table_plasto_round*14_name', 'Occasional Table'), + ('poll_thanks_window', 'Thanks!'), + ('wallitem_habbowheel_desc', 'So you gotta ask yourself "Do I feel lucky?"'), + ('furni_carpet_standard_name', 'Floor rug'), + ('furni_divider_nor1*8_name', 'Yellow Ice corner'), + ('nav_venue_bb_lobby_tournament_3/0_desc', ''), + ('buddyremove_ok_text', 'You have chosen enough friends to remove.'), + ('nav_venue_sw_lobby_intermediate_5/0_desc', 'Lumisota sen kuin vain kovenee.'), + ('furni_divider_nor4*7_desc', 'Habbos, roll out!'), + ('furni_summer_chair*3_desc', 'Black'), + ('furni_table_plasto_bigsquare*6_desc', 'Hip plastic furniture'), + ('gs_link_highscores', 'High Scores'), + ('Alert_purchasingerror', 'Buying unsuccessful'), + ('poster_5_desc', 'Quacking good design!'), + ('help_emergency_sent', 'A member of community staff will investigate the situation and take appropriate action. This may include sending you a response with advice on dealing with your issue.'), + ('room_user_page', 'Home Page'), + ('room_badge_window_title', 'Badge'), + ('login_name', 'Name of your Habbo'), + ('furni_divider_nor2*5_name', 'Pink Iced bar desk'), + ('nav_venue_habbo_lido_ii/0_desc', 'Dive right in!'), + ('furni_sporttrack2*2_name', 'Sport corner asphalt'), + ('roommatic_modify_size', 'Room size: %tileCount% tiles'), + ('pet.saying.sniff.croco.2', '*Sighs*'), + ('furni_prize2_name', 'Silver Trophy'), + ('Now you can find out how to get more cool Furniture for your room, or select another topic.', ''), + ('pet.saying.sniff.croco.0', 'Ewwwww....'), + ('pet.saying.sniff.croco.1', '*Sniff sniff*'), + ('furni_pura_mdl3*6_name', 'Blue Pura Module 3'), + ('poster_48_desc', 'All that glitters...'), + ('furni_wcandle_desc', 'Xmas tea light'), + ('nav_venue_bb_arena_3_name', 'Battle Ball Keskitaso'), + ('sound_machine_confirm_save_long', 'Are you sure you want to overwrite the current saved song?'), + ('purse_vouchers_helpurl', 'http://%predefined%/help/4'), + ('nav_venue_bouncer_room_2_name', 'Gevorderden Battle Ball Arena'), + ('furni_sand_cstl_gate_desc', 'sand_cstl_gate desc'), + ('furni_barrier*1_name', 'Yellow Maze Barrier'), + ('nav_venue_bb_lobby_tournament_0_name', 'Tournament'), + ('NUF_getting_room_roommatic_layout_tutor', 'Select what you want your room to look like. Use the arrows to cycle through different room layouts. Almost there, almost there...'), + ('poll_confirm_cancel', 'Stop answering?'), + ('furni_carpet_soft*4_desc', 'Soft Wool Rug'), + ('furni_rare_icecream_campaign_desc', 'Basic model'), + ('club_habbo.bottombar.text.notmember', 'Habbo Club'), + ('recycler_info_closed', 'Recycler is closed at the moment. Please check back later to recycle your Furniture.'), + ('furni_solarium_norja*8_desc', 'Rejuvenate your pixels!'), + ('callhelp_example', 'Example: How do I move my Furni?'), + ('furni_bed_budget_one*4_name', 'White Pura Bed'), + ('roomatic_givepwd', 'Password:'), + ('furni_teleport_door_name', 'Teleport Door'), + ('furni_table_silo_small*9_name', 'Red Area Occasional Table'), + ('furni_noob_chair*4_name', 'My first Habbo chair'), + ('furni_table_plasto_square*2_desc', 'Hip plastic furniture'), + ('room_waiting', 'Waiting to go in...'), + ('furni_sink_desc', 'Hot and cold thrown in for no charge'), + ('furni_doormat_plain_name', 'Doormat'), + ('nav_venue_eric\'s_eaterie_name', 'Eric\'s Eaterie'), + ('nav_venue_pizzeria_name', 'Slice of Life'), + ('poster_1004_desc', 'Celebrate with us'), + ('next', 'Next'), + ('furni_solarium_norja*9_name', 'Red Solarium'), + ('tutorial_quit_confirmation', 'You want to leave? Well I hope you learned something... something useful!'), + ('furni_val_teddy*2_desc', 'The pink bear of passion'), + ('poster_1003_name', 'UK Map'), + ('furni_glass_table*2_name', 'Glass table'), + ('NUF_habbo_home_url', 'http://d15-1.web.varoke.net/home/home-tutorial'), + ('furni_bed_silo_one_name', 'Single Bed'), + ('transaction_system_sms_win_btcellnet', 'O2 SMS'), + ('pet.hotwords.go_away', 'go away'), + ('furni_table_plasto_square*9_desc', 'Hip plastic furniture'), + ('furni_doormat_plain*4_name', 'Doormat'), + ('nav_venue_cunning_fox_gamehall_name', 'Cunning Fox Gamehall'), + ('furni_sound_machine*2_name', 'Ocean Traxmachine'), + ('furni_table_polyfon_name', 'Large Coffee Table'), + ('furni_hc_frplc_desc', 'Pixel-powered for maximum heating'), + ('console_request_massoperation_instruction', 'Use the options below to accept or decline ALL friend requests you have waiting.'), + ('nav_venue_bb_lobby_tournament_6/0_desc', ''), + ('furni_table_plasto_round*6_desc', 'Hip plastic furniture'), + ('trading_cancel', 'Cancel Trading'), + ('furni_glass_stool*3_name', 'Glass stool'), + ('furni_plant_mazegate_snow_name', 'Snowy Maze Gate'), + ('nav_venue_tv_studio_name', 'MuchMusic HQ'), + ('furni_table_norja_med*3_desc', 'For larger gatherings'), + ('furni_chair_plasty*8_desc', 'Hip plastic furniture'), + ('furni_bed_polyfon_name', 'Double Bed'), + ('gs_4teams', '4 Team Game'), + ('furni_sound_set_8_desc', 'Mellow electric grooves'), + ('ph_keys_jump', 'Jump:'), + ('reg_welcome', 'Welcome To Habbo Hotel!'), + ('purse_head', 'HABBO ACCOUNT ACTIVITY'), + ('nav_venue_bb_lobby_tournament_7_name', 'Competitie Battle Ball 8'), + ('reg_verification_newPasswordAgain', 'Retype new password:'), + ('furni_bardeskcorner_polyfon*8_desc', 'Yellow Mode Bardesk Corner'), + ('furni_sound_set_21_name', 'Rock 1'), + ('furni_gothic_stool*1_desc', 'The dark side of Habbo'), + ('furni_rope_divider_name', 'Rope Divider'), + ('poster_53_name', 'Hockey Stick'), + ('roomevent_default_desc', 'Event description..'), + ('nav_refresh_recoms', 'Refresh recommendations'), + ('nav_venue_sw_lobby_beginner_2_name', 'Snow Rookies Lobby'), + ('furni_divider_silo3*4_desc', 'Beige Area Gate'), + ('furni_divider_poly3*6_name', 'Blue Mode Bardesk Gate'), + ('reg_parentemail_title', 'Informing your parents'), + ('furni_gothgate_name', 'Gothic Portcullis'), + ('furni_mocchamaster_name', 'Mochamaster'), + ('modtool_message', 'Message:'), + ('furni_tree4_desc', 'Any presents under it yet?'), + ('furni_marquee*a_name', 'White Marquee'), + ('furni_queue_tile1*5_name', 'Knight Roller'), + ('furni_chair_polyfon_name', 'Dining Chair'), + ('furni_sleepingbag*9_name', 'Blue Sleeping Bag'), + ('furni_sound_set_9_name', 'Electronic 2'), + ('poster_39_desc', 'The rock masters of virtual music'), + ('furni_arabian_tetbl_desc', 'Serve up a treat'), + ('nav_venue_sw_lobby_free_9_name', 'Free Game Lobby'), + ('nav_venue_sw_arena_free_name(0)', 'Playing free for all game'), + ('furni_grand_piano*4_desc', 'Why is that key green?'), + ('furni_doorD_desc', 'Let\'s go over tzar!'), + ('purse_date', 'DATE'), + ('nav_venue_sw_lobby_beginner_6/0_desc', ''), + ('nav_venue_sw_lobby_beginner_4/0_desc', ''), + ('nav_venue_sw_lobby_intermediate_1_name', 'Snow Bombardiers Lobby'), + ('alert_reg_age', 'You are under 11 years old. Children under 11 can\'t enter Habbo Hotel.'), + ('nav_venue_bb_lobby_intermediate_9/0_desc', ''), + ('queue_set.c.alert', 'This room is for Habbo Club members only. In order to enter, you need to subscribe to Habbo Club.'), + ('sound_machine_confirm_clear_long', 'Are you sure you want to clear the current song?'), + ('furni_exe_drinks_name', 'Executive Drinks Tray'), + ('reg_bday_note', 'Please enter your correct date of birth, this is important! You\'ll need this information later on, if you want to change your password or e-mail.'), + ('modtool_roomalert', 'Room Alert'), + ('furni_rare_parasol*1_name', 'Yellow Parasol'), + ('furni_sound_set_18_name', 'Groove 4'), + ('sound_machine_window', 'Sound Machine Editor'), + ('furni_traffic_light*1_name', 'Classic Traffic Light'), + ('furni_chair_norja*4_desc', 'Sleek and chic for each cheek'), + ('furni_divider_nor1*2_desc', 'Black Ice corner'), + ('nav_venue_median_lobby_name', 'Median Lobby'), + ('furni_sofa_silo*3_desc', 'Cushioned, understated comfort'), + ('furni_bed_budget_desc', 'Comfortable, affordable!'), + ('furni_divider_nor4_name', 'Plain Iced Auto Shutter'), + ('furni_rare_icecream*6_desc', 'Virtual toffee rocks!'), + ('habboclub_txt1', 'You can buy Habbo Club one month at a time using Habbo Credits.'), + ('habboclub_txt3', 'Yes, I\'m over 14 years of age\\rOR\\rI\'m under 14 years of age and I have a permission from my parent/guardian to join Habbo Club.'), + ('furni_rare_dragonlamp*3_desc', 'Scary and scorching!'), + ('furni_noob_lamp*5_name', 'My first Habbo lamp'), + ('club_bottombar_text2', '(....)'), + ('furni_CFC_500_goldbar_name', 'Gold Bar (China)'), + ('club_bottombar_text1', 'Loading'), + ('furni_rare_elephant_statue*1_desc', 'Say hello to Nelly'), + ('furni_table_silo_med*7_name', 'Green Area Coffee Table'), + ('nav_venue_sw_lobby_free_1/0_desc', ''), + ('furni_bottle_desc', 'For interesting games!'), + ('furni_romantique_pianochair*2_desc', 'Let the music begin'), + ('furni_table_norja_med*2_name', 'Large Coffee Table Black'), + ('queue_set.e2.alert', 'This room is currently available only to Habbos participating to the event.'), + ('furni_solarium_norja_desc', 'Rejuvenate your pixels!'), + ('furni_table_plasto_square*14_desc', 'Hip plastic furniture'), + ('cam_save.help', 'Save & Print Photo'), + ('furni_sound_set_4_desc', 'Chilled out beats'), + ('furni_couch_norja*6_name', 'Blue Bench'), + ('poster_2003_desc', 'Would you trust this man?'), + ('hobba_cryforhelp', 'Call For Help:'), + ('furni_marquee*9_desc', 'It\'s both door and a shade!'), + ('nav_venue_bb_lobby_tournament_13/0_desc', ''), + ('poster_512_desc', 'The flag of Ireland'), + ('handitem12', 'Macchiato'), + ('object_displayer_hide_actions', 'Hide actions'), + ('furni_sound_set_25_name', 'Dance 1'), + ('handitem11', 'Mocha'), + ('handitem10', 'Latte'), + ('furni_sound_set_13_desc', 'Let Music be the food of Habbo'), + ('handitem16', 'Cappuccino'), + ('handitem15', 'Iced'), + ('handitem14', 'Filter'), + ('handitem13', 'Espresso'), + ('nav_venue_sw_lobby_free_2_name', 'Free Game Lobby'), + ('handitem19', 'Habbo Cola'), + ('nav_venue_sw_lobby_amateur_2/0_desc', ''), + ('handitem18', 'Tap'), + ('handitem17', 'Java'), + ('console_next_msg', 'Delete'), + ('furni_bardesk_polyfon*5_name', 'Candy Bar'), + ('furni_scifidoor*5_desc', 'There out of this world!'), + ('nav_roomispwprotected', 'The room is password protected.'), + ('furni_sleepingbag*2_name', 'Lime Sleeping Bag'), + ('furni_glass_table*6_name', 'Blue Glass Table'), + ('furni_divider_nor4*3_desc', 'Habbos, roll out!'), + ('furni_sound_set_61_name', 'Latin Love 3'), + ('nav_venue_pizza/0_desc', 'Pizza Palace'), + ('furni_romantique_clock_desc', ''), + ('furni_queue_tile1*0_desc', 'The power of movement'), + ('furni_pura_mdl2*9_desc', 'Any way you like it!'), + ('nav_venue_orient/0_name', 'Club Golden Dragon'), + ('furni_noob_table*1_desc', 'Lightweight, practical and orange'), + ('poster_22_desc', 'beautiful reproduction butterfly'), + ('furni_carpet_soft_name', 'Soft Wool Rug'), + ('Message', 'Message'), + ('furni_bed_trad_one_desc', 'All you need for a good night\'s kip'), + ('console_report_help', 'If the message you received was abusive or harassing, you can report it to the Moderators by clicking the Report button below. The Habbo will be removed from your Friends\' List automatically when you report. If you want to remove a Habbo from your Friends\' List without reporting their message, simply use the Remove button below.'), + ('furni_rcandle_desc', 'Xmas tea light'), + ('furni_sofa_silo*8_name', 'Yellow Two-Seater Sofa'), + ('furni_pura_mdl4*5_desc', ''), + ('NUF_mini_use_console_ready_tutor', 'You can now use the Console to find some of your friends, or you can continue the tutorial.'), + ('log_problem_link', 'Read FAQ\'s'), + ('furni_shelves_silo_name', 'Bookcase'), + ('gs_timetojoin', '\\x seconds to join'), + ('nav_venue_cunning_fox_gamehall/1_name', 'Gamehall Lobby'), + ('furni_safe_silo*7_name', 'Green Safe Minibar'), + ('NUF_mini_meet_people_hotelview_tutor', 'The Navigator lets you move between rooms in the Hotel. Open it up to get started!'), + ('purse_vouchers_sendbutton', 'Get Credits!'), + ('furni_gothic_sofa*4_name', 'Black Gothic Sofa'), + ('furni_wooden_screen*0_desc', 'Add an exotic touch to your room'), + ('catalog_give_trophymsg', 'You haven\'t engraved the trophy. Type \\ryour inscription in the grey box.'), + ('furni_prizetrophy5*3_name', 'Duo trophy'), + ('handitem23', 'Beetroot Habbo Soda'), + ('furni_rare_dragonlamp*8_name', 'Bronze Dragon Lamp'), + ('furni_divider_nor4*8_name', 'Yellow Iced Auto Shutter'), + ('handitem22', 'Lime Habbo Soda'), + ('furni_soft_sofa_norja*6_name', 'Blue Iced Sofa'), + ('handitem21', 'Hamburger'), + ('handitem20', 'Camera'), + ('furni_divider_nor1*9_desc', 'Red Ice corner'), + ('help_trouble', 'In Trouble?'), + ('handitem25', 'Love potion'), + ('handitem24', 'Bubble juice from 1999'), + ('furni_ham2_desc', 'Looks like you\'re too late!'), + ('nav_venue_bb_lobby_amateur_3_name', 'Gevorderden Battle Ball 4'), + ('furni_chair_plasto*15_name', 'Chair'), + ('furni_hyacinth1_desc', 'Beautiful bulb'), + ('furni_shelves_basic_desc', 'Pura series 404 shelves'), + ('furni_pura_mdl1*6_name', 'Blue Pura Module 1'), + ('nav_venue_cafe_gold/0_desc', 'Get the latest safety tips and tricks from Safety eXperts.'), + ('nav_venue_snowwar_lobby_name', 'Snow Storm Lobby'), + ('transaction_system_sms_slahti', 'Saunalahti'), + ('alert_tooLongPW', 'Your password is too long'), + ('furni_carpet_standard*5_desc', 'Available in a variety of colours'), + ('furni_deadduck_desc', 'Blood, but no guts'), + ('password.email.subject', 'Forgotten password'), + ('furni_prizetrophy2*3_desc', 'Breathtaking bronze'), + ('NUF_playing_games_hotelview_nav', 'Just click me to open the Navigator and get it over with...'), + ('furni_summer_chair*1_name', 'Aqua Deck Chair'), + ('furni_rubberchair*3_name', 'Orange Inflatable Chair'), + ('furni_exe_plant_desc', ''), + ('nav_venue_tearoom/0_desc', 'Chat with the people of Aoralia and meet a sprite or two!'), + ('nav_venue_sw_lobby_beginner_9/0_desc', ''), + ('furni_table_silo_med*6_name', 'Blue Area Coffee Table'), + ('nav_venue_sw_lobby_beginner_1/0_desc', ''), + ('furni_noob_stool*2_desc', 'Unfold me and take the weight off (dark blue)'), + ('camera_dialog_place', 'Move'), + ('furni_scifiport*8_desc', 'Energy beams. No trespassers!'), + ('url_peeloscore', 'http://%predefined%///groups/56555/id'), + ('console_follow_friend', 'Go to same room'), + ('sound_machine_alert_jukebox_list_full', 'The play list is full. Please wait until the current song has finished playing and try again.'), + ('poster_517_desc', 'Where\'s your kilt?'), + ('roomevent_type_11', 'Helpdesk'), + ('roomevent_type_10', 'Performance'), + ('furni_rare_dragonlamp*9_desc', 'Scary and scorching!'), + ('furni_pura_mdl2*3_name', 'Black Pura Module 2'), + ('url_help_1', 'http://%predefined%//credits'), + ('furni_edicehc_name', 'Dicemaster'), + ('furni_divider_silo1*8_name', 'Yellow Corner Shelf'), + ('furni_wooden_screen*5_desc', 'Add an exotic touch to your room'), + ('url_help_5', 'http://%predefined%/help/75'), + ('roomatic_intro2', 'Here\'s what one Habbo says about her room:'), + ('url_help_4', 'http://%predefined%//help/22'), + ('roomatic_intro1', 'You can decorate and furnish your room however you like and no one can tell you to tidy up or turn the music down. It\'s up to you if you let everyone in or just a chosen few, or lock the door and chill by yourself. Get creating and in a couple of minutes you\'ll have your own Habbo Hotel space.'), + ('url_help_3', 'http://%predefined%//help/'), + ('roomatic_intro3', 'My mates live miles away, but we can meet up in my room every Friday night and we don\'t have to worry about getting home afterwards.'), + ('url_help_2', 'http://%predefined%//profile?tab=4'), + ('furni_romantique_chair*5_name', 'Onyx Chair'), + ('url_help_6', 'http://www.habbohotel.co.uk/iot/go?lang=en&country=uk'), + ('furni_sound_set_20_name', 'SFX 2'), + ('furni_sofa_polyfon*4_desc', 'Beige Mode Sofa'), + ('sound_machine_alert_no_more_songs', 'Can\'t create new song! Traxmachine can have only %count% songs.'), + ('search', 'Search'), + ('room_preparing', '...Preparing room'), + ('nav_venue_bb_lobby_intermediate_0/0_desc', ''), + ('club_txt_renew2', 'You are Habbo Club member. If you want to change your subscription or leave the club, use the link below.'), + ('poster_1002_name', 'Queen Mum Poster'), + ('furni_barchair_silo*2_desc', 'Practical and convenient'), + ('reg_month', 'Month'), + ('club_txt_renew1', 'Your Habbo Club membership will be active for another %days% days. You can extend your membership by paying with Habbo Credits.'), + ('furni_rare_icecream*0_name', 'Cherry Ice Cream Machine'), + ('furni_sound_set_41_desc', 'Burning Riffs'), + ('nav_venue_beauty_salon_loreal_name', 'Beauty salon'), + ('poster_26_name', 'Angel Poster'), + ('furni_sound_set_19_name', 'Hip Hop Beats 4'), + ('furni_romantique_divan*4_name', 'Amber Chaise-Longue'), + ('furni_one_way_door*7_desc', 'One at a time!'), + ('sound_machine_confirm_eject_long', 'Are you sure you want to remove the Traxpack and it\'s samples from the song?'), + ('furni_glass_stool*8_desc', 'Translucent beauty'), + ('buddyremove_not_now', 'Cancel'), + ('no_user_for_gift', 'No user named %user% found. Gift not purchased.'), + ('buddyremove_lessoptions', 'Less Options <<'), + ('reg_legal_header1', 'Now you need to ask your parents/guardian to come to the computer. Read through the text (below) with your parents.'), + ('furni_carpet_soft*3_desc', 'Soft Wool Rug'), + ('reg_legal_header2', 'Read through the below text carefully. You must agree to the following terms before entering Habbo Hotel.'), + ('furni_sw_chest_name', 'sw_chest'), + ('nav_venue_sw_lobby_tournament_9_name', 'Tournament Lobby'), + ('messenger.email.footer', ''), + ('nav_venue_bb_arena_4_name', 'Battle Ball Expertit'), + ('club_change_url', 'http://%predefined%//credits/habboclub'), + ('furni_table_plasto_4leg*2_name', 'Occasional Table'), + ('ph_choosecolour', 'Choose Costume Colour'), + ('buddyremove_hc_more_info', 'More Info About Habbo Club >>'), + ('furni_romantique_smalltabl*1_desc', 'Every tray needs a table...'), + ('nav_venue_sw_lobby_tournament_8_name', 'Tournament Lobby'), + ('furni_divider_nor5_name', 'Plain Iced Angle'), + ('wallitem_roomdimmer_name', 'Mood Light'), + ('furni_bed_budget_one*5_name', 'Beige Pura Bed'), + ('furni_table_norja_med*9_name', 'Large Coffee Table Red'), + ('furni_pillow*3_desc', 'Puffy, soft and huge'), + ('furni_noob_rug*2_name', 'My first Habbo rug'), + ('nav_venue_sw_lobby_beginner_7_name', 'Snow Rookies Lobby'), + ('furni_exe_chair_desc', 'Relaxing leather comfort'), + ('furni_s_sound_machine*2_desc', 'Sound Machine Ocean Desc'), + ('nav_venue_dusty_lounge/0_desc', 'A dignified lounge for sitting back and enjoying a licorice pipe'), + ('game_bs_ship4', 'Destroyer(s)'), + ('game_bs_ship3', 'Cruiser(s)'), + ('game_bs_ship2', 'Battle Ship(s)'), + ('game_bs_ship1', 'An aircraft carrier'), + ('furni_table_plasto_bigsquare*4_name', 'Square Dining Table'), + ('openhrs_title', 'We are closing the hotel'), + ('furni_habbowood_chair_name', 'Director\'s Chair'), + ('roomatic_confirm', 'Confirm password:'), + ('poster_14_desc', 'A cunning painting'), + ('furni_doormat_plain*3_name', 'Doormat'), + ('furni_sound_set_3_desc', 'Chilled grooves'), + ('win_messenger', 'Habbo Console'), + ('summer_chair_7_name', 'Green Deck Chair'), + ('notickets_window_header', 'Tickets needed!'), + ('nav_updatenote', 'Updating your room properties may take a while. The changes have been made, but it\'ll take a few minutes until all Habbos can see them.'), + ('furni_table_plasto_bigsquare*5_name', 'Square Dining Table'), + ('url_purselink', 'http://%predefined%//credits?'), + ('console_follow_hotelview', 'Your friend is on the hotel view.'), + ('furni_solarium_norja*3_desc', 'Get the city look!'), + ('sound_machine_alert_song_name_missing', 'Please give your song a name.'), + ('furni_sound_machine*3_name', 'Green Traxmachine'), + ('jukebox_next_up', 'Next up:'), + ('trading_additems', 'Put items in boxes'), + ('furni_sporttrack3*1_name', 'Sport goal tartan'), + ('club_button_3_period', 'Buy 6 >>>'), + ('nav_delroom3', 'Room deleted!'), + ('nav_delroom2', 'Are you sure you want to delete this room? All the furniture left in it will also be deleted.'), + ('poster_34_name', 'Scamme\'d'), + ('go', 'Go >>'), + ('nav_delroom1', 'If you want to save the furniture in this room, move it to the giant hand before you continue.'), + ('console_habboprofile_arrowed', 'Habbo Profile >>'), + ('furni_chair_plasty*10_desc', 'Hip plastic furniture'), + ('cam_txtscreen.help', 'Caption'), + ('wallitem_item_placeholder_name', 'This furniture is downloading...'), + ('furni_carpet_standard*b_desc', 'Available in a variety of colours'), + ('poster_59_name', 'Torch'), + ('furni_chair_basic*4_name', 'White Pura Egg Chair'), + ('summer_chair_1_name', 'Aquamarine Deck Chair'), + ('nav_venue_space_cafe_name', 'Ten Forward'), + ('log_problem_url', 'http://%predefined%//help/faqs?faq_1_categoryId=14'), + ('group_homepage_url', 'http://%predefined%/groups/%groupid%/id'), + ('furni_heart_name', 'Giant Heart'), + ('nav_venue_sw_arena_beginner_name', 'Playing beginner game'), + ('furni_grunge_chair_name', 'Grunge Chair'), + ('nav_dooropens', 'Door opens! Go on in...'), + ('modtool_banuser', 'Ban User'), + ('furni_carpet_soft_tut_desc', 'Welcome, enjoy your stay!'), + ('furni_rare_mnstr_name', 'Venomus Habbolus'), + ('furni_divider_silo3*9_name', 'Red Area Gate'), + ('furni_pura_mdl3*1_name', 'Aqua Pura Module 3'), + ('Messages', 'Message(s)'), + ('wallitem_arabian_wndw_name', 'Arabian Window Frame'), + ('furni_prizetrophy3*1_desc', 'Glittery gold'), + ('furni_sound_set_47_desc', 'Storm the UKCharts!'), + ('poster_54_desc', 'whack that ball!'), + ('url_logout_concurrent', 'http://%predefined%//account/disconnected?reason=concurrentlogin&origin=popup'), + ('nav_venue_sw_lobby_beginner_1_name', 'Snow Rookies Lobby'), + ('furni_table_plasto_4leg*8_name', 'Occasional Table'), + ('sound_machine_turn_on', 'Switch On'), + ('furni_table_norja_med*4_desc', 'For larger gatherings'), + ('buddyremove_hc_info_url', 'http://www.habbo.co.uk/credits/habboclub'), + ('furni_romantique_divider*2_name', 'Green Screen'), + ('furni_pillar*5_desc', 'Find your natural roots'), + ('furni_table_silo_med_desc', 'Wipe clean and unobtrusive'), + ('furni_pillow*8_name', 'Navy Cord Pillow'), + ('room_owner', 'Owner:'), + ('furni_shelves_norja*5_name', 'Pink Bookcase'), + ('queue_set.d.info', 'There are %d% Habbos in front of you in the queue.'), + ('reg_retypepass', 'Retype Password:'), + ('furni_jp_tray3_name', 'jp_tray3'), + ('dance_stop', 'Stop Dancing'), + ('buddyremove_remove_text', 'You are about to remove %removeamount% friends from your friendlist.\\r\\r After removal, you\'ll have %amountleft% friends on your list:'), + ('nav_venue_bb_lobby_tournament_12_name', 'Competitie Battle Ball 13'), + ('furni_summer_chair*2_name', 'Deck Chair'), + ('furni_plant_valentinerose*1_desc', 'Secret admirer!'), + ('furni_sofachair_silo*4_name', 'Beige Area Armchair'), + ('poster_523_name', 'The flag of India'), + ('furni_scifirocket*4_name', 'Venus Smoke Machine'), + ('nav_venue_tearoom_name', 'Chinese Tea Room'), + ('furni_pura_mdl1*5_name', 'beige pura module 1'), + ('nav_venue_bb_lobby_tournament_0/0_desc', ''), + ('furni_chair_silo*5_desc', 'Pink Silo Dining Chair'), + ('club_txt_expired', 'Your Habbo Club membership has run out. You can join the club again by clicking the HC logo on the hotel view.\\rMembers of Habbo Club get priority access to the hotel (so you can always get in), exclusive clothes, hair colours, rare furni and special guest room layouts. To see exactly what you\'ll be able to get your hands on as a Habbo Club member, take a look in the Catalogue.'), + ('furni_glass_table*7_name', 'Green Glass Table'), + ('nav_prvrooms_notfound', 'Your search did not match any rooms'), + ('bb_title_BBscores2', 'Game over!'), + ('wallitem_gothicfountain_name', 'Gothic Ectoplasm Fountain'), + ('furni_one_way_door*1_desc', 'One at a time!'), + ('furni_chair_plasty*1_name', 'Plastic Pod Chair'), + ('furni_divider_nor3*9_name', 'Red Iced gate'), + ('sound_machine_time_2', '%min%:%sec%min'), + ('sound_machine_time_1', '%min%:%sec%min'), + ('furni_bardesk_polyfon*4_name', 'Beige Mode Bardesk'), + ('queue_set.queue_reset.alert', 'The queue for this room has been reset, please try again.'), + ('furni_jp_pillow_desc', 'Comfy and classical'), + ('nav_venue_sw_lobby_free_9/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('furni_barchair_silo*8_desc', 'Practical and convenient'), + ('delete_furniture', 'Delete Furniture (permanently)'), + ('furni_plant_bulrush_desc', 'Ideal for the riverside'), + ('poster_61_name', 'Siva Poster'), + ('furni_bed_silo_two_name', 'Double Bed'), + ('furni_plant_pineapple_desc', 'Needs loving glances'), + ('furni_bed_polyfon_girl_desc', 'Snuggle down in princess pink'), + ('furni_pillow*4_desc', 'Puffy, soft and huge'), + ('furni_table_norja_med*8_name', 'Large Coffee Table Yellow'), + ('transaction_system_tsms_win_tmobile', 'T-Mobile SMS'), + ('furni_scifidoor*10_desc', 'There out of this world!'), + ('furni_bed_polyfon*7_desc', 'Green Mode Double Bed'), + ('furni_toy1*2_desc', 'it\'s bouncy-tastic'), + ('transaction_system_sms_radiolinja', 'Elisa'), + ('furni_gothic_chair*4_name', 'Black Gothic Chair'), + ('furni_scifidoor*6_desc', 'Monolith goes up! Monolith goes down!'), + ('nav_venue_sw_lobby_free_3_name', 'Free Game Lobby'), + ('console_friend_request_not_found', 'There was an error finding the user for the friend request'), + ('furni_romantique_smalltabl*2_desc', 'Every tray needs a table...'), + ('furni_bed_budget*2_name', 'Pink Pura Double Bed'), + ('wallitem_post.it_name', 'Pad of stickies'), + ('gs_state_created', 'Waiting for players..'), + ('furni_divider_nor3*4_desc', 'Entrance or exit?'), + ('furni_sofa_polyfon_girl_desc', 'Romantic pink for two'), + ('locked', 'Locked (visitors have to ring bell)'), + ('alert_reg_birthday', 'Birthday'), + ('club_thanks_text', 'Here you can see your Habbo Club membership status, number of elapsed months, pre-ordered months and status of the ongoing month.'), + ('furni_sound_set_39_desc', 'Rock with a roll'), + ('nav_venue_old_skool/0_desc', 'A set of rooms inspired by the original and legendary Mobiles Disco, the progenitor of Habbo'), + ('poster_511_desc', 'The flag of The Netherlands'), + ('furni_couch_norja*7_name', 'Rural Iced Bench'), + ('furni_safe_silo*6_name', 'Blue Safe Minibar'), + ('furni_table_plasto_4leg*14_desc', 'Aqua table'), + ('room_sound_furni_limit', 'You can only place one sound furni per room'), + ('nav_venue_bb_lobby_beginner_15/0_desc', ''), + ('furni_glass_shelf_name', 'Glass shelf'), + ('furni_divider_nor2*6_desc', 'Blue Iced bar desk'), + ('furni_turkey_name', 'Roast Turkey'), + ('nav_venue_bb_lobby_tournament_16/0_desc', ''), + ('sw_timeleft', 'Time:'), + ('furni_rare_parasol_name', 'Parasol'), + ('furni_glass_sofa*7_desc', 'Habbo Club'), + ('furni_bardeskcorner_polyfon*13_name', 'Corner Cabinet/Desk'), + ('furni_rare_fan*9_name', 'Fucsia Powered Fan'), + ('furni_chair_plasto*4_desc', 'Hip plastic furniture'), + ('no', 'No'), + ('furni_rare_fan*4_desc', 'Fanning the fires of SUPERLOVE...'), + ('nav_venue_median_lobby/0_desc', 'A Mean place to hang'), + ('nav_venue_sw_lobby_intermediate_2/0_desc', ''), + ('furni_md_sofa_name', 'MD Sofa'), + ('furni_noob_lamp*1_desc', 'Get the light right where you want it (yellow)'), + ('login_connecting', 'Connecting...'), + ('furni_divider_nor1*3_desc', 'Looks squishy, but isn\'t!'), + ('furni_sound_set_14_desc', 'Rock them bodies'), + ('furni_sound_set_59_name', 'RnB Grooves 5'), + ('poster_21_desc', 'beautiful reproduction butterfly'), + ('wallitem_hc_wall_lamp_desc', 'Tres chic!'), + ('ok', 'OK'), + ('nav_venue_sw_lobby_tournament_1/0_desc', ''), + ('pet_happy', 'Happiness:'), + ('sound_machine_edit', 'Edit Song'), + ('furni_rare_elephant_statue*2_desc', 'Say hello to Nelly'), + ('furni_CFC_200_moneybag_desc', 'Worth 200 Credits'), + ('nav_venue_bb_lobby_intermediate_6/0_desc', ''), + ('console_buddylimit_requester', 'Friend could not be added. The request sender can not have anymore friends.'), + ('furni_sofa_silo*2_desc', 'Cushioned, understated comfort'), + ('sound_machine_alert_invalid_song_name', 'You have already burned another song with the same name. Please change the song name before trying again.'), + ('furni_fireplace_armas_name', 'Fireplace'), + ('furni_barchair_silo*3_desc', 'Practical and convenient'), + ('ph_ticket', 'Ticket'), + ('furni_arabian_divdr_desc', 'Carved Cedar Divider'), + ('wallitem_jp_ninjastars_desc', 'Not a frisbee'), + ('wallitem_hrella_poster_1_desc', 'Brighten up your cabin'), + ('furni_noob_stool*3_desc', 'Unfold me and take the weight off (aubergine)'), + ('furni_pura_mdl5*9_name', 'Red Pura Module 5'), + ('furni_divider_nor4*2_desc', 'Habbos, roll out!'), + ('NUF_mini_meet_people_roomlist_tutor', 'Click \'Open\' to open up a category and see what rooms are within. When you have found an interesting room, press \'Go\' to visit it.'), + ('poster_41_name', 'Habbo Golden Record'), + ('furni_jp_tray4_desc', 'jp_tray4'), + ('buddyremove_confirm', 'Yeah, it is done...'), + ('tutorial_topic_list_F', 'Choose a topic from the list below:'), + ('purse_time', 'TIME'), + ('nav_venue_sw_lobby_free_8_name', 'Free Game Lobby'), + ('tutorial_topic_list_M', 'Choose a topic from the list below:'), + ('furni_s_sound_machine*7_name', 'Sound Machine Red'), + ('interface_icon_navigator', 'Navigator, navigate around'), + ('furni_xmas_cstl_wall_name', 'Ice Castle Wall'), + ('nav_own_hd', 'Your Rooms.'), + ('modtool_aa_checkbox_text', 'Audio alert'), + ('wallitem_industrialfan_desc', 'Powerful and resilient'), + ('furni_bed_budget*8_desc', 'King sized comfort!'), + ('sound_machine_burn', 'Burn Song'), + ('nav_venue_sw_lobby_intermediate_0_name', 'Snow Bombardiers Lobby'), + ('nav_venue_bb_lobby_beginner_1_name', 'Beginners Battle Ball 2'), + ('furni_chair_basic*5_desc', ''), + ('password.email.prefix', 'Your password is:'), + ('furni_pura_mdl5*4_desc', 'Any way you like it!'), + ('furni_table_norja_med*3_name', 'White Iced Table'), + ('furni_pura_mdl3*2_desc', 'Any way you like it!'), + ('nav_venue_sw_lobby_tournament_3_name', 'Tournament Lobby'), + ('furni_sound_set_34_desc', 'For guitar heroes'), + ('furni_summer_grill*1_desc', 'Plenty of ribs on that barbie'), + ('hubu_t4_1', 'Anna palautetta Hubusta'), + ('furni_divider_nor1*8_desc', 'Yellow Ice corner'), + ('hubu_t4_2', 'Tsekkaa heebelin jorinat'), + ('poll_offer_title', 'Poll'), + ('summer_chair_2_desc', 'Leave your towel early'), + ('wallitem_habbowheel_name', 'The Wheel of Destiny!'), + ('reg_mission', 'Your Mission:'), + ('furni_sofa_polyfon*9_name', 'Red Two-seater Sofa'), + ('furni_bed_budget_one_desc', 'aquamarine'), + ('nav_venue_sw_lobby_tournament_7/0_desc', ''), + ('furni_gothic_sofa*3_name', 'Gothic Sofa Red'), + ('furni_chair_plasto*9_name', 'Chair'), + ('nav_venue_sw_arena_beginner_name(0)', 'Playing beginner game'), + ('notickets_text_2', 'Buy more tickets now and get a discount. You can also buy tickets as a present.'), + ('wallitem_sw_hole_desc', 'sw_hole'), + ('furni_plant_big_cactus_name', 'Mature Cactus'), + ('notickets_text_1', 'Game price is 1 credit. For that you get 2 tickets.'), + ('poster_19_name', 'Hole In The Wall'), + ('furni_divider_nor4*7_name', 'Rural Iced Shutter'), + ('email', ''), + ('furni_sound_set_13_name', 'Dance 5'), + ('furni_present_gen1_name', 'Gift'), + ('nav_venue_bb_lobby_tournament_19/0_desc', ''), + ('furni_chair_norja_desc', 'Sleek and chic for each cheek'), + ('furni_marquee*9_name', 'Green Marquee'), + ('sound_machine_alert_song_locked', 'The song you\'re editing can\'t be modified. Please save the song under another name to create a new copy.'), + ('furni_glass_stool*2_name', 'Glass stool'), + ('nav_venue_theatredrome_xmas/0_desc', ''), + ('poster_5_name', 'Duck Poster'), + ('furni_prize2_desc', 'Nice and shiny'), + ('furni_valeduck_desc', 'He\'s lovestruck'), + ('furni_chair_plasty*7_desc', 'Hip plastic furniture'), + ('closed', 'Closed'), + ('furni_wcandleset_name', 'White Candle Plate'), + ('furni_sleepingbag*3_name', 'Ocean Sleeping Bag'), + ('furni_tree3_name', 'Christmas Tree 1'), + ('furni_sound_set_26_name', 'Groove 1'), + ('furni_barrier*2_desc', 'No trespassing, please!'), + ('game_bs_turn1', 'Your Turn'), + ('nav_venue_bb_lobby_expert_desc', 'Expert battle ball!'), + ('alert_donate_topic', 'SCAM ALERT!'), + ('game_bs_turn2', 'The Enemy\'s Turn'), + ('furni_sand_cstl_gate_name', 'sand castle gate'), + ('furni_rare_dragonlamp*4_desc', 'Scary and scorching!'), + ('furni_camera_desc', 'Smile!'), + ('pet.hotwords.lie', 'lie down'), + ('furni_sound_set_60_name', 'Latin Love 2'), + ('console_accept_selected', 'Accept'), + ('furni_divider_silo1*3_desc', 'Neat and natty'), + ('furni_summer_chair*7_name', 'Green Deck Chair'), + ('furni_pumpkin_desc', 'Cast a spooky glow'), + ('reg_habboname_note', 'Now it\'s time to make your own Habbo character! To make your own Habbo, please start by choosing your Habbo Name.'), + ('furni_rare_icecream_campaign_name', 'Rare icecream white'), + ('furni_doormat_plain_desc', 'Available in a variety of colours'), + ('room_areYouSure', 'Are you sure you want to delete this item forever?'), + ('sound_machine_confirm_burn', 'Burn this song?'), + ('predefined_room_name', '%user_name%\'s room'), + ('furni_divider_silo1*2_name', 'Black Corner Shelf'), + ('furni_table_plasto_4leg*3_desc', 'Hip plastic furniture'), + ('furni_solarium_norja*8_name', 'Yellow Solarium'), + ('furni_exe_globe_desc', 'The power is yours!'), + ('furni_bed_polyfon*6_name', 'Blue Mode Double Bed'), + ('notickets_store_link', 'Go to ticket store >>>'), + ('NUF_habbo_home', 'Habbo Home'), + ('nav_venue_the_den_name', 'The Den'), + ('furni_table_plasto_square*2_name', 'Round Dining Table'), + ('modtool_header', 'The Tool'), + ('pet_enrg_7', 'Energetic'), + ('nav_noanswer', 'No answer'), + ('roommatic_hc_members_only', 'This Room Is For HC Members Only'), + ('furni_xmasduck_desc', 'A right Christmas quacker!'), + ('pet_enrg_8', 'Lively'), + ('NUF_getting_room_own_rooms_tutor', 'Click the \'Create own room\' button to start building your room. Don\'t worry, making your room is completely free.'), + ('pet_enrg_5', 'Sprightly'), + ('pet_enrg_6', 'Active'), + ('furni_doormat_plain*4_desc', 'Available in a variety of colours'), + ('pet_enrg_3', 'Lazy'), + ('pet_enrg_4', 'Relaxed'), + ('furni_divider_poly3*6_desc', 'Blue Mode Bardesk Gate'), + ('pet_enrg_1', 'Slow'), + ('furni_glass_table*2_desc', 'Translucent beauty'), + ('pet_enrg_2', 'Sluggish'), + ('poster_1003_desc', 'get the lovely isles on your walls'), + ('furni_hc_djset_name', 'The Grammophon'), + ('pet_enrg_9', 'Tireless'), + ('furni_table_plasto_round*6_name', 'Round Dining Table'), + ('furni_sporttrack2*3_name', 'Sport corner grass'), + ('furni_footylamp_name', 'Football Lamp'), + ('furni_bed_silo_one_desc', 'Plain and simple'), + ('pet_enrg_0', 'Tired'), + ('furni_soft_sofachair_norja*7_name', 'Rural Iced Sofachair'), + ('furni_solarium_norja*9_desc', 'Rejuvenate your pixels!'), + ('furni_pillow*9_desc', 'Puffy, soft and VERY fluffy!'), + ('furni_plant_mazegate_snow_desc', 'There\'s snow way through!'), + ('furni_sound_set_8_name', 'Ambient 2'), + ('furni_divider_silo3*4_name', 'Beige Area Gate'), + ('previous', 'Previous'), + ('furni_glass_stool*3_desc', 'Translucent beauty'), + ('furni_bardeskcorner_polyfon*8_name', 'Yellow Mode Bardesk Corner'), + ('next_onearrowed', 'Next >'), + ('nav_venue_sw_lobby_expert_desc', 'For the William Tells and Robin Hoods of Snow Storming.'), + ('furni_bardeskcorner_polyfon*2_name', 'Black Mode Bardesk Corner'), + ('catalog_pet_unacceptable', 'Sorry, that name is unacceptable to Hotel Management'), + ('furni_sound_set_46_name', 'Club 1'), + ('nav_error_room_full', 'The room is full.'), + ('furni_queue_tile1*4_name', 'Gold Habbo Roller'), + ('furni_mocchamaster_desc', 'Wake up and smell it!'), + ('furni_gothic_stool*1_name', 'Gothic Stool Pink'), + ('furni_noob_chair*5_name', 'My first Habbo chair'), + ('furni_noob_rug*3_desc', 'Nice and neat sisal rug with aubergine edging'), + ('nav_venue_club_mammoth/0_name', 'Club Mammoth'), + ('pet_race_1_024', 'Cat Burglar'), + ('pet_race_1_022', 'Matted Moggy'), + ('poster_39_name', 'Screaming Furnies'), + ('pet_race_1_023', 'Indoor Alley Cat'), + ('furni_prizetrophy5*3_desc', 'Breathtaking bronze'), + ('pet_race_1_020', 'Caterwaul Kitty'), + ('NUF_mini_meet_people_room_tutor', 'The people wandering around are Habbos just like you.\\nClick on one of them to learn more about them- or on yourself to look in the mirror.'), + ('pet_race_1_021', 'Fabulous Feline'), + ('furni_arabian_tetbl_name', 'Hexagonal Tea Table'), + ('furni_grand_piano*4_name', 'Amber Grand Piano'), + ('poster_504_desc', 'The German flag'), + ('roomatic_name', 'Room name:'), + ('furni_sound_set_21_desc', 'Headbanging riffs'), + ('credit_redeem_info', 'More info about credit furni >>'), + ('furni_marquee*a_desc', 'It\'s both door and a shade!'), + ('furni_sound_set_33_name', 'Rock 3'), + ('furni_queue_tile1*5_desc', 'The power of movement'), + ('furni_doorD_name', 'Imperial Teleport'), + ('furni_rare_parasol*1_desc', 'Block those rays!'), + ('purse_youhave', 'You Have'), + ('nav_fullbutton', 'Full'), + ('furni_rare_fountain*2_desc', 'For our feathered friends'), + ('friend_request_accepted', 'Accepted!'), + ('tutorial_help_button_bubble', 'Click the blue question mark to open up the help menu to restart the tutorial.'), + ('furni_rubberchair*4_desc', 'Soft and tearproof!'), + ('furni_sound_set_9_desc', 'Mystical ambient soundscapes'), + ('furni_rare_fan*3_name', 'Purple Dragon Skin Fan'), + ('furni_table_plasto_square*8_desc', 'Hip plastic furniture'), + ('gs_choose_gametime', 'Choose Game duration:'), + ('furni_traffic_light*1_desc', 'Chill and wait your turn!'), + ('furni_sofachair_polyfon*6_desc', 'Blue Mode Armchair'), + ('furni_chair_norja*4_name', 'Urban Iced Chair'), + ('furni_val_teddy*2_name', 'Pink Share Bear'), + ('nav_venue_chill/0_name', 'Zen Garden'), + ('furni_table_plasto_square_name', 'Occasional Table'), + ('furni_bed_budget_name', 'Pura Bed'), + ('furni_solarium_norja_name', 'White Solarium'), + ('furni_noob_table*1_name', 'My first Habbo table'), + ('gs_5min', '5min'), + ('purse_credits', 'You have \\x1 Habbo Credit(s) in your purse.'), + ('furni_divider_poly3*5_name', 'Candy Hatch (Lockable)'), + ('furni_rare_icecream*6_name', 'Toffee Ice Cream Machine'), + ('furni_table_polyfon_med_name', 'Large Coffee Table'), + ('console_deselect_all', 'Deselect all'), + ('nav_venue_bb_lobby_amateur_8_name', 'Gevorderden Battle Ball 9'), + ('transaction_system_sms_win_kpn', 'KPN SMS'), + ('nav_venue_bb_lobby_intermediate_3/0_desc', ''), + ('furni_CFC_500_goldbar_desc', 'Worth 500 Credits'), + ('NUF_visiting_rooms', 'Visiting other players\' rooms'), + ('url_logout_timeout', 'http://%predefined%//account/disconnected?reason=logout'), + ('furni_table_silo_med*7_desc', 'Green Area Coffee Table'), + ('player_commands_no_args', 'You have not supplied any arguments!'), + ('furni_romantique_pianochair*2_name', 'Lime Romantique Piano Chair'), + ('pickup', 'Pick up'), + ('reg_tutorial_url', ''), + ('habboclub_confirm_body', 'You have %credits% credits'), + ('nav_venue_bb_lobby_beginner_12/0_desc', ''), + ('furni_rare_elephant_statue*1_name', 'Silver Elephant'), + ('help', 'Habbo Help'), + ('furni_soft_sofachair_norja*2_desc', 'Black Iced Sofachair'), + ('furni_table_plasto_round*1_desc', 'Hip plastic furniture'), + ('furni_sleepingbag*9_desc', 'Ultimate coziness'), + ('furni_arabian_tray2_desc', 'For those Arabian nights'), + ('NUF_visiting_rooms_hotelview_tutor', 'Hello. This time we are learning how to visit another user\'s room.'), + ('furni_traffic_light*6_name', 'Red Traffic Light'), + ('Alert_ChooseWhoToSentMessage', 'Please choose who to\\rsend your message to'), + ('poster_47_desc', 'Twinkle, twinkle'), + ('bb_title_finalScores', 'Final standings:'), + ('jukebox_song_author', 'by: %author%'), + ('poster_2003_name', 'Dodgy Geezer'), + ('poster_509_name', 'The Jamaican flag'), + ('poster_6_desc', 'But is it the right way up?'), + ('furni_toy1*1_name', 'Rubber Ball'), + ('nav_venue_bb_lobby_beginner_13_name', 'Beginners Battle Ball 14'), + ('furni_scifidoor*5_name', 'White Spaceship Door'), + ('credit_redeem_text', 'You are going to change Furni to %value% credits.'), + ('nav_venue_sw_lobby_amateur_0_name', 'Snow Slingers Lobby'), + ('club_txt_intro', 'Welcome to Habbo Club - the members only club that all the best Habbos belong to!\\r\\rMembers of Habbo Club get priority access to the hotel (so you can always get in), exclusive clothes, hair colours, rare furni and special guest room layouts. To see exactly what you\'ll be able to get your hands on as a Habbo Club member, take a look in the Catalogue.'), + ('nav_venue_bouncer_room_1_name', 'Beginners Battle Ball Arena'), + ('update_email_suggest', 'Habbo Hotel security supervisor requests you to update your email'), + ('furni_rare_dragonlamp*3_name', 'Silver Dragon Lamp'), + ('furni_scifiport*2_name', 'Blue Laser Gate'), + ('club_button_extend', 'Extend Membership'), + ('wallitem_val_heart_name', 'Heart Light'), + ('furni_pura_mdl3*7_name', 'Green Pura Module 3'), + ('furni_sound_set_61_desc', 'Straight from the heart'), + ('nav_venue_bb_lobby_expert_9/0_desc', ''), + ('furni_pura_mdl2*9_name', 'Red Pura Module 2'), + ('furni_hal_cauldron_name', 'Habboween Cauldron'), + ('furni_divider_nor1*2_name', 'Black Ice corner'), + ('send', 'Send'), + ('furni_couch_norja_desc', 'Two can perch comfortably'), + ('furni_pura_mdl4*5_name', 'beige pura module 4'), + ('pet_race_1_008', 'Mad Mouser'), + ('pet_race_1_009', 'Scaredy Kat'), + ('pet_race_1_006', 'Titchy Tiger'), + ('pet_race_1_007', 'Burmese Buddy'), + ('pet_race_1_004', 'Soft-Toed Sneaker'), + ('furni_divider_nor4*8_desc', 'Habbos, roll out!'), + ('furni_tile_desc', 'In a choice of colours'), + ('pet_race_1_005', 'Cat Astroflea'), + ('pet_race_1_002', 'Lesser Spotted Longhair'), + ('pet_race_1_003', 'Hidden Clause'), + ('pet_race_1_000', 'Sleepy Siamese'), + ('pet_race_1_001', 'Purr-Sian'), + ('furni_sound_set_53_name', 'Snowy Surprise'), + ('furni_rare_icecream*1_desc', 'Virtual blueberry rocks!'), + ('furni_table_plasto_round*15_name', 'Occasional Table'), + ('security', 'Security'), + ('furni_glass_chair*5_name', 'Glass chair'), + ('nav_venue_cunning_fox_gamehall/1_desc', 'It\'s one-on-one for five in a row'), + ('nav_venue_sw_lobby_tournament_4/0_desc', ''), + ('furni_carpet_soft_desc', 'Soft Wool Rug'), + ('poster_27_desc', 'Deck the halls!'), + ('furni_safe_silo*7_desc', 'Totally shatter-proof!'), + ('furni_table_silo_small*5_desc', 'Pink Area Occasional Table'), + ('furni_marquee*4_desc', 'It\'s both door and a shade!'), + ('furni_gothic_sofa*4_desc', 'Ghosts and Ghouls'), + ('furni_prizetrophy6*1_desc', 'Glittery gold'), + ('pet_race_1_019', 'Bobcat Wailer'), + ('furni_bardesk_polyfon*5_desc', 'For cute constructions'), + ('furni_carpet_polar*2_name', 'Blue Bear Rug'), + ('pet_race_1_017', 'Furry Friend'), + ('furni_soft_sofa_norja*6_desc', 'Blue Iced Sofa'), + ('furni_pura_mdl2*4_desc', 'Any way you like it!'), + ('pet_race_1_018', 'Trusting Tabby'), + ('pet_race_1_015', 'Haughty House Pet'), + ('chatlog.url', 'https://theallseeingeye.sulake.com/ase/habbo/uk/housekeeping/extra/hobba/chatlog.action?chatId='), + ('furni_ham2_name', 'Eaten Ham'), + ('pet_race_1_016', 'Curiousity - The Return!'), + ('pet_race_1_013', 'Felis Catus Allergicus'), + ('pet_race_1_014', 'Bushy Bobtail'), + ('pet_race_1_011', 'Egyptian Angora'), + ('pet_race_1_012', 'Freckled Feral'), + ('gs_choose_gamefield', 'Choose Game Arena:'), + ('furni_divider_nor5*6_desc', 'Cool cornering for your crib y0!'), + ('furni_summer_pool*2_name', 'Red Summer Pool'), + ('pet_race_1_010', 'Wannabe Wildcat'), + ('furni_rare_elephant_statue_desc', 'Say hello to Nelly'), + ('furni_sofa_silo*8_desc', 'Cushioned, understated comfort'), + ('furni_exe_rug_desc', 'Please remove your shoes!'), + ('NUF_meeting_people_roomlist_tutor', 'Let\'s visit one of the rooms and find out how to meet other users.'), + ('furni_chair_plasto*15_desc', 'Hip plastic furniture'), + ('nav_venue_habburger\'s_name', 'Habburgers'), + ('queue_current_2', 'You are in queue for the room.'), + ('queue_current_1', 'You are in Habbo Live queue...'), + ('furni_pura_mdl5*3_name', 'Black Pura Module 5'), + ('furni_hockey_score_name', 'Scoreboard'), + ('furni_sofachair_silo*5_desc', 'Pink Area Armchair'), + ('furni_hyacinth1_name', 'Pink Hyacinth'), + ('furni_pura_mdl1*6_desc', 'Any way you like it!'), + ('camera_open_dialog_heading', 'Camera'), + ('furni_prizetrophy5*2_name', 'Duo trophy'), + ('furni_glass_chair_desc', 'Translucent beauty'), + ('furni_rubberchair*3_desc', 'Soft and tearproof!'), + ('furni_exe_plant_name', 'Executive Plant'), + ('furni_pura_mdl2*3_desc', 'Any way you like it!'), + ('furni_pura_mdl1*2_name', 'Pink Pura Module 1'), + ('furni_plant_bonsai_desc', 'You can be sure it lives'), + ('furni_plant_valentinerose*4_desc', 'Be mine!'), + ('wallitem_hrella_poster_3_desc', 'Don\'t drift away!'), + ('furni_deadduck_name', 'Dead Duck'), + ('furni_summer_grill*3_desc', 'Plenty of steak on that barbie'), + ('modtool_extrainfo', 'Extra Info:'), + ('sound_machine_jukebox_window', 'Jukebox'), + ('gs_button_start', 'Start Game!'), + ('nav_venue_sw_lobby_beginner_5/0_desc', ''), + ('furni_romantique_chair*5_desc', 'What does this button do?'), + ('furni_table_plasto_4leg*9_desc', 'Hip plastic furniture'), + ('furni_soft_sofa_norja_desc', 'A soft iced sofa'), + ('furni_divider_nor4*9_name', 'Red Iced Auto Shutter'), + ('login_haventGotHabbo', 'Haven\'t got a Habbo yet?'), + ('furni_noob_stool*2_name', 'My first Habbo stool'), + ('furni_s_sound_machine*5_desc', 'Sound Machine Brown Desc'), + ('credit_redeem_window', 'Redeem credit furni'), + ('send_invitation_text', 'Want to meet someone from our Welcoming Party?'), + ('purse_vouchers_exitbutton', 'Cancel'), + ('furni_prizetrophy6*3_desc', 'Breathtaking bronze'), + ('nav_venue_cafe_gold/0_name', 'Kultakahvila'), + ('furni_fortune_name', 'Crystal Ball'), + ('poster_22_name', 'Butterfly Cabinet (blue)'), + ('object_displayer_link_badge', 'Edit Badge'), + ('furni_sound_set_15_name', 'RnB Grooves 6'), + ('Alert_NoNameSet', 'Check your Habbo name.'), + ('furni_hc_crpt_name', 'Persian Carpet'), + ('error_ok', 'OK->'), + ('game_chess_email', 'Receive game via email'), + ('sound_machine_confirm_save_list', 'Save playlist?'), + ('furni_noob_rug*2_desc', 'Nice and neat sisal rug with blue edging'), + ('queue_set.e1.alert', 'This room is currently available only to Habbos participating to the event.'), + ('furni_rare_icecream*0_desc', 'Virtual cherry rocks!'), + ('furni_arabian_chair_name', 'Green Blossom Chair'), + ('furni_divider_silo3*6_name', 'Blue Area Gate'), + ('furni_scifiport*4_desc', 'Energy beams. No trespassers!'), + ('furni_sofa_silo*4_desc', 'Beige Area Sofa'), + ('furni_one_way_door*4_desc', 'One at a time!'), + ('furni_chair_norja*5_desc', 'Sleek and chic for each cheek'), + ('furni_sound_set_19_desc', 'Shake your body!'), + ('poster_26_desc', 'See that halo gleam!'), + ('furni_doormat_plain*2_desc', 'Available in a variety of colours'), + ('furni_romantique_chair*1_name', 'Rose Quartz Chair'), + ('furni_hc_tv_name', 'Mega TV Set'), + ('pet.hotwords.follow_me', 'heel'), + ('furni_petfood3_desc', 'Fantastic 20% Saving!'), + ('furni_couch_norja*5_name', 'Pink Bench'), + ('furni_table_plasto_round*7_desc', 'Hip plastic furniture'), + ('furni_bed_armas_two_desc', 'King-sized pine comfort'), + ('modtool_days', 'Days'), + ('furni_one_way_door*7_name', 'Green One Way Gate'), + ('furni_table_norja_med*5_name', 'Large Coffee Table Pink'), + ('furni_sand_cstl_wall_name', 'sand_cstl_wall'), + ('nav_modify_doorstatus_givepw', 'Password for the room'), + ('NUF_getting_items_room_tutor', 'Nice room. Reminds me of a chic Parisian cafe in Slough. Open the Catalogue.'), + ('habbo_hand_prev', '<<<'), + ('pet.saying.generic.croco.3', 'Tick tock tick....'), + ('invitation_follow_failed', 'Sorry, your attempt to follow an invitation failed.'), + ('furni_sound_set_12_desc', 'Unusual as Standard'), + ('pet.saying.generic.croco.1', '*Mellow*'), + ('error_text', 'Error occured, press \'OK\' to restart program.\\r\\rPlease report bugs to:\\rwww.habbohotel.com/habbo/en/help/contact/bugs/ \\rSorry for the inconvenience.'), + ('pet.saying.generic.croco.2', 'I\'m so hungry I could eat you!'), + ('furni_divider_silo3*3_desc', 'Form following function'), + ('furni_table_plasto_4leg*2_desc', 'Hip plastic furniture'), + ('int_newmessages', 'New Message(s)'), + ('furni_rare_icecream*3_name', 'Blackcurrant Ice Cream Machine'), + ('bb_header_gameinfo', 'Game info'), + ('furni_scifiport*0_name', 'Red Laser Door'), + ('nav_venue_bb_lobby_beginner_7_name', 'Beginners Battle Ball 8'), + ('tx_history.description.bank_wallie', 'Wallie-card'), + ('nav_venue_hallway_name', 'Hallway'), + ('nav_venue_bb_lobby_amateur_11/0_desc', ''), + ('furni_bed_budget_one*5_desc', 'Prince sized comfort!'), + ('pet.saying.generic.croco.0', 'Rrrr....Grrrrrg....'), + ('nav_popup_go', '>>'), + ('furni_safe_silo*3_name', 'White Safe Minibar'), + ('furni_table_silo_small_name', 'Occasional Table'), + ('poll_confirm_window', 'Leave our poll'), + ('furni_table_norja_med*9_desc', 'For larger gatherings'), + ('furni_divider_nor4*6_desc', 'Habbos, roll out!'), + ('gs_3teams', '3 Teams Game'), + ('wallitem_post.it.limit', 'Only 50 stickies per room are allowed!'), + ('furni_scifidoor*4_desc', 'Protect your pot of gold!'), + ('furni_bed_polyfon_one*9_name', 'Red Single Bed'), + ('furni_soft_sofa_norja*2_desc', 'Black Iced Sofa'), + ('furni_corner_china_desc', 'Firm, fireproof foundation'), + ('hobba_pickup_go', 'Pick Up & Go!'), + ('furni_sporttrack3*2_desc', 'null'), + ('furni_rare_fan*6_name', 'Ochre Powered Fan'), + ('furni_sound_set_3_name', 'Electronic 1'), + ('NUF_mini_meet_people_user_tutor', 'Here you can chat to users directly. Ask a Habbo to be your friend by clicking on their Habbo and the button.\\nIf this is your first time, check your Hand to see a present to decorate your own room with, later.'), + ('furni_pura_mdl2*6_name', 'Blue Pura Module 2'), + ('furni_couch_norja*9_desc', 'Two can perch comfortably'), + ('furni_chair_plasty*9_desc', 'Hip plastic furniture'), + ('game_chess_white', 'White:'), + ('nav_venue_sw_lobby_intermediate_3/0_desc', 'Lumisota sen kuin vain kovenee.'), + ('furni_table_plasto_square*3_desc', 'Hip plastic furniture'), + ('nav_venue_theatredrome/0_desc', 'Perform your latest masterpiece!'), + ('nav_venue_the_den/0_desc', 'Has anyone seen my map?'), + ('furni_sound_set_40_name', 'Rock 4'), + ('remove', 'Remove'), + ('friend_request_decline_all', 'Decline all requests.'), + ('furni_rare_globe_name', 'Snow Globe'), + ('furni_bardesk_polyfon*8_name', 'Yellow Mode Bardesk'), + ('nav_venue_sw_lobby_free_6_name', 'Free Game Lobby'), + ('queue_change', 'Change queue'), + ('reg_parentemail_link_text2', 'Privacy Pledge'), + ('furni_rare_parasol*2_desc', 'Block those rays!'), + ('furni_romantique_pianochair*3_desc', 'null'), + ('reg_parentemail_link_text1', 'See the letter'), + ('sound_machine_list_save', 'Save Playlist'), + ('nav_public_helptext_hd', 'Public Spaces'), + ('furni_chair_plasty*2_desc', 'Hip plastic furniture'), + ('spectator_count', 'spectators %cnt%/%max%'), + ('reg_welcome2', 'Create Your Own Habbo'), + ('wallitem_roomdimmer_desc', 'Superior lighting for your room'), + ('furni_prizetrophy*3_name', 'Classic trophy'), + ('furni_plant_rose_name', 'Cut Roses'), + ('reg_welcome3', 'Now the fun begins! All you need to do is register and you\'re ready to start. It won\'t take long!\\rYou can change everything except your name and date of birth later. Come on!'), + ('furni_noob_table*5_name', 'My first Habbo table'), + ('nav_error_room_closed', 'The room is closed.'), + ('reg_changePassword', 'Change your password'), + ('furni_divider_nor5*3_desc', 'Cool cornering for your crib y0!'), + ('furni_doorC_name', 'Portaloo'), + ('furni_chair_plasty*10_name', 'Plastic Pod Chair'), + ('furni_pura_mdl1*9_name', 'Red Pura Module 1'), + ('furni_rare_stand_name', 'Speaker\'s Corner'), + ('furni_grunge_table_name', 'Grunge Table'), + ('furni_traffic_light*2_name', 'Blue Traffic Light'), + ('pet.saying.angry.croco.2', 'You have displeased me.'), + ('human_trading', 'Trading'), + ('furni_noob_stool*6_desc', 'Unfold me and take the weight off (green)'), + ('pet.saying.angry.croco.1', 'Rawwwr...rrr'), + ('nav_venue_sw_lobby_intermediate_5_name', 'Snow Bombardiers Lobby'), + ('gs_button_leavegame', 'Leave Game'), + ('pet.saying.angry.croco.0', 'Grrrrr...rrr'), + ('furni_s_sound_machine*1_name', 'Sound Machine Grey'), + ('pet.saying.angry.croco.4', 'Buuuuurrr..rrrrr'), + ('furni_chair_plasto*7_desc', 'Hip plastic furniture'), + ('pet.saying.angry.croco.3', 'Rowrrrr...rrrr'), + ('furni_soft_sofa_norja*9_desc', 'Red Iced Sofa'), + ('nav_venue_skylight_lobby_name', 'Skylight Lobby'), + ('furni_bed_polyfon_one*6_desc', 'Blue Mode Single Bed'), + ('furni_pillow*8_desc', 'Puffy, soft and huge'), + ('furni_hc_rntgn_name', 'X-Ray Divider'), + ('furni_table_silo_med*5_desc', 'Pink Area Coffee Table'), + ('furni_gothic_stool*2_desc', 'Be seated please..'), + ('furni_typingmachine_desc', 'Write that bestseller'), + ('furni_fridge_desc', 'Keep cool with a chilled snack or drink'), + ('nav_venue_cunning_fox_gamehall/4_desc', 'Get a hand like a foot? Keep a straight face and bluff it out'), + ('doorbell_rings', 'Rings the doorbell - Open the door?'), + ('furni_divider_silo1*9_desc', 'Red Area Small Table'), + ('nav_venue_bb_lobby_intermediate_7/0_desc', ''), + ('furni_prize1_name', 'Gold Trophy'), + ('poster_54_name', 'Hockey Stick'), + ('furni_sound_set_47_name', 'Club 2'), + ('furni_prizetrophy3*1_name', 'Globe trophy'), + ('purse_head2', 'ACCOUNT TRANSACTIONS'), + ('furni_soft_sofa_norja*5_name', 'Pink Iced Sofa'), + ('furni_prizetrophy9*1_desc', 'Glittery gold'), + ('buddyremove_next', 'Next >'), + ('reg_girl', 'Girl'), + ('furni_bed_budget_one*1_name', 'Aqua Pura Bed'), + ('NUF_visiting_rooms_roomlist_go', 'Click \'Go\' to go to a room.'), + ('poster_506_desc', 'To \'Finnish\' your decor...'), + ('furni_toy1_name', 'Rubber Ball'), + ('furni_sound_set_7_desc', 'Sound effects for Furni'), + ('sw_fieldname_6', 'Riverbank Siege'), + ('sw_fieldname_5', 'Polar Labyrinth'), + ('furni_bed_polyfon*4_desc', 'Beige Mode Double Bed'), + ('furni_pillow*4_name', 'Gold Feather Pillow'), + ('alert_duplicatesession', 'You are already logged in on another hotel! Log out before trying again.'), + ('sw_fieldname_7', 'Skull Falls Assault'), + ('sound_machine_alert_song_not_ready', 'Can\'t save song! Song not ready yet.'), + ('nav_venue_bb_lobby_beginner_5/0_desc', ''), + ('nav_venue_bb_lobby_tournament_4/0_desc', ''), + ('pet.saying.play.dog.1', 'woofWOOFwoofWOOFwoof'), + ('pet.saying.play.dog.0', 'rrr.. WOOF .rrr..'), + ('furni_cn_lamp_name', 'Lantern'), + ('furni_arabian_rug_name', 'Berber Kilim Rug'), + ('NUF_groups_hotelview_tutor', 'You have now opened the Group tutorial in the website window. Special!'), + ('gs_error_start_9', 'Team sizes can only differ by one player. This Game cannot start!'), + ('furni_divider_poly3*7_desc', 'Green Mode Bardesk Gate'), + ('furni_sofachair_silo*4_desc', 'Beige Area Armchair'), + ('poster_58_desc', 'whish you luck'), + ('furni_chair_basic*2_desc', 'It\'s a cracking design!'), + ('poster_516_name', 'The English flag'), + ('nav_venue_sw_lobby_tournament_2/0_desc', ''), + ('furni_gothic_carpet_name', 'Cobbled Path'), + ('sw_title', 'Snow Storm'), + ('furni_doormat_plain*5_name', 'Doormat'), + ('furni_pura_mdl4*4_desc', 'Any way you like it!'), + ('furni_sound_machine*1_name', 'Sound Machine'), + ('furni_sofa_silo*7_name', 'Green Area Sofa'), + ('nav_venue_sw_lobby_tournament_4_name', 'Tournament Lobby'), + ('gs_title_gamecreation', 'Game creation'), + ('furni_couch_norja*2_desc', 'Two can perch comfortably'), + ('furni_prizetrophy5_desc', 'Palkinto'), + ('furni_divider_nor3*9_desc', 'Red Iced gate'), + ('furni_present_gen_name', 'Gift'), + ('furni_prizetrophy7*3_name', 'Bronze Habbo trophy'), + ('alert_reg_parent_email', 'The email address you provided is unacceptable.'), + ('furni_bed_polyfon_girl_name', 'Double Bed'), + ('furni_rare_fountain_name', 'Bird Bath (red)'), + ('furni_pura_mdl3*3_name', 'Black Pura Module 3'), + ('furni_plant_pineapple_name', 'Pineapple Plant'), + ('furni_divider_nor2*8_name', 'Yellow Iced bar desk'), + ('messenger', 'Messenger'), + ('nav_venue_bb_arena_0_name', 'Battle Ball kaikille'), + ('sw_fieldname_2', 'Algid River'), + ('furni_bed_silo_two_desc', 'Plain and simple x2'), + ('sw_fieldname_1', 'Arctic Island'), + ('furni_pillow*1_desc', 'Puffy, soft and huge'), + ('sw_fieldname_4', 'Frosty Forest'), + ('sw_fieldname_3', 'Glacial Fort'), + ('furni_bar_basic_desc', 'A pura series 300 minibar'), + ('tutorial_welcome_M', 'Hi! I am your guide to Habbo Hotel. Please pick a topic to start.'), + ('tutorial_welcome_F', 'Hi there! I\'m your guide to Habbo Hotel. What would you like to learn today?'), + ('Alert_NoNameSetForLogo', 'Please give a name to your logo'), + ('furni_glass_table*5_name', 'Glass table'), + ('group_owner', 'Owner'), + ('console_target_friend_list_full', 'This user\'s friend list is full'), + ('furni_romantique_smalltabl*2_name', 'Lime Tray Table'), + ('ph_keys_spacebar', 'Spacebar'), + ('furni_noob_chair*3_name', 'My first Habbo chair'), + ('NUF_meeting_people_roomlist_publicTab', 'Click the Public Spaces tab to see the list of public rooms. To go to the room click the \'Go\' button.'), + ('furni_bed_polyfon*7_name', 'Green Mode Double Bed'), + ('furni_jukebox_ptv*1_name', 'Jukebox Pacha TV'), + ('poster_513_desc', 'Aussies rule!'), + ('poster_51_desc', '2 points for every basket'), + ('furni_toy1*2_name', 'Rubber Ball'), + ('furni_bartable_armas_name', 'Bardesk'), + ('nav_venue_sw_lobby_amateur_0/0_desc', ''), + ('NUF_mini_use_console_read_tutor', 'The Habbo Console lets you message with people you have added to your friends list.'), + ('nav_venue_bb_lobby_beginner_12_name', 'Beginners Battle Ball 13'), + ('poster_2002_name', 'Urho Kaleva Kekkonen'), + ('furni_sound_set_44_desc', 'Haunted Dimension'), + ('pet.saying.beg.dog.1', 'Oouh..oouh..snuh..ooo'), + ('furni_sporttrack2*1_name', 'Sport corner tartan'), + ('pet.saying.beg.dog.0', 'Oooo...Ouuu...oo...OUUU'), + ('furni_solarium_norja*5_desc', 'Rejuvenate your pixels!'), + ('pet.saying.beg.dog.2', '*whimpers *'), + ('reg_pledgelink', 'Hotel rules'), + ('habboclub_price1.days', '30'), + ('furni_glass_shelf_desc', 'Translucent beauty'), + ('furni_sofachair_polyfon*3_name', 'White Armchair'), + ('reg_verification_info', 'You must know the correct birthday and password before you\'re allowed to make these changes.'), + ('furni_carpet_soft*5_desc', 'Soft Wool Rug'), + ('furni_grunge_mattress_name', 'Grunge Mattress'), + ('furni_bed_polyfon_one_name', 'Single Bed'), + ('furni_sound_machine_pro_name', 'Sound Machine Pro'), + ('furni_chair_china_desc', 'The elegant beauty of tradition'), + ('furni_rare_icecream*7_desc', 'Virtual chocolate rocks!'), + ('furni_table_silo_med*8_name', 'Yellow Coffee Table'), + ('club_gift.message', 'Happy Habbo Club! Love Callie :)'), + ('furni_sw_raven_desc', 'My name is Otter'), + ('furni_noob_table*2_desc', 'Lightweight, practical and dark blue'), + ('furni_soft_sofachair_norja*3_desc', 'Soft Iced sofachair'), + ('sound_machine_confirm_delete', 'Delete song?'), + ('furni_plant_fruittree_name', 'Fruit Tree'), + ('nav_venue_bb_lobby_intermediate_1/0_desc', ''), + ('furni_heartsofa_name', 'Heart Sofa'), + ('furni_bed_budget_one*8_name', 'Yellow Pura Bed'), + ('NUF_getting_room', 'Making your own room'), + ('furni_rare_elephant_statue*2_name', 'Bronze Elephant'), + ('nav_venue_ballroom/0_desc', 'Come play ball!'), + ('nav_venue_sw_lobby_amateur_1_name', 'Snow Slingers Lobby'), + ('console_lasttime', 'Last Time'), + ('furni_md_sofa_desc', 'A decent recliner'), + ('furni_wooden_screen*6_name', 'Blue Oriental Screen'), + ('partner_registration_text', 'Click the link to finish your registration. When you have finished the registration click OK to continue to the hotel.'), + ('furni_sound_set_62_desc', 'Music of the Arabian night!'), + ('furni_arabian_divdr_name', 'Soft wooden screen'), + ('furni_tree1_desc', 'Dead christmas tree'), + ('furni_grand_piano*3_name', 'Pink Grand Piano'), + ('console_select_requests', 'Following users have asked to be your friend. Please accept or decline.'), + ('furni_divider_nor4*2_name', 'Black Iced Auto Shutter'), + ('furni_glass_chair*3_name', 'Glass chair'), + ('reg_passwordContainsNoNumber', 'Password must contain at least one number'), + ('buddyremove_invert', 'Invert Selection'), + ('furni_val_teddy*5_desc', 'The yellow bear of understanding'), + ('furni_sound_set_51_name', 'Club 6'), + ('poster_1_desc', 'The Noble and Silver Show'), + ('roomevent_create_name', 'Type the name of your event'), + ('Alert_unacceptableName', 'Sorry, that name is unacceptable to the Hotel Management'), + ('NUF_getting_room_go_tutor', 'Your room is now ready. Let\'s go see! I hope you have a bed...'), + ('poster_520_name', 'The Rainbow Flag'), + ('password', 'Password:'), + ('furni_bed_budget*8_name', 'Yellow Pura Double Bed'), + ('gs_header_gamelist', 'Game List'), + ('furni_chair_plasty_desc', 'Hip plastic furniture'), + ('url_purse_subscribe', 'http://%predefined%//credits?'), + ('furni_table_plasto_bigsquare*15_desc', 'Hip plastic furniture'), + ('furni_glass_stool*6_desc', 'Translucent beauty'), + ('error_report', 'Error Report'), + ('summer_chair_6_desc', 'Get decked'), + ('furni_chair_basic*5_name', 'chair_basic'), + ('room_remove_specs', 'Sorry! Now it\'s someone else\'s turn to watch this event.'), + ('furni_bunny_desc', 'Yours to cuddle up to'), + ('invitation_exists', 'You have already invited members of the Welcoming Party to your room.'), + ('purse_vouchers_furni_success', 'Voucher was successfully redeemed. You have been given the following furniture:'), + ('nav_rooms_popular', 'Popular rooms'), + ('nav_cancel', 'Cancel'), + ('alert_cross_domain_download', 'Cross domain content download prevented'), + ('furni_table_plasto_4leg*16_desc', 'Hip plastic furniture'), + ('url_pets', 'http://%predefined%//hotel/pets'), + ('furni_bardeskcorner_polyfon*9_desc', 'Tuck it away'), + ('gs_button_cancel', 'Cancel'), + ('furni_barchair_silo*7_name', 'Green Bar Stool'), + ('catalog_credits', 'You have \\x Credits in your purse.'), + ('furni_divider_nor3_name', 'Door (Lockable)'), + ('nav_modify_name', 'Name of the room'), + ('nav_venue_bb_lobby_amateur_7_name', 'Gevorderden Battle Ball 8'), + ('nav_venue_club_massiva/0_desc', 'Rest your dancing feet!'), + ('furni_gothrailing_desc', 'The dark side of Habbo'), + ('queue_set.na.alert', 'This Room is for Staff only.'), + ('nav_venue_bb_lobby_tournament_8_name', 'Competitie Battle Ball 9'), + ('furni_sound_set_29_name', 'Dance 2'), + ('console_msgs', 'msgs'), + ('furni_noob_lamp*6_name', 'My first Habbo lamp'), + ('furni_marquee*6_desc', 'It\'s both door and a shade!'), + ('furni_chair_plasto*16_desc', 'Hip plastic furniture'), + ('furni_chair_basic*9_desc', 'It\'s a cracking design!'), + ('summer_chair_2_name', 'Pink Deck Chair'), + ('alert_too_much_furnitures', 'Furni limit for room is exceeded. Not all furnitures are shown. Please remove some.'), + ('furni_pura_mdl5*4_name', 'White Pura Module 5'), + ('bus.full_msg', 'The FRANK bus is full at the moment, please come back later or visit the FRANK page below for more information.'), + ('furni_sound_set_22_name', 'SFX 3'), + ('furni_gothic_sofa*3_desc', 'The dark side of Habbo'), + ('furni_md_limukaappi_name', 'Habbo Cola Machine'), + ('poster_19_desc', 'Trying to get in or out?'), + ('gs_2min', '2min'), + ('poster_8_desc', 'Habbos come in all colours'), + ('furni_pillar*6_desc', 'Ancient and stately'), + ('furni_carpet_standard*3_desc', 'Available in a variety of colours'), + ('purse_vouchers_info', 'When you buy Habbo Credits with a mobile phone, you will receive a special voucher code. Enter the code in the box above, click \'Get Credits!\' and they\'ll be added to your purse.'), + ('furni_valeduck_name', 'Valentine\'s Duck'), + ('Alert_MessageFromAdmin', 'Message from Hotel Management:'), + ('furni_present_gen1_desc', 'What\'s inside?'), + ('reg_tutorial_txt', ''), + ('furni_tile_stella_name', 'Star Tile'), + ('furni_shelves_norja*4_name', 'Urban Iced Bookcase'), + ('transaction_system_creditcards_is', 'Creditcard'), + ('furni_shelves_polyfon_desc', 'For the arty pad'), + ('furni_tv_luxus_name', 'Digital TV'), + ('recycler_status_window_title', 'Recycling Status'), + ('furni_sleepingbag*6_name', 'Purple Sleeping Bag'), + ('gs_button_shrink', 'Minimize Window'), + ('furni_wcandleset_desc', 'Simple but stylish'), + ('furni_sleepingbag*3_desc', 'Ultimate coziness'), + ('object_displayer_show_actions', 'Show actions'), + ('hubu_t5_1', 'Lisetoa huumeista'), + ('song_disk_text_template', '%name%'), + ('hubu_t5_2', 'Huumeista-esite'), + ('queue_other_1', 'Habbo Live queue status'), + ('poster_33_name', 'Save the Panda'), + ('hubu_t5_3', 'Yleistietoa EOPH ry:st--------------'), + ('queue_other_2', 'Room queue status'), + ('furni_hcsohva_name', 'Throne Sofa'), + ('furni_sound_set_26_desc', 'Bollywood Beats!'), + ('furni_christmas_poop_name', 'Reindeer Droppings'), + ('furni_rare_dragonlamp*4_name', 'Serpent of Doom'), + ('nav_venue_bb_lobby_amateur_7/0_desc', ''), + ('purse_value', 'VALUE'), + ('furni_glass_sofa*5_desc', 'Translucent beauty'), + ('nav_venue_bb_lobby_tournament_15/0_desc', ''), + ('furni_glass_stool*2_desc', 'Translucent beauty'), + ('pet.saying.play.cat.1', 'Purrrr.. oo..Purrr'), + ('furni_pura_mdl4*7_name', 'Green Pura Module 4'), + ('nav_venue_cafe_ole/0_desc', 'Relax with friends over one of Marias specialty coffees'), + ('pet.saying.play.cat.0', 'Mew..MEOW..meow'), + ('furni_pumpkin_name', 'Pumpkin Lamp'), + ('furni_summer_chair*7_desc', 'Reserved!'), + ('ph_tickets_txt', 'Tickets can be used for BattleBall: Rebound!, SnowStorm, the Lido Diving and Wobble Squabble games. Tickets never expire.\\r\\rCurrently you have \\x1 ticket(s).'), + ('roomatic_onemoment', 'Please wait, we are going to your room...'), + ('furni_small_table_armas_name', 'Occasional Table'), + ('furni_table_polyfon_med_desc', 'For larger gatherings'), + ('nav_venue_bb_lobby_expert_3/0_desc', ''), + ('furni_chair_silo*6_desc', 'Blue Silo Dining Chair'), + ('furni_exe_globe_name', 'Power Globe'), + ('furni_bed_budget_one_name', 'bed_budget_one'), + ('furni_divider_silo1*2_desc', 'Neat and natty'), + ('nav_venue_bb_lobby_intermediate_0_name', 'Intermediate'), + ('furni_sofa_polyfon*9_desc', 'Comfort for stylish couples'), + ('furni_noob_lamp*3_desc', 'Get the light right where you want it (aubergine)'), + ('nav_showfull', 'Show Full Rooms'), + ('furni_divider_nor3*2_desc', 'Black Iced gate'), + ('reg_note_title', 'Warning!'), + ('hubu_answ_count', 'Replies'), + ('nav_recommended_rooms', 'Recommended Rooms'), + ('transaction_system_bank_nordea', 'Nordea'), + ('furni_sound_set_37_desc', ''), + ('poster_2006_desc', 'He is the magic Habbo'), + ('sw_link_gameRules_url', 'http://%predefined%//groups/56553/id'), + ('wave', 'Wave'), + ('furni_hc_djset_desc', 'Very old skool scratch\'n\'spin'), + ('furni_plant_maze_name', 'Maze Shrubbery'), + ('furni_scifirocket*3_name', 'Endor Smoke Machine'), + ('furni_val_teddy*1_name', 'Grey Share Bear'), + ('recycler_ready_outcome', 'Recycling reward: %outcome%'), + ('poster_4_desc', 'Fake of course!'), + ('poster_62_desc', 'We can\'t bear to lose them!'), + ('furni_glass_stool*9_desc', 'Translucent beauty'), + ('furni_goodie1_name', 'Marzipan Man'), + ('nav_modify_choosecategory', 'Choose a category for your room'), + ('object_displayer_link_home', 'User\'s home page'), + ('nav_venue_sw_lobby_tournament_8/0_desc', ''), + ('furni_xmasduck_name', 'Christmas Rubber Duck'), + ('help_txt_2', 'Password Reset'), + ('pet_mood_2', 'Blue'), + ('furni_queue_tile1*4_desc', 'The power of movement'), + ('help_txt_1', 'How do I get Credits?'), + ('pet_mood_3', 'Contented'), + ('nav_venue_bb_lobby_tournament_1_name', 'Competitie Battle Ball 2'), + ('furni_rare_daffodil_rug_name', 'Petal Patch'), + ('help_txt_4', 'The Habbo Way'), + ('pet_mood_0', 'Miserable'), + ('help_txt_3', 'Help with Habbo Hotel'), + ('pet_mood_1', 'Depressed'), + ('pet_mood_6', 'Ecstatic'), + ('furni_bed_budget*4_name', 'White Pura Double Bed'), + ('nav_venue_bb_lobby_amateur_0_name', 'Amateur'), + ('furni_sofachair_polyfon*7_desc', 'Green Mode Armchair'), + ('yes', 'Yes'), + ('pet_mood_4', 'Happy'), + ('pet_mood_5', 'Joyful'), + ('furni_sound_set_30_desc', 'Moments in love'), + ('furni_prizetrophy2*1_desc', 'Glittery gold'), + ('furni_wooden_screen*3_desc', 'Add an exotic touch to your room'), + ('transaction_system_bank_op', 'Osuuspankki'), + ('help_txt_6', 'Contact Us'), + ('help_txt_5', 'Safety Tips'), + ('furni_bardeskcorner_polyfon*2_desc', 'Black Mode Bardesk Corner'), + ('poster_15_desc', 'Marvellous mountains'), + ('room_areYouSurePlace', 'Warning! If you put something down in this room you will not be able to pick it up again.'), + ('nav_venue_bouncer_room_3_name', 'Semi-profs Battle Ball Arena'), + ('furni_chair_plasto*12_name', 'Chair'), + ('furni_gothic_chair*6_name', 'Gothic Chair Blue'), + ('furni_sofa_polyfon*2_desc', 'Black Mode Sofa'), + ('modtool_alertuser', 'Alert User'), + ('furni_toilet_desc', 'Loo Seat'), + ('furni_plant_cruddy_name', 'Aloe Vera'), + ('nav_venue_space_cafe/0_desc', 'In this space noone can see you ask for a soda!'), + ('nav_incorrectflatpw', 'Incorrect, try again.'), + ('furni_chair_plasto*13_desc', 'Hip plastic furniture'), + ('login_firstTimeHere', 'First time here?'), + ('furni_skullcandle_desc', 'Alas poor Yorrick...'), + ('NUF_mini_endtopic_step1_tutor', 'Well that\'s all from me. If you have any problems just click the little blue question mark to restart the tutorial and find our FAQs.\\nTo start exploring by yourself, click Close guide from the upper left corner.'), + ('furni_divider_poly3*3_name', 'White Hatch'), + ('help_callforhelp', 'Get Live Help'), + ('furni_rare_fountain*2_name', 'Bird Bath (green)'), + ('nav_venue_rooftop_name', 'Rooftop Cafe'), + ('furni_scifiport*7_name', 'Turquoise Sci-Fi Port'), + ('purse_back_to_credits', 'Back To Purse'), + ('room_ban', 'Kick & ban'), + ('furni_pura_mdl5*1_name', 'Aqua Pura Module 5'), + ('furni_val_teddy*4_name', 'Brown Share Bear'), + ('poster_40_name', 'Bonnie Blonde'), + ('NUF_getting_room_navigator_tutor', 'You want to click it real good. The \'Own room(s)\' tab I mean. Don\'t click yourself. It\'s unhygienic.'), + ('summer_chair_3_desc', 'Relax and enjoy the sun'), + ('furni_wooden_screen*2_name', 'RosewoodScreen'), + ('nav_venue_sun_terrace_name', 'Sun Terrace'), + ('furni_rare_fan*3_desc', 'Keeps the heat off St George!'), + ('nav_venue_sport_name', 'Power Gym'), + ('furni_toilet_red_desc', 'Loo Seat'), + ('retype_password', 'Retype Password:'), + ('furni_chair_basic*6_desc', 'It\'s a cracking design!'), + ('console_friends_helptext', 'This screen shows a list of all your Habbo Friends. It tells you where they are in the hotel, or, if they\'re not checked in, when their last visit was.'), + ('NUF_getting_items_room_', 'This is the Catalogue icon. Click to open it.'), + ('furni_grunge_barrel_desc', 'Beacon of light!'), + ('furni_soft_sofachair_norja*6_name', 'Blue Iced Sofachair'), + ('int_howtoget', 'How To get?'), + ('furni_sound_set_23_desc', 'Don\'t be afraid of the dark'), + ('nav_ok', 'OK'), + ('furni_sofachair_polyfon*6_name', 'Blue Mode Armchair'), + ('nav_venue_theatredrome_valentine_name', 'Theatredrome Valentine'), + ('furni_sofachair_polyfon_desc', 'Loft-style comfort'), + ('poster_83_name', 'Pöllö huhuilee'), + ('furni_soft_sofachair_norja*2_name', 'Black Iced Sofachair'), + ('roomdimmer_furni_limit', 'You can only have one roomdimmer per room'), + ('recycler_progress_timeleft', 'Time left: %hours% h and %minutes% min'), + ('furni_chair_plasto*3_name', 'Chair'), + ('NUF_getting_room_hotelview_tutor', 'Now you will learn how to make your own room. First go to the Guest Rooms area of the Navigator.'), + ('roomevent_create', 'Create'), + ('reg_year', 'Year'), + ('furni_divider_poly3_name', 'Hatch (Lockable)'), + ('furni_divider_nor1*7_name', 'Rural Iced Corner'), + ('furni_rare_beehive_bulb_name', 'Blue Amber Lamp'), + ('furni_waterbowl*2_name', 'Green Water Bowl'), + ('NUF_getting_room_room_hand', 'Open your hand!'), + ('furni_carpet_standard*6_desc', 'Available in a variety of colours'), + ('furni_CF_5_coin_silver_name', 'Silver Coin'), + ('furni_shelves_norja*7_name', 'Rural Iced Bookcase'), + ('opening_hours_text_disabled', 'The Hotel is shutting down really soon. To avoid confusion, purchasing of furniture, Habbo Club and game tickets have been disabled, as well as playing games and furniture trading. Try again tomorrow when the hotel is open!'), + ('nav_venue_bb_lobby_5_name', 'Battle Ball Kaikille'), + ('game_bs_congrat', 'Congratulations!'), + ('furni_arabian_tray2_name', 'Candle Tray'), + ('furni_giftflowers_desc', 'Guaranteed to stay fresh'), + ('club_button_1_period', 'Buy 1 >>>'), + ('furni_bed_polyfon_one*2_desc', 'Black Mode Single Bed'), + ('poster_47_name', 'Small silver star'), + ('furni_divider_nor3*5_desc', 'Pink Iced gate'), + ('furni_sofachair_polyfon_girl_desc', 'Think pink'), + ('furni_pura_mdl5*8_name', 'Yellow Pura Module 5'), + ('furni_hal_cauldron_desc', 'Eye of Habbo and toe of Mod!'), + ('poster_1006_name', 'Hoot Poster'), + ('furni_carpet_valentine_name', 'Red carpet'), + ('furni_floortile_name', 'Floor Tile'), + ('furni_divider_nor1*4_name', 'Urban Iced Corner'), + ('furni_bardeskcorner_polyfon*12_desc', 'Tuck it away'), + ('furni_table_plasto_bigsquare*3_desc', 'Hip plastic furniture'), + ('furni_traffic_light*6_desc', 'Chill and wait your turn!'), + ('club_general_prepaid', 'Prepaid Months'), + ('wallitem_val_heart_desc', 'Heartbroken... without your love!'), + ('furni_pura_mdl3*7_desc', 'Any way you like it!'), + ('furni_sound_set_58_name', 'RnB Grooves 4'), + ('furni_china_shelve_name', 'Chinese Lacquer Bookshelf'), + ('furni_divider_silo1*5_desc', 'Pink Area Corner Shelf'), + ('nav_venue_sw_lobby_tournament_desc', 'For stand-alone Tournaments.'), + ('furni_divider_silo2_name', 'Screen'), + ('furni_plant_mazegate_name', 'Maze Shrubbery Gate'), + ('poster_509_desc', 'The flag of Jamaica'), + ('furni_soft_sofachair_norja*9_name', 'Red Iced Sofachair'), + ('nav_venue_sw_arena_intermediate_name(0)', 'Playing intermediate game'), + ('furni_barchair_silo*4_name', 'Beige Bar Stool'), + ('furni_scifidoor*7_name', 'Aqua Spaceship Door'), + ('furni_CF_10_coin_gold_desc', 'Worth 10 Credits'), + ('furni_glass_sofa*8_desc', 'Translucent beauty'), + ('jukebox_reset', 'Reset Jukebox'), + ('nav_venue_sw_lobby_intermediate_desc', 'For the accomplished Snow Stormers.'), + ('furni_spotlight_desc', 'For the star of the show'), + ('furni_couch_norja_name', 'Bench'), + ('furni_romantique_divan*3_name', 'Turquoise Romantique Divan'), + ('furni_sleepingbag*7_desc', 'Ultimate coziness'), + ('roomatic_pws2', '24 hour access:'), + ('wallitem_jp_sheet1_desc', 'jp_sheet1'), + ('furni_table_silo_med*2_desc', 'Wipe clean and unobtrusive'), + ('furni_glass_table_desc', 'Translucent beauty'), + ('poster_502_desc', 'The US flag'), + ('pet_enrg_10', 'Mad'), + ('gs_scores_team_2', 'Blue Team:'), + ('pet_enrg_11', 'Nutcase'), + ('gs_scores_team_1', 'Red Team:'), + ('furni_cn_sofa_desc', 'Seating,Oriental style!'), + ('gs_scores_team_4', 'Green Team:'), + ('gs_scores_team_3', 'Yellow Team:'), + ('furni_table_silo_med*9_desc', 'Red Area Coffee Table'), + ('furni_hc_machine_name', 'Weird Science Machine'), + ('callhelp_writeyour', 'Write your question about Habbo Hotel here:'), + ('furni_table_silo_small*5_name', 'Pink Area Occasional Table'), + ('nav_addtofavourites', 'Add to favourites'), + ('furni_table_plasto_round*15_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_tournament_4_name', 'Competitie Battle Ball 5'), + ('furni_birdie_name', 'Pop-up Egg'), + ('furni_table_plasto_bigsquare_desc', 'Hip plastic furniture'), + ('furni_sound_set_33_desc', 'Guitar solo set'), + ('furni_romantique_divider*3_desc', 'Keeping things separated'), + ('furni_bed_budget*1_name', 'Aqua Pura Double Bed'), + ('furni_rare_beehive_bulb*2_desc', 'A honey-hued glow'), + ('furni_theatre_seat_desc', 'For Lazy boys and girls!'), + ('furni_hc_lmpst_desc', 'Somber and atmospheric'), + ('furni_divider_nor5*6_name', 'Blue Iced Angle'), + ('furni_summer_pool*2_desc', 'Fancy a dip?'), + ('poster_12_desc', 'a beautiful sunset'), + ('furni_carpet_polar*2_desc', 'Snuggle up on a Funky bear rug...'), + ('furni_md_rug_desc', 'Bubbles under your steps'), + ('Alert_InviteFriend', 'Invite your friends'), + ('nav_venue_bb_lobby_intermediate_4_name', 'Semi-profs Battle Ball 5'), + ('furni_hockey_score_desc', '...for keeping your score'), + ('furni_gothic_chair*3_name', 'Red Gothic Chair'), + ('wallitem_sw_stone_name', 'sw_stone'), + ('furni_pillow*7_name', 'Purple Velvet Pillow'), + ('nav_popup_header', 'Recommended rooms'), + ('nav_venue_sw_lobby_beginner_0_name', 'Snow Rookies Lobby'), + ('furni_table_norja_med*5_desc', 'For larger gatherings'), + ('furni_red_tv_name', 'Portable TV'), + ('reg_promise', '*Any personal information you supply will only be used by Habbo Ltd in accordance with the Habbo Pledge and will not be shared with third parties.'), + ('room_badge_choose', 'Modify Badge:'), + ('furni_table_plasto_square*15_desc', 'Hip plastic furniture'), + ('furni_sound_set_48_desc', 'Sweet party beat'), + ('nav_venue_ballroom_name', 'Ballroom'), + ('pet.hotwords.bad', 'bad'), + ('poster_55_desc', 'Save our trees!'), + ('furni_glass_chair_name', 'Glass chair'), + ('furni_prizetrophy5*2_desc', 'Shiny silver'), + ('furni_divider_poly3*4_desc', 'Beige Mode Bardesk Gate'), + ('tutorial_console_sample_message', 'Hello! This is a message sent to you from the Habbo Tutorial. To close and delete this message click delete. Sadly you cannot reply to this message as it is automated. Normally you can reply to messages by clicking the reply button.'), + ('furni_s_sound_machine*5_name', 'Sound Machine Brown'), + ('furni_divider_nor4*9_desc', 'Habbos, roll out!'), + ('furni_pura_mdl3*4_desc', 'Any way you like it!'), + ('NUF_getting_room_room_tutor', 'Tada! Nice room, although it\'s a little empty. Hey! Let\'s furnish it with something./nOpen your hand to check what you have, (if you have done this step before then you won\'t receive anything).'), + ('furni_fortune_desc', 'Gaze into the future'), + ('furni_soft_sofa_norja_name', 'iced sofa'), + ('furni_pura_mdl1*2_desc', 'Any way you like it!'), + ('nav_venue_sw_lobby_free_6/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('furni_divider_nor3*8_name', 'Yellow Iced gate'), + ('gs_title_finalscores', 'Final Standings:'), + ('gs_error_10', 'The hotel is closed or about to close. We look forward to welcoming you back tomorrow at (ADD LOCAL OPENING TIME).'), + ('furni_plant_bonsai_name', 'Bonsai Tree'), + ('furni_jukebox*1_name', 'Jukebox'), + ('room_loading', 'Loading room...'), + ('furni_hc_crpt_desc', 'Ultimate craftsmanship'), + ('furni_rare_hammock_desc', 'Eco bed'), + ('NUF_mini_use_console', 'Learn about messaging'), + ('furni_romantique_chair*1_desc', 'Elegant seating for elegant Habbos'), + ('transaction_system_bank_digiraha', 'Digiraha'), + ('NUH_messenger', 'Open your Console here - you might have messages or friend requests waiting.'), + ('furni_arabian_chair_desc', 'Exotic, soft seating'), + ('furni_noob_chair*6_name', 'My first Habbo chair'), + ('poster_510_desc', 'The flag of Italy'), + ('furni_carpet_standard*a_desc', 'Available in a variety of colours'), + ('queue_set.c.info', 'There are %c% Habbo Club member(s) in front of you. Be patient :)'), + ('furni_scifiport*4_name', 'Pink Sci-Fi Port'), + ('furni_sound_set_44_name', 'Graveyard Portal'), + ('furni_pura_mdl4*1_desc', 'Any way you like it!'), + ('furni_divider_silo3*6_desc', 'Blue Area Gate'), + ('furni_sound_machine*4_name', 'Blue Traxmachine'), + ('send_invitation_header', 'Get a warm welcome'), + ('game_TicTacToe', 'Boter kaas en eieren'), + ('nav_venue_sw_lobby_tournament_1_name', 'Tournament Lobby'), + ('furni_rare_fan*2_name', 'Green Powered Fan'), + ('furni_doormat_plain*2_name', 'Doormat'), + ('furni_table_plasto_square*7_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_intermediate_8/0_desc', ''), + ('furni_noob_table*6_desc', 'Lightweight, practical and green'), + ('win_callforhelp', 'Alert a Moderator'), + ('furni_prizetrophy8*1_desc', 'Glittery gold'), + ('furni_chair_norja*5_name', 'Pink Chair'), + ('furni_hc_tv_desc', 'Forget plasma, go HC!'), + ('furni_divider_arm1_name', 'Corner plinth'), + ('furni_table_plasto_round*7_name', 'Round Dining Table'), + ('furni_petfood3_name', 'Cabbage Mega Multipack'), + ('furni_carpet_standard*9_name', 'Floor Rug'), + ('opening_hours_title', 'Hotel Maintenance'), + ('console_noemail', 'Sorry,'), + ('furni_couch_norja*8_name', 'Yellow Bench'), + ('furni_s_sound_machine*1_desc', 'Sound Machine Grey Desc'), + ('furni_noob_stool*6_name', 'My first Habbo stool'), + ('purse_event', 'ACTIVITY'), + ('reg_readterms_alert', 'You have to read the Terms and Conditions\\r(scroll to the bottom of the text).'), + ('pet.hotwords.beg', 'beg'), + ('furni_jp_drawer_name', 'Japanese Drawer'), + ('gs_state_started', 'This Game has already started...'), + ('furni_sound_set_11_name', 'Dance 4'), + ('furni_divider_nor2*4_name', 'Urban Iced Bar'), + ('queue_set.e2.info', 'There are %e2% Habbos in front of you in the queue.'), + ('furni_bath_name', 'Bubble Bath'), + ('furni_rare_icecream*3_desc', 'Virtual blackcurrant rocks!'), + ('nav_modify_nameoftheroom', 'Name Of The Room'), + ('furni_scifiport*1_desc', 'Energy beams. No trespassers!'), + ('nav_venue_bb_lobby_amateur_12/0_desc', ''), + ('furni_table_silo_small*8_name', 'Yellow Occasional Table'), + ('furni_divider_silo3*3_name', 'White Area Gate'), + ('nav_venue_sw_lobby_amateur_7/0_desc', 'Astetta rankempaa lumisotaa.'), + ('reply', 'Reply'), + ('furni_toilet_yell_desc', 'Loo Seat'), + ('hobba_alert', 'Moderator Alert'), + ('You can play a bunch of exciting games, visit your friends\' rooms or even make your own place and decorate it to your heart\'s delight.', ''), + ('pet.saying.eat.croco.4', '*Buurrrrp*'), + ('furni_tree5_desc', 'Any presents under it yet?'), + ('pet.saying.eat.croco.2', '*Chomp chomp*'), + ('pet.saying.eat.croco.3', 'Mmmm mmmmm....'), + ('furni_divider_poly3*7_name', 'Green Mode Bardesk Gate'), + ('pet.saying.eat.croco.0', 'Mmmm yum yum'), + ('pet.saying.eat.croco.1', 'Ruff ruff ruff'), + ('furni_scifidoor*4_name', 'Emerald Spaceship Door'), + ('furni_edice_name', 'Holo-dice'), + ('furni_divider_nor4*6_name', 'Blue Iced Auto Shutter'), + ('furni_safe_silo*3_desc', 'Totally shatter-proof!'), + ('furni_table_silo_small_desc', 'For those random moments'), + ('gs_header_page', 'Page'), + ('furni_sporttrack3*2_name', 'Sport goal asphalt'), + ('furni_pura_mdl2*6_desc', 'Any way you like it!'), + ('furni_hcamme_name', 'Tubmaster'), + ('furni_carpet_soft*2_desc', 'Soft Wool Rug'), + ('furni_sound_set_12_name', 'Habbo Sounds 2'), + ('forgottenpw_done', 'If the email you gave during registration was correct, your password will be sent to you now.'), + ('navigator.no_category', 'No Category'), + ('login_whatsHabboCalled', 'What\'s your Habbo called?'), + ('furni_scifidoor*3_name', 'Lightblue Spaceship Door'), + ('game_poker', 'POKER'), + ('roomatic_pws', 'Password for selected'), + ('furni_glass_table*8_name', 'Glass table'), + ('furni_one_way_door*8_desc', 'One at a time!'), + ('furni_bardesk_polyfon*9_desc', 'Perfect for work or play'), + ('nav_venue_bb_lobby_tournament_13_name', 'Competitie Battle Ball 14'), + ('pet.hotwords.sit', 'sit'), + ('furni_arabian_tray3_desc', 'Indulge yourself!'), + ('furni_sound_set_40_desc', 'Dude? Cheese!'), + ('console_compose', 'Compose A Message'), + ('furni_table_plasto_square*3_name', 'Square Dining Table'), + ('furni_rclr_sofa_name', 'Polar Sofa'), + ('poster_2005_name', 'Infobus'), + ('furni_table_plasto_4leg*9_name', 'Occasional Table'), + ('furni_chair_norja*9_desc', 'Sleek and chic for each cheek'), + ('Room', 'Room:'), + ('furni_chair_plasty*2_name', 'Plastic Pod Chair'), + ('furni_romantique_pianochair*3_name', 'Turquoise Romantique Piano Chair'), + ('furni_rare_parasol*2_name', 'Orange Parasol'), + ('loading_project', 'Loading Habbo Hotel...'), + ('poster_505_name', 'The Maple Leaf'), + ('furni_traffic_light*2_desc', 'Chill and wait your turn!'), + ('nav_venue_sw_lobby_amateur_4_name', 'Snow Slingers Lobby'), + ('furni_grunge_shelf_name', 'Grunge Bookshelf'), + ('furni_sofa_polyfon*8_name', 'Yellow Mode Sofa'), + ('furni_doorC_desc', 'In a hurry?'), + ('roomatic_nomatch', 'Sorry. Your passwords don\'t match. Please enter them again.'), + ('furni_soft_sofa_norja*9_name', 'Red Iced Sofa'), + ('nav_venue_tv_studio_general/0_desc', 'Suosikki rules! Musaa, leffoja ja staroja!'), + ('nav_venue_sw_arena_amateur_name', 'Playing amateur game'), + ('interface_icon_events', 'Open the room event browser'), + ('furni_grunge_table_desc', 'Students of the round table!'), + ('furni_wooden_screen*9_name', 'Green Oriental Screen'), + ('NUF_getting_room_hotelview_nav', 'Click to open the Navigator.'), + ('furni_table_silo_med*5_name', 'Pink Area Coffee Table'), + ('furni_divider_silo1*9_name', 'Red Area Small Table'), + ('nav_venue_bb_lobby_amateur_4_name', 'Gevorderden Battle Ball 5'), + ('room_badge_hidden', 'Hidden'), + ('pet.saying.generic.cat.0', 'meow'), + ('furni_marquee*3_desc', 'It\'s both door and a shade!'), + ('pet.saying.generic.cat.1', 'meow...meOW'), + ('nav_venue_cunning_fox_gamehall/4_name', 'Chess'), + ('furni_present_gen_desc', 'What\'s inside?'), + ('pet.saying.generic.cat.2', 'muew..muew'), + ('pet.saying.generic.cat.3', 'Purrrrrrrrrr'), + ('furni_scifidoor*1_desc', 'There out of this world!'), + ('pet.saying.generic.cat.4', 'Purrrrr oow'), + ('furni_fridge_name', 'Pura Refridgerator'), + ('furni_rubberchair*2_name', 'Pink Inflatable Chair'), + ('furni_romantique_chair*4_name', 'Amber Chair'), + ('bb_fieldname_5', 'Barebones Classic'), + ('furni_sofa_silo*7_desc', 'Green Area Sofa'), + ('bb_fieldname_4', 'Gothic Hallway'), + ('furni_prizetrophy6*2_name', 'Champion trophy'), + ('bb_fieldname_3', 'Maze Park'), + ('bb_fieldname_2', 'Coral Beach'), + ('bb_fieldname_1', 'Sky Peak'), + ('furni_safe_silo_pb_name', 'postbank Safe'), + ('furni_solarium_norja*2_desc', 'Rejuvenate your pixels!'), + ('furni_table_plasto_bigsquare*7_desc', 'Hip plastic furniture'), + ('reg_check_age', 'Age'), + ('furni_exe_chair2_desc', 'You\'re fired!'), + ('furni_typingmachine_name', 'Typewriter'), + ('human_carrying', 'Carrying:'), + ('furni_grunge_sign_name', 'Road Sign'), + ('loading', 'Loading...'), + ('furni_bed_polyfon_one*6_name', 'Blue Mode Single Bed'), + ('furni_bed_budget_one*1_desc', 'Prince sized comfort!'), + ('furni_sofa_polyfon_name', 'Two-seater Sofa'), + ('furni_jp_lantern_desc', 'For a mellow Eastern glow'), + ('furni_gothic_stool*2_name', 'Golden Gothic Stool'), + ('roomevent_starttime', 'Started at:'), + ('furni_prize1_desc', 'Gorgeously glittery'), + ('furni_prizetrophy9*1_name', 'Champion trophy'), + ('wallitem_guitar_skull_desc', 'tilulilulaa'), + ('gs_title_bestplayer', 'Best player:'), + ('nav_removefavourites', 'Remove from favourites'), + ('furni_toy1_desc', 'it\'s bouncy-tastic'), + ('alert_shortenPW', 'Your password cannot be longer than 9 characters'), + ('normal_roomlayouts', '<< Back to normal room layouts'), + ('furni_noob_rug*1_name', 'My first Habbo rug'), + ('poster_58_name', 'Red knots poster'), + ('furni_divider_nor2*8_desc', 'Yellow Iced bar desk'), + ('furni_carpet_polar*1_name', 'Pink Faux-Fur Bear Rug'), + ('habboclub_continue_button', 'Buy one month'), + ('furni_divider_silo3_desc', 'Form following function'), + ('furni_sound_set_7_name', 'SFX 5'), + ('furni_soft_sofa_norja*5_desc', 'Pink Iced Sofa'), + ('furni_arabian_rug_desc', 'Green blossom design'), + ('restart_tutorial', 'Restart tutorial'), + ('gs_choose_numteams', 'Choose number of Teams:'), + ('hubu_info_t', 'The big FRANK Infobus'), + ('furni_divider_nor5*7_desc', 'Cool cornering for your crib!'), + ('furni_bed_polyfon*4_name', 'Beige Mode Double Bed'), + ('callhelp_allwillreceive', 'A member of community staff will investigate the situation and take appropriate action. This may include sending you a response with advice on dealing with your issue.'), + ('furni_pura_mdl4*4_name', 'White Pura Module 4'), + ('hubu_odotetaan', 'Waiting for replies from others...'), + ('furni_door_name', 'Telephone Box'), + ('furni_doormat_plain*5_desc', 'Available in a variety of colours'), + ('furni_gothic_carpet_desc', 'The path less travelled'), + ('poster_516_desc', 'Eng-er-land'), + ('furni_gothic_stool*6_desc', 'The dark side of Habbo'), + ('furni_traffic_light*3_desc', 'Chill and wait your turn!'), + ('furni_bartable_armas_desc', 'Bar-Style Table - essential for extra guests'), + ('club_isp_change', 'Change your subscription'), + ('furni_summer_grill*2_name', 'Red Barbeque Grill'), + ('poster_23_desc', 'flap, flap, screech, screech...'), + ('furni_prizetrophy7*3_desc', 'Bronze Habbo trophy'), + ('furni_couch_norja*2_name', 'Black Bench'), + ('nav_venue_cunning_fox_gamehall/0_desc', 'Pit your wits on the battlefield, the board or the baize - choose what to play here'), + ('furni_jp_tatami2_name', 'Large Tatami Mat'), + ('furni_pura_mdl3*3_desc', 'Any way you like it!'), + ('furni_house_name', 'Gingerbread House'), + ('furni_sound_set_54_name', 'Oh Blinging Tree'), + ('furni_table_plasto_4leg*1_name', 'Square Dining Table'), + ('furni_pillow*1_name', 'Pink Fluffy Pillow'), + ('NUF_console_hotelview_tutor', 'Oh! You have a message on your Habbo Console. Let\'s see who it is.'), + ('LoadingRoom', 'Loading room...'), + ('rotate', 'Rotate'), + ('nav_venue_sw_lobby_beginner_6_name', 'Snow Rookies Lobby'), + ('nav_venue_bb_lobby_amateur_1/0_desc', ''), + ('furni_jukebox_ptv*1_desc', 'Jukebox Pacha TV'), + ('nav_venue_star_lounge/0_desc', 'Chat with Sean Kingston here!'), + ('furni_chair_plasty*6_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_tournament_10/0_desc', ''), + ('NUF_mini_use_console_hotelview_tutor', 'Ah! You have a message on your Habbo Console. Let\'s see who it is.'), + ('furni_rare_xmas_screen_name', 'Lappland Greetings'), + ('summer_chair_9_name', 'Red Deck Chair'), + ('club_timefull', 'Sorry, you can only buy up to three months of Habbo Club subscription in advance.'), + ('poster_2002_desc', 'Presidentin muotokuva'), + ('poster_7_name', 'Hammer Cabinet'), + ('furni_gothic_chair*2_name', 'Golden Gothic Chair'), + ('bb_header_powerups', 'Powerups in game:'), + ('credit_redeem_url', 'http://%predefined%//help/19'), + ('furni_divider_silo3*2_name', 'Black Area Gate'), + ('furni_chair_plasto*16_name', 'Chair'), + ('catalog_itsurs', 'Yay! It\'s being delivered now..'), + ('hobba_pickandreply', 'Pick & Reply'), + ('reg_terms', 'Welcome to Habbo Hotel. If you are under 16, please check the Terms and Conditions with your parents/guardian before you agree to them. Get them to explain anything that you don\'t understand.\\rIn order to use the service you have to give valid information about yourself when registering. Please email us if any of your user information changes.\\rAs a user of Habbo Hotel - www.habbohotel.co.uk , you have to behave according to the Habbo Way (hotel rules) and the Terms and Conditions. Click the links below to read about them.\\rNever give your password or email address to anyone. If you do, your Habbo may get stolen.\\rRegistering with the hotel, making your own empty room and chatting is free of charge. For a small fee you can decorate your room with virtual furniture, play games and join the Habbo Club. If you wish to buy, you will need your parent\'s permission to do so.'), + ('furni_summer_pool*1_name', 'Blue Summer Pool'), + ('furni_heartsofa_desc', 'Perfect for snuggling up on'), + ('furni_scifiport*3_name', 'Jade Sci-Fi Port'), + ('furni_glass_chair*6_name', 'Blue Glass Chair'), + ('furni_sound_set_62_name', 'Alhambra Trax 1'), + ('win_voucher', 'Habbo Credit Code'), + ('furni_summer_chair*4_desc', 'White'), + ('furni_bed_polyfon_one_desc', 'Cot of the artistic'), + ('nav_venue_bb_lobby_tournament_5/0_desc', ''), + ('nav_venue_bb_lobby_beginner_3_name', 'Beginners Battle Ball 4'), + ('console_follow_not_friend', 'The user you tried to follow is not your friend anymore.'), + ('delete', 'Delete'), + ('furni_grunge_mattress_desc', 'Beats sleeping on the floor!'), + ('furni_rare_icecream*7_name', 'Chocolate Ice Cream Machine'), + ('sound_machine_alert_no_disks', 'You don\'t have any more discs!'), + ('furni_sofachair_silo_name', 'Armchair'), + ('nav_venue_sw_lobby_expert_0_name', 'Snow Marksmen Lobby'), + ('game_waitop', 'WAITING FOR THE OPPONENT'), + ('Alert_NameAlreadyUse', 'That name is already being used'), + ('furni_queue_tile1*1_desc', 'The power of movement'), + ('poster_18_name', 'Butterfly Cabinet 2'), + ('furni_wooden_screen*6_desc', 'Add an exotic touch to your room'), + ('furni_noob_table*2_name', 'My first Habbo table'), + ('furni_tree1_name', 'Dead tree'), + ('nav_venue_bouncer_room_0_name', 'Battle Ball Competitie Arena'), + ('furni_traffic_light*5_name', 'White Traffic Light'), + ('furni_sw_raven_name', 'Mrs Raven'), + ('cam_shoot.help', 'Shutter Release'), + ('furni_grand_piano*3_desc', 'Make sure you play in key!'), + ('nav_venue_sw_lobby_intermediate_2_name', 'Snow Bombardiers Lobby'), + ('interface_icon_purse', 'Purse, manage your coins'), + ('poll_alert_server_error', 'The poll isn\'t available anymore. Polls are only available at a certain public space for a certain duration.'), + ('sound_machine_confirm_delete_long', 'Are you sure you want to delete the selected song?'), + ('reg_check_confirm', 'Please check that your information is correct, especially your birthdate and Habbo name. You CANNOT change these later. If you want make any changes now, press the back button.'), + ('Alert_CheckBirthday', 'Please check your birthday'), + ('furni_shelves_norja*4_desc', 'For nic naks and tech books'), + ('club_expired_link', 'Click here to join Habbo Club'), + ('poster_520_desc', 'Every colour for everyone'), + ('nav_venue_bb_lobby_intermediate_desc', 'Intermediate battle ball!'), + ('tutorial_restart_button_bubble', 'Remember! Anytime you want to relive the fun click here to restart the tutorial!'), + ('poster_1_name', 'Comedy Poster'), + ('reg_verification_incorrectBirthday', 'Your birthday was incorrect'), + ('furni_glass_stool*6_name', 'Blue Glass Stool'), + ('furni_CFC_100_coin_gold_desc', 'Worth 100 Credits'), + ('buddyremove_list_full', 'Your friends list is full, you can\'t add new friends until you delete some. \\r\\The maximum number of friends you can have, is %mylimit% Habbos. Members of Habbo Club can have up to %clublimit% friends on their list.'), + ('furni_bunny_name', 'Squidgy Bunny'), + ('furni_small_chair_armas_name', 'Stool'), + ('nav_venue_sw_lobby_free_0/0_desc', ''), + ('furni_sofachair_silo*3_name', 'White Armchair'), + ('furni_sound_machine*2_desc', 'Dance to the Habbo Club beat!'), + ('nav_venue_gate_park/0_desc', 'Follow your path...'), + ('NUF_mini_use_console_hotelview_icon', 'Click the icon to open your Habbo Console.'), + ('nav_venue_eric\'s_eaterie/0_desc', 'Join Eric for a bite to eat'), + ('furni_table_silo_med*8_desc', 'Wipe clean and unobtrusive'), + ('poster_503_desc', 'There\'s no holes in this...'), + ('furni_bardeskcorner_polyfon*9_name', 'Red Corner Desk'), + ('furni_val_randomizer_desc', 'Surprise surprise! (Cilla Black not included)'), + ('furni_marquee*2_name', 'Red Dragon Marquee'), + ('furni_table_plasto_round_name', 'Round Dining Table'), + ('furni_summer_chair*3_name', 'Deck Chair'), + ('club_paycoins', 'Buy subscription'), + ('nav_venue_beauty_salon_general/0_desc', 'Join in the fun of Fashion Week! Check the homepage now for details.'), + ('furni_rare_dragonlamp*7_name', 'Sky Dragon Lamp'), + ('nav_venue_bb_lobby_beginner_6/0_desc', ''), + ('roomevent_quit', 'End event'), + ('console_search_habbo_lasthere', 'Last time'), + ('trading_title', 'Safe Trading'), + ('furni_glass_chair*7_desc', 'Habbo Club'), + ('gs_error_game_deleted', 'The Game has been deleted.'), + ('recycler_info_link_url', 'http://%predefined%/help/36'), + ('furni_pillar*6_name', 'Terracotta Pillar'), + ('furni_tile_stella_desc', '10% off the walk of fame!'), + ('transaction_system_sms_win_tmobile', 'T-Mobile SMS'), + ('buddyremove_names_ordered', 'Names Ordered By:'), + ('pet_race_2_010', 'Giggly Go-go'), + ('furni_table_plasto_bigsquare*6_name', 'Square Dining Table'), + ('pet_race_2_011', 'Petty Petsuchos'), + ('summer_chair_6_name', 'Blue Deck Chair'), + ('console_now', 'now:'), + ('gs_skill_changed', 'You have advanced to the next skill level. Your level is now %1!'), + ('roomatic_goyourroom', 'Go to your room'), + ('furni_carpet_soft*4_name', 'Soft Wool Rug'), + ('sound_machine_confirm_close_list', 'Close playlist editor?'), + ('pet.hotwords.good', 'good'), + ('furni_pura_mdl4*7_desc', 'Any way you like it!'), + ('furni_carpet_soft*1_name', 'Soft Wool Rug'), + ('furni_sound_set_22_desc', 'With a hamper full of sounds, not sarnies'), + ('nav_venue_sw_lobby_tournament_7_name', 'Tournament Lobby'), + ('furni_divider_nor3*6_desc', 'Blue Iced gate'), + ('furni_carpet_standard*3_name', 'Floor Rug'), + ('people', 'People'), + ('pet_race_2_007', 'Pretty Pui Pui'), + ('pet_race_2_008', 'Indifferent'), + ('pet_race_2_009', 'Swampy Siamese'), + ('furni_wcandle_name', 'White Candle'), + ('furni_sporttrack1*1_desc', 'null'), + ('furni_solarium_norja*1_name', 'Black Solarium'), + ('NUF_playing_games_gamecategories_tutor', 'Click the Beginner category to open it wide open. Like a melon!'), + ('pet_race_2_003', 'Silly Sobek'), + ('pet_race_2_004', 'Dirty Dundee'), + ('pet_race_2_005', 'Galled Gator'), + ('int_credits', 'Credits'), + ('furni_gothrailing_name', 'Gothic Railing'), + ('furni_sporttrack2*2_desc', 'null'), + ('pet_race_2_006', 'Confused Croc'), + ('furni_shelves_polyfon_name', 'Bookcase'), + ('pet_race_2_000', 'Endangered Albino'), + ('pet_race_2_001', 'Krazy Krokodilos'), + ('pet_race_2_002', 'Nile Dile'), + ('furni_divider_nor2*2_desc', 'Black Iced bar desk'), + ('log_problem_text', 'Oops.. Cannot connect to Habbo Hotel'), + ('furni_divider_nor2*5_desc', 'Pink Iced bar desk'), + ('nav_venue_sw_lobby_amateur_6/0_desc', 'Astetta rankempaa lumisotaa.'), + ('furni_rare_fountain_desc', 'For our feathered friends'), + ('furni_glass_sofa*5_name', 'Glass sofa'), + ('poster_33_desc', 'We can\'t bear to lose them'), + ('nav_venue_bb_lobby_tournament_14/0_desc', ''), + ('furni_summer_chair*6_name', 'Deck Chair'), + ('furni_hcsohva_desc', 'For royal bottoms...'), + ('furni_bed_budget*4_desc', 'King sized comfort!'), + ('furni_christmas_poop_desc', 'Bob?s magical fertilizer'), + ('furni_pura_mdl5*7_name', 'Green Pura Module 5'), + ('furni_barrier*1_desc', 'No escape this way!'), + ('nav_venue_bb_lobby_amateur_8/0_desc', ''), + ('furni_divider_arm2_desc', 'I wooden go there'), + ('furni_chair_plasty*11_desc', 'Hip plastic furniture'), + ('furni_small_table_armas_desc', 'Practical and beautiful'), + ('nav_venue_theatredrome_xmas_name', 'Theatredrome Xmas'), + ('poster_62_name', 'Save The Panda'), + ('reg_verification_currentPassword', 'Current password:'), + ('game_poker_change', 'Choose cards to change'), + ('NUF_getting_items_hotelview_nav', 'Click here to open the Navigator'), + ('furni_chair_basic*9_name', 'Red Pura Egg Chair'), + ('friend_request_failed', 'Failed!'), + ('furni_noob_chair*4_desc', 'Lightweight, practical, with light blue stripes'), + ('furni_table_silo_small*9_desc', 'Red Area Occasional Table'), + ('nav_hotelview', 'Hotel view'), + ('furni_toy1*3_desc', 'it\'s bouncy-tastic'), + ('furni_divider_nor3*2_name', 'Black Iced gate'), + ('furni_chair_silo*6_name', 'Blue Silo Dining Chair'), + ('update_password_suggest', 'Habbo Hotel security supervisor requests you to update your password'), + ('nav_venue_orient_name', 'Club Orient'), + ('Alert_NameTooLong', 'Sorry, that username is too long!'), + ('furni_sound_set_37_name', 'Sound set 37'), + ('furni_barchair_silo*7_desc', 'Practical and convenient'), + ('wallitem_wallmirror_name', 'Wallmirror'), + ('furni_chair_plasty*8_name', 'Plastic Pod Chair'), + ('sound_machine_confirm_close_list_long', 'Are you sure you want to exit playlist editor without saving?'), + ('furni_hc_frplc_name', 'Heavy Duty Fireplace'), + ('dance4', 'The Rollie'), + ('dance3', 'Duck Funk'), + ('furni_glass_stool*9_name', 'Glass stool'), + ('furni_sound_set_55_desc', 'Can you fill me in?'), + ('furni_carpet_standard*7_desc', 'Available in a variety of colours'), + ('poster_4_name', 'Bear Plaque'), + ('cam_zoom_out.help', 'Zoom Out'), + ('furni_sofa_polyfon*2_name', 'Black Mode Sofa'), + ('furni_prizetrophy2*1_name', 'Duck trophy'), + ('furni_scifirocket*3_desc', 'Caution! Unknown Location!'), + ('NUF_getting_items', 'Getting items'), + ('furni_val_teddy*1_desc', 'The grey bear of affection'), + ('furni_sofachair_polyfon*7_name', 'Green Mode Armchair'), + ('club_habbo.bottombar.link.member', '%days% days'), + ('habboclub_confirm_header', 'Subscription costs %price% credits'), + ('furni_rare_daffodil_rug_desc', 'A little bit of outdoors indoors..'), + ('poster_15_name', 'Himalayas Poster'), + ('furni_smooth_table_polyfon_desc', 'For larger gatherings'), + ('dance2', 'Pogo Mogo'), + ('furni_wooden_screen*3_name', 'Aqua Oriental Screen'), + ('furni_plant_cruddy_desc', 'Goodbye Bert...'), + ('dance1', 'Hab-Hop'), + ('furni_gothic_chair*6_desc', 'The dark side of Habbo'), + ('furni_table_plasto_square*9_name', 'Square Dining Table'), + ('nav_venue_bb_lobby_beginner_14/0_desc', ''), + ('furni_club_sofa_desc', 'Club sofa'), + ('roomevent_default_name', 'Event name..'), + ('game_poker_ok', 'Change cards'), + ('nav_venue_picnic_dudesons/0_desc', 'Duudsoneiden sponssaama oma Ranchi - www.extremeduudsonit.com'), + ('nav_venue_hallway/0_desc', 'Beware the ghosts and ghouls!'), + ('nav_venue_park/0_desc', 'Go for a stroll outdoors'), + ('console_fr_declined_count', 'Amount to be declined'), + ('furni_tree4_name', 'Christmas Tree 2'), + ('NUF_console_read_link', 'Click the link to open the message.'), + ('win_figurecreator', 'Habbo Details'), + ('furni_table_plasto_square*14_name', 'Occasional Table'), + ('furni_soft_sofachair_norja*6_desc', 'Blue Iced Sofachair'), + ('nav_venue_bb_lobby_beginner_0_name', 'Beginner'), + ('Alert_LogoNameAlreadyUse', 'That name is already being used'), + ('poster_25_name', 'Snowman Poster'), + ('furni_pura_mdl2*2_name', 'Pink Pura Module 2'), + ('furni_chair_plasto*13_name', 'Chair'), + ('furni_ticket_name', 'Small Ticket Bundle'), + ('furni_hc_lmpst_name', 'Victorian Street Light'), + ('furni_scifiport*7_desc', 'Energy beams. No trespassers!'), + ('jukebox_load_trax', 'Load Trax'), + ('furni_val_teddy*4_desc', 'The brown bear of naughtiness'), + ('reg_birthdayformat_update', 'Birthday (dd.mm.yyyy)'), + ('nav_venue_the_chromide_club_name', 'The Chromide Club'), + ('roomevent_not_available', 'Sorry, no events available'), + ('nav_venue_sw_lobby_beginner_0/0_desc', ''), + ('summer_chair_3_name', 'Black Deck Chair'), + ('int_newrequests', 'Friend Request(s)'), + ('console_profile_helptext', 'The Habbo Profile is a snapshot of your interests and hobbies - simply tick the things you like.'), + ('nav_roomnfo_hd_fav', 'Favourite Rooms'), + ('furni_chair_plasto*3_desc', 'Hip plastic furniture'), + ('furni_chair_basic*6_name', 'Blue Pura Egg Chair'), + ('number_4', '4'), + ('number_3', '3'), + ('number_2', '2'), + ('room_open_package', 'Open The Present'), + ('furni_grunge_barrel_name', 'Flaming Barrel'), + ('wallitem_photo_desc', 'Photo from Habbo'), + ('poster_30_desc', 'Pucker up'), + ('furni_glass_table*9_desc', 'Translucent beauty'), + ('nav_venue_sw_lobby_beginner_3_name', 'Snow Rookies Lobby'), + ('Alert_YouAreBanned', 'You have been banned for breaking the Habbo Way. This is why (if no ban reason is shown use the Contact Us form):'), + ('furni_gothic_sofa*2_name', 'Golden Gothic Sofa'), + ('NUF_getting_items_hotelview_tutor', 'Let us find out how to purchase items from the Hotel Catalogue. The Catalogue contains loads of cool stuff to decorate your Habbo room with. To begin open the Navigator.'), + ('furni_table_norja_med*2_desc', 'For larger gatherings'), + ('furni_sofa_silo*3_name', 'White Two-Seater Sofa'), + ('furni_pura_mdl5*5_desc', ''), + ('nav_venue_sw_lobby_beginner_desc', 'Yes, take a load of snowballs and hit the enemy Teams. Easy, isn\'t it?'), + ('furni_romantique_smalltabl*5_name', 'Onyx Tray Table'), + ('furni_divider_nor4_desc', 'Habbos, roll out!'), + ('furni_shelves_norja*7_desc', 'For nic naks and cookery books'), + ('nav_venue_sw_lobby_intermediate_4/0_desc', 'Lumisota sen kuin vain kovenee.'), + ('gs_text_spectate', 'You can watch this game'), + ('recycler_info_link', 'More information about Furni Recycler'), + ('furni_sofachair_polyfon_name', 'Armchair'), + ('club_intro_text', 'Members of Habbo Club get LOTS of cool stuff!\\rWith Habbo Club you get cool dances, access to Club Mammoth and The Blue Dragon Tavern, and a 500 limit on your friends list!'), + ('furni_divider_nor1*7_desc', 'The missing piece'), + ('url_helppledge', 'http://%predefined%//help/22'), + ('jukebox_song_name', '%name%'), + ('game_bs_won', 'WON!'), + ('furni_soft_jaggara_norja_name', 'Iced Sofachair'), + ('furni_rare_beehive_bulb_desc', 'A honey-hued glow'), + ('furni_chair_norja*8_name', 'Yellow Chair'), + ('poster_83_desc', 'Pöllö huhuilee, huhuu!'), + ('floodblocking', 'You are typing too fast - don\'t flood the room.'), + ('furni_CF_5_coin_silver_desc', 'Worth 5 Credits'), + ('sound_machine_confirm_clear', 'Clear the song?'), + ('furni_carpet_standard*6_name', 'Floor Rug'), + ('furni_waterbowl*2_desc', 'Aqua unlimited'), + ('sw_link_tournament_highScores_url', 'http://%predefined%//groups/56553/id'), + ('NUF_meeting_people_room_tutor', 'This is a Public Room. Your Habbo is in the doorway beneath the orange arrow. Click on another user to find out more about them.'), + ('furni_bottle_name', 'Empty Spinning Bottle'), + ('poster_512_name', 'The Irish flag'), + ('club_info_url', 'http://%predefined%//credits/habboclub'), + ('nav_venue_tv_studio_nike/0_desc', ''), + ('furni_couch_norja*6_desc', 'Two can perch comfortably'), + ('furni_pura_mdl5*8_desc', 'Any way you like it!'), + ('furni_carpet_valentine_desc', 'For making an appearance'), + ('furni_floortile_desc', 'In Variety of Colours'), + ('furni_pillar*9_name', 'Rock Pillar'), + ('furni_table_plasto_bigsquare*3_name', 'Square Dining Table'), + ('furni_bardeskcorner_polyfon*12_name', 'Corner Cabinet/Desk'), + ('furni_divider_nor1*4_desc', 'The missing piece'), + ('furni_chair_plasty*5_name', 'Plastic Pod Chair'), + ('furni_scifirocket*0_desc', 'See in 2007 with a bang!'), + ('poster_32_name', 'Siva Poster'), + ('club_button_2_period', 'Buy 3 >>>'), + ('furni_sound_set_58_desc', 'Sh-shake it!'), + ('furni_china_shelve_desc', 'To hold the mind\'s treasures'), + ('furni_scifidoor*7_desc', 'There out of this world!'), + ('furni_chair_silo*9_name', 'Red Silo Dining Chair'), + ('furni_gothic_stool*5_name', 'Green Gothic Stool'), + ('friend_request_massoperation_cancel', 'Back to request list.'), + ('furni_queue_tile1*0_name', 'White Quest Roller'), + ('furni_divider_nor3*5_name', 'Pink Iced gate'), + ('furni_sound_machine*5_desc', 'Heard the Habbo Bands new singles?'), + ('furni_glass_table*6_desc', 'Translucent beauty'), + ('furni_soft_sofachair_norja*9_desc', 'Red Iced Sofachair'), + ('furni_plant_mazegate_desc', 'Did we make it?'), + ('tickets_info_1', 'With 2 tickets you can play the following Games:\\r10 BattleBall:Rebound!\\r10 SnowStorm\\r20 Wobble Squabble or\\r20 Lido Diving'), + ('furni_barchair_silo*4_desc', 'Practical and convenient'), + ('furni_CF_10_coin_gold_name', 'Gold Coin'), + ('tickets_info_2', 'With 20 tickets you can play the following Games:\\r10 BattleBall:Rebound!\\r10 SnowStorm\\r20 Wobble Squabble or\\r20 Lido Diving'), + ('furni_sound_set_15_desc', 'Unadulterated essentials'), + ('handitem1', 'Tea'), + ('furni_romantique_divan*3_desc', 'null'), + ('furni_glass_sofa*8_name', 'Glass sofa'), + ('epsnotify_1001', 'The hotel is full at the moment. Please try again in a few minutes.'), + ('furni_table_silo_med*2_name', 'Black Coffee Table'), + ('furni_sleepingbag*7_name', 'Orange Sleeping Bag'), + ('furni_pillow*5_desc', 'Puffy, soft and huge'), + ('furni_bed_budget*1_desc', 'King sized comfort!'), + ('furni_bed_trad_one_name', 'Plain Single Bed'), + ('catalog_giftfor', 'This is a gift for:'), + ('furni_theatre_seat_name', 'Deluxe Theatre Chair'), + ('furni_romantique_divider*3_name', 'Turquoise Screen'), + ('furni_shelves_silo_desc', 'For nic naks and art deco books'), + ('handitem9', 'Decaff'), + ('handitem8', 'Regular'), + ('handitem7', 'Water'), + ('furni_glass_table_name', 'Glass table'), + ('console_selection_invert', 'Invert selection'), + ('handitem6', 'Blackcurrant'), + ('furni_hc_machine_desc', 'By and for mad inventors'), + ('handitem5', 'Milk'), + ('handitem4', 'Ice-cream'), + ('poster_40_desc', 'The one and only. Adore her!'), + ('nav_venue_sw_lobby_tournament_9/0_desc', ''), + ('handitem3', 'Carrot'), + ('handitem2', 'Juice'), + ('furni_cn_sofa_name', 'Chinese Sofa'), + ('nav_venue_bb_lobby_expert_4/0_desc', ''), + ('poster_502_name', 'The Stars and Stripes'), + ('furni_md_rug_name', 'Bubble Juice Floor'), + ('furni_table_plasto_bigsquare_name', 'Square Dining Table'), + ('furni_bed_polyfon*8_desc', 'Yellow Mode Double Bed'), + ('nav_venue_sw_lobby_amateur_7_name', 'Snow Slingers Lobby'), + ('furni_birdie_desc', 'Cheep (!) and cheerful'), + ('poster_12_name', 'Lapland Poster'), + ('club_desc_1_period', '1 Month (31 days) = 25 Credits'), + ('hobba_emergency_help', 'Call For Emergency Help:'), + ('reg_age_check_note', 'Enter your birthday. You will need your birthday information when changing your password or email.'), + ('furni_table_plasto_square*6_name', 'Square Dining Table'), + ('trade', 'Trade'), + ('furni_romantique_smalltabl*3_desc', 'Every tray needs a table...'), + ('reg_back', 'Back'), + ('furni_tree7_name', 'Snowy Christmas Tree'), + ('recycler_trader_open_alert', 'Recycling cannot begin while you are trading. Please close the safe trading box before recycling.'), + ('furni_rare_dragonlamp*8_desc', 'Scary and scorching!'), + ('furni_gothic_chair*3_desc', 'The head of the table'), + ('Alert_YourNameIstooShort', 'Habbo names must be at least 3 characters long.'), + ('furni_bed_budgetb_desc', 'Sweet dreams for two'), + ('furni_shelves_basic_name', 'Pura Shelves'), + ('console_messagemode_helptext', 'You can send an instant message to your Habbo Friends.'), + ('nav_venue_cunning_fox_gamehall/5_desc', 'Get a hand like a foot? Keep a straight face and bluff it out'), + ('furni_table_polyfon_small_name', 'Small Coffee Table'), + ('move_furniture', 'Move Furni'), + ('nav_searchbutton', 'Search'), + ('furni_habboween_grass_desc', 'Autumnal chills with each rotation!'), + ('furni_pura_mdl5*2_desc', 'Any way you like it!'), + ('NUF_meeting_people_user_tutor', 'The user you clicked on is shown in the corner of your screen. The buttons beneath the Habbo let you visit their Habbo Home, send them a Friend Request or ignore them if they look or act like a moron.'), + ('poster_55_name', 'Tree of Time'), + ('furni_soft_sofachair_norja*5_name', 'Pink Iced Sofachair'), + ('furni_sound_set_48_name', 'Club 3'), + ('furni_table_plasto_4leg_desc', 'Hip plastic furniture'), + ('furni_pura_mdl4*1_name', 'Aqua Pura Module 4'), + ('login_forgottenPassword_url', 'https://www.habbo.co.uk/account/password/forgot'), + ('nav_venue_floatinggarden/0_desc', 'Peace, tranquility and still waters'), + ('furni_sound_set_36_desc', 'For adult minded'), + ('poster_43_desc', 'Shake, rattle and roll'), + ('furni_gothic_stool*3_desc', 'The dark side of Habbo'), + ('room_alert_furni_limit', 'This room has the maximum amount of Furni.'), + ('furni_table_plasto_square*15_name', 'Occasional Table'), + ('furni_rare_hammock_name', 'Hammock'), + ('sound_machine_confirm_burn_long', 'Are you sure you want to burn this song to disc? Burning costs one credit.'), + ('furni_rclr_chair_desc', 'Watch out for coconuts'), + ('furni_chair_basic*3_desc', 'It\'s a cracking design!'), + ('furni_doormat_plain*6_name', 'Doormat'), + ('furni_sofachair_polyfon*9_name', 'Red Armchair'), + ('furni_jp_tray6_name', 'jp_tray6'), + ('furni_habbocake_name', 'Cake'), + ('poster_501_name', 'Jolly Roger'), + ('nav_goingprivate', 'Going to Guest room'), + ('furni_bed_budget_one*9_name', 'Red Pura Bed'), + ('alert_no_category', 'Your room has no category. Select one from the list.'), + ('nav_venue_theatredrome_easter/0_desc', ''), + ('gs_button_buytickets', 'Buy Tickets'), + ('nav_venue_bouncer_room_4_name', 'Experts Battle Ball Arena'), + ('close', 'Close'), + ('furni_carpet_standard*9_desc', 'Available in a variety of colours'), + ('furni_prizetrophy4*1_desc', 'Glittery gold'), + ('help_pointer_1', 'http://www.habbo.co.uk/help/'), + ('help_pointer_3', 'emergency_help'), + ('furni_rclr_lamp_name', 'Moon Lamp'), + ('help_pointer_2', 'http://www.habbohotel.co.uk/iot/go?lang=en&country=uk'), + ('furni_exe_sofa_desc', 'Relaxing leather comfort'), + ('furni_divider_silo1*4_name', 'Beige Area Corner Shelf'), + ('poster_2001_name', 'SeinNightitititititdiskotappaja'), + ('interface_icon_tv_close', 'Leave the Room and close the Habbovision mode.'), + ('furni_sound_machine*7_name', 'Red Traxmachine'), + ('game_bs_hit', 'A Hit!:'), + ('furni_rare_fan*2_desc', 'It\'ll blow you away!'), + ('win_place', 'Note!'), + ('nav_venue_bb_lobby_beginner_11_name', 'Beginners Battle Ball 12'), + ('furni_pillow*7_desc', 'Bonnie\'s pillow of choice!'), + ('furni_table_silo_small*8_desc', 'For those random moments'), + ('furni_divider_nor4*5_desc', 'Habbos, roll out!'), + ('hubu_vastaa', 'Answer the question'), + ('furni_pura_mdl4*8_name', 'yellow pura module 4'), + ('furni_glass_chair*9_name', 'Glass chair'), + ('furni_chair_silo*7_desc', 'Green Silo Dining Chair'), + ('furni_jp_drawer_desc', 'Spiritual home for odds and ends'), + ('tutorial_select_another_topic', 'Select another topic'), + ('furni_noob_lamp*4_desc', 'Get the light right where you want it (light blue)'), + ('nav_venue_beauty_salon_general_name', 'Beauty salon'), + ('furni_sofachair_polyfon*2_name', 'Black Mode Armchair'), + ('console_report_header', 'Report Abusive Message'), + ('club_buy_url', 'http://%predefined%//credits/habboclub'), + ('furni_prizetrophy*2_name', 'Classic trophy'), + ('furni_rare_icecream*4_name', 'Strawberry Ice Cream Machine'), + ('furni_barchair_silo*5_desc', 'Practical and convenient'), + ('furni_divider_nor2*4_desc', 'No way through'), + ('furni_xmas_cstl_gate_name', 'Ice Castle Gate'), + ('furni_noob_stool*5_desc', 'Unfold me and take the weight off (pink)'), + ('furni_bed_budgetb_one_name', 'Plain Single Bed'), + ('friend_request_accept_all', 'Accept all requests.'), + ('furni_val_choco_name', 'Heart Shaped Box'), + ('poster_514_desc', 'Be proud to be in the Union!'), + ('furni_carpet_legocourt_desc', 'Line up your slam dunk'), + ('furni_sofa_silo_name', 'Two-Seater Sofa'), + ('furni_chair_plasto*8_desc', 'Hip plastic furniture'), + ('furni_tree5_name', 'Christmas Tree 3'), + ('nav_venue_habbo_cinema/0_desc', 'Now showing: Kick Warz II - The revenge of Donnie Santini!'), + ('furni_couch_norja*4_name', 'Urban Iced Bench'), + ('poster_52_desc', 'whack that ball!'), + ('furni_sound_set_45_desc', 'The Bass? is the rhythm!'), + ('nav_venue_sun_terrace/0_name', 'Sun Terrace'), + ('queue_tile_limit', 'You can\'t fit more Habbo Rollers in this room!'), + ('BuddyRequesta', 'Friend Request(s)'), + ('transaction_system_sms_rl', 'Elisa'), + ('furni_prizetrophy4_desc', 'Palkinto'), + ('furni_hcamme_desc', 'Time for a soak'), + ('furni_scifirocket*2_name', 'Earth Smoke Machine'), + ('furni_divider_nor5*2_desc', 'Cool cornering for your crib y0!'), + ('forgottenpw', 'Forgotten your password?'), + ('furni_rclr_sofa_desc', 'Snuggle up together'), + ('furni_val_cauldron_desc', 'Cast a loving spell!'), + ('poster_3_name', 'Fish Plaque'), + ('furni_one_way_door*8_name', 'Yellow One Way Gate'), + ('furni_divider_nor3*8_desc', 'Yellow Iced gate'), + ('sw_link_highScores_url', 'http://%predefined%//groups/56553/id'), + ('furni_carpet_standard*2_desc', 'Available in a variety of colours'), + ('nav_venue_sport/0_name', 'The Power Gym'), + ('furni_scifidoor*3_desc', 'There out of this world!'), + ('furni_pillar*7_desc', 'Recovered from Habblantis'), + ('furni_arabian_tray3_name', 'Sweets Tray'), + ('furni_chair_plasto_name', 'Chair'), + ('nav_venue_pizza_name', 'Slice of Life'), + ('url_privacypledge', 'http://%predefined%//help/69'), + ('furni_one_way_door*3_desc', 'One way! The HC way!'), + ('catalog_purchase_not_allowed_hc', 'In order to buy this item you must be a Habbo Club member!'), + ('furni_pura_mdl3*4_name', 'White Pura Module 3'), + ('room_confirmDelete', 'Confirm'), + ('BuddyPrivateRoom', 'In A Guest Room'), + ('furni_marquee*7_desc', 'It\'s both door and a shade!'), + ('furni_bath_desc', 'The ultimate in pampering'), + ('furni_soft_sofa_norja*3_desc', 'Pristine white, keep it clean!'), + ('game_BattleShip', 'Battleships'), + ('furni_sound_set_11_desc', 'Music you can really sink your teeth into'), + ('furni_glass_chair*2_name', 'Glass chair'), + ('furni_sofa_silo*5_desc', 'Pink Area Sofa'), + ('furni_pura_mdl2*7_name', 'Green Pura Module 2'), + ('cam_film.help', 'Number Of Photos Left'), + ('nav_venue_bb_lobby_tournament_17/0_desc', ''), + ('roomatic_hway', 'Hotel guests are expected to follow the Habbo Way even if word filtering is switched off.'), + ('modify', 'Modify'), + ('furni_sofachair_silo*8_name', 'Yellow Armchair'), + ('alert_reg_blocked', 'A person under 11 years of age has tried to register from this machine recently.\\rRegistration is not possible for a while.'), + ('furni_sofa_polyfon*8_desc', 'Yellow Mode Sofa'), + ('furni_wooden_screen*9_desc', 'Add an exotic touch to your room'), + ('hobba_message_from', 'Your call has been responded to as follows:'), + ('win_help', 'Habbo Help'), + ('pet.saying.sniff.dog.1', 'snuh...SNUUUUUH'), + ('pet.saying.sniff.dog.0', 'snuuh..snuuh'), + ('sw_user_skill', 'Snow Storm Skill Level: \\x \\r (\\y points)'), + ('furni_rom_lamp_desc', 'Light up your life'), + ('console_profile_create', 'Create your Habbo Profile.'), + ('furni_CF_50_goldbar_desc', 'Worth 50 Credits'), + ('furni_romantique_chair*4_desc', 'What does this button do?'), + ('reg_use_allowed_chars', 'Use only these characters:'), + ('furni_bar_chair_armas_name', 'Barrel Stool'), + ('pet.saying.sniff.dog.2', '*sighs*'), + ('furni_sound_set_64_name', 'Alhambra Trax 3'), + ('furni_pillar*3_name', 'blue pillar'), + ('furni_glass_chair*4_desc', 'Translucent beauty'), + ('furni_pizza_desc', 'You dirty Habbo'), + ('opening_hours_text_shutdown', 'The Hotel will shut down in %d% minutes. To avoid confusion, purchasing of furniture, Habbo Club and game tickets will be disabled during that time, as well as playing Games and furniture trading. Thank you for visiting and welcome back tomorrow!'), + ('nav_venue_bb_lobby_tournament_10_name', 'Competitie Battle Ball 11'), + ('poster_521_desc', 'Ordem e progresso'), + ('furni_sound_set_52_desc', 'Under the mistletoe!'), + ('furni_shelves_norja*3_name', 'White Iced Bookcase'), + ('furni_scifiport*5_desc', 'Recovered from Roswell'), + ('help_emergency_writeyour', 'Give details of your emergency here:'), + ('furni_table_norja_med*6_name', 'Large Coffee Table Blue'), + ('nav_venue_bb_lobby_expert_3_name', 'Experts Battle Ball 4'), + ('photo_legend', 'Caption'), + ('furni_sofachair_silo_desc', 'Large, but worth it'), + ('console_youdonthavebuddies', 'You have no Friends on your list.\\rYou can send Friend Requests using\\rthe \'search\' button.'), + ('furni_table_plasto_4leg*6_name', 'Occasional table Table'), + ('furni_scifidoor*1_name', 'Pink Spaceship Door'), + ('furni_tile_brown_desc', '10% off downtown promenades & piazzas!'), + ('NUF_getting_room_go_button', 'Click here to go to your just created room!'), + ('dimmer_turn_on', 'Turn ON'), + ('furni_sofa_polyfon_desc', 'Comfort for stylish couples'), + ('furni_sound_set_50_name', 'Club 5'), + ('furni_doorB_name', 'Wardrobe'), + ('reg_agree1', 'Yes, my parents and I agree to the above terms. I am allowed to use Habbo Hotel.'), + ('furni_chair_silo*3_name', 'White Dining Chair'), + ('furni_CF_1_coin_bronze_desc', 'Worth 1 Credits'), + ('reg_agree2', 'Yes, I have read the Habbo Hotel Terms of Service and I accept them'), + ('you_have_pending_cfh', 'Your previous call for help has not been answered yet. To make a new one you must delete the old message.'), + ('furni_table_plasto_bigsquare*7_name', 'Square Dining Table'), + ('console_accept', 'Accept'), + ('furni_lamp_basic_name', 'Pura Lamp'), + ('console_friend_request_error', 'There was an error with friend requests'), + ('poster_11_desc', 'I obey the Habbo way!'), + ('furni_bardeskcorner_polyfon*6_name', 'Blue Mode Bardesk Corner'), + ('furni_plant_sunflower_name', 'Cut Sunflower'), + ('furni_traffic_light*3_name', 'Purple Traffic Light'), + ('furni_bed_polyfon_one*8_name', 'Yellow Mode Single Bed'), + ('furni_carpet_polar*1_desc', 'Cute'), + ('furni_noob_rug*1_desc', 'Nice and neat sisal rug with orange edging'), + ('furni_exe_bardesk_desc', 'Divide the profits!'), + ('furni_romantique_divider*4_desc', 'Keeping things separated'), + ('pet_status_dialog', '%name%'), + ('furni_jp_lantern_name', 'Japanese Lantern'), + ('furni_chair_norja*2_name', 'Black Chair'), + ('furni_jp_irori_desc', 'Traditional heating and eating'), + ('furni_bed_budget*5_name', 'Beige Pura Double Bed'), + ('furni_scifidoor*8_name', 'Purple Spaceship Door'), + ('nav_venue_sw_lobby_free_5_name', 'Free Game Lobby'), + ('wallitem_jp_sheet2_desc', 'jp_sheet2'), + ('furni_glass_sofa*9_desc', 'Translucent beauty'), + ('furni_divider_nor5*7_name', 'Rural Iced Angle'), + ('sound_machine_open_editor', 'Trax Editor'), + ('furni_jp_tatami2_desc', 'Shoes off please'), + ('furni_sound_set_16_name', 'Hip Hop Beats 3'), + ('console_recipients', 'Recipient(s)'), + ('catalog_page', 'page'), + ('poster_23_name', 'Bat Poster'), + ('furni_table_plasto_round*4_name', 'Square Dining Table'), + ('furni_rubberchair*2_desc', 'Soft and tearproof!'), + ('nav_venue_bb_lobby_beginner_16/0_desc', ''), + ('poster_1005_name', 'Johnny Squabble'), + ('furni_silo_studydesk_name', 'Area Quest Desk'), + ('furni_table_plasto_4leg*1_desc', 'Hip plastic furniture'), + ('nav_venue_basement_lobby/0_desc', 'For low level hanging'), + ('furni_rare_parasol*3_desc', 'Block those rays!'), + ('furni_arabian_wndw_name', 'Arabian Window Frame'), + ('Alert_ConnectionFailure', 'Disconnected'), + ('furni_house_desc', 'Good enough to eat'), + ('console_confirm_selected', 'Confirm the selections. Below are the amount of friend requests that will be accepted and declined. If you want, you can still modify the selections.'), + ('furni_table_plasto_4leg*4_name', 'Square Dining Table'), + ('furni_sound_set_57_name', 'RnB Grooves 3'), + ('hubu_h3', 'Huumetietobussi'), + ('furni_table_plasto_bigsquare*2_name', 'Square Dining Table'), + ('hubu_h4', 'Anna palautetta'), + ('hubu_h1', 'Puhelintuki'), + ('roomatic_bobbafilter', 'Bobba filter (filters out bad language)'), + ('hubu_h2', 'Harrastamaan!'), + ('furni_tv_luxus_desc', 'Bang up to date'), + ('hubu_h5', 'Huumetietoa'), + ('NUF_console_hotelview_icon', 'Click the button to open your Habbo Console.'), + ('modtool_banlength', 'Ban Length:'), + ('NUF_visiting_rooms_roomlist_tutor', 'Just pick any room you like. Click on the room to see a description of the room. ROOM!'), + ('reg_verification_newPassword', 'New password:'), + ('furni_wall_china_name', 'Dragon Screen'), + ('nav_venue_hallway_ii/0_desc', 'Beware witches and warlocks'), + ('jukebox_disk_add', 'Add Disc'), + ('furni_rare_xmas_screen_desc', 'Ho Ho Ho!'), + ('furni_table_plasto_round*2_name', 'Round Dining Table'), + ('furni_rubberchair*7_name', 'White Inflatable Chair'), + ('nav_favourites_helptext', 'These are your favourite rooms. Nice selection you have here...'), + ('nav_venue_sw_lobby_beginner_4_name', 'Snow Rookies Lobby'), + ('furni_gothic_chair*2_desc', 'The prince of Habbo'), + ('cam_save_nofilm', 'You have run out of film.\\rGet a roll (5 photos) from\\rthe Catalogue for 6 Credits.'), + ('furni_sofa_polyfon*6_desc', 'Blue Mode Sofa'), + ('furni_divider_silo3*2_desc', 'Form following function'), + ('furni_rare_beehive_bulb*1_name', 'Red Amber Lamp'), + ('furni_plant_small_cactus_desc', 'Even less watering than the real world'), + ('furni_triplecandle_name', 'Electric Candles'), + ('help_option_1', 'Playing Habbo'), + ('help_option_3', 'A serious issue (harassment, sexual behaviour)'), + ('furni_present_gen5_name', 'Gift'), + ('help_option_2', 'My Habbo account.'), + ('furni_shelves_norja*8_name', 'Yellow Bookcase'), + ('furni_legotrophy_desc', 'For the winning team'), + ('furni_rare_icecream*2_name', 'Pistachio Ice Cream Machine'), + ('furni_summer_pool*1_desc', 'Fancy a dip?'), + ('nav_venue_theatredrome_deli/0_desc', 'Join in all the fun of the fair!'), + ('game_newgame', 'New game'), + ('help_tour', 'Guided Tour'), + ('purse_vouchers_error3_url', 'http://%predefined%//credits'), + ('furni_marquee*5_name', 'Graphite Marquee'), + ('forgottenpw_explanation', 'If you have forgotten your password and you gave your correct email address when you registered, we can send your password to you.'), + ('furni_waterbowl*3_name', 'Yellow Water Bowl'), + ('roomatic_namedisp', 'Do you want your name to be displayed with the room?'), + ('poster_28_name', 'Silver Tinsel Bundle'), + ('Alert_BuyingOK', 'Buying Successful!'), + ('furni_summer_chair*4_name', 'Deck Chair'), + ('nav_venue_welcome_lounge_ii/0_desc', 'New? Lost? Get a warm welcome here from Habbo eXperts.'), + ('bb_title_gameCreation', 'Aloita uusi peli!'), + ('furni_sporttrack1*3_name', 'Sport track straight grass'), + ('furni_romantique_divan*2_name', 'Emerald Chaise-Longue'), + ('furni_divider_silo1*6_name', 'Blue Area Corner Shelf'), + ('NUF_about_hotel_about_tutor', 'Habbo is both a virtual world and an online community.'), + ('url_helpparents', 'http://%predefined%//help/73'), + ('furni_divider_silo3*7_name', 'Green Area Gate'), + ('poster_18_desc', 'Beautiful reproduction butterfly'), + ('furni_traffic_light*5_desc', 'Chill and wait your turn!'), + ('furni_scifirocket*6_desc', 'Too hot to handle!'), + ('pet.saying.angry.cat.0', 'Sssppp!'), + ('furni_bed_armas_one_desc', 'Rustic charm for one'), + ('pet.saying.angry.cat.3', '*hiss*'), + ('pet.saying.angry.cat.1', 'MrrRRRR'), + ('pet.saying.angry.cat.2', 'Tssssss!'), + ('furni_noob_rug*6_name', 'My first Habbo rug'), + ('club_habbo.bottombar.text.member', 'Habbo Club'), + ('furni_divider_silo1_name', 'Corner Shelf'), + ('nav_venue_bb_lobby_beginner_10/0_desc', ''), + ('recycler_info_progress', 'Recycling is currently in progress. The recycling process takes a total of %recyclinghours% hour. You can leave the catalogue and recycling will continue in the background.'), + ('furni_queue_tile1*1_name', 'Pink Habbo Roller'), + ('notickets_header', 'Buy game tickets to play this game'), + ('reg_underage', 'I am under 11 years old'), + ('nav_venue_sw_arena_intermediate_name', 'Playing intermediate game'), + ('furni_table_plasto_square*5_name', 'Square Dining Table'), + ('Alert_YouAreBanned_T', 'A Moderator kicked you out of the room.'), + ('buddyremove_moreoptions', 'More Options >>'), + ('furni_prizetrophy4*3_desc', 'Breathtaking bronze'), + ('furni_chair_silo*2_desc', 'Keep it simple'), + ('club_habbo.bottombar.link.notmember', 'Join!'), + ('poster_1000_name', 'Comedy Poster'), + ('room_badge_button', 'Badge'), + ('furni_soft_sofa_norja*8_desc', 'Yellow Iced Sofa'), + ('wallitem_torch_name', 'Gothic Torch'), + ('furni_scifirocket*7_name', 'Jupiter Smoke Machine'), + ('furni_romantique_tray1_desc', 'For a fast break'), + ('furni_rare_dragonlamp*0_desc', 'George and the...'), + ('furni_nest_desc', 'Night, night'), + ('furni_table_silo_small*2_name', 'Black Occasional Table'), + ('furni_prizetrophy7*2_name', 'Silver Habbo trophy'), + ('furni_sofachair_silo*3_desc', 'Large, but worth it'), + ('furni_divider_nor2*9_name', 'Red Iced bar desk'), + ('club_extend_title', 'Habbo Club membership can be extended VERY easily.'), + ('furni_rare_fan*0_desc', 'As red as Rudolph\'s nose'), + ('club_paybycash_url', '(leave this empty if you don\'t want to have this link displayed)'), + ('poster_57_name', 'Calligraphy poster'), + ('furni_CFC_50_coin_silver_desc', 'Worth 50 Credits'), + ('furni_pillow*5_name', 'Black Leather Pillow'), + ('furni_hc_chr_name', 'Majestic Chair'), + ('nav_venue_sw_arena_free_name', 'Playing free for all game'), + ('furni_active_placeholder_desc', 'This furniture is downloading...'), + ('nav_venue_welcome_lounge_name', 'Welcome Lounge'), + ('furni_soft_sofachair_norja*3_name', 'White Iced Sofachair'), + ('furni_bed_polyfon*3_desc', 'Give yourself space to stretch out'), + ('furni_pura_mdl4*3_name', 'Black Pura Module 4'), + ('furni_pillar*2_desc', 'Ancient and stately'), + ('furni_small_chair_armas_desc', 'Rustic charm at it\'s best'), + ('furni_table_plasto_round_desc', 'Hip plastic furniture'), + ('furni_marquee*2_desc', 'Dragons out and Davids in!'), + ('furni_wooden_screen*7_desc', 'Add an exotic touch to your room'), + ('furni_queue_tile1*8_name', 'Navy Habbo Roller'), + ('furni_arabian_pllw_desc', 'Exotic comfort'), + ('furni_sound_set_1_desc', 'Get the party started!'), + ('furni_gothic_stool*5_desc', 'The dark side of Habbo'), + ('furni_china_table_desc', 'Exotic and classy'), + ('song_disk_trade_info', '%name%'), + ('nav_venue_sw_lobby_beginner_9_name', 'Snow Rookies Lobby'), + ('console_modify', 'Modify'), + ('poster_36_desc', 'The Hotels girlband. Dream on!'), + ('furni_rare_dragonlamp*7_desc', 'Scary and scorching!'), + ('furni_sound_set_63_desc', 'Desert hits by the oasis!'), + ('nav_venue_cafe_gold_name', 'The Oasis'), + ('nav_venue_sw_lobby_tournament_3/0_desc', ''), + ('nav_venue_habbo_cinema_name', 'Habbo Cinema'), + ('furni_chair_plasty*4_name', 'Plastic Pod Chair'), + ('nav_venue_welcome_lounge_iii/0_desc', 'New? Lost? Get a warm welcome here from Habbo eXperts.'), + ('furni_carpet_soft*1_desc', 'Soft Wool Rug'), + ('furni_sporttrack1*1_name', 'Sport track straight'), + ('furni_divider_nor3*6_name', 'Blue Iced gate'), + ('furni_glass_chair*7_name', 'Green Glass Chair'), + ('club_confirm_gift_text', 'A new club gift has arrived. Please push OK if you want to receive it now. If you click cancel you will be asked again next time you log in to the Hotel.'), + ('furni_rubberchair*5_name', 'Lime Inflatable Chair'), + ('furni_plant_maze_snow_name', 'Snowy Maze Bundle 2'), + ('furni_table_silo_med*4_name', 'Beige Area Coffee Table'), + ('furni_solarium_norja*1_desc', 'Rejuvenate your pixels!'), + ('furni_divider_nor2*2_name', 'Black Iced bar desk'), + ('poster_45_desc', 'Needs a few more Habburgers'), + ('wallitem_habw_mirror_desc', 'Star of the show!'), + ('furni_pura_mdl3*9_name', 'Red Pura Module 3'), + ('furni_exe_corner_name', 'Executive Corner Desk'), + ('nav_venue_cunning_fox_gamehall/3_desc', 'Are you the new Deep Blue?'), + ('furni_rare_fan*7_desc', 'It\'ll blow you away!'), + ('furni_divider_nor1*5_desc', 'Pink Ice corner'), + ('wallitem_md_logo_wall_name', 'Bubble Juice Logo'), + ('furni_bardesk_polyfon_desc', 'Perfect for work or play'), + ('console_target_does_not_accept', 'This user does not accept friend requests at the moment'), + ('pet.saying.beg.croco.0', 'Mmmmmrrr'), + ('pet.saying.beg.croco.1', '*Emo tear*'), + ('messenger.email.header', ''), + ('pet.saying.beg.croco.2', 'Waarrrr...rrr'), + ('furni_carpet_polar*4_name', 'Green Bear Rug'), + ('furni_chair_plasto*6_name', 'Chair'), + ('furni_noob_rug*4_name', 'My first Habbo rug'), + ('furni_summer_chair*6_desc', 'Blue'), + ('rotate_furniture', 'Rotate Furni'), + ('poster_16_desc', 'Added security'), + ('furni_sofachair_silo*7_desc', 'Green Area Armchair'), + ('furni_divider_nor5*4_desc', 'Cool cornering for your crib!'), + ('furni_sand_cstl_twr_name', 'sand_cstl_twr'), + ('furni_safe_silo*4_name', 'Beige Safe Minibar'), + ('furni_chair_plasty*11_name', 'Plastic Pod Chair'), + ('furni_divider_arm2_name', 'Room divider'), + ('furni_sound_set_55_name', 'RnB Grooves 1'), + ('nav_venue_sw_lobby_intermediate_4_name', 'Snow Bombardiers Lobby'), + ('roomatic_canmodifysettings', '(You can change these settings later)'), + ('furni_pura_mdl5*7_desc', 'Any way you like it!'), + ('catalog_pet_name_length', 'Oops, pet\'s name is too long (max 15 characters)'), + ('furni_toy1*3_name', 'Rubber Ball'), + ('nav_venue_beauty_salon_loreal/0_desc', 'No Pixel Surgery, only natural make-ups!'), + ('furni_arabian_swords_name', 'Ancestral Scimitars'), + ('furni_summer_pool*4_name', 'Yellow Summer Pool'), + ('gs_error_create_0', 'This Lobby is full, please create a Game in another Lobby!'), + ('nav_venue_pizzeria/0_desc', 'Pizza; food of the hungry!'), + ('nav_roomnfo_hd_own', 'Own Rooms'), + ('furni_glass_sofa*4_desc', 'Translucent beauty'), + ('buddyremove_accept', 'Remove Friends'), + ('transaction_system_sms_win_orange', 'Orange SMS'), + ('gs_error_create_3', 'Your skill level isn\'t high enough for creating Games in this Lobby.'), + ('furni_goodie2_desc', 'For gourmet kittens'), + ('trading_youagree', 'You agree'), + ('furni_bench_lego_name', 'Team Bench'), + ('reg_verification_updateOK', 'Update successful'), + ('transaction_system_refunds', 'Refund'), + ('furni_carpet_standard*7_name', 'Floor Rug'), + ('poster_44_name', 'Mummy'), + ('furni_bed_polyfon_one*3_name', 'White Single Bed'), + ('furni_jp_tray1_name', 'jp_tray1'), + ('furni_jp_tatami_name', 'Small Tatami Mat'), + ('furni_bardesk_polyfon*2_name', 'Black Mode Bardesk'), + ('furni_hockey_light_desc', 'Set it off.'), + ('nav_venue_bb_lobby_intermediate_2/0_desc', ''), + ('wallitem_guitar_v_name', 'v guitar'), + ('reg_email', 'Email:'), + ('nav_venue_sw_lobby_tournament_0/0_desc', ''), + ('furni_club_sofa_name', 'Club sofa'), + ('furni_duck_name', 'Rubber Duck'), + ('furni_divider_nor5*9_name', 'Red Iced Angle'), + ('furni_smooth_table_polyfon_name', 'Large Dining Table'), + ('reg_forcedupdate', 'Please update your Habbo details!'), + ('transaction_system_stuff_store', 'Catalogue purchase'), + ('console_request_massoperation_title', 'You have %messageCount% friend requests waiting.'), + ('nav_venue_bb_lobby_expert_8/0_desc', ''), + ('roomatic_roomdescription', 'Room description:'), + ('reg_verification_invalidEmail', 'Check email address'), + ('furni_xmas_icelamp_desc', '20 lanterns for the price of 6!'), + ('wallitem_wallmirror_desc', 'Mirror, mirror on the wall...'), + ('furni_pura_mdl1*3_name', 'Black Pura Module 1'), + ('pet.saying.play.croco.1', 'Squeh Squeeeeh...'), + ('pet.saying.play.croco.0', ':)'), + ('nav_venue_theatredrome_halloween/0_desc', 'Warm welcome to Bullet For My Valentine!'), + ('nav_venue_bb_lobby_amateur_6_name', 'Gevorderden Battle Ball 7'), + ('cam_savetxt', 'Saving Photo...'), + ('nav_venue_bb_lobby_intermediate_1_name', 'Semi-profs Battle Ball 2'), + ('nav_modify_doorstatus', 'Door status'), + ('callhelp_sent', 'If you have questions about Habbo Hotel or your Habbo account, please write the details below and a member of community staff will respond as soon as possible.'), + ('wallitem_photo_name', 'Photo'), + ('poster_25_desc', 'A new use for carrots!'), + ('furni_chair_plasto*1_desc', 'Hip plastic furniture'), + ('furni_prizetrophy4*2_name', 'Fish trophy'), + ('furni_bar_armas_name', 'Barrel Minibar'), + ('nav_rooms_favourite', 'Favourites'), + ('furni_table_plasto_square*6_desc', 'Hip plastic furniture'), + ('furni_gothic_sofa*6_desc', 'The dark side of Habbo'), + ('jukebox_song_length', 'Song length: %time%'), + ('buddyremove_header', 'Choose %amount% friends to remove'), + ('furni_romantique_mirrortabl_desc', 'Get ready for your big date'), + ('wallitem_hrella_poster_2_name', 'Life Buoy'), + ('reg_boy', 'Boy'), + ('sound_machine_trax_name', 'Trax name:'), + ('purse_vouchers_error0', 'Technical error! Cannot redeem voucher.'), + ('furni_plant_valentinerose*3_name', 'Yellow Valentine Rose'), + ('purse_vouchers_error1', 'Invalid voucher code.'), + ('nav_venue_bb_lobby_expert_1_name', 'Experts Battle Ball 2'), + ('purse_vouchers_error2', 'Product delivery failed, please contact Customer Service'), + ('purse_vouchers_error3', 'This voucher must be redeemed on the Habbo website'), + ('furni_romantique_chair*2_desc', 'null'), + ('furni_prizetrophy7*1_desc', 'Gold Habbo trophy'), + ('furni_table_plasto_bigsquare*14_name', 'Occasional Table'), + ('furni_ticket_desc', 'A bundle of 5 gaming tickets'), + ('nav_venue_club_massiva_name', 'Club Massiva'), + ('roomatic_locked', 'Door locked - visitors have to ring doorbell'), + ('furni_table_silo_small*3_desc', 'For those random moments'), + ('furni_bed_trad_name', 'Plain Double Bed'), + ('summer_chair_5_name', 'Beige Deck Chair'), + ('buddyremove_select_all', 'Select All Friends'), + ('furni_plant_valentinerose*5_desc', 'For that special pixel'), + ('furni_glass_table*9_name', 'Glass table'), + ('furni_romantique_smalltabl*5_desc', 'Why is one leg different?'), + ('furni_pura_mdl5*5_name', 'beige pura module 5'), + ('poster_30_name', 'Mistletoe'), + ('furni_chair_basic*8_name', 'chair_basic'), + ('nav_venue_sw_lobby_amateur_2_name', 'Snow Slingers Lobby'), + ('Alert_ConnectionDisconnected', 'Please reload Habbo Hotel!\\r\\rIf this happens again, please wait a moment before reloading.'), + ('Alert_WrongPassword', 'Check password!'), + ('nav_modify_letothersmove', 'Let other people move and leave furniture in the room.'), + ('furni_rare_dragonlamp*1_name', 'Sea Dragon Lamp'), + ('furni_table_plasto_4leg*10_desc', 'Hip plastic furniture'), + ('furni_sound_set_28_name', 'Rock 2'), + ('furni_grand_piano*2_name', 'Black Grand Piano'), + ('furni_basket_desc', 'Eggs-actly what you want for Easter'), + ('furni_rare_fan*5_name', 'Yellow Powered Fan'), + ('furni_noob_lamp*2_name', 'My first Habbo lamp'), + ('furni_present_gen4_desc', 'What\'s inside?'), + ('furni_pillar*9_desc', 'Ancient and stately'), + ('furni_chair_norja*8_desc', 'Sleek and chic for each cheek'), + ('furni_pura_mdl2*2_desc', 'Any way you like it!'), + ('furni_glass_stool*5_desc', 'Translucent beauty'), + ('furni_hc_lmp_name', 'Oil Lamp'), + ('console_myinterests', 'My interests:'), + ('furni_val_teddy*6_desc', 'The blue bear of happiness'), + ('room_cant_set_item', 'You cannot place this in someone else\'s room!'), + ('poster_29_desc', '10 x Gold Tinsel'), + ('club_general_daysleft', 'Number of HC days left'), + ('nav_popup_nav_link', 'Open the Navigator'), + ('furni_sound_set_43_desc', 'Beware zombies!'), + ('furni_solarium_norja*6_name', 'Blue Solarium'), + ('furni_doormat_plain*1_name', 'Doormat'), + ('nav_venue_chill_name', 'Zen Garden'), + ('furni_one_way_door*5_desc', 'One at a time!'), + ('furni_table_plasto_round*3_desc', 'Hip plastic furniture?'), + ('furni_prizetrophy6_desc', 'Palkinto'), + ('furni_exe_s_table_name', 'Executive Glass Table'), + ('furni_noob_rug*5_desc', 'Nice and neat sisal rug with pink edging'), + ('furni_scifirocket*0_name', 'Mars Smoke Machine'), + ('furni_soft_jaggara_norja_desc', 'Soft Iced sofachair'), + ('nav_venue_bb_lobby_amateur_9/0_desc', ''), + ('furni_chair_plasty*5_desc', 'Hip plastic furniture'), + ('hobba_mark_emergency', 'Emergency Help'), + ('furni_djesko_turntable_name', 'Habbo Turntable'), + ('furni_shelves_norja*9_desc', 'For nic naks and art deco books'), + ('poll_confirm_cancel_long', 'Are you sure you want to stop answering the poll? You can\'t continue later.'), + ('poster_32_desc', 'The Auspicious One'), + ('opening_hours_text_opening_time', 'The Hotel will open again at %h%:%m%. We look forward to welcoming you back!'), + ('furni_bed_budget_one*7_name', 'Green Pura Bed'), + ('furni_pillow*0_desc', 'Minimalist comfort!'), + ('furni_divider_poly3*8_desc', 'Yellow Mode Bardesk Gate'), + ('nav_venue_bb_lobby_beginner_13/0_desc', ''), + ('furni_sound_set_6_name', 'Ambient 3'), + ('hubu_win', 'Bus - Info'), + ('furni_sound_machine*5_name', 'Brown Traxmachine'), + ('furni_sporttrack1*2_desc', 'null'), + ('bb_title_bouncingBall', 'Battle Ball'), + ('nav_venue_rooftop/0_desc', 'Hang out on the very rooftop of Habbo Hotel!'), + ('modtool_banreason', 'Ban Reason:'), + ('furni_chair_silo*9_desc', 'Red Silo Dining Chair'), + ('furni_bed_budget*6_desc', 'King sized comfort!'), + ('furni_s_sound_machine*4_desc', 'Sound Machine Blue Desc'), + ('furni_rubberchair*6_desc', 'Soft and tearproof!'), + ('nav_venue_sw_lobby_expert_1_name', 'Snow Marksmen Lobby'), + ('nav_venue_bb_lobby_beginner_7/0_desc', ''), + ('furni_table_plasto_4leg*5_desc', 'Hip plastic furniture'), + ('gen_youhave', 'You Have'), + ('furni_carpet_soft*6_name', 'Soft Wool Rug'), + ('furni_petfood2_desc', 'Fantastic 20% Saving!'), + ('group_privileges', 'Priviliges:'), + ('furni_samovar_name', 'Russian Samovar'), + ('furni_hal_grave_name', 'Haunted Grave'), + ('furni_bed_budget_one*2_desc', 'Princess sized comfort!'), + ('gs_error_1', 'You have entered invalid data!'), + ('reject', 'Reject'), + ('gs_error_4', 'You have reached your maximum number of daily Games!'), + ('nav_venue_sw_lobby_tournament_5_name', 'Tournament Lobby'), + ('gs_error_5', 'Tournament is only available for users living in the UK.'), + ('gs_error_2', 'You don\'t have enough Tickets!'), + ('gs_error_8', 'To start a Game, there must be at least two Teams of one player each!'), + ('sound_machine_alert_no_sound_sets', 'You don\'t have any sound sets available for song editing. \\rNote that the sets need to be in your inventory (hand).'), + ('furni_waterbowl*4_desc', 'Aqua unlimited'), + ('furni_doormat_love_desc', 'Welcome Habbos in style'), + ('gs_error_6', 'You have been removed from the Game!'), + ('furni_soft_sofachair_norja*4_desc', 'Sit back and relax'), + ('bb_powerup_desc_8', 'By using a vacuum cleaner, you can clear any tile in the field.'), + ('move', 'Move'), + ('furni_romantique_smalltabl*3_name', 'Turquoise Tray Table'), + ('furni_bed_polyfon*8_name', 'Yellow Mode Double Bed'), + ('furni_sofachair_polyfon*4_desc', 'Beige Mode Armchair'), + ('forgottenpw_email', 'Your email address'), + ('console_email', 'Email'), + ('bb_powerup_desc_1', 'Light bulb colours an area around it.'), + ('furni_divider_nor2_desc', 'Strong, yet soft looking'), + ('furni_bardeskcorner_polyfon*5_desc', 'For sweet corners!'), + ('say', 'Say'), + ('bb_powerup_desc_3', 'Flashlight colours a straight line ahead of you.'), + ('bb_powerup_desc_2', 'Bouncing on a spring locks tiles in a single jump.'), + ('bb_powerup_desc_5', 'Bouncing on a box of pins will burst your Battle Ball!'), + ('bb_powerup_desc_4', 'A shot with a cannon locks tiles on a straight line.'), + ('furni_chair_basic*1_name', 'chair_basic'), + ('bb_powerup_desc_7', 'A bomb will clear all tiles around it.'), + ('bb_powerup_desc_6', 'Harlequin effect makes everybody colour tiles for your team!'), + ('NUF_console_read_next', 'Click \'OK\' to mark message as read.'), + ('poster_50_name', 'Bat Poster'), + ('furni_table_plasto_4leg*15_name', 'Occasional Table'), + ('furni_tree7_desc', 'Walking in a winter wonderland!'), + ('poster_37_name', 'The Habbo Babes 3'), + ('furni_queue_tile1*7_desc', 'The power of movement'), + ('furni_bed_budgetb_name', 'Plain Double Bed'), + ('interface_icon_sound', 'Sound Off/On'), + ('pet.hotwords.come_here', 'come here'), + ('poster_10_name', 'Lapland Poster'), + ('win_delete_item', 'Remove Item'), + ('wallitem_hrella_poster_3_name', 'Anchor'), + ('furni_table_plasto_bigsquare*8_desc', 'Hip plastic furniture'), + ('furni_habboween_grass_name', 'Unholy Ground'), + ('furni_plant_valentinerose*4_name', 'Pink Valentine\'s Rose'), + ('nav_venue_skylight_lobby/0_desc', 'Lift your spirits on the top floor'), + ('buddyremove_alphabetical', 'Alphabetical Order'), + ('alert_win_coppa', 'You are blocked'), + ('nav_venue_bb_lobby_amateur_5_name', 'Gevorderden Battle Ball 6'), + ('reg_update_text', 'Never change your password or email just because somebody asks you to. He / she is most probably trying to steal your Habbo account and furni!'), + ('decision_ok', 'OK'), + ('furni_summer_grill*3_name', 'Yellow Barbeque Grill'), + ('nav_public_helptext', 'These are hotel\'s public rooms. What are you waiting for? Go and meet other Habbos!'), + ('tickets_button_info_2', 'Stuff you can do with these 20 tickets'), + ('furni_rclr_chair_name', 'Palm Chair'), + ('login_create1here', 'You can create one here.'), + ('tickets_button_info_1', 'Stuff you can do with these 2 tickets'), + ('furni_prizetrophy6*3_name', 'Champion trophy'), + ('furni_shelves_norja*2_desc', 'For nic naks and art deco books'), + ('purse_info', 'DESCRIPTION'), + ('bb_choose_powerups', 'Powerup select'), + ('purse_transaction', 'View Transactions'), + ('reg_birthdayformat', 'Birthday*: [dd][mm][yyyy]'), + ('Alert_YouMustAgree', 'You must accept the Terms and Conditions before proceeding.'), + ('jukebox_empty', 'Empty'), + ('purse_info_film', 'Films For Camera'), + ('furni_sofachair_polyfon*9_desc', 'Loft-style comfort'), + ('furni_habbocake_desc', 'Save me a slice!'), + ('furni_doormat_plain*6_desc', 'Available in a variety of colours'), + ('nav_venue_sun_terrace/0_desc', 'For lazy afternoons and super tan treatment!'), + ('poster_501_desc', 'For pirates everywhere'), + ('pet_thir_2', 'Thirsty'), + ('gs_error_watch_0', 'All The Spectator Seats Are Taken!'), + ('pet_thir_3', 'Not thirsty'), + ('camera_open_dialog_text', 'Would you like to take some photos\\ror put your camera in your room?'), + ('furni_bed_budget_one*9_desc', 'Prince sized comfort!'), + ('ph_goswimming', 'Go swimming!'), + ('furni_habboween_crypt_name', 'Creepy Crypt'), + ('gs_error_join_7', 'You have already joined this Game!'), + ('nav_venue_sw_lobby_amateur_3_name', 'Snow Slingers Lobby'), + ('furni_romantique_smalltabl*4_name', 'Amber Tray Table'), + ('gs_error_join_3', 'You either have too much or too little skill to join.'), + ('pet_thir_0', 'Gasping'), + ('gs_error_join_0', 'The team you selected is already full.'), + ('pet_thir_1', 'Parched'), + ('furni_gothic_stool*3_name', 'Gothic Stool Red'), + ('furni_wooden_screen*1_name', 'Pink Oriental screen'), + ('furni_sofa_silo*4_name', 'Beige Area Sofa'), + ('furni_queue_tile1*2_desc', 'The power of movement'), + ('buddyremove_continue', 'Remove Friend Now'), + ('nav_venue_bb_lobby_expert_2/0_desc', ''), + ('nav_loading', 'Loading...'), + ('furni_bed_armas_two_name', 'Double Bed'), + ('furni_prizetrophy4*1_name', 'Fish trophy'), + ('furni_sound_machine*7_desc', 'Red alert. Red alert. It\'s a party!'), + ('furni_glass_sofa_desc', 'Translucent beauty'), + ('furni_barchair_silo*5_name', 'Pink Bar Stool'), + ('furni_soft_sofachair_norja*5_desc', 'Pink Iced Sofachair'), + ('console_fr_accepted_count', 'Amount to be accepted'), + ('poster_2001_desc', 'Perinteinen ryijy,'), + ('furni_couch_norja*5_desc', 'Two can perch comfortably'), + ('furni_rclr_lamp_desc', 'Light your space'), + ('furni_sand_cstl_wall_desc', 'sand_cstl_wall'), + ('furni_one_way_door*4_name', 'Beige One Way Gate'), + ('furni_corner_china_name', 'Dragon Screen'), + ('nav_venue_sw_lobby_amateur_4/0_desc', 'Astetta rankempaa lumisotaa.'), + ('furni_chair_silo*7_name', 'Green Silo Dining Chair'), + ('transaction_system_messenger', 'Console SMS'), + ('furni_pura_mdl4*8_desc', ''), + ('console_reject_selected', 'Reject selected'), + ('furni_rare_icecream*4_desc', 'Virtual strawberry rocks!'), + ('furni_prizetrophy*2_desc', 'Shiny silver'), + ('furni_scifiport*0_desc', 'Energy beams. No trespassers!'), + ('paalu_ui2', 'Push'), + ('paalu_ui3', 'Moving'), + ('paalu_ui4', 'Stabilise'), + ('paalu_ui5', 'Balance'), + ('furni_sofa_polyfon*7_name', 'Green Mode Sofa'), + ('nav_error_toomanyfavrooms', 'You can\'t have more than 10 favourite rooms! Please remove an old favourite if you want to add a new one.'), + ('furni_noob_stool*5_name', 'My first Habbo stool'), + ('sound_machine_alert_missing_packages', 'You need the following Traxpacks to edit this song:'), + ('furni_grunge_bench_name', 'Bench'), + ('paalu_ui1', 'Balance'), + ('furni_sleepingbag*5_name', 'Graphite Sleeping Bag'), + ('furni_divider_nor2*3_name', 'White Iced Bar-Desk'), + ('bb_header_teams', 'Teams'), + ('wallitem_sw_swords_name', 'Swords'), + ('furni_val_choco_desc', 'One for them. Two for me!'), + ('nav_venue_bb_lobby_expert_5/0_desc', ''), + ('furni_soft_sofa_norja*2_name', 'Black Iced Sofa'), + ('furni_bed_budgetb_one_desc', 'All you need for a good night\'s kip'), + ('furni_carpet_standard*8_name', 'Floor Rug'), + ('furni_rare_dragonlamp*6_name', 'Gold Dragon Lamp'), + ('furni_sound_set_56_desc', 'Get down tonight!'), + ('furni_divider_nor5*2_name', 'Black Iced Angle'), + ('chat.curse_word', 'Bobba'), + ('furni_couch_norja*4_desc', 'Two can perch comfortably'), + ('furni_scifirocket*2_desc', 'A little closer to home!'), + ('furni_rare_fan*6_desc', 'It\'ll blow you away!'), + ('poster_514_name', 'The EU flag'), + ('club_desc_2_period', '3 Months (93 days) = 60 Credits'), + ('furni_glass_chair*9_desc', 'Translucent beauty'), + ('poster_1338_desc', 'If her age on the clock, she ready for the cock'), + ('nav_src_hd', 'Search Results.'), + ('console_unknown_sender', 'Unknown sender'), + ('furni_prizetrophy4_name', 'Pokaali'), + ('nav_venue_sunset_cafe/0_desc', 'Come and chat about Official Fansites and meet their staff!'), + ('furni_pura_mdl4*9_desc', 'Any way you like it!'), + ('furni_pillar*8_name', 'Roman Pillar'), + ('nav_venue_sport/0_desc', 'St Trinian\'s is out on DVD April 14th!'), + ('furni_pillar*7_name', 'Atlantean Pillar'), + ('club_extend_text', 'If you\'re subscribing again to Habbo Club, you won\'t lose any of the advantages or ongoing furni gifts. Club membership can be extended in advance.\\rRemember: one club month lasts 31 days.'), + ('sound_machine_confirm_eject', 'Remove cartridge?'), + ('shopping_got', 'You have xx in your Purse.'), + ('furni_rare_stand_desc', 'Stand and Deliver!'), + ('furni_chair_plasto_desc', 'Hip plastic furniture'), + ('furni_bed_polyfon_one*9_desc', 'Cot of the artistic'), + ('furni_couch_norja*9_name', 'Red Bench'), + ('poster_3_desc', 'Smells fishy, looks cool'), + ('paalu.winner', 'Winner:'), + ('NUF_meeting_people_room_wave', 'These buttons let you wave and dance. Click on your Habbo at anytime to see these buttons.'), + ('sound_machine_confirm_window', 'Sound Machine'), + ('furni_one_way_door*3_name', 'White HC Gate'), + ('furni_chair_plasty*9_name', 'Plastic Pod Chair'), + ('gs_timeleft', 'Time Left \\x'), + ('hobba_pickup', 'Pick Up'), + ('console_lastvisit', 'Last Visit'), + ('furni_rare_globe_desc', 'It\'s all white..'), + ('furni_val_cauldron_name', 'Valentine\'s Cauldron'), + ('poster_43_name', 'Chains'), + ('furni_bardesk_polyfon*8_desc', 'Yellow Mode Bardesk'), + ('furni_sound_set_36_name', 'Latin Love 1'), + ('dimmer_apply', 'Apply'), + ('furni_glass_chair*8_desc', 'Translucent beauty'), + ('furni_pura_mdl2*7_desc', 'Any way you like it!'), + ('furni_prizetrophy*3_desc', 'Breathtaking bronze'), + ('furni_marquee*1_name', 'Pink marquee'), + ('NUH_own_user', 'This is your Habbo. Click on the floor to move around.'), + ('furni_gothic_sofa*1_desc', 'The dark side of Habbo'), + ('furni_divider_nor5*3_name', 'White Iced Angle'), + ('furni_divider_nor4*5_name', 'Pink Iced Auto Shutter'), + ('furni_soft_sofa_norja*3_name', 'White Iced Sofa'), + ('furni_sofachair_silo*8_desc', 'Large, but worth it'), + ('furni_pura_mdl1*9_desc', 'Any way you like it!'), + ('furni_chair_plasto*7_name', 'Chair'), + ('furni_pura_mdl5*6_desc', 'Any way you like it!'), + ('emailpw', 'Send'), + ('sound_machine_playlist_window', 'Traxmachine Playlist Editor'), + ('furni_pura_mdl1*3_desc', 'Any way you like it!'), + ('furni_noob_table*5_desc', 'Lightweight, practical and pink'), + ('furni_scifirocket*6_name', 'Mercury Smoke Machine'), + ('furni_shelves_norja_name', 'Bookcase'), + ('poster_521_name', 'Flag of Brazil'), + ('sound_machine_jukebox_disk_window', 'Insert disc'), + ('furni_table_norja_med*6_desc', 'For larger gatherings'), + ('furni_pillow*6_name', 'Blue Cotton Pillow'), + ('furni_shelves_norja*3_desc', 'For nic naks and art deco books'), + ('queue_set.s.info', 'There are %d% Habbos in front of you in the queue to see the Habbo Live broadcast!'), + ('reg_parentemail_info', 'Because of your age, we need to let your parents know you are registering at Habbo Hotel. Please give the email address of one of your parents/guardians.'), + ('club_txt_paycash', 'Pay by Cash'), + ('furni_chair_plasto*11_name', 'Chair'), + ('furni_pizza_name', 'Pizza Box'), + ('furni_table_plasto_4leg*6_desc', 'Hip plastic furniture'), + ('furni_chair_silo*3_desc', 'Keep it simple'), + ('alert_reg_t', 'Please check these details:'), + ('nav_venue_theatredrome_name', 'Theatredrome'), + ('furni_hc_rntgn_desc', 'Believe it or not!'), + ('nav_venue_main_lobby_name', 'Main Lobby'), + ('furni_sound_set_64_desc', 'Make a little Jinn-gle!'), + ('nav_venue_sw_lobby_amateur_desc', 'Practice improves a Snow Stormer\'s aim... Ops, missed!'), + ('furni_scifiport*5_name', 'Security Fence'), + ('furni_lamp_basic_desc', 'Switch on the atmosphere with this sophisticated light'), + ('pet.saying.sniff.cat.0', 'snuh..snuh'), + ('poster_506_name', 'The flag of Finland'), + ('furni_bardeskcorner_polyfon*6_desc', 'Blue Mode Bardesk Corner'), + ('nav_venue_hotel_kitchen_name', 'Hotel Kitchen'), + ('furni_doorB_desc', 'Narnia this way!'), + ('poster_11_name', 'Certificate'), + ('furni_safe_silo_desc', 'Totally shatter-proof!'), + ('furni_bed_budget_one*3_desc', 'Prince sized comfort!'), + ('furni_romantique_divider*4_name', 'Ochre Screen'), + ('previous_onearrowed', '< Previous'), + ('nav_venue_bb_lobby_tournament_3_name', 'Competitie Battle Ball 4'), + ('furni_plant_sunflower_desc', 'For happy Habbos'), + ('furni_throne_desc', 'Important Habbos only'), + ('furni_exe_bardesk_name', 'Executive Bar Desk'), + ('furni_tree6_desc', 'The future\'s bright!'), + ('log_problem_title', 'Problems Connecting'), + ('furni_chair_basic*2_name', 'Pink Pura Egg Chair'), + ('game_chess_black', 'Black:'), + ('furni_glass_sofa*9_name', 'Glass sofa'), + ('furni_chair_norja*2_desc', 'Sleek and chic for each cheek'), + ('furni_pillar*3_desc', 'Ancient and stately'), + ('furni_scifidoor*8_desc', 'There out of this world!'), + ('alert_InvalidUserName', 'Don\'t use this character: \\x !'), + ('furni_rare_parasol*3_name', 'Violet Parasol'), + ('furni_bed_budget*5_desc', 'King sized comfort!'), + ('furni_chair_silo*8_name', 'Yellow Dining Chair'), + ('nav_tryingpw', 'Trying the password...'), + ('furni_cn_lamp_desc', 'Light of the East'), + ('furni_prizetrophy3*3_name', 'Globe trophy'), + ('furni_sound_set_16_desc', 'Ferry, ferry good!'), + ('furni_table_plasto_round*4_desc', 'Hip plastic furniture'), + ('poster_2007_desc', 'The legendary founder of the Hotel'), + ('sound_machine_insert', 'Add to mixer'), + ('furni_sound_machine*1_desc', 'Let the party begin!'), + ('furni_bed_polyfon_one*8_desc', 'Yellow Mode Single Bed'), + ('error_room_closed', 'Huone on suljettu.'), + ('pet.hotwords.play_dead', 'play dead'), + ('gs_button_go_finished', 'Scores'), + ('group_member', 'Member'), + ('sound_machine_confirm_save', 'Save the song?'), + ('furni_arabian_wndw_desc', 'Arabian days and nights'), + ('nav_venue_sw_lobby_expert_2_name', 'Snow Marksmen Lobby'), + ('furni_sound_set_57_desc', 'Feel the groove'), + ('furni_triplecandle_desc', 'No need to worry about wax drips'), + ('char_welcome', 'Welcome!'), + ('furni_sound_machine*6_desc', 'Add some effects to your room!'), + ('furni_sofachair_polyfon*3_desc', 'Loft-style comfort'), + ('nav_venue_bb_lobby_amateur_6/0_desc', ''), + ('group_logo_url_template', 'http://www.habbohotel.co.uk/habbo-imaging/badge-fill/%imagerdata%.gif'), + ('furni_table_plasto_bigsquare*2_desc', 'Hip plastic furniture'), + ('furni_glass_table*5_desc', 'Translucent beauty'), + ('url_purse_link', 'http://%predefined%//credits?'), + ('buddyremove_logintime', 'Last Login Time'), + ('NUF_meeting_people_hotelview_tutor', 'The Navigator lets you move between rooms in the Hotel, so open it up to get started!'), + ('furni_sofa_polyfon*6_name', 'Blue Mode Sofa'), + ('furni_scifirocket*1_desc', 'There is always space for this!'), + ('nav_venue_bb_lobby_amateur_10/0_desc', ''), + ('furni_prizetrophy5_name', 'Pokaali'), + ('purse_info_tickets', 'Gaming Tickets'), + ('poster_513_name', 'The Australian flag'), + ('furni_noob_chair*3_desc', 'Lightweight, practical, with red stripes'), + ('alert_old_client', 'You have an old version cached. Please empty your browser cache and login again.'), + ('furni_bar_basic_name', 'A Pura Minibar'), + ('furni_shelves_norja*8_desc', 'For nic naks and art deco books'), + ('sound_machine_save_window', 'Save your Trax'), + ('poster_51_name', 'Basketball Hoop'), + ('Alert_moderator_warning', ''), + ('furni_solarium_norja*5_name', 'Pink Solarium'), + ('furni_sporttrack2*1_desc', 'null'), + ('furni_rubberchair*7_desc', 'Soft and tearproof!'), + ('reg_parentemail_moreinfo', 'More information:'), + ('furni_present_gen5_desc', 'What\'s inside?'), + ('furni_bed_polyfon*9_desc', 'Give yourself space to stretch out'), + ('sound_machine_confirm_save_list_long', 'Are you sure you want to overwrite the current playlist?'), + ('cam_zoom_in.help', 'Zoom In'), + ('furni_carpet_soft*5_name', 'Soft Wool Rug'), + ('furni_plant_small_cactus_name', 'Small Cactus'), + ('console_creatingaprofile', 'Creating A Profile'), + ('console_select_all', 'Select all'), + ('hobba_reply_cfh', 'Reply to:'), + ('notickets_buygame', 'Buy a game'), + ('furni_sporttrack1*3_desc', 'null'), + ('furni_sleepingbag*1_desc', 'Ultimate coziness'), + ('furni_gothic_stool*4_name', 'Black Gothic Stool'), + ('nav_venue_bb_lobby_beginner_4/0_desc', ''), + ('nav_venue_netcafe/0_desc', 'Learn a foreign language and win Habbo Credits in our quests!'), + ('poster_31_desc', 'Pure and unbridled nu-metal'), + ('furni_sound_set_24_desc', 'It\'s all about the Pentiums, baby!'), + ('pet.saying.angry.dog.3', 'dog.1=Oouh..oouh..snuh..ooo'), + ('furni_bed_budget_one*8_desc', 'Prince sized comfort!'), + ('pet.saying.angry.dog.4', 'ARRR Grrr.. woof woof woof'), + ('pet.saying.angry.dog.1', 'Woof! Grrrr..woof woof'), + ('furni_sw_table_desc', ''), + ('pet.saying.angry.dog.2', 'grRRRRrr.r...r'), + ('pet.saying.angry.dog.0', 'Rrrr..woof.. Rrr'), + ('furni_chair_china_name', 'Chinese Lacquer Chair'), + ('furni_romantique_divan*2_desc', 'Recline in continental comfort'), + ('furni_divider_silo1*6_desc', 'Blue Area Corner Shelf'), + ('furni_sound_set_5_name', 'Ambient 4'), + ('roomevent_browser_create', 'Host an event'), + ('furni_noob_rug*6_desc', 'Nice and neat sisal rug with green edging'), + ('transaction_system_bank_luottokunta', 'Luottokortti'), + ('furni_bed_armas_one_name', 'Single Bed'), + ('furni_plant_fruittree_desc', 'Great yield and sweet fruit'), + ('furni_sound_machine_pro_desc', 'creating fancy sounds'), + ('nav_ownrooms_helptext', 'If you didn\'t know, these are your rooms. Here you can modify your rooms or create new ones if you feel like it.'), + ('furni_grunge_radiator_desc', 'Started cool but now it\'s hot!'), + ('furni_divider_silo3*7_desc', 'Green Area Gate'), + ('room_hold', 'Wait a second...\\rLoading room...'), + ('furni_sound_set_49_desc', 'You will belong'), + ('nav_venue_emperors/0_desc', 'Even the smallest of light... shines in the darkness'), + ('furni_nest_name', 'Basket'), + ('furni_noob_table*4_name', 'My first Habbo table'), + ('furni_sound_set_51_desc', 'Bop to the beat'), + ('furni_plant_maze_snow_desc', '20 x Snowy Maze Shrubbery'), + ('NUF_meeting_people_hotelview_icon', 'Click the Navigator button to start visiting the rooms!'), + ('furni_scifirocket*7_desc', 'Larger than life!'), + ('furni_table_plasto_round*9_name', 'Round Dining Table'), + ('furni_val_teddy*5_name', 'Yellow Share Bear'), + ('nav_venue_bb_lobby_expert_2_name', 'Experts Battle Ball 3'), + ('console_onfrontpage', 'Online'), + ('poster_1000_desc', 'The Noble and Silver Show'), + ('furni_rare_icecream*9_name', 'Bubblegum Ice Cream Machine'), + ('furni_rare_fan*0_name', 'Festive Fan'), + ('furni_carpet_polar_name', 'Faux-Fur Bear Rug'), + ('hobba_chatlog', 'See Chat Log >>'), + ('furni_romantique_chair*3_desc', 'null'), + ('hobba_pickedby', 'Picked Up By:'), + ('poster_24_desc', 'Trying to get in or out?'), + ('furni_table_silo_small*2_desc', 'For those random moments'), + ('furni_table_plasto_bigsquare*15_name', 'Occasional Table'), + ('furni_prizetrophy7*2_desc', 'Silver Habbo trophy'), + ('ph_keys_run', 'Run:'), + ('error_title', 'Oops, error!'), + ('furni_rare_dragonlamp*0_name', 'Fire Dragon Lamp'), + ('furni_CFC_50_coin_silver_name', 'Silver Coin (China)'), + ('furni_chair_plasty_name', 'Plastic Pod Chair'), + ('nav_roomInfo', 'Room info'), + ('furni_sound_set_63_name', 'Alhambra Trax 2'), + ('furni_divider_nor2*9_desc', 'Red Iced bar desk'), + ('furni_soft_sofa_norja*8_name', 'Yellow Iced Sofa'), + ('poster_57_desc', 'chinese calligraphy'), + ('furni_table_plasto_4leg*16_name', 'Occasional Table'), + ('accept', 'Accept'), + ('pet.saying.beg.cat.2', 'MEOW, MEOW, MEOW..'), + ('furni_waterbowl*3_desc', 'Aqua unlimited'), + ('furni_divider_poly3*2_name', 'Black Mode Bardesk Gate'), + ('furni_divider_nor3_desc', 'Do go through...'), + ('furni_table_plasto_square*5_desc', 'Hip plastic furniture'), + ('furni_rubberchair*1_desc', 'Soft and stylish HC chair'), + ('furni_divider_nor5*8_name', 'Yellow Iced Angle'), + ('furni_pura_mdl4*3_desc', 'Any way you like it!'), + ('nav_removerights_desc', 'Remove all rights to this room from other users.'), + ('furni_chair_norja*7_name', 'Rural Chair'), + ('furni_pillar*2_name', 'Nordic Pillar'), + ('furni_bed_polyfon*3_name', 'White Double Bed'), + ('furni_glass_chair*3_desc', 'Translucent beauty'), + ('wallitem_xmas_light_name', 'Xmas light'), + ('pet.saying.beg.cat.0', 'MaUUU...MEOW...meow'), + ('pet.saying.beg.cat.1', '*looks up with sad eyes*'), + ('reg_verification_newEmail', 'Your new email address:'), + ('furni_sound_set_29_desc', 'Electronic house'), + ('furni_joulutahti_desc', 'Christmas in a pot'), + ('furni_china_table_name', 'Chinese Lacquer Table'), + ('poster_507_desc', 'The French flag'), + ('NUF_visiting_rooms_hotelview_nav', 'Click the icon to open the Navigator.'), + ('dimmer_preset_1', 'Preset 1'), + ('nav_private_helptext', 'These are the rooms owned by Habbos. Select a category first and then browse some rooms and meet some people!'), + ('furni_queue_tile1*8_desc', 'The power of movement'), + ('dimmer_preset_2', 'Preset 2'), + ('furni_arabian_pllw_name', 'Green Blossom Pillow'), + ('nav_venue_bb_lobby_tournament_7/0_desc', ''), + ('furni_goodie1*1_desc', 'Crunchy Dog Treat'), + ('poster_36_name', 'The Habbo Babes 2'), + ('poll_window', 'Question'), + ('furni_md_limukaappi_desc', 'A sparkling and refreshing pixel drink!'), + ('nav_venue_rooftop_rumble_ii_name', 'Rooftop Rumble II'), + ('furni_wooden_screen*7_name', 'Purple Oriental Screen'), + ('furni_scifidoor*2_name', 'Yellow Spaceship Door'), + ('room_max_pet_limit', 'Too many pets in the room!'), + ('hobba_sent_to_helpers', 'Call re-assigned as emergency and sent to moderators'), + ('furni_table_silo_med*4_desc', 'Beige Area Coffee Table'), + ('furni_romantique_pianochair*5_name', 'Onyx Piano Stool'), + ('nav_modify_roomdescription', 'Room Description'), + ('furni_sound_set_10_name', 'Hip Hop Beats 1'), + ('furni_chair_silo*2_name', 'Black Dining Chair'), + ('furni_marquee*6_name', 'Blue Marquee'), + ('poster_8_name', 'Habbo Colours'), + ('transaction_system_htk_singledrop', 'Landline'), + ('furni_chair_plasty*4_desc', 'Hip plastic furniture'), + ('dimmer_preset_3', 'Preset 3'), + ('furni_exe_corner_desc', 'Tuck it away'), + ('nav_venue_welcome_lounge/0_desc', 'New? Lost? Get a warm welcome here from Habbo eXperts.'), + ('furni_sleepingbag*6_desc', 'Ultimate coziness'), + ('nav_venue_cunning_fox_gamehall/3_name', 'Batleships'), + ('console_mainhelp', 'Habbo Console Help'), + ('tickets_button_info_hide', 'Hide Ticket Info'), + ('furni_xmas_icelamp_name', 'Lantern Bundle 2'), + ('nav_venue_bb_lobby_amateur_0/0_desc', ''), + ('purse_header', 'Habbo Purse'), + ('furni_noob_lamp*3_name', 'My first Habbo lamp'), + ('nav_help_title', 'Want a room of your own?'), + ('buy', 'Buy'), + ('furni_pura_mdl1*8_name', 'yellow pura module 1'), + ('dimmer_title', 'Mood Light'), + ('NUF_mini_meet_people_hotelview_icon', 'Click the Navigator button to start visiting the rooms!'), + ('console_credits', 'Credits'), + ('bb_link_highScores_url', 'http://%predefined%/groups/56552/id'), + ('wallitem_md_logo_wall_desc', 'Bubble up your wall'), + ('furni_safe_silo*4_desc', 'Totally shatter-proof!'), + ('room_unignore', 'Listen'), + ('nav_venue_sw_lobby_amateur_1/0_desc', ''), + ('poster_16_name', 'Bars'), + ('furni_sofachair_silo*7_name', 'Green Area Armchair'), + ('furni_spyro_name', 'Dragon Egg'), + ('nav_venue_bb_lobby_beginner_19/0_desc', ''), + ('Alert_YourPasswordIsTooShort', 'Passwords must be at least 6 characters long.'), + ('room_cant_trade', 'You cannot trade this!'), + ('furni_door_desc', 'Dr Who?'), + ('gs_button_go_created', 'Join'), + ('poster_49_name', 'Large silver star'), + ('furni_glass_sofa*4_name', 'Glass sofa'), + ('furni_divider_arm3_desc', 'Knock, knock...'), + ('furni_sound_set_31_desc', 'House loops'), + ('reg_habboname', 'Habbo name:'), + ('habboclub_thanks', 'Yippee! You are now a member of Habbo Club! Your current email address is %email%. \\r\\rIf that\'s not the one you are using, please go to \'Update my Habbo ID\' and change it now. \\rThen we can contact you about your membership if need be.'), + ('console_follow_offline', 'Your friend is offline.'), + ('furni_divider_nor1*5_name', 'Pink Ice corner'), + ('nav_openbutton', 'Open'), + ('nav_venue_theatredrome_habbowood/0_desc', 'Home to the Habbowood Gala and HAFTA Awards!'), + ('nav_venue_ice_cafe/0_desc', 'Come here. And chill out.'), + ('furni_calippo_name', 'Calippo icecream machine'), + ('furni_bench_lego_desc', 'For your reserve players'), + ('poster_9_desc', 'Do your bit for the environment'), + ('furni_bed_polyfon_one*3_desc', 'Cot of the artistic'), + ('poster_44_desc', 'Beware the curse...'), + ('poster_2006_name', 'DJ Throne'), + ('furni_pura_mdl3*5_desc', ''), + ('furni_arabian_tray4_name', 'Fruit Tray'), + ('furni_divider_nor3*7_desc', 'Entrance or exit?'), + ('furni_sound_set_30_name', 'Instrumental 1'), + ('furni_romantique_tray1_name', 'Breakfast Tray'), + ('furni_jp_tray1_desc', 'jp_tray1'), + ('furni_plant_maze_desc', 'Build your maze!'), + ('console_getfriendrequest_2', 'If you accept this invitation (s)he will be added to your Friends List. Then you can send messages to each other.'), + ('furni_hockey_light_name', 'Lert'), + ('furni_goodie1_desc', 'Crunchy Dog Treat'), + ('console_getfriendrequest_1', 'has asked you to become his/her Friend.'), + ('furni_pura_mdl2*1_desc', 'Any way you like it!'), + ('score_board.text', 'POINTS'), + ('furni_one_way_door*9_name', 'Red One Way Gate'), + ('furni_sand_cstl_twr_desc', 'sand_cstl_twr desc'), + ('furni_divider_nor5*9_desc', 'Cool cornering for your crib y0!'), + ('furni_duck_desc', 'Every bather needs one'), + ('furni_bardesk_polyfon*2_desc', 'Black Mode Bardesk'), + ('console_request_2', '(S)he will be added into your Friends List if (s)he accepts it.'), + ('bb_link_join', 'Join Team'), + ('nav_createroom_hd', 'Here you can create your own room!'), + ('console_request_1', 'has been sent your Friend Request.'), + ('reg_check_info', 'CHECK YOUR INFO'), + ('furni_toy1*4_name', 'Rubber Ball'), + ('nav_venue_sw_lobby_free_0_name', 'Free Game Lobby'), + ('furni_chair_plasto*1_name', 'Chair'), + ('furni_toilet_name', 'Loo Seat'), + ('queue_set.dc.info', 'Number of Habbos in default queue is %d% and in Habbo Club queue %c%'), + ('furni_sofachair_silo*2_desc', 'Large, but worth it'), + ('furni_chair_plasto*12_desc', 'Hip plastic furniture'), + ('ph_tickets_buyfor', 'Buy Tickets for:'), + ('sound_machine_confirm_close', 'Close the editor?'), + ('furni_rare_fan*1_desc', 'It\'ll blow you away!'), + ('furni_divider_poly3*3_desc', 'Border control!'), + ('nav_venue_kattoterassi/0_desc', 'When push comes to shove...'), + ('furni_summer_grill*4_desc', 'Plenty of burgers on that barbie'), + ('furni_bar_armas_desc', 'It\'s a barrel of laughs and a great talking point'), + ('furni_toilet_red_name', 'Loo Seat'), + ('furni_hc_lmp_desc', 'Be enlightened'), + ('furni_romantique_mirrortabl_name', 'Dressing Table'), + ('furni_pura_mdl4*2_name', 'Pink Pura Module 4'), + ('summer_chair_5_desc', 'Enjoy the summer air'), + ('furni_plant_rose_desc', 'Sleek and chic'), + ('furni_skullcandle_name', 'Skull Candle Holder'), + ('Alert_no_credits', 'You don�t have enough Credits for this.'), + ('pet.hotwords.voice', 'speak'), + ('furni_prizetrophy4*2_desc', 'Shiny silver'), + ('furni_soft_sofachair_norja*4_name', 'Urban Iced Sofachair'), + ('furni_pura_mdl5*1_desc', 'Any way you like it!'), + ('furni_safe_silo*9_name', 'Red Safe Minibar'), + ('furni_bed_trad_desc', 'Sweet dreams for two'), + ('nav_venue_club_massiva_desc', 'Strut your funky stuff!'), + ('furni_rare_dragonlamp*1_desc', 'Out of the deep blue!'), + ('furni_wooden_screen*2_desc', 'Add an exotic touch to your room'), + ('furni_prizetrophy7*1_name', 'Gold Habbo trophy'), + ('furni_carpet_standard*2_name', 'Floor Rug'), + ('furni_arabian_teamk_desc', 'Quench that desert thirst'), + ('furni_romantique_chair*2_name', 'Lime Romantique Chair'), + ('nav_venue_sw_lobby_tournament_0_name', 'Tournament Lobby'), + ('invitation_expired', 'Sorry, all Welcoming Party members were busy.'), + ('gs_error_game_checkname', 'Please check the Game\'s name!'), + ('furni_sound_set_23_name', 'SFX 4'), + ('furni_grand_piano*2_desc', 'Black Grand Piano'), + ('tutorial_quit', 'Close guide'), + ('furni_chair_basic*8_desc', ''), + ('NUF_getting_room_roommatic_security_tutor', 'Finally you can choose the security settings to your room and whether other users can move your furniture.'), + ('nav_venue_bb_lobby_beginner_1/0_desc', ''), + ('nav_private_helptext_hd_main', 'Habbo Guest Rooms'), + ('club_price', 'One month costs 25 Habbo Credits.'), + ('NUF_playing_games_navigator_tutor', 'Click either SnowStorm or BattleBall to open up a list of the game lounges.'), + ('nav_venue_old_skool_name', 'Old Skool Habbo'), + ('nav_venue_bb_lobby_beginner_4_name', 'Beginners Battle Ball 5'), + ('nav_venue_bb_lobby_tournament_9_name', 'Competitie Battle Ball 10'), + ('sound_machine_alert_song_saved', 'Song "%name%" successfully saved.'), + ('nav_venue_sw_lobby_intermediate_3_name', 'Snow Bombardiers Lobby'), + ('nav_venue_club_massiva/1_desc', 'Strut your funky stuff'), + ('furni_gothic_chair*1_name', 'Gothic Chair Pink'), + ('furni_divider_poly3_desc', 'All bars should have one'), + ('furni_romantique_divan*1_name', 'Pink Romantique Divan'), + ('NUF_playing_games_hotelview_tutor', 'Now we find out where to locate the Habbo Games!'), + ('poster_29_name', 'Gold Tinsel Bundle'), + ('furni_present_gen4_name', 'Gift'), + ('furni_bardesk_polyfon*7_name', 'Green Mode Bardesk'), + ('furni_gothic_sofa*6_name', 'Gothic Sofa Blue'), + ('furni_glass_stool*5_name', 'Glass stool'), + ('nav_venue_sw_lobby_free_5/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('nav_fav_hd', 'Your Favourite Rooms.'), + ('NUF_console_read_tutor', 'The Habbo Console lets you message your Habbo friends, and check whether they are online.'), + ('furni_romantique_tray2_desc', 'Spoil Yourself'), + ('Alert_ModeratorWarning', 'Message from a Moderator:'), + ('furni_giftflowers_name', 'Vase of Flowers'), + ('furni_table_silo_small*7_name', 'Green Area Occasional Table'), + ('furni_menorah_name', 'Menorah'), + ('furni_bed_polyfon_one*2_name', 'Black Mode Single Bed'), + ('console_offline', 'Offline'), + ('gs_mouseover_player', '\\x\\r\\yp'), + ('nav_venue_bb_lobby_amateur_3/0_desc', ''), + ('nav_venue_bb_lobby_amateur_13/0_desc', ''), + ('furni_noob_chair*2_name', 'My first Habbo chair'), + ('furni_doormat_plain*1_desc', 'Available in a variety of colours'), + ('object_displayer_hide_tags', 'Hide tags'), + ('poster_17_desc', 'Beautiful reproduction butterfly'), + ('gs_joinedplayers', 'Players Who Joined: \\x'), + ('furni_table_plasto_round*3_name', 'Round Dining Table'), + ('furni_divider_poly3*8_name', 'Yellow Mode Bardesk Gate'), + ('furni_glass_table*4_name', 'Glass table'), + ('furni_solarium_norja*6_desc', 'Rejuvenate your pixels!'), + ('poster_1006_desc', 'The eyes follow you...'), + ('furni_noob_rug*5_name', 'My first Habbo rug'), + ('buddyremove_pagecounter', 'Page'), + ('poll_alert_answer_missing', 'Please give an answer'), + ('furni_summer_chair*5_desc', 'Beige'), + ('furni_table_plasto_4leg*10_name', 'Occasional Table'), + ('furni_divider_silo2_desc', 'Stylish sectioning'), + ('furni_djesko_turntable_desc', 'For the music-lovers'), + ('nav_remrightsconf', 'You are about to remove all rights from your room. This means that only you will have rights to move and place furni in the room.'), + ('furni_pillow*0_name', 'White Lace Pillow'), + ('sound_machine_eject', 'Eject'), + ('gs_button_ready', 'Ready'), + ('furni_divider_silo1*5_name', 'Pink Area Corner Shelf'), + ('NUF_habbo_home_hotelview_tutor', 'You have now opened a page on the Habbo Website that will give you plenty of information about how to make yourself a Habbo Home.'), + ('furni_traffic_light*4_desc', 'Chill and wait your turn!'), + ('nav_venue_$unit.name$/0_desc', 'Roam more of the hotel\'s corridors'), + ('furni_sporttrack1*2_name', 'Sport track straight asphalt'), + ('furni_sofachair_polyfon_girl_name', 'Armchair'), + ('furni_sound_set_6_desc', 'Background ambience loops'), + ('furni_hal_grave_desc', 'We\'re raising the dead!'), + ('recycler_ready_info', 'Your recycled Furniture is ready. Please either accept or cancel. If you accept, you will receive your recycling reward, detailed below. If you cancel, all your old Furniture will be restored to your hand.'), + ('wallitem_jp_sheet1_name', 'jp_sheet1'), + ('furni_petfood2_name', 'Sardines Mega Multipack'), + ('furni_spotlight_name', 'Habbowood Spotlight'), + ('furni_carpet_soft*6_desc', 'Soft Wool Rug'), + ('gs_lounge_skill', 'Level in this Lounge: \\x \\r (\\y-\\z points)'), + ('nav_help_text', 'Click the Public Spaces tab on the top left of this navigator to find gaming rooms!'), + ('furni_table_plasto_4leg*5_name', 'Occasional Table'), + ('nav_venue_bb_arena_1_name', 'Battle Ball Aloittelijat'), + ('furni_table_silo_med*9_name', 'Red Area Coffee Table'), + ('furni_bed_budget_one*2_name', 'Pink Pura Bed'), + ('nav_venue_sw_lobby_expert_2/0_desc', 'Todellisille lumisotureille.'), + ('furni_rubberchair*6_name', 'Violet Inflatable Chair'), + ('furni_bardeskcorner_polyfon*5_name', 'Candy Corner'), + ('bb_powerup_8', 'Vacuum cleaner'), + ('bb_powerup_6', 'Harlequin'), + ('furni_rare_beehive_bulb*2_name', 'Yellow Amber Lamp'), + ('bb_powerup_7', 'Bomb'), + ('furni_divider_nor2_name', 'Ice Bar-Desk'), + ('bb_powerup_4', 'Cannon'), + ('bb_powerup_5', 'Box of pins'), + ('bb_powerup_2', 'Spring'), + ('bb_powerup_3', 'Flashlight'), + ('console_report', 'Report'), + ('bb_powerup_1', 'Light bulb'), + ('furni_sound_set_43_name', 'SFX 1'), + ('poster_37_desc', 'The Hotels girlband. Dream on!'), + ('interface_icon_messenger', 'Messenger, friends & messages on here'), + ('interface_icon_hand', 'Hand, your inventory'), + ('furni_s_sound_machine*4_name', 'Sound Machine Blue'), + ('nav_venue_sunset_cafe_name', 'Sunset Cafe'), + ('wallitem_sw_stone_desc', 'sw_stone'), + ('reg_check_mail', 'Email'), + ('furni_queue_tile1*7_name', 'Purple Habbo Roller'), + ('pet.hotwords.nest', 'sleep'), + ('furni_sound_machine_desc', 'Creating fancy sounds'), + ('cancel', 'Cancel'), + ('furni_hyacinth2_desc', 'Beautiful bulb'), + ('nav_venue_library/0_name', 'Habbo Library'), + ('furni_waterbowl*1_desc', 'Aqua unlimited'), + ('furni_grand_piano*5_desc', 'Why is that key green?'), + ('furni_table_plasto_bigsquare*8_name', 'Square Dining Table'), + ('furni_nouvelle_trax_name', 'nouvelle_trax'), + ('help_choise_header', 'What do you need help with?'), + ('furni_bardeskcorner_polyfon*7_name', 'Green Mode Bardesk Corner'), + ('furni_pillar*4_name', 'Dark Ages Pillar'), + ('furni_queue_tile1*6_desc', 'The power of movement'), + ('club_intro_link', 'Learn more about Habbo Club!'), + ('furni_sandrug_desc', 'Your own paradise island'), + ('poster_10_desc', 'Beautiful sunset'), + ('furni_divider_nor1_name', 'Ice Corner'), + ('nav_venue_bb_lobby_tournament_6_name', 'Competitie Battle Ball 7'), + ('furni_redhologram_desc', 'You\'re her only hope...'), + ('poster_38_name', 'Smiling Headbangerz'), + ('furni_hc_crtn_name', 'Antique Drapery'), + ('furni_barchair_silo*9_name', 'Red Bar Stool'), + ('room_badge_visible', 'Visible'), + ('furni_sleepingbag*8_name', 'Golden Sleeping Bag'), + ('roomevent_invalid_input', 'You must give your event a name and a description.'), + ('furni_chair_plasto*14_name', 'HC chair'), + ('poster_522_desc', 'The flag of Japan'), + ('furni_shelves_norja*2_name', 'Black Bookcase'), + ('nav_venue_dusty_lounge_name', 'Dusty Lounge'), + ('furni_sound_set_53_desc', 'Break the icy silence'), + ('nav_venue_ice_cafe_name', 'Ice Cafe'), + ('click', 'OK to continue to the hotel.'), + ('nav_venue_sw_lobby_free_2/0_desc', ''), + ('furni_rare_dragonlamp*9_name', 'Purple Dragon Lamp'), + ('furni_statue_desc', 'Watch out for those arrows!'), + ('game_battles_turn', 'TURN'), + ('wallitem_jp_sheet3_desc', 'jp_sheet3'), + ('furni_edicehc_desc', 'Click and roll!'), + ('furni_bed_budget*6_name', 'Blue Pura Double Bed'), + ('furni_gothic_sofa*5_desc', 'The dark side of Habbo'), + ('furni_scifirocket*5_desc', 'From the unknown depths of space'), + ('game_poker_ready', 'READY'), + ('furni_queue_tile1*2_name', 'Red Habbo Roller'), + ('furni_rare_parasol_desc', 'Zon! Zon! Zon!'), + ('transaction_system_sms_dna', 'DNA'), + ('furni_bar_polyfon_name', 'Mini-Bar'), + ('furni_grand_piano*1_name', 'Turquoise Grand Piano'), + ('nav_venue_bb_lobby_expert_4_name', 'Experts Battle Ball 5'), + ('bb_link_highscores', 'Highscores'), + ('summer_chair_8_desc', 'The summer winds are creeping in'), + ('reg_parentemail_title2', 'Email address of parent/guardian:'), + ('error_report_explain', 'An error has occurred, please see the error code above.'), + ('console_noprofile', 'Habbo Profile Not Found'), + ('furni_glass_sofa*3_desc', 'Translucent beauty'), + ('furni_romantique_smalltabl*4_desc', 'Why is one leg different?'), + ('furni_table_plasto_4leg*14_name', 'HC table'), + ('nav_venue_bb_lobby_intermediate_2_name', 'Semi-profs Battle Ball 3'), + ('NUF_playing_games_gamerooms_tutor', 'Click the \'Go\' button to go to the Game Lounge.'), + ('habboclub_require_parent_permission', 'You need to tick the box to say that you are over 14 years or age, \\ror under 14 and have your parent/guardian\'s permission to join Habbo Club. \\rPlease go back and tick the box.'), + ('furni_wooden_screen*1_desc', 'Add an exotic touch to your room'), + ('nav_venue_bb_lobby_intermediate_4/0_desc', ''), + ('furni_glass_sofa*6_name', 'Blue Glass Sofa'), + ('furni_bench_armas_desc', 'To complete the dining set'), + ('furni_barchair_silo*2_name', 'Black Bar Stool'), + ('nav_venue_bb_lobby_expert_6/0_desc', ''), + ('furni_jp_tray2_desc', 'jp_tray2'), + ('furni_val_teddy*3_desc', 'The green bear of friendship'), + ('transaction_system_sms_win_vodafone', 'Vodafone SMS'), + ('furni_glass_sofa_name', 'Glass sofa'), + ('console_online', 'online:'), + ('poster_2004_desc', 'irie!'), + ('x', 'X'), + ('nav_venue_habbo_lido/0_desc', 'Pool is open for swimming and diving!'), + ('furni_soft_sofachair_norja_name', 'iced sofachair'), + ('furni_xmas_cstl_twr_name', 'Ice Castle Tower'), + ('nav_venue_park_name', 'Habbo Gardens'), + ('recycler_info_open', 'Ecotron is the place to visit if you want to recycle your old Furniture. Simply drag the old Furni from your hand to the empty slots below. Recyclable items display the green recyclable tag in your hand. Please note that you must own the Furniture for at least %quarantine_hours% hour before they can be recycled. Recycling takes a total of %total_hours% hours.'), + ('group_window_title', 'Habbo Groups'), + ('pet.saying.eat.dog.4', 'Mmmmm..'), + ('game_chess', 'Chess'), + ('pet.saying.eat.dog.2', 'slurp, slurp, slurp'), + ('roomatic_roomdesc', 'Room description:'), + ('furni_sofa_polyfon*7_desc', 'Green Mode Sofa'), + ('pet.saying.eat.dog.3', 'hrum, umm, umm grrr'), + ('pet.saying.eat.dog.0', 'hrum, hrum, crunch!'), + ('preview_downloading', 'Preview downloading...'), + ('sound_machine_confirm_close_long', 'Are you sure you want to leave the editor without saving the song?'), + ('partner_registration_title', 'Hey, I forgot to mention one thing..'), + ('pet.saying.eat.dog.1', 'crunch, crunch mmmm'), + ('nav_venue_bb_lobby_tournament_12/0_desc', ''), + ('furni_carpet_soft*3_name', 'Soft Wool Rug'), + ('furni_sound_set_56_name', 'RnB Grooves 2'), + ('reg_termslink', 'Terms and Conditions'), + ('wallitem_sw_swords_desc', 'Z for Zorro'), + ('furni_sleepingbag*10_name', 'Khaki Sleeping Bag'), + ('furni_hc_dsk_name', 'Study Desk'), + ('furni_chair_silo*8_desc', 'Keep it simple'), + ('furni_glass_chair*8_name', 'Glass chair'), + ('nav_venue_cafe_ole_name', 'Cafe ole'), + ('furni_sleepingbag*5_desc', 'Ultimate coziness'), + ('opening_hours_text_closed', 'The Hotel has been closed and will be open to the public again at %h%:%m%.'), + ('furni_grunge_bench_desc', 'Laid back seating'), + ('BuddyNotHere', 'Offline'), + ('furni_noob_lamp*5_desc', 'Get the light right where you want it (pink)'), + ('NUH_navigator', 'Use the Navigator to move around. There are literally thousands of rooms to explore!'), + ('poster_1338_name', 'Pedobear Seal of Approval'), + ('furni_queue_tile1*9_name', 'Green Habbo Roller'), + ('furni_habboween_crypt_desc', 'What lurks inside?'), + ('furni_sofachair_silo*9_name', 'Red Area Armchair'), + ('furni_exe_chair_name', 'Executive Sofa Chair'), + ('furni_rare_dragonlamp*6_desc', 'Scary and scorching!'), + ('furni_divider_nor2*3_desc', 'Strong, yet soft looking'), + ('furni_tile_yell_name', 'Floor Tiles'), + ('furni_plant_yukka_name', 'Yukka Plant'), + ('furni_wooden_screen*8_desc', 'Add an exotic touch to your room'), + ('furni_pillar*8_desc', 'All roads lead to Rome'), + ('trading_youoffer', 'You offer:'), + ('furni_marquee*8_desc', 'It\'s both door and a shade!'), + ('furni_pura_mdl4*9_name', 'Red Pura Module 4'), + ('roomatic_congrats', 'Congratulations! You\'re now the proud owner of your own Habbo Hotel room.'), + ('furni_tile_marble_name', 'Marble Tile'), + ('furni_bed_budget*3_desc', 'King sized comfort!'), + ('furni_sound_machine*3_desc', 'Top the Habbo Charts!'), + ('nav_venue_bb_lobby_beginner_10_name', 'Beginners Battle Ball 11'), + ('nav_venue_bb_lobby_tournament_1/0_desc', ''), + ('poster_2000_name', 'Suomen kartta'), + ('furni_solarium_norja*3_name', 'Urban Solarium'), + ('furni_present_gen3_desc', 'What\'s inside?'), + ('furni_glass_stool*4_desc', 'Translucent beauty'), + ('int_update_id', 'Update My Habbo ID >>'), + ('nav_venue_bb_lobby_beginner_8/0_desc', ''), + ('furni_carpet_standard*8_desc', 'Available in a variety of colours'), + ('furni_pillar*1_desc', 'Ancient and stately'), + ('receive_invitation_text', 'invites you his/her room. Accept invitation?'), + ('poll_offer_window', 'Welcome to our poll'), + ('furni_table_plasto_bigsquare*5_desc', 'Hip plastic furniture'), + ('furni_carpet_standard*1_desc', 'Available in a variety of colours'), + ('furni_hologram_name', 'Holopod'), + ('nav_venue_bb_lobby_amateur_desc', 'Amateur battle ball!'), + ('furni_barchair_silo*6_desc', 'Practical and convenient'), + ('furni_divider_nor5_desc', 'Cool cornering for your crib y0!'), + ('purse_vouchers_helpbutton', 'More about vouchers >>'), + ('furni_shelves_norja*6_desc', 'For nic naks and art deco books'), + ('nav_venue_sw_lobby_tournament_5/0_desc', ''), + ('furni_chair_basic*4_desc', 'It\'s a cracking design!'), + ('nav_hidefull', 'Hide Full Rooms'), + ('modtool_ban_computer', 'Ban Computer Also'), + ('furni_gothic_sofa*1_name', 'Gothic Sofa Pink'), + ('furni_carpet_standard*b_name', 'Floor Rug'), + ('queue_line', 'You are queueing right now...'), + ('furni_divider_nor1*6_desc', 'Blue Ice corner'), + ('nav_search_helptext', 'Looking for something? Here you can search other Habbo\'s rooms. Type the room name or the name of the Habbo to search for a room.'), + ('furni_marquee*1_desc', 'It\'s both door and a shade!'), + ('furni_rcandleset_desc', 'Simple but stylish'), + ('nav_room_banned', 'You are banned from this room.'), + ('furni_lamp_armas_name', 'Table Lamp'), + ('catalog_costs', '\\x1 costs \\x2 Credits'), + ('furni_drinks_desc', 'Are you a slob too?'), + ('furni_pura_mdl5*6_name', 'Blue Pura Module 5'), + ('summer_chair_1_desc', 'Gotta get up early to get one!'), + ('furni_prize3_desc', 'A weighty award'), + ('furni_soft_sofa_norja*7_name', 'Rural Iced Sofa'), + ('poster_518_name', 'The Welsh flag'), + ('furni_sofachair_polyfon*8_name', 'Yellow Mode Armchair'), + ('furni_prizetrophy3*3_desc', 'Breathtaking bronze'), + ('nav_venue_sw_lobby_amateur_6_name', 'Snow Slingers Lobby'), + ('furni_stand_polyfon_z_desc', 'Tidy up'), + ('furni_carpet_soft_tut_name', 'Welcome Mat'), + ('console_reject_all', 'Reject All'), + ('month12', 'December'), + ('month11', 'November'), + ('help_topics', 'Help Topics:'), + ('nav_venue_sw_lobby_beginner_8/0_desc', ''), + ('nav_rooms_own', 'Own Room(s)'), + ('reg_pwd_note', 'Choose a password that\'s hard to guess! So, don\'t use ANYONES name, or your favorite colour!'), + ('furni_wooden_screen*4_name', 'Golden Oriental Screen'), + ('nav_venue_sw_lobby_beginner_2/0_desc', ''), + ('furni_pillow*6_desc', 'Puffy, soft and huge'), + ('furni_bed_polyfon_one*4_desc', 'Beige Mode Single Bed'), + ('reg_email_note', 'Please enter your e-mail address, this is important! You\'ll only get customer support and special offers via email, if you enter a valid email address and verify it.'), + ('group_admin', 'Administrator'), + ('furni_scifirocket*8_name', 'Pluto Smoke Machine'), + ('furni_chair_plasto*11_desc', 'Hip plastic furniture'), + ('month10', 'October'), + ('furni_goth_table_name', 'Gothic table'), + ('month05', 'May'), + ('month04', 'April'), + ('nav_modify_maxvisitors', 'Choose maximum number of visitors'), + ('nav_venue_bb_lobby_amateur_2_name', 'Gevorderden Battle Ball 3'), + ('month07', 'July'), + ('habboclub_price1', '30'), + ('month06', 'June'), + ('month01', 'January'), + ('month03', 'March'), + ('month02', 'February'), + ('furni_summer_chair*2_desc', 'Pink'), + ('month09', 'September'), + ('month08', 'August'), + ('furni_bardeskcorner_polyfon*4_desc', 'Beige Mode Bardesk Corner'), + ('furni_tree6_name', 'Flashy Christmas Tree'), + ('furni_arabian_snake_name', 'Ornamental Urn'), + ('reg_verification_incorrectPassword', 'Your password was incorrect'), + ('NUF_visting_rooms_hotelview_tutor', 'Here we go again. This time we are learning how to visit another Habbos room.'), + ('furni_summer_chair*9_desc', 'Got your sunglasses?'), + ('furni_safe_silo_name', 'Safe Minibar'), + ('furni_throne_name', 'Throne'), + ('furni_soft_sofachair_norja*8_desc', 'Yellow Iced Sofachair'), + ('NUF_console_ready_tutor', 'You can now use the Console to find some of your friends, or you can continue the tutorial.'), + ('nav_venue_picnic/0_desc', 'Don\'t forget to grab a carrot or two!'), + ('furni_bardeskcorner_polyfon_name', 'Corner Cabinet/Desk'), + ('game_placeship', 'Place your ships:'), + ('furni_glass_table*7_desc', 'Habbo Club'), + ('poster_13_name', 'BW Skyline Poster'), + ('furni_jp_bamboo_name', 'Bamboo Forest'), + ('furni_plant_bulrush_name', 'Bulrush'), + ('furni_deadduck3_desc', 'With added ectoplasm'), + ('win_purse', 'Habbo Purse'), + ('furni_jp_tray5_name', 'jp_tray5'), + ('furni_hc_tbl_desc', 'Perfect for banquets'), + ('furni_shelves_norja_desc', 'For nic naks and art deco books'), + ('club_desc_3_period', '6 Months (186 days) = 105 Credits'), + ('furni_bed_budget_one*3_name', 'Black Pura Bed'), + ('poster_2_name', 'Carrot Plaque'), + ('furni_solarium_norja*7_desc', 'Fun in the sun!'), + ('poster_2007_name', 'The Father Of Habbo'), + ('gs_header_teams', 'Teams'), + ('furni_divider_poly3*9_desc', 'Border Control!'), + ('gs_button_creategame', 'Create A New Game'), + ('furni_sound_set_42_name', 'Haunted Mansion'), + ('poll_alert_invalid_selection', 'Please select fewer alternatives'), + ('furni_scifirocket*1_name', 'Saturn Smoke Machine'), + ('furni_scifidoor*10_name', 'Violet Spaceship Door'), + ('furni_sound_set_5_desc', 'The dark side of Habbo'), + ('club_confirm_gift_title', 'You have received a Habbo club gift!'), + ('bb_info_gamePrice', 'Play now for just 2 tickets.'), + ('furni_sound_machine*6_name', 'Purple Traxmachine'), + ('wallitem_arabian_swords_desc', 'Not for yielding'), + ('furni_divider_nor2*6_name', 'Blue Iced bar desk'), + ('nav_venue_sw_lobby_expert_0/0_desc', ''), + ('furni_noob_chair*1_name', 'My first Habbo chair'), + ('group_room_link', 'Group\'s room: %room_name% >>>'), + ('sound_machine_playlist', 'Playlist'), + ('nav_venue_bb_arena_2_name', 'Battle Ball Amatöörit'), + ('roomatic_create_error', 'Error in room creation process. Please try again!'), + ('furni_couch_norja*7_desc', 'Two can perch comfortably'), + ('gs_button_spectate', 'Watch Game!'), + ('furni_sofachair_silo*6_desc', 'Blue Area Armchair'), + ('credit_redeem_button', 'Redeem'), + ('furni_valentinescreen_desc', 'Peep through and smile!'), + ('poster_511_name', 'The Dutch flag'), + ('furni_shelves_armas_name', 'Bookcase'), + ('nav_venue_habbo_lido_name', 'Habbo Lido'), + ('furni_bed_polyfon*9_name', 'Red Double Bed'), + ('furni_sofa_silo*9_name', 'Red Area Sofa'), + ('furni_pura_mdl4*6_desc', 'Any way you like it!'), + ('console_mainhelptext', 'You can use the Habbo Console to keep in constant contact with your friends using instant messages.'), + ('wallitem_jp_ninjastars_name', 'Ninja Stars'), + ('ad_note', 'Clicking this advertisement will open a new window'), + ('ph_tickets_choise2', 'Buy 20 Tickets for 6 Credits.'), + ('ph_tickets_choise1', 'Buy 2 Tickets for 1 Credit.'), + ('reg_day', 'Day'), + ('nav_venue_cunning_fox_gamehall/2_name', 'Noughts&Crosses'), + ('nav_venue_sw_lobby_tournament_6_name', 'Tournament Lobby'), + ('furni_noob_lamp*1_name', 'My first Habbo lamp'), + ('furni_petfood1_name', 'Bones Mega Multipack'), + ('furni_table_silo_med*3_name', 'White Coffee Table'), + ('pet.hotwords.jump', 'jump'), + ('furni_sleepingbag*1_name', 'Red Sleeping Bag'), + ('nav_venue_main_lobby/0_desc', 'The heart of Habbo Hotel'), + ('pet_hungry', 'Hunger:'), + ('furni_rare_fan*4_name', 'SUPERLOVE Fan'), + ('furni_sw_table_name', 'sw_table'), + ('furni_CFC_200_moneybag_name', 'Sack of Credits (China)'), + ('room_ask_friend', 'Ask to be a Friend'), + ('furni_bed_polyfon*2_name', 'Black Mode Double Bed'), + ('furni_table_norja_med_desc', 'Elegance embodied'), + ('nav_removerights', 'Reset'), + ('wallitem_hrella_poster_1_name', 'Porthole'), + ('NUF_getting_items_purse_', 'Click this link to open the Habbo Credits page in the website window.'), + ('poster_31_name', 'System of a Ban'), + ('furni_sound_set_24_name', 'Habbo Sounds 4'), + ('furni_chair_basic*7_name', 'chair_basic'), + ('poster_56_name', 'Disco Sign'), + ('furni_rare_dragonlamp*2_name', 'Jade Dragon Lamp'), + ('furni_gothic_stool*4_desc', 'Witches and Warlocks'), + ('furni_sofa_silo*2_name', 'Black Two-Seater Sofa'), + ('furni_grunge_radiator_name', 'Radiator'), + ('nav_venue_bb_lobby_amateur_9_name', 'Gevorderden Battle Ball 10'), + ('summer_chair_4_name', 'White Deck Chair'), + ('furni_sound_set_49_name', 'Club 4'), + ('messenger.email.subject', ''), + ('furni_romantique_chair*3_name', 'Turquoise Romantique Chair'), + ('furni_s_sound_machine*7_desc', 'Sound Machine Red'), + ('furni_table_plasto_round*9_desc', 'Hip plastic furniture'), + ('furni_table_plasto_4leg*7_name', 'Occasional table'), + ('club_confirm_title', 'You are about to subscribe to Habbo Club. Wise choice!'), + ('furni_romantique_pianochair*1_desc', 'Here sat the legend of 1900'), + ('furni_sofa_silo*6_desc', 'Blue Area Sofa'), + ('nav_venue_bb_lobby_tournament_11_name', 'Competitie Battle Ball 12'), + ('furni_rare_icecream*9_desc', 'Virtual bubblegum rocks!'), + ('furni_romantique_divider*1_name', 'Rose Quartz Screen'), + ('NUF_playing_games_room_ruleslink', 'Click me! But only if you want to read the game FAQs in the website.'), + ('furni_chair_silo_name', 'Dining Chair'), + ('furni_sound_set_17_desc', 'Jive\'s Alive!'), + ('dance_choose', 'Choose Dance'), + ('wallitem_industrialfan_name', 'Industrial Turbine'), + ('sound_machine_alert_invalid_song_length', 'Can\'t burn an empty song!'), + ('furni_pura_mdl1*4_desc', 'Any way you like it!'), + ('wallitem_post.it.vd_desc', 'Heart Stickies'), + ('catalog_give_petname', 'Type your pet\'s name in the grey box.'), + ('furni_pura_mdl2*1_name', 'Aqua Pura Module 2'), + ('poster_24_name', 'Hole In The Wall'), + ('win_error', 'Notice!'), + ('furni_chair_plasto*2_desc', 'Hip plastic furniture'), + ('wallitem_xmas_light_desc', 'Xmas light'), + ('furni_rubberchair*1_name', 'Blue Inflatable Chair'), + ('NUF_getting_room_roommatic_details_tutor', 'Give a name to your room, choose a category and add a description. Don\'t worry, you can change it all later.'), + ('furni_divider_poly3*2_desc', 'Black Mode Bardesk Gate'), + ('furni_plant_valentinerose*2_desc', 'Your secret love'), + ('furni_table_norja_med*7_desc', 'For larger gatherings'), + ('furni_carpet_polar_desc', 'For cuddling up on'), + ('nav_venue_sw_lobby_free_8/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('furni_summer_grill*1_name', 'Blue Barbeque Grill'), + ('furni_chair_norja*7_desc', 'Sleek and chic for each cheek'), + ('furni_joulutahti_name', 'Poinsetta'), + ('furni_exe_table_name', 'Executive Desk'), + ('furni_divider_silo3*8_desc', 'Form following function'), + ('furni_gothiccandelabra_name', 'Gothic Candelabra'), + ('transaction_system_bibit', 'Credit card'), + ('nav_venue_tv_studio/0_desc', 'Sponsored by Bobbanet.com'), + ('furni_noob_table*4_desc', 'Lightweight, practical and light blue'), + ('furni_bardesk_polyfon*3_desc', 'Perfect for work or play'), + ('room_info_rated', 'Room rating:'), + ('nav_venue_bb_lobby_beginner_2/0_desc', ''), + ('help_emergency_explanation', 'If you are experiencing a situation which is making you feel uncomfortable or unsafe, please give details below and a member of community staff will reply as soon as possible.'), + ('furni_divider_nor5*8_desc', 'Cool cornering for your crib y0!'), + ('poster_507_name', 'The French Tricolore'), + ('nav_privateRooms', 'Rooms'), + ('furni_pura_mdl2*5_desc', ''), + ('furni_sporttrack3*3_name', 'Sport goal grass'), + ('furni_sound_set_10_desc', 'Made from real Boy Bands!'), + ('furni_chair_plasto*9_desc', 'Hip plastic furniture'), + ('furni_soft_sofa_norja*4_desc', 'Sit back and relax'), + ('furni_s_sound_machine*3_name', 'Sound Machine Green'), + ('reg_spam', 'Yes, I want to get the occasional email from the Hotel Manager.'), + ('shout', 'Shout'), + ('NUF_mini_use_console_read_link', 'Click here to view the message.'), + ('furni_scifidoor*2_desc', 'There out of this world!'), + ('furni_divider_nor3*3_name', 'White Iced Gate'), + ('pet_hung_0', 'Empty'), + ('furni_table_plasto_square*1_name', 'Occasional Table'), + ('pet_hung_6', 'Stuffed'), + ('pet_hung_5', 'Full'), + ('bb_user_skill', 'Skill Level: \\x\\rScore: \\y'), + ('login_welcome', 'Welcome'), + ('pet_hung_2', 'Rumbling'), + ('pet_hung_1', 'Hungry'), + ('poster_20_name', 'Bars'), + ('pet_hung_4', 'Satisfied'), + ('pet_hung_3', 'Peckish'), + ('Alert_WrongNameOrPassword', 'Wrong name or password - please try again!'), + ('furni_romantique_pianochair*5_desc', 'I can feel air coming through...'), + ('furni_carpet_armas_desc', 'Adds instant warmth'), + ('console_removefriend_2', 'from your Friends List?'), + ('console_removefriend_1', 'Are you sure you want to remove'), + ('furni_rare_parasol*0_name', 'Green Parasol'), + ('furni_sound_set_38_name', 'Rock 6'), + ('NUF_mini_meet_people_room_wave', 'These buttons let you wave and dance. Click on your Habbo at anytime to see these buttons.'), + ('gs_skill_changed_header', 'Congratulations!'), + ('furni_chair_plasty*7_name', 'Plastic Pod Chair'), + ('furni_safe_silo*5_desc', 'Totally shatter-proof!'), + ('furni_divider_silo1*3_name', 'White Corner Shelf'), + ('nav_venue_hallway_ii_name', 'Hallway II'), + ('cam_release.help', 'Cancel Photo'), + ('nav_venue_bb_lobby_amateur_14/0_desc', ''), + ('habbo_tv_title', 'Widescreen Habbovision'), + ('purse_noevents', 'You haven\'t made any transactions yet. Click the button below to find out how to get Habbo Credits.\\rRemember: you must ask your parents permission before you buy Habbo Credits.'), + ('furni_pura_mdl2*8_name', 'yellow pura module 2'), + ('furni_CFC_10_coin_bronze_name', 'Bronze Coin (China)'), + ('sound_machine_song_remove', 'Remove song'), + ('modtool_choose_length', 'Choose Length:'), + ('sound_machine_turn_off', 'Switch Off'), + ('furni_pura_mdl1*8_desc', ''), + ('furni_spyro_desc', 'The stuff of legend'), + ('furni_pillow*2_name', 'Red Silk Pillow'), + ('furni_table_armas_desc', 'For informal dining'), + ('furni_tree3_desc', 'Any presents under it yet?'), + ('object_displayer_link_looks', 'Change avatar looks'), + ('furni_barrier*2_name', 'White Road Barrier'), + ('furni_gothic_chair*5_desc', 'The dark side of Habbo'), + ('furni_divider_nor4*4_name', 'Urban Iced Shutter'), + ('furni_camera_name', 'Camera'), + ('next_arrows', 'Next >>'), + ('furni_sound_set_60_desc', 'Love and affection!'), + ('furni_bed_polyfon_girl_one_name', 'Single Bed'), + ('NUF_mini_meet_people_user_chatfield', 'Start typing here and press \'Enter\' to chat with others.'), + ('successfully_purchase_gift_for', 'Successfully purchased gift for user %user%!'), + ('poster_49_desc', 'All that glitters...'), + ('furni_glass_table*3_name', 'Glass table'), + ('furni_divider_silo3*5_desc', 'Pink Area Gate'), + ('furni_divider_arm3_name', 'Gate (lockable)'), + ('furni_table_plasto_4leg*3_name', 'Round Dining Table'), + ('roomatic_roomnumber', 'Room number:'), + ('nav_venue_bb_lobby_beginner_5_name', 'Beginners Battle Ball 6'), + ('reg_nameAndPassTooSimilar', 'Your name and password are too similar'), + ('nav_venue_theatredrome_easter_name', 'Theatredrome Easter'), + ('nav_venue_bb_lobby_beginner_11/0_desc', ''), + ('furni_fireplace_polyfon_name', 'Fireplace'), + ('queue_set.e1.info', 'There are %e1% Habbos in front of you in the queue.'), + ('more_info_link', 'Redeem Now'), + ('furni_bed_polyfon*6_desc', 'Blue Mode Double Bed'), + ('furni_rare_icecream*5_name', 'Vanilla Ice Cream Machine'), + ('poster_500_name', 'Union Jack'), + ('furni_chair_norja*3_name', 'White Iced Chair'), + ('furni_sound_set_31_name', 'Dance 3'), + ('furni_pura_mdl3*5_name', 'beige pura module 3'), + ('furni_sporttrack2*3_desc', 'null'), + ('furni_sound_set_46_desc', 'De bada bada bo!'), + ('poster_9_name', 'Rainforest Poster'), + ('furni_romantique_pianochair*4_name', 'Amber Piano Stool'), + ('poster_515_desc', 'Waved by Swedes everywhere'), + ('furni_scifidoor*9_desc', 'There out of this world!'), + ('furni_chair_plasty*3_name', 'Plastic Pod Chair'), + ('furni_table_plasto_round*5_name', 'Round Dining Table'), + ('furni_one_way_door*9_desc', 'One at a time!'), + ('furni_calippo_desc', 'Basic model'), + ('furni_footylamp_desc', 'Can you kick it?'), + ('furni_one_way_door*2_desc', 'One way! The HC way!'), + ('furni_arabian_tray4_desc', 'Sweet, juicy and ripe'), + ('furni_divider_nor3*7_name', 'Rural Iced gate'), + ('furni_couch_norja*3_name', 'White Iced Bench'), + ('furni_pillow*9_name', 'Green Wooly Pillow'), + ('game_chooseside', 'Choose your side'), + ('start', 'Start'), + ('furni_toy1*4_desc', 'it\'s bouncy-tastic'), + ('roomevent_host', 'Host:'), + ('nav_venue_rooftop_rumble_name', 'Rooftop Rumble'), + ('nav_venue_bb_lobby_expert_0/0_desc', ''), + ('nav_venue_rooftop_rumble_ii/0_desc', 'Are you ready?'), + ('error_report_trigger_message', 'Last message ID'), + ('furni_sofachair_silo*2_name', 'Black Armchair'), + ('furni_noob_chair*5_desc', 'Lightweight, practical, with pink stripes'), + ('pet_frnd_0', 'Hostile'), + ('furni_noob_rug*3_name', 'My first Habbo rug'), + ('pet_frnd_2', 'Suspicious'), + ('pet_frnd_1', 'Angry'), + ('furni_scifiport*6_desc', 'Energy beams. No trespassers!'), + ('pet_frnd_4', 'Calm'), + ('pet_frnd_3', 'Cool'), + ('pet_frnd_6', 'Warm'), + ('pet_frnd_5', 'Friendly'), + ('pet_frnd_8', 'Loving'), + ('credit_trade_value', 'Includes credit furnis worth %value% credits.'), + ('pet_frnd_7', 'Affectionate'), + ('pet_frnd_9', 'Loyal'), + ('NUF_getting_items_purse_tutor', 'Your Purse tells you how many Habbo Credits you have. If you have a voucher code you can redeem it here by clicking the \'Vouchers\' button.'), + ('furni_chair_norja*6_name', 'Blue Chair'), + ('sound_machine_alert_machine_full', 'You already have 4 Traxpacks loaded. Eject one before adding a new Traxpack.'), + ('nav_venue_club_mammoth/0_desc', 'Monumental and magnificent. For Habbo Club members only.'), + ('NUF_getting_room_hand_tutor', 'This is your hand. It contains all your furniture. I have given you a rug so that you can place it in your room- click and drag it to set it down.'), + ('reg_check_name', 'Name'), + ('furni_glass_stool*7_name', 'Green Glass Stool'), + ('poster_504_name', 'The Bundesflagge'), + ('poster_42_desc', 'Not something you want to run into'), + ('pet.saying.sleep.dog.6', '*dreaming*'), + ('pet.saying.sleep.dog.5', 'Zzzzz wuff! zzzzz'), + ('pet.saying.sleep.dog.4', 'hrrrrr...murrmm..'), + ('furni_pura_mdl4*2_desc', 'Any way you like it!'), + ('pet.saying.sleep.dog.3', 'bzz.. oof oof'), + ('furni_sofa_silo*5_name', 'Pink Area Sofa'), + ('pet.saying.sleep.dog.2', 'hrrr.. hrrr'), + ('pet.saying.sleep.dog.1', 'bzz.. bzzzzz'), + ('furni_petfood4_name', 'T-Bones Mega Multipack'), + ('nav_venue_club_mammoth_name', 'Club Mammoth'), + ('ph_keys_dive', 'Diving moves:'), + ('furni_noob_table*3_name', 'My first Habbo table'), + ('furni_romantique_divan*5_desc', 'Is that a cape hanging there?'), + ('furni_table_plasto_round*8_name', 'Round Dining Table'), + ('furni_rare_fan*1_name', 'Blue Powered Fan'), + ('reg_forcedupdate2', 'Update your Habbo info'), + ('furni_table_plasto_square*4_name', 'Square Dining Table'), + ('NUF_playing_games', 'Playing games'), + ('furni_prizetrophy2*2_name', 'Duck trophy'), + ('reg_forcedupdate3', 'The Habbo Hotel management requires all Habbos to read and agree to the service Terms and Conditions. It won\'t take long.\\rJust go through the registration, check your info and agree to the new terms. Thank you!'), + ('nav_venue_sw_lobby_tournament_2_name', 'Tournament Lobby'), + ('furni_carpet_standard*4_name', 'Floor Rug'), + ('furni_s_sound_machine*6_name', 'Sound Machine Purple'), + ('furni_prizetrophy5*1_desc', 'Glittery gold'), + ('furni_table_plasto_square_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_beginner_2_name', 'Beginners Battle Ball 3'), + ('furni_rubberchair*4_name', 'Ocean Inflatable Chair'), + ('furni_divider_poly3*5_desc', 'Keep the Pink in!'), + ('furni_arabian_teamk_name', 'Tea Maker'), + ('room_name', 'Room:'), + ('nav_venue_chill/0_desc', 'Come chill in the Zen Garden!'), + ('furni_summer_grill*4_name', 'Green Barbeque Grill'), + ('poster_1001_desc', 'even walls have ears'), + ('furni_rare_icecream*8_name', 'Peppermint Ice Cream Machine'), + ('furni_safe_silo*9_desc', 'Totally shatter-proof!'), + ('sound_machine_song_save', 'Save song'), + ('NUF_getting_room_navigator_ownrooms', 'Click the \'Own Room(s)\' tab to see your rooms.'), + ('furni_gothic_chair*1_desc', 'The dark side of Habbo'), + ('furni_table_plasto_square*8_name', 'Square Dining Table'), + ('furni_safe_silo*2_desc', 'Totally shatter-proof!'), + ('roomevent_create_description', 'Describe your event'), + ('purse_vouchers_success', 'Voucher was successfully redeemed. You have the Credits.'), + ('furni_gothic_carpet2_name', 'Dungeon Floor'), + ('furni_sofa_polyfon*3_name', 'White Two-seater Sofa'), + ('furni_romantique_tray2_name', 'Treats Tray'), + ('nav_modify_doorstatus_locked', 'Locked (visitors have to ring the bell)'), + ('NUF_visiting_rooms_categorylist_open', 'Click the \'Open\' button to open a category.'), + ('room_doorbell', 'Rings the doorbell - Open the door?'), + ('furni_sound_set_45_name', 'Lost_Beatness'), + ('nav_deleteroom', 'Delete'), + ('furni_barchair_silo_name', 'Bar Stool'), + ('furni_chair_plasto*5_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_tournament_14_name', 'Competitie Battle Ball 15'), + ('furni_pura_mdl1*1_desc', 'Any way you like it!'), + ('furni_rare_snowrug_desc', 'Chilled Elegance'), + ('poster_35_desc', 'The Hotel\'s girlband. Dream on!'), + ('furni_glass_stool_desc', 'Translucent beauty'), + ('furni_rare_fan*8_name', 'Habbo Wind Turbine'), + ('furni_menorah_desc', 'Light up your room'), + ('furni_table_silo_small*7_desc', 'Green Area Occasional Table'), + ('furni_divider_silo1*7_name', 'Green Area Corner Shelf'), + ('furni_romantique_divan*1_desc', 'null'), + ('furni_table_plasto_round*1_name', 'Round Dining Table'), + ('reg_changeEmail', 'Change your email'), + ('hobba_mark_normal', 'Send To Helpers'), + ('nav_venue_bb_lobby_tournament_8/0_desc', ''), + ('ph_tickets_have2', 'Tickets'), + ('nav_venue_sw_lobby_intermediate_0/0_desc', ''), + ('ph_tickets_have1', 'You Have'), + ('furni_bardesk_polyfon*7_desc', 'Green Mode Bardesk'), + ('console_inprivateroom', 'In A Guest Room'), + ('furni_sound_set_35_name', 'Dance 6'), + ('GoAway', 'Leave The Room'), + ('room_kick', 'Kick'), + ('furni_rubberchair*8_name', 'Black Inflatable Chair'), + ('poster_6_name', 'Abstract Poster'), + ('hubu_t1_3', ''), + ('NUF_meeting_people', 'Meeting people'), + ('nav_venue_bb_lobby_amateur_4/0_desc', ''), + ('nav_venue_bb_game/0_name', 'Battle Ball Arena'), + ('furni_pudding_name', 'Christmas Pudding'), + ('furni_tile_red_name', 'Floor Tiles'), + ('catalog_typeurname', 'Type your greetings here\\r(don\'t forget to put your name!):'), + ('furni_house2_name', 'Gingerbread House'), + ('hubu_t1_1', 'Kaupunkien pu_t2_2=Katso onko kotisi l_1=Tietoa Hubusta'), + ('furni_glass_table*4_desc', 'Translucent beauty'), + ('hubu_t1_2', ''), + ('nav_venue_club_massiva/1_name', 'Chill-out Room'), + ('furni_scifiport*2_desc', 'Get in the ring!'), + ('furni_traffic_light*4_name', 'Yellow Traffic Light'), + ('furni_tree2_name', 'Old Christmas Tree'), + ('furni_noob_stool*4_name', 'My first Habbo stool'), + ('done', 'Done'), + ('furni_goodie1*1_name', 'Marzipan Man'), + ('nav_venue_bb_lobby_tournament_18/0_desc', ''), + ('poster_17_name', 'Butterfly Cabinet 1'), + ('furni_summer_chair*5_name', 'Deck Chair'), + ('furni_prizetrophy*1_name', 'Classic trophy'), + ('furni_easterduck_desc', 'Can you tell what it is yet?'), + ('furni_barrier*3_desc', 'No trespassing, please!'), + ('furni_table_plasto_bigsquare*1_name', 'Square Dining Table'), + ('club_general_infolink', 'More Info About Habbo Club >>'), + ('furni_chair_silo*4_name', 'Beige Silo Dining Chair'), + ('roomatic_givename', 'Give your room a name!'), + ('furni_rare_icecream*1_name', 'Blueberry Ice Cream Machine'), + ('roomatic_open', 'Door open'), + ('NUF_getting_items_catalogue_tutor', 'Big! You can browse the products by clicking on the categories. There are loads of different types of furniture to decorate your room.'), + ('furni_marquee*4_name', 'Yellow Marquee'), + ('furni_bed_polyfon_one*7_name', 'Green Mode Single Bed'), + ('gs_button_go_started', 'Watch'), + ('poster_27_name', 'Holly Bundle 3'), + ('furni_divider_nor2*7_desc', 'No way through'), + ('furni_glass_chair*5_desc', 'Translucent beauty'), + ('nav_venue_basement_lobby_name', 'Basement Lobby'), + ('pick_furniture', 'Put Furni In Hand'), + ('nav_venue_bb_lobby_beginner_18/0_desc', ''), + ('furni_pura_mdl2*4_name', 'White Pura Module 2'), + ('club_status_title', 'You are currently a member of Habbo Club.'), + ('furni_rare_elephant_statue_name', 'Golden Elephant'), + ('furni_toy1*1_desc', 'it\'s bouncy-tastic'), + ('reg_doneheader', 'Congratulations!\\rYou\'re a Habbo!'), + ('furni_present_gen6_name', 'Gift'), + ('furni_noob_chair*2_desc', 'Lightweight, practical, with dark blue stripes'), + ('furni_sofachair_silo*5_name', 'Pink Area Armchair'), + ('BuddyNow', 'now:'), + ('furni_pura_mdl5*3_desc', 'Any way you like it!'), + ('furni_prizetrophy6*1_name', 'Champion trophy'), + ('BuddyEntry', 'On Hotel View'), + ('furni_scifiport*9_desc', 'Energy beams. No trespassers!'), + ('furni_table_polyfon_small_desc', 'For serving a stylish latte'), + ('furni_exe_rug_name', 'Executive Rug'), + ('nav_venue_the_dirty_duck_pub_name', 'The Dirty Duck Pub'), + ('nav_venue_bb_lobby_beginner_9_name', 'Beginners Battle Ball 10'), + ('nav_venue_sw_lobby_beginner_5_name', 'Snow Rookies Lobby'), + ('furni_pura_mdl5*2_name', 'Pink Pura Module 5'), + ('furni_bardeskcorner_polyfon*7_desc', 'Green Mode Bardesk Corner'), + ('alert_donate_content', 'The other Habbo has not put anything into the trade. Are you sure you want to give away your furni?'), + ('furni_hc_rllr_name', 'HC Rollers Set'), + ('furni_divider_nor1_desc', 'Looks squishy, but isn\'t'), + ('furni_nouvelle_trax_desc', ''), + ('wallitem_jp_sheet3_name', 'jp_sheet3'), + ('furni_hyacinth2_name', 'Blue Hyacinth'), + ('furni_sound_machine_name', 'Sound Machine'), + ('console_getmessage_sender', 'Sender:'), + ('furni_sandrug_name', 'Tropical Beach Rug'), + ('nav_updatenote_header', 'Note!'), + ('furni_pillar*4_desc', 'From the time of the Kick Warz'), + ('furni_waterbowl*1_name', 'Red Water Bowl'), + ('furni_grand_piano*5_name', 'Onyx Grand Piano'), + ('furni_redhologram_name', 'Holo-girl'), + ('sound_machine_alert_playlist_full', 'Could not save playlist! Playlists can have only %count% songs.'), + ('nav_rooms_search', 'Search'), + ('nav_venue_cunning_fox_gamehall/5_name', 'Poker'), + ('nav_venue_habbo_lido_ii_name', 'Habbo Lido II'), + ('furni_barchair_silo*9_desc', 'Practical and convenient'), + ('pet_nature', 'Nature:'), + ('furni_wood_tv_name', 'Large TV'), + ('poster_2008_desc', 'Once every four Habbo years!'), + ('poster_38_desc', 'For really TOUGH Habbos!'), + ('nav_venue_bb_lobby_expert_0_name', 'Expert'), + ('furni_chair_plasto*14_desc', 'Aqua chair'), + ('furni_queue_tile1*6_name', 'Blue Habbo Roller'), + ('poster_522_name', 'The flag of Japan'), + ('furni_chair_basic*3_name', 'Black Pura Egg Chair'), + ('nav_venue_pizza_desc', 'Tunnelmallinen pizzapaikka kiireettömään nautiskeluun.'), + ('furni_jp_tray6_desc', 'jp_tray6'), + ('furni_hc_btlr_desc', 'Your personal caretaker'), + ('furni_song_disk_desc', 'Burn, baby burn'), + ('furni_deadduck2_name', 'Dead Duck 2'), + ('furni_statue_name', 'Cupid Statue'), + ('furni_scifirocket*5_name', 'Uranus Smoke Machine'), + ('nav_gobutton', 'Go'), + ('recycler_furni_not_recyclable', 'This Furniture cannot be recycled. Please only use Furniture that has the recyclable tag in your hand.'), + ('furni_gothic_sofa*5_name', 'Green Gothic Sofa'), + ('furni_sound_set_32_desc', 'Piano concert set'), + ('furni_chair_plasto*10_name', 'Chair'), + ('nav_venue_bb_lobby_tournament_2_name', 'Competitie Battle Ball 3'), + ('furni_grand_piano*1_desc', 'Turquoise Grand Piano'), + ('buddyremove_windowheader', 'Your friends list is full.'), + ('furni_pillar*0_name', 'Greek Pillar'), + ('gs_title_countdown', 'Game Is About To Begin'), + ('furni_glass_sofa*3_name', 'Glass sofa'), + ('furni_hc_crtn_desc', 'Topnotch privacy protection'), + ('furni_waterbowl*5_desc', 'Aqua unlimited'), + ('furni_table_silo_small*4_desc', 'Beige Area Occasional Table'), + ('furni_jp_tray2_name', 'jp_tray2'), + ('furni_rare_moonrug_desc', 'Desolation rocks!'), + ('furni_val_teddy*3_name', 'Green Share Bear'), + ('furni_sleepingbag*10_desc', 'Ultimate coziness'), + ('furni_bar_polyfon_desc', 'You naughty Habbo!'), + ('furni_sofachair_polyfon*2_desc', 'Black Mode Armchair'), + ('furni_exe_sofa_name', 'Executive 3-Seater Sofa'), + ('furni_divider_silo1*4_desc', 'Beige Area Corner Shelf'), + ('poster_2004_name', 'Rasta Poster'), + ('furni_bench_armas_name', 'Bench'), + ('furni_soft_sofachair_norja_desc', 'Soft iced sofachair'), + ('nav_venue_bb_lobby_beginner_14_name', 'Beginners Battle Ball 15'), + ('gs_button_rejoin', 'Play again!'), + ('furni_marquee*8_name', 'Ultramarine Marquee'), + ('furni_tile_marble_desc', 'Slick sophistication; now 10% off!'), + ('hubu_info_url_1', 'http://www.habbohotel.co.uk/habbo/en/help/12'), + ('console_requests', 'Friend Request(s)'), + ('furni_sleepingbag*4_name', 'Army Sleeping Bag'), + ('furni_plant_yukka_desc', 'Easy to care for'), + ('NUF_getting_room_own_rooms_createroom', 'Empty? That\'s because you don\'t have any rooms yet. If it isn\'t empty then you already have made a room, which makes me wonder...'), + ('furni_glass_sofa*6_desc', 'Translucent beauty'), + ('ph_exit', 'Exit In Normal Clothes'), + ('pet_race_0_024', 'Black-eyed Boxer'), + ('furni_marquee*7_name', 'Purple Marquee'), + ('pet_race_0_023', 'Dotty Dalmatian'), + ('recycler_info_timeout', 'Your recycling was completed, but you did not accept it in time. Please press the cancel button below to have your recyclable items restored to your hand. To recycle these items you will need to begin the process again.'), + ('pet_race_0_022', 'Schnitzel Snatcher'), + ('hubu_info_url_2', 'http://www.talktofrank.com/'), + ('pet_race_0_021', 'Loyal Labrador'), + ('nav_venue_snowwar_lobby/0_desc', 'Snow Storm LobbyCome and be a Snow Stormer!'), + ('pet_race_0_020', 'Patchy Pup'), + ('furni_chair_plasto*8_name', 'Chair'), + ('furni_sofachair_silo*9_desc', 'Red Area Armchair'), + ('nav_venue_bb_lobby_beginner_17/0_desc', ''), + ('furni_hc_dsk_desc', 'For Habbo scholars'), + ('furni_wooden_screen*8_name', 'Night Blue Oriental Screen'), + ('gs_lounge_skill_no_min', 'No minimum'), + ('summer_chair_8_name', 'Yellow Deck Chair'), + ('gs_score_tie', 'The game ended in a tie!'), + ('nav_people', 'Who\'s in here?'), + ('furni_gothic_sofa*2_desc', 'Stylish seating for two'), + ('furni_summer_chair*8_name', 'Yellow Deck Chair'), + ('roomatic_roomname', 'Room name:'), + ('furni_ham_desc', 'Tuck in'), + ('nav_venue_star_lounge_desc', 'Is there a VIP visitor in the hotel?'), + ('furni_bardeskcorner_polyfon*3_name', 'White Corner Desk'), + ('gs_specnum', 'Number of spectators: \\x'), + ('furni_bed_budget*3_name', 'Black Pura Double Bed'), + ('furni_shelves_norja*6_name', 'Blue Bookcase'), + ('partner_registration_link', 'Finish registration'), + ('furni_pillar*1_name', 'Pink Marble Pillar'), + ('reg_olderage', 'I am 11 or older'), + ('furni_glass_stool*4_name', 'Glass stool'), + ('back', 'Back'), + ('furni_tile_yell_desc', 'In a choice of colours'), + ('club_confirm_text3', 'Buy more and pay less: 6 Months (186 days) of Habbo Club cost only 105 Credits. You have %credits% credits in your Purse.\\r\\r After buying the membership, you will immediately be part of the Habbo VIP Community.'), + ('furni_sofa_silo_desc', 'Cushioned, understated comfort'), + ('club_confirm_text1', '1 Habbo Club Month (31 days) costs 25 Credits. You have %credits% Credits in your Purse.\\r\\r After buying the membership, you will immediately be part of the Habbo VIP Community.'), + ('club_confirm_text2', 'Buy more and pay less: 3 Months (93 days) of Habbo Club cost only 60 Credits. You have %credits% credits in your Purse.\\r\\r After buying the membership, you will immediately be part of the Habbo VIP Community.'), + ('furni_carpet_legocourt_name', 'Basketball Court'), + ('furni_present_gen3_name', 'Gift'), + ('furni_sound_set_2_desc', 'Get the party started!'), + ('furni_barchair_silo*6_name', 'Blue Bar Stool'), + ('furni_arabian_bigtb_name', 'Amanjena Table'), + ('interface_icon_catalog', 'Catalogue, furnishing your room'), + ('furni_hologram_desc', 'As if by magic...'), + ('nav_venue_sw_lobby_expert_1/0_desc', ''), + ('furni_carpet_standard*1_name', 'Floor Rug'), + ('nav_owner', 'Owner'), + ('furni_glass_chair*2_desc', 'Translucent beauty'), + ('furni_rcandleset_name', 'Red Candle Plate'), + ('furni_divider_nor1*6_name', 'Blue Ice corner'), + ('nav_private_helptext_hd', 'Rooms'), + ('furni_sound_set_27_name', 'Groove 2'), + ('furni_drinks_name', 'Empty Cans'), + ('pet.saying.eat.cat.0', 'mmm...thumm, thumm'), + ('gs_title_nextround', 'Next game...'), + ('pet.saying.eat.cat.1', 'lap, lap, lap, lap'), + ('furni_scifirocket*9_desc', 'Something fishy is going on...'), + ('pet.saying.eat.cat.2', '*munch, munch*'), + ('pet.saying.sleep.dog.0', 'zzZZZzzz'), + ('furni_noob_lamp*4_name', 'My first Habbo lamp'), + ('nav_venue_sw_lobby_beginner_8_name', 'Snow Rookies Lobby'), + ('nav_venue_library/0_desc', 'Time to catch up on some studying'), + ('camera_dialog_open', 'Shoot'), + ('furni_lamp_armas_desc', 'Ambient lighting is essential'), + ('buddyremove_pleasewait', 'Please wait a second...'), + ('friend_request_options', 'Advanced options.'), + ('transaction_system_web_internal', 'Housekeeping purchase'), + ('furni_rare_dragonlamp*5_name', 'Elf Green Dragon Lamp'), + ('furni_bar_chair_armas_desc', 'The ultimate recycled furniture'), + ('room_ignore', 'Shutup'), + ('poster_518_desc', 'A fiery dragon for your wall'), + ('furni_soft_sofa_norja*7_desc', 'Sit back and relax'), + ('object_displayer_show_tags', 'Show tags'), + ('furni_goth_table_desc', 'The dark side of Habbo'), + ('club_txt_changesubscr', 'Change subscription'), + ('Alert_RememberSetYourPassword', 'Please check your password'), + ('reg_verification_checking', 'Checking...'), + ('furni_silo_studydesk_desc', 'For the true Habbo Scholars'), + ('room_give_rights', 'Give rights'), + ('furni_CF_50_goldbar_name', 'Gold Bar'), + ('furni_rom_lamp_name', 'Crystal Lamp'), + ('furni_sofachair_polyfon*8_desc', 'Yellow Mode Armchair'), + ('furni_deadduck3_name', 'Dead Duck 3'), + ('furni_bed_polyfon_one*4_name', 'Beige Mode Single Bed'), + ('furni_noob_stool*1_desc', 'Unfold me and take the weight off (orange)'), + ('furni_stand_polyfon_z_name', 'Shelf'), + ('furni_prize3_name', 'Bronze Trophy'), + ('club_status_text', 'Here you can see your Habbo Club membership status, number of elapsed months, pre-ordered months and status of the ongoing month.'), + ('furni_table_plasto_bigsquare*9_desc', 'Hip plastic furniture'), + ('furni_wooden_screen*4_desc', 'Add an exotic touch to your room'), + ('furni_sound_set_52_name', 'Christmas Party'), + ('furni_CF_1_coin_bronze_name', 'Bronze Coin'), + ('furni_tile_brown_name', 'Red Tile'), + ('nav_venue_bb_lobby_intermediate_5/0_desc', ''), + ('nav_venue_picnic/0_name', 'Picnic Garden'), + ('furni_sound_set_50_desc', 'The harder generation'), + ('furni_lamp2_armas_name', 'Lodge Candle'), + ('registration_disabled_text', 'You can\'t create new Habbos at the moment. Please try again [some date]..'), + ('catalog_selectproduct', 'Select product:'), + ('transaction_system_sms_telia', 'Telia'), + ('nav_venue_bb_lobby_intermediate_5_name', 'Semi-profs Battle Ball 6'), + ('furni_christmas_sleigh_name', 'Winter Sleigh'), + ('furni_scifirocket*8_desc', 'From a space far, far away!'), + ('furni_bed_budget*9_name', 'Red Pura Double Bed'), + ('poster_2000_desc', 'Suomen kartta'), + ('help_emergency_whathappens', 'A member of community staff will investigate the situation and take appropriate action. This may include sending you a response with advice on dealing with your issue.'), + ('purse_coins', 'Habbo Credits'), + ('furni_marquee*5_desc', 'It\'s both door and a shade!'), + ('club_txt_whatis', 'What is Habbo Club?'), + ('furni_present_gen2_name', 'Gift'), + ('trading', 'Trading'), + ('furni_sofa_silo*9_desc', 'Red Area Sofa'), + ('furni_summer_chair*9_name', 'Red Deck Chair'), + ('furni_shelves_armas_desc', 'For all those fire-side stories'), + ('purse_buy_coins', 'Buy Credits'), + ('room_confirmPlace', 'Are you sure?'), + ('furni_queue_tile1*3_desc', 'The power of movement'), + ('furni_soft_sofachair_norja*8_name', 'Yellow Iced Sofachair'), + ('furni_arabian_snake_desc', 'Beware the snake!'), + ('nav_venue_sw_lobby_tournament_6/0_desc', ''), + ('NUF_about_hotel', 'What\'s Habbo about?'), + ('furni_bardeskcorner_polyfon_desc', 'Tuck it away'), + ('furni_bardeskcorner_polyfon*4_name', 'Beige Mode Bardesk Corner'), + ('poster_13_desc', 'Arty black and white'), + ('nav_venue_bb_lobby_beginner_9/0_desc', ''), + ('nav_modify_nameshow', 'Show your name in the room info'), + ('NUF_mini_use_console_read_next', 'Click \'OK\' to mark message as read.'), + ('poster_1005_desc', 'The muscly movie hero'), + ('wallitem_jp_sheet2_name', 'jp_sheet2'), + ('furni_xmas_cstl_gate_desc', 'Let that icy draft out!'), + ('NUF_groups_url', 'http://d16-1.web.varoke.net/home/group-tutorial'), + ('furni_jp_irori_name', 'Irori'), + ('furni_jp_bamboo_desc', 'Watch out for pandas!'), + ('furni_christmas_reindeer_name', 'Reindeer'), + ('furni_glass_chair*4_name', 'Glass chair'), + ('furni_jp_tray5_desc', 'jp_tray5'), + ('furni_table_plasto_4leg*4_desc', 'Hip plastic furniture'), + ('NUF_getting_items_catalogue_purse', 'Click to open your Purse and find out how to get some Habbo Credits . You can use these to buy stuff!'), + ('furni_hc_tbl_name', 'Nordic Table'), + ('furni_bed_budget_one*6_name', 'Blue Pura Bed'), + ('furni_solarium_norja*7_name', 'Rural Solarium'), + ('console_newmessages', 'New Message(s)'), + ('poster_2_desc', 'Take pride in your veg!'), + ('furni_xmas_cstl_twr_desc', 'All I see from up here is snow!'), + ('hubu_info', 'Welcome to the FRANK Infobus! For the next three months FRANK advisors who know a lot about drugs, their effects and the risks involved, will be stepping aboard the Infobus to offer advice and support to any Habbo that wants to visit the bus. For more information click the link below:'), + ('furni_bardesk_polyfon*6_name', 'Blue Mode Bardesk'), + ('furni_summer_pool*3_name', 'Green Summer Pool'), + ('furni_pura_mdl3*8_name', 'yellow pura module 3'), + ('furni_valentinescreen_name', 'Holiday Romance'), + ('furni_rare_beehive_bulb*1_desc', 'A honey-hued glow'), + ('gs_link_gamerules', 'Game Rules'), + ('nav_venue_bb_lobby_tournament_11/0_desc', ''), + ('sound_machine_song_info', 'Song Info'), + ('wallitem_arabian_swords_name', 'Ancestral Scimitars'), + ('furni_one_way_door*6_desc', 'One way! The HC way!'), + ('furni_table_plasto_round*2_desc', 'Hip plastic furniture'), + ('credit', 'Credit'), + ('gs_lounge_skill_no_max', 'Infinite'), + ('furni_wall_china_desc', 'For your great wall'), + ('NUF_visiting_rooms_roomlist_add to fav', 'After clicking on a room you can click this button here to add it to favourites.'), + ('furni_carpet_polar*3_name', 'Yellow Bear Rug'), + ('poster_46_desc', 'Twinkle, twinkle'), + ('furni_petfood1_desc', 'Fantastic 20% Saving!'), + ('url_nobalance', 'http://%predefined%/credits?'), + ('furni_sofachair_silo*6_name', 'Blue Area Armchair'), + ('furni_noob_chair*1_desc', 'Lightweight, practical and yellow'), + ('nav_venue_bb_lobby_expert_7/0_desc', ''), + ('furni_pura_mdl1*7_name', 'Green Pura Module 1'), + ('furni_table_silo_small*6_name', 'Blue Area Occasional Table'), + ('club_thanks_title', 'Congratulations! You are now a member of Habbo Club.'), + ('furni_legotrophy_name', 'Basketball Trophy'), + ('roomatic_createyrown', 'Create Your Own Room'), + ('console_report_remove', 'Remove'), + ('furni_sound_set_42_desc', 'Bumps and Chills'), + ('furni_divider_nor5*5_desc', 'Cool cornering for your crib y0!'), + ('furni_rare_icecream*2_desc', 'Virtual pistachio rocks!'), + ('furni_pura_mdl4*6_name', 'Blue Pura Module 4'), + ('club_button_close', 'Close Window'), + ('wallitem_md_can_name', 'Bubble Juice Can'), + ('furni_prizetrophy7_desc', 'Palkinto'), + ('nav_venue_cunning_fox_gamehall/2_desc', 'Keep your head down, it\'s bombs away'), + ('poster_28_desc', '10 x Silver Tinsel'), + ('furni_rare_dragonlamp*2_desc', 'Oriental beast of legends'), + ('furni_glass_sofa*2_name', 'Glass sofa'), + ('modtool_hours', 'Hours'), + ('nav_venue_emperors_name', 'Emperor\'s hall'), + ('catalog_buyingSuccesfull', 'Buying Successful!'), + ('console_concurrency_error', 'There was a concurrency error while modifying friend list'), + ('furni_table_silo_med*3_desc', 'Wipe clean and unobtrusive'), + ('furni_sleepingbag*8_desc', 'Ultimate coziness for SnowStorm winners'), + ('poster_508_desc', 'The flag of Spain'), + ('furni_goodie1*2_desc', 'Crunchy Dog Treat'), + ('nav_venue_sw_lobby_free_3/0_desc', ''), + ('furni_chair_basic*7_desc', ''), + ('room_take_rights', 'Remove Rights'), + ('furni_hc_bkshlf_desc', 'For the scholarly ones'), + ('furni_bed_polyfon*2_desc', 'Black Mode Double Bed'), + ('furni_table_plasto_4leg_name', 'Occasional Table'), + ('furni_bed_budget*7_desc', 'King sized comfort!'), + ('win_partner_registration', 'Partner registration'), + ('summer_chair_4_desc', 'Please tan responsably'), + ('furni_table_norja_med_name', 'Coffee Table'), + ('nav_venue_club_massiva/2_desc', 'Make all the right moves'), + ('furni_divider_silo1_desc', 'Neat and natty'), + ('hobba_send_reply', 'Send Alert'), + ('shopping_nocash', 'You don\'t have enough Credits in your Purse.\\r Click \'OK\' to see the different ways of\\rgetting Habbo Credits.'), + ('furni_divider_poly3*9_name', 'Red Hatch'), + ('furni_rare_fountain*1_desc', 'For our feathered friends'), + ('poster_56_desc', 'Serious partying going on!'), + ('furni_scifiport*6_name', 'White Sci-Fi Port'), + ('furni_rclr_garden_desc', 'Self watering'), + ('furni_arabian_tray1_desc', 'Tea for every occasion'), + ('furni_rare_fountain*3_name', 'Bird Bath (blue)'), + ('furni_romantique_pianochair*1_name', 'Rose Quartz Piano Stool'), + ('furni_romantique_divider*1_desc', 'Beauty lies within'), + ('wallitem_post.it.vd_name', 'Heart Stickies'), + ('wallitem_torch_desc', 'The dark side of Habbo'), + ('roomatic_namedisplayed', 'Do you want your name to be displayed with the room?'), + ('furni_grunge_candle_name', 'Candle Box'), + ('furni_sound_set_17_name', 'Groove 3'), + ('furni_prizetrophy3*2_name', 'Globe trophy'), + ('furni_chair_silo_desc', 'Keep it simple'), + ('nav_venue_sw_lobby_beginner_7/0_desc', ''), + ('nav_venue_sw_lobby_beginner_3/0_desc', ''), + ('furni_hc_trll_name', 'Drinks Trolley'), + ('furni_bed_polyfon_one*7_desc', 'Green Mode Single Bed'), + ('furni_chair_plasto*2_name', 'Chair'), + ('furni_pura_mdl1*4_name', 'White Pura Module 1'), + ('furni_gothiccandelabra_desc', 'The dark side of Habbo'), + ('NUH_chat', 'Click here and type to chat to other Habbos.'), + ('furni_plant_valentinerose*2_name', 'White Valentine Rose'), + ('reg_privacypledge', 'Privacy Pledge'), + ('furni_exe_table_desc', 'Take a memo, Featherstone'), + ('hubu_info_link2', 'FRANK Website'), + ('furni_prizetrophy4*3_name', 'Fish trophy'), + ('furni_hc_chr_desc', 'Royal comfort'), + ('hubu_info_link1', 'FRANK Infobus Information'), + ('sound_machine_your_songs', 'Traxmachine Songs'), + ('furni_active_placeholder_name', 'This furniture is downloading...'), + ('furni_divider_silo3*8_name', 'Yellow Area Gate'), + ('NUF_visiting_rooms_categorylist_tutor', 'There are so many Guest Rooms we thought it would be a "hoot" to divide them into categories. Select a category to view its contents.'), + ('furni_sofa_silo*6_name', 'Blue Area Sofa'), + ('club_extend_failed', 'Sorry, we were unable to process the purchase. No Credits were charged!'), + ('furni_soft_sofa_norja*4_name', 'Urban Iced Sofa'), + ('furni_sporttrack3*3_desc', 'null'), + ('furni_sound_set_1_name', 'Habbo Sounds 1'), + ('furni_pura_mdl2*5_name', 'beige pura module 2'), + ('nav_venue_sw_lobby_intermediate_1/0_desc', ''), + ('furni_safe_silo*8_name', 'Yellow Safe Minibar'), + ('trading_agrees', 'agrees'), + ('alert_needpermission', 'You need your parent or guardian\'s permission to spend time in Habbo Hotel.'), + ('nav_modify', 'Modify'), + ('furni_noob_stool*4_desc', 'Unfold me and take the weight off (light blue)'), + ('catalog_length_trophymsg', 'Oops, your inscription is too long, so it won\'t fit on the trophy. \\rPlease type something shorter.'), + ('furni_s_sound_machine*3_desc', 'Sound Machine Green Desc'), + ('club_member', 'Member'), + ('modtool_ban_ip', 'Ban IP Also'), + ('bb_link_gamerules', 'Spelregels'), + ('furni_carpet_armas_name', 'Hand-Woven Rug'), + ('furni_rubberchair*5_desc', 'Soft and tearproof!'), + ('furni_table_plasto_square*1_desc', 'Hip plastic furniture'), + ('furni_divider_nor3*3_desc', 'Do go through...'), + ('nav_venue_habburger\'s/0_desc', 'Get food here!'), + ('reg_linkstitle', 'Full version of the documents:'), + ('roomevent_browser_title', 'Events'), + ('roomatic_security', 'Security'), + ('furni_table_plasto_4leg*7_desc', 'Hip plastic furniture'), + ('furni_table_plasto_round*14_desc', 'Hip plastic furniture'), + ('furni_sound_set_38_desc', 'Rock and Roses!'), + ('furni_rare_parasol*0_desc', 'Block those rays!'), + ('furni_pura_mdl3*6_desc', 'Any way you like it!'), + ('NUF_console', 'Learn about messaging'), + ('poster_45_name', 'Skeleton'), + ('furni_pura_mdl3*9_desc', 'Any way you like it!'), + ('pet_age', 'Age:'), + ('poster_48_name', 'Large gold star'), + ('open', 'Open'), + ('gs_3min', '3min'), + ('wallitem_habw_mirror_name', 'Habbowood Mirror'), + ('furni_carpet_polar*4_desc', 'Snuggle up on a Funky bear rug...'), + ('furni_table_armas_name', 'Dining Table'), + ('sw_gameprice', 'Play now for just 2 tickets!'), + ('furni_divider_nor5*4_name', 'Urban Iced Angle'), + ('navigator', 'Hotel Navigator'), + ('furni_pillow*2_desc', 'Puffy, soft and huge'), + ('purse_vouchers_checking', 'Checking code, please wait...'), + ('furni_noob_rug*4_desc', 'Nice and neat sisal rug with light blue edging'), + ('furni_safe_silo*5_name', 'Pink Safe Minibar'), + ('nav_venue_the_dirty_duck_pub/0_desc', 'The perfect place to chill!'), + ('furni_CFC_10_coin_bronze_desc', 'Worth 10 Credits'), + ('furni_teleport_door_desc', 'Magic doorway to anywhere!'), + ('furni_bardesk_polyfon_name', 'Bar/desk'), + ('login_password', 'Password'), + ('furni_pura_mdl2*8_desc', ''), + ('furni_divider_nor4*4_desc', 'Habbos, roll out!'), + ('furni_rare_fan*7_name', 'Brown Powered Fan'), + ('furni_bed_polyfon_girl_one_desc', 'Snuggle down in princess pink'), + ('club_general_elapsed', 'Elapsed Months'), + ('nav_venue_sw_lobby_free_1_name', 'Free Game Lobby'), + ('furni_gothic_chair*5_name', 'Green Gothic Chair'), + ('furni_sink_name', 'Sink'), + ('furni_bed_budget_one*4_desc', 'Prince sized comfort!'), + ('Alert_ForgotSetPassword', 'Please check your password'), + ('furni_chair_plasto*6_desc', 'Hip plastic furniture'), + ('furni_carpet_standard_desc', 'Available in a variety of colours'), + ('reg_update_text2', 'Only change them when you want to make sure that nobody can know or guess your password.'), + ('furni_arabian_swords_desc', 'Not for yielding'), + ('furni_divider_silo3*5_name', 'Pink Area Gate'), + ('furni_fireplace_polyfon_desc', 'Comfort in stainless steel'), + ('furni_glass_table*3_desc', 'Translucent beauty'), + ('furni_summer_pool*4_desc', 'Fancy a dip?'), + ('poster_500_desc', 'The UK flag'), + ('poster_1004_name', 'Eid Mubarak Poster'), + ('furni_rare_icecream*5_desc', 'Virtual vanilla rocks!'), + ('furni_one_way_door*2_name', 'Black HC Gate'), + ('furni_chair_plasty*3_desc', 'Hip plastic furniture'), + ('club_end_title', 'Your Habbo Club membership has now expired.'), + ('furni_table_polyfon_desc', 'For larger gatherings'), + ('furni_romantique_pianochair*4_desc', 'I can feel air coming through...'), + ('furni_bardesk_polyfon*3_name', 'White Bardesk'), + ('predefined_room_description', '%user_name% has entered the building'), + ('poster_53_desc', 'whack that ball!'), + ('poster_515_name', 'The Swedish flag'), + ('furni_rope_divider_desc', 'Rope Divider'), + ('furni_chair_norja*3_desc', 'Sleek and chic for each cheek'), + ('furni_scifidoor*9_name', 'Blue Spaceship Door'), + ('furni_goodie2_name', 'Chocolate Mouse'), + ('game_poker_logoff', 'Left the game'), + ('furni_bed_polyfon_desc', 'Give yourself space to stretch out'), + ('furni_table_plasto_round*5_desc', 'Hip plastic furniture'), + ('furni_couch_norja*3_desc', 'Two can perch comfortably'), + ('pet.saying.sleep.cat.2', 'Purrr... rrrr'), + ('pet.saying.sleep.cat.1', 'mrrrr..rrrr..'), + ('pet.saying.sleep.cat.0', 'hrrrrr....Mrrrrr'), + ('login_ok', 'OK'), + ('gs_button_expand', 'Expand Window'), + ('pet.saying.sleep.cat.4', 'mrrrr...muew..mrr'), + ('tutorial_next', 'Next:'), + ('pet.saying.sleep.cat.3', 'hurrr..hurrr'), + ('furni_jp_tatami_desc', 'Shoes off please'), + ('hobba_sent_to_moderators', 'Call re-assigned non-emergency, still visible to moderators'), + ('roomatic_choosecategory', ''), + ('wallitem_guitar_v_desc', 'tilulilulii'), + ('NUF_groups', 'Groups'), + ('bb_link_gameRules_url', 'http://%predefined%/groups/56552/id'), + ('nav_venue_theatredrome_halloween_name', 'Theatredrome Habboween'), + ('bb_buyTicketsButton', 'Buy tickets'), + ('furni_gothgate_desc', 'The dark side of Habbo'), + ('game_poker_waiting', 'Change done.\\rWaiting for the other players'), + ('furni_glass_stool*7_desc', 'Habbo Club'), + ('club_end_text', 'BUT, don\'t worry, you can still buy another month of Habbo Club and keep all your Habbo Club benefits,special Furni gifts and the shiny badge!'), + ('furni_sound_set_18_desc', 'Listen while you tan'), + ('furni_sound_set_35_desc', 'Groovelicious'), + ('furni_prizetrophy2*2_desc', 'Shiny silver'), + ('furni_plant_valentinerose*3_desc', 'Relight your passions'), + ('furni_romantique_divan*5_name', 'Onyx Chaise-Longue'), + ('furni_chair_norja*6_desc', 'Sleek and chic for each cheek'), + ('wallitem_hrella_poster_2_desc', 'For those scary Lido moments'), + ('furni_s_sound_machine*6_desc', 'Sound Machine Purple'), + ('game_bs_miss', 'Miss:'), + ('furni_carpet_standard*4_desc', 'Available in a variety of colours'), + ('furni_pura_mdl1*1_name', 'Aqua Pura Module 1'), + ('furni_rare_icecream*8_desc', 'Virtual peppermint rocks!'), + ('furni_petfood4_desc', 'Fantastic 20% Saving!'), + ('furni_table_silo_small*3_name', 'White Occasional Table'), + ('furni_table_plasto_round*8_desc', 'Hip plastic furniture'), + ('furni_chair_polyfon_desc', 'Metallic seating experience'), + ('furni_exe_drinks_desc', 'Give a warm welcome'), + ('nav_createroom', 'Create Own Room'), + ('furni_table_plasto_bigsquare*14_desc', 'Hip plastic furniture'), + ('poster_1001_name', 'Prince Charles Poster'), + ('furni_CF_20_moneybag_name', 'Sack of Credits'), + ('furni_prizetrophy5*1_name', 'Duo trophy'), + ('alert_reg_email', 'Email'), + ('pet_thirsty', 'Thirst:'), + ('nav_error_passwordtooshort', 'The password is too short.'), + ('nav_venue_sw_lobby_free_7_name', 'Free Game Lobby'), + ('furni_plant_valentinerose*5_name', 'Purple Valentine Rose'), + ('recycler_status_info', 'You have Furniture in recycling. The icon will blink when recycling is complete.'), + ('poster_52_name', 'Hockey Stick'), + ('win_doorbell', 'Doorbell'), + ('Unreadmessages', 'New Message(s)'), + ('furni_queue_tile1*9_desc', 'The power of movement'), + ('furni_rare_snowrug_name', 'Snow Rug'), + ('console_approve_selected', 'Accept selected'), + ('pet_race_0_009', 'Hound of Hull'), + ('poster_35_name', 'The Habbo Babes 1'), + ('pet_race_0_008', 'Springy Spaniel'), + ('furni_sofa_polyfon*3_desc', 'Comfort for stylish couples'), + ('furni_basket_name', 'Basket Of Eggs'), + ('pet_race_0_007', 'Slobber Don'), + ('pet_race_0_006', 'Stripy Setter'), + ('pet_race_0_005', 'Paws Forethought'), + ('pet_race_0_004', 'Droopy of Pawford'), + ('furni_barchair_silo_desc', 'Practical and convenient'), + ('furni_noob_lamp*2_desc', 'Get the light right where you want it (dark blue)'), + ('pet_race_0_003', 'Rescue Bernard'), + ('furni_glass_stool_name', 'Glass stool'), + ('pet_race_0_002', 'Joe Cocker Spaniel'), + ('pet_race_0_001', 'Habbo Husky'), + ('pet_race_0_000', 'Yappy Yorkie'), + ('NUF_mini_endtopic_step1_questionmark', 'Click to see our help menu and find our FAQs!'), + ('furni_sound_set_28_desc', 'Head for the pit!'), + ('nav_private_norooms', 'You dont have any rooms - create one?'), + ('furni_table_plasto_square*4_desc', 'Hip plastic furniture'), + ('furni_val_teddy*6_name', 'Blue Share Bear'), + ('furni_noob_table*3_desc', 'Lightweight, practical and aubergine'), + ('gs_state_finished', 'This Game is already over!'), + ('furni_rare_fan*8_desc', 'Stylish, Eco-Energy!'), + ('reg_parentemail_link_url1', 'http://%predefined%//help/parents_guide.html'), + ('furni_gothic_carpet2_desc', 'What lies beneath?'), + ('furni_rare_fan*5_desc', 'It\'ll blow you away!'), + ('modtool_kickuser', 'Kick User'), + ('furni_divider_silo1*7_desc', 'Green Area Corner Shelf'), + ('reg_parentemail_link_url2', 'http://%predefined%//footer_pages/privacy_policy.html'), + ('pet_race_0_019', 'Tiny Terrier'), + ('pet_race_0_018', 'Bushy Woofer'), + ('pet_race_0_017', 'Speckled Sheepdog'), + ('furni_rubberchair*8_desc', 'Soft and tearproof for HC!'), + ('pet_race_0_016', 'Murmurin\' Minimastiff'), + ('poster_42_name', 'Spiderweb'), + ('pet_race_0_015', 'Pixie Poodle'), + ('furni_safe_silo*2_name', 'Black Safe Minibar'), + ('pet_race_0_014', 'Whiffy Woofy'), + ('pet_race_0_013', 'Mangy Mutt'), + ('nav_publicRooms', 'Public Spaces'), + ('pet_race_0_012', 'Tawny Bleugh'), + ('pet_race_0_011', 'Lappy Lassie'), + ('pet_race_0_010', 'Furry McScottie'), + ('game_bs_toast', 'Toast!'), + ('furni_prizetrophy6_name', 'Pokaali'), + ('furni_pudding_desc', 'Will you get the lucky sixpence?'), + ('furni_tile_red_desc', 'In a choice of colours'), + ('nav_venue_sw_arena_expert_name', 'Playing expert game'), + ('pet.saying.sleep.croco.0', 'Zzzz... zzzzz...'), + ('poster_50_desc', 'flap, flap, screech, screech...'), + ('furni_shelves_norja*9_name', 'Red Bookcase'), + ('furni_sound_set_4_name', 'Ambient 1'), + ('furni_exe_s_table_desc', 'Get a clear reflection!'), + ('furni_present_gen6_desc', 'What\'s inside?'), + ('furni_one_way_door*5_name', 'Pink One Way Gate'), + ('nav_search_hd', 'Search rooms by Habbo name or room name.'), + ('poster_20_desc', 'high security for your room'), + ('buddyremove_messenger_updating', 'The console is updating, try again in a minute... Everything else is working fine!'), + ('pet.saying.sleep.croco.3', ':)'), + ('furni_house2_desc', 'Good enough to eat'), + ('pet.saying.sleep.croco.4', '*Snuh snuh*'), + ('tutorial_offtopic', 'Oops! You got off the topic. Please restart or select a new topic.'), + ('pet.saying.sleep.croco.1', 'Yrgh... Yrgh...'), + ('jukebox_now_playing', 'Now playing:'), + ('pet.saying.sleep.croco.2', 'Frgh... Frgh...'), + ('furni_sound_set_25_desc', 'Actually, it\'s Partay!'), + ('club_intro_header', 'Welcome to Habbo Club, the members-only club that all VIP Habbos belong to!'), + ('nav_venue_sw_lobby_amateur_3/0_desc', 'Astetta rankempaa lumisotaa.'), + ('pet.saying.sleep.croco.5', 'Rawwwwwwwwrrrm...'), + ('pet.saying.sleep.croco.6', 'Mmmm... Hooks...'), + ('furni_table_plasto_bigsquare*1_desc', 'Hip plastic furniture'), + ('nav_venue_sw_lobby_free_4_name', 'Free Game Lobby'), + ('alert_warning', 'Moderator says:'), + ('furni_barrier*3_name', 'Red Road Barrier'), + ('nav_venue_floatinggarden_name', 'Floating Garden'), + ('gs_error_nocredits', 'You need Habbo Credits to play a Game!'), + ('furni_chair_plasto*5_name', 'Chair'), + ('furni_tree2_desc', 'Old Christmas Tree'), + ('furni_bed_budget_one*7_desc', 'Prince sized comfort!'), + ('furni_romantique_clock_name', 'romantique_clock'), + ('room_banner_text', ''), + ('furni_sleepingbag*2_desc', 'Ultimate coziness'), + ('furni_divider_nor4*3_name', 'White Iced Auto Shutter'), + ('jukebox_song_remaining', 'Remaining time: %time%'), + ('reg_note_text', 'Never change your password or email\\rif someone else asks you to - they will\\rsteal your furni and Credits!'), + ('habbo_hand_next', '>>>'), + ('nav_venue_orient/0_desc', 'Tres chic with an Eastern twist. For Habbo Club members only.'), + ('furni_easterduck_name', 'Wannabe bunny'), + ('login_forgottenPassword', 'Forgotten your password?'), + ('furni_prizetrophy*1_desc', 'Glittery gold'), + ('hubu_t2_2', ''), + ('hubu_t2_3', 'Vapaa-ajan linkkejä'), + ('decision_cancel', 'Cancel'), + ('nav_venue_bb_lobby_tournament_2/0_desc', ''), + ('furni_samovar_desc', 'Click for a refreshing cuppa'), + ('furni_rcandle_name', 'Red Candle'), + ('furni_waterbowl*4_name', 'Blue Water Bowl'), + ('furni_table_norja_med*7_name', 'Rural Iced Coffee Table'), + ('NUF_playing_games_room_tutor', 'See some people wandering around? They are psyching themselves up for a game. Game Tickets are usually 2 Habbo Credits, but in this room the games are free.'), + ('furni_doormat_love_name', 'Doormat'), + ('bb_link_tournament_highScores_url', 'http://%predefined%//groups/56552/id'), + ('furni_sofachair_polyfon*4_name', 'Beige Mode Armchair'), + ('error_room_full', 'Huone on täynnä.'), + ('furni_chair_silo*4_desc', 'Beige Silo Dining Chair'), + ('furni_divider_nor2*7_name', 'Rural Iced Bar'), + ('hubu_t2_1', ''), + ('furni_divider_nor1*9_name', 'Red Ice corner'), + ('furni_wooden_screen*0_name', 'White Oriental Screen'), + ('furni_chair_basic*1_desc', ''), + ('gs_choose_gamename', 'Enter A Name For Your Game:'), + ('poll_question_number', 'Question %number%/%count%'), + ('furni_hc_rllr_desc', 'Highest class transportation'), + ('furni_table_plasto_4leg*15_desc', 'Hip plastic furniture'), + ('furni_scifiport*9_name', 'Violet Sci-Fi Port'), + ('furni_jukebox*1_desc', 'For your Happy Days!'), + ('furni_red_tv_desc', 'Don?t miss those soaps'), + ('furni_song_disk_name', 'Traxdisc'), + ('reg_agree_alert', 'You have to agree to the terms of service\\r(tick the box).'), + ('furni_summer_chair*1_desc', 'Got your swimming trunks?'), + ('poster_2008_name', 'Habbo Leap Day Poster'), + ('poster_505_desc', 'The Canadian flag'), + ('group_homepage', 'Groups\' Homepage >>>'), + ('furni_table_silo_med*6_desc', 'Blue Area Coffee Table'), + ('nav_venue_tearoom/0_name', 'Chinese Tea Room'), + ('dimmer_use_bg_only', 'Background only'), + ('furni_divider_poly3*4_name', 'Beige Mode Bardesk Gate'), + ('nav_venue_hotel_kitchen/0_desc', 'Beware the flying knives!'), + ('furni_divider_silo1*8_desc', 'Neat and natty'), + ('furni_hc_btlr_name', 'Electric Butler'), + ('furni_wooden_screen*5_name', 'Gray Oriental Screen'), + ('furni_scifiport*8_name', 'Purple Sci-Fi Port'), + ('furni_carpet_standard*5_name', 'Floor Rug'), + ('trading_offers', 'offers:'), + ('furni_prizetrophy2*3_name', 'Duck trophy'), + ('transaction_system_club_habbo', 'Habbo Club payment'), + ('nav_venue_bb_lobby_tournament_9/0_desc', ''), + ('poster_517_name', 'The Scottish flag'), + ('furni_wood_tv_desc', 'For family viewing'), + ('furni_deadduck2_desc', 'Someone forgot to feed me...'), + ('furni_sound_set_20_desc', 'Musical heaven'), + ('sound_machine_new', 'Create a New Song'), + ('nav_venue_the_chromide_club/0_desc', 'Ghetto Fabulous'), + ('nav_modify_doorstatus_pwagain', 'pw again:'), + ('furni_chair_plasto*10_desc', 'Hip plastic furniture'), + ('gs_idlewarning', 'You will be replaced if you don\'t start or join a Game soon!'), + ('purse_vouchers_entercode', 'Enter code here:'), + ('sound_machine_song_name', 'Untitled Trax'), + ('furni_sofa_polyfon*4_name', 'Beige Mode Sofa'), + ('furni_carpet_standard*a_name', 'Floor Rug'), + ('poster_510_name', 'The Italian flag'), + ('furni_table_plasto_square*7_name', 'Square Dining Table'), + ('furni_noob_chair*6_desc', 'Lightweight, practical with dark yellow stripes'), + ('forgottenpw_whatyou', 'What\'s your Habbo called?'), + ('nav_venue_bb_lobby_amateur_1_name', 'Gevorderden Battle Ball 2'), + ('furni_noob_table*6_name', 'My first Habbo table'), + ('furni_pillar*0_desc', 'Classy architect, for holding up ceilings!'), + ('poster_1002_desc', 'aw, bless...'), + ('furni_divider_arm1_desc', 'Good solid wood'), + ('furni_glass_stool*8_name', 'Glass stool'), + ('furni_rare_moonrug_name', 'Moon Patch'), + ('nav_venue_rooftop_rumble/0_desc', 'Are you ready?'), + ('transaction_system_sms_sonera', 'Sonera'), + ('furni_waterbowl*5_name', 'Brown Water Bowl'), + ('furni_sound_set_32_name', 'Instrumental 2'), + ('furni_table_silo_small*4_name', 'Beige Area Occasional Table'), + ('furni_prizetrophy8*1_name', 'Duo trophy'), + ('tutorial_menu', 'Get help with...'), + ('gs_2teams', '2 Teams Game'), + ('furni_sound_machine*4_desc', 'For Funky, Funky Fridays!'), + ('furni_romantique_divan*4_desc', 'Is that a cape hanging there?'), + ('furni_couch_norja*8_desc', 'Two can perch comfortably'), + ('console_usersnotfound', 'Habbo Not Found'), + ('nav_venue_bb_lobby_amateur_2/0_desc', ''), + ('furni_sleepingbag*4_desc', 'Ultimate coziness'), + ('furni_bed_budget_one*6_desc', 'Prince sized comfort!'), + ('furni_sw_chest_desc', ''), + ('nav_venue_bb_lobby_amateur_5/0_desc', ''), + ('NUF_visiting_rooms_room_tutor', 'This is a Guest Room. You can either quit the tutorial and start meeting people, or select the next topic.'), + ('furni_jp_pillow_name', 'Pillow Chair'), + ('url_logged_out', 'http://%predefined%/account/disconnected?reason=logout&origin=popup'), + ('furni_romantique_smalltabl*1_name', 'Rose Quartz Tray Table'), + ('friend_request_declined', 'Declined!'), + ('furni_grunge_shelf_desc', 'Scrap books and photo albums'), + ('furni_gothic_stool*6_name', 'Gothic Stool Blue'), + ('wallitem_gothicfountain_desc', 'Not suitable for drinking!'), + ('furni_scifiport*1_name', 'Gold Laser Gate'), + ('furni_sound_set_41_name', 'Rock 8'), + ('furni_toilet_yell_name', 'Loo Seat'), + ('console_fr_limit_exceeded_error', 'Too many friends selected. Please remove some first.'), + ('console_asktobecomeafriend', 'Ask To Become A Friend'), + ('console_friends', 'Friends'), + ('furni_table_plasto_bigsquare*4_desc', 'Hip plastic furniture'), + ('poster_2005_desc', 'The Special Infobus Poster'), + ('furni_summer_chair*8_desc', 'Got your sun cream?'), + ('furni_s_sound_machine*2_name', 'Sound Machine Ocean'), + ('nav_ringbell', 'The door is locked. Ringing the bell, and waiting...'), + ('console_profilematch', 'Habbo Profile match -'), + ('poster_14_name', 'Fox Poster'), + ('furni_bardeskcorner_polyfon*3_desc', 'Tuck it away'), + ('furni_carpet_soft*2_name', 'Soft Wool Rug'), + ('furni_ham_name', 'Joint of Ham'), + ('nav_venue_star_lounge_name', 'Star Lounge'), + ('nav_venue_bb_lobby_beginner_desc', 'Beginner battle ball'), + ('furni_doormat_plain*3_desc', 'Available in a variety of colours'), + ('furni_habbowood_chair_desc', 'Exclusively for Directors'), + ('nav_venue_bb_lobby_beginner_3/0_desc', ''), + ('furni_CF_20_moneybag_desc', 'Worth 20 Credits'), + ('furni_edice_desc', 'What\'s your lucky number?'), + ('furni_scifirocket*9_name', 'Neptune Smoke Machine'), + ('furni_bardesk_polyfon*9_name', 'Red Bardesk'), + ('furni_glass_table*8_desc', 'Translucent beauty'), + ('NUF_mini_endtopic', 'Find out more'), + ('pending_cfh_title', 'Your old message'), + ('nav_venue_sw_arena_tournament_name', 'Playing a tournament game!'), + ('furni_arabian_bigtb_desc', 'It must be Jinn-er time!'), + ('nav_venue_bb_lobby_beginner_0/0_desc', ''), + ('furni_pillow*3_name', 'Turquoise Satin Pillow'), + ('interface_icon_help', 'Help, need help?'), + ('nav_roomnfo_hd_src', 'Search Rooms'), + ('pet.saying.generic.dog.0', 'woof..woof'), + ('furni_chair_norja*9_name', 'Red Chair'), + ('NUF_getting_room_roommatic_start_tutor', 'This is the Room-O-Matic! Green! You use this to make your room.'), + ('furni_sound_set_2_name', 'Habbo Sounds 3'), + ('nav_venue_netcafe_name', 'My Habbo Home Netcafe'), + ('purse_voucherbutton', 'Vouchers'), + ('console_console', 'Console'), + ('game_poker_changed', 'changed'), + ('transaction_system_splashplastic', 'SplashPlastic'), + ('nav_venue_sw_lobby_free_7/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('furni_sporttrack3*1_desc', 'null'), + ('buddyremove_prev', '< Previous'), + ('roomatic_chooselayout', 'Choose the layout of your room'), + ('wallitem_item_placeholder_desc', 'This furniture is downloading...'), + ('purse_note', 'NOTE : The transactions are updated at 6 am every day.'), + ('poster_34_desc', 'Habbo-punk for the never-agreeing'), + ('furni_sound_set_27_desc', 'Jingle Bells will never be the same...'), + ('game_chess_start', 'Start Over'), + ('summer_chair_7_desc', 'A green deck chair'), + ('nav_venue_bb_lobby_beginner_6_name', 'Beginners Battle Ball 7'), + ('purse_link', 'Click here to see how to get Credits.'), + ('poster_59_desc', 'Torch - it gives you some light'), + ('room_info_rate_req', 'Rate this room'), + ('furni_rare_dragonlamp*5_desc', 'Roast your chestnuts here!'), + ('furni_divider_silo3*9_desc', 'Red Area Gate'), + ('more_roomlayouts', 'Extra room layouts for Habbo Club members >>'), + ('furni_grunge_chair_desc', 'Alternative chair for alternative people'), + ('furni_bed_budget*9_desc', 'King sized comfort!'), + ('furni_christmas_sleigh_desc', 'Ready for your Xmas cheer'), + ('furni_table_plasto_4leg*8_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_tournament_5_name', 'Competitie Battle Ball 6'), + ('furni_table_norja_med*4_name', 'Urban Iced Coffee Table'), + ('instant_friend_request_header', 'Friend Request'), + ('furni_marquee*3_name', 'Aqua Marquee'), + ('furni_noob_stool*1_name', 'My first Habbo stool'), + ('furni_rare_mnstr_desc', 'Don\'t get too close...'), + ('furni_safe_silo_pb_desc', 'Totally shatter-proof!'), + ('NUF_meeting_people_user_chatfield', 'Start typing here and press \'Enter\' to chat with others.'), + ('furni_prizetrophy6*2_desc', 'Shiny silver'), + ('furni_table_plasto_bigsquare*9_name', 'Square Dining Table'), + ('club_habbo.window.title', 'Habbo Club'), + ('recycler_info_ready', 'Recycling is complete. You have made a great environmentally friendly decision. All the recycled items you receive have been made from old items which helps to save natural resources and reduce pollution.'), + ('furni_shelves_norja*5_desc', 'For nic naks and art deco books'), + ('furni_table_silo_med_name', 'Coffee Table'), + ('furni_grunge_sign_desc', 'Bought legitimately from an M1 cafe.'), + ('roomevent_type_9', 'Group Events'), + ('roomevent_type_7', 'Dating'), + ('pet.saying.generic.dog.1', 'woof woof woof!!!'), + ('roomevent_type_8', 'Jobs'), + ('pet.saying.generic.dog.2', 'wooooof!'), + ('roomevent_type_5', 'Debates & Discussion'), + ('pet.saying.generic.dog.3', 'hooooowl'), + ('roomevent_type_6', 'Grand Openings'), + ('furni_solarium_norja*2_name', 'Beige Solarium'), + ('nav_venue_bb_lobby_intermediate_3_name', 'Semi-profs Battle Ball 4'), + ('console_searchfor', 'Search:'), + ('wallitem_arabian_wndw_desc', 'Arabian days and nights'), + ('furni_queue_tile1*3_name', 'Ice Habbo Roller'), + ('furni_lamp2_armas_desc', 'Wax lyrical with some old-world charm'), + ('furni_jp_tray3_desc', 'jp_tray3'), + ('wallitem_guitar_skull_name', 'skull guitar'), + ('roomevent_type_3', 'Games'), + ('furni_romantique_divider*2_desc', 'Keeping things separated'), + ('roomatic_owner', 'Owner:'), + ('url_helpterms', 'http://%predefined%//help/68'), + ('roomevent_type_4', 'Welcoming Party Events'), + ('furni_glass_chair*6_desc', 'Translucent beauty'), + ('furni_pillar*5_name', 'Pagan Pillar'), + ('roomevent_type_1', 'Parties & Music'), + ('roomevent_type_2', 'Trading'), + ('furni_present_gen2_desc', 'What\'s inside?'), + ('ph_tickets_title', 'Tickets'), + ('furni_table_norja_med*8_desc', 'For larger gatherings'), + ('furni_sound_set_54_desc', 'Tune into Christmas'), + ('poster_61_desc', 'The Auspicious One'), + ('furni_divider_silo3_name', 'Gate (lockable)'), + ('furni_scifirocket*4_desc', 'Welcome... to planet love'), + ('furni_plant_valentinerose*1_name', 'Red Valentine\'s Rose'), + ('furni_exe_chair2_name', 'Executive Boss Chair'), + ('alert_donate_ok', 'Give away my furni'), + ('furni_bardesk_polyfon*4_desc', 'Beige Mode Bardesk'), + ('furni_pura_mdl1*5_desc', ''), + ('hubu_close', 'Sulje kioski'), + ('gs_deathmatch', 'Every Habbo for himself!'), + ('summer_chair_9_desc', 'Sunbathing, why not?'), + ('furni_barchair_silo*8_name', 'Yellow Bar Stool'), + ('console_differentmessagemodes', 'Different Messages'), + ('furni_chair_silo*5_name', 'Pink Silo Dining Chair'), + ('callhelp_explanation', 'Thanks for reporting the problem'), + ('furni_chair_plasty*1_desc', 'Hip plastic furniture'), + ('furni_bed_budget*2_desc', 'Queen sized comfort!'), + ('furni_summer_grill*2_desc', 'Plenty of shrimp on that barbie'), + ('furni_heart_desc', 'Full of love'), + ('reg_donetext', 'Soon you\'ll see the Hotel Navigator, it shows you all the rooms you can go to -the guest rooms, clubs, caf�s, swimming pools and more!'), + ('poster_523_desc', 'The flag of India'), + ('furni_one_way_door*1_name', 'Aqua One Way Gate'), + ('furni_bardeskcorner_polyfon*13_desc', 'Tuck it away'), + ('nav_venue_sw_lobby_amateur_5/0_desc', 'Astetta rankempaa lumisotaa.'), + ('furni_gothic_chair*4_desc', 'Vampires and Wizards'), + ('furni_bardesk_polyfon*6_desc', 'Blue Mode Bardesk'), + ('transaction_system_sms_sra', 'Sonera'), + ('dimmer_turn_off', 'Turn OFF'), + ('furni_fireplace_armas_desc', 'Authentic, real flame fire'), + ('furni_chair_plasty*6_name', 'Plastic Pod Chair'), + ('furni_scifidoor*6_name', 'Black Monolith'), + ('furni_summer_pool*3_desc', 'Fancy a dip?'), + ('furni_christmas_reindeer_desc', 'Prancer becomes Rudolph in a click!'), + ('furni_chair_norja_name', 'Chair'), + ('furni_barchair_silo*3_name', 'White Bar Stool'), + ('nav_venue_bb_lobby_tournament_desc', 'Play battle ball tournament!'), + ('transaction_system_bank_sampo', 'Sampo'), + ('furni_sound_set_39_name', 'Rock 7'), + ('furni_pura_mdl3*8_desc', ''), + ('console_follow_prevented', 'Your friend has prevented others from following him/her.'), + ('poster_46_name', 'Small gold star'), + ('furni_sofa_polyfon_girl_name', 'Two-seater Sofa'), + ('furni_carpet_polar*3_desc', 'Snuggle up on a Funky bear rug...'), + ('modtool_rankerror', 'You do not have the rights for this action on this user!'), + ('furni_divider_nor3*4_name', 'Urban Iced Gate'), + ('nav_venue_theatredrome_valentine/0_desc', 'Hug A Friend, Its Valentines! Home Of Ralph (Wannabe Panda In Training)'), + ('furni_one_way_door*6_name', 'Blue HC Gate'), + ('poster_7_desc', 'For emergencies only'), + ('wallitem_hc_wall_lamp_name', 'Retro Wall Lamp'), + ('poster_508_name', 'The Spanish flag'), + ('help_emergency_example', 'Example: A Habbo wants to see me on webcam.'), + ('nav_venue_bb_lobby_expert_1/0_desc', ''), + ('furni_pura_mdl1*7_desc', 'Any way you like it!'), + ('wallitem_post.it_desc', 'Pad of stickies'), + ('nav_modify_doorstatus_passwordprotected', 'Let other people move and leave furniture in the room.'), + ('queue_set.queue_full.alert', 'The queue for this room is full. Please try again later.'), + ('nav_venue_bb_lobby_beginner_8_name', 'Beginners Battle Ball 9'), + ('nav_venue_sw_arena_amateur_name(0)', 'Playing amateur game'), + ('url_figure_editor', 'http://%predefined%//profile/profile.action'), + ('furni_noob_lamp*6_desc', 'Get the light right where you want it (canary yellow)'), + ('furni_divider_nor5*5_name', 'Pink Iced Angle'), + ('nav_venue_sw_lobby_free_desc', 'Come and play. It\'s free!'), + ('furni_table_silo_small*6_desc', 'Blue Area Occasional Table'), + ('NUF_getting_items_navigator_tutor', 'You need to be in a Habbo\'s room to access the Catalogue.'), + ('furni_safe_silo*6_desc', 'Totally shatter-proof!'), + ('furni_glass_sofa*7_name', 'Green Glass Sofa'), + ('wallitem_md_can_desc', 'Enough bubbling juice for one evening'), + ('furni_rare_fan*9_desc', 'It\'ll blow you away!'), + ('furni_prizetrophy7_name', 'Pokaali'), + ('furni_noob_stool*3_name', 'My first Habbo stool'), + ('furni_glass_sofa*2_desc', 'Translucent beauty'), + ('pet_frnd_10', 'Adoring'), + ('furni_turkey_desc', 'Where\'s the cranberry sauce?'), + ('pet_frnd_11', 'Devoted'), + ('Alert_ConnectionNotReady', 'Could not connect to the server'), + ('console_search_habbo_profilematch', 'Habbo Profile match -'), + ('furni_sound_set_59_desc', 'Urban break beats'), + ('poster_21_name', 'Butterfly Cabinet'), + ('credits', 'Credits'), + ('furni_sound_set_14_name', 'Hip Hop Beats 2'), + ('NUH_hand', 'Click here to open your inventory (aka the Big Hand). Drag and drop furniture to and from here to move it.'), + ('furni_pura_mdl3*1_desc', 'Any way you like it!'), + ('nav_modify_doorstatus_pwprotected', 'Password protected:'), + ('shopping_costs', 'XX costs XX Credit(s).\\rJust click \'buy\' once, it\'ll appear shortly.'), + ('NUF_mini_meet_people', 'Meet some people'), + ('furni_divider_nor1*3_name', 'White Iced Corner'), + ('furni_bed_budget*7_name', 'Green Pura Double Bed'), + ('furni_pura_mdl5*9_desc', 'Any way you like it!'), + ('nav_venue_club_massiva/2_name', 'Dancefloor'), + ('furni_scifiport*3_desc', 'Energy beams. No trespassers!'), + ('whisper', 'Whisper'), + ('furni_chair_plasto*4_name', 'Chair'), + ('furni_hc_bkshlf_name', 'Medieval Bookcase'), + ('furni_goodie1*2_name', 'Marzipan Man'), + ('furni_rare_fountain*1_name', 'Bird Bath (grey)'), + ('bb_text_hostInfo', 'Please choose a name for your Game and select the number of Teams.'), + ('hubu_t3_1', ''), + ('hubu_t3_2', 'Hubun kiertuekalenteri 2002'), + ('furni_sound_set_34_name', 'Rock 5'), + ('furni_rare_fountain*3_desc', 'For our feathered friends'), + ('nav_venue_sw_lobby_amateur_5_name', 'Snow Slingers Lobby'), + ('furni_pura_mdl3*2_name', 'Pink Pura Module 3'), + ('furni_xmas_cstl_wall_desc', 'Solid blocks of ice and snow'), + ('furni_arabian_tray1_name', 'Mint Tea Tray'), + ('furni_jp_tray4_name', 'jp_tray4'), + ('furni_grunge_candle_desc', 'Late night debate'), + ('furni_rclr_garden_name', 'Water Garden'), + ('furni_CFC_100_coin_gold_name', 'Gold Coin (China)'), + ('nav_venue_gate_park_name', 'Imperial Park'), + ('shopping_asagift', 'Buy As A Gift'), + ('furni_soft_sofachair_norja*7_desc', 'Sit back and relax'), + ('dance', 'Dance'), + ('roomatic_wrongpw', 'Oops! Sorry, your passwords don\'t match. Please enter them again.'), + ('furni_hc_trll_desc', 'For swanky dinners only'), + ('furni_prizetrophy3*2_desc', 'Shiny silver'), + ('modtool_roomkick', 'Room Kick'), + ('roomatic_letmove', 'Let other people move your furniture and place their own. (Furniture cannot be stolen.)'), + ('roomevent_default_description', ''), + ('nav_venue_sw_lobby_free_4/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('console_invalid_message', 'There was a message from a user that was probably removed your friend list. Note, user is removed from your friend list if you report a message to moderators.'), + ('poster_503_name', 'The Swiss flag'), + ('nav_venue_sw_arena_expert_name(0)', 'Playing expert game'), + ('poster_41_desc', 'For the best music-makers'), + ('furni_tile_name', 'Floor Tiles'), + ('furni_val_randomizer_name', 'Love Randomiser'), + ('nav_modify_doorstatus_open', 'Open'), + ('furni_plant_big_cactus_desc', 'Habbo Dreams monster in hiding! Shhhh'), + ('furni_safe_silo*8_desc', 'Totally shatter-proof!'), + ('wallitem_sw_hole_name', 'sw_hole'), + ('play_preview', 'Play preview of sounds'), + ('furni_table_plasto_round*14_name', 'Occasional Table'), + ('poll_thanks_window', 'Thanks!'), + ('wallitem_habbowheel_desc', 'So you gotta ask yourself "Do I feel lucky?"'), + ('furni_carpet_standard_name', 'Floor rug'), + ('furni_divider_nor1*8_name', 'Yellow Ice corner'), + ('nav_venue_bb_lobby_tournament_3/0_desc', ''), + ('buddyremove_ok_text', 'You have chosen enough friends to remove.'), + ('nav_venue_sw_lobby_intermediate_5/0_desc', 'Lumisota sen kuin vain kovenee.'), + ('furni_divider_nor4*7_desc', 'Habbos, roll out!'), + ('furni_summer_chair*3_desc', 'Black'), + ('furni_table_plasto_bigsquare*6_desc', 'Hip plastic furniture'), + ('gs_link_highscores', 'High Scores'), + ('Alert_purchasingerror', 'Buying unsuccessful'), + ('poster_5_desc', 'Quacking good design!'), + ('help_emergency_sent', 'A member of community staff will investigate the situation and take appropriate action. This may include sending you a response with advice on dealing with your issue.'), + ('room_user_page', 'Home Page'), + ('room_badge_window_title', 'Badge'), + ('login_name', 'Name of your Habbo'), + ('furni_divider_nor2*5_name', 'Pink Iced bar desk'), + ('nav_venue_habbo_lido_ii/0_desc', 'Dive right in!'), + ('furni_sporttrack2*2_name', 'Sport corner asphalt'), + ('roommatic_modify_size', 'Room size: %tileCount% tiles'), + ('pet.saying.sniff.croco.2', '*Sighs*'), + ('furni_prize2_name', 'Silver Trophy'), + ('Now you can find out how to get more cool Furniture for your room, or select another topic.', ''), + ('pet.saying.sniff.croco.0', 'Ewwwww....'), + ('pet.saying.sniff.croco.1', '*Sniff sniff*'), + ('furni_pura_mdl3*6_name', 'Blue Pura Module 3'), + ('poster_48_desc', 'All that glitters...'), + ('furni_wcandle_desc', 'Xmas tea light'), + ('nav_venue_bb_arena_3_name', 'Battle Ball Keskitaso'), + ('sound_machine_confirm_save_long', 'Are you sure you want to overwrite the current saved song?'), + ('purse_vouchers_helpurl', 'http://%predefined%/help/4'), + ('nav_venue_bouncer_room_2_name', 'Gevorderden Battle Ball Arena'), + ('furni_sand_cstl_gate_desc', 'sand_cstl_gate desc'), + ('furni_barrier*1_name', 'Yellow Maze Barrier'), + ('nav_venue_bb_lobby_tournament_0_name', 'Tournament'), + ('NUF_getting_room_roommatic_layout_tutor', 'Select what you want your room to look like. Use the arrows to cycle through different room layouts. Almost there, almost there...'), + ('poll_confirm_cancel', 'Stop answering?'), + ('furni_carpet_soft*4_desc', 'Soft Wool Rug'), + ('furni_rare_icecream_campaign_desc', 'Basic model'), + ('club_habbo.bottombar.text.notmember', 'Habbo Club'), + ('recycler_info_closed', 'Recycler is closed at the moment. Please check back later to recycle your Furniture.'), + ('furni_solarium_norja*8_desc', 'Rejuvenate your pixels!'), + ('callhelp_example', 'Example: How do I move my Furni?'), + ('furni_bed_budget_one*4_name', 'White Pura Bed'), + ('roomatic_givepwd', 'Password:'), + ('furni_teleport_door_name', 'Teleport Door'), + ('furni_table_silo_small*9_name', 'Red Area Occasional Table'), + ('furni_noob_chair*4_name', 'My first Habbo chair'), + ('furni_table_plasto_square*2_desc', 'Hip plastic furniture'), + ('room_waiting', 'Waiting to go in...'), + ('furni_sink_desc', 'Hot and cold thrown in for no charge'), + ('furni_doormat_plain_name', 'Doormat'), + ('nav_venue_eric\'s_eaterie_name', 'Eric\'s Eaterie'), + ('nav_venue_pizzeria_name', 'Slice of Life'), + ('poster_1004_desc', 'Celebrate with us'), + ('next', 'Next'), + ('furni_solarium_norja*9_name', 'Red Solarium'), + ('tutorial_quit_confirmation', 'You want to leave? Well I hope you learned something... something useful!'), + ('furni_val_teddy*2_desc', 'The pink bear of passion'), + ('poster_1003_name', 'UK Map'), + ('furni_glass_table*2_name', 'Glass table'), + ('NUF_habbo_home_url', 'http://d15-1.web.varoke.net/home/home-tutorial'), + ('furni_bed_silo_one_name', 'Single Bed'), + ('transaction_system_sms_win_btcellnet', 'O2 SMS'), + ('pet.hotwords.go_away', 'go away'), + ('furni_table_plasto_square*9_desc', 'Hip plastic furniture'), + ('furni_doormat_plain*4_name', 'Doormat'), + ('nav_venue_cunning_fox_gamehall_name', 'Cunning Fox Gamehall'), + ('furni_sound_machine*2_name', 'Ocean Traxmachine'), + ('furni_table_polyfon_name', 'Large Coffee Table'), + ('furni_hc_frplc_desc', 'Pixel-powered for maximum heating'), + ('console_request_massoperation_instruction', 'Use the options below to accept or decline ALL friend requests you have waiting.'), + ('nav_venue_bb_lobby_tournament_6/0_desc', ''), + ('furni_table_plasto_round*6_desc', 'Hip plastic furniture'), + ('trading_cancel', 'Cancel Trading'), + ('furni_glass_stool*3_name', 'Glass stool'), + ('furni_plant_mazegate_snow_name', 'Snowy Maze Gate'), + ('nav_venue_tv_studio_name', 'MuchMusic HQ'), + ('furni_table_norja_med*3_desc', 'For larger gatherings'), + ('furni_chair_plasty*8_desc', 'Hip plastic furniture'), + ('furni_bed_polyfon_name', 'Double Bed'), + ('gs_4teams', '4 Team Game'), + ('furni_sound_set_8_desc', 'Mellow electric grooves'), + ('ph_keys_jump', 'Jump:'), + ('reg_welcome', 'Welcome To Habbo Hotel!'), + ('purse_head', 'HABBO ACCOUNT ACTIVITY'), + ('nav_venue_bb_lobby_tournament_7_name', 'Competitie Battle Ball 8'), + ('reg_verification_newPasswordAgain', 'Retype new password:'), + ('furni_bardeskcorner_polyfon*8_desc', 'Yellow Mode Bardesk Corner'), + ('furni_sound_set_21_name', 'Rock 1'), + ('furni_gothic_stool*1_desc', 'The dark side of Habbo'), + ('furni_rope_divider_name', 'Rope Divider'), + ('poster_53_name', 'Hockey Stick'), + ('roomevent_default_desc', 'Event description..'), + ('nav_refresh_recoms', 'Refresh recommendations'), + ('nav_venue_sw_lobby_beginner_2_name', 'Snow Rookies Lobby'), + ('furni_divider_silo3*4_desc', 'Beige Area Gate'), + ('furni_divider_poly3*6_name', 'Blue Mode Bardesk Gate'), + ('reg_parentemail_title', 'Informing your parents'), + ('furni_gothgate_name', 'Gothic Portcullis'), + ('furni_mocchamaster_name', 'Mochamaster'), + ('modtool_message', 'Message:'), + ('furni_tree4_desc', 'Any presents under it yet?'), + ('furni_marquee*a_name', 'White Marquee'), + ('furni_queue_tile1*5_name', 'Knight Roller'), + ('furni_chair_polyfon_name', 'Dining Chair'), + ('furni_sleepingbag*9_name', 'Blue Sleeping Bag'), + ('furni_sound_set_9_name', 'Electronic 2'), + ('poster_39_desc', 'The rock masters of virtual music'), + ('furni_arabian_tetbl_desc', 'Serve up a treat'), + ('nav_venue_sw_lobby_free_9_name', 'Free Game Lobby'), + ('nav_venue_sw_arena_free_name(0)', 'Playing free for all game'), + ('furni_grand_piano*4_desc', 'Why is that key green?'), + ('furni_doorD_desc', 'Let\'s go over tzar!'), + ('purse_date', 'DATE'), + ('nav_venue_sw_lobby_beginner_6/0_desc', ''), + ('nav_venue_sw_lobby_beginner_4/0_desc', ''), + ('nav_venue_sw_lobby_intermediate_1_name', 'Snow Bombardiers Lobby'), + ('alert_reg_age', 'You are under 11 years old. Children under 11 can\'t enter Habbo Hotel.'), + ('nav_venue_bb_lobby_intermediate_9/0_desc', ''), + ('queue_set.c.alert', 'This room is for Habbo Club members only. In order to enter, you need to subscribe to Habbo Club.'), + ('sound_machine_confirm_clear_long', 'Are you sure you want to clear the current song?'), + ('furni_exe_drinks_name', 'Executive Drinks Tray'), + ('reg_bday_note', 'Please enter your correct date of birth, this is important! You\'ll need this information later on, if you want to change your password or e-mail.'), + ('modtool_roomalert', 'Room Alert'), + ('furni_rare_parasol*1_name', 'Yellow Parasol'), + ('furni_sound_set_18_name', 'Groove 4'), + ('sound_machine_window', 'Sound Machine Editor'), + ('furni_traffic_light*1_name', 'Classic Traffic Light'), + ('furni_chair_norja*4_desc', 'Sleek and chic for each cheek'), + ('furni_divider_nor1*2_desc', 'Black Ice corner'), + ('nav_venue_median_lobby_name', 'Median Lobby'), + ('furni_sofa_silo*3_desc', 'Cushioned, understated comfort'), + ('furni_bed_budget_desc', 'Comfortable, affordable!'), + ('furni_divider_nor4_name', 'Plain Iced Auto Shutter'), + ('furni_rare_icecream*6_desc', 'Virtual toffee rocks!'), + ('habboclub_txt1', 'You can buy Habbo Club one month at a time using Habbo Credits.'), + ('habboclub_txt3', 'Yes, I\'m over 14 years of age\\rOR\\rI\'m under 14 years of age and I have a permission from my parent/guardian to join Habbo Club.'), + ('furni_rare_dragonlamp*3_desc', 'Scary and scorching!'), + ('furni_noob_lamp*5_name', 'My first Habbo lamp'), + ('club_bottombar_text2', '(....)'), + ('furni_CFC_500_goldbar_name', 'Gold Bar (China)'), + ('club_bottombar_text1', 'Loading'), + ('furni_rare_elephant_statue*1_desc', 'Say hello to Nelly'), + ('furni_table_silo_med*7_name', 'Green Area Coffee Table'), + ('nav_venue_sw_lobby_free_1/0_desc', ''), + ('furni_bottle_desc', 'For interesting games!'), + ('furni_romantique_pianochair*2_desc', 'Let the music begin'), + ('furni_table_norja_med*2_name', 'Large Coffee Table Black'), + ('queue_set.e2.alert', 'This room is currently available only to Habbos participating to the event.'), + ('furni_solarium_norja_desc', 'Rejuvenate your pixels!'), + ('furni_table_plasto_square*14_desc', 'Hip plastic furniture'), + ('cam_save.help', 'Save & Print Photo'), + ('furni_sound_set_4_desc', 'Chilled out beats'), + ('furni_couch_norja*6_name', 'Blue Bench'), + ('poster_2003_desc', 'Would you trust this man?'), + ('hobba_cryforhelp', 'Call For Help:'), + ('furni_marquee*9_desc', 'It\'s both door and a shade!'), + ('nav_venue_bb_lobby_tournament_13/0_desc', ''), + ('poster_512_desc', 'The flag of Ireland'), + ('handitem12', 'Macchiato'), + ('object_displayer_hide_actions', 'Hide actions'), + ('furni_sound_set_25_name', 'Dance 1'), + ('handitem11', 'Mocha'), + ('handitem10', 'Latte'), + ('furni_sound_set_13_desc', 'Let Music be the food of Habbo'), + ('handitem16', 'Cappuccino'), + ('handitem15', 'Iced'), + ('handitem14', 'Filter'), + ('handitem13', 'Espresso'), + ('nav_venue_sw_lobby_free_2_name', 'Free Game Lobby'), + ('handitem19', 'Habbo Cola'), + ('nav_venue_sw_lobby_amateur_2/0_desc', ''), + ('handitem18', 'Tap'), + ('handitem17', 'Java'), + ('console_next_msg', 'Delete'), + ('furni_bardesk_polyfon*5_name', 'Candy Bar'), + ('furni_scifidoor*5_desc', 'There out of this world!'), + ('nav_roomispwprotected', 'The room is password protected.'), + ('furni_sleepingbag*2_name', 'Lime Sleeping Bag'), + ('furni_glass_table*6_name', 'Blue Glass Table'), + ('furni_divider_nor4*3_desc', 'Habbos, roll out!'), + ('furni_sound_set_61_name', 'Latin Love 3'), + ('nav_venue_pizza/0_desc', 'Pizza Palace'), + ('furni_romantique_clock_desc', ''), + ('furni_queue_tile1*0_desc', 'The power of movement'), + ('furni_pura_mdl2*9_desc', 'Any way you like it!'), + ('nav_venue_orient/0_name', 'Club Golden Dragon'), + ('furni_noob_table*1_desc', 'Lightweight, practical and orange'), + ('poster_22_desc', 'beautiful reproduction butterfly'), + ('furni_carpet_soft_name', 'Soft Wool Rug'), + ('Message', 'Message'), + ('furni_bed_trad_one_desc', 'All you need for a good night\'s kip'), + ('console_report_help', 'If the message you received was abusive or harassing, you can report it to the Moderators by clicking the Report button below. The Habbo will be removed from your Friends\' List automatically when you report. If you want to remove a Habbo from your Friends\' List without reporting their message, simply use the Remove button below.'), + ('furni_rcandle_desc', 'Xmas tea light'), + ('furni_sofa_silo*8_name', 'Yellow Two-Seater Sofa'), + ('furni_pura_mdl4*5_desc', ''), + ('NUF_mini_use_console_ready_tutor', 'You can now use the Console to find some of your friends, or you can continue the tutorial.'), + ('log_problem_link', 'Read FAQ\'s'), + ('furni_shelves_silo_name', 'Bookcase'), + ('gs_timetojoin', '\\x seconds to join'), + ('nav_venue_cunning_fox_gamehall/1_name', 'Gamehall Lobby'), + ('furni_safe_silo*7_name', 'Green Safe Minibar'), + ('NUF_mini_meet_people_hotelview_tutor', 'The Navigator lets you move between rooms in the Hotel. Open it up to get started!'), + ('purse_vouchers_sendbutton', 'Get Credits!'), + ('furni_gothic_sofa*4_name', 'Black Gothic Sofa'), + ('furni_wooden_screen*0_desc', 'Add an exotic touch to your room'), + ('catalog_give_trophymsg', 'You haven\'t engraved the trophy. Type \\ryour inscription in the grey box.'), + ('furni_prizetrophy5*3_name', 'Duo trophy'), + ('handitem23', 'Beetroot Habbo Soda'), + ('furni_rare_dragonlamp*8_name', 'Bronze Dragon Lamp'), + ('furni_divider_nor4*8_name', 'Yellow Iced Auto Shutter'), + ('handitem22', 'Lime Habbo Soda'), + ('furni_soft_sofa_norja*6_name', 'Blue Iced Sofa'), + ('handitem21', 'Hamburger'), + ('handitem20', 'Camera'), + ('furni_divider_nor1*9_desc', 'Red Ice corner'), + ('help_trouble', 'In Trouble?'), + ('handitem25', 'Love potion'), + ('handitem24', 'Bubble juice from 1999'), + ('furni_ham2_desc', 'Looks like you\'re too late!'), + ('nav_venue_bb_lobby_amateur_3_name', 'Gevorderden Battle Ball 4'), + ('furni_chair_plasto*15_name', 'Chair'), + ('furni_hyacinth1_desc', 'Beautiful bulb'), + ('furni_shelves_basic_desc', 'Pura series 404 shelves'), + ('furni_pura_mdl1*6_name', 'Blue Pura Module 1'), + ('nav_venue_cafe_gold/0_desc', 'Get the latest safety tips and tricks from Safety eXperts.'), + ('nav_venue_snowwar_lobby_name', 'Snow Storm Lobby'), + ('transaction_system_sms_slahti', 'Saunalahti'), + ('alert_tooLongPW', 'Your password is too long'), + ('furni_carpet_standard*5_desc', 'Available in a variety of colours'), + ('furni_deadduck_desc', 'Blood, but no guts'), + ('password.email.subject', 'Forgotten password'), + ('furni_prizetrophy2*3_desc', 'Breathtaking bronze'), + ('NUF_playing_games_hotelview_nav', 'Just click me to open the Navigator and get it over with...'), + ('furni_summer_chair*1_name', 'Aqua Deck Chair'), + ('furni_rubberchair*3_name', 'Orange Inflatable Chair'), + ('furni_exe_plant_desc', ''), + ('nav_venue_tearoom/0_desc', 'Chat with the people of Aoralia and meet a sprite or two!'), + ('nav_venue_sw_lobby_beginner_9/0_desc', ''), + ('furni_table_silo_med*6_name', 'Blue Area Coffee Table'), + ('nav_venue_sw_lobby_beginner_1/0_desc', ''), + ('furni_noob_stool*2_desc', 'Unfold me and take the weight off (dark blue)'), + ('camera_dialog_place', 'Move'), + ('furni_scifiport*8_desc', 'Energy beams. No trespassers!'), + ('url_peeloscore', 'http://%predefined%///groups/56555/id'), + ('console_follow_friend', 'Go to same room'), + ('sound_machine_alert_jukebox_list_full', 'The play list is full. Please wait until the current song has finished playing and try again.'), + ('poster_517_desc', 'Where\'s your kilt?'), + ('roomevent_type_11', 'Helpdesk'), + ('roomevent_type_10', 'Performance'), + ('furni_rare_dragonlamp*9_desc', 'Scary and scorching!'), + ('furni_pura_mdl2*3_name', 'Black Pura Module 2'), + ('url_help_1', 'http://%predefined%//credits'), + ('furni_edicehc_name', 'Dicemaster'), + ('furni_divider_silo1*8_name', 'Yellow Corner Shelf'), + ('furni_wooden_screen*5_desc', 'Add an exotic touch to your room'), + ('url_help_5', 'http://%predefined%/help/75'), + ('roomatic_intro2', 'Here\'s what one Habbo says about her room:'), + ('url_help_4', 'http://%predefined%//help/22'), + ('roomatic_intro1', 'You can decorate and furnish your room however you like and no one can tell you to tidy up or turn the music down. It\'s up to you if you let everyone in or just a chosen few, or lock the door and chill by yourself. Get creating and in a couple of minutes you\'ll have your own Habbo Hotel space.'), + ('url_help_3', 'http://%predefined%//help/'), + ('roomatic_intro3', 'My mates live miles away, but we can meet up in my room every Friday night and we don\'t have to worry about getting home afterwards.'), + ('url_help_2', 'http://%predefined%//profile?tab=4'), + ('furni_romantique_chair*5_name', 'Onyx Chair'), + ('url_help_6', 'http://www.habbohotel.co.uk/iot/go?lang=en&country=uk'), + ('furni_sound_set_20_name', 'SFX 2'), + ('furni_sofa_polyfon*4_desc', 'Beige Mode Sofa'), + ('sound_machine_alert_no_more_songs', 'Can\'t create new song! Traxmachine can have only %count% songs.'), + ('search', 'Search'), + ('room_preparing', '...Preparing room'), + ('nav_venue_bb_lobby_intermediate_0/0_desc', ''), + ('club_txt_renew2', 'You are Habbo Club member. If you want to change your subscription or leave the club, use the link below.'), + ('poster_1002_name', 'Queen Mum Poster'), + ('furni_barchair_silo*2_desc', 'Practical and convenient'), + ('reg_month', 'Month'), + ('club_txt_renew1', 'Your Habbo Club membership will be active for another %days% days. You can extend your membership by paying with Habbo Credits.'), + ('furni_rare_icecream*0_name', 'Cherry Ice Cream Machine'), + ('furni_sound_set_41_desc', 'Burning Riffs'), + ('nav_venue_beauty_salon_loreal_name', 'Beauty salon'), + ('poster_26_name', 'Angel Poster'), + ('furni_sound_set_19_name', 'Hip Hop Beats 4'), + ('furni_romantique_divan*4_name', 'Amber Chaise-Longue'), + ('furni_one_way_door*7_desc', 'One at a time!'), + ('sound_machine_confirm_eject_long', 'Are you sure you want to remove the Traxpack and it\'s samples from the song?'), + ('furni_glass_stool*8_desc', 'Translucent beauty'), + ('buddyremove_not_now', 'Cancel'), + ('no_user_for_gift', 'No user named %user% found. Gift not purchased.'), + ('buddyremove_lessoptions', 'Less Options <<'), + ('reg_legal_header1', 'Now you need to ask your parents/guardian to come to the computer. Read through the text (below) with your parents.'), + ('furni_carpet_soft*3_desc', 'Soft Wool Rug'), + ('reg_legal_header2', 'Read through the below text carefully. You must agree to the following terms before entering Habbo Hotel.'), + ('furni_sw_chest_name', 'sw_chest'), + ('nav_venue_sw_lobby_tournament_9_name', 'Tournament Lobby'), + ('messenger.email.footer', ''), + ('nav_venue_bb_arena_4_name', 'Battle Ball Expertit'), + ('club_change_url', 'http://%predefined%//credits/habboclub'), + ('furni_table_plasto_4leg*2_name', 'Occasional Table'), + ('ph_choosecolour', 'Choose Costume Colour'), + ('buddyremove_hc_more_info', 'More Info About Habbo Club >>'), + ('furni_romantique_smalltabl*1_desc', 'Every tray needs a table...'), + ('nav_venue_sw_lobby_tournament_8_name', 'Tournament Lobby'), + ('furni_divider_nor5_name', 'Plain Iced Angle'), + ('wallitem_roomdimmer_name', 'Mood Light'), + ('furni_bed_budget_one*5_name', 'Beige Pura Bed'), + ('furni_table_norja_med*9_name', 'Large Coffee Table Red'), + ('furni_pillow*3_desc', 'Puffy, soft and huge'), + ('furni_noob_rug*2_name', 'My first Habbo rug'), + ('nav_venue_sw_lobby_beginner_7_name', 'Snow Rookies Lobby'), + ('furni_exe_chair_desc', 'Relaxing leather comfort'), + ('furni_s_sound_machine*2_desc', 'Sound Machine Ocean Desc'), + ('nav_venue_dusty_lounge/0_desc', 'A dignified lounge for sitting back and enjoying a licorice pipe'), + ('game_bs_ship4', 'Destroyer(s)'), + ('game_bs_ship3', 'Cruiser(s)'), + ('game_bs_ship2', 'Battle Ship(s)'), + ('game_bs_ship1', 'An aircraft carrier'), + ('furni_table_plasto_bigsquare*4_name', 'Square Dining Table'), + ('openhrs_title', 'We are closing the hotel'), + ('furni_habbowood_chair_name', 'Director\'s Chair'), + ('roomatic_confirm', 'Confirm password:'), + ('poster_14_desc', 'A cunning painting'), + ('furni_doormat_plain*3_name', 'Doormat'), + ('furni_sound_set_3_desc', 'Chilled grooves'), + ('win_messenger', 'Habbo Console'), + ('summer_chair_7_name', 'Green Deck Chair'), + ('notickets_window_header', 'Tickets needed!'), + ('nav_updatenote', 'Updating your room properties may take a while. The changes have been made, but it\'ll take a few minutes until all Habbos can see them.'), + ('furni_table_plasto_bigsquare*5_name', 'Square Dining Table'), + ('url_purselink', 'http://%predefined%//credits?'), + ('console_follow_hotelview', 'Your friend is on the hotel view.'), + ('furni_solarium_norja*3_desc', 'Get the city look!'), + ('sound_machine_alert_song_name_missing', 'Please give your song a name.'), + ('furni_sound_machine*3_name', 'Green Traxmachine'), + ('jukebox_next_up', 'Next up:'), + ('trading_additems', 'Put items in boxes'), + ('furni_sporttrack3*1_name', 'Sport goal tartan'), + ('club_button_3_period', 'Buy 6 >>>'), + ('nav_delroom3', 'Room deleted!'), + ('nav_delroom2', 'Are you sure you want to delete this room? All the furniture left in it will also be deleted.'), + ('poster_34_name', 'Scamme\'d'), + ('go', 'Go >>'), + ('nav_delroom1', 'If you want to save the furniture in this room, move it to the giant hand before you continue.'), + ('console_habboprofile_arrowed', 'Habbo Profile >>'), + ('furni_chair_plasty*10_desc', 'Hip plastic furniture'), + ('cam_txtscreen.help', 'Caption'), + ('wallitem_item_placeholder_name', 'This furniture is downloading...'), + ('furni_carpet_standard*b_desc', 'Available in a variety of colours'), + ('poster_59_name', 'Torch'), + ('furni_chair_basic*4_name', 'White Pura Egg Chair'), + ('summer_chair_1_name', 'Aquamarine Deck Chair'), + ('nav_venue_space_cafe_name', 'Ten Forward'), + ('log_problem_url', 'http://%predefined%//help/faqs?faq_1_categoryId=14'), + ('group_homepage_url', 'http://%predefined%/groups/%groupid%/id'), + ('furni_heart_name', 'Giant Heart'), + ('nav_venue_sw_arena_beginner_name', 'Playing beginner game'), + ('furni_grunge_chair_name', 'Grunge Chair'), + ('nav_dooropens', 'Door opens! Go on in...'), + ('modtool_banuser', 'Ban User'), + ('furni_carpet_soft_tut_desc', 'Welcome, enjoy your stay!'), + ('furni_rare_mnstr_name', 'Venomus Habbolus'), + ('furni_divider_silo3*9_name', 'Red Area Gate'), + ('furni_pura_mdl3*1_name', 'Aqua Pura Module 3'), + ('Messages', 'Message(s)'), + ('wallitem_arabian_wndw_name', 'Arabian Window Frame'), + ('furni_prizetrophy3*1_desc', 'Glittery gold'), + ('furni_sound_set_47_desc', 'Storm the UKCharts!'), + ('poster_54_desc', 'whack that ball!'), + ('url_logout_concurrent', 'http://%predefined%//account/disconnected?reason=concurrentlogin&origin=popup'), + ('nav_venue_sw_lobby_beginner_1_name', 'Snow Rookies Lobby'), + ('furni_table_plasto_4leg*8_name', 'Occasional Table'), + ('sound_machine_turn_on', 'Switch On'), + ('furni_table_norja_med*4_desc', 'For larger gatherings'), + ('buddyremove_hc_info_url', 'http://www.habbo.co.uk/credits/habboclub'), + ('furni_romantique_divider*2_name', 'Green Screen'), + ('furni_pillar*5_desc', 'Find your natural roots'), + ('furni_table_silo_med_desc', 'Wipe clean and unobtrusive'), + ('furni_pillow*8_name', 'Navy Cord Pillow'), + ('room_owner', 'Owner:'), + ('furni_shelves_norja*5_name', 'Pink Bookcase'), + ('queue_set.d.info', 'There are %d% Habbos in front of you in the queue.'), + ('reg_retypepass', 'Retype Password:'), + ('furni_jp_tray3_name', 'jp_tray3'), + ('dance_stop', 'Stop Dancing'), + ('buddyremove_remove_text', 'You are about to remove %removeamount% friends from your friendlist.\\r\\r After removal, you\'ll have %amountleft% friends on your list:'), + ('nav_venue_bb_lobby_tournament_12_name', 'Competitie Battle Ball 13'), + ('furni_summer_chair*2_name', 'Deck Chair'), + ('furni_plant_valentinerose*1_desc', 'Secret admirer!'), + ('furni_sofachair_silo*4_name', 'Beige Area Armchair'), + ('poster_523_name', 'The flag of India'), + ('furni_scifirocket*4_name', 'Venus Smoke Machine'), + ('nav_venue_tearoom_name', 'Chinese Tea Room'), + ('furni_pura_mdl1*5_name', 'beige pura module 1'), + ('nav_venue_bb_lobby_tournament_0/0_desc', ''), + ('furni_chair_silo*5_desc', 'Pink Silo Dining Chair'), + ('club_txt_expired', 'Your Habbo Club membership has run out. You can join the club again by clicking the HC logo on the hotel view.\\rMembers of Habbo Club get priority access to the hotel (so you can always get in), exclusive clothes, hair colours, rare furni and special guest room layouts. To see exactly what you\'ll be able to get your hands on as a Habbo Club member, take a look in the Catalogue.'), + ('furni_glass_table*7_name', 'Green Glass Table'), + ('nav_prvrooms_notfound', 'Your search did not match any rooms'), + ('bb_title_BBscores2', 'Game over!'), + ('wallitem_gothicfountain_name', 'Gothic Ectoplasm Fountain'), + ('furni_one_way_door*1_desc', 'One at a time!'), + ('furni_chair_plasty*1_name', 'Plastic Pod Chair'), + ('furni_divider_nor3*9_name', 'Red Iced gate'), + ('sound_machine_time_2', '%min%:%sec%min'), + ('sound_machine_time_1', '%min%:%sec%min'), + ('furni_bardesk_polyfon*4_name', 'Beige Mode Bardesk'), + ('queue_set.queue_reset.alert', 'The queue for this room has been reset, please try again.'), + ('furni_jp_pillow_desc', 'Comfy and classical'), + ('nav_venue_sw_lobby_free_9/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('furni_barchair_silo*8_desc', 'Practical and convenient'), + ('delete_furniture', 'Delete Furniture (permanently)'), + ('furni_plant_bulrush_desc', 'Ideal for the riverside'), + ('poster_61_name', 'Siva Poster'), + ('furni_bed_silo_two_name', 'Double Bed'), + ('furni_plant_pineapple_desc', 'Needs loving glances'), + ('furni_bed_polyfon_girl_desc', 'Snuggle down in princess pink'), + ('furni_pillow*4_desc', 'Puffy, soft and huge'), + ('furni_table_norja_med*8_name', 'Large Coffee Table Yellow'), + ('transaction_system_tsms_win_tmobile', 'T-Mobile SMS'), + ('furni_scifidoor*10_desc', 'There out of this world!'), + ('furni_bed_polyfon*7_desc', 'Green Mode Double Bed'), + ('furni_toy1*2_desc', 'it\'s bouncy-tastic'), + ('transaction_system_sms_radiolinja', 'Elisa'), + ('furni_gothic_chair*4_name', 'Black Gothic Chair'), + ('furni_scifidoor*6_desc', 'Monolith goes up! Monolith goes down!'), + ('nav_venue_sw_lobby_free_3_name', 'Free Game Lobby'), + ('console_friend_request_not_found', 'There was an error finding the user for the friend request'), + ('furni_romantique_smalltabl*2_desc', 'Every tray needs a table...'), + ('furni_bed_budget*2_name', 'Pink Pura Double Bed'), + ('wallitem_post.it_name', 'Pad of stickies'), + ('gs_state_created', 'Waiting for players..'), + ('furni_divider_nor3*4_desc', 'Entrance or exit?'), + ('furni_sofa_polyfon_girl_desc', 'Romantic pink for two'), + ('locked', 'Locked (visitors have to ring bell)'), + ('alert_reg_birthday', 'Birthday'), + ('club_thanks_text', 'Here you can see your Habbo Club membership status, number of elapsed months, pre-ordered months and status of the ongoing month.'), + ('furni_sound_set_39_desc', 'Rock with a roll'), + ('nav_venue_old_skool/0_desc', 'A set of rooms inspired by the original and legendary Mobiles Disco, the progenitor of Habbo'), + ('poster_511_desc', 'The flag of The Netherlands'), + ('furni_couch_norja*7_name', 'Rural Iced Bench'), + ('furni_safe_silo*6_name', 'Blue Safe Minibar'), + ('furni_table_plasto_4leg*14_desc', 'Aqua table'), + ('room_sound_furni_limit', 'You can only place one sound furni per room'), + ('nav_venue_bb_lobby_beginner_15/0_desc', ''), + ('furni_glass_shelf_name', 'Glass shelf'), + ('furni_divider_nor2*6_desc', 'Blue Iced bar desk'), + ('furni_turkey_name', 'Roast Turkey'), + ('nav_venue_bb_lobby_tournament_16/0_desc', ''), + ('sw_timeleft', 'Time:'), + ('furni_rare_parasol_name', 'Parasol'), + ('furni_glass_sofa*7_desc', 'Habbo Club'), + ('furni_bardeskcorner_polyfon*13_name', 'Corner Cabinet/Desk'), + ('furni_rare_fan*9_name', 'Fucsia Powered Fan'), + ('furni_chair_plasto*4_desc', 'Hip plastic furniture'), + ('no', 'No'), + ('furni_rare_fan*4_desc', 'Fanning the fires of SUPERLOVE...'), + ('nav_venue_median_lobby/0_desc', 'A Mean place to hang'), + ('nav_venue_sw_lobby_intermediate_2/0_desc', ''), + ('furni_md_sofa_name', 'MD Sofa'), + ('furni_noob_lamp*1_desc', 'Get the light right where you want it (yellow)'), + ('login_connecting', 'Connecting...'), + ('furni_divider_nor1*3_desc', 'Looks squishy, but isn\'t!'), + ('furni_sound_set_14_desc', 'Rock them bodies'), + ('furni_sound_set_59_name', 'RnB Grooves 5'), + ('poster_21_desc', 'beautiful reproduction butterfly'), + ('wallitem_hc_wall_lamp_desc', 'Tres chic!'), + ('ok', 'OK'), + ('nav_venue_sw_lobby_tournament_1/0_desc', ''), + ('pet_happy', 'Happiness:'), + ('sound_machine_edit', 'Edit Song'), + ('furni_rare_elephant_statue*2_desc', 'Say hello to Nelly'), + ('furni_CFC_200_moneybag_desc', 'Worth 200 Credits'), + ('nav_venue_bb_lobby_intermediate_6/0_desc', ''), + ('console_buddylimit_requester', 'Friend could not be added. The request sender can not have anymore friends.'), + ('furni_sofa_silo*2_desc', 'Cushioned, understated comfort'), + ('sound_machine_alert_invalid_song_name', 'You have already burned another song with the same name. Please change the song name before trying again.'), + ('furni_fireplace_armas_name', 'Fireplace'), + ('furni_barchair_silo*3_desc', 'Practical and convenient'), + ('ph_ticket', 'Ticket'), + ('furni_arabian_divdr_desc', 'Carved Cedar Divider'), + ('wallitem_jp_ninjastars_desc', 'Not a frisbee'), + ('wallitem_hrella_poster_1_desc', 'Brighten up your cabin'), + ('furni_noob_stool*3_desc', 'Unfold me and take the weight off (aubergine)'), + ('furni_pura_mdl5*9_name', 'Red Pura Module 5'), + ('furni_divider_nor4*2_desc', 'Habbos, roll out!'), + ('NUF_mini_meet_people_roomlist_tutor', 'Click \'Open\' to open up a category and see what rooms are within. When you have found an interesting room, press \'Go\' to visit it.'), + ('poster_41_name', 'Habbo Golden Record'), + ('furni_jp_tray4_desc', 'jp_tray4'), + ('buddyremove_confirm', 'Yeah, it is done...'), + ('tutorial_topic_list_F', 'Choose a topic from the list below:'), + ('purse_time', 'TIME'), + ('nav_venue_sw_lobby_free_8_name', 'Free Game Lobby'), + ('tutorial_topic_list_M', 'Choose a topic from the list below:'), + ('furni_s_sound_machine*7_name', 'Sound Machine Red'), + ('interface_icon_navigator', 'Navigator, navigate around'), + ('furni_xmas_cstl_wall_name', 'Ice Castle Wall'), + ('nav_own_hd', 'Your Rooms.'), + ('modtool_aa_checkbox_text', 'Audio alert'), + ('wallitem_industrialfan_desc', 'Powerful and resilient'), + ('furni_bed_budget*8_desc', 'King sized comfort!'), + ('sound_machine_burn', 'Burn Song'), + ('nav_venue_sw_lobby_intermediate_0_name', 'Snow Bombardiers Lobby'), + ('nav_venue_bb_lobby_beginner_1_name', 'Beginners Battle Ball 2'), + ('furni_chair_basic*5_desc', ''), + ('password.email.prefix', 'Your password is:'), + ('furni_pura_mdl5*4_desc', 'Any way you like it!'), + ('furni_table_norja_med*3_name', 'White Iced Table'), + ('furni_pura_mdl3*2_desc', 'Any way you like it!'), + ('nav_venue_sw_lobby_tournament_3_name', 'Tournament Lobby'), + ('furni_sound_set_34_desc', 'For guitar heroes'), + ('furni_summer_grill*1_desc', 'Plenty of ribs on that barbie'), + ('hubu_t4_1', 'Anna palautetta Hubusta'), + ('furni_divider_nor1*8_desc', 'Yellow Ice corner'), + ('hubu_t4_2', 'Tsekkaa heebelin jorinat'), + ('poll_offer_title', 'Poll'), + ('summer_chair_2_desc', 'Leave your towel early'), + ('wallitem_habbowheel_name', 'The Wheel of Destiny!'), + ('reg_mission', 'Your Mission:'), + ('furni_sofa_polyfon*9_name', 'Red Two-seater Sofa'), + ('furni_bed_budget_one_desc', 'aquamarine'), + ('nav_venue_sw_lobby_tournament_7/0_desc', ''), + ('furni_gothic_sofa*3_name', 'Gothic Sofa Red'), + ('furni_chair_plasto*9_name', 'Chair'), + ('nav_venue_sw_arena_beginner_name(0)', 'Playing beginner game'), + ('notickets_text_2', 'Buy more tickets now and get a discount. You can also buy tickets as a present.'), + ('wallitem_sw_hole_desc', 'sw_hole'), + ('furni_plant_big_cactus_name', 'Mature Cactus'), + ('notickets_text_1', 'Game price is 1 credit. For that you get 2 tickets.'), + ('poster_19_name', 'Hole In The Wall'), + ('furni_divider_nor4*7_name', 'Rural Iced Shutter'), + ('email', ''), + ('furni_sound_set_13_name', 'Dance 5'), + ('furni_present_gen1_name', 'Gift'), + ('nav_venue_bb_lobby_tournament_19/0_desc', ''), + ('furni_chair_norja_desc', 'Sleek and chic for each cheek'), + ('furni_marquee*9_name', 'Green Marquee'), + ('sound_machine_alert_song_locked', 'The song you\'re editing can\'t be modified. Please save the song under another name to create a new copy.'), + ('furni_glass_stool*2_name', 'Glass stool'), + ('nav_venue_theatredrome_xmas/0_desc', ''), + ('poster_5_name', 'Duck Poster'), + ('furni_prize2_desc', 'Nice and shiny'), + ('furni_valeduck_desc', 'He\'s lovestruck'), + ('furni_chair_plasty*7_desc', 'Hip plastic furniture'), + ('closed', 'Closed'), + ('furni_wcandleset_name', 'White Candle Plate'), + ('furni_sleepingbag*3_name', 'Ocean Sleeping Bag'), + ('furni_tree3_name', 'Christmas Tree 1'), + ('furni_sound_set_26_name', 'Groove 1'), + ('furni_barrier*2_desc', 'No trespassing, please!'), + ('game_bs_turn1', 'Your Turn'), + ('nav_venue_bb_lobby_expert_desc', 'Expert battle ball!'), + ('alert_donate_topic', 'SCAM ALERT!'), + ('game_bs_turn2', 'The Enemy\'s Turn'), + ('furni_sand_cstl_gate_name', 'sand castle gate'), + ('furni_rare_dragonlamp*4_desc', 'Scary and scorching!'), + ('furni_camera_desc', 'Smile!'), + ('pet.hotwords.lie', 'lie down'), + ('furni_sound_set_60_name', 'Latin Love 2'), + ('console_accept_selected', 'Accept'), + ('furni_divider_silo1*3_desc', 'Neat and natty'), + ('furni_summer_chair*7_name', 'Green Deck Chair'), + ('furni_pumpkin_desc', 'Cast a spooky glow'), + ('reg_habboname_note', 'Now it\'s time to make your own Habbo character! To make your own Habbo, please start by choosing your Habbo Name.'), + ('furni_rare_icecream_campaign_name', 'Rare icecream white'), + ('furni_doormat_plain_desc', 'Available in a variety of colours'), + ('room_areYouSure', 'Are you sure you want to delete this item forever?'), + ('sound_machine_confirm_burn', 'Burn this song?'), + ('predefined_room_name', '%user_name%\'s room'), + ('furni_divider_silo1*2_name', 'Black Corner Shelf'), + ('furni_table_plasto_4leg*3_desc', 'Hip plastic furniture'), + ('furni_solarium_norja*8_name', 'Yellow Solarium'), + ('furni_exe_globe_desc', 'The power is yours!'), + ('furni_bed_polyfon*6_name', 'Blue Mode Double Bed'), + ('notickets_store_link', 'Go to ticket store >>>'), + ('NUF_habbo_home', 'Habbo Home'), + ('nav_venue_the_den_name', 'The Den'), + ('furni_table_plasto_square*2_name', 'Round Dining Table'), + ('modtool_header', 'The Tool'), + ('pet_enrg_7', 'Energetic'), + ('nav_noanswer', 'No answer'), + ('roommatic_hc_members_only', 'This Room Is For HC Members Only'), + ('furni_xmasduck_desc', 'A right Christmas quacker!'), + ('pet_enrg_8', 'Lively'), + ('NUF_getting_room_own_rooms_tutor', 'Click the \'Create own room\' button to start building your room. Don\'t worry, making your room is completely free.'), + ('pet_enrg_5', 'Sprightly'), + ('pet_enrg_6', 'Active'), + ('furni_doormat_plain*4_desc', 'Available in a variety of colours'), + ('pet_enrg_3', 'Lazy'), + ('pet_enrg_4', 'Relaxed'), + ('furni_divider_poly3*6_desc', 'Blue Mode Bardesk Gate'), + ('pet_enrg_1', 'Slow'), + ('furni_glass_table*2_desc', 'Translucent beauty'), + ('pet_enrg_2', 'Sluggish'), + ('poster_1003_desc', 'get the lovely isles on your walls'), + ('furni_hc_djset_name', 'The Grammophon'), + ('pet_enrg_9', 'Tireless'), + ('furni_table_plasto_round*6_name', 'Round Dining Table'), + ('furni_sporttrack2*3_name', 'Sport corner grass'), + ('furni_footylamp_name', 'Football Lamp'), + ('furni_bed_silo_one_desc', 'Plain and simple'), + ('pet_enrg_0', 'Tired'), + ('furni_soft_sofachair_norja*7_name', 'Rural Iced Sofachair'), + ('furni_solarium_norja*9_desc', 'Rejuvenate your pixels!'), + ('furni_pillow*9_desc', 'Puffy, soft and VERY fluffy!'), + ('furni_plant_mazegate_snow_desc', 'There\'s snow way through!'), + ('furni_sound_set_8_name', 'Ambient 2'), + ('furni_divider_silo3*4_name', 'Beige Area Gate'), + ('previous', 'Previous'), + ('furni_glass_stool*3_desc', 'Translucent beauty'), + ('furni_bardeskcorner_polyfon*8_name', 'Yellow Mode Bardesk Corner'), + ('next_onearrowed', 'Next >'), + ('nav_venue_sw_lobby_expert_desc', 'For the William Tells and Robin Hoods of Snow Storming.'), + ('furni_bardeskcorner_polyfon*2_name', 'Black Mode Bardesk Corner'), + ('catalog_pet_unacceptable', 'Sorry, that name is unacceptable to Hotel Management'), + ('furni_sound_set_46_name', 'Club 1'), + ('nav_error_room_full', 'The room is full.'), + ('furni_queue_tile1*4_name', 'Gold Habbo Roller'), + ('furni_mocchamaster_desc', 'Wake up and smell it!'), + ('furni_gothic_stool*1_name', 'Gothic Stool Pink'), + ('furni_noob_chair*5_name', 'My first Habbo chair'), + ('furni_noob_rug*3_desc', 'Nice and neat sisal rug with aubergine edging'), + ('nav_venue_club_mammoth/0_name', 'Club Mammoth'), + ('pet_race_1_024', 'Cat Burglar'), + ('pet_race_1_022', 'Matted Moggy'), + ('poster_39_name', 'Screaming Furnies'), + ('pet_race_1_023', 'Indoor Alley Cat'), + ('furni_prizetrophy5*3_desc', 'Breathtaking bronze'), + ('pet_race_1_020', 'Caterwaul Kitty'), + ('NUF_mini_meet_people_room_tutor', 'The people wandering around are Habbos just like you.\\nClick on one of them to learn more about them- or on yourself to look in the mirror.'), + ('pet_race_1_021', 'Fabulous Feline'), + ('furni_arabian_tetbl_name', 'Hexagonal Tea Table'), + ('furni_grand_piano*4_name', 'Amber Grand Piano'), + ('poster_504_desc', 'The German flag'), + ('roomatic_name', 'Room name:'), + ('furni_sound_set_21_desc', 'Headbanging riffs'), + ('credit_redeem_info', 'More info about credit furni >>'), + ('furni_marquee*a_desc', 'It\'s both door and a shade!'), + ('furni_sound_set_33_name', 'Rock 3'), + ('furni_queue_tile1*5_desc', 'The power of movement'), + ('furni_doorD_name', 'Imperial Teleport'), + ('furni_rare_parasol*1_desc', 'Block those rays!'), + ('purse_youhave', 'You Have'), + ('nav_fullbutton', 'Full'), + ('furni_rare_fountain*2_desc', 'For our feathered friends'), + ('friend_request_accepted', 'Accepted!'), + ('tutorial_help_button_bubble', 'Click the blue question mark to open up the help menu to restart the tutorial.'), + ('furni_rubberchair*4_desc', 'Soft and tearproof!'), + ('furni_sound_set_9_desc', 'Mystical ambient soundscapes'), + ('furni_rare_fan*3_name', 'Purple Dragon Skin Fan'), + ('furni_table_plasto_square*8_desc', 'Hip plastic furniture'), + ('gs_choose_gametime', 'Choose Game duration:'), + ('furni_traffic_light*1_desc', 'Chill and wait your turn!'), + ('furni_sofachair_polyfon*6_desc', 'Blue Mode Armchair'), + ('furni_chair_norja*4_name', 'Urban Iced Chair'), + ('furni_val_teddy*2_name', 'Pink Share Bear'), + ('nav_venue_chill/0_name', 'Zen Garden'), + ('furni_table_plasto_square_name', 'Occasional Table'), + ('furni_bed_budget_name', 'Pura Bed'), + ('furni_solarium_norja_name', 'White Solarium'), + ('furni_noob_table*1_name', 'My first Habbo table'), + ('gs_5min', '5min'), + ('purse_credits', 'You have \\x1 Habbo Credit(s) in your purse.'), + ('furni_divider_poly3*5_name', 'Candy Hatch (Lockable)'), + ('furni_rare_icecream*6_name', 'Toffee Ice Cream Machine'), + ('furni_table_polyfon_med_name', 'Large Coffee Table'), + ('console_deselect_all', 'Deselect all'), + ('nav_venue_bb_lobby_amateur_8_name', 'Gevorderden Battle Ball 9'), + ('transaction_system_sms_win_kpn', 'KPN SMS'), + ('nav_venue_bb_lobby_intermediate_3/0_desc', ''), + ('furni_CFC_500_goldbar_desc', 'Worth 500 Credits'), + ('NUF_visiting_rooms', 'Visiting other players\' rooms'), + ('url_logout_timeout', 'http://%predefined%//account/disconnected?reason=logout'), + ('furni_table_silo_med*7_desc', 'Green Area Coffee Table'), + ('player_commands_no_args', 'You have not supplied any arguments!'), + ('furni_romantique_pianochair*2_name', 'Lime Romantique Piano Chair'), + ('pickup', 'Pick up'), + ('reg_tutorial_url', ''), + ('habboclub_confirm_body', 'You have %credits% credits'), + ('nav_venue_bb_lobby_beginner_12/0_desc', ''), + ('furni_rare_elephant_statue*1_name', 'Silver Elephant'), + ('help', 'Habbo Help'), + ('furni_soft_sofachair_norja*2_desc', 'Black Iced Sofachair'), + ('furni_table_plasto_round*1_desc', 'Hip plastic furniture'), + ('furni_sleepingbag*9_desc', 'Ultimate coziness'), + ('furni_arabian_tray2_desc', 'For those Arabian nights'), + ('NUF_visiting_rooms_hotelview_tutor', 'Hello. This time we are learning how to visit another user\'s room.'), + ('furni_traffic_light*6_name', 'Red Traffic Light'), + ('Alert_ChooseWhoToSentMessage', 'Please choose who to\\rsend your message to'), + ('poster_47_desc', 'Twinkle, twinkle'), + ('bb_title_finalScores', 'Final standings:'), + ('jukebox_song_author', 'by: %author%'), + ('poster_2003_name', 'Dodgy Geezer'), + ('poster_509_name', 'The Jamaican flag'), + ('poster_6_desc', 'But is it the right way up?'), + ('furni_toy1*1_name', 'Rubber Ball'), + ('nav_venue_bb_lobby_beginner_13_name', 'Beginners Battle Ball 14'), + ('furni_scifidoor*5_name', 'White Spaceship Door'), + ('credit_redeem_text', 'You are going to change Furni to %value% credits.'), + ('nav_venue_sw_lobby_amateur_0_name', 'Snow Slingers Lobby'), + ('club_txt_intro', 'Welcome to Habbo Club - the members only club that all the best Habbos belong to!\\r\\rMembers of Habbo Club get priority access to the hotel (so you can always get in), exclusive clothes, hair colours, rare furni and special guest room layouts. To see exactly what you\'ll be able to get your hands on as a Habbo Club member, take a look in the Catalogue.'), + ('nav_venue_bouncer_room_1_name', 'Beginners Battle Ball Arena'), + ('update_email_suggest', 'Habbo Hotel security supervisor requests you to update your email'), + ('furni_rare_dragonlamp*3_name', 'Silver Dragon Lamp'), + ('furni_scifiport*2_name', 'Blue Laser Gate'), + ('club_button_extend', 'Extend Membership'), + ('wallitem_val_heart_name', 'Heart Light'), + ('furni_pura_mdl3*7_name', 'Green Pura Module 3'), + ('furni_sound_set_61_desc', 'Straight from the heart'), + ('nav_venue_bb_lobby_expert_9/0_desc', ''), + ('furni_pura_mdl2*9_name', 'Red Pura Module 2'), + ('furni_hal_cauldron_name', 'Habboween Cauldron'), + ('furni_divider_nor1*2_name', 'Black Ice corner'), + ('send', 'Send'), + ('furni_couch_norja_desc', 'Two can perch comfortably'), + ('furni_pura_mdl4*5_name', 'beige pura module 4'), + ('pet_race_1_008', 'Mad Mouser'), + ('pet_race_1_009', 'Scaredy Kat'), + ('pet_race_1_006', 'Titchy Tiger'), + ('pet_race_1_007', 'Burmese Buddy'), + ('pet_race_1_004', 'Soft-Toed Sneaker'), + ('furni_divider_nor4*8_desc', 'Habbos, roll out!'), + ('furni_tile_desc', 'In a choice of colours'), + ('pet_race_1_005', 'Cat Astroflea'), + ('pet_race_1_002', 'Lesser Spotted Longhair'), + ('pet_race_1_003', 'Hidden Clause'), + ('pet_race_1_000', 'Sleepy Siamese'), + ('pet_race_1_001', 'Purr-Sian'), + ('furni_sound_set_53_name', 'Snowy Surprise'), + ('furni_rare_icecream*1_desc', 'Virtual blueberry rocks!'), + ('furni_table_plasto_round*15_name', 'Occasional Table'), + ('security', 'Security'), + ('furni_glass_chair*5_name', 'Glass chair'), + ('nav_venue_cunning_fox_gamehall/1_desc', 'It\'s one-on-one for five in a row'), + ('nav_venue_sw_lobby_tournament_4/0_desc', ''), + ('furni_carpet_soft_desc', 'Soft Wool Rug'), + ('poster_27_desc', 'Deck the halls!'), + ('furni_safe_silo*7_desc', 'Totally shatter-proof!'), + ('furni_table_silo_small*5_desc', 'Pink Area Occasional Table'), + ('furni_marquee*4_desc', 'It\'s both door and a shade!'), + ('furni_gothic_sofa*4_desc', 'Ghosts and Ghouls'), + ('furni_prizetrophy6*1_desc', 'Glittery gold'), + ('pet_race_1_019', 'Bobcat Wailer'), + ('furni_bardesk_polyfon*5_desc', 'For cute constructions'), + ('furni_carpet_polar*2_name', 'Blue Bear Rug'), + ('pet_race_1_017', 'Furry Friend'), + ('furni_soft_sofa_norja*6_desc', 'Blue Iced Sofa'), + ('furni_pura_mdl2*4_desc', 'Any way you like it!'), + ('pet_race_1_018', 'Trusting Tabby'), + ('pet_race_1_015', 'Haughty House Pet'), + ('chatlog.url', 'https://theallseeingeye.sulake.com/ase/habbo/uk/housekeeping/extra/hobba/chatlog.action?chatId='), + ('furni_ham2_name', 'Eaten Ham'), + ('pet_race_1_016', 'Curiousity - The Return!'), + ('pet_race_1_013', 'Felis Catus Allergicus'), + ('pet_race_1_014', 'Bushy Bobtail'), + ('pet_race_1_011', 'Egyptian Angora'), + ('pet_race_1_012', 'Freckled Feral'), + ('gs_choose_gamefield', 'Choose Game Arena:'), + ('furni_divider_nor5*6_desc', 'Cool cornering for your crib y0!'), + ('furni_summer_pool*2_name', 'Red Summer Pool'), + ('pet_race_1_010', 'Wannabe Wildcat'), + ('furni_rare_elephant_statue_desc', 'Say hello to Nelly'), + ('furni_sofa_silo*8_desc', 'Cushioned, understated comfort'), + ('furni_exe_rug_desc', 'Please remove your shoes!'), + ('NUF_meeting_people_roomlist_tutor', 'Let\'s visit one of the rooms and find out how to meet other users.'), + ('furni_chair_plasto*15_desc', 'Hip plastic furniture'), + ('nav_venue_habburger\'s_name', 'Habburgers'), + ('queue_current_2', 'You are in queue for the room.'), + ('queue_current_1', 'You are in Habbo Live queue...'), + ('furni_pura_mdl5*3_name', 'Black Pura Module 5'), + ('furni_hockey_score_name', 'Scoreboard'), + ('furni_sofachair_silo*5_desc', 'Pink Area Armchair'), + ('furni_hyacinth1_name', 'Pink Hyacinth'), + ('furni_pura_mdl1*6_desc', 'Any way you like it!'), + ('camera_open_dialog_heading', 'Camera'), + ('furni_prizetrophy5*2_name', 'Duo trophy'), + ('furni_glass_chair_desc', 'Translucent beauty'), + ('furni_rubberchair*3_desc', 'Soft and tearproof!'), + ('furni_exe_plant_name', 'Executive Plant'), + ('furni_pura_mdl2*3_desc', 'Any way you like it!'), + ('furni_pura_mdl1*2_name', 'Pink Pura Module 1'), + ('furni_plant_bonsai_desc', 'You can be sure it lives'), + ('furni_plant_valentinerose*4_desc', 'Be mine!'), + ('wallitem_hrella_poster_3_desc', 'Don\'t drift away!'), + ('furni_deadduck_name', 'Dead Duck'), + ('furni_summer_grill*3_desc', 'Plenty of steak on that barbie'), + ('modtool_extrainfo', 'Extra Info:'), + ('sound_machine_jukebox_window', 'Jukebox'), + ('gs_button_start', 'Start Game!'), + ('nav_venue_sw_lobby_beginner_5/0_desc', ''), + ('furni_romantique_chair*5_desc', 'What does this button do?'), + ('furni_table_plasto_4leg*9_desc', 'Hip plastic furniture'), + ('furni_soft_sofa_norja_desc', 'A soft iced sofa'), + ('furni_divider_nor4*9_name', 'Red Iced Auto Shutter'), + ('login_haventGotHabbo', 'Haven\'t got a Habbo yet?'), + ('furni_noob_stool*2_name', 'My first Habbo stool'), + ('furni_s_sound_machine*5_desc', 'Sound Machine Brown Desc'), + ('credit_redeem_window', 'Redeem credit furni'), + ('send_invitation_text', 'Want to meet someone from our Welcoming Party?'), + ('purse_vouchers_exitbutton', 'Cancel'), + ('furni_prizetrophy6*3_desc', 'Breathtaking bronze'), + ('nav_venue_cafe_gold/0_name', 'Kultakahvila'), + ('furni_fortune_name', 'Crystal Ball'), + ('poster_22_name', 'Butterfly Cabinet (blue)'), + ('object_displayer_link_badge', 'Edit Badge'), + ('furni_sound_set_15_name', 'RnB Grooves 6'), + ('Alert_NoNameSet', 'Check your Habbo name.'), + ('furni_hc_crpt_name', 'Persian Carpet'), + ('error_ok', 'OK->'), + ('game_chess_email', 'Receive game via email'), + ('sound_machine_confirm_save_list', 'Save playlist?'), + ('furni_noob_rug*2_desc', 'Nice and neat sisal rug with blue edging'), + ('queue_set.e1.alert', 'This room is currently available only to Habbos participating to the event.'), + ('furni_rare_icecream*0_desc', 'Virtual cherry rocks!'), + ('furni_arabian_chair_name', 'Green Blossom Chair'), + ('furni_divider_silo3*6_name', 'Blue Area Gate'), + ('furni_scifiport*4_desc', 'Energy beams. No trespassers!'), + ('furni_sofa_silo*4_desc', 'Beige Area Sofa'), + ('furni_one_way_door*4_desc', 'One at a time!'), + ('furni_chair_norja*5_desc', 'Sleek and chic for each cheek'), + ('furni_sound_set_19_desc', 'Shake your body!'), + ('poster_26_desc', 'See that halo gleam!'), + ('furni_doormat_plain*2_desc', 'Available in a variety of colours'), + ('furni_romantique_chair*1_name', 'Rose Quartz Chair'), + ('furni_hc_tv_name', 'Mega TV Set'), + ('pet.hotwords.follow_me', 'heel'), + ('furni_petfood3_desc', 'Fantastic 20% Saving!'), + ('furni_couch_norja*5_name', 'Pink Bench'), + ('furni_table_plasto_round*7_desc', 'Hip plastic furniture'), + ('furni_bed_armas_two_desc', 'King-sized pine comfort'), + ('modtool_days', 'Days'), + ('furni_one_way_door*7_name', 'Green One Way Gate'), + ('furni_table_norja_med*5_name', 'Large Coffee Table Pink'), + ('furni_sand_cstl_wall_name', 'sand_cstl_wall'), + ('nav_modify_doorstatus_givepw', 'Password for the room'), + ('NUF_getting_items_room_tutor', 'Nice room. Reminds me of a chic Parisian cafe in Slough. Open the Catalogue.'), + ('habbo_hand_prev', '<<<'), + ('pet.saying.generic.croco.3', 'Tick tock tick....'), + ('invitation_follow_failed', 'Sorry, your attempt to follow an invitation failed.'), + ('furni_sound_set_12_desc', 'Unusual as Standard'), + ('pet.saying.generic.croco.1', '*Mellow*'), + ('error_text', 'Error occured, press \'OK\' to restart program.\\r\\rPlease report bugs to:\\rwww.habbohotel.com/habbo/en/help/contact/bugs/ \\rSorry for the inconvenience.'), + ('pet.saying.generic.croco.2', 'I\'m so hungry I could eat you!'), + ('furni_divider_silo3*3_desc', 'Form following function'), + ('furni_table_plasto_4leg*2_desc', 'Hip plastic furniture'), + ('int_newmessages', 'New Message(s)'), + ('furni_rare_icecream*3_name', 'Blackcurrant Ice Cream Machine'), + ('bb_header_gameinfo', 'Game info'), + ('furni_scifiport*0_name', 'Red Laser Door'), + ('nav_venue_bb_lobby_beginner_7_name', 'Beginners Battle Ball 8'), + ('tx_history.description.bank_wallie', 'Wallie-card'), + ('nav_venue_hallway_name', 'Hallway'), + ('nav_venue_bb_lobby_amateur_11/0_desc', ''), + ('furni_bed_budget_one*5_desc', 'Prince sized comfort!'), + ('pet.saying.generic.croco.0', 'Rrrr....Grrrrrg....'), + ('nav_popup_go', '>>'), + ('furni_safe_silo*3_name', 'White Safe Minibar'), + ('furni_table_silo_small_name', 'Occasional Table'), + ('poll_confirm_window', 'Leave our poll'), + ('furni_table_norja_med*9_desc', 'For larger gatherings'), + ('furni_divider_nor4*6_desc', 'Habbos, roll out!'), + ('gs_3teams', '3 Teams Game'), + ('wallitem_post.it.limit', 'Only 50 stickies per room are allowed!'), + ('furni_scifidoor*4_desc', 'Protect your pot of gold!'), + ('furni_bed_polyfon_one*9_name', 'Red Single Bed'), + ('furni_soft_sofa_norja*2_desc', 'Black Iced Sofa'), + ('furni_corner_china_desc', 'Firm, fireproof foundation'), + ('hobba_pickup_go', 'Pick Up & Go!'), + ('furni_sporttrack3*2_desc', 'null'), + ('furni_rare_fan*6_name', 'Ochre Powered Fan'), + ('furni_sound_set_3_name', 'Electronic 1'), + ('NUF_mini_meet_people_user_tutor', 'Here you can chat to users directly. Ask a Habbo to be your friend by clicking on their Habbo and the button.\\nIf this is your first time, check your Hand to see a present to decorate your own room with, later.'), + ('furni_pura_mdl2*6_name', 'Blue Pura Module 2'), + ('furni_couch_norja*9_desc', 'Two can perch comfortably'), + ('furni_chair_plasty*9_desc', 'Hip plastic furniture'), + ('game_chess_white', 'White:'), + ('nav_venue_sw_lobby_intermediate_3/0_desc', 'Lumisota sen kuin vain kovenee.'), + ('furni_table_plasto_square*3_desc', 'Hip plastic furniture'), + ('nav_venue_theatredrome/0_desc', 'Perform your latest masterpiece!'), + ('nav_venue_the_den/0_desc', 'Has anyone seen my map?'), + ('furni_sound_set_40_name', 'Rock 4'), + ('remove', 'Remove'), + ('friend_request_decline_all', 'Decline all requests.'), + ('furni_rare_globe_name', 'Snow Globe'), + ('furni_bardesk_polyfon*8_name', 'Yellow Mode Bardesk'), + ('nav_venue_sw_lobby_free_6_name', 'Free Game Lobby'), + ('queue_change', 'Change queue'), + ('reg_parentemail_link_text2', 'Privacy Pledge'), + ('furni_rare_parasol*2_desc', 'Block those rays!'), + ('furni_romantique_pianochair*3_desc', 'null'), + ('reg_parentemail_link_text1', 'See the letter'), + ('sound_machine_list_save', 'Save Playlist'), + ('nav_public_helptext_hd', 'Public Spaces'), + ('furni_chair_plasty*2_desc', 'Hip plastic furniture'), + ('spectator_count', 'spectators %cnt%/%max%'), + ('reg_welcome2', 'Create Your Own Habbo'), + ('wallitem_roomdimmer_desc', 'Superior lighting for your room'), + ('furni_prizetrophy*3_name', 'Classic trophy'), + ('furni_plant_rose_name', 'Cut Roses'), + ('reg_welcome3', 'Now the fun begins! All you need to do is register and you\'re ready to start. It won\'t take long!\\rYou can change everything except your name and date of birth later. Come on!'), + ('furni_noob_table*5_name', 'My first Habbo table'), + ('nav_error_room_closed', 'The room is closed.'), + ('reg_changePassword', 'Change your password'), + ('furni_divider_nor5*3_desc', 'Cool cornering for your crib y0!'), + ('furni_doorC_name', 'Portaloo'), + ('furni_chair_plasty*10_name', 'Plastic Pod Chair'), + ('furni_pura_mdl1*9_name', 'Red Pura Module 1'), + ('furni_rare_stand_name', 'Speaker\'s Corner'), + ('furni_grunge_table_name', 'Grunge Table'), + ('furni_traffic_light*2_name', 'Blue Traffic Light'), + ('pet.saying.angry.croco.2', 'You have displeased me.'), + ('human_trading', 'Trading'), + ('furni_noob_stool*6_desc', 'Unfold me and take the weight off (green)'), + ('pet.saying.angry.croco.1', 'Rawwwr...rrr'), + ('nav_venue_sw_lobby_intermediate_5_name', 'Snow Bombardiers Lobby'), + ('gs_button_leavegame', 'Leave Game'), + ('pet.saying.angry.croco.0', 'Grrrrr...rrr'), + ('furni_s_sound_machine*1_name', 'Sound Machine Grey'), + ('pet.saying.angry.croco.4', 'Buuuuurrr..rrrrr'), + ('furni_chair_plasto*7_desc', 'Hip plastic furniture'), + ('pet.saying.angry.croco.3', 'Rowrrrr...rrrr'), + ('furni_soft_sofa_norja*9_desc', 'Red Iced Sofa'), + ('nav_venue_skylight_lobby_name', 'Skylight Lobby'), + ('furni_bed_polyfon_one*6_desc', 'Blue Mode Single Bed'), + ('furni_pillow*8_desc', 'Puffy, soft and huge'), + ('furni_hc_rntgn_name', 'X-Ray Divider'), + ('furni_table_silo_med*5_desc', 'Pink Area Coffee Table'), + ('furni_gothic_stool*2_desc', 'Be seated please..'), + ('furni_typingmachine_desc', 'Write that bestseller'), + ('furni_fridge_desc', 'Keep cool with a chilled snack or drink'), + ('nav_venue_cunning_fox_gamehall/4_desc', 'Get a hand like a foot? Keep a straight face and bluff it out'), + ('doorbell_rings', 'Rings the doorbell - Open the door?'), + ('furni_divider_silo1*9_desc', 'Red Area Small Table'), + ('nav_venue_bb_lobby_intermediate_7/0_desc', ''), + ('furni_prize1_name', 'Gold Trophy'), + ('poster_54_name', 'Hockey Stick'), + ('furni_sound_set_47_name', 'Club 2'), + ('furni_prizetrophy3*1_name', 'Globe trophy'), + ('purse_head2', 'ACCOUNT TRANSACTIONS'), + ('furni_soft_sofa_norja*5_name', 'Pink Iced Sofa'), + ('furni_prizetrophy9*1_desc', 'Glittery gold'), + ('buddyremove_next', 'Next >'), + ('reg_girl', 'Girl'), + ('furni_bed_budget_one*1_name', 'Aqua Pura Bed'), + ('NUF_visiting_rooms_roomlist_go', 'Click \'Go\' to go to a room.'), + ('poster_506_desc', 'To \'Finnish\' your decor...'), + ('furni_toy1_name', 'Rubber Ball'), + ('furni_sound_set_7_desc', 'Sound effects for Furni'), + ('sw_fieldname_6', 'Riverbank Siege'), + ('sw_fieldname_5', 'Polar Labyrinth'), + ('furni_bed_polyfon*4_desc', 'Beige Mode Double Bed'), + ('furni_pillow*4_name', 'Gold Feather Pillow'), + ('alert_duplicatesession', 'You are already logged in on another hotel! Log out before trying again.'), + ('sw_fieldname_7', 'Skull Falls Assault'), + ('sound_machine_alert_song_not_ready', 'Can\'t save song! Song not ready yet.'), + ('nav_venue_bb_lobby_beginner_5/0_desc', ''), + ('nav_venue_bb_lobby_tournament_4/0_desc', ''), + ('pet.saying.play.dog.1', 'woofWOOFwoofWOOFwoof'), + ('pet.saying.play.dog.0', 'rrr.. WOOF .rrr..'), + ('furni_cn_lamp_name', 'Lantern'), + ('furni_arabian_rug_name', 'Berber Kilim Rug'), + ('NUF_groups_hotelview_tutor', 'You have now opened the Group tutorial in the website window. Special!'), + ('gs_error_start_9', 'Team sizes can only differ by one player. This Game cannot start!'), + ('furni_divider_poly3*7_desc', 'Green Mode Bardesk Gate'), + ('furni_sofachair_silo*4_desc', 'Beige Area Armchair'), + ('poster_58_desc', 'whish you luck'), + ('furni_chair_basic*2_desc', 'It\'s a cracking design!'), + ('poster_516_name', 'The English flag'), + ('nav_venue_sw_lobby_tournament_2/0_desc', ''), + ('furni_gothic_carpet_name', 'Cobbled Path'), + ('sw_title', 'Snow Storm'), + ('furni_doormat_plain*5_name', 'Doormat'), + ('furni_pura_mdl4*4_desc', 'Any way you like it!'), + ('furni_sound_machine*1_name', 'Sound Machine'), + ('furni_sofa_silo*7_name', 'Green Area Sofa'), + ('nav_venue_sw_lobby_tournament_4_name', 'Tournament Lobby'), + ('gs_title_gamecreation', 'Game creation'), + ('furni_couch_norja*2_desc', 'Two can perch comfortably'), + ('furni_prizetrophy5_desc', 'Palkinto'), + ('furni_divider_nor3*9_desc', 'Red Iced gate'), + ('furni_present_gen_name', 'Gift'), + ('furni_prizetrophy7*3_name', 'Bronze Habbo trophy'), + ('alert_reg_parent_email', 'The email address you provided is unacceptable.'), + ('furni_bed_polyfon_girl_name', 'Double Bed'), + ('furni_rare_fountain_name', 'Bird Bath (red)'), + ('furni_pura_mdl3*3_name', 'Black Pura Module 3'), + ('furni_plant_pineapple_name', 'Pineapple Plant'), + ('furni_divider_nor2*8_name', 'Yellow Iced bar desk'), + ('messenger', 'Messenger'), + ('nav_venue_bb_arena_0_name', 'Battle Ball kaikille'), + ('sw_fieldname_2', 'Algid River'), + ('furni_bed_silo_two_desc', 'Plain and simple x2'), + ('sw_fieldname_1', 'Arctic Island'), + ('furni_pillow*1_desc', 'Puffy, soft and huge'), + ('sw_fieldname_4', 'Frosty Forest'), + ('sw_fieldname_3', 'Glacial Fort'), + ('furni_bar_basic_desc', 'A pura series 300 minibar'), + ('tutorial_welcome_M', 'Hi! I am your guide to Habbo Hotel. Please pick a topic to start.'), + ('tutorial_welcome_F', 'Hi there! I\'m your guide to Habbo Hotel. What would you like to learn today?'), + ('Alert_NoNameSetForLogo', 'Please give a name to your logo'), + ('furni_glass_table*5_name', 'Glass table'), + ('group_owner', 'Owner'), + ('console_target_friend_list_full', 'This user\'s friend list is full'), + ('furni_romantique_smalltabl*2_name', 'Lime Tray Table'), + ('ph_keys_spacebar', 'Spacebar'), + ('furni_noob_chair*3_name', 'My first Habbo chair'), + ('NUF_meeting_people_roomlist_publicTab', 'Click the Public Spaces tab to see the list of public rooms. To go to the room click the \'Go\' button.'), + ('furni_bed_polyfon*7_name', 'Green Mode Double Bed'), + ('furni_jukebox_ptv*1_name', 'Jukebox Pacha TV'), + ('poster_513_desc', 'Aussies rule!'), + ('poster_51_desc', '2 points for every basket'), + ('furni_toy1*2_name', 'Rubber Ball'), + ('furni_bartable_armas_name', 'Bardesk'), + ('nav_venue_sw_lobby_amateur_0/0_desc', ''), + ('NUF_mini_use_console_read_tutor', 'The Habbo Console lets you message with people you have added to your friends list.'), + ('nav_venue_bb_lobby_beginner_12_name', 'Beginners Battle Ball 13'), + ('poster_2002_name', 'Urho Kaleva Kekkonen'), + ('furni_sound_set_44_desc', 'Haunted Dimension'), + ('pet.saying.beg.dog.1', 'Oouh..oouh..snuh..ooo'), + ('furni_sporttrack2*1_name', 'Sport corner tartan'), + ('pet.saying.beg.dog.0', 'Oooo...Ouuu...oo...OUUU'), + ('furni_solarium_norja*5_desc', 'Rejuvenate your pixels!'), + ('pet.saying.beg.dog.2', '*whimpers *'), + ('reg_pledgelink', 'Hotel rules'), + ('habboclub_price1.days', '30'), + ('furni_glass_shelf_desc', 'Translucent beauty'), + ('furni_sofachair_polyfon*3_name', 'White Armchair'), + ('reg_verification_info', 'You must know the correct birthday and password before you\'re allowed to make these changes.'), + ('furni_carpet_soft*5_desc', 'Soft Wool Rug'), + ('furni_grunge_mattress_name', 'Grunge Mattress'), + ('furni_bed_polyfon_one_name', 'Single Bed'), + ('furni_sound_machine_pro_name', 'Sound Machine Pro'), + ('furni_chair_china_desc', 'The elegant beauty of tradition'), + ('furni_rare_icecream*7_desc', 'Virtual chocolate rocks!'), + ('furni_table_silo_med*8_name', 'Yellow Coffee Table'), + ('club_gift.message', 'Happy Habbo Club! Love Callie :)'), + ('furni_sw_raven_desc', 'My name is Otter'), + ('furni_noob_table*2_desc', 'Lightweight, practical and dark blue'), + ('furni_soft_sofachair_norja*3_desc', 'Soft Iced sofachair'), + ('sound_machine_confirm_delete', 'Delete song?'), + ('furni_plant_fruittree_name', 'Fruit Tree'), + ('nav_venue_bb_lobby_intermediate_1/0_desc', ''), + ('furni_heartsofa_name', 'Heart Sofa'), + ('furni_bed_budget_one*8_name', 'Yellow Pura Bed'), + ('NUF_getting_room', 'Making your own room'), + ('furni_rare_elephant_statue*2_name', 'Bronze Elephant'), + ('nav_venue_ballroom/0_desc', 'Come play ball!'), + ('nav_venue_sw_lobby_amateur_1_name', 'Snow Slingers Lobby'), + ('console_lasttime', 'Last Time'), + ('furni_md_sofa_desc', 'A decent recliner'), + ('furni_wooden_screen*6_name', 'Blue Oriental Screen'), + ('partner_registration_text', 'Click the link to finish your registration. When you have finished the registration click OK to continue to the hotel.'), + ('furni_sound_set_62_desc', 'Music of the Arabian night!'), + ('furni_arabian_divdr_name', 'Soft wooden screen'), + ('furni_tree1_desc', 'Dead christmas tree'), + ('furni_grand_piano*3_name', 'Pink Grand Piano'), + ('console_select_requests', 'Following users have asked to be your friend. Please accept or decline.'), + ('furni_divider_nor4*2_name', 'Black Iced Auto Shutter'), + ('furni_glass_chair*3_name', 'Glass chair'), + ('reg_passwordContainsNoNumber', 'Password must contain at least one number'), + ('buddyremove_invert', 'Invert Selection'), + ('furni_val_teddy*5_desc', 'The yellow bear of understanding'), + ('furni_sound_set_51_name', 'Club 6'), + ('poster_1_desc', 'The Noble and Silver Show'), + ('roomevent_create_name', 'Type the name of your event'), + ('Alert_unacceptableName', 'Sorry, that name is unacceptable to the Hotel Management'), + ('NUF_getting_room_go_tutor', 'Your room is now ready. Let\'s go see! I hope you have a bed...'), + ('poster_520_name', 'The Rainbow Flag'), + ('password', 'Password:'), + ('furni_bed_budget*8_name', 'Yellow Pura Double Bed'), + ('gs_header_gamelist', 'Game List'), + ('furni_chair_plasty_desc', 'Hip plastic furniture'), + ('url_purse_subscribe', 'http://%predefined%//credits?'), + ('furni_table_plasto_bigsquare*15_desc', 'Hip plastic furniture'), + ('furni_glass_stool*6_desc', 'Translucent beauty'), + ('error_report', 'Error Report'), + ('summer_chair_6_desc', 'Get decked'), + ('furni_chair_basic*5_name', 'chair_basic'), + ('room_remove_specs', 'Sorry! Now it\'s someone else\'s turn to watch this event.'), + ('furni_bunny_desc', 'Yours to cuddle up to'), + ('invitation_exists', 'You have already invited members of the Welcoming Party to your room.'), + ('purse_vouchers_furni_success', 'Voucher was successfully redeemed. You have been given the following furniture:'), + ('nav_rooms_popular', 'Popular rooms'), + ('nav_cancel', 'Cancel'), + ('alert_cross_domain_download', 'Cross domain content download prevented'), + ('furni_table_plasto_4leg*16_desc', 'Hip plastic furniture'), + ('url_pets', 'http://%predefined%//hotel/pets'), + ('furni_bardeskcorner_polyfon*9_desc', 'Tuck it away'), + ('gs_button_cancel', 'Cancel'), + ('furni_barchair_silo*7_name', 'Green Bar Stool'), + ('catalog_credits', 'You have \\x Credits in your purse.'), + ('furni_divider_nor3_name', 'Door (Lockable)'), + ('nav_modify_name', 'Name of the room'), + ('nav_venue_bb_lobby_amateur_7_name', 'Gevorderden Battle Ball 8'), + ('nav_venue_club_massiva/0_desc', 'Rest your dancing feet!'), + ('furni_gothrailing_desc', 'The dark side of Habbo'), + ('queue_set.na.alert', 'This Room is for Staff only.'), + ('nav_venue_bb_lobby_tournament_8_name', 'Competitie Battle Ball 9'), + ('furni_sound_set_29_name', 'Dance 2'), + ('console_msgs', 'msgs'), + ('furni_noob_lamp*6_name', 'My first Habbo lamp'), + ('furni_marquee*6_desc', 'It\'s both door and a shade!'), + ('furni_chair_plasto*16_desc', 'Hip plastic furniture'), + ('furni_chair_basic*9_desc', 'It\'s a cracking design!'), + ('summer_chair_2_name', 'Pink Deck Chair'), + ('alert_too_much_furnitures', 'Furni limit for room is exceeded. Not all furnitures are shown. Please remove some.'), + ('furni_pura_mdl5*4_name', 'White Pura Module 5'), + ('bus.full_msg', 'The FRANK bus is full at the moment, please come back later or visit the FRANK page below for more information.'), + ('furni_sound_set_22_name', 'SFX 3'), + ('furni_gothic_sofa*3_desc', 'The dark side of Habbo'), + ('furni_md_limukaappi_name', 'Habbo Cola Machine'), + ('poster_19_desc', 'Trying to get in or out?'), + ('gs_2min', '2min'), + ('poster_8_desc', 'Habbos come in all colours'), + ('furni_pillar*6_desc', 'Ancient and stately'), + ('furni_carpet_standard*3_desc', 'Available in a variety of colours'), + ('purse_vouchers_info', 'When you buy Habbo Credits with a mobile phone, you will receive a special voucher code. Enter the code in the box above, click \'Get Credits!\' and they\'ll be added to your purse.'), + ('furni_valeduck_name', 'Valentine\'s Duck'), + ('Alert_MessageFromAdmin', 'Message from Hotel Management:'), + ('furni_present_gen1_desc', 'What\'s inside?'), + ('reg_tutorial_txt', ''), + ('furni_tile_stella_name', 'Star Tile'), + ('furni_shelves_norja*4_name', 'Urban Iced Bookcase'), + ('transaction_system_creditcards_is', 'Creditcard'), + ('furni_shelves_polyfon_desc', 'For the arty pad'), + ('furni_tv_luxus_name', 'Digital TV'), + ('recycler_status_window_title', 'Recycling Status'), + ('furni_sleepingbag*6_name', 'Purple Sleeping Bag'), + ('gs_button_shrink', 'Minimize Window'), + ('furni_wcandleset_desc', 'Simple but stylish'), + ('furni_sleepingbag*3_desc', 'Ultimate coziness'), + ('object_displayer_show_actions', 'Show actions'), + ('hubu_t5_1', 'Lisetoa huumeista'), + ('song_disk_text_template', '%name%'), + ('hubu_t5_2', 'Huumeista-esite'), + ('queue_other_1', 'Habbo Live queue status'), + ('poster_33_name', 'Save the Panda'), + ('hubu_t5_3', 'Yleistietoa EOPH ry:st--------------'), + ('queue_other_2', 'Room queue status'), + ('furni_hcsohva_name', 'Throne Sofa'), + ('furni_sound_set_26_desc', 'Bollywood Beats!'), + ('furni_christmas_poop_name', 'Reindeer Droppings'), + ('furni_rare_dragonlamp*4_name', 'Serpent of Doom'), + ('nav_venue_bb_lobby_amateur_7/0_desc', ''), + ('purse_value', 'VALUE'), + ('furni_glass_sofa*5_desc', 'Translucent beauty'), + ('nav_venue_bb_lobby_tournament_15/0_desc', ''), + ('furni_glass_stool*2_desc', 'Translucent beauty'), + ('pet.saying.play.cat.1', 'Purrrr.. oo..Purrr'), + ('furni_pura_mdl4*7_name', 'Green Pura Module 4'), + ('nav_venue_cafe_ole/0_desc', 'Relax with friends over one of Marias specialty coffees'), + ('pet.saying.play.cat.0', 'Mew..MEOW..meow'), + ('furni_pumpkin_name', 'Pumpkin Lamp'), + ('furni_summer_chair*7_desc', 'Reserved!'), + ('ph_tickets_txt', 'Tickets can be used for BattleBall: Rebound!, SnowStorm, the Lido Diving and Wobble Squabble games. Tickets never expire.\\r\\rCurrently you have \\x1 ticket(s).'), + ('roomatic_onemoment', 'Please wait, we are going to your room...'), + ('furni_small_table_armas_name', 'Occasional Table'), + ('furni_table_polyfon_med_desc', 'For larger gatherings'), + ('nav_venue_bb_lobby_expert_3/0_desc', ''), + ('furni_chair_silo*6_desc', 'Blue Silo Dining Chair'), + ('furni_exe_globe_name', 'Power Globe'), + ('furni_bed_budget_one_name', 'bed_budget_one'), + ('furni_divider_silo1*2_desc', 'Neat and natty'), + ('nav_venue_bb_lobby_intermediate_0_name', 'Intermediate'), + ('furni_sofa_polyfon*9_desc', 'Comfort for stylish couples'), + ('furni_noob_lamp*3_desc', 'Get the light right where you want it (aubergine)'), + ('nav_showfull', 'Show Full Rooms'), + ('furni_divider_nor3*2_desc', 'Black Iced gate'), + ('reg_note_title', 'Warning!'), + ('hubu_answ_count', 'Replies'), + ('nav_recommended_rooms', 'Recommended Rooms'), + ('transaction_system_bank_nordea', 'Nordea'), + ('furni_sound_set_37_desc', ''), + ('poster_2006_desc', 'He is the magic Habbo'), + ('sw_link_gameRules_url', 'http://%predefined%//groups/56553/id'), + ('wave', 'Wave'), + ('furni_hc_djset_desc', 'Very old skool scratch\'n\'spin'), + ('furni_plant_maze_name', 'Maze Shrubbery'), + ('furni_scifirocket*3_name', 'Endor Smoke Machine'), + ('furni_val_teddy*1_name', 'Grey Share Bear'), + ('recycler_ready_outcome', 'Recycling reward: %outcome%'), + ('poster_4_desc', 'Fake of course!'), + ('poster_62_desc', 'We can\'t bear to lose them!'), + ('furni_glass_stool*9_desc', 'Translucent beauty'), + ('furni_goodie1_name', 'Marzipan Man'), + ('nav_modify_choosecategory', 'Choose a category for your room'), + ('object_displayer_link_home', 'User\'s home page'), + ('nav_venue_sw_lobby_tournament_8/0_desc', ''), + ('furni_xmasduck_name', 'Christmas Rubber Duck'), + ('help_txt_2', 'Password Reset'), + ('pet_mood_2', 'Blue'), + ('furni_queue_tile1*4_desc', 'The power of movement'), + ('help_txt_1', 'How do I get Credits?'), + ('pet_mood_3', 'Contented'), + ('nav_venue_bb_lobby_tournament_1_name', 'Competitie Battle Ball 2'), + ('furni_rare_daffodil_rug_name', 'Petal Patch'), + ('help_txt_4', 'The Habbo Way'), + ('pet_mood_0', 'Miserable'), + ('help_txt_3', 'Help with Habbo Hotel'), + ('pet_mood_1', 'Depressed'), + ('pet_mood_6', 'Ecstatic'), + ('furni_bed_budget*4_name', 'White Pura Double Bed'), + ('nav_venue_bb_lobby_amateur_0_name', 'Amateur'), + ('furni_sofachair_polyfon*7_desc', 'Green Mode Armchair'), + ('yes', 'Yes'), + ('pet_mood_4', 'Happy'), + ('pet_mood_5', 'Joyful'), + ('furni_sound_set_30_desc', 'Moments in love'), + ('furni_prizetrophy2*1_desc', 'Glittery gold'), + ('furni_wooden_screen*3_desc', 'Add an exotic touch to your room'), + ('transaction_system_bank_op', 'Osuuspankki'), + ('help_txt_6', 'Contact Us'), + ('help_txt_5', 'Safety Tips'), + ('furni_bardeskcorner_polyfon*2_desc', 'Black Mode Bardesk Corner'), + ('poster_15_desc', 'Marvellous mountains'), + ('room_areYouSurePlace', 'Warning! If you put something down in this room you will not be able to pick it up again.'), + ('nav_venue_bouncer_room_3_name', 'Semi-profs Battle Ball Arena'), + ('furni_chair_plasto*12_name', 'Chair'), + ('furni_gothic_chair*6_name', 'Gothic Chair Blue'), + ('furni_sofa_polyfon*2_desc', 'Black Mode Sofa'), + ('modtool_alertuser', 'Alert User'), + ('furni_toilet_desc', 'Loo Seat'), + ('furni_plant_cruddy_name', 'Aloe Vera'), + ('nav_venue_space_cafe/0_desc', 'In this space noone can see you ask for a soda!'), + ('nav_incorrectflatpw', 'Incorrect, try again.'), + ('furni_chair_plasto*13_desc', 'Hip plastic furniture'), + ('login_firstTimeHere', 'First time here?'), + ('furni_skullcandle_desc', 'Alas poor Yorrick...'), + ('NUF_mini_endtopic_step1_tutor', 'Well that\'s all from me. If you have any problems just click the little blue question mark to restart the tutorial and find our FAQs.\\nTo start exploring by yourself, click Close guide from the upper left corner.'), + ('furni_divider_poly3*3_name', 'White Hatch'), + ('help_callforhelp', 'Get Live Help'), + ('furni_rare_fountain*2_name', 'Bird Bath (green)'), + ('nav_venue_rooftop_name', 'Rooftop Cafe'), + ('furni_scifiport*7_name', 'Turquoise Sci-Fi Port'), + ('purse_back_to_credits', 'Back To Purse'), + ('room_ban', 'Kick & ban'), + ('furni_pura_mdl5*1_name', 'Aqua Pura Module 5'), + ('furni_val_teddy*4_name', 'Brown Share Bear'), + ('poster_40_name', 'Bonnie Blonde'), + ('NUF_getting_room_navigator_tutor', 'You want to click it real good. The \'Own room(s)\' tab I mean. Don\'t click yourself. It\'s unhygienic.'), + ('summer_chair_3_desc', 'Relax and enjoy the sun'), + ('furni_wooden_screen*2_name', 'RosewoodScreen'), + ('nav_venue_sun_terrace_name', 'Sun Terrace'), + ('furni_rare_fan*3_desc', 'Keeps the heat off St George!'), + ('nav_venue_sport_name', 'Power Gym'), + ('furni_toilet_red_desc', 'Loo Seat'), + ('retype_password', 'Retype Password:'), + ('furni_chair_basic*6_desc', 'It\'s a cracking design!'), + ('console_friends_helptext', 'This screen shows a list of all your Habbo Friends. It tells you where they are in the hotel, or, if they\'re not checked in, when their last visit was.'), + ('NUF_getting_items_room_', 'This is the Catalogue icon. Click to open it.'), + ('furni_grunge_barrel_desc', 'Beacon of light!'), + ('furni_soft_sofachair_norja*6_name', 'Blue Iced Sofachair'), + ('int_howtoget', 'How To get?'), + ('furni_sound_set_23_desc', 'Don\'t be afraid of the dark'), + ('nav_ok', 'OK'), + ('furni_sofachair_polyfon*6_name', 'Blue Mode Armchair'), + ('nav_venue_theatredrome_valentine_name', 'Theatredrome Valentine'), + ('furni_sofachair_polyfon_desc', 'Loft-style comfort'), + ('poster_83_name', 'Pöllö huhuilee'), + ('furni_soft_sofachair_norja*2_name', 'Black Iced Sofachair'), + ('roomdimmer_furni_limit', 'You can only have one roomdimmer per room'), + ('recycler_progress_timeleft', 'Time left: %hours% h and %minutes% min'), + ('furni_chair_plasto*3_name', 'Chair'), + ('NUF_getting_room_hotelview_tutor', 'Now you will learn how to make your own room. First go to the Guest Rooms area of the Navigator.'), + ('roomevent_create', 'Create'), + ('reg_year', 'Year'), + ('furni_divider_poly3_name', 'Hatch (Lockable)'), + ('furni_divider_nor1*7_name', 'Rural Iced Corner'), + ('furni_rare_beehive_bulb_name', 'Blue Amber Lamp'), + ('furni_waterbowl*2_name', 'Green Water Bowl'), + ('NUF_getting_room_room_hand', 'Open your hand!'), + ('furni_carpet_standard*6_desc', 'Available in a variety of colours'), + ('furni_CF_5_coin_silver_name', 'Silver Coin'), + ('furni_shelves_norja*7_name', 'Rural Iced Bookcase'), + ('opening_hours_text_disabled', 'The Hotel is shutting down really soon. To avoid confusion, purchasing of furniture, Habbo Club and game tickets have been disabled, as well as playing games and furniture trading. Try again tomorrow when the hotel is open!'), + ('nav_venue_bb_lobby_5_name', 'Battle Ball Kaikille'), + ('game_bs_congrat', 'Congratulations!'), + ('furni_arabian_tray2_name', 'Candle Tray'), + ('furni_giftflowers_desc', 'Guaranteed to stay fresh'), + ('club_button_1_period', 'Buy 1 >>>'), + ('furni_bed_polyfon_one*2_desc', 'Black Mode Single Bed'), + ('poster_47_name', 'Small silver star'), + ('furni_divider_nor3*5_desc', 'Pink Iced gate'), + ('furni_sofachair_polyfon_girl_desc', 'Think pink'), + ('furni_pura_mdl5*8_name', 'Yellow Pura Module 5'), + ('furni_hal_cauldron_desc', 'Eye of Habbo and toe of Mod!'), + ('poster_1006_name', 'Hoot Poster'), + ('furni_carpet_valentine_name', 'Red carpet'), + ('furni_floortile_name', 'Floor Tile'), + ('furni_divider_nor1*4_name', 'Urban Iced Corner'), + ('furni_bardeskcorner_polyfon*12_desc', 'Tuck it away'), + ('furni_table_plasto_bigsquare*3_desc', 'Hip plastic furniture'), + ('furni_traffic_light*6_desc', 'Chill and wait your turn!'), + ('club_general_prepaid', 'Prepaid Months'), + ('wallitem_val_heart_desc', 'Heartbroken... without your love!'), + ('furni_pura_mdl3*7_desc', 'Any way you like it!'), + ('furni_sound_set_58_name', 'RnB Grooves 4'), + ('furni_china_shelve_name', 'Chinese Lacquer Bookshelf'), + ('furni_divider_silo1*5_desc', 'Pink Area Corner Shelf'), + ('nav_venue_sw_lobby_tournament_desc', 'For stand-alone Tournaments.'), + ('furni_divider_silo2_name', 'Screen'), + ('furni_plant_mazegate_name', 'Maze Shrubbery Gate'), + ('poster_509_desc', 'The flag of Jamaica'), + ('furni_soft_sofachair_norja*9_name', 'Red Iced Sofachair'), + ('nav_venue_sw_arena_intermediate_name(0)', 'Playing intermediate game'), + ('furni_barchair_silo*4_name', 'Beige Bar Stool'), + ('furni_scifidoor*7_name', 'Aqua Spaceship Door'), + ('furni_CF_10_coin_gold_desc', 'Worth 10 Credits'), + ('furni_glass_sofa*8_desc', 'Translucent beauty'), + ('jukebox_reset', 'Reset Jukebox'), + ('nav_venue_sw_lobby_intermediate_desc', 'For the accomplished Snow Stormers.'), + ('furni_spotlight_desc', 'For the star of the show'), + ('furni_couch_norja_name', 'Bench'), + ('furni_romantique_divan*3_name', 'Turquoise Romantique Divan'), + ('furni_sleepingbag*7_desc', 'Ultimate coziness'), + ('roomatic_pws2', '24 hour access:'), + ('wallitem_jp_sheet1_desc', 'jp_sheet1'), + ('furni_table_silo_med*2_desc', 'Wipe clean and unobtrusive'), + ('furni_glass_table_desc', 'Translucent beauty'), + ('poster_502_desc', 'The US flag'), + ('pet_enrg_10', 'Mad'), + ('gs_scores_team_2', 'Blue Team:'), + ('pet_enrg_11', 'Nutcase'), + ('gs_scores_team_1', 'Red Team:'), + ('furni_cn_sofa_desc', 'Seating,Oriental style!'), + ('gs_scores_team_4', 'Green Team:'), + ('gs_scores_team_3', 'Yellow Team:'), + ('furni_table_silo_med*9_desc', 'Red Area Coffee Table'), + ('furni_hc_machine_name', 'Weird Science Machine'), + ('callhelp_writeyour', 'Write your question about Habbo Hotel here:'), + ('furni_table_silo_small*5_name', 'Pink Area Occasional Table'), + ('nav_addtofavourites', 'Add to favourites'), + ('furni_table_plasto_round*15_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_tournament_4_name', 'Competitie Battle Ball 5'), + ('furni_birdie_name', 'Pop-up Egg'), + ('furni_table_plasto_bigsquare_desc', 'Hip plastic furniture'), + ('furni_sound_set_33_desc', 'Guitar solo set'), + ('furni_romantique_divider*3_desc', 'Keeping things separated'), + ('furni_bed_budget*1_name', 'Aqua Pura Double Bed'), + ('furni_rare_beehive_bulb*2_desc', 'A honey-hued glow'), + ('furni_theatre_seat_desc', 'For Lazy boys and girls!'), + ('furni_hc_lmpst_desc', 'Somber and atmospheric'), + ('furni_divider_nor5*6_name', 'Blue Iced Angle'), + ('furni_summer_pool*2_desc', 'Fancy a dip?'), + ('poster_12_desc', 'a beautiful sunset'), + ('furni_carpet_polar*2_desc', 'Snuggle up on a Funky bear rug...'), + ('furni_md_rug_desc', 'Bubbles under your steps'), + ('Alert_InviteFriend', 'Invite your friends'), + ('nav_venue_bb_lobby_intermediate_4_name', 'Semi-profs Battle Ball 5'), + ('furni_hockey_score_desc', '...for keeping your score'), + ('furni_gothic_chair*3_name', 'Red Gothic Chair'), + ('wallitem_sw_stone_name', 'sw_stone'), + ('furni_pillow*7_name', 'Purple Velvet Pillow'), + ('nav_popup_header', 'Recommended rooms'), + ('nav_venue_sw_lobby_beginner_0_name', 'Snow Rookies Lobby'), + ('furni_table_norja_med*5_desc', 'For larger gatherings'), + ('furni_red_tv_name', 'Portable TV'), + ('reg_promise', '*Any personal information you supply will only be used by Habbo Ltd in accordance with the Habbo Pledge and will not be shared with third parties.'), + ('room_badge_choose', 'Modify Badge:'), + ('furni_table_plasto_square*15_desc', 'Hip plastic furniture'), + ('furni_sound_set_48_desc', 'Sweet party beat'), + ('nav_venue_ballroom_name', 'Ballroom'), + ('pet.hotwords.bad', 'bad'), + ('poster_55_desc', 'Save our trees!'), + ('furni_glass_chair_name', 'Glass chair'), + ('furni_prizetrophy5*2_desc', 'Shiny silver'), + ('furni_divider_poly3*4_desc', 'Beige Mode Bardesk Gate'), + ('tutorial_console_sample_message', 'Hello! This is a message sent to you from the Habbo Tutorial. To close and delete this message click delete. Sadly you cannot reply to this message as it is automated. Normally you can reply to messages by clicking the reply button.'), + ('furni_s_sound_machine*5_name', 'Sound Machine Brown'), + ('furni_divider_nor4*9_desc', 'Habbos, roll out!'), + ('furni_pura_mdl3*4_desc', 'Any way you like it!'), + ('NUF_getting_room_room_tutor', 'Tada! Nice room, although it\'s a little empty. Hey! Let\'s furnish it with something./nOpen your hand to check what you have, (if you have done this step before then you won\'t receive anything).'), + ('furni_fortune_desc', 'Gaze into the future'), + ('furni_soft_sofa_norja_name', 'iced sofa'), + ('furni_pura_mdl1*2_desc', 'Any way you like it!'), + ('nav_venue_sw_lobby_free_6/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('furni_divider_nor3*8_name', 'Yellow Iced gate'), + ('gs_title_finalscores', 'Final Standings:'), + ('gs_error_10', 'The hotel is closed or about to close. We look forward to welcoming you back tomorrow at (ADD LOCAL OPENING TIME).'), + ('furni_plant_bonsai_name', 'Bonsai Tree'), + ('furni_jukebox*1_name', 'Jukebox'), + ('room_loading', 'Loading room...'), + ('furni_hc_crpt_desc', 'Ultimate craftsmanship'), + ('furni_rare_hammock_desc', 'Eco bed'), + ('NUF_mini_use_console', 'Learn about messaging'), + ('furni_romantique_chair*1_desc', 'Elegant seating for elegant Habbos'), + ('transaction_system_bank_digiraha', 'Digiraha'), + ('NUH_messenger', 'Open your Console here - you might have messages or friend requests waiting.'), + ('furni_arabian_chair_desc', 'Exotic, soft seating'), + ('furni_noob_chair*6_name', 'My first Habbo chair'), + ('poster_510_desc', 'The flag of Italy'), + ('furni_carpet_standard*a_desc', 'Available in a variety of colours'), + ('queue_set.c.info', 'There are %c% Habbo Club member(s) in front of you. Be patient :)'), + ('furni_scifiport*4_name', 'Pink Sci-Fi Port'), + ('furni_sound_set_44_name', 'Graveyard Portal'), + ('furni_pura_mdl4*1_desc', 'Any way you like it!'), + ('furni_divider_silo3*6_desc', 'Blue Area Gate'), + ('furni_sound_machine*4_name', 'Blue Traxmachine'), + ('send_invitation_header', 'Get a warm welcome'), + ('game_TicTacToe', 'Boter kaas en eieren'), + ('nav_venue_sw_lobby_tournament_1_name', 'Tournament Lobby'), + ('furni_rare_fan*2_name', 'Green Powered Fan'), + ('furni_doormat_plain*2_name', 'Doormat'), + ('furni_table_plasto_square*7_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_intermediate_8/0_desc', ''), + ('furni_noob_table*6_desc', 'Lightweight, practical and green'), + ('win_callforhelp', 'Alert a Moderator'), + ('furni_prizetrophy8*1_desc', 'Glittery gold'), + ('furni_chair_norja*5_name', 'Pink Chair'), + ('furni_hc_tv_desc', 'Forget plasma, go HC!'), + ('furni_divider_arm1_name', 'Corner plinth'), + ('furni_table_plasto_round*7_name', 'Round Dining Table'), + ('furni_petfood3_name', 'Cabbage Mega Multipack'), + ('furni_carpet_standard*9_name', 'Floor Rug'), + ('opening_hours_title', 'Hotel Maintenance'), + ('console_noemail', 'Sorry,'), + ('furni_couch_norja*8_name', 'Yellow Bench'), + ('furni_s_sound_machine*1_desc', 'Sound Machine Grey Desc'), + ('furni_noob_stool*6_name', 'My first Habbo stool'), + ('purse_event', 'ACTIVITY'), + ('reg_readterms_alert', 'You have to read the Terms and Conditions\\r(scroll to the bottom of the text).'), + ('pet.hotwords.beg', 'beg'), + ('furni_jp_drawer_name', 'Japanese Drawer'), + ('gs_state_started', 'This Game has already started...'), + ('furni_sound_set_11_name', 'Dance 4'), + ('furni_divider_nor2*4_name', 'Urban Iced Bar'), + ('queue_set.e2.info', 'There are %e2% Habbos in front of you in the queue.'), + ('furni_bath_name', 'Bubble Bath'), + ('furni_rare_icecream*3_desc', 'Virtual blackcurrant rocks!'), + ('nav_modify_nameoftheroom', 'Name Of The Room'), + ('furni_scifiport*1_desc', 'Energy beams. No trespassers!'), + ('nav_venue_bb_lobby_amateur_12/0_desc', ''), + ('furni_table_silo_small*8_name', 'Yellow Occasional Table'), + ('furni_divider_silo3*3_name', 'White Area Gate'), + ('nav_venue_sw_lobby_amateur_7/0_desc', 'Astetta rankempaa lumisotaa.'), + ('reply', 'Reply'), + ('furni_toilet_yell_desc', 'Loo Seat'), + ('hobba_alert', 'Moderator Alert'), + ('You can play a bunch of exciting games, visit your friends\' rooms or even make your own place and decorate it to your heart\'s delight.', ''), + ('pet.saying.eat.croco.4', '*Buurrrrp*'), + ('furni_tree5_desc', 'Any presents under it yet?'), + ('pet.saying.eat.croco.2', '*Chomp chomp*'), + ('pet.saying.eat.croco.3', 'Mmmm mmmmm....'), + ('furni_divider_poly3*7_name', 'Green Mode Bardesk Gate'), + ('pet.saying.eat.croco.0', 'Mmmm yum yum'), + ('pet.saying.eat.croco.1', 'Ruff ruff ruff'), + ('furni_scifidoor*4_name', 'Emerald Spaceship Door'), + ('furni_edice_name', 'Holo-dice'), + ('furni_divider_nor4*6_name', 'Blue Iced Auto Shutter'), + ('furni_safe_silo*3_desc', 'Totally shatter-proof!'), + ('furni_table_silo_small_desc', 'For those random moments'), + ('gs_header_page', 'Page'), + ('furni_sporttrack3*2_name', 'Sport goal asphalt'), + ('furni_pura_mdl2*6_desc', 'Any way you like it!'), + ('furni_hcamme_name', 'Tubmaster'), + ('furni_carpet_soft*2_desc', 'Soft Wool Rug'), + ('furni_sound_set_12_name', 'Habbo Sounds 2'), + ('forgottenpw_done', 'If the email you gave during registration was correct, your password will be sent to you now.'), + ('navigator.no_category', 'No Category'), + ('login_whatsHabboCalled', 'What\'s your Habbo called?'), + ('furni_scifidoor*3_name', 'Lightblue Spaceship Door'), + ('game_poker', 'POKER'), + ('roomatic_pws', 'Password for selected'), + ('furni_glass_table*8_name', 'Glass table'), + ('furni_one_way_door*8_desc', 'One at a time!'), + ('furni_bardesk_polyfon*9_desc', 'Perfect for work or play'), + ('nav_venue_bb_lobby_tournament_13_name', 'Competitie Battle Ball 14'), + ('pet.hotwords.sit', 'sit'), + ('furni_arabian_tray3_desc', 'Indulge yourself!'), + ('furni_sound_set_40_desc', 'Dude? Cheese!'), + ('console_compose', 'Compose A Message'), + ('furni_table_plasto_square*3_name', 'Square Dining Table'), + ('furni_rclr_sofa_name', 'Polar Sofa'), + ('poster_2005_name', 'Infobus'), + ('furni_table_plasto_4leg*9_name', 'Occasional Table'), + ('furni_chair_norja*9_desc', 'Sleek and chic for each cheek'), + ('Room', 'Room:'), + ('furni_chair_plasty*2_name', 'Plastic Pod Chair'), + ('furni_romantique_pianochair*3_name', 'Turquoise Romantique Piano Chair'), + ('furni_rare_parasol*2_name', 'Orange Parasol'), + ('loading_project', 'Loading Habbo Hotel...'), + ('poster_505_name', 'The Maple Leaf'), + ('furni_traffic_light*2_desc', 'Chill and wait your turn!'), + ('nav_venue_sw_lobby_amateur_4_name', 'Snow Slingers Lobby'), + ('furni_grunge_shelf_name', 'Grunge Bookshelf'), + ('furni_sofa_polyfon*8_name', 'Yellow Mode Sofa'), + ('furni_doorC_desc', 'In a hurry?'), + ('roomatic_nomatch', 'Sorry. Your passwords don\'t match. Please enter them again.'), + ('furni_soft_sofa_norja*9_name', 'Red Iced Sofa'), + ('nav_venue_tv_studio_general/0_desc', 'Suosikki rules! Musaa, leffoja ja staroja!'), + ('nav_venue_sw_arena_amateur_name', 'Playing amateur game'), + ('interface_icon_events', 'Open the room event browser'), + ('furni_grunge_table_desc', 'Students of the round table!'), + ('furni_wooden_screen*9_name', 'Green Oriental Screen'), + ('NUF_getting_room_hotelview_nav', 'Click to open the Navigator.'), + ('furni_table_silo_med*5_name', 'Pink Area Coffee Table'), + ('furni_divider_silo1*9_name', 'Red Area Small Table'), + ('nav_venue_bb_lobby_amateur_4_name', 'Gevorderden Battle Ball 5'), + ('room_badge_hidden', 'Hidden'), + ('pet.saying.generic.cat.0', 'meow'), + ('furni_marquee*3_desc', 'It\'s both door and a shade!'), + ('pet.saying.generic.cat.1', 'meow...meOW'), + ('nav_venue_cunning_fox_gamehall/4_name', 'Chess'), + ('furni_present_gen_desc', 'What\'s inside?'), + ('pet.saying.generic.cat.2', 'muew..muew'), + ('pet.saying.generic.cat.3', 'Purrrrrrrrrr'), + ('furni_scifidoor*1_desc', 'There out of this world!'), + ('pet.saying.generic.cat.4', 'Purrrrr oow'), + ('furni_fridge_name', 'Pura Refridgerator'), + ('furni_rubberchair*2_name', 'Pink Inflatable Chair'), + ('furni_romantique_chair*4_name', 'Amber Chair'), + ('bb_fieldname_5', 'Barebones Classic'), + ('furni_sofa_silo*7_desc', 'Green Area Sofa'), + ('bb_fieldname_4', 'Gothic Hallway'), + ('furni_prizetrophy6*2_name', 'Champion trophy'), + ('bb_fieldname_3', 'Maze Park'), + ('bb_fieldname_2', 'Coral Beach'), + ('bb_fieldname_1', 'Sky Peak'), + ('furni_safe_silo_pb_name', 'postbank Safe'), + ('furni_solarium_norja*2_desc', 'Rejuvenate your pixels!'), + ('furni_table_plasto_bigsquare*7_desc', 'Hip plastic furniture'), + ('reg_check_age', 'Age'), + ('furni_exe_chair2_desc', 'You\'re fired!'), + ('furni_typingmachine_name', 'Typewriter'), + ('human_carrying', 'Carrying:'), + ('furni_grunge_sign_name', 'Road Sign'), + ('loading', 'Loading...'), + ('furni_bed_polyfon_one*6_name', 'Blue Mode Single Bed'), + ('furni_bed_budget_one*1_desc', 'Prince sized comfort!'), + ('furni_sofa_polyfon_name', 'Two-seater Sofa'), + ('furni_jp_lantern_desc', 'For a mellow Eastern glow'), + ('furni_gothic_stool*2_name', 'Golden Gothic Stool'), + ('roomevent_starttime', 'Started at:'), + ('furni_prize1_desc', 'Gorgeously glittery'), + ('furni_prizetrophy9*1_name', 'Champion trophy'), + ('wallitem_guitar_skull_desc', 'tilulilulaa'), + ('gs_title_bestplayer', 'Best player:'), + ('nav_removefavourites', 'Remove from favourites'), + ('furni_toy1_desc', 'it\'s bouncy-tastic'), + ('alert_shortenPW', 'Your password cannot be longer than 9 characters'), + ('normal_roomlayouts', '<< Back to normal room layouts'), + ('furni_noob_rug*1_name', 'My first Habbo rug'), + ('poster_58_name', 'Red knots poster'), + ('furni_divider_nor2*8_desc', 'Yellow Iced bar desk'), + ('furni_carpet_polar*1_name', 'Pink Faux-Fur Bear Rug'), + ('habboclub_continue_button', 'Buy one month'), + ('furni_divider_silo3_desc', 'Form following function'), + ('furni_sound_set_7_name', 'SFX 5'), + ('furni_soft_sofa_norja*5_desc', 'Pink Iced Sofa'), + ('furni_arabian_rug_desc', 'Green blossom design'), + ('restart_tutorial', 'Restart tutorial'), + ('gs_choose_numteams', 'Choose number of Teams:'), + ('hubu_info_t', 'The big FRANK Infobus'), + ('furni_divider_nor5*7_desc', 'Cool cornering for your crib!'), + ('furni_bed_polyfon*4_name', 'Beige Mode Double Bed'), + ('callhelp_allwillreceive', 'A member of community staff will investigate the situation and take appropriate action. This may include sending you a response with advice on dealing with your issue.'), + ('furni_pura_mdl4*4_name', 'White Pura Module 4'), + ('hubu_odotetaan', 'Waiting for replies from others...'), + ('furni_door_name', 'Telephone Box'), + ('furni_doormat_plain*5_desc', 'Available in a variety of colours'), + ('furni_gothic_carpet_desc', 'The path less travelled'), + ('poster_516_desc', 'Eng-er-land'), + ('furni_gothic_stool*6_desc', 'The dark side of Habbo'), + ('furni_traffic_light*3_desc', 'Chill and wait your turn!'), + ('furni_bartable_armas_desc', 'Bar-Style Table - essential for extra guests'), + ('club_isp_change', 'Change your subscription'), + ('furni_summer_grill*2_name', 'Red Barbeque Grill'), + ('poster_23_desc', 'flap, flap, screech, screech...'), + ('furni_prizetrophy7*3_desc', 'Bronze Habbo trophy'), + ('furni_couch_norja*2_name', 'Black Bench'), + ('nav_venue_cunning_fox_gamehall/0_desc', 'Pit your wits on the battlefield, the board or the baize - choose what to play here'), + ('furni_jp_tatami2_name', 'Large Tatami Mat'), + ('furni_pura_mdl3*3_desc', 'Any way you like it!'), + ('furni_house_name', 'Gingerbread House'), + ('furni_sound_set_54_name', 'Oh Blinging Tree'), + ('furni_table_plasto_4leg*1_name', 'Square Dining Table'), + ('furni_pillow*1_name', 'Pink Fluffy Pillow'), + ('NUF_console_hotelview_tutor', 'Oh! You have a message on your Habbo Console. Let\'s see who it is.'), + ('LoadingRoom', 'Loading room...'), + ('rotate', 'Rotate'), + ('nav_venue_sw_lobby_beginner_6_name', 'Snow Rookies Lobby'), + ('nav_venue_bb_lobby_amateur_1/0_desc', ''), + ('furni_jukebox_ptv*1_desc', 'Jukebox Pacha TV'), + ('nav_venue_star_lounge/0_desc', 'Chat with Sean Kingston here!'), + ('furni_chair_plasty*6_desc', 'Hip plastic furniture'), + ('nav_venue_bb_lobby_tournament_10/0_desc', ''), + ('NUF_mini_use_console_hotelview_tutor', 'Ah! You have a message on your Habbo Console. Let\'s see who it is.'), + ('furni_rare_xmas_screen_name', 'Lappland Greetings'), + ('summer_chair_9_name', 'Red Deck Chair'), + ('club_timefull', 'Sorry, you can only buy up to three months of Habbo Club subscription in advance.'), + ('poster_2002_desc', 'Presidentin muotokuva'), + ('poster_7_name', 'Hammer Cabinet'), + ('furni_gothic_chair*2_name', 'Golden Gothic Chair'), + ('bb_header_powerups', 'Powerups in game:'), + ('credit_redeem_url', 'http://%predefined%//help/19'), + ('furni_divider_silo3*2_name', 'Black Area Gate'), + ('furni_chair_plasto*16_name', 'Chair'), + ('catalog_itsurs', 'Yay! It\'s being delivered now..'), + ('hobba_pickandreply', 'Pick & Reply'), + ('reg_terms', 'Welcome to Habbo Hotel. If you are under 16, please check the Terms and Conditions with your parents/guardian before you agree to them. Get them to explain anything that you don\'t understand.\\rIn order to use the service you have to give valid information about yourself when registering. Please email us if any of your user information changes.\\rAs a user of Habbo Hotel - www.habbohotel.co.uk , you have to behave according to the Habbo Way (hotel rules) and the Terms and Conditions. Click the links below to read about them.\\rNever give your password or email address to anyone. If you do, your Habbo may get stolen.\\rRegistering with the hotel, making your own empty room and chatting is free of charge. For a small fee you can decorate your room with virtual furniture, play games and join the Habbo Club. If you wish to buy, you will need your parent\'s permission to do so.'), + ('furni_summer_pool*1_name', 'Blue Summer Pool'), + ('furni_heartsofa_desc', 'Perfect for snuggling up on'), + ('furni_scifiport*3_name', 'Jade Sci-Fi Port'), + ('furni_glass_chair*6_name', 'Blue Glass Chair'), + ('furni_sound_set_62_name', 'Alhambra Trax 1'), + ('win_voucher', 'Habbo Credit Code'), + ('furni_summer_chair*4_desc', 'White'), + ('furni_bed_polyfon_one_desc', 'Cot of the artistic'), + ('nav_venue_bb_lobby_tournament_5/0_desc', ''), + ('nav_venue_bb_lobby_beginner_3_name', 'Beginners Battle Ball 4'), + ('console_follow_not_friend', 'The user you tried to follow is not your friend anymore.'), + ('delete', 'Delete'), + ('furni_grunge_mattress_desc', 'Beats sleeping on the floor!'), + ('furni_rare_icecream*7_name', 'Chocolate Ice Cream Machine'), + ('sound_machine_alert_no_disks', 'You don\'t have any more discs!'), + ('furni_sofachair_silo_name', 'Armchair'), + ('nav_venue_sw_lobby_expert_0_name', 'Snow Marksmen Lobby'), + ('game_waitop', 'WAITING FOR THE OPPONENT'), + ('Alert_NameAlreadyUse', 'That name is already being used'), + ('furni_queue_tile1*1_desc', 'The power of movement'), + ('poster_18_name', 'Butterfly Cabinet 2'), + ('furni_wooden_screen*6_desc', 'Add an exotic touch to your room'), + ('furni_noob_table*2_name', 'My first Habbo table'), + ('furni_tree1_name', 'Dead tree'), + ('nav_venue_bouncer_room_0_name', 'Battle Ball Competitie Arena'), + ('furni_traffic_light*5_name', 'White Traffic Light'), + ('furni_sw_raven_name', 'Mrs Raven'), + ('cam_shoot.help', 'Shutter Release'), + ('furni_grand_piano*3_desc', 'Make sure you play in key!'), + ('nav_venue_sw_lobby_intermediate_2_name', 'Snow Bombardiers Lobby'), + ('interface_icon_purse', 'Purse, manage your coins'), + ('poll_alert_server_error', 'The poll isn\'t available anymore. Polls are only available at a certain public space for a certain duration.'), + ('sound_machine_confirm_delete_long', 'Are you sure you want to delete the selected song?'), + ('reg_check_confirm', 'Please check that your information is correct, especially your birthdate and Habbo name. You CANNOT change these later. If you want make any changes now, press the back button.'), + ('Alert_CheckBirthday', 'Please check your birthday'), + ('furni_shelves_norja*4_desc', 'For nic naks and tech books'), + ('club_expired_link', 'Click here to join Habbo Club'), + ('poster_520_desc', 'Every colour for everyone'), + ('nav_venue_bb_lobby_intermediate_desc', 'Intermediate battle ball!'), + ('tutorial_restart_button_bubble', 'Remember! Anytime you want to relive the fun click here to restart the tutorial!'), + ('poster_1_name', 'Comedy Poster'), + ('reg_verification_incorrectBirthday', 'Your birthday was incorrect'), + ('furni_glass_stool*6_name', 'Blue Glass Stool'), + ('furni_CFC_100_coin_gold_desc', 'Worth 100 Credits'), + ('buddyremove_list_full', 'Your friends list is full, you can\'t add new friends until you delete some. \\r\\The maximum number of friends you can have, is %mylimit% Habbos. Members of Habbo Club can have up to %clublimit% friends on their list.'), + ('furni_bunny_name', 'Squidgy Bunny'), + ('furni_small_chair_armas_name', 'Stool'), + ('nav_venue_sw_lobby_free_0/0_desc', ''), + ('furni_sofachair_silo*3_name', 'White Armchair'), + ('furni_sound_machine*2_desc', 'Dance to the Habbo Club beat!'), + ('nav_venue_gate_park/0_desc', 'Follow your path...'), + ('NUF_mini_use_console_hotelview_icon', 'Click the icon to open your Habbo Console.'), + ('nav_venue_eric\'s_eaterie/0_desc', 'Join Eric for a bite to eat'), + ('furni_table_silo_med*8_desc', 'Wipe clean and unobtrusive'), + ('poster_503_desc', 'There\'s no holes in this...'), + ('furni_bardeskcorner_polyfon*9_name', 'Red Corner Desk'), + ('furni_val_randomizer_desc', 'Surprise surprise! (Cilla Black not included)'), + ('furni_marquee*2_name', 'Red Dragon Marquee'), + ('furni_table_plasto_round_name', 'Round Dining Table'), + ('furni_summer_chair*3_name', 'Deck Chair'), + ('club_paycoins', 'Buy subscription'), + ('nav_venue_beauty_salon_general/0_desc', 'Join in the fun of Fashion Week! Check the homepage now for details.'), + ('furni_rare_dragonlamp*7_name', 'Sky Dragon Lamp'), + ('nav_venue_bb_lobby_beginner_6/0_desc', ''), + ('roomevent_quit', 'End event'), + ('console_search_habbo_lasthere', 'Last time'), + ('trading_title', 'Safe Trading'), + ('furni_glass_chair*7_desc', 'Habbo Club'), + ('gs_error_game_deleted', 'The Game has been deleted.'), + ('recycler_info_link_url', 'http://%predefined%/help/36'), + ('furni_pillar*6_name', 'Terracotta Pillar'), + ('furni_tile_stella_desc', '10% off the walk of fame!'), + ('transaction_system_sms_win_tmobile', 'T-Mobile SMS'), + ('buddyremove_names_ordered', 'Names Ordered By:'), + ('pet_race_2_010', 'Giggly Go-go'), + ('furni_table_plasto_bigsquare*6_name', 'Square Dining Table'), + ('pet_race_2_011', 'Petty Petsuchos'), + ('summer_chair_6_name', 'Blue Deck Chair'), + ('console_now', 'now:'), + ('gs_skill_changed', 'You have advanced to the next skill level. Your level is now %1!'), + ('roomatic_goyourroom', 'Go to your room'), + ('furni_carpet_soft*4_name', 'Soft Wool Rug'), + ('sound_machine_confirm_close_list', 'Close playlist editor?'), + ('pet.hotwords.good', 'good'), + ('furni_pura_mdl4*7_desc', 'Any way you like it!'), + ('furni_carpet_soft*1_name', 'Soft Wool Rug'), + ('furni_sound_set_22_desc', 'With a hamper full of sounds, not sarnies'), + ('nav_venue_sw_lobby_tournament_7_name', 'Tournament Lobby'), + ('furni_divider_nor3*6_desc', 'Blue Iced gate'), + ('furni_carpet_standard*3_name', 'Floor Rug'), + ('people', 'People'), + ('pet_race_2_007', 'Pretty Pui Pui'), + ('pet_race_2_008', 'Indifferent'), + ('pet_race_2_009', 'Swampy Siamese'), + ('furni_wcandle_name', 'White Candle'), + ('furni_sporttrack1*1_desc', 'null'), + ('furni_solarium_norja*1_name', 'Black Solarium'), + ('NUF_playing_games_gamecategories_tutor', 'Click the Beginner category to open it wide open. Like a melon!'), + ('pet_race_2_003', 'Silly Sobek'), + ('pet_race_2_004', 'Dirty Dundee'), + ('pet_race_2_005', 'Galled Gator'), + ('int_credits', 'Credits'), + ('furni_gothrailing_name', 'Gothic Railing'), + ('furni_sporttrack2*2_desc', 'null'), + ('pet_race_2_006', 'Confused Croc'), + ('furni_shelves_polyfon_name', 'Bookcase'), + ('pet_race_2_000', 'Endangered Albino'), + ('pet_race_2_001', 'Krazy Krokodilos'), + ('pet_race_2_002', 'Nile Dile'), + ('furni_divider_nor2*2_desc', 'Black Iced bar desk'), + ('log_problem_text', 'Oops.. Cannot connect to Habbo Hotel'), + ('furni_divider_nor2*5_desc', 'Pink Iced bar desk'), + ('nav_venue_sw_lobby_amateur_6/0_desc', 'Astetta rankempaa lumisotaa.'), + ('furni_rare_fountain_desc', 'For our feathered friends'), + ('furni_glass_sofa*5_name', 'Glass sofa'), + ('poster_33_desc', 'We can\'t bear to lose them'), + ('nav_venue_bb_lobby_tournament_14/0_desc', ''), + ('furni_summer_chair*6_name', 'Deck Chair'), + ('furni_hcsohva_desc', 'For royal bottoms...'), + ('furni_bed_budget*4_desc', 'King sized comfort!'), + ('furni_christmas_poop_desc', 'Bob?s magical fertilizer'), + ('furni_pura_mdl5*7_name', 'Green Pura Module 5'), + ('furni_barrier*1_desc', 'No escape this way!'), + ('nav_venue_bb_lobby_amateur_8/0_desc', ''), + ('furni_divider_arm2_desc', 'I wooden go there'), + ('furni_chair_plasty*11_desc', 'Hip plastic furniture'), + ('furni_small_table_armas_desc', 'Practical and beautiful'), + ('nav_venue_theatredrome_xmas_name', 'Theatredrome Xmas'), + ('poster_62_name', 'Save The Panda'), + ('reg_verification_currentPassword', 'Current password:'), + ('game_poker_change', 'Choose cards to change'), + ('NUF_getting_items_hotelview_nav', 'Click here to open the Navigator'), + ('furni_chair_basic*9_name', 'Red Pura Egg Chair'), + ('friend_request_failed', 'Failed!'), + ('furni_noob_chair*4_desc', 'Lightweight, practical, with light blue stripes'), + ('furni_table_silo_small*9_desc', 'Red Area Occasional Table'), + ('nav_hotelview', 'Hotel view'), + ('furni_toy1*3_desc', 'it\'s bouncy-tastic'), + ('furni_divider_nor3*2_name', 'Black Iced gate'), + ('furni_chair_silo*6_name', 'Blue Silo Dining Chair'), + ('update_password_suggest', 'Habbo Hotel security supervisor requests you to update your password'), + ('nav_venue_orient_name', 'Club Orient'), + ('Alert_NameTooLong', 'Sorry, that username is too long!'), + ('furni_sound_set_37_name', 'Sound set 37'), + ('furni_barchair_silo*7_desc', 'Practical and convenient'), + ('wallitem_wallmirror_name', 'Wallmirror'), + ('furni_chair_plasty*8_name', 'Plastic Pod Chair'), + ('sound_machine_confirm_close_list_long', 'Are you sure you want to exit playlist editor without saving?'), + ('furni_hc_frplc_name', 'Heavy Duty Fireplace'), + ('dance4', 'The Rollie'), + ('dance3', 'Duck Funk'), + ('furni_glass_stool*9_name', 'Glass stool'), + ('furni_sound_set_55_desc', 'Can you fill me in?'), + ('furni_carpet_standard*7_desc', 'Available in a variety of colours'), + ('poster_4_name', 'Bear Plaque'), + ('cam_zoom_out.help', 'Zoom Out'), + ('furni_sofa_polyfon*2_name', 'Black Mode Sofa'), + ('furni_prizetrophy2*1_name', 'Duck trophy'), + ('furni_scifirocket*3_desc', 'Caution! Unknown Location!'), + ('NUF_getting_items', 'Getting items'), + ('furni_val_teddy*1_desc', 'The grey bear of affection'), + ('furni_sofachair_polyfon*7_name', 'Green Mode Armchair'), + ('club_habbo.bottombar.link.member', '%days% days'), + ('habboclub_confirm_header', 'Subscription costs %price% credits'), + ('furni_rare_daffodil_rug_desc', 'A little bit of outdoors indoors..'), + ('poster_15_name', 'Himalayas Poster'), + ('furni_smooth_table_polyfon_desc', 'For larger gatherings'), + ('dance2', 'Pogo Mogo'), + ('furni_wooden_screen*3_name', 'Aqua Oriental Screen'), + ('furni_plant_cruddy_desc', 'Goodbye Bert...'), + ('dance1', 'Hab-Hop'), + ('furni_gothic_chair*6_desc', 'The dark side of Habbo'), + ('furni_table_plasto_square*9_name', 'Square Dining Table'), + ('nav_venue_bb_lobby_beginner_14/0_desc', ''), + ('furni_club_sofa_desc', 'Club sofa'), + ('roomevent_default_name', 'Event name..'), + ('game_poker_ok', 'Change cards'), + ('nav_venue_picnic_dudesons/0_desc', 'Duudsoneiden sponssaama oma Ranchi - www.extremeduudsonit.com'), + ('nav_venue_hallway/0_desc', 'Beware the ghosts and ghouls!'), + ('nav_venue_park/0_desc', 'Go for a stroll outdoors'), + ('console_fr_declined_count', 'Amount to be declined'), + ('furni_tree4_name', 'Christmas Tree 2'), + ('NUF_console_read_link', 'Click the link to open the message.'), + ('win_figurecreator', 'Habbo Details'), + ('furni_table_plasto_square*14_name', 'Occasional Table'), + ('furni_soft_sofachair_norja*6_desc', 'Blue Iced Sofachair'), + ('nav_venue_bb_lobby_beginner_0_name', 'Beginner'), + ('Alert_LogoNameAlreadyUse', 'That name is already being used'), + ('poster_25_name', 'Snowman Poster'), + ('furni_pura_mdl2*2_name', 'Pink Pura Module 2'), + ('furni_chair_plasto*13_name', 'Chair'), + ('furni_ticket_name', 'Small Ticket Bundle'), + ('furni_hc_lmpst_name', 'Victorian Street Light'), + ('furni_scifiport*7_desc', 'Energy beams. No trespassers!'), + ('jukebox_load_trax', 'Load Trax'), + ('furni_val_teddy*4_desc', 'The brown bear of naughtiness'), + ('reg_birthdayformat_update', 'Birthday (dd.mm.yyyy)'), + ('nav_venue_the_chromide_club_name', 'The Chromide Club'), + ('roomevent_not_available', 'Sorry, no events available'), + ('nav_venue_sw_lobby_beginner_0/0_desc', ''), + ('summer_chair_3_name', 'Black Deck Chair'), + ('int_newrequests', 'Friend Request(s)'), + ('console_profile_helptext', 'The Habbo Profile is a snapshot of your interests and hobbies - simply tick the things you like.'), + ('nav_roomnfo_hd_fav', 'Favourite Rooms'), + ('furni_chair_plasto*3_desc', 'Hip plastic furniture'), + ('furni_chair_basic*6_name', 'Blue Pura Egg Chair'), + ('number_4', '4'), + ('number_3', '3'), + ('number_2', '2'), + ('room_open_package', 'Open The Present'), + ('furni_grunge_barrel_name', 'Flaming Barrel'), + ('wallitem_photo_desc', 'Photo from Habbo'), + ('poster_30_desc', 'Pucker up'), + ('furni_glass_table*9_desc', 'Translucent beauty'), + ('nav_venue_sw_lobby_beginner_3_name', 'Snow Rookies Lobby'), + ('Alert_YouAreBanned', 'You have been banned for breaking the Habbo Way. This is why (if no ban reason is shown use the Contact Us form):'), + ('furni_gothic_sofa*2_name', 'Golden Gothic Sofa'), + ('NUF_getting_items_hotelview_tutor', 'Let us find out how to purchase items from the Hotel Catalogue. The Catalogue contains loads of cool stuff to decorate your Habbo room with. To begin open the Navigator.'), + ('furni_table_norja_med*2_desc', 'For larger gatherings'), + ('furni_sofa_silo*3_name', 'White Two-Seater Sofa'), + ('furni_pura_mdl5*5_desc', ''), + ('nav_venue_sw_lobby_beginner_desc', 'Yes, take a load of snowballs and hit the enemy Teams. Easy, isn\'t it?'), + ('furni_romantique_smalltabl*5_name', 'Onyx Tray Table'), + ('furni_divider_nor4_desc', 'Habbos, roll out!'), + ('furni_shelves_norja*7_desc', 'For nic naks and cookery books'), + ('nav_venue_sw_lobby_intermediate_4/0_desc', 'Lumisota sen kuin vain kovenee.'), + ('gs_text_spectate', 'You can watch this game'), + ('recycler_info_link', 'More information about Furni Recycler'), + ('furni_sofachair_polyfon_name', 'Armchair'), + ('club_intro_text', 'Members of Habbo Club get LOTS of cool stuff!\\rWith Habbo Club you get cool dances, access to Club Mammoth and The Blue Dragon Tavern, and a 500 limit on your friends list!'), + ('furni_divider_nor1*7_desc', 'The missing piece'), + ('url_helppledge', 'http://%predefined%//help/22'), + ('jukebox_song_name', '%name%'), + ('game_bs_won', 'WON!'), + ('furni_soft_jaggara_norja_name', 'Iced Sofachair'), + ('furni_rare_beehive_bulb_desc', 'A honey-hued glow'), + ('furni_chair_norja*8_name', 'Yellow Chair'), + ('poster_83_desc', 'Pöllö huhuilee, huhuu!'), + ('floodblocking', 'You are typing too fast - don\'t flood the room.'), + ('furni_CF_5_coin_silver_desc', 'Worth 5 Credits'), + ('sound_machine_confirm_clear', 'Clear the song?'), + ('furni_carpet_standard*6_name', 'Floor Rug'), + ('furni_waterbowl*2_desc', 'Aqua unlimited'), + ('sw_link_tournament_highScores_url', 'http://%predefined%//groups/56553/id'), + ('NUF_meeting_people_room_tutor', 'This is a Public Room. Your Habbo is in the doorway beneath the orange arrow. Click on another user to find out more about them.'), + ('furni_bottle_name', 'Empty Spinning Bottle'), + ('poster_512_name', 'The Irish flag'), + ('club_info_url', 'http://%predefined%//credits/habboclub'), + ('nav_venue_tv_studio_nike/0_desc', ''), + ('furni_couch_norja*6_desc', 'Two can perch comfortably'), + ('furni_pura_mdl5*8_desc', 'Any way you like it!'), + ('furni_carpet_valentine_desc', 'For making an appearance'), + ('furni_floortile_desc', 'In Variety of Colours'), + ('furni_pillar*9_name', 'Rock Pillar'), + ('furni_table_plasto_bigsquare*3_name', 'Square Dining Table'), + ('furni_bardeskcorner_polyfon*12_name', 'Corner Cabinet/Desk'), + ('furni_divider_nor1*4_desc', 'The missing piece'), + ('furni_chair_plasty*5_name', 'Plastic Pod Chair'), + ('furni_scifirocket*0_desc', 'See in 2007 with a bang!'), + ('poster_32_name', 'Siva Poster'), + ('club_button_2_period', 'Buy 3 >>>'), + ('furni_sound_set_58_desc', 'Sh-shake it!'), + ('furni_china_shelve_desc', 'To hold the mind\'s treasures'), + ('furni_scifidoor*7_desc', 'There out of this world!'), + ('furni_chair_silo*9_name', 'Red Silo Dining Chair'), + ('furni_gothic_stool*5_name', 'Green Gothic Stool'), + ('friend_request_massoperation_cancel', 'Back to request list.'), + ('furni_queue_tile1*0_name', 'White Quest Roller'), + ('furni_divider_nor3*5_name', 'Pink Iced gate'), + ('furni_sound_machine*5_desc', 'Heard the Habbo Bands new singles?'), + ('furni_glass_table*6_desc', 'Translucent beauty'), + ('furni_soft_sofachair_norja*9_desc', 'Red Iced Sofachair'), + ('furni_plant_mazegate_desc', 'Did we make it?'), + ('tickets_info_1', 'With 2 tickets you can play the following Games:\\r10 BattleBall:Rebound!\\r10 SnowStorm\\r20 Wobble Squabble or\\r20 Lido Diving'), + ('furni_barchair_silo*4_desc', 'Practical and convenient'), + ('furni_CF_10_coin_gold_name', 'Gold Coin'), + ('tickets_info_2', 'With 20 tickets you can play the following Games:\\r10 BattleBall:Rebound!\\r10 SnowStorm\\r20 Wobble Squabble or\\r20 Lido Diving'), + ('furni_sound_set_15_desc', 'Unadulterated essentials'), + ('handitem1', 'Tea'), + ('furni_romantique_divan*3_desc', 'null'), + ('furni_glass_sofa*8_name', 'Glass sofa'), + ('epsnotify_1001', 'The hotel is full at the moment. Please try again in a few minutes.'), + ('furni_table_silo_med*2_name', 'Black Coffee Table'), + ('furni_sleepingbag*7_name', 'Orange Sleeping Bag'), + ('furni_pillow*5_desc', 'Puffy, soft and huge'), + ('furni_bed_budget*1_desc', 'King sized comfort!'), + ('furni_bed_trad_one_name', 'Plain Single Bed'), + ('catalog_giftfor', 'This is a gift for:'), + ('furni_theatre_seat_name', 'Deluxe Theatre Chair'), + ('furni_romantique_divider*3_name', 'Turquoise Screen'), + ('furni_shelves_silo_desc', 'For nic naks and art deco books'), + ('handitem9', 'Decaff'), + ('handitem8', 'Regular'), + ('handitem7', 'Water'), + ('furni_glass_table_name', 'Glass table'), + ('console_selection_invert', 'Invert selection'), + ('handitem6', 'Blackcurrant'), + ('furni_hc_machine_desc', 'By and for mad inventors'), + ('handitem5', 'Milk'), + ('handitem4', 'Ice-cream'), + ('poster_40_desc', 'The one and only. Adore her!'), + ('nav_venue_sw_lobby_tournament_9/0_desc', ''), + ('handitem3', 'Carrot'), + ('handitem2', 'Juice'), + ('furni_cn_sofa_name', 'Chinese Sofa'), + ('nav_venue_bb_lobby_expert_4/0_desc', ''), + ('poster_502_name', 'The Stars and Stripes'), + ('furni_md_rug_name', 'Bubble Juice Floor'), + ('furni_table_plasto_bigsquare_name', 'Square Dining Table'), + ('furni_bed_polyfon*8_desc', 'Yellow Mode Double Bed'), + ('nav_venue_sw_lobby_amateur_7_name', 'Snow Slingers Lobby'), + ('furni_birdie_desc', 'Cheep (!) and cheerful'), + ('poster_12_name', 'Lapland Poster'), + ('club_desc_1_period', '1 Month (31 days) = 25 Credits'), + ('hobba_emergency_help', 'Call For Emergency Help:'), + ('reg_age_check_note', 'Enter your birthday. You will need your birthday information when changing your password or email.'), + ('furni_table_plasto_square*6_name', 'Square Dining Table'), + ('trade', 'Trade'), + ('furni_romantique_smalltabl*3_desc', 'Every tray needs a table...'), + ('reg_back', 'Back'), + ('furni_tree7_name', 'Snowy Christmas Tree'), + ('recycler_trader_open_alert', 'Recycling cannot begin while you are trading. Please close the safe trading box before recycling.'), + ('furni_rare_dragonlamp*8_desc', 'Scary and scorching!'), + ('furni_gothic_chair*3_desc', 'The head of the table'), + ('Alert_YourNameIstooShort', 'Habbo names must be at least 3 characters long.'), + ('furni_bed_budgetb_desc', 'Sweet dreams for two'), + ('furni_shelves_basic_name', 'Pura Shelves'), + ('console_messagemode_helptext', 'You can send an instant message to your Habbo Friends.'), + ('nav_venue_cunning_fox_gamehall/5_desc', 'Get a hand like a foot? Keep a straight face and bluff it out'), + ('furni_table_polyfon_small_name', 'Small Coffee Table'), + ('move_furniture', 'Move Furni'), + ('nav_searchbutton', 'Search'), + ('furni_habboween_grass_desc', 'Autumnal chills with each rotation!'), + ('furni_pura_mdl5*2_desc', 'Any way you like it!'), + ('NUF_meeting_people_user_tutor', 'The user you clicked on is shown in the corner of your screen. The buttons beneath the Habbo let you visit their Habbo Home, send them a Friend Request or ignore them if they look or act like a moron.'), + ('poster_55_name', 'Tree of Time'), + ('furni_soft_sofachair_norja*5_name', 'Pink Iced Sofachair'), + ('furni_sound_set_48_name', 'Club 3'), + ('furni_table_plasto_4leg_desc', 'Hip plastic furniture'), + ('furni_pura_mdl4*1_name', 'Aqua Pura Module 4'), + ('login_forgottenPassword_url', 'https://www.habbo.co.uk/account/password/forgot'), + ('nav_venue_floatinggarden/0_desc', 'Peace, tranquility and still waters'), + ('furni_sound_set_36_desc', 'For adult minded'), + ('poster_43_desc', 'Shake, rattle and roll'), + ('furni_gothic_stool*3_desc', 'The dark side of Habbo'), + ('room_alert_furni_limit', 'This room has the maximum amount of Furni.'), + ('furni_table_plasto_square*15_name', 'Occasional Table'), + ('furni_rare_hammock_name', 'Hammock'), + ('sound_machine_confirm_burn_long', 'Are you sure you want to burn this song to disc? Burning costs one credit.'), + ('furni_rclr_chair_desc', 'Watch out for coconuts'), + ('furni_chair_basic*3_desc', 'It\'s a cracking design!'), + ('furni_doormat_plain*6_name', 'Doormat'), + ('furni_sofachair_polyfon*9_name', 'Red Armchair'), + ('furni_jp_tray6_name', 'jp_tray6'), + ('furni_habbocake_name', 'Cake'), + ('poster_501_name', 'Jolly Roger'), + ('nav_goingprivate', 'Going to Guest room'), + ('furni_bed_budget_one*9_name', 'Red Pura Bed'), + ('alert_no_category', 'Your room has no category. Select one from the list.'), + ('nav_venue_theatredrome_easter/0_desc', ''), + ('gs_button_buytickets', 'Buy Tickets'), + ('nav_venue_bouncer_room_4_name', 'Experts Battle Ball Arena'), + ('close', 'Close'), + ('furni_carpet_standard*9_desc', 'Available in a variety of colours'), + ('furni_prizetrophy4*1_desc', 'Glittery gold'), + ('help_pointer_1', 'http://www.habbo.co.uk/help/'), + ('help_pointer_3', 'emergency_help'), + ('furni_rclr_lamp_name', 'Moon Lamp'), + ('help_pointer_2', 'http://www.habbohotel.co.uk/iot/go?lang=en&country=uk'), + ('furni_exe_sofa_desc', 'Relaxing leather comfort'), + ('furni_divider_silo1*4_name', 'Beige Area Corner Shelf'), + ('poster_2001_name', 'SeinNightitititititdiskotappaja'), + ('interface_icon_tv_close', 'Leave the Room and close the Habbovision mode.'), + ('furni_sound_machine*7_name', 'Red Traxmachine'), + ('game_bs_hit', 'A Hit!:'), + ('furni_rare_fan*2_desc', 'It\'ll blow you away!'), + ('win_place', 'Note!'), + ('nav_venue_bb_lobby_beginner_11_name', 'Beginners Battle Ball 12'), + ('furni_pillow*7_desc', 'Bonnie\'s pillow of choice!'), + ('furni_table_silo_small*8_desc', 'For those random moments'), + ('furni_divider_nor4*5_desc', 'Habbos, roll out!'), + ('hubu_vastaa', 'Answer the question'), + ('furni_pura_mdl4*8_name', 'yellow pura module 4'), + ('furni_glass_chair*9_name', 'Glass chair'), + ('furni_chair_silo*7_desc', 'Green Silo Dining Chair'), + ('furni_jp_drawer_desc', 'Spiritual home for odds and ends'), + ('tutorial_select_another_topic', 'Select another topic'), + ('furni_noob_lamp*4_desc', 'Get the light right where you want it (light blue)'), + ('nav_venue_beauty_salon_general_name', 'Beauty salon'), + ('furni_sofachair_polyfon*2_name', 'Black Mode Armchair'), + ('console_report_header', 'Report Abusive Message'), + ('club_buy_url', 'http://%predefined%//credits/habboclub'), + ('furni_prizetrophy*2_name', 'Classic trophy'), + ('furni_rare_icecream*4_name', 'Strawberry Ice Cream Machine'), + ('furni_barchair_silo*5_desc', 'Practical and convenient'), + ('furni_divider_nor2*4_desc', 'No way through'), + ('furni_xmas_cstl_gate_name', 'Ice Castle Gate'), + ('furni_noob_stool*5_desc', 'Unfold me and take the weight off (pink)'), + ('furni_bed_budgetb_one_name', 'Plain Single Bed'), + ('friend_request_accept_all', 'Accept all requests.'), + ('furni_val_choco_name', 'Heart Shaped Box'), + ('poster_514_desc', 'Be proud to be in the Union!'), + ('furni_carpet_legocourt_desc', 'Line up your slam dunk'), + ('furni_sofa_silo_name', 'Two-Seater Sofa'), + ('furni_chair_plasto*8_desc', 'Hip plastic furniture'), + ('furni_tree5_name', 'Christmas Tree 3'), + ('nav_venue_habbo_cinema/0_desc', 'Now showing: Kick Warz II - The revenge of Donnie Santini!'), + ('furni_couch_norja*4_name', 'Urban Iced Bench'), + ('poster_52_desc', 'whack that ball!'), + ('furni_sound_set_45_desc', 'The Bass? is the rhythm!'), + ('nav_venue_sun_terrace/0_name', 'Sun Terrace'), + ('queue_tile_limit', 'You can\'t fit more Habbo Rollers in this room!'), + ('BuddyRequesta', 'Friend Request(s)'), + ('transaction_system_sms_rl', 'Elisa'), + ('furni_prizetrophy4_desc', 'Palkinto'), + ('furni_hcamme_desc', 'Time for a soak'), + ('furni_scifirocket*2_name', 'Earth Smoke Machine'), + ('furni_divider_nor5*2_desc', 'Cool cornering for your crib y0!'), + ('forgottenpw', 'Forgotten your password?'), + ('furni_rclr_sofa_desc', 'Snuggle up together'), + ('furni_val_cauldron_desc', 'Cast a loving spell!'), + ('poster_3_name', 'Fish Plaque'), + ('furni_one_way_door*8_name', 'Yellow One Way Gate'), + ('furni_divider_nor3*8_desc', 'Yellow Iced gate'), + ('sw_link_highScores_url', 'http://%predefined%//groups/56553/id'), + ('furni_carpet_standard*2_desc', 'Available in a variety of colours'), + ('nav_venue_sport/0_name', 'The Power Gym'), + ('furni_scifidoor*3_desc', 'There out of this world!'), + ('furni_pillar*7_desc', 'Recovered from Habblantis'), + ('furni_arabian_tray3_name', 'Sweets Tray'), + ('furni_chair_plasto_name', 'Chair'), + ('nav_venue_pizza_name', 'Slice of Life'), + ('url_privacypledge', 'http://%predefined%//help/69'), + ('furni_one_way_door*3_desc', 'One way! The HC way!'), + ('catalog_purchase_not_allowed_hc', 'In order to buy this item you must be a Habbo Club member!'), + ('furni_pura_mdl3*4_name', 'White Pura Module 3'), + ('room_confirmDelete', 'Confirm'), + ('BuddyPrivateRoom', 'In A Guest Room'), + ('furni_marquee*7_desc', 'It\'s both door and a shade!'), + ('furni_bath_desc', 'The ultimate in pampering'), + ('furni_soft_sofa_norja*3_desc', 'Pristine white, keep it clean!'), + ('game_BattleShip', 'Battleships'), + ('furni_sound_set_11_desc', 'Music you can really sink your teeth into'), + ('furni_glass_chair*2_name', 'Glass chair'), + ('furni_sofa_silo*5_desc', 'Pink Area Sofa'), + ('furni_pura_mdl2*7_name', 'Green Pura Module 2'), + ('cam_film.help', 'Number Of Photos Left'), + ('nav_venue_bb_lobby_tournament_17/0_desc', ''), + ('roomatic_hway', 'Hotel guests are expected to follow the Habbo Way even if word filtering is switched off.'), + ('modify', 'Modify'), + ('furni_sofachair_silo*8_name', 'Yellow Armchair'), + ('alert_reg_blocked', 'A person under 11 years of age has tried to register from this machine recently.\\rRegistration is not possible for a while.'), + ('furni_sofa_polyfon*8_desc', 'Yellow Mode Sofa'), + ('furni_wooden_screen*9_desc', 'Add an exotic touch to your room'), + ('hobba_message_from', 'Your call has been responded to as follows:'), + ('win_help', 'Habbo Help'), + ('pet.saying.sniff.dog.1', 'snuh...SNUUUUUH'), + ('pet.saying.sniff.dog.0', 'snuuh..snuuh'), + ('sw_user_skill', 'Snow Storm Skill Level: \\x \\r (\\y points)'), + ('furni_rom_lamp_desc', 'Light up your life'), + ('console_profile_create', 'Create your Habbo Profile.'), + ('furni_CF_50_goldbar_desc', 'Worth 50 Credits'), + ('furni_romantique_chair*4_desc', 'What does this button do?'), + ('reg_use_allowed_chars', 'Use only these characters:'), + ('furni_bar_chair_armas_name', 'Barrel Stool'), + ('pet.saying.sniff.dog.2', '*sighs*'), + ('furni_sound_set_64_name', 'Alhambra Trax 3'), + ('furni_pillar*3_name', 'blue pillar'), + ('furni_glass_chair*4_desc', 'Translucent beauty'), + ('furni_pizza_desc', 'You dirty Habbo'), + ('opening_hours_text_shutdown', 'The Hotel will shut down in %d% minutes. To avoid confusion, purchasing of furniture, Habbo Club and game tickets will be disabled during that time, as well as playing Games and furniture trading. Thank you for visiting and welcome back tomorrow!'), + ('nav_venue_bb_lobby_tournament_10_name', 'Competitie Battle Ball 11'), + ('poster_521_desc', 'Ordem e progresso'), + ('furni_sound_set_52_desc', 'Under the mistletoe!'), + ('furni_shelves_norja*3_name', 'White Iced Bookcase'), + ('furni_scifiport*5_desc', 'Recovered from Roswell'), + ('help_emergency_writeyour', 'Give details of your emergency here:'), + ('furni_table_norja_med*6_name', 'Large Coffee Table Blue'), + ('nav_venue_bb_lobby_expert_3_name', 'Experts Battle Ball 4'), + ('photo_legend', 'Caption'), + ('furni_sofachair_silo_desc', 'Large, but worth it'), + ('console_youdonthavebuddies', 'You have no Friends on your list.\\rYou can send Friend Requests using\\rthe \'search\' button.'), + ('furni_table_plasto_4leg*6_name', 'Occasional table Table'), + ('furni_scifidoor*1_name', 'Pink Spaceship Door'), + ('furni_tile_brown_desc', '10% off downtown promenades & piazzas!'), + ('NUF_getting_room_go_button', 'Click here to go to your just created room!'), + ('dimmer_turn_on', 'Turn ON'), + ('furni_sofa_polyfon_desc', 'Comfort for stylish couples'), + ('furni_sound_set_50_name', 'Club 5'), + ('furni_doorB_name', 'Wardrobe'), + ('reg_agree1', 'Yes, my parents and I agree to the above terms. I am allowed to use Habbo Hotel.'), + ('furni_chair_silo*3_name', 'White Dining Chair'), + ('furni_CF_1_coin_bronze_desc', 'Worth 1 Credits'), + ('reg_agree2', 'Yes, I have read the Habbo Hotel Terms of Service and I accept them'), + ('you_have_pending_cfh', 'Your previous call for help has not been answered yet. To make a new one you must delete the old message.'), + ('furni_table_plasto_bigsquare*7_name', 'Square Dining Table'), + ('console_accept', 'Accept'), + ('furni_lamp_basic_name', 'Pura Lamp'), + ('console_friend_request_error', 'There was an error with friend requests'), + ('poster_11_desc', 'I obey the Habbo way!'), + ('furni_bardeskcorner_polyfon*6_name', 'Blue Mode Bardesk Corner'), + ('furni_plant_sunflower_name', 'Cut Sunflower'), + ('furni_traffic_light*3_name', 'Purple Traffic Light'), + ('furni_bed_polyfon_one*8_name', 'Yellow Mode Single Bed'), + ('furni_carpet_polar*1_desc', 'Cute'), + ('furni_noob_rug*1_desc', 'Nice and neat sisal rug with orange edging'), + ('furni_exe_bardesk_desc', 'Divide the profits!'), + ('furni_romantique_divider*4_desc', 'Keeping things separated'), + ('pet_status_dialog', '%name%'), + ('furni_jp_lantern_name', 'Japanese Lantern'), + ('furni_chair_norja*2_name', 'Black Chair'), + ('furni_jp_irori_desc', 'Traditional heating and eating'), + ('furni_bed_budget*5_name', 'Beige Pura Double Bed'), + ('furni_scifidoor*8_name', 'Purple Spaceship Door'), + ('nav_venue_sw_lobby_free_5_name', 'Free Game Lobby'), + ('wallitem_jp_sheet2_desc', 'jp_sheet2'), + ('furni_glass_sofa*9_desc', 'Translucent beauty'), + ('furni_divider_nor5*7_name', 'Rural Iced Angle'), + ('sound_machine_open_editor', 'Trax Editor'), + ('furni_jp_tatami2_desc', 'Shoes off please'), + ('furni_sound_set_16_name', 'Hip Hop Beats 3'), + ('console_recipients', 'Recipient(s)'), + ('catalog_page', 'page'), + ('poster_23_name', 'Bat Poster'), + ('furni_table_plasto_round*4_name', 'Square Dining Table'), + ('furni_rubberchair*2_desc', 'Soft and tearproof!'), + ('nav_venue_bb_lobby_beginner_16/0_desc', ''), + ('poster_1005_name', 'Johnny Squabble'), + ('furni_silo_studydesk_name', 'Area Quest Desk'), + ('furni_table_plasto_4leg*1_desc', 'Hip plastic furniture'), + ('nav_venue_basement_lobby/0_desc', 'For low level hanging'), + ('furni_rare_parasol*3_desc', 'Block those rays!'), + ('furni_arabian_wndw_name', 'Arabian Window Frame'), + ('Alert_ConnectionFailure', 'Disconnected'), + ('furni_house_desc', 'Good enough to eat'), + ('console_confirm_selected', 'Confirm the selections. Below are the amount of friend requests that will be accepted and declined. If you want, you can still modify the selections.'), + ('furni_table_plasto_4leg*4_name', 'Square Dining Table'), + ('furni_sound_set_57_name', 'RnB Grooves 3'), + ('hubu_h3', 'Huumetietobussi'), + ('furni_table_plasto_bigsquare*2_name', 'Square Dining Table'), + ('hubu_h4', 'Anna palautetta'), + ('hubu_h1', 'Puhelintuki'), + ('roomatic_bobbafilter', 'Bobba filter (filters out bad language)'), + ('hubu_h2', 'Harrastamaan!'), + ('furni_tv_luxus_desc', 'Bang up to date'), + ('hubu_h5', 'Huumetietoa'), + ('NUF_console_hotelview_icon', 'Click the button to open your Habbo Console.'), + ('modtool_banlength', 'Ban Length:'), + ('NUF_visiting_rooms_roomlist_tutor', 'Just pick any room you like. Click on the room to see a description of the room. ROOM!'), + ('reg_verification_newPassword', 'New password:'), + ('furni_wall_china_name', 'Dragon Screen'), + ('nav_venue_hallway_ii/0_desc', 'Beware witches and warlocks'), + ('jukebox_disk_add', 'Add Disc'), + ('furni_rare_xmas_screen_desc', 'Ho Ho Ho!'), + ('furni_table_plasto_round*2_name', 'Round Dining Table'), + ('furni_rubberchair*7_name', 'White Inflatable Chair'), + ('nav_favourites_helptext', 'These are your favourite rooms. Nice selection you have here...'), + ('nav_venue_sw_lobby_beginner_4_name', 'Snow Rookies Lobby'), + ('furni_gothic_chair*2_desc', 'The prince of Habbo'), + ('cam_save_nofilm', 'You have run out of film.\\rGet a roll (5 photos) from\\rthe Catalogue for 6 Credits.'), + ('furni_sofa_polyfon*6_desc', 'Blue Mode Sofa'), + ('furni_divider_silo3*2_desc', 'Form following function'), + ('furni_rare_beehive_bulb*1_name', 'Red Amber Lamp'), + ('furni_plant_small_cactus_desc', 'Even less watering than the real world'), + ('furni_triplecandle_name', 'Electric Candles'), + ('help_option_1', 'Playing Habbo'), + ('help_option_3', 'A serious issue (harassment, sexual behaviour)'), + ('furni_present_gen5_name', 'Gift'), + ('help_option_2', 'My Habbo account.'), + ('furni_shelves_norja*8_name', 'Yellow Bookcase'), + ('furni_legotrophy_desc', 'For the winning team'), + ('furni_rare_icecream*2_name', 'Pistachio Ice Cream Machine'), + ('furni_summer_pool*1_desc', 'Fancy a dip?'), + ('nav_venue_theatredrome_deli/0_desc', 'Join in all the fun of the fair!'), + ('game_newgame', 'New game'), + ('help_tour', 'Guided Tour'), + ('purse_vouchers_error3_url', 'http://%predefined%//credits'), + ('furni_marquee*5_name', 'Graphite Marquee'), + ('forgottenpw_explanation', 'If you have forgotten your password and you gave your correct email address when you registered, we can send your password to you.'), + ('furni_waterbowl*3_name', 'Yellow Water Bowl'), + ('roomatic_namedisp', 'Do you want your name to be displayed with the room?'), + ('poster_28_name', 'Silver Tinsel Bundle'), + ('Alert_BuyingOK', 'Buying Successful!'), + ('furni_summer_chair*4_name', 'Deck Chair'), + ('nav_venue_welcome_lounge_ii/0_desc', 'New? Lost? Get a warm welcome here from Habbo eXperts.'), + ('bb_title_gameCreation', 'Aloita uusi peli!'), + ('furni_sporttrack1*3_name', 'Sport track straight grass'), + ('furni_romantique_divan*2_name', 'Emerald Chaise-Longue'), + ('furni_divider_silo1*6_name', 'Blue Area Corner Shelf'), + ('NUF_about_hotel_about_tutor', 'Habbo is both a virtual world and an online community.'), + ('url_helpparents', 'http://%predefined%//help/73'), + ('furni_divider_silo3*7_name', 'Green Area Gate'), + ('poster_18_desc', 'Beautiful reproduction butterfly'), + ('furni_traffic_light*5_desc', 'Chill and wait your turn!'), + ('furni_scifirocket*6_desc', 'Too hot to handle!'), + ('pet.saying.angry.cat.0', 'Sssppp!'), + ('furni_bed_armas_one_desc', 'Rustic charm for one'), + ('pet.saying.angry.cat.3', '*hiss*'), + ('pet.saying.angry.cat.1', 'MrrRRRR'), + ('pet.saying.angry.cat.2', 'Tssssss!'), + ('furni_noob_rug*6_name', 'My first Habbo rug'), + ('club_habbo.bottombar.text.member', 'Habbo Club'), + ('furni_divider_silo1_name', 'Corner Shelf'), + ('nav_venue_bb_lobby_beginner_10/0_desc', ''), + ('recycler_info_progress', 'Recycling is currently in progress. The recycling process takes a total of %recyclinghours% hour. You can leave the catalogue and recycling will continue in the background.'), + ('furni_queue_tile1*1_name', 'Pink Habbo Roller'), + ('notickets_header', 'Buy game tickets to play this game'), + ('reg_underage', 'I am under 11 years old'), + ('nav_venue_sw_arena_intermediate_name', 'Playing intermediate game'), + ('furni_table_plasto_square*5_name', 'Square Dining Table'), + ('Alert_YouAreBanned_T', 'A Moderator kicked you out of the room.'), + ('buddyremove_moreoptions', 'More Options >>'), + ('furni_prizetrophy4*3_desc', 'Breathtaking bronze'), + ('furni_chair_silo*2_desc', 'Keep it simple'), + ('club_habbo.bottombar.link.notmember', 'Join!'), + ('poster_1000_name', 'Comedy Poster'), + ('room_badge_button', 'Badge'), + ('furni_soft_sofa_norja*8_desc', 'Yellow Iced Sofa'), + ('wallitem_torch_name', 'Gothic Torch'), + ('furni_scifirocket*7_name', 'Jupiter Smoke Machine'), + ('furni_romantique_tray1_desc', 'For a fast break'), + ('furni_rare_dragonlamp*0_desc', 'George and the...'), + ('furni_nest_desc', 'Night, night'), + ('furni_table_silo_small*2_name', 'Black Occasional Table'), + ('furni_prizetrophy7*2_name', 'Silver Habbo trophy'), + ('furni_sofachair_silo*3_desc', 'Large, but worth it'), + ('furni_divider_nor2*9_name', 'Red Iced bar desk'), + ('club_extend_title', 'Habbo Club membership can be extended VERY easily.'), + ('furni_rare_fan*0_desc', 'As red as Rudolph\'s nose'), + ('club_paybycash_url', '(leave this empty if you don\'t want to have this link displayed)'), + ('poster_57_name', 'Calligraphy poster'), + ('furni_CFC_50_coin_silver_desc', 'Worth 50 Credits'), + ('furni_pillow*5_name', 'Black Leather Pillow'), + ('furni_hc_chr_name', 'Majestic Chair'), + ('nav_venue_sw_arena_free_name', 'Playing free for all game'), + ('furni_active_placeholder_desc', 'This furniture is downloading...'), + ('nav_venue_welcome_lounge_name', 'Welcome Lounge'), + ('furni_soft_sofachair_norja*3_name', 'White Iced Sofachair'), + ('furni_bed_polyfon*3_desc', 'Give yourself space to stretch out'), + ('furni_pura_mdl4*3_name', 'Black Pura Module 4'), + ('furni_pillar*2_desc', 'Ancient and stately'), + ('furni_small_chair_armas_desc', 'Rustic charm at it\'s best'), + ('furni_table_plasto_round_desc', 'Hip plastic furniture'), + ('furni_marquee*2_desc', 'Dragons out and Davids in!'), + ('furni_wooden_screen*7_desc', 'Add an exotic touch to your room'), + ('furni_queue_tile1*8_name', 'Navy Habbo Roller'), + ('furni_arabian_pllw_desc', 'Exotic comfort'), + ('furni_sound_set_1_desc', 'Get the party started!'), + ('furni_gothic_stool*5_desc', 'The dark side of Habbo'), + ('furni_china_table_desc', 'Exotic and classy'), + ('song_disk_trade_info', '%name%'), + ('nav_venue_sw_lobby_beginner_9_name', 'Snow Rookies Lobby'), + ('console_modify', 'Modify'), + ('poster_36_desc', 'The Hotels girlband. Dream on!'), + ('furni_rare_dragonlamp*7_desc', 'Scary and scorching!'), + ('furni_sound_set_63_desc', 'Desert hits by the oasis!'), + ('nav_venue_cafe_gold_name', 'The Oasis'), + ('nav_venue_sw_lobby_tournament_3/0_desc', ''), + ('nav_venue_habbo_cinema_name', 'Habbo Cinema'), + ('furni_chair_plasty*4_name', 'Plastic Pod Chair'), + ('nav_venue_welcome_lounge_iii/0_desc', 'New? Lost? Get a warm welcome here from Habbo eXperts.'), + ('furni_carpet_soft*1_desc', 'Soft Wool Rug'), + ('furni_sporttrack1*1_name', 'Sport track straight'), + ('furni_divider_nor3*6_name', 'Blue Iced gate'), + ('furni_glass_chair*7_name', 'Green Glass Chair'), + ('club_confirm_gift_text', 'A new club gift has arrived. Please push OK if you want to receive it now. If you click cancel you will be asked again next time you log in to the Hotel.'), + ('furni_rubberchair*5_name', 'Lime Inflatable Chair'), + ('furni_plant_maze_snow_name', 'Snowy Maze Bundle 2'), + ('furni_table_silo_med*4_name', 'Beige Area Coffee Table'), + ('furni_solarium_norja*1_desc', 'Rejuvenate your pixels!'), + ('furni_divider_nor2*2_name', 'Black Iced bar desk'), + ('poster_45_desc', 'Needs a few more Habburgers'), + ('wallitem_habw_mirror_desc', 'Star of the show!'), + ('furni_pura_mdl3*9_name', 'Red Pura Module 3'), + ('furni_exe_corner_name', 'Executive Corner Desk'), + ('nav_venue_cunning_fox_gamehall/3_desc', 'Are you the new Deep Blue?'), + ('furni_rare_fan*7_desc', 'It\'ll blow you away!'), + ('furni_divider_nor1*5_desc', 'Pink Ice corner'), + ('wallitem_md_logo_wall_name', 'Bubble Juice Logo'), + ('furni_bardesk_polyfon_desc', 'Perfect for work or play'), + ('console_target_does_not_accept', 'This user does not accept friend requests at the moment'), + ('pet.saying.beg.croco.0', 'Mmmmmrrr'), + ('pet.saying.beg.croco.1', '*Emo tear*'), + ('messenger.email.header', ''), + ('pet.saying.beg.croco.2', 'Waarrrr...rrr'), + ('furni_carpet_polar*4_name', 'Green Bear Rug'), + ('furni_chair_plasto*6_name', 'Chair'), + ('furni_noob_rug*4_name', 'My first Habbo rug'), + ('furni_summer_chair*6_desc', 'Blue'), + ('rotate_furniture', 'Rotate Furni'), + ('poster_16_desc', 'Added security'), + ('furni_sofachair_silo*7_desc', 'Green Area Armchair'), + ('furni_divider_nor5*4_desc', 'Cool cornering for your crib!'), + ('furni_sand_cstl_twr_name', 'sand_cstl_twr'), + ('furni_safe_silo*4_name', 'Beige Safe Minibar'), + ('furni_chair_plasty*11_name', 'Plastic Pod Chair'), + ('furni_divider_arm2_name', 'Room divider'), + ('furni_sound_set_55_name', 'RnB Grooves 1'), + ('nav_venue_sw_lobby_intermediate_4_name', 'Snow Bombardiers Lobby'), + ('roomatic_canmodifysettings', '(You can change these settings later)'), + ('furni_pura_mdl5*7_desc', 'Any way you like it!'), + ('catalog_pet_name_length', 'Oops, pet\'s name is too long (max 15 characters)'), + ('furni_toy1*3_name', 'Rubber Ball'), + ('nav_venue_beauty_salon_loreal/0_desc', 'No Pixel Surgery, only natural make-ups!'), + ('furni_arabian_swords_name', 'Ancestral Scimitars'), + ('furni_summer_pool*4_name', 'Yellow Summer Pool'), + ('gs_error_create_0', 'This Lobby is full, please create a Game in another Lobby!'), + ('nav_venue_pizzeria/0_desc', 'Pizza; food of the hungry!'), + ('nav_roomnfo_hd_own', 'Own Rooms'), + ('furni_glass_sofa*4_desc', 'Translucent beauty'), + ('buddyremove_accept', 'Remove Friends'), + ('transaction_system_sms_win_orange', 'Orange SMS'), + ('gs_error_create_3', 'Your skill level isn\'t high enough for creating Games in this Lobby.'), + ('furni_goodie2_desc', 'For gourmet kittens'), + ('trading_youagree', 'You agree'), + ('furni_bench_lego_name', 'Team Bench'), + ('reg_verification_updateOK', 'Update successful'), + ('transaction_system_refunds', 'Refund'), + ('furni_carpet_standard*7_name', 'Floor Rug'), + ('poster_44_name', 'Mummy'), + ('furni_bed_polyfon_one*3_name', 'White Single Bed'), + ('furni_jp_tray1_name', 'jp_tray1'), + ('furni_jp_tatami_name', 'Small Tatami Mat'), + ('furni_bardesk_polyfon*2_name', 'Black Mode Bardesk'), + ('furni_hockey_light_desc', 'Set it off.'), + ('nav_venue_bb_lobby_intermediate_2/0_desc', ''), + ('wallitem_guitar_v_name', 'v guitar'), + ('reg_email', 'Email:'), + ('nav_venue_sw_lobby_tournament_0/0_desc', ''), + ('furni_club_sofa_name', 'Club sofa'), + ('furni_duck_name', 'Rubber Duck'), + ('furni_divider_nor5*9_name', 'Red Iced Angle'), + ('furni_smooth_table_polyfon_name', 'Large Dining Table'), + ('reg_forcedupdate', 'Please update your Habbo details!'), + ('transaction_system_stuff_store', 'Catalogue purchase'), + ('console_request_massoperation_title', 'You have %messageCount% friend requests waiting.'), + ('nav_venue_bb_lobby_expert_8/0_desc', ''), + ('roomatic_roomdescription', 'Room description:'), + ('reg_verification_invalidEmail', 'Check email address'), + ('furni_xmas_icelamp_desc', '20 lanterns for the price of 6!'), + ('wallitem_wallmirror_desc', 'Mirror, mirror on the wall...'), + ('furni_pura_mdl1*3_name', 'Black Pura Module 1'), + ('pet.saying.play.croco.1', 'Squeh Squeeeeh...'), + ('pet.saying.play.croco.0', ':)'), + ('nav_venue_theatredrome_halloween/0_desc', 'Warm welcome to Bullet For My Valentine!'), + ('nav_venue_bb_lobby_amateur_6_name', 'Gevorderden Battle Ball 7'), + ('cam_savetxt', 'Saving Photo...'), + ('nav_venue_bb_lobby_intermediate_1_name', 'Semi-profs Battle Ball 2'), + ('nav_modify_doorstatus', 'Door status'), + ('callhelp_sent', 'If you have questions about Habbo Hotel or your Habbo account, please write the details below and a member of community staff will respond as soon as possible.'), + ('wallitem_photo_name', 'Photo'), + ('poster_25_desc', 'A new use for carrots!'), + ('furni_chair_plasto*1_desc', 'Hip plastic furniture'), + ('furni_prizetrophy4*2_name', 'Fish trophy'), + ('furni_bar_armas_name', 'Barrel Minibar'), + ('nav_rooms_favourite', 'Favourites'), + ('furni_table_plasto_square*6_desc', 'Hip plastic furniture'), + ('furni_gothic_sofa*6_desc', 'The dark side of Habbo'), + ('jukebox_song_length', 'Song length: %time%'), + ('buddyremove_header', 'Choose %amount% friends to remove'), + ('furni_romantique_mirrortabl_desc', 'Get ready for your big date'), + ('wallitem_hrella_poster_2_name', 'Life Buoy'), + ('reg_boy', 'Boy'), + ('sound_machine_trax_name', 'Trax name:'), + ('purse_vouchers_error0', 'Technical error! Cannot redeem voucher.'), + ('furni_plant_valentinerose*3_name', 'Yellow Valentine Rose'), + ('purse_vouchers_error1', 'Invalid voucher code.'), + ('nav_venue_bb_lobby_expert_1_name', 'Experts Battle Ball 2'), + ('purse_vouchers_error2', 'Product delivery failed, please contact Customer Service'), + ('purse_vouchers_error3', 'This voucher must be redeemed on the Habbo website'), + ('furni_romantique_chair*2_desc', 'null'), + ('furni_prizetrophy7*1_desc', 'Gold Habbo trophy'), + ('furni_table_plasto_bigsquare*14_name', 'Occasional Table'), + ('furni_ticket_desc', 'A bundle of 5 gaming tickets'), + ('nav_venue_club_massiva_name', 'Club Massiva'), + ('roomatic_locked', 'Door locked - visitors have to ring doorbell'), + ('furni_table_silo_small*3_desc', 'For those random moments'), + ('furni_bed_trad_name', 'Plain Double Bed'), + ('summer_chair_5_name', 'Beige Deck Chair'), + ('buddyremove_select_all', 'Select All Friends'), + ('furni_plant_valentinerose*5_desc', 'For that special pixel'), + ('furni_glass_table*9_name', 'Glass table'), + ('furni_romantique_smalltabl*5_desc', 'Why is one leg different?'), + ('furni_pura_mdl5*5_name', 'beige pura module 5'), + ('poster_30_name', 'Mistletoe'), + ('furni_chair_basic*8_name', 'chair_basic'), + ('nav_venue_sw_lobby_amateur_2_name', 'Snow Slingers Lobby'), + ('Alert_ConnectionDisconnected', 'Please reload Habbo Hotel!\\r\\rIf this happens again, please wait a moment before reloading.'), + ('Alert_WrongPassword', 'Check password!'), + ('nav_modify_letothersmove', 'Let other people move and leave furniture in the room.'), + ('furni_rare_dragonlamp*1_name', 'Sea Dragon Lamp'), + ('furni_table_plasto_4leg*10_desc', 'Hip plastic furniture'), + ('furni_sound_set_28_name', 'Rock 2'), + ('furni_grand_piano*2_name', 'Black Grand Piano'), + ('furni_basket_desc', 'Eggs-actly what you want for Easter'), + ('furni_rare_fan*5_name', 'Yellow Powered Fan'), + ('furni_noob_lamp*2_name', 'My first Habbo lamp'), + ('furni_present_gen4_desc', 'What\'s inside?'), + ('furni_pillar*9_desc', 'Ancient and stately'), + ('furni_chair_norja*8_desc', 'Sleek and chic for each cheek'), + ('furni_pura_mdl2*2_desc', 'Any way you like it!'), + ('furni_glass_stool*5_desc', 'Translucent beauty'), + ('furni_hc_lmp_name', 'Oil Lamp'), + ('console_myinterests', 'My interests:'), + ('furni_val_teddy*6_desc', 'The blue bear of happiness'), + ('room_cant_set_item', 'You cannot place this in someone else\'s room!'), + ('poster_29_desc', '10 x Gold Tinsel'), + ('club_general_daysleft', 'Number of HC days left'), + ('nav_popup_nav_link', 'Open the Navigator'), + ('furni_sound_set_43_desc', 'Beware zombies!'), + ('furni_solarium_norja*6_name', 'Blue Solarium'), + ('furni_doormat_plain*1_name', 'Doormat'), + ('nav_venue_chill_name', 'Zen Garden'), + ('furni_one_way_door*5_desc', 'One at a time!'), + ('furni_table_plasto_round*3_desc', 'Hip plastic furniture?'), + ('furni_prizetrophy6_desc', 'Palkinto'), + ('furni_exe_s_table_name', 'Executive Glass Table'), + ('furni_noob_rug*5_desc', 'Nice and neat sisal rug with pink edging'), + ('furni_scifirocket*0_name', 'Mars Smoke Machine'), + ('furni_soft_jaggara_norja_desc', 'Soft Iced sofachair'), + ('nav_venue_bb_lobby_amateur_9/0_desc', ''), + ('furni_chair_plasty*5_desc', 'Hip plastic furniture'), + ('hobba_mark_emergency', 'Emergency Help'), + ('furni_djesko_turntable_name', 'Habbo Turntable'), + ('furni_shelves_norja*9_desc', 'For nic naks and art deco books'), + ('poll_confirm_cancel_long', 'Are you sure you want to stop answering the poll? You can\'t continue later.'), + ('poster_32_desc', 'The Auspicious One'), + ('opening_hours_text_opening_time', 'The Hotel will open again at %h%:%m%. We look forward to welcoming you back!'), + ('furni_bed_budget_one*7_name', 'Green Pura Bed'), + ('furni_pillow*0_desc', 'Minimalist comfort!'), + ('furni_divider_poly3*8_desc', 'Yellow Mode Bardesk Gate'), + ('nav_venue_bb_lobby_beginner_13/0_desc', ''), + ('furni_sound_set_6_name', 'Ambient 3'), + ('hubu_win', 'Bus - Info'), + ('furni_sound_machine*5_name', 'Brown Traxmachine'), + ('furni_sporttrack1*2_desc', 'null'), + ('bb_title_bouncingBall', 'Battle Ball'), + ('nav_venue_rooftop/0_desc', 'Hang out on the very rooftop of Habbo Hotel!'), + ('modtool_banreason', 'Ban Reason:'), + ('furni_chair_silo*9_desc', 'Red Silo Dining Chair'), + ('furni_bed_budget*6_desc', 'King sized comfort!'), + ('furni_s_sound_machine*4_desc', 'Sound Machine Blue Desc'), + ('furni_rubberchair*6_desc', 'Soft and tearproof!'), + ('nav_venue_sw_lobby_expert_1_name', 'Snow Marksmen Lobby'), + ('nav_venue_bb_lobby_beginner_7/0_desc', ''), + ('furni_table_plasto_4leg*5_desc', 'Hip plastic furniture'), + ('gen_youhave', 'You Have'), + ('furni_carpet_soft*6_name', 'Soft Wool Rug'), + ('furni_petfood2_desc', 'Fantastic 20% Saving!'), + ('group_privileges', 'Priviliges:'), + ('furni_samovar_name', 'Russian Samovar'), + ('furni_hal_grave_name', 'Haunted Grave'), + ('furni_bed_budget_one*2_desc', 'Princess sized comfort!'), + ('gs_error_1', 'You have entered invalid data!'), + ('reject', 'Reject'), + ('gs_error_4', 'You have reached your maximum number of daily Games!'), + ('nav_venue_sw_lobby_tournament_5_name', 'Tournament Lobby'), + ('gs_error_5', 'Tournament is only available for users living in the UK.'), + ('gs_error_2', 'You don\'t have enough Tickets!'), + ('gs_error_8', 'To start a Game, there must be at least two Teams of one player each!'), + ('sound_machine_alert_no_sound_sets', 'You don\'t have any sound sets available for song editing. \\rNote that the sets need to be in your inventory (hand).'), + ('furni_waterbowl*4_desc', 'Aqua unlimited'), + ('furni_doormat_love_desc', 'Welcome Habbos in style'), + ('gs_error_6', 'You have been removed from the Game!'), + ('furni_soft_sofachair_norja*4_desc', 'Sit back and relax'), + ('bb_powerup_desc_8', 'By using a vacuum cleaner, you can clear any tile in the field.'), + ('move', 'Move'), + ('furni_romantique_smalltabl*3_name', 'Turquoise Tray Table'), + ('furni_bed_polyfon*8_name', 'Yellow Mode Double Bed'), + ('furni_sofachair_polyfon*4_desc', 'Beige Mode Armchair'), + ('forgottenpw_email', 'Your email address'), + ('console_email', 'Email'), + ('bb_powerup_desc_1', 'Light bulb colours an area around it.'), + ('furni_divider_nor2_desc', 'Strong, yet soft looking'), + ('furni_bardeskcorner_polyfon*5_desc', 'For sweet corners!'), + ('say', 'Say'), + ('bb_powerup_desc_3', 'Flashlight colours a straight line ahead of you.'), + ('bb_powerup_desc_2', 'Bouncing on a spring locks tiles in a single jump.'), + ('bb_powerup_desc_5', 'Bouncing on a box of pins will burst your Battle Ball!'), + ('bb_powerup_desc_4', 'A shot with a cannon locks tiles on a straight line.'), + ('furni_chair_basic*1_name', 'chair_basic'), + ('bb_powerup_desc_7', 'A bomb will clear all tiles around it.'), + ('bb_powerup_desc_6', 'Harlequin effect makes everybody colour tiles for your team!'), + ('NUF_console_read_next', 'Click \'OK\' to mark message as read.'), + ('poster_50_name', 'Bat Poster'), + ('furni_table_plasto_4leg*15_name', 'Occasional Table'), + ('furni_tree7_desc', 'Walking in a winter wonderland!'), + ('poster_37_name', 'The Habbo Babes 3'), + ('furni_queue_tile1*7_desc', 'The power of movement'), + ('furni_bed_budgetb_name', 'Plain Double Bed'), + ('interface_icon_sound', 'Sound Off/On'), + ('pet.hotwords.come_here', 'come here'), + ('poster_10_name', 'Lapland Poster'), + ('win_delete_item', 'Remove Item'), + ('wallitem_hrella_poster_3_name', 'Anchor'), + ('furni_table_plasto_bigsquare*8_desc', 'Hip plastic furniture'), + ('furni_habboween_grass_name', 'Unholy Ground'), + ('furni_plant_valentinerose*4_name', 'Pink Valentine\'s Rose'), + ('nav_venue_skylight_lobby/0_desc', 'Lift your spirits on the top floor'), + ('buddyremove_alphabetical', 'Alphabetical Order'), + ('alert_win_coppa', 'You are blocked'), + ('nav_venue_bb_lobby_amateur_5_name', 'Gevorderden Battle Ball 6'), + ('reg_update_text', 'Never change your password or email just because somebody asks you to. He / she is most probably trying to steal your Habbo account and furni!'), + ('decision_ok', 'OK'), + ('furni_summer_grill*3_name', 'Yellow Barbeque Grill'), + ('nav_public_helptext', 'These are hotel\'s public rooms. What are you waiting for? Go and meet other Habbos!'), + ('tickets_button_info_2', 'Stuff you can do with these 20 tickets'), + ('furni_rclr_chair_name', 'Palm Chair'), + ('login_create1here', 'You can create one here.'), + ('tickets_button_info_1', 'Stuff you can do with these 2 tickets'), + ('furni_prizetrophy6*3_name', 'Champion trophy'), + ('furni_shelves_norja*2_desc', 'For nic naks and art deco books'), + ('purse_info', 'DESCRIPTION'), + ('bb_choose_powerups', 'Powerup select'), + ('purse_transaction', 'View Transactions'), + ('reg_birthdayformat', 'Birthday*: [dd][mm][yyyy]'), + ('Alert_YouMustAgree', 'You must accept the Terms and Conditions before proceeding.'), + ('jukebox_empty', 'Empty'), + ('purse_info_film', 'Films For Camera'), + ('furni_sofachair_polyfon*9_desc', 'Loft-style comfort'), + ('furni_habbocake_desc', 'Save me a slice!'), + ('furni_doormat_plain*6_desc', 'Available in a variety of colours'), + ('nav_venue_sun_terrace/0_desc', 'For lazy afternoons and super tan treatment!'), + ('poster_501_desc', 'For pirates everywhere'), + ('pet_thir_2', 'Thirsty'), + ('gs_error_watch_0', 'All The Spectator Seats Are Taken!'), + ('pet_thir_3', 'Not thirsty'), + ('camera_open_dialog_text', 'Would you like to take some photos\\ror put your camera in your room?'), + ('furni_bed_budget_one*9_desc', 'Prince sized comfort!'), + ('ph_goswimming', 'Go swimming!'), + ('furni_habboween_crypt_name', 'Creepy Crypt'), + ('gs_error_join_7', 'You have already joined this Game!'), + ('nav_venue_sw_lobby_amateur_3_name', 'Snow Slingers Lobby'), + ('furni_romantique_smalltabl*4_name', 'Amber Tray Table'), + ('gs_error_join_3', 'You either have too much or too little skill to join.'), + ('pet_thir_0', 'Gasping'), + ('gs_error_join_0', 'The team you selected is already full.'), + ('pet_thir_1', 'Parched'), + ('furni_gothic_stool*3_name', 'Gothic Stool Red'), + ('furni_wooden_screen*1_name', 'Pink Oriental screen'), + ('furni_sofa_silo*4_name', 'Beige Area Sofa'), + ('furni_queue_tile1*2_desc', 'The power of movement'), + ('buddyremove_continue', 'Remove Friend Now'), + ('nav_venue_bb_lobby_expert_2/0_desc', ''), + ('nav_loading', 'Loading...'), + ('furni_bed_armas_two_name', 'Double Bed'), + ('furni_prizetrophy4*1_name', 'Fish trophy'), + ('furni_sound_machine*7_desc', 'Red alert. Red alert. It\'s a party!'), + ('furni_glass_sofa_desc', 'Translucent beauty'), + ('furni_barchair_silo*5_name', 'Pink Bar Stool'), + ('furni_soft_sofachair_norja*5_desc', 'Pink Iced Sofachair'), + ('console_fr_accepted_count', 'Amount to be accepted'), + ('poster_2001_desc', 'Perinteinen ryijy,'), + ('furni_couch_norja*5_desc', 'Two can perch comfortably'), + ('furni_rclr_lamp_desc', 'Light your space'), + ('furni_sand_cstl_wall_desc', 'sand_cstl_wall'), + ('furni_one_way_door*4_name', 'Beige One Way Gate'), + ('furni_corner_china_name', 'Dragon Screen'), + ('nav_venue_sw_lobby_amateur_4/0_desc', 'Astetta rankempaa lumisotaa.'), + ('furni_chair_silo*7_name', 'Green Silo Dining Chair'), + ('transaction_system_messenger', 'Console SMS'), + ('furni_pura_mdl4*8_desc', ''), + ('console_reject_selected', 'Reject selected'), + ('furni_rare_icecream*4_desc', 'Virtual strawberry rocks!'), + ('furni_prizetrophy*2_desc', 'Shiny silver'), + ('furni_scifiport*0_desc', 'Energy beams. No trespassers!'), + ('paalu_ui2', 'Push'), + ('paalu_ui3', 'Moving'), + ('paalu_ui4', 'Stabilise'), + ('paalu_ui5', 'Balance'), + ('furni_sofa_polyfon*7_name', 'Green Mode Sofa'), + ('nav_error_toomanyfavrooms', 'You can\'t have more than 10 favourite rooms! Please remove an old favourite if you want to add a new one.'), + ('furni_noob_stool*5_name', 'My first Habbo stool'), + ('sound_machine_alert_missing_packages', 'You need the following Traxpacks to edit this song:'), + ('furni_grunge_bench_name', 'Bench'), + ('paalu_ui1', 'Balance'), + ('furni_sleepingbag*5_name', 'Graphite Sleeping Bag'), + ('furni_divider_nor2*3_name', 'White Iced Bar-Desk'), + ('bb_header_teams', 'Teams'), + ('wallitem_sw_swords_name', 'Swords'), + ('furni_val_choco_desc', 'One for them. Two for me!'), + ('nav_venue_bb_lobby_expert_5/0_desc', ''), + ('furni_soft_sofa_norja*2_name', 'Black Iced Sofa'), + ('furni_bed_budgetb_one_desc', 'All you need for a good night\'s kip'), + ('furni_carpet_standard*8_name', 'Floor Rug'), + ('furni_rare_dragonlamp*6_name', 'Gold Dragon Lamp'), + ('furni_sound_set_56_desc', 'Get down tonight!'), + ('furni_divider_nor5*2_name', 'Black Iced Angle'), + ('chat.curse_word', 'Bobba'), + ('furni_couch_norja*4_desc', 'Two can perch comfortably'), + ('furni_scifirocket*2_desc', 'A little closer to home!'), + ('furni_rare_fan*6_desc', 'It\'ll blow you away!'), + ('poster_514_name', 'The EU flag'), + ('club_desc_2_period', '3 Months (93 days) = 60 Credits'), + ('furni_glass_chair*9_desc', 'Translucent beauty'), + ('poster_1338_desc', 'If her age on the clock, she ready for the cock'), + ('nav_src_hd', 'Search Results.'), + ('console_unknown_sender', 'Unknown sender'), + ('furni_prizetrophy4_name', 'Pokaali'), + ('nav_venue_sunset_cafe/0_desc', 'Come and chat about Official Fansites and meet their staff!'), + ('furni_pura_mdl4*9_desc', 'Any way you like it!'), + ('furni_pillar*8_name', 'Roman Pillar'), + ('nav_venue_sport/0_desc', 'St Trinian\'s is out on DVD April 14th!'), + ('furni_pillar*7_name', 'Atlantean Pillar'), + ('club_extend_text', 'If you\'re subscribing again to Habbo Club, you won\'t lose any of the advantages or ongoing furni gifts. Club membership can be extended in advance.\\rRemember: one club month lasts 31 days.'), + ('sound_machine_confirm_eject', 'Remove cartridge?'), + ('shopping_got', 'You have xx in your Purse.'), + ('furni_rare_stand_desc', 'Stand and Deliver!'), + ('furni_chair_plasto_desc', 'Hip plastic furniture'), + ('furni_bed_polyfon_one*9_desc', 'Cot of the artistic'), + ('furni_couch_norja*9_name', 'Red Bench'), + ('poster_3_desc', 'Smells fishy, looks cool'), + ('paalu.winner', 'Winner:'), + ('NUF_meeting_people_room_wave', 'These buttons let you wave and dance. Click on your Habbo at anytime to see these buttons.'), + ('sound_machine_confirm_window', 'Sound Machine'), + ('furni_one_way_door*3_name', 'White HC Gate'), + ('furni_chair_plasty*9_name', 'Plastic Pod Chair'), + ('gs_timeleft', 'Time Left \\x'), + ('hobba_pickup', 'Pick Up'), + ('console_lastvisit', 'Last Visit'), + ('furni_rare_globe_desc', 'It\'s all white..'), + ('furni_val_cauldron_name', 'Valentine\'s Cauldron'), + ('poster_43_name', 'Chains'), + ('furni_bardesk_polyfon*8_desc', 'Yellow Mode Bardesk'), + ('furni_sound_set_36_name', 'Latin Love 1'), + ('dimmer_apply', 'Apply'), + ('furni_glass_chair*8_desc', 'Translucent beauty'), + ('furni_pura_mdl2*7_desc', 'Any way you like it!'), + ('furni_prizetrophy*3_desc', 'Breathtaking bronze'), + ('furni_marquee*1_name', 'Pink marquee'), + ('NUH_own_user', 'This is your Habbo. Click on the floor to move around.'), + ('furni_gothic_sofa*1_desc', 'The dark side of Habbo'), + ('furni_divider_nor5*3_name', 'White Iced Angle'), + ('furni_divider_nor4*5_name', 'Pink Iced Auto Shutter'), + ('furni_soft_sofa_norja*3_name', 'White Iced Sofa'), + ('furni_sofachair_silo*8_desc', 'Large, but worth it'), + ('furni_pura_mdl1*9_desc', 'Any way you like it!'), + ('furni_chair_plasto*7_name', 'Chair'), + ('furni_pura_mdl5*6_desc', 'Any way you like it!'), + ('emailpw', 'Send'), + ('sound_machine_playlist_window', 'Traxmachine Playlist Editor'), + ('furni_pura_mdl1*3_desc', 'Any way you like it!'), + ('furni_noob_table*5_desc', 'Lightweight, practical and pink'), + ('furni_scifirocket*6_name', 'Mercury Smoke Machine'), + ('furni_shelves_norja_name', 'Bookcase'), + ('poster_521_name', 'Flag of Brazil'), + ('sound_machine_jukebox_disk_window', 'Insert disc'), + ('furni_table_norja_med*6_desc', 'For larger gatherings'), + ('furni_pillow*6_name', 'Blue Cotton Pillow'), + ('furni_shelves_norja*3_desc', 'For nic naks and art deco books'), + ('queue_set.s.info', 'There are %d% Habbos in front of you in the queue to see the Habbo Live broadcast!'), + ('reg_parentemail_info', 'Because of your age, we need to let your parents know you are registering at Habbo Hotel. Please give the email address of one of your parents/guardians.'), + ('club_txt_paycash', 'Pay by Cash'), + ('furni_chair_plasto*11_name', 'Chair'), + ('furni_pizza_name', 'Pizza Box'), + ('furni_table_plasto_4leg*6_desc', 'Hip plastic furniture'), + ('furni_chair_silo*3_desc', 'Keep it simple'), + ('alert_reg_t', 'Please check these details:'), + ('nav_venue_theatredrome_name', 'Theatredrome'), + ('furni_hc_rntgn_desc', 'Believe it or not!'), + ('nav_venue_main_lobby_name', 'Main Lobby'), + ('furni_sound_set_64_desc', 'Make a little Jinn-gle!'), + ('nav_venue_sw_lobby_amateur_desc', 'Practice improves a Snow Stormer\'s aim... Ops, missed!'), + ('furni_scifiport*5_name', 'Security Fence'), + ('furni_lamp_basic_desc', 'Switch on the atmosphere with this sophisticated light'), + ('pet.saying.sniff.cat.0', 'snuh..snuh'), + ('poster_506_name', 'The flag of Finland'), + ('furni_bardeskcorner_polyfon*6_desc', 'Blue Mode Bardesk Corner'), + ('nav_venue_hotel_kitchen_name', 'Hotel Kitchen'), + ('furni_doorB_desc', 'Narnia this way!'), + ('poster_11_name', 'Certificate'), + ('furni_safe_silo_desc', 'Totally shatter-proof!'), + ('furni_bed_budget_one*3_desc', 'Prince sized comfort!'), + ('furni_romantique_divider*4_name', 'Ochre Screen'), + ('previous_onearrowed', '< Previous'), + ('nav_venue_bb_lobby_tournament_3_name', 'Competitie Battle Ball 4'), + ('furni_plant_sunflower_desc', 'For happy Habbos'), + ('furni_throne_desc', 'Important Habbos only'), + ('furni_exe_bardesk_name', 'Executive Bar Desk'), + ('furni_tree6_desc', 'The future\'s bright!'), + ('log_problem_title', 'Problems Connecting'), + ('furni_chair_basic*2_name', 'Pink Pura Egg Chair'), + ('game_chess_black', 'Black:'), + ('furni_glass_sofa*9_name', 'Glass sofa'), + ('furni_chair_norja*2_desc', 'Sleek and chic for each cheek'), + ('furni_pillar*3_desc', 'Ancient and stately'), + ('furni_scifidoor*8_desc', 'There out of this world!'), + ('alert_InvalidUserName', 'Don\'t use this character: \\x !'), + ('furni_rare_parasol*3_name', 'Violet Parasol'), + ('furni_bed_budget*5_desc', 'King sized comfort!'), + ('furni_chair_silo*8_name', 'Yellow Dining Chair'), + ('nav_tryingpw', 'Trying the password...'), + ('furni_cn_lamp_desc', 'Light of the East'), + ('furni_prizetrophy3*3_name', 'Globe trophy'), + ('furni_sound_set_16_desc', 'Ferry, ferry good!'), + ('furni_table_plasto_round*4_desc', 'Hip plastic furniture'), + ('poster_2007_desc', 'The legendary founder of the Hotel'), + ('sound_machine_insert', 'Add to mixer'), + ('furni_sound_machine*1_desc', 'Let the party begin!'), + ('furni_bed_polyfon_one*8_desc', 'Yellow Mode Single Bed'), + ('error_room_closed', 'Huone on suljettu.'), + ('pet.hotwords.play_dead', 'play dead'), + ('gs_button_go_finished', 'Scores'), + ('group_member', 'Member'), + ('sound_machine_confirm_save', 'Save the song?'), + ('furni_arabian_wndw_desc', 'Arabian days and nights'), + ('nav_venue_sw_lobby_expert_2_name', 'Snow Marksmen Lobby'), + ('furni_sound_set_57_desc', 'Feel the groove'), + ('furni_triplecandle_desc', 'No need to worry about wax drips'), + ('char_welcome', 'Welcome!'), + ('furni_sound_machine*6_desc', 'Add some effects to your room!'), + ('furni_sofachair_polyfon*3_desc', 'Loft-style comfort'), + ('nav_venue_bb_lobby_amateur_6/0_desc', ''), + ('group_logo_url_template', 'http://www.habbohotel.co.uk/habbo-imaging/badge-fill/%imagerdata%.gif'), + ('furni_table_plasto_bigsquare*2_desc', 'Hip plastic furniture'), + ('furni_glass_table*5_desc', 'Translucent beauty'), + ('url_purse_link', 'http://%predefined%//credits?'), + ('buddyremove_logintime', 'Last Login Time'), + ('NUF_meeting_people_hotelview_tutor', 'The Navigator lets you move between rooms in the Hotel, so open it up to get started!'), + ('furni_sofa_polyfon*6_name', 'Blue Mode Sofa'), + ('furni_scifirocket*1_desc', 'There is always space for this!'), + ('nav_venue_bb_lobby_amateur_10/0_desc', ''), + ('furni_prizetrophy5_name', 'Pokaali'), + ('purse_info_tickets', 'Gaming Tickets'), + ('poster_513_name', 'The Australian flag'), + ('furni_noob_chair*3_desc', 'Lightweight, practical, with red stripes'), + ('alert_old_client', 'You have an old version cached. Please empty your browser cache and login again.'), + ('furni_bar_basic_name', 'A Pura Minibar'), + ('furni_shelves_norja*8_desc', 'For nic naks and art deco books'), + ('sound_machine_save_window', 'Save your Trax'), + ('poster_51_name', 'Basketball Hoop'), + ('Alert_moderator_warning', ''), + ('furni_solarium_norja*5_name', 'Pink Solarium'), + ('furni_sporttrack2*1_desc', 'null'), + ('furni_rubberchair*7_desc', 'Soft and tearproof!'), + ('reg_parentemail_moreinfo', 'More information:'), + ('furni_present_gen5_desc', 'What\'s inside?'), + ('furni_bed_polyfon*9_desc', 'Give yourself space to stretch out'), + ('sound_machine_confirm_save_list_long', 'Are you sure you want to overwrite the current playlist?'), + ('cam_zoom_in.help', 'Zoom In'), + ('furni_carpet_soft*5_name', 'Soft Wool Rug'), + ('furni_plant_small_cactus_name', 'Small Cactus'), + ('console_creatingaprofile', 'Creating A Profile'), + ('console_select_all', 'Select all'), + ('hobba_reply_cfh', 'Reply to:'), + ('notickets_buygame', 'Buy a game'), + ('furni_sporttrack1*3_desc', 'null'), + ('furni_sleepingbag*1_desc', 'Ultimate coziness'), + ('furni_gothic_stool*4_name', 'Black Gothic Stool'), + ('nav_venue_bb_lobby_beginner_4/0_desc', ''), + ('nav_venue_netcafe/0_desc', 'Learn a foreign language and win Habbo Credits in our quests!'), + ('poster_31_desc', 'Pure and unbridled nu-metal'), + ('furni_sound_set_24_desc', 'It\'s all about the Pentiums, baby!'), + ('pet.saying.angry.dog.3', 'dog.1=Oouh..oouh..snuh..ooo'), + ('furni_bed_budget_one*8_desc', 'Prince sized comfort!'), + ('pet.saying.angry.dog.4', 'ARRR Grrr.. woof woof woof'), + ('pet.saying.angry.dog.1', 'Woof! Grrrr..woof woof'), + ('furni_sw_table_desc', ''), + ('pet.saying.angry.dog.2', 'grRRRRrr.r...r'), + ('pet.saying.angry.dog.0', 'Rrrr..woof.. Rrr'), + ('furni_chair_china_name', 'Chinese Lacquer Chair'), + ('furni_romantique_divan*2_desc', 'Recline in continental comfort'), + ('furni_divider_silo1*6_desc', 'Blue Area Corner Shelf'), + ('furni_sound_set_5_name', 'Ambient 4'), + ('roomevent_browser_create', 'Host an event'), + ('furni_noob_rug*6_desc', 'Nice and neat sisal rug with green edging'), + ('transaction_system_bank_luottokunta', 'Luottokortti'), + ('furni_bed_armas_one_name', 'Single Bed'), + ('furni_plant_fruittree_desc', 'Great yield and sweet fruit'), + ('furni_sound_machine_pro_desc', 'creating fancy sounds'), + ('nav_ownrooms_helptext', 'If you didn\'t know, these are your rooms. Here you can modify your rooms or create new ones if you feel like it.'), + ('furni_grunge_radiator_desc', 'Started cool but now it\'s hot!'), + ('furni_divider_silo3*7_desc', 'Green Area Gate'), + ('room_hold', 'Wait a second...\\rLoading room...'), + ('furni_sound_set_49_desc', 'You will belong'), + ('nav_venue_emperors/0_desc', 'Even the smallest of light... shines in the darkness'), + ('furni_nest_name', 'Basket'), + ('furni_noob_table*4_name', 'My first Habbo table'), + ('furni_sound_set_51_desc', 'Bop to the beat'), + ('furni_plant_maze_snow_desc', '20 x Snowy Maze Shrubbery'), + ('NUF_meeting_people_hotelview_icon', 'Click the Navigator button to start visiting the rooms!'), + ('furni_scifirocket*7_desc', 'Larger than life!'), + ('furni_table_plasto_round*9_name', 'Round Dining Table'), + ('furni_val_teddy*5_name', 'Yellow Share Bear'), + ('nav_venue_bb_lobby_expert_2_name', 'Experts Battle Ball 3'), + ('console_onfrontpage', 'Online'), + ('poster_1000_desc', 'The Noble and Silver Show'), + ('furni_rare_icecream*9_name', 'Bubblegum Ice Cream Machine'), + ('furni_rare_fan*0_name', 'Festive Fan'), + ('furni_carpet_polar_name', 'Faux-Fur Bear Rug'), + ('hobba_chatlog', 'See Chat Log >>'), + ('furni_romantique_chair*3_desc', 'null'), + ('hobba_pickedby', 'Picked Up By:'), + ('poster_24_desc', 'Trying to get in or out?'), + ('furni_table_silo_small*2_desc', 'For those random moments'), + ('furni_table_plasto_bigsquare*15_name', 'Occasional Table'), + ('furni_prizetrophy7*2_desc', 'Silver Habbo trophy'), + ('ph_keys_run', 'Run:'), + ('error_title', 'Oops, error!'), + ('furni_rare_dragonlamp*0_name', 'Fire Dragon Lamp'), + ('furni_CFC_50_coin_silver_name', 'Silver Coin (China)'), + ('furni_chair_plasty_name', 'Plastic Pod Chair'), + ('nav_roomInfo', 'Room info'), + ('furni_sound_set_63_name', 'Alhambra Trax 2'), + ('furni_divider_nor2*9_desc', 'Red Iced bar desk'), + ('furni_soft_sofa_norja*8_name', 'Yellow Iced Sofa'), + ('poster_57_desc', 'chinese calligraphy'), + ('furni_table_plasto_4leg*16_name', 'Occasional Table'), + ('accept', 'Accept'), + ('pet.saying.beg.cat.2', 'MEOW, MEOW, MEOW..'), + ('furni_waterbowl*3_desc', 'Aqua unlimited'), + ('furni_divider_poly3*2_name', 'Black Mode Bardesk Gate'), + ('furni_divider_nor3_desc', 'Do go through...'), + ('furni_table_plasto_square*5_desc', 'Hip plastic furniture'), + ('furni_rubberchair*1_desc', 'Soft and stylish HC chair'), + ('furni_divider_nor5*8_name', 'Yellow Iced Angle'), + ('furni_pura_mdl4*3_desc', 'Any way you like it!'), + ('nav_removerights_desc', 'Remove all rights to this room from other users.'), + ('furni_chair_norja*7_name', 'Rural Chair'), + ('furni_pillar*2_name', 'Nordic Pillar'), + ('furni_bed_polyfon*3_name', 'White Double Bed'), + ('furni_glass_chair*3_desc', 'Translucent beauty'), + ('wallitem_xmas_light_name', 'Xmas light'), + ('pet.saying.beg.cat.0', 'MaUUU...MEOW...meow'), + ('pet.saying.beg.cat.1', '*looks up with sad eyes*'), + ('reg_verification_newEmail', 'Your new email address:'), + ('furni_sound_set_29_desc', 'Electronic house'), + ('furni_joulutahti_desc', 'Christmas in a pot'), + ('furni_china_table_name', 'Chinese Lacquer Table'), + ('poster_507_desc', 'The French flag'), + ('NUF_visiting_rooms_hotelview_nav', 'Click the icon to open the Navigator.'), + ('dimmer_preset_1', 'Preset 1'), + ('nav_private_helptext', 'These are the rooms owned by Habbos. Select a category first and then browse some rooms and meet some people!'), + ('furni_queue_tile1*8_desc', 'The power of movement'), + ('dimmer_preset_2', 'Preset 2'), + ('furni_arabian_pllw_name', 'Green Blossom Pillow'), + ('nav_venue_bb_lobby_tournament_7/0_desc', ''), + ('furni_goodie1*1_desc', 'Crunchy Dog Treat'), + ('poster_36_name', 'The Habbo Babes 2'), + ('poll_window', 'Question'), + ('furni_md_limukaappi_desc', 'A sparkling and refreshing pixel drink!'), + ('nav_venue_rooftop_rumble_ii_name', 'Rooftop Rumble II'), + ('furni_wooden_screen*7_name', 'Purple Oriental Screen'), + ('furni_scifidoor*2_name', 'Yellow Spaceship Door'), + ('room_max_pet_limit', 'Too many pets in the room!'), + ('hobba_sent_to_helpers', 'Call re-assigned as emergency and sent to moderators'), + ('furni_table_silo_med*4_desc', 'Beige Area Coffee Table'), + ('furni_romantique_pianochair*5_name', 'Onyx Piano Stool'), + ('nav_modify_roomdescription', 'Room Description'), + ('furni_sound_set_10_name', 'Hip Hop Beats 1'), + ('furni_chair_silo*2_name', 'Black Dining Chair'), + ('furni_marquee*6_name', 'Blue Marquee'), + ('poster_8_name', 'Habbo Colours'), + ('transaction_system_htk_singledrop', 'Landline'), + ('furni_chair_plasty*4_desc', 'Hip plastic furniture'), + ('dimmer_preset_3', 'Preset 3'), + ('furni_exe_corner_desc', 'Tuck it away'), + ('nav_venue_welcome_lounge/0_desc', 'New? Lost? Get a warm welcome here from Habbo eXperts.'), + ('furni_sleepingbag*6_desc', 'Ultimate coziness'), + ('nav_venue_cunning_fox_gamehall/3_name', 'Batleships'), + ('console_mainhelp', 'Habbo Console Help'), + ('tickets_button_info_hide', 'Hide Ticket Info'), + ('furni_xmas_icelamp_name', 'Lantern Bundle 2'), + ('nav_venue_bb_lobby_amateur_0/0_desc', ''), + ('purse_header', 'Habbo Purse'), + ('furni_noob_lamp*3_name', 'My first Habbo lamp'), + ('nav_help_title', 'Want a room of your own?'), + ('buy', 'Buy'), + ('furni_pura_mdl1*8_name', 'yellow pura module 1'), + ('dimmer_title', 'Mood Light'), + ('NUF_mini_meet_people_hotelview_icon', 'Click the Navigator button to start visiting the rooms!'), + ('console_credits', 'Credits'), + ('bb_link_highScores_url', 'http://%predefined%/groups/56552/id'), + ('wallitem_md_logo_wall_desc', 'Bubble up your wall'), + ('furni_safe_silo*4_desc', 'Totally shatter-proof!'), + ('room_unignore', 'Listen'), + ('nav_venue_sw_lobby_amateur_1/0_desc', ''), + ('poster_16_name', 'Bars'), + ('furni_sofachair_silo*7_name', 'Green Area Armchair'), + ('furni_spyro_name', 'Dragon Egg'), + ('nav_venue_bb_lobby_beginner_19/0_desc', ''), + ('Alert_YourPasswordIsTooShort', 'Passwords must be at least 6 characters long.'), + ('room_cant_trade', 'You cannot trade this!'), + ('furni_door_desc', 'Dr Who?'), + ('gs_button_go_created', 'Join'), + ('poster_49_name', 'Large silver star'), + ('furni_glass_sofa*4_name', 'Glass sofa'), + ('furni_divider_arm3_desc', 'Knock, knock...'), + ('furni_sound_set_31_desc', 'House loops'), + ('reg_habboname', 'Habbo name:'), + ('habboclub_thanks', 'Yippee! You are now a member of Habbo Club! Your current email address is %email%. \\r\\rIf that\'s not the one you are using, please go to \'Update my Habbo ID\' and change it now. \\rThen we can contact you about your membership if need be.'), + ('console_follow_offline', 'Your friend is offline.'), + ('furni_divider_nor1*5_name', 'Pink Ice corner'), + ('nav_openbutton', 'Open'), + ('nav_venue_theatredrome_habbowood/0_desc', 'Home to the Habbowood Gala and HAFTA Awards!'), + ('nav_venue_ice_cafe/0_desc', 'Come here. And chill out.'), + ('furni_calippo_name', 'Calippo icecream machine'), + ('furni_bench_lego_desc', 'For your reserve players'), + ('poster_9_desc', 'Do your bit for the environment'), + ('furni_bed_polyfon_one*3_desc', 'Cot of the artistic'), + ('poster_44_desc', 'Beware the curse...'), + ('poster_2006_name', 'DJ Throne'), + ('furni_pura_mdl3*5_desc', ''), + ('furni_arabian_tray4_name', 'Fruit Tray'), + ('furni_divider_nor3*7_desc', 'Entrance or exit?'), + ('furni_sound_set_30_name', 'Instrumental 1'), + ('furni_romantique_tray1_name', 'Breakfast Tray'), + ('furni_jp_tray1_desc', 'jp_tray1'), + ('furni_plant_maze_desc', 'Build your maze!'), + ('console_getfriendrequest_2', 'If you accept this invitation (s)he will be added to your Friends List. Then you can send messages to each other.'), + ('furni_hockey_light_name', 'Lert'), + ('furni_goodie1_desc', 'Crunchy Dog Treat'), + ('console_getfriendrequest_1', 'has asked you to become his/her Friend.'), + ('furni_pura_mdl2*1_desc', 'Any way you like it!'), + ('score_board.text', 'POINTS'), + ('furni_one_way_door*9_name', 'Red One Way Gate'), + ('furni_sand_cstl_twr_desc', 'sand_cstl_twr desc'), + ('furni_divider_nor5*9_desc', 'Cool cornering for your crib y0!'), + ('furni_duck_desc', 'Every bather needs one'), + ('furni_bardesk_polyfon*2_desc', 'Black Mode Bardesk'), + ('console_request_2', '(S)he will be added into your Friends List if (s)he accepts it.'), + ('bb_link_join', 'Join Team'), + ('nav_createroom_hd', 'Here you can create your own room!'), + ('console_request_1', 'has been sent your Friend Request.'), + ('reg_check_info', 'CHECK YOUR INFO'), + ('furni_toy1*4_name', 'Rubber Ball'), + ('nav_venue_sw_lobby_free_0_name', 'Free Game Lobby'), + ('furni_chair_plasto*1_name', 'Chair'), + ('furni_toilet_name', 'Loo Seat'), + ('queue_set.dc.info', 'Number of Habbos in default queue is %d% and in Habbo Club queue %c%'), + ('furni_sofachair_silo*2_desc', 'Large, but worth it'), + ('furni_chair_plasto*12_desc', 'Hip plastic furniture'), + ('ph_tickets_buyfor', 'Buy Tickets for:'), + ('sound_machine_confirm_close', 'Close the editor?'), + ('furni_rare_fan*1_desc', 'It\'ll blow you away!'), + ('furni_divider_poly3*3_desc', 'Border control!'), + ('nav_venue_kattoterassi/0_desc', 'When push comes to shove...'), + ('furni_summer_grill*4_desc', 'Plenty of burgers on that barbie'), + ('furni_bar_armas_desc', 'It\'s a barrel of laughs and a great talking point'), + ('furni_toilet_red_name', 'Loo Seat'), + ('furni_hc_lmp_desc', 'Be enlightened'), + ('furni_romantique_mirrortabl_name', 'Dressing Table'), + ('furni_pura_mdl4*2_name', 'Pink Pura Module 4'), + ('summer_chair_5_desc', 'Enjoy the summer air'), + ('furni_plant_rose_desc', 'Sleek and chic'), + ('furni_skullcandle_name', 'Skull Candle Holder'), + ('Alert_no_credits', 'You don�t have enough Credits for this.'), + ('pet.hotwords.voice', 'speak'), + ('furni_prizetrophy4*2_desc', 'Shiny silver'), + ('furni_soft_sofachair_norja*4_name', 'Urban Iced Sofachair'), + ('furni_pura_mdl5*1_desc', 'Any way you like it!'), + ('furni_safe_silo*9_name', 'Red Safe Minibar'), + ('furni_bed_trad_desc', 'Sweet dreams for two'), + ('nav_venue_club_massiva_desc', 'Strut your funky stuff!'), + ('furni_rare_dragonlamp*1_desc', 'Out of the deep blue!'), + ('furni_wooden_screen*2_desc', 'Add an exotic touch to your room'), + ('furni_prizetrophy7*1_name', 'Gold Habbo trophy'), + ('furni_carpet_standard*2_name', 'Floor Rug'), + ('furni_arabian_teamk_desc', 'Quench that desert thirst'), + ('furni_romantique_chair*2_name', 'Lime Romantique Chair'), + ('nav_venue_sw_lobby_tournament_0_name', 'Tournament Lobby'), + ('invitation_expired', 'Sorry, all Welcoming Party members were busy.'), + ('gs_error_game_checkname', 'Please check the Game\'s name!'), + ('furni_sound_set_23_name', 'SFX 4'), + ('furni_grand_piano*2_desc', 'Black Grand Piano'), + ('tutorial_quit', 'Close guide'), + ('furni_chair_basic*8_desc', ''), + ('NUF_getting_room_roommatic_security_tutor', 'Finally you can choose the security settings to your room and whether other users can move your furniture.'), + ('nav_venue_bb_lobby_beginner_1/0_desc', ''), + ('nav_private_helptext_hd_main', 'Habbo Guest Rooms'), + ('club_price', 'One month costs 25 Habbo Credits.'), + ('NUF_playing_games_navigator_tutor', 'Click either SnowStorm or BattleBall to open up a list of the game lounges.'), + ('nav_venue_old_skool_name', 'Old Skool Habbo'), + ('nav_venue_bb_lobby_beginner_4_name', 'Beginners Battle Ball 5'), + ('nav_venue_bb_lobby_tournament_9_name', 'Competitie Battle Ball 10'), + ('sound_machine_alert_song_saved', 'Song "%name%" successfully saved.'), + ('nav_venue_sw_lobby_intermediate_3_name', 'Snow Bombardiers Lobby'), + ('nav_venue_club_massiva/1_desc', 'Strut your funky stuff'), + ('furni_gothic_chair*1_name', 'Gothic Chair Pink'), + ('furni_divider_poly3_desc', 'All bars should have one'), + ('furni_romantique_divan*1_name', 'Pink Romantique Divan'), + ('NUF_playing_games_hotelview_tutor', 'Now we find out where to locate the Habbo Games!'), + ('poster_29_name', 'Gold Tinsel Bundle'), + ('furni_present_gen4_name', 'Gift'), + ('furni_bardesk_polyfon*7_name', 'Green Mode Bardesk'), + ('furni_gothic_sofa*6_name', 'Gothic Sofa Blue'), + ('furni_glass_stool*5_name', 'Glass stool'), + ('nav_venue_sw_lobby_free_5/0_desc', 'Kaikki eritasoiset pelaajat voivat pelata toisiaan vastaan.'), + ('nav_fav_hd', 'Your Favourite Rooms.'), + ('NUF_console_read_tutor', 'The Habbo Console lets you message your Habbo friends, and check whether they are online.'), + ('furni_romantique_tray2_desc', 'Spoil Yourself'), + ('Alert_ModeratorWarning', 'Message from a Moderator:'), + ('furni_giftflowers_name', 'Vase of Flowers'), + ('furni_table_silo_small*7_name', 'Green Area Occasional Table'), + ('furni_menorah_name', 'Menorah'), + ('furni_bed_polyfon_one*2_name', 'Black Mode Single Bed'), + ('console_offline', 'Offline'), + ('gs_mouseover_player', '\\x\\r\\yp'), + ('nav_venue_bb_lobby_amateur_3/0_desc', ''), + ('nav_venue_bb_lobby_amateur_13/0_desc', ''), + ('furni_noob_chair*2_name', 'My first Habbo chair'), + ('furni_doormat_plain*1_desc', 'Available in a variety of colours'), + ('object_displayer_hide_tags', 'Hide tags'), + ('poster_17_desc', 'Beautiful reproduction butterfly'), + ('gs_joinedplayers', 'Players Who Joined: \\x'), + ('furni_table_plasto_round*3_name', 'Round Dining Table'), + ('furni_divider_poly3*8_name', 'Yellow Mode Bardesk Gate'), + ('furni_glass_table*4_name', 'Glass table'), + ('furni_solarium_norja*6_desc', 'Rejuvenate your pixels!'), + ('poster_1006_desc', 'The eyes follow you...'), + ('furni_noob_rug*5_name', 'My first Habbo rug'), + ('buddyremove_pagecounter', 'Page'), + ('poll_alert_answer_missing', 'Please give an answer'), + ('furni_summer_chair*5_desc', 'Beige'), + ('furni_table_plasto_4leg*10_name', 'Occasional Table'), + ('furni_divider_silo2_desc', 'Stylish sectioning'), + ('furni_djesko_turntable_desc', 'For the music-lovers'), + ('nav_remrightsconf', 'You are about to remove all rights from your room. This means that only you will have rights to move and place furni in the room.'), + ('furni_pillow*0_name', 'White Lace Pillow'), + ('sound_machine_eject', 'Eject'), + ('gs_button_ready', 'Ready'), + ('furni_divider_silo1*5_name', 'Pink Area Corner Shelf'), + ('NUF_habbo_home_hotelview_tutor', 'You have now opened a page on the Habbo Website that will give you plenty of information about how to make yourself a Habbo Home.'), + ('furni_traffic_light*4_desc', 'Chill and wait your turn!'), + ('nav_venue_$unit.name$/0_desc', 'Roam more of the hotel\'s corridors'), + ('furni_sporttrack1*2_name', 'Sport track straight asphalt'), + ('furni_sofachair_polyfon_girl_name', 'Armchair'), + ('furni_sound_set_6_desc', 'Background ambience loops'), + ('furni_hal_grave_desc', 'We\'re raising the dead!'), + ('recycler_ready_info', 'Your recycled Furniture is ready. Please either accept or cancel. If you accept, you will receive your recycling reward, detailed below. If you cancel, all your old Furniture will be restored to your hand.'), + ('wallitem_jp_sheet1_name', 'jp_sheet1'), + ('furni_petfood2_name', 'Sardines Mega Multipack'), + ('furni_spotlight_name', 'Habbowood Spotlight'), + ('furni_carpet_soft*6_desc', 'Soft Wool Rug'), + ('gs_lounge_skill', 'Level in this Lounge: \\x \\r (\\y-\\z points)'), + ('nav_help_text', 'Click the Public Spaces tab on the top left of this navigator to find gaming rooms!'), + ('furni_table_plasto_4leg*5_name', 'Occasional Table'), + ('nav_venue_bb_arena_1_name', 'Battle Ball Aloittelijat'), + ('furni_table_silo_med*9_name', 'Red Area Coffee Table'), + ('furni_bed_budget_one*2_name', 'Pink Pura Bed'), + ('nav_venue_sw_lobby_expert_2/0_desc', 'Todellisille lumisotureille.'), + ('furni_rubberchair*6_name', 'Violet Inflatable Chair'), + ('furni_bardeskcorner_polyfon*5_name', 'Candy Corner'), + ('bb_powerup_8', 'Vacuum cleaner'), + ('bb_powerup_6', 'Harlequin'), + ('furni_rare_beehive_bulb*2_name', 'Yellow Amber Lamp'), + ('bb_powerup_7', 'Bomb'), + ('furni_divider_nor2_name', 'Ice Bar-Desk'), + ('bb_powerup_4', 'Cannon'), + ('bb_powerup_5', 'Box of pins'), + ('bb_powerup_2', 'Spring'), + ('bb_powerup_3', 'Flashlight'), + ('console_report', 'Report'), + ('bb_powerup_1', 'Light bulb'), + ('furni_sound_set_43_name', 'SFX 1'), + ('poster_37_desc', 'The Hotels girlband. Dream on!'), + ('interface_icon_messenger', 'Messenger, friends & messages on here'), + ('interface_icon_hand', 'Hand, your inventory'), + ('furni_s_sound_machine*4_name', 'Sound Machine Blue'), + ('nav_venue_sunset_cafe_name', 'Sunset Cafe'), + ('wallitem_sw_stone_desc', 'sw_stone'), + ('reg_check_mail', 'Email'), + ('furni_queue_tile1*7_name', 'Purple Habbo Roller'), + ('pet.hotwords.nest', 'sleep'); +/*!40000 ALTER TABLE `external_texts` ENABLE KEYS */; + +-- Dumping structure for table havana.furniture_versions +CREATE TABLE IF NOT EXISTS `furniture_versions` ( + `asset_name` varchar(255) NOT NULL DEFAULT '', + `version_id` int(11) NOT NULL, + PRIMARY KEY (`asset_name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- Dumping data for table havana.furniture_versions: ~0 rows (approximately) +DELETE FROM `furniture_versions`; +/*!40000 ALTER TABLE `furniture_versions` DISABLE KEYS */; +/*!40000 ALTER TABLE `furniture_versions` ENABLE KEYS */; + +-- Dumping structure for table havana.games_maps +CREATE TABLE IF NOT EXISTS `games_maps` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `game_type` enum('battleball','snowstorm') NOT NULL DEFAULT 'battleball', + `map_id` enum('6','5','4','3','2','1') NOT NULL DEFAULT '1', + `heightmap` mediumtext NOT NULL, + `tile_map` mediumtext NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.games_maps: ~5 rows (approximately) +DELETE FROM `games_maps`; +/*!40000 ALTER TABLE `games_maps` DISABLE KEYS */; +INSERT INTO `games_maps` (`id`, `game_type`, `map_id`, `heightmap`, `tile_map`) VALUES + (1, 'battleball', '5', 'xxxx000000000000000xxxx|xxxx000000000000000xxxx|xxxx000000000000000xxxx|xxxx000000000000000xxxx|00000000000000000000000|00000000000000000000000|00000000000000000000000|00000000000000000000000|00000000000000000000000|00000000000000000000000|00000000000000000000000|00000000000000000000000|00000000000000000000000|00000000000000000000000|00000000000000000000000|00000000000000000000000|00000000000000000000000|00000000000000000000000|00000000000000000000000|xxxx000000000000000xxxx|xxxx000000000000000xxxx|xxxx000000000000000xxxx|xxxx000000000000000xxxx|', '00001111111111111110000|00001111111111111110000|00001111111111111110000|00001111111111111110000|11111111111111111111111|11111111111111111111111|11111111111111111111111|11111111111111111111111|11111111111111111111111|11111111111111111111111|11111111111111111111111|11111111111111111111111|11111111111111111111111|11111111111111111111111|11111111111111111111111|11111111111111111111111|11111111111111111111111|11111111111111111111111|11111111111111111111111|00001111111111111110000|00001111111111111110000|00001111111111111110000|00001111111111111110000|'), + (2, 'battleball', '3', '0000000x000x0000xxxxxxxxxxxxxxxxx|0xx00x0x0x0000000111000xxxxxxxxxx|0xx00x0x0x00000001110000xxxxxxxxx|0000xx000xxx0000xxxxxx000xxxxxxxx|000xxxxxxxxxxxxxxxxxxxx000xxxxxxx|0xxxxxxxxxxxxxxxxxxxxxxx000xxxxxx|0000xxxxxxxxxxxxxxxxxxxxx000xxxxx|xxx0xxx111111111111111xxx0x0xxxxx|0000xxx111111111111111xxx0x0x0xxx|0xxxxxx111111111111111xxx0x0x0xxx|000xxxx1111111111111111000x00000x|x00xxxx1111111111111111000x0x0xxx|0000xxx111112222211111xxxxxxx0000|0000xxx111112222211111xxx000xxxx0|0000xxx111112222211111xxx000000x0|0000xxx111112222211111xxx000xx0x0|x00xxxx111112222211111xxxxxxx0000|x11xxxx11111111111111110000000xxx|x11xxxx11111111111111110000000xxx|x11xxxx111111111111111xxx0xxxxxxx|x00xxxx111111111111111xxx000xxxxx|x00xxxx111111111111111xxxxxxxxxxx|x000xxxxxx11xxxxx11xxxxxxxxxxxxxx|xx000xxxxx00xxxxx00xxxxxxxxxxxxxx|xxx000xxxx00xxxxx00xxxxxxxxxxxxxx|xxxx00000000x000x0000xxxxxxxxxxxx|xxxxx00xxxxxx000x00x0xxxxxxxxxxxx|xxxxxx000000x000x00x0xxxxxxxxxxxx|xxxxxxxxxx0xxx0xx00xxxxxxxxxxxxxx|xxxxxxxx00000x0x000xxxxxxxxxxxxxx|xxxxxxxxxx0x0x000xxxxxxxxxxxxxxxx|xxxxxxxxxx0x0xxx0xxxxxxxxxxxxxxxx|xxxxxxxxxxxx00000xxxxxxxxxxxxxxxx|', '111100000000111100000000000000000|100100000000111100000000000000000|100100000000111100000000000000000|111100000000111100000000000000000|000000000000000000000000000000000|000000000000000000000000000000000|000000000000000000000000000000000|000000011111110111111100000000000|000000011111110111111100000000000|000000011111110111111100000000000|000000011111110111111100000000000|000000011110000000111100000000000|111100011110000000111100000000000|111100011110011100111100011100000|111100000000011100000000011100000|111100011110011100111100011100000|000000011110000000111100000000000|000000011110000000111100000000000|000000011111110111111100000000000|000000011111110111111100000000000|000000011111110111111100000000000|000000011111110111111100000000000|000000000000000000000000000000000|000000000000000000000000000000000|000000000000000000000000000000000|000000000000011100000000000000000|000000000000011100000000000000000|000000000000011100000000000000000|000000000000000000000000000000000|000000000000000000000000000000000|000000000000000000000000000000000|000000000000000000000000000000000|000000000000000000000000000000000|'), + (3, 'battleball', '1', 'xxxxxxxxxxxxx444444xxxxxxxxx|xxxxxxxxxxxxx444444xxxxxxxxx|xxxxxxxxxxxxx444444xxxxxxxxx|xxx22222222xx444444xxxxxxxxx|xxx22222222xx444444xxxxxxxxx|xxx22222222xx333333xxxxxxxxx|xxx22222222xx222222xxxxxxxxx|xxx222222222222222222xxxxxxx|xxx222222222222222222xxxxxxx|xxx2222222222222222222100000|xxx2222222222222222222100000|xxxxxxx222222222222222100000|xxxxxxx222222222222222100000|4444432222222222222222100000|4444432222222222222222100000|444443222222222222222xxxxxxx|444443222222222222222xxxxxxx|4444432222222222222222222xxx|4444432222222222222222222xxx|xxxxxxx222222222222222222xxx|xxxxxxx222222222222222222xxx|xxxxxxxxx222222xx22222222xxx|xxxxxxxxx111111xx22222222xxx|xxxxxxxxx000000xx22222222xxx|xxxxxxxxx000000xx22222222xxx|xxxxxxxxx000000xxxxxxxxxxxxx|xxxxxxxxx000000xxxxxxxxxxxxx|xxxxxxxxx000000xxxxxxxxxxxxx|', '0000000000000111111000000000|0000000000000111111000000000|0000000000000111111000000000|0001111111100111111000000000|0001111111100000000000000000|0001111111100000000000000000|0001111111100000000000000000|0001111111111111111110000000|0001111111111111111110000000|0001111111111111111110001111|0001111111111111111110001111|0000000111111111111110001111|0000000111111111111110001111|1111000111111111111110001111|1111000111111111111110001111|1111000111111111111110000000|1111000111111111111110000000|1111000111111111111111110000|1111000111111111111111110000|0000000111111111111111111000|0000000111111111111111111000|0000000000000000011111111000|0000000000000000011111111000|0000000000000000011111111000|0000000001111110011111111000|0000000001111110000000000000|0000000001111110000000000000|0000000001111110000000000000|'), + (4, 'battleball', '2', 'xxxxxxx00000000xxx00000000xxxxxxx|xxxxxxx00000000xxx00000000xxxxxxx|xxxxxxx00000000xxx00000000xxxxxxx|xxxxxxx0000000000000000000xxxxxxx|xxxxxxx0000000000000000000xxxxxxx|xxxxxxx0000000000000000000xxxxxxx|xxxxxxx00000000xxx00000000xxxxxxx|2222xxx00000000xxx00000000xxx2222|2222xxx00000000xxx00000000xxx2222|222221000000000xxx000000000122222|222221000000000xxx000000000122222|2222xxx00000000xxx00000000xxx2222|2222xxx00000000xxx00000000xxx2222|xxxxxxx00000000xxx00000000xxxxxxx|xxxxxxx0000000000000000000xxxxxxx|xxxxxxx0000000000000000000xxxxxxx|xxxxxxx0000000000000000000xxxxxxx|xxxxxxx00000000xxx00000000xxxxxxx|xxxxxxx00000000xxx00000000xxxxxxx|xxxxxxx00000000xxx00000000xxxxxxx|', '000000011111111000111111110000000|000000011111111000111111110000000|000000011111111000111111110000000|000000011111111000111111110000000|000000011111111000111111110000000|000000011111111000111111110000000|000000011111111000111111110000000|111100011111111000111111110001111|111100011111111000111111110001111|111100011111111000111111110001111|111100011111111000111111110001111|111100011111111000111111110001111|111100011111111000111111110001111|000000011111111000111111110000000|000000011111111000111111110000000|000000011111111000111111110000000|000000011111111000111111110000000|000000011111111000111111110000000|000000011111111000111111110000000|000000011111111000111111110000000|'), + (5, 'battleball', '4', 'xxxxxxx222222222222222xxxxxxxx|xxxxxxx222222222222222xxxxxxxx|xxxxxxx222222222222222xxxxxxxx|xxxxxxx222222222222222xxxxxxxx|xxxxxxx222222222222222xxxxxxxx|00012222222222222222222211111x|00012222222222222222222211111x|00012222222222222222222211111x|00012222222222222222222211111x|00xxxxx222222222222222xxx1111x|000xxxx222222222222222xxx0000x|0000xxx222222222222222x0000000|0000xxx22222222222222210000000|0000xxx22222222222222210000000|0000xxx222222222222222x0000000|0000xxx222222222222222xxxxxxxx|00000xx222222222222222xxxxxxxx|000000xxxx11xx11xx11xxxxxxxxxx|x0000000000000000000000xxxxxxx|xx000000000000000000000xxxxxxx|xxx00000000000000000000xxxxxxx|xxxx0000000000000000000xxxxxxx|', '000000011111111111111100000000|000000011111111111111100000000|000000011111111111111100000000|000000011111111111111100000000|000000011111111111111100000000|000000011111111111111100011110|000000011111111111111100011110|000000011111111111111100011110|000000011111111111111100011110|110000011111111111111100000000|111000011111111111111100000000|111100011111111111111101111111|111100011111111111111101111111|111100011111111111111101111111|111100011111111111111101111111|111100011111111111111100000000|111110011111111111111100000000|111111000000000000000000000000|011111111111111111111110000000|001111111111111111111110000000|000111111111111111111110000000|000011111111111111111110000000|'); +/*!40000 ALTER TABLE `games_maps` ENABLE KEYS */; + +-- Dumping structure for table havana.games_played_history +CREATE TABLE IF NOT EXISTS `games_played_history` ( + `id` varchar(255) NOT NULL, + `game_name` text NOT NULL DEFAULT '', + `game_creator` int(11) NOT NULL, + `game_type` varchar(50) NOT NULL DEFAULT '', + `map_id` int(11) NOT NULL, + `winning_team` int(11) NOT NULL, + `winning_team_score` int(11) NOT NULL, + `extra_data` text NOT NULL, + `team_data` text NOT NULL, + `played_at` datetime NOT NULL DEFAULT current_timestamp() +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.games_played_history: ~0 rows (approximately) +DELETE FROM `games_played_history`; +/*!40000 ALTER TABLE `games_played_history` DISABLE KEYS */; +/*!40000 ALTER TABLE `games_played_history` ENABLE KEYS */; + +-- Dumping structure for table havana.games_player_spawns +CREATE TABLE IF NOT EXISTS `games_player_spawns` ( + `type` enum('battleball','snowstorm') NOT NULL DEFAULT 'battleball', + `map_id` int(11) NOT NULL, + `team_id` int(11) NOT NULL, + `x` int(11) NOT NULL, + `y` int(11) NOT NULL, + `rotation` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.games_player_spawns: ~120 rows (approximately) +DELETE FROM `games_player_spawns`; +/*!40000 ALTER TABLE `games_player_spawns` DISABLE KEYS */; +INSERT INTO `games_player_spawns` (`type`, `map_id`, `team_id`, `x`, `y`, `rotation`) VALUES + ('battleball', 5, 0, 22, 14, 6), + ('battleball', 5, 0, 22, 13, 6), + ('battleball', 5, 0, 22, 12, 6), + ('battleball', 5, 0, 22, 11, 6), + ('battleball', 5, 0, 22, 10, 6), + ('battleball', 5, 0, 22, 9, 6), + ('battleball', 5, 3, 9, 0, 4), + ('battleball', 5, 3, 10, 0, 4), + ('battleball', 5, 3, 11, 0, 4), + ('battleball', 5, 3, 12, 0, 4), + ('battleball', 5, 3, 13, 0, 4), + ('battleball', 5, 3, 14, 0, 4), + ('battleball', 5, 2, 9, 22, 0), + ('battleball', 5, 2, 10, 22, 0), + ('battleball', 5, 2, 11, 22, 0), + ('battleball', 5, 2, 12, 22, 0), + ('battleball', 5, 2, 13, 22, 0), + ('battleball', 5, 2, 14, 22, 0), + ('battleball', 5, 1, 0, 14, 2), + ('battleball', 5, 1, 0, 13, 2), + ('battleball', 5, 1, 0, 12, 2), + ('battleball', 5, 1, 0, 11, 2), + ('battleball', 5, 1, 0, 10, 2), + ('battleball', 5, 1, 0, 9, 2), + ('battleball', 3, 0, 21, 11, 6), + ('battleball', 3, 0, 21, 12, 6), + ('battleball', 3, 0, 21, 13, 6), + ('battleball', 3, 0, 21, 14, 6), + ('battleball', 3, 0, 21, 15, 6), + ('battleball', 3, 0, 21, 16, 6), + ('battleball', 3, 1, 7, 16, 2), + ('battleball', 3, 1, 7, 15, 2), + ('battleball', 3, 1, 7, 14, 2), + ('battleball', 3, 1, 7, 13, 2), + ('battleball', 3, 1, 7, 12, 2), + ('battleball', 3, 1, 7, 11, 2), + ('battleball', 3, 2, 11, 7, 4), + ('battleball', 3, 2, 12, 7, 4), + ('battleball', 3, 2, 13, 7, 4), + ('battleball', 3, 2, 14, 7, 4), + ('battleball', 3, 2, 15, 7, 4), + ('battleball', 3, 2, 16, 7, 4), + ('battleball', 3, 3, 16, 21, 0), + ('battleball', 3, 3, 15, 21, 0), + ('battleball', 3, 3, 14, 21, 0), + ('battleball', 3, 3, 13, 21, 0), + ('battleball', 3, 3, 12, 21, 0), + ('battleball', 3, 3, 11, 21, 0), + ('battleball', 1, 0, 0, 13, 2), + ('battleball', 1, 0, 0, 14, 2), + ('battleball', 1, 0, 0, 15, 2), + ('battleball', 1, 0, 0, 16, 2), + ('battleball', 1, 0, 0, 17, 2), + ('battleball', 1, 0, 0, 18, 2), + ('battleball', 1, 1, 27, 9, 6), + ('battleball', 1, 1, 27, 10, 6), + ('battleball', 1, 1, 27, 11, 6), + ('battleball', 1, 1, 27, 12, 6), + ('battleball', 1, 1, 27, 13, 6), + ('battleball', 1, 1, 27, 14, 6), + ('battleball', 1, 3, 13, 0, 4), + ('battleball', 1, 3, 14, 0, 4), + ('battleball', 1, 3, 15, 0, 4), + ('battleball', 1, 3, 16, 0, 4), + ('battleball', 1, 3, 17, 0, 4), + ('battleball', 1, 3, 18, 0, 4), + ('battleball', 1, 2, 14, 27, 0), + ('battleball', 1, 2, 13, 27, 0), + ('battleball', 1, 2, 12, 27, 0), + ('battleball', 1, 2, 11, 27, 0), + ('battleball', 1, 2, 10, 27, 0), + ('battleball', 1, 2, 9, 27, 0), + ('battleball', 2, 0, 0, 7, 2), + ('battleball', 2, 0, 0, 8, 2), + ('battleball', 2, 0, 0, 9, 2), + ('battleball', 2, 0, 0, 10, 2), + ('battleball', 2, 0, 0, 11, 2), + ('battleball', 2, 0, 0, 12, 2), + ('battleball', 2, 2, 14, 12, 6), + ('battleball', 2, 2, 14, 11, 6), + ('battleball', 2, 2, 14, 10, 6), + ('battleball', 2, 2, 14, 9, 6), + ('battleball', 2, 2, 14, 8, 6), + ('battleball', 2, 2, 14, 7, 6), + ('battleball', 2, 3, 18, 8, 2), + ('battleball', 2, 3, 18, 9, 2), + ('battleball', 2, 3, 18, 10, 2), + ('battleball', 2, 3, 18, 11, 2), + ('battleball', 2, 3, 18, 12, 2), + ('battleball', 2, 3, 18, 13, 2), + ('battleball', 2, 1, 32, 7, 6), + ('battleball', 2, 1, 32, 8, 6), + ('battleball', 2, 1, 32, 9, 6), + ('battleball', 2, 1, 32, 10, 6), + ('battleball', 2, 1, 32, 11, 6), + ('battleball', 2, 1, 32, 12, 6), + ('battleball', 4, 0, 12, 16, 0), + ('battleball', 4, 0, 13, 16, 0), + ('battleball', 4, 0, 14, 16, 0), + ('battleball', 4, 0, 15, 16, 0), + ('battleball', 4, 0, 16, 16, 0), + ('battleball', 4, 0, 17, 16, 0), + ('battleball', 4, 1, 17, 0, 4), + ('battleball', 4, 1, 16, 0, 4), + ('battleball', 4, 1, 15, 0, 4), + ('battleball', 4, 1, 14, 0, 4), + ('battleball', 4, 1, 13, 0, 4), + ('battleball', 4, 1, 12, 0, 4), + ('battleball', 4, 2, 7, 5, 2), + ('battleball', 4, 2, 7, 6, 2), + ('battleball', 4, 2, 7, 7, 2), + ('battleball', 4, 2, 7, 8, 2), + ('battleball', 4, 2, 7, 9, 2), + ('battleball', 4, 2, 7, 10, 2), + ('battleball', 4, 3, 21, 5, 6), + ('battleball', 4, 3, 21, 6, 6), + ('battleball', 4, 3, 21, 7, 6), + ('battleball', 4, 3, 21, 8, 6), + ('battleball', 4, 3, 21, 9, 6), + ('battleball', 4, 3, 21, 10, 6); +/*!40000 ALTER TABLE `games_player_spawns` ENABLE KEYS */; + +-- Dumping structure for table havana.games_ranks +CREATE TABLE IF NOT EXISTS `games_ranks` ( + `id` int(5) NOT NULL AUTO_INCREMENT, + `type` enum('battleball','snowstorm') NOT NULL DEFAULT 'battleball', + `title` varchar(50) NOT NULL, + `min_points` int(10) NOT NULL, + `max_points` int(10) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.games_ranks: 8 rows +DELETE FROM `games_ranks`; +/*!40000 ALTER TABLE `games_ranks` DISABLE KEYS */; +INSERT INTO `games_ranks` (`id`, `type`, `title`, `min_points`, `max_points`) VALUES + (1, 'battleball', 'Beginner', 0, 10000), + (2, 'battleball', 'Amateur', 10001, 100000), + (3, 'battleball', 'Intermediate', 100001, 500000), + (4, 'battleball', 'Expert', 500001, 0), + (5, 'snowstorm', 'Beginner', 0, 10000), + (6, 'snowstorm', 'Amateur', 10001, 100000), + (7, 'snowstorm', 'Intermediate', 100001, 500000), + (8, 'snowstorm', 'Expert', 500001, 0); +/*!40000 ALTER TABLE `games_ranks` ENABLE KEYS */; + +-- Dumping structure for table havana.groups_details +CREATE TABLE IF NOT EXISTS `groups_details` ( + `id` int(10) NOT NULL AUTO_INCREMENT, + `name` varchar(45) NOT NULL, + `description` mediumtext NOT NULL, + `owner_id` int(10) NOT NULL, + `room_id` int(10) NOT NULL DEFAULT 0, + `badge` mediumtext NOT NULL DEFAULT 'b0503Xs09114s05013s05015', + `recommended` int(1) NOT NULL DEFAULT 0, + `background` varchar(255) NOT NULL DEFAULT 'bg_colour_08', + `views` int(15) NOT NULL DEFAULT 0, + `topics` smallint(1) NOT NULL DEFAULT 0, + `group_type` tinyint(3) unsigned NOT NULL DEFAULT 0, + `forum_type` tinyint(1) unsigned NOT NULL DEFAULT 0, + `forum_premission` tinyint(1) unsigned NOT NULL DEFAULT 0, + `alias` varchar(30) DEFAULT NULL, + `created_at` datetime NOT NULL DEFAULT current_timestamp(), + PRIMARY KEY (`id`), + UNIQUE KEY `alias` (`alias`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.groups_details: ~0 rows (approximately) +DELETE FROM `groups_details`; +/*!40000 ALTER TABLE `groups_details` DISABLE KEYS */; +/*!40000 ALTER TABLE `groups_details` ENABLE KEYS */; + +-- Dumping structure for table havana.groups_edit_sessions +CREATE TABLE IF NOT EXISTS `groups_edit_sessions` ( + `user_id` int(11) NOT NULL, + `group_id` int(11) NOT NULL, + `expire` bigint(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.groups_edit_sessions: ~0 rows (approximately) +DELETE FROM `groups_edit_sessions`; +/*!40000 ALTER TABLE `groups_edit_sessions` DISABLE KEYS */; +/*!40000 ALTER TABLE `groups_edit_sessions` ENABLE KEYS */; + +-- Dumping structure for table havana.groups_memberships +CREATE TABLE IF NOT EXISTS `groups_memberships` ( + `user_id` int(10) NOT NULL, + `group_id` int(10) NOT NULL, + `member_rank` enum('3','2','1') NOT NULL DEFAULT '1', + `is_pending` tinyint(11) NOT NULL DEFAULT 0, + `created_at` datetime NOT NULL DEFAULT current_timestamp(), + KEY `userid` (`user_id`), + KEY `groupid` (`group_id`), + KEY `group_id` (`group_id`), + KEY `user_id` (`user_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.groups_memberships: ~0 rows (approximately) +DELETE FROM `groups_memberships`; +/*!40000 ALTER TABLE `groups_memberships` DISABLE KEYS */; +/*!40000 ALTER TABLE `groups_memberships` ENABLE KEYS */; + +-- Dumping structure for table havana.homes_details +CREATE TABLE IF NOT EXISTS `homes_details` ( + `user_id` int(10) NOT NULL, + `background` varchar(255) NOT NULL DEFAULT 'bg_pattern_abstract2', + UNIQUE KEY `user_id` (`user_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.homes_details: ~0 rows (approximately) +DELETE FROM `homes_details`; +/*!40000 ALTER TABLE `homes_details` DISABLE KEYS */; +/*!40000 ALTER TABLE `homes_details` ENABLE KEYS */; + +-- Dumping structure for table havana.homes_edit_sessions +CREATE TABLE IF NOT EXISTS `homes_edit_sessions` ( + `user_id` int(11) NOT NULL, + `expire` bigint(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.homes_edit_sessions: ~0 rows (approximately) +DELETE FROM `homes_edit_sessions`; +/*!40000 ALTER TABLE `homes_edit_sessions` DISABLE KEYS */; +/*!40000 ALTER TABLE `homes_edit_sessions` ENABLE KEYS */; + +-- Dumping structure for table havana.homes_ratings +CREATE TABLE IF NOT EXISTS `homes_ratings` ( + `user_id` int(11) NOT NULL, + `home_id` int(11) NOT NULL, + `rating` int(11) NOT NULL DEFAULT 0 +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.homes_ratings: ~0 rows (approximately) +DELETE FROM `homes_ratings`; +/*!40000 ALTER TABLE `homes_ratings` DISABLE KEYS */; +/*!40000 ALTER TABLE `homes_ratings` ENABLE KEYS */; + +-- Dumping structure for table havana.housekeeping_audit_log +CREATE TABLE IF NOT EXISTS `housekeeping_audit_log` ( + `action` enum('alert_user','kick_user','ban_user','room_alert','room_kick') NOT NULL, + `user_id` int(11) NOT NULL, + `target_id` int(11) NOT NULL DEFAULT -1, + `message` varchar(255) NOT NULL DEFAULT '', + `extra_notes` varchar(255) NOT NULL DEFAULT '', + `created_at` datetime NOT NULL DEFAULT current_timestamp() +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.housekeeping_audit_log: ~0 rows (approximately) +DELETE FROM `housekeeping_audit_log`; +/*!40000 ALTER TABLE `housekeeping_audit_log` DISABLE KEYS */; +/*!40000 ALTER TABLE `housekeeping_audit_log` ENABLE KEYS */; + +-- Dumping structure for table havana.infobus_polls +CREATE TABLE IF NOT EXISTS `infobus_polls` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `initiated_by` int(11) NOT NULL, + `poll_data` text NOT NULL, + `created_at` datetime NOT NULL DEFAULT current_timestamp(), + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.infobus_polls: ~0 rows (approximately) +DELETE FROM `infobus_polls`; +/*!40000 ALTER TABLE `infobus_polls` DISABLE KEYS */; +/*!40000 ALTER TABLE `infobus_polls` ENABLE KEYS */; + +-- Dumping structure for table havana.infobus_polls_answers +CREATE TABLE IF NOT EXISTS `infobus_polls_answers` ( + `poll_id` int(11) NOT NULL, + `answer` int(11) NOT NULL, + `user_id` int(11) NOT NULL, + KEY `poll_id` (`poll_id`), + KEY `user_id` (`user_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.infobus_polls_answers: ~0 rows (approximately) +DELETE FROM `infobus_polls_answers`; +/*!40000 ALTER TABLE `infobus_polls_answers` DISABLE KEYS */; +/*!40000 ALTER TABLE `infobus_polls_answers` ENABLE KEYS */; + +-- Dumping structure for table havana.items +CREATE TABLE IF NOT EXISTS `items` ( + `id` bigint(11) NOT NULL AUTO_INCREMENT, + `order_id` int(11) NOT NULL DEFAULT -1, + `user_id` int(11) DEFAULT NULL, + `room_id` int(11) DEFAULT 0, + `definition_id` int(11) NOT NULL, + `x` varchar(255) DEFAULT '0', + `y` varchar(255) DEFAULT '0', + `z` varchar(255) DEFAULT '0', + `wall_position` varchar(255) NOT NULL DEFAULT '', + `rotation` int(11) DEFAULT 0, + `custom_data` longtext NOT NULL, + `is_hidden` tinyint(1) NOT NULL DEFAULT 0, + `is_trading` tinyint(1) NOT NULL DEFAULT 0, + `expire_time` bigint(11) NOT NULL DEFAULT -1, + `created_at` datetime NOT NULL DEFAULT current_timestamp(), + `updated_at` datetime NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), + PRIMARY KEY (`id`), + UNIQUE KEY `id` (`id`), + KEY `room_id` (`room_id`), + KEY `user_id` (`user_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.items: ~0 rows (approximately) +DELETE FROM `items`; +/*!40000 ALTER TABLE `items` DISABLE KEYS */; +/*!40000 ALTER TABLE `items` ENABLE KEYS */; + +-- Dumping structure for table havana.items_definitions +CREATE TABLE IF NOT EXISTS `items_definitions` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `sprite` varchar(50) DEFAULT NULL, + `name` varchar(100) DEFAULT NULL, + `description` varchar(100) DEFAULT NULL, + `sprite_id` int(11) NOT NULL, + `length` int(11) NOT NULL DEFAULT 0, + `width` int(11) NOT NULL DEFAULT 0, + `top_height` double NOT NULL DEFAULT 0, + `max_status` varchar(11) NOT NULL DEFAULT '0', + `behaviour` varchar(150) NOT NULL DEFAULT '', + `interactor` varchar(150) NOT NULL DEFAULT 'default', + `is_tradable` tinyint(1) NOT NULL DEFAULT 1, + `is_recyclable` tinyint(1) NOT NULL DEFAULT 1, + `drink_ids` text DEFAULT NULL, + `rental_time` int(11) NOT NULL DEFAULT -1, + `allowed_rotations` tinytext NOT NULL DEFAULT '', + `heights` varchar(50) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `id` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=1909 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT; + +-- Dumping data for table havana.items_definitions: ~1,938 rows (approximately) +DELETE FROM `items_definitions`; +/*!40000 ALTER TABLE `items_definitions` DISABLE KEYS */; +INSERT INTO `items_definitions` (`id`, `sprite`, `name`, `description`, `sprite_id`, `length`, `width`, `top_height`, `max_status`, `behaviour`, `interactor`, `is_tradable`, `is_recyclable`, `drink_ids`, `rental_time`, `allowed_rotations`, `heights`) VALUES + (1, 'shelves_norja', 'Bookcase', 'For nic naks and art deco books', 293, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (2, 'shelves_polyfon', 'Bookcase', 'For the arty pad', 349, 2, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (3, 'shelves_silo', 'Bookcase', 'For nic naks and art deco books', 82, 2, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (4, 'table_polyfon_small', 'Small Coffee Table', 'For serving a stylish latte', 346, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (5, 'chair_polyfon', 'Dining Chair', 'Dining Chair', 343, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (6, 'table_silo_med', 'Coffee Table', 'Wipe clean and unobtrusive', 92, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (7, 'stand_polyfon_z', 'Shelf', 'Tidy up', 348, 1, 1, 0.5, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (8, 'chair_silo', 'Dining Chair', 'Keep it simple', 89, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (9, 'sofa_silo', 'Two-Seater Sofa', 'Cushioned, understated comfort', 83, 2, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (10, 'couch_norja', 'Bench', 'Two can perch comfortably', 291, 2, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (11, 'chair_norja', 'Chair', 'Sleek and chic for each cheek', 290, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (12, 'table_polyfon_med', 'Large Coffee Table', 'For larger gatherings', 345, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (13, 'doormat_love', 'Doormat', 'Welcome Habbos in style', 504, 1, 1, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (14, 'doormat_plain', 'Doormat', 'Available in a variety of colours', 505, 1, 1, 0.2, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (15, 'sofachair_polyfon', 'Armchair', 'Soft and comfortable', 338, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (16, 'sofachair_silo', 'Armchair', 'Large, but worth it', 84, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (17, 'bed_polyfon', 'Double Bed', 'Give yourself space to stretch out', 334, 2, 3, 1, '0', 'can_lay_on_top', 'bed', 1, 1, '', -1, '0,2', NULL), + (18, 'bed_polyfon_one', 'Single Bed', 'Cot of the artistic', 335, 1, 3, 1.6, '0', 'can_lay_on_top', 'bed', 1, 1, '', -1, '0,2', NULL), + (19, 'bed_silo_one', 'Single Bed', 'Plain and simple', 81, 1, 3, 1.7, '0', 'can_lay_on_top', 'bed', 1, 1, '', -1, '0,2', NULL), + (20, 'bed_silo_two', 'Double Bed', 'Plain and simple x2', 80, 2, 3, 1.7, '0', 'can_lay_on_top', 'bed', 1, 1, '', -1, '0,2', NULL), + (21, 'table_silo_small', 'Occasional Table', 'For those random moments', 85, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (22, 'bed_armas_two', 'Double Bed', 'King-sized pine comfort', 318, 2, 3, 1.7, '0', 'can_lay_on_top', 'bed', 1, 1, '', -1, '0,2', NULL), + (23, 'shelves_armas', 'Bookcase', 'For all those fire-side stories', 327, 2, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (24, 'bench_armas', 'Bench', 'To complete the dining set', 323, 2, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (25, 'table_armas', 'Dining Table', 'For informal dining', 322, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (26, 'small_table_armas', 'Occasional Table', 'Practical and beautiful', 332, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (27, 'small_chair_armas', 'Stool', 'Rustic charm at it\'s best', 333, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (28, 'fireplace_armas', 'Fireplace', 'Authentic, real flame fire', 320, 2, 1, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (29, 'lamp_armas', 'Table Lamp', 'Ambient lighting is essential', 330, 1, 1, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (30, 'bed_armas_one', 'Single Bed', 'Rustic charm for one', 319, 1, 3, 1.8, '0', 'can_lay_on_top', 'bed', 1, 1, '', -1, '0,2', NULL), + (31, 'carpet_standard', 'Floor rug', 'Available in a variety of colours', 486, 3, 5, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (32, 'carpet_armas', 'Hand-Woven Rug', 'Adds instant warmth', 512, 2, 4, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (33, 'carpet_polar', 'Faux-Fur Bear Rug', 'For cuddling up on', 513, 2, 3, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (34, 'fireplace_polyfon', 'Fireplace', 'Comfort in stainless steel', 336, 2, 1, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (35, 'carpet_standard*1', 'Floor Rug', 'Available in a variety of colours', 489, 3, 5, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (36, 'doormat_plain*1', 'Doormat', 'Available in a variety of colours', 506, 1, 1, 0.2, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (37, 'carpet_standard*2', 'Floor Rug', 'Available in a variety of colours', 490, 3, 5, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (38, 'carpet_standard*3', 'Floor Rug', 'Available in a variety of colours', 491, 3, 5, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (39, 'carpet_standard*4', 'Floor Rug', 'Available in a variety of colours', 492, 3, 5, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (40, 'doormat_plain*6', 'Doormat', 'Available in a variety of colours', 511, 1, 1, 0.2, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (41, 'carpet_standard*5', 'Floor Rug', 'Available in a variety of colours', 493, 3, 5, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (42, 'carpet_standard*6', 'Floor Rug', 'Available in a variety of colours', 494, 3, 5, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (43, 'pizza', 'Pizza Box', 'You dirty Habbo', 98, 1, 1, 0.1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (44, 'drinks', 'Empty Cans', 'Are you a slob too?', 99, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (45, 'bar_polyfon', 'Mini-Bar', 'You naughty Habbo!', 339, 1, 1, 0, '2', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '1,2', -1, '2,4', NULL), + (46, 'plant_cruddy', 'Aloe Vera', 'Goodbye Bert...', 1127, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (47, 'bottle', 'Empty Spinning Bottle', 'For interesting games!', 100, 1, 1, 0, '21', 'solid,requires_touching_for_interaction,dice', 'default', 1, 1, '', -1, '0', NULL), + (48, 'bardesk_polyfon', 'Bar/desk', 'Perfect for work or play', 341, 2, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (49, 'bardeskcorner_polyfon', 'Corner Cabinet/Desk', 'Tuck it away', 342, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (50, 'bar_armas', 'Barrel Minibar', 'It\'s a barrel of laughs and a great talking point', 328, 1, 1, 0, '2', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '1,2', -1, '2,4', NULL), + (51, 'bartable_armas', 'Bardesk', 'Bar-Style Table - essential for extra guests', 321, 1, 3, 1.4, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (52, 'bar_chair_armas', 'Barrel Stool', 'The ultimate recycled furniture', 329, 1, 1, 1.3, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (53, 'carpet_soft', 'Soft Wool Rug', 'Soft Wool Rug', 497, 2, 4, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (54, 'carpet_soft*1', 'Soft Wool Rug', 'Soft Wool Rug', 498, 2, 4, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (55, 'carpet_soft*2', 'Soft Wool Rug', 'Soft Wool Rug', 499, 2, 4, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (56, 'carpet_soft*3', 'Soft Wool Rug', 'Soft Wool Rug', 500, 2, 4, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (57, 'carpet_soft*4', 'Soft Wool Rug', 'Soft Wool Rug', 501, 2, 4, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (58, 'carpet_soft*5', 'Soft Wool Rug', 'Soft Wool Rug', 502, 2, 4, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (59, 'carpet_soft*6', 'Soft Wool Rug', 'Soft Wool Rug', 503, 2, 4, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (60, 'red_tv', 'Portable TV', 'Don?t miss those soaps', 96, 1, 1, 0, '2', 'solid,custom_data_on_off', 'default', 1, 1, '', -1, '2,4', NULL), + (61, 'wood_tv', 'Large TV', 'HNN weatherman Kiazie', 95, 1, 2, 0, '4', 'solid,custom_data_numeric_state', 'default', 1, 1, '', -1, '0,2', NULL), + (62, 'carpet_polar*1', 'Pink Faux-Fur Bear Rug', 'Cute', 142, 2, 3, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (63, 'smooth_table_polyfon', 'Large Dining Table', 'For larger gatherings', 347, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (64, 'sofachair_polyfon_girl', 'Armchair', 'Think pink', 140, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (65, 'bed_polyfon_girl_one', 'Single Bed', 'Snuggle down in princess pink', 143, 1, 3, 1.6, '0', 'can_lay_on_top', 'bed', 1, 1, '', -1, '0,2', NULL), + (66, 'bed_polyfon_girl', 'Double Bed', 'Snuggle down in princess pink', 144, 2, 3, 1.6, '0', 'can_lay_on_top', 'bed', 1, 1, '', -1, '0,2', NULL), + (67, 'sofa_polyfon_girl', 'Two-seater Sofa', 'Romantic pink for two', 141, 2, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (68, 'bed_budgetb_one', 'Plain Single Bed', 'All you need for a good night\'s kip', 461, 1, 3, 1.6, '0', 'can_lay_on_top', 'bed', 1, 1, '', -1, '0,2', NULL), + (69, 'bed_budgetb', 'Plain Double Bed', 'Sweet dreams for two', 460, 2, 3, 1.6, '0', 'can_lay_on_top', 'bed', 1, 1, '', -1, '0,2', NULL), + (70, 'plant_pineapple', 'Pineapple Plant', 'Needs loving glances', 360, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (71, 'plant_fruittree', 'Fruit Tree', 'Great yield and sweet fruit', 363, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (72, 'plant_small_cactus', 'Small Cactus', 'Even less watering than the real world', 364, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (73, 'plant_bonsai', 'Bonsai Tree', 'You can be sure it lives', 361, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (74, 'plant_big_cactus', 'Mature Cactus', 'Habbo Dreams monster in hiding! Shhhh', 362, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (75, 'plant_yukka', 'Yukka Plant', 'Easy to care for', 359, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (76, 'carpet_standard*7', 'Floor Rug', 'Available in a variety of colours', 495, 3, 5, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (77, 'carpet_standard*8', 'Floor Rug', 'Available in a variety of colours', 496, 3, 5, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (78, 'carpet_standard*9', NULL, NULL, 11219, 3, 5, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (79, 'carpet_standard*a', 'Floor Rug', 'Available in a variety of colours', 487, 3, 5, 0, '2', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (80, 'carpet_standard*b', 'Floor Rug', 'Available in a variety of colours', 488, 3, 5, 0, '2', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (81, 'plant_sunflower', 'Cut Sunflower', 'For happy Habbos', 358, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (82, 'plant_rose', 'Cut Roses', 'Sleek and chic', 357, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (83, 'tv_luxus', 'Digital TV', 'Bang up to date', 94, 1, 3, 0, '2', 'solid,custom_data_on_off', 'default', 1, 1, '', -1, '0,2', NULL), + (84, 'bath', 'Bubble Bath', 'The ultimate in pampering', 128, 1, 2, 1, '2', 'can_sit_on_top,custom_data_numeric_on_off', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (85, 'sink', 'Sink', 'Hot and cold thrown in for no charge', 129, 1, 1, 0, '2', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '18', -1, '2,4', NULL), + (86, 'toilet', 'Loo Seat', 'Loo Seat', 131, 1, 1, 1.1, '2', 'can_sit_on_top,custom_data_on_off', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (87, 'duck', 'Rubber Duck', 'Every bather needs one', 130, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (88, 'tile', 'Floor Tiles', 'In a choice of colours', 134, 4, 4, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (89, 'toilet_red', 'Loo Seat', 'Loo Seat', 132, 1, 1, 1.1, '2', 'can_sit_on_top,custom_data_on_off', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (90, 'toilet_yell', 'Loo Seat', 'Loo Seat', 133, 1, 1, 1.1, '2', 'can_sit_on_top,custom_data_on_off', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (91, 'tile_red', 'Floor Tiles', 'In a choice of colours', 135, 4, 4, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (92, 'tile_yell', 'Floor Tiles', 'In a choice of colours', 136, 4, 4, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (93, 'bar_basic', 'A Pura Minibar', 'A pura series 300 minibar', 441, 1, 1, 0, '2', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '1,2', -1, '2,4', NULL), + (94, 'shelves_basic', 'Pura Shelves', 'Pura series 404 shelves', 440, 2, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (95, 'soft_sofachair_norja', 'iced sofachair', 'Soft iced sofachair', 294, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (96, 'soft_sofa_norja', 'iced sofa', 'A soft iced sofa', 295, 2, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (97, 'lamp_basic', 'Pura Lamp', 'Switch on the atmosphere with this sophisticated light', 443, 1, 1, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (98, 'lamp2_armas', 'Lodge Candle', 'Wax lyrical with some old-world charm', 331, 1, 1, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (99, 'fridge', 'Pura Refridgerator', 'Keep cool with a chilled snack or drink', 442, 1, 1, 0, '2', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '3,4,5,6', -1, '2,4', NULL), + (100, 'door', 'Telephone Box', 'Dr Who?', 535, 1, 1, 0, '3', 'solid,requires_touching_for_interaction,custom_data_true_false,teleporter,redirect_rotation_2', 'teleport', 1, 1, '', -1, '2,4', NULL), + (101, 'doorB', 'Wardrobe', 'Narnia this way!', 537, 1, 1, 0, '3', 'solid,requires_touching_for_interaction,custom_data_true_false,teleporter,redirect_rotation_2', 'teleport', 1, 1, '', -1, '2,4', NULL), + (102, 'doorC', 'Portaloo', 'In a hurry?', 536, 1, 1, 0, '3', 'solid,requires_touching_for_interaction,custom_data_true_false,teleporter,redirect_rotation_2', 'teleport', 1, 1, '', -1, '2,4', NULL), + (103, 'menorah', 'Menorah', 'Light up your room', 103, 1, 1, 0, '2', 'solid,custom_data_numeric_state,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (104, 'ham', 'Joint of Ham', 'Tuck in', 108, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (105, 'wcandleset', 'White Candle Plate', 'Simple but stylish', 106, 1, 1, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (106, 'rcandleset', 'Red Candle Plate', 'Simple but stylish', 107, 1, 1, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (107, 'throne', 'Throne', 'Important Habbos only', 1152, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (108, 'giftflowers', 'Vase of Flowers', 'Guaranteed to stay fresh', 356, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2', NULL), + (109, 'habbocake', 'Cake', 'Save me a slice!', 102, 1, 1, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (110, 'bunny', 'Squidgy Bunny', 'Yours to cuddle up to', 655, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (111, 'edice', 'Holo-dice', 'What\'s your lucky number?', 101, 1, 1, 0, '101', 'solid,requires_touching_for_interaction,dice', 'default', 1, 1, '', -1, '0', NULL), + (112, 'club_sofa', 'Club sofa', 'Club sofa', 977, 2, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (113, 'divider_poly3', 'Hatch (Lockable)', 'All bars should have one', 340, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2', NULL), + (114, 'divider_arm1', 'Corner plinth', 'Good solid wood', 325, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (115, 'divider_arm2', 'Room divider', 'I wooden go there', 326, 2, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (116, 'divider_arm3', 'Gate (lockable)', 'Knock, knock...', 324, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2', NULL), + (117, 'divider_nor1', 'Ice Corner', 'Looks squishy, but isn\'t', 297, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (118, 'divider_silo1', 'Corner Shelf', 'Neat and natty', 88, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (119, 'divider_nor2', 'Ice Bar-Desk', 'Strong, yet soft looking', 296, 2, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (120, 'divider_silo2', 'Screen', 'Stylish sectioning', 87, 2, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (121, 'divider_nor3', 'Door (Lockable)', 'Do go through...', 298, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2', NULL), + (122, 'divider_silo3', 'Gate (lockable)', 'Form following function', 86, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2', NULL), + (123, 'mocchamaster', 'Mochamaster', 'Wake up and smell it!', 980, 1, 1, 0, '2', 'solid,requires_touching_for_interaction,custom_data_on_off', 'vending_machine', 1, 1, '8,9,10,11,12,13,14,15,16,17', -1, '2,4', NULL), + (124, 'carpet_legocourt', 'Basketball Court', 'Line up your slam dunk', 523, 3, 3, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (125, 'bench_lego', 'Team Bench', 'For your reserve players', 524, 4, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (126, 'legotrophy', 'Basketball Trophy', 'For the winning team', 521, 1, 1, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (127, 'edicehc', 'Dicemaster', 'Click and roll!', 981, 1, 1, 0, '101', 'solid,requires_touching_for_interaction,dice', 'default', 1, 1, '', -1, '0', NULL), + (128, 'hcsohva', 'Throne Sofa', 'For royal bottoms...', 984, 2, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (129, 'hcamme', 'Tubmaster', 'Time for a soak', 982, 1, 2, 0.9, '2', 'can_sit_on_top,custom_data_numeric_on_off', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (130, 'hockey_score', 'Scoreboard', '...for keeping your score', 520, 1, 1, 0, '100', 'solid,requires_touching_for_interaction,custom_data_numeric_state', 'scoreboard', 1, 1, '', -1, '2,4', NULL), + (131, 'hockey_light', 'Lert', 'Set it off.', 109, 1, 1, 0, '2', 'solid,requires_touching_for_interaction,custom_data_true_false', 'lert', 1, 1, '', -1, '0,2,4,6', NULL), + (132, 'doorD', 'Imperial Teleport', 'Let\'s go over tzar!', 983, 1, 1, 0, '3', 'solid,requires_touching_for_interaction,custom_data_true_false,teleporter,redirect_rotation_2', 'teleport', 1, 1, '', -1, '2,4', NULL), + (133, 'prizetrophy2*3', 'Duck trophy', 'Breathtaking bronze', 605, 1, 1, 0, '0', 'solid,prize_trophy,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (134, 'prizetrophy3*3', 'Globe trophy', 'Breathtaking bronze', 1155, 1, 1, 0, '0', 'solid,prize_trophy,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (135, 'prizetrophy4*3', 'Fish trophy', 'Breathtaking bronze', 1154, 1, 1, 0, '0', 'solid,prize_trophy,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (136, 'prizetrophy5*3', 'Duo trophy', 'Breathtaking bronze', 614, 1, 1, 0, '0', 'solid,prize_trophy,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (137, 'prizetrophy6*3', 'Champion trophy', 'Breathtaking bronze', 1156, 1, 1, 0, '0', 'solid,prize_trophy,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (138, 'prizetrophy2*1', 'Duck trophy', 'Glittery gold', 603, 1, 1, 0, '0', 'solid,prize_trophy,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (139, 'prizetrophy3*1', 'Globe trophy', 'Glittery gold', 1162, 1, 1, 0, '0', 'solid,prize_trophy,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (140, 'prizetrophy4*1', 'Fish trophy', 'Glittery gold', 1161, 1, 1, 0, '0', 'solid,prize_trophy,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (141, 'prizetrophy5*1', 'Duo trophy', 'Glittery gold', 612, 1, 1, 0, '0', 'solid,prize_trophy,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (142, 'prizetrophy6*1', 'Champion trophy', 'Glittery gold', 1164, 1, 1, 0, '0', 'solid,prize_trophy,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (143, 'prizetrophy*2', 'Classic trophy', 'Shiny silver', 601, 1, 1, 0, '2', 'solid,prize_trophy,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (144, 'prizetrophy2*2', 'Duck trophy', 'Shiny silver', 604, 1, 1, 0, '2', 'solid,prize_trophy,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (145, 'prizetrophy3*2', 'Globe trophy', 'Shiny silver', 1159, 1, 1, 0, '2', 'solid,prize_trophy,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (146, 'prizetrophy4*2', 'Fish trophy', 'Shiny silver', 1157, 1, 1, 0, '2', 'solid,prize_trophy,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (147, 'prizetrophy5*2', 'Duo trophy', 'Shiny silver', 613, 1, 1, 0, '2', 'solid,prize_trophy,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (148, 'prizetrophy6*2', 'Champion trophy', 'Shiny silver', 1160, 1, 1, 0, '2', 'solid,prize_trophy,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (149, 'prizetrophy*3', 'Classic trophy', 'Breathtaking bronze', 602, 1, 1, 0, '0', 'solid,prize_trophy,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (150, 'hc_lmp', 'Oil Lamp', 'Be enlightened', 985, 1, 1, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (151, 'hc_tbl', 'Nordic Table', 'Perfect for banquets', 986, 1, 3, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (152, 'hc_chr', 'Majestic Chair', 'Royal comfort', 987, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (153, 'hc_dsk', 'Study Desk', 'For Habbo scholars', 988, 1, 2, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (154, 'pets0', NULL, NULL, 36, 1, 1, 0, '2', 'requires_rights_for_interaction,redirect_rotation_4,can_stand_on_top', 'pet_nest', 1, 1, '', -1, '0,2,4,6', NULL), + (155, 'petfood1', 'Bones Mega Multipack', 'Fantastic 20% Saving!', 41, 1, 1, 0, '6', 'requires_rights_for_interaction,pet_dog_food,can_stand_on_top,solid', 'default', 1, 1, '', -1, '2', NULL), + (156, 'petfood2', 'Sardines Mega Multipack', 'Fantastic 20% Saving!', 42, 1, 1, 0, '6', 'requires_rights_for_interaction,pet_cat_food,can_stand_on_top,solid', 'default', 1, 1, '', -1, '2', NULL), + (157, 'petfood3', 'Cabbage Mega Multipack', 'Fantastic 20% Saving!', 43, 1, 1, 0, '6', 'requires_rights_for_interaction,pet_food,can_stand_on_top,solid', 'default', 1, 1, '', -1, '2', NULL), + (158, 'waterbowl*4', 'Blue Water Bowl', 'Aqua unlimited', 48, 1, 1, 0, '6', 'can_stand_on_top,requires_rights_for_interaction,pet_water_bowl', 'default', 1, 1, '', -1, '2', NULL), + (159, 'waterbowl*5', 'Brown Water Bowl', 'Aqua unlimited', 49, 1, 1, 0, '6', 'can_stand_on_top,requires_rights_for_interaction,pet_water_bowl', 'default', 1, 1, '', -1, '2', NULL), + (160, 'waterbowl*2', 'Green Water Bowl', 'Aqua unlimited', 46, 1, 1, 0, '6', 'can_stand_on_top,requires_rights_for_interaction,pet_water_bowl', 'default', 1, 1, '', -1, '2', NULL), + (161, 'waterbowl*1', 'Red Water Bowl', 'Aqua unlimited', 45, 1, 1, 0, '6', 'can_stand_on_top,requires_rights_for_interaction,pet_water_bowl', 'default', 1, 1, '', -1, '2', NULL), + (162, 'waterbowl*3', 'Yellow Water Bowl', 'Aqua unlimited', 47, 1, 1, 0, '6', 'can_stand_on_top,requires_rights_for_interaction,pet_water_bowl', 'default', 1, 1, '', -1, '2', NULL), + (163, 'toy1', 'Rubber Ball', 'it\'s bouncy-tastic', 54, 1, 1, 0, '2', 'can_stand_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (164, 'toy1*1', 'Rubber Ball', 'it\'s bouncy-tastic', 55, 1, 1, 0, '2', 'can_stand_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (165, 'toy1*2', 'Rubber Ball', 'it\'s bouncy-tastic', 56, 1, 1, 0, '2', 'can_stand_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (166, 'toy1*3', 'Rubber Ball', 'it\'s bouncy-tastic', 57, 1, 1, 0, '2', 'can_stand_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (167, 'toy1*4', 'Rubber Ball', 'it\'s bouncy-tastic', 58, 1, 1, 0, '2', 'can_stand_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (168, 'goodie1', 'Marzipan Man', 'Crunchy Dog Treat', 51, 1, 1, 0, '0', 'can_stand_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2', NULL), + (169, 'goodie2', 'Chocolate Mouse', 'For gourmet kittens', 50, 1, 1, 0, '0', 'can_stand_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2', NULL), + (170, 'rare_dragonlamp*4', 'Black Dragon Lamp', 'Scary and scorching!', 1007, 1, 1, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (171, 'rare_dragonlamp*0', 'Fire Dragon Lamp', 'George and the...', 1003, 1, 1, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (172, 'rare_dragonlamp*5', 'Elf Green Dragon Lamp', 'Roast your chestnuts here!', 1008, 1, 1, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (173, 'rare_dragonlamp*2', 'Jade Dragon Lamp', 'Oriental beast of legends', 1005, 1, 1, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (174, 'rare_dragonlamp*8', 'Bronze Dragon Lamp', 'Scary and scorching!', 1011, 1, 1, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (175, 'rare_dragonlamp*9', 'Purple Dragon Lamp', 'Scary and scorching!', 1012, 1, 1, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (176, 'rare_dragonlamp*7', 'Sky Dragon Lamp', 'Scary and scorching!', 1010, 1, 1, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (177, 'rare_dragonlamp*6', 'Gold Dragon Lamp', 'Scary and scorching!', 1009, 1, 1, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (178, 'rare_dragonlamp*1', 'Sea Dragon Lamp', 'Out of the deep blue!', 1004, 1, 1, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (179, 'rare_dragonlamp*3', 'Silver Dragon Lamp', 'Scary and scorching!', 1006, 1, 1, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (180, 'queue_tile1*6', 'Blue Habbo Roller', 'The power of movement', 471, 1, 1, 0.45, '3', 'can_stand_on_top,can_stack_on_top,roller', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (181, 'queue_tile1*9', 'Green Habbo Roller', 'The power of movement', 474, 1, 1, 0.45, '3', 'can_stand_on_top,can_stack_on_top,roller', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (182, 'queue_tile1*8', 'Navy Habbo Roller', 'The power of movement', 473, 1, 1, 0.45, '3', 'can_stand_on_top,can_stack_on_top,roller', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (183, 'queue_tile1*7', 'Purple Habbo Roller', 'The power of movement', 472, 1, 1, 0.45, '3', 'can_stand_on_top,can_stack_on_top,roller', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (184, 'queue_tile1*2', 'Red Habbo Roller', 'The power of movement', 467, 1, 1, 0.45, '3', 'can_stand_on_top,can_stack_on_top,roller', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (185, 'cn_lamp', 'Lantern', 'Light of the East', 127, 1, 1, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (186, 'cn_sofa', 'Chinese Sofa', 'Seats three with ease!', 126, 3, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (187, 'sporttrack1*1', 'Sport track straight', 'Let\'s get sporty!', 526, 2, 2, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (188, 'sporttrack1*3', 'Sport track straight grass', 'Let\'s get sporty!', 528, 2, 2, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (189, 'sporttrack1*2', 'Sport track straight asphalt', 'Let\'s get sporty!', 527, 2, 2, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (190, 'sporttrack2*1', 'Sport corner tartan', 'Let\'s get sporty!', 529, 2, 2, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (191, 'sporttrack2*2', 'Sport corner asphalt', 'Let\'s get sporty!', 530, 2, 2, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (192, 'sporttrack2*3', 'Sport corner grass', 'Let\'s get sporty!', 531, 2, 2, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (193, 'sporttrack3*1', 'Sport goal tartan', 'Let\'s get sporty!', 532, 2, 2, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (194, 'sporttrack3*2', 'Sport goal asphalt', 'Let\'s get sporty!', 533, 2, 2, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (195, 'sporttrack3*3', 'Sport goal grass', 'Let\'s get sporty!', 534, 2, 2, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (196, 'footylamp', 'Football Lamp', 'Can you kick it?', 525, 1, 1, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (197, 'barchair_silo', 'Bar Stool', 'Practical and convenient', 91, 1, 1, 1.5, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (198, 'bardesk_polyfon*5', 'Candy Bar', 'For cute constructions', 137, 2, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (199, 'bardeskcorner_polyfon*5', 'Candy Corner', 'For sweet corners!', 138, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (200, 'divider_poly3*5', 'Candy Hatch (Lockable)', 'Keep the Pink in!', 139, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2', NULL), + (201, 'chair_china', 'Chinese Lacquer Chair', 'The elegant beauty of tradition', 123, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (202, 'china_table', 'Chinese Lacquer Table', 'Exotic and classy', 122, 1, 1, 0.9, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (203, 'safe_silo', 'Safe Minibar', 'Totally shatter-proof!', 90, 1, 1, 0, '2', 'solid,custom_data_true_false', 'vending_machine', 1, 1, '17', -1, '2,4', NULL), + (204, 'china_shelve', 'Chinese Bookshelf', 'To hold the mind\'s treasures', 121, 2, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (205, 'divider_nor5', 'Plain Iced Angle', 'Cool cornering for your crib y0!', 300, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (206, 'divider_nor4', 'Plain Iced Auto Shutter', 'Habbos, roll out!', 299, 2, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,6', NULL), + (207, 'wall_china', 'Dragon Screen', 'For your great wall', 119, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (208, 'corner_china', 'Dragon Screen Corner', 'Firm, fireproof foundation', 120, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (209, 'CF_10_coin_gold', 'Gold Coin', 'Worth 10 Credits', 275, 1, 1, 0.1, '0', 'solid,can_stack_on_top,redeemable,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (210, 'CF_1_coin_bronze', 'Bronze Coin', 'Worth 1 Credits', 273, 1, 1, 0.1, '0', 'solid,can_stack_on_top,redeemable,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (211, 'CF_20_moneybag', 'Sack of Credits', 'Worth 20 Credits', 276, 1, 1, 1, '0', 'solid,can_stack_on_top,redeemable,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (212, 'CF_50_goldbar', 'Gold Bar', 'Worth 50 Credits', 277, 1, 1, 0.4, '0', 'solid,can_stack_on_top,redeemable,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (213, 'CF_5_coin_silver', 'Silver Coin', 'Worth 5 Credits', 274, 1, 1, 0.1, '0', 'solid,can_stack_on_top,redeemable,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (214, 'hc_tv', 'Mega TV Set', 'Forget plasma, go HC!', 993, 2, 1, 1.3, '2', 'can_sit_on_top,custom_data_numeric_on_off,redirect_rotation_2', 'chair', 1, 1, '', -1, '2,4', NULL), + (215, 'gothgate', 'Gothic Portcullis', 'The dark side of Habbo', 262, 2, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2', NULL), + (216, 'gothiccandelabra', 'Gothic Candelabra', 'The dark side of Habbo', 261, 1, 1, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (217, 'gothrailing', 'Gothic Railing', 'The dark side of Habbo', 258, 2, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (218, 'goth_table', 'Gothic table', 'The dark side of Habbo', 257, 1, 5, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (219, 'hc_bkshlf', 'Medieval Bookcase', 'For the scholarly ones', 995, 1, 4, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (220, 'hc_btlr', 'Electric Butler', 'Your personal caretaker', 994, 1, 1, 0, '2', 'solid,custom_data_true_false', 'vending_machine', 1, 1, '24', -1, '2,4', NULL), + (221, 'hc_crtn', 'Antique Drapery', 'Topnotch privacy protection', 992, 2, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (222, 'hc_djset', 'The Grammophon', 'Very old skool scratch\'n\'spin', 999, 3, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (223, 'hc_frplc', 'Heavy Duty Fireplace', 'Pixel-powered for maximum heating', 998, 1, 3, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (224, 'hc_lmpst', 'Victorian Street Light', 'Somber and atmospheric', 991, 1, 1, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (225, 'hc_machine', 'Weird Science Machine', 'By and for mad inventors', 997, 1, 3, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (226, 'hc_rllr', 'HC Rollers Set', 'Highest class transportation', 1000, 1, 1, 0.45, '3', 'can_stand_on_top,can_stack_on_top,roller', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (227, 'hc_rntgn', 'X-Ray Divider', 'Believe it or not!', 996, 2, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (228, 'hc_trll', 'Drinks Trolley', 'For swanky dinners only', 989, 1, 2, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (229, 'gothic_chair*3', 'Gothic Chair Red', 'The dark side of Habbo', 2090, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (230, 'gothic_sofa*3', 'Gothic Sofa Red', 'The dark side of Habbo', 2091, 2, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (231, 'gothic_stool*3', 'Gothic Stool Red', 'The dark side of Habbo', 2092, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (232, 'sound_machine', 'Sound Machine', 'Creating fancy sounds', 539, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,custom_data_numeric_on_off,sound_machine', 'default', 1, 1, '', -1, '0,2', NULL), + (233, 'plant_mazegate', 'Maze Shrubbery Gate', 'Did we make it?', 366, 2, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '2,4', NULL), + (234, 'plant_maze', 'Maze Shrubbery', 'Build your maze!', 365, 2, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (235, 'plant_bulrush', 'Bulrush', 'Ideal for the riverside', 367, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (236, 'petfood4', 'T-Bones Mega Multipack', 'Fantastic 20% Saving!', 44, 1, 1, 0, '5', 'requires_rights_for_interaction,pet_croc_food,can_stand_on_top,solid', 'default', 1, 1, '', -1, '2', NULL), + (237, 'gothic_carpet', 'Cobbled Path', 'The path less travelled', 255, 2, 4, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (238, 'gothic_carpet2', 'Dungeon Floor', 'What lies beneath?', 256, 2, 4, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (239, 'sound_set_1', 'Habbo Sounds 1', 'Get the party started!', 576, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (240, 'sound_set_3', 'Electronic 1', 'Chilled grooves', 548, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (241, 'sound_set_6', 'Ambient 3', 'Background ambience loops', 542, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (242, 'sound_set_7', 'SFX 5', 'Sound effects for Furni', 584, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (243, 'sound_set_8', 'Ambient 2', 'Mellow electric grooves', 541, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (244, 'post.it', 'Pad of stickies', 'Pad of stickies', 97, 0, 0, 0, '2', 'wall_item,requires_rights_for_interaction,post_it', 'default', 1, 0, '', -1, '', NULL), + (245, 'gothicfountain', 'Gothic Ectoplasm Fountain', 'Not suitable for drinking!', 260, 0, 0, 0, '2', 'wall_item,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (246, 'hc_wall_lamp', 'Retro Wall Lamp', 'Tres chic!', 1001, 0, 0, 0, '2', 'wall_item,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (247, 'industrialfan', 'Industrial Turbine', 'Powerful and resilient', 263, 0, 0, 0, '2', 'wall_item,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (248, 'torch', 'Gothic Torch', 'The dark side of Habbo', 259, 0, 0, 0, '2', 'wall_item,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (249, 'floor', '', '', 2, 0, 0, 0, '0', 'wall_item,decoration,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (250, 'wallpaper', '', '', 33, 0, 0, 0, '0', 'wall_item,decoration,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (251, 'poster', '', '', 1145, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '', NULL), + (252, 'table_norja_med', 'Coffee Table', 'Elegance embodied', 292, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (253, 'doormat_plain*4', 'Doormat', 'Available in a variety of colours', 509, 1, 1, 0.2, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (254, 'doormat_plain*2', 'Doormat', 'Available in a variety of colours', 507, 1, 1, 0.2, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (255, 'doormat_plain*3', 'Doormat', 'Available in a variety of colours', 508, 1, 1, 0.2, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (256, 'doormat_plain*5', 'Doormat', 'Available in a variety of colours', 510, 1, 1, 0.2, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (257, 'rare_parasol*1', 'Yellow Parasol', 'Block those rays!', 1147, 1, 1, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (258, 'rare_parasol*2', 'Orange Parasol', 'Block those rays!', 1148, 1, 1, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (259, 'rare_parasol*3', 'Violet Parasol', 'Block those rays!', 1149, 1, 1, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (260, 'rare_parasol*0', 'Green Parasol', 'Block those rays!', 1, 1, 1, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (261, 'scifidoor*10', 'Violet Spaceship Door', 'There out of this world!', 1069, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '2,4', NULL), + (262, 'scifidoor*9', 'Blue Spaceship Door', 'There out of this world!', 1068, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '2,4', NULL), + (263, 'scifidoor*8', 'Purple Spaceship Door', 'There out of this world!', 1067, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '2,4', NULL), + (264, 'scifidoor*7', 'Aqua Spaceship Door', 'There out of this world!', 1066, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '2,4', NULL), + (265, 'scifidoor*6', 'Black Monolith', 'Monolith goes up! Monolith goes down!', 1065, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '2,4', NULL), + (266, 'scifidoor*5', 'White Spaceship Door', 'There out of this world!', 1064, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (267, 'scifidoor*4', 'Emerald Spaceship Door', 'Protect your pot of gold!', 1063, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '2,4', NULL), + (268, 'scifidoor*3', 'Lightblue Spaceship Door', 'There out of this world!', 1062, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '2,4', NULL), + (269, 'scifidoor*2', 'Yellow Spaceship Door', 'There out of this world!', 1061, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '2,4', NULL), + (270, 'scifidoor*1', 'Pink Spaceship Door', 'There out of this world!', 1060, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '2,4', NULL), + (271, 'rare_beehive_bulb', 'Blue Amber Lamp', 'A honey-hued glow', 1132, 1, 1, 1, '2', 'solid,can_stack_on_top,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (272, 'rare_beehive_bulb*1', 'Red Amber Lamp', 'A honey-hued glow', 1133, 1, 1, 1, '2', 'solid,can_stack_on_top,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (273, 'rare_beehive_bulb*2', 'Yellow Amber Lamp', 'A honey-hued glow', 1134, 1, 1, 1, '2', 'solid,can_stack_on_top,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (274, 'scifiport*0', 'Red Laser Door', 'Energy beams. No trespassers!', 1041, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,6', NULL), + (275, 'scifiport*9', 'Violet Sci-Fi Port', 'Energy beams. No trespassers!', 1050, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,6', NULL), + (276, 'scifiport*8', 'Purple Sci-Fi Port', 'Energy beams. No trespassers!', 1049, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,6', NULL), + (277, 'scifiport*7', 'Turquoise Sci-Fi Port', 'Energy beams. No trespassers!', 1048, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,6', NULL), + (278, 'scifiport*6', 'White Sci-Fi Port', 'Energy beams. No trespassers!', 1047, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (279, 'scifiport*5', 'Security Fence', 'Recovered from Roswell', 1046, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,6', NULL), + (280, 'scifiport*4', 'Pink Sci-Fi Port', 'Energy beams. No trespassers!', 1045, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,6', NULL), + (281, 'scifiport*3', 'Jade Sci-Fi Port', 'Energy beams. No trespassers!', 1044, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,6', NULL), + (282, 'scifiport*2', 'Blue Laser Gate', 'Get in the ring!', 1043, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,6', NULL), + (283, 'scifiport*1', 'Gold Laser Gate', 'Energy beams. No trespassers!', 1042, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,6', NULL), + (284, 'scifirocket*9', 'Neptune Smoke Machine', 'Something fishy is going on...', 1109, 1, 1, 0, '2', 'solid,custom_data_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (285, 'scifirocket*8', 'Pluto Smoke Machine', 'From a space far, far away!', 1108, 1, 1, 0, '2', 'solid,custom_data_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (286, 'scifirocket*7', 'Jupiter Smoke Machine', 'Larger than life!', 1107, 1, 1, 0, '2', 'solid,custom_data_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (287, 'scifirocket*6', 'Mercury Smoke Machine', 'Too hot to handle!', 1106, 1, 1, 0, '2', 'solid,custom_data_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (288, 'scifirocket*5', 'Uranus Smoke Machine', 'From the unknown depths of space', 1105, 1, 1, 0, '2', 'solid,custom_data_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (289, 'scifirocket*4', 'Venus Smoke Machine', 'Welcome... to planet love', 1104, 1, 1, 0, '2', 'solid,custom_data_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (290, 'scifirocket*3', 'Endor Smoke Machine', 'Caution! Unknown Location!', 1103, 1, 1, 0, '2', 'solid,custom_data_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (291, 'scifirocket*2', 'Earth Smoke Machine', 'A little closer to home!', 1102, 1, 1, 0, '2', 'solid,custom_data_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (292, 'scifirocket*1', 'Saturn Smoke Machine', 'There is always space for this!', 1101, 1, 1, 0, '2', 'solid,custom_data_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (293, 'scifirocket*0', 'Mars Smoke Machine', 'See in 2007 with a bang!', 1100, 1, 1, 0, '2', 'solid,custom_data_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (294, 'pillow*5', 'Black Leather Pillow', 'Puffy, soft and huge', 1095, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (295, 'pillow*8', 'Navy Cord Pillow', 'Puffy, soft and huge', 1098, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (296, 'pillow*0', 'White Lace Pillow', 'Minimalist comfort!', 1090, 1, 1, 1, '1', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (297, 'pillow*1', 'Pink Fluffy Pillow', 'Puffy, soft and huge', 1091, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (298, 'pillow*2', 'Red Silk Pillow', 'Puffy, soft and huge', 1092, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (299, 'pillow*7', 'Purple Velvet Pillow', 'Bonnie\'s pillow of choice!', 1097, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (300, 'pillow*9', 'Green Wooly Pillow', 'Puffy, soft and VERY fluffy!', 1099, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (301, 'pillow*4', 'Gold Feather Pillow', 'Puffy, soft and huge', 1094, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (302, 'pillow*6', 'Blue Cotton Pillow', 'Puffy, soft and huge', 1096, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (303, 'pillow*3', 'Turquoise Satin Pillow', 'Puffy, soft and huge', 1093, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (304, 'marquee*1', 'Pink marquee', 'It\'s both door and a shade!', 1051, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '2,4', NULL), + (305, 'marquee*2', 'Red Dragon Marquee', 'Dragons out and Davids in!', 1052, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '2,4', NULL), + (306, 'marquee*7', 'Purple Marquee', 'It\'s both door and a shade!', 1057, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '2,4', NULL), + (307, 'marquee*8', 'Ultramarine Marquee', 'It\'s both door and a shade!', 1058, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '2,4', NULL), + (308, 'marquee*9', 'Green Marquee', 'It\'s both door and a shade!', 1059, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '2,4', NULL), + (309, 'marquee*5', 'Graphite Marquee', 'It\'s both door and a shade!', 1055, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '2,4', NULL), + (310, 'marquee*4', 'Yellow Marquee', 'It\'s both door and a shade!', 1054, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '2,4', NULL), + (311, 'marquee*6', 'Blue Marquee', 'It\'s both door and a shade!', 1056, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '2,4', NULL), + (312, 'marquee*3', 'Aqua Marquee', 'It\'s both door and a shade!', 1053, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '2,4', NULL), + (313, 'wooden_screen*1', 'Pink Oriental screen', 'Add an exotic touch to your room', 1071, 1, 2, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (314, 'wooden_screen*2', 'RosewoodScreen', 'Add an exotic touch to your room', 1072, 1, 2, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (315, 'wooden_screen*7', 'Purple Oriental Screen', 'Add an exotic touch to your room', 1077, 1, 2, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (316, 'wooden_screen*0', 'White Oriental Screen', 'Add an exotic touch to your room', 1070, 1, 2, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (317, 'wooden_screen*8', 'Night Blue Oriental Screen', 'Add an exotic touch to your room', 1078, 1, 2, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (318, 'wooden_screen*5', 'Gray Oriental Screen', 'Add an exotic touch to your room', 1075, 1, 2, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (319, 'wooden_screen*9', 'Green Oriental Screen', 'Add an exotic touch to your room', 1079, 1, 2, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (320, 'wooden_screen*4', 'Golden Oriental Screen', 'Add an exotic touch to your room', 1074, 1, 2, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (321, 'wooden_screen*6', 'Blue Oriental Screen', 'Add an exotic touch to your room', 1076, 1, 2, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (322, 'wooden_screen*3', 'Aqua Oriental Screen', 'Add an exotic touch to your room', 1073, 1, 2, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (323, 'rare_icecream*1', 'Blueberry Ice Cream Machine', 'Virtual blueberry rocks!', 1024, 1, 1, 0, '2', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '4', -1, '2,4', NULL), + (324, 'rare_icecream*7', 'Chocolate Ice Cream Machine', 'Virtual chocolate rocks!', 1030, 1, 1, 0, '2', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '4', -1, '2,4', NULL), + (325, 'rare_icecream*8', 'Peppermint Ice Cream Machine', 'Virtual peppermint rocks!', 1031, 1, 1, 0, '2', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '4', -1, '2,4', NULL), + (326, 'rare_icecream*2', 'Pistachio Ice Cream Machine', 'Virtual pistachio rocks!', 1025, 1, 1, 0, '2', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '4', -1, '2,4', NULL), + (327, 'rare_icecream*6', 'Toffee Ice Cream Machine', 'Virtual toffee rocks!', 1029, 1, 1, 0, '2', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '4', -1, '2,4', NULL), + (328, 'rare_icecream*9', 'Bubblegum Ice Cream Machine', 'Virtual bubblegum rocks!', 1032, 1, 1, 0, '2', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '4', -1, '2,4', NULL), + (329, 'rare_icecream*3', 'Blackcurrant Ice Cream Machine', 'Virtual blackcurrant rocks!', 1026, 1, 1, 0, '2', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '4', -1, '2,4', NULL), + (330, 'rare_icecream*0', 'Cherry Ice Cream Machine', 'Virtual cherry rocks!', 1023, 1, 1, 0, '2', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '4', -1, '2,4', NULL), + (331, 'rare_icecream*4', 'Strawberry Ice Cream Machine', 'Virtual strawberry rocks!', 1027, 1, 1, 0, '2', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '4', -1, '2,4', NULL), + (332, 'rare_icecream*5', 'Vanilla Ice Cream Machine', 'Virtual vanilla rocks!', 1028, 1, 1, 0, '2', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '4', -1, '2,4', NULL), + (333, 'rare_fountain', 'Bird Bath (red)', 'For our feathered friends', 1138, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (334, 'rare_fountain*1', 'Bird Bath (grey)', 'For our feathered friends', 1139, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (335, 'rare_fountain*2', 'Bird Bath (green)', 'For our feathered friends', 1140, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (336, 'rare_fountain*3', 'Bird Bath (blue)', 'For our feathered friends', 1141, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (337, 'rare_elephant_statue', 'Golden Elephant', 'Say hello to Nelly', 1135, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (338, 'rare_elephant_statue*1', 'Silver Elephant', 'Say hello to Nelly', 1136, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (339, 'rare_elephant_statue*2', 'Bronze Elephant', 'Say hello to Nelly', 1137, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (340, 'rare_fan*7', 'Brown Powered Fan', '...it\'s really hit the fan!', 1020, 1, 1, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (341, 'rare_fan*6', 'Ochre Powered Fan', 'It\'ll blow you away!', 1019, 1, 1, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (342, 'rare_fan*9', 'Fucsia Powered Fan', 'It\'ll blow you away!', 1022, 1, 1, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (343, 'rare_fan*3', 'Purple Dragon Skin Fan', 'Keeps the heat off St George!', 1016, 1, 1, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (344, 'rare_fan*0', 'Festive Fan', 'As red as Rudolph\'s nose', 1013, 1, 1, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (345, 'rare_fan*4', 'SUPERLOVE Fan', 'Fanning the fires of SUPERLOVE...', 1017, 1, 1, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (346, 'rare_fan*5', 'Yellow Powered Fan', 'It\'ll blow you away!', 1018, 1, 1, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (347, 'rare_fan*1', 'Birthday Fan', 'It\'ll blow your candles out!', 1014, 1, 1, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (348, 'rare_fan*8', 'Habbo Wind Turbine', 'Stylish, Eco-Energy!', 1021, 1, 1, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (349, 'rare_fan*2', 'Green Powered Fan', 'It\'ll blow you away!', 1015, 1, 1, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (350, 'habbowheel', 'The Wheel of Destiny!', 'So you gotta ask yourself, \'Do I feel lucky?\'', 93, 1, 1, 0, '33', 'wall_item,wheel_of_fortune,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (351, 'roomdimmer', 'Mood Light', 'Superior lighting for your room', 1002, 1, 1, 0, '2', 'wall_item,roomdimmer,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (352, 'jukebox*1', 'Jukebox', 'For your Happy Days!', 575, 1, 1, 0, '2', 'solid,jukebox,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (353, 'jukebox_ptv*1', 'Jukebox Pacha TV', 'Jukebox Pacha TV', 1273, 1, 1, 0, '2', 'solid,jukebox,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (354, 'carpet_soft_tut', 'Welcome Mat', 'Welcome, enjoy your stay!', 1195, 1, 1, 0.2, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (355, 'sound_set_9', 'Electronic 2', 'Mystical ambient soundscapes', 549, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (356, 'sound_set_10', 'Hip Hop Beats 1', 'Made from real Boy Bands!', 596, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (357, 'sound_set_2', 'Habbo Sounds 3', 'Get the party started!', 578, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (358, 'sound_set_4', 'Ambient 1', 'Chilled out beats', 540, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (359, 'sound_set_5', 'Ambient 4', 'The dark side of Habbo', 543, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (360, 'sound_set_11', 'Dance 4', 'Music you can really sink your teeth into', 561, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (361, 'sound_set_12', 'Habbo Sounds 2', 'Unusual as Standard', 577, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (362, 'sound_set_13', 'Dance 5', 'Let Music be the food of Habbo', 562, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (363, 'sound_set_14', 'Hip Hop Beats 2', 'Rock them bodies', 597, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (364, 'sound_set_15', 'RnB Grooves 6', 'Unadulterated essentials', 595, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (365, 'sound_set_16', 'Hip Hop Beats 3', 'Ferry, ferry good!', 598, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (366, 'sound_set_17', 'Groove 3', 'Jive\'s Alive!', 546, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (367, 'sound_set_18', 'Groove 4', 'Listen while you tan', 547, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (368, 'sound_set_19', 'Hip Hop Beats 4', 'Shake your body!', 599, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (369, 'sound_set_20', 'SFX 2', 'Musical heaven', 581, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (370, 'sound_set_21', 'Rock 1', 'Headbanging riffs', 567, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (371, 'sound_set_22', 'SFX 3', 'With a hamper full of sounds, not sarnies', 582, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (372, 'sound_set_23', 'SFX 4', 'Don\'t be afraid of the dark', 583, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (373, 'sound_set_24', 'Habbo Sounds 4', 'It\'s all about the Pentiums, baby!', 579, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (374, 'sound_set_25', 'Dance 1', 'Actually, it\'s Partay!', 558, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (375, 'sound_set_26', 'Groove 1', 'Bollywood Beats!', 544, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (376, 'sound_set_27', 'Groove 2', 'Jingle Bells will never be the same...', 545, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (377, 'sound_set_28', 'Rock 2', 'Head for the pit!', 568, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (378, 'sound_set_29', 'Dance 2', 'Electronic house', 559, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (379, 'sound_set_30', 'Instrumental 1', 'Moments in love', 585, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (380, 'sound_set_31', 'Dance 3', 'House loops', 560, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (381, 'sound_set_32', 'Instrumental 2', 'Piano concert set', 586, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (382, 'sound_set_33', 'Rock 3', 'Guitar solo set', 569, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (383, 'sound_set_34', 'Rock 5', 'For guitar heroes', 571, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (384, 'sound_set_35', 'Dance 6', 'Groovelicious', 563, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (385, 'sound_set_36', 'Latin Love 1', 'For adult minded', 587, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (386, 'sound_set_37', 'Habbowood Traxpack', 'Blockbuster hits!', 11215, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (387, 'sound_set_38', 'Rock 6', 'Rock and Roses!', 572, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (388, 'sound_set_39', 'Rock 7', 'Rock with a roll', 573, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (389, 'sound_set_40', 'Rock 4', 'Dude? Cheese!', 570, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (390, 'sound_set_41', 'Rock 8', 'Burning Riffs', 574, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (391, 'sound_set_42', 'Haunted Mansion', 'Bumps and Chills', 11216, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (392, 'sound_set_43', 'SFX 1', 'Beware zombies!', 580, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (393, 'sound_set_44', 'Graveyard Portal', 'Haunted Dimension', 11217, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (394, 'sound_set_45', 'Berlin Connection', 'The Bass? is the rhythm!', 11218, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (395, 'sound_set_46', 'Club 1', 'De bada bada bo!', 552, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (396, 'sound_set_47', 'Club 2', 'Storm the UKCharts!', 553, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (397, 'sound_set_48', 'Club 3', 'Sweet party beat', 554, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (398, 'sound_set_49', 'Club 4', 'You will belong', 555, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (399, 'sound_set_50', 'Club 5', 'The harder generation', 556, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (400, 'sound_set_51', 'Club 6', 'Bop to the beat', 557, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (401, 'sound_set_52', 'Club 7', 'State of Trancehouse', 2633, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (402, 'sound_set_53', 'Snowy Surprise', 'Break the icy silence', 1280, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (403, 'sound_set_54', 'Oh Blinging Tree', 'Tune into Christmas', 1281, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (404, 'sound_set_55', 'RnB Grooves 1', 'Can you fill me in?', 590, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (405, 'sound_set_56', 'RnB Grooves 2', 'Get down tonight!', 591, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (406, 'sound_set_57', 'RnB Grooves 3', 'Feel the groove', 592, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (407, 'sound_set_58', 'RnB Grooves 4', 'Sh-shake it!', 593, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (408, 'sound_set_59', 'RnB Grooves 5', 'Urban break beats', 594, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (409, 'sound_set_60', 'Latin Love 2', 'Love and affection!', 588, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (410, 'sound_set_61', 'Latin Love 3', 'Straight from the heart', 589, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (411, 'sound_set_62', 'Alhambra Trax 1', 'Music of the Arabian night!', 74, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (412, 'sound_set_63', 'Alhambra Trax 2', 'Desert hits by the oasis!', 75, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (413, 'sound_set_64', 'Alhambra Trax 3', 'Make a little Jinn-gle!', 76, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (414, 'present_gen1', 'Gift', 'What\'s inside?', 1372, 1, 1, 1, '0', 'solid,present,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 0, '', -1, '0', NULL), + (415, 'present_gen2', 'Gift', 'What\'s inside?', 1373, 1, 1, 1, '0', 'solid,present,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 0, '', -1, '0', NULL), + (416, 'present_gen3', 'Gift', 'What\'s inside?', 1374, 1, 1, 1, '0', 'solid,present,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 0, '', -1, '0', NULL), + (417, 'present_gen4', 'Gift', 'What\'s inside?', 1375, 1, 1, 1, '0', 'solid,present,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 0, '', -1, '0', NULL), + (418, 'present_gen5', 'Gift', 'What\'s inside?', 1376, 1, 1, 1, '0', 'solid,present,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 0, '', -1, '0', NULL), + (419, 'present_gen6', 'Gift', 'What\'s inside?', 1377, 1, 1, 1, '0', 'solid,present,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 0, '', -1, '0', NULL), + (420, 'camera', 'Camera', 'Smile!', 145, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (421, 'photo', 'Photo', 'Photo from Habbo', 11221, 0, 0, 0, '0', 'photo,wall_item', 'default', 1, 0, '', -1, '2,4', NULL), + (422, 'film', NULL, NULL, 0, 0, 0, 0, '0', '', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (423, 'table_plasto_4leg*6', 'Occasional table Table', 'Hip plastic furniture', 415, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (424, 'table_plasto_round', 'Round Dining Table', 'Hip plastic furniture', 400, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (425, 'table_plasto_bigsquare', 'Square Dining Table', 'Hip plastic furniture', 408, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (426, 'chair_plasty', 'Plastic Pod Chair', 'Hip plastic furniture', 427, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (427, 'chair_plasto*16', 'Chair', 'Hip plastic furniture', 368, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (428, 'table_plasto_square*15', 'Occasional Table', 'Hip plastic furniture', 379, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (429, 'table_plasto_4leg*1', 'Square Dining Table', 'Hip plastic furniture', 416, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (430, 'table_plasto_bigsquare*1', 'Square Dining Table', 'Hip plastic furniture', 406, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (431, 'table_plasto_round*1', 'Round Dining Table', 'Hip plastic furniture', 394, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (432, 'table_plasto_square*14', 'Occasional Table', 'Hip plastic furniture', 380, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (433, 'chair_plasto*15', 'Chair', 'Hip plastic furniture', 369, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (434, 'table_plasto_4leg', 'Occasional Table', 'Hip plastic furniture', 419, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (435, 'table_plasto_bigsquare*2', 'Square Dining Table', 'Hip plastic furniture', 407, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (436, 'table_plasto_round*2', 'Round Dining Table', 'Hip plastic furniture', 395, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (437, 'table_plasto_square*1', 'Occasional Table', 'Hip plastic furniture', 381, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (438, 'chair_plasto*5', 'Chair', 'Hip plastic furniture', 370, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (439, 'table_plasto_4leg*5', 'Occasional Table', 'Hip plastic furniture', 420, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (440, 'table_plasto_bigsquare*3', 'Square Dining Table', 'Hip plastic furniture', 412, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (441, 'table_plasto_round*3', 'Round Dining Table', 'Hip plastic furniture?', 398, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (442, 'table_plasto_square*7', 'Square Dining Table', 'Hip plastic furniture', 382, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (443, 'chair_plasto', 'Chair', 'Hip plastic furniture', 371, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (444, 'table_plasto_4leg*8', 'Occasional Table', 'Hip plastic furniture', 422, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (445, 'table_plasto_bigsquare*4', 'Square Dining Table', 'Hip plastic furniture', 414, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (446, 'table_plasto_round*4', 'Square Dining Table', 'Hip plastic furniture', 396, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (447, 'table_plasto_square', 'Occasional Table', 'Hip plastic furniture', 383, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (448, 'chair_plasto*8', 'Chair', 'Hip plastic furniture', 372, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (449, 'table_plasto_4leg*7', 'Occasional table', 'Hip plastic furniture', 423, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (450, 'table_plasto_bigsquare*5', 'Square Dining Table', 'Hip plastic furniture', 410, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (451, 'table_plasto_round*5', 'Round Dining Table', 'Hip plastic furniture', 401, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (452, 'table_plasto_square*2', 'Round Dining Table', 'Hip plastic furniture', 384, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (453, 'chair_plasto*7', 'Chair', 'Hip plastic furniture', 373, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (454, 'table_plasto_4leg*10', 'Occasional Table', 'Hip plastic furniture', 424, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (455, 'table_plasto_bigsquare*6', 'Square Dining Table', 'Hip plastic furniture', 413, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (456, 'table_plasto_round*6', 'Round Dining Table', 'Hip plastic furniture', 397, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (457, 'table_plasto_square*4', 'Square Dining Table', 'Hip plastic furniture', 385, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (458, 'chair_plasto*1', 'Chair', 'Hip plastic furniture', 374, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (459, 'table_plasto_4leg*15', 'Occasional Table', 'Hip plastic furniture', 425, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (460, 'table_plasto_bigsquare*7', 'Square Dining Table', 'Hip plastic furniture', 405, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (461, 'table_plasto_round*7', 'Round Dining Table', 'Hip plastic furniture', 393, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (462, 'table_plasto_square*6', 'Square Dining Table', 'Hip plastic furniture', 386, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (463, 'chair_plasto*4', 'Chair', 'Hip plastic furniture', 375, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (464, 'table_plasto_4leg*16', 'Occasional Table', 'Hip plastic furniture', 426, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (465, 'table_plasto_bigsquare*8', 'Square Dining Table', 'Hip plastic furniture', 409, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (466, 'table_plasto_round*8', 'Round Dining Table', 'Hip plastic furniture', 402, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (467, 'table_plasto_square*3', 'Square Dining Table', 'Hip plastic furniture', 387, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (468, 'chair_plasto*6', 'Chair', 'Hip plastic furniture', 376, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (469, 'table_plasto_4leg*14', 'HC table', 'Aqua table', 979, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (470, 'table_plasto_bigsquare*9', 'Square Dining Table', 'Hip plastic furniture', 411, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (471, 'table_plasto_round*9', 'Round Dining Table', 'Hip plastic furniture', 399, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (472, 'table_plasto_square*9', 'Square Dining Table', 'Hip plastic furniture', 388, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (473, 'chair_plasto*3', 'Chair', 'Hip plastic furniture', 377, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (474, 'landscape', '', '', 11078, 1, 1, 0, '0', 'wall_item,decoration,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (475, 'chair_plasty*1', 'Plastic Pod Chair', 'Hip plastic furniture', 428, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (476, 'chair_plasty*2', 'Plastic Pod Chair', 'Hip plastic furniture', 429, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (477, 'chair_plasty*3', 'Plastic Pod Chair', 'Hip plastic furniture', 430, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (478, 'chair_plasty*4', 'Plastic Pod Chair', 'Hip plastic furniture', 431, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (479, 'chair_plasty*5', 'Plastic Pod Chair', 'Hip plastic furniture', 432, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (480, 'chair_plasty*6', 'Plastic Pod Chair', 'Hip plastic furniture', 433, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (481, 'chair_plasto*2', 'Chair', 'Hip plastic furniture', 378, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (482, 'chair_plasto*9', 'Chair', 'Hip plastic furniture', 439, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (483, 'table_plasto_4leg*9', 'Occasional Table', 'Hip plastic furniture', 418, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (484, 'table_plasto_4leg*3', 'Round Dining Table', 'Hip plastic furniture', 417, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (485, 'table_plasto_bigsquare*14', 'Occasional Table', 'Hip plastic furniture', 404, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (486, 'table_plasto_bigsquare*15', 'Occasional Table', 'Hip plastic furniture', 403, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (487, 'table_plasto_round*14', 'Occasional Table', 'Hip plastic furniture', 392, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (488, 'table_plasto_round*15', 'Occasional Table', 'Hip plastic furniture', 391, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (489, 'table_plasto_square*5', 'Square Dining Table', 'Hip plastic furniture', 389, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (490, 'table_plasto_square*8', 'Square Dining Table', 'Hip plastic furniture', 390, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (491, 'chair_plasty*7', 'Plastic Pod Chair', 'Hip plastic furniture', 434, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (492, 'chair_plasty*8', 'Plastic Pod Chair', 'Hip plastic furniture', 435, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (493, 'chair_plasty*9', 'Plastic Pod Chair', 'Hip plastic furniture', 436, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (494, 'chair_plasty*10', 'Plastic Pod Chair', 'Hip plastic furniture', 437, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (495, 'chair_plasty*11', 'Plastic Pod Chair', 'Hip plastic furniture', 438, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (496, 'rubberchair*1', 'Blue Inflatable Chair', 'Soft and stylish HC chair', 1033, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (497, 'rubberchair*2', 'Pink Inflatable Chair', 'Soft and tearproof!', 1034, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (498, 'rubberchair*3', 'Orange Inflatable Chair', 'Soft and tearproof!', 1035, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (499, 'rubberchair*4', 'Ocean Inflatable Chair', 'Soft and tearproof!', 1036, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (500, 'rubberchair*5', 'Lime Inflatable Chair', 'Soft and tearproof!', 1037, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (501, 'rubberchair*6', 'Violet Inflatable Chair', 'Soft and tearproof!', 1038, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (502, 'rubberchair*7', 'White Inflatable Chair', 'Soft and tearproof!', 1039, 1, 1, 1, '1', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (503, 'rubberchair*8', 'Black Inflatable Chair', 'Soft and tearproof for HC!', 1040, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (504, 'spyro', 'Dragon Egg', 'The stuff of legend', 11119, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (505, 'rare_daffodil_rug', 'Petal Patch', 'A little bit of outdoors indoors..', 1126, 2, 2, 0, '0', 'can_stand_on_top,can_stack_on_top,place_roller_on_top', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (506, 'md_limukaappi', 'Habbo Cola Machine', 'A sparkling and refreshing pixel drink!', 1143, 1, 1, 0, '0', 'solid,custom_data_true_false', 'vending_machine', 1, 1, '19', -1, '2,4', NULL), + (507, 'samovar', 'Russian Samovar', 'Click for a refreshing cuppa', 1142, 1, 1, 0, '0', 'solid,custom_data_true_false', 'vending_machine', 1, 1, '1', -1, '2,4', NULL), + (508, 'redhologram', 'Holo-girl', 'You\'re her only hope...', 1116, 1, 1, 0, '2', 'solid,custom_data_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (509, 'typingmachine', 'Typewriter', 'Write that bestseller', 1117, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (510, 'hologram', 'Holopod', 'As if by magic...', 1115, 1, 1, 0, '2', 'solid,custom_data_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (511, 'prize1', 'Gold Trophy', 'Gorgeously glittery', 1129, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (512, 'prize2', 'Silver Trophy', 'Nice and shiny', 1130, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (513, 'prize3', 'Bronze Trophy', 'A weighty award', 1131, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (514, 'rare_snowrug', 'Snow Rug', 'Chilled Elegance', 1124, 2, 2, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (515, 'exe_rug', 'Executive Rug', 'Please remove your shoes!', 1230, 3, 3, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (516, 'exe_s_table', 'Executive Glass Table', 'Get a clear reflection!', 1231, 2, 2, 1, '2', 'solid,can_stack_on_top,custom_data_numeric_state,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (517, 'exe_bardesk', 'Executive Bar Desk', 'Divide the profits!', 1223, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (518, 'exe_chair', 'Executive Sofa Chair', 'Relaxing leather comfort', 1225, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (519, 'exe_chair2', 'Executive Boss Chair', 'You\'re fired!', 1226, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (520, 'exe_corner', 'Executive Corner Desk', 'Tuck it away', 1224, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (521, 'exe_drinks', 'Executive Drinks Tray', 'Give a warm welcome', 1227, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (522, 'exe_sofa', '3-Seater Sofa', 'Relaxing leather comfort', 1228, 3, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (523, 'exe_table', 'Executive Desk', 'Take a memo, Featherstone', 1229, 3, 2, 0, '2', 'solid,custom_data_numeric_state,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (524, 'exe_plant', 'Executive Plant', 'Shimmering hedge trimming!', 1233, 1, 1, 0, '2', 'solid,custom_data_numeric_state,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (525, 'exe_light', 'Executive Light', 'Glow your business', 10068, 1, 1, 0, '4', 'can_stand_on_top,can_stack_on_top,custom_data_numeric_state,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (526, 'exe_gate', 'Executive Gate', 'Keeps the tax man away', 10067, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2', NULL), + (527, 'exe_cubelight', 'Cubist Light', 'Lights up a square', 10066, 1, 1, 0, '3', 'solid,custom_data_numeric_state,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (528, 'exe_artlamp', 'Sphere Lamp', 'Suitable for budding entrepreneurs', 10065, 1, 1, 0, '2', 'solid,custom_data_numeric_state,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (529, 'exe_map', 'World Map', 'World domination imminent', 10069, 1, 1, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (530, 'exe_wfall', 'Wall Fall', 'Improve your cash flow', 10070, 1, 1, 0, '3', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (531, 'exe_globe', 'Power Globe', 'The power is yours!', 1232, 1, 1, 0, '9', 'solid,custom_data_numeric_state,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (532, 'exe_elevator', 'Elevator Teleport', 'Going up or down in style!', 11220, 1, 1, 0, '3', 'solid,requires_touching_for_interaction,custom_data_true_false,teleporter,redirect_rotation_2', 'teleport', 1, 1, '', -1, '2,4', NULL), + (533, 'arabian_bigtb', 'Amanjena Table', 'It must be Jinn-er time!', 59, 3, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (534, 'arabian_chair', 'Green Blossom Chair', 'Exotic, soft seating', 60, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (535, 'arabian_divdr', 'Soft wooden screen', 'Carved Cedar Divider', 61, 1, 2, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (536, 'arabian_pllw', 'Green Blossom Pillow', 'Exotic comfort', 62, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (537, 'arabian_rug', 'Berber Kilim Rug', 'Green blossom design', 63, 3, 5, 0, '0', 'can_stand_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (538, 'arabian_snake', 'Ornamental Urn', 'Beware the snake!', 64, 1, 1, 0, '2', 'solid,custom_data_numeric_state,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (539, 'arabian_swords', 'Ancestral Scimitars', 'Not for yielding', 65, 1, 1, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (540, 'arabian_teamk', 'Tea Maker', 'Quench that desert thirst', 66, 1, 1, 0, '2', 'solid,custom_data_true_false', 'vending_machine', 1, 1, '27', -1, '2,4', NULL), + (541, 'arabian_tetbl', 'Hexagonal Tea Table', 'Serve up a treat', 67, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (542, 'arabian_tray1', 'Mint Tea Tray', 'Tea for every occasion', 68, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (543, 'arabian_tray2', 'Candle Tray', 'For those Arabian nights', 73, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (544, 'arabian_tray3', 'Sweets Tray', 'Indulge yourself!', 70, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (545, 'arabian_tray4', 'Fruit Tray', 'Sweet, juicy and ripe', 71, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (546, 'arabian_wndw', 'Arabian Window Frame', 'Arabian days and nights', 72, 1, 1, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (547, 'arabian_wall', 'Arabian Wall', 'A wall built with class.', 4287, 1, 1, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (548, 'arabian_tile', 'Arabian Tile', 'Step in style...', 3312, 2, 2, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (549, 'noob_window_double', 'Window', 'Room with a view', 1196, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 0, 0, '', -1, '2,4', NULL), + (550, 'window_70s_narrow', 'Small 70s Window', 'Takes you back', 1197, 0, 0, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (551, 'window_70s_wide', 'Large 70s Window', 'A view of the past', 1198, 0, 0, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (552, 'window_basic', 'Basic Window', 'Plain and simple', 1199, 0, 0, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (553, 'window_chinese_narrow', 'Small Oriental Window', 'Narrow wood carved frame', 1200, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (554, 'window_chinese_wide', 'Large Oriental Window', 'Dreaming of a Chinese summer', 1201, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (555, 'window_double_default', 'Double Window', 'Twice as good a view', 1202, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (556, 'window_golden', 'Golden Window', 'An expensive view', 1203, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (557, 'window_grunge', 'Grunge Window', 'Don\'t get too close!', 1204, 0, 0, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (558, 'window_romantic_narrow', 'Small Romantic Window', 'A beautiful view', 1205, 0, 0, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (559, 'window_romantic_wide', 'Large Romantic Window', 'Heavenly scent of flowers', 1206, 0, 0, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (560, 'window_single_default', 'Single Window', 'A simple view', 1207, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (561, 'window_square', 'Glass Square Window', 'Let\'s get creative!', 1208, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (562, 'window_triple', 'Bay Window', 'Now THAT\'S a view!', 1209, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (563, 'window_skyscraper', 'Skyscraper Window', 'Dizzy heights!', 1391, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (564, 'pets1', NULL, NULL, 34, 1, 1, 0, '2', 'requires_rights_for_interaction,redirect_rotation_4,can_stand_on_top', 'pet_nest', 1, 1, '', -1, '0,2,4,6', NULL), + (565, 'pets2', NULL, NULL, 35, 1, 1, 0, '2', 'requires_rights_for_interaction,redirect_rotation_4,can_stand_on_top', 'pet_nest', 1, 1, '', -1, '0,2,4,6', NULL), + (566, 'teleport_door', 'Teleport Door', 'Magic doorway to anywhere!', 538, 1, 1, 0, '3', 'solid,requires_touching_for_interaction,custom_data_true_false,teleporter,redirect_rotation_0,door_teleporter', 'teleport', 1, 1, '', -1, '0,2,4,6', NULL), + (567, 'noob_plant', 'Lucky Bamboo', 'Starter Furni', 1288, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 0, 0, '', -1, '0,2', NULL), + (568, 'noob_table*1', 'My first Habbo table', 'Lightweight, practical and orange', 1189, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 0, 0, '', -1, '0,2', NULL), + (569, 'noob_table*2', 'My first Habbo table', 'Lightweight, practical and dark blue', 1190, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 0, 0, '', -1, '0,2', NULL), + (570, 'noob_table*3', 'My first Habbo table', 'Lightweight, practical and aubergine', 1191, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 0, 0, '', -1, '0,2', NULL), + (571, 'noob_table*4', 'My first Habbo table', 'Lightweight, practical and light blue', 1192, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 0, 0, '', -1, '0,2', NULL), + (572, 'noob_table*5', 'My first Habbo table', 'Lightweight, practical and pink', 1193, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 0, 0, '', -1, '0,2', NULL), + (573, 'noob_table*6', 'My first Habbo table', 'Lightweight, practical and green', 1194, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 0, 0, '', -1, '0,2', NULL), + (574, 'noob_stool*1', 'My first Habbo stool', 'Unfold me and take the weight off (orange)', 1183, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 0, 0, '', -1, '0,2,4,6', NULL), + (575, 'noob_stool*2', 'My first Habbo stool', 'Unfold me and take the weight off (dark blue)', 1184, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 0, 0, '', -1, '0,2,4,6', NULL), + (576, 'noob_stool*3', 'My first Habbo stool', 'Unfold me and take the weight off (aubergine)', 1185, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 0, 0, '', -1, '0,2,4,6', NULL), + (577, 'noob_stool*4', 'My first Habbo stool', 'Unfold me and take the weight off (light blue)', 1186, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 0, 0, '', -1, '0,2,4,6', NULL), + (578, 'noob_stool*5', 'My first Habbo stool', 'Unfold me and take the weight off (pink)', 1187, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 0, 0, '', -1, '0,2,4,6', NULL), + (579, 'noob_stool*6', 'My first Habbo stool', 'Unfold me and take the weight off (green)', 1188, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 0, 0, '', -1, '0,2,4,6', NULL), + (580, 'noob_rug*1', 'My first Habbo rug', 'Nice and neat sisal rug with orange edging', 1177, 2, 2, 0.1, '0', 'can_stack_on_top,can_stand_on_top,requires_rights_for_interaction', 'default', 0, 0, '', -1, '0,2', NULL), + (581, 'noob_rug*2', 'My first Habbo rug', 'Nice and neat sisal rug with blue edging', 1178, 2, 2, 0.1, '0', 'can_stack_on_top,can_stand_on_top,requires_rights_for_interaction', 'default', 0, 0, '', -1, '0,2', NULL), + (582, 'noob_rug*3', 'My first Habbo rug', 'Nice and neat sisal rug with aubergine edging', 1179, 2, 2, 0.1, '0', 'can_stack_on_top,can_stand_on_top,requires_rights_for_interaction', 'default', 0, 0, '', -1, '0,2', NULL), + (583, 'noob_rug*4', 'My first Habbo rug', 'Nice and neat sisal rug with light blue edging', 1180, 2, 2, 0.1, '0', 'can_stack_on_top,can_stand_on_top,requires_rights_for_interaction', 'default', 0, 0, '', -1, '0,2', NULL), + (584, 'noob_rug*5', 'My first Habbo rug', 'Nice and neat sisal rug with pink edging', 1181, 2, 2, 0.1, '0', 'can_stack_on_top,can_stand_on_top,requires_rights_for_interaction', 'default', 0, 0, '', -1, '0,2', NULL), + (585, 'noob_rug*6', 'My first Habbo rug', 'Nice and neat sisal rug with green edging', 1182, 2, 2, 0.1, '0', 'can_stack_on_top,can_stand_on_top,requires_rights_for_interaction', 'default', 0, 0, '', -1, '0,2', NULL), + (586, 'noob_lamp*1', 'My first Habbo lamp', 'Get the light right where you want it (yellow)', 1171, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 0, 0, '', -1, '0,2', NULL), + (587, 'noob_lamp*2', 'My first Habbo lamp', 'Get the light right where you want it (dark blue)', 1172, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 0, 0, '', -1, '0,2', NULL), + (588, 'noob_lamp*3', 'My first Habbo lamp', 'Get the light right where you want it (aubergine)', 1173, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 0, 0, '', -1, '0,2', NULL), + (589, 'noob_lamp*4', 'My first Habbo lamp', 'Get the light right where you want it (light blue)', 1174, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 0, 0, '', -1, '0,2', NULL), + (590, 'noob_lamp*5', 'My first Habbo lamp', 'Get the light right where you want it (pink)', 1175, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 0, 0, '', -1, '0,2', NULL), + (591, 'noob_lamp*6', 'My first Habbo lamp', 'Get the light right where you want it (canary yellow)', 1176, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 0, 0, '', -1, '0,2', NULL), + (592, 'noob_chair*1', 'My first Habbo chair', 'Lightweight, practical and yellow', 1165, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 0, 0, '', -1, '0,2,4,6', NULL), + (593, 'noob_chair*2', 'My first Habbo chair', 'Lightweight, practical, with dark blue stripes', 1166, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 0, 0, '', -1, '0,2,4,6', NULL), + (594, 'noob_chair*3', 'My first Habbo chair', 'Lightweight, practical, with red stripes', 1167, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 0, 0, '', -1, '0,2,4,6', NULL), + (595, 'noob_chair*4', 'My first Habbo chair', 'Lightweight, practical, with light blue stripes', 1168, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 0, 0, '', -1, '0,2,4,6', NULL), + (596, 'noob_chair*5', 'My first Habbo chair', 'Lightweight, practical, with pink stripes', 1169, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 0, 0, '', -1, '0,2,4,6', NULL), + (597, 'noob_chair*6', 'My first Habbo chair ', 'Lightweight, practical with dark yellow stripes', 1170, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 0, 0, '', -1, '0,2,4,6', NULL), + (598, 'country_rain', 'Rain Shower', 'Made in Britain', 11139, 1, 1, 0, '2', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (599, 'country_scarecrow', 'Country Scarecrow', 'Looks strangely similar', 11134, 0, 0, 0, '3', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (600, 'country_soil', 'Crop Field', 'Grow your own!', 11138, 2, 2, 0, '6', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (601, 'country_grass', 'Field Grass', 'Herding and grazing', 11144, 2, 2, 0, '3', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (602, 'country_trctr', 'Tractor', 'Don\'t run over the bunny!', 11125, 2, 2, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (603, 'country_fnc2', 'Stone Wall', 'Keep your livestock safe', 11131, 2, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (604, 'country_fnc1', 'Stick Fence', 'Wooden fence', 11129, 2, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (605, 'country_well', 'Wishing Well', 'Come spend a penny', 11132, 1, 1, 0, '2', 'solid', 'vending_machine', 1, 1, '7', -1, '2,4', NULL), + (606, 'country_rbw', 'Rainbow', 'Is there a pot of gold at the end?', 11130, 1, 1, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (607, 'country_wheat', 'Golden Wheat', 'Right on the brink of harvest', 11135, 2, 2, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (608, 'country_gate', 'Farm Gate', 'Livestock: Close gate behind you', 11140, 2, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,6', NULL), + (609, 'country_stage', 'Wooden Stage', 'Time for a barn dance', 11142, 2, 2, 0.8, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (610, 'country_log', 'Log bench', 'Stop and perch', 11143, 2, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (611, 'country_fnc3', 'Stone Pile', 'The work of a witch?', 11128, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (612, 'country_patio', 'Wooden Patio Tile', 'Build the great outdoors', 11178, 1, 1, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (613, 'country_corner', 'Country Ditch Corner', 'Channel your irrigation', 11177, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (614, 'country_ditch', 'Country Ditch Corner', 'Irrigation to irritation in one wrong step', 11176, 1, 2, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2', NULL), + (615, 'country_forestwall', 'Forest Wall Poster', 'Give your walls a woodland touch', 11086, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (616, 'country_fp', 'Marble Fireplace', 'Keep the home fires burning', 11136, 0, 0, 0, '3', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (617, 'country_wall', 'Country Wall', 'Tudor Style', 11127, 0, 0, 0, '5', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (618, 'country_lantern', 'Ye Olde Lantern', 'Light of your Country life', 11124, 0, 0, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (619, 'env_bushes', 'Eco Hedgerow', 'Block out your nosey neighbours', 10058, 1, 2, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (620, 'env_bushes_gate', 'Eco Hedgerows Gate', 'Get ready for Mother Nature\'s world and wait your turn', 10059, 1, 2, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2', NULL), + (621, 'env_grass', 'Grass patch', 'Lush green grass to lay on your Earth', 10060, 2, 2, 0, '0', 'can_stack_on_top,can_stand_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (622, 'env_telep', 'The Outhouse', 'A place for privacy', 11148, 1, 1, 0, '3', 'solid,requires_touching_for_interaction,custom_data_true_false,teleporter,redirect_rotation_2', 'teleport', 1, 1, '', -1, '2,4', NULL), + (623, 'env_tree1', 'Forest Tree Chair', 'Take seat and breathe in the fresh air!', 10061, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (624, 'env_tree2', 'Forest Tree Americana', 'Earth\'s Green Haven - ROOM 997 by EarthBoyJim', 10062, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (625, 'env_tree3', 'Forest Trunk Seat', 'Earth\'s Green Haven - ROOM 629 by EarthBoyJim', 10063, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (626, 'env_tree4', 'The Four Seasons Tree', 'Crank up some Vivaldi & give your mate a gift.', 10064, 2, 2, 0, '4', 'can_stand_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (627, 'avatar_effect1', NULL, NULL, 0, 0, 0, 0, '0', 'effect,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (628, 'bump_road', 'Road', 'Get in the fast lane', 1702, 2, 2, 0, '4', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (629, 'bump_lights', 'Traffic Lights', 'Ready. Steady. Go!', 1701, 1, 1, 0, '3', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (630, 'bump_signs', 'Road Signs', '7 in 1 road sign.', 1703, 1, 1, 0, '7', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (631, 'bump_tires', 'Bumper Tyres', 'Gets you back on track', 1704, 1, 1, 0, '3', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (632, 'bump_tottero', 'Safety Cone', 'Not a road bump!', 1705, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (633, 'chair_norja*2', 'Black Iced Chair', 'Sleek and chic for each cheek', 756, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (634, 'chair_norja*3', 'White Iced Chair', 'Sleek and chic for each cheek', 767, 1, 1, 1, '1', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (635, 'chair_norja*4', 'Urban Iced Chair', 'Sleek and chic for each cheek', 778, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (636, 'chair_norja*5', 'Pink Chair', 'Sleek and chic for each cheek', 789, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (637, 'chair_norja*6', 'Blue Chair', 'Sleek and chic for each cheek', 800, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (638, 'chair_norja*7', 'Rural Chair', 'Sleek and chic for each cheek', 811, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (639, 'chair_norja*8', 'Yellow Chair', 'Sleek and chic for each cheek', 822, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (640, 'chair_norja*9', 'Red Chair', 'Sleek and chic for each cheek', 833, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (641, 'couch_norja*2', 'Black Iced Bench', 'Two can perch comfortably', 757, 2, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (642, 'couch_norja*3', 'White Iced Bench', 'Two can perch comfortably', 768, 2, 1, 1, '1', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (643, 'couch_norja*4', 'Urban Iced Bench', 'Two can perch comfortably', 779, 2, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (644, 'couch_norja*5', 'Pink Bench', 'Two can perch comfortably', 790, 2, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (645, 'couch_norja*6', 'Blue Bench', 'Two can perch comfortably', 801, 2, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (646, 'couch_norja*7', 'Rural Iced Bench', 'Two can perch comfortably', 812, 2, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (647, 'couch_norja*8', 'Yellow Bench', 'Two can perch comfortably', 823, 2, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (648, 'couch_norja*9', 'Red Bench', 'Two can perch comfortably', 834, 2, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (649, 'table_norja_med*2', 'Black Iced Table', 'For larger gatherings', 758, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (650, 'table_norja_med*3', 'White Iced Table', 'For larger gatherings', 769, 2, 2, 1, '2', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (651, 'table_norja_med*4', 'Urban Iced Coffee Table', 'For larger gatherings', 780, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (652, 'table_norja_med*5', 'Large Coffee Table Pink', 'For larger gatherings', 791, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (653, 'table_norja_med*6', 'Large Coffee Table Blue', 'For larger gatherings', 802, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (654, 'table_norja_med*7', 'Rural Iced Coffee Table', 'For larger gatherings', 813, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (655, 'table_norja_med*8', 'Large Coffee Table Yellow', 'For larger gatherings', 824, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (656, 'table_norja_med*9', 'Large Coffee Table Red', 'For larger gatherings', 835, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (657, 'shelves_norja*2', 'Black Iced Bookcase', 'For nic naks and art deco books', 759, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (658, 'shelves_norja*3', 'White Iced Bookcase', 'For nic naks and art deco books', 770, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (659, 'shelves_norja*4', 'Urban Iced Bookcase', 'For nic naks and tech books', 781, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (660, 'shelves_norja*5', 'Pink Bookcase', 'For nic naks and art deco books', 792, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (661, 'shelves_norja*6', 'Blue Bookcase', 'For nic naks and art deco books', 803, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (662, 'shelves_norja*7', 'Rural Iced Bookcase', 'For nic naks and cookery books', 814, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (663, 'shelves_norja*8', 'Yellow Bookcase', 'For nic naks and art deco books', 825, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (664, 'shelves_norja*9', 'Red Bookcase', 'For nic naks and art deco books', 836, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (665, 'soft_sofachair_norja*2', 'Black Iced Sofachair', 'Black Iced Sofachair', 760, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (666, 'soft_sofachair_norja*3', 'White Iced Sofachair', 'Soft Iced sofachair', 771, 1, 1, 1, '1', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (667, 'soft_sofachair_norja*4', 'Urban Iced Sofachair', 'Sit back and relax', 782, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (668, 'soft_sofachair_norja*5', 'Pink Iced Sofachair', 'Pink Iced Sofachair', 793, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (669, 'soft_sofachair_norja*6', 'Blue Iced Sofachair', 'Blue Iced Sofachair', 804, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (670, 'soft_sofachair_norja*7', 'Rural Iced Sofachair', 'Sit back and relax', 815, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (671, 'soft_sofachair_norja*8', 'Yellow Iced Sofachair', 'Yellow Iced Sofachair', 826, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (672, 'soft_sofachair_norja*9', 'Red Iced Sofachair', 'Red Iced Sofachair', 837, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (673, 'soft_sofa_norja*2', 'Black Iced Sofa', 'Black Iced Sofa', 761, 2, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (674, 'soft_sofa_norja*3', 'White Iced Sofa', 'Pristine white, keep it clean!', 772, 2, 1, 1, '1', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (675, 'soft_sofa_norja*4', 'Urban Iced Sofa', 'Sit back and relax', 783, 2, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (676, 'soft_sofa_norja*5', 'Pink Iced Sofa', 'Pink Iced Sofa', 794, 2, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (677, 'soft_sofa_norja*6', 'Blue Iced Sofa', 'A soft leather sofa', 805, 2, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (678, 'soft_sofa_norja*7', 'Rural Iced Sofa', 'Sit back and relax', 816, 2, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (679, 'soft_sofa_norja*8', 'Yellow Iced Sofa', 'Yellow Iced Sofa', 827, 2, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (680, 'soft_sofa_norja*9', 'Red Iced Sofa', 'Red Iced Sofa', 838, 2, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (681, 'divider_nor2*2', 'Black Iced Bar-Desk', 'Soft but sturdy', 762, 2, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (682, 'divider_nor2*3', 'White Iced Bar-Desk', 'Strong, yet soft looking', 773, 2, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (683, 'divider_nor2*4', 'Urban Iced Bar', 'No way through', 784, 2, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (684, 'divider_nor2*5', 'Pink Iced bar desk', 'Pink Iced bar desk', 795, 2, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (685, 'divider_nor2*6', 'Blue Iced bar desk', 'Blue Iced bar desk', 806, 2, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (686, 'divider_nor2*7', 'Rural Iced Bar', 'No way through', 817, 2, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (687, 'divider_nor2*8', 'Yellow Iced bar desk', 'Yellow Iced bar desk', 828, 2, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (688, 'divider_nor2*9', 'Red Iced bar desk', 'Red Iced bar desk', 839, 2, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (689, 'divider_nor1*2', 'Black Iced Corner', 'Tuck it away', 763, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (690, 'divider_nor1*3', 'White Iced Corner', 'Looks squishy, but isn\'t!', 774, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (691, 'divider_nor1*4', 'Urban Iced Corner', 'The missing piece', 785, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (692, 'divider_nor1*5', 'Pink Ice corner', 'Pink Ice corner', 796, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (693, 'divider_nor1*6', 'Blue Ice corner', 'Blue Ice corner', 807, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (694, 'divider_nor1*7', 'Rural Iced Corner', 'The missing piece', 818, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (695, 'divider_nor1*8', 'Yellow Ice corner', 'Yellow Ice corner', 829, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (696, 'divider_nor1*9', 'Red Ice corner', 'Red Ice corner', 840, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (697, 'divider_nor3*2', 'Black Iced Gate', 'No way through, or is there?', 764, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2', NULL), + (698, 'divider_nor3*3', 'White Iced Gate', 'Do go through...', 775, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (699, 'divider_nor3*4', 'Urban Iced Gate', 'Entrance or exit?', 786, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2', NULL), + (700, 'divider_nor3*5', 'Pink Iced gate', 'Pink Iced gate', 797, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2', NULL), + (701, 'divider_nor3*6', 'Blue Iced gate', 'Blue Iced gate', 808, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2', NULL), + (702, 'divider_nor3*7', 'Rural Iced gate', 'Entrance or exit?', 819, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2', NULL), + (703, 'divider_nor3*8', 'Yellow Iced gate', 'Yellow Iced gate', 830, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2', NULL), + (704, 'divider_nor3*9', 'Red Iced gate', 'Red Iced gate', 841, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2', NULL), + (705, 'divider_nor4*2', 'Black Iced Auto Shutter', 'Habbos, roll out!', 765, 2, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,6', NULL), + (706, 'divider_nor4*3', 'White Iced Auto Shutter', 'Habbos, roll out!', 776, 2, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (707, 'divider_nor4*4', 'Urban Iced Shutter', 'Habbos, roll out!', 787, 2, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,6', NULL), + (708, 'divider_nor4*5', 'Pink Iced Auto Shutter', 'Habbos, roll out!', 798, 2, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,6', NULL), + (709, 'divider_nor4*6', 'Blue Iced Auto Shutter', 'Habbos, roll out!', 809, 2, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,6', NULL), + (710, 'divider_nor4*7', 'Rural Iced Shutter', 'Habbos, roll out!', 820, 2, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,6', NULL), + (711, 'divider_nor4*8', 'Yellow Iced Auto Shutter', 'Habbos, roll out!', 831, 2, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,6', NULL), + (712, 'divider_nor4*9', 'Red Iced Auto Shutter', 'Habbos, roll out!', 842, 2, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,6', NULL), + (713, 'divider_nor5*2', 'Black Iced Angle', 'Cool cornering for your crib y0!', 766, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (714, 'divider_nor5*3', 'White Iced Angle', 'Cool cornering for your crib y0!', 777, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (715, 'divider_nor5*4', 'Urban Iced Angle', 'Cool cornering for your crib!', 788, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (716, 'divider_nor5*5', 'Pink Iced Angle', 'Cool cornering for your crib y0!', 799, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (717, 'divider_nor5*6', 'Blue Iced Angle', 'Cool cornering for your crib y0!', 810, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (718, 'divider_nor5*7', 'Rural Iced Angle', 'Cool cornering for your crib!', 821, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (719, 'divider_nor5*8', 'Yellow Iced Angle', 'Cool cornering for your crib y0!', 832, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (720, 'divider_nor5*9', 'Red Iced Angle', 'Cool cornering for your crib y0!', 843, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (721, 'sofa_silo*2', 'Black Two-Seater Sofa', 'Cushioned, understated comfort', 684, 2, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (722, 'sofa_silo*3', 'White Two-Seater Sofa', 'Cushioned, understated comfort', 693, 2, 1, 1, '1', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (723, 'sofa_silo*4', 'Beige Area Sofa', 'Beige Area Sofa', 702, 2, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (724, 'sofa_silo*5', 'Pink Area Sofa', 'Cushioned, understated comfort', 711, 2, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (725, 'sofa_silo*6', 'Blue Area Sofa', 'Cushioned, understated comfort', 720, 2, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (726, 'sofa_silo*7', 'Green Area Sofa', 'Cushioned, understated comfort', 729, 2, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (727, 'sofa_silo*8', 'Yellow Two-Seater Sofa', 'Cushioned, understated comfort', 738, 2, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (728, 'sofa_silo*9', 'Red Area Sofa', 'Cushioned, understated comfort', 747, 2, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (729, 'sofachair_silo*2', 'Black Armchair', 'Large, but worth it', 685, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (730, 'sofachair_silo*3', 'White Armchair', 'Large, but worth it', 694, 1, 1, 1, '1', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (731, 'sofachair_silo*4', 'Beige Area Armchair', 'Large, but worth it', 703, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (732, 'sofachair_silo*5', 'Pink Area Armchair', 'Large, but worth it', 712, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (733, 'sofachair_silo*6', 'Blue Area Armchair', 'Large, but worth it', 721, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (734, 'sofachair_silo*7', 'Green Area Armchair', 'Large, but worth it', 730, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (735, 'sofachair_silo*8', 'Yellow Armchair', 'Large, but worth it', 739, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (736, 'sofachair_silo*9', 'Red Area Armchair', 'Large, but worth it', 748, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (737, 'table_silo_small*2', 'Black Occasional Table', 'For those random moments', 686, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (738, 'table_silo_small*3', 'White Occasional Table', 'For those random moments', 695, 1, 1, 1, '2', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (739, 'table_silo_small*4', 'Beige Area Occasional Table', 'Beige Area Occasional Table', 704, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (740, 'table_silo_small*5', 'Pink Area Occasional Table', 'Pink Area Occasional Table', 713, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (741, 'table_silo_small*6', 'Blue Area Occasional Table', 'Small and elegant', 722, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (742, 'table_silo_small*7', 'Green Area Occasional Table', 'Small and elegant', 731, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (743, 'table_silo_small*8', 'Yellow Occasional Table', 'For those random moments', 740, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (744, 'table_silo_small*9', 'Red Area Occasional Table', 'Red Area Occasional Table', 749, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (745, 'divider_silo3*2', 'Black Area Gate', 'Form following function', 687, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2', NULL), + (746, 'divider_silo3*3', 'White Area Gate', 'Form following function', 696, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (747, 'divider_silo3*4', 'Beige Area Gate', 'Beige Area Gate', 705, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2', NULL), + (748, 'divider_silo3*5', 'Pink Area Gate', 'Pink Area Gate', 714, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2', NULL), + (749, 'divider_silo3*6', 'Blue Area Gate', 'Door (lockable)', 723, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2', NULL), + (750, 'divider_silo3*7', 'Green Area Gate', 'Door (lockable)', 732, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2', NULL), + (751, 'divider_silo3*8', 'Yellow Area Gate', 'Form following function', 741, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2', NULL), + (752, 'divider_silo3*9', 'Red Area Gate', 'Red Area Gate', 750, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2', NULL), + (753, 'divider_silo1*2', 'Black Corner Shelf', 'Neat and natty', 688, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (754, 'divider_silo1*3', 'White Corner Shelf', 'Neat and natty', 697, 1, 1, 1, '2', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (755, 'divider_silo1*4', 'Beige Area Corner Shelf', 'Beige Area Corner Shelf', 706, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (756, 'divider_silo1*5', 'Pink Area Corner Shelf', 'Pink Area Corner Shelf', 715, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (757, 'divider_silo1*6', 'Blue Area Corner Shelf', 'Tuck it away!', 724, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (758, 'divider_silo1*7', 'Green Area Corner Shelf', 'Tuck it away!', 733, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (759, 'divider_silo1*8', 'Yellow Corner Shelf', 'Neat and natty', 742, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (760, 'divider_silo1*9', 'Red Area Corner Shelf', 'Tuck it away', 751, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (761, 'chair_silo*2', 'Black Dining Chair', 'Keep it simple', 689, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (762, 'chair_silo*3', 'White Dining Chair', 'Keep it simple', 698, 1, 1, 1, '1', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (763, 'chair_silo*4', 'Beige Silo Dining Chair', 'Beige Silo Dining Chair', 707, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (764, 'chair_silo*5', 'Pink Silo Dining Chair', 'Pink Silo Dining Chair', 716, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (765, 'chair_silo*6', 'Blue Area Dining Chair', 'Wooden dining chair', 725, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (766, 'chair_silo*7', 'Green Area Dining Chair', 'Wooden dining chair', 734, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (767, 'chair_silo*8', 'Yellow Dining Chair', 'Keep it simple', 743, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (768, 'chair_silo*9', 'Red Area Dining Chair', 'Wooden dining chair', 752, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (769, 'safe_silo*2', 'Black Safe Minibar', 'Totally shatter-proof!', 690, 1, 1, 0, '2', 'solid,custom_data_true_false', 'vending_machine', 1, 1, '17', -1, '2,4', NULL), + (770, 'safe_silo*3', 'White Safe Minibar', 'Totally shatter-proof!', 699, 1, 1, 0, '2', 'solid,custom_data_true_false', 'vending_machine', 1, 1, '17', -1, '2,4', NULL), + (771, 'safe_silo*4', 'Beige Safe Minibar', 'Totally shatter-proof!', 708, 1, 1, 0, '2', 'solid,custom_data_true_false', 'vending_machine', 1, 1, '17', -1, '2,4', NULL), + (772, 'safe_silo*5', 'Pink Safe Minibar', 'Totally shatter-proof!', 717, 1, 1, 0, '2', 'solid,custom_data_true_false', 'vending_machine', 1, 1, '17', -1, '2,4', NULL), + (773, 'safe_silo*6', 'Blue Safe Minibar', 'Totally shatter-proof!', 726, 1, 1, 0, '2', 'solid,custom_data_true_false', 'vending_machine', 1, 1, '17', -1, '2,4', NULL), + (774, 'safe_silo*7', 'Green Safe Minibar', 'Totally shatter-proof!', 735, 1, 1, 0, '2', 'solid,custom_data_true_false', 'vending_machine', 1, 1, '17', -1, '2,4', NULL), + (775, 'safe_silo*8', 'Yellow Safe Minibar', 'Totally shatter-proof!', 744, 1, 1, 0, '2', 'solid,custom_data_true_false', 'vending_machine', 1, 1, '17', -1, '2,4', NULL), + (776, 'safe_silo*9', 'Red Safe Minibar', 'Totally shatter-proof!', 753, 1, 1, 0, '2', 'solid,custom_data_true_false', 'vending_machine', 1, 1, '17', -1, '2,4', NULL), + (777, 'barchair_silo*2', 'Black Bar Stool', 'Practical and convenient', 691, 1, 1, 1.5, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (778, 'barchair_silo*3', 'White Bar Stool', 'Practical and convenient', 700, 1, 1, 1.5, '1', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (779, 'barchair_silo*4', 'Beige Bar Stool', 'Practical and convenient', 709, 1, 1, 1.5, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (780, 'barchair_silo*5', 'Pink Bar Stool', 'Practical and convenient', 718, 1, 1, 1.5, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (781, 'barchair_silo*6', 'Blue Bar Stool', 'Take a perch!', 727, 1, 1, 1.5, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (782, 'barchair_silo*7', 'Green Bar Stool', 'Take a perch!', 736, 1, 1, 1.5, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (783, 'barchair_silo*8', 'Yellow Bar Stool', 'Practical and convenient', 745, 1, 1, 1.5, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (784, 'barchair_silo*9', 'Red Bar Stool', 'Practical and convenient', 754, 1, 1, 1.5, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (785, 'table_silo_med*2', 'Black Coffee Table', 'Wipe clean and unobtrusive', 692, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (786, 'table_silo_med*3', 'White Coffee Table', 'Wipe clean and unobtrusive', 701, 2, 2, 1, '2', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (787, 'table_silo_med*4', 'Beige Area Coffee Table', 'Beige Area Coffee Table', 710, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (788, 'table_silo_med*5', 'Pink Area Coffee Table', 'Pink Area Coffee Table', 719, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (789, 'table_silo_med*6', 'Blue Area Coffee Table', 'Gather everyone round', 728, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (790, 'table_silo_med*7', 'Green Area Coffee Table', 'Gather everyone round', 737, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (791, 'table_silo_med*8', 'Yellow Coffee Table', 'Wipe clean and unobtrusive', 746, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (792, 'table_silo_med*9', 'Red Area Coffee Table', 'Red Area Coffee Table', 755, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (793, 'pura_mdl1*1', 'Aqua Pura Module 1', 'Any way you like it!', 893, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (794, 'pura_mdl2*1', 'Aqua Pura Module 2', 'Any way you like it!', 894, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (795, 'pura_mdl3*1', 'Aqua Pura Module 3', 'Any way you like it!', 895, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (796, 'pura_mdl4*1', 'Aqua Pura Module 4', 'Any way you like it!', 896, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (797, 'pura_mdl5*1', 'Aqua Pura Module 5', 'Any way you like it!', 897, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (798, 'chair_basic*1', 'Aqua Pura Egg Chair', 'It\'s a cracking design!', 938, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (799, 'pura_mdl1*2', 'Pink Pura Module 1', 'Any way you like it!', 898, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (800, 'pura_mdl1*3', 'Black Pura Module 1', 'Any way you like it!', 903, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (801, 'pura_mdl1*4', 'White Pura Module 1', 'Any way you like it!', 908, 1, 1, 1, '1', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (802, 'pura_mdl1*5', 'Beige pura module 1', '', 913, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (803, 'pura_mdl1*6', 'Blue Pura Module 1', 'Any way you like it!', 918, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (804, 'pura_mdl1*7', 'Green Pura Module 1', 'Any way you like it!', 923, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (805, 'pura_mdl1*8', 'Yellow pura module 1', '', 928, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (806, 'pura_mdl1*9', 'Red Pura Module 1', 'Any way you like it!', 933, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (807, 'pura_mdl2*2', 'Pink Pura Module 2', 'Any way you like it!', 899, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (808, 'pura_mdl2*3', 'Black Pura Module 2', 'Any way you like it!', 904, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (809, 'pura_mdl2*4', 'White Pura Module 2', 'Any way you like it!', 909, 1, 1, 1, '1', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (810, 'pura_mdl2*5', 'Beige pura module 2', '', 914, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (811, 'pura_mdl2*6', 'Blue Pura Module 2', 'Any way you like it!', 919, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (812, 'pura_mdl2*7', 'Green Pura Module 2', 'Any way you like it!', 924, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (813, 'pura_mdl2*8', 'Yellow pura module 2', '', 929, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (814, 'pura_mdl2*9', 'Red Pura Module 2', 'Any way you like it!', 934, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (815, 'pura_mdl3*2', 'Pink Pura Module 3', 'Any way you like it!', 900, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (816, 'pura_mdl3*3', 'Black Pura Module 3', 'Any way you like it!', 905, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (817, 'pura_mdl3*4', 'White Pura Module 3', 'Any way you like it!', 910, 1, 1, 1, '1', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (818, 'pura_mdl3*5', 'Beige pura module 3', '', 915, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (819, 'pura_mdl3*6', 'Blue Pura Module 3', 'Any way you like it!', 920, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (820, 'pura_mdl3*7', 'Green Pura Module 3', 'Any way you like it!', 925, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (821, 'pura_mdl3*8', 'Yellow pura module 3', '', 930, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (822, 'pura_mdl3*9', 'Red Pura Module 3', 'Any way you like it!', 935, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (823, 'pura_mdl4*2', 'Pink Pura Module 4', 'Any way you like it!', 901, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (824, 'pura_mdl4*3', 'Black Pura Module 4', 'Any way you like it!', 906, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (825, 'pura_mdl4*4', 'White Pura Module 4', 'Any way you like it!', 911, 1, 1, 1, '1', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (826, 'pura_mdl4*5', 'Beige pura module 4', '', 916, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (827, 'pura_mdl4*6', 'Blue Pura Module 4', 'Any way you like it!', 921, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (828, 'pura_mdl4*7', 'Green Pura Module 4', 'Any way you like it!', 926, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (829, 'pura_mdl4*8', 'Yellow pura module 4', '', 931, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (830, 'pura_mdl4*9', 'Red Pura Module 4', 'Any way you like it!', 936, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (831, 'pura_mdl5*2', 'Pink Pura Module 5', 'Any way you like it!', 902, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (832, 'pura_mdl5*3', 'Black Pura Module 5', 'Any way you like it!', 907, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (833, 'pura_mdl5*4', 'White Pura Module 5', 'Any way you like it!', 912, 1, 1, 1, '1', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (834, 'pura_mdl5*5', 'Beige pura module 5', '', 917, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (835, 'pura_mdl5*6', 'Blue Pura Module 5', 'Any way you like it!', 922, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (836, 'pura_mdl5*7', 'Green Pura Module 5', 'Any way you like it!', 927, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (837, 'pura_mdl5*8', 'Yellow Pura Module 5', 'Any way you like it!', 932, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (838, 'pura_mdl5*9', 'Red Pura Module 5', 'Any way you like it!', 937, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (839, 'chair_basic*2', 'Pink Pura Egg Chair', 'It\'s a cracking design!', 939, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (840, 'chair_basic*3', 'Black Pura Egg Chair', 'It\'s a cracking design!', 940, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (841, 'chair_basic*4', 'White Pura Egg Chair', 'It\'s a cracking design!', 941, 1, 1, 1, '1', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (842, 'chair_basic*5', 'Beige Pura Egg Chair', 'It\'s a cracking design!', 942, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (843, 'chair_basic*6', 'Blue Pura Egg Chair', 'It\'s a cracking design!', 943, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (844, 'chair_basic*7', 'Green Pura Egg Chair', 'It\'s a cracking design!', 944, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (845, 'chair_basic*8', 'Yellow Pura Egg Chair', 'It\'s a cracking design!', 945, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (846, 'chair_basic*9', 'Red Pura Egg Chair', 'It\'s a cracking design!', 946, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (847, 'hcc_sofachair', 'Reclining Chair', 'Put your feet up!', 1407, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (848, 'hcc_chair', 'Trendy Stool', 'Shiny varnished finish', 1403, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (849, 'hcc_shelf', 'Bookshelf', 'Your own Habbo archives', 1405, 1, 2, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (850, 'hcc_stool', 'Antique Stool', 'For larger gatherings', 1408, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (851, 'hcc_dvdr', 'Glass Divider', 'It won\'t cramp your style', 11112, 2, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (852, 'hcc_sofachair', 'Reclining Chair', 'Put your feet up!', 1407, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (853, 'hcc_crnr', 'Glass Corner', 'Adds the finishing touch', 11113, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (854, 'hcc_table', 'Glass Table', 'Elegant centre piece', 11115, 1, 2, 0.7, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (855, 'hcc_minibar', 'Minibar', 'Cool look, cool drinks!', 1404, 1, 1, 0, '2', 'solid,custom_data_true_false', 'vending_machine', 1, 1, '3,4,5,6', -1, '2,4', NULL), + (856, 'hcc_sofa', 'Low Back Sofa', 'Get your friends over!', 1406, 2, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (857, 'glass_shelf', 'Glass shelf', 'Translucent beauty', 215, 2, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (858, 'glass_sofa', 'Glass sofa', 'Translucent beauty', 216, 2, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (859, 'glass_table', 'Glass table', 'Translucent beauty', 217, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (860, 'glass_chair', 'Glass chair', 'Translucent beauty', 218, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (861, 'glass_stool', 'Glass stool', 'Translucent beauty', 219, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (862, 'glass_sofa*2', 'Glass sofa', 'Translucent beauty', 220, 2, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (863, 'glass_sofa*3', 'White Glass Sofa', 'Translucent beauty', 224, 2, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (864, 'glass_sofa*4', 'Glass sofa', 'Translucent beauty', 228, 2, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (865, 'glass_sofa*5', 'Candy Glass Sofa', 'Double glazed', 232, 2, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (866, 'glass_table*2', 'Glass table', 'Translucent beauty', 221, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (867, 'glass_table*3', 'White Glass Table', 'Translucent beauty', 225, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (868, 'glass_table*4', 'Glass table', 'Translucent beauty', 229, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (869, 'glass_table*5', 'Candy Glass Table', 'Translucent beauty', 233, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (870, 'glass_chair*2', 'Glass chair', 'Translucent beauty', 222, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (871, 'glass_chair*3', 'Glass chair', 'Translucent beauty', 226, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (872, 'glass_chair*4', 'Glass chair', 'Translucent beauty', 230, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (873, 'glass_chair*5', 'Candy Glass Chair', 'A pane that you\'re used to', 234, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (874, 'glass_stool*2', 'Glass stool', 'Translucent beauty', 223, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (875, 'glass_stool*3', 'White Glass Stool', 'Translucent beauty', 227, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (876, 'glass_stool*4', 'Glass stool', 'Translucent beauty', 231, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (877, 'glass_stool*5', 'Candy Glass Stool', 'Clear a seat', 235, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (878, 'glass_sofa*6', 'Blue Glass Sofa', 'Translucent beauty', 236, 2, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (879, 'glass_sofa*7', 'Green Glass Sofa', 'Habbo Club', 240, 2, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (880, 'glass_sofa*8', 'Yellow Glass Sofa', 'Double glazed', 244, 2, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (881, 'glass_sofa*9', 'Glass sofa', 'Translucent beauty', 248, 2, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (882, 'glass_table*6', 'Blue Glass Table', 'Translucent beauty', 237, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (883, 'glass_table*7', 'Green Glass Table', 'Habbo Club', 241, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (884, 'glass_table*8', 'Yellow Glass Table', 'Translucent beauty', 245, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (885, 'glass_table*9', 'Glass table', 'Translucent beauty', 249, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (886, 'glass_chair*6', 'Blue Glass Chair', 'Translucent beauty', 238, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (887, 'glass_chair*7', 'Green Glass Chair', 'Habbo Club', 242, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (888, 'glass_chair*8', 'Yellow Glass Chair', 'A pane that you\'re used to', 246, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (889, 'glass_chair*9', 'Glass chair', 'Translucent beauty', 250, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (890, 'glass_stool*6', 'Blue Glass Stool', 'Translucent beauty', 239, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (891, 'glass_stool*7', 'Green Glass Stool', 'Habbo Club', 243, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (892, 'glass_stool*8', 'Yellow Glass Stool', 'Clear a seat', 247, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (893, 'glass_stool*9', 'Glass stool', 'Translucent beauty', 251, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (894, 'greek_gate', 'Greek Gate', 'Enter mortal, exit immortal!', 1379, 2, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,6', NULL), + (895, 'greek_seat', 'Greek Seat', 'Park your bot on this stone slab!', 1381, 1, 1, 0.7, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (896, 'greek_pillars', 'Greek Pillars', 'Architectural splendor!', 1380, 2, 1, 3.2, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (897, 'greek_corner', 'Greek Corner', 'Tuck it away!', 1378, 1, 1, 3.2, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (898, 'greek_block', 'Greek Block', 'A nice stone block', 2195, 2, 1, 0.5, '0', 'can_stack_on_top,can_stand_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (899, 'romantique_pianochair*1', 'Rose Quartz Piano Chair', 'Elegant seating for elegant Habbos', 948, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (900, 'romantique_divan*1', 'Chaise-Longue', 'Recline in continental Rose Quartz comfort', 950, 2, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (901, 'romantique_chair*1', 'Rose Quartz Chair', 'Elegant seating for elegant Habbos', 949, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (902, 'romantique_divider*1', 'Rose Quartz Screen', 'Beauty lies within', 951, 2, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (903, 'romantique_smalltabl*1', 'Rose Quartz Tray Table', 'Every tray needs a table...', 952, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (904, 'romantique_mirrortabl', 'Dressing Table', 'Get ready for your big date', 484, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (905, 'wallmirror', 'Wallmirror', 'Mirror, mirror on the wall...', 481, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (906, 'romantique_tray1', 'Romantique Tray', 'Breakfast is served!', 2145, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (907, 'romantique_tray2', 'Romantique Treats Tray', 'Time to celebrate!', 482, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (908, 'rom_lamp', 'Crystal Lamp', 'Light up your life', 483, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (909, 'romantique_clock', 'Grandfather\'s Clock', 'The most Romantic tick-tock ever!', 485, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (910, 'romantique_pianochair*2', 'Lime Romantique Piano Chair', 'Sit in traditional style', 954, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (911, 'romantique_divan*2', 'Emerald Chaise-Longue', 'Recline in continental comfort', 956, 2, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (912, 'romantique_chair*2', 'Lime Romantique Chair', 'null', 955, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (913, 'romantique_divider*2', 'Green Screen', 'Keeping things separated', 957, 2, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (914, 'romantique_smalltabl*2', 'Lime Tray Table', 'Every tray needs a table...', 958, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (915, 'romantique_pianochair*3', 'Sapphire Chair', 'For stately seating experiences', 960, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (916, 'romantique_divan*3', 'Turquoise Romantique Divan', 'null', 962, 2, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (917, 'romantique_chair*3', 'Turquoise Romantique Chair', 'null', 961, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (918, 'romantique_divider*3', 'Turquoise Screen', 'Keeping things separated', 963, 2, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (919, 'romantique_smalltabl*3', 'Turquoise Tray Table', 'Every tray needs a table...', 964, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (920, 'romantique_pianochair*4', 'Amber Piano Stool', 'I can feel air coming through...', 966, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (921, 'romantique_divan*4', 'Amber Chaise-Longue', 'Is that a cape hanging there?', 968, 2, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (922, 'romantique_chair*4', 'Amber Chair', 'What does this button do?', 967, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (923, 'romantique_divider*4', 'Ochre Screen', 'Keeping things separated', 969, 2, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (924, 'romantique_smalltabl*4', 'Amber Tray Table', 'Why is one leg different?', 970, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (925, 'romantique_pianochair*5', 'Onyx Piano Stool', 'I can feel air coming through...', 972, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (926, 'romantique_divan*5', 'Onyx Chaise-Longue', 'Is that a cape hanging there?', 974, 2, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (927, 'romantique_chair*5', 'Onyx Chair', 'What does this button do?', 973, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (928, 'romantique_divider*5', 'Romantique Screen Gray', 'Keeping Things Separated', 4488, 2, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (929, 'romantique_smalltabl*5', 'Onyx Tray Table', 'Why is one leg different?', 976, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (930, 'grand_piano*1', 'Turquoise Grand Piano', 'Turquoise Grand Piano', 947, 2, 2, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (931, 'grand_piano*2', 'Esmerald Piano Stool', 'Let the music begin', 953, 2, 2, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (932, 'grand_piano*3', 'Sapphire Piano Stool', 'Make sure you play in key!', 959, 2, 2, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (933, 'grand_piano*4', 'Amber Grand Piano', 'Why is that key green?', 965, 2, 2, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (934, 'grand_piano*5', 'Onyx Grand Piano', 'Why is that key green?', 971, 2, 2, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (935, 'xmas08_chair', 'Ice chair', 'Make sure you wear trousers!', 1493, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (936, 'xmas08_cubetree', 'Cube Tree', 'So ice Cubes DO grow on trees...', 1494, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (937, 'xmas08_dvdr1', 'Ice divider', 'Stone and ice in one snowy wall!', 1495, 2, 1, 1.2, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (938, 'xmas08_dvdr2', 'Icy Divider Corner', 'What\'s a dividing wall without a corner?', 1496, 1, 1, 1.6, '2', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (939, 'xmas08_geysir', 'Geyser', 'Nothing quite like a warm exploding water hole!', 1497, 2, 2, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (940, 'xmas08_hole', 'Ice Fish Hole', 'What can you catch?', 1498, 1, 1, 0, '2', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '34', -1, '2,4', NULL), + (941, 'xmas08_hottub', 'Hot Tub', 'Party time in the Arctic people!', 1499, 2, 2, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '2,4', NULL), + (942, 'xmas08_icerug', 'Ice Patch', 'Ice, Snow or Wet Slush? All is possible with this.', 1500, 2, 2, 0, '4', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (943, 'xmas08_icetree', 'Icy Christmas Tree', 'It can\'t be Christmas without it!', 1501, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (944, 'xmas08_icewall', 'Icy Wall', 'The stuff Ice Palace\'s are made of!', 1502, 0, 0, 0, '4', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (945, 'xmas08_lantern', 'Snowball Lantern Pile', 'No dodging this pile!', 1503, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (946, 'xmas08_snowpl', 'Snow Seat', 'Take a rest and warm by a fire perhaps?', 1504, 1, 1, 1, '2', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (947, 'xmas08_table', 'Icy table', 'Keeps your ice cream chilled - guaranteed!', 1505, 2, 2, 0.5, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (948, 'xmas08_telep', 'Icy Teleport', 'Travel space and time in this freeze block!', 1506, 1, 1, 0, '3', 'solid,requires_touching_for_interaction,custom_data_true_false,teleporter,redirect_rotation_2', 'teleport', 1, 1, '', -1, '2,4', NULL), + (949, 'xmas08_trph1', 'Arctic Penguin Trophy', 'Given to those who have adopted ALL 26 penguins!', 1507, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (950, 'xmas08_wallpaper', 'Snowy Posters', 'The Arctic scenery on your walls!', 1508, 0, 0, 0, '6', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (951, 'campfire', 'Camp fire', 'Keep warm on those Arctic nights!', 1509, 1, 1, 0, '3', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (952, 'xmas_snow', 'Snow Storm', 'Get lost in your own blizzard!', 1511, 2, 2, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (953, 'lc_coral_divider_hi', 'Large Coral Divider', 'Keep those pesky sharks out', 1554, 2, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (954, 'lc_coral_divider_low', 'Small Coral Divider', 'Perhaps you could swim over?', 1555, 2, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (955, 'lc_wall1', 'Rock Wall', 'Depths of the ocean', 1556, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (956, 'lc_wall2', 'Coral Wall', 'There\'s life in the deep blue', 1557, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (957, 'lc_window1', 'Wooden Window', 'The deep blue', 1558, 0, 0, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (958, 'lc_window2', 'Aquarium Window', 'Creates a stunning scene', 1559, 0, 0, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (959, 'lc_anemone', 'Anemone', 'In glorious water colour!', 1560, 1, 1, 0, '4', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (960, 'lc_chair', 'Wooden Chair', 'No rusty nails, in sight', 1561, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (961, 'lc_corner', 'Wooden Corner', 'Tuck it away', 1562, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (962, 'lc_desk', 'Wooden Bar Desk', 'Not for sitting', 1563, 2, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (963, 'lc_stool', 'Wooden Stool', 'Watch out for splinters', 1564, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (964, 'lc_table', 'Captain\'s Table', 'Treasure map not included', 1565, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (965, 'lc_tile1', 'Marble Floor Tile', 'Elegant underwater flooring', 1566, 2, 2, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (966, 'lc_tile2', 'Cobbled Stones', 'Rocky room foundations', 1567, 2, 2, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (967, 'lc_tubes_corners', 'Water Tube Corner', 'Sends you round the bend', 1568, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (968, 'lc_tubes_straight', 'Water Tube Straight', 'Just go with the flow', 1569, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (969, 'lostc_teleport', 'Architeuthis', 'March Collectable 2009, 3/6', 1570, 1, 1, 0, '3', 'solid,requires_touching_for_interaction,custom_data_true_false,teleporter,redirect_rotation_2', 'teleport', 1, 1, '', -1, '2,4', NULL), + (970, 'lc_crab1', 'Crab Patch', 'Careful where you put your feet!', 1571, 2, 2, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (971, 'lc_crab2', 'Sally Lightfoot', 'Careful! She\'ll give it \'all that\'', 1572, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (972, 'lc_glass_floor', 'Ocean Window Rug', 'Under the sea!', 1573, 2, 3, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (973, 'lc_medusa1', 'Large Jellyfish Lamp', 'There\'s no sting in this tail', 1574, 1, 1, 0, '4', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (974, 'lc_medusa2', 'Small Jellyfish Lamp', 'There\'s no sting in this tail', 1575, 1, 1, 0, '4', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (975, 'party_ball', 'Glitter Ball', 'Every party MUST have one!', 1440, 1, 1, 0, '2', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (976, 'party_barcorn', 'Bar Corner', 'Every party needs one!', 1441, 1, 1, 0.98, '2', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (977, 'party_bardesk', 'Bar Centre', 'Keep the punters at bay', 1442, 1, 1, 0.98, '2', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (978, 'party_beamer', 'Dance Floor Beamer', 'Get some lights to match your dancing shapes!', 1443, 1, 1, 0, '7', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (979, 'party_block', 'Small Stage', 'Build yourself a stage to host events!', 1444, 1, 1, 0.8, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (980, 'party_block2', 'Stage Block Large', 'Make mine a large!', 1445, 2, 2, 0.8, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (981, 'party_chair', 'High Class Bar Stool', 'Sit high and people watch on this!', 1446, 1, 1, 1.4, '2', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (982, 'party_discol', 'Spotlight', 'Focus your attention or dance within its glow!', 1447, 1, 1, 0, '4', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (983, 'party_djtable', 'DJ Table', 'Scratch it, spin it and play some banging tracks!', 1448, 1, 2, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (984, 'party_floor', 'Disco Floor', 'The perfect place to throw some shapes', 1449, 2, 2, 0, '11', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (985, 'party_led', 'Big Wall Lights', 'Flashing Neon lights on the wall!', 1450, 0, 0, 0, '4', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (986, 'party_mic', 'Microphone', 'Sing, MC, shout out to your friends!', 1451, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (987, 'party_neon1', 'Neon Right Arrows', 'Find your way right in the dark!', 1452, 0, 0, 0, '3', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (988, 'party_neon2', 'Neon Left Arrows', 'Find your way left in the dark!', 1453, 0, 0, 0, '3', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (989, 'party_neon3', 'Neon Pink Flamingo', 'Celebrate the Eighties with this!', 1454, 0, 0, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (990, 'party_neon4', 'Neon Skull Light', 'A dull wall be gone!', 1455, 0, 0, 0, '3', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (991, 'party_neon5', 'Neon Heart Light', 'I heart Neon!', 1456, 0, 0, 0, '5', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (992, 'party_ravel', 'Dance Floor Laser', 'Meet the 22nd Century\'s dance floor lighting!', 1457, 1, 1, 0, '4', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (993, 'party_seat', 'Club seat', 'Rest your dancing feet on this!', 1458, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (994, 'party_shelf', 'Bar Shelf', 'Line up your beverages!', 1459, 0, 0, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (995, 'party_table', 'Glass High Bar Table', 'Chat with your friends over this!', 1460, 1, 1, 0.98, '3', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (996, 'party_tray', 'Club Tray', 'Rest your drinks on this!', 1461, 1, 1, 0, '2', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '31', -1, '2,4', NULL), + (997, 'party_tube_bubble', 'Bubbles Machine', 'Bubbles! Bubbles! Lovely bubbles!', 1462, 1, 1, 0, '4', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (998, 'party_tube_lava', 'Lava Lamp', 'Despite being made a lava, it is very cool.', 1463, 1, 1, 0, '4', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (999, 'party_wc_boy', 'Boys Toilets', 'Stand up or sitting down, this is for the Boys only!', 1464, 0, 0, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1000, 'party_wc_girl', 'Girls Toilets', 'Girls only please.', 1465, 0, 0, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1001, 'LT_throne', 'Lost Tribe Throne', 'Important for Tribe', 11156, 1, 1, 1.6, '2', 'can_sit_on_top,requires_rights_for_interaction', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1002, 'lt_jngl_wall', 'Jungle Wall', 'Jungle Wall', 11157, 0, 0, 0, '3', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1003, 'lt_patch', 'Lost Tribe Patch', 'Attention!', 11158, 2, 2, 0, '3', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1004, 'lt_lavac', 'Lost Tribe Lava Corner', 'Very dangerous!', 11159, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1005, 'LT_pillar', 'Lost Tribe Pillar', 'Lost Tribe Pillar', 11160, 1, 1, 0, '3', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1006, 'LT_pillar2', 'Lost Tribe Pillar 2', 'Attention!', 11161, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1007, 'LT_skull', 'Lost Tribe Skull', 'Very scary!', 11162, 1, 1, 0.4, '2', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1008, 'lt_spider', 'Lost Tribe Spider', 'Attention!', 11163, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1009, 'lt_stage1', 'Lost Tribe Stage', 'Make mine a large!', 11164, 1, 1, 0.8, '0', 'can_stack_on_top,can_stand_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1010, 'lt_stage2', 'Lost Tribe Stage', 'Make mine a large!', 11165, 2, 2, 0.8, '0', 'can_stack_on_top,can_stand_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1011, 'lt_statue', 'Lost Tribe Statue', 'Attention!', 11166, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1012, 'lt_stone2', 'Lost Tribe Stone 2', 'Mysterious Stone', 11167, 2, 1, 1.04, '3', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1013, 'lt_lava', 'Lost Tribe Lava', 'Very dangerous!', 11168, 1, 2, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2', NULL), + (1014, 'lt_bughill', 'Lost Tribe Hill', 'Attention!', 11169, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1015, 'lt_gate', 'Lost Tribe Gate', 'Knock, knock...', 11170, 2, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1016, 'lt_wall', 'Lost Tribe Stone Wall', 'I wonder if this wall is safe to climb?', 11210, 0, 0, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1017, 'lt_stone1', 'Stone Corner', 'I wonder how old this is???', 11211, 1, 1, 1.3, '2', 'can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1018, 'hween08_bath', 'Blood Bath', 'Should have chosen the shower!', 1726, 1, 2, 1, '2', 'can_sit_on_top,custom_data_numeric_on_off', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1019, 'hween08_wndwb', 'Broken Window (small)', 'Was it a rock or a dictionary?', 1422, 0, 0, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1020, 'hween08_wndw', 'Broken Window (large)', 'Was it a bird or a parsnip?', 1423, 0, 0, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1021, 'hween08_rad', 'Nuclear Radiation Sign', 'Warning! Smelly cheese ahead!', 1424, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1022, 'hween08_bio', 'Biohazard Sign', 'Every sock bin needs one!', 1425, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1023, 'hween08_bath2', 'Ooze Bath', 'Relax. Take it oozey!', 1427, 1, 2, 1, '2', 'can_sit_on_top,custom_data_numeric_on_off', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1024, 'hween08_bbag', 'Body Bag', 'Not a nice place to catch some Zzz\'s', 1428, 1, 3, 1.2, '0', 'can_lay_on_top', 'bed', 1, 1, '', -1, '0,2', NULL), + (1025, 'hween08_bed', 'Hospital Bed (blood)', 'You\'re in safe hands...', 1429, 1, 3, 1.8, '0', 'can_lay_on_top', 'bed', 1, 1, '', -1, '0,2', NULL), + (1026, 'hween08_bed2', 'Hospital Bed (ooze)', 'I\'m wicked and I\'m oozey!', 1430, 1, 3, 1.8, '0', 'can_lay_on_top,requires_rights_for_interaction', 'bed', 1, 1, '', -1, '0,2', NULL), + (1027, 'hween08_curtain', 'Hospital Curtain (blood)', 'Doctors at work', 1431, 3, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (1028, 'hween08_curtain2', 'Hospital Curtain (ooze)', 'Nurses at work', 1432, 3, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (1029, 'hween08_defibs', 'Life Support (blood)', 'Brought back to Earth with a shock!', 1433, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1030, 'hween08_defibs2', 'Life Support (ooze)', 'Brought back to Earth with a shock!', 1434, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1031, 'hween08_manhole', 'Manhole', 'Watch your step...', 1435, 1, 1, 0, '2', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1032, 'hween08_sink', 'Blood Sink', 'Nasty shaving accident?', 1436, 1, 1, 0, '2', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '29', -1, '2,4', NULL), + (1033, 'hween08_sink2', 'Ooze Sink', 'Who picked a spot?', 1437, 1, 1, 0, '2', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '30', -1, '2,4', NULL), + (1034, 'hween08_trll', 'Surgeon\'s Trolley', 'Chop, poke, ouch!', 1438, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1035, 'hw08_xray', 'X-Ray Poster', 'For viewing your bruises', 1439, 0, 0, 0, '3', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1036, 'eco_chair1', 'Eco Stool 1', 'Green leaf design', 1607, 1, 1, 1.5, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1037, 'eco_chair2', 'Eco Stool 2', 'Brown floral design', 1608, 1, 1, 1.5, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1038, 'eco_chair3', 'Eco Stool 3', 'Black and white skull design', 1609, 1, 1, 1.5, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1039, 'eco_catcus1', NULL, NULL, 1439, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1040, 'eco_catcus2', NULL, NULL, 1439, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1041, 'eco_catcus3', NULL, NULL, 1439, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1042, 'eco_fruits1', 'Fruit Bowl 1', 'From tree to hand in 3 pixels!', 1610, 1, 1, 0, '0', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '38,37,39,36', -1, '2,4', NULL), + (1043, 'eco_fruits2', 'Fruit Bowl 2', 'From tree to hand in 3 pixels!', 1611, 1, 1, 0, '0', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '38,37,39,36', -1, '2,4', NULL), + (1044, 'eco_fruits3', 'Fruit Bowl 3', 'From tree to hand in 3 pixels!', 1612, 1, 1, 0, '0', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '38,37,39,36', -1, '2,4', NULL), + (1045, 'eco_lamp1', 'Eco Lamp 1', 'Energy saving bulb fitted', 1613, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1046, 'eco_lamp2', 'Eco Lamp 2', 'Energy saving bulb fitted', 1614, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1047, 'eco_lamp3', 'Eco Lamp 3', 'Energy saving bulb fitted', 1615, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1048, 'eco_light1', 'Eco Light 1', 'Energy saving bulb fitted', 1616, 1, 1, 0, '2', 'can_stand_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1049, 'eco_light2', 'Eco Light 2', 'Energy saving bulb fitted', 1617, 1, 1, 0, '2', 'can_stand_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1050, 'eco_light3', 'Eco Light 3', 'Energy saving bulb fitted', 1618, 1, 1, 0, '2', 'can_stand_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1051, 'eco_table1', 'Eco Coffee Table 1', 'Recycled wood as standard', 1622, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1052, 'eco_table2', 'Eco Coffee Table 2', 'Recycled wood as standard', 1623, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1053, 'eco_table3', 'Eco Coffee Table 3', 'Recycled wood as standard', 1624, 2, 2, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1054, 'eco_tree1', 'Orange Tree', 'Actually, the tree is green...', 1625, 1, 1, 0, '0', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '38', -1, '2,4', NULL), + (1055, 'eco_tree2', 'Pear Tree', 'You\'ll want a pair of these...', 1626, 1, 1, 0, '0', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '36', -1, '2,4', NULL), + (1056, 'eco_tree3', NULL, NULL, 1439, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1057, 'eco_mush1', 'Witch Mushroom', 'Poisonous in the wrong hands', 11122, 1, 1, 0.7, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1058, 'eco_mush2', 'Fairy Mushroom', 'Sweet and nutty.', 11123, 1, 1, 1.5, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1059, 'eco_sofa1', 'Eco Armchair 1', 'Relax! You\'ve done your bit', 1619, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1060, 'eco_sofa2', 'Eco Armchair 2', 'Relax! You\'ve done your bit', 1620, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1061, 'eco_sofa3', 'Eco Armchair 3', 'Relax! You\'ve done your bit', 1621, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1062, 'eco_curtains1', 'Eco Curtain 1', 'Help keep the heat in', 1601, 1, 1, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1063, 'eco_curtains2', 'Eco Curtain 2', 'Help keep the heat in', 1602, 1, 1, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1064, 'eco_curtains3', 'Eco Curtain 3', 'Help keep the heat in', 1603, 1, 1, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1065, 'ecotron_box', 'Ecotron prize', 'This item is 100 % recycled.', 1627, 1, 1, 1, '0', 'can_stack_on_top,solid,eco_box,requires_rights_for_interaction', 'default', 1, 0, '', -1, '0,2,4,6', NULL), + (1066, 'eco_cactus1', 'Potted Cactus 1', 'Find a place in the sun', 1604, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1067, 'eco_cactus2', 'Potted Cactus 2', 'Find a place in the sun', 1605, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1068, 'eco_cactus3', 'Potted Cactus 3', 'Find a place in the sun', 1606, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1069, 'ktchn_pots', 'Hanging Pot Rack', 'Watch your head!', 1706, 2, 1, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1070, 'ktchn_dvdr', 'Kitchel Wall Divider', 'A contemporary backsplash for any kitchen', 1707, 2, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1071, 'ktchn_light', 'Kitchen Light', 'The perfect lighting fixture to prep your food', 1708, 2, 1, 0, '2', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1072, 'ktchn_countr_2', 'Kitchen Counter Large', 'Vibrant and shiny.', 1709, 2, 1, 0.99, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1073, 'ktchn_cornr', 'Kitchen Wall Divider Corner', 'A contemporary backsplash for any kitchen', 1710, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1074, 'ktchn_gate', 'Kitchen Swinging Door', 'Easy to open and close during a bustling service.', 1711, 2, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2', NULL), + (1075, 'ktchn_knives', 'Magnetic Knife Holder', 'Keeps your knives organized.', 1712, 0, 0, 0, '4', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1076, 'ktchn_plates', 'Dinner Plates', 'Who didn\'t finish their dinner?', 1713, 1, 1, 0, '3', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1077, 'ktchn_oven', 'Kitchen Oven', 'Bake me a pie!', 1714, 0, 0, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1078, 'ktchn_wall', 'Kitchen Wall', 'A contemporary backsplash for any kitchen', 1715, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1079, 'ktchn_countr_1', 'Kitchen Counter Small', 'Vibrant and shiny', 1716, 1, 1, 0.99, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1080, 'ktchn_sink', 'Industrial Sink', 'Always full of dirty dishes', 1717, 2, 1, 0, '4', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1081, 'ktchn_desk', 'Kitchen Work Table', 'Sanitary for prepping those delicate deserts.', 1718, 2, 1, 0.99, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1082, 'ktchn_fridge', 'Kitchen Fridge', 'Keeps it all cold.', 1719, 1, 1, 0, '2', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '36,37,38,39,3', -1, '2,4', NULL), + (1083, 'ktchn_inspctr', 'Kitchen Inspector', 'This kitchen needs a serious inspection', 1720, 1, 1, 0, '2', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '34', -1, '2,4', NULL), + (1084, 'ktchn_hlthNut', 'The Health Nut', 'Run...run.....RUN! I\'m running!!!', 1721, 1, 1, 0, '2', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '3', -1, '2,4', NULL), + (1085, 'ktchn_stove', 'Industrial Stove', 'Keeps it simmering', 1722, 2, 1, 0, '4', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1086, 'ktchn_bBlock', 'Butcher\'s Block', 'Sanitary for chopping any kind of food', 1723, 1, 1, 0, '3', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1087, 'ktchn_trash', 'Trash Can', 'Smelly if you don\'t empty it.', 1724, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1088, 'xm09_man_a', 'Snowman legs', 'What can you build?', 1661, 1, 1, 1, '5', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1089, 'xm09_man_b', 'Snowman middle', 'What can you build?', 1662, 1, 1, 1, '9', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1090, 'xm09_man_c', 'Snowman head', 'What can you build?', 1663, 1, 1, 0, '8', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1091, 'xm09_table', 'Holiday Table', 'Enough room for an entire family', 1664, 2, 6, 0, '4', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1092, 'xm09_bench', 'Holiday Bench', 'Will everyone fit?', 1665, 6, 1, 1.2, '0', 'can_sit_on_top,requires_rights_for_interaction', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1093, 'xm09_firwall', 'Xmas Tree Wall', 'Don\'t you just love snow...', 1666, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1094, 'xm09_forestwall', 'Snow Forest Wall', 'Covered in snow...', 1667, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1095, 'xm09_lodgewall', 'Lodge Wall', 'Keep the heat in and the cold out', 1668, 0, 0, 0, '8', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1096, 'xm09_bauble_1', 'Red Bauble', 'Perfect for a tree', 1669, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1097, 'xm09_bauble_2', 'Blue Bauble', 'Perfect for a tree', 1670, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1098, 'xm09_bauble_3', 'Green Bauble', 'Perfect for a tree', 1671, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1099, 'xm09_bauble_4', 'Yellow Bauble', 'Perfect for a tree', 1672, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1100, 'xm09_bauble_5', 'White Bauble', 'Perfect for a tree', 1673, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1101, 'xm09_bauble_6', 'Red Striped Bauble', 'Perfect for the tree', 1674, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1102, 'xm09_bauble_7', 'Blue Striped Bauble', 'Perfect for the tree', 1675, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1103, 'xm09_bauble_8', 'Green Striped Bauble', 'Perfect for the tree', 1676, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1104, 'xm09_bauble_9', 'Yellow Striped Bauble', 'Perfect for the tree', 1677, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1105, 'xm09_bauble_10', 'White Striped Bauble', 'Perfect for the tree', 1678, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1106, 'xm09_bauble_11', 'Tall Red Bauble', 'Perfect for the tree', 1679, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1107, 'xm09_bauble_12', 'Tall Blue Bauble', 'Perfect for the tree', 1680, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1108, 'xm09_bauble_13', 'Tall Green Bauble', 'Perfect for the tree', 1681, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1109, 'xm09_bauble_14', 'Tall Yellow Bauble', 'Perfect for the tree', 1682, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1110, 'xm09_bauble_15', 'Tall White Bauble', 'Perfect for the tree', 1683, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1111, 'xm09_bauble_16', 'Purple Green Bauble', 'Perfect for the tree', 1684, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1112, 'xm09_bauble_17', 'Tall Red Striped Bauble', 'Perfect for the tree', 1685, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1113, 'xm09_bauble_18', 'White Dot Bauble', 'Perfect for the tree', 1686, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1114, 'xm09_bauble_19', 'Tall Blue Striped Bauble', 'Perfect for the tree', 1687, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1115, 'xm09_bauble_20', 'Tall Yellow Striped Bauble', 'Perfect for the tree', 1688, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1116, 'xm09_bauble_21', 'Green White Bauble', 'Perfect for the tree', 1689, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1117, 'xm09_bauble_22', 'Red Heart Bauble', 'To hang on your tree', 1690, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1118, 'xm09_bauble_23', 'Blue Heart Bauble', 'To hang on your tree', 1691, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1119, 'xm09_bauble_24', 'Green Heart Bauble', 'To hang on your tree', 1692, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1120, 'xm09_bauble_25', 'Yellow Heart Bauble', 'To hang on your tree', 1693, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1121, 'xm09_bauble_26', 'White Heart Bauble', 'To hang on your tree', 1694, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1122, 'xm09_bauble_27', 'Pink Heart Bauble', 'To hang on your tree', 1695, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1123, 'xm09_candyCane', 'Candy Canes', 'Got Candy?', 1696, 1, 1, 0, '4', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1124, 'xm09_stocking', 'Holiday Stocking', 'Are they filled with coal?', 1697, 0, 0, 0, '7', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1125, 'xm09_infotv', 'Flatscreen TV', 'Catch the latest news of the pre-Holiday season!', 1698, 0, 0, 0, '2', 'wall_item', 'default', 1, 1, '', -1, '2,4', NULL), + (1126, 'xm09_cocoa', 'Hot Chocolate Maker', 'Cocoa and Christmas. Excellent!', 1699, 1, 1, 0, '0', 'solid', 'vending_machine', 1, 1, '8', -1, '2,4', NULL), + (1127, 'xm09_lrgBauble', 'Large Bauble', 'Isn\'t it pretty!', 1700, 1, 1, 0, '0', 'can_stack_on_top,can_stand_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1128, 'xm09_frplc', 'Christmas Fireplace', 'Warm and cozy!', 4312, 1, 1, 0, '9', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1129, 'urban_sidewalk', 'Sidewalk', 'Don\'t step on a crack.', 2978, 2, 2, 0.2, '4', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1130, 'urban_lamp', 'Street Lamp', 'Keeps a dark street brightly lit.', 2979, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1131, 'urban_bin', 'Urban Trash Can', 'Street trash.', 2980, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1132, 'urban_bench', 'Urban Bench', 'Watch out for gum before you sit.', 2981, 2, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1133, 'urban_carsofa', 'Taxi Sofa', 'Seats comfortably for crazy cab drives.', 2982, 2, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1134, 'urban_bsktbll', 'Urban Basketball Hoop', 'Slam dunk!', 2983, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1135, 'urban_fence', 'Urban Fence', 'Keeps trouble in our out.', 2984, 1, 2, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1136, 'urban_wpost', 'Fire Hydrant', 'Sometimes used for putting out fires.', 2986, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1137, 'urban_fence_corner', 'Urban Fence Corner', 'Keeps trouble in or out.', 2987, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1138, 'urban_blocker', 'Road Block', 'Don\'t go any further.', 2988, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1139, 'urban_bench_plain', 'Clean Bench', 'Nothing feels better than sitting on a clean bench.', 2989, 2, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1140, 'urban_wall', 'Urban Wall', 'Great for graffiti art.', 2990, 2, 1, 0, '5', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1141, 'grunge_barrel', 'Flaming Barrel', 'Beacon of light!', 264, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1142, 'grunge_bench', 'Bench', 'Laid back seating', 265, 3, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1143, 'grunge_candle', 'Candle Box', 'Late night debate', 266, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (1144, 'grunge_chair', 'Grunge Chair', 'Alternative chair for alternative people', 267, 1, 1, 0.99, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1145, 'grunge_mattress', 'Grunge Mattress', 'Beats sleeping on the floor!', 268, 3, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1146, 'grunge_radiator', 'Radiator', 'Started cool but now it\'s hot!', 269, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1147, 'grunge_shelf', 'Grunge Bookshelf', 'Scrap books and photo albums', 270, 3, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1148, 'grunge_sign', 'Road Sign', 'Bought legitimately from an M1 cafe.', 271, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1149, 'grunge_table', 'Grunge Table', 'Students of the round table!', 272, 2, 2, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1150, 'hc_crpt', 'Persian Carpet', 'Ultimate craftsmanship', 990, 3, 5, 0, '0', 'can_stand_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1151, 'bolly_lotus_pool', 'Lotus Pool', 'Giant passionate flower', 1534, 2, 2, 0, '3', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1152, 'bolly_corner', 'Bollywood Corner', 'Tuck it away', 1535, 1, 1, 0.8, '2', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1153, 'bolly_desk', 'Bollywood Desk', 'To build and divide', 1536, 2, 1, 0.8, '2', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1154, 'bolly_drapea', 'Pink Curtain', 'Made with the finest materials', 1537, 3, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,6', NULL), + (1155, 'bolly_drapeb', 'Green Curtain', 'Made with the finest materials', 1538, 3, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,6', NULL), + (1156, 'bolly_drapec', 'Yellow Curtain', 'Made with the finest materials', 1539, 3, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,6', NULL), + (1157, 'bolly_pillow', 'Star Pillow', 'Don\'t forget to make a wish!', 1540, 1, 1, 0.8, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1158, 'bolly_fountain', 'Extravagant Fountain', 'Now that\'s refreshing!', 1541, 2, 2, 0, '3', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1159, 'bolly_lamp', 'Chandelier', 'Turn the lights down low', 1542, 1, 1, 0, '2', 'can_stack_on_top,can_stand_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1160, 'bolly_monkey_lamp', 'Monkey Lamp', 'Cast a cheeky glow', 1543, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1161, 'bolly_phant', 'Elephant MiniBar', 'For he\'s a \'bolly\' good fellow!', 1544, 1, 1, 0, '2', 'solid', 'vending_machine', 1, 1, '35', -1, '2,4', NULL), + (1162, 'bolly_petals', 'Petal Flurry', 'Lay down a bed of roses', 1545, 2, 2, 0, '3', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1163, 'bolly_palm', 'Palm Tree', 'Watch for falling coconuts!', 1546, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1164, 'bolly_swing', 'Swing', 'Swing low, my sweet.', 1547, 2, 1, 1.8, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1165, 'bolly_table', 'Large Ornamental Table', 'Decorative granite finish', 1548, 2, 2, 0.8, '0', 'can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1166, 'bolly_tile1', 'Ornamental Tile', 'The floor is your canvas', 1549, 2, 2, 0, '0', 'can_stack_on_top,can_stand_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1167, 'bolly_tile2', 'Standard Tile', 'The floor is your canvas', 1550, 2, 2, 0, '0', 'can_stack_on_top,can_stand_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1168, 'bolly_vase', 'Vase of Flowers', 'Let off a heavenly scent', 1551, 1, 1, 0, '0', 'solid', 'vending_machine', 1, 1, '1019', -1, '0,6', NULL), + (1169, 'bolly_wdw_wd', 'Bolly Window', 'Sets the scene', 1553, 0, 0, 0, '3', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '1', -1, '2,4', NULL), + (1170, 'svnr_de', 'German Gnome', 'October 2008, 4/6', 1333, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1171, 'svnr_uk', 'Big Ben', 'September 2008, 3/6', 1334, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1172, 'svnr_it', 'Venetian Gondola', 'July 2008, 1/6', 1335, 2, 1, 1.2, '0', 'can_sit_on_top,redirect_rotation_2', 'chair', 1, 1, '', -1, '2,4', NULL), + (1173, 'svnr_nl', 'Dutch Clog', 'August 2008, 2/6', 1336, 1, 2, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '2,4', NULL), + (1174, 'svnr_aus', 'Aussie Outback', 'November 2008, 5/6', 1360, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1175, 'svnr_fi', 'Finnish Sauna', 'December 2008, 6/6', 1846, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1176, 'lostc_merdragon', 'Leviathan', '1/6 - January 2009', 1519, 1, 3, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1177, 'lostc_octopus', 'Kraken', '2/6 - February 2009', 10002, 1, 2, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '4,6', NULL), + (1178, 'totem_leg', 'Totem Leg', '1/3 of Totem', 10009, 1, 1, 1.3, '12', 'solid,can_stack_on_top', 'totem_leg', 1, 1, '', -1, '2,4', NULL), + (1179, 'totem_head', 'Totem Spirit Head', 'Which animal are you? 2/3 of Totem', 11171, 1, 1, 1.8, '15', 'solid,can_stack_on_top', 'totem_head', 1, 1, '', -1, '2,4', NULL), + (1180, 'totem_planet', 'Totem Planet', '3/3 of Totem', 11214, 1, 1, 0, '3', 'solid,redirect_rotation_0', 'totem_planet', 1, 1, '', -1, '0', NULL), + (1181, 'fortune', 'Crystal Ball', 'Gaze into the future', 1234, 1, 1, 0, '9', 'solid', 'fortune', 1, 1, '', -1, '0', NULL), + (1182, 'sound_set_65', 'Sound set 65', '', 1348, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1183, 'sound_set_66', 'Sound set 66', '', 1354, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1184, 'sound_set_67', 'Sound set 67', '', 1349, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1185, 'sound_set_68', 'Sound set 68', '', 1351, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1186, 'sound_set_69', 'Sound set 69', '', 1352, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1187, 'sound_set_70', 'Sound set 70', '', 1353, 1, 1, 0.2, '0', 'solid,can_stack_on_top,sound_machine_sample_set,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1188, 'party_lights', 'Party lights', 'Dance dance dance!', 1467, 1, 1, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1189, 'bolly_tree', 'Palm Tree', 'Bollywood meets Hollywood', 1552, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1190, 'song_disk', 'Traxdisc', 'Burn, baby burn', 1355, 1, 1, 0.1, '0', 'solid,song_disk,can_stack_on_top', 'default', 1, 0, '', -1, '0,2', NULL), + (1191, 'sf_roof', 'Starship Roof', 'But it doen\'t rain in space...', 11184, 2, 4, 0, '2', 'can_stack_on_top,can_stand_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1192, 'SF_crate_2', 'Large Crate', 'Weightless in Space', 11185, 2, 1, 0.99, '2', 'can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1193, 'SF_crate_1', 'Small Crate', 'Weightless in Space', 11186, 1, 1, 0.99, '2', 'can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1194, 'sf_stick', 'Light Pole', 'Attracts space critters.', 11187, 1, 1, 0, '5', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1195, 'SF_chair_blue', 'Medium Chair', 'Space captain\'s side kick.', 11188, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1196, 'sf_roller', 'SciFi Roller', 'Moving through space.', 11189, 1, 1, 0.45, '0', 'can_stand_on_top,can_stack_on_top,roller', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1197, 'SF_alien', 'K-nick-4', 'Alien Collectible', 11190, 1, 1, 0, '102', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1198, 'SF_floor_2', 'Spaceship Floor Dark', 'Space walk', 11191, 2, 2, 0, '2', 'can_stack_on_top,can_stand_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1199, 'SF_panel3', 'Navigation Console', 'Steer clear of Black Holes', 11192, 1, 1, 0, '4', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1200, 'sf_floor', 'Transparent Floor', 'Don\'t fall through!', 11193, 2, 4, 0, '2', 'can_stack_on_top,can_stand_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1201, 'sf_tele', 'Space Teleporter', 'Turn into millions of atoms', 11194, 1, 1, 0, '3', 'solid,requires_touching_for_interaction,custom_data_true_false,teleporter,redirect_rotation_2', 'teleport', 1, 1, '', -1, '2,4', NULL), + (1202, 'SF_reactor', 'Warp Reactor', 'Fusion reactor to heat plasma', 11195, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1203, 'SF_chair_green', 'Small Chair', 'Buckle up for a space ride.', 11196, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1204, 'SF_panel1', 'Command Console', 'Blinking Lights but what to do', 11198, 1, 1, 0, '102', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1205, 'SF_panel2', 'Engineering Console', 'All systems checked', 11199, 2, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1206, 'sf_pod', 'Cryogenic Bed', 'For those who like to sleep a long time.', 11200, 1, 3, 1.36, '2', 'can_lay_on_top,requires_rights_for_interaction', 'bed', 1, 1, '', -1, '0,2', NULL), + (1207, 'SF_table', 'Space Table', 'Supplied with gravity', 11201, 2, 2, 1.1, '2', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1208, 'sf_gate', 'Display-Gate', 'Can you see me now?', 11202, 2, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1209, 'SF_floor_1', 'Spaceship Floor Light', 'Space walk', 11203, 2, 2, 0, '2', 'can_stack_on_top,can_stand_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1210, 'SF_chair_red', 'Captain\'s Chair', 'Master of Space', 11204, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1211, 'SF_lamp', 'Sci fi Lamp', 'Bright lights in a dark space', 11209, 1, 1, 0, '102', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1212, 'ads_idol_floor1', 'American Idol Floor Tile 1', 'Create a custom floor in your American Idol room', 1577, 2, 2, 0, '4', 'can_stack_on_top,can_stand_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1213, 'ads_idol_desk', 'American Idol Judge Desk', 'No audition room is complete with out one of these!', 1578, 1, 4, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1214, 'ads_idol_ch', 'American Idol Judge Chair', 'Sit comfortably in this American Idol Judge Chair', 1579, 1, 1, 1.2, '0', 'can_sit_on_top,requires_rights_for_interaction', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1215, 'ads_idol_floor2', 'American Idol Floor Tile 2', 'Make your American Idol room more unique with these tiles', 1580, 2, 2, 0, '4', 'can_stack_on_top,can_stand_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1216, 'ads_idol_piano', 'American Idol Piano', 'Write a beautiful ballad for the performance of your life!', 1581, 2, 2, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1217, 'ads_idol_wall', 'American Idol Poster', 'Set the stage with this poster. Feels like you\'re really there, right?', 1582, -1, -1, 0, '5', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1218, 'ads_idol_tv', 'American Idol TV', 'TBD Click it away', 1583, -1, -1, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1219, 'ads_idol_mic', 'American Idol Microphone', 'Sing your heart out! Well, not literally...', 1584, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1220, 'ads_idol_drape', 'American Idol Curtain', 'Create the perfect American Idol set with these curtains', 1585, 3, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,6', NULL), + (1221, 'ads_idol_audChr', 'American Idol Audience Chair', 'Fancy seating for your audience!', 1586, 1, 1, 1, '2', 'can_sit_on_top,requires_rights_for_interaction', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1222, 'ads_idol_pchair', 'American Idol Piano Chair', 'Sit comfortably in this chair with your Idol piano', 1587, 1, 1, 1, '0', 'can_sit_on_top,requires_rights_for_interaction', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1223, 'ads_idol_trax', 'American Idol Trax Machine', 'Everything sounds sweeter with this custom American Idol Trax Machine!', 1588, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,custom_data_numeric_on_off,sound_machine', 'default', 1, 1, '', -1, '2,4', NULL), + (1224, 'ads_idol_tele', 'American Idol Star Teleport', 'This could be the doorway to your dreams!', 1589, 1, 1, 0, '3', 'solid,requires_touching_for_interaction,custom_data_true_false,teleporter,redirect_rotation_0,door_teleporter', 'teleport', 1, 1, '', -1, '0,2,4,6', NULL), + (1225, 'ads_idol_jukebox*1', 'American Idol Jukebox', 'I sound better already!', 1590, 1, 1, 0, '2', 'solid,jukebox', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1226, 'ads_idol_clRack', 'Clothes Rack', 'Finally! Somewhere to hang up your clothes', 1591, 3, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1227, 'ads_idol_mirror', 'Makeup Mirror', 'Pass the lipstick please!', 1592, -1, -1, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1228, 'ads_idol_voting_ch', 'Voting Chair', 'Do you have a good ear for music?', 1593, 1, 1, 1.2, '3', 'can_sit_on_top,requires_rights_for_interaction', 'idol_vote_chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1229, 'ads_idol_hotspot', 'Hot Spot Scoreboard', 'Stand here and await the verdict!', 1600, 1, 1, 0, '2', 'can_stand_on_top,requires_rights_for_interaction,can_not_stack_on_top', 'idol_scoreboard', 1, 1, '', -1, '2,4', NULL), + (1230, 'ads_idol_cork', 'Cubicle Partition', 'Need privacy so you can write that story? Get this!', 10051, 3, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1231, 'ads_idol_ichair', 'Interview Chair', 'Next question please.', 10052, 1, 1, 1.3, '2', 'can_sit_on_top,requires_rights_for_interaction', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1232, 'ads_idol_logo', 'Idol Logo', 'Idol logo wall', 10053, -1, -1, 0, '3', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1233, 'ads_idol_newsDsk', 'News Reporter Desk', 'Report all the gossip in Habbo at this desk!', 10054, 2, 2, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1234, 'ads_idol_tube', 'Tube Light', 'Set the mood with this beautv!', 10055, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1235, 'ads_idol_tblCloth', 'ads_idol_tblCloth name', 'ads_idol_tbleCloth desc', 11133, 2, 2, 1.2, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1236, 'ads_idol_lamp', 'ads_idol_lamp name', 'ads_idol_lamp desc', 11137, 1, 1, 0, '2', 'can_stand_on_top,can_stack_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1237, 'ads_idol_carpet', 'Idol Carpet', 'With glamour and style', 11149, 2, 7, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1238, 'ads_idol_l_carpet', 'Idol Carpet', 'With glamour and style', 9908, 2, 7, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1239, 'ads_idol_l_logo', 'Idol Logo', 'Idol logo wall', 9909, -1, -1, 0, '3', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1240, 'ads_idol_l_tv', 'American Idol Tv', 'TBD Click it away', 9910, -1, -1, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1241, 'ads_idol_trophy', 'American Idol Trophy', 'For the winner of American Idol', 11172, 1, 1, 0, '0', 'solid,prize_trophy,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (1242, 'flag_algeria', 'The Algerian Flag', 'Wave it proudly!', 4270, 1, 1, 0, '0', 'solid,wall_item', 'default', 1, 1, '', -1, '2,4', NULL), + (1243, 'flag_argentina', 'The Argentinian Flag', 'Wave it proudly!', 4261, 1, 1, 0, '0', 'solid,wall_item', 'default', 1, 1, '', -1, '2,4', NULL), + (1244, 'flag_belgium', 'The Belgian Flag', 'Wave it proudly!', 4229, 1, 1, 0, '0', 'solid,wall_item', 'default', 1, 1, '', -1, '2,4', NULL), + (1245, 'flag_chile', 'The Chilean Flag', 'Wave it proudly!', 4256, 1, 1, 0, '0', 'solid,wall_item', 'default', 1, 1, '', -1, '2,4', NULL), + (1246, 'flag_columbia', 'The Colombian Flag', 'Wave it proudly!', 4258, 1, 1, 0, '0', 'solid,wall_item', 'default', 1, 1, '', -1, '2,4', NULL), + (1247, 'flag_dominicanrepublic', 'The Dominican Republic Flag', 'Wave it proudly!', 4265, 1, 1, 0, '0', 'solid,wall_item', 'default', 1, 1, '', -1, '2,4', NULL), + (1248, 'flag_ecuador', 'The Ecuadorian Flag', 'Wave it proudly!', 4268, 1, 1, 0, '0', 'solid,wall_item', 'default', 1, 1, '', -1, '2,4', NULL), + (1249, 'flag_greece', 'The Greek Flag', 'Wave it proudly!', 4253, 1, 1, 0, '0', 'solid,wall_item', 'default', 1, 1, '', -1, '2,4', NULL), + (1250, 'flag_malaysia', 'The Malaysian Flag', 'Wave it proudly!', 4252, 1, 1, 0, '0', 'solid,wall_item', 'default', 1, 1, '', -1, '2,4', NULL), + (1251, 'flag_mexico', 'The Mexican Flag', 'Wave it proudly!', 4250, 1, 1, 0, '0', 'solid,wall_item', 'default', 1, 1, '', -1, '2,4', NULL), + (1252, 'flag_morocco', 'The Moroccan Flag', 'Wave it proudly!', 4264, 1, 1, 0, '0', 'solid,wall_item', 'default', 1, 1, '', -1, '2,4', NULL), + (1253, 'flag_newzealand', 'The New Zealand Flag', 'Wave it proudly!', 4260, 1, 1, 0, '0', 'solid,wall_item', 'default', 1, 1, '', -1, '2,4', NULL), + (1254, 'flag_norway', 'Norwegian Flag', 'Land of the fjord', 11173, 1, 1, 0, '0', 'solid,wall_item', 'default', 1, 1, '', -1, '2,4', NULL), + (1255, 'flag_panama', 'The Panama Flag', 'Wave it proudly!', 4262, 1, 1, 0, '0', 'solid,wall_item', 'default', 1, 1, '', -1, '2,4', NULL), + (1256, 'flag_peru', 'The Peruvian Flag', 'Wave it proudly!', 4246, 1, 1, 0, '0', 'solid,wall_item', 'default', 1, 1, '', -1, '2,4', NULL), + (1257, 'flag_philippines', 'The Philippines Flag', 'Wave it proudly!', 4251, 1, 1, 0, '0', 'solid,wall_item', 'default', 1, 1, '', -1, '2,4', NULL), + (1258, 'flag_portugal', 'The Portuguese Flag', 'Wave it proudly!', 4231, 1, 1, 0, '0', 'solid,wall_item', 'default', 1, 1, '', -1, '2,4', NULL), + (1259, 'flag_singapore', 'The Singapore Flag', 'Wave it proudly!', 4249, 1, 1, 0, '0', 'solid,wall_item', 'default', 1, 1, '', -1, '2,4', NULL), + (1260, 'flag_tunisia', 'The Tunisian Flag', 'Wave it proudly!', 4248, 1, 1, 0, '0', 'solid,wall_item', 'default', 1, 1, '', -1, '2,4', NULL), + (1261, 'flag_turkey', 'The Turkish Flag', 'Wave it proudly!', 4255, 1, 1, 0, '0', 'solid,wall_item', 'default', 1, 1, '', -1, '2,4', NULL), + (1262, 'flag_venezl', 'The Venezuelan Flag', 'Wave it proudly!', 4254, 1, 1, 0, '0', 'solid,wall_item', 'default', 1, 1, '', -1, '2,4', NULL), + (1263, 'marsrug', 'Mars Patch', 'Discover the red planet', 11180, 2, 2, 0, '5', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1264, 'sf_wall2', 'Starship Wall', 'Keeping space out since 1969', 11181, 0, 0, 0, '3', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1265, 'sf_wall3', 'Starship Corner', 'Streamlined for speed', 11182, 0, 0, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1266, 'sf_window', 'Starship Window', 'It\'ll put stars in your eyes', 11183, 0, 0, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1267, 'fx_explosion', 'The Kaboomer', 'Blow it up, baby!', 1521, 0, 0, 0, '2', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 0, 0, '', 3600, '0', NULL), + (1268, 'fx_bubble', 'Bubbles', 'Forever blowing bubbles!', 1522, 0, 0, 0, '2', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 0, 0, '', 3600, '0', NULL), + (1269, 'fx_flare', 'Firestarter', 'Light it up!', 1523, 0, 0, 0, '2', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 0, 0, '', 3600, '0', NULL), + (1270, 'planet_of_love', 'Planet of Love', 'All you need is world LOVE!', 11213, 1, 1, 0, '0', 'can_stand_on_top', 'default', 1, 1, '', -1, '0', NULL), + (1271, 'saturn', 'Planet of Eternity', 'How many rings are there??', 11154, 1, 1, 0, '0', 'can_stand_on_top', 'default', 1, 1, '', -1, '0,2', NULL), + (1272, 'pix_asteroid', 'The Asteroid', 'A smashing rock in space!', 11212, 1, 1, 0, '2', 'can_stand_on_top', 'default', 1, 1, '', -1, '0,6', NULL), + (1273, 'one_way_door*1', 'Aqua One Way Gate', 'One at a time!', 9800, 1, 1, 0, '2', 'one_way_gate', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1274, 'one_way_door*2', 'Black HC Gate', 'One way! The HC way!', 9801, 1, 1, 0, '2', 'one_way_gate', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1275, 'one_way_door*3', 'White HC Gate', 'One way! The HC way!', 9802, 1, 1, 0, '0', 'one_way_gate', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1276, 'one_way_door*4', 'Beige One Way Gate', 'One at a time!', 9803, 1, 1, 0, '2', 'one_way_gate', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1277, 'one_way_door*5', 'Pink One Way Gate', 'One at a time!', 9804, 1, 1, 0, '2', 'one_way_gate', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1278, 'one_way_door*6', 'Blue HC Gate', 'One way! The HC way!', 9805, 1, 1, 0, '2', 'one_way_gate', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1279, 'one_way_door*7', 'Green One Way Gate', 'One at a time!', 9806, 1, 1, 0, '2', 'one_way_gate', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1280, 'one_way_door*8', 'Yellow One Way Gate', 'One at a time!', 9807, 1, 1, 0, '2', 'one_way_gate', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1281, 'one_way_door*9', 'Red One Way Gate', 'One at a time!', 9808, 1, 1, 0, '2', 'one_way_gate', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1282, 'tiki_tray0', 'Empty Tray', 'That was tasty!', 1283, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1283, 'tiki_tray1', 'Tiki Fruit Tray', 'Refreshing!', 1284, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1284, 'tiki_tray2', 'Tiki Pineapple Plate', 'Fresh and juicy!', 1285, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1285, 'tiki_tray3', 'Tiki Fish Tray', 'Freshly caught and BBQ\'d!', 1286, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1286, 'tiki_tray4', 'Tiki Pig Tray', 'Slow roastet pig head', 1287, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1287, 'tiki_wallplnt', 'Jungle Wallplant', 'Dense jungle ahead!', 1291, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1288, 'tiki_bardesk', 'Tiki Bar Desk', 'Serving up Summer', 1292, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1289, 'tiki_bench', 'Tiki Bar Stool', 'Sit back and relax!', 1293, 1, 1, 1.5, '0', 'can_sit_on_top,requires_rights_for_interaction', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1290, 'tiki_bflies', 'Butterflies', 'Get your island beauties', 1294, 1, 1, 0, '3', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (1291, 'tiki_junglerug', 'Jungle Patch', 'Bring your machete', 1295, 2, 2, 0, '0', 'can_stand_on_top,can_stack_on_top', 'default', 1, 1, '', -1, '0,2', NULL), + (1292, 'tiki_parasol', 'Tiki Parasol', 'Funky party lighting', 1296, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1293, 'tiki_sand', 'Island Sand Patch', 'Life\'s a beach!', 1297, 2, 2, 0, '0', 'can_stand_on_top,can_stack_on_top', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1294, 'tiki_statue', 'Tribal Statue', 'Burn baby burn.. tiki inferno', 1298, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1295, 'tiki_torch', 'Beach Torch', 'Lighting the way', 1299, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1296, 'tiki_toucan', 'Toucan', 'Ermm... *pecks*', 1300, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1297, 'tiki_waterfall', 'Tiki Waterfall', 'Fresh mountain water', 1301, 3, 2, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1298, 'tiki_surfboard', 'Surfboard', 'Ride the waves dude!', 1302, 0, 0, 0, '9', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1299, 'tiki_corner', 'Tiki Bar Corner', 'Nothing says a bar like a corner?', 1303, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1300, 'ads_twi_paint', 'Painting', 'Stare deep into the painting...', 4272, -1, -1, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1301, 'ads_twi_dreamc', 'Dream Catcher', 'Will it catch them?', 4273, -1, -1, 0, '0', 'wall_item', 'default', 1, 1, '', -1, '2,4', NULL), + (1302, 'ads_twi_bwall1', 'Barn Wall', 'Keeps the cold out..', 4274, -1, -1, 0, '3', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1303, 'ads_twi_crest', 'Volturi Crest', 'A Royal Crest.', 4275, -1, -1, 0, '0', 'wall_item', 'default', 1, 1, '', -1, '2,4', NULL), + (1304, 'ads_twi_toolbx', 'Toolbox', 'Good spot for some tools...', 3296, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1305, 'ads_twi_table', 'Cake on Table with Presents', 'Whose name is on that present?', 3297, 2, 2, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1306, 'ads_twi_tower', 'Clock Tower', 'What time is it?', 3298, 1, 1, 0, '0', 'solid', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1307, 'ads_twi_piano', 'Broken Piano', 'I wonder if it\'s still in tune.', 3299, 2, 2, 0, '0', 'solid', 'default', 1, 1, '', -1, '0,2', NULL), + (1308, 'ads_twi_chair', 'Volturi Royal Chair', 'A chair fit for royalty', 3300, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1309, 'ads_twi_fountn', 'Fountain', 'Simply breathtaking...', 3301, 2, 2, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1310, 'ads_twi_dvdr2', 'Clock Tower wall', 'Repel all attacks...', 3302, 2, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1311, 'ads_twi_dvdr1', 'Half wall', 'Where is the other half?', 3303, 2, 1, 0, '0', 'solid', 'default', 1, 1, '', -1, '0,2', NULL), + (1312, 'ads_twi_bwall2', 'Truck and Motorcycles', 'Nice motorcycle', 4276, -1, -1, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1313, 'ads_twi_roses', 'Standing Rose Bouquet', 'You shouldn\'t have...', 3304, 1, 1, 0, '0', 'solid', 'default', 1, 1, '', -1, '0,2', NULL), + (1314, 'ads_twi_windw', 'Window with Candles', 'Watch the candle flicker', 4277, -1, -1, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1315, 'ads_twi_trophy', 'Twilight Trophy', 'Fitting for the biggest Twilight fan!', 3311, 1, 1, 0, '0', 'solid,prize_trophy,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1316, 'ads_twi_mist', 'Fog', 'Sure is foggy out here...', 3308, 1, 1, 0, '2', 'can_stand_on_top', 'default', 1, 1, '', -1, '0', NULL), + (1317, 'theatre_seat', 'Deluxe Theatre Chair', 'For Lazy boys and girls!', 286, 1, 1, 1.2, '6', 'can_sit_on_top,requires_rights_for_interaction', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1318, 'spotlight', 'Habbowood Spotlight', 'For the star of the show', 285, 1, 1, 0, '6', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1319, 'rope_divider', 'Rope Divider', 'Rope Divider', 284, 2, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2', NULL), + (1320, 'tile_brown', 'Red Tile', '10% off downtown promenades & piazzas!', 78, 1, 1, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1321, 'tile_marble', 'Marble Tile', 'Slick sophistication; now 10% off!', 77, 1, 1, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1322, 'tile_stella', 'Star Tile', '10% off the walk of fame!', 289, 1, 1, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1323, 'habw_mirror', 'Habbowood Mirror', 'Star of the show!', 288, 0, 0, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1324, 'carpet_valentine', 'Red carpet', 'For making an appearance', 677, 2, 7, 0, '0', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1325, 'habbowood_chair', 'Director\'s Chair', 'Exclusively for Directors', 283, 1, 1, 1.2, '0', 'can_sit_on_top,requires_rights_for_interaction', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1326, 'gothic_chair*1', 'Gothic Chair Pink', 'The dark side of Habbo', 2084, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1327, 'gothic_sofa*1', 'Gothic Sofa Pink', 'The dark side of Habbo', 2085, 2, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1328, 'gothic_stool*1', 'Gothic Stool Pink', 'The dark side of Habbo', 2086, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1329, 'gothic_chair*2', 'Gothic Chair Saffron', 'The dark side of Habbo', 2087, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1330, 'gothic_sofa*2', 'Gothic Sofa Saffron', 'The dark side of Habbo', 2088, 2, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1331, 'gothic_stool*2', 'Gothic Stool Saffron', 'The dark side of Habbo', 2089, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1332, 'gothic_chair*4', 'Black Gothic Chair', 'The dark side of Habbo', 2093, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1333, 'gothic_sofa*4', 'Black Gothic Sofa', 'The dark side of Habbo', 2094, 2, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1334, 'gothic_stool*4', 'Black Gothic Stool', 'The dark side of Habbo', 2095, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1335, 'gothic_chair*5', 'Gothic Chair Green', 'The dark side of Habbo', 2096, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1336, 'gothic_sofa*5', 'Gothic Sofa Green', 'The dark side of Habbo', 2097, 2, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1337, 'gothic_stool*5', 'Gothic Stool Green', 'The dark side of Habbo', 2098, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1338, 'gothic_chair*6', 'Gothic Chair Blue', 'The dark side of Habbo', 2099, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1339, 'gothic_sofa*6', 'Gothic Sofa Blue', 'The dark side of Habbo', 2100, 2, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1340, 'gothic_stool*6', 'Gothic Stool Blue', 'The dark side of Habbo', 2101, 1, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1341, 'sofachair_polyfon*2', 'Black Mode Armchair', 'Black Mode Armchair', 847, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1342, 'bed_polyfon*2', 'Black Mode Double Bed', 'Black Mode Double Bed', 844, 2, 3, 1, '0', 'can_lay_on_top', 'bed', 1, 1, '', -1, '0,2', NULL), + (1343, 'bed_polyfon_one*2', 'Black Mode Single Bed', 'Black Mode Single Bed', 845, 1, 3, 1.6, '0', 'can_lay_on_top', 'bed', 1, 1, '', -1, '0,2', NULL), + (1344, 'bardesk_polyfon*2', 'Black Mode Bardesk', 'Black Mode Bardesk', 849, 2, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1345, 'bardeskcorner_polyfon*2', 'Black Mode Bardesk Corner', 'Black Mode Bardesk Corner', 850, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1346, 'sofachair_polyfon*3', 'White Armchair', 'Loft-style comfort', 854, 1, 1, 1, '1', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1347, 'bed_polyfon*3', 'White Double Bed', 'Give yourself space to stretch out', 851, 2, 3, 1, '2', 'can_lay_on_top', 'bed', 1, 1, '', -1, '0,2,4,6', NULL), + (1348, 'bed_polyfon_one*3', 'White Single Bed', 'Cot of the artistic', 852, 1, 3, 1.6, '2', 'can_lay_on_top', 'bed', 1, 1, '', -1, '0,2,4,6', NULL), + (1349, 'bardesk_polyfon*3', 'White Bardesk', 'Perfect for work or play', 856, 2, 1, 1, '2', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1350, 'bardeskcorner_polyfon*3', 'White Corner Desk', 'Tuck it away', 857, 1, 1, 1, '2', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1351, 'sofachair_polyfon*4', 'Beige Mode Armchair', 'Beige Mode Armchair', 861, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1352, 'bed_polyfon*4', 'Beige Mode Double Bed', 'Beige Mode Double Bed', 858, 2, 3, 1, '0', 'can_lay_on_top', 'bed', 1, 1, '', -1, '0,2', NULL), + (1353, 'bed_polyfon_one*4', 'Beige Mode Single Bed', 'Beige Mode Single Bed', 859, 1, 3, 1.6, '0', 'can_lay_on_top', 'bed', 1, 1, '', -1, '0,2', NULL), + (1354, 'bardesk_polyfon*4', 'Beige Mode Bardesk', 'Beige Mode Bardesk', 863, 2, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1355, 'bardeskcorner_polyfon*4', 'Beige Mode Bardesk Corner', 'Beige Mode Bardesk Corner', 864, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1356, 'sofachair_polyfon*6', 'Blue Mode Armchair', 'Blue Mode Armchair', 868, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1357, 'bed_polyfon*6', 'Blue Mode Double Bed', 'Blue Mode Double Bed', 865, 2, 3, 1, '0', 'can_lay_on_top', 'bed', 1, 1, '', -1, '0,2', NULL), + (1358, 'bed_polyfon_one*6', 'Blue Mode Single Bed', 'Blue Mode Single Bed', 866, 1, 3, 1.6, '0', 'can_lay_on_top', 'bed', 1, 1, '', -1, '0,2', NULL), + (1359, 'bardesk_polyfon*6', 'Blue Mode Bardesk', 'Blue Mode Bardesk', 870, 2, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1360, 'bardeskcorner_polyfon*6', 'Blue Mode Bardesk Corner', 'Blue Mode Bardesk Corner', 871, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1361, 'sofachair_polyfon*7', 'Green Armchair', 'Loft-style comfort', 875, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1362, 'bed_polyfon*7', 'Green Double Bed', 'Give yourself space to stretch out', 872, 2, 3, 1, '0', 'can_lay_on_top', 'bed', 1, 1, '', -1, '0,2', NULL), + (1363, 'bed_polyfon_one*7', 'Green Single Bed', 'Cot of the artistic', 873, 1, 3, 1.6, '0', 'can_lay_on_top', 'bed', 1, 1, '', -1, '0,2', NULL), + (1364, 'bardesk_polyfon*7', 'Green Bardesk', 'Perfect for work or play', 877, 2, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1365, 'bardeskcorner_polyfon*7', 'Green Corner Desk', 'Tuck it away', 878, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1366, 'sofachair_polyfon*8', 'Yellow Mode Armchair', 'Yellow Mode Armchair', 882, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1367, 'bed_polyfon*8', 'Yellow Mode Double Bed', 'Yellow Mode Double Bed', 879, 2, 3, 1, '0', 'can_lay_on_top', 'bed', 1, 1, '', -1, '0,2', NULL), + (1368, 'bed_polyfon_one*8', 'Yellow Mode Single Bed', 'Yellow Mode Single Bed', 880, 1, 3, 1.6, '0', 'can_lay_on_top', 'bed', 1, 1, '', -1, '0,2', NULL), + (1369, 'bardesk_polyfon*8', 'Yellow Mode Bardesk', 'Yellow Mode Bardesk', 884, 2, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1370, 'bardeskcorner_polyfon*8', 'Yellow Mode Bardesk Corner', 'Yellow Mode Bardesk Corner', 885, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1371, 'sofachair_polyfon*9', 'Red Armchair', 'Loft-style comfort', 889, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1372, 'bed_polyfon*9', 'Red Double Bed', 'Give yourself space to stretch out', 886, 2, 3, 1, '0', 'can_lay_on_top', 'bed', 1, 1, '', -1, '0,2', NULL), + (1373, 'bed_polyfon_one*9', 'Red Single Bed', 'Cot of the artistic', 887, 1, 3, 1.6, '0', 'can_lay_on_top', 'bed', 1, 1, '', -1, '0,2', NULL), + (1374, 'bardesk_polyfon*9', 'Red Bardesk', 'Perfect for work or play', 891, 2, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1375, 'bardeskcorner_polyfon*9', 'Red Corner Desk', 'Tuck it away', 892, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1376, 'divider_poly3*2', 'Black Mode Bardesk Gate', 'Black Mode Bardesk Gate', 848, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2', NULL), + (1377, 'divider_poly3*3', 'White Hatch', 'Border control!', 855, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1378, 'divider_poly3*4', 'Beige Mode Bardesk Gate', 'Beige Mode Bardesk Gate', 862, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2', NULL), + (1379, 'divider_poly3*6', 'Blue Mode Bardesk Gate', 'Blue Mode Bardesk Gate', 869, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2', NULL), + (1380, 'divider_poly3*7', 'Green Hatch', 'Border control', 876, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2', NULL), + (1381, 'divider_poly3*8', 'Yellow Mode Bardesk Gate', 'Yellow Mode Bardesk Gate', 883, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2', NULL), + (1382, 'divider_poly3*9', 'Red Hatch', 'Border Control!', 890, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2', NULL), + (1383, 'prizetrophy*1', 'Classic trophy', 'Glittery gold', 600, 1, 1, 0, '0', 'solid,prize_trophy,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (1384, 'post.it.vd', 'Heart Stickies', 'Spread your love!', 676, 1, 1, 0, '0', 'wall_item,post_it', 'default', 1, 1, '', -1, '', NULL), + (1385, 'heartsofa', 'Heart Sofa', 'Perfect for snuggling up on', 672, 2, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1386, 'heart', 'Giant Heart', 'Full of love', 674, 2, 1, 0, '0', 'solid', 'default', 1, 1, '', -1, '2,4', NULL), + (1387, 'statue', 'Cupid Statue', 'Watch out for those arrows!', 673, 1, 1, 0, '0', 'solid', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1388, 'valeduck', 'Valentine\'s Duck', 'He\'s lovestruck', 675, 1, 1, 0, '0', 'solid', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1389, 'val_cauldron', 'Valentine\'s cauldron', 'Cast a loving spell', 2103, 1, 1, 0, '0', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '25', -1, '0', NULL), + (1390, 'val_choco', 'Heart Shaped Chocs', 'One for them. Two for me!', 1235, 1, 1, 0, '2', 'solid', 'default', 1, 1, '', -1, '0,2', NULL), + (1391, 'val_teddy*1', 'Grey Share Bear', 'The grey bear of affection', 1240, 1, 1, 0.9, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1392, 'val_teddy*2', 'Pink Share Bear', 'The pink bear of passion', 1241, 1, 1, 0.9, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1393, 'val_teddy*3', 'Green Share Bear', 'The green bear of friendship', 1242, 1, 1, 0.9, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1394, 'val_teddy*4', 'Brown Share Bear', 'The brown bear of naughtiness', 1243, 1, 1, 0.9, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1395, 'val_teddy*5', 'Yellow Share Bear', 'The yellow bear of understanding', 1244, 1, 1, 0.9, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1396, 'val_teddy*6', 'Blue Share Bear', 'The blue bear of happiness', 1245, 1, 1, 0.9, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1397, 'val_heart', 'Heart Light', 'Heartbroken... without your love!', 678, 1, 1, 0, '2', 'wall_item', 'default', 1, 1, '', -1, '2,4', NULL), + (1398, 'plant_valentinerose*1', 'Red Valentine\'s Rose', 'Secret admirer!', 679, 1, 1, 0, '2', 'solid', 'default', 1, 1, '', -1, '0,2', NULL), + (1399, 'plant_valentinerose*2', 'White Valentine\'s Rose', 'For the purest love', 680, 1, 1, 0, '0', 'solid', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1400, 'plant_valentinerose*3', 'Yellow Valentine\'s Rose', 'Relight your passions', 681, 1, 1, 0, '2', 'solid', 'default', 1, 1, '', -1, '0,2', NULL), + (1401, 'plant_valentinerose*4', 'Pink Valentine\'s Rose', 'Be mine!', 682, 1, 1, 0, '2', 'solid', 'default', 1, 1, '', -1, '0,2', NULL), + (1402, 'plant_valentinerose*5', 'Purple Valentine\'s Rose', 'Requires purple rain to flourish', 683, 1, 1, 0, '2', 'solid', 'default', 1, 1, '', -1, '0,2', NULL), + (1403, 'pumpkin', 'Pumpkin Lamp', 'Cast a spooky glow', 656, 1, 1, 0, '2', 'solid', 'default', 1, 1, '', -1, '0,6', NULL), + (1404, 'habboween_grass', 'Unholy Ground', 'Autumnal chills with each rotation!', 669, 2, 2, 0, '0', 'can_stand_on_top,can_stack_on_top', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1405, 'deadduck', 'Dead Duck', 'Blood, but no guts', 662, 1, 1, 0, '0', 'solid', 'default', 1, 1, '', -1, '0,6', NULL), + (1406, 'deadduck2', 'Dead Duck 2', 'Someone forgot to feed me...', 663, 1, 1, 0, '0', 'solid', 'default', 1, 1, '', -1, '0,6', NULL), + (1407, 'deadduck3', 'Dead Duck 3', 'With added ectoplasm', 664, 1, 1, 0, '0', 'solid', 'default', 1, 1, '', -1, '0,6', NULL), + (1408, 'skullcandle', 'Skull Candle Holder', 'Alas poor Yorrick...', 659, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (1409, 'habboween_crypt', 'Creepy Crypt', 'What lurks inside?', 668, 1, 3, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1410, 'hal_cauldron', 'Habboween Cauldron', 'Eye of Habbo and toe of Mod!', 670, 1, 1, 0, '0', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '3', -1, '0,6', NULL), + (1411, 'hal_grave', 'Haunted Grave', 'We\'re raising the dead!', 671, 1, 2, 0, '2', 'solid_single_tile,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1412, 'rela_candles1', 'White Candles', 'Calming Relaxation...', 3234, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (1413, 'rela_candles2', 'Red Candles', 'Calming Relaxation...', 3245, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (1414, 'rela_candles3', 'Violet Candles', 'Calming Relaxation...', 3236, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (1415, 'rela_candle1', 'White Candle', 'Calming Relaxation...', 3238, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1416, 'rela_candle2', 'Red Candle', 'Calming Relaxation...', 3244, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1417, 'rela_candle3', 'Violet Candle', 'Calming Relaxation...', 3235, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1418, 'rela_hchair', 'Comfort Cradle', 'Calming Comfort...', 3247, 1, 1, 1.4, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1419, 'rela_orchid', 'Orchid', 'Calming Fragrance...', 3239, 1, 1, 0, '0', 'solid', 'default', 1, 1, '', -1, '0,2', NULL), + (1420, 'rela_plant', 'Relaxation Plant', 'Calming Greenery...', 3246, 1, 1, 0, '0', 'solid', 'default', 1, 1, '', -1, '0,2', NULL), + (1421, 'rela_stick', 'Stick in Jar', 'Calming Tranquility...', 3240, 1, 1, 0, '3', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1422, 'rela_stone', 'Relaxation Stones', 'Calming Stability...', 3233, 1, 1, 1, '3', 'can_sit_on_top,requires_rights_for_interaction', 'chair', 1, 1, '', -1, '0,2', NULL), + (1423, 'rela_rock', 'Rock Seat', 'Calming Comfort...', 3248, 1, 1, 1, '3', 'can_sit_on_top,requires_rights_for_interaction', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1424, 'rela_wall', 'Relaxation Wall', 'Calming Serenity...', 4232, 1, 1, 0, '6', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1425, 'jp_lantern', 'Japanese Lantern', 'For a mellow Eastern glow', 306, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1426, 'jp_pillow', 'Pillow Chair', 'Comfy and classical', 302, 1, 1, 0.8, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1427, 'jp_irori', 'Irori', 'Traditional heating and eating', 303, 2, 2, 0, '2', 'solid', 'default', 1, 1, '', -1, '0', NULL), + (1428, 'jp_ninjastars', 'Ninja Stars', 'Not a frisbee', 308, 1, 1, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1429, 'jp_tatami', 'Small Tatami Mat', 'Shoes off please', 304, 2, 2, 0, '0', 'can_stand_on_top,can_stack_on_top', 'default', 1, 1, '', -1, '0', NULL), + (1430, 'jp_tatami2', 'Large Tatami Mat', 'Shoes off please', 305, 2, 4, 0, '0', 'can_stand_on_top,can_stack_on_top', 'default', 1, 1, '', -1, '0,2', NULL), + (1431, 'jp_drawer', 'Japanese Drawer', 'Spiritual home for odds and ends', 307, 1, 1, 1, '2', 'solid,requires_rights_for_interaction,can_stack_on_top', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1432, 'jp_bamboo', 'Bamboo Forest', 'Watch out for pandas!', 301, 2, 2, 0, '0', 'solid', 'default', 1, 1, '', -1, '0', NULL), + (1433, 'jp_rare', 'Shishi Odishi', 'Traditional Japanese water ornament', 1272, 2, 2, 0, '2', 'solid', 'default', 1, 1, '', -1, '0,6', NULL), + (1434, 'jp_sheet1', 'Kakejiku Ziritsu', 'Japanese Kakejiku', 309, 1, 1, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1435, 'jp_sheet2', 'Kakejiku Ninjya', 'Japanese Kakejiku', 310, 1, 1, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1436, 'jp_sheet3', 'Kakejiku Hokusai', 'Japanese Kakejiku', 311, 1, 1, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1437, 'jp_tray1', 'Sushi Maguro', 'Sushi made with tuna', 312, 1, 1, 0, '0', 'solid', 'default', 1, 1, '', -1, '0,2', NULL), + (1438, 'jp_tray2', 'Sushi Ika', 'Sushi made with squid', 313, 1, 1, 0, '0', 'solid', 'default', 1, 1, '', -1, '0,2', NULL), + (1439, 'jp_tray3', 'Sushi Ikura', 'Sushi made with caviar', 314, 1, 1, 0, '0', 'solid', 'default', 1, 1, '', -1, '0,2', NULL), + (1440, 'jp_tray4', 'Sushi Uni', 'Sushi made with sea urchin', 315, 1, 1, 0, '0', 'solid', 'default', 1, 1, '', -1, '0,2', NULL), + (1441, 'jp_tray5', 'Sushi Tamago', 'Sushi made with egg', 316, 1, 1, 0, '0', 'solid', 'default', 1, 1, '', -1, '0,2', NULL), + (1442, 'jp_tray6', 'Sushi Kohada', 'Sushi made with mackerel', 317, 1, 1, 0, '0', 'solid', 'default', 1, 1, '', -1, '0,2', NULL), + (1443, 'jp_katana1', 'HC Katana Red', 'Essential chopping!', 1268, 1, 1, 0, '0', 'solid', 'default', 1, 1, '', -1, '0,2', NULL), + (1444, 'jp_katana2', 'Katana Blue', 'Let\'s get chopping!', 1269, 1, 1, 0, '0', 'solid', 'default', 1, 1, '', -1, '0,2', NULL), + (1445, 'jp_katana3', 'Katana Green', 'Hurry! Chop chop!', 1270, 1, 1, 0, '0', 'solid', 'default', 1, 1, '', -1, '0,2', NULL), + (1446, 'jp_table', 'Chabu Dai', 'Japanese coffee table', 1271, 2, 2, 0, '4', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1447, 'jp_teamaker', 'Japanese Teamaker', 'Makes a steaming brew!', 1282, 1, 1, 0, '2', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '28', -1, '2,4', NULL), + (1448, 'hween09_organ', 'Ghostly Organ', 'Play a ghastly tune on the bones...', 3282, 2, 1, 0, '3', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1449, 'sf_mbar', 'Astro-Bar', 'Deep space refreshment.', 3273, 1, 1, 0, '2', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '44', -1, '0,2,4,6', NULL), + (1450, 'beanstalk', 'Gigantic Beanstalk', 'A majestic rare... but who\'s gonna fix my floor?!', 3401, 1, 1, 0, '6', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1451, 'djesko_turntable', 'Habbo Turntable', 'For the music-lovers', 11120, 1, 1, 0, '0', 'solid', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1452, 'rare_globe', 'Snow Globe', 'It\'s all white..', 1119, 1, 1, 0, '2', 'solid', 'default', 1, 1, '', -1, '0', NULL), + (1453, 'rare_hammock', 'Hammock', 'Eco bed', 1122, 1, 3, 1.5, '0', 'can_lay_on_top', 'bed', 1, 1, '', -1, '0,2', NULL), + (1454, 'rare_ironmaiden', 'Rare Iron Maiden', 'So good it\'s torturous!', 3399, 1, 1, 0, '3', 'solid,requires_touching_for_interaction,custom_data_true_false,teleporter', 'teleport', 1, 1, '', -1, '4,2', NULL), + (1455, 'rare_mmmth', 'Sofa Mammut', 'Pre Historic Sofa', 1304, 2, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '4,2', NULL), + (1456, 'rare_stand', 'Speaker\'s Corner', 'Stand and Deliver!', 1144, 1, 1, 1.7, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1457, 'rare_vdoll', 'Rare Voodoo Doll', 'Choose your punishment!', 3403, 1, 1, 0, '10', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '4,2', NULL), + (1458, 'rare_xmas_screen', 'Lappland Greetings', 'Ho Ho Ho!', 1120, 2, 1, 0.7, '0', 'can_sit_on_top,no_head_turn', 'chair', 1, 1, '', -1, '2,4', NULL), + (1459, 'valentinescreen', 'Holiday Romance', 'Peep through and smile!', 1121, 2, 1, 1.1, '0', 'can_sit_on_top,no_head_turn', 'chair', 1, 1, '', -1, '2,4', NULL), + (1460, 'hween09_chair', 'Haunted Chair', 'Was something just sitting in this??', 3295, 1, 1, 1.3, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1461, 'hween09_chandelier', 'Haunted Chandelier', 'Flickering in the night...', 3294, 1, 1, 0, '3', 'can_stand_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1462, 'hween09_crnr1', 'Creaky Corner', 'Perfect corner for a haunted house...', 4247, 1, 1, 0, '4', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1463, 'hween09_curt', 'Floating Curtain', 'Is someone hiding behind??', 4266, 1, 1, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1464, 'hween09_floor', 'Creaky Floor', 'Watch your step!', 3288, 2, 2, 0, '4', 'can_stand_on_top,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1465, 'hween09_ghost', 'Ghost-in-the-Box', 'Ohh haunting...', 3290, 1, 1, 0, '2', 'can_stand_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1466, 'hween09_hatch', 'Creepy Trap Door', 'I wonder where this goes?', 3285, 2, 2, 0, '2', 'can_stand_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1467, 'hween09_jar', 'Strange Jar', 'Would you like a Duck or a Head?', 3287, 1, 1, 0, '2', 'solid,solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1468, 'hween09_mirror', 'Ghostly Mirror', 'Is that a Habbo in there?', 3293, 1, 1, 1.2, '2', 'can_sit_on_top,requires_rights_for_interaction,no_head_turn', 'chair', 1, 1, '', -1, '2,4', NULL), + (1469, 'hween09_paint', 'Haunted Painting', 'Is that cat watching me?', 4263, 1, 1, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1470, 'hween09_stonewall', 'Old Stone Wall', 'Looks strong enough.', 4259, 1, 1, 0, '5', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1471, 'hween09_table', 'Creepy Table', 'Hope there is not a head on the platter...', 3286, 1, 3, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1472, 'hween09_treewall', 'Haunted Forest', 'Don\'t enter alone...', 4269, 1, 1, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1473, 'hween09_tv', 'Haunted TV', 'Whats on Haunted TV tonight?', 3292, 2, 1, 0, '3', 'solid', 'default', 1, 1, '', -1, '0,2', NULL), + (1474, 'hween09_wall1', 'Creaky Wall', 'I wonder if there is a hidden passage here?', 4257, 1, 1, 0, '4', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1475, 'hween09_win', 'Haunted Window', 'What is really outside?', 4271, 1, 1, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1476, 'igor_seat', 'Hump Massaging Chair', 'My Hump, My Hump, My Hump', 1418, 1, 1, 1.2, '2', 'can_sit_on_top,requires_rights_for_interaction', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1477, 'ads_igorbrain', 'The Brain', 'Mwahhahahahaha brains...', 1419, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1478, 'ads_igorraygun', 'Igor Ray Gun', 'Shoot down your foes!', 1420, 1, 2, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1479, 'ads_igorswitch', 'Igor Switch', 'Nothing will work without this being on!', 1421, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1480, 'ads_igor_flask', 'Glass Flask', 'Down the hatch!', 1524, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1481, 'ads_igor_dsk', 'Inventor\'s Desk', 'Draw your evil plans', 1525, 2, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1482, 'ads_igorevilb', 'Evil Bone', 'It\'s not a funny bone', 1526, -1, -1, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1483, 'ads_igor_wall', 'Monster Plan Poster', 'The latest model!', 1527, -1, -1, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1484, 'sw_table', 'Adventure Desk', 'Where will you go today?', 1262, 1, 2, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1485, 'sw_swords', 'Swords', 'The other kind of fencing...', 1263, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1486, 'sw_stone', 'Mysterious Necklace', 'Why does the stone glow at night?', 1264, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1487, 'sw_raven', 'Raven', 'Lurking... with intent', 1265, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1488, 'sw_hole', 'Ventilation Duct', 'Full of creepy crawlies', 1266, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1489, 'sw_chest', 'Ye Olde Chest', 'One size fits all', 1267, 1, 2, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1490, 'silo_studydesk', 'Area Quest Desk', 'For the true Habbo Scholars', 79, 2, 1, 0, '2', 'solid', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1491, 'summer_chair*1', 'Aqua Deck Chair', 'Got your swimming trunks?', 1249, 1, 1, 0.99, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '2,4', NULL), + (1492, 'summer_chair*2', 'Pink Deck Chair', 'Waterproof!', 1250, 1, 1, 0.99, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '2,4', NULL), + (1493, 'summer_chair*3', 'Black Deck Chair', 'Rest from castle building!', 1251, 1, 1, 0.99, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '2,4', NULL), + (1494, 'summer_chair*4', 'White Deck Chair', 'Sit back and enjoy!', 1252, 1, 1, 0.99, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1495, 'summer_chair*5', 'Deck Chair', 'Beige', 1253, 1, 1, 0.99, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '2,4', NULL), + (1496, 'summer_chair*6', 'Deck Chair', 'Blue', 1254, 1, 1, 0.99, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '2,4', NULL), + (1497, 'summer_chair*7', 'Green Deck Chair', 'Reserved!', 1255, 1, 1, 0.99, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '2,4', NULL), + (1498, 'summer_chair*8', 'Yellow Deck Chair', 'Got your sun cream?', 1256, 1, 1, 0.99, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '2,4', NULL), + (1499, 'summer_chair*9', 'Red Deck Chair', 'Got your sunglasses?', 1257, 1, 1, 0.99, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '2,4', NULL), + (1500, 'summer_grill*1', 'Blue Barbeque Grill', 'Plenty of ribs on that barbie', 1258, 2, 1, 0, '2', 'solid', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1501, 'summer_grill*2', 'Red Barbeque Grill', 'Plenty of shrimp on that barbie', 1259, 2, 1, 0, '2', 'solid', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1502, 'summer_grill*3', 'Green Barbeque Grill', 'Plenty of steak on that barbie', 1260, 2, 1, 0, '2', 'solid', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1503, 'summer_grill*4', 'Green Barbeque Grill', 'Plenty of burgers on that barbie', 1261, 2, 1, 0, '2', 'solid', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1504, 'summer_pool*1', 'Blue Summer Pool', 'Fancy a dip?', 1110, 2, 2, 0, '0', 'can_stand_on_top,can_stack_on_top', 'default', 1, 1, '', -1, '0', NULL), + (1505, 'summer_pool*2', 'Red Summer Pool', 'Fancy a dip?', 1111, 2, 2, 0, '0', 'can_stand_on_top,can_stack_on_top', 'default', 1, 1, '', -1, '0', NULL), + (1506, 'summer_pool*3', 'Green Summer Pool', 'Fancy a dip?', 1112, 2, 2, 0, '0', 'can_stand_on_top,can_stack_on_top', 'default', 1, 1, '', -1, '0', NULL), + (1507, 'summer_pool*4', 'Yellow Summer Pool', 'Fancy a dip?', 1113, 2, 2, 0, '0', 'can_stand_on_top,can_stack_on_top', 'default', 1, 1, '', -1, '0', NULL), + (1508, 'sand_cstl_gate', 'Sand Castle Gate', 'Keep the sand out!', 1246, 2, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2', NULL), + (1509, 'sand_cstl_twr', 'Sand Castle Tower', 'Look out for sand storms!', 1247, 1, 1, 0, '0', 'solid', 'default', 1, 1, '', -1, '0,2', NULL), + (1510, 'sand_cstl_wall', 'Sand Castle Wall', 'Not entirely water proof!', 1248, 2, 1, 0, '0', 'solid', 'default', 1, 1, '', -1, '0,2', NULL), + (1511, 'bw_croc', 'Inflatable Croc', 'Never smile at a Crocodile.', 1305, 1, 3, 0, '2', 'solid', 'default', 1, 1, '', -1, '0,2', NULL), + (1512, 'summer_icebox', 'Ice Box', 'Chilled surprises', 3231, 1, 1, 0, '2', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '43', -1, '2,4', NULL), + (1513, 'summer_raft1', 'Pink Raft', 'Float down a lazy river.', 3228, 1, 1, 1, '2', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1514, 'summer_raft2', 'Blue Raft', 'Float down a lazy river.', 3227, 1, 1, 1, '2', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1515, 'dimmer_buttn', 'Small Mood Switch', 'Set the right MOOD!!!', 11206, 1, 1, 0, '2', 'wall_item,roomdimmer,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1516, 'dimmer_fuse2', 'Small Mood Controller', 'Set the right MOOD!!!', 11207, 1, 1, 0, '2', 'wall_item,roomdimmer,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1517, 'dimmer_fuse6', 'Large Mood Controller', 'Set the right MOOD!', 11208, 1, 1, 0, '2', 'wall_item,roomdimmer,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1518, 'dimmer_swtch', 'Large Mood Switch', 'Set the right MOOD!', 11205, 1, 1, 0, '2', 'wall_item,roomdimmer,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1519, 'ads_1800tele', 'ads_1800tele', '', 3251, 1, 1, 0, '3', 'solid,requires_touching_for_interaction,custom_data_true_false,teleporter', 'teleport', 1, 1, '', -1, '2,4', NULL), + (1520, 'ads_campguitar', 'Red V Guitar', 'Awarded to some Camp Rock entrants', 11114, -1, -1, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1521, 'ads_chups', 'ads_chups name', 'ads_chups desc', 3367, 1, 1, 0, '2', 'solid', 'default', 1, 1, '', -1, '0', NULL), + (1522, 'ads_cmusic', 'TBD Central Musical TV', 'TBD Click it away', 1466, -1, -1, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1523, 'ads_dave_cns', 'Dave cns', 'ads Dave cns', 1365, 1, 1, 0, '0', 'solid', 'default', 1, 1, '', -1, '0,2', NULL), + (1524, 'ads_dave_wall', 'Dave Wall', 'ads dave wall', 1366, -1, -1, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1525, 'ads_droetker_paula', 'ads_droetker_paula name', 'ads_droetker_paula desc', 3365, 1, 1, 0, '2', 'solid', 'default', 1, 1, '', -1, '2,4', NULL), + (1526, 'ads_goldtabl', 'The Golden Tablet', 'What every Museum resident craves', 3151, 1, 1, 0, '0', 'solid', 'default', 1, 1, '', -1, '0,2', NULL), + (1527, 'ads_grefusa_cactus', 'Grefusa Cactus', 'Grefusa Cactus promotion', 10001, 1, 1, 0, '0', 'solid', 'default', 1, 1, '', -1, '0', NULL), + (1528, 'ads_gsArcade_1', 'Arcade Machine', 'Game over', 2985, 1, 1, 0, '2', 'solid', 'default', 1, 1, '', -1, '2,4', NULL), + (1529, 'ads_gsArcade_2', 'Arcade Cabinet', 'Must...get....high....score!', 3278, 1, 1, 0, '2', 'solid', 'default', 1, 1, '', -1, '2,4', NULL), + (1530, 'ads_lin_wh_c', 'ads_lin_wh_c name', 'ads_lin_wh_c text', 11079, -1, -1, 0, '33', 'wall_item,wheel_of_fortune,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1531, 'ads_mirror', 'Dress Up Mirror', 'Look the part!', 4122, -1, -1, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1532, 'ads_nokia_logo', 'Nokia Phone', 'Connecting People', 1388, -1, -1, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1533, 'ads_nokia_phone', 'ads_nokia_phone name', 'ads_nokia_phone desc', 1389, -1, -1, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1534, 'ads_oc_soda', 'Orange Soda Machine', 'Who loves Orange Soda?!', 3230, 1, 1, 0, '0', 'solid', 'default', 1, 1, '', -1, '2,4', NULL), + (1535, 'ads_oc_soda_cmp', 'Orange Soda Machine', 'Who loves Orange Soda?!', 432233, 1, 1, 0, '0', 'solid', 'default', 1, 1, '', -1, '2,4', NULL), + (1536, 'ads_percyw', 'ads_percyw name', 'ads_percyw desc', 4322, -1, -1, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1537, 'ads_puffet_tv', 'ads_puffet_tv name', 'ads_puffet_tv text', 11081, -1, -1, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1538, 'ads_reebok_block2', 'ads_reebok_block2', '', 3132, 2, 2, 0, '0', 'solid', 'default', 1, 1, '', -1, '0,2', NULL), + (1539, 'ads_reebok_block2cmp', 'ads_reebok_block2cmp', '', 313222, 2, 2, 0, '0', 'solid', 'default', 1, 1, '', -1, '0,2', NULL), + (1540, 'ads_reebok_tv', 'ads_reebok_tv name', 'ads_reebok_tv text', 11082, -1, -1, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1541, 'ads_spang_sleep', 'ads_spang_sleep', 'ads_spang_sleep text', 3280, 1, 3, 0, '0', 'solid', 'default', 1, 1, '', -1, '0,2', NULL), + (1542, 'ads_sunnyd', 'Sunny Delight', 'Sunny Delight', 1346, -1, -1, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1543, 'ads_veet', 'ads_veet name', 'ads_veet desc', 4222, -1, -1, 0, '5', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1544, 'ads_wwe_poster', 'WWE', 'Bigger, Badder, Better', 4226, -1, -1, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1545, 'det_bhole', 'Bullet Hole', 'That was close!', 1402, 1, 1, 0, '3', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1546, 'det_body', 'Chalk Outline', 'They were a great Habbo...', 1400, 1, 1, 0, '0', 'can_stand_on_top,can_stack_on_top', 'default', 1, 1, '', -1, '0,2', NULL), + (1547, 'det_divider', 'Police Divider', 'Crime scene, stay out!', 1401, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2', NULL), + (1548, 'easy_bowl2', 'Easy bowl2', 'old campaign product desc', 1385, 1, 1, 0, '0', 'solid', 'default', 1, 1, '', -1, '0', NULL), + (1549, 'easy_carpet', 'Easy carpet', 'Easy carpet', 1386, 1, 1, 0, '0', 'can_stack_on_top,can_stand_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1550, 'easy_poster', 'Easy poster', 'Easy mac promotion', 1387, 1, 1, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1551, 'md_can', 'Bubble Juice Can', 'Enough bubbling juice for one evening', 1276, 1, 1, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1552, 'md_logo_wall', 'Bubble Juice Logo', 'Bubble up your wall', 1277, 1, 1, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1553, 'md_rug', 'Bubble Juice Floor', 'Bubbles under your steps', 1278, 1, 1, 0, '0', 'can_stack_on_top,can_stand_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1554, 'netari_carpet', 'Netari carpet', 'Netari branded skull', 11116, 1, 1, 0, '0', 'can_stack_on_top,can_stand_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1555, 'netari_poster', 'Netari poster', 'Netari promotion', 11117, 1, 1, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1556, 'nouvelle_trax', 'Nouvelle Trax', '', 1275, 1, 1, 0, '2', 'solid', 'default', 1, 1, '', -1, '2,4', NULL), + (1557, 'safe_silo_pb', 'postbank Safe', 'Totally shatter-proof!', 1222, 1, 1, 0, '2', 'solid', 'default', 1, 1, '', -1, '2,4', NULL), + (1558, 'tampax_rug', 'Tampax rug', 'Tampax rug', 1290, 1, 1, 0, '0', 'can_stack_on_top,can_stand_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1559, 'tampax_wall', 'Tampax wall', 'Tampax wall', 1289, 1, 1, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1560, 'window_hole', 'Window', 'Window', 1390, 1, 1, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1561, 'ads_lin_wh_c2', 'ads_lin_wh_c2 name', 'ads_lin_wh_c2 text', 11279, -1, -1, 0, '33', 'wall_item,wheel_of_fortune,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1562, 'footylamp_campaign_ing', 'ING Trophy', 'We are the champions', 45598, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1563, 'byesw_loadscreen', 'Loading screen memorial', 'The old Habbo loading screen.', 4267, 0, 0, 0, '3', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1564, 'byesw_hotel', 'Hotel view memorial', '3 different miniature Hotels.', 3289, 1, 1, 0, '6', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1565, 'byesw_hand', 'Big Hand seat memorial', 'We\'ll miss you Big Hand!', 3291, 1, 1, 1.3, '2', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1566, 'queue_tile1', 'White Quest Roller', 'The power of movement', 465, 1, 1, 0.45, '3', 'can_stand_on_top,can_stack_on_top,roller', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1567, 'queue_tile1*1', 'Pink Habbo Roller', 'The power of movement', 466, 1, 1, 0.45, '3', 'can_stand_on_top,can_stack_on_top,roller', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1568, 'queue_tile1*3', 'Aqua Habbo Roller', 'The power of movement', 468, 1, 1, 0.45, '3', 'can_stand_on_top,can_stack_on_top,roller', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1569, 'queue_tile1*4', 'Gold Habbo Roller', 'The power of movement', 469, 1, 1, 0.45, '3', 'can_stand_on_top,can_stack_on_top,roller', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1570, 'queue_tile1*5', 'Black Habbo Roller', 'The power of movement', 470, 1, 1, 0.45, '3', 'can_stand_on_top,can_stack_on_top,roller', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1571, 'guitar_v', 'V Guitar', '', 565, 1, 1, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1572, 'guitar_skull', 'Skull Guitar', '', 566, 1, 1, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1573, 'diner_shaker', 'Diner Shaker', 'So cool it\'s shaking!', 1329, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1574, 'diner_rug', 'Diner Floor', 'Shiny polished finish', 1332, 2, 2, 0, '0', 'can_stack_on_top,can_stand_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1575, 'diner_tray_0', 'Empty Plate', 'Had your fill, or running on empty?', 1337, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1576, 'diner_tray_1', 'Burger and Chips', '99% British beef!', 1338, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1577, 'diner_tray_2', 'Steak and Mash', 'Juicy sirloin with onion gravy', 1339, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1578, 'diner_tray_3', 'Spaghetti Meatballs', 'Juicy tomato sauce included!', 1340, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1579, 'diner_tray_4', 'Pancakes', 'Smothered in syrup and butter!', 1341, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1580, 'diner_tray_5', 'Bacon and Eggs', 'Smoky bacon and free range eggs!', 1342, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1581, 'diner_tray_6', 'Ice Cream Sundae', 'Vanilla, chocolate and strawberry!', 1343, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1582, 'diner_tray_7', 'Accompaniments', 'Tommy and Mustard', 1344, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1583, 'window_diner', 'Large Diner Window', 'Panoramic view of America', 1358, 0, 0, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1584, 'window_diner2', 'Small Diner Window', 'Good grub, good view!', 1359, 0, 0, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1585, 'diner_walltable', 'Diner Side Table', 'Attaches to the wall', 1367, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1586, 'diner_bardesk_gate*1', 'Aquamarine Gate', 'Smothered in syrup and butter!', 2842, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2', NULL), + (1587, 'diner_bardesk_gate*2', 'Pink Gate', 'Smothered in syrup and butter!', 2843, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2', NULL), + (1588, 'diner_bardesk_gate*3', 'Black Gate', 'Smothered in syrup and butter!', 2844, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2', NULL), + (1589, 'diner_bardesk_gate*4', 'White Gate', 'Smothered in syrup and butter!', 2845, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1590, 'diner_bardesk_gate*5', 'Beige Gate', 'Smothered in syrup and butter!', 2846, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2', NULL), + (1591, 'diner_bardesk_gate*6', 'Blue Gate', 'Smothered in syrup and butter!', 2847, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2', NULL), + (1592, 'diner_bardesk_gate*7', 'Green Gate', 'Smothered in syrup and butter!', 2848, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2', NULL), + (1593, 'diner_bardesk_gate*8', 'Yellow Gate', 'Smothered in syrup and butter!', 2849, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2', NULL), + (1594, 'diner_bardesk_gate*9', 'Red Gate', 'Smothered in syrup and butter!', 2850, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2', NULL), + (1595, 'diner_bardesk_gate*10', 'Mint Gate', 'Smothered in syrup and butter!', 5109, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,2', NULL), + (1596, 'diner_bardesk*1', 'Aquamarine Bar', 'Pull up a stool.', 2851, 1, 1, 0.98, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1597, 'diner_bardesk*2', 'Pink Bar', 'Pull up a stool.', 2852, 1, 1, 0.98, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1598, 'diner_bardesk*3', 'Black Bar', 'Pull up a stool.', 2853, 1, 1, 0.98, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1599, 'diner_bardesk*4', 'White Bar', 'Pull up a stool.', 2854, 1, 1, 0.98, '2', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1600, 'diner_bardesk*5', 'Beige Bar', 'Pull up a stool.', 2855, 1, 1, 0.98, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1601, 'diner_bardesk*6', 'Blue Bar', 'Pull up a stool.', 2856, 1, 1, 0.98, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1602, 'diner_bardesk*7', 'Green Bar', 'Pull up a stool.', 2857, 1, 1, 0.98, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1603, 'diner_bardesk*8', 'Yellow Bar', 'Pull up a stool.', 2858, 1, 1, 0.98, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1604, 'diner_bardesk*9', 'Red Bar', 'Pull up a stool.', 2859, 1, 1, 0.98, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1605, 'diner_bardesk*10', 'Mint Bar', 'Pull up a stool.', 5111, 1, 1, 0.98, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1606, 'diner_bardesk_corner*1', 'Aquamarine Corner', 'Now that\'s smooth.', 2870, 1, 1, 0.98, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1607, 'diner_bardesk_corner*2', 'Pink Corner', 'Now that\'s smooth.', 2871, 1, 1, 0.98, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1608, 'diner_bardesk_corner*3', 'Black Corner', 'Now that\'s smooth.', 2872, 1, 1, 0.98, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1609, 'diner_bardesk_corner*4', 'White Corner', 'Now that\'s smooth.', 2873, 1, 1, 0.98, '2', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1610, 'diner_bardesk_corner*5', 'Beige Corner', 'Now that\'s smooth.', 2874, 1, 1, 0.98, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1611, 'diner_bardesk_corner*6', 'Blue Corner', 'Now that\'s smooth.', 2875, 1, 1, 0.98, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1612, 'diner_bardesk_corner*7', 'Green Corner', 'Now that\'s smooth.', 2876, 1, 1, 0.98, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1613, 'diner_bardesk_corner*8', 'Yellow Corner', 'Now that\'s smooth.', 2877, 1, 1, 0.98, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1614, 'diner_bardesk_corner*9', 'Red Corner', 'Now that\'s smooth.', 2878, 1, 1, 0.98, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1615, 'diner_bardesk_corner*10', 'Mint Corner', 'Now that\'s smooth.', 5108, 1, 1, 0.98, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1616, 'diner_cashreg*1', 'Aquamarine Register', 'Roll up roll up!', 2816, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1617, 'diner_cashreg*2', 'Pink Register', 'Roll up roll up!', 2817, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1618, 'diner_cashreg*3', 'Black Register', 'Roll up roll up!', 2818, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1619, 'diner_cashreg*4', 'White Register', 'Roll up roll up!', 2819, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1620, 'diner_cashreg*5', 'Beige Register', 'Roll up roll up!', 2820, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1621, 'diner_cashreg*6', 'Blue Register', 'Roll up roll up!', 2821, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1622, 'diner_cashreg*7', 'Green Register', 'Roll up roll up!', 2822, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1623, 'diner_cashreg*8', 'Yellow Register', 'Roll up roll up!', 2823, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1624, 'diner_cashreg*9', 'Red Register', 'Roll up roll up!', 2824, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1625, 'diner_cashreg*10', 'Mint Register', 'Roll up roll up!', 5117, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1626, 'diner_chair*1', 'Aquamarine Stool', 'Perch in comfort.', 2861, 1, 1, 1.5, '0', 'can_sit_on_top,requires_rights_for_interaction', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1627, 'diner_chair*2', 'Pink Stool', 'Perch in comfort.', 2862, 1, 1, 1.5, '0', 'can_sit_on_top,requires_rights_for_interaction', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1628, 'diner_chair*3', 'Black Stool', 'Perch in comfort.', 2863, 1, 1, 1.5, '0', 'can_sit_on_top,requires_rights_for_interaction', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1629, 'diner_chair*4', 'White Stool', 'Perch in comfort.', 2864, 1, 1, 1.5, '2', 'can_sit_on_top,requires_rights_for_interaction', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1630, 'diner_chair*5', 'Beige Stool', 'Perch in comfort.', 2865, 1, 1, 1.5, '0', 'can_sit_on_top,requires_rights_for_interaction', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1631, 'diner_chair*6', 'Blue Stool', 'Perch in comfort.', 2866, 1, 1, 1.5, '0', 'can_sit_on_top,requires_rights_for_interaction', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1632, 'diner_chair*7', 'Green Stool', 'Perch in comfort.', 2867, 1, 1, 1.5, '0', 'can_sit_on_top,requires_rights_for_interaction', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1633, 'diner_chair*8', 'Yellow Stool', 'Perch in comfort.', 2868, 1, 1, 1.5, '0', 'can_sit_on_top,requires_rights_for_interaction', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1634, 'diner_chair*9', 'Red Stool', 'Perch in comfort.', 2869, 1, 1, 1.5, '0', 'can_sit_on_top,requires_rights_for_interaction', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1635, 'diner_chair*10', 'Mint Stool', 'Perch in comfort.', 5116, 1, 1, 1.5, '0', 'can_sit_on_top,requires_rights_for_interaction', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1636, 'diner_gumvendor*1', 'Aquamarine Gum Machine', 'A chewy mouthful.', 2827, 1, 1, 0, '0', 'solid', 'vending_machine', 1, 1, '67,68,69', -1, '0,2', NULL), + (1637, 'diner_gumvendor*2', 'Pink Gum Machine', 'A chewy mouthful.', 2828, 1, 1, 0, '0', 'solid', 'vending_machine', 1, 1, '67,68,69', -1, '0,2', NULL), + (1638, 'diner_gumvendor*3', 'Black Gum Machine', 'A chewy mouthful.', 2829, 1, 1, 0, '0', 'solid', 'vending_machine', 1, 1, '67,68,69', -1, '0,2', NULL), + (1639, 'diner_gumvendor*4', 'White Gum Machine', 'A chewy mouthful.', 2830, 1, 1, 0, '2', 'solid', 'vending_machine', 1, 1, '67,68,69', -1, '0,2,4,6', NULL), + (1640, 'diner_gumvendor*5', 'Beige Gum Machine', 'A chewy mouthful.', 2831, 1, 1, 0, '0', 'solid', 'vending_machine', 1, 1, '67,68,69', -1, '0,2', NULL), + (1641, 'diner_gumvendor*6', 'Blue Gum Machine', 'A chewy mouthful.', 2832, 1, 1, 0, '0', 'solid', 'vending_machine', 1, 1, '67,68,69', -1, '0,2', NULL), + (1642, 'diner_gumvendor*7', 'Green Gum Machine', 'A chewy mouthful.', 2833, 1, 1, 0, '0', 'solid', 'vending_machine', 1, 1, '67,68,69', -1, '0,2', NULL), + (1643, 'diner_gumvendor*8', 'Yellow Gum Machine', 'A chewy mouthful.', 2834, 1, 1, 0, '0', 'solid', 'vending_machine', 1, 1, '67,68,69', -1, '0,2', NULL), + (1644, 'diner_gumvendor*9', 'Red Gum Machine', 'A chewy mouthful.', 2835, 1, 1, 0, '0', 'solid', 'vending_machine', 1, 1, '67,68,69', -1, '0,2', NULL), + (1645, 'diner_gumvendor*10', 'Mint Gum Machine', 'A chewy mouthful.', 5113, 1, 1, 0, '0', 'solid', 'vending_machine', 1, 1, '67,68,69', -1, '0,2', NULL), + (1646, 'diner_sofa_1*1', 'Aquamarine Sofa 1', 'Soft leather in 50s design.', 2888, 1, 1, 1, '0', 'can_sit_on_top,requires_rights_for_interaction', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1647, 'diner_sofa_1*2', 'Pink Sofa 1', 'Soft leather in 50s design.', 2889, 1, 1, 1, '0', 'can_sit_on_top,requires_rights_for_interaction', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1648, 'diner_sofa_1*3', 'Black Sofa 1', 'Soft leather in 50s design.', 2890, 1, 1, 1, '0', 'can_sit_on_top,requires_rights_for_interaction', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1649, 'diner_sofa_1*4', 'White Sofa 1', 'Soft leather in 50s design.', 2891, 1, 1, 1, '2', 'can_sit_on_top,requires_rights_for_interaction', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1650, 'diner_sofa_1*5', 'Beige Sofa 1', 'Soft leather in 50s design.', 2892, 1, 1, 1, '0', 'can_sit_on_top,requires_rights_for_interaction', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1651, 'diner_sofa_1*6', 'Blue Sofa 1', 'Soft leather in 50s design.', 2893, 1, 1, 1, '0', 'can_sit_on_top,requires_rights_for_interaction', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1652, 'diner_sofa_1*7', 'Green Sofa 1', 'Soft leather in 50s design.', 2894, 1, 1, 1, '0', 'can_sit_on_top,requires_rights_for_interaction', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1653, 'diner_sofa_1*8', 'Yellow Sofa 1', 'Soft leather in 50s design.', 2895, 1, 1, 1, '0', 'can_sit_on_top,requires_rights_for_interaction', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1654, 'diner_sofa_1*9', 'Red Sofa 1', 'Soft leather in 50s design.', 2896, 1, 1, 1, '0', 'can_sit_on_top,requires_rights_for_interaction', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1655, 'diner_sofa_1*10', 'Mint Sofa 1', 'Soft leather in 50s design.', 5110, 1, 1, 1, '0', 'can_sit_on_top,requires_rights_for_interaction', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1656, 'diner_sofa_2*1', 'Aquamarine Sofa 2', 'Soft leather in 50s design.', 2804, 1, 1, 1, '0', 'can_sit_on_top,requires_rights_for_interaction', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1657, 'diner_sofa_2*2', 'Pink Sofa 2', 'Soft leather in 50s design.', 2805, 1, 1, 1, '0', 'can_sit_on_top,requires_rights_for_interaction', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1658, 'diner_sofa_2*3', 'Black Sofa 2', 'Soft leather in 50s design.', 2806, 1, 1, 1, '0', 'can_sit_on_top,requires_rights_for_interaction', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1659, 'diner_sofa_2*4', 'White Sofa 2', 'Soft leather in 50s design.', 2807, 1, 1, 1, '2', 'can_sit_on_top,requires_rights_for_interaction', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1660, 'diner_sofa_2*5', 'Beige Sofa 2', 'Soft leather in 50s design.', 2808, 1, 1, 1, '0', 'can_sit_on_top,requires_rights_for_interaction', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1661, 'diner_sofa_2*6', 'Blue Sofa 2', 'Soft leather in 50s design.', 2809, 1, 1, 1, '0', 'can_sit_on_top,requires_rights_for_interaction', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1662, 'diner_sofa_2*7', 'Green Sofa 2', 'Soft leather in 50s design.', 2810, 1, 1, 1, '0', 'can_sit_on_top,requires_rights_for_interaction', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1663, 'diner_sofa_2*8', 'Yellow Sofa 2', 'Soft leather in 50s design.', 2811, 1, 1, 1, '0', 'can_sit_on_top,requires_rights_for_interaction', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1664, 'diner_sofa_2*9', 'Red Sofa 2', 'Soft leather in 50s design.', 2812, 1, 1, 1, '0', 'can_sit_on_top,requires_rights_for_interaction', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1665, 'diner_sofa_2*10', 'Mint Sofa 2', 'Soft leather in 50s design.', 5114, 1, 1, 1, '0', 'can_sit_on_top,requires_rights_for_interaction', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1666, 'diner_table_1*1', 'Aquamarine Booth Table', 'Ready to order?', 2897, 2, 2, 1.7, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1667, 'diner_table_1*2', 'Pink Booth Table', 'Ready to order?', 2898, 2, 2, 1.7, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1668, 'diner_table_1*3', 'Black Booth Table', 'Ready to order?', 2899, 2, 2, 1.7, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1669, 'diner_table_1*4', 'White Booth Table', 'Ready to order?', 2900, 2, 2, 1.7, '2', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1670, 'diner_table_1*5', 'Beige Booth Table', 'Ready to order?', 2901, 2, 2, 1.7, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1671, 'diner_table_1*6', 'Blue Booth Table', 'Ready to order?', 2902, 2, 2, 1.7, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1672, 'diner_table_1*7', 'Green Booth Table', 'Ready to order?', 2903, 2, 2, 1.7, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1673, 'diner_table_1*8', 'Yellow Booth Table', 'Ready to order?', 2904, 2, 2, 1.7, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1674, 'diner_table_1*9', 'Red Booth Table', 'Ready to order?', 2905, 2, 2, 1.7, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1675, 'diner_table_1*10', 'Mint Booth Table', 'Ready to order?', 5112, 2, 2, 1.7, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1676, 'diner_table_2*1', 'Aquamarine Table', 'Enjoy your meal.', 2879, 3, 2, 1.5, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1677, 'diner_table_2*2', 'Pink Table', 'Enjoy your meal.', 2880, 3, 2, 1.5, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1678, 'diner_table_2*3', 'Black Table', 'Enjoy your meal.', 2881, 3, 2, 1.5, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1679, 'diner_table_2*4', 'White Table', 'Enjoy your meal.', 2882, 3, 2, 1.5, '2', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1680, 'diner_table_2*5', 'Beige Table', 'Enjoy your meal.', 2883, 3, 2, 1.5, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1681, 'diner_table_2*6', 'Blue Table', 'Enjoy your meal.', 2884, 3, 2, 1.5, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1682, 'diner_table_2*7', 'Green Table', 'Enjoy your meal.', 2885, 3, 2, 1.5, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1683, 'diner_table_2*8', 'Yellow Table', 'Enjoy your meal.', 2886, 3, 2, 1.5, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1684, 'diner_table_2*9', 'Red Table', 'Enjoy your meal.', 2887, 3, 2, 1.5, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1685, 'diner_table_2*10', 'Mint Table', 'Enjoy your meal.', 5115, 3, 2, 1.5, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1686, 'diner_poster', 'Diner Poster', 'Have a diner!', 11155, 0, 0, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1687, 'sleepingbag*1', 'Red Sleeping Bag', 'Ultimate coziness', 1150, 1, 3, 0.8, '0', 'can_lay_on_top', 'bed', 1, 1, '', -1, '0,2', NULL), + (1688, 'sleepingbag*2', 'Lime Sleeping Bag', 'Ultimate coziness', 9900, 1, 3, 0.8, '0', 'can_lay_on_top', 'bed', 1, 1, '', -1, '0,2', NULL), + (1689, 'sleepingbag*3', 'Ocean Sleeping Bag', 'Ultimate coziness', 9901, 1, 3, 0.8, '0', 'can_lay_on_top', 'bed', 1, 1, '', -1, '0,2', NULL), + (1690, 'sleepingbag*4', 'Safety Sleeping Bag', 'Ultimate coziness in SafeSid\'s sleeping bag!', 9902, 1, 3, 0.8, '0', 'can_lay_on_top', 'bed', 1, 1, '', -1, '0,2', NULL), + (1691, 'sleepingbag*5', 'Graphite Sleeping Bag', 'Ultimate coziness', 9903, 1, 3, 0.8, '0', 'can_lay_on_top', 'bed', 1, 1, '', -1, '0,2', NULL), + (1692, 'sleepingbag*6', 'Purple Sleeping Bag', 'Ultimate coziness', 9905, 1, 3, 0.8, '0', 'can_lay_on_top', 'bed', 1, 1, '', -1, '0,2', NULL), + (1693, 'sleepingbag*7', 'Orange Sleeping Bag', 'Ultimate coziness', 9990, 1, 3, 0.8, '0', 'can_lay_on_top', 'bed', 1, 1, '', -1, '0,2', NULL), + (1694, 'sleepingbag*8', 'Golden Sleeping Bag', 'Ultimate coziness for SnowStorm winners', 9906, 1, 3, 0.8, '0', 'can_lay_on_top', 'bed', 1, 1, '', -1, '0,2', NULL), + (1695, 'sleepingbag*9', 'eXceptional Sleeping Bag', 'For eXceptional comfort!', 9907, 1, 3, 0.8, '0', 'can_lay_on_top', 'bed', 1, 1, '', -1, '0,2', NULL), + (1696, 'pillar*1', 'Pink Marble Pillar', 'Ancient and stately', 1081, 1, 1, 3.5, '0', 'can_stack_on_top,solid', 'default', 1, 1, '', -1, '0', NULL), + (1697, 'pillar*2', 'Nordic Pillar', 'Ancient and stately', 1082, 1, 1, 3.5, '0', 'can_stack_on_top,solid', 'default', 1, 1, '', -1, '0', NULL), + (1698, 'pillar*3', 'blue pillar', 'Ancient and stately', 1083, 1, 1, 3.5, '0', 'can_stack_on_top,solid', 'default', 1, 1, '', -1, '0', NULL), + (1699, 'pillar*4', 'Dark Ages Pillar', 'From the time of the Kick Warz', 1084, 1, 1, 3.5, '0', 'can_stack_on_top,solid', 'default', 1, 1, '', -1, '0', NULL), + (1700, 'pillar*5', 'Pagan Pillar', 'Find your natural roots', 1085, 1, 1, 3.5, '0', 'can_stack_on_top,solid', 'default', 1, 1, '', -1, '0', NULL), + (1701, 'pillar*6', 'Terracotta Pillar', 'Ancient and stately', 1086, 1, 1, 3.5, '0', 'can_stack_on_top,solid', 'default', 1, 1, '', -1, '0', NULL), + (1702, 'pillar*7', 'Atlantean Pillar', 'Recovered from Habblantis', 1087, 1, 1, 3.5, '0', 'can_stack_on_top,solid', 'default', 1, 1, '', -1, '0', NULL), + (1703, 'pillar*8', 'Roman Pillar', 'All roads lead to Rome', 1088, 1, 1, 3.5, '0', 'can_stack_on_top,solid', 'default', 1, 1, '', -1, '0', NULL), + (1704, 'pillar*9', 'Rock Pillar', 'Ancient and stately', 1089, 1, 1, 3.5, '0', 'can_stack_on_top,solid', 'default', 1, 1, '', -1, '0', NULL), + (1705, 'penguin_ballet', 'Ballerina Penguin', 'Aptenodytes Vaganova', 1820, 1, 1, 0, '0', 'solid', 'default', 0, 1, '', -1, '2,4', NULL), + (1706, 'penguin_basic', 'Emperor Penguin', 'Aptenodytes Forsteri', 1821, 1, 1, 0, '0', 'solid', 'default', 0, 1, '', -1, '2,4', NULL), + (1707, 'penguin_boxer', 'Boxer Penguin', 'Aptenodytes Ali', 1822, 1, 1, 0, '0', 'solid', 'default', 0, 1, '', -1, '2,4', NULL), + (1708, 'penguin_bunny', 'Bunny Penguin', 'Aptenodytes Euripides', 1823, 1, 1, 0, '0', 'solid', 'default', 0, 1, '', -1, '2,4', NULL), + (1709, 'penguin_clown', 'Clown Penguin', 'Aptenodytes Pennywise', 1824, 1, 1, 0, '0', 'solid', 'default', 0, 1, '', -1, '2,4', NULL), + (1710, 'penguin_elf', 'Christmas Penguin', 'Aptenodytes Jolly', 1826, 1, 1, 0, '0', 'solid', 'default', 0, 1, '', -1, '2,4', NULL), + (1711, 'penguin_glow', 'Fluorescent Penguin', 'Aptenodytes Gamma', 1827, 1, 1, 0, '0', 'solid', 'default', 0, 1, '', -1, '2,4', NULL), + (1712, 'penguin_hunchback', 'Beautiful Penguin', 'Aptenodytes Narcissus', 1828, 1, 1, 0, '0', 'solid', 'default', 0, 1, '', -1, '2,4', NULL), + (1713, 'penguin_icehockey', 'Hockey Penguin', 'Aptenodytes Gretzsky', 1829, 1, 1, 0, '0', 'solid', 'default', 0, 1, '', -1, '2,4', NULL), + (1714, 'penguin_infected', 'Infected Penguin', 'Aptenodytes Bacterium', 1830, 1, 1, 0, '0', 'solid', 'default', 0, 1, '', -1, '2,4', NULL), + (1715, 'penguin_magician', 'Magic Penguin', 'Aptenodytes Houdini', 1831, 1, 1, 0, '0', 'solid', 'default', 0, 1, '', -1, '2,4', NULL), + (1716, 'penguin_musketeer', 'Musketeer Penguin', 'Aptenodytes Aramis', 1832, 1, 1, 0, '0', 'solid', 'default', 0, 1, '', -1, '2,4', NULL), + (1717, 'penguin_ninja', 'Ninja Penguin', 'Aptenodytes Hamburger', 1833, 1, 1, 0, '0', 'solid', 'default', 0, 1, '', -1, '2,4', NULL), + (1718, 'penguin_pilot', 'Pilot Penguin', 'Aptenodytes Biggles', 1834, 1, 1, 0, '0', 'solid', 'default', 0, 1, '', -1, '2,4', NULL), + (1719, 'penguin_pirate', 'Pirate Penguin', 'Aptenodytes Silver', 1835, 1, 1, 0, '0', 'solid', 'default', 0, 1, '', -1, '2,4', NULL), + (1720, 'penguin_punk', 'Punk Penguin', 'Aptenodytes Rotter', 1836, 1, 1, 0, '0', 'solid', 'default', 0, 1, '', -1, '2,4', NULL), + (1721, 'penguin_robot', 'Robot Penguin', 'Aptenodytes Asimov', 1837, 1, 1, 0, '0', 'solid', 'default', 0, 1, '', -1, '2,4', NULL), + (1722, 'penguin_rock', 'Disco Penguin', 'Aptenodytes Foxy', 1838, 1, 1, 0, '0', 'solid', 'default', 0, 1, '', -1, '2,4', NULL), + (1723, 'penguin_skater', 'Skater Penguin', 'Aptenodytes Arto', 1839, 1, 1, 0, '0', 'solid', 'default', 0, 1, '', -1, '2,4', NULL), + (1724, 'penguin_ski', 'XC Penguin', 'Aptenodytes Swish', 1840, 1, 1, 0, '0', 'solid', 'default', 0, 1, '', -1, '2,4', NULL), + (1725, 'penguin_suit', 'Executive Penguin', 'Aptenodytes Loman', 1841, 1, 1, 0, '0', 'solid', 'default', 0, 1, '', -1, '2,4', NULL), + (1726, 'penguin_sumo', 'Sumo Penguin', 'Aptenodytes Musashimaru', 1842, 1, 1, 0, '0', 'solid', 'default', 0, 1, '', -1, '2,4', NULL), + (1727, 'penguin_super', 'Superhero Penguin', 'Aptenodytes Kirby', 1843, 1, 1, 0, '0', 'solid', 'default', 0, 1, '', -1, '2,4', NULL), + (1728, 'penguin_swim', 'Summer Penguin', 'Aptenodytes Buubar', 1844, 1, 1, 0, '0', 'solid', 'default', 0, 1, '', -1, '2,4', NULL), + (1729, 'penguin_wrestler', 'Luchador Penguin', 'Aptenodytes Mysterioso', 1845, 1, 1, 0, '0', 'solid', 'default', 0, 1, '', -1, '2,4', NULL), + (1730, 'penguin_cowboy', 'Cowboy Penguin', 'Aptenodytes Hickok', 1894, 1, 1, 0, '0', 'solid', 'default', 0, 1, '', -1, '2,4', NULL), + (1731, 'sandrug', 'Tropical Beach Rug', 'Your own paradise island', 1123, 1, 1, 0, '0', 'can_stand_on_top,can_stack_on_top', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1732, 'rare_moonrug', 'Moon Rug', 'Desolation rocks!', 1125, 1, 1, 0, '0', 'can_stand_on_top,can_stack_on_top', 'default', 1, 1, '', -1, '0,2', NULL), + (1733, 'tree1', 'Dead tree', 'Dead christmas tree', 635, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1734, 'tree2', 'Dead tree', 'Creates a spooky scene!', 636, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1735, 'tree3', 'Christmas Tree 1', 'Any presents under it yet?', 637, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1736, 'tree4', 'Christmas Tree 2', 'Any presents under it yet?', 638, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1737, 'tree5', 'Christmas Tree 3', 'Any presents under it yet?', 639, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1738, 'tree6', 'Flashy Christmas Tree', 'The future\'s bright!', 640, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1739, 'triplecandle', 'Electric Candles', 'No need to worry about wax drips', 641, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1740, 'turkey', 'Roast Turkey', 'Where\'s the cranberry sauce?', 642, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1741, 'house', 'Gingerbread House', 'Good enough to eat', 643, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1742, 'house2', 'Gingerbread House', 'Good enough to eat', 644, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1743, 'pudding', 'Christmas Pudding', 'Will you get the lucky sixpence?', 645, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1744, 'xmasduck', 'Christmas Rubber Duck', 'A right Christmas quacker!', 646, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1745, 'hyacinth1', 'Pink Hyacinth', 'Beautiful bulb', 647, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2', NULL), + (1746, 'hyacinth2', 'Blue Hyacinth', 'Beautiful bulb', 648, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2', NULL), + (1747, 'joulutahti', 'Poinsetta', 'Christmas in a pot', 649, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2', NULL), + (1748, 'rcandle', 'Red Candle', 'Xmas tea light', 650, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1749, 'wcandle', 'White Candle', 'Xmas tea light', 651, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1750, 'sofa_polyfon', 'Two-seater Sofa', 'Comfort for stylish couples', 337, 2, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1751, 'sofa_polyfon*2', 'Black Mode Sofa', 'Black Mode Sofa', 846, 2, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1752, 'sofa_polyfon*3', 'White Two-seater Sofa', 'Comfort for stylish couples', 853, 2, 1, 1.2, '1', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1753, 'sofa_polyfon*4', 'Beige Mode Sofa', 'Beige Mode Sofa', 860, 2, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1754, 'sofa_polyfon*6', 'Blue Mode Sofa', 'Blue Mode Sofa', 867, 2, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1755, 'sofa_polyfon*7', 'Green Two-seater Sofa', 'Comfort for stylish couples', 874, 2, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1756, 'sofa_polyfon*8', 'Yellow Mode Sofa', 'Yellow Mode Sofa', 881, 2, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1757, 'sofa_polyfon*9', 'Red Two-seater Sofa', 'Comfort for stylish couples', 888, 2, 1, 1.2, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1758, 'present_gen', 'Gift', 'What\'s inside?', 1371, 1, 1, 1, '0', 'solid,present,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1759, 'tree7', 'Snowy Christmas Tree', 'Walking in a winter wonderland!', 1215, 1, 0, 0, '0', 'solid', 'default', 1, 1, '', -1, '0', NULL), + (1760, 'christmas_poop', 'Reindeer Droppings', 'Bob?s magical fertilizer', 1211, 1, 0, 0, '0', 'can_stand_on_top', 'default', 1, 1, '', -1, '0', NULL), + (1761, 'xmas_icelamp', 'Ice Block Lantern', 'Light up the winter nights', 1219, 1, 1, 1, '2', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1762, 'plant_mazegate_snow', 'Snowy Maze Gate', 'There\'s snow way through!', 1221, 2, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '2,4', NULL), + (1763, 'plant_maze_snow', 'Snowy Maze Shrubbery', 'Labyrinths galore!', 1220, 2, 1, 0, '0', 'solid', 'default', 1, 1, '', -1, '2,4', NULL), + (1764, 'xmas_cstl_gate', 'Ice Castle Gate', 'Let that icy draft out!', 1216, 2, 1, 0, '2', 'gate,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1765, 'xmas_cstl_twr', 'Ice Castle Tower', 'All I see from up here is snow!', 1217, 1, 1, 0, '0', 'solid', 'default', 1, 1, '', -1, '0,2', NULL), + (1766, 'xmas_cstl_wall', 'Ice Castle Wall', 'Solid blocks of ice and snow', 1218, 2, 1, 0, '0', 'solid', 'default', 1, 1, '', -1, '0,2', NULL), + (1767, 'christmas_sleigh', 'Winter Sleigh', 'Ready for your Xmas cheer', 1213, 2, 2, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '2,4', NULL), + (1768, 'christmas_reindeer', 'Reindeer', 'Prancer becomes Rudolph in a click!', 1212, 1, 2, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1769, 'rclr_chair', 'Palm Chair', 'Watch out for coconuts', 463, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1770, 'rclr_garden', 'Water Garden', 'Self watering', 464, 1, 3, 0, '2', 'solid', 'default', 1, 1, '', -1, '0,2', NULL), + (1771, 'rclr_sofa', 'Polar Sofa', 'Snuggle up together', 462, 2, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1772, 'rclr_lamp', 'Moon Lamp', 'Light up your space', 1279, 1, 1, 0, '2', 'solid', 'default', 1, 1, '', -1, '0,6', NULL), + (1773, 'flag_denmark', 'The Denmark Flag', 'Wave it proudly!', 4278, 1, 1, 0, '0', 'solid,wall_item', 'default', 1, 1, '', -1, '2,4', NULL), + (1774, 'transparent_floor', 'Transparent Floor', 'Watch your step!', 3199, 2, 2, 0, '4', 'can_stand_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1775, 'ads_clcake', 'Idea Agency Super Cake', 'Have your cake and eat it with Idea', 11141, 1, 1, 0, '0', 'solid', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1776, 'ads_clcake2', 'Idea Agency Super Cake', 'Have your cake and eat it with Idea', 3139, 1, 1, 0, '0', 'solid', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1777, 'ads_cldesk', 'Idea Agency Desk', 'Work on your latest agency brief.', 1514, 2, 2, 0, '0', 'solid', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1778, 'ads_clfloor', 'Childline Rug', 'Keep your feet warm with the Idea Agency rug', 1596, 3, 5, 0, '0', 'can_stand_on_top', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1779, 'ads_cllava', 'Idea Agency Lava Lamp', 'It\'s better out than in!', 1597, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1780, 'ads_cllava2', 'Idea Agency Lava Lamp', 'It\'s better out than in!', 1598, 1, 1, 0, '2', 'solid', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1781, 'ads_cltele', 'Idea Agency Teleporter', 'Whatever your Idea, it\'s better out than in.', 1513, 1, 1, 0, '-1', 'solid,requires_touching_for_interaction,custom_data_true_false,teleporter', 'teleport', 1, 1, '', -1, '0,2,4,6', NULL), + (1782, 'ads_cltele_cmp', 'Idea Agency Teleporter', 'Whatever your Idea, it\'s better out than in.', 1599, 1, 1, 0, '-1', 'solid,requires_touching_for_interaction,custom_data_true_false,teleporter', 'teleport', 1, 1, '', -1, '0,2,4,6', NULL), + (1783, 'ads_clwall1', 'Idea Agency Plasma 1', 'ChildLine', 1515, -1, -1, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1784, 'ads_clwall2', 'Idea Agency Plasma 2', 'Welcome to the Idea Agency', 1516, -1, -1, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1785, 'ads_clwall3', 'ChildLine TV', 'Helping to raise awareness of the great advice ChildLine can offer', 10071, -1, -1, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1786, 'ads_cl_jukeb', 'Idea Agency Jukebox', 'Shake it like a polaroid picture in the Idea agency', 10050, 1, 1, 0, '2', 'solid,jukebox,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1787, 'ads_cl_jukeb_camp', 'Idea Agency Jukebox', 'Shake it like a polaroid picture in the Idea agency', 10073, 1, 1, 0, '2', 'solid,jukebox,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1788, 'ads_cl_sofa', 'Idea Agency Sofa', 'Take a load off - both your feet and mind!', 11145, 2, 1, 1, '2', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1789, 'ads_cl_sofa_cmp', 'Idea Agency Sofa', 'Take a load off - both your feet and mind!', 10072, 2, 1, 1, '2', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1790, 'sound_set_71', 'Ice cool sounds', 'Get your Winter Wonderland sounds for your Trax Machine!', 1510, 1, 1, 0, '0', 'solid', 'default', 1, 1, '', -1, '0,2', NULL), + (1791, 'ads_calip_chair', 'Calippo Chair', 'Calippo Inflatable Chair', 11174, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1792, 'ads_calip_chaircmp', 'ads_calip_chair name', 'ads_calip_chair text', 3169, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1793, 'ads_calip_fan', 'ads_calip_fan', 'ads_cali desc', 3198, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1794, 'ads_calip_fan_cmp', 'ads_calip_fan', 'ads_cali desc', 3201, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1795, 'ads_calip_lava', 'ads_calip_lava name', 'ads_calip_lava desc', 3197, 1, 1, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1796, 'ads_calip_parasol', 'ads_calip_parasol name', 'ads_calip_parasol desc', 3195, 1, 1, 0, '2', 'requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1797, 'ads_calip_parasol_cmp', 'ads_calip_parasol name', 'ads_calip_parasol desc', 3203, 1, 1, 0, '2', 'requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1798, 'ads_calip_pool', 'Calippo Pool', 'Fancy a dip?', 11153, 2, 2, 0, '0', 'can_stand_on_top', 'default', 1, 1, '', -1, '0', NULL), + (1799, 'ads_calip_pool_cmp', 'ads_calip_pool name', 'ads_calip_pool desc', 3183, 2, 2, 0, '0', 'can_stand_on_top', 'default', 1, 1, '', -1, '0', NULL), + (1800, 'ads_calip_tele', 'Calippo Teleporter', 'Get your swim outfit now!', 11152, 1, 1, 0, '3', 'solid,requires_touching_for_interaction,custom_data_true_false,teleporter', 'teleport', 1, 1, '', -1, '2,4', NULL), + (1801, 'ads_calip_telecmp', 'ads_calip_tele name', 'ads_calip_tele text', 3191, 1, 1, 0, '3', 'solid,requires_touching_for_interaction,custom_data_true_false,teleporter', 'teleport', 1, 1, '', -1, '2,4', NULL), + (1802, 'calippo', 'Calippo icecream machine', 'Basic model', 1274, 1, 1, 0, '2', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '4', -1, '2,4', NULL), + (1803, 'calippo_cmp', 'Calippo icecream machine', 'Basic model', 2738, 1, 1, 0, '2', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '4', -1, '2,4', NULL), + (1804, 'ads_calip_cola*1', 'Calippo Lima', 'Of the most refreshing!', 11126, 1, 1, 0, '0', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '19', -1, '2,4', NULL), + (1805, 'ads_calip_cola*2', 'Calippo Cola', 'Of the most refreshing!', 11121, 1, 1, 0, '0', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '19', -1, '2,4', NULL), + (1806, 'ads_calip_cola*3', 'Calippo Strawberry', 'Of the most refreshing!', 11150, 1, 1, 0, '0', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '19', -1, '2,4', NULL), + (1807, 'ads_calip_cola*4', 'Calippo Crazy', 'Of the most refreshing!', 11151, 1, 1, 0, '0', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '19', -1, '2,4', NULL), + (1808, 'ads_calip_colac*1', 'Calippo Lima', 'Of the most refreshing!', 1146, 1, 1, 0, '0', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '19', -1, '2,4', NULL), + (1809, 'ads_calip_colac*2', 'Calippo Cola', 'Of the most refreshing!', 1307, 1, 1, 0, '0', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '19', -1, '2,4', NULL), + (1810, 'ads_calip_colac*3', 'Calippo Strawberry', 'Of the most refreshing!', 1308, 1, 1, 0, '0', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '19', -1, '2,4', NULL), + (1811, 'ads_calip_colac*4', 'Calippo Crazy', 'Of the most refreshing!', 1309, 1, 1, 0, '0', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '19', -1, '2,4', NULL), + (1812, 'ads_calip_lava2', 'ads_calip_lava2 name', 'ads_calip_lava2 desc', 1310, 1, 1, 0, '0', 'solid', 'default', 1, 1, '', -1, '0', NULL), + (1813, 'ads_mall_coffeem', 'Quick Coffee Stop', 'Exclusively Mall coffee and free to boot!', 3202, 1, 1, 0, '2', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '17', -1, '2,4', NULL), + (1814, 'ads_mall_elevator', 'Mall Lift', 'Up, up and away to the next shopping level', 3306, 1, 1, 0, '3', 'solid,requires_touching_for_interaction,custom_data_true_false,teleporter', 'teleport', 1, 1, '', -1, '2,4', NULL), + (1815, 'ads_mall_kiosk', 'Mall Kiosk', 'Fish, fruit, sweets, sunglasses - it is all available here.', 3216, 1, 2, 0, '0', 'solid', 'default', 1, 1, '', -1, '0,2', NULL), + (1816, 'ads_mall_tele', 'Mall tele-door', 'Step inside the store and look around', 3020, 1, 1, 0, '3', 'solid,requires_touching_for_interaction,custom_data_true_false,teleporter,door_teleporter', 'teleport', 1, 1, '', -1, '0,2,4,6', NULL), + (1817, 'ads_mall_winbea', 'Mall Beauty Salon', 'Give yourself some red carpet glamour in the Salon', 1594, -1, -1, 0, '0', 'wall_item', 'default', 1, 1, '', -1, '2,4', NULL), + (1818, 'ads_mall_winchi', 'ads_mall_winchi', 'ads_mall_winchi', 4103, -1, -1, 0, '0', 'wall_item', 'default', 1, 1, '', -1, '2,4', NULL), + (1819, 'ads_mall_wincin', 'Mall Cinema Window', 'What movies are playing in the big silver screen?', 1595, -1, -1, 0, '0', 'wall_item', 'default', 1, 1, '', -1, '2,4', NULL), + (1820, 'ads_mall_winclo', 'ads_mall_winclo', 'ads_mall_winclo', 4236, -1, -1, 0, '0', 'wall_item', 'default', 1, 1, '', -1, '2,4', NULL), + (1821, 'ads_mall_window', 'Habbo Mall Window', 'Can you see that!', 4083, -1, -1, 0, '0', 'wall_item', 'default', 1, 1, '', -1, '2,4', NULL), + (1822, 'ads_mall_winfur', 'Habbo Mall Furni Window', 'Can you see that!', 4092, -1, -1, 0, '0', 'wall_item', 'default', 1, 1, '', -1, '2,4', NULL), + (1823, 'ads_mall_wingar', 'ads_mall_wingar', 'ads_mall_wingar', 4230, -1, -1, 0, '0', 'wall_item', 'default', 1, 1, '', -1, '2,4', NULL), + (1824, 'ads_mall_winice', 'Mall Ice Cream Parlour Window', 'Get yourself a cold rock of ice creamy goodness here.', 10056, -1, -1, 0, '0', 'wall_item', 'default', 1, 1, '', -1, '2,4', NULL), + (1825, 'ads_mall_winmus', 'Mall Music Shop Window', 'Strum, play and drum - this shop is a music lover\'s heaven', 1956, -1, -1, 0, '0', 'wall_item', 'default', 1, 1, '', -1, '2,4', NULL), + (1826, 'ads_mall_winpet', 'Habbo Mall Petshop Window', '', 4091, -1, -1, 0, '0', 'wall_item', 'default', 1, 1, '', -1, '2,4', NULL), + (1827, 'ads_mall_winspo', 'Mall Sports World Window', 'Whatever your sporting dibble, you\'ll find it here', 10057, -1, -1, 0, '0', 'wall_item', 'default', 1, 1, '', -1, '', NULL), + (1828, 'ads_mall_wintra', 'ads_mall_wintra', 'ads_mall_wintra', 4225, -1, -1, 0, '0', 'wall_item', 'default', 1, 1, '', -1, '2,4', NULL), + (1829, 'easel_0', 'StrayPixels Winner x1', 'Made by our very own RollerKingdom and Fredsicle', 3582, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1830, 'easel_1', 'StrayPixels winner x3', 'Made by our very own avilaman, HankMcCoy, and ,CrystalBailey', 3594, 1, 1, 0, '3', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1831, 'easel_2', 'StrayPixels winner x5', 'Is that... cheese chasing that man!?', 3603, 1, 1, 0, '4', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1832, 'easel_3', 'StrayPixels winner x7', 'Watching paint dry... fun', 3596, 1, 1, 0, '5', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1833, 'easel_4', 'StrayPixels winner x10', 'Holy carp my watch just melted!', 3600, 1, 1, 0, '5', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1834, 'prizetrophy7*1', 'Gold Habbo trophy', 'Gold Habbo trophy', 1163, 1, 1, 0, '0', 'solid,prize_trophy,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (1835, 'prizetrophy7*2', 'Silver Habbo trophy', 'Silver Habbo trophy', 1158, 1, 1, 0, '2', 'solid,prize_trophy,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1836, 'prizetrophy7*3', 'Bronze Habbo trophy', 'Bronze Habbo trophy', 1153, 1, 1, 0, '0', 'solid,prize_trophy,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (1837, 'prizetrophy8*1', 'Bubble trophy', 'Glittery gold', 618, 1, 1, 0, '0', 'solid,prize_trophy,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (1838, 'prizetrophy9*1', 'Champion trophy', 'Glittery gold', 619, 1, 1, 0, '0', 'solid,prize_trophy,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (1839, 'prizetrophy_cool', 'Cool Trophy', 'One Cool Habbo', 3225, 1, 1, 0, '2', 'solid,prize_trophy,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1840, 'prizetrophy_hot', 'Hot Trophy', 'One Hot Habbo', 3229, 1, 1, 0, '2', 'solid,prize_trophy,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1841, 'hrella_poster_1', 'Porthole', 'Brighten up your cabin', 1237, -1, -1, 0, '0', 'wall_item', 'default', 1, 1, '', -1, '2,4', NULL), + (1842, 'hrella_poster_2', 'Life Buoy', 'For those scary Lido moments', 1238, -1, -1, 0, '0', 'wall_item', 'default', 1, 1, '', -1, '2,4', NULL), + (1843, 'hrella_poster_3', 'Anchor', 'Don\'t drift away!', 1239, -1, -1, 0, '0', 'wall_item', 'default', 1, 1, '', -1, '2,4', NULL), + (1844, 'xm09_trophy', '2009 Habbo Trophy', 'Winner of a 2009 Habbo of the Year competition.', 3351, 1, 1, 0, '0', 'solid,prize_trophy,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1845, 'computer_laptop', 'Laptop', 'For geeks on the go!', 3893, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4,6,0', NULL), + (1846, 'bw_water_1', 'Water Patch', 'Swimming in the shallow end.', 3530, 2, 2, 0, '0', 'can_stand_on_top,can_stack_on_top', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1847, 'bw_water_2', 'Deep Water Patch', 'Get thrown in the deep end!', 3541, 2, 2, 0, '0', 'can_stand_on_top,can_stack_on_top', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1848, 'val_randomizer', 'Love Randomiser', 'Surprise surprise! (Cilla Black not included)', 1236, 4, 1, 1.4, '33', 'can_sit_on_top,requires_rights_for_interaction', 'love_randomizer', 1, 1, '', -1, '2,4', NULL), + (1849, 'val09_floor', 'Polished Tile', 'Looks all shiny...', 3363, 2, 2, 0, '6', 'can_stack_on_top,can_stand_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1850, 'val09_floor2', 'Wooden Tile', 'Look closely at the grain', 3357, 2, 2, 0, '6', 'can_stack_on_top,can_stand_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1851, 'val09_wall1', 'Sound-proofed Wall', 'I wonder if it really works?', 4318, -1, -1, 0, '0', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1852, 'val09_wall2', 'Embroidered Wall', 'Isn\'t it pretty?', 4316, -1, -1, 0, '5', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1853, 'val09_wdrobe_b', 'Designer Wardrobe', 'I wonder if all my clothes will fit?', 4320, -1, -1, 0, '5', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1854, 'val09_wdrobe_g', 'Designer Wardrobe', 'I wonder if all my clothes will fit?', 4317, -1, -1, 0, '5', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1855, 'ktchn10_block', 'Kitchen Corner Block', 'Cutting this corner won\'t give you food poisoning.', 3589, 1, 1, 1.1, '3', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1856, 'ktchn10_cabnt', 'Cabinet', 'Hide all your messy bits and pieces.', 4338, -1, -1, 0, '2', 'wall_item,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1857, 'ktchn10_pot', 'Boiling Water', 'If you can\'t stand the heat.', 3580, 1, 1, 0, '3', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1858, 'ktchn10_sink', 'Kitchen Sink', 'Everything but...', 3612, 2, 1, 0, '3', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1859, 'ktchn10_stove', 'Kitchen Stove', 'Cook up a storm!', 3581, 2, 1, 1.3, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1860, 'ktchn10_tea', 'Teapot', 'Short and stout.', 3592, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1861, 'md_limukaappi_cmp', 'Habbo Cola Machine', 'A sparkling and refreshing pixel drink!', 1312, 1, 1, 0, '2', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '19', -1, '0,2,4,6', NULL), + (1862, 'kinkysofa', 'Kinky Sofa', 'Don\'t look at it under UV light!', 1533, 2, 1, 1.2, '2', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1863, 'ads_cl_moodi_camp', 'The Moodi Machine', 'how u feelin? Express yourself with ChildLine', 3343, 1, 1, 0, '2', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '45,46,47', -1, '2,4', NULL), + (1864, 'hc2_armchair', 'Leather Armchair', 'Relax in style', 3436, 1, 1, 1.1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '2,4', NULL), + (1865, 'hc2_barchair', 'Leather Bar Stool', 'Sit up high', 3439, 1, 1, 1.8, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '2,0,4,6', NULL), + (1866, 'hc2_biglamp', 'Black Lamp', 'Sophisticated lighting', 3446, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '4', NULL), + (1867, 'hc2_carpet', 'Trendy Rug', 'Luxurious comfort', 3440, 3, 5, 0, '0', 'can_stand_on_top,can_stack_on_top', 'default', 1, 1, '', -1, '4,2', NULL), + (1868, 'hc2_cart', 'Service Trolley', 'Butler not included', 3430, 1, 1, 0, '0', 'solid', 'default', 1, 1, '', -1, '4,2', NULL), + (1869, 'hc2_coffee', 'Espresso Machine', 'Morning glory', 3450, 1, 1, 0, '0', 'solid', 'default', 1, 1, '', -1, '2,4', NULL), + (1870, 'hc2_divider', 'Black Divider', 'Divide the wealth', 3449, 1, 3, 0, '0', 'solid', 'default', 1, 1, '', -1, '4,2', NULL), + (1871, 'hc2_dvn', 'Leather Duvan', 'Stretch out', 3459, 1, 3, 1.4, '0', 'can_lay_on_top', 'bed', 1, 1, '', -1, '2,0', NULL), + (1872, 'hc2_frplc', 'Suave Fireplace', 'Roaring success', 3458, 1, 2, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1873, 'hc2_sofa', 'Leather Sofa', 'Stylish seating', 3452, 2, 1, 1.1, '0', 'solid,can_sit_on_top', 'chair', 1, 1, '', -1, '4,0,2,6', NULL), + (1874, 'hc2_sofatbl', 'Glass Table', 'Make a statement', 3434, 2, 2, 0.5, '0', 'solid,can_stack_on_top', 'default', 1, 1, '', -1, '0,2', NULL), + (1875, 'hc2_vase', 'Black Vase', 'Elegantly shaped', 3428, 1, 1, 0, '0', 'solid', 'default', 1, 1, '', -1, '0,4', NULL), + (1876, 'hc3_bard', 'HC Bar Desk', 'Set up shop', 3445, 2, 1, 1.2, '2', 'solid,can_stack_on_top,solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1877, 'hc3_dc', 'HC Duvan', 'Live the life', 3461, 1, 3, 1.4, '2', 'can_lay_on_top', 'bed', 1, 1, '', -1, '0,2', NULL), + (1878, 'hc3_divider', 'HC Divider', 'Manage your space', 3431, 1, 3, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '4,2', NULL), + (1879, 'hc3_hugelamp', 'HC Lamp', 'Makes a huge statement', 3447, 1, 1, 0, '2', 'requires_rights_for_interaction,can_stand_on_top,can_stack_on_top', 'default', 1, 1, '', -1, '4', NULL), + (1880, 'hc3_light', 'HC Light', 'Stay in the spotlight', 3465, 2, 1, 0, '2', 'requires_rights_for_interaction,can_stand_on_top,can_stack_on_top', 'default', 1, 1, '', -1, '0,2', NULL), + (1881, 'hc3_shelf', 'HC Shelves', 'Store your awards', 3438, 3, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1882, 'hc3_sofa', 'HC Sofa', 'Comfort in style', 3441, 2, 1, 1.1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1883, 'hc3_stereo', 'HC Stereo', 'Block rockin\' beats', 3470, 3, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1884, 'hc3_stool', 'HC Stool', 'High and mighty', 3448, 1, 1, 1.8, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1885, 'hc3_table', 'HC Coffee Table', 'For social gatherings', 3466, 2, 2, 0.7, '0', 'solid,can_stack_on_top', 'default', 1, 1, '', -1, '0,2', NULL), + (1886, 'hc3_vase', 'HC Vase', 'The ultimate floral arrangement.', 3479, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2', NULL), + (1887, 'hc3_walldeco', 'HC Wall Art', 'Cubism lives on', 4329, -1, -1, 0, '10', 'wall_item', 'default', 1, 1, '', -1, '2,4', NULL), + (1888, 'basket', 'Basket Of Eggs', 'Eggs-actly what you want for Easter', 654, 1, 1, 0, '0', 'solid', 'default', 1, 1, '', -1, '2', NULL), + (1889, 'birdie', 'Pop-up Egg', 'Cheep (!) and cheerful', 653, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1890, 'easterduck', 'Wannabe bunny', 'Can you tell what it is yet?', 652, 1, 1, 0, '0', 'solid', 'default', 1, 1, '', -1, '2,4', NULL), + (1891, 'rare_mnstr', 'Venomus Habbolus', 'Don\'t get too close...', 1128, 1, 1, 0, '0', 'solid', 'default', 1, 1, '', -1, '0,6', NULL), + (1892, 'rare_beehive_bulb*3', 'Maroon Amber Lamp', 'Only with these on will you be able to see the truth!', 8217, 1, 1, 1, '2', 'solid,can_stack_on_top,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1893, 'rare_dragonlamp_pink', 'Pink Dragon Lamp', 'Breathes Fire', 4852, 1, 1, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '4,2', NULL), + (1894, 'rare_icecream*10', 'Silver Icecream Machine', 'ice cold snacks', 4859, 1, 1, 0, '2', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '4', -1, '2,4', NULL), + (1895, 'pillar*10', 'Maroon Classic Pillar', 'Ancient and stately.', 8208, 1, 1, 3.5, '0', 'can_stack_on_top,solid', 'default', 1, 1, '', -1, '0', NULL), + (1896, 'rare_parasol*4', 'Maroon Parasol', 'Zon! Zon! Zon!', 8209, 1, 1, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1897, 'scifidoor*11', 'Maroon Spaceship Door', 'Beam me up.', 8210, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '2,4', NULL), + (1898, 'sleepingbag*11', 'Maroon Sleeping Bag', 'Ultimate coziness', 8211, 1, 3, 0.8, '0', 'can_lay_on_top', 'bed', 1, 1, '', -1, '0,2', NULL), + (1899, 'rare_fountain*4', 'Maroon Fountain', 'Lounge Oasis', 8212, 1, 1, 0, '2', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL), + (1900, 'rare_dragonlamp*10', 'Maroon Dragon Lamp', 'Scary and scorching!', 8213, 1, 1, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '2,4', NULL), + (1901, 'rare_fan*10', 'Maroon Powered Fan', 'Turn it on and enjoy the cool breeze', 8214, 1, 1, 0, '2', 'solid,custom_data_numeric_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1902, 'rare_icecream*11', 'Maroon Ice Cream Maker', 'Virtual chocolate rocks!', 8215, 1, 1, 0, '2', 'solid,requires_touching_for_interaction,custom_data_true_false', 'vending_machine', 1, 1, '4', -1, '2,4', NULL), + (1903, 'wooden_screen*10', 'Maroon Oriental Door', 'Adds an exotic vibe to any room', 8216, 1, 2, 0, '0', 'solid,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,6', NULL), + (1904, 'pillow*10', 'Maroon Pillow', 'Rest your head after a long day of partying.', 8218, 1, 1, 1, '0', 'can_sit_on_top', 'chair', 1, 1, '', -1, '0,2,4,6', NULL), + (1905, 'scifiport*10', 'Maroon Laser Portal', 'Energy beams. No trespassers!', 8219, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '0,6', NULL), + (1906, 'rare_elephant_statue*3', 'Maroon Elephant', 'Imported Handicrafts', 8220, 1, 1, 1, '0', 'solid,can_stack_on_top,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0,2,4,6', NULL), + (1907, 'marquee*11', 'Maroon Marquee', 'A door and a sunshade in one furni!', 8221, 1, 1, 0, '2', 'solid,requires_rights_for_interaction,gate', 'default', 1, 1, '', -1, '2,4', NULL), + (1908, 'scifirocket*10', 'Maroon Smoke Machine', 'Retro-mystification', 8222, 1, 1, 0, '2', 'solid,custom_data_on_off,requires_rights_for_interaction', 'default', 1, 1, '', -1, '0', NULL); +/*!40000 ALTER TABLE `items_definitions` ENABLE KEYS */; + +-- Dumping structure for table havana.items_moodlight_presets +CREATE TABLE IF NOT EXISTS `items_moodlight_presets` ( + `item_id` bigint(11) NOT NULL, + `current_preset` int(11) NOT NULL DEFAULT 1, + `preset_1` varchar(50) NOT NULL DEFAULT '1,#000000,255', + `preset_2` varchar(50) NOT NULL DEFAULT '1,#000000,255', + `preset_3` varchar(50) NOT NULL DEFAULT '1,#000000,255', + UNIQUE KEY `item_id` (`item_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.items_moodlight_presets: ~0 rows (approximately) +DELETE FROM `items_moodlight_presets`; +/*!40000 ALTER TABLE `items_moodlight_presets` DISABLE KEYS */; +/*!40000 ALTER TABLE `items_moodlight_presets` ENABLE KEYS */; + +-- Dumping structure for table havana.items_pets +CREATE TABLE IF NOT EXISTS `items_pets` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `item_id` bigint(11) NOT NULL, + `name` varchar(15) NOT NULL, + `type` varchar(1) NOT NULL, + `race` int(3) NOT NULL, + `colour` varchar(6) NOT NULL, + `nature_positive` int(3) NOT NULL, + `nature_negative` int(3) NOT NULL, + `friendship` float NOT NULL DEFAULT 1, + `born` bigint(11) NOT NULL, + `last_kip` bigint(11) NOT NULL, + `last_eat` bigint(11) NOT NULL, + `last_drink` bigint(11) NOT NULL, + `last_playtoy` bigint(11) NOT NULL, + `last_playuser` bigint(11) NOT NULL, + `x` int(3) NOT NULL DEFAULT 0, + `y` int(3) NOT NULL DEFAULT 0, + `rotation` tinyint(1) NOT NULL DEFAULT 0, + PRIMARY KEY (`id`), + UNIQUE KEY `id` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.items_pets: ~0 rows (approximately) +DELETE FROM `items_pets`; +/*!40000 ALTER TABLE `items_pets` DISABLE KEYS */; +/*!40000 ALTER TABLE `items_pets` ENABLE KEYS */; + +-- Dumping structure for table havana.items_photos +CREATE TABLE IF NOT EXISTS `items_photos` ( + `photo_id` bigint(11) NOT NULL, + `photo_user_id` bigint(11) NOT NULL, + `timestamp` bigint(11) NOT NULL, + `photo_data` blob NOT NULL, + `photo_checksum` int(11) NOT NULL, + `is_active` tinyint(1) NOT NULL DEFAULT 1, + PRIMARY KEY (`photo_id`), + UNIQUE KEY `photo_id` (`photo_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.items_photos: ~0 rows (approximately) +DELETE FROM `items_photos`; +/*!40000 ALTER TABLE `items_photos` DISABLE KEYS */; +/*!40000 ALTER TABLE `items_photos` ENABLE KEYS */; + +-- Dumping structure for table havana.items_teleporter_links +CREATE TABLE IF NOT EXISTS `items_teleporter_links` ( + `item_id` bigint(11) NOT NULL, + `linked_id` bigint(11) NOT NULL, + UNIQUE KEY `item_id` (`item_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.items_teleporter_links: ~0 rows (approximately) +DELETE FROM `items_teleporter_links`; +/*!40000 ALTER TABLE `items_teleporter_links` DISABLE KEYS */; +/*!40000 ALTER TABLE `items_teleporter_links` ENABLE KEYS */; + +-- Dumping structure for table havana.messenger_categories +CREATE TABLE IF NOT EXISTS `messenger_categories` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `user_id` int(11) NOT NULL, + `name` varchar(50) NOT NULL, + KEY `Index 1` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.messenger_categories: ~0 rows (approximately) +DELETE FROM `messenger_categories`; +/*!40000 ALTER TABLE `messenger_categories` DISABLE KEYS */; +/*!40000 ALTER TABLE `messenger_categories` ENABLE KEYS */; + +-- Dumping structure for table havana.messenger_friends +CREATE TABLE IF NOT EXISTS `messenger_friends` ( + `from_id` int(11) NOT NULL, + `to_id` int(11) NOT NULL, + `category_id` int(11) DEFAULT 0, + KEY `to_id` (`to_id`), + KEY `from_id` (`from_id`), + KEY `category_id` (`category_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.messenger_friends: ~0 rows (approximately) +DELETE FROM `messenger_friends`; +/*!40000 ALTER TABLE `messenger_friends` DISABLE KEYS */; +/*!40000 ALTER TABLE `messenger_friends` ENABLE KEYS */; + +-- Dumping structure for table havana.messenger_messages +CREATE TABLE IF NOT EXISTS `messenger_messages` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `receiver_id` int(11) DEFAULT NULL, + `sender_id` int(11) DEFAULT NULL, + `unread` varchar(255) DEFAULT NULL, + `body` longtext NOT NULL, + `date` bigint(20) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `id` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.messenger_messages: ~0 rows (approximately) +DELETE FROM `messenger_messages`; +/*!40000 ALTER TABLE `messenger_messages` DISABLE KEYS */; +/*!40000 ALTER TABLE `messenger_messages` ENABLE KEYS */; + +-- Dumping structure for table havana.messenger_requests +CREATE TABLE IF NOT EXISTS `messenger_requests` ( + `from_id` int(11) DEFAULT NULL, + `to_id` int(11) DEFAULT NULL, + KEY `to_id` (`to_id`), + KEY `from_id` (`from_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.messenger_requests: ~0 rows (approximately) +DELETE FROM `messenger_requests`; +/*!40000 ALTER TABLE `messenger_requests` DISABLE KEYS */; +/*!40000 ALTER TABLE `messenger_requests` ENABLE KEYS */; + +-- Dumping structure for table havana.public_items +CREATE TABLE IF NOT EXISTS `public_items` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `room_model` varchar(255) NOT NULL, + `sprite` varchar(255) DEFAULT NULL, + `x` int(11) NOT NULL DEFAULT 0, + `y` int(11) NOT NULL DEFAULT 0, + `z` double NOT NULL DEFAULT 0, + `rotation` int(11) NOT NULL DEFAULT 0, + `top_height` double NOT NULL DEFAULT 1, + `length` int(11) NOT NULL DEFAULT 1, + `width` int(11) NOT NULL DEFAULT 1, + `behaviour` varchar(255) NOT NULL DEFAULT '', + `current_program` varchar(255) DEFAULT NULL, + `teleport_to` varchar(50) DEFAULT NULL, + `swim_to` varchar(50) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3464 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT; + +-- Dumping data for table havana.public_items: ~3,474 rows (approximately) +DELETE FROM `public_items`; +/*!40000 ALTER TABLE `public_items` DISABLE KEYS */; +INSERT INTO `public_items` (`id`, `room_model`, `sprite`, `x`, `y`, `z`, `rotation`, `top_height`, `length`, `width`, `behaviour`, `current_program`, `teleport_to`, `swim_to`) VALUES + (1, 'picnic', 'picnic_cloth1', 5, 16, 0.001, 0, 0.001, 0, 0, 'can_stand_on_top', '', NULL, NULL), + (2, 'newbie_lobby', 'crl_lamp', 16, 0, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3, 'newbie_lobby', 'crl_sofa2c', 17, 0, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (4, 'newbie_lobby', 'crl_sofa2b', 18, 0, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (5, 'newbie_lobby', 'crl_sofa2a', 19, 0, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (6, 'newbie_lobby', 'crl_lamp', 20, 0, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (7, 'newbie_lobby', 'crl_chair', 16, 1, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (8, 'newbie_lobby', 'crl_lamp', 7, 2, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (9, 'newbie_lobby', 'crl_lamp', 11, 2, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (10, 'newbie_lobby', 'crl_chair', 16, 2, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (11, 'newbie_lobby', 'crl_pillar', 5, 3, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (12, 'newbie_lobby', 'crl_chair', 7, 3, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (13, 'newbie_lobby', 'crl_table1b', 9, 3, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (14, 'newbie_lobby', 'crl_sofa1c', 11, 3, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (15, 'newbie_lobby', 'crl_chair', 16, 3, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (16, 'newbie_lobby', 'crl_table2b', 19, 3, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (17, 'newbie_lobby', 'crl_table2a', 20, 3, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (18, 'newbie_lobby', 'crl_lamp', 0, 4, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (19, 'newbie_lobby', 'crl_sofa2c', 1, 4, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (20, 'newbie_lobby', 'crl_sofa2b', 2, 4, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (21, 'newbie_lobby', 'crl_sofa2a', 3, 4, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (22, 'newbie_lobby', 'crl_lamp', 4, 4, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (23, 'newbie_lobby', 'crl_table1a', 9, 4, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (24, 'newbie_lobby', 'crl_sofa1b', 11, 4, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (25, 'newbie_lobby', 'crl_wall2a', 15, 4, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (26, 'newbie_lobby', 'crl_lamp', 16, 4, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (27, 'newbie_lobby', 'crl_chair', 0, 5, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (28, 'newbie_lobby', 'crl_chair', 7, 5, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (29, 'newbie_lobby', 'crl_sofa1a', 11, 5, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (30, 'newbie_lobby', 'crl_table2b', 2, 6, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (31, 'newbie_lobby', 'crl_table2a', 3, 6, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (32, 'newbie_lobby', 'crl_lamp', 11, 6, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (33, 'newbie_lobby', 'crl_chair', 0, 7, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (34, 'newbie_lobby', 'crl_lamp', 0, 8, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (35, 'newbie_lobby', 'crl_sofa3c', 1, 8, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (36, 'newbie_lobby', 'crl_sofa3b', 2, 8, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (37, 'newbie_lobby', 'crl_sofa3a', 3, 8, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (38, 'newbie_lobby', 'crl_lamp', 4, 8, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (39, 'newbie_lobby', 'crl_barchair2', 19, 8, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (40, 'newbie_lobby', 'crl_tablebar', 20, 8, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (41, 'newbie_lobby', 'crl_barchair2', 21, 8, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (42, 'newbie_lobby', 'crl_pillar2', 5, 9, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (43, 'newbie_lobby', 'crl_pillar', 9, 9, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (44, 'newbie_lobby', 'crl_desk1a', 8, 15, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (45, 'newbie_lobby', 'crl_deski', 9, 15, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (46, 'newbie_lobby', 'crl_deskh', 10, 15, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (47, 'newbie_lobby', 'crl_deskg', 10, 16, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (48, 'newbie_lobby', 'crl_deskf', 10, 17, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (49, 'newbie_lobby', 'crl_deske', 10, 18, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (50, 'newbie_lobby', 'crl_deske', 10, 19, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (51, 'newbie_lobby', 'crl_deske', 10, 20, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (52, 'newbie_lobby', 'crl_deske', 10, 21, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (53, 'newbie_lobby', 'crl_deske', 10, 22, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (54, 'newbie_lobby', 'crl_deske', 10, 23, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (55, 'newbie_lobby', 'crl_wallb', 7, 24, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (56, 'newbie_lobby', 'crl_deske', 10, 24, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (57, 'newbie_lobby', 'crl_walla', 7, 25, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (58, 'newbie_lobby', 'crl_desk1b', 8, 25, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (59, 'newbie_lobby', 'crl_desk1c', 9, 25, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (60, 'newbie_lobby', 'crl_desk1d', 10, 25, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (61, 'newbie_lobby', 'crl_lamp2', 12, 27, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (62, 'newbie_lobby', 'crl_cabinet2', 13, 27, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (63, 'newbie_lobby', 'crl_cabinet1', 14, 27, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (64, 'newbie_lobby', 'crl_lamp2', 15, 27, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (65, 'theater', 'mic', 11, 10, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (66, 'theater', 'thchair2', 2, 11, 4, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (67, 'theater', 'thchair2', 2, 12, 4, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (68, 'theater', 'thchair2', 2, 15, 4, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (69, 'theater', 'thchair1', 6, 15, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (70, 'theater', 'thchair1', 7, 15, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (71, 'theater', 'thchair1', 8, 15, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (72, 'theater', 'thchair1', 9, 15, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (73, 'theater', 'thchair1', 10, 15, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (74, 'theater', 'thchair1', 12, 15, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (75, 'theater', 'thchair1', 13, 15, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (76, 'theater', 'thchair1', 14, 15, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (77, 'theater', 'thchair1', 15, 15, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (78, 'theater', 'thchair1', 16, 15, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (79, 'theater', 'thchair2', 2, 16, 4, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (80, 'theater', 'thchair1', 6, 20, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (81, 'theater', 'thchair1', 7, 20, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (82, 'theater', 'thchair1', 8, 20, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (83, 'theater', 'thchair1', 9, 20, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (84, 'theater', 'thchair1', 10, 20, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (85, 'theater', 'thchair1', 12, 20, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (86, 'theater', 'thchair1', 13, 20, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (87, 'theater', 'thchair1', 14, 20, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (88, 'theater', 'thchair1', 15, 20, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (89, 'theater', 'thchair1', 16, 20, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (90, 'theater', 'thchair1', 6, 23, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (91, 'theater', 'thchair1', 7, 23, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (92, 'theater', 'thchair1', 8, 23, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (93, 'theater', 'thchair1', 9, 23, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (94, 'theater', 'thchair1', 10, 23, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (95, 'theater', 'thchair1', 12, 23, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (96, 'theater', 'thchair1', 13, 23, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (97, 'theater', 'thchair1', 14, 23, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (98, 'theater', 'thchair1', 15, 23, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (99, 'theater', 'thchair1', 16, 23, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (100, 'theater', 'thchair1', 6, 26, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (101, 'theater', 'thchair1', 7, 26, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (102, 'theater', 'thchair1', 8, 26, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (103, 'theater', 'thchair1', 9, 26, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (104, 'theater', 'thchair1', 10, 26, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (105, 'theater', 'thchair1', 12, 26, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (106, 'theater', 'thchair1', 13, 26, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (107, 'theater', 'thchair1', 14, 26, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (108, 'theater', 'thchair1', 15, 26, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (109, 'theater', 'thchair1', 16, 26, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (110, 'library', 'libchair', 14, 2, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (111, 'library', 'libchair', 16, 2, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (112, 'library', 'libchair', 26, 2, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (113, 'library', 'libchair', 24, 3, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (114, 'library', 'libchair', 12, 4, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (115, 'library', 'libchair', 12, 6, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (116, 'library', 'libstool', 13, 14, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (117, 'library', 'libstool', 13, 15, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (118, 'library', 'libstool', 13, 16, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (119, 'library', 'libchair', 28, 27, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (120, 'library', 'libchair', 27, 29, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (121, 'library', 'libstool', 24, 33, 2, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (122, 'library', 'libstool', 24, 34, 2, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (123, 'library', 'libstool', 24, 35, 2, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (124, 'library', 'libstool', 21, 36, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (125, 'library', 'libstool', 22, 36, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (126, 'library', 'libstool', 23, 36, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (127, 'floatinggarden', 'stone', 15, 37, 1, 4, 1, 1, 1, 'can_sit_on_top,invisible', '', NULL, NULL), + (128, 'floatinggarden', 'stone', 16, 37, 1, 4, 1, 1, 1, 'can_sit_on_top,invisible', '', NULL, NULL), + (129, 'floatinggarden', 'stone', 17, 29, 1, 2, 1, 1, 1, 'can_sit_on_top,invisible', '', NULL, NULL), + (130, 'floatinggarden', 'stone', 17, 30, 1, 2, 1, 1, 1, 'can_sit_on_top,invisible', '', NULL, NULL), + (131, 'floatinggarden', 'stone', 17, 31, 1, 2, 1, 1, 1, 'can_sit_on_top,invisible', '', NULL, NULL), + (132, 'floatinggarden', 'stone', 17, 35, 1, 2, 1, 1, 1, 'can_sit_on_top,invisible', '', NULL, NULL), + (133, 'floatinggarden', 'stone', 17, 36, 1, 2, 1, 1, 1, 'can_sit_on_top,invisible', '', NULL, NULL), + (134, 'floatinggarden', 'stone', 21, 33, 1, 2, 1, 1, 1, 'can_sit_on_top,invisible', '', NULL, NULL), + (135, 'floatinggarden', 'stone', 21, 34, 1, 2, 1, 1, 1, 'can_sit_on_top,invisible', '', NULL, NULL), + (136, 'floatinggarden', 'stone', 21, 35, 1, 2, 1, 1, 1, 'can_sit_on_top,invisible', '', NULL, NULL), + (137, 'floatinggarden', 'stone', 21, 36, 1, 2, 1, 1, 1, 'can_sit_on_top,invisible', '', NULL, NULL), + (138, 'floatinggarden', 'stone', 24, 9, 3, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (139, 'floatinggarden', 'stone', 25, 9, 3, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (140, 'floatinggarden', 'stone', 26, 33, 1, 6, 1, 1, 1, 'can_sit_on_top,invisible', '', NULL, NULL), + (141, 'floatinggarden', 'stone', 26, 34, 1, 6, 1, 1, 1, 'can_sit_on_top,invisible', '', NULL, NULL), + (142, 'floatinggarden', 'stone', 26, 35, 1, 6, 1, 1, 1, 'can_sit_on_top,invisible', '', NULL, NULL), + (143, 'floatinggarden', 'stone', 26, 36, 1, 6, 1, 1, 1, 'can_sit_on_top,invisible', '', NULL, NULL), + (144, 'floatinggarden', 'stone', 28, 13, 3, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (145, 'floatinggarden', 'stone', 29, 13, 3, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (146, 'floatinggarden', 'floatbench1', 17, 18, 3, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (147, 'floatinggarden', 'floatbench1', 17, 24, 3, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (148, 'floatinggarden', 'floatbench1', 19, 18, 3, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (149, 'floatinggarden', 'floatbench1', 19, 24, 3, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (150, 'floatinggarden', 'floatbench1', 21, 18, 3, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (151, 'floatinggarden', 'floatbench1', 21, 24, 3, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (152, 'floatinggarden', 'floatbench1', 23, 18, 3, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (153, 'floatinggarden', 'floatbench1', 23, 24, 3, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (154, 'floatinggarden', 'floatbench1', 28, 17, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (155, 'floatinggarden', 'floatbench1', 28, 19, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (156, 'floatinggarden', 'floatbench1', 28, 23, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (157, 'floatinggarden', 'floatbench1', 28, 25, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (158, 'floatinggarden', 'floatbench2', 17, 17, 3, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (159, 'floatinggarden', 'floatbench2', 17, 23, 3, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (160, 'floatinggarden', 'floatbench2', 19, 17, 3, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (161, 'floatinggarden', 'floatbench2', 19, 23, 3, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (162, 'floatinggarden', 'floatbench2', 21, 17, 3, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (163, 'floatinggarden', 'floatbench2', 21, 23, 3, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (164, 'floatinggarden', 'floatbench2', 23, 17, 3, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (165, 'floatinggarden', 'floatbench2', 23, 23, 3, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (166, 'floatinggarden', 'floatbench2', 27, 17, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (167, 'floatinggarden', 'floatbench2', 27, 19, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (168, 'floatinggarden', 'floatbench2', 27, 23, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (169, 'floatinggarden', 'floatbench2', 27, 25, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (170, 'sunset_cafe', 'chairup4', 32, 21, 0, 3, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (171, 'sunset_cafe', 'chairup6', 33, 21, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (172, 'sunset_cafe', 'chairup6', 34, 21, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (173, 'sunset_cafe', 'chairup6', 35, 21, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (174, 'sunset_cafe', 'chairup6', 36, 21, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (175, 'sunset_cafe', 'chairup7', 37, 21, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (176, 'sunset_cafe', 'chairup2', 32, 22, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (177, 'sunset_cafe', 'chairup5', 25, 23, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (178, 'sunset_cafe', 'chairup6', 26, 23, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (179, 'sunset_cafe', 'chairup6', 27, 23, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (180, 'sunset_cafe', 'chairup6', 28, 23, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (181, 'sunset_cafe', 'chairup7', 29, 23, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (182, 'sunset_cafe', 'chairup1', 32, 23, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (183, 'sunset_cafe', 'counter5', 24, 24, 0, 7, 0.001, 1, 1, 'solid', '', NULL, NULL), + (184, 'sunset_cafe', 'table2', 25, 24, 0, 7, 0.001, 1, 1, 'solid', '', NULL, NULL), + (185, 'sunset_cafe', 'table1', 26, 24, 0, 7, 0.001, 1, 1, 'solid', '', NULL, NULL), + (186, 'sunset_cafe', 'counter3', 24, 25, 0, 7, 0.001, 1, 1, 'solid', '', NULL, NULL), + (187, 'sunset_cafe', 'counter4', 24, 26, 0, 7, 0.001, 1, 1, 'solid', '', NULL, NULL), + (188, 'sunset_cafe', 'counter3', 24, 27, 0, 7, 0.001, 1, 1, 'solid', '', NULL, NULL), + (189, 'sunset_cafe', 'counter3', 24, 28, 0, 7, 0.001, 1, 1, 'solid', '', NULL, NULL), + (190, 'sunset_cafe', 'palms4', 29, 28, 0, 7, 0.001, 1, 1, 'solid', '', NULL, NULL), + (191, 'sunset_cafe', 'counter3', 24, 29, 0, 7, 0.001, 1, 1, 'solid', '', NULL, NULL), + (192, 'sunset_cafe', 'palms3', 29, 29, 0, 7, 0.001, 1, 1, 'solid', '', NULL, NULL), + (193, 'sunset_cafe', 'counter3', 24, 30, 0, 7, 0.001, 1, 1, 'solid', '', NULL, NULL), + (194, 'sunset_cafe', 'palms2', 29, 30, 0, 7, 0.001, 1, 1, 'solid', '', NULL, NULL), + (195, 'sunset_cafe', 'counter1', 22, 31, 0, 7, 0.001, 1, 1, 'solid', '', NULL, NULL), + (196, 'sunset_cafe', 'counter1', 23, 31, 0, 7, 0.001, 1, 1, 'solid', '', NULL, NULL), + (197, 'sunset_cafe', 'counter2', 24, 31, 0, 7, 0.001, 1, 1, 'solid', '', NULL, NULL), + (198, 'sunset_cafe', 'palms1', 29, 31, 0, 7, 0.001, 1, 1, 'solid', '', NULL, NULL), + (199, 'sunset_cafe', 'chairup5', 30, 31, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (200, 'sunset_cafe', 'chairup6', 31, 31, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (201, 'sunset_cafe', 'chairup6', 32, 31, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (202, 'sunset_cafe', 'chairup6', 33, 31, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (203, 'sunset_cafe', 'chairup6', 34, 31, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (204, 'sunset_cafe', 'chairup6', 35, 31, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (205, 'sunset_cafe', 'chairup6', 36, 31, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (206, 'sunset_cafe', 'chairright3', 37, 31, 0, 5, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (207, 'sunset_cafe', 'chairup3', 21, 32, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (208, 'sunset_cafe', 'table4', 22, 32, 0, 7, 0.001, 1, 1, 'solid', '', NULL, NULL), + (209, 'sunset_cafe', 'table2', 30, 32, 0, 7, 0.001, 1, 1, 'solid', '', NULL, NULL), + (210, 'sunset_cafe', 'table1', 31, 32, 0, 7, 0.001, 1, 1, 'solid', '', NULL, NULL), + (211, 'sunset_cafe', 'table2', 33, 32, 0, 7, 0.001, 1, 1, 'solid', '', NULL, NULL), + (212, 'sunset_cafe', 'table1', 34, 32, 0, 7, 0.001, 1, 1, 'solid', '', NULL, NULL), + (213, 'sunset_cafe', 'chairright2', 37, 32, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (214, 'sunset_cafe', 'chairup2', 21, 33, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (215, 'sunset_cafe', 'table3', 22, 33, 0, 7, 0.001, 1, 1, 'solid', '', NULL, NULL), + (216, 'sunset_cafe', 'chairright2', 37, 33, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (217, 'sunset_cafe', 'chairup2', 21, 34, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (218, 'sunset_cafe', 'table4', 36, 34, 0, 7, 0.001, 1, 1, 'solid', '', NULL, NULL), + (219, 'sunset_cafe', 'chairright2', 37, 34, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (220, 'sunset_cafe', 'chairup2', 21, 35, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (221, 'sunset_cafe', 'table2', 24, 35, 0, 7, 0.001, 1, 1, 'solid', '', NULL, NULL), + (222, 'sunset_cafe', 'table1', 25, 35, 0, 7, 0.001, 1, 1, 'solid', '', NULL, NULL), + (223, 'sunset_cafe', 'table2', 27, 35, 0, 7, 0.001, 1, 1, 'solid', '', NULL, NULL), + (224, 'sunset_cafe', 'table1', 28, 35, 0, 7, 0.001, 1, 1, 'solid', '', NULL, NULL), + (225, 'sunset_cafe', 'palm', 33, 35, 0, 7, 0.001, 1, 1, 'solid', '', NULL, NULL), + (226, 'sunset_cafe', 'table3', 36, 35, 0, 7, 0.001, 1, 1, 'solid', '', NULL, NULL), + (227, 'sunset_cafe', 'chairright2', 37, 35, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (228, 'sunset_cafe', 'chairleft3', 21, 36, 0, 1, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (229, 'sunset_cafe', 'chairleft2', 22, 36, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (230, 'sunset_cafe', 'chairleft2', 23, 36, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (231, 'sunset_cafe', 'chairleft2', 24, 36, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (232, 'sunset_cafe', 'chairleft2', 25, 36, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (233, 'sunset_cafe', 'chairleft2', 26, 36, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (234, 'sunset_cafe', 'chairleft2', 27, 36, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (235, 'sunset_cafe', 'chairleft1', 28, 36, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (236, 'sunset_cafe', 'chairright2', 37, 36, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (237, 'sunset_cafe', 'table4', 36, 37, 0, 7, 0.001, 1, 1, 'solid', '', NULL, NULL), + (238, 'sunset_cafe', 'chairright2', 37, 37, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (239, 'sunset_cafe', 'table3', 36, 38, 0, 7, 0.001, 1, 1, 'solid', '', NULL, NULL), + (240, 'sunset_cafe', 'chairright1', 37, 38, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (241, 'pool_a', 'umbrella2', 18, 4, 7, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (242, 'pool_a', 'pool_2sofa2', 18, 5, 7, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (243, 'pool_a', 'pool_2sofa1', 18, 6, 7, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (244, 'pool_a', 'umbrella2', 7, 20, 7, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (245, 'pool_a', 'pool_chair2', 8, 20, 7, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (246, 'pool_a', 'umbrella2', 24, 20, 7, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (247, 'pool_a', 'pool_chair2', 25, 20, 7, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (248, 'pool_a', 'pool_chair2', 7, 21, 7, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (249, 'pool_a', 'pool_table2', 8, 21, 7, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (250, 'pool_a', 'pool_chair2', 9, 21, 7, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (251, 'pool_a', 'pool_chair2', 24, 21, 7, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (252, 'pool_a', 'pool_table2', 25, 21, 7, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (253, 'pool_a', 'pool_chair2', 8, 22, 7, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (254, 'pool_a', 'flower2b', 2, 28, 7, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (255, 'pool_a', 'flower2a', 2, 29, 7, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (256, 'pool_a', 'box', 6, 32, 7, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (257, 'pool_a', 'flower1', 13, 33, 7, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (258, 'pool_a', 'pool_chairy', 10, 34, 7, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (259, 'pool_a', 'umbrellay', 8, 35, 7, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (260, 'pool_a', 'pool_chairy', 9, 35, 7, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (261, 'pool_a', 'pool_tabley', 10, 35, 7, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (262, 'pool_a', 'pool_chairy', 11, 35, 7, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (263, 'pool_a', 'umbrellap', 15, 35, 7, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (264, 'pool_a', 'umbrellao', 21, 35, 7, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (265, 'pool_a', 'pool_chairy', 10, 36, 7, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (266, 'pool_a', 'pool_chairp', 15, 36, 7, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (267, 'pool_a', 'pool_chairo', 21, 36, 7, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (268, 'pool_a', 'pool_chairo', 22, 36, 7, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (269, 'pool_a', 'pool_chairp', 14, 37, 7, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (270, 'pool_a', 'pool_tablep', 15, 37, 7, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (271, 'pool_a', 'pool_chairp', 16, 37, 7, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (272, 'pool_a', 'pool_tabo', 21, 37, 7, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (273, 'pool_a', 'pool_tabo2', 22, 37, 7, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (274, 'pool_a', 'pool_chairp', 14, 38, 7, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (275, 'pool_a', 'pool_tablep2', 15, 38, 7, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (276, 'pool_a', 'pool_chairp', 16, 38, 7, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (277, 'pool_a', 'pool_chairo', 21, 38, 7, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (278, 'pool_a', 'pool_chairo', 22, 38, 7, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (279, 'pool_a', 'pool_chairp', 15, 39, 7, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (280, 'pool_a', 'pool_chairg', 20, 41, 7, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (281, 'pool_a', 'pool_chairg', 21, 41, 7, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (282, 'pool_a', 'pool_tablg', 20, 42, 7, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (283, 'pool_a', 'pool_tablg2', 21, 42, 7, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (284, 'pool_a', 'umbrellag', 19, 43, 7, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (285, 'pool_a', 'pool_chairg', 20, 43, 7, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (286, 'pool_a', 'pool_chairg', 21, 43, 7, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (287, 'pool_a', 'poolBooth', 17, 11, 7, 0, 0.001, 1, 1, 'can_stand_on_top,invisible', 'curtains1', NULL, NULL), + (288, 'pool_a', 'poolBooth', 17, 9, 7, 0, 0.001, 1, 1, 'can_stand_on_top,invisible', 'curtains2', NULL, NULL), + (289, 'pool_a', 'poolEnter', 20, 28, 7, 0, 0.001, 1, 1, 'can_stand_on_top,invisible', 'Splash0', '21 28 3 2', '22 28 7 6'), + (290, 'pool_a', 'poolExit', 21, 28, 3, 0, 0.001, 1, 1, 'can_stand_on_top,invisible', 'Splash0', '20 28 7 6', '19 28 7 6'), + (291, 'pub_a', 'pub_fence', 8, 12, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (292, 'pub_a', 'pub_fence', 18, 11, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (293, 'pub_a', 'pub_fence', 8, 11, 3, 1, 0.001, 1, 1, 'solid', '', NULL, NULL), + (294, 'pub_a', 'pub_chair2', 6, 11, 3, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (295, 'pub_a', 'pub_chair2', 5, 11, 3, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (296, 'pub_a', 'pub_chair2', 3, 11, 3, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (297, 'pub_a', 'pub_chair2', 2, 11, 3, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (298, 'pub_a', 'pub_fence', 18, 10, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (299, 'pub_a', 'pub_fence', 18, 9, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (300, 'pub_a', 'bardesk3', 11, 9, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (301, 'pub_a', 'bardesk4', 10, 9, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (302, 'pub_a', 'pub_fence', 18, 8, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (303, 'pub_a', 'pub_chair', 12, 8, 2, 6, 1.5, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (304, 'pub_a', 'bardesk1', 11, 8, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (305, 'pub_a', 'pub_fence', 18, 7, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (306, 'pub_a', 'bardesk2', 11, 7, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (307, 'pub_a', 'pub_fence', 18, 6, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (308, 'pub_a', 'pub_chair', 12, 6, 2, 6, 1.5, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (309, 'pub_a', 'bardesk1', 11, 6, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (310, 'pub_a', 'pub_fence', 18, 5, 2, 1, 0.001, 1, 1, 'solid', '', NULL, NULL), + (311, 'pub_a', 'bardesk2', 11, 5, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (312, 'pub_a', 'pub_chair', 12, 4, 2, 6, 1.5, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (313, 'pub_a', 'bardesk1', 11, 4, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (314, 'pub_a', 'bardesk2', 11, 3, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (315, 'pub_a', 'pub_chair', 12, 2, 2, 6, 1.5, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (316, 'pub_a', 'bardesk1', 11, 2, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (317, 'pub_a', 'pub_sofa', 21, 1, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (318, 'pub_a', 'pub_sofa', 20, 1, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (319, 'pub_a', 'pub_sofa2', 19, 1, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (320, 'pub_a', 'pub_fence', 18, 12, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (321, 'pub_a', 'pub_fence', 8, 13, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (322, 'pub_a', 'pub_chair2', 9, 13, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (323, 'pub_a', 'pub_chair3', 14, 13, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (324, 'pub_a', 'pub_table2', 15, 13, 2, 1, 0.001, 1, 1, 'solid', '', NULL, NULL), + (325, 'pub_a', 'pub_chair3', 16, 13, 2, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (326, 'pub_a', 'pub_fence', 18, 13, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (327, 'pub_a', 'pub_fence', 8, 14, 3, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (328, 'pub_a', 'pub_chair2', 9, 14, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (329, 'pub_a', 'pub_chair3', 14, 14, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (330, 'pub_a', 'pub_table2', 15, 14, 2, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (331, 'pub_a', 'pub_chair3', 16, 14, 2, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (332, 'pub_a', 'pub_fence', 18, 14, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (333, 'pub_a', 'pub_table', 1, 15, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (334, 'pub_a', 'pub_fence', 5, 15, 3, 1, 0.001, 1, 1, 'solid', '', NULL, NULL), + (335, 'pub_a', 'pub_fence', 18, 15, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (336, 'pub_a', 'pub_sofa2', 1, 16, 3, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (337, 'pub_a', 'pub_fence', 5, 16, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (338, 'pub_a', 'pub_fence', 18, 16, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (339, 'pub_a', 'pub_sofa', 1, 17, 3, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (340, 'pub_a', 'pub_fence', 5, 17, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (341, 'pub_a', 'pub_chair3', 13, 17, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (342, 'pub_a', 'pub_chair3', 14, 17, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (343, 'pub_a', 'pub_chair3', 15, 17, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (344, 'pub_a', 'pub_chair3', 16, 17, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (345, 'pub_a', 'pub_fence', 18, 17, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (346, 'pub_a', 'pub_sofa', 1, 18, 3, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (347, 'pub_a', 'pub_fence', 5, 18, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (348, 'pub_a', 'pub_table2', 13, 18, 2, 5, 0.001, 1, 1, 'solid', '', NULL, NULL), + (349, 'pub_a', 'pub_table2', 14, 18, 2, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (350, 'pub_a', 'pub_table2', 15, 18, 2, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (351, 'pub_a', 'pub_table2', 16, 18, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (352, 'pub_a', 'pub_fence', 18, 18, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (353, 'pub_a', 'pub_sofa', 2, 19, 3, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (354, 'pub_a', 'pub_sofa2', 3, 19, 3, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (355, 'pub_a', 'pub_fence', 5, 19, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (356, 'pub_a', 'pub_chair3', 13, 19, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (357, 'pub_a', 'pub_chair3', 14, 19, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (358, 'pub_a', 'pub_chair3', 15, 19, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (359, 'pub_a', 'pub_chair3', 16, 19, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (360, 'pub_a', 'pub_fence', 18, 19, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (361, 'pub_a', 'pub_fence', 1, 20, 3, 5, 0.001, 1, 1, 'solid', '', NULL, NULL), + (362, 'pub_a', 'pub_fence', 2, 20, 3, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (363, 'pub_a', 'pub_fence', 3, 20, 3, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (364, 'pub_a', 'pub_fence', 4, 20, 3, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (365, 'pub_a', 'pub_fence', 5, 20, 3, 3, 0.001, 1, 1, 'solid', '', NULL, NULL), + (366, 'pub_a', 'pub_fence', 18, 20, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (367, 'pub_a', 'pub_sofa2', 7, 21, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (368, 'pub_a', 'pub_sofa', 8, 21, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (369, 'pub_a', 'pub_fence', 12, 21, 2, 5, 0.001, 1, 1, 'solid', '', NULL, NULL), + (370, 'pub_a', 'pub_fence', 13, 21, 2, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (371, 'pub_a', 'pub_fence', 14, 21, 2, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (372, 'pub_a', 'pub_fence', 15, 21, 2, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (373, 'pub_a', 'pub_fence', 16, 21, 2, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (374, 'pub_a', 'pub_fence', 17, 21, 2, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (375, 'pub_a', 'pub_fence', 18, 21, 2, 3, 0.001, 1, 1, 'solid', '', NULL, NULL), + (376, 'pub_a', 'pub_sofa2', 6, 22, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (377, 'pub_a', 'pub_table', 15, 22, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (378, 'pub_a', 'pub_chair2', 16, 22, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (379, 'pub_a', 'pub_chair2', 17, 22, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (380, 'pub_a', 'pub_sofa', 6, 23, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (381, 'pub_a', 'pub_table2', 8, 23, 1, 1, 0.001, 1, 1, 'solid', '', NULL, NULL), + (382, 'pub_a', 'pub_sofa', 6, 24, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (383, 'pub_a', 'pub_table2', 8, 24, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (384, 'pub_a', 'pub_sofa', 6, 25, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (385, 'pub_a', 'pub_table2', 8, 25, 1, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (386, 'md_a', 'mntdwchair', 4, 3, 7, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (387, 'md_a', 'mntdwchair', 5, 3, 7, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (388, 'md_a', 'barmask', 2, 8, 7, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (389, 'md_a', 'mntdwsofa2', 7, 8, 7, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (390, 'md_a', 'mntdwtable2', 8, 8, 7, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (391, 'md_a', 'mntdwsofa2', 9, 8, 7, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (392, 'md_a', 'paalu5', 21, 8, 8, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (393, 'md_a', 'barmask', 2, 9, 7, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (394, 'md_a', 'mntdwsofa1', 7, 9, 7, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (395, 'md_a', 'mntdwtable1', 8, 9, 7, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (396, 'md_a', 'mntdwsofa1', 9, 9, 7, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (397, 'md_a', 'paalu5', 21, 9, 8, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (398, 'md_a', 'barmask', 2, 10, 7, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (399, 'md_a', 'paalu5', 21, 10, 8, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (400, 'md_a', 'barmask', 2, 11, 7, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (401, 'md_a', 'paalu5', 21, 11, 8, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (402, 'md_a', 'barmask', 2, 12, 7, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (403, 'md_a', 'mntdwsofa2', 7, 12, 7, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (404, 'md_a', 'mntdwsofa1', 8, 12, 7, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (405, 'md_a', 'paalu3', 21, 12, 8, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (406, 'md_a', 'barmask', 2, 13, 7, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (407, 'md_a', 'mntdwtable2', 7, 13, 7, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (408, 'md_a', 'mntdwtable1', 8, 13, 7, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (409, 'md_a', 'paalu3', 21, 13, 8, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (410, 'md_a', 'barmask', 2, 14, 7, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (411, 'md_a', 'mntdwsofa2', 7, 14, 7, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (412, 'md_a', 'mntdwsofa1', 8, 14, 7, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (413, 'md_a', 'paalu3', 21, 14, 8, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (414, 'md_a', 'barmask', 2, 15, 100000, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (415, 'md_a', 'paalu1', 21, 15, 8, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (416, 'md_a', 'barmask', 2, 16, 100000, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (417, 'md_a', 'mntdwsofa2', 12, 16, 7, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (418, 'md_a', 'mntdwsofa1', 13, 16, 7, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (419, 'md_a', 'paalu1', 21, 16, 8, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (420, 'md_a', 'mntdwchair', 3, 17, 7, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (421, 'md_a', 'mntdwsofa2', 6, 17, 7, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (422, 'md_a', 'mntdwtable2', 7, 17, 7, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (423, 'md_a', 'mntdwsofa2', 8, 17, 7, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (424, 'md_a', 'mntdwtable2', 12, 17, 7, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (425, 'md_a', 'mntdwtable1', 13, 17, 7, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (426, 'md_a', 'paalu1', 21, 17, 8, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (427, 'md_a', 'mntdwchair', 3, 18, 7, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (428, 'md_a', 'mntdwsofa1', 6, 18, 7, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (429, 'md_a', 'mntdwtable1', 7, 18, 7, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (430, 'md_a', 'mntdwsofa1', 8, 18, 7, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (431, 'md_a', 'mntdwsofa2', 12, 18, 7, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (432, 'md_a', 'mntdwsofa1', 13, 18, 7, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (433, 'md_a', 'paalu1', 21, 18, 8, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (434, 'md_a', 'poolBooth', 8, 1, 7, 0, 0.001, 1, 1, 'can_stand_on_top,invisible', 'curtains1', NULL, NULL), + (435, 'md_a', 'poolBooth', 9, 1, 7, 0, 0.001, 1, 1, 'can_stand_on_top,invisible', 'curtains2', NULL, NULL), + (436, 'picnic', 'hedge7', 10, 7, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (437, 'picnic', 'hedge7', 11, 7, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (438, 'picnic', 'hedge7', 12, 7, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (439, 'picnic', 'hedge7', 13, 7, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (440, 'picnic', 'hedge8', 14, 7, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (441, 'picnic', 'hedge2', 18, 7, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (442, 'picnic', 'hedge7', 19, 7, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (443, 'picnic', 'hedge7', 20, 7, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (444, 'picnic', 'hedge7', 21, 7, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (445, 'picnic', 'hedge9', 14, 8, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (446, 'picnic', 'hedge9', 18, 8, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (447, 'picnic', 'hedge5', 3, 9, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (448, 'picnic', 'hedge9', 3, 10, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (449, 'picnic', 'picnic_ground', 21, 13, 2, 4, 0.2, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (450, 'picnic', 'picnic_ground', 7, 14, 2, 4, 0.2, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (451, 'picnic', 'picnic_ground', 19, 15, 2, 2, 0.2, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (452, 'picnic', 'picnic_ground', 23, 15, 2, 6, 0.2, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (453, 'picnic', 'picnic_ground', 5, 16, 2, 2, 0.2, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (454, 'picnic', 'picnic_ground', 9, 16, 2, 6, 0.2, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (455, 'picnic', 'picnic_cloth1', 19, 15, 0.001, 0, 0.001, 0, 0, 'can_stand_on_top', '', NULL, NULL), + (456, 'picnic', 'picnic_ground', 21, 17, 2, 0, 0.2, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (457, 'picnic', 'picnic_ground', 7, 18, 2, 0, 0.2, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (458, 'picnic', 'picnic_redbench2', 0, 19, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (459, 'picnic', 'picnic_redbench1', 0, 20, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (460, 'picnic', 'hedge6', 11, 20, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (461, 'picnic', 'hedge7', 12, 20, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (462, 'picnic', 'hedge7', 13, 20, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (463, 'picnic', 'hedge3', 14, 20, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (464, 'picnic', 'hedge4', 17, 20, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (465, 'picnic', 'hedge7', 18, 20, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (466, 'picnic', 'hedge7', 19, 20, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (467, 'picnic', 'hedge8', 20, 20, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (468, 'picnic', 'hedge5', 11, 21, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (469, 'picnic', 'picnic_bench1', 12, 21, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (470, 'picnic', 'picnic_bench2', 13, 21, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (471, 'picnic', 'picnic_bench3', 14, 21, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (472, 'picnic', 'picnic_bench1', 17, 21, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (473, 'picnic', 'picnic_bench2', 18, 21, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (474, 'picnic', 'picnic_bench3', 19, 21, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (475, 'picnic', 'hedge5', 20, 21, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (476, 'picnic', 'picnic_redbench2', 0, 22, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (477, 'picnic', 'hedge5', 11, 22, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (478, 'picnic', 'hedge5', 20, 22, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (479, 'picnic', 'picnic_ground', 25, 22, 2, 4, 0.2, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (480, 'picnic', 'picnic_redbench1', 0, 23, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (481, 'picnic', 'hedge5', 11, 23, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (482, 'picnic', 'picnic_bench1', 12, 23, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (483, 'picnic', 'picnic_bench1', 19, 23, 2, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (484, 'picnic', 'hedge5', 20, 23, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (485, 'picnic', 'picnic_dummychair1', 6, 24, 2, 4, 1, 1, 1, 'can_sit_on_top,invisible', '', NULL, NULL), + (486, 'picnic', 'picnic_dummychair4', 7, 24, 2, 4, 4, 1, 1, 'can_sit_on_top,invisible', '', NULL, NULL), + (487, 'picnic', 'picnic_dummychair6', 8, 24, 2, 4, 7, 1, 1, 'can_sit_on_top,invisible', '', NULL, NULL), + (488, 'picnic', 'hedge5', 11, 24, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (489, 'picnic', 'picnic_bench2', 12, 24, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (490, 'picnic', 'picnic_bench2', 19, 24, 2, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (491, 'picnic', 'hedge5', 20, 24, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (492, 'picnic', 'picnic_ground', 23, 24, 2, 2, 0.2, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (493, 'picnic', 'picnic_ground', 27, 24, 2, 6, 0.2, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (494, 'picnic', 'picnic_stump', 5, 25, 2, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (495, 'picnic', 'hedge5', 11, 25, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (496, 'picnic', 'picnic_bench2', 12, 25, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (497, 'picnic', 'picnic_bench2', 19, 25, 2, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (498, 'picnic', 'hedge5', 20, 25, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (499, 'picnic', 'picnic_cloth2', 23, 24, 0.001, 0, 0.001, 0, 0, 'can_stand_on_top', '', NULL, NULL), + (500, 'picnic', 'picnic_stump', 7, 26, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (501, 'picnic', 'hedge5', 11, 26, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (502, 'picnic', 'picnic_bench3', 12, 26, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (503, 'picnic', 'picnic_fireplace1', 14, 26, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (504, 'picnic', 'picnic_fireplace2', 16, 26, 2, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (505, 'picnic', 'picnic_bench3', 19, 26, 2, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (506, 'picnic', 'hedge5', 20, 26, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (507, 'picnic', 'picnic_ground', 25, 26, 2, 0, 0.2, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (508, 'picnic', 'hedge9', 11, 27, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (509, 'picnic', 'picnic_lemonade', 12, 27, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (510, 'picnic', 'hedge9', 20, 27, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (511, 'picnic', 'picnic_firewood2', 8, 29, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (512, 'picnic', 'picnic_redbench2', 0, 30, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (513, 'picnic', 'picnic_firewood1', 8, 30, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (514, 'picnic', 'picnic_redbench1', 0, 31, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (515, 'picnic', 'picnic_firewood1', 8, 31, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (516, 'picnic', 'picnic_bench1', 12, 31, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (517, 'picnic', 'picnic_bench2', 13, 31, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (518, 'picnic', 'picnic_bench3', 14, 31, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (519, 'picnic', 'picnic_bench1', 18, 31, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (520, 'picnic', 'picnic_bench2', 19, 31, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (521, 'picnic', 'picnic_bench3', 20, 31, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (522, 'picnic', 'picnic_carrot', 27, 31, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (523, 'picnic', 'picnic_carrot', 28, 31, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (524, 'picnic', 'picnic_carrot', 29, 31, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (525, 'picnic', 'picnic_carrot', 30, 31, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (526, 'picnic', 'picnic_carrot', 31, 31, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (527, 'picnic', 'picnic_firewood1', 8, 32, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (528, 'picnic', 'picnic_table2', 12, 32, 2, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (529, 'picnic', 'picnic_table', 14, 32, 2, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (530, 'picnic', 'picnic_table2', 18, 32, 2, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (531, 'picnic', 'picnic_table', 20, 32, 2, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (532, 'picnic', 'hedge1', 3, 33, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (533, 'picnic', 'picnic_firewood1', 8, 33, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (534, 'picnic', 'picnic_bench1', 12, 33, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (535, 'picnic', 'picnic_bench2', 13, 33, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (536, 'picnic', 'picnic_bench3', 14, 33, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (537, 'picnic', 'picnic_bench1', 18, 33, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (538, 'picnic', 'picnic_bench2', 19, 33, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (539, 'picnic', 'picnic_bench3', 20, 33, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (540, 'picnic', 'picnic_cabbage', 27, 33, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (541, 'picnic', 'picnic_cabbage', 28, 33, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (542, 'picnic', 'picnic_cabbage', 29, 33, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (543, 'picnic', 'hedge5', 3, 34, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (544, 'picnic', 'picnic_firewood1', 8, 34, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (545, 'picnic', 'hedge5', 3, 35, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (546, 'picnic', 'picnic_firewood1', 8, 35, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (547, 'picnic', 'hedge5', 3, 36, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (548, 'picnic', 'picnic_firewood1', 8, 36, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (549, 'picnic', 'picnic_firewood1', 8, 37, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (550, 'picnic', 'picnic_bench1', 12, 37, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (551, 'picnic', 'picnic_bench2', 13, 37, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (552, 'picnic', 'picnic_bench3', 14, 37, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (553, 'picnic', 'picnic_bench1', 18, 37, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (554, 'picnic', 'picnic_bench2', 19, 37, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (555, 'picnic', 'picnic_bench3', 20, 37, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (556, 'picnic', 'picnic_firewood1', 8, 38, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (557, 'picnic', 'picnic_table2', 12, 38, 2, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (558, 'picnic', 'picnic_table', 14, 38, 2, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (559, 'picnic', 'picnic_table2', 18, 38, 2, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (560, 'picnic', 'picnic_table', 20, 38, 2, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (561, 'picnic', 'picnic_firewood3', 8, 39, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (562, 'picnic', 'picnic_bench1', 12, 39, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (563, 'picnic', 'picnic_bench2', 13, 39, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (564, 'picnic', 'picnic_bench3', 14, 39, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (565, 'picnic', 'picnic_bench1', 18, 39, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (566, 'picnic', 'picnic_bench2', 19, 39, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (567, 'picnic', 'picnic_bench3', 20, 39, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (568, 'park_a', 'bench2', 8, 9, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (569, 'park_a', 'bench', 9, 9, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (570, 'park_a', 'bench2', 7, 11, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (571, 'park_a', 'bench', 7, 12, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (572, 'park_a', 'bench2', 35, 16, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (573, 'park_a', 'bench2', 37, 16, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (574, 'park_a', 'bench', 38, 16, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (575, 'park_a', 'bench', 35, 17, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (576, 'park_a', 'bench2', 27, 18, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (577, 'park_a', 'bench', 28, 18, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (578, 'park_a', 'bench2', 35, 18, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (579, 'park_a', 'bench2', 25, 19, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (580, 'park_a', 'bench', 35, 19, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (581, 'park_a', 'bench', 25, 20, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (582, 'park_a', 'bench2', 25, 29, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (583, 'park_a', 'bench', 26, 29, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (584, 'park_a', 'bench2', 23, 30, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (585, 'park_a', 'bench', 23, 31, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (586, 'park_b', 'cornerchair2', 0, 0, 0, 4, 1, 1, 1, 'solid', '', NULL, NULL), + (587, 'park_b', 'cornerchair1', 1, 0, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (588, 'park_b', 'chair1', 2, 0, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (589, 'park_b', 'chair1', 3, 0, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (590, 'park_b', 'table1', 5, 0, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (591, 'park_b', 'chair1line', 6, 0, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (592, 'park_b', 'chair1', 7, 0, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (593, 'park_b', 'chair1frontend', 8, 0, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (594, 'park_b', 'bar_basic', 10, 0, 0, 4, 0.001, 1, 1, 'solid,private_furniture', '', NULL, NULL), + (595, 'park_b', 'cornerchair1', 0, 1, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (596, 'park_b', 'chair1', 0, 2, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (597, 'park_b', 'chair1', 0, 3, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (598, 'park_b', 'chair1', 0, 4, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (599, 'park_b', 'chair1frontend', 0, 5, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (600, 'park_b', 'table2', 3, 5, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (601, 'park_b', 'modchair', 5, 5, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (602, 'park_b', 'table2', 8, 5, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (603, 'pool_b', 'umbrella2', 33, 2, 7, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (604, 'pool_b', 'pool_2sofa2', 18, 3, 8, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (605, 'pool_b', 'pool_2sofa1', 19, 3, 8, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (606, 'pool_b', 'pool_2sofa2', 20, 3, 8, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (607, 'pool_b', 'pool_2sofa1', 21, 3, 8, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (608, 'pool_b', 'pool_2sofa2', 22, 3, 8, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (609, 'pool_b', 'pool_2sofa1', 23, 3, 8, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (610, 'pool_b', 'pool_chair2', 33, 3, 7, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (611, 'pool_b', 'pool_chair2', 32, 4, 7, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (612, 'pool_b', 'pool_table2', 33, 4, 7, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (613, 'pool_b', 'pool_chair2', 34, 4, 7, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (614, 'pool_b', 'pool_2sofa2', 16, 5, 8, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (615, 'pool_b', 'pool_chair2', 33, 5, 7, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (616, 'pool_b', 'pool_2sofa1', 16, 6, 8, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (617, 'pool_b', 'pool_2sofa2', 16, 7, 8, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (618, 'pool_b', 'pool_chair2', 35, 7, 7, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (619, 'pool_b', 'flower1', 14, 8, 9, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (620, 'pool_b', 'pool_2sofa1', 16, 8, 8, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (621, 'pool_b', 'umbrella2', 33, 8, 7, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (622, 'pool_b', 'pool_chair2', 34, 8, 7, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (623, 'pool_b', 'pool_table2', 35, 8, 7, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (624, 'pool_b', 'pool_chair2', 36, 8, 7, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (625, 'pool_b', 'pool_2sofa2', 14, 9, 9, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (626, 'pool_b', 'pool_2sofa2', 16, 9, 8, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (627, 'pool_b', 'pool_chair2', 35, 9, 7, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (628, 'pool_b', 'pool_2sofa1', 14, 10, 9, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (629, 'pool_b', 'pool_2sofa1', 16, 10, 8, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (630, 'pool_b', 'pool_2sofa2', 14, 11, 9, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (631, 'pool_b', 'pool_2sofa2', 16, 11, 8, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (632, 'pool_b', 'pool_2sofa1', 14, 12, 9, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (633, 'pool_b', 'pool_2sofa1', 16, 12, 8, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (634, 'pool_b', 'flower2b', 3, 13, 7, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (635, 'pool_b', 'flower2a', 4, 13, 7, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (636, 'pool_b', 'pool_2sofa2', 14, 13, 9, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (637, 'pool_b', 'pool_2sofa2', 16, 13, 8, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (638, 'pool_b', 'pool_2sofa1', 14, 14, 9, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (639, 'pool_b', 'pool_2sofa1', 16, 14, 8, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (640, 'pool_b', 'poolLift', 26, 4, 7, 0, 0.001, 1, 1, 'can_stand_on_top,invisible', 'door', NULL, NULL), + (641, 'pool_b', 'poolEnter', 17, 21, 7, 0, 0.001, 1, 1, 'can_stand_on_top,invisible', 'Splash0', '17 22 3 4', '17 23 3 4'), + (642, 'pool_b', 'poolExit', 17, 22, 0, 0, 0.001, 1, 1, 'can_stand_on_top,invisible', 'Splash0', '17 21 0 4', '17 20 0 4'), + (643, 'pool_b', 'poolExit', 20, 19, 0, 0, 0.001, 1, 1, 'can_stand_on_top,invisible', 'Splash1', '19 19 7 0', '18 19 7 0'), + (644, 'pool_b', 'poolEnter', 31, 10, 7, 0, 0.001, 1, 1, 'can_stand_on_top,invisible', 'Splash2', '31 11 0 4', '31 12 0 4'), + (645, 'pool_b', 'poolExit', 31, 11, 0, 0, 0.001, 1, 1, 'can_stand_on_top,invisible', 'Splash2', '31 10 7 0', '31 9 7 0'), + (646, 'pool_b', 'queue_tile2', 21, 9, 7, 0, 0.001, 1, 1, 'extra_parameter,can_stand_on_top', '', NULL, NULL), + (647, 'pool_b', 'queue_tile2', 21, 7, 7, 2, 0.001, 1, 1, 'extra_parameter,can_stand_on_top', '', NULL, NULL), + (648, 'pool_b', 'queue_tile2', 23, 7, 7, 2, 0.001, 1, 1, 'extra_parameter,can_stand_on_top', '', NULL, NULL), + (649, 'pool_b', 'queue_tile2', 26, 7, 7, 0, 0.001, 1, 1, 'extra_parameter,can_stand_on_top', '', NULL, NULL), + (650, 'pool_b', 'queue_tile2', 25, 7, 7, 2, 0.001, 1, 1, 'extra_parameter,can_stand_on_top', '', NULL, NULL), + (651, 'pool_b', 'queue_tile2', 22, 7, 7, 2, 0.001, 1, 1, 'extra_parameter,can_stand_on_top', '', NULL, NULL), + (652, 'pool_b', 'queue_tile2', 26, 5, 7, 0, 0.001, 1, 1, 'extra_parameter,can_stand_on_top', '', NULL, NULL), + (653, 'pool_b', 'queue_tile2', 21, 8, 7, 0, 0.001, 1, 1, 'extra_parameter,can_stand_on_top', '', NULL, NULL), + (654, 'pool_b', 'queue_tile2', 26, 6, 7, 0, 0.001, 1, 1, 'extra_parameter,can_stand_on_top', '', NULL, NULL), + (655, 'pool_b', 'queue_tile2', 24, 7, 7, 2, 0.001, 1, 1, 'extra_parameter,can_stand_on_top', '', NULL, NULL), + (656, 'ballroom', 'broom_bench1', 4, 0, 4, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (657, 'ballroom', 'broom_bench2', 5, 0, 4, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (658, 'ballroom', 'broom_bench3', 6, 0, 4, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (659, 'ballroom', 'broom_bench1', 7, 0, 4, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (660, 'ballroom', 'broom_bench2', 8, 0, 4, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (661, 'ballroom', 'broom_bench2', 9, 0, 4, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (662, 'ballroom', 'broom_bench3', 10, 0, 4, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (663, 'ballroom', 'broom_bench1', 11, 0, 4, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (664, 'ballroom', 'broom_bench2', 12, 0, 4, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (665, 'ballroom', 'broom_bench2', 13, 0, 4, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (666, 'ballroom', 'broom_bench2', 14, 0, 4, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (667, 'ballroom', 'broom_bench3', 15, 0, 4, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (668, 'ballroom', 'broom_bench1', 16, 0, 4, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (669, 'ballroom', 'broom_bench2', 17, 0, 4, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (670, 'ballroom', 'broom_bench2', 18, 0, 4, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (671, 'ballroom', 'broom_bench3', 19, 0, 4, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (672, 'ballroom', 'broom_bench1', 20, 0, 4, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (673, 'ballroom', 'broom_bench2', 21, 0, 4, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (674, 'ballroom', 'broom_bench3', 22, 0, 4, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (675, 'ballroom', 'broom_seatb1', 7, 3, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (676, 'ballroom', 'broom_seatb2', 8, 3, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (677, 'ballroom', 'broom_seatb3', 9, 3, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (678, 'ballroom', 'broom_seatb4', 10, 3, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (679, 'ballroom', 'broom_seat1', 16, 3, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (680, 'ballroom', 'broom_seat2', 17, 3, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (681, 'ballroom', 'broom_seat3', 18, 3, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (682, 'ballroom', 'broom_seat4', 19, 3, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (683, 'ballroom', 'broom_seatb1', 7, 6, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (684, 'ballroom', 'broom_seatb2', 8, 6, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (685, 'ballroom', 'broom_seatb3', 9, 6, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (686, 'ballroom', 'broom_seatb4', 10, 6, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (687, 'ballroom', 'broom_seat1', 16, 6, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (688, 'ballroom', 'broom_seat2', 17, 6, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (689, 'ballroom', 'broom_seat3', 18, 6, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (690, 'ballroom', 'broom_seat4', 19, 6, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (691, 'ballroom', 'broom_chair', 19, 10, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (692, 'ballroom', 'broom_chair', 20, 10, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (693, 'ballroom', 'broom_chair', 21, 10, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (694, 'ballroom', 'broom_table1', 19, 11, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (695, 'ballroom', 'broom_table2', 20, 11, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (696, 'ballroom', 'broom_table3', 21, 11, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (697, 'ballroom', 'broom_chair', 19, 12, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (698, 'ballroom', 'broom_chair', 20, 12, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (699, 'ballroom', 'broom_chair', 21, 12, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (700, 'ballroom', 'broom_chair', 19, 15, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (701, 'ballroom', 'broom_chair', 20, 15, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (702, 'ballroom', 'broom_chair', 21, 15, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (703, 'ballroom', 'broom_table1', 19, 16, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (704, 'ballroom', 'broom_table2', 20, 16, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (705, 'ballroom', 'broom_table3', 21, 16, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (706, 'ballroom', 'broom_chair', 19, 17, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (707, 'ballroom', 'broom_chair', 20, 17, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (708, 'ballroom', 'broom_chair', 21, 17, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (709, 'ballroom', 'broom_stool', 9, 20, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (710, 'ballroom', 'broom_stool', 9, 21, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (711, 'ballroom', 'broom_stool', 9, 22, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (712, 'ballroom', 'broom_stool', 9, 23, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (713, 'cafe_gold0', 'gold_chair', 5, 3, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (714, 'cafe_gold0', 'gold_table_small1', 6, 3, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (715, 'cafe_gold0', 'gold_chair', 7, 3, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (716, 'cafe_gold0', 'gold_bardesk5', 10, 3, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (717, 'cafe_gold0', 'gold_bardesk4', 11, 3, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (718, 'cafe_gold0', 'gold_bardesk3', 12, 3, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (719, 'cafe_gold0', 'gold_bardesk2', 13, 3, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (720, 'cafe_gold0', 'gold_bardesk1', 14, 3, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (721, 'cafe_gold0', 'gold_chair', 5, 4, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (722, 'cafe_gold0', 'gold_table_small2', 6, 4, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (723, 'cafe_gold0', 'gold_chair', 7, 4, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (724, 'cafe_gold0', 'gold_chair', 0, 5, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (725, 'cafe_gold0', 'gold_table_small1', 1, 5, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (726, 'cafe_gold0', 'gold_chair', 2, 5, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (727, 'cafe_gold0', 'gold_chair', 0, 6, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (728, 'cafe_gold0', 'gold_table_small2', 1, 6, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (729, 'cafe_gold0', 'gold_chair', 2, 6, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (730, 'cafe_gold0', 'gold_chair', 5, 6, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (731, 'cafe_gold0', 'gold_table_small1', 6, 6, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (732, 'cafe_gold0', 'gold_chair', 7, 6, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (733, 'cafe_gold0', 'gold_chair', 5, 7, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (734, 'cafe_gold0', 'gold_table_small2', 6, 7, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (735, 'cafe_gold0', 'gold_chair', 7, 7, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (736, 'cafe_gold0', 'gold_chair', 0, 8, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (737, 'cafe_gold0', 'gold_table_small1', 1, 8, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (738, 'cafe_gold0', 'gold_chair', 2, 8, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (739, 'cafe_gold0', 'gold_chair', 19, 8, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (740, 'cafe_gold0', 'gold_chair', 20, 8, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (741, 'cafe_gold0', 'gold_chair', 0, 9, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (742, 'cafe_gold0', 'gold_table_small2', 1, 9, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (743, 'cafe_gold0', 'gold_chair', 2, 9, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (744, 'cafe_gold0', 'gold_chair', 14, 9, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (745, 'cafe_gold0', 'gold_chair', 15, 9, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (746, 'cafe_gold0', 'gold_table_small1', 19, 10, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (747, 'cafe_gold0', 'gold_table_small2', 20, 10, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (748, 'cafe_gold0', 'gold_table_small1', 14, 11, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (749, 'cafe_gold0', 'gold_table_small2', 15, 11, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (750, 'cafe_gold0', 'gold_plant', 0, 12, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (751, 'cafe_gold0', 'gold_chair', 1, 12, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (752, 'cafe_gold0', 'gold_chair', 2, 12, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (753, 'cafe_gold0', 'gold_chair', 3, 12, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (754, 'cafe_gold0', 'gold_chair', 19, 12, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (755, 'cafe_gold0', 'gold_chair', 20, 12, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (756, 'cafe_gold0', 'gold_plant', 0, 13, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (757, 'cafe_gold0', 'gold_chair', 1, 13, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (758, 'cafe_gold0', 'gold_chair', 2, 13, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (759, 'cafe_gold0', 'gold_chair', 3, 13, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (760, 'cafe_gold0', 'gold_chair', 14, 13, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (761, 'cafe_gold0', 'gold_chair', 15, 13, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (762, 'cafe_gold0', 'gold_chair', 0, 14, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (763, 'cafe_gold0', 'gold_chair', 14, 14, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (764, 'cafe_gold0', 'gold_chair', 15, 14, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (765, 'cafe_gold0', 'gold_chair', 0, 15, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (766, 'cafe_gold0', 'gold_table_small1', 2, 15, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (767, 'cafe_gold0', 'gold_table_small2', 3, 15, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (768, 'cafe_gold0', 'gold_chair', 0, 16, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (769, 'cafe_gold0', 'gold_table_small1', 14, 16, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (770, 'cafe_gold0', 'gold_table_small2', 15, 16, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (771, 'cafe_gold0', 'gold_plant', 0, 17, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (772, 'cafe_gold0', 'gold_chair', 1, 17, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (773, 'cafe_gold0', 'gold_chair', 2, 17, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (774, 'cafe_gold0', 'gold_chair', 3, 17, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (775, 'cafe_gold0', 'gold_plant', 0, 18, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (776, 'cafe_gold0', 'gold_chair', 1, 18, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (777, 'cafe_gold0', 'gold_chair', 2, 18, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (778, 'cafe_gold0', 'gold_chair', 3, 18, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (779, 'cafe_gold0', 'gold_chair', 14, 18, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (780, 'cafe_gold0', 'gold_chair', 15, 18, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (781, 'cafe_gold0', 'gold_chair', 0, 19, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (782, 'cafe_gold0', 'gold_chair', 0, 20, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (783, 'cafe_gold0', 'gold_table_small1', 2, 20, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (784, 'cafe_gold0', 'gold_table_small2', 3, 20, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (785, 'cafe_gold0', 'gold_chair', 0, 21, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (786, 'cafe_gold0', 'gold_plant', 0, 22, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (787, 'cafe_gold0', 'gold_chair', 1, 22, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (788, 'cafe_gold0', 'gold_chair', 2, 22, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (789, 'cafe_gold0', 'gold_chair', 3, 22, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (790, 'cafe_gold0', 'gold_plant', 0, 23, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (791, 'cafe_gold0', 'gold_chair', 1, 23, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (792, 'cafe_gold0', 'gold_chair', 2, 23, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (793, 'cafe_gold0', 'gold_chair', 3, 23, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (794, 'cafe_gold0', 'gold_chair', 0, 24, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (795, 'cafe_gold0', 'gold_chair', 0, 25, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (796, 'cafe_gold0', 'gold_table_small1', 2, 25, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (797, 'cafe_gold0', 'gold_table_small2', 3, 25, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (798, 'cafe_gold0', 'gold_chair', 0, 26, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (799, 'cafe_gold0', 'gold_chair', 1, 27, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (800, 'cafe_gold0', 'gold_chair', 2, 27, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (801, 'cafe_gold0', 'gold_chair', 3, 27, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (802, 'gate_park', 'gate_drumchair', 11, 15, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (803, 'gate_park', 'gate_drumchair', 12, 14, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (804, 'gate_park', 'gate_drumchair', 12, 16, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (805, 'gate_park', 'gate_drumchair', 16, 15, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (806, 'gate_park', 'gate_drumchair', 17, 14, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (807, 'gate_park', 'gate_drumchair', 17, 16, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (808, 'gate_park', 'gate_drumchair', 18, 15, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (809, 'gate_park', 'gate_drumchair', 21, 15, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (810, 'gate_park', 'gate_drumchair', 22, 14, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (811, 'gate_park', 'gate_drumchair', 22, 16, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (812, 'gate_park', 'gate_drumchair', 23, 15, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (813, 'gate_park', 'gate_drumchair', 29, 13, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (814, 'gate_park', 'gate_drumchair', 29, 17, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (815, 'gate_park', 'gate_drumchair', 30, 13, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (816, 'gate_park', 'gate_drumchair', 30, 17, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (817, 'gate_park', 'gate_lantern', 26, 15, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (818, 'gate_park', 'gate_lantern', 8, 15, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (819, 'gate_park', 'gate_rockchair1', 10, 18, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (820, 'gate_park', 'gate_rockchair1', 10, 21, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (821, 'gate_park', 'gate_rockchair1', 14, 18, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (822, 'gate_park', 'gate_rockchair1', 20, 21, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (823, 'gate_park', 'gate_rockchair1', 23, 18, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (824, 'gate_park', 'gate_rockchair2', 10, 19, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (825, 'gate_park', 'gate_rockchair2', 14, 20, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (826, 'gate_park', 'gate_rockchair2', 20, 19, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (827, 'gate_park', 'gate_rockchair2', 22, 18, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (828, 'gate_park', 'gate_rockchair3', 10, 20, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (829, 'gate_park', 'gate_rockchair3', 14, 19, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (830, 'gate_park', 'gate_rockchair3', 20, 20, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (831, 'gate_park', 'gate_rockchair3', 21, 18, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (832, 'gate_park', 'gate_table', 12, 15, 0, 0, 1, 1, 1, 'solid', '', NULL, NULL), + (833, 'gate_park', 'gate_table', 17, 15, 0, 0, 1, 1, 1, 'solid', '', NULL, NULL), + (834, 'gate_park', 'gate_table', 22, 15, 0, 0, 1, 1, 1, 'solid', '', NULL, NULL), + (835, 'gate_park', 'gate_table1', 15, 5, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (836, 'gate_park', 'gate_table1', 19, 5, 2, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (837, 'gate_park', 'gate_table1', 2, 10, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (838, 'gate_park', 'gate_table1', 2, 11, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (839, 'gate_park', 'gate_table1', 2, 14, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (840, 'gate_park', 'gate_table1', 2, 7, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (841, 'gate_park', 'gate_table2', 15, 6, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (842, 'gate_park', 'gate_table2', 19, 6, 2, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (843, 'gate_park', 'gate_table2', 3, 10, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (844, 'gate_park', 'gate_table2', 3, 11, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (845, 'gate_park', 'gate_table2', 3, 14, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (846, 'gate_park', 'gate_table2', 3, 7, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (847, 'gate_park', 'gate_table3', 15, 7, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (848, 'gate_park', 'gate_table3', 19, 7, 2, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (849, 'gate_park', 'gate_table3', 4, 10, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (850, 'gate_park', 'gate_table3', 4, 11, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (851, 'gate_park', 'gate_table3', 4, 14, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (852, 'gate_park', 'gate_table3', 4, 7, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (853, 'gate_park', 'gate_talltree', 10, 22, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (854, 'gate_park', 'gate_talltree', 10, 23, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (855, 'gate_park', 'gate_trashcan', 20, 18, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (856, 'gate_park_2', 'gate_table1', 12, 0, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (857, 'gate_park_2', 'gate_table2', 13, 0, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (858, 'gate_park_2', 'gate_table3', 14, 0, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (859, 'gate_park_2', 'gate_table1', 16, 0, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (860, 'gate_park_2', 'gate_table3', 17, 0, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (861, 'gate_park_2', 'gate_table1', 19, 0, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (862, 'gate_park_2', 'gate_table2', 20, 0, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (863, 'gate_park_2', 'gate_table3', 21, 0, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (864, 'gate_park_2', 'gate_talltree', 9, 7, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (865, 'gate_park_2', 'gate_drumchair', 14, 8, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (866, 'gate_park_2', 'gate_drumchair', 19, 8, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (867, 'gate_park_2', 'gate_talltree', 9, 9, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (868, 'gate_park_2', 'gate_drumchair', 13, 9, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (869, 'gate_park_2', 'gate_table', 14, 9, 0, 0, 1, 1, 1, 'solid', '', NULL, NULL), + (870, 'gate_park_2', 'gate_drumchair', 15, 9, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (871, 'gate_park_2', 'gate_drumchair', 18, 9, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (872, 'gate_park_2', 'gate_table', 19, 9, 0, 0, 1, 1, 1, 'solid', '', NULL, NULL), + (873, 'gate_park_2', 'gate_drumchair', 20, 9, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (874, 'gate_park_2', 'gate_talltree', 6, 10, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (875, 'gate_park_2', 'gate_talltree', 8, 10, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (876, 'gate_park_2', 'gate_drumchair', 14, 10, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (877, 'gate_park_2', 'gate_drumchair', 19, 10, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (878, 'gate_park_2', 'gate_rockchair3', 6, 11, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (879, 'gate_park_2', 'gate_rockchair2', 8, 11, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (880, 'gate_park_2', 'gate_drumchair', 1, 12, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (881, 'gate_park_2', 'gate_drumchair', 2, 12, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (882, 'gate_park_2', 'gate_rockchair1', 6, 12, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (883, 'gate_park_2', 'gate_talltree', 27, 12, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (884, 'gate_park_2', 'gate_talltree', 30, 12, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (885, 'gate_park_2', 'gate_drumchair', 1, 14, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (886, 'gate_park_2', 'gate_drumchair', 2, 14, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (887, 'gate_park_2', 'gate_rockchair1', 6, 15, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (888, 'gate_park_2', 'gate_trashcan', 27, 15, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (889, 'gate_park_2', 'gate_rockchair2', 6, 16, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (890, 'gate_park_2', 'gate_rockchair3', 8, 16, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (891, 'gate_park_2', 'gate_table1', 31, 16, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (892, 'gate_park_2', 'gate_table3', 32, 16, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (893, 'gate_park_2', 'gate_drumchair', 14, 17, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (894, 'gate_park_2', 'gate_drumchair', 19, 17, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (895, 'gate_park_2', 'gate_drumchair', 13, 18, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (896, 'gate_park_2', 'gate_table', 14, 18, 0, 0, 1, 1, 1, 'solid', '', NULL, NULL), + (897, 'gate_park_2', 'gate_drumchair', 15, 18, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (898, 'gate_park_2', 'gate_drumchair', 18, 18, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (899, 'gate_park_2', 'gate_table', 19, 18, 0, 0, 1, 1, 1, 'solid', '', NULL, NULL), + (900, 'gate_park_2', 'gate_drumchair', 20, 18, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (901, 'gate_park_2', 'gate_drumchair', 14, 19, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (902, 'gate_park_2', 'gate_drumchair', 19, 19, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (903, 'gate_park_2', 'gate_table1', 31, 19, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (904, 'gate_park_2', 'gate_table3', 32, 19, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (905, 'gate_park_2', 'gate_lantern', 29, 22, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (906, 'gate_park_2', 'gate_trashcan', 8, 23, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (907, 'gate_park_2', 'gate_table1', 23, 24, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (908, 'gate_park_2', 'gate_table1', 26, 24, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (909, 'gate_park_2', 'gate_table3', 23, 25, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (910, 'gate_park_2', 'gate_table3', 26, 25, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (911, 'sun_terrace', 'sun_chair', 16, 11, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (912, 'sun_terrace', 'sun_chair', 20, 11, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (913, 'sun_terrace', 'sun_chair', 16, 12, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (914, 'sun_terrace', 'sun_chair', 20, 12, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (915, 'sun_terrace', 'blusun_chair', 10, 13, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (916, 'sun_terrace', 'sun_chair', 16, 13, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (917, 'sun_terrace', 'sun_chair', 20, 13, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (918, 'sun_terrace', 'sun_table', 10, 14, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (919, 'sun_terrace', 'sun_chair', 20, 14, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (920, 'sun_terrace', 'blusun_chair', 10, 15, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (921, 'sun_terrace', 'sun_chair', 1, 18, 8, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (922, 'sun_terrace', 'sun_chair', 4, 18, 6, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (923, 'sun_terrace', 'blusun_chair', 11, 18, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (924, 'sun_terrace', 'blusun_chair', 10, 19, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (925, 'sun_terrace', 'sun_table', 11, 19, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (926, 'sun_terrace', 'blusun_chair', 12, 19, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (927, 'sun_terrace', 'sun_chair', 18, 19, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (928, 'sun_terrace', 'sun_chair', 22, 19, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (929, 'sun_terrace', 'blusun_chair', 11, 20, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (930, 'sun_terrace', 'sun_chair', 18, 20, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (931, 'sun_terrace', 'sun_chair', 22, 20, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (932, 'sun_terrace', 'sun_chair', 4, 21, 6, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (933, 'sun_terrace', 'sun_chair', 6, 21, 4, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (934, 'sun_terrace', 'sun_chair', 18, 21, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (935, 'sun_terrace', 'sun_chair', 22, 21, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (936, 'sun_terrace', 'blusun_chair', 2, 22, 9, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (937, 'sun_terrace', 'sun_chair', 22, 22, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (938, 'sun_terrace', 'blusun_chair', 1, 23, 9, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (939, 'sun_terrace', 'sun_table2', 2, 23, 9, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (940, 'sun_terrace', 'blusun_chair', 2, 24, 9, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (941, 'sun_terrace', 'sun_chair', 11, 25, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (942, 'sun_terrace', 'sun_chair', 12, 25, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (943, 'sun_terrace', 'sun_chair', 13, 25, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (944, 'sun_terrace', 'sun_table', 14, 25, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (945, 'sun_terrace', 'sun_chair', 15, 25, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (946, 'sun_terrace', 'sun_chair', 16, 25, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (947, 'sun_terrace', 'sun_chair', 17, 25, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (948, 'sun_terrace', 'sun_chair', 13, 29, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (949, 'sun_terrace', 'sun_chair', 15, 29, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (950, 'sun_terrace', 'sun_chair', 17, 29, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (951, 'sun_terrace', 'sun_chair', 13, 30, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (952, 'sun_terrace', 'sun_chair', 15, 30, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (953, 'sun_terrace', 'sun_chair', 17, 30, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (954, 'space_cafe', 'bigtablea', 1, 10, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (955, 'space_cafe', 'bigtablea', 7, 10, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (956, 'space_cafe', 'bigtableb', 0, 10, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (957, 'space_cafe', 'bigtableb', 6, 10, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (958, 'space_cafe', 'bigtablec', 1, 9, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (959, 'space_cafe', 'bigtablec', 7, 9, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (960, 'space_cafe', 'bigtabled', 0, 9, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (961, 'space_cafe', 'bigtabled', 6, 9, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (962, 'space_cafe', 'bluesofaa', 1, 11, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (963, 'space_cafe', 'bluesofaa', 1, 8, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (964, 'space_cafe', 'bluesofaa', 14, 22, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (965, 'space_cafe', 'bluesofaa', 14, 24, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (966, 'space_cafe', 'bluesofaa', 2, 10, 2, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (967, 'space_cafe', 'bluesofab', 0, 11, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (968, 'space_cafe', 'bluesofab', 0, 8, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (969, 'space_cafe', 'bluesofab', 13, 22, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (970, 'space_cafe', 'bluesofab', 13, 24, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (971, 'space_cafe', 'bluesofab', 2, 9, 2, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (972, 'space_cafe', 'midtablea', 14, 23, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (973, 'space_cafe', 'midtablea', 19, 14, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (974, 'space_cafe', 'midtableb', 13, 23, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (975, 'space_cafe', 'midtableb', 19, 13, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (976, 'space_cafe', 'redsofaa', 10, 22, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (977, 'space_cafe', 'redsofaa', 10, 25, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (978, 'space_cafe', 'redsofaa', 18, 14, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (979, 'space_cafe', 'redsofaa', 20, 14, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (980, 'space_cafe', 'redsofaa', 5, 10, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (981, 'space_cafe', 'redsofaa', 7, 11, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (982, 'space_cafe', 'redsofaa', 7, 8, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (983, 'space_cafe', 'redsofab', 10, 21, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (984, 'space_cafe', 'redsofab', 10, 24, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (985, 'space_cafe', 'redsofab', 18, 13, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (986, 'space_cafe', 'redsofab', 20, 13, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (987, 'space_cafe', 'redsofab', 5, 9, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (988, 'space_cafe', 'redsofab', 6, 11, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (989, 'space_cafe', 'redsofab', 6, 8, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (990, 'space_cafe', 'smalltable', 10, 23, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (991, 'space_cafe', 'smalltable', 17, 6, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (992, 'space_cafe', 'smalltable', 19, 2, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (993, 'space_cafe', 'smalltable', 21, 6, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (994, 'space_cafe', 'smalltable', 23, 2, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (995, 'space_cafe', 'smalltable', 3, 16, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (996, 'space_cafe', 'space_stool', 19, 1, 3, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (997, 'space_cafe', 'space_stool', 17, 5, 3, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (998, 'space_cafe', 'space_stool', 17, 7, 3, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (999, 'space_cafe', 'space_stool', 18, 2, 3, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1000, 'space_cafe', 'space_stool', 18, 6, 3, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1001, 'space_cafe', 'space_stool', 19, 3, 3, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1002, 'space_cafe', 'space_stool', 20, 2, 3, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1003, 'space_cafe', 'space_stool', 20, 6, 3, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1004, 'space_cafe', 'space_stool', 21, 5, 3, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1005, 'space_cafe', 'space_stool', 21, 7, 3, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1006, 'space_cafe', 'space_stool', 22, 2, 3, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1007, 'space_cafe', 'space_stool', 22, 6, 3, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1008, 'space_cafe', 'space_stool', 23, 1, 3, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1009, 'space_cafe', 'space_stool', 23, 3, 3, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1010, 'space_cafe', 'space_stool', 3, 15, 3, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1011, 'space_cafe', 'space_stool', 3, 17, 3, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1012, 'beauty_salon0', 'directorchair', 16, 13, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1013, 'beauty_salon0', 'directorchair', 16, 14, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1014, 'beauty_salon0', 'directorchair', 18, 13, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1015, 'beauty_salon0', 'directorchair', 9, 13, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1016, 'beauty_salon0', 'longchair1', 12, 17, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1017, 'beauty_salon0', 'longchair1', 13, 16, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1018, 'beauty_salon0', 'longchair1', 13, 21, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1019, 'beauty_salon0', 'longchair1', 17, 17, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1020, 'beauty_salon0', 'longchair2', 12, 18, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1021, 'beauty_salon0', 'longchair2', 12, 19, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1022, 'beauty_salon0', 'longchair2', 14, 16, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1023, 'beauty_salon0', 'longchair2', 14, 21, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1024, 'beauty_salon0', 'longchair2', 15, 16, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1025, 'beauty_salon0', 'longchair2', 15, 21, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1026, 'beauty_salon0', 'longchair2', 17, 18, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1027, 'beauty_salon0', 'longchair2', 17, 19, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1028, 'beauty_salon0', 'longchair3', 12, 20, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1029, 'beauty_salon0', 'longchair3', 16, 16, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1030, 'beauty_salon0', 'longchair3', 16, 21, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1031, 'beauty_salon0', 'longchair3', 17, 20, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1032, 'beauty_salon0', 'pinkchair', 11, 6, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1033, 'beauty_salon0', 'pinkchair', 11, 7, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1034, 'beauty_salon0', 'pinkchair', 3, 8, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1035, 'beauty_salon0', 'pinkchair', 4, 11, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1036, 'beauty_salon0', 'pinkchair', 6, 10, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1037, 'beauty_salon0', 'pinkchair', 7, 10, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1038, 'beauty_salon0', 'pinkchair', 8, 10, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1039, 'beauty_salon0', 'table2', 2, 17, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1040, 'beauty_salon0', 'table2', 2, 18, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1041, 'beauty_salon0', 'table2', 2, 19, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1042, 'beauty_salon0', 'table2', 2, 20, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1043, 'beauty_salon0', 'table2', 8, 18, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1044, 'beauty_salon0', 'table2', 8, 19, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1045, 'beauty_salon0', 'table2', 8, 20, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1046, 'beauty_salon0', 'table2', 8, 21, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1047, 'chill', 'jap_chair', 3, 24, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1048, 'chill', 'jap_chair', 3, 26, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1049, 'chill', 'jap_chair', 3, 29, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1050, 'chill', 'jap_chair', 4, 20, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1051, 'chill', 'jap_chair', 4, 21, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1052, 'chill', 'jap_chair', 4, 24, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1053, 'chill', 'jap_chair', 4, 26, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1054, 'chill', 'jap_chair', 4, 29, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1055, 'chill', 'jap_chair', 5, 24, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1056, 'chill', 'jap_chair', 5, 26, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1057, 'chill', 'jap_chair', 5, 30, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1058, 'chill', 'jap_chair', 6, 20, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1059, 'chill', 'jap_chair', 6, 21, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1060, 'chill', 'jap_stool', 13, 19, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1061, 'chill', 'jap_stool', 16, 24, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1062, 'chill', 'jap_stool', 16, 25, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1063, 'chill', 'jap_stool', 16, 26, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1064, 'chill', 'jap_table', 3, 25, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1065, 'chill', 'jap_table', 3, 30, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1066, 'chill', 'jap_table', 5, 20, 0, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1067, 'chill', 'jap_table2', 4, 25, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1068, 'chill', 'jap_table3', 4, 30, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1069, 'chill', 'jap_table3', 5, 21, 0, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1070, 'chill', 'jap_table3', 5, 25, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1071, 'chill', 'stone', 11, 3, 0, 4, 2, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1072, 'chill', 'stone', 13, 10, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1073, 'chill', 'stone', 13, 7, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1074, 'chill', 'stone', 13, 8, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1075, 'chill', 'stone', 14, 13, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1076, 'chill', 'stone', 15, 14, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1077, 'chill', 'stone', 17, 15, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1078, 'chill', 'stone', 8, 8, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1079, 'chill', 'stone', 9, 7, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1080, 'dusty_lounge', 'dustylamp', 11, 14, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1081, 'dusty_lounge', 'dustylamp', 11, 19, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1082, 'dusty_lounge', 'dustylamp', 20, 6, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1083, 'dusty_lounge', 'dustylamp', 24, 17, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1084, 'dusty_lounge', 'dustylamp', 28, 6, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1085, 'dusty_lounge', 'greenchair1', 11, 13, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1086, 'dusty_lounge', 'greenchair1', 11, 16, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1087, 'dusty_lounge', 'greenchair1', 12, 24, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1088, 'dusty_lounge', 'greenchair1', 14, 24, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1089, 'dusty_lounge', 'greenchair1', 4, 13, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1090, 'dusty_lounge', 'greenchair1', 4, 15, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1091, 'dusty_lounge', 'greenchair1', 4, 7, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1092, 'dusty_lounge', 'greenchair1', 4, 9, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1093, 'dusty_lounge', 'greenchair1', 9, 4, 3, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1094, 'dusty_lounge', 'greenchair1', 9, 6, 3, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1095, 'dusty_lounge', 'greenchair2', 11, 12, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1096, 'dusty_lounge', 'greenchair2', 11, 15, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1097, 'dusty_lounge', 'greenchair2', 12, 23, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1098, 'dusty_lounge', 'greenchair2', 14, 23, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1099, 'dusty_lounge', 'greenchair2', 3, 13, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1100, 'dusty_lounge', 'greenchair2', 3, 15, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1101, 'dusty_lounge', 'greenchair2', 3, 7, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1102, 'dusty_lounge', 'greenchair2', 3, 9, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1103, 'dusty_lounge', 'greenchair2', 8, 4, 3, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1104, 'dusty_lounge', 'greenchair2', 8, 6, 3, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1105, 'dusty_lounge', 'yellowchair', 21, 10, 3, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1106, 'dusty_lounge', 'yellowchair', 22, 17, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1107, 'dusty_lounge', 'yellowchair', 23, 10, 3, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1108, 'dusty_lounge', 'yellowchair', 24, 15, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1109, 'dusty_lounge', 'yellowchair', 24, 19, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1110, 'dusty_lounge', 'yellowchair', 26, 10, 3, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1111, 'dusty_lounge', 'yellowchair', 26, 17, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1112, 'dusty_lounge', 'yellowchair', 28, 10, 3, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1113, 'cr_staff', 'crs_lamptable', 7, 0, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1114, 'cr_staff', 'tvtable', 14, 1, 0, 2, 0.001, 1, 2, 'solid', '', NULL, NULL), + (1115, 'cr_staff', 'crs_trash', 0, 2, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1116, 'cr_staff', 'crs_sofag_start', 2, 2, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1117, 'cr_staff', 'crs_sofag_mid', 3, 2, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1118, 'cr_staff', 'crs_sofag_mid', 4, 2, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1119, 'cr_staff', 'crs_sofag_end', 5, 2, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1120, 'cr_staff', 'crs_roundwoodtable', 12, 4, 0, 2, 0.001, 2, 2, 'extra_parameter', '', NULL, NULL), + (1121, 'cr_staff', 'crs_woodchair', 15, 4, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1122, 'cr_staff', 'crs_woodchair', 10, 5, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1123, 'cr_staff', 'crs_woodchair', 15, 6, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1124, 'cr_staff', 'crs_woodchair', 7, 7, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1125, 'cr_staff', 'crs_woodchair', 13, 8, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1126, 'cr_staff', 'crs_woodchair', 15, 8, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1127, 'cr_staff', 'crs_woodchair', 5, 9, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1128, 'cr_staff', 'crs_fridge', 0, 10, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1129, 'cr_staff', 'ctable2', 7, 10, 0, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1130, 'cr_staff', 'crs_woodtable_end', 13, 10, 0, 0, 0.001, 1, 2, 'extra_parameter', '', NULL, NULL), + (1131, 'cr_staff', 'crs_woodtable_start', 14, 10, 0, 0, 0.001, 2, 2, 'extra_parameter', '', NULL, NULL), + (1132, 'cr_staff', 'crs_woodchair', 5, 11, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1133, 'cr_staff', 'crs_box', 1, 12, 0, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1134, 'cr_staff', 'crs_box', 1, 13, 0, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1135, 'cr_staff', 'ctable1', 7, 13, 0, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1136, 'cr_staff', 'crs_woodchair', 13, 13, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1137, 'cr_staff', 'crs_woodchair', 15, 13, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1138, 'cr_staff', 'crs_box', 1, 15, 0, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1139, 'cr_staff', 'crs_boxopen', 1, 17, 0, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1140, 'cr_staff', 'crs_stomp', 15, 17, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1141, 'cr_staff', 'crs_box', 1, 18, 0, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1142, 'cr_staff', 'crs_stomp', 15, 18, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1143, 'cr_staff', 'crs_boxtwo', 1, 19, 0, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1144, 'rooftop', 'rooftop_emptytable', 0, 10, 4, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1145, 'rooftop', 'rooftop_flatcurb', 1, 13, 4, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1146, 'rooftop', 'rooftop_flatcurb', 13, 13, 4, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1147, 'rooftop', 'rooftop_flatcurb', 16, 1, 4, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1148, 'rooftop', 'rooftop_flatcurb', 16, 4, 4, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1149, 'rooftop', 'rooftop_flatcurb', 6, 13, 4, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1150, 'rooftop', 'rooftop_flatcurb', 8, 13, 4, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1151, 'rooftop', 'rooftop_flatcurb2', 17, 1, 4, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1152, 'rooftop', 'rooftop_flatcurb2', 17, 4, 4, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1153, 'rooftop', 'rooftop_flatcurb3', 1, 14, 4, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1154, 'rooftop', 'rooftop_flatcurb3', 1, 15, 4, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1155, 'rooftop', 'rooftop_flatcurb3', 1, 16, 4, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1156, 'rooftop', 'rooftop_flatcurb3', 10, 17, 4, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1157, 'rooftop', 'rooftop_flatcurb3', 11, 17, 4, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1158, 'rooftop', 'rooftop_flatcurb3', 12, 17, 4, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1159, 'rooftop', 'rooftop_flatcurb3', 13, 14, 4, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1160, 'rooftop', 'rooftop_flatcurb3', 13, 15, 4, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1161, 'rooftop', 'rooftop_flatcurb3', 13, 16, 4, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1162, 'rooftop', 'rooftop_flatcurb3', 2, 17, 4, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1163, 'rooftop', 'rooftop_flatcurb3', 3, 17, 4, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1164, 'rooftop', 'rooftop_flatcurb3', 4, 17, 4, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1165, 'rooftop', 'rooftop_flatcurb3', 5, 17, 4, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1166, 'rooftop', 'rooftop_flatcurb3', 6, 14, 4, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1167, 'rooftop', 'rooftop_flatcurb3', 6, 15, 4, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1168, 'rooftop', 'rooftop_flatcurb3', 6, 16, 4, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1169, 'rooftop', 'rooftop_flatcurb3', 8, 14, 4, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1170, 'rooftop', 'rooftop_flatcurb3', 8, 15, 4, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1171, 'rooftop', 'rooftop_flatcurb3', 8, 16, 4, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1172, 'rooftop', 'rooftop_flatcurb3', 9, 17, 4, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1173, 'rooftop', 'rooftop_flatcurb4', 1, 17, 4, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1174, 'rooftop', 'rooftop_flatcurb4', 8, 17, 4, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1175, 'rooftop', 'rooftop_flatcurb5', 13, 17, 4, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1176, 'rooftop', 'rooftop_flatcurb5', 6, 17, 4, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1177, 'rooftop', 'rooftop_minichair', 0, 1, 4, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1178, 'rooftop', 'rooftop_minichair', 0, 11, 4, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1179, 'rooftop', 'rooftop_minichair', 0, 3, 4, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1180, 'rooftop', 'rooftop_minichair', 0, 9, 4, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1181, 'rooftop', 'rooftop_minichair', 1, 2, 4, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1182, 'rooftop', 'rooftop_minichair', 1, 7, 4, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1183, 'rooftop', 'rooftop_minichair', 2, 6, 4, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1184, 'rooftop', 'rooftop_minichair', 2, 8, 4, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1185, 'rooftop', 'rooftop_minichair', 3, 7, 4, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1186, 'rooftop', 'rooftop_rodtable', 0, 2, 4, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1187, 'rooftop', 'rooftop_rodtable', 2, 7, 4, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1188, 'rooftop_2', 'rooftop_bigchair', 8, 0, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1189, 'rooftop_2', 'rooftop_bigtable', 8, 1, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1190, 'rooftop_2', 'rooftop_sofab', 0, 2, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1191, 'rooftop_2', 'rooftop_sofa', 1, 2, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1192, 'rooftop_2', 'rooftop_bigchair', 8, 2, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1193, 'rooftop_2', 'rooftop_bigchair', 8, 3, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1194, 'rooftop_2', 'rooftop_bigtable', 8, 4, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1195, 'rooftop_2', 'rooftop_sofab', 0, 5, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1196, 'rooftop_2', 'rooftop_sofa', 1, 5, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1197, 'rooftop_2', 'rooftop_bigchair', 8, 5, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1198, 'rooftop_2', 'rooftop_sofab', 0, 6, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1199, 'rooftop_2', 'rooftop_sofa', 1, 6, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1200, 'rooftop_2', 'rooftop_sofab', 7, 6, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1201, 'rooftop_2', 'rooftop_sofa', 8, 6, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1202, 'rooftop_2', 'rooftop_sofab', 0, 9, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1203, 'rooftop_2', 'rooftop_sofa', 1, 9, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1204, 'rooftop_2', 'rooftop_sofab', 7, 9, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1205, 'rooftop_2', 'rooftop_sofa', 8, 9, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1206, 'tearoom', 'chinastoolgreen', 0, 19, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1207, 'tearoom', 'chinastoolgreen', 0, 20, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1208, 'tearoom', 'chinastoolred', 10, 6, 3, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1209, 'tearoom', 'chinastoolred', 11, 6, 3, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1210, 'tearoom', 'chinastoolred', 8, 6, 3, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1211, 'tearoom', 'chinastoolred', 9, 6, 3, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1212, 'tearoom', 'hardwoodsofa1', 13, 1, 3, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1213, 'tearoom', 'hardwoodsofa1', 18, 1, 3, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1214, 'tearoom', 'hardwoodsofa2', 14, 1, 3, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1215, 'tearoom', 'hardwoodsofa2', 19, 1, 3, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1216, 'tearoom', 'hardwoodsofa3', 15, 1, 3, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1217, 'tearoom', 'hardwoodsofa3', 20, 1, 3, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1218, 'tearoom', 'teabamboo', 16, 1, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1219, 'tearoom', 'teasmalltable1', 13, 3, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1220, 'tearoom', 'teasmalltable1', 18, 3, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1221, 'tearoom', 'teasmalltable2', 15, 3, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1222, 'tearoom', 'teasmalltable2', 20, 3, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1223, 'tearoom', 'teastool', 16, 9, 3, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1224, 'tearoom', 'teastool', 17, 9, 3, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1225, 'tearoom', 'teastool', 2, 12, 3, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1226, 'tearoom', 'teastool', 2, 6, 3, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1227, 'tearoom', 'teastool', 3, 12, 3, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1228, 'tearoom', 'teastool', 3, 6, 3, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1229, 'tearoom', 'teastool2', 16, 12, 3, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1230, 'tearoom', 'teastool2', 17, 12, 3, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1231, 'tearoom', 'teastool2', 2, 15, 3, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1232, 'tearoom', 'teastool2', 2, 9, 3, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1233, 'tearoom', 'teastool2', 3, 15, 3, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1234, 'tearoom', 'teastool2', 3, 9, 3, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1235, 'tearoom', 'teatable1', 16, 11, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1236, 'tearoom', 'teatable1', 2, 14, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1237, 'tearoom', 'teatable1', 2, 8, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1238, 'tearoom', 'teatable2', 17, 11, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1239, 'tearoom', 'teatable2', 3, 14, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1240, 'tearoom', 'teatable2', 3, 8, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1241, 'tearoom', 'teavase', 0, 18, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1242, 'tearoom', 'teavase', 0, 21, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1243, 'cafe_ole', 'cafe_table_largeb', 15, 0, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1244, 'cafe_ole', 'cafe_chair', 14, 1, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1245, 'cafe_ole', 'cafe_chair', 17, 1, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1246, 'cafe_ole', 'cafe_chair', 14, 2, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1247, 'cafe_ole', 'cafe_table_largea', 15, 2, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1248, 'cafe_ole', 'cafe_chair', 17, 2, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1249, 'cafe_ole', 'plant_yucca', 13, 4, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1250, 'cafe_ole', 'cafe_desk5', 4, 5, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1251, 'cafe_ole', 'plant_ftree', 5, 5, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1252, 'cafe_ole', 'cafe_chair', 8, 5, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1253, 'cafe_ole', 'cafe_chair', 11, 5, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1254, 'cafe_ole', 'cafe_desk4', 4, 6, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1255, 'cafe_ole', 'cafe_barchair', 5, 6, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1256, 'cafe_ole', 'cafe_chair', 8, 6, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1257, 'cafe_ole', 'cafe_table_mid', 10, 6, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1258, 'cafe_ole', 'cafe_chair', 11, 6, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1259, 'cafe_ole', 'cafe_desk4', 4, 7, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1260, 'cafe_ole', 'cafe_barchair', 5, 7, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1261, 'cafe_ole', 'cafe_desk4', 4, 8, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1262, 'cafe_ole', 'cafe_desk4', 4, 9, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1263, 'cafe_ole', 'cafe_desk4', 4, 10, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1264, 'cafe_ole', 'cafe_chair', 12, 10, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1265, 'cafe_ole', 'cafe_table_small', 13, 10, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1266, 'cafe_ole', 'cafe_chair', 14, 10, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1267, 'cafe_ole', 'roommatic', 0, 11, 1, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1268, 'cafe_ole', 'roommatic', 1, 11, 1, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1269, 'cafe_ole', 'roommatic', 2, 11, 1, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1270, 'cafe_ole', 'cafe_desk1', 3, 11, 1, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1271, 'cafe_ole', 'cafe_desk3', 4, 11, 1, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1272, 'cafe_ole', 'cafe_fence4', 9, 11, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1273, 'cafe_ole', 'cafe_fence3', 10, 11, 1, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1274, 'cafe_ole', 'cafe_fence2', 11, 11, 1, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1275, 'cafe_ole', 'cafe_fence3', 12, 11, 1, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1276, 'cafe_ole', 'cafe_fence2', 13, 11, 1, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1277, 'cafe_ole', 'cafe_fence3', 14, 11, 1, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1278, 'cafe_ole', 'cafe_fence1', 15, 11, 1, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1279, 'cafe_ole', 'cafe_barchair', 0, 12, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1280, 'cafe_ole', 'cafe_barchair', 1, 12, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1281, 'cafe_ole', 'cafe_barchair', 2, 12, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1282, 'cafe_ole', 'cafe_chair', 8, 12, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1283, 'cafe_ole', 'cafe_fence3', 9, 12, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1284, 'cafe_ole', 'plant_yucca', 10, 12, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1285, 'cafe_ole', 'cafe_table_small', 8, 13, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1286, 'cafe_ole', 'cafe_fence2', 9, 13, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1287, 'cafe_ole', 'cafe_chair', 8, 14, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1288, 'cafe_ole', 'cafe_fence3', 9, 14, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1289, 'cafe_ole', 'cafe_chair', 12, 14, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1290, 'cafe_ole', 'cafe_pianoc', 0, 15, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1291, 'cafe_ole', 'cafe_fence2', 9, 15, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1292, 'cafe_ole', 'cafe_table_largeb', 12, 15, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1293, 'cafe_ole', 'cafe_pianob', 0, 16, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1294, 'cafe_ole', 'cafe_barchair', 1, 16, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1295, 'cafe_ole', 'cafe_table_largeb', 4, 16, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1296, 'cafe_ole', 'cafe_fence3', 9, 16, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1297, 'cafe_ole', 'cafe_chair', 11, 16, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1298, 'cafe_ole', 'cafe_chair', 14, 16, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1299, 'cafe_ole', 'cafe_pianoa', 0, 17, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1300, 'cafe_ole', 'cafe_chair', 3, 17, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1301, 'cafe_ole', 'cafe_chair', 6, 17, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1302, 'cafe_ole', 'cafe_fence2', 9, 17, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1303, 'cafe_ole', 'cafe_chair', 11, 17, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1304, 'cafe_ole', 'cafe_table_largea', 12, 17, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1305, 'cafe_ole', 'cafe_chair', 14, 17, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1306, 'cafe_ole', 'cafe_chair', 3, 18, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1307, 'cafe_ole', 'cafe_table_largea', 4, 18, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1308, 'cafe_ole', 'cafe_chair', 6, 18, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1309, 'cafe_ole', 'cafe_fence3', 9, 18, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1310, 'cafe_ole', 'plant_ftree', 0, 19, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1311, 'cafe_ole', 'cafe_fence2', 9, 19, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1312, 'cafe_ole', 'cafe_chair', 12, 19, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1313, 'cafe_ole', 'plant_ftree', 0, 20, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1314, 'cafe_ole', 'cafe_chair', 8, 20, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1315, 'cafe_ole', 'cafe_fence3', 9, 20, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1316, 'cafe_ole', 'cafe_table_small', 8, 21, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1317, 'cafe_ole', 'cafe_fence2', 9, 21, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1318, 'cafe_ole', 'cafe_chair', 8, 22, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1319, 'cafe_ole', 'cafe_fence3', 9, 22, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1320, 'cafe_ole', 'cafe_fence2', 9, 23, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1321, 'cafe_ole', 'cafe_chair', 12, 23, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1322, 'cafe_ole', 'cafe_table_small', 13, 23, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1323, 'cafe_ole', 'cafe_chair', 14, 23, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1324, 'cafe_ole', 'cafe_fence1', 9, 24, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1325, 'cr_cafe', 'koc_chair', 11, 6, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1326, 'cr_cafe', 'koc_chair', 12, 2, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1327, 'cr_cafe', 'koc_chair', 13, 15, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1328, 'cr_cafe', 'koc_chair', 8, 6, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1329, 'cr_cafe', 'koc_chair', 12, 5, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1330, 'cr_cafe', 'koc_chair', 17, 5, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1331, 'cr_cafe', 'koc_chair', 18, 6, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1332, 'cr_cafe', 'koc_chair', 13, 6, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1333, 'cr_cafe', 'koc_chair', 14, 2, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1334, 'cr_cafe', 'koc_chair', 14, 16, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1335, 'cr_cafe', 'koc_chair', 9, 16, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1336, 'cr_cafe', 'koc_chair', 9, 7, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1337, 'cr_cafe', 'koc_chair', 9, 1, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1338, 'cr_cafe', 'koc_chair', 13, 3, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1339, 'cr_cafe', 'koc_chair', 17, 7, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1340, 'cr_cafe', 'koc_chair', 12, 7, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1341, 'cr_cafe', 'koc_chair', 13, 17, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1342, 'cr_cafe', 'koc_chair', 8, 17, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1343, 'cr_cafe', 'koc_chair', 8, 8, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1344, 'cr_cafe', 'koc_chair', 8, 2, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1345, 'cr_cafe', 'koc_stool', 7, 10, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1346, 'cr_cafe', 'koc_stool', 7, 11, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1347, 'cr_cafe', 'koc_stool', 7, 13, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1348, 'cr_cafe', 'koc_bartable', 6, 13, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1349, 'cr_cafe', 'koc_bartable', 6, 12, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1350, 'cr_cafe', 'koc_bartable', 6, 11, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1351, 'cr_cafe', 'koc_bartable', 6, 10, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1352, 'cr_cafe', 'koc_bartable', 6, 9, 0, 5, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1353, 'cr_cafe', 'koc_bartable_end', 6, 14, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1354, 'cr_cafe', 'koc_bartable_end', 5, 9, 0, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1355, 'cr_cafe', 'drawer_end', 13, 0, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1356, 'cr_cafe', 'drawer_end', 2, 6, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1357, 'cr_cafe', 'drawer_start', 12, 0, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1358, 'cr_cafe', 'drawer_start', 1, 6, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1359, 'cr_cafe', 'drawer_start', 3, 13, 0, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1360, 'cr_cafe', 'drawer_end', 3, 12, 0, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1361, 'cr_cafe', 'drawer_start', 6, 19, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1362, 'cr_cafe', 'drawer_start', 4, 19, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1363, 'cr_cafe', 'drawer_end', 5, 19, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1364, 'cr_cafe', 'drawer_end', 3, 19, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1365, 'cr_cafe', 'drawer_start', 2, 19, 0, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1366, 'cr_cafe', 'drawer_end', 2, 18, 0, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1367, 'cr_cafe', 'cupboard', 2, 17, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1368, 'cr_cafe', 'cupboard', 2, 16, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1369, 'cr_cafe', 'koc_table', 13, 16, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1370, 'cr_cafe', 'koc_table', 8, 16, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1371, 'cr_cafe', 'koc_table', 8, 7, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1372, 'cr_cafe', 'koc_table', 12, 6, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1373, 'cr_cafe', 'koc_table', 17, 6, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1374, 'cr_cafe', 'koc_table', 13, 2, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1375, 'cr_cafe', 'koc_table', 8, 1, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1376, 'cr_cafe', 'koc_smalltable', 6, 0, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1377, 'cr_cafe', 'koc_table', 3, 0, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1378, 'cr_cafe', 'drawer_start', 2, 4, 0, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1379, 'cr_cafe', 'drawer_end', 2, 3, 0, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1380, 'cr_cafe', 'coatrack', 2, 2, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1381, 'cr_cafe', 'drawer_end', 0, 0, 0, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1382, 'cr_cafe', 'pillar', 16, 15, 0, 7, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1383, 'cr_cafe', 'pillar', 6, 15, 0, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1384, 'cr_cafe', 'pillar', 6, 2, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1385, 'cr_cafe', 'pillar', 16, 2, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1386, 'lobby_a', 'flower1', 9, 0, 7, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1387, 'lobby_a', 'chairf2b', 11, 0, 7, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1388, 'lobby_a', 'chairf2', 12, 0, 7, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1389, 'lobby_a', 'table1', 13, 0, 7, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1390, 'lobby_a', 'chairf2b', 14, 0, 7, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1391, 'lobby_a', 'chairf2', 15, 0, 7, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1392, 'lobby_a', 'watermatic', 16, 0, 7, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1393, 'lobby_a', 'telkka', 9, 2, 7, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1394, 'lobby_a', 'flower1', 9, 3, 7, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1395, 'lobby_a', 'chairf2d', 11, 3, 7, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1396, 'lobby_a', 'chairf2', 12, 3, 7, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1397, 'lobby_a', 'table1', 13, 3, 7, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1398, 'lobby_a', 'chairf2d', 14, 3, 7, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1399, 'lobby_a', 'chairf2', 15, 3, 7, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1400, 'lobby_a', 'flower1', 12, 4, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1401, 'lobby_a', 'flower1', 16, 4, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1402, 'lobby_a', 'chairf2b', 0, 7, 3, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1403, 'lobby_a', 'chairf2', 1, 7, 3, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1404, 'lobby_a', 'chairf2d', 0, 10, 3, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1405, 'lobby_a', 'chairf2', 1, 10, 3, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1406, 'lobby_a', 'roommatic', 21, 12, 1, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1407, 'lobby_a', 'roommatic', 22, 12, 1, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1408, 'lobby_a', 'roommatic', 23, 12, 1, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1409, 'lobby_a', 'roommatic', 24, 12, 1, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1410, 'lobby_a', 'chairf2b', 0, 14, 3, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1411, 'lobby_a', 'chairf2', 1, 14, 3, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1412, 'lobby_a', 'watermatic', 13, 14, 1, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1413, 'lobby_a', 'watermatic', 12, 15, 1, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1414, 'lobby_a', 'chairf1', 19, 16, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1415, 'lobby_a', 'table2c', 21, 16, 1, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1416, 'lobby_a', 'chairf1', 23, 16, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1417, 'lobby_a', 'chairf2d', 0, 17, 3, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1418, 'lobby_a', 'chairf2', 1, 17, 3, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1419, 'lobby_a', 'table2b', 21, 17, 1, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1420, 'lobby_a', 'chairf1', 19, 18, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1421, 'lobby_a', 'table2', 21, 18, 1, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1422, 'lobby_a', 'chairf1', 23, 18, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1423, 'lobby_a', 'chairf2b', 7, 21, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1424, 'lobby_a', 'chairf2c', 7, 22, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1425, 'lobby_a', 'chairf2c', 7, 23, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1426, 'lobby_a', 'chairf2c', 7, 24, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1427, 'lobby_a', 'chairf2', 7, 25, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1428, 'lobby_a', 'table1', 7, 26, 2, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1429, 'lobby_a', 'flower2', 10, 26, 1, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1430, 'floorlobby_c', 'moneyplant', 3, 2, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1431, 'floorlobby_c', 'roommatic', 5, 2, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1432, 'floorlobby_c', 'roommatic', 7, 2, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1433, 'floorlobby_c', 'roommatic', 9, 2, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1434, 'floorlobby_c', 'roommatic', 11, 2, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1435, 'floorlobby_c', 'roommatic', 13, 2, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1436, 'floorlobby_c', 'watermatic', 26, 2, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1437, 'floorlobby_c', 'edgec1', 14, 8, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1438, 'floorlobby_c', 'edgec1', 15, 8, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1439, 'floorlobby_c', 'edgec1', 16, 8, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1440, 'floorlobby_c', 'edgec1', 17, 8, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1441, 'floorlobby_c', 'edgec1', 18, 8, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1442, 'floorlobby_c', 'edgec1', 19, 8, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1443, 'floorlobby_c', 'edgec1', 20, 8, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1444, 'floorlobby_c', 'edgec1', 21, 8, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1445, 'floorlobby_c', 'edgec1', 22, 8, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1446, 'floorlobby_c', 'edgec1', 23, 8, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1447, 'floorlobby_c', 'edgec1', 24, 8, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1448, 'floorlobby_c', 'edgec1', 25, 8, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1449, 'floorlobby_c', 'edgec1', 26, 8, 1, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1450, 'floorlobby_c', 'chairg1', 3, 9, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1451, 'floorlobby_c', 'chairg1', 5, 9, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1452, 'floorlobby_c', 'moneyplant', 15, 9, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1453, 'floorlobby_c', 'chairg2b', 16, 9, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1454, 'floorlobby_c', 'chairg2c', 17, 9, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1455, 'floorlobby_c', 'chairg2', 18, 9, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1456, 'floorlobby_c', 'moneyplant', 19, 9, 1, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1457, 'floorlobby_c', 'moneyplant', 21, 9, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1458, 'floorlobby_c', 'chairg2b', 22, 9, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1459, 'floorlobby_c', 'chairg2c', 23, 9, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1460, 'floorlobby_c', 'chairg2', 24, 9, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1461, 'floorlobby_c', 'moneyplant', 25, 9, 1, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1462, 'floorlobby_c', 'chairg1', 3, 11, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1463, 'floorlobby_c', 'chairg1', 5, 11, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1464, 'floorlobby_c', 'newtable2', 3, 12, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1465, 'floorlobby_c', 'chairg1', 16, 14, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1466, 'floorlobby_c', 'chairg1', 18, 14, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1467, 'floorlobby_c', 'chairg1', 22, 14, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1468, 'floorlobby_c', 'chairg1', 24, 14, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1469, 'floorlobby_c', 'newtable2', 17, 15, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1470, 'floorlobby_c', 'newtable2', 23, 15, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1471, 'floorlobby_c', 'newtable2', 3, 16, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1472, 'floorlobby_c', 'chairg1', 16, 16, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1473, 'floorlobby_c', 'chairg1', 18, 16, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1474, 'floorlobby_c', 'chairg1', 22, 16, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1475, 'floorlobby_c', 'chairg1', 24, 16, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1476, 'floorlobby_c', 'chairg1', 3, 17, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1477, 'floorlobby_c', 'chairg1', 5, 17, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1478, 'floorlobby_c', 'edgec2', 14, 18, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1479, 'floorlobby_c', 'edgec2', 15, 18, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1480, 'floorlobby_c', 'edgec2', 16, 18, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1481, 'floorlobby_c', 'edgec2', 17, 18, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1482, 'floorlobby_c', 'edgec2', 18, 18, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1483, 'floorlobby_c', 'edgec2', 19, 18, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1484, 'floorlobby_c', 'edgec2', 20, 18, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1485, 'floorlobby_c', 'edgec2', 21, 18, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1486, 'floorlobby_c', 'edgec2', 22, 18, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1487, 'floorlobby_c', 'edgec2', 23, 18, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1488, 'floorlobby_c', 'edgec2', 24, 18, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1489, 'floorlobby_c', 'edgec2', 25, 18, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1490, 'floorlobby_c', 'edgec2', 26, 18, 1, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1491, 'floorlobby_b', 'moneyplant', 3, 2, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1492, 'floorlobby_b', 'roommatic', 5, 2, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1493, 'floorlobby_b', 'roommatic', 7, 2, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1494, 'floorlobby_b', 'roommatic', 9, 2, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1495, 'floorlobby_b', 'roommatic', 11, 2, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1496, 'floorlobby_b', 'roommatic', 13, 2, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1497, 'floorlobby_b', 'watermatic', 26, 2, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1498, 'floorlobby_b', 'standinglamp', 3, 8, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1499, 'floorlobby_b', 'edgeb1', 14, 8, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1500, 'floorlobby_b', 'edgeb1', 15, 8, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1501, 'floorlobby_b', 'edgeb1', 16, 8, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1502, 'floorlobby_b', 'edgeb1', 17, 8, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1503, 'floorlobby_b', 'edgeb1', 18, 8, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1504, 'floorlobby_b', 'edgeb1', 19, 8, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1505, 'floorlobby_b', 'edgeb1', 20, 8, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1506, 'floorlobby_b', 'edgeb1', 21, 8, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1507, 'floorlobby_b', 'edgeb1', 22, 8, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1508, 'floorlobby_b', 'edgeb1', 23, 8, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1509, 'floorlobby_b', 'edgeb1', 24, 8, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1510, 'floorlobby_b', 'edgeb1', 25, 8, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1511, 'floorlobby_b', 'edgeb1', 26, 8, 1, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1512, 'floorlobby_b', 'chairf2b', 3, 9, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1513, 'floorlobby_b', 'chairf2c', 4, 9, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1514, 'floorlobby_b', 'chairf2', 5, 9, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1515, 'floorlobby_b', 'moneyplant', 15, 9, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1516, 'floorlobby_b', 'chairf2b', 16, 9, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1517, 'floorlobby_b', 'chairf2c', 17, 9, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1518, 'floorlobby_b', 'chairf2', 18, 9, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1519, 'floorlobby_b', 'moneyplant', 19, 9, 1, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1520, 'floorlobby_b', 'moneyplant', 21, 9, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1521, 'floorlobby_b', 'chairf2b', 22, 9, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1522, 'floorlobby_b', 'chairf2c', 23, 9, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1523, 'floorlobby_b', 'chairf2', 24, 9, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1524, 'floorlobby_b', 'moneyplant', 25, 9, 1, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1525, 'floorlobby_b', 'chairf1', 3, 11, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1526, 'floorlobby_b', 'newtable1', 4, 11, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1527, 'floorlobby_b', 'chairf1', 5, 11, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1528, 'floorlobby_b', 'chairf1', 16, 14, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1529, 'floorlobby_b', 'chairf1', 18, 14, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1530, 'floorlobby_b', 'chairf1', 22, 14, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1531, 'floorlobby_b', 'chairf1', 24, 14, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1532, 'floorlobby_b', 'newtable1', 17, 15, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1533, 'floorlobby_b', 'newtable1', 23, 15, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1534, 'floorlobby_b', 'newtable1', 3, 16, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1535, 'floorlobby_b', 'chairf1', 16, 16, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1536, 'floorlobby_b', 'chairf1', 18, 16, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1537, 'floorlobby_b', 'chairf1', 22, 16, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1538, 'floorlobby_b', 'chairf1', 24, 16, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1539, 'floorlobby_b', 'chairf1', 3, 17, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1540, 'floorlobby_b', 'chairf1', 5, 17, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1541, 'floorlobby_b', 'standinglamp', 3, 18, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1542, 'floorlobby_b', 'edgeb2', 14, 18, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1543, 'floorlobby_b', 'edgeb2', 15, 18, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1544, 'floorlobby_b', 'edgeb2', 16, 18, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1545, 'floorlobby_b', 'edgeb2', 17, 18, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1546, 'floorlobby_b', 'edgeb2', 18, 18, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1547, 'floorlobby_b', 'edgeb2', 19, 18, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1548, 'floorlobby_b', 'edgeb2', 20, 18, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1549, 'floorlobby_b', 'edgeb2', 21, 18, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1550, 'floorlobby_b', 'edgeb2', 22, 18, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1551, 'floorlobby_b', 'edgeb2', 23, 18, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1552, 'floorlobby_b', 'edgeb2', 24, 18, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1553, 'floorlobby_b', 'edgeb2', 25, 18, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1554, 'floorlobby_b', 'edgeb2', 26, 18, 1, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1555, 'floorlobby_a', 'moneyplant', 3, 2, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1556, 'floorlobby_a', 'roommatic', 5, 2, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1557, 'floorlobby_a', 'roommatic', 7, 2, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1558, 'floorlobby_a', 'roommatic', 9, 2, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1559, 'floorlobby_a', 'roommatic', 11, 2, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1560, 'floorlobby_a', 'roommatic', 13, 2, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1561, 'floorlobby_a', 'watermatic', 26, 2, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1562, 'floorlobby_a', 'standinglamp', 3, 8, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1563, 'floorlobby_a', 'edge1', 14, 8, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1564, 'floorlobby_a', 'edge1', 15, 8, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1565, 'floorlobby_a', 'edge1', 16, 8, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1566, 'floorlobby_a', 'edge1', 17, 8, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1567, 'floorlobby_a', 'edge1', 18, 8, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1568, 'floorlobby_a', 'edge1', 19, 8, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1569, 'floorlobby_a', 'edge1', 20, 8, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1570, 'floorlobby_a', 'edge1', 21, 8, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1571, 'floorlobby_a', 'edge1', 22, 8, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1572, 'floorlobby_a', 'edge1', 23, 8, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1573, 'floorlobby_a', 'edge1', 24, 8, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1574, 'floorlobby_a', 'edge1', 25, 8, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1575, 'floorlobby_a', 'edge1', 26, 8, 1, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1576, 'floorlobby_a', 'chairf1', 3, 9, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1577, 'floorlobby_a', 'chairf1', 5, 9, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1578, 'floorlobby_a', 'moneyplant', 15, 9, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1579, 'floorlobby_a', 'chairf2b', 16, 9, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1580, 'floorlobby_a', 'chairf2c', 17, 9, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1581, 'floorlobby_a', 'chairf2', 18, 9, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1582, 'floorlobby_a', 'moneyplant', 19, 9, 1, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1583, 'floorlobby_a', 'moneyplant', 21, 9, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1584, 'floorlobby_a', 'chairf2b', 22, 9, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1585, 'floorlobby_a', 'chairf2c', 23, 9, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1586, 'floorlobby_a', 'chairf2', 24, 9, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1587, 'floorlobby_a', 'moneyplant', 25, 9, 1, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1588, 'floorlobby_a', 'chairf1', 3, 11, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1589, 'floorlobby_a', 'chairf1', 5, 11, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1590, 'floorlobby_a', 'newtable1', 3, 12, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1591, 'floorlobby_a', 'chairf1', 16, 14, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1592, 'floorlobby_a', 'chairf1', 18, 14, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1593, 'floorlobby_a', 'chairf1', 22, 14, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1594, 'floorlobby_a', 'chairf1', 24, 14, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1595, 'floorlobby_a', 'newtable1', 17, 15, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1596, 'floorlobby_a', 'newtable1', 23, 15, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1597, 'floorlobby_a', 'chairf1', 16, 16, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1598, 'floorlobby_a', 'chairf1', 18, 16, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1599, 'floorlobby_a', 'chairf1', 22, 16, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1600, 'floorlobby_a', 'chairf1', 24, 16, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1601, 'floorlobby_a', 'chairf1', 3, 17, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1602, 'floorlobby_a', 'chairf1', 5, 17, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1603, 'floorlobby_a', 'edge2', 14, 18, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1604, 'floorlobby_a', 'edge2', 15, 18, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1605, 'floorlobby_a', 'edge2', 16, 18, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1606, 'floorlobby_a', 'edge2', 17, 18, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1607, 'floorlobby_a', 'edge2', 18, 18, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1608, 'floorlobby_a', 'edge2', 19, 18, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1609, 'floorlobby_a', 'edge2', 20, 18, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1610, 'floorlobby_a', 'edge2', 21, 18, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1611, 'floorlobby_a', 'edge2', 22, 18, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1612, 'floorlobby_a', 'edge2', 23, 18, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1613, 'floorlobby_a', 'edge2', 24, 18, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1614, 'floorlobby_a', 'edge2', 25, 18, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1615, 'floorlobby_a', 'edge2', 26, 18, 1, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1616, 'cinema_a', 'orange', 2, 4, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1617, 'cinema_a', 'loungey_chair', 7, 4, 3, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1618, 'cinema_a', 'loungey_tablebigb', 8, 4, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1619, 'cinema_a', 'loungey_chair', 9, 4, 3, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1620, 'cinema_a', 'loungey_chair', 2, 5, 3, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1621, 'cinema_a', 'loungey_chair', 7, 5, 3, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1622, 'cinema_a', 'loungey_tablebiga', 8, 5, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1623, 'cinema_a', 'loungey_chair', 9, 5, 3, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1624, 'cinema_a', 'loungey_table', 2, 6, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1625, 'cinema_a', 'loungey_chair', 2, 7, 3, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1626, 'cinema_a', 'theater_chair', 13, 7, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1627, 'cinema_a', 'theater_chair', 14, 7, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1628, 'cinema_a', 'theater_chair', 15, 7, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1629, 'cinema_a', 'theater_chair', 16, 7, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1630, 'cinema_a', 'theater_chair', 17, 7, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1631, 'cinema_a', 'theater_chair', 18, 7, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1632, 'cinema_a', 'stair', 21, 7, 1, 0, 0.001, 1, 1, 'can_stand_on_top,invisible', '', NULL, NULL), + (1633, 'cinema_a', 'lightpole', 9, 8, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1634, 'cinema_a', 'pomomaski', 13, 8, 2, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1635, 'cinema_a', 'pomomaski', 14, 8, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1636, 'cinema_a', 'pomomaski', 15, 8, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1637, 'cinema_a', 'pomomaski', 16, 8, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1638, 'cinema_a', 'pomomaski', 17, 8, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1639, 'cinema_a', 'pomomaski', 18, 8, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1640, 'cinema_a', 'pomomaski', 19, 8, 2, 1, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1641, 'cinema_a', 'stair', 21, 8, 1, 0, 0.001, 1, 1, 'can_stand_on_top,invisible', '', NULL, NULL), + (1642, 'cinema_a', 'orange', 2, 9, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1643, 'cinema_a', 'theater_chair', 13, 9, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1644, 'cinema_a', 'theater_chair', 14, 9, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1645, 'cinema_a', 'theater_chair', 15, 9, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1646, 'cinema_a', 'theater_chair', 16, 9, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1647, 'cinema_a', 'theater_chair', 17, 9, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1648, 'cinema_a', 'theater_chair', 18, 9, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1649, 'cinema_a', 'theater_chair', 19, 9, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1650, 'cinema_a', 'theater_chair', 20, 9, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1651, 'cinema_a', 'stair', 21, 9, 1, 0, 0.001, 1, 1, 'can_stand_on_top,invisible', '', NULL, NULL), + (1652, 'cinema_a', 'loungey_chair', 2, 10, 3, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1653, 'cinema_a', 'loungey_chair', 9, 10, 3, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1654, 'cinema_a', 'loungey_table', 2, 11, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1655, 'cinema_a', 'loungey_table', 9, 11, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1656, 'cinema_a', 'loungey_chair', 2, 12, 3, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1657, 'cinema_a', 'loungey_chair', 9, 12, 3, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1658, 'cinema_a', 'cubicb_chair', 17, 12, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1659, 'cinema_a', 'cubico_chair', 19, 12, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1660, 'cinema_a', 'cubicb_chair', 15, 13, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1661, 'cinema_a', 'lightpole', 19, 13, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1662, 'cinema_a', 'cubicb_chair', 20, 13, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1663, 'cinema_a', 'lightpole', 9, 14, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1664, 'cinema_a', 'loungey_chair', 2, 15, 3, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1665, 'cinema_a', 'cubicb_chair', 14, 15, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1666, 'cinema_a', 'cubico_chair', 19, 15, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1667, 'cinema_a', 'loungey_table', 2, 16, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1668, 'cinema_a', 'loungey_chair', 7, 16, 3, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1669, 'cinema_a', 'loungey_table', 8, 16, 3, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1670, 'cinema_a', 'loungey_chair', 9, 16, 3, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1671, 'cinema_a', 'cubicb_chair', 13, 16, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1672, 'cinema_a', 'cubicb_chair', 14, 16, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1673, 'cinema_a', 'orange', 19, 16, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1674, 'cinema_a', 'loungey_chair', 2, 17, 3, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1675, 'cinema_a', 'loungey_chair', 7, 17, 3, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1676, 'cinema_a', 'loungey_table', 8, 17, 3, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1677, 'cinema_a', 'loungey_chair', 9, 17, 3, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1678, 'cinema_a', 'cubicb_chair', 19, 17, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1679, 'cinema_a', 'orange', 2, 18, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1680, 'cinema_a', 'cubicb_chair', 14, 18, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1681, 'cinema_a', 'bardesque', 2, 19, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1682, 'cinema_a', 'bardesque', 2, 20, 3, 1, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1683, 'cinema_a', 'bar_chair', 3, 20, 3, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1684, 'cinema_a', 'lightpole', 9, 20, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1685, 'cinema_a', 'cubicb_chair', 14, 20, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1686, 'cinema_a', 'cubicb_chair', 19, 20, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1687, 'cinema_a', 'cubico_chair', 20, 20, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1688, 'cinema_a', 'bardesque', 2, 21, 3, 1, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1689, 'cinema_a', 'bar_chair', 3, 21, 3, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1690, 'cinema_a', 'cubicb_chair', 19, 21, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1691, 'cinema_a', 'bardesque', 2, 22, 3, 1, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1692, 'cinema_a', 'bar_chair', 3, 22, 3, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1693, 'cinema_a', 'lightpole', 16, 22, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1694, 'cinema_a', 'cubico_chair', 18, 22, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1695, 'cinema_a', 'bardesque', 2, 23, 3, 1, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1696, 'cinema_a', 'bar_chair', 3, 23, 3, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1697, 'cinema_a', 'bardesque', 2, 24, 3, 1, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1698, 'cinema_a', 'bar_chair', 3, 24, 3, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1699, 'cinema_a', 'bardesque', 2, 25, 3, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1700, 'sport', 'sporttable', 1, 11, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1701, 'sport', 'sporttable', 1, 6, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1702, 'sport', 'sporttable', 15, 6, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1703, 'sport', 'sporttable', 7, 6, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1704, 'sport', 'sportchair', 9, 0, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1705, 'sport', 'sportchair', 10, 0, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1706, 'sport', 'sportchair', 7, 5, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1707, 'sport', 'sportchair', 15, 5, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1708, 'sport', 'sportchair', 1, 5, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1709, 'sport', 'sportchair', 1, 10, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1710, 'sport', 'sportchair', 14, 6, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1711, 'sport', 'sportchair', 6, 6, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1712, 'sport', 'sportchair3', 15, 7, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1713, 'sport', 'sportchair3', 7, 7, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1714, 'sport', 'sportchair3', 1, 12, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1715, 'sport', 'sportchair3', 1, 7, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1716, 'sport', 'sportchair2', 16, 6, 2, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1717, 'sport', 'sportchair2', 8, 6, 2, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1718, 'sport', 'sodagreen', 6, 0, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1719, 'sport', 'sodapink', 8, 0, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1720, 'old_skool0', 'mobiles_chair1', 0, 11, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1721, 'old_skool0', 'mobiles_chair1', 0, 15, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1722, 'old_skool0', 'mobiles_chair1', 0, 17, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1723, 'old_skool0', 'mobiles_chair1', 0, 22, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1724, 'old_skool0', 'mobiles_chair1', 1, 10, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1725, 'old_skool0', 'mobiles_chair1', 1, 13, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1726, 'old_skool0', 'mobiles_chair1', 1, 21, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1727, 'old_skool0', 'mobiles_chair1', 1, 24, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1728, 'old_skool0', 'mobiles_chair1', 10, 10, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1729, 'old_skool0', 'mobiles_chair1', 11, 13, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1730, 'old_skool0', 'mobiles_chair1', 11, 22, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1731, 'old_skool0', 'mobiles_chair1', 12, 12, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1732, 'old_skool0', 'mobiles_chair1', 12, 21, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1733, 'old_skool0', 'mobiles_chair1', 13, 24, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1734, 'old_skool0', 'mobiles_chair1', 14, 22, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1735, 'old_skool0', 'mobiles_chair1', 2, 19, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1736, 'old_skool0', 'mobiles_chair1', 3, 11, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1737, 'old_skool0', 'mobiles_chair1', 3, 17, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1738, 'old_skool0', 'mobiles_chair1', 3, 22, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1739, 'old_skool0', 'mobiles_chair1', 5, 22, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1740, 'old_skool0', 'mobiles_chair1', 7, 24, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1741, 'old_skool0', 'mobiles_chair1', 8, 22, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1742, 'old_skool0', 'mobiles_chair1', 9, 12, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1743, 'old_skool0', 'mobiles_chair3', 10, 4, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1744, 'old_skool0', 'mobiles_chair3', 11, 4, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1745, 'old_skool0', 'mobiles_chair3', 12, 4, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1746, 'old_skool0', 'mobiles_chair3', 9, 4, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1747, 'old_skool0', 'mobiles_table1', 1, 12, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1748, 'old_skool0', 'mobiles_table1', 1, 18, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1749, 'old_skool0', 'mobiles_table1', 1, 23, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1750, 'old_skool0', 'mobiles_table1', 10, 12, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1751, 'old_skool0', 'mobiles_table1', 12, 23, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1752, 'old_skool0', 'mobiles_table1', 6, 22, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1753, 'old_skool0', 'mobiles_table2', 1, 11, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1754, 'old_skool0', 'mobiles_table2', 1, 17, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1755, 'old_skool0', 'mobiles_table2', 1, 22, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1756, 'old_skool0', 'mobiles_table2', 10, 11, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1757, 'old_skool0', 'mobiles_table2', 12, 22, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1758, 'old_skool0', 'mobiles_table2', 6, 21, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1759, 'old_skool0', 'mobiles_table3', 11, 11, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1760, 'old_skool0', 'mobiles_table3', 13, 22, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1761, 'old_skool0', 'mobiles_table3', 2, 11, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1762, 'old_skool0', 'mobiles_table3', 2, 17, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1763, 'old_skool0', 'mobiles_table3', 2, 22, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1764, 'old_skool0', 'mobiles_table3', 7, 21, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1765, 'old_skool0', 'mobiles_table4', 11, 12, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1766, 'old_skool0', 'mobiles_table4', 13, 23, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1767, 'old_skool0', 'mobiles_table4', 2, 12, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1768, 'old_skool0', 'mobiles_table4', 2, 18, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1769, 'old_skool0', 'mobiles_table4', 2, 23, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1770, 'old_skool0', 'mobiles_table4', 7, 22, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1771, 'old_skool1', 'mobiles_chair2', 3, 4, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1772, 'old_skool1', 'mobiles_chair2', 3, 7, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1773, 'old_skool1', 'mobiles_chair2', 4, 2, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1774, 'old_skool1', 'mobiles_chair2', 4, 9, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1775, 'old_skool1', 'mobiles_chair2', 5, 6, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1776, 'old_skool1', 'mobiles_chair2', 7, 3, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1777, 'old_skool1', 'mobiles_chair2', 8, 5, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1778, 'old_skool1', 'mobiles_chair2', 9, 2, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1779, 'old_skool1', 'mobiles_table5', 4, 4, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1780, 'old_skool1', 'mobiles_table5', 4, 8, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1781, 'old_skool1', 'mobiles_table5', 8, 4, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1782, 'old_skool1', 'mobiles_table6', 4, 3, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1783, 'old_skool1', 'mobiles_table6', 4, 7, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1784, 'old_skool1', 'mobiles_table6', 8, 3, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1785, 'old_skool1', 'mobiles_table7', 5, 3, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1786, 'old_skool1', 'mobiles_table7', 5, 7, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1787, 'old_skool1', 'mobiles_table7', 9, 3, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1788, 'old_skool1', 'mobiles_table8', 5, 4, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1789, 'old_skool1', 'mobiles_table8', 5, 8, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1790, 'old_skool1', 'mobiles_table8', 9, 4, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1791, 'malja_bar_a', 'bar_chair_green', 13, 1, 4, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1792, 'malja_bar_a', 'bar_chair_green', 7, 2, 4, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1793, 'malja_bar_a', 'bar_chair_green', 5, 3, 4, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1794, 'malja_bar_a', 'bar_table_green', 6, 3, 4, 2, 0.001, 2, 2, 'extra_parameter', '', NULL, NULL), + (1795, 'malja_bar_a', 'bar_chair_green', 8, 4, 4, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1796, 'malja_bar_a', 'bar_chair_green', 7, 5, 4, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1797, 'malja_bar_a', 'bar_bare', 10, 7, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1798, 'malja_bar_a', 'bar_bard', 10, 8, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1799, 'malja_bar_a', 'bar_bara', 0, 9, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1800, 'malja_bar_a', 'bar_barb', 1, 9, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1801, 'malja_bar_a', 'bar_barb', 2, 9, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1802, 'malja_bar_a', 'bar_barb', 3, 9, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1803, 'malja_bar_a', 'bar_barb', 4, 9, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1804, 'malja_bar_a', 'bar_barb', 5, 9, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1805, 'malja_bar_a', 'bar_barb', 6, 9, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1806, 'malja_bar_a', 'bar_barb', 7, 9, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1807, 'malja_bar_a', 'bar_barb', 8, 9, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1808, 'malja_bar_a', 'bar_barb', 9, 9, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1809, 'malja_bar_a', 'bar_barc', 10, 9, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1810, 'malja_bar_a', 'bar_chair_green', 7, 13, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1811, 'malja_bar_a', 'bar_table_green', 7, 14, 1, 2, 0.001, 2, 2, 'extra_parameter', '', NULL, NULL), + (1812, 'malja_bar_a', 'bar_chair_green', 13, 14, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1813, 'malja_bar_a', 'bar_chair_green', 1, 15, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1814, 'malja_bar_a', 'bar_chair_green', 6, 15, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1815, 'malja_bar_a', 'bar_chair_green', 9, 15, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1816, 'malja_bar_a', 'bar_table_green', 13, 15, 1, 2, 0.001, 2, 2, 'extra_parameter', '', NULL, NULL), + (1817, 'malja_bar_a', 'bar_chair_green', 0, 16, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1818, 'malja_bar_a', 'bar_table_green', 1, 16, 1, 2, 0.001, 2, 2, 'extra_parameter', '', NULL, NULL), + (1819, 'malja_bar_a', 'bar_chair_green', 7, 16, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1820, 'malja_bar_a', 'bar_chair_green', 12, 16, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1821, 'malja_bar_a', 'bar_chair_green', 15, 16, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1822, 'malja_bar_a', 'bar_chair_green', 3, 17, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1823, 'malja_bar_a', 'bar_chair_green', 14, 17, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1824, 'malja_bar_a', 'bar_chair_green', 2, 18, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1825, 'malja_bar_a', 'bar_chair_green', 0, 21, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1826, 'malja_bar_b', 'bar_chair_blue', 4, 0, 3, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1827, 'malja_bar_b', 'bar_chair_blue', 8, 0, 3, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1828, 'malja_bar_b', 'bar_table_small_blue', 9, 0, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1829, 'malja_bar_b', 'bar_chair_blue', 10, 0, 3, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1830, 'malja_bar_b', 'bar_table_blue', 4, 1, 3, 2, 0.001, 2, 2, 'extra_parameter', '', NULL, NULL), + (1831, 'malja_bar_b', 'bar_djbooth', 13, 1, 3, 1, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1832, 'malja_bar_b', 'bar_chair_blue', 6, 2, 3, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1833, 'malja_bar_b', 'bar_djbooth', 13, 2, 3, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1834, 'malja_bar_b', 'bar_djbooth', 14, 2, 3, 3, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1835, 'malja_bar_b', 'bar_djbooth', 15, 2, 3, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1836, 'malja_bar_b', 'stair', 1, 3, 7, 0, 0.001, 1, 1, 'can_stand_on_top,invisible', '', NULL, NULL), + (1837, 'malja_bar_b', 'bar_chair_blue', 4, 3, 3, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1838, 'malja_bar_b', 'stair', 1, 4, 7, 0, 0.001, 1, 1, 'can_stand_on_top,invisible', '', NULL, NULL), + (1839, 'malja_bar_b', 'stair', 2, 4, 5, 0, 0.001, 1, 1, 'can_stand_on_top,invisible', '', NULL, NULL), + (1840, 'malja_bar_b', 'stair', 3, 4, 5, 0, 0.001, 1, 1, 'can_stand_on_top,invisible', '', NULL, NULL), + (1841, 'malja_bar_b', 'stair', 12, 5, 2, 0, 0.001, 1, 1, 'can_stand_on_top,invisible', '', NULL, NULL), + (1842, 'malja_bar_b', 'stair', 13, 5, 2, 0, 0.001, 1, 1, 'can_stand_on_top,invisible', '', NULL, NULL), + (1843, 'malja_bar_b', 'stair', 14, 5, 2, 0, 0.001, 1, 1, 'can_stand_on_top,invisible', '', NULL, NULL), + (1844, 'malja_bar_b', 'stair', 3, 6, 4, 0, 0.001, 1, 1, 'can_stand_on_top,invisible', '', NULL, NULL), + (1845, 'malja_bar_b', 'stair', 12, 6, 1, 0, 0.001, 1, 1, 'can_stand_on_top,invisible', '', NULL, NULL), + (1846, 'malja_bar_b', 'stair', 13, 6, 1, 0, 0.001, 1, 1, 'can_stand_on_top,invisible', '', NULL, NULL), + (1847, 'malja_bar_b', 'stair', 14, 6, 1, 0, 0.001, 1, 1, 'can_stand_on_top,invisible', '', NULL, NULL), + (1848, 'malja_bar_b', 'stair', 3, 7, 4, 0, 0.001, 1, 1, 'can_stand_on_top,invisible', '', NULL, NULL), + (1849, 'malja_bar_b', 'stair', 2, 8, 3, 0, 0.001, 1, 1, 'can_stand_on_top,invisible', '', NULL, NULL), + (1850, 'malja_bar_b', 'stair', 3, 8, 3, 0, 0.001, 1, 1, 'can_stand_on_top,invisible', '', NULL, NULL), + (1851, 'malja_bar_b', 'bar_chair_blue', 7, 8, 3, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1852, 'malja_bar_b', 'bar_table_small_blue', 7, 9, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1853, 'malja_bar_b', 'bar_chair_blue', 7, 10, 3, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1854, 'malja_bar_b', 'bar_chair_blue', 2, 11, 3, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1855, 'malja_bar_b', 'bar_table_small_blue', 2, 12, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1856, 'malja_bar_b', 'bar_chair_blue', 2, 13, 3, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1857, 'malja_bar_b', 'bar_chair_blue', 0, 14, 9, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1858, 'malja_bar_b', 'bar_chair_blue', 0, 15, 9, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1859, 'malja_bar_b', 'bar_chair_blue', 0, 16, 9, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1860, 'malja_bar_b', 'bar_chair_blue', 2, 16, 3, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1861, 'malja_bar_b', 'bar_chair_blue', 3, 16, 3, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1862, 'malja_bar_b', 'bar_chair_blue', 0, 17, 9, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1863, 'malja_bar_b', 'bar_table_blue', 2, 17, 3, 2, 0.001, 2, 2, 'extra_parameter', '', NULL, NULL), + (1864, 'malja_bar_b', 'bar_chair_blue', 4, 17, 3, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1865, 'malja_bar_b', 'bar_chair_blue', 0, 18, 9, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1866, 'malja_bar_b', 'bar_chair_blue', 4, 18, 3, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1867, 'malja_bar_b', 'bar_chair_blue', 0, 19, 9, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1868, 'malja_bar_b', 'bar_chair_blue', 2, 19, 3, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1869, 'malja_bar_b', 'goldfish_bar', 0, 22, 3, 0, 0.001, 1, 1, 'invisible,solid', '', NULL, NULL), + (1870, 'bar_a', 'lounge_chair_small', 12, 3, 5, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1871, 'bar_a', 'lounge_table_one', 13, 3, 5, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1872, 'bar_a', 'lounge_chair_small', 14, 3, 5, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1873, 'bar_a', 'lounge_chair_small', 13, 4, 5, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1874, 'bar_a', 'lounge_chair_small', 18, 5, 5, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1875, 'bar_a', 'lounge_chair_small', 17, 6, 5, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1876, 'bar_a', 'lounge_table_one', 18, 6, 5, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1877, 'bar_a', 'lounge_chair_small', 18, 7, 5, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1878, 'bar_a', 'lounge_private_bigback', 13, 11, 5, 3, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1879, 'bar_a', 'lounge_private_bigsofaback', 14, 11, 5, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1880, 'bar_a', 'lounge_private_bigsofaback', 15, 11, 5, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1881, 'bar_a', 'lounge_private_bigsofaback', 16, 11, 5, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1882, 'bar_a', 'lounge_private_bigsofaback', 17, 11, 5, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1883, 'bar_a', 'lounge_private_bigback', 18, 11, 5, 5, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1884, 'bar_a', 'lounge_private_bigsofa', 18, 12, 5, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1885, 'bar_a', 'lounge_table_threea', 14, 13, 5, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1886, 'bar_a', 'lounge_table_threeb', 15, 13, 5, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1887, 'bar_a', 'lounge_table_threec', 16, 13, 5, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1888, 'bar_a', 'lounge_private_bigsofa', 18, 13, 5, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1889, 'bar_a', 'lounge_private_bigsofa', 18, 14, 5, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1890, 'bar_a', 'lounge_private_bigcorner', 13, 15, 5, 1, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1891, 'bar_a', 'lounge_private_bigsofa', 14, 15, 5, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1892, 'bar_a', 'lounge_private_bigsofa', 15, 15, 5, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1893, 'bar_a', 'lounge_private_bigsofa', 16, 15, 5, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1894, 'bar_a', 'lounge_private_bigsofa', 17, 15, 5, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1895, 'bar_a', 'lounge_private_bigcorner', 18, 15, 5, 7, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1896, 'bar_a', 'lounge_chair_small', 3, 16, 5, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1897, 'bar_a', 'lounge_chair_small', 8, 16, 5, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1898, 'bar_a', 'lounge_table_one', 3, 17, 5, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1899, 'bar_a', 'lounge_chair_small', 4, 17, 5, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1900, 'bar_a', 'lounge_chair_small', 7, 17, 5, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1901, 'bar_a', 'lounge_table_one', 8, 17, 5, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1902, 'bar_a', 'lounge_chair_small', 9, 17, 5, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1903, 'bar_a', 'lounge_private_bigcorner', 13, 17, 5, 3, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1904, 'bar_a', 'lounge_private_bigsofa', 14, 17, 5, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1905, 'bar_a', 'lounge_private_bigsofa', 15, 17, 5, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1906, 'bar_a', 'lounge_private_bigsofa', 16, 17, 5, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1907, 'bar_a', 'lounge_private_bigsofa', 17, 17, 5, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1908, 'bar_a', 'lounge_private_bigcorner', 18, 17, 5, 5, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1909, 'bar_a', 'lounge_chair_small', 3, 18, 5, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1910, 'bar_a', 'lounge_chair_small', 8, 18, 5, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1911, 'bar_a', 'lounge_private_bigsofa', 18, 18, 5, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1912, 'bar_a', 'lounge_table_threea', 14, 19, 5, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1913, 'bar_a', 'lounge_table_threeb', 15, 19, 5, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1914, 'bar_a', 'lounge_table_threec', 16, 19, 5, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1915, 'bar_a', 'lounge_private_bigsofa', 18, 19, 5, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1916, 'bar_a', 'lounge_private_bigsofa', 18, 20, 5, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1917, 'bar_a', 'lounge_private_bigcorner', 13, 21, 5, 1, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1918, 'bar_a', 'lounge_private_bigsofa', 14, 21, 5, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1919, 'bar_a', 'lounge_private_bigsofa', 15, 21, 5, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1920, 'bar_a', 'lounge_private_bigsofa', 16, 21, 5, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1921, 'bar_a', 'lounge_private_bigsofa', 17, 21, 5, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1922, 'bar_a', 'lounge_private_bigcorner', 18, 21, 5, 7, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1923, 'bar_a', 'lounge_bara', 4, 23, 5, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1924, 'bar_a', 'lounge_bara', 5, 23, 5, 5, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1925, 'bar_a', 'lounge_bara', 6, 23, 5, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1926, 'bar_a', 'lounge_bara', 7, 23, 5, 3, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1927, 'bar_a', 'lounge_private_bigcorner', 13, 23, 5, 3, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1928, 'bar_a', 'lounge_private_bigsofa', 14, 23, 5, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1929, 'bar_a', 'lounge_private_bigsofa', 15, 23, 5, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1930, 'bar_a', 'lounge_private_bigsofa', 16, 23, 5, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1931, 'bar_a', 'lounge_private_bigsofa', 17, 23, 5, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1932, 'bar_a', 'lounge_private_bigcorner', 18, 23, 5, 5, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1933, 'bar_a', 'lounge_bara', 7, 24, 5, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1934, 'bar_a', 'lounge_private_bigsofa', 18, 24, 5, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1935, 'bar_a', 'lounge_bara', 7, 25, 5, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1936, 'bar_a', 'lounge_table_threea', 14, 25, 5, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1937, 'bar_a', 'lounge_table_threeb', 15, 25, 5, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1938, 'bar_a', 'lounge_table_threec', 16, 25, 5, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1939, 'bar_a', 'lounge_private_bigsofa', 18, 25, 5, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1940, 'bar_a', 'lounge_bara', 7, 26, 5, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1941, 'bar_a', 'lounge_private_bigsofa', 18, 26, 5, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1942, 'bar_a', 'lounge_bara', 7, 27, 5, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1943, 'bar_a', 'lounge_private_bigcorner', 13, 27, 5, 1, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1944, 'bar_a', 'lounge_private_bigsofa', 14, 27, 5, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1945, 'bar_a', 'lounge_private_bigsofa', 15, 27, 5, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1946, 'bar_a', 'lounge_private_bigsofa', 16, 27, 5, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1947, 'bar_a', 'lounge_private_bigsofa', 17, 27, 5, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1948, 'bar_a', 'lounge_private_bigcorner', 18, 27, 5, 7, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1949, 'bar_b', 'stair', 5, 21, 2, 0, 0.001, 1, 1, 'can_stand_on_top,invisible', '', NULL, NULL), + (1950, 'bar_b', 'stair', 4, 21, 2, 0, 0.001, 1, 1, 'can_stand_on_top,invisible', '', NULL, NULL), + (1951, 'bar_b', 'stair', 5, 20, 3, 0, 0.001, 1, 1, 'can_stand_on_top,invisible', '', NULL, NULL), + (1952, 'bar_b', 'stair', 4, 20, 3, 0, 0.001, 1, 1, 'can_stand_on_top,invisible', '', NULL, NULL), + (1953, 'bar_b', 'lounge_chair_small', 14, 19, 4, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1954, 'bar_b', 'lounge_table_one', 13, 19, 4, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1955, 'bar_b', 'lounge_chair_small', 12, 19, 4, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1956, 'bar_b', 'stair', 5, 19, 4, 0, 0.001, 1, 1, 'can_stand_on_top,invisible', '', NULL, NULL), + (1957, 'bar_b', 'stair', 4, 19, 4, 0, 0.001, 1, 1, 'can_stand_on_top,invisible', '', NULL, NULL), + (1958, 'bar_b', 'lounge_chair_small', 8, 18, 4, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1959, 'bar_b', 'lounge_table_one', 8, 17, 4, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1960, 'bar_b', 'lounge_chair_small', 15, 16, 4, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1961, 'bar_b', 'lounge_chair_small', 8, 16, 4, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1962, 'bar_b', 'lounge_table_one', 15, 15, 4, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1963, 'bar_b', 'lounge_chair_small', 14, 15, 4, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1964, 'bar_b', 'lounge_chair_small', 15, 14, 4, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1965, 'bar_b', 'lounge_chair_small', 10, 13, 4, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1966, 'bar_b', 'lounge_chair_small', 11, 12, 4, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1967, 'bar_b', 'lounge_table_one', 10, 12, 4, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1968, 'bar_b', 'lounge_chair_small', 9, 12, 4, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1969, 'bar_b', 'lounge_chair_small', 10, 11, 4, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1970, 'bar_b', 'lounge_chair_small', 15, 10, 4, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1971, 'bar_b', 'lounge_table_one', 15, 9, 4, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1972, 'bar_b', 'lounge_chair_small', 14, 9, 4, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1973, 'bar_b', 'fatsblox', 3, 9, 4, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1974, 'bar_b', 'lounge_chair_small', 15, 8, 4, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1975, 'bar_b', 'fatsofaa', 3, 8, 4, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1976, 'bar_b', 'lounge_chair_small', 9, 7, 4, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1977, 'bar_b', 'fatsofaa', 3, 7, 4, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1978, 'bar_b', 'lounge_chair_small', 10, 6, 4, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1979, 'bar_b', 'lounge_table_one', 9, 6, 4, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1980, 'bar_b', 'lounge_chair_small', 8, 6, 4, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1981, 'bar_b', 'fatsofaa', 3, 6, 4, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1982, 'bar_b', 'fatsofaa', 3, 5, 4, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1983, 'bar_b', 'fatsblox', 3, 4, 4, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1984, 'bar_b', 'fatsblox', 17, 3, 4, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1985, 'bar_b', 'fatsofaa', 16, 3, 4, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1986, 'bar_b', 'fatsofaa', 15, 3, 4, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1987, 'bar_b', 'fatsofaa', 14, 3, 4, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1988, 'bar_b', 'fatsofaa', 13, 3, 4, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (1989, 'bar_b', 'fatsblox', 12, 3, 4, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1990, 'bar_b', 'pub_pineapple_small', 3, 3, 4, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (1991, 'bar_b', 'stair', 11, 2, 100000, 2, 0.001, 1, 1, 'can_stand_on_top,invisible', '', NULL, NULL), + (1992, 'bar_b', 'stair', 10, 2, 4, 2, 0.001, 1, 1, 'can_stand_on_top,invisible', '', NULL, NULL), + (1993, 'bar_b', 'stair', 9, 2, 4, 2, 0.001, 1, 1, 'can_stand_on_top,invisible', '', NULL, NULL), + (1994, 'bar_b', 'stair', 8, 2, 4, 2, 0.001, 1, 1, 'can_stand_on_top,invisible', '', NULL, NULL), + (1995, 'bar_b', 'stair', 7, 2, 4, 2, 0.001, 1, 1, 'can_stand_on_top,invisible', '', NULL, NULL), + (1996, 'bar_b', 'stair', 6, 2, 4, 2, 0.001, 1, 1, 'can_stand_on_top,invisible', '', NULL, NULL), + (1997, 'bar_b', 'stair', 5, 2, 4, 2, 0.001, 1, 1, 'can_stand_on_top,invisible', '', NULL, NULL), + (1998, 'bar_b', 'stair', 4, 2, 4, 2, 0.001, 1, 1, 'can_stand_on_top,invisible', '', NULL, NULL), + (1999, 'habburger', 'sofa', 0, 0, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2000, 'habburger', 'table', 1, 0, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2001, 'habburger', 'sofa', 2, 0, 2, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2002, 'habburger', 'sofa', 6, 0, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2003, 'habburger', 'tablesp', 7, 0, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2004, 'habburger', 'sofa', 8, 0, 2, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2005, 'habburger', 'sofa', 12, 0, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2006, 'habburger', 'table', 13, 0, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2007, 'habburger', 'sofa', 14, 0, 2, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2008, 'habburger', 'trashcan', 15, 0, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2009, 'habburger', 'sofa2', 0, 1, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2010, 'habburger', 'table2', 1, 1, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2011, 'habburger', 'sofa2', 2, 1, 2, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2012, 'habburger', 'sofa2', 6, 1, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2013, 'habburger', 'table2', 7, 1, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2014, 'habburger', 'sofa2', 8, 1, 2, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2015, 'habburger', 'sofa2', 12, 1, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2016, 'habburger', 'table2', 13, 1, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2017, 'habburger', 'sofa2', 14, 1, 2, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2018, 'habburger', 'bardesk3', 2, 7, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2019, 'habburger', 'sofa', 7, 7, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2020, 'habburger', 'sofa2', 8, 7, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2021, 'habburger', 'sofa', 12, 7, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2022, 'habburger', 'sofa2', 13, 7, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2023, 'habburger', 'bardesk4', 2, 8, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2024, 'habburger', 'tablesp', 7, 8, 0, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2025, 'habburger', 'table2', 8, 8, 0, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2026, 'habburger', 'table', 12, 8, 0, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2027, 'habburger', 'table2', 13, 8, 0, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2028, 'habburger', 'bardesk', 2, 9, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2029, 'habburger', 'sofa', 7, 9, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2030, 'habburger', 'sofa2', 8, 9, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2031, 'habburger', 'sofa', 12, 9, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2032, 'habburger', 'sofa2', 13, 9, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2033, 'habburger', 'bardesk2', 2, 10, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2034, 'habburger', 'bardesk', 2, 11, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2035, 'habburger', 'bardesk', 2, 12, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2036, 'habburger', 'sofa', 7, 12, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2037, 'habburger', 'sofa2', 8, 12, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2038, 'habburger', 'sofa', 12, 12, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2039, 'habburger', 'sofa2', 13, 12, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2040, 'habburger', 'bardesk', 2, 13, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2041, 'habburger', 'table', 7, 13, 0, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2042, 'habburger', 'table2', 8, 13, 0, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2043, 'habburger', 'tablesp', 12, 13, 0, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2044, 'habburger', 'table2', 13, 13, 0, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2045, 'habburger', 'sofa', 7, 14, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2046, 'habburger', 'sofa2', 8, 14, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2047, 'habburger', 'sofa', 12, 14, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2048, 'habburger', 'sofa2', 13, 14, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2049, 'pizza', 'pizza_chair', 1, 11, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2050, 'pizza', 'pizza_chair', 1, 16, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2051, 'pizza', 'pizza_chair', 1, 19, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2052, 'pizza', 'pizza_chair', 1, 8, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2053, 'pizza', 'pizza_chair', 11, 21, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2054, 'pizza', 'pizza_chair', 11, 22, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2055, 'pizza', 'pizza_chair', 14, 21, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2056, 'pizza', 'pizza_chair', 14, 22, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2057, 'pizza', 'pizza_chair', 2, 11, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2058, 'pizza', 'pizza_chair', 2, 16, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2059, 'pizza', 'pizza_chair', 2, 19, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2060, 'pizza', 'pizza_chair', 2, 8, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2061, 'pizza', 'pizza_plant1', 0, 25, 1, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2062, 'pizza', 'pizza_plant1', 15, 0, 0, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2063, 'pizza', 'pizza_plant1', 15, 25, 1, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2064, 'pizza', 'pizza_plant2', 0, 6, 1, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2065, 'pizza', 'pizza_sofa1', 14, 10, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2066, 'pizza', 'pizza_sofa1', 14, 3, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2067, 'pizza', 'pizza_sofa2', 15, 10, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2068, 'pizza', 'pizza_sofa2', 15, 3, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2069, 'pizza', 'pizza_sofa3', 14, 13, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2070, 'pizza', 'pizza_sofa3', 14, 6, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2071, 'pizza', 'pizza_sofa4', 15, 13, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2072, 'pizza', 'pizza_sofa4', 15, 6, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2073, 'pizza', 'pizza_table', 13, 22, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2074, 'pizza', 'pizza_table', 15, 12, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2075, 'pizza', 'pizza_table', 15, 5, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2076, 'pizza', 'pizza_table', 2, 10, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2077, 'pizza', 'pizza_table', 2, 18, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2078, 'pizza', 'deska', 0, 5, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2079, 'pizza', 'deskb', 1, 5, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2080, 'pizza', 'deskc', 2, 5, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2081, 'pizza', 'deskd', 2, 4, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2082, 'pizza', 'deske', 2, 3, 1, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2083, 'pizza', 'deskf', 2, 2, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2084, 'pizza', 'deskg', 3, 2, 1, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2085, 'pizza', 'deskh', 4, 2, 1, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2086, 'pizza', 'deski', 5, 2, 1, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2087, 'pizza', 'deskj', 6, 2, 1, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2088, 'pizza', 'deskk', 6, 1, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2089, 'pizza', 'deskl', 6, 0, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2090, 'bb_lobby_1', 'bb_crossrd', 3, 0, 2, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2091, 'bb_lobby_1', 'bb_bench1', 4, 0, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2092, 'bb_lobby_1', 'bb_bench2', 5, 0, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2093, 'bb_lobby_1', 'bb_plant1', 8, 0, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2094, 'bb_lobby_1', 'bb_sofa1', 9, 0, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2095, 'bb_lobby_1', 'bb_sofa2', 10, 0, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2096, 'bb_lobby_1', 'bb_plant1', 11, 0, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2097, 'bb_lobby_1', 'bb_sofa1', 12, 0, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2098, 'bb_lobby_1', 'bb_sofa2', 13, 0, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2099, 'bb_lobby_1', 'bb_plant1', 14, 0, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2100, 'bb_lobby_1', 'bb_bench1', 16, 0, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2101, 'bb_lobby_1', 'bb_bench2', 17, 0, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2102, 'bb_lobby_1', 'bb_corner1out', 18, 0, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2103, 'bb_lobby_1', 'bb_bench1', 3, 1, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2104, 'bb_lobby_1', 'bb_wallend1in', 18, 1, 2, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2105, 'bb_lobby_1', 'bb_bench2', 3, 2, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2106, 'bb_lobby_1', 'bb_wallend1in', 18, 2, 2, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2107, 'bb_lobby_1', 'bb_plant3', 3, 3, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2108, 'bb_lobby_1', 'bb_special', 7, 3, 2, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2109, 'bb_lobby_1', 'bb_wallend1in', 8, 3, 2, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2110, 'bb_lobby_1', 'bb_wallend1in', 9, 3, 2, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2111, 'bb_lobby_1', 'bb_wallend1in', 10, 3, 2, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2112, 'bb_lobby_1', 'bb_wallend1in', 11, 3, 2, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2113, 'bb_lobby_1', 'bb_crossrd', 12, 3, 2, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2114, 'bb_lobby_1', 'bb_crossrd', 16, 3, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2115, 'bb_lobby_1', 'bb_wallend1in', 17, 3, 2, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2116, 'bb_lobby_1', 'bb_crossrd', 18, 3, 2, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2117, 'bb_lobby_1', 'bb_wallend2in', 3, 4, 1, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2118, 'bb_lobby_1', 'bb_wallend1in', 7, 4, 1, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2119, 'bb_lobby_1', 'bb_bench1', 8, 4, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2120, 'bb_lobby_1', 'bb_bench2', 9, 4, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2121, 'bb_lobby_1', 'bb_bench1', 10, 4, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2122, 'bb_lobby_1', 'bb_bench2', 11, 4, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2123, 'bb_lobby_1', 'bb_wallend2in', 12, 4, 1, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2124, 'bb_lobby_1', 'bb_wallend1in', 16, 4, 1, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2125, 'bb_lobby_1', 'bb_bench1', 17, 4, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2126, 'bb_lobby_1', 'bb_bench2', 18, 4, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2127, 'bb_lobby_1', 'bb_wallendout', 19, 4, 1, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2128, 'bb_lobby_1', 'bb_stool', 7, 5, 1, 3, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2129, 'bb_lobby_1', 'bb_stool', 12, 5, 1, 5, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2130, 'bb_lobby_1', 'bb_bench1', 19, 5, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2131, 'bb_lobby_1', 'bb_stool', 3, 6, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2132, 'bb_lobby_1', 'bb_bench2', 19, 6, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2133, 'bb_lobby_1', 'bb_chair', 9, 7, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2134, 'bb_lobby_1', 'bb_chair', 10, 7, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2135, 'bb_lobby_1', 'bb_bench1', 17, 7, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2136, 'bb_lobby_1', 'bb_bench2', 18, 7, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2137, 'bb_lobby_1', 'bb_wallendout', 19, 7, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2138, 'bb_lobby_1', 'bb_stool', 3, 8, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2139, 'bb_lobby_1', 'bb_extra', 17, 8, 1, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2140, 'bb_lobby_1', 'bb_extra', 18, 8, 1, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2141, 'bb_lobby_1', 'bb_crossrd', 19, 8, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2142, 'bb_lobby_1', 'bb_stool', 3, 9, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2143, 'bb_lobby_1', 'bb_chair', 9, 9, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2144, 'bb_lobby_1', 'bb_chair', 10, 9, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2145, 'bb_lobby_1', 'bb_bench1', 17, 9, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2146, 'bb_lobby_1', 'bb_bench2', 18, 9, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2147, 'bb_lobby_1', 'bb_wallendout', 19, 9, 1, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2148, 'bb_lobby_1', 'bb_bench1', 19, 10, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2149, 'bb_lobby_1', 'bb_stool', 7, 11, 1, 1, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2150, 'bb_lobby_1', 'bb_stool', 12, 11, 1, 7, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2151, 'bb_lobby_1', 'bb_bench2', 19, 11, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2152, 'bb_lobby_1', 'bb_wallend1in', 7, 12, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2153, 'bb_lobby_1', 'bb_bench1', 8, 12, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2154, 'bb_lobby_1', 'bb_bench2', 9, 12, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2155, 'bb_lobby_1', 'bb_bench1', 10, 12, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2156, 'bb_lobby_1', 'bb_bench2', 11, 12, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2157, 'bb_lobby_1', 'bb_wallend2in', 12, 12, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2158, 'bb_lobby_1', 'bb_bench1', 17, 12, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2159, 'bb_lobby_1', 'bb_bench2', 18, 12, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2160, 'bb_lobby_1', 'bb_wallendout', 19, 12, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2161, 'bb_lobby_1', 'bb_corner1out', 7, 13, 1, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2162, 'bb_lobby_1', 'bb_wallout', 8, 13, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2163, 'bb_lobby_1', 'bb_wallout', 9, 13, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2164, 'bb_lobby_1', 'bb_wallout', 10, 13, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2165, 'bb_lobby_1', 'bb_wallout', 11, 13, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2166, 'bb_lobby_1', 'bb_special', 12, 13, 1, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2167, 'bb_lobby_1', 'bb_wallendout', 16, 13, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2168, 'bb_lobby_1', 'bb_wallout', 17, 13, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2169, 'bb_lobby_1', 'bb_wallout', 18, 13, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2170, 'bb_lobby_1', 'bb_corner1out', 19, 13, 1, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2171, 'bb_lobby_1', 'bb_plant0', 9, 14, 0, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2172, 'bb_lobby_1', 'bb_sofa1', 10, 14, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2173, 'bb_lobby_1', 'bb_sofa2', 11, 14, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2174, 'bb_lobby_1', 'bb_plant2', 12, 14, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2175, 'bb_lobby_1', 'bb_plant2', 16, 14, 0, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2176, 'bb_lobby_1', 'bb_sofa1', 17, 14, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2177, 'bb_lobby_1', 'bb_sofa2', 18, 14, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2178, 'bb_lobby_1', 'bb_plant0', 19, 14, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2179, 'bb_lobby_1', 'bb_sofa1', 9, 15, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2180, 'bb_lobby_1', 'bb_sofa1', 19, 15, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2181, 'bb_lobby_1', 'bb_sofa2', 9, 16, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2182, 'bb_lobby_1', 'bb_sofa2', 19, 16, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2183, 'bb_lobby_1', 'bb_sofa1', 9, 17, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2184, 'bb_lobby_1', 'bb_sofa1', 19, 17, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2185, 'bb_lobby_1', 'bb_sofa2', 9, 18, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2186, 'bb_lobby_1', 'bb_sofa2', 19, 18, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2187, 'bb_lobby_1', 'bb_plant0', 9, 19, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2188, 'bb_lobby_1', 'bb_sofa1', 10, 19, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2189, 'bb_lobby_1', 'bb_sofa2', 11, 19, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2190, 'bb_lobby_1', 'bb_plant3', 12, 19, 0, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2191, 'bb_lobby_1', 'bb_plant3', 16, 19, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2192, 'bb_lobby_1', 'bb_sofa1', 17, 19, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2193, 'bb_lobby_1', 'bb_sofa2', 18, 19, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2194, 'bb_lobby_1', 'bb_plant0', 19, 19, 0, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2195, 'snowwar_lobby_1', 'sw_barrellchair', 31, 18, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2196, 'snowwar_lobby_1', 'sw_barrellchair', 31, 19, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2197, 'snowwar_lobby_1', 'sw_barrellchair', 30, 20, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2198, 'snowwar_lobby_1', 'sw_barrellchair', 37, 20, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2199, 'snowwar_lobby_1', 'sw_barrellchair', 39, 20, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2200, 'snowwar_lobby_1', 'sw_barrellchair', 41, 20, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2201, 'snowwar_lobby_1', 'sw_chair1', 30, 24, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2202, 'snowwar_lobby_1', 'sw_chair2', 31, 24, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2203, 'snowwar_lobby_1', 'sw_chair2', 32, 24, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2204, 'snowwar_lobby_1', 'sw_chair2', 33, 24, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2205, 'snowwar_lobby_1', 'sw_chair3', 34, 24, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2206, 'snowwar_lobby_1', 'sw_table1', 30, 25, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2207, 'snowwar_lobby_1', 'sw_table2', 31, 25, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2208, 'snowwar_lobby_1', 'sw_table3', 32, 25, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2209, 'snowwar_lobby_1', 'sw_table4', 33, 25, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2210, 'snowwar_lobby_1', 'sw_table5', 34, 25, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2211, 'snowwar_lobby_1', 'sw_chair1', 30, 26, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2212, 'snowwar_lobby_1', 'sw_chair2', 31, 26, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2213, 'snowwar_lobby_1', 'sw_chair2', 32, 26, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2214, 'snowwar_lobby_1', 'sw_chair2', 33, 26, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2215, 'snowwar_lobby_1', 'sw_chair3', 34, 26, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2216, 'snowwar_lobby_1', 'sw_chair1', 30, 29, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2217, 'snowwar_lobby_1', 'sw_chair2', 31, 29, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2218, 'snowwar_lobby_1', 'sw_chair2', 32, 29, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2219, 'snowwar_lobby_1', 'sw_chair2', 33, 29, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2220, 'snowwar_lobby_1', 'sw_chair3', 34, 29, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2221, 'snowwar_lobby_1', 'sw_table1', 30, 30, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2222, 'snowwar_lobby_1', 'sw_table2', 31, 30, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2223, 'snowwar_lobby_1', 'sw_table3', 32, 30, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2224, 'snowwar_lobby_1', 'sw_table4', 33, 30, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2225, 'snowwar_lobby_1', 'sw_table5', 34, 30, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2226, 'snowwar_lobby_1', 'sw_chair1', 30, 31, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2227, 'snowwar_lobby_1', 'sw_chair2', 31, 31, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2228, 'snowwar_lobby_1', 'sw_chair2', 32, 31, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2229, 'snowwar_lobby_1', 'sw_chair2', 33, 31, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2230, 'snowwar_lobby_1', 'sw_chair3', 34, 31, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2231, 'snowwar_lobby_1', 'invisichair', 27, 32, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2232, 'snowwar_lobby_1', 'invisichair', 27, 33, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2233, 'snowwar_lobby_1', 'invisichair', 27, 34, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2234, 'snowwar_lobby_1', 'invisichair', 28, 36, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2235, 'snowwar_lobby_1', 'invisichair', 29, 36, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2236, 'snowwar_lobby_1', 'invisichair', 30, 36, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2237, 'snowwar_lobby_1', 'invisichair', 31, 36, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2238, 'tv_studio', 'much_camera3', 4, 13, 0, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2239, 'tv_studio', 'much_chair', 14, 4, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2240, 'tv_studio', 'much_chair', 18, 5, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2241, 'tv_studio', 'much_chair', 18, 7, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2242, 'tv_studio', 'much_chair', 19, 11, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2243, 'tv_studio', 'much_chair', 19, 12, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2244, 'tv_studio', 'much_chair', 2, 6, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2245, 'tv_studio', 'much_chair', 5, 3, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2246, 'tv_studio', 'much_sofa1a', 0, 15, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2247, 'tv_studio', 'much_sofa1a', 1, 18, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2248, 'tv_studio', 'much_sofa1a', 14, 19, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2249, 'tv_studio', 'much_sofa1a', 14, 24, 4, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2250, 'tv_studio', 'much_sofa1a', 18, 16, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2251, 'tv_studio', 'much_sofa1a', 6, 27, 4, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2252, 'tv_studio', 'much_sofa1a', 8, 1, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2253, 'tv_studio', 'much_sofa1a', 8, 31, 4, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2254, 'tv_studio', 'much_sofa1b', 0, 16, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2255, 'tv_studio', 'much_sofa1b', 10, 1, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2256, 'tv_studio', 'much_sofa1b', 15, 19, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2257, 'tv_studio', 'much_sofa1b', 15, 24, 4, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2258, 'tv_studio', 'much_sofa1b', 16, 19, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2259, 'tv_studio', 'much_sofa1b', 18, 17, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2260, 'tv_studio', 'much_sofa1b', 18, 18, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2261, 'tv_studio', 'much_sofa1b', 2, 18, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2262, 'tv_studio', 'much_sofa1b', 3, 18, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2263, 'tv_studio', 'much_sofa1b', 6, 28, 4, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2264, 'tv_studio', 'much_sofa1b', 6, 29, 4, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2265, 'tv_studio', 'much_sofa1b', 6, 30, 4, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2266, 'tv_studio', 'much_sofa1b', 9, 1, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2267, 'tv_studio', 'much_sofa1b', 9, 31, 4, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2268, 'tv_studio', 'much_stool', 14, 10, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2269, 'tv_studio', 'much_stool', 14, 11, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2270, 'tv_studio', 'much_stool', 14, 12, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2271, 'tv_studio', 'much_stool', 14, 13, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2272, 'tv_studio', 'much_table1', 10, 3, 0, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2273, 'tv_studio', 'much_table1', 16, 16, 0, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2274, 'tv_studio', 'much_table1', 2, 16, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2275, 'tv_studio', 'much_table1', 8, 29, 4, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2276, 'tv_studio', 'much_table2', 15, 16, 0, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2277, 'tv_studio', 'much_table2', 8, 28, 4, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2278, 'tv_studio', 'much_table2', 9, 3, 0, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2279, 'tv_studio', 'much_table3', 14, 16, 0, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2280, 'tv_studio', 'much_table3', 2, 15, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2281, 'tv_studio', 'much_table3', 8, 27, 4, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2282, 'tv_studio', 'much_table3', 8, 3, 0, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2283, 'tv_studio', 'watermatic', 5, 25, 4, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2284, 'club_mammoth', 'bbarstool', 14, 0, 4, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2285, 'club_mammoth', 'bbarstool', 14, 1, 4, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2286, 'club_mammoth', 'bbarstool', 14, 2, 4, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2287, 'club_mammoth', 'elephantcouch2', 18, 4, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2288, 'club_mammoth', 'elephantcouch4', 21, 4, 2, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2289, 'club_mammoth', 'elephantcouch1', 18, 5, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2290, 'club_mammoth', 'elephantcouch3', 21, 5, 2, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2291, 'club_mammoth', 'tinypalm', 11, 6, 2, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2292, 'club_mammoth', 'plainstool1', 12, 6, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2293, 'club_mammoth', 'plainstool2', 13, 6, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2294, 'club_mammoth', 'plainstool2', 14, 6, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2295, 'club_mammoth', 'plainstool2', 15, 6, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2296, 'club_mammoth', 'plainstool2', 16, 6, 100000, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2297, 'club_mammoth', 'bbarstool', 15, 9, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2298, 'club_mammoth', 'bbarstool', 15, 10, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2299, 'club_mammoth', 'bbarstool', 15, 11, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2300, 'club_mammoth', 'bbarstool', 16, 11, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2301, 'club_mammoth', 'bbarstool', 17, 11, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2302, 'club_mammoth', 'plainstool3', 11, 15, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2303, 'club_mammoth', 'plainstool3', 11, 16, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2304, 'club_mammoth', 'plainstool3', 11, 17, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2305, 'club_mammoth', 'plainstool3', 11, 18, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2306, 'club_mammoth', 'elephantcouch2', 20, 24, 4, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2307, 'club_mammoth', 'elephantcouch4', 23, 24, 4, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2308, 'club_mammoth', 'elephantcouch1', 20, 25, 4, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2309, 'club_mammoth', 'elephantcouch3', 23, 25, 4, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2310, 'club_mammoth', 'boothsofa1', 7, 27, 6, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2311, 'club_mammoth', 'boothsofa3', 11, 27, 6, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2312, 'club_mammoth', 'boothsofa1', 13, 27, 6, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2313, 'club_mammoth', 'boothsofa1', 7, 28, 6, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2314, 'club_mammoth', 'boothsofa3', 11, 28, 6, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2315, 'club_mammoth', 'tinypalm', 12, 28, 6, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2316, 'club_mammoth', 'boothsofa1', 13, 28, 6, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2317, 'club_mammoth', 'boothsofa1', 7, 29, 6, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2318, 'club_mammoth', 'boothsofa3', 11, 29, 6, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2319, 'club_mammoth', 'boothsofa1', 13, 29, 6, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2320, 'club_mammoth', 'boothsofacorner1', 7, 30, 6, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2321, 'club_mammoth', 'boothsofa2', 8, 30, 6, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2322, 'club_mammoth', 'boothsofa2', 9, 30, 6, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2323, 'club_mammoth', 'boothsofa2', 10, 30, 6, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2324, 'club_mammoth', 'boothsofacorner2', 11, 30, 6, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2325, 'club_mammoth', 'tinypalm', 12, 30, 6, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2326, 'club_mammoth', 'boothsofacorner1', 13, 30, 6, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2327, 'club_mammoth', 'boothsofa2', 14, 30, 6, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2328, 'club_mammoth', 'boothsofa2', 15, 30, 6, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2329, 'club_mammoth', 'boothsofa2', 16, 30, 6, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2330, 'club_mammoth', 'boothsofa2', 17, 30, 6, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2331, 'ice_cafe', 'cafe_chair_cream', 17, 17, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2332, 'ice_cafe', 'infokiosk', 17, 0, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2333, 'ice_cafe', 'cafe_deskb', 1, 10, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2334, 'ice_cafe', 'cafe_chair_blue', 5, 17, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2335, 'ice_cafe', 'cafe_table_biga_blue', 4, 2, 1, 2, 0.001, 2, 2, 'extra_parameter', '', NULL, NULL), + (2336, 'ice_cafe', 'infokiosk', 15, 0, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2337, 'ice_cafe', 'cafe_chair_blue', 3, 1, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2338, 'ice_cafe', 'cafe_sofaa', 2, 21, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2339, 'ice_cafe', 'cafe_deskb', 1, 12, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2340, 'ice_cafe', 'cafe_sofaa', 2, 23, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2341, 'ice_cafe', 'cafe_chair_cream', 13, 3, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2342, 'ice_cafe', 'cafe_chair_cream', 10, 4, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2343, 'ice_cafe', 'cafe_table_cream', 15, 10, 0, 2, 0.001, 2, 2, 'extra_parameter', '', NULL, NULL), + (2344, 'ice_cafe', 'cafe_chair_cream', 13, 4, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2345, 'ice_cafe', 'cafe_chair_blue', 3, 15, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2346, 'ice_cafe', 'cafe_deskb', 1, 13, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2347, 'ice_cafe', 'cafe_sofab', 2, 20, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2348, 'ice_cafe', 'construction', 8, 22, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2349, 'ice_cafe', 'cafe_chair_blue', 3, 2, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2350, 'ice_cafe', 'cafe_chair_cream', 14, 10, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2351, 'ice_cafe', 'cafe_chair_cream', 12, 5, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2352, 'ice_cafe', 'cafe_chair_cream', 14, 17, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2353, 'ice_cafe', 'cafe_chair_blue', 5, 10, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2354, 'ice_cafe', 'cafe_chair_blue', 5, 14, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2355, 'ice_cafe', 'cafe_chair_cream', 15, 9, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2356, 'ice_cafe', 'cafe_table_bigb_cream', 12, 2, 0, 0, 0.001, 0, 0, 'solid', '', NULL, NULL), + (2357, 'ice_cafe', 'cafe_chair_blue', 3, 3, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2358, 'ice_cafe', 'cafe_chair_cream', 10, 3, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2359, 'ice_cafe', 'cafe_table_biga_cream', 11, 3, 0, 2, 0.001, 2, 2, 'extra_parameter', '', NULL, NULL), + (2360, 'ice_cafe', 'cafe_chair_cream', 10, 19, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2361, 'ice_cafe', 'cafe_chair_cream', 17, 11, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2362, 'ice_cafe', 'cafe_chair_blue', 5, 4, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2363, 'ice_cafe', 'cafe_chair_blue', 6, 1, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2364, 'ice_cafe', 'cafe_chair_blue', 6, 16, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2365, 'ice_cafe', 'cafe_chair_blue', 3, 8, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2366, 'ice_cafe', 'cafe_chair_cream', 11, 21, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2367, 'ice_cafe', 'cafe_table_bigb_blue', 5, 1, 1, 0, 0.001, 0, 0, 'solid', '', NULL, NULL), + (2368, 'ice_cafe', 'cafe_chair_cream', 11, 18, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2369, 'ice_cafe', 'cafe_table_blue', 4, 8, 1, 2, 0.001, 2, 2, 'extra_parameter', '', NULL, NULL), + (2370, 'ice_cafe', 'cafe_table_cream', 15, 17, 0, 2, 0.001, 2, 2, 'extra_parameter', '', NULL, NULL), + (2371, 'ice_cafe', 'cafe_chair_cream', 10, 2, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2372, 'ice_cafe', 'infokiosk', 16, 0, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2373, 'ice_cafe', 'cafe_sofab', 2, 22, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2374, 'ice_cafe', 'cafe_chair_cream', 13, 20, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2375, 'ice_cafe', 'cafe_chair_cream', 15, 16, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2376, 'ice_cafe', 'cafe_chair_cream', 16, 19, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2377, 'ice_cafe', 'cafe_deskc', 1, 9, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2378, 'ice_cafe', 'cafe_chair_blue', 6, 9, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2379, 'ice_cafe', 'cafe_chair_cream', 15, 12, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2380, 'ice_cafe', 'cafe_chair_cream', 11, 1, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2381, 'ice_cafe', 'cafe_chair_blue', 6, 2, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2382, 'ice_cafe', 'cafe_table_blue', 4, 15, 1, 2, 0.001, 2, 2, 'extra_parameter', '', NULL, NULL), + (2383, 'ice_cafe', 'cafe_chair_blue', 6, 3, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2384, 'ice_cafe', 'cafe_deskb', 1, 11, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2385, 'ice_cafe', 'cafe_table_cream', 11, 19, 0, 2, 0.001, 2, 2, 'extra_parameter', '', NULL, NULL), + (2386, 'ice_cafe', 'cafe_deskb', 1, 14, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2387, 'ice_cafe', 'cafe_chair_cream', 13, 2, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2388, 'ice_cafe', 'cafe_chair_blue', 4, 7, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2389, 'netcafe', 'k', 15, 7, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2390, 'netcafe', 'k', 12, 12, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2391, 'netcafe', 'k', 15, 9, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2392, 'netcafe', 'k', 16, 1, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2393, 'netcafe', 'k', 18, 10, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2394, 'netcafe', 'k', 18, 9, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2395, 'netcafe', 'k', 19, 1, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2396, 'netcafe', 'k', 4, 10, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2397, 'netcafe', 'k', 4, 12, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2398, 'netcafe', 'k', 6, 18, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2399, 'netcafe', 'k', 9, 9, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2400, 'netcafe', 'kukat1', 13, 3, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2401, 'netcafe', 'kukat1', 20, 3, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2402, 'netcafe', 'kukat1', 6, 16, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2403, 'netcafe', 'kukat1', 8, 16, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2404, 'netcafe', 'kukat2', 12, 3, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2405, 'netcafe', 'kukat2', 19, 3, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2406, 'netcafe', 'kukat2', 5, 16, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2407, 'netcafe', 'kukat2', 7, 16, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2408, 'netcafe', 'kukat3', 9, 16, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2409, 'netcafe', 'kukat3', 9, 18, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2410, 'netcafe', 'kukat4', 9, 17, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2411, 'netcafe', 'kukat4', 9, 19, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2412, 'netcafe', 'kukat5', 6, 3, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2413, 'netcafe', 'kukat6', 5, 3, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2414, 'netcafe', 'kukka', 20, 23, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2415, 'netcafe', 'kukka2', 15, 16, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2416, 'netcafe', 'l', 12, 11, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2417, 'netcafe', 'l', 13, 1, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2418, 'netcafe', 'l', 15, 8, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2419, 'netcafe', 'l', 18, 8, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2420, 'netcafe', 'l', 4, 11, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2421, 'netcafe', 'l', 9, 11, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2422, 'netcafe', 'l', 9, 12, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2423, 'netcafe', 'm', 10, 1, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2424, 'netcafe', 'm', 12, 10, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2425, 'netcafe', 'm', 12, 9, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2426, 'netcafe', 'm', 15, 10, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2427, 'netcafe', 'm', 18, 7, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2428, 'netcafe', 'm', 4, 13, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2429, 'netcafe', 'm', 4, 9, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2430, 'netcafe', 'm', 6, 21, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2431, 'netcafe', 'm', 9, 10, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2432, 'netcafe', 'shift1', 0, 5, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2433, 'netcafe', 'shift1', 12, 4, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2434, 'netcafe', 'shift1', 19, 4, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2435, 'netcafe', 'shift1', 2, 5, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2436, 'netcafe', 'shift1', 6, 0, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2437, 'netcafe', 'shift2', 1, 5, 1, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2438, 'netcafe', 'shift2', 13, 4, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2439, 'netcafe', 'shift2', 20, 4, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2440, 'netcafe', 'shift2', 3, 5, 1, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2441, 'netcafe', 'shift2', 7, 0, 1, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2442, 'netcafe', 'sofabig1', 20, 21, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2443, 'netcafe', 'sofabig2', 20, 19, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2444, 'netcafe', 'sofabig2', 20, 20, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2445, 'netcafe', 'sofabig3', 20, 18, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2446, 'netcafe', 'sofalittle1', 18, 23, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2447, 'netcafe', 'sofalittle2', 17, 23, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2448, 'netcafe', 'sofalittle3', 16, 23, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2449, 'netcafe', 'table1', 17, 19, 1, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2450, 'netcafe', 'table1', 17, 20, 1, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2451, 'netcafe', 'table1', 17, 21, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2452, 'netcafe', 'table2', 16, 10, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2453, 'netcafe', 'table2', 16, 7, 0, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2454, 'netcafe', 'table2', 16, 8, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2455, 'netcafe', 'table2', 16, 9, 0, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2456, 'netcafe', 'table3', 10, 10, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2457, 'netcafe', 'table3', 10, 11, 0, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2458, 'netcafe', 'table3', 10, 12, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2459, 'netcafe', 'table3', 10, 9, 0, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2460, 'netcafe', 'tablecorner', 11, 9, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2461, 'netcafe', 'tablecorner', 17, 7, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2462, 'netcafe', 'tablecorner', 18, 19, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2463, 'netcafe', 'watermatic', 5, 0, 1, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2464, 'hallway0', 'hw_chair', 15, 0, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2465, 'hallway0', 'hw_chair', 15, 1, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2466, 'hallway0', 'hw_chair', 17, 0, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2467, 'hallway0', 'hw_chair', 17, 1, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2468, 'hallway0', 'hw_chair', 20, 0, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2469, 'hallway0', 'hw_chair', 20, 1, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2470, 'hallway0', 'hw_chair', 20, 2, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2471, 'hallway0', 'hw_chair', 22, 0, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2472, 'hallway0', 'hw_chair', 22, 1, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2473, 'hallway0', 'hw_chair', 22, 2, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2474, 'hallway0', 'hw_chair', 25, 0, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2475, 'hallway0', 'hw_chair', 25, 1, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2476, 'hallway0', 'hw_chair', 27, 0, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2477, 'hallway0', 'hw_chair', 27, 1, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2478, 'hallway0', 'hw_ero1', 17, 8, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2479, 'hallway0', 'hw_ero2', 18, 8, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2480, 'hallway0', 'hw_ero5', 19, 8, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2481, 'hallway0', 'hw_plant', 4, 0, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2482, 'hallway0', 'hw_plant', 4, 7, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2483, 'hallway0', 'hw_pntg', 18, 0, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2484, 'hallway0', 'hw_smtble', 7, 0, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2485, 'hallway0', 'hw_sofa1', 12, 10, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2486, 'hallway0', 'hw_sofa1', 5, 0, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2487, 'hallway0', 'hw_sofa1', 8, 0, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2488, 'hallway0', 'hw_sofa2', 12, 11, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2489, 'hallway0', 'hw_sofa2', 12, 12, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2490, 'hallway0', 'hw_sofa2', 12, 13, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2491, 'hallway0', 'hw_sofa3', 12, 14, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2492, 'hallway0', 'hw_sofa3', 6, 0, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2493, 'hallway0', 'hw_sofa3', 9, 0, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2494, 'hallway0', 'hw_table1', 16, 0, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2495, 'hallway0', 'hw_table1', 21, 0, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2496, 'hallway0', 'hw_table1', 26, 0, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2497, 'hallway0', 'hw_table2', 21, 1, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2498, 'hallway0', 'hw_table3', 16, 1, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2499, 'hallway0', 'hw_table3', 21, 2, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2500, 'hallway0', 'hw_table3', 26, 1, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2501, 'hallway0', 'hw_watermatic', 10, 0, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2502, 'hallway0', 'pillar1', 12, 8, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2503, 'hallway9', 'hw_ero1', 12, 14, 0, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2504, 'hallway9', 'hw_ero1', 14, 12, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2505, 'hallway9', 'hw_ero1', 14, 19, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2506, 'hallway9', 'hw_ero1', 19, 14, 0, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2507, 'hallway9', 'hw_ero2', 12, 15, 0, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2508, 'hallway9', 'hw_ero2', 15, 12, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2509, 'hallway9', 'hw_ero2', 15, 19, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2510, 'hallway9', 'hw_ero2', 19, 15, 0, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2511, 'hallway9', 'hw_ero3', 12, 16, 0, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2512, 'hallway9', 'hw_ero3', 16, 12, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2513, 'hallway9', 'hw_ero3', 16, 19, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2514, 'hallway9', 'hw_ero3', 19, 16, 0, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2515, 'hallway9', 'hw_ero5', 12, 17, 0, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2516, 'hallway9', 'hw_ero5', 17, 12, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2517, 'hallway9', 'hw_ero5', 17, 19, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2518, 'hallway9', 'hw_ero5', 19, 17, 0, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2519, 'hallway9', 'hw_plant', 12, 27, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2520, 'hallway9', 'hw_shelf', 12, 4, 0, 4, 0.001, 2, 1, 'solid', '', NULL, NULL), + (2521, 'hallway9', 'hw_shelf', 4, 12, 0, 2, 0.001, 2, 1, 'solid', '', NULL, NULL), + (2522, 'hallway9', 'hw_smtble', 10, 12, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2523, 'hallway9', 'hw_smtble', 12, 10, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2524, 'hallway9', 'hw_smtble', 12, 21, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2525, 'hallway9', 'hw_smtble', 21, 12, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2526, 'hallway9', 'hw_sofa1', 12, 22, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2527, 'hallway9', 'hw_sofa1', 12, 6, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2528, 'hallway9', 'hw_sofa1', 22, 12, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2529, 'hallway9', 'hw_sofa1', 6, 12, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2530, 'hallway9', 'hw_sofa2', 12, 23, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2531, 'hallway9', 'hw_sofa2', 12, 24, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2532, 'hallway9', 'hw_sofa2', 12, 7, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2533, 'hallway9', 'hw_sofa2', 12, 8, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2534, 'hallway9', 'hw_sofa2', 23, 12, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2535, 'hallway9', 'hw_sofa2', 24, 12, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2536, 'hallway9', 'hw_sofa2', 7, 12, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2537, 'hallway9', 'hw_sofa2', 8, 12, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2538, 'hallway9', 'hw_sofa3', 12, 25, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2539, 'hallway9', 'hw_sofa3', 12, 9, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2540, 'hallway9', 'hw_sofa3', 25, 12, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2541, 'hallway9', 'hw_sofa3', 9, 12, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2542, 'hallway9', 'hw_watermatic', 27, 12, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2543, 'hallway9', 'pillar1', 19, 4, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2544, 'hallway9', 'pillar1', 4, 19, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2545, 'hallway2', 'hw_chair', 17, 13, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2546, 'hallway2', 'hw_chair', 17, 15, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2547, 'hallway2', 'hw_chair', 19, 18, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2548, 'hallway2', 'hw_chair', 19, 4, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2549, 'hallway2', 'hw_chair', 20, 13, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2550, 'hallway2', 'hw_chair', 22, 13, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2551, 'hallway2', 'hw_chair', 22, 16, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2552, 'hallway2', 'hw_chair', 22, 18, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2553, 'hallway2', 'hw_ero1', 12, 11, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2554, 'hallway2', 'hw_ero1', 22, 11, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2555, 'hallway2', 'hw_ero1', 4, 10, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2556, 'hallway2', 'hw_ero2', 13, 11, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2557, 'hallway2', 'hw_ero2', 16, 11, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2558, 'hallway2', 'hw_ero3', 14, 11, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2559, 'hallway2', 'hw_ero4', 15, 11, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2560, 'hallway2', 'hw_ero5', 17, 11, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2561, 'hallway2', 'hw_ero5', 23, 11, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2562, 'hallway2', 'hw_ero5', 5, 10, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2563, 'hallway2', 'hw_plant', 13, 4, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2564, 'hallway2', 'hw_plant', 18, 4, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2565, 'hallway2', 'hw_plant', 3, 6, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2566, 'hallway2', 'hw_plant', 4, 17, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2567, 'hallway2', 'hw_smtble', 17, 14, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2568, 'hallway2', 'hw_smtble', 18, 18, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2569, 'hallway2', 'hw_smtble', 21, 13, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2570, 'hallway2', 'hw_smtble', 22, 17, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2571, 'hallway2', 'hw_smtble', 4, 14, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2572, 'hallway2', 'hw_smtble', 7, 4, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2573, 'hallway2', 'hw_sofa1', 4, 12, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2574, 'hallway2', 'hw_sofa1', 4, 15, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2575, 'hallway2', 'hw_sofa1', 5, 4, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2576, 'hallway2', 'hw_sofa1', 8, 4, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2577, 'hallway2', 'hw_sofa3', 4, 13, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2578, 'hallway2', 'hw_sofa3', 4, 16, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2579, 'hallway2', 'hw_sofa3', 6, 4, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2580, 'hallway2', 'hw_sofa3', 9, 4, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2581, 'hallway2', 'hw_statue', 19, 15, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2582, 'hallway2', 'hw_watermatic', 11, 13, 1, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2583, 'hallway2', 'pillar1', 11, 12, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2584, 'hallway1', 'hw_chair', 13, 4, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2585, 'hallway1', 'hw_chair', 17, 16, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2586, 'hallway1', 'hw_chair', 17, 18, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2587, 'hallway1', 'hw_chair', 18, 16, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2588, 'hallway1', 'hw_chair', 18, 18, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2589, 'hallway1', 'hw_chair', 4, 13, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2590, 'hallway1', 'hw_chair', 4, 18, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2591, 'hallway1', 'hw_ero1', 17, 13, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2592, 'hallway1', 'hw_ero5', 18, 13, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2593, 'hallway1', 'hw_painting1', 22, 5, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2594, 'hallway1', 'hw_plant', 12, 9, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2595, 'hallway1', 'hw_plant', 26, 4, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2596, 'hallway1', 'hw_plant', 4, 12, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2597, 'hallway1', 'hw_plant', 4, 19, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2598, 'hallway1', 'hw_smtble', 12, 4, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2599, 'hallway1', 'hw_smtble', 22, 4, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2600, 'hallway1', 'hw_smtble', 7, 12, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2601, 'hallway1', 'hw_sofa1', 12, 5, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2602, 'hallway1', 'hw_sofa1', 19, 4, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2603, 'hallway1', 'hw_sofa1', 23, 4, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2604, 'hallway1', 'hw_sofa1', 5, 12, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2605, 'hallway1', 'hw_sofa1', 8, 12, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2606, 'hallway1', 'hw_sofa2', 12, 6, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2607, 'hallway1', 'hw_sofa2', 12, 7, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2608, 'hallway1', 'hw_sofa2', 20, 4, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2609, 'hallway1', 'hw_sofa2', 24, 4, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2610, 'hallway1', 'hw_sofa3', 12, 8, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2611, 'hallway1', 'hw_sofa3', 21, 4, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2612, 'hallway1', 'hw_sofa3', 25, 4, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2613, 'hallway1', 'hw_sofa3', 6, 12, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2614, 'hallway1', 'hw_sofa3', 9, 12, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2615, 'hallway1', 'hw_table1', 17, 17, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2616, 'hallway1', 'hw_table3', 18, 17, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2617, 'hallway1', 'hw_watermatic', 12, 10, 0, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2618, 'hallway1', 'pillar1', 10, 19, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2619, 'hallway3', 'hw_chair', 13, 4, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2620, 'hallway3', 'hw_chair', 13, 5, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2621, 'hallway3', 'hw_chair', 15, 4, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2622, 'hallway3', 'hw_chair', 15, 5, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2623, 'hallway3', 'hw_chair', 5, 4, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2624, 'hallway3', 'hw_chair', 7, 10, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2625, 'hallway3', 'hw_chair', 7, 11, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2626, 'hallway3', 'hw_chair', 9, 10, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2627, 'hallway3', 'hw_chair', 9, 11, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2628, 'hallway3', 'hw_ero1', 12, 10, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2629, 'hallway3', 'hw_ero2', 12, 11, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2630, 'hallway3', 'hw_ero2', 12, 14, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2631, 'hallway3', 'hw_ero2', 12, 17, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2632, 'hallway3', 'hw_ero3', 12, 12, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2633, 'hallway3', 'hw_ero3', 12, 15, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2634, 'hallway3', 'hw_ero3', 12, 18, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2635, 'hallway3', 'hw_ero4', 12, 13, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2636, 'hallway3', 'hw_ero4', 12, 16, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2637, 'hallway3', 'hw_ero5', 12, 19, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2638, 'hallway3', 'hw_plant', 10, 4, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2639, 'hallway3', 'hw_plant', 26, 4, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2640, 'hallway3', 'hw_plant', 4, 5, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2641, 'hallway3', 'hw_smtble', 4, 4, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2642, 'hallway3', 'hw_sofa1', 21, 4, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2643, 'hallway3', 'hw_sofa2', 22, 4, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2644, 'hallway3', 'hw_sofa2', 23, 4, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2645, 'hallway3', 'hw_sofa2', 24, 4, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2646, 'hallway3', 'hw_sofa3', 25, 4, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2647, 'hallway3', 'hw_table1', 14, 4, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2648, 'hallway3', 'hw_table1', 8, 10, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2649, 'hallway3', 'hw_table3', 14, 5, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2650, 'hallway3', 'hw_table3', 8, 11, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2651, 'hallway3', 'hw_watermatic', 19, 13, 1, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2652, 'hallway3', 'pillar1', 19, 12, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2653, 'hallway4', 'hw_chair', 20, 10, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2654, 'hallway4', 'hw_chair', 20, 13, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2655, 'hallway4', 'hw_chair', 20, 14, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2656, 'hallway4', 'hw_chair', 20, 9, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2657, 'hallway4', 'hw_chair', 22, 10, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2658, 'hallway4', 'hw_chair', 22, 13, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2659, 'hallway4', 'hw_chair', 22, 14, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2660, 'hallway4', 'hw_chair', 22, 9, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2661, 'hallway4', 'hw_ero1', 17, 7, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2662, 'hallway4', 'hw_ero2', 18, 7, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2663, 'hallway4', 'hw_ero2', 21, 7, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2664, 'hallway4', 'hw_ero3', 19, 7, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2665, 'hallway4', 'hw_ero4', 20, 7, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2666, 'hallway4', 'hw_ero5', 22, 7, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2667, 'hallway4', 'hw_painting1', 19, 1, 1, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2668, 'hallway4', 'hw_plant', 14, 0, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2669, 'hallway4', 'hw_plant', 27, 1, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2670, 'hallway4', 'hw_plant', 27, 6, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2671, 'hallway4', 'hw_plant', 4, 0, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2672, 'hallway4', 'hw_plant', 4, 7, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2673, 'hallway4', 'hw_smtble', 19, 0, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2674, 'hallway4', 'hw_smtble', 7, 0, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2675, 'hallway4', 'hw_sofa1', 15, 0, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2676, 'hallway4', 'hw_sofa1', 20, 0, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2677, 'hallway4', 'hw_sofa1', 5, 0, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2678, 'hallway4', 'hw_sofa1', 8, 0, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2679, 'hallway4', 'hw_sofa2', 16, 0, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2680, 'hallway4', 'hw_sofa2', 17, 0, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2681, 'hallway4', 'hw_sofa2', 21, 0, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2682, 'hallway4', 'hw_sofa2', 22, 0, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2683, 'hallway4', 'hw_sofa3', 18, 0, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2684, 'hallway4', 'hw_sofa3', 23, 0, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2685, 'hallway4', 'hw_sofa3', 6, 0, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2686, 'hallway4', 'hw_sofa3', 9, 0, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2687, 'hallway4', 'hw_table1', 21, 13, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2688, 'hallway4', 'hw_table1', 21, 9, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2689, 'hallway4', 'hw_table3', 21, 10, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2690, 'hallway4', 'hw_table3', 21, 14, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2691, 'hallway4', 'hw_watermatic', 14, 7, 1, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2692, 'hallway4', 'pillar1', 13, 7, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2693, 'hallway5', 'hw_chair', 13, 4, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2694, 'hallway5', 'hw_chair', 23, 10, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2695, 'hallway5', 'hw_chair', 23, 6, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2696, 'hallway5', 'hw_chair', 23, 7, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2697, 'hallway5', 'hw_chair', 23, 8, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2698, 'hallway5', 'hw_chair', 23, 9, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2699, 'hallway5', 'hw_chair', 25, 10, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2700, 'hallway5', 'hw_chair', 25, 6, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2701, 'hallway5', 'hw_chair', 25, 7, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2702, 'hallway5', 'hw_chair', 25, 8, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2703, 'hallway5', 'hw_chair', 25, 9, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2704, 'hallway5', 'hw_ero1', 15, 20, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2705, 'hallway5', 'hw_ero1', 22, 12, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2706, 'hallway5', 'hw_ero2', 23, 12, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2707, 'hallway5', 'hw_ero3', 24, 12, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2708, 'hallway5', 'hw_ero4', 25, 12, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2709, 'hallway5', 'hw_ero5', 16, 20, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2710, 'hallway5', 'hw_ero5', 26, 12, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2711, 'hallway5', 'hw_plant', 12, 4, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2712, 'hallway5', 'hw_plant', 17, 25, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2713, 'hallway5', 'hw_plant', 19, 4, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2714, 'hallway5', 'hw_plant', 25, 17, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2715, 'hallway5', 'hw_plant', 4, 12, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2716, 'hallway5', 'hw_plant', 4, 19, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2717, 'hallway5', 'hw_smtble', 12, 7, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2718, 'hallway5', 'hw_smtble', 14, 22, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2719, 'hallway5', 'hw_smtble', 21, 15, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2720, 'hallway5', 'hw_smtble', 7, 12, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2721, 'hallway5', 'hw_sofa1', 12, 5, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2722, 'hallway5', 'hw_sofa1', 12, 8, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2723, 'hallway5', 'hw_sofa1', 14, 23, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2724, 'hallway5', 'hw_sofa1', 15, 22, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2725, 'hallway5', 'hw_sofa1', 21, 16, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2726, 'hallway5', 'hw_sofa1', 23, 14, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2727, 'hallway5', 'hw_sofa1', 5, 12, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2728, 'hallway5', 'hw_sofa1', 8, 12, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2729, 'hallway5', 'hw_sofa2', 14, 24, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2730, 'hallway5', 'hw_sofa2', 16, 22, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2731, 'hallway5', 'hw_sofa2', 24, 14, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2732, 'hallway5', 'hw_sofa3', 12, 6, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2733, 'hallway5', 'hw_sofa3', 12, 9, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2734, 'hallway5', 'hw_sofa3', 14, 25, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2735, 'hallway5', 'hw_sofa3', 17, 22, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2736, 'hallway5', 'hw_sofa3', 21, 17, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2737, 'hallway5', 'hw_sofa3', 25, 14, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2738, 'hallway5', 'hw_sofa3', 6, 12, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2739, 'hallway5', 'hw_sofa3', 9, 12, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2740, 'hallway5', 'hw_table1', 24, 6, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2741, 'hallway5', 'hw_table2', 24, 7, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2742, 'hallway5', 'hw_table2', 24, 8, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2743, 'hallway5', 'hw_table2', 24, 9, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2744, 'hallway5', 'hw_table3', 24, 10, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2745, 'hallway5', 'hw_watermatic', 18, 4, 1, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2746, 'hallway5', 'pillar1', 12, 20, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2747, 'hallway8', 'hw_chair', 17, 13, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2748, 'hallway8', 'hw_chair', 17, 14, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2749, 'hallway8', 'hw_chair', 17, 15, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2750, 'hallway8', 'hw_chair', 17, 16, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2751, 'hallway8', 'hw_chair', 19, 13, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2752, 'hallway8', 'hw_chair', 19, 14, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2753, 'hallway8', 'hw_chair', 19, 15, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2754, 'hallway8', 'hw_chair', 19, 16, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2755, 'hallway8', 'hw_chair', 6, 16, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2756, 'hallway8', 'hw_chair', 6, 18, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2757, 'hallway8', 'hw_chair', 7, 16, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2758, 'hallway8', 'hw_chair', 7, 18, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2759, 'hallway8', 'hw_chair', 8, 16, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2760, 'hallway8', 'hw_chair', 8, 18, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2761, 'hallway8', 'hw_chair', 9, 16, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2762, 'hallway8', 'hw_chair', 9, 18, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2763, 'hallway8', 'hw_ero1', 12, 11, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2764, 'hallway8', 'hw_ero1', 20, 0, 0, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2765, 'hallway8', 'hw_ero2', 13, 11, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2766, 'hallway8', 'hw_ero2', 16, 11, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2767, 'hallway8', 'hw_ero2', 20, 1, 0, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2768, 'hallway8', 'hw_ero2', 20, 2, 0, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2769, 'hallway8', 'hw_ero3', 14, 11, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2770, 'hallway8', 'hw_ero3', 17, 11, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2771, 'hallway8', 'hw_ero4', 15, 11, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2772, 'hallway8', 'hw_ero4', 18, 11, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2773, 'hallway8', 'hw_ero5', 19, 11, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2774, 'hallway8', 'hw_ero5', 20, 3, 0, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2775, 'hallway8', 'hw_painting2', 7, 5, 1, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2776, 'hallway8', 'hw_plant', 4, 13, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2777, 'hallway8', 'hw_plant', 4, 18, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2778, 'hallway8', 'hw_shelf', 4, 11, 1, 2, 0.001, 2, 1, 'solid', '', NULL, NULL), + (2779, 'hallway8', 'hw_shelf', 4, 4, 1, 2, 0.001, 2, 1, 'solid', '', NULL, NULL), + (2780, 'hallway8', 'hw_sofa1', 21, 0, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2781, 'hallway8', 'hw_sofa1', 4, 7, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2782, 'hallway8', 'hw_sofa1', 6, 4, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2783, 'hallway8', 'hw_sofa2', 22, 0, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2784, 'hallway8', 'hw_sofa2', 4, 8, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2785, 'hallway8', 'hw_sofa2', 7, 4, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2786, 'hallway8', 'hw_sofa3', 23, 0, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2787, 'hallway8', 'hw_sofa3', 4, 9, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2788, 'hallway8', 'hw_sofa3', 8, 4, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2789, 'hallway8', 'hw_table1', 18, 13, 0, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2790, 'hallway8', 'hw_table1', 6, 17, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2791, 'hallway8', 'hw_table2', 18, 14, 0, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2792, 'hallway8', 'hw_table2', 18, 15, 0, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2793, 'hallway8', 'hw_table2', 7, 17, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2794, 'hallway8', 'hw_table2', 8, 17, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2795, 'hallway8', 'hw_table3', 18, 16, 0, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2796, 'hallway8', 'hw_table3', 9, 17, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2797, 'hallway8', 'hw_watermatic', 13, 4, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2798, 'hallway8', 'pillar0', 17, 19, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2799, 'hallway8', 'pillar0', 22, 19, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2800, 'hallway8', 'pillar1', 11, 12, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2801, 'hallway7', 'hw_chair', 12, 24, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2802, 'hallway7', 'hw_chair', 12, 26, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2803, 'hallway7', 'hw_chair', 13, 24, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2804, 'hallway7', 'hw_chair', 13, 26, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2805, 'hallway7', 'hw_chair', 14, 24, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2806, 'hallway7', 'hw_chair', 14, 26, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2807, 'hallway7', 'hw_ero1', 10, 17, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2808, 'hallway7', 'hw_ero1', 10, 4, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2809, 'hallway7', 'hw_ero1', 4, 17, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2810, 'hallway7', 'hw_ero1', 4, 4, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2811, 'hallway7', 'hw_ero5', 11, 17, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2812, 'hallway7', 'hw_ero5', 11, 4, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2813, 'hallway7', 'hw_ero5', 5, 17, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2814, 'hallway7', 'hw_ero5', 5, 4, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2815, 'hallway7', 'hw_painting2', 5, 11, 1, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2816, 'hallway7', 'hw_plant', 10, 25, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2817, 'hallway7', 'hw_smtble', 9, 10, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2818, 'hallway7', 'hw_sofa1', 10, 10, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2819, 'hallway7', 'hw_sofa1', 4, 7, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2820, 'hallway7', 'hw_sofa1', 9, 11, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2821, 'hallway7', 'hw_sofa2', 4, 10, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2822, 'hallway7', 'hw_sofa2', 4, 11, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2823, 'hallway7', 'hw_sofa2', 4, 12, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2824, 'hallway7', 'hw_sofa2', 4, 13, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2825, 'hallway7', 'hw_sofa2', 4, 14, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2826, 'hallway7', 'hw_sofa2', 4, 8, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2827, 'hallway7', 'hw_sofa2', 4, 9, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2828, 'hallway7', 'hw_sofa2', 9, 12, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2829, 'hallway7', 'hw_sofa2', 9, 13, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2830, 'hallway7', 'hw_sofa3', 11, 10, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2831, 'hallway7', 'hw_sofa3', 4, 15, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2832, 'hallway7', 'hw_sofa3', 9, 14, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2833, 'hallway7', 'hw_table1', 12, 25, 0, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2834, 'hallway7', 'hw_table2', 13, 25, 0, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2835, 'hallway7', 'hw_table3', 14, 25, 0, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2836, 'hallway7', 'hw_watermatic', 4, 6, 1, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2837, 'hallway7', 'pillar0', 4, 21, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2838, 'hallway7', 'pillar0', 4, 26, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2839, 'hallway7', 'pillar1', 15, 20, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2840, 'hallway6', 'hw_chair', 11, 22, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2841, 'hallway6', 'hw_chair', 13, 22, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2842, 'hallway6', 'hw_chair', 16, 22, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2843, 'hallway6', 'hw_chair', 18, 22, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2844, 'hallway6', 'hw_chair', 4, 14, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2845, 'hallway6', 'hw_chair', 4, 5, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2846, 'hallway6', 'hw_chair', 4, 6, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2847, 'hallway6', 'hw_chair', 9, 18, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2848, 'hallway6', 'hw_chair', 9, 20, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2849, 'hallway6', 'hw_ero1', 12, 20, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2850, 'hallway6', 'hw_ero1', 4, 0, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2851, 'hallway6', 'hw_ero1', 7, 4, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2852, 'hallway6', 'hw_ero2', 13, 20, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2853, 'hallway6', 'hw_ero2', 16, 20, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2854, 'hallway6', 'hw_ero2', 7, 5, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2855, 'hallway6', 'hw_ero3', 14, 20, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2856, 'hallway6', 'hw_ero3', 17, 20, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2857, 'hallway6', 'hw_ero3', 7, 6, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2858, 'hallway6', 'hw_ero4', 15, 20, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2859, 'hallway6', 'hw_ero4', 18, 20, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2860, 'hallway6', 'hw_ero5', 19, 20, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2861, 'hallway6', 'hw_ero5', 4, 1, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2862, 'hallway6', 'hw_ero5', 7, 7, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2863, 'hallway6', 'hw_painting2', 16, 1, 1, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2864, 'hallway6', 'hw_painting2', 7, 1, 1, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2865, 'hallway6', 'hw_plant', 19, 0, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2866, 'hallway6', 'hw_shelf', 11, 0, 1, 4, 0.001, 2, 1, 'solid', '', NULL, NULL), + (2867, 'hallway6', 'hw_smtble', 12, 22, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2868, 'hallway6', 'hw_smtble', 17, 22, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2869, 'hallway6', 'hw_smtble', 9, 19, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2870, 'hallway6', 'hw_sofa1', 14, 0, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2871, 'hallway6', 'hw_sofa1', 5, 0, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2872, 'hallway6', 'hw_sofa2', 15, 0, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2873, 'hallway6', 'hw_sofa2', 16, 0, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2874, 'hallway6', 'hw_sofa2', 17, 0, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2875, 'hallway6', 'hw_sofa2', 6, 0, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2876, 'hallway6', 'hw_sofa2', 7, 0, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2877, 'hallway6', 'hw_sofa2', 8, 0, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2878, 'hallway6', 'hw_sofa3', 18, 0, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2879, 'hallway6', 'hw_sofa3', 9, 0, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2880, 'hallway6', 'hw_table1', 10, 0, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2881, 'hallway6', 'hw_table1', 13, 0, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2882, 'hallway6', 'hw_table3', 10, 1, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2883, 'hallway6', 'hw_table3', 13, 1, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2884, 'hallway6', 'hw_watermatic', 4, 9, 1, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2885, 'hallway6', 'pillar0', 19, 14, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2886, 'hallway6', 'pillar0', 19, 9, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2887, 'hallway6', 'pillar0', 9, 22, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2888, 'hallway6', 'pillar1', 11, 16, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2889, 'hallway10', 'hw_chair', 0, 10, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2890, 'hallway10', 'hw_chair', 0, 12, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2891, 'hallway10', 'hw_chair', 0, 16, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2892, 'hallway10', 'hw_chair', 0, 18, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2893, 'hallway10', 'hw_chair', 1, 10, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2894, 'hallway10', 'hw_chair', 1, 12, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2895, 'hallway10', 'hw_chair', 1, 16, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2896, 'hallway10', 'hw_chair', 1, 18, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2897, 'hallway10', 'hw_chair', 2, 10, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2898, 'hallway10', 'hw_chair', 2, 12, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2899, 'hallway10', 'hw_chair', 2, 16, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2900, 'hallway10', 'hw_chair', 2, 18, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2901, 'hallway10', 'hw_ero1', 13, 4, 0, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2902, 'hallway10', 'hw_ero1', 16, 12, 0, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2903, 'hallway10', 'hw_ero1', 7, 22, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2904, 'hallway10', 'hw_ero1', 7, 8, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2905, 'hallway10', 'hw_ero2', 13, 5, 0, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2906, 'hallway10', 'hw_ero2', 16, 13, 0, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2907, 'hallway10', 'hw_ero2', 7, 12, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2908, 'hallway10', 'hw_ero2', 7, 15, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2909, 'hallway10', 'hw_ero2', 7, 9, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2910, 'hallway10', 'hw_ero3', 13, 6, 0, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2911, 'hallway10', 'hw_ero3', 16, 14, 0, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2912, 'hallway10', 'hw_ero3', 7, 10, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2913, 'hallway10', 'hw_ero3', 7, 13, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2914, 'hallway10', 'hw_ero3', 7, 16, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2915, 'hallway10', 'hw_ero4', 7, 11, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2916, 'hallway10', 'hw_ero4', 7, 14, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2917, 'hallway10', 'hw_ero5', 13, 7, 0, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2918, 'hallway10', 'hw_ero5', 16, 15, 0, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2919, 'hallway10', 'hw_ero5', 7, 17, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2920, 'hallway10', 'hw_ero5', 7, 23, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2921, 'hallway10', 'hw_painting2', 1, 14, 1, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2922, 'hallway10', 'hw_smtble', 10, 10, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2923, 'hallway10', 'hw_smtble', 19, 8, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2924, 'hallway10', 'hw_sofa1', 10, 2, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2925, 'hallway10', 'hw_sofa1', 15, 8, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2926, 'hallway10', 'hw_sofa2', 10, 3, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2927, 'hallway10', 'hw_sofa2', 10, 4, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2928, 'hallway10', 'hw_sofa2', 10, 5, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2929, 'hallway10', 'hw_sofa2', 10, 6, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2930, 'hallway10', 'hw_sofa2', 10, 7, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2931, 'hallway10', 'hw_sofa2', 10, 8, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2932, 'hallway10', 'hw_sofa2', 16, 8, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2933, 'hallway10', 'hw_sofa2', 17, 8, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2934, 'hallway10', 'hw_sofa3', 10, 9, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2935, 'hallway10', 'hw_sofa3', 18, 8, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2936, 'hallway10', 'hw_table1', 0, 11, 1, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2937, 'hallway10', 'hw_table1', 0, 17, 1, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2938, 'hallway10', 'hw_table2', 1, 11, 1, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2939, 'hallway10', 'hw_table2', 1, 17, 1, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2940, 'hallway10', 'hw_table3', 2, 11, 1, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2941, 'hallway10', 'hw_table3', 2, 17, 1, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2942, 'hallway10', 'hw_watermatic', 0, 14, 1, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2943, 'hallway10', 'pillar1', 10, 0, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2944, 'hallway10', 'pillar1', 14, 16, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2945, 'hallway10', 'pillar1', 14, 23, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2946, 'hallway11', 'hw_chair', 10, 18, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2947, 'hallway11', 'hw_chair', 12, 11, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2948, 'hallway11', 'hw_chair', 13, 10, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2949, 'hallway11', 'hw_chair', 13, 12, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2950, 'hallway11', 'hw_chair', 13, 15, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2951, 'hallway11', 'hw_chair', 15, 15, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2952, 'hallway11', 'hw_chair', 20, 10, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2953, 'hallway11', 'hw_chair', 20, 14, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2954, 'hallway11', 'hw_chair', 21, 11, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2955, 'hallway11', 'hw_chair', 21, 13, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2956, 'hallway11', 'hw_chair', 21, 15, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2957, 'hallway11', 'hw_chair', 21, 9, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2958, 'hallway11', 'hw_chair', 22, 10, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2959, 'hallway11', 'hw_chair', 22, 14, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2960, 'hallway11', 'hw_ero1', 10, 10, 0, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2961, 'hallway11', 'hw_ero1', 12, 17, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2962, 'hallway11', 'hw_ero1', 15, 7, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2963, 'hallway11', 'hw_ero1', 20, 17, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2964, 'hallway11', 'hw_ero1', 4, 6, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2965, 'hallway11', 'hw_ero2', 10, 11, 0, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2966, 'hallway11', 'hw_ero2', 13, 17, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2967, 'hallway11', 'hw_ero2', 16, 7, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2968, 'hallway11', 'hw_ero2', 21, 17, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2969, 'hallway11', 'hw_ero3', 10, 12, 0, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2970, 'hallway11', 'hw_ero3', 14, 17, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2971, 'hallway11', 'hw_ero3', 17, 7, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2972, 'hallway11', 'hw_ero3', 22, 17, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2973, 'hallway11', 'hw_ero4', 18, 7, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2974, 'hallway11', 'hw_ero5', 10, 13, 0, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2975, 'hallway11', 'hw_ero5', 15, 17, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2976, 'hallway11', 'hw_ero5', 19, 7, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2977, 'hallway11', 'hw_ero5', 23, 17, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2978, 'hallway11', 'hw_ero5', 4, 7, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2979, 'hallway11', 'hw_shelf', 4, 0, 1, 2, 0.001, 2, 1, 'solid', '', NULL, NULL), + (2980, 'hallway11', 'hw_smtble', 13, 11, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2981, 'hallway11', 'hw_smtble', 14, 15, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2982, 'hallway11', 'hw_smtble', 21, 10, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2983, 'hallway11', 'hw_smtble', 21, 14, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2984, 'hallway11', 'hw_sofa1', 6, 0, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2985, 'hallway11', 'hw_sofa2', 7, 0, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2986, 'hallway11', 'hw_sofa3', 8, 0, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2987, 'hallway11', 'hw_watermatic', 11, 18, 0, 4, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2988, 'hallway11', 'pillar0', 10, 0, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2989, 'hallway11', 'pillar0', 10, 7, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2990, 'star_lounge', 'star_table', 21, 15, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2991, 'star_lounge', 'star_sofa', 22, 15, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2992, 'star_lounge', 'star_sofa2', 23, 15, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2993, 'star_lounge', 'palm', 24, 15, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2994, 'star_lounge', 'star_sofa2', 21, 16, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2995, 'star_lounge', 'dj1', 32, 16, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2996, 'star_lounge', 'dj2', 33, 16, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2997, 'star_lounge', 'dj3', 34, 16, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (2998, 'star_lounge', 'star_sofa', 21, 17, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (2999, 'star_lounge', 'star_microphone', 28, 17, 4, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3000, 'star_lounge', 'star_sofa2', 21, 18, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3001, 'star_lounge', 'star_sofa', 35, 18, 2, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3002, 'star_lounge', 'star_sofa', 21, 19, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3003, 'star_lounge', 'star_sofa2', 35, 19, 2, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3004, 'star_lounge', 'star_sofa2', 21, 20, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3005, 'star_lounge', 'star_sofa2', 24, 20, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3006, 'star_lounge', 'star_sofa', 32, 20, 2, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3007, 'star_lounge', 'star_sofa', 35, 20, 2, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3008, 'star_lounge', 'star_sofa', 21, 21, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3009, 'star_lounge', 'star_sofa', 24, 21, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3010, 'star_lounge', 'star_sofa2', 32, 21, 2, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3011, 'star_lounge', 'star_sofa2', 35, 21, 2, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3012, 'star_lounge', 'star_sofachair', 21, 22, 2, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3013, 'star_lounge', 'star_table', 24, 22, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3014, 'star_lounge', 'star_sofa2', 25, 22, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3015, 'star_lounge', 'star_sofa', 26, 22, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3016, 'star_lounge', 'star_sofa2', 30, 22, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3017, 'star_lounge', 'star_sofa', 31, 22, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3018, 'star_lounge', 'star_table', 32, 22, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3019, 'star_lounge', 'star_table', 35, 22, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3020, 'star_lounge', 'palm', 21, 23, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3021, 'star_lounge', 'star_sofa', 35, 23, 2, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3022, 'star_lounge', 'bar10', 22, 24, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3023, 'star_lounge', 'star_sofa2', 35, 24, 2, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3024, 'star_lounge', 'star_sofa', 37, 24, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3025, 'star_lounge', 'star_sofa2', 38, 24, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3026, 'star_lounge', 'star_sofa', 39, 24, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3027, 'star_lounge', 'star_sofa2', 40, 24, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3028, 'star_lounge', 'bar9', 22, 25, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3029, 'star_lounge', 'star_sofa2', 25, 25, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3030, 'star_lounge', 'star_sofa', 26, 25, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3031, 'star_lounge', 'star_sofa2', 30, 25, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3032, 'star_lounge', 'star_sofa', 31, 25, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3033, 'star_lounge', 'star_sofa', 35, 25, 2, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3034, 'star_lounge', 'star_sofa2', 36, 25, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3035, 'star_lounge', 'bar8', 22, 26, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3036, 'star_lounge', 'palm1', 25, 26, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3037, 'star_lounge', 'palm3', 26, 26, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3038, 'star_lounge', 'palm2', 30, 26, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3039, 'star_lounge', 'palm4', 31, 26, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3040, 'star_lounge', 'star_sofa2', 35, 26, 2, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3041, 'star_lounge', 'star_sofa', 36, 26, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3042, 'star_lounge', 'star_table', 39, 26, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3043, 'star_lounge', 'star_table', 40, 26, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3044, 'star_lounge', 'bar7', 22, 27, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3045, 'star_lounge', 'star_sofa', 25, 27, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3046, 'star_lounge', 'star_sofa2', 26, 27, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3047, 'star_lounge', 'star_sofa', 30, 27, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3048, 'star_lounge', 'star_sofa2', 31, 27, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3049, 'star_lounge', 'star_table', 35, 27, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3050, 'star_lounge', 'palm', 36, 27, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3051, 'star_lounge', 'star_table', 37, 27, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3052, 'star_lounge', 'bar6', 22, 28, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3053, 'star_lounge', 'bar5', 22, 29, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3054, 'star_lounge', 'star_table', 25, 29, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3055, 'star_lounge', 'star_table', 26, 29, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3056, 'star_lounge', 'star_table', 16, 30, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3057, 'star_lounge', 'bar4', 22, 30, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3058, 'star_lounge', 'star_sofa2', 16, 31, 3, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3059, 'star_lounge', 'bar3', 22, 31, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3060, 'star_lounge', 'star_sofa2', 25, 31, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3061, 'star_lounge', 'star_sofa', 26, 31, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3062, 'star_lounge', 'star_sofa', 30, 31, 2, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3063, 'star_lounge', 'star_sofa', 16, 32, 3, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3064, 'star_lounge', 'bar2', 22, 32, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3065, 'star_lounge', 'palm4', 25, 32, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3066, 'star_lounge', 'palm1', 26, 32, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3067, 'star_lounge', 'star_sofa2', 30, 32, 2, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3068, 'star_lounge', 'star_sofa2', 16, 33, 3, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3069, 'star_lounge', 'bar1', 22, 33, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3070, 'star_lounge', 'star_sofa', 25, 33, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3071, 'star_lounge', 'star_sofa2', 26, 33, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3072, 'star_lounge', 'star_sofa', 30, 33, 2, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3073, 'star_lounge', 'star_sofa', 16, 34, 3, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3074, 'star_lounge', 'star_sofa2', 30, 34, 2, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3075, 'star_lounge', 'palm3', 35, 34, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3076, 'star_lounge', 'palm2', 36, 34, 0, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3077, 'star_lounge', 'star_table', 16, 35, 3, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3078, 'star_lounge', 'star_sofa', 30, 35, 2, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3079, 'star_lounge', 'star_sofa2', 30, 36, 2, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3080, 'star_lounge', 'star_sofachair', 25, 37, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3081, 'star_lounge', 'star_sofa2', 26, 37, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3082, 'star_lounge', 'star_sofa', 27, 37, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3083, 'star_lounge', 'star_sofa2', 28, 37, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3084, 'star_lounge', 'star_sofa', 29, 37, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3085, 'star_lounge', 'star_table', 30, 37, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3086, 'orient', 'bench', 17, 10, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3087, 'orient', 'bench', 17, 11, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3088, 'orient', 'bench', 17, 12, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3089, 'orient', 'bench', 17, 13, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3090, 'orient', 'bench', 17, 14, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3091, 'orient', 'bench', 17, 15, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3092, 'orient', 'bench', 17, 25, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3093, 'orient', 'bench', 17, 26, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3094, 'orient', 'bench', 17, 27, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3095, 'orient', 'bench', 17, 28, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3096, 'orient', 'bench', 17, 29, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3097, 'orient', 'bench', 19, 10, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3098, 'orient', 'bench', 19, 11, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3099, 'orient', 'bench', 19, 12, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3100, 'orient', 'bench', 19, 14, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3101, 'orient', 'bench', 19, 15, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3102, 'orient', 'bench', 19, 25, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3103, 'orient', 'bench', 19, 26, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3104, 'orient', 'bench', 19, 27, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3105, 'orient', 'bench', 19, 28, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3106, 'orient', 'bench', 19, 29, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3107, 'orient', 'bench', 21, 10, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3108, 'orient', 'bench', 21, 11, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3109, 'orient', 'bench', 21, 12, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3110, 'orient', 'bench', 21, 13, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3111, 'orient', 'bench', 21, 14, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3112, 'orient', 'bench', 21, 15, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3113, 'orient', 'bench', 21, 25, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3114, 'orient', 'bench', 21, 26, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3115, 'orient', 'bench', 21, 27, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3116, 'orient', 'bench', 21, 28, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3117, 'orient', 'bench', 21, 29, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3118, 'orient', 'bench', 23, 10, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3119, 'orient', 'bench', 23, 11, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3120, 'orient', 'bench', 23, 12, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3121, 'orient', 'bench', 23, 13, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3122, 'orient', 'bench', 23, 14, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3123, 'orient', 'bench', 23, 15, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3124, 'orient', 'bench', 23, 25, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3125, 'orient', 'bench', 23, 26, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3126, 'orient', 'bench', 23, 27, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3127, 'orient', 'bench', 23, 28, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3128, 'orient', 'bench', 23, 29, 9, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3129, 'orient', 'chairf1', 25, 24, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3130, 'orient', 'chairf1', 25, 25, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3131, 'orient', 'chairf1', 25, 26, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3132, 'orient', 'chairf1', 33, 24, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3133, 'orient', 'chairf1', 33, 25, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3134, 'orient', 'chairf1', 33, 26, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3135, 'orient', 'koc_chair', 25, 13, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3136, 'orient', 'koc_chair', 25, 15, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3137, 'orient', 'koc_chair', 26, 14, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3138, 'orient', 'koc_chair', 29, 15, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3139, 'orient', 'koc_chair', 30, 16, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3140, 'orient', 'koc_chair', 31, 12, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3141, 'orient', 'koc_chair', 31, 15, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3142, 'orient', 'koc_chair', 32, 11, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3143, 'orient', 'koc_chair', 32, 13, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3144, 'orient', 'koc_chair', 33, 12, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3145, 'orient', 'koc_table', 25, 14, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3146, 'orient', 'koc_table', 30, 15, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3147, 'orient', 'koc_table', 32, 12, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3148, 'entryhall', 'splashkiosk', 11, 11, 1, 0, 0.001, 3, 3, 'invisible,solid', '', NULL, NULL), + (3149, 'entryhall', 'gl_sofatable', 7, 16, 1, 0, 1, 1, 1, 'solid', '', NULL, NULL), + (3150, 'entryhall', 'gl_sofatable', 5, 1, 1, 4, 1, 1, 1, 'solid', '', NULL, NULL), + (3151, 'entryhall', 'gl_sofatable', 16, 1, 1, 4, 1, 1, 1, 'solid', '', NULL, NULL), + (3152, 'entryhall', 'gl_sofatable', 14, 14, 1, 4, 1, 1, 1, 'solid', '', NULL, NULL), + (3153, 'entryhall', 'gl_sofatable', 1, 19, 1, 0, 1, 1, 1, 'solid', '', NULL, NULL), + (3154, 'entryhall', 'gl_yukka', 15, 6, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3155, 'entryhall', 'gl_yukka', 7, 7, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3156, 'entryhall', 'gl_chair', 6, 1, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3157, 'entryhall', 'gl_chair', 4, 1, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3158, 'entryhall', 'gl_chair', 17, 1, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3159, 'entryhall', 'gl_chair', 18, 1, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3160, 'entryhall', 'gl_chair', 14, 11, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3161, 'entryhall', 'gl_chair', 14, 12, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3162, 'entryhall', 'gl_chair', 14, 13, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3163, 'entryhall', 'gl_chair', 13, 14, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3164, 'entryhall', 'gl_chair', 12, 14, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3165, 'entryhall', 'gl_chair', 11, 14, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3166, 'entryhall', 'gl_sofaa', 1, 16, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3167, 'entryhall', 'gl_sofab', 1, 17, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3168, 'entryhall', 'gl_sofac', 1, 18, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3169, 'entryhall', 'gl_sofaa', 1, 10, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3170, 'entryhall', 'gl_sofab', 1, 11, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3171, 'entryhall', 'gl_sofac', 1, 12, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3172, 'entryhall', 'gl_sofaa', 7, 13, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3173, 'entryhall', 'gl_sofab', 7, 14, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3174, 'entryhall', 'gl_sofac', 7, 15, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3175, 'entryhall', 'gl_sofaa', 7, 8, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3176, 'entryhall', 'gl_sofab', 7, 9, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3177, 'entryhall', 'gl_sofac', 7, 10, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3178, 'entryhall', 'gl_sofaa', 8, 7, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3179, 'entryhall', 'gl_sofab', 9, 7, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3180, 'entryhall', 'gl_sofac', 10, 7, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3181, 'entryhall', 'gl_sofaa', 13, 7, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3182, 'entryhall', 'gl_sofab', 14, 7, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3183, 'entryhall', 'gl_sofac', 15, 7, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3184, 'entryhall', 'gl_table', 7, 12, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3185, 'entryhall', 'gl_tablea', 7, 11, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3186, 'entryhall', 'gl_tablea', 11, 7, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3187, 'entryhall', 'gl_table', 12, 7, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3188, 'hallA', 'gamehall_chair_wood', 15, 4, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3189, 'hallA', 'gamehall_chair_wood', 15, 5, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3190, 'hallA', 'gamehall_chair_wood', 15, 9, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3191, 'hallA', 'gamehall_chair_wood', 15, 10, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3192, 'hallA', 'gamehall_chair_wood', 15, 14, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3193, 'hallA', 'gamehall_chair_wood', 15, 15, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3194, 'hallA', 'gamehall_chair_wood', 10, 4, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3195, 'hallA', 'gamehall_chair_wood', 10, 5, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3196, 'hallA', 'gamehall_chair_wood', 10, 9, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3197, 'hallA', 'gamehall_chair_wood', 10, 10, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3198, 'hallA', 'gamehall_chair_wood', 10, 14, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3199, 'hallA', 'gamehall_chair_wood', 10, 15, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3200, 'hallA', 'gamehall_chair_wood', 5, 4, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3201, 'hallA', 'gamehall_chair_wood', 5, 5, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3202, 'hallA', 'gamehall_chair_wood', 5, 9, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3203, 'hallA', 'gamehall_chair_wood', 5, 10, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3204, 'hallA', 'gamehall_chair_wood', 5, 14, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3205, 'hallA', 'gamehall_chair_wood', 5, 15, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3206, 'hallA', 'table_xoxa', 14, 5, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3207, 'hallA', 'table_xoxa', 14, 10, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3208, 'hallA', 'table_xoxa', 14, 15, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3209, 'hallA', 'table_xoxa', 9, 5, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3210, 'hallA', 'table_xoxa', 9, 10, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3211, 'hallA', 'table_xoxa', 9, 15, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3212, 'hallA', 'table_xoxa', 4, 5, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3213, 'hallA', 'table_xoxa', 4, 10, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3214, 'hallA', 'table_xoxa', 4, 15, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3215, 'hallA', 'table_xoxb', 14, 14, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3216, 'hallA', 'table_xoxb', 14, 9, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3217, 'hallA', 'table_xoxb', 14, 4, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3218, 'hallA', 'table_xoxb', 9, 14, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3219, 'hallA', 'table_xoxb', 9, 9, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3220, 'hallA', 'table_xoxb', 9, 4, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3221, 'hallA', 'table_xoxb', 4, 14, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3222, 'hallA', 'table_xoxb', 4, 9, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3223, 'hallA', 'table_xoxb', 4, 4, 1, 6, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3224, 'hallB', 'gamehall_chair_green', 2, 4, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3225, 'hallB', 'gamehall_chair_green', 2, 10, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3226, 'hallB', 'gamehall_chair_green', 2, 16, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3227, 'hallB', 'gamehall_chair_green', 2, 6, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3228, 'hallB', 'gamehall_chair_green', 2, 12, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3229, 'hallB', 'gamehall_chair_green', 2, 18, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3230, 'hallB', 'gamehall_chair_green', 6, 3, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3231, 'hallB', 'gamehall_chair_green', 8, 3, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3232, 'hallB', 'gamehall_chair_green', 13, 3, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3233, 'hallB', 'gamehall_chair_green', 15, 3, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3234, 'hallB', 'table_battleships', 2, 5, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3235, 'hallB', 'table_battleships', 2, 11, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3236, 'hallB', 'table_battleships', 2, 17, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3237, 'hallB', 'table_battleships', 7, 3, 1, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3238, 'hallB', 'table_battleships', 14, 3, 1, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3239, 'hallC', 'table_chess_king', 12, 13, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3240, 'hallC', 'table_chess', 13, 6, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3241, 'hallC', 'table_chess', 2, 8, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3242, 'hallC', 'table_chess', 5, 14, 1, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3243, 'hallC', 'table_chess', 8, 3, 1, 2, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3244, 'hallC', 'chess_king_chair', 12, 14, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3245, 'hallC', 'chess_king_chair', 12, 12, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3246, 'hallC', 'gamehall_chair_green', 13, 7, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3247, 'hallC', 'gamehall_chair_green', 13, 5, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3248, 'hallC', 'gamehall_chair_green', 2, 9, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3249, 'hallC', 'gamehall_chair_green', 2, 7, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3250, 'hallC', 'gamehall_chair_green', 4, 14, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3251, 'hallC', 'gamehall_chair_green', 6, 14, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3252, 'hallC', 'gamehall_chair_green', 7, 3, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3253, 'hallC', 'gamehall_chair_green', 9, 3, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3254, 'hallD', 'cardtableb', 2, 15, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3255, 'hallD', 'cardtableb', 8, 3, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3256, 'hallD', 'cardtableb', 14, 3, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3257, 'hallD', 'cardtablea', 2, 9, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3258, 'hallD', 'cardtablea', 8, 9, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3259, 'hallD', 'cardtablea', 14, 9, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3260, 'hallD', 'cardtablea', 8, 15, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3261, 'hallD', 'cardtablea', 14, 15, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3262, 'hallD', 'gamehall_chair_green', 8, 4, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3263, 'hallD', 'gamehall_chair_green', 14, 4, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3264, 'hallD', 'gamehall_chair_green', 2, 10, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3265, 'hallD', 'gamehall_chair_green', 8, 10, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3266, 'hallD', 'gamehall_chair_green', 14, 10, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3267, 'hallD', 'gamehall_chair_green', 2, 16, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3268, 'hallD', 'gamehall_chair_green', 8, 16, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3269, 'hallD', 'gamehall_chair_green', 14, 16, 1, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3270, 'hallD', 'gamehall_chair_green', 7, 3, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3271, 'hallD', 'gamehall_chair_green', 13, 3, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3272, 'hallD', 'gamehall_chair_green', 1, 9, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3273, 'hallD', 'gamehall_chair_green', 7, 9, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3274, 'hallD', 'gamehall_chair_green', 13, 9, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3275, 'hallD', 'gamehall_chair_green', 1, 15, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3276, 'hallD', 'gamehall_chair_green', 7, 15, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3277, 'hallD', 'gamehall_chair_green', 13, 15, 1, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3278, 'hallD', 'gamehall_chair_green', 8, 2, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3279, 'hallD', 'gamehall_chair_green', 14, 2, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3280, 'hallD', 'gamehall_chair_green', 2, 8, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3281, 'hallD', 'gamehall_chair_green', 8, 8, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3282, 'hallD', 'gamehall_chair_green', 14, 8, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3283, 'hallD', 'gamehall_chair_green', 2, 14, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3284, 'hallD', 'gamehall_chair_green', 8, 14, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3285, 'hallD', 'gamehall_chair_green', 14, 14, 1, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3286, 'hallD', 'gamehall_chair_green', 9, 3, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3287, 'hallD', 'gamehall_chair_green', 15, 3, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3288, 'hallD', 'gamehall_chair_green', 3, 9, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3289, 'hallD', 'gamehall_chair_green', 9, 9, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3290, 'hallD', 'gamehall_chair_green', 15, 9, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3291, 'hallD', 'gamehall_chair_green', 3, 15, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3292, 'hallD', 'gamehall_chair_green', 9, 15, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3293, 'hallD', 'gamehall_chair_green', 15, 15, 1, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3294, 'md_a', 'poolEnter', 11, 11, 7, 2, 0.001, 1, 1, 'can_stand_on_top,invisible', 'Splash0', '12 11 4 2', '13 11 4 2'), + (3295, 'md_a', 'poolExit', 12, 11, 4, 6, 0.001, 1, 1, 'can_stand_on_top,invisible', 'Splash0', '11 11 4 6', '10 11 4 6'), + (3297, 'hallD', 'streetlight', 0, 9, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3298, 'hallD', 'streetlight', 0, 15, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3299, 'hallD', 'streetlight', 8, 1, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3300, 'hallD', 'streetlight', 14, 1, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3301, 'pub_a', 'bar_gate', 9, 9, 2, 0, 0.001, 1, 1, 'solid,invisible', '', NULL, NULL), + (3302, 'bar_b', 'djtable', 16, 22, 4, 0, 0.001, 1, 2, 'solid,invisible', '', NULL, NULL), + (3303, 'library', 'invisible_table', 28, 28, 1, 0, 0.001, 2, 2, 'solid,invisible', '', NULL, NULL), + (3304, 'tearoom', 'invisible_table', 2, 7, 3, 0, 0.002, 2, 2, 'solid,invisible', '', NULL, NULL), + (3305, 'tearoom', 'invisible_table', 2, 13, 3, 0, 0.002, 2, 2, 'solid,invisible', '', NULL, NULL), + (3306, 'tearoom', 'invisible_table', 16, 10, 3, 0, 0.002, 2, 2, 'solid,invisible', '', NULL, NULL), + (3307, 'tearoom', 'invisible_table', 19, 3, 3, 0, 0.002, 1, 1, 'solid,invisible', '', NULL, NULL), + (3308, 'tearoom', 'invisible_table', 14, 3, 3, 0, 0.002, 1, 1, 'solid,invisible', '', NULL, NULL), + (3309, 'cr_staff', 'invisible_table', 6, 8, 1, 0, 0.001, 3, 6, 'solid,invisible', '', NULL, NULL), + (3310, 'sport', 'invisible_barrier', 11, 14, 1, 0, 0.002, 1, 4, 'solid,invisible', '', NULL, NULL), + (3311, 'cafe_ole', 'invisible_table', 4, 17, 1, 0, 0.002, 2, 3, 'solid,invisible', '', NULL, NULL), + (3312, 'cafe_ole', 'invisible_table', 12, 16, 1, 0, 0.002, 2, 3, 'solid,invisible', '', NULL, NULL), + (3313, 'cafe_ole', 'invisible_table', 15, 1, 1, 0, 0.002, 2, 3, 'solid,invisible', '', NULL, NULL), + (3314, 'cafe_ole', 'invisible_table', 9, 5, 1, 0, 0.002, 2, 2, 'solid,invisible', '', NULL, NULL), + (3315, 'malja_bar_a', 'invisible_table', 6, 3, 4, 0, 0.002, 2, 2, 'solid,invisible', '', NULL, NULL), + (3316, 'malja_bar_a', 'invisible_table', 7, 14, 1, 0, 0.002, 2, 2, 'solid,invisible', '', NULL, NULL), + (3317, 'malja_bar_a', 'invisible_table', 13, 15, 1, 0, 0.002, 2, 2, 'solid,invisible', '', NULL, NULL), + (3318, 'malja_bar_a', 'invisible_table', 1, 16, 1, 0, 0.002, 2, 2, 'solid,invisible', '', NULL, NULL), + (3319, 'malja_bar_b', 'invisible_table', 4, 1, 3, 0, 0.002, 2, 2, 'solid,invisible', '', NULL, NULL), + (3320, 'malja_bar_b', 'invisible_table', 2, 17, 3, 0, 0.002, 2, 2, 'solid,invisible', '', NULL, NULL), + (3321, 'pizza', 'invisible_table', 1, 17, 1, 0, 0.002, 2, 2, 'solid,invisible', '', NULL, NULL), + (3322, 'pizza', 'invisible_table', 1, 9, 1, 0, 0.002, 2, 2, 'solid,invisible', '', NULL, NULL), + (3323, 'pizza', 'invisible_table', 12, 21, 1, 0, 0.002, 2, 2, 'solid,invisible', '', NULL, NULL), + (3324, 'pizza', 'invisible_table', 14, 4, 0, 0, 0.002, 2, 2, 'solid,invisible', '', NULL, NULL), + (3325, 'pizza', 'invisible_table', 14, 11, 0, 0, 0.002, 2, 2, 'solid,invisible', '', NULL, NULL), + (3326, 'md_a', 'wsJoinQueue', 21, 19, 4, 0, 0.002, 1, 1, 'invisible,can_stand_on_top', '21,18,0', NULL, NULL), + (3327, 'md_a', 'wsJoinQueue', 21, 7, 4, 0, 0.002, 1, 1, 'invisible,can_stand_on_top', '21,8,4', NULL, NULL), + (3328, 'md_a', 'wsQueueTile', 21, 18, 8, 0, 0.002, 1, 1, 'invisible,can_stand_on_top', '21,18', NULL, NULL), + (3329, 'md_a', 'wsQueueTile', 21, 17, 8, 0, 0.002, 1, 1, 'invisible,can_stand_on_top', '', NULL, NULL), + (3330, 'md_a', 'wsQueueTile', 21, 16, 8, 0, 0.002, 1, 1, 'invisible,can_stand_on_top', '', NULL, NULL), + (3331, 'md_a', 'wsQueueTile', 21, 8, 8, 0, 0.002, 1, 1, 'invisible,can_stand_on_top', '', NULL, NULL), + (3332, 'md_a', 'wsQueueTile', 21, 9, 8, 0, 0.002, 1, 1, 'invisible,can_stand_on_top', '', NULL, NULL), + (3333, 'md_a', 'wsQueueTile', 21, 10, 8, 0, 0.002, 1, 1, 'invisible,can_stand_on_top', '', NULL, NULL), + (3334, 'hallway2', 'hw_chair', 17, 18, 0, 2, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3335, 'gate_park', 'gate_drumchair', 13, 15, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3336, 'emperors', 'invisichair', 12, 7, 4, 4, 1, 1, 1, 'invisible,can_sit_on_top', '', NULL, NULL), + (3337, 'emperors', 'emperors_pillar', 5, 10, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3338, 'emperors', 'emperors_pillar', 19, 10, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3339, 'emperors', 'emperors_chair1', 5, 14, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3340, 'emperors', 'emperors_chair2', 6, 14, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3341, 'emperors', 'emperors_chair2', 7, 14, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3342, 'emperors', 'emperors_chair3', 8, 14, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3343, 'emperors', 'emperors_chair1', 16, 14, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3344, 'emperors', 'emperors_chair2', 17, 14, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3345, 'emperors', 'emperors_chair2', 18, 14, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3346, 'emperors', 'emperors_chair3', 19, 14, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3347, 'emperors', 'emperors_chair1', 5, 15, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3348, 'emperors', 'emperors_chair2', 6, 15, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3349, 'emperors', 'emperors_chair2', 7, 15, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3350, 'emperors', 'emperors_chair3', 8, 15, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3351, 'emperors', 'emperors_chair1', 16, 15, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3352, 'emperors', 'emperors_chair2', 17, 15, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3353, 'emperors', 'emperors_chair2', 18, 15, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3354, 'emperors', 'emperors_chair3', 19, 15, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3355, 'emperors', 'emperors_chair1', 5, 18, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3356, 'emperors', 'emperors_chair2', 6, 18, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3357, 'emperors', 'emperors_chair2', 7, 18, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3358, 'emperors', 'emperors_chair3', 8, 18, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3359, 'emperors', 'emperors_chair1', 16, 18, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3360, 'emperors', 'emperors_chair2', 17, 18, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3361, 'emperors', 'emperors_chair2', 18, 18, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3362, 'emperors', 'emperors_chair3', 19, 18, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3363, 'emperors', 'emperors_pillar', 5, 19, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3364, 'emperors', 'emperors_pillar2', 8, 19, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3365, 'emperors', 'emperors_pillar2', 16, 19, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3366, 'emperors', 'emperors_pillar', 19, 19, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3367, 'emperors', 'emperors_chair1', 5, 20, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3368, 'emperors', 'emperors_chair2', 6, 20, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3369, 'emperors', 'emperors_chair2', 7, 20, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3370, 'emperors', 'emperors_chair3', 8, 20, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3371, 'emperors', 'emperors_chair1', 16, 20, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3372, 'emperors', 'emperors_chair2', 17, 20, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3373, 'emperors', 'emperors_chair2', 18, 20, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3374, 'emperors', 'emperors_chair3', 19, 20, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3375, 'emperors', 'emperors_chair1', 5, 23, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3376, 'emperors', 'emperors_chair2', 6, 23, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3377, 'emperors', 'emperors_chair2', 7, 23, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3378, 'emperors', 'emperors_chair3', 8, 23, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3379, 'emperors', 'emperors_chair1', 16, 23, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3380, 'emperors', 'emperors_chair2', 17, 23, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3381, 'emperors', 'emperors_chair2', 18, 23, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3382, 'emperors', 'emperors_chair3', 19, 23, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3383, 'emperors', 'emperors_chair1', 5, 24, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3384, 'emperors', 'emperors_chair2', 6, 24, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3385, 'emperors', 'emperors_chair2', 7, 24, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3386, 'emperors', 'emperors_chair3', 8, 24, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3387, 'emperors', 'emperors_chair1', 16, 24, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3388, 'emperors', 'emperors_chair2', 17, 24, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3389, 'emperors', 'emperors_chair2', 18, 24, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3390, 'emperors', 'emperors_chair3', 19, 24, 2, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3391, 'emperors', 'emperors_chair1', 5, 27, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3392, 'emperors', 'emperors_chair2', 6, 27, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3393, 'emperors', 'emperors_chair2', 7, 27, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3394, 'emperors', 'emperors_chair3', 8, 27, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3395, 'emperors', 'emperors_chair1', 16, 27, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3396, 'emperors', 'emperors_chair2', 17, 27, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3397, 'emperors', 'emperors_chair2', 18, 27, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3398, 'emperors', 'emperors_chair3', 19, 27, 2, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3399, 'emperors', 'emperors_pillar', 5, 28, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3400, 'emperors', 'emperors_pillar', 8, 28, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3401, 'emperors', 'emperors_pillar', 16, 28, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3402, 'emperors', 'emperors_pillar', 19, 28, 2, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3403, 'beauty_salon1', 'pinkchair', 12, 5, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3404, 'beauty_salon1', 'smallchair', 17, 5, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3405, 'beauty_salon1', 'smallchair', 18, 5, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3406, 'beauty_salon1', 'smallchair', 19, 5, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3407, 'beauty_salon1', 'longchair1', 4, 8, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3408, 'beauty_salon1', 'longchair2', 5, 8, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3409, 'beauty_salon1', 'longchair2', 6, 8, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3410, 'beauty_salon1', 'longchair2', 7, 8, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3411, 'beauty_salon1', 'longchair3', 8, 8, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3412, 'beauty_salon1', 'longchair1', 11, 8, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3413, 'beauty_salon1', 'longchair2', 12, 8, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3414, 'beauty_salon1', 'longchair2', 13, 8, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3415, 'beauty_salon1', 'longchair2', 14, 8, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3416, 'beauty_salon1', 'longchair3', 15, 8, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3417, 'beauty_salon1', 'longchair1', 4, 10, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3418, 'beauty_salon1', 'longchair2', 5, 10, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3419, 'beauty_salon1', 'longchair2', 6, 10, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3420, 'beauty_salon1', 'longchair2', 7, 10, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3421, 'beauty_salon1', 'longchair3', 8, 10, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3422, 'beauty_salon1', 'longchair1', 11, 10, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3423, 'beauty_salon1', 'longchair2', 12, 10, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3424, 'beauty_salon1', 'longchair2', 13, 10, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3425, 'beauty_salon1', 'longchair2', 14, 10, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3426, 'beauty_salon1', 'longchair3', 15, 10, 0, 4, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3427, 'beauty_salon1', 'longchair1', 17, 13, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3428, 'beauty_salon1', 'longchair1', 19, 13, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3429, 'beauty_salon1', 'longchair2', 17, 14, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3430, 'beauty_salon1', 'longchair2', 19, 14, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3431, 'beauty_salon1', 'longchair2', 17, 15, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3432, 'beauty_salon1', 'longchair2', 19, 15, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3433, 'beauty_salon1', 'longchair2', 17, 16, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3434, 'beauty_salon1', 'longchair2', 19, 16, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3435, 'beauty_salon1', 'longchair3', 17, 17, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3436, 'beauty_salon1', 'longchair3', 19, 17, 0, 6, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3437, 'beauty_salon1', 'longchair1', 4, 19, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3438, 'beauty_salon1', 'longchair2', 5, 19, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3439, 'beauty_salon1', 'longchair2', 6, 19, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3440, 'beauty_salon1', 'longchair2', 7, 19, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3441, 'beauty_salon1', 'longchair3', 8, 19, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3442, 'beauty_salon1', 'longchair1', 11, 19, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3443, 'beauty_salon1', 'longchair2', 12, 19, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3444, 'beauty_salon1', 'longchair2', 13, 19, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3445, 'beauty_salon1', 'longchair2', 14, 19, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3446, 'beauty_salon1', 'longchair3', 15, 19, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3447, 'beauty_salon1', 'longchair1', 4, 21, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3448, 'beauty_salon1', 'longchair2', 5, 21, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3449, 'beauty_salon1', 'longchair2', 6, 21, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3450, 'beauty_salon1', 'longchair2', 7, 21, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3451, 'beauty_salon1', 'longchair3', 8, 21, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3452, 'beauty_salon1', 'longchair1', 11, 21, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3453, 'beauty_salon1', 'longchair2', 12, 21, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3454, 'beauty_salon1', 'longchair2', 13, 21, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3455, 'beauty_salon1', 'longchair2', 14, 21, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3456, 'beauty_salon1', 'longchair3', 15, 21, 0, 0, 1, 1, 1, 'can_sit_on_top', '', NULL, NULL), + (3457, 'ice_cafe', 'cafe_deskb', 1, 15, 1, 0, 0.001, 1, 1, 'solid', '', NULL, NULL), + (3458, 'md_a', 'wsTileStart', 21, 15, 8, 0, 0.002, 1, 1, 'invisible,can_stand_on_top', '21,11', NULL, NULL), + (3459, 'md_a', 'wsTileStart', 21, 11, 8, 0, 0.002, 1, 1, 'invisible,can_stand_on_top', '21,15', NULL, NULL), + (3460, 'cafe_gold0', 'ignore', 15, 3, 1, 0, 1, 1, 1, 'solid,invisible', NULL, NULL, NULL), + (3461, 'cafe_gold0', 'ignore', 16, 3, 1, 0, 1, 1, 1, 'solid,invisible', NULL, NULL, NULL); +/*!40000 ALTER TABLE `public_items` ENABLE KEYS */; + +-- Dumping structure for table havana.public_roomwalkways +CREATE TABLE IF NOT EXISTS `public_roomwalkways` ( + `room_id` int(11) DEFAULT NULL, + `to_id` int(1) DEFAULT NULL, + `coords_map` varchar(255) DEFAULT NULL, + `door_position` varchar(50) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.public_roomwalkways: ~54 rows (approximately) +DELETE FROM `public_roomwalkways`; +/*!40000 ALTER TABLE `public_roomwalkways` DISABLE KEYS */; +INSERT INTO `public_roomwalkways` (`room_id`, `to_id`, `coords_map`, `door_position`) VALUES + (45, 69, '20,23 20,24 20,25 21,23 21,24 21,25', '3,23,0,2'), + (69, 45, '0,22 1,23', '19,24,0,6'), + (34, 35, '28,4', NULL), + (35, 34, '11,2', '28,5,0,4'), + (32, 33, '23,0 22,0 20,0 19,0 18,0 17,0 16,0 15,0 14,0 11,0 10,0 9,0', NULL), + (33, 32, '16,24 15,24 17,24 18,24 18,25 17,25 16,25 15,25 18,26 17,26 16,26', '16,2,2,4'), + (13, 14, '9,4 10,4 9,3', NULL), + (14, 13, '3,11 4,11 5,11', '10,5,4,4'), + (19, 20, '16,18', NULL), + (20, 19, '0,7', '15,18,0,6'), + (21, 22, '14,0 15,0', NULL), + (22, 21, '5,25 ', '15,1,4,4'), + (23, 24, '9,32 10,32 11,32 9,33 10,33', NULL), + (24, 23, '1,10 1,11 1,12', '10,30,5,0'), + (36, 37, '19,3 20,4 21,5 22,6 23,7 24,8 25,9 26,10 27,11 28,12', NULL), + (36, 37, '30,14 31,15 32,16 33,17 34,18 35,19 36,20 37,21 38,22 39,23', '18,30,1,1'), + (37, 36, '13,26 14,27 15,28 16,29 17,30 18,31 19,32 20,33 21,34', '34,19,1,5'), + (47, 48, '0,6 0,7 0,8 0,9', '29,3,1,6'), + (47, 50, '6,23 7,23 8,23 9,23', '7,2,1,4'), + (47, 52, '27,6 27,7 27,8 27,9', '2,3,0,2'), + (48, 47, '31,5 31,4 31,3 31,2', '2,7,1,2'), + (48, 49, '14,19 15,19 16,19 17,19', '15,2,0,4'), + (49, 50, '31,9 31,8 31,7 31,6', '2,8,1,2'), + (49, 48, '17,0 16,0 15,0 14,0', '16,17,1,0'), + (50, 47, '9,0 8,0 7,0 6,0', '8,21,1,0'), + (50, 49, '0,9 0,8 0,7 0,6', '29,7,0,6'), + (50, 51, '31,6 31,7 31,8 31,9', '2,15,0,2'), + (51, 50, '0,17 0,16 0,15 0,14', '29,7,0,6'), + (51, 52, '22,0 23,0 24,0 25,0', '24,17,1,0'), + (52, 47, '0,2 0,3 0,4 0,5', '25,7,0,6'), + (52, 51, '22,19 23,19 24,19 25,19', '24,2,1,4'), + (53, 54, '14,0 15,0 16,0 17,0', '19,21,0,0'), + (53, 57, '14,31 15,31 16,31 17,31', '3,6,1,4'), + (53, 55, '0,14 0,15 0,16 0,17', '17,23,0,6'), + (53, 58, '31,17 31,16 31,15 31,14', '2,3,1,2'), + (54, 55, '0,14 0,15 0,16 0,17', '13,8,1,6'), + (54, 53, '18,23 19,23 20,23 21,23', '16,2,0,4'), + (55, 54, '15,6 15,7 15,8 15,9', '2,15,1,2'), + (55, 56, '0,25 0,24 0,23 0,22', '21,12,0,6'), + (55, 53, '19,22 19,23 19,24 19,25', '2,15,0,2'), + (56, 55, '23,13 23,12 23,11 23,10', '2,23,0,2'), + (57, 53, '2,4 3,4 4,4 5,4', '15,29,0,0'), + (57, 58, '17,0 17,1 17,2 17,3', '10,19,0,2'), + (58, 57, '8,18 8,19 8,20 8,21', '15,1,0,6'), + (58, 53, '0,5 0,4 0,3 0,2', '29,15,0,6'), + (61, 62, '2,0 3,0', '1,1,1,4'), + (61, 63, '8,0 9,0', '2,1,1,4'), + (61, 64, '14,0 15,0', '1,1,1,4'), + (61, 65, '0,2 0,3', '1,1,1,4'), + (62, 61, '0,0 1,0', '3,1,1,4'), + (63, 61, '2,0 1,0', '9,1,1,4'), + (64, 61, '0,0 1,0', '15,1,1,4'), + (65, 61, '0,0 1,0', '1,3,1,2'), + (37, 36, '0,13 1,14 2,15 3,16 4,17 5,18 6,19 7,20 8,21 9,22 10,23 11,24 12,25', '23,7,7,5'); +/*!40000 ALTER TABLE `public_roomwalkways` ENABLE KEYS */; + +-- Dumping structure for table havana.rank_badges +CREATE TABLE IF NOT EXISTS `rank_badges` ( + `rank` tinyint(1) unsigned NOT NULL DEFAULT 1, + `badge` char(3) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.rank_badges: ~0 rows (approximately) +DELETE FROM `rank_badges`; +/*!40000 ALTER TABLE `rank_badges` DISABLE KEYS */; +/*!40000 ALTER TABLE `rank_badges` ENABLE KEYS */; + +-- Dumping structure for table havana.rank_fuserights +CREATE TABLE IF NOT EXISTS `rank_fuserights` ( + `min_rank` int(11) NOT NULL, + `fuseright` varchar(255) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.rank_fuserights: ~240 rows (approximately) +DELETE FROM `rank_fuserights`; +/*!40000 ALTER TABLE `rank_fuserights` DISABLE KEYS */; +INSERT INTO `rank_fuserights` (`min_rank`, `fuseright`) VALUES + (1, 'default'), + (1, 'fuse_login'), + (1, 'fuse_buy_credits'), + (1, 'fuse_trade'), + (1, 'fuse_room_queue_default'), + (2, 'fuse_enter_full_rooms'), + (3, 'fuse_enter_locked_rooms'), + (3, 'fuse_kick'), + (3, 'fuse_mute'), + (4, 'fuse_ban'), + (4, 'fuse_room_mute'), + (4, 'fuse_room_kick'), + (4, 'fuse_receive_calls_for_help'), + (4, 'fuse_remove_stickies'), + (5, 'fuse_mod'), + (5, 'fuse_superban'), + (5, 'fuse_pick_up_any_furni'), + (5, 'fuse_ignore_room_owner'), + (5, 'fuse_any_room_controller'), + (2, 'fuse_room_alert'), + (5, 'fuse_moderator_access'), + (6, 'fuse_administrator_access'), + (6, 'fuse_see_flat_ids'), + (5, 'fuse_credits'), + (1, 'default'), + (1, 'fuse_login'), + (1, 'fuse_buy_credits'), + (1, 'fuse_trade'), + (1, 'fuse_room_queue_default'), + (2, 'fuse_enter_full_rooms'), + (3, 'fuse_enter_locked_rooms'), + (3, 'fuse_kick'), + (3, 'fuse_mute'), + (4, 'fuse_ban'), + (4, 'fuse_room_mute'), + (4, 'fuse_room_kick'), + (4, 'fuse_receive_calls_for_help'), + (4, 'fuse_remove_stickies'), + (5, 'fuse_mod'), + (5, 'fuse_superban'), + (5, 'fuse_pick_up_any_furni'), + (5, 'fuse_ignore_room_owner'), + (5, 'fuse_any_room_controller'), + (2, 'fuse_room_alert'), + (5, 'fuse_moderator_access'), + (6, 'fuse_administrator_access'), + (6, 'fuse_see_flat_ids'), + (5, 'fuse_credits'), + (1, 'default'), + (1, 'fuse_login'), + (1, 'fuse_buy_credits'), + (1, 'fuse_trade'), + (1, 'fuse_room_queue_default'), + (2, 'fuse_enter_full_rooms'), + (3, 'fuse_enter_locked_rooms'), + (3, 'fuse_kick'), + (3, 'fuse_mute'), + (4, 'fuse_ban'), + (4, 'fuse_room_mute'), + (4, 'fuse_room_kick'), + (4, 'fuse_receive_calls_for_help'), + (4, 'fuse_remove_stickies'), + (5, 'fuse_mod'), + (5, 'fuse_superban'), + (5, 'fuse_pick_up_any_furni'), + (5, 'fuse_ignore_room_owner'), + (5, 'fuse_any_room_controller'), + (2, 'fuse_room_alert'), + (5, 'fuse_moderator_access'), + (6, 'fuse_administrator_access'), + (6, 'fuse_see_flat_ids'), + (5, 'fuse_credits'), + (1, 'default'), + (1, 'fuse_login'), + (1, 'fuse_buy_credits'), + (1, 'fuse_trade'), + (1, 'fuse_room_queue_default'), + (2, 'fuse_enter_full_rooms'), + (3, 'fuse_enter_locked_rooms'), + (3, 'fuse_kick'), + (3, 'fuse_mute'), + (4, 'fuse_ban'), + (4, 'fuse_room_mute'), + (4, 'fuse_room_kick'), + (4, 'fuse_receive_calls_for_help'), + (4, 'fuse_remove_stickies'), + (5, 'fuse_mod'), + (5, 'fuse_superban'), + (5, 'fuse_pick_up_any_furni'), + (5, 'fuse_ignore_room_owner'), + (5, 'fuse_any_room_controller'), + (2, 'fuse_room_alert'), + (5, 'fuse_moderator_access'), + (6, 'fuse_administrator_access'), + (6, 'fuse_see_flat_ids'), + (5, 'fuse_credits'), + (1, 'default'), + (1, 'fuse_login'), + (1, 'fuse_buy_credits'), + (1, 'fuse_trade'), + (1, 'fuse_room_queue_default'), + (2, 'fuse_enter_full_rooms'), + (3, 'fuse_enter_locked_rooms'), + (3, 'fuse_kick'), + (3, 'fuse_mute'), + (4, 'fuse_ban'), + (4, 'fuse_room_mute'), + (4, 'fuse_room_kick'), + (4, 'fuse_receive_calls_for_help'), + (4, 'fuse_remove_stickies'), + (5, 'fuse_mod'), + (5, 'fuse_superban'), + (5, 'fuse_pick_up_any_furni'), + (5, 'fuse_ignore_room_owner'), + (5, 'fuse_any_room_controller'), + (2, 'fuse_room_alert'), + (5, 'fuse_moderator_access'), + (6, 'fuse_administrator_access'), + (6, 'fuse_see_flat_ids'), + (5, 'fuse_credits'), + (1, 'default'), + (1, 'fuse_login'), + (1, 'fuse_buy_credits'), + (1, 'fuse_trade'), + (1, 'fuse_room_queue_default'), + (2, 'fuse_enter_full_rooms'), + (3, 'fuse_enter_locked_rooms'), + (3, 'fuse_kick'), + (3, 'fuse_mute'), + (4, 'fuse_ban'), + (4, 'fuse_room_mute'), + (4, 'fuse_room_kick'), + (4, 'fuse_receive_calls_for_help'), + (4, 'fuse_remove_stickies'), + (5, 'fuse_mod'), + (5, 'fuse_superban'), + (5, 'fuse_pick_up_any_furni'), + (5, 'fuse_ignore_room_owner'), + (5, 'fuse_any_room_controller'), + (2, 'fuse_room_alert'), + (5, 'fuse_moderator_access'), + (6, 'fuse_administrator_access'), + (6, 'fuse_see_flat_ids'), + (5, 'fuse_credits'), + (1, 'default'), + (1, 'fuse_login'), + (1, 'fuse_buy_credits'), + (1, 'fuse_trade'), + (1, 'fuse_room_queue_default'), + (2, 'fuse_enter_full_rooms'), + (3, 'fuse_enter_locked_rooms'), + (3, 'fuse_kick'), + (3, 'fuse_mute'), + (4, 'fuse_ban'), + (4, 'fuse_room_mute'), + (4, 'fuse_room_kick'), + (4, 'fuse_receive_calls_for_help'), + (4, 'fuse_remove_stickies'), + (5, 'fuse_mod'), + (5, 'fuse_superban'), + (5, 'fuse_pick_up_any_furni'), + (5, 'fuse_ignore_room_owner'), + (5, 'fuse_any_room_controller'), + (2, 'fuse_room_alert'), + (5, 'fuse_moderator_access'), + (6, 'fuse_administrator_access'), + (6, 'fuse_see_flat_ids'), + (5, 'fuse_credits'), + (1, 'default'), + (1, 'fuse_login'), + (1, 'fuse_buy_credits'), + (1, 'fuse_trade'), + (1, 'fuse_room_queue_default'), + (2, 'fuse_enter_full_rooms'), + (3, 'fuse_enter_locked_rooms'), + (3, 'fuse_kick'), + (3, 'fuse_mute'), + (4, 'fuse_ban'), + (4, 'fuse_room_mute'), + (4, 'fuse_room_kick'), + (4, 'fuse_receive_calls_for_help'), + (4, 'fuse_remove_stickies'), + (5, 'fuse_mod'), + (5, 'fuse_superban'), + (5, 'fuse_pick_up_any_furni'), + (5, 'fuse_ignore_room_owner'), + (5, 'fuse_any_room_controller'), + (2, 'fuse_room_alert'), + (5, 'fuse_moderator_access'), + (6, 'fuse_administrator_access'), + (6, 'fuse_see_flat_ids'), + (5, 'fuse_credits'), + (1, 'default'), + (1, 'fuse_login'), + (1, 'fuse_buy_credits'), + (1, 'fuse_trade'), + (1, 'fuse_room_queue_default'), + (2, 'fuse_enter_full_rooms'), + (3, 'fuse_enter_locked_rooms'), + (3, 'fuse_kick'), + (3, 'fuse_mute'), + (4, 'fuse_ban'), + (4, 'fuse_room_mute'), + (4, 'fuse_room_kick'), + (4, 'fuse_receive_calls_for_help'), + (4, 'fuse_remove_stickies'), + (5, 'fuse_mod'), + (5, 'fuse_superban'), + (5, 'fuse_pick_up_any_furni'), + (5, 'fuse_ignore_room_owner'), + (5, 'fuse_any_room_controller'), + (2, 'fuse_room_alert'), + (5, 'fuse_moderator_access'), + (6, 'fuse_administrator_access'), + (6, 'fuse_see_flat_ids'), + (5, 'fuse_credits'), + (1, 'default'), + (1, 'fuse_login'), + (1, 'fuse_buy_credits'), + (1, 'fuse_trade'), + (1, 'fuse_room_queue_default'), + (2, 'fuse_enter_full_rooms'), + (3, 'fuse_enter_locked_rooms'), + (3, 'fuse_kick'), + (3, 'fuse_mute'), + (4, 'fuse_ban'), + (4, 'fuse_room_mute'), + (4, 'fuse_room_kick'), + (4, 'fuse_receive_calls_for_help'), + (4, 'fuse_remove_stickies'), + (5, 'fuse_mod'), + (5, 'fuse_superban'), + (5, 'fuse_pick_up_any_furni'), + (5, 'fuse_ignore_room_owner'), + (5, 'fuse_any_room_controller'), + (2, 'fuse_room_alert'), + (5, 'fuse_moderator_access'), + (6, 'fuse_administrator_access'), + (6, 'fuse_see_flat_ids'), + (5, 'fuse_credits'); +/*!40000 ALTER TABLE `rank_fuserights` ENABLE KEYS */; + +-- Dumping structure for table havana.recycler_rewards +CREATE TABLE IF NOT EXISTS `recycler_rewards` ( + `sprite` varchar(255) NOT NULL, + `order_id` int(11) NOT NULL DEFAULT 0, + `chance` int(11) NOT NULL DEFAULT 5, + PRIMARY KEY (`sprite`), + UNIQUE KEY `sprite` (`sprite`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.recycler_rewards: ~28 rows (approximately) +DELETE FROM `recycler_rewards`; +/*!40000 ALTER TABLE `recycler_rewards` DISABLE KEYS */; +INSERT INTO `recycler_rewards` (`sprite`, `order_id`, `chance`) VALUES + ('eco_cactus1', 1, 0), + ('eco_cactus2', 2, 0), + ('eco_cactus3', 3, 0), + ('eco_chair1', 12, 5), + ('eco_chair2', 13, 5), + ('eco_chair3', 14, 5), + ('eco_curtains1', 15, 5), + ('eco_curtains2', 16, 5), + ('eco_curtains3', 17, 5), + ('eco_fruits1', 9, 40), + ('eco_fruits2', 10, 40), + ('eco_fruits3', 11, 40), + ('eco_lamp1', 4, 0), + ('eco_lamp2', 5, 0), + ('eco_lamp3', 6, 0), + ('eco_light1', 18, 5), + ('eco_light2', 19, 5), + ('eco_light3', 20, 5), + ('eco_mush1', 27, 2000), + ('eco_mush2', 28, 200), + ('eco_sofa1', 21, 5), + ('eco_sofa2', 22, 5), + ('eco_sofa3', 23, 5), + ('eco_table1', 24, 5), + ('eco_table2', 25, 5), + ('eco_table3', 26, 5), + ('eco_tree1', 8, 200), + ('eco_tree2', 7, 2000); +/*!40000 ALTER TABLE `recycler_rewards` ENABLE KEYS */; + +-- Dumping structure for table havana.rooms +CREATE TABLE IF NOT EXISTS `rooms` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `owner_id` varchar(11) NOT NULL, + `category` int(11) DEFAULT 2, + `name` text NOT NULL DEFAULT '', + `description` text NOT NULL DEFAULT '', + `model` varchar(50) NOT NULL, + `ccts` varchar(255) DEFAULT '', + `wallpaper` int(4) DEFAULT 0, + `floor` int(4) DEFAULT 0, + `landscape` varchar(10) NOT NULL DEFAULT '0', + `showname` tinyint(1) DEFAULT 1, + `superusers` tinyint(1) DEFAULT 0, + `accesstype` tinyint(3) DEFAULT 0, + `password` varchar(255) DEFAULT '', + `visitors_now` int(11) DEFAULT 0, + `visitors_max` int(11) DEFAULT 25, + `rating` int(11) NOT NULL DEFAULT 0, + `icon_data` varchar(255) NOT NULL DEFAULT '0|0|', + `group_id` int(11) NOT NULL DEFAULT 0, + `is_hidden` tinyint(4) NOT NULL DEFAULT 0, + `created_at` datetime NOT NULL DEFAULT current_timestamp(), + `updated_at` datetime NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), + PRIMARY KEY (`id`), + UNIQUE KEY `id` (`id`), + KEY `owner_id` (`owner_id`), + KEY `visitors_now` (`visitors_now`), + KEY `rating` (`rating`), + KEY `model` (`model`), + KEY `accesstype` (`accesstype`) +) ENGINE=InnoDB AUTO_INCREMENT=1000 DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.rooms: ~70 rows (approximately) +DELETE FROM `rooms`; +/*!40000 ALTER TABLE `rooms` DISABLE KEYS */; +INSERT INTO `rooms` (`id`, `owner_id`, `category`, `name`, `description`, `model`, `ccts`, `wallpaper`, `floor`, `landscape`, `showname`, `superusers`, `accesstype`, `password`, `visitors_now`, `visitors_max`, `rating`, `icon_data`, `group_id`, `is_hidden`, `created_at`, `updated_at`) VALUES + (1, '0', 3, 'Welcome Lounge', 'welcome_lounge', 'newbie_lobby', 'hh_room_nlobby', 0, 0, '0.0', 0, 0, 0, '', 0, 40, 0, '0|0|', 1000, 0, '2018-08-11 07:54:01', '2021-11-02 11:13:09'), + (2, '0', 5, 'Theatredome', 'theatredrome', 'theater', 'hh_room_theater_carneval', 0, 0, '0.0', 0, 0, 0, '', 0, 100, 0, '0|0|', 2398, 0, '2018-08-11 07:54:01', '2022-09-03 12:32:33'), + (3, '0', 5, 'Library', 'library', 'library', 'hh_room_library', 0, 0, '0.0', 0, 0, 0, '', 0, 30, 0, '0|0|', 6645, 0, '2018-08-11 07:54:01', '2021-11-02 11:13:32'), + (4, '0', 5, 'TV Studio', 'tv_studio', 'tv_studio', 'hh_room_tv_studio_general', 0, 0, '0.0', 0, 0, 0, '', 0, 20, 0, '0|0|', 0, 0, '2018-08-11 07:54:01', '2021-11-02 10:55:29'), + (5, '0', 5, 'Cinema', 'habbo_cinema', 'cinema_a', 'hh_room_cinema', 0, 0, '0.0', 0, 0, 0, '', 0, 50, 0, '0|0|', 0, 0, '2018-08-11 07:54:01', '2022-09-03 12:32:42'), + (6, '0', 5, 'Power Gym', 'sport', 'sport', 'hh_room_sport', 0, 0, '0.0', 0, 0, 0, '', 0, 35, 0, '0|0|', 0, 0, '2018-08-11 07:54:01', '2021-10-30 14:25:44'), + (7, '0', 5, 'Olympic Stadium', 'ballroom', 'ballroom', 'hh_room_ballroom', 0, 0, '0.0', 0, 0, 0, '', 0, 50, 0, '0|0|', 4572, 0, '2018-08-11 07:54:01', '2021-11-02 15:38:24'), + (8, '0', 6, 'Habbo Kitchen', 'hotel_kitchen', 'cr_kitchen', 'hh_room_kitchen', 0, 0, '0.0', 0, 0, 0, '', 0, 20, 0, '0|0|', 1428, 0, '2018-08-11 07:54:01', '2021-10-29 21:26:57'), + (9, '0', 6, 'The Dirty Duck Pub', 'the_dirty_duck_pub', 'pub_a', 'hh_room_pub', 0, 0, '0.0', 0, 0, 0, '', 0, 40, 0, '0|0|', 0, 0, '2018-08-11 07:54:01', '2021-10-29 20:49:03'), + (10, '0', 6, 'Cafe Ole', 'cafe_ole', 'cafe_ole', 'hh_room_cafe', 0, 0, '0.0', 0, 0, 0, '', 0, 35, 0, '0|0|', 0, 0, '2018-08-11 07:54:01', '2021-10-29 23:14:43'), + (11, '0', 6, 'Eric\'s Eaterie', 'eric\'s_eaterie', 'cr_cafe', 'hh_room_erics', 0, 0, '0.0', 0, 0, 0, '', 0, 35, 0, '0|0|', 2797, 0, '2018-08-11 07:54:01', '2021-10-31 10:05:26'), + (12, '0', 6, 'Space Cafe', 'space_cafe', 'space_cafe', 'hh_room_space_cafe', 0, 0, '0.0', 0, 0, 0, '', 0, 35, 0, '0|0|', 0, 0, '2018-08-11 07:54:01', '2021-10-29 23:13:35'), + (13, '0', 7, 'Rooftop Terrace', 'rooftop', 'rooftop', 'hh_room_rooftop', 0, 0, '0.0', 0, 0, 0, '', 0, 30, 0, '0|0|', 1785, 0, '2018-08-11 07:54:01', '2021-11-02 10:56:06'), + (14, '0', 7, 'Rooftop Cafe', 'rooftop', 'rooftop_2', 'hh_room_rooftop', 0, 0, '0.0', 0, 0, 0, '', 0, 20, 0, '0|0|', 0, 1, '2018-08-11 07:54:01', '2021-11-02 11:04:25'), + (15, '0', 6, 'Palazzo Pizza', 'pizza', 'pizza', 'hh_room_pizza', 0, 0, '0.0', 0, 0, 0, '', 0, 40, 0, '0|0|', 0, 0, '2018-08-11 07:54:01', '2021-10-29 23:13:51'), + (16, '0', 6, 'Habburgers', 'habburger\'s', 'habburger', 'hh_room_habburger', 0, 0, '0.0', 0, 0, 0, '', 0, 40, 0, '0|0|', 0, 0, '2018-08-11 07:54:01', '2022-09-03 12:34:00'), + (17, '0', 8, 'Grandfathers Lounge', 'dusty_lounge', 'dusty_lounge', 'hh_room_dustylounge', 0, 0, '0.0', 0, 0, 0, '', 0, 45, 0, '0|0|', 0, 0, '2018-08-11 07:54:01', '2021-11-01 21:49:53'), + (18, '0', 7, 'Oriental Tearoom', 'tearoom', 'tearoom', 'hh_room_tearoom', 0, 0, '0.0', 0, 0, 0, '', 0, 40, 0, '0|0|', 0, 0, '2018-08-11 07:54:01', '2021-11-01 21:57:40'), + (19, '0', 7, 'Oldskool Lounge', 'old_skool', 'old_skool0', 'hh_room_old_skool', 0, 0, '0.0', 0, 0, 0, '', 0, 45, 0, '0|0|', 7440, 0, '2018-08-11 07:54:01', '2021-11-02 15:38:41'), + (20, '0', 7, 'Oldskool Dancefloor', 'old_skool', 'old_skool1', 'hh_room_old_skool', 0, 0, '0.0', 0, 0, 0, '', 0, 45, 0, '0|0|', 8172, 1, '2018-08-11 07:54:01', '2021-10-31 10:01:04'), + (21, '0', 7, 'The Chromide Club', 'the_chromide_club', 'malja_bar_a', 'hh_room_disco', 0, 0, '0.0', 0, 0, 0, '', 0, 45, 0, '0|0|', 1171, 0, '2018-08-11 07:54:01', '2021-10-31 09:58:45'), + (22, '0', 7, 'The Chromide Club II', 'the_chromide_club', 'malja_bar_b', 'hh_room_disco', 0, 0, '0.0', 0, 0, 0, '', 0, 50, 0, '0|0|', 0, 1, '2018-08-11 07:54:01', '2021-10-31 09:59:21'), + (23, '0', 7, 'Club Massiva', 'club_massiva', 'bar_a', 'hh_room_bar', 0, 0, '0.0', 0, 0, 0, '', 0, 45, 0, '0|0|', 1026, 0, '2018-08-11 07:54:01', '2021-11-01 21:57:26'), + (24, '0', 7, 'Club Massiva II', 'club_massiva2', 'bar_b', 'hh_room_bar', 0, 0, '0.0', 0, 0, 0, '', 0, 70, 0, '0|0|', 0, 1, '2018-08-11 07:54:01', '2021-10-31 10:02:00'), + (25, '0', 6, 'Sunset Cafe', 'sunset_cafe', 'sunset_cafe', 'hh_room_sunsetcafe', 0, 0, '0.0', 0, 0, 0, '', 0, 35, 0, '0|0|', 1295, 0, '2018-08-11 07:54:01', '2021-10-31 10:05:50'), + (26, '0', 7, 'Safety Spa', 'cafe_gold', 'cafe_gold0', 'hh_room_gold', 0, 0, '0.0', 0, 0, 0, '', 0, 50, 0, '0|0|', 0, 0, '2018-08-11 07:54:01', '2021-10-29 23:15:05'), + (27, '0', 9, 'Zen Garden', 'chill', 'chill', 'hh_room_chill', 0, 0, '0.0', 0, 0, 0, '', 0, 30, 0, '0|0|', 3075, 0, '2018-08-11 07:54:01', '2021-11-02 06:00:36'), + (28, '0', 8, 'Club Mammoth', 'club_mammoth', 'club_mammoth', 'hh_room_clubmammoth', 0, 0, '0.0', 0, 0, 0, '', 0, 45, 0, '0|0|', 0, 0, '2018-08-11 07:54:01', '2021-11-01 21:49:49'), + (29, '0', 9, 'Floating Garden', 'floatinggarden', 'floatinggarden', 'hh_room_floatinggarden', 0, 0, '0.0', 0, 0, 0, '', 0, 80, 0, '0|0|', 0, 0, '2018-08-11 07:54:01', '2022-09-02 21:24:24'), + (30, '0', 9, 'Picnic Fields', 'picnic', 'picnic', 'hh_room_picnic', 0, 0, '0.0', 0, 0, 0, '', 0, 55, 0, '0|0|', 1318, 0, '2018-08-11 07:54:01', '2021-11-01 22:04:09'), + (31, '0', 9, 'Sun Terrace', 'sun_terrace', 'sun_terrace', 'hh_room_sun_terrace', 0, 0, '0.0', 0, 0, 0, '', 0, 50, 0, '0|0|', 0, 0, '2018-08-11 07:54:01', '2021-11-01 22:03:18'), + (32, '0', 9, 'Peaceful Park', 'gate_park', 'gate_park', 'hh_room_gate_park', 0, 0, '0.0', 0, 0, 0, '', 0, 50, 0, '0|0|', 0, 0, '2018-08-11 07:54:01', '2021-11-01 22:06:27'), + (33, '0', 9, 'Peaceful Park - B', 'gate_park', 'gate_park_2', 'hh_room_gate_park', 0, 0, '0.0', 0, 0, 0, '', 0, 50, 0, '0|0|', 0, 1, '2018-08-11 07:54:01', '2021-11-01 22:06:43'), + (34, '0', 3, 'The Park', 'park', 'park_a', 'hh_room_park,hh_room_park_general', 0, 0, '0.0', 0, 0, 0, '', 0, 45, 0, '0|0|', 0, 0, '2018-08-11 07:54:01', '2021-11-02 10:27:57'), + (35, '0', 3, 'The Infobus', 'park', 'park_b', 'hh_room_park,hh_people_pool', 0, 0, '0.0', 0, 0, 0, '', 0, 20, 0, '0|0|', 0, 1, '2018-08-11 07:54:01', '2021-11-01 21:45:14'), + (36, '0', 3, 'Habbo Lido', 'habbo_lido', 'pool_a', 'hh_room_pool,hh_people_pool', 0, 0, '0.0', 0, 0, 0, '', 0, 60, 0, '0|0|', 0, 0, '2018-08-11 07:54:01', '2022-09-03 13:03:16'), + (37, '0', 3, 'Lido B', 'habbo_lido_ii', 'pool_b', 'hh_room_pool,hh_people_pool', 0, 0, '0.0', 0, 0, 0, '', 0, 60, 0, '0|0|', 0, 1, '2018-08-11 07:54:01', '2022-09-03 12:32:25'), + (38, '0', 3, 'Rooftop Rumble', 'rooftop_rumble', 'md_a', 'hh_room_terrace,hh_paalu,hh_people_pool,hh_people_paalu', 0, 0, '0.0', 0, 0, 0, '', 0, 50, 0, '0|0|', 0, 0, '2018-08-11 07:54:01', '2022-09-02 20:49:21'), + (39, '0', 11, 'Main Lobby', 'main_lobby', 'lobby_a', 'hh_room_lobby', 0, 0, '0.0', 0, 0, 0, '', 0, 100, 0, '0|0|', 0, 0, '2018-08-11 07:54:01', '2021-11-02 15:39:43'), + (40, '0', 11, 'Basement Lobby', 'basement_lobby', 'floorlobby_a', 'hh_room_floorlobbies', 0, 0, '0.0', 0, 0, 0, '', 0, 50, 0, '0|0|', 1507, 0, '2018-08-11 07:54:01', '2021-10-29 23:24:03'), + (41, '0', 11, 'Median Lobby', 'median_lobby', 'floorlobby_b', 'hh_room_floorlobbies', 0, 0, '0.0', 0, 0, 0, '', 0, 50, 0, '0|0|', 0, 0, '2018-08-11 07:54:01', '2021-10-29 23:24:31'), + (42, '0', 11, 'Skylight Lobby', 'skylight_lobby', 'floorlobby_c', 'hh_room_floorlobbies', 0, 0, '0.0', 0, 0, 0, '', 0, 50, 0, '0|0|', 1657, 0, '2018-08-11 07:54:01', '2021-11-01 21:45:35'), + (43, '0', 6, 'Ice Cafe', 'ice_cafe', 'ice_cafe', 'hh_room_icecafe', 0, 0, '0.0', 0, 0, 0, '', 0, 25, 0, '0|0|', 13675, 0, '2018-08-11 07:54:01', '2021-11-03 08:29:44'), + (44, '0', 6, 'Net Cafe', 'netcafe', 'netcafe', 'hh_room_netcafe', 0, 0, '0.0', 0, 0, 0, '', 0, 25, 0, '0|0|', 0, 0, '2018-08-11 07:54:01', '2021-10-31 10:05:14'), + (45, '0', 5, 'Beauty Salon', 'beauty_salon_loreal', 'beauty_salon0', 'hh_room_beauty_salon_general', 0, 0, '0.0', 0, 0, 0, '', 0, 25, 0, '0|0|', 0, 0, '2018-08-11 07:54:01', '2021-10-30 14:25:26'), + (46, '0', 5, 'The Den', 'the_den', 'cr_staff', 'hh_room_den', 0, 0, '0.0', 0, 0, 0, '', 0, 100, 0, '0|0|', 1521, 0, '2018-08-11 07:54:01', '2021-10-30 14:25:21'), + (47, '0', 12, 'Lower Hallways', 'hallway', 'hallway2', 'hh_room_hallway', 0, 0, '0.0', 1, 0, 0, '', 0, 25, 0, '0|0|', 4084, 0, '2018-08-11 07:54:01', '2021-11-01 21:47:48'), + (48, '0', 12, 'Lower Hallways I', 'hallway', 'hallway0', 'hh_room_hallway', 0, 0, '0.0', 1, 0, 0, '', 0, 25, 0, '0|0|', 5625, 1, '2018-08-11 07:54:01', '2021-10-29 23:27:47'), + (49, '0', 12, 'Lower Hallways II', 'hallway', 'hallway1', 'hh_room_hallway', 0, 0, '0.0', 1, 0, 0, '', 0, 25, 0, '0|0|', 0, 1, '2018-08-11 07:54:01', '2021-10-29 23:27:58'), + (50, '0', 12, 'Lower Hallways III', 'hallway', 'hallway3', 'hh_room_hallway', 0, 0, '0.0', 1, 0, 0, '', 0, 25, 0, '0|0|', 0, 1, '2018-08-11 07:54:01', '2021-11-01 21:48:38'), + (51, '0', 12, 'Lower Hallways IV', 'hallway', 'hallway5', 'hh_room_hallway', 0, 0, '0.0', 1, 0, 0, '', 0, 25, 0, '0|0|', 1713, 1, '2018-08-11 07:54:01', '2021-11-01 21:48:25'), + (52, '0', 12, 'Lower Hallways V', 'hallway', 'hallway4', 'hh_room_hallway', 0, 0, '0.0', 1, 0, 0, '', 0, 25, 0, '0|0|', 0, 1, '2018-08-11 07:54:01', '2021-11-01 21:48:07'), + (53, '0', 12, 'Upper Hallways', 'hallway_ii', 'hallway9', 'hh_room_hallway', 0, 0, '0.0', 1, 0, 0, '', 0, 25, 0, '0|0|', 0, 0, '2018-08-11 07:54:01', '2021-11-02 00:28:43'), + (54, '0', 12, 'Upper Hallways I', 'hallway_ii', 'hallway8', 'hh_room_hallway', 0, 0, '0.0', 1, 0, 0, '', 0, 25, 0, '0|0|', 0, 1, '2018-08-11 07:54:01', '2021-11-02 00:29:24'), + (55, '0', 12, 'Upper Hallways II', 'hallway_ii', 'hallway7', 'hh_room_hallway', 0, 0, '0.0', 1, 0, 0, '', 0, 25, 0, '0|0|', 0, 1, '2018-08-11 07:54:01', '2021-10-27 14:57:07'), + (56, '0', 12, 'Upper Hallways III', 'hallway_ii', 'hallway6', 'hh_room_hallway', 0, 0, '0.0', 1, 0, 0, '', 0, 25, 0, '0|0|', 0, 1, '2018-08-11 07:54:01', '2021-10-27 14:56:54'), + (57, '0', 12, 'Upper Hallways IV', 'hallway_ii', 'hallway10', 'hh_room_hallway', 0, 0, '0.0', 1, 0, 0, '', 0, 25, 0, '0|0|', 0, 1, '2018-08-11 07:54:01', '2021-10-29 23:28:41'), + (58, '0', 12, 'Upper Hallways V', 'hallway_ii', 'hallway11', 'hh_room_hallway', 0, 0, '0.0', 1, 0, 0, '', 0, 25, 0, '0|0|', 0, 1, '2018-08-11 07:54:01', '2021-10-29 23:28:57'), + (59, '0', 7, 'Star Lounge', 'star_lounge', 'star_lounge', 'hh_room_starlounge', 0, 0, '0.0', 1, 0, 0, '', 0, 35, 0, '0|0|', 0, 0, '2018-08-11 07:54:01', '2021-10-29 00:29:01'), + (60, '0', 8, 'Club Orient', 'orient', 'orient', 'hh_room_orient', 0, 0, '0.0', 1, 0, 0, '', 0, 35, 0, '0|0|', 2000, 0, '2018-08-11 07:54:01', '2021-11-01 21:50:12'), + (61, '0', 13, 'Cunning Fox Gamehall', 'cunning_fox_gamehall', 'entryhall', 'hh_room_gamehall,hh_games', 0, 0, '0.0', 1, 0, 0, '', 0, 25, 0, '0|0|', 0, 0, '2018-08-11 07:54:01', '2021-11-01 13:26:27'), + (62, '0', 13, 'TicTacToe hall', 'cunning_fox_gamehall/1', 'hallA', 'hh_room_gamehall,hh_games', 0, 0, '0.0', 1, 0, 0, '', 0, 25, 0, '0|0|', 0, 1, '2018-08-11 07:54:01', '2021-11-01 13:26:08'), + (63, '0', 13, 'Battleships hall', 'cunning_fox_gamehall/2', 'hallB', 'hh_room_gamehall,hh_games', 0, 0, '0.0', 1, 0, 0, '', 0, 25, 0, '0|0|', 0, 1, '2018-08-11 07:54:01', '2021-10-30 07:59:47'), + (64, '0', 13, 'Chess hall', 'cunning_fox_gamehall/3', 'hallC', 'hh_room_gamehall,hh_games', 0, 0, '0.0', 1, 0, 0, '', 0, 25, 0, '0|0|', 0, 1, '2018-08-11 07:54:01', '2021-11-01 13:38:28'), + (65, '0', 13, 'Poker hall', 'cunning_fox_gamehall/4', 'hallD', 'hh_room_gamehall,hh_games', 0, 0, '0.0', 1, 0, 0, '', 0, 25, 0, '0|0|', 6493, 1, '2018-08-11 07:54:01', '2021-10-29 23:30:00'), + (66, '0', 13, 'Battleball Lobby', 'bb_lobby_beginner_0', 'bb_lobby_1', 'hh_game_bb,hh_game_bb_room,hh_game_bb_ui,hh_gamesys', 0, 0, '0.0', 1, 0, 0, '', 0, 200, 0, '0|0|', 4080, 0, '2018-08-11 07:54:01', '2022-09-03 00:50:55'), + (67, '0', 13, 'Snowstorm Lobby', 'sw_lobby_beginner_0', 'snowwar_lobby_1', 'hh_gamesys,hh_game_snowwar,hh_game_snowwar_room,hh_game_snowwar_ui', 0, 0, '0.0', 1, 0, 0, '', 0, 200, 0, '0|0|', 1646, 0, '2018-08-11 07:54:01', '2022-09-03 00:51:17'), + (68, '0', 5, 'Imperial Palace', 'emperors', 'emperors', 'hh_room_emperors', 0, 0, '0.0', 0, 0, 0, '', 0, 30, 0, '0|0|', 0, 0, '2018-08-11 07:54:01', '2021-11-01 21:50:47'), + (69, '0', 5, 'Beauty Salon II', 'beauty_salon_loreal', 'beauty_salon1', 'hh_room_beauty_salon_general', 0, 0, '0.0', 0, 0, 0, '', 0, 25, 0, '0|0|', 0, 1, '2018-08-11 07:54:01', '2021-09-28 22:39:40'); +/*!40000 ALTER TABLE `rooms` ENABLE KEYS */; + +-- Dumping structure for table havana.rooms_ads +CREATE TABLE IF NOT EXISTS `rooms_ads` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `is_loading_ad` tinyint(1) NOT NULL DEFAULT 0, + `room_id` int(11) NOT NULL, + `url` varchar(255) DEFAULT NULL, + `image` mediumtext NOT NULL, + `enabled` tinyint(1) NOT NULL DEFAULT 1, + KEY `room_ad id` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=82 DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.rooms_ads: ~28 rows (approximately) +DELETE FROM `rooms_ads`; +/*!40000 ALTER TABLE `rooms_ads` DISABLE KEYS */; +INSERT INTO `rooms_ads` (`id`, `is_loading_ad`, `room_id`, `url`, `image`, `enabled`) VALUES + (1, 0, 1, 'http://classichabbo.com/credits/collectables', 'http://alex-dev.org/ads/billboards/billboard_collectibles_01.gif', 1), + (2, 0, 9, NULL, 'http://alex-dev.org/ads/billboards/billboard_diner_01.gif', 1), + (3, 0, 12, NULL, 'http://alex-dev.org/ads/billboards/billboard_idol_02.gif', 1), + (4, 0, 13, NULL, 'http://alex-dev.org/ads/billboards/ad_rooftoptgt_outside_L.gif', 1), + (5, 0, 14, NULL, 'http://alex-dev.org/ads/billboards/ad_rooftoptgt_inside_R.gif', 1), + (6, 0, 36, NULL, 'http://alex-dev.org/ads/billboards/ad_lido_L.gif', 1), + (60, 1, -1, NULL, 'http://cdn.classichabbo.com/c_images/room_ads/hc.gif', 1), + (61, 1, -1, NULL, 'http://cdn.classichabbo.com/c_images/room_ads/ai_1.gif', 1), + (62, 1, -1, NULL, 'http://cdn.classichabbo.com/c_images/room_ads/country.gif', 1), + (63, 1, -1, NULL, 'http://cdn.classichabbo.com/c_images/room_ads/diner.gif', 1), + (64, 1, -1, NULL, 'http://cdn.classichabbo.com/c_images/room_ads/interstitial_hc.gif', 1), + (65, 1, -1, NULL, 'http://cdn.classichabbo.com/c_images/room_ads/interstitial_hcpromo09_hcparty3.gif', 1), + (66, 1, -1, NULL, 'http://cdn.classichabbo.com/c_images/room_ads/interstitial_hween09.gif', 1), + (67, 1, -1, NULL, 'http://cdn.classichabbo.com/c_images/room_ads/interstitial_kitchen.gif', 1), + (68, 1, -1, NULL, 'http://cdn.classichabbo.com/c_images/room_ads/interstitial_pay2playscam.gif', 1), + (69, 1, -1, NULL, 'http://cdn.classichabbo.com/c_images/room_ads/roomloadtrophies.gif', 1), + (70, 1, -1, NULL, 'http://cdn.classichabbo.com/c_images/room_ads/roomloadpixels.gif', 1), + (71, 1, -1, NULL, 'http://cdn.classichabbo.com/c_images/room_ads/roomloadbobba.gif', 1), + (72, 1, -1, NULL, 'http://cdn.classichabbo.com/c_images/room_ads/mall.gif', 1), + (73, 1, -1, NULL, 'http://cdn.classichabbo.com/c_images/room_ads/love_earth.gif', 1), + (74, 1, -1, NULL, 'http://cdn.classichabbo.com/c_images/room_ads/loadingscreen.gif', 1), + (75, 1, -1, NULL, 'http://cdn.classichabbo.com/c_images/room_ads/jungle.gif', 1), + (76, 1, -1, NULL, 'http://cdn.classichabbo.com/c_images/room_ads/it_bolly.gif', 1), + (77, 1, -1, NULL, 'http://cdn.classichabbo.com/c_images/room_ads/safety_148.gif', 1), + (78, 1, -1, NULL, 'http://cdn.classichabbo.com/c_images/room_ads/trophies.gif', 1), + (79, 1, -1, NULL, 'http://cdn.classichabbo.com/c_images/room_ads/us_ying_yang_bb.gif', 1), + (80, 1, -1, NULL, 'http://cdn.classichabbo.com/c_images/room_ads/windows.gif', 1), + (81, 1, -1, NULL, 'http://cdn.classichabbo.com/c_images/room_ads/xmas.gif', 0); +/*!40000 ALTER TABLE `rooms_ads` ENABLE KEYS */; + +-- Dumping structure for table havana.rooms_bans +CREATE TABLE IF NOT EXISTS `rooms_bans` ( + `room_id` int(11) NOT NULL, + `user_id` int(11) NOT NULL, + `expire_at` bigint(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.rooms_bans: ~0 rows (approximately) +DELETE FROM `rooms_bans`; +/*!40000 ALTER TABLE `rooms_bans` DISABLE KEYS */; +/*!40000 ALTER TABLE `rooms_bans` ENABLE KEYS */; + +-- Dumping structure for table havana.rooms_bots +CREATE TABLE IF NOT EXISTS `rooms_bots` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(25) NOT NULL, + `mission` varchar(255) NOT NULL, + `x` int(11) NOT NULL, + `y` int(11) NOT NULL, + `start_look` varchar(25) NOT NULL, + `figure` varchar(255) NOT NULL, + `walkspace` text NOT NULL, + `room_id` int(11) NOT NULL DEFAULT 0, + `speech` mediumtext NOT NULL, + `response` mediumtext NOT NULL, + `unrecognised_response` mediumtext NOT NULL, + `hand_items` varchar(50) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=46 DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.rooms_bots: ~33 rows (approximately) +DELETE FROM `rooms_bots`; +/*!40000 ALTER TABLE `rooms_bots` DISABLE KEYS */; +INSERT INTO `rooms_bots` (`id`, `name`, `mission`, `x`, `y`, `start_look`, `figure`, `walkspace`, `room_id`, `speech`, `response`, `unrecognised_response`, `hand_items`) VALUES + (5, 'Xenia', 'The belle of the Battle Ball', 1, 8, '2,2', 'sd=001&sh=002/54,178,190&lg=200/230,49,57&ch=506/230,49,57,141&lh=001/168,123,67&rh=001/168,123,67&hd=001/168,123,67&ey=001&fc=001/168,123,67&hr=506/194,26,134,190&hrb=506/2,3,4&rs=002/230,49,57&ls=002/230,49,57&bd=001/168,123,67', '0,5 0,6 0,7 1,5 1,6 1,7 1,8', 66, '', '', '', ''), + (6, 'Pamela', ':)', 7, 8, '4,4', 'sd=001&sh=002/148,98,32&lg=005/230,49,57&ch=201/255,255,255&lh=001/215,175,125&rh=001/215,175,125&hd=001/215,175,125&ey=001&fc=001/215,175,125&hr=507/103,78,59&rs=002/255,255,255&ls=002/255,255,255&bd=001/215,175,125', '22,4 23,4 24,4 25,4 26,4 22,5 23,5 24,5 25,5 26,5', 45, '', '', '', ''), + (7, 'Regina', 'I know, right?', 3, 6, '2,2', 'sd=001&sh=002/255,115,131&lg=005/255,115,131&ch=018/255,255,255&lh=001/255,204,153&rh=001/255,204,153&hd=001/255,204,153&ey=001&fc=001/255,204,153&hr=501/225,204,120&rs=003/255,255,255&ls=003/255,255,255&bd=001/255,204,153', '2,7 2,8 2,9 3,5 3,6 3,7 3,8 3,9 3,10', 10, 'I\'ve been busy practicing my dance routine for my latest song!|You like coffee? I like my job|You mocha me very happy.|Italians are so good at making coffee because they naturally like to espresso themselves.', 'Enjoy this|This will do the trick|One %lowercaseDrink% coming right up!', 'Repeat that please!|Say that again|What?|Hmm...', 'Coffee'), + (8, 'James', 'Nemo my name forever more', 4, 24, '0,0', 'sd=001&sh=001/17,17,17&lg=001/17,17,17&ch=800&lh=001/240,213,179&rh=001/240,213,179&hd=001/240,213,179&ey=001/254,202,150&fc=001/240,213,179&hr=201/17,17,17&rs=800&ls=800&bd=001/240,213,179', '4,24 4,25 4,26 4,27 5,24 5,25 5,26 5,27', 23, '', '', '', ''), + (9, 'Marion', 'I want to be Bonnie Blond!', 6, 25, '2,2', 'sd=001&sh=002/17,17,17&lg=005/255,115,131&ch=018/17,17,17&lh=001/230,200,162&rh=001/230,200,162&hd=001/230,200,162&ey=002&fc=001/230,200,162&hr=202/165,90,24&rs=003/17,17,17&ls=003/17,17,17&bd=001/230,200,162', '6,24 6,25 6,26 6,27', 23, '', '', '', ''), + (10, 'Brone', 'Happy to help', 0, 8, '4,4', 'sd=001/0&hr=008/115,99,70&hd=002/145,98,55&ey=005/0&fc=001/145,98,55&bd=001/145,98,55&lh=001/145,98,55&rh=001/145,98,55&ch=005/17,17,17&ls=002/17,17,17&rs=002/17,17,17&lg=004/17,17,17&sh=003/17,17,17', '0,7 1,7 2,7 3,7 4,7 5,7 6,7 7,7 8,7 9,7 0,8 1,8 2,8 3,8 4,8 5,8 6,8 7,8 8,8 9,8', 21, 'Enjoy the dance!|I\'ve never seen what the other side is like...|My boss doesn\'t allow me to see the disco :(|I serve some mean drinks!', 'You look like you need this|Hmm, take this', 'Not sure what you said|Did I hear something?|What?', ''), + (11, 'Marcus', 'Man of Talent', 0, 22, '2,2', 'sd=001/0&hr=010/224,186,120&hd=002/255,204,153&ey=005/0&fc=001/255,204,153&bd=001/255,204,153&lh=001/255,204,153&rh=001/255,204,153&ch=005/59,122,192&ls=002/59,122,192&rs=002/59,122,192&lg=006/119,159,187&sh=001/223,175,209', '0,21 0,22 0,23 1,21 1,22 1,23', 5, 'If you hear a funny noise, it\'s just Sid the sloth - he loves to sing!|No ordinary drink for no ordinary Habbo|Stressed out? The Ice House cinema\'s the best place to chill out.|Come on - you don\'t need Dutch courage|We\'ve got the coolest DVD playing this week - check it out!|Wow! You have a real talent!|See a hairy elephant? It\'s just Manny the moody mastodon.', 'Here you go!|Sure, %lowercaseDrink% it is!', 'Hello', 'Cola'), + (12, 'Dave', 'Hello, hello', 10, 7, '2,2', 'sd=001/0&hr=995/255,255,255&hd=001/255,204,153&ey=001/0&fc=001/255,204,153&bd=001/255,204,153&lh=001/255,204,153&rh=001/255,204,153&ch=995/255,255,255&ls=002/255,255,255&rs=002/255,255,255&lg=999/255,255,255&sh=001/121,94,83', '9,2 9,3 9,4 10,2 10,3 10,4', 9, '', '', '', ''), + (13, 'Sadie', 'Happy St. Patrick\'s Day!', 10, 5, '2,2', 'sd=001&sh=001/36&lg=999/255,255,255&ch=006/163&lh=001/255,204,153&rh=001/255,204,153&hd=001/255,204,153&ey=001&fc=001/255,204,153&hr=006/250,230,150&rs=002/163&ls=002/163&bd=001/255,204,153', '9,5 9,6 9,7 9,8 10,5 10,6 10,7 10,8', 9, 'Adorate tutti Bubu, regina delle banane!', '', '', ''), + (14, 'Reginaldo', ':)', 23, 5, '4,4', 'sd=001&hd=001/236,214,186&fc=001/236,214,186&bd=001/236,214,186&rh=001/236,214,186&lh=001/236,214,186&hr=001/255,255,255&lg=001/40,40,40&sh=001/150,0,0&rs=002/255,255,255&ls=002/255,255,255&ch=202/255,255,255', '22,4 23,4 24,4 25,4 26,4 22,5 23,5 24,5 25,5 26,5', 17, 'It\'s pretty cool working here, I must say|Maybe some day I will become a club member...|Who knew that someone like me would end up working here?', 'Enjoy the %drink%!,Here you go!', 'Sorry? I didn\'t catch that|Hello there!|That\'s my name, don\'t wear it out', 'Water,Juice,Lemonade,Tea'), + (15, 'Billy', 'You can call me Bill', 5, 13, '2,2', 'sd=001/0&hr=010/224,186,120&hd=002/255,203,152&ey=001/0&fc=001/255,203,152&bd=001/255,203,152&lh=001/255,203,152&rh=001/255,203,152&ch=502/57,65,148&ls=001/57,65,148&rs=001/57,65,148&lg=006/102,102,102&sh=003/51,51,51', '4,10 5,10 5,11 5,12 5,13', 11, 'I serve drinks here|Did you know that coffee comes from plants?|Espresso your opinions politely.|Hmmm... the lovely smell of coffee beans...', 'Coming right up!|Be careful, don\'t hurt yourself!', 'Cool story, brew.|Yep, that\'s me', 'Latte,Coffee,Hot Chocolate'), + (16, 'Phillip', 'Why not try a nice burger?', 1, 13, '2,2', 'sd=001/0&hr=010/255,255,255&hd=002/255,204,153&ey=001/0&fc=001/255,204,153&bd=001/255,204,153&lh=001/255,204,153&rh=001/255,204,153&ch=001/217,113,69&ls=002/217,113,69&rs=002/217,113,69&lg=001/102,102,102&sh=003/47,45,38', '0,7 0,8 0,9 0,10 0,11 0,12 0,13 1,7 1,8 1,9 1,10 1,11 1,12 1,13', 16, 'The way to a man\'s heart is through his stomach.|One day i\'ll be famous', 'Grilling the meat as we speak!|That\'s the special!', '', 'Burger,Water,Drink,Cola,Cow,Reindeer'), + (17, 'Ariel', 'Happy to help', 0, 13, '2,2', 'sd=001&sh=001/36&lg=001/200,0,0&ch=006/163&lh=001/255,203,152&rh=001/255,203,152&hd=001/255,203,152&ey=001&fc=001/255,203,152&hr=003/250,50,2&rs=002/163&ls=002/163&bd=001/255,203,152', '0,9 0,10 0,11 0,12 0,13 0,14', 43, 'Sure is chilly at the Ice Cafe...|Here to serve, every, single, day...|Did you know that I never get a break?', '%drink% it is me\'dear\'!:)|Et voila!', 'Sorry - did you want something?', 'Juice,Coffee,Coke,Cola,Tea,Chocolate'), + (18, 'Piers', 'The master of the kitchen!', 11, 12, '4,4', 'sd=001/0&hr=799/255,255,255&hd=002/255,204,153&ey=001/0&fc=001/255,204,153&bd=001/255,204,153&lh=001/255,204,153&rh=001/255,204,153&ch=003/255,255,255&ls=001/255,255,255&rs=001/255,255,255&lg=004/255,255,255&sh=004/255,255,255', '3,12 4,12 5,12 6,12 7,12 8,12 9,12 10,12 11,12 12,12 3,13 4,13 5,13 6,13 7,13 8,13 9,13 10,12 11,13 12,13', 8, 'Would you like to taste my wrath?|The silverback grilla is native to this area.|Heaters gonna heat.|That’s a recipe for disaster.', 'Yes?|What? I\'m busy you know|A FINE CHOICE#SHOUT|Soup man, how’s it going?', '', ''), + (19, 'Marcel', 'In search of lost time', 11, 15, '2,2', 'sd=001&sh=003/154,154,154&lg=001/98,90,32&ch=202/255,210,179&lh=001/255,210,179&rh=001/255,210,179&hd=001/255,204,153&ey=001&fc=001/255,204,153&hr=203/98,98,98&rs=001/255,210,179&ls=001/255,210,179&bd=001/255,204,153', '7,14 8,14 9,14 10,14 11,14 7,15 8,15 9,15 10,15 11,15 7,16 8,16 9,16 10,16 11,16', 3, '', '', '', ''), + (20, 'Chloe', 'Service with a smile', 6, 30, '2,2', 'sd=001&sh=001/255,115,41&lg=999/255,255,255&ch=006/35,134,182&lh=001/255,203,1522&rh=001/255,203,152&hd=001/255,203,152&ey=001&fc=001/255,203,152&hr=003/250,50,2&rs=002/35,134,182&ls=002/35,134,182&bd=001/255,203,152', '6,29 6,30', 36, 'I need to get out of the ice cream booth and into the DJ booth!|Ow there goes my eardrum!#SHOUT|I wish I looked that good in a bikini|When will I, will I be a famous Habbo who gets on the VIP list?|I\'m a fiery redhead - come here boys!', 'There you go.', 'Hello sweetie|Hi, how can I help?|Well hello there', 'Argh,Lemon,Coke,Cola'), + (22, 'Berith', 'Serving you with a smile :)', 11, 0, '4,4', 'sd=001&sh=002/148,98,32&lg=005/230,49,57&ch=201/255,255,255&lh=001/215,175,125&rh=001/215,175,125&hd=001/215,175,125&ey=001&fc=001/215,175,125&hr=506/103,78,59&rs=002/255,255,255&ls=002/255,255,255&bd=001/215,175,125', '6,0 7,0 8,0 9,0 10,0 11,0 12,0 6,1 7,1 8,1 9,1 10,1 11,1 12,1', 28, 'It\'s pretty cool working here, I must say|Maybe some day I will become a club member...|Who knew that someone like me would end up working here?', '', 'Sorry? I didn\'t catch that|Hello there!|That\'s my name, don\'t wear it out', ''), + (23, 'DJ von Beathoven', 'Turn the music up!', 18, 9, '4,4', 'sd=001&sh=001/36&lg=001&ch=005/163&lh=001/171,122,89&rh=001/171,122,89&hd=001/171,122,89&ey=001&fc=001/171,122,89&hr=931/255,255,255&rs=002/163&ls=002/163&bd=001/8', '17,7 17,8 17,9 18,8 18,9', 28, '', '', '', ''), + (26, 'Amber', 'On the crest of a wave', 11, 2, '4,4', 'sd=001&sh=002/148,98,32&lg=200/120,66,21&ch=018/255,230,57&lh=001/215,175,125&rh=001/215,175,125&hd=001/215,175,125&ey=001&fc=001/215,175,125&hr=023/255,230,50&rs=003/255,230,57&ls=003/255,230,57&bd=001/215,175,125', '10,0 11,0 12,0 10,1 11,1 12,1 13,1 10,2 11,2 12,2 13,2', 26, 'Ask a guide for safety hints and tips. They have an guide badge.|P2S is giving your furni away!|I got this job by smiling sweetly at Redtiz for 40 minutes.|Be safe, not sorry! Learn to protect yourself|Quench it!|Glad to be of service!|Oh to be a star! Perhaps one day soon I\'ll be recognised?', 'This should quench your thirst!|\r\nThirst quenching, soul refreshing!', 'Hello, come for some safety tips? Ask a guide!', 'Water,Drink,Chocolate'), + (27, 'Maarit', ':)', 11, 2, '4,4', 'sd=001&sh=001/255,115,41&lg=003/0,0,0&ch=018/0,0,0&lh=001/255,203,1522&rh=001/255,203,152&hd=001/255,203,152&ey=001&fc=001/255,203,152&hr=507/225,204,120&rs=001/255,255,255&ls=001/255,255,255&bd=001/255,255,255', '22,4 23,4 24,4 25,4 26,4 22,5 23,5 24,5 25,5 26,5', 19, '', '', '', ''), + (28, 'ScubaJoe', '', 26, 10, '4,4', 'sd=001&sh=001/255,255,255&lg=006/255,255,255&ch=003/255,255,255&lh=001/145,98,55&rh=001/145,98,55&hd=001/145,98,55&ey=001&fc=001/145,98,55&hr=008/145,98,55&rs=002/255,255,255&ls=002/255,255,255&bd=001/8', '26,10 27,10 28,10', 60, '', '', '', 'Tea,Cola,Drink;Water'), + (29, 'Skye', 'On the top of the world', 3, 0, '4,4', 'sd=001&sh=002/148,98,32&lg=003/84,98,139&ch=022/97,114,164&lh=001/215,175,125&rh=001/215,175,125&hd=001/215,175,125&ey=001&fc=001/215,175,125&hr=503/235,240,163&rs=002/97,114,164&ls=002/97,114,164&bd=001/215,175,125', '1,0 2,0 3,0 4,0', 14, 'Above the clouds, freedom must be limitless...|I\'m sooo tired! *yawn*', 'Sure.|Roger that.', 'Hi, how can I help?|I can\'t hear you, the air is too thin up here!#WHISPER', 'Cola,Coke,Coffee,Latte'), + (31, 'Jem', 'Don\'t look down', 1, 10, '2,2', 'sd=001&sh=002/255,115,131&lg=005/255,115,131&ch=015/255,189,189&lh=001/230,200,162&rh=001/230,200,162&hd=001/230,200,162&ey=002&fc=001/230,200,162&hr=501/165,90,24&hrb=501/2,3,4&rs=003/230,200,162&ls=003/230,200,162&bd=001/230,200,162', '0,8 0,9 0,10 0,11 0,12 0,13 1,8 1,9 1,10 1,11 1,12 1,13 1,14', 38, 'Quiet please, I\'m thinking#SHOUT|Purchase tickets at the machine by the pool.|It makes me dizzy to move too quickly!|Drink anyone?|Gerbils are good :)|Calm down|Habbo Staff making Habbos smile since 2001', 'There you go.', 'You calling? I\'m listening...|I\'m with ya...What\'s up?|Jem\'s the name, drinks are my game|That\'s my name, don\'t wear it out!', 'Water,Cola,Lemonade'), + (32, 'Gino', 'The master of pizza!', 1, 4, '4,4', 'sd=001&sh=001/255,0,0&lg=001/255,255,255&ch=995/255,255,255&lh=001/254,202,1508&rh=001/254,202,1508&hd=001/254,202,150&ey=001/254,202,150&fc=001/254,202,1508&hr=802/255,255,255&rs=002/255,255,255&ls=002/255,255,255&bd=001/254,202,150', '0,2 0,3 0,4 1,2 1,3 1,4', 15, 'Grab a pizza and enjoy the magnificent view!', '', '', ''), + (33, 'Carlo', 'The master of pizza', 1, 3, '4,4', 'sd=001/0&hr=799/255,255,255&hd=002/255,204,153&ey=001/0&fc=001/255,204,153&bd=001/255,204,153&lh=001/255,204,153&rh=001/255,204,153&ch=003/255,255,255&ls=001/255,255,255&rs=001/255,255,255&lg=004/255,255,255&sh=004/255,255,255', '1,1 2,1 3,1 4,1 5,1', 15, 'Food of the gods.|Gino, do not forget to wash the dishes!', 'Would you like a drink with that?|Not a problem', 'I don\'t understand you.#WHISPER', 'Pizza,Water,Drink'), + (38, 'Ingemar', 'Snowballs, schnowballs', 39, 18, '4,4', 'sd=001&sh=001/255,255,255&lg=006/255,255,255&ch=001/255,255,255&lh=001/145,98,55&rh=001/145,98,55&hd=001/215,175,125&ey=001&fc=001/145,98,55&ha=10/255,255,255&rs=001/255,255,255&ls=001/255,255,255&bd=001/255,203,152', '37,17 37,18 38,18 39,18 40,18', 67, 'You people are my best customer ever, I like you.|Somewhere in America, there\'s a street named after my dad|Snowballmachines give you snowballs fast|Use the scenery to your advantage', '', 'Watcha! Welcome to the coolest club in the whole hotel', 'Coffee,Latte'), + (39, 'Lofar', 'Service without gravity :)', 2, 0, '4,4', 'sd=001&sh=001/194,227,232&lg=001/255,255,255&ch=001/255,255,255&lh=001/240,213,179&rh=001/240,213,179&hd=001/240,213,179&ey=001/254,202,150&fc=001/240,213,179&hr=888/255,255,255&rs=001/255,255,255&ls=001/255,255,255&bd=001/240,213,179', '1,0 2,0 3,0 4,0 1,1 2,1 3,1 4,1', 12, 'This cafe is out of this world...|A space fish is usually called starfish.|I would have gone to space, but the cost is astronomical!|Two astronauts who were dating, met up for a launch date.|Becoming a space pilot is not easy. It requires a good altitude.', 'Here you go!|Drink up!|Here\'s the %drink%|Spacylicious!', 'Sorry, I can\'t hear you in this space suit|What\'s that? Must be the lack of gravity', 'Drink,Water,Cola'), + (40, 'Eric ', ':)', 1, 15, '2,2', 'sd=001&sh=001/36&lg=201&ch=005/163,20,20&lh=001/171,122,89&rh=001/171,122,89&hd=001/171,122,89&ey=001&fc=001/171,122,89&hr=014/255,255,255&rs=002/163,20,20&ls=002/163,20,20&bd=001/8 look=2,2', '9,18 9,16 9,17 9,19 9,20 9,21 9,22 9,23 8,18 8,16 8,17 8,19 8,20 8,21 8,22 8,23', 6, '', '', '', ''), + (41, 'Laura', 'Keeps you cool', 15, 3, '4,4', 'sd=001&sh=002/148,98,32&lg=005/230,49,57&ch=911/255,255,255&lh=001/215,175,125&rh=001/215,175,125&hd=001/215,175,125&ey=001&fc=001/215,175,125&hr=017/103,78,59&rs=002/255,255,255&ls=002/255,255,255&bd=001/215,175,125', '14,3 15,3', 31, 'Has anyone seen my bikini? I need to cool down!#SHOUT', '', '', ''), + (42, 'Ray', 'Chill out and have a coconut!', 22, 26, '2,2', 'sd=001&hd=001/201,143,113&fc=001/201,143,113&bd=001/201,143,113&rh=001/201,143,113&lh=001/201,143,113&hr=504/223,218,190&lg=201/230,49,57&sh=002/246,172,49&rs=003/201,143,113&ls=003/201,143,113&ch=501/246,172,49look=2,2', '22,24 23,24 22,25 23,25 22,26 23,26 22,27 23,27 22,28 23,28 22,29 23,29 22,30 23,30', 25, 'Official Fansite are voted by YOU, the Habbo community!|Did you know the Official Fansites are changed every 3 months?|If they aren\'t listed once you click the billboard then they aren\'t Official!|Once refreshed, visit an Official Fansite!|Click the billboard now to visit our Official Fansites!|Official Fansites have great events, comps and radio shows!', 'Refreshing!|Here you are, with extra coconut milk, only for you ;)|Here you go, hope you like the umbrella.|You sure are thirsty, huh?|You can only have one at a time!|That\'s my name! As in the beams of golden sunshine and not the sunglasses.|Hi my name is what? my name is who? my name is...ray', '', 'Cola,Coke,Coconut Milk'), + (43, 'Tao', 'Tea is serenity', 10, 4, '4,4', 'sd=001&sh=001/36&lg=001&ch=002/163,20,20&lh=001/171,122,89&rh=001/171,122,89&hd=001/171,122,89&ey=001&fc=001/171,122,89&hr=791/255,255,255&rs=001/163,20,20&ls=001/163,20,20&bd=001/8', '8,2 9,2 10,2 11,2 8,3 9,3 10,3 11,3 8,4 9,4 10,4 11,4', 18, '', '', '', 'Tea,Drink'), + (44, 'Harry', 'Happy to help', 8, 21, '2,2', 'sd=001&sh=003/41,41,41&lg=006/51,51,51&ch=202/139,24,32&lh=001/255,210,179&rh=001/255,210,179&hd=001/255,204,153&ey=001&fc=001/255,204,153&hr=203/103,78,59&hrb=203/2,3,4&rs=001/255,255,255&ls=001/255,255,255&bd=001/255,204,153', '9,18 9,16 9,17 9,19 9,20 9,21 9,22 9,23 8,18 8,16 8,17 8,19 8,20 8,21 8,22 8,23', 1, 'Please keep it down people are trying to think!#SHOUT|Only use the Call for help in an emergency!|Want to know more about Habbo Hotel? Ask a Habbo Guide!|Is it me or is something BIG about to happen?|In Trouble? Call for Moderator assistance using the Blue Question Mark!|There\'s no such thing as a free lunch or free credits!', 'Why Hello there! *Shakes Habbo Hand* My name\'s Harry.|Hello, Hello, Hello!|Hello and welcome to Habbo Hotel! Enjoy your stay! :)', 'Why Hello there! *Shakes Habbo Hand* My name\'s Harry.|Hello, Hello, Hello!|\r\nHello and welcome to Habbo Hotel! Enjoy your stay! :)', 'Water'), + (45, 'Miho', 'My katana thinks you\'re cute!', 14, 25, '2,2', 'sd=001&sh=001/36&lg=200/204,204,204&ch=204/204,204,204&lh=001/215,175,125&rh=001/215,175,125&hd=001/215,175,125&ey=001&fc=001/215,175,125&hr=504/50,91,106&rs=002/204,204,204&ls=002/204,204,204&bd=001/8', '14,24 14,25', 27, 'Zen Garden is the ultimate in relaxation|Listen to the breeze blowing through the leaves|Welcome to my garden a place of quiet reflection...|Listen to the breeze blowing through the leaves...', 'I hope you make peace with this|Relax with this|Relaxation can be achieved this this', 'That is my name.|Say again - it\'s a bit noisy in here#WHISPER|You bring confusion to my mind, and pain to my ears...#WHISPER|', 'Water'); +/*!40000 ALTER TABLE `rooms_bots` ENABLE KEYS */; + +-- Dumping structure for table havana.rooms_categories +CREATE TABLE IF NOT EXISTS `rooms_categories` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `order_id` int(11) NOT NULL, + `parent_id` int(11) NOT NULL, + `isnode` int(11) DEFAULT 0, + `name` varchar(255) NOT NULL, + `public_spaces` int(11) DEFAULT 0, + `allow_trading` int(11) DEFAULT 0, + `minrole_access` int(11) DEFAULT 1, + `minrole_setflatcat` int(11) DEFAULT 1, + `club_only` tinyint(4) NOT NULL DEFAULT 0, + `is_top_priority` int(1) NOT NULL DEFAULT 0, + PRIMARY KEY (`id`), + UNIQUE KEY `id` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=122 DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.rooms_categories: ~22 rows (approximately) +DELETE FROM `rooms_categories`; +/*!40000 ALTER TABLE `rooms_categories` DISABLE KEYS */; +INSERT INTO `rooms_categories` (`id`, `order_id`, `parent_id`, `isnode`, `name`, `public_spaces`, `allow_trading`, `minrole_access`, `minrole_setflatcat`, `club_only`, `is_top_priority`) VALUES + (2, 0, 0, 0, 'No category', 0, 0, 1, 1, 0, 0), + (3, 0, 0, 1, 'Public Rooms', 1, 0, 1, 6, 0, 0), + (4, 0, 0, 1, 'Guest Rooms', 0, 0, 1, 6, 0, 0), + (5, 0, 3, 0, 'Entertainment', 1, 0, 1, 6, 0, 0), + (6, 0, 3, 0, 'Restaurants and Cafes', 1, 0, 1, 6, 0, 0), + (7, 0, 3, 0, 'Lounges and Clubs', 1, 0, 1, 6, 0, 0), + (8, 0, 3, 0, 'Habbo Club', 1, 0, 1, 6, 0, 0), + (9, 0, 3, 0, 'Outside Spaces', 1, 0, 1, 6, 0, 0), + (10, 0, 3, 0, 'Swimming Pools', 1, 0, 1, 6, 0, 0), + (11, 0, 3, 0, 'The Lobbies', 1, 0, 1, 6, 0, 0), + (12, -1, 3, 0, 'The Hallways', 1, 0, 1, 6, 0, 0), + (13, 0, 3, 0, 'Games', 1, 0, 1, 6, 0, 0), + (101, 0, 4, 0, 'Staff HQ', 0, 1, 4, 5, 0, 0), + (112, 0, 4, 0, 'Restaurant, Bar & Night Club Rooms', 0, 0, 1, 1, 0, 0), + (113, 0, 4, 0, 'Trade floor', 0, 1, 1, 1, 0, 0), + (114, 0, 4, 0, 'Chill, Chat & Discussion Rooms', 0, 0, 1, 1, 0, 0), + (115, 0, 4, 0, 'Hair Salons & Modelling Rooms', 0, 0, 1, 1, 0, 0), + (116, 0, 4, 0, 'Maze & Theme Park Rooms', 0, 0, 1, 1, 0, 0), + (117, 0, 4, 0, 'Gaming & Race Rooms', 0, 1, 1, 1, 0, 0), + (118, 0, 4, 0, 'Help Centre Rooms', 0, 0, 1, 1, 0, 0), + (120, 0, 4, 0, 'Miscellaneous', 0, 0, 1, 1, 0, 0), + (121, 0, 4, 0, 'Flower Power Puzzle', 0, 1, 1, 5, 0, 1); +/*!40000 ALTER TABLE `rooms_categories` ENABLE KEYS */; + +-- Dumping structure for table havana.rooms_entry_badges +CREATE TABLE IF NOT EXISTS `rooms_entry_badges` ( + `room_id` int(11) NOT NULL, + `badge` varchar(15) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.rooms_entry_badges: ~0 rows (approximately) +DELETE FROM `rooms_entry_badges`; +/*!40000 ALTER TABLE `rooms_entry_badges` DISABLE KEYS */; +/*!40000 ALTER TABLE `rooms_entry_badges` ENABLE KEYS */; + +-- Dumping structure for table havana.rooms_events +CREATE TABLE IF NOT EXISTS `rooms_events` ( + `room_id` int(11) NOT NULL, + `user_id` int(11) NOT NULL, + `category_id` int(11) NOT NULL, + `name` varchar(255) NOT NULL, + `description` text NOT NULL, + `expire_time` bigint(11) NOT NULL, + `tags` text NOT NULL DEFAULT '', + PRIMARY KEY (`room_id`), + UNIQUE KEY `room_id` (`room_id`), + KEY `expire_time` (`expire_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.rooms_events: ~0 rows (approximately) +DELETE FROM `rooms_events`; +/*!40000 ALTER TABLE `rooms_events` DISABLE KEYS */; +/*!40000 ALTER TABLE `rooms_events` ENABLE KEYS */; + +-- Dumping structure for table havana.rooms_models +CREATE TABLE IF NOT EXISTS `rooms_models` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `model_id` varchar(255) NOT NULL, + `model_name` varchar(255) NOT NULL, + `door_x` int(11) NOT NULL DEFAULT 0, + `door_y` int(11) NOT NULL DEFAULT 0, + `door_z` double NOT NULL DEFAULT 0, + `door_dir` int(11) NOT NULL DEFAULT 2, + `heightmap` text NOT NULL DEFAULT '', + `trigger_class` enum('flat_trigger','battleball_lobby_trigger','snowstorm_lobby_trigger','space_cafe_trigger','habbo_lido_trigger','rooftop_rumble_trigger','diving_deck_trigger','infobus_park','infobus_poll','none') NOT NULL DEFAULT 'flat_trigger', + PRIMARY KEY (`id`), + KEY `id` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=92 DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.rooms_models: ~91 rows (approximately) +DELETE FROM `rooms_models`; +/*!40000 ALTER TABLE `rooms_models` DISABLE KEYS */; +INSERT INTO `rooms_models` (`id`, `model_id`, `model_name`, `door_x`, `door_y`, `door_z`, `door_dir`, `heightmap`, `trigger_class`) VALUES + (1, 'model_a', 'model_a', 3, 5, 0, 2, 'xxxxxxxxxxxx|xxxx00000000|xxxx00000000|xxxx00000000|xxxx00000000|xxxx00000000|xxxx00000000|xxxx00000000|xxxx00000000|xxxx00000000|xxxx00000000|xxxx00000000|xxxx00000000|xxxx00000000|xxxxxxxxxxxx|xxxxxxxxxxxx', 'flat_trigger'), + (2, 'model_b', 'model_b', 0, 5, 0, 2, 'xxxxxxxxxxxx|xxxxx0000000|xxxxx0000000|xxxxx0000000|xxxxx0000000|x00000000000|x00000000000|x00000000000|x00000000000|x00000000000|x00000000000|xxxxxxxxxxxx|xxxxxxxxxxxx|xxxxxxxxxxxx|xxxxxxxxxxxx|xxxxxxxxxxxx', 'flat_trigger'), + (3, 'model_c', 'model_c', 4, 7, 0, 2, 'xxxxxxxxxxxx|xxxxxxxxxxxx|xxxxxxxxxxxx|xxxxxxxxxxxx|xxxxxxxxxxxx|xxxxx000000x|xxxxx000000x|xxxxx000000x|xxxxx000000x|xxxxx000000x|xxxxx000000x|xxxxxxxxxxxx|xxxxxxxxxxxx|xxxxxxxxxxxx|xxxxxxxxxxxx|xxxxxxxxxxxx', 'flat_trigger'), + (4, 'model_d', 'model_d', 4, 7, 0, 2, 'xxxxxxxxxxxx|xxxxx000000x|xxxxx000000x|xxxxx000000x|xxxxx000000x|xxxxx000000x|xxxxx000000x|xxxxx000000x|xxxxx000000x|xxxxx000000x|xxxxx000000x|xxxxx000000x|xxxxx000000x|xxxxx000000x|xxxxx000000x|xxxxxxxxxxxx', 'flat_trigger'), + (5, 'model_e', 'model_e', 1, 5, 0, 2, 'xxxxxxxxxxxx|xxxxxxxxxxxx|xxxxxxxxxxxx|xx0000000000|xx0000000000|xx0000000000|xx0000000000|xx0000000000|xx0000000000|xx0000000000|xx0000000000|xxxxxxxxxxxx|xxxxxxxxxxxx|xxxxxxxxxxxx|xxxxxxxxxxxx|xxxxxxxxxxxx', 'flat_trigger'), + (6, 'model_f', 'model_f', 2, 5, 0, 2, 'xxxxxxxxxxxx|xxxxxxx0000x|xxxxxxx0000x|xxx00000000x|xxx00000000x|xxx00000000x|xxx00000000x|x0000000000x|x0000000000x|x0000000000x|x0000000000x|xxxxxxxxxxxx|xxxxxxxxxxxx|xxxxxxxxxxxx|xxxxxxxxxxxx|xxxxxxxxxxxx', 'flat_trigger'), + (7, 'model_g', 'model_g', 1, 7, 1, 2, 'xxxxxxxxxxxxx|xxxxxxxxxxxxx|xxxxxxx00000x|xxxxxxx00000x|xxxxxxx00000x|xx1111000000x|xx1111000000x|xx1111000000x|xx1111000000x|xx1111000000x|xxxxxxx00000x|xxxxxxx00000x|xxxxxxx00000x|xxxxxxxxxxxxx|xxxxxxxxxxxxx|xxxxxxxxxxxxx|xxxxxxxxxxxxx', 'flat_trigger'), + (8, 'model_h', 'model_h', 4, 4, 1, 2, 'xxxxxxxxxxxx|xxxxxxxxxxxx|xxxxx111111x|xxxxx111111x|xxxxx111111x|xxxxx111111x|xxxxx111111x|xxxxx000000x|xxxxx000000x|xxx00000000x|xxx00000000x|xxx00000000x|xxx00000000x|xxxxxxxxxxxx|xxxxxxxxxxxx|xxxxxxxxxxxx', 'flat_trigger'), + (9, 'model_i', 'model_i', 0, 10, 0, 2, 'xxxxxxxxxxxxxxxxx|x0000000000000000|x0000000000000000|x0000000000000000|x0000000000000000|x0000000000000000|x0000000000000000|x0000000000000000|x0000000000000000|x0000000000000000|x0000000000000000|x0000000000000000|x0000000000000000|x0000000000000000|x0000000000000000|x0000000000000000|x0000000000000000|x0000000000000000|x0000000000000000|x0000000000000000|x0000000000000000|x0000000000000000|x0000000000000000|x0000000000000000|x0000000000000000|x0000000000000000|x0000000000000000|xxxxxxxxxxxxxxxxx', 'flat_trigger'), + (10, 'model_j', 'model_j', 0, 10, 0, 2, 'xxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxx0000000000|xxxxxxxxxxx0000000000|xxxxxxxxxxx0000000000|xxxxxxxxxxx0000000000|xxxxxxxxxxx0000000000|xxxxxxxxxxx0000000000|x00000000000000000000|x00000000000000000000|x00000000000000000000|x00000000000000000000|x00000000000000000000|x00000000000000000000|x00000000000000000000|x00000000000000000000|x00000000000000000000|x00000000000000000000|x0000000000xxxxxxxxxx|x0000000000xxxxxxxxxx|x0000000000xxxxxxxxxx|x0000000000xxxxxxxxxx|x0000000000xxxxxxxxxx|x0000000000xxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxx', 'flat_trigger'), + (11, 'model_k', 'model_k', 0, 13, 0, 2, 'xxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxx00000000|xxxxxxxxxxxxxxxxx00000000|xxxxxxxxxxxxxxxxx00000000|xxxxxxxxxxxxxxxxx00000000|xxxxxxxxx0000000000000000|xxxxxxxxx0000000000000000|xxxxxxxxx0000000000000000|xxxxxxxxx0000000000000000|x000000000000000000000000|x000000000000000000000000|x000000000000000000000000|x000000000000000000000000|x000000000000000000000000|x000000000000000000000000|x000000000000000000000000|x000000000000000000000000|xxxxxxxxx0000000000000000|xxxxxxxxx0000000000000000|xxxxxxxxx0000000000000000|xxxxxxxxx0000000000000000|xxxxxxxxx0000000000000000|xxxxxxxxx0000000000000000|xxxxxxxxx0000000000000000|xxxxxxxxx0000000000000000|xxxxxxxxx0000000000000000|xxxxxxxxx0000000000000000|xxxxxxxxxxxxxxxxxxxxxxxxx', 'flat_trigger'), + (12, 'model_l', 'model_l', 0, 16, 0, 2, 'xxxxxxxxxxxxxxxxxxxxx|x00000000000000000000|x00000000000000000000|x00000000000000000000|x00000000000000000000|x00000000000000000000|x00000000000000000000|x00000000000000000000|x00000000000000000000|x00000000xxxx00000000|x00000000xxxx00000000|x00000000xxxx00000000|x00000000xxxx00000000|x00000000xxxx00000000|x00000000xxxx00000000|x00000000xxxx00000000|x00000000xxxx00000000|x00000000xxxx00000000|x00000000xxxx00000000|x00000000xxxx00000000|x00000000xxxx00000000|xxxxxxxxxxxxxxxxxxxxx', 'flat_trigger'), + (13, 'model_m', 'model_m', 0, 15, 0, 2, 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxx00000000xxxxxxxxxx|xxxxxxxxxxx00000000xxxxxxxxxx|xxxxxxxxxxx00000000xxxxxxxxxx|xxxxxxxxxxx00000000xxxxxxxxxx|xxxxxxxxxxx00000000xxxxxxxxxx|xxxxxxxxxxx00000000xxxxxxxxxx|xxxxxxxxxxx00000000xxxxxxxxxx|xxxxxxxxxxx00000000xxxxxxxxxx|xxxxxxxxxxx00000000xxxxxxxxxx|xxxxxxxxxxx00000000xxxxxxxxxx|x0000000000000000000000000000|x0000000000000000000000000000|x0000000000000000000000000000|x0000000000000000000000000000|x0000000000000000000000000000|x0000000000000000000000000000|x0000000000000000000000000000|x0000000000000000000000000000|xxxxxxxxxxx00000000xxxxxxxxxx|xxxxxxxxxxx00000000xxxxxxxxxx|xxxxxxxxxxx00000000xxxxxxxxxx|xxxxxxxxxxx00000000xxxxxxxxxx|xxxxxxxxxxx00000000xxxxxxxxxx|xxxxxxxxxxx00000000xxxxxxxxxx|xxxxxxxxxxx00000000xxxxxxxxxx|xxxxxxxxxxx00000000xxxxxxxxxx|xxxxxxxxxxx00000000xxxxxxxxxx|xxxxxxxxxxx00000000xxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'flat_trigger'), + (14, 'model_n', 'model_n', 0, 16, 0, 2, 'xxxxxxxxxxxxxxxxxxxxx|x00000000000000000000|x00000000000000000000|x00000000000000000000|x00000000000000000000|x00000000000000000000|x00000000000000000000|x000000xxxxxxxx000000|x000000x000000x000000|x000000x000000x000000|x000000x000000x000000|x000000x000000x000000|x000000x000000x000000|x000000x000000x000000|x000000xxxxxxxx000000|x00000000000000000000|x00000000000000000000|x00000000000000000000|x00000000000000000000|x00000000000000000000|x00000000000000000000|xxxxxxxxxxxxxxxxxxxxx', 'flat_trigger'), + (15, 'model_o', 'model_o', 0, 18, 1, 2, 'xxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxx11111111xxxx|xxxxxxxxxxxxx11111111xxxx|xxxxxxxxxxxxx11111111xxxx|xxxxxxxxxxxxx11111111xxxx|xxxxxxxxxxxxx11111111xxxx|xxxxxxxxxxxxx11111111xxxx|xxxxxxxxxxxxx11111111xxxx|xxxxxxxxxxxxx00000000xxxx|xxxxxxxxx0000000000000000|xxxxxxxxx0000000000000000|xxxxxxxxx0000000000000000|xxxxxxxxx0000000000000000|xxxxxxxxx0000000000000000|xxxxxxxxx0000000000000000|x111111100000000000000000|x111111100000000000000000|x111111100000000000000000|x111111100000000000000000|x111111100000000000000000|x111111100000000000000000|x111111100000000000000000|x111111100000000000000000|xxxxxxxxx0000000000000000|xxxxxxxxx0000000000000000|xxxxxxxxx0000000000000000|xxxxxxxxx0000000000000000|xxxxxxxxxxxxxxxxxxxxxxxxx', 'flat_trigger'), + (16, 'model_p', 'model_p', 0, 23, 2, 2, 'xxxxxxxxxxxxxxxxxxx|xxxxxxx222222222222|xxxxxxx222222222222|xxxxxxx222222222222|xxxxxxx222222222222|xxxxxxx222222222222|xxxxxxx222222222222|xxxxxxx22222222xxxx|xxxxxxx11111111xxxx|x222221111111111111|x222221111111111111|x222221111111111111|x222221111111111111|x222221111111111111|x222221111111111111|x222221111111111111|x222221111111111111|x2222xx11111111xxxx|x2222xx00000000xxxx|x2222xx000000000000|x2222xx000000000000|x2222xx000000000000|x2222xx000000000000|x2222xx000000000000|x2222xx000000000000|xxxxxxxxxxxxxxxxxxx', 'flat_trigger'), + (17, 'model_q', 'model_q', 10, 4, 2, 2, 'xxxxxxxxxxxxxxxxxxx|xxxxxxxxxxx22222222|xxxxxxxxxxx22222222|xxxxxxxxxxx22222222|xxxxxxxxxxx22222222|xxxxxxxxxxx22222222|xxxxxxxxxxx22222222|x222222222222222222|x222222222222222222|x222222222222222222|x222222222222222222|x222222222222222222|x222222222222222222|x2222xxxxxxxxxxxxxx|x2222xxxxxxxxxxxxxx|x2222211111xx000000|x222221111110000000|x222221111110000000|x2222211111xx000000|xx22xxx1111xxxxxxxx|xx11xxx1111xxxxxxxx|x1111xx1111xx000000|x1111xx111110000000|x1111xx111110000000|x1111xx1111xx000000|xxxxxxxxxxxxxxxxxxx', 'flat_trigger'), + (18, 'model_r', 'model_r', 10, 4, 3, 2, 'xxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxx33333333333333|xxxxxxxxxxx33333333333333|xxxxxxxxxxx33333333333333|xxxxxxxxxxx33333333333333|xxxxxxxxxxx33333333333333|xxxxxxxxxxx33333333333333|xxxxxxx333333333333333333|xxxxxxx333333333333333333|xxxxxxx333333333333333333|xxxxxxx333333333333333333|xxxxxxx333333333333333333|xxxxxxx333333333333333333|x4444433333xxxxxxxxxxxxxx|x4444433333xxxxxxxxxxxxxx|x44444333333222xx000000xx|x44444333333222xx000000xx|xxx44xxxxxxxx22xx000000xx|xxx33xxxxxxxx11xx000000xx|xxx33322222211110000000xx|xxx33322222211110000000xx|xxxxxxxxxxxxxxxxx000000xx|xxxxxxxxxxxxxxxxx000000xx|xxxxxxxxxxxxxxxxx000000xx|xxxxxxxxxxxxxxxxx000000xx|xxxxxxxxxxxxxxxxxxxxxxxxx', 'flat_trigger'), + (19, 'newbie_lobby', 'newbie_lobby', 2, 11, 0, 2, 'xxxxxxxxxxxxxxxx000000|xxxxx0xxxxxxxxxx000000|xxxxx00000000xxx000000|xxxxx000000000xx000000|0000000000000000000000|0000000000000000000000|0000000000000000000000|0000000000000000000000|0000000000000000000000|xxxxx000000000000000xx|xxxxx000000000000000xx|x0000000000000000000xx|x0000000000000000xxxxx|xxxxxx00000000000xxxxx|xxxxxxx0000000000xxxxx|xxxxxxxx000000000xxxxx|xxxxxxxx000000000xxxxx|xxxxxxxx000000000xxxxx|xxxxxxxx000000000xxxxx|xxxxxxxx000000000xxxxx|xxxxxxxx000000000xxxxx|xxxxxx00000000000xxxxx|xxxxxx00000000000xxxxx|xxxxxx00000000000xxxxx|xxxxxx00000000000xxxxx|xxxxxx00000000000xxxxx|xxxxx000000000000xxxxx|xxxxx000000000000xxxxx', 'none'), + (20, 'theater', 'theater', 20, 27, 0, 0, 'XXXXXXXXXXXXXXXXXXXXXXX|XXXXXXXXXXXXXXXXXXXXXXX|XXXXXXXXXXXXXXXXXXXXXXX|XXXXXXXXXXXXXXXXXXXXXXX|XXXXXXXXXXXXXXXXXXXXXXX|XXXXXXXXXXXXXXXXXXXXXXX|XXXXXXX111111111XXXXXXX|XXXXXXX11111111100000XX|XXXX00X11111111100000XX|XXXX00x11111111100000XX|4XXX00X11111111100000XX|4440000XXXXXXXXX00000XX|444000000000000000000XX|4XX000000000000000000XX|4XX0000000000000000000X|44400000000000000000000|44400000000000000000000|44X0000000000000000O000|44X11111111111111111000|44X11111111111111111000|33X11111111111111111000|22X11111111111111111000|22X11111111111111111000|22X11111111111111111000|22X11111111111111111000|22X11111111111111111000|22211111111111111111000|22211111111111111111000|XXXXXXXXXXXXXXXXXXXX00X|XXXXXXXXXXXXXXXXXXXX00X', 'none'), + (21, 'library', 'library', 20, 3, 1, 4, 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxx11111xx1xx1x111111x|xxxxxxxxxxxx111111xx1xx11111111x|xx111xxxxxxx111111xx1xx11111111x|xx111xxxxxxx1111111111111111111x|xx111xxxxxxx1111111111111111111x|xx111xxxxxxx1111111111111111111x|xx111xxxxxxx1111111111111xxxxxxx|xx111xxxxxx11111111111111111111x|xx111xxxxxx11111111111111111111x|xx111xxxxxx11111111111111111111x|xx111xxxxxx11111111111111xxxxxxx|xx111xxxxxxxx111111111111111111x|xx111xx11111x111111111111111111x|xx111xx11111x111111111111111111x|xx111xxxxx11x11111111x111xxxxxxx|xx111xxxxxxxx11111111xx11111111x|xx111xxx1111111111111xxx1111111x|xx111xxx1111111111111xxxx111111x|xxx111xx1111111111x11xxxx000000x|xxxxx1111xx1111111x11xxxx000000x|xxxxxxxxxxxx111111x11xxxx000000x|xxxxxxxxxxxx11xx11x11xxxx000000x|xxxxxxxxxxxx11xx11x11xxxx000000x|xxxxxxxxxxxx11xx11x11xxxx000000x|xxxxxxxxxxxx11xx11x11xxxx000000x|xxxxxxxxxxxx11xx11x11xxxx000000x|xxxxxxxxxxxx11xx11x111xxx000000x|xxxxxxxxxxxxxxxxxxxx11xxx000000x|xxxxxxxxxxxxxxxxxxxx11xxxxxxxxxx|xxxxxxxxxxxxxxxxxxxx22222xxxxxxx|xxxxxxxxxxxxxxxxxxxx22222xxxxxxx|xxxxxxxxxxxxxxxxxxxx22222xxxxxxx|xxxxxxxxxxxxxxxxxxxx22222xxxxxxx|xxxxxxxxxxxxxxxxxxxx22222xxxxxxx|xxxxxxxxxxxxxxxxxxxx22222xxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'none'), + (22, 'floatinggarden', 'floatinggarden', 2, 21, 5, 4, 'xxxxxxxxxxxxxxxx333333xxxxxxxxx|xxxxxxxxxxxxxxxx3xxxx3xxxxxxxxx|xxxxxxxxxxxxxxxx3xxxx3xxxxxxxxx|xxxxxxxxxxxxxxxx3xxxx3xxxxxxxxx|xxxxxxxxxxxxxxx223xxx33xxxxxxxx|xxxxxxxxxxxxxxx11xxx33333xxxxxx|xxxxxxxxxxxxxxxx11xx3333333xxxx|xxxxxxxxxxxxxxxx11xx33333333xxx|xxxxxxxxxxxxxxxxx11xxxxxxxx3xxx|xxxxxxxxxxxxxxxxxx11xxxx3333xxx|xxxxxxxxxxxxxxxxxxx1xxxx33333xx|xxxxxxxxxxxxxxxxxxx1xxx3333333x|555xxxxxxxxxxx1111111x333333333|555xxxxxxxxxxx21111111xxxxxx333|555xxxxxxxxxxx22111111111xxxxxx|555xxxxxxxxxxx222xxxxxxx111xxxx|555xxxxxxxxxxx22xxxxxxxxxx1xxxx|555xxxxxxxxxxx23333333333x111xx|555xxxxxxxx33333333333333x111xx|555xxxxxxxx333333x3333333x111xx|555xxxxxxxx33333333333333x111xx|555xxxxxxxx33x33333333333x111xx|555xxxxxxxx33x33x33333333x111xx|555xxxxxxxx33x33x33333333x111xx|5554333333333x333x3333333x111xx|x554333333xxxx33xxxxxxxxxx111xx|xxxxxxxxx3xxxx333221111111111xx|xxxxxxxxx3xxxx333221111111111xx|xxxxxxxxx33333333xx1111x11x11xx|xxxxxxxxx33333333111xxx11xxxxxx|xxxxxxxxxxxxxx33311xxxx11xxxxxx|xxxxxxxxxxxxxx33311xxxx11xxxxxx|xxxxxxxxxxxxxx333x1xxxx11xxxxxx|xxxxxxxxxxxxxx333x1xx111111xxxx|xxxxxxxxxxxxxx33311xx111111xxxx|xxxxxxxxxx333333311xx111111xxxx|xxxxxxxxxxx33333311xx111111xxxx|xxxxxxxxxxxxxxxx111xxxxxxxxxxxx|xxxxxxxxxxxxxxx111xxxxxxxxxxxxx', 'none'), + (23, 'sunset_cafe', 'sunset_cafe', 34, 40, 0, 0, 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx000000xxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0000000xxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxx00000xx00000000xxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxx000000000000000000xxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxx000000000000000000xxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxx000000000000000000xxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxx000000000000000000xxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxx00000000xxx0000000xxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxx00000000xxxx000000xxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxx00000000xxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxx0000000000000000xxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxx00000000000000000xxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxx00000000000000000xxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxx00000000000000000xxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxx00000000000000000xxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxx00000000000000000xxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx00000000xxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0000000xxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0000xxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0000xxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0000xxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'none'), + (24, 'pool_a', 'pool_a', 2, 25, 7, 2, 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxx7xxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxx777xxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxx7777777xxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxx77777777xxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxx77777777xxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxx777777777xxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxx7xxx777777xxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxx7x777777777xxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxx7xxx77777777xxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxx7x777777777x7xxxxxxxxxxxxxxx|xxxxxxxxxxxxxxx7xxx7777777777xxxxxxxxxxxxxx|xxxxxxxxxxxxxxx777777777777xxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxx77777777777x2111xxxxxxxxxxxx|xxxxxxxxxxxxxxx7777777777x221111xxxxxxxxxxx|xxxxxxxxx7777777777777777x2211111xxxxxxxxxx|xxxxxxxxx7777777777777777x22211111xxxxxxxxx|xxxxxxxxx7777777777777777x222211111xxxxxxxx|xxxxxx77777777777777777777x222211111xxxxxxx|xxxxxx7777777xx777777777777x222211111xxxxxx|xxxxxx7777777xx77777777777772222111111xxxxx|xxxxxx777777777777777777777x22221111111xxxx|xx7777777777777777777777x322222211111111xxx|77777777777777777777777x33222222111111111xx|7777777777777777777777x333222222211111111xx|xx7777777777777777777x333322222222111111xxx|xx7777777777777777777333332222222221111xxxx|xx777xxx777777777777733333222222222211xxxxx|xx777x7x77777777777773333322222222222xxxxxx|xx777x7x7777777777777x33332222222222xxxxxxx|xxx77x7x7777777777777xx333222222222xxxxxxxx|xxxx77777777777777777xxx3222222222xxxxxxxxx|xxxxx777777777777777777xx22222222xxxxxxxxxx|xxxxxx777777777777777777x2222222xxxxxxxxxxx|xxxxxxx777777777777777777222222xxxxxxxxxxxx|xxxxxxxx7777777777777777722222xxxxxxxxxxxxx|xxxxxxxxx77777777777777772222xxxxxxxxxxxxxx|xxxxxxxxxx777777777777777222xxxxxxxxxxxxxxx|xxxxxxxxxxx77777777777777x2xxxxxxxxxxxxxxxx|xxxxxxxxxxxx77777777777777xxxxxxxxxxxxxxxxx|xxxxxxxxxxxxx777777777777xxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxx7777777777xxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxx77777777xxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxx777777xxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxx7777xxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxx77xxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'habbo_lido_trigger'), + (25, 'pub_a', 'pub_a', 15, 25, 0, 0, 'xxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxx2222211111xxx|xxxxxxxxx2222222211111xxx|xxxxxxxxx2222222211111xxx|xxxxxxxxx2222222211111xxx|xxxxxxxxx2222222222111xxx|xxxxxxxxx2222222222111xxx|xxxxxxxxx2222222222000xxx|xxxxxxxxx2222222222000xxx|xxxxxxxxx2222222222000xxx|xxxxxxxxx2222222222000xxx|x333333332222222222000xxx|x333333332222222222000xxx|x333333332222222222000xxx|x333333332222222222000xxx|x333333332222222222000xxx|x333332222222222222000xxx|x333332222222222222000xxx|x333332222222222222000xxx|x333332222222222222000xxx|x333333332222222222000xxx|xxxxx31111112222222000xxx|xxxxx31111111000000000xxx|xxxxx31111111000000000xxx|xxxxx31111111000000000xxx|xxxxx31111111000000000xxx|xxxxxxxxxxxxxxx00xxxxxxxx|xxxxxxxxxxxxxxx00xxxxxxxx|xxxxxxxxxxxxxxx00xxxxxxxx|xxxxxxxxxxxxxxx00xxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxx', 'none'), + (26, 'md_a', 'md_a', 3, 4, 7, 2, 'xxxxxxxx77xxxxxxxxxxxxxxxx|xxxxxxxx77xxxxxxxxxxxxxxxx|xxxxxx77777x77xxxxxxxxxxxx|xxx77777777777xxx44xxxxxxx|77777777777777xx444444444x|777777777777777xx44444444x|xxx777777777777xx44444444x|xxxx7777777777xxx44444444x|7777777777777777744448444x|7777777777777x4x744448444x|777777777777x444444448444x|7777777777774444444448444x|7777777777774444444448444x|777777777777x444444448444x|7777777777777x44444448444x|xxx777777777777x444448444x|xxx7777777777777444448444x|xxx7777777777777444448444x|xxx777777777777x444448444x|xxx77777777777x4444444444x|xxxx777777777444444444444x|xxxxxxxxxxxxxxxxxxxxxxxxxx', 'rooftop_rumble_trigger'), + (27, 'picnic', 'picnic', 16, 5, 2, 4, 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xx22222xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|22xxxxxxxxxxxxx22xxxxxxxxxxxxxxxxxxxxx|2222222222222222222x222222222222222222|22222222222222222222222222222222222222|22222222222222222222222222222222222222|22222222222222222222222222222222222222|22222222222xxx222222222222222222222222|2222222222xx33x22222222222222222222222|222222222xx3333x2222222222222222222222|222222222x333333x222222222222222222222|222222222x333333x222222222222222222222|2222222222x3332x2222222222222222222222|22222222222x33x22222222222222222222222|22222222222222222222222222222222222222|22222222222222222222222222222222222222|22222222222222222222222222222222222222|22222222222222222222222222222222222222|22222222222222222222222222222222222222|22222222222222222222222222222222222222|22222222x22222xxxx22222222222222222222|22222222222222xxxx22222222222222222222|22222222222222xxx222222222222222222222|22222222222222222222222222222222222222|22222222222222222222222222222222222222|22222222222222222222222222222222222222|22222222222222222222222222222222222222|22222222222222222222222222222222222222|22222222222222222222222222222222222222|22222222222222222222222222222222222222|22222222222222222222222222222222222222|22222222222222222222222222222222222222|22222222222222222222222222222222222222|22222222222222222222222222222222222222|22222222222222222222222222222222222222|22222222222222222222222222222222222222|22222222222222222222222222222222222222|22222222222222222222222222222222222222|22222222222222222222222222222222222222|22222222222222222222222222222222222222|22222222222222222222222222222222222222', 'none'), + (28, 'park_a', 'park_a', 2, 15, 0, 0, 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0xxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx00xxxxxxxxxxxx|xxxxxxxxxxxxx0x00xxxxxxxxxxx0x000xxxxxxxxxxx|xxxxxxxxxxxx0000000000000000000000xxxxxxxxxx|xxxxxxxxxxx000000000000000000000000xxxxxxxxx|xxxxxxxxxxx0000000000000000000000000xxxxxxxx|xxxxxxxxxxx00000000000000000000000000xxxxxxx|xxxxxxxx000000000000000000000000000000xxxxxx|xxxxxxx00000000000000000000000000000000xxxxx|xxxxxxx000000000000000000000000000000000xxxx|xxxxxxx0000000000000000000000000000000000xxx|xxxxxxxxx000000000000000000000000000000000xx|00000000000000000000xx00000000000000000000xx|0000000000000000000xxxx00000000000xxxxxxx0xx|0000000000000000000xxxx00000000000x00000xxxx|xxxxx00x0000000000xxxxx0xxxxxx0000x0000000xx|xxxxx0000000000000xxxxx0xx000x0000x000000xxx|xxxxx0000000000000xxxxx0x000000000x00000xxxx|xxxxx000000x0000000xxxx0x000000000xxx00xxxxx|xxxxxxxx000x0000000xxx00xxx000000x0000xxxxxx|xxxxxxxx000x000000xxxx0x0000000000000xxxxxxx|xxxxxxxx000x000000011100000000000000xxxxxxxx|xxxxxxxx000x00000001110000000000000xxxxxxxxx|xxxxxxxxx00x0000000111x00000000x00xxxxxxxxxx|xxxxxxxxxx0x0000000xxx0000000xxxxxxxxxxxxxxx|xxxxxxxxxxxx000000xxxx0000000xxxxxxxxxxxxxxx|xxxxxxxxxxxx000000xxx00xxxxx00xxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxx0xxx0xx000x00xxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxx0xxx0x000000xxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxx0xxx0x00000xxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxx0xxxxx00xxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxx0xxxxx0xxxxxxxxxxxxxxxxxxxx', 'infobus_park'), + (29, 'park_b', 'park_b', 11, 2, 0, 6, '0000x0000000|0000xx000000|000000000000|00000000000x|000000000000|00x0000x0000', 'infobus_poll'), + (30, 'pool_b', 'pool_b', 9, 21, 7, 1, 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7xxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx777xxxxxxxxxxx|xxxxxxxxxxxxxxxxxx8888888x7xxx77777xxxxxxxxxx|xxxxxxxxxxxxxxxxxx8888888x7xxx777777xxxxxxxxx|xxxxxxxxxxxxxxxx88xxxxx77x7x777777777xxxxxxxx|xxxxxxxxxxxxxxxx88x7777777777777777777xxxxxxx|xxxxxxxxxxxxxxxx88x77777777777777777777xxxxxx|xxxxxxxxxxxxxx9988x77777777777777777777xxxxxx|xxxxxxxxxxxxxx9988x7777777777777777777x00xxxx|xxxxxxxxxxxxxx9988x777777777777777777x0000xxx|xxxxxxxxxxxxxx9988x7777777x0000000000000000xx|xxxxxxxxxxxxxx9988x777777x000000000000000000x|7777777777xxxx9988777777x0x0000000000000000xx|x7777777777xxx998877777x000x00000000000000xxx|xx7777777777xx99887777x00000x000000000000xxxx|xxx7777777777x9988777x0000000x0000000000xxxxx|xxxx777777777x777777x00000000x000000000xxxxxx|xxxxx777777777777777000000000x00000000xxxxxxx|xxxxxx77777777777777000000000x0000000xxxxxxxx|xxxxxxx777777x7777770000000000xxxx00xxxxxxxxx|xxxxxxxx77777777777xx0000000000000xxxxxxxxxxx|xxxxxxxxx777777110000x000000000000xxxxxxxxxxx|xxxxxxxxxx7x77x1100000x0000000000xxxxxxxxxxxx|xxxxxxxxxxx777x11000000x00000000xxxxxxxxxxxxx|xxxxxxxxxxxx771110000000x000000xxxxxxxxxxxxxx|xxxxxxxxxxxxx111100000000x0000xxxxxxxxxxxxxxx|xxxxxxxxxxxxxx11100000000x000xxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxx1100000000x00xxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxx110000000x0xxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxx110000000xxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxx1100000xxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxx11000xxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxx110xxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxx1xxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'diving_deck_trigger'), + (31, 'ballroom', 'ballroom', 13, 6, 0, 4, 'xxxx4444444444444444444|xxxx4444444444444444444|xxxx4444444444444444444|xxxx33x2222444442222x33|xxxx2222222x00xx2222222|xxxx22222220000x2222222|xxxx11x0000x000x0000x11|xxxx0000000000000000000|11100000000000000000000|11100000000000000000000|11100000000000000000000|xxxx0000000000000000000|22210000000000000000000|22210000000000000000000|22210000000000000000000|xxxx0000000000000000000|11100000000000000000000|11100000000000000000000|11100000000000000000000|xxxxx000x11111111x0000x|xxxxxx00x1111x111x000xx|xxxxxxx0x11111111x00xxx|xxxxxxxxx11111111x0xxxx|xxxxxxxxx11111111xxxxxx', 'none'), + (32, 'cafe_gold0', 'cafe_gold0', 9, 29, 0, 0, 'xxxxxxxxxx1111xxxxxxx|xxxxxxxxxx11111xxxxxx|xxxxxxxxxx111111xxxxx|xx111111111111111xxxx|x11111111111111111xxx|1111111111111111111xx|11111111111111111111x|111111111111111111111|111111111111111111111|1111111111111x1111111|1111111000000x1111111|1111111000000x1111111|1111111000000x1111111|1111111000000x1111111|1111111000000x1111111|1111111000000x1111111|1111111000000x1111111|1111111000000x1111111|1111111000000x1111111|1111111000000xxx00000|111111100000000000000|111111100000000000000|111111100000000000000|111111100000000xxxxx0|11111110000000xxxxxx0|11111110000000xxxxxx0|11111110000000xxxxxxx|x1111110000000xxxxxxx|xxxxxxxx0000000000xxx|xxxxxxxx000xxxxxxxxxx|xxxxxxxx000xxxxxxxxxx|xxxxxxxx000xxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxx', 'none'), + (33, 'cafe', 'cafe', 30, 40, 0, 0, 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx000000xxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0000000xxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxx00000xx00000000xxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxx000000000000000000xxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxx000000000000000000xxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxx000000000000000000xxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxx000000000000000000xxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxx00000000xxx0000000xxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxx00000000xxxx000000xxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxx00000000xxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxx0000000000000000xxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxx00000000000000000xxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxx00000000000000000xxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxx00000000000000000xxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxx00000000000000000xxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxx00000000000000000xxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx00000000xxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0000000xxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0000xxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0000xxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0000xxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'none'), + (34, 'den', 'den', 3, 22, 0, 0, '00000000xxxxxxxx|0000000000000000|0000000000000000|000000000000xx00|0000000000000000|0000000000000000|0000000000000000|x000000000000000|0000000000000000|0000000000000000|0000000000000000|0000000000000000|x000000000000000|x000000000000000|x000000000000000|x000000000000000|x000000000000000|x000000000000000|x000000000000000|x000000000000000|xxx00xxxxxxxxxxx|xxx00xxxxxxxxxxx|xxx00xxxxxxxxxxx', 'none'), + (35, 'gardens', 'gardens', 2, 15, 0, 0, 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0xxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx00xxxxxxxxxxxx|xxxxxxxxxxxxx0x00xxxxxxxxxxx0x000xxxxxxxxxxx|xxxxxxxxxxxx0000000000000000000000xxxxxxxxxx|xxxxxxxxxxx000000000000000000000000xxxxxxxxx|xxxxxxxxxxx0000000000000000000000000xxxxxxxx|xxxxxxxxxxx00000000000000000000000000xxxxxxx|xxxxxxxx000000000000000000000000000000xxxxxx|xxxxxxx00000000000000000000000000000000xxxxx|xxxxxxx000000000000000000000000000000000xxxx|xxxxxxx0000000000000000000000000000000000xxx|xxxxxxxxx000000000000000000000000000000000xx|00000000000000000000xx00000000000000000000xx|0000000000000000000xxxx00000000000xxxxxxx0xx|0000000000000000000xxxx00000000000x00000xxxx|xxxxx00x0000000000xxxxx0xxxxxx0000x0000000xx|xxxxx0000000000000xxxxx0xx000x0000x000000xxx|xxxxx0000000000000xxxxx0x000000000x00000xxxx|xxxxx000000x0000000xxxx0x000000000xxx00xxxxx|xxxxxxxx000x0000000xxx00xxx000000x0000xxxxxx|xxxxxxxx000x000000xxxx0x0000000000000xxxxxxx|xxxxxxxx000x000000011100000000000000xxxxxxxx|xxxxxxxx000x00000001110000000000000xxxxxxxxx|xxxxxxxxx00x0000000111x00000000x00xxxxxxxxxx|xxxxxxxxxx0x0000000xxx0000000xxxxxxxxxxxxxxx|xxxxxxxxxxxx000000xxxx0000000xxxxxxxxxxxxxxx|xxxxxxxxxxxx000000xxx00xxxxx00xxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxx0xxx0xx000x00xxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxx0xxx0x000000xxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxx0xxx0x00000xxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxx0xxxxx00xxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxx0xxxxx0xxxxxxxxxxxxxxxxxxxx', 'none'), + (36, 'gate_park', 'gate_park', 17, 26, 0, 0, 'xxxxxxxxx222xx222222xxx22xxxxxxx|xxxxxxxxx222xx2222222xx22xxxxxxx|xxxxxxxxx22222222222222222xxxxxx|xxxxxxxxx22222222222222222xxxxxx|xxxxxxxxx22222222222222222xxxxxx|xxxxxxxxx22222x22222x22222xxxxxx|xxxxxxxxx11111x22222x11111xxxxxx|0000000xx00000x22222x00000xxxxxx|0000000xx00000000000000000xxxxxx|000000000000000000000000000xx00x|000000000000xxx00000xxx00000000x|000000000000xxx00000xxx00000000x|000000000000xxx00000xxx000000000|00000000000000000000000000000000|x0000000000000000000000000000000|xxx00000000000000000000000000000|xxxxx000000000000000000000000000|xxxxx000000000000000000000000000|xxxxx000000000000000000000000xxx|xxxxxx00000000000000000000000xxx|xxxxxxx000000000000000000000xxxx|xxxxxxxxxx00000000000000000xxxxx|xxxxxxxxxx0000000000000000xxxxxx|xxxxxxxxxx000000000000000xxxxxxx|xxxxxxxxxxxxx00000000000xxxxxxxx|xxxxxxxxxxxxxx000000000xxxxxxxxx|xxxxxxxxxxxxxxxx000xxxxxxxxxxxxx|xxxxxxxxxxxxxxxx000xxxxxxxxxxxxx|xxxxxxxxxxxxxxxx000xxxxxxxxxxxxx', 'none'), + (37, 'gate_park_2', 'gate_park_2', 17, 23, 0, 0, 'xxxxxxxxxxx111111111111xxxxxxxxxxxx|xxxxxxxxxx11111111111111xxxxxxxxxxx|xxxxxxxxxx11111111111111xxxxxxxxxxx|xxxxxxxxxx11xxxx11xxxx11xxxxxxxxxxx|xxxxxxxxxx00xxxx00xxxx00xxxxxxxxxxx|xxxxxxx0000000000000000000xxxxxxxxx|xxxxxx000000000000000000000xxxxxxxx|xxxxx0000000000000000000x000xxxxxxx|xxxx00000000000000000000xx000xxxxxx|xxxx00000000000000000000xxx000xxxxx|xxxx00000000000000000000xxxx00xxxxx|000000000000000000000000000000xxxxx|0000000000000000000000000000000xxxx|000000000000000000000000000000xxxxx|000000000000000000000000000000xxxxx|000000000000000000000000000000xxxxx|xx00000000000000000000000000000000x|xxx000xxxx00000000000000xxxx0000000|xxx0000xxx00000000000000xxx00000000|xxxx0000xx00000000000000xx000000000|xxxxx0000x00000000000000x00000000xx|xxxxxx00000000000000000000000xxxxxx|xxxxxxx00000x000000000000000x0xxxxx|xxxxxxxx0000xxx0000xxx000000xxxxxxx|xxxxxxxxx000xxx0000xxx000000xxxxxxx|xxxxxxxxxxxxxxx0000xxx000000xxxxxxx|xxxxxxxxxxxxxxxx000xxx000000xxxxxxx|xxxxxxxxxxxxxxxxxxxxxx00000xxxxxxxx', 'none'), + (38, 'sun_terrace', 'sun_terrace', 9, 17, 0, 2, 'xxxxxx21000000000xxxxxxxx|xxxxxx3xxx000xx000xxxxxxx|xxxxxx4xxx000xxx000xxxxxx|xxxxxx44xx000x00x000xxxxx|xxxxxx44xx0000xx00000xxxx|xxxxxx44xx000000000000xxx|xxxxxx44xx0000000000000xx|xxxxxxx4xxxxxxx00000000xx|xxxxxxx4xxxxxxx0000000xxx|xxxxxx444432222xxx00xxxxx|xxxxxx444432222x0000000xx|xxxxxx444432222x0000000xx|xxxxxx44400x222x0000000xx|xxxxxx444000x11x0000000xx|xxxxxx444000000x0000000xx|xxxxxx444000000x0000000xx|xxxxxx440000000000000000x|xxxxxx4400000000000000000|x8876x444000000x000000000|x8xx6x444000000x000000000|x9xx6x444000000x000000000|999x65444000000x000000000|999xxx444xxxxxxxxxx000000|999xxx444xxxxxxxxxxx00000|999xxx333xxxxxxxxxxxx0000|999xxx222222222222222x000|xxxxxx222222222222222xx00|xxxxxx222222222222222xxx0|xxxxxx222222222222222xxxx|xxxxxxx22222222222222xxxx|xxxxxxxx2222222222222xxxx', 'none'), + (39, 'space_cafe', 'space_cafe', 21, 17, 1, 0, 'x3333x333211111xxxxxxxxx|x3333x333211111xx3333333|xxxxxx333211111xx3333333|33333333xx11111xx3333333|33333333xx11111xx3333333|33x333xxxx11111xx3333333|xxx222xxx111111xx3333333|22222222xx11111xx3333333|22222222xxx1111xx3333333|22222222xxxx1111x2222222|22222222xxxx1111x1111111|22222222xxxx111111111111|22222222xxxx111111111111|xxx222xxxxx1111111111111|xxxx33xxxx11111111111111|xxx333321111111111111111|xxx333321111111111111111|xxx333321111111111111111|xxxxxxxxxxxxx1111xxxx11x|xxxxxxxxxxxxx0000xxxx11x|xxxxxxxxxx0000000xxxx11x|xxxxxxxxxx0000000xxxxxxx|xxxxxxxxxx0000000xxxxxxx|xxxxxxxxxx0000000xxxxxxx|xxxxxxxxxx0000000xxxxxxx|xxxxxxxxxx0000000xxxxxxx', 'space_cafe_trigger'), + (40, 'beauty_salon0', 'beauty_salon0', 4, 3, 0, 0, 'xxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxx|xxx0000000000000xxxxxxxx|xxx00000000000000xxxxxxx|xxxxxx000000000000xxxxxx|xxxxxxxxxxxxx0000xxxxxxx|xxxx0x0000x00000000xxxxx|xxx00xxxxxx0000000xxxxxx|xx000x000xx0000000xxxxxx|xx000xxxxx00000000xxxxxx|xx000x000000000000xxxxxx|xx000x000000000000xxxxxx|xx00xx000000000000xxxxxx|xx00xx00x0000000000xxxxx|xx00xx00x0000000000xxxxx|xx00xx0000000000000xxxxx|xx00xx0000000000000xxxxx|xx000x0xx0000000000xxxxx|xx000x0x00000000000xxxxx|xx000x0x00x00000000xxxxx|xx000x0x00000000000xxxxx|xx000x0x00x00000000xxxxx|xx000xx000000000000xxxxx|xx00000000000000000000xx|xx00000000000000000000xx|xxxxxx0000000000000000xx', 'none'), + (41, 'chill', 'chill', 22, 22, 0, 6, 'xxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxx00xxxxxxxx|xxxxxxxxxxx000000xxxxxxxx|xxxxxxxxxxx000000xxxxxxxx|xxxxxxxxxxxxxx000xxxxxxxx|xxxxxxxxxxxxxxxx0xxxxxxxx|xxxxxxxxx00000000xxxxxxxx|xxxxxxxx000000xxxxxxxxxxx|xxxxxxxx000000xxxxxxxxxxx|xxxxxxxx000000xxxxxxxxxxx|xxxxxxxx000000xxxxxxxxxxx|xxxxxxxx000000xxxxxxxxxxx|xxxxxxxx0000000xxxxxxxxxx|xxxxxxxx00000000xxxxxxxxx|xxxxxxxx0000000000xxxxxxx|xxxxxxxx0000000000xxxxxxx|xxxxxxxx0000000000xxxxxxx|xxxxxxxx0000000000xxxxxxx|xx000000000000xxxxxxxxxxx|xx000000000000000000000xx|xx000000000000000000000xx|xx000000000xx0000000000xx|xx000000000xxxxx000000000|xx000000000xxx0x000000000|xx00000x000xxx0x000000000|xx000000000xxxxx0000000xx|xx000000000000000000000xx|xx000000000000000000000xx|xx000000000000000000000xx|xx000000000000xxxxxxxxxxx', 'none'), + (42, 'dusty_lounge', 'dusty_lounge', 14, 1, 2, 4, 'xxxxxxxxxxxxxx22xxxxxxxxxxxxx|xxxxxxxxxx222x222x2xxxxxxxxxx|xxxxxxx33322222222223xxxxxxx3|xxxxxxx33322222222223xxxxxxx3|xxxxxxx33322222222223x33333x3|xxxxxxx33322222222223x33333x3|xx111xx33322222222223xxxxxxx3|xx111xxx332222222222333333333|xx111xxxx32222222222333333333|xx111xxxxxx222222222333333333|xx111xxxxxxx1111111x333333333|xx111xxxxxxx1111111x222222222|xx111xxxxxx111111111111111111|xx111xxxxxx111111111111111111|11111xxxxxx111111111111111111|11111xxxxxx111111111111111111|11x11xxxxxx111111111111111111|11xxxxxxxxx11111111111111111x|x11xxxxxxxxx1111111x1111111xx|xx11xxxxxxx111111111111111xxx|xxx11xxxxxx11111111111111xxxx|xxxx11111111111111111111xxxxx|xxxxx11111111111111xxxxxxxxxx|xxxxxxxxxxx11111111xxxxxxxxxx|xxxxxxxxxxx11111111xxxxxxxxxx', 'none'), + (43, 'cr_staff', 'cr_staff', 3, 22, 0, 0, '00000000xxxxxxxx|0000000000000000|0000000000000000|000000000000xx00|0000000000000000|0000000000000000|0000000000000000|x000000000000000|0000000000000000|0000000000000000|0000000000000000|0000000000000000|x000000000000000|x000000000000000|x000000000000000|x000000000000000|x000000000000000|x000000000000000|x000000000000000|x000000000000000|xxx00xxxxxxxxxxx|xxx00xxxxxxxxxxx|xxx00xxxxxxxxxxx', 'none'), + (44, 'rooftop', 'rooftop', 17, 12, 4, 0, '44xxxxxxxxxxxxxxxxxx|444xxxxxxxxxxx444444|4444xxxxxxxxxx444444|44444xxxx4xxxx444444|444444xxx44xxx444444|44444444444444444444|44444444444444444444|44444444444444444444|44444444xx44xx44xx44|44444444xx44xx44xx44|44444444444444444444|44444444444444444444|44444444444444444444|x444444x444444xx4444|x444444x444444xx333x|x444444x444444xx222x|x444444x444444xx11xx|x444444x444444xxxxxx', 'none'), + (45, 'rooftop_2', 'rooftop_2', 4, 11, 0, 0, 'x0000x000|xxxxxx000|000000000|000000000|000000000|000000000|000000000|000000000|000000000|000000000|xxx000xxx|xxx000xxx', 'none'), + (46, 'tearoom', 'tearoom', 21, 19, 1, 6, 'xxxxxxxxxxxxxxxxxxxxxx|xxxxxxxx3333x33333333x|333333xx3333x33333333x|3333333x3333x33333333x|3333333x3333x33333333x|3333333xxxxxx33333333x|333333333333333333333x|333333333333333333333x|333333333333333333333x|333333333333333333333x|33333333222x333333333x|33333333222x333333333x|33333333222x333333333x|33333333222x333333333x|33333333111x333333333x|33333333111x333333333x|33333333111x333333333x|xxxxxxxx111xxxxxxxxxxx|11111111111111111111xx|1111111111111111111111|1111111111111111111111|11111111111111111111xx', 'none'), + (47, 'cafe_ole', 'taivas_cafe', 14, 29, 0, 0, 'XXXXXXXXXXXXX111111X|XXXXXXXXXXXXX1111111|XXXXXXXXXXXXX1111111|XXXXXXXXXXXXX1111111|XXXXXXXXXXXXX1111111|XXX11111111111111111|XXX11111111111111111|XX111111111111111111|XX111111111111111111|XX111111111111111111|XXX11111111111111111|111111111XXXXXXX1111|111111111X0000000000|111111111X0000000000|111111111X0000000000|111111111X0000000000|111111111X0000000000|111111111X0000000000|111111111X0000000000|111111111X0000000000|111111111X0000000000|X11111111X0000000000|XX1111111X0000000000|XXX111111X0000000000|XXXX11111X0000000000|XXXXX111110000000000|XXXXXX11110000000000|XXXXXXX1110000000000|XXXXXXXX11000000000X|XXXXXXXXXX00000000XX|XXXXXXXXXXXXXX00XXXX|XXXXXXXXXXXXXX00XXXX', 'none'), + (48, 'cr_cafe', 'cr_cafe', 20, 10, 0, 6, '0000000000000000000xx|x000000000000000000xx|xx00000000000000000xx|xx00000000000000000xx|xx00000000000000000xx|xxxx000000000000000xx|0000000000000000000xx|0000000000000000000xx|x000000000000000000xx|xx00000000000000000xx|xxxx00000000000000000|xxx000000000000000000|xxx0000000000000000xx|xxx0000000000000000xx|xx00000000000000000xx|xx00000000000000000xx|xx00000000000000000xx|xx00000000000000000xx|xx00000000000000000xx|xx00000000000000000xx', 'none'), + (49, 'lobby_a', 'lobby_a', 12, 27, 1, 0, 'XXXXXXXXX77777777777XXXXX|XXXXXXXXX777777777777XXXX|XXXXXXXXX777777777766XXXX|XXXXXXXXX777777777755XXXX|XX333333333333333334433XX|XX333333333333333333333XX|XX333333333333333333333XX|33333333333333333333333XX|333333XXXXXXX3333333333XX|333333XXXXXXX2222222222XX|333333XXXXXXX2222222222XX|XX3333XXXXXXX2222222222XX|XX3333XXXXXXX222222221111|XX3333XXXXXXX111111111111|333333XXXXXXX111111111111|3333333222211111111111111|3333333222211111111111111|3333333222211111111111111|XX33333222211111111111111|XX33333222211111111111111|XX3333322221111111XXXXXXX|XXXXXXX22221111111XXXXXXX|XXXXXXX22221111111XXXXXXX|XXXXXXX22221111111XXXXXXX|XXXXXXX22221111111XXXXXXX|XXXXXXX222X1111111XXXXXXX|XXXXXXX222X1111111XXXXXXX|XXXXXXXXXXXX11XXXXXXXXXXX|XXXXXXXXXXXX11XXXXXXXXXXX|XXXXXXXXXXXX11XXXXXXXXXXX|XXXXXXXXXXXX11XXXXXXXXXXX', 'none'), + (50, 'floorlobby_c', 'floorlobby_c', 9, 21, 0, 0, 'XXXXXXXXXXXXXXXXXXXXXXXXXXX|XXXXXXXXXXXXXXXXXXXXXXXXXXX|XXX0000000000000000XXXXXXX0|XXX000000000000000000XXXX00|X00000000000000000000000000|X00000000000000000000000000|XXX000000000000000000000000|XXXXXXX00000000000000000000|XXX111100000011111111111111|XXX111100000011111111111111|XXX111100000011111111111111|XXX111100000011111111111111|XXX111100000011111111111111|XXX111100000011111111111111|XXX1XX100000011111111111111|XXX1XX100000011111111111111|XXX111100000011111111111111|XXX111100000011111111111111|XXX111100000011111111111111|XXXXXXXX0000XXXXXXXXXXXXXXX|XXXXXXXX0000XXXXXXXXXXXXXXX|XXXXXXXX0000XXXXXXXXXXXXXXX', 'none'), + (51, 'floorlobby_b', 'floorlobby_b', 9, 21, 0, 0, 'XXXXXXXXXXXXXXXXXXXXXXXXXXX|XXXXXXXXXXXXXXXXXXXXXXXXXXX|XXX0000000000000000XXXXXXX0|XXX000000000000000000XXXX00|X00000000000000000000000000|X00000000000000000000000000|XXX000000000000000000000000|XXXXXXX00000000000000000000|XXX111100000011111111111111|XXX111100000011111111111111|XXX111100000011111111111111|XXX111100000011111111111111|XXX111100000011111111111111|XXX111100000011111111111111|XXX1XX100000011111111111111|XXX1XX100000011111111111111|XXX111100000011111111111111|XXX111100000011111111111111|XXX111100000011111111111111|XXXXXXXX0000XXXXXXXXXXXXXXX|XXXXXXXX0000XXXXXXXXXXXXXXX|XXXXXXXX0000XXXXXXXXXXXXXXX', 'none'), + (52, 'floorlobby_a', 'floorlobby_a', 9, 21, 0, 0, 'XXXXXXXXXXXXXXXXXXXXXXXXXXX|XXXXXXXXXXXXXXXXXXXXXXXXXXX|XXX0000000000000000XXXXXXX0|XXX000000000000000000XXXX00|X00000000000000000000000000|X00000000000000000000000000|XXX000000000000000000000000|XXXXXXX00000000000000000000|XXX111100000011111111111111|XXX111100000011111111111111|XXX111100000011111111111111|XXX111100000011111111111111|XXX111100000011111111111111|XXX111100000011111111111111|XXX1XX100000011111111111111|XXX1XX100000011111111111111|XXX111100000011111111111111|XXX111100000011111111111111|XXX111100000011111111111111|XXXXXXXX0000XXXXXXXXXXXXXXX|XXXXXXXX0000XXXXXXXXXXXXXXX|XXXXXXXX0000XXXXXXXXXXXXXXX', 'none'), + (53, 'cinema_a', 'cinema_a', 20, 27, 1, 0, 'xxxxxxx1xx11111111xxxxxx|xxx1111111111111111xxxxx|xxx111xxxx1111111111xxxx|xxxx2xxxxxxxxxxxxxxxxxxx|xx3x3x333311xxxxxxxxxx11|xx3333333311111111111111|xx3333333311111111111111|xx3333333311111111122111|xx3333333311x22222222111|xx3333333311x22222222111|xx3333333311xxxxxxxxx111|xx3333333311111111111111|xx3333333311111111111111|xx3333333311111111111111|xx3333333311111xxxx11111|xx3333333311111xxxx11111|xx3333333311111xxxx11111|xx3333333311111xxxx11111|xx3333333311111xxxx11111|xx3333333311111xxxx11111|xx3333333311111xxxx11111|333333332111111xxxx11111|333333332111111111111111|333333332111111111111111|333333332111111111111111|xx3333332111111111111111|xxxxxxxxxxxxxxxxxxx11111|xxxxxxxxxxxxxxxxxxx11111|xxxxxxxxxxxxxxxxxxx11111', 'none'), + (54, 'sport', 'sport', 0, 0, 1, 2, '111222222222222222x2222|x11222222222222222x2222|x11222222222222222x2222|xx1x2222222222222211111|x11xx222222222222211111|x11xx222222x22222211111|x11xx222222x222222x1111|x11xx222222x222222x1111|x11xx2222222222222x1111|x11xxxxxxxxxxxxxxxx1111|x1111111111111111111111|x1111111111111111111111|x1111111111111111111111|x1111111111111111111111|xxxx1111111111111x1111x|111x1111111111111x1111x|111x1111111111111x1111x|111x1111111111111x1111x|111x11111xxxxxxxxxxxxxx|x11x1111xxxxxxxxxxxxxxx|xxxx111xxxxxxxxxxxxxxxx', 'none'), + (55, 'old_skool0', 'old_skool0', 2, 1, 0, 4, 'xx0xxxxxxxxxxxxxx|0000000xxx00000xx|0000000x0000000xx|0000000xxxxxxxxxx|0000000000000000x|0000000000000000x|0000000000000000x|0000000000000000x|0000000000000000x|0000000000000000x|0000000000000000x|0000000000000000x|0000000000000000x|0000000000000000x|0000000000000000x|0000000000000000x|0000000000000000x|0000000000000000x|00000000000000000|0000000000000000x|0000000000000000x|0000000000000000x|0000000000000000x|0000000000000000x|0000000000000000x', 'none'), + (56, 'old_skool1', 'old_skool1', 1, 7, 6, 2, 'x6666666665432100|x6666666665432100|x6600000000000x00|x6600000000000000|x6600000000000000|x6600000000000000|x660000000000x000|666000000000x1111|x66000000000xx111|x66000000000x1111|x66000000000x1111|x55000000000x1111|x44000000000x1111|x33000000000x1111|x22000000000xx111|x11x00000000x1111|x00000000000x1111|x00000000000xx111', 'none'), + (57, 'malja_bar_a', 'malja_bar_a', 4, 24, 1, 0, 'xxxxxxxxxxxxxx44|xxxx444444444444|xxxx444444444444|xxxx444444444444|xxxx444444444444|xxxx444444444444|xxxxxxxxxxxxx333|1111111111111222|1111111111111111|1111111111111111|1111111111111111|1111111111111111|1111111111111111|1111111111111111|1111111111111111|1111111111111111|1111111111111111|1111111111111111|1111111111111111|111111111xxxxxxx|xxx11111xxxxxxxx|11111111xxxxxxxx|11111111xxxxxxxx|11111111xxxxxxxx|11111111xxxxxxxx', 'none'), + (58, 'malja_bar_b', 'malja_bar_b', 4, 24, 3, 0, '6666333333333333|6666333333333333|6666333333333333|7766333333333333|7755333333333333|8855333333332223|8844333311111111|9944333311111111|9933333311111111|9933333311111111|9933333311111111|9933333311111111|9933333311111111|9933333311111111|9933333211111111|9933333211111111|9933333211111111|9933333311111111|99333333xxxxxxxx|99333333xxxxxxxx|xxx33333xxxxxxxx|xxx33333xxxxxxxx|3xx33333xxxxxxxx|xxx33333xxxxxxxx|xxx33333xxxxxxxx|xxx33333xxxxxxxx', 'none'), + (59, 'bar_a', 'bar_a', 5, 1, 7, 4, 'xxxx8888xxxxxxxxxxx|xxxx7777xxxxxxxxxxx|xxxx6666xxxxxxxxxxx|xxx6666666555555555|xxx6666666555555555|xxx6666666555555555|xxx6666666555555555|xxx6666666555555555|xxx6666666555555555|xxx6666666555555555|xxx6666666555xxxxxx|xxx6666666555555555|xxx5555555555555555|xxx5555555555555555|xxx5555555555555555|xxx5555555555555555|xxx5555555555xxxxxx|xxx5555555555555555|xxx5555555555555555|xxx5555555555555555|xxx5555555555555555|xxx5555555555555555|xxx5555555555xxxxxx|xxxx555555555555555|55xx555555555555555|55xx555555555555555|5555555555555555555|5555555555555555555|xxxxxxxx55555xxxxxx|xxxxxxxxx5555xxxxxx|xxxxxxxxx5555xxxxxx|xxxxxxxxx5555xxxxxx|xxxxxxxxx4444xxxxxx|xxxxxxxxx3333xxxxxx', 'none'), + (60, 'bar_b', 'bar_b', 2, 12, 4, 2, 'xxxxx4xxxxxxxxxxxx|xxxx4444444xxxxxxx|xxxx4444444xxxxxxx|xxx444444444444444|xxx444444444444444|xxx444444444444444|xxx444444444444444|xxx444444444444444|xxx444444444444444|xxx444444444444444|654444444444444444|654444444444444444|654444444444444444|654444444444444444|xxx444444444444444|xxx444444444444444|xxx444444444444444|xxx444444444444444|xxx444444444444444|xxxx44444444444444|xxxx33444444444444|xxxx22444444444444|xxxx2222222222xx44|xxxx2222222222xx44|xxxxx222222222xxxx|xxxxxx22222222xxxx|xxxxxx22222222xxxx|xxxxxx22222222xxxx|xxxxxx22222222xxxx|xxxxxx22222222xxxx|xxxxxx22222222xxxx', 'none'), + (61, 'habburger', 'habburger', 22, 10, 0, 6, '22222222222222222222xxx|22222222222222222222xxx|22222222222222222222xxx|22222222222222222222xxx|xxxxxxxxxxxxxxxx1111xxx|xxxxxxxxxxxxxxxx0000xxx|xxx00000000000000000xxx|00000000000000000000xxx|00000000000000000000xxx|00000000000000000000000|00000000000000000000000|00000000000000000000xxx|00000000000000000000xxx|00000000000000000000xxx|xxx00000000000000000xxx', 'none'), + (62, 'pizza', 'pizza', 5, 27, 1, 0, 'xxxxxxxxx0000000|x11111x1xx000000|11xxxxx111x00000|11x1111111xx0000|11x1111111100000|xxx1111111100000|1111111111100000|1111111111100000|1111111111100000|1111111111100000|1111111111100000|1111111111100000|1111111111100000|1111111111100000|1111111111100000|1111111111100000|1111111111100000|11111111111xxxxx|1111111111xxxxxx|1111111111111111|1111111111111111|1111111111111111|1111111111111111|1111111111111111|1111111111111111|11xx11xx11111111|xxxx11xxxxxxxxxx|xxxx11xxxxxxxxxx', 'none'), + (63, 'bb_lobby_1', 'bb_lobby_1', 14, 19, 0, 0, 'xxx2222222222222222x|xxx2222222222222222x|xxx2222222222222222x|xxx2222222222222222x|xxx11111111111111111|11x11111111111111111|11x11111111111111111|11x11111111111111111|x1x11111111111111111|xxx11111111111111111|xxx11111111111111111|xxx11111111111111111|xxx11111111111111111|xxx11111111111111111|xxxxxxxxx00000000000|xxxxxxxxx00000000000|xxxxxxxxx00000000000|xxxxxxxxx00000000000|xxxxxxxxx00000000000|xxxxxxxxx00000000000|xxxxxxxxxxxxx000xxxx|xxxxxxxxxxxxx000xxxx|xxxxxxxxxxxxx000xxxx', 'battleball_lobby_trigger'), + (64, 'snowwar_lobby_1', 'snowwar_lobby_1', 41, 36, 1, 0, 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx11111xx1xxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx11111xx1111xxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxx111111xxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxx1111111111111111xxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxx1111111111111111xxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxx1111111111111111xxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxx1111111111111111xxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxx1111111111111111xxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxx1111111111111111xxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxx1111111111111111xxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxx1111111111111111xxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxx1111111111111111xxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxx1111111111111111xxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxx1111111111111111xxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxx111111111111111xxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxx1111111111111111xxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxx1111111111111111xxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxx1111111111111111xxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxx111111111111111xxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxx1111x1111111111xxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'snowstorm_lobby_trigger'), + (65, 'tv_studio', 'tv_studio', 16, 27, 4, 6, 'xxxxxxxxxxxxxxxxxxxx|xxxxx0x00000xxxxxxxx|xxxxx0x000000xxxxxxx|xxxxx0x000000xxxxxxx|xxxxx0x0xxx00000xx0x|xx0000x000000000xx00|xx00xxx000000000xx00|xxxxx00000000000xx00|x000000000000x000000|x0000000000000000000|x0000000000000000x00|00000000000000000x00|x000x000000000000x00|x0000000000000000x00|x0000000000000000x00|000x0000000000000000|000x0000000000000000|00000000000000xxx000|x0000000000000000000|xx00000000000000000x|xxx000000000000000xx|xxxxxxxxx1111xxxx0xx|xxxxxxxxx2222xxxxxxx|xxxxxxxxx3333xxxxxxx|xxxxxx44x4444x444xxx|xxxxx444444444444xxx|xxxxxx44444444444444|xxxxx4444x4444444444|xxxxx4444x4444444444|xxxxx4444x4444444xxx|xxxxx444444444444xxx|xxxxx444444444444xxx|xxxxxx44444444444xxx', 'none'), + (66, 'cr_kitchen', 'cr_kitchen', 7, 21, 0, 0, 'X0XXXX000XXXX000X0X|X000000000000000000|X000000000000000000|X000000000000000XXX|X00XXXX00XXXX000XXX|X00XXXX00XXXX00XXXX|X00000000000000XXXX|X00000000000000XXXX|X00000000000000XXXX|X00XXXXXXXXXX00XXXX|X00XXXXXXXXXX00XXXX|X00XXXXXXXXXX000XXX|0000000000000000XXX|000000000000000XXXX|000000000000000XXXX|000XXX0000XXX00XXXX|000XXX0000XXX00XXXX|000000000000000XXXX|000000000000000XXXX|000000000000000XXXX|XXXXXXX00XXXXXXXXXX|XXXXXXX00XXXXXXXXXX|XXXXXXX00XXXXXXXXXX', 'none'), + (67, 'club_mammoth', 'club_mammoth', 6, 16, 4, 2, 'xxxxxx4444444x4444xxxxxxxxxxxxx|xxxxxx4444444x444322xxxxxxxxxxx|xxxxxxxxxxxxxx444322xxxxxxxxxxx|x444444444444444442222xxxxxxxxx|4444444444444444442222xxxxxxxxx|4xxxxxxxxxxxxxxxxx2222xxxxxxxxx|4xxxxxxxxxx22222xx2222xxxxxxxxx|44xxxxxxxxx22222x2xxxxxxxxxxxxx|x4444444xxx22222x22xxxxxxxxxxxx|xx4444444xx22x22x222xxxxxxxxxxx|xxxxxxx444x22222xxxxxxxxxxxxxxx|xxxxxx444322222222211111111xxxx|xxxxxx444322222222211111111xxxx|xxxxxx444442222222211111111xxxx|xxx444444442222222211111111xxxx|xxx444444442222222211111111xxxx|xxx444444442222222211111111xxxx|xxx444444442222222211111111xxxx|xxxxxx4444422222222x1111111xxxx|xxxxxx4444422222222xxxxxxxxxxxx|xxxxxx4443222222222222222222xxx|xxxxxx4443xxxxxxx2xxxxx222xxxxx|xxxxxx444xxxxxxxxxxxxxxx22xxxxx|xxxxxx4xxxxxxxxxxxxx444422xxxxx|xxx4444xxxxxxxxxxxxx4444x2xxxxx|xxx566666666666666664444xxxxxxx|xxxx66666666666666664444xxxxxxx|xxxxxxx666666666666544xxxxxxxxx|xxxxxxx666666666666544xxxxxxxxx|xxxxxxx6666666666666xxxxxxxxxxx|xxxxxxx6666666666666xxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'none'), + (68, 'ice_cafe', 'taivas_cafe', 17, 23, 0, 0, 'xx111111x000000000|xx111111x000000000|xx111111x000000000|xx111111x000000000|xx111111x000000000|xx111111x000000000|xx111111x000000000|xx1111111000000000|xx1111111000000000|111111111000000000|111111111000000000|111111111000000000|111111111000000000|111111111000000000|11111111x000000000|11111111x000000000|xx111111x000000000|xx111111x000000000|xx111111x000000000|xx111111x000000000|xx111111x000000000|xx111111x000000000|xx1111110000000000|xx1111111000000000|xx1111111000000000|xx1111111000000000|', 'none'), + (69, 'netcafe', 'netcafe', 22, 12, 0, 6, 'xxxxx1111xxxxxxxxxxx1xxxx|xxxxx1111111111111111xxxx|xxxxx1111111111111111xxxx|xxxxx1111111111111111xxxx|xxxxxxxx0000000000000xxxx|111111100000000000000xxxx|111111100000000000000xxxx|111111100000000000000xxxx|xxxx11100000000000000xxxx|x1xx11100000000000000xxxx|x1xx11100000000000000xxxx|x1xx111000000000000000000|x1xx111000000000000000000|xxxx111000000000000000000|xxxx11100000000000000xxxx|xxxx1110000000xx11111xxxx|xxxxx111110000x111111xxxx|xxxxxx111100001111111xxxx|xxxxxx111100001111111xxxx|xxxxxx111100001111111xxxx|xxxxxx111100001111111xxxx|xxxxxx111100001111111xxxx|xxxxxx111100001111111xxxx|xxxxx1111100001111111xxxx|', 'none'), + (70, 'hallway0', 'hallway0', 2, 2, 0, 2, 'xxxx000000001111111111111111xxxx|xxxx000000001111111111111111xxxx|00000000000011111111111111111111|00000000000011111111111111111111|00000000000011111111111111111111|00000000000011111111111111111111|xxxx000000001111111111111111xxxx|xxxx0000000x1111111111111111xxxx|xxxxxxxxxxxxx1111111xxxxxxxxxxxx|xxxxxxxxxxxx11111111xxxxxxxxxxxx|xxxxxxxxxxxx11111111xxxxxxxxxxxx|xxxxxxxxxxxx11111111xxxxxxxxxxxx|xxxxxxxxxxxx11111111xxxxxxxxxxxx|xxxxxxxxxxxx11111111xxxxxxxxxxxx|xxxxxxxxxxxx11111111xxxxxxxxxxxx|xxxxxxxxxxxx11111111xxxxxxxxxxxx|xxxxxxxxxxxxxx1111xxxxxxxxxxxxxx|xxxxxxxxxxxxxx1111xxxxxxxxxxxxxx|xxxxxxxxxxxxxx1111xxxxxxxxxxxxxx|xxxxxxxxxxxxxx1111xxxxxxxxxxxxxx', 'none'), + (71, 'hallway9', 'hallway9', 21, 23, 0, 7, 'xxxxxxxxxxxxxx0000xxxxxxxxxxxxxx|xxxxxxxxxxxxxx0000xxxxxxxxxxxxxx|xxxxxxxxxxxxxx0000xxxxxxxxxxxxxx|xxxxxxxxxxxxxx0000xxxxxxxxxxxxxx|xxxxxxxxxxxx00000000xxxxxxxxxxxx|xxxxxxxxxxxx00000000xxxxxxxxxxxx|xxxxxxxxxxxx00000000xxxxxxxxxxxx|xxxxxxxxxxxx00000000xxxxxxxxxxxx|xxxxxxxxxxxx00000000xxxxxxxxxxxx|xxxxxxxxxxxx00000000xxxxxxxxxxxx|xxxxxxxxxxxx00000000xxxxxxxxxxxx|xxxxxxxxxxxx00000000xxxxxxxxxxxx|xxxx000000000000000000000000xxxx|xxxx000000000000000000000000xxxx|00000000000000000000000000000000|00000000000000000000000000000000|00000000000000000000000000000000|00000000000000000000000000000000|xxxx000000000000000000000000xxxx|xxxx000000000000000000000000xxxx|xxxxxxxxxxxx00000000xxxxxxxxxxxx|xxxxxxxxxxxx00000000xxxxxxxxxxxx|xxxxxxxxxxxx000000000000xxxxxxxx|xxxxxxxxxxxx000000000000xxxxxxxx|xxxxxxxxxxxx000000000000xxxxxxxx|xxxxxxxxxxxx000000000000xxxxxxxx|xxxxxxxxxxxx00000000xxxxxxxxxxxx|xxxxxxxxxxxx00000000xxxxxxxxxxxx|xxxxxxxxxxxxxx0000xxxxxxxxxxxxxx|xxxxxxxxxxxxxx0000xxxxxxxxxxxxxx|xxxxxxxxxxxxxx0000xxxxxxxxxxxxxx|xxxxxxxxxxxxxx0000xxxxxxxxxxxxxx', 'none'), + (72, 'hallway2', 'hallway2', 15, 2, 0, 4, 'xxxxxxxxxxxxxx000xxxxxxxxxxx|xxxxxxxxxxxxxx000xxxxxxxxxxx|xxxxxxxxxxxxxx000xxxxxxxxxxx|xxxxxxxxxxxxxx0000xxxxxxxxxx|xxxx11111111000000000000xxxx|xxxx11111111000000000000xxxx|1111111111110000000000000000|1111111111110000000000000000|1111111111110000000000000000|1111111111110000000000000000|xxxx11111111000000000000xxxx|xxxx11111111000000000000xxxx|xxxx11111111xxxx00000000xxxx|xxxx11111111xxxx00000000xxxx|xxxx11111111xxxx00000000xxxx|xxxx11111111xxxx00000000xxxx|xxxx11111111xxxx00000000xxxx|xxxx11111111xxxx00000000xxxx|xxxx11111111xxxx00000000xxxx|xxxx11111111xxxx00000000xxxx|xxxxxx1111xxxxxxxxxxxxxxxxxx|xxxxxx1111xxxxxxxxxxxxxxxxxx|xxxxxx1111xxxxxxxxxxxxxxxxxx|xxxxxx1111xxxxxxxxxxxxxxxxxx', 'none'), + (73, 'hallway1', 'hallway1', 2, 14, 0, 2, 'xxxxxxxxxxxxxx0000xxxxxxxxxxxxxx|xxxxxxxxxxxxxx0000xxxxxxxxxxxxxx|xxxxxxxxxxxxxx0000xxxxxxxxxxxxxx|xxxxxxxxxxxxxx0000xxxxxxxxxxxxxx|xxxxxxxxxxxx0000000000000000xxxx|xxxxxxxxxxxx0000000000000000xxxx|xxxxxxxxxxxx00000000000000000000|xxxxxxxxxxxx00000000000000000000|xxxxxxxxxxxx00000000000000000000|xxxxxxxxxxxx00000000000000000000|xxxxxxxxxxxx0000000000000000xxxx|xxxxxxxxxxxx0000000000000000xxxx|xxxx1111111100000000xxxxxxxxxxxx|xxxx1111111100000000xxxxxxxxxxxx|11111111111100000000xxxxxxxxxxxx|11111111111100000000xxxxxxxxxxxx|11111111111100000000xxxxxxxxxxxx|11111111111100000000xxxxxxxxxxxx|xxxx1111111100000000xxxxxxxxxxxx|xxxx1111111100000000xxxxxxxxxxxx', 'none'), + (74, 'hallway3', 'hallway3', 14, 21, 1, 0, 'xxxxxx1111xxxxxxxxxxxxxxxxxxxxxx|xxxxxx1111xxxxxxxxxxxxxxxxxxxxxx|xxxxxx1111xxxxxxxxxxxxxxxxxxxxxx|xxxxxx1111xxxxxxxxxxxxxxxxxxxxxx|xxxx111111111111111100000000xxxx|xxxx111111111111111100000000xxxx|11111111111111111111000000000000|11111111111111111111000000000000|11111111111111111111000000000000|11111111111111111111000000000000|xxxx111111111111111100000000xxxx|xxxx111111111111111100000000xxxx|xxxxxxxxxxxx11111111xxxxxxxxxxxx|xxxxxxxxxxxx11111111xxxxxxxxxxxx|xxxxxxxxxxxx11111111xxxxxxxxxxxx|xxxxxxxxxxxx11111111xxxxxxxxxxxx|xxxxxxxxxxxx11111111xxxxxxxxxxxx|xxxxxxxxxxxx11111111xxxxxxxxxxxx|xxxxxxxxxxxx11111111xxxxxxxxxxxx|xxxxxxxxxxxx11111111xxxxxxxxxxxx|xxxxxxxxxxxxxx1111xxxxxxxxxxxxxx|xxxxxxxxxxxxxx1111xxxxxxxxxxxxxx|xxxxxxxxxxxxxx1111xxxxxxxxxxxxxx|xxxxxxxxxxxxxx1111xxxxxxxxxxxxxx', 'none'), + (75, 'hallway4', 'hallway4', 29, 3, 1, 6, 'xxxx000000001111111111111111xxxx|xxxx000000001111111111111111xxxx|00000000000011111111111111111111|00000000000011111111111111111111|00000000000011111111111111111111|00000000000011111111111111111111|xxxx000000001111111111111111xxxx|xxxx000000001111111111111111xxxx|xxxxxxxxxxxxxxxxxxxx11111111xxxx|xxxxxxxxxxxxxxxxxxxx11111111xxxx|xxxxxxxxxxxxxxxxxxxx11111111xxxx|xxxxxxxxxxxxxxxxxxxx11111111xxxx|xxxxxxxxxxxxxxxxxxxx11111111xxxx|xxxxxxxxxxxxxxxxxxxx11111111xxxx|xxxxxxxxxxxxxxxxxxxx11111111xxxx|xxxxxxxxxxxxxxxxxxxx11111111xxxx|xxxxxxxxxxxxxxxxxxxxxx1111xxxxxx|xxxxxxxxxxxxxxxxxxxxxx1111xxxxxx|xxxxxxxxxxxxxxxxxxxxxx1111xxxxxx|xxxxxxxxxxxxxxxxxxxxxx1111xxxxxx', 'none'), + (76, 'hallway5', 'hallway5', 14, 2, 1, 4, 'xxxxxxxxxxxxxx11xxxxxx1111xx|xxxxxxxxxxxxxx111xxxxx1111xx|xxxxxxxxxxxxxx1111xxxx1111xx|xxxxxxxxxxxxxx1111xxxx1111xx|xxxxxxxxxxxx1111111111111111|xxxxxxxxxxxx1111111111111111|xxxxxxxxxxxx1111111111111111|xxxxxxxxxxxx1111111111111111|xxxxxxxxxxxx1111111111111111|xxxxxxxxxxxx1111111111111111|xxxxxxxxxxxx1111111111111111|xxxxxxxxxxxx1111111111111111|xxxx000000001111111111111111|xxxx000000001111111111111111|0000000000001111111111111111|0000000000001111111111111111|0000000000001111111111111111|0000000000001111111111111111|xxxx000000001111111111111111|xxxx0000000x1111111111111111|xxxxxxxxxxxx11111111xxxxxxxx|xxxxxxxxxxxx11111111xxxxxxxx|xxxxxxxxxxxx11111111xxxxxxxx|xxxxxxxxxxxx11111111xxxxxxxx|xxxxxxxxxxxx11111111xxxxxxxx|xxxxxxxxxxxx11111111xxxxxxxx|xxxxxxxxxxxx11111111xxxxxxxx|xxxxxxxxxxxx11111111xxxxxxxx', 'none'), + (77, 'hallway8', 'hallway8', 15, 3, 0, 4, 'xxxxxxxxxxxxxx00xxxx0000|xxxxxxxxxxxxxx000xxx0000|xxxxxxxxxxxxxx0000xx0000|xxxxxxxxxxxxxx0000xx0000|xxxx11111111000000000000|xxxx11111111000000000000|xxxx11111111000000000000|xxxx11111111000000000000|xxxx11111111000000000000|xxxx11111111000000000000|xxxx11111111000000000000|xxxx11111111000000000000|xxxx11111111xxxx00000000|xxxx11111111xxxx00000000|111111111111xxxx00000000|111111111111xxxx00000000|111111111111xxxx00000000|111111111111xxxx00000000|xxxx11111111xxxx00000000|xxxx11111111xxxx00000000|xxxxxxxxxxxxxxxxxx0000xx|xxxxxxxxxxxxxxxxxx0000xx|xxxxxxxxxxxxxxxxxx0000xx|xxxxxxxxxxxxxxxxxx0000xx', 'none'), + (78, 'hallway7', 'hallway7', 7, 2, 1, 4, 'xxxxxx11xxxxxxxxxxxx|xxxxxx111xxxxxxxxxxx|xxxxxx1111xxxxxxxxxx|xxxxxx1111xxxxxxxxxx|xxxx11111111xxxxxxxx|xxxx11111111xxxxxxxx|xxxx111111111111xxxx|xxxx111111111111xxxx|xxxx111111111111xxxx|xxxx111111111111xxxx|xxxx11111111xxxxxxxx|xxxx11111111xxxxxxxx|xxxx11111111xxxxxxxx|xxxx11111111xxxxxxxx|xxxx11111111xxxxxxxx|xxxx11111111xxxxxxxx|xxxx11111111xxxxxxxx|xxxx11111111xxxxxxxx|xxxx11111111xxxxxxxx|xxxx11111111xxxxxxxx|xxxx000000000000xxxx|xxxx000000000000xxxx|00000000000000000000|00000000000000000000|00000000000000000000|00000000000000000000|xxxx000000000000xxxx|xxxx000000000000xxxx', 'none'), + (79, 'hallway6', 'hallway6', 1, 10, 1, 2, 'xxxx1111111111111111xxxx|xxxx1111111111111111xxxx|xxxx1111111111111111xxxx|xxxx1111111111111111xxxx|xxxx1111xxxxxxxxxxxxxxxx|xxxx1111xxxxxxxxxxxxxxxx|xxxx1111xxxxxxxxxxxxxxxx|xxxx1111xxxxxxxxxxxxxxxx|xxxx1111111100000000xxxx|xxxx1111111100000000xxxx|111111111111000000000000|111111111111000000000000|111111111111000000000000|111111111111000000000000|xxxx1111111100000000xxxx|xxxx1111111100000000xxxx|xxxxxxxx1111xxxxxxxxxxxx|xxxxxxxx1111xxxxxxxxxxxx|xxxxxxxx1111xxxxxxxxxxxx|xxxxxxxx1111xxxxxxxxxxxx|xxxxxxxx111111111111xxxx|xxxxxxxx111111111111xxxx|xxxxxxxx111111111111xxxx|xxxxxxxx111111111111xxxx', 'none'), + (80, 'hallway10', 'hallway10', 3, 23, 1, 1, 'xxxxxxxxxx00000000xxxx|xxxxxxxxxx00000000xxxx|xxxxxxxxxx00000000xxxx|xxxxxxxxxx00000000xxxx|xx1111xxxx0000xxxxxxxx|xx1111xxxx0000xxxxxxxx|xx1111xxxx0000xxxxxxxx|xx1111xxxx0000xxxxxxxx|11111111xx0000000000xx|11111111xx0000000000xx|11111111xx0000000000xx|11111111xx0000000000xx|11111111xxxxxxxx0000xx|11111111xxxxxxxx0000xx|11111111xxxxxxxx0000xx|11111111xxxxxxxx0000xx|1111111111111111000000|1111111111111111000000|1111111111111111000000|1111111111111111000000|1111111111111111000000|1111111111111111000000|1111111111111111000000|1111111111111111000000|xx1111xxxxxxxxxxxxxxxx|xx1111xxxxxxxxxxxxxxxx|xx1111xxxxxxxxxxxxxxxx|xx1111xxxxxxxxxxxxxxxx', 'none'), + (81, 'hallway11', 'hallway11', 20, 3, 0, 6, 'xxxx1111111100000000xxxx|xxxx1111111100000000xxxx|111111111111000000000000|111111111111000000000000|111111111111000000000000|111111111111000000000000|xxxx1111111100000000xxxx|xxxx1111111100000000xxxx|xxxxxxxxxxxx000000000000|xxxxxxxxxxxx000000000000|xxxxxxxxxx00000000000000|xxxxxxxxxx00000000000000|xxxxxxxxxx00000000000000|xxxxxxxxxx00000000000000|xxxxxxxxxxxx000000000000|xxxxxxxxxxxx000000000000|xxxxxxxxxxxx000000000000|xxxxxxxxxxxx000000000000|xxxxxxxx000000000000xxxx|xxxxxxxx000000000000xxxx|xxxxxxxx000000000000xxxx|xxxxxxxx000000000000xxxx', 'none'), + (82, 'star_lounge', 'star_lounge', 36, 35, 0, 6, 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxx2222x4444442222xxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxx22222x444x32222xxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxx22222xx4xx22222xxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxx222222222222222xxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxx222222222222222xxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxx222222222222222xxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxx222222222222222xxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxx222222222222222xxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxx222222222222222xxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxx22222222222222211111xxxxxxxxx|xxxxxxxxxxxxxxxxxxxxx22222222222222211111xxxxxxxxx|xxxxxxxxxxxxxxxxxxxxx22222222222222211111xxxxxxxxx|xxxxxxxxxxxxxxxxxxxxx22222222222222211111xxxxxxxxx|xxxxxxxxxxxxxxxxxxxxx22222222222222222111xxxxxxxxx|xxxxxxxxxxxxxxxxxxxxx22222222222222222111xxxxxxxxx|xxxxxxxxxxxxxxxx3333x22222222222222xxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxx3333x22222222222222xxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxx3333x22222222221111xxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxx3333xx2x22222220000xxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxx333333332222222000000xxxxxxxxxxxxx|xxxxxxxxxxxxxxxx333333332222222x0000000xxxxxxxxxxx|xxxxxxxxxxxxxxxxx33333332222222x0000000xxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxx222222000000xxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'none'), + (83, 'orient', 'orient', 32, 20, 1, 6, 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxx00000000xxxxxxxxxxxx|xxxxxxxxxxxxxx1000000000xxxxxxxxxxxx|xxxxxxxxxxxxxx1xxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxx1xxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxx1xxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxx1xxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxx1xxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxx1xxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxx1xxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxx1xx000x000xx111x111xxx|xxxxxxxxxxxxxx1xx000x000xxxxxx1111xx|xxxxxxxxxxxxxx1xx000x000x111111111xx|xxxxxxxxxxxxxx1xx000x000x111111111xx|xxx111111111111xx000x000x111111111xx|xxx1xxxxxxxxxxxxx000x000x111111111xx|xxx1x1111111111000000000x111111111xx|xxx1x1111111111000000000xx1111111xxx|xxx1x11xxxxxx11000000000xx1111111100|xxx111xxxxxxx11000000000011111111100|xxx111xxxxxxx11000000000011111111100|xxxxx1xxxxxxx11000000000011111111100|xxxxx11xxxxxx11000000000xx1111111100|xxxxx1111111111000000000xx1111111xxx|xxxxx1111111111xx000x000x111111111xx|xxxxxxxxxxxxxxxxx000x000x111111111xx|xxxxxxxxxxxxxxxxx000x000x111111111xx|xxxxxxxxxxxxxxxxx000x000x111111111xx|xxxxxxxxxxxxxxxxx000x000x111111111xx|xxxxxxxxxxxxxxxxx000x00xx11xxxx111xx|xxxxxxxxxxxxxxxxxxxxxxxxxx11111111xx|', 'none'), + (84, 'entryhall', 'entryhall', 17, 18, 1, 0, 'xx11xxxx11xxxx11xxxx|x1111111111111111111|11111111111111111111|11111111111111111111|x1111111111111111111|x1111111111111111111|x1111111111111111111|x1111111111111111111|x1111111111111111111|x1111111111111111111|x1111111111111111111|x1111111111111111111|x1111111111111111111|x1111111111111111111|x1111111111111111111|x1111111111111111111|x1111111111111111111|x1111111111111111111|x1111111111111111111|x1111111111111111111|xxxxxxxxxxxxxxxxx11x', 'none'), + (85, 'hallA', 'hallA', 0, 0, 1, 4, '11xxxxxxxxxxxxxxx|11111111111111111|11111111111111111|11111111111111111|11111111111111111|11111111111111111|11111111111111111|11111111111111111|11111111111111111|11111111111111111|11111111111111111|11111111111111111|11111111111111111|11111111111111111|11111111111111111|11111111111111111|11111111111111111|11111111111111111', 'none'), + (86, 'hallB', 'hallB', 1, 0, 1, 4, 'x11xxxxxxxxxxxxxxxx|1111111111111111111|1111111111111111111|1111111111111111111|1111111111111111111|1111111111111111111|1111111111111111111|111111xxxxxxxxxxxxx|111111xxxxxxxxxxxxx|111111xxxxxxxxxxxxx|111111xxxxxxxxxxxxx|111111xxxxxxxxxxxxx|111111xxxxxxxxxxxxx|111111xxxxxxxxxxxxx|111111xxxxxxxxxxxxx|111111xxxxxxxxxxxxx|111111xxxxxxxxxxxxx|111111xxxxxxxxxxxxx|111111xxxxxxxxxxxxx|111111xxxxxxxxxxxxx|111111xxxxxxxxxxxxx', 'none'), + (87, 'hallC', 'hallC', 0, 0, 1, 4, '11xxxxxxxxxxxxxxx|11111111111111111|11111111111111111|11111111111111111|11111111111111111|11111111111111111|11111111111111111|11111111111111111|11111111111111111|11111111111111111|11111111111111111|11111111111111111|11111111111111111|11111111111111111|11111111111111111|11111111111111111|11111111111111111|11111111111111111', 'none'), + (88, 'hallD', 'hallD', 0, 0, 1, 4, '11xxxxxxxxxxxxxxx|11111111111111111|11111111111111111|11111111111111111|11111111111111111|11111111111111111|11111111111111111|11111111111111111|11111111111111111|11111111111111111|11111111111111111|11111111111111111|11111111111111111|11111111111111111|11111111111111111|11111111111111111|11111111111111111|11111111111111111', 'none'), + (89, 'model_s', 'model_s', 0, 3, 0, 2, 'xxxxxxx|x00000x|x00000x|000000x|x00000x|x00000x|x00000x|x00000x|xxxxxxx', 'flat_trigger'), + (90, 'emperors', 'emperors', 11, 31, 0, 0, 'xxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxx444xxxx4444xxxxxx|xxxx2x4444xxxx44444x2xxx|xxxx2x44444x4x44444x2xxx|xxxx2x4444444444444x2xxx|xxxx2x33xx33333xx33x2xxx|xxxx2222xx22222xx2222xxx|xxxx22222222222222222xxx|xxxx22222222222222222xxx|xxxx22222222222222222xxx|xxxx22222222222222222xxx|xxxx22222222222222222xxx|xxxx22222222222222222xxx|xxxx22222222222222222xxx|xxxx22222222222222222xxx|xxxx22xx222222222xx22xxx|xxxx22222222222222222xxx|xxxx22222222222222222xxx|xxxx22222222222222222xxx|xxxx22222222222222222xxx|xxxx22222222222222222xxx|xxxx22222222222222222xxx|xxxx22222222222222222xxx|xxxx22222xx22x2222222xxx|xxxxx2xx2xx22xxx2xx2xxxx|xxxxxxxxxxx11xxxxxxxxxxx|xxxxxxxxxxx00xxxxxxxxxxx|xxxxxxxxxxx00xxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxx', 'none'), + (91, 'beauty_salon1', 'beauty_salon1', 14, 3, 0, 1, 'xxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxx|xxxxxxxxxxxxxx0xxxxxxxxx|xxxxxxx000000000000000xx|xxxxxx0000000000000000xx|xxxxx000000000000xxxxxxx|xxxx000000000000000000xx|xxx0000000000000000000xx|xxx0000000000000000000xx|xxx0000000000000000000xx|xxxxxxxxxxxxxxxx000000xx|xx0000000000000x000000xx|000000000000000x000000xx|000000000000000x000000xx|000000000000000x000000xx|00x000000000000x000000xx|00xxxxxxxxxxxxxx000000xx|00xxxxxxxxxxxxxx000000xx|00x0000000000000000000xx|00x0000000000000000000xx|00x0000000000000000000xx|0000000000000000000000xx|x000000000000000000000xx|xxx0000000000000000000xx', 'none'); +/*!40000 ALTER TABLE `rooms_models` ENABLE KEYS */; + +-- Dumping structure for table havana.rooms_rights +CREATE TABLE IF NOT EXISTS `rooms_rights` ( + `user_id` int(11) NOT NULL, + `room_id` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.rooms_rights: ~0 rows (approximately) +DELETE FROM `rooms_rights`; +/*!40000 ALTER TABLE `rooms_rights` DISABLE KEYS */; +/*!40000 ALTER TABLE `rooms_rights` ENABLE KEYS */; + +-- Dumping structure for table havana.room_chatlogs +CREATE TABLE IF NOT EXISTS `room_chatlogs` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `user_id` int(11) NOT NULL, + `room_id` int(11) NOT NULL, + `timestamp` bigint(20) NOT NULL, + `chat_type` tinyint(1) NOT NULL, + `message` longtext NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.room_chatlogs: ~0 rows (approximately) +DELETE FROM `room_chatlogs`; +/*!40000 ALTER TABLE `room_chatlogs` DISABLE KEYS */; +/*!40000 ALTER TABLE `room_chatlogs` ENABLE KEYS */; + +-- Dumping structure for table havana.room_visits +CREATE TABLE IF NOT EXISTS `room_visits` ( + `room_id` int(11) NOT NULL, + `user_id` int(11) NOT NULL DEFAULT 0, + `visited_at` datetime NOT NULL DEFAULT current_timestamp(), + UNIQUE KEY `room_id_user_id` (`room_id`,`user_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.room_visits: ~0 rows (approximately) +DELETE FROM `room_visits`; +/*!40000 ALTER TABLE `room_visits` DISABLE KEYS */; +/*!40000 ALTER TABLE `room_visits` ENABLE KEYS */; + +-- Dumping structure for table havana.settings +CREATE TABLE IF NOT EXISTS `settings` ( + `setting` varchar(50) NOT NULL, + `value` longtext NOT NULL DEFAULT '', + PRIMARY KEY (`setting`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.settings: ~0 rows (approximately) +DELETE FROM `settings`; +/*!40000 ALTER TABLE `settings` DISABLE KEYS */; +/*!40000 ALTER TABLE `settings` ENABLE KEYS */; + +-- Dumping structure for table havana.settings_effects +CREATE TABLE IF NOT EXISTS `settings_effects` ( + `effect_id` int(11) NOT NULL, + `duration_seconds` int(11) NOT NULL, + PRIMARY KEY (`effect_id`), + UNIQUE KEY `effect_id` (`effect_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.settings_effects: ~26 rows (approximately) +DELETE FROM `settings_effects`; +/*!40000 ALTER TABLE `settings_effects` DISABLE KEYS */; +INSERT INTO `settings_effects` (`effect_id`, `duration_seconds`) VALUES + (1, 3600), + (2, 3600), + (3, 3600), + (4, 3600), + (5, 3600), + (6, 3600), + (7, 3600), + (8, 3600), + (9, 3600), + (10, 3600), + (11, 3600), + (12, 3600), + (13, 3600), + (14, 3600), + (15, 3600), + (16, 3600), + (17, 3600), + (18, 3600), + (19, 172800), + (20, 172800), + (21, 172800), + (22, 172800), + (23, 172800), + (24, 172800), + (25, 172800), + (26, 172800); +/*!40000 ALTER TABLE `settings_effects` ENABLE KEYS */; + +-- Dumping structure for table havana.site_articles +CREATE TABLE IF NOT EXISTS `site_articles` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `title` varchar(64) DEFAULT 'Undefined Title', + `author_id` int(11) DEFAULT NULL, + `author_override` varchar(50) NOT NULL DEFAULT '', + `short_story` mediumtext DEFAULT NULL, + `full_story` mediumtext DEFAULT 'Undefined Description', + `topstory` varchar(500) DEFAULT '300x187_TS_xantial', + `topstory_override` longtext NOT NULL DEFAULT '', + `article_image` mediumtext NOT NULL DEFAULT '', + `is_published` tinyint(1) NOT NULL DEFAULT 0, + `is_future_published` tinyint(1) NOT NULL DEFAULT 0, + `views` int(11) DEFAULT 0, + `created_at` datetime NOT NULL DEFAULT current_timestamp(), + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.site_articles: ~0 rows (approximately) +DELETE FROM `site_articles`; +/*!40000 ALTER TABLE `site_articles` DISABLE KEYS */; +/*!40000 ALTER TABLE `site_articles` ENABLE KEYS */; + +-- Dumping structure for table havana.site_articles_categories +CREATE TABLE IF NOT EXISTS `site_articles_categories` ( + `article_id` int(11) NOT NULL, + `category_id` int(11) NOT NULL, + KEY `article_id` (`article_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- Dumping data for table havana.site_articles_categories: ~0 rows (approximately) +DELETE FROM `site_articles_categories`; +/*!40000 ALTER TABLE `site_articles_categories` DISABLE KEYS */; +/*!40000 ALTER TABLE `site_articles_categories` ENABLE KEYS */; + +-- Dumping structure for table havana.soundmachine_disks +CREATE TABLE IF NOT EXISTS `soundmachine_disks` ( + `item_id` bigint(11) NOT NULL, + `soundmachine_id` bigint(11) NOT NULL DEFAULT 0, + `slot_id` int(11) NOT NULL, + `song_id` int(11) NOT NULL, + `burned_at` bigint(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.soundmachine_disks: ~0 rows (approximately) +DELETE FROM `soundmachine_disks`; +/*!40000 ALTER TABLE `soundmachine_disks` DISABLE KEYS */; +/*!40000 ALTER TABLE `soundmachine_disks` ENABLE KEYS */; + +-- Dumping structure for table havana.soundmachine_playlists +CREATE TABLE IF NOT EXISTS `soundmachine_playlists` ( + `item_id` bigint(11) NOT NULL, + `song_id` int(11) NOT NULL, + `slot_id` int(11) NOT NULL, + KEY `machineid` (`item_id`), + KEY `songid` (`song_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.soundmachine_playlists: ~0 rows (approximately) +DELETE FROM `soundmachine_playlists`; +/*!40000 ALTER TABLE `soundmachine_playlists` DISABLE KEYS */; +/*!40000 ALTER TABLE `soundmachine_playlists` ENABLE KEYS */; + +-- Dumping structure for table havana.soundmachine_songs +CREATE TABLE IF NOT EXISTS `soundmachine_songs` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `user_id` int(11) NOT NULL DEFAULT 0, + `title` varchar(100) NOT NULL, + `item_id` bigint(11) NOT NULL, + `length` int(3) NOT NULL DEFAULT 0, + `data` text NOT NULL DEFAULT '', + `burnt` tinyint(1) NOT NULL DEFAULT 0, + UNIQUE KEY `id` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.soundmachine_songs: ~0 rows (approximately) +DELETE FROM `soundmachine_songs`; +/*!40000 ALTER TABLE `soundmachine_songs` DISABLE KEYS */; +/*!40000 ALTER TABLE `soundmachine_songs` ENABLE KEYS */; + +-- Dumping structure for table havana.soundmachine_tracks +CREATE TABLE IF NOT EXISTS `soundmachine_tracks` ( + `soundmachine_id` bigint(11) NOT NULL, + `track_id` int(11) NOT NULL, + `slot_id` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.soundmachine_tracks: ~0 rows (approximately) +DELETE FROM `soundmachine_tracks`; +/*!40000 ALTER TABLE `soundmachine_tracks` DISABLE KEYS */; +/*!40000 ALTER TABLE `soundmachine_tracks` ENABLE KEYS */; + +-- Dumping structure for table havana.users +CREATE TABLE IF NOT EXISTS `users` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `username` varchar(255) NOT NULL, + `password` text NOT NULL DEFAULT '', + `figure` varchar(255) NOT NULL, + `pool_figure` varchar(255) NOT NULL DEFAULT '', + `sex` char(1) NOT NULL DEFAULT 'M', + `motto` varchar(100) NOT NULL DEFAULT '', + `email` varchar(255) NOT NULL DEFAULT '', + `credits` int(11) NOT NULL DEFAULT 50, + `pixels` int(11) NOT NULL DEFAULT 0, + `tickets` int(11) NOT NULL DEFAULT 0, + `film` int(11) NOT NULL DEFAULT 0, + `rank` tinyint(1) unsigned NOT NULL DEFAULT 1, + `last_online` datetime NOT NULL DEFAULT current_timestamp(), + `remember_token` varchar(50) DEFAULT NULL, + `is_online` tinyint(1) DEFAULT 0, + `created_at` datetime NOT NULL DEFAULT current_timestamp(), + `updated_at` datetime NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), + `sso_ticket` varchar(255) DEFAULT NULL, + `machine_id` text NOT NULL DEFAULT '', + `club_subscribed` bigint(11) NOT NULL DEFAULT 0, + `club_expiration` bigint(11) NOT NULL DEFAULT 0, + `club_gift_due` bigint(11) NOT NULL DEFAULT 0, + `allow_stalking` tinyint(1) NOT NULL DEFAULT 1, + `allow_friend_requests` tinyint(1) NOT NULL DEFAULT 1, + `online_status_visible` tinyint(1) NOT NULL DEFAULT 1, + `profile_visible` tinyint(1) NOT NULL DEFAULT 1, + `wordfilter_enabled` tinyint(1) NOT NULL DEFAULT 1, + `trade_enabled` tinyint(1) NOT NULL DEFAULT 0, + `trade_ban_expiration` bigint(20) NOT NULL DEFAULT 0, + `sound_enabled` tinyint(1) NOT NULL DEFAULT 1, + `selected_room_id` int(11) NOT NULL DEFAULT 0, + `tutorial_finished` tinyint(1) NOT NULL DEFAULT 0, + `daily_coins_enabled` tinyint(1) NOT NULL DEFAULT 0, + `daily_respect_points` int(11) NOT NULL DEFAULT 3, + `respect_points` int(11) NOT NULL DEFAULT 0, + `respect_day` varchar(11) NOT NULL DEFAULT '', + `respect_given` int(11) NOT NULL DEFAULT 0, + `totem_effect_expiry` bigint(111) NOT NULL DEFAULT 0, + `favourite_group` int(11) NOT NULL DEFAULT 0, + `home_room` int(11) NOT NULL DEFAULT 0, + `has_flash_warning` tinyint(1) NOT NULL DEFAULT 1, + PRIMARY KEY (`id`), + UNIQUE KEY `id` (`id`), + KEY `is_online` (`is_online`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.users: ~0 rows (approximately) +DELETE FROM `users`; +/*!40000 ALTER TABLE `users` DISABLE KEYS */; +/*!40000 ALTER TABLE `users` ENABLE KEYS */; + +-- Dumping structure for table havana.users_achievements +CREATE TABLE IF NOT EXISTS `users_achievements` ( + `achievement_id` int(11) NOT NULL, + `user_id` int(11) NOT NULL, + `progress` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.users_achievements: ~0 rows (approximately) +DELETE FROM `users_achievements`; +/*!40000 ALTER TABLE `users_achievements` DISABLE KEYS */; +/*!40000 ALTER TABLE `users_achievements` ENABLE KEYS */; + +-- Dumping structure for table havana.users_badges +CREATE TABLE IF NOT EXISTS `users_badges` ( + `user_id` int(11) NOT NULL, + `badge` char(50) NOT NULL, + `equipped` tinyint(4) NOT NULL DEFAULT 0, + `slot_id` int(11) NOT NULL DEFAULT 0, + KEY `users_badges_users_FK` (`user_id`), + KEY `user_id` (`user_id`), + CONSTRAINT `users_badges_users_FK` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.users_badges: ~0 rows (approximately) +DELETE FROM `users_badges`; +/*!40000 ALTER TABLE `users_badges` DISABLE KEYS */; +/*!40000 ALTER TABLE `users_badges` ENABLE KEYS */; + +-- Dumping structure for table havana.users_bans +CREATE TABLE IF NOT EXISTS `users_bans` ( + `ban_type` enum('MACHINE_ID','IP_ADDRESS','USER_ID') NOT NULL, + `banned_value` varchar(250) NOT NULL, + `message` text NOT NULL DEFAULT '', + `banned_until` datetime NOT NULL, + `banned_at` datetime NOT NULL DEFAULT current_timestamp(), + `banned_by` int(11) NOT NULL, + `is_active` tinyint(1) NOT NULL DEFAULT 1 +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.users_bans: ~0 rows (approximately) +DELETE FROM `users_bans`; +/*!40000 ALTER TABLE `users_bans` DISABLE KEYS */; +/*!40000 ALTER TABLE `users_bans` ENABLE KEYS */; + +-- Dumping structure for table havana.users_club_gifts +CREATE TABLE IF NOT EXISTS `users_club_gifts` ( + `user_id` int(11) NOT NULL, + `sprite` varchar(50) NOT NULL, + `date_received` datetime NOT NULL DEFAULT current_timestamp() +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.users_club_gifts: ~0 rows (approximately) +DELETE FROM `users_club_gifts`; +/*!40000 ALTER TABLE `users_club_gifts` DISABLE KEYS */; +/*!40000 ALTER TABLE `users_club_gifts` ENABLE KEYS */; + +-- Dumping structure for table havana.users_effects +CREATE TABLE IF NOT EXISTS `users_effects` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `effect_id` int(11) NOT NULL, + `user_id` int(11) NOT NULL, + `expiry_date` bigint(11) NOT NULL, + `activated` tinyint(1) NOT NULL DEFAULT 0, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.users_effects: ~0 rows (approximately) +DELETE FROM `users_effects`; +/*!40000 ALTER TABLE `users_effects` DISABLE KEYS */; +/*!40000 ALTER TABLE `users_effects` ENABLE KEYS */; + +-- Dumping structure for table havana.users_ip_logs +CREATE TABLE IF NOT EXISTS `users_ip_logs` ( + `user_id` int(11) NOT NULL, + `ip_address` varchar(256) NOT NULL, + `created_at` datetime NOT NULL DEFAULT current_timestamp() +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.users_ip_logs: ~0 rows (approximately) +DELETE FROM `users_ip_logs`; +/*!40000 ALTER TABLE `users_ip_logs` DISABLE KEYS */; +/*!40000 ALTER TABLE `users_ip_logs` ENABLE KEYS */; + +-- Dumping structure for table havana.users_mutes +CREATE TABLE IF NOT EXISTS `users_mutes` ( + `user_id` int(11) NOT NULL, + `muted_id` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.users_mutes: ~0 rows (approximately) +DELETE FROM `users_mutes`; +/*!40000 ALTER TABLE `users_mutes` DISABLE KEYS */; +/*!40000 ALTER TABLE `users_mutes` ENABLE KEYS */; + +-- Dumping structure for table havana.users_referred +CREATE TABLE IF NOT EXISTS `users_referred` ( + `user_id` int(11) DEFAULT NULL, + `referred_id` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.users_referred: ~0 rows (approximately) +DELETE FROM `users_referred`; +/*!40000 ALTER TABLE `users_referred` DISABLE KEYS */; +/*!40000 ALTER TABLE `users_referred` ENABLE KEYS */; + +-- Dumping structure for table havana.users_room_favourites +CREATE TABLE IF NOT EXISTS `users_room_favourites` ( + `room_id` int(11) NOT NULL, + `user_id` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.users_room_favourites: ~0 rows (approximately) +DELETE FROM `users_room_favourites`; +/*!40000 ALTER TABLE `users_room_favourites` DISABLE KEYS */; +/*!40000 ALTER TABLE `users_room_favourites` ENABLE KEYS */; + +-- Dumping structure for table havana.users_room_votes +CREATE TABLE IF NOT EXISTS `users_room_votes` ( + `user_id` int(11) NOT NULL, + `room_id` int(11) NOT NULL, + `vote` int(11) NOT NULL, + `expire_time` bigint(11) NOT NULL DEFAULT 0, + KEY `user_id` (`user_id`), + KEY `room_id` (`room_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.users_room_votes: ~0 rows (approximately) +DELETE FROM `users_room_votes`; +/*!40000 ALTER TABLE `users_room_votes` DISABLE KEYS */; +/*!40000 ALTER TABLE `users_room_votes` ENABLE KEYS */; + +-- Dumping structure for table havana.users_statistics +CREATE TABLE IF NOT EXISTS `users_statistics` ( + `user_id` int(11) NOT NULL, + `days_logged_in_row` int(11) NOT NULL DEFAULT 0, + `guestbook_unread_messages` int(11) NOT NULL DEFAULT 0, + `online_time` int(11) NOT NULL DEFAULT 0, + `battleball_score_month` int(11) NOT NULL DEFAULT 0, + `battleball_score_all_time` int(11) NOT NULL DEFAULT 0, + `snowstorm_score_month` int(11) NOT NULL DEFAULT 0, + `snowstorm_score_all_time` int(11) NOT NULL DEFAULT 0, + `wobble_squabble_score_month` int(11) NOT NULL DEFAULT 0, + `wobble_squabble_score_all_time` int(11) NOT NULL DEFAULT 0, + `xp_earned_month` int(11) NOT NULL DEFAULT 0, + `xp_all_time` int(11) NOT NULL DEFAULT 0, + `battleball_games_won` int(11) NOT NULL DEFAULT 0, + `snowstorm_games_won` int(11) NOT NULL DEFAULT 0, + `wobble_squabble_games_won` int(11) NOT NULL DEFAULT 0, + `guided_by` int(11) NOT NULL DEFAULT 0, + `has_tutorial` int(11) NOT NULL DEFAULT 1, + `players_guided` int(11) NOT NULL DEFAULT 0, + `newbie_room_layout` int(11) NOT NULL DEFAULT 0, + `newbie_gift` int(11) NOT NULL DEFAULT 0, + `newbie_gift_time` bigint(11) NOT NULL DEFAULT 0, + `club_gift_due` datetime DEFAULT NULL, + `gifts_due` int(11) NOT NULL DEFAULT 0, + `club_member_time` bigint(11) NOT NULL DEFAULT 0, + `club_member_time_updated` bigint(11) NOT NULL DEFAULT 0, + `activation_code` varchar(255) DEFAULT NULL, + `forgot_password_code` varchar(255) DEFAULT NULL, + `forgot_recovery_requested_time` bigint(11) DEFAULT NULL, + `is_guidable` int(11) NOT NULL DEFAULT 1, + `mute_expires_at` bigint(11) NOT NULL DEFAULT 0, + KEY `activation_code` (`activation_code`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.users_statistics: ~0 rows (approximately) +DELETE FROM `users_statistics`; +/*!40000 ALTER TABLE `users_statistics` DISABLE KEYS */; +/*!40000 ALTER TABLE `users_statistics` ENABLE KEYS */; + +-- Dumping structure for table havana.users_tags +CREATE TABLE IF NOT EXISTS `users_tags` ( + `user_id` int(11) DEFAULT NULL, + `tag` varchar(20) NOT NULL, + `room_id` varchar(20) NOT NULL DEFAULT '0', + `group_id` varchar(20) NOT NULL DEFAULT '0', + `created_at` datetime NOT NULL DEFAULT current_timestamp(), + KEY `user_id` (`user_id`), + KEY `room_id` (`room_id`), + KEY `group_id` (`group_id`), + KEY `tag` (`tag`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.users_tags: ~0 rows (approximately) +DELETE FROM `users_tags`; +/*!40000 ALTER TABLE `users_tags` DISABLE KEYS */; +/*!40000 ALTER TABLE `users_tags` ENABLE KEYS */; + +-- Dumping structure for table havana.users_transactions +CREATE TABLE IF NOT EXISTS `users_transactions` ( + `user_id` int(11) NOT NULL, + `item_id` longtext NOT NULL, + `catalogue_id` longtext NOT NULL, + `amount` int(11) NOT NULL, + `description` longtext NOT NULL DEFAULT '', + `credit_cost` int(11) NOT NULL, + `pixel_cost` int(11) NOT NULL, + `created_at` datetime NOT NULL DEFAULT current_timestamp(), + `is_visible` tinyint(1) NOT NULL DEFAULT 1, + KEY `user_id` (`user_id`), + KEY `created_at` (`created_at`), + KEY `is_visible` (`is_visible`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.users_transactions: ~0 rows (approximately) +DELETE FROM `users_transactions`; +/*!40000 ALTER TABLE `users_transactions` DISABLE KEYS */; +/*!40000 ALTER TABLE `users_transactions` ENABLE KEYS */; + +-- Dumping structure for table havana.users_tutorial_progress +CREATE TABLE IF NOT EXISTS `users_tutorial_progress` ( + `user_id` int(11) NOT NULL, + `flags` varchar(50) DEFAULT '1,2,3,4,5,6,7,8' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.users_tutorial_progress: ~0 rows (approximately) +DELETE FROM `users_tutorial_progress`; +/*!40000 ALTER TABLE `users_tutorial_progress` DISABLE KEYS */; +/*!40000 ALTER TABLE `users_tutorial_progress` ENABLE KEYS */; + +-- Dumping structure for table havana.users_wardrobes +CREATE TABLE IF NOT EXISTS `users_wardrobes` ( + `user_id` int(11) NOT NULL, + `slot_id` tinyint(11) NOT NULL, + `sex` char(1) NOT NULL, + `figure` varchar(255) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.users_wardrobes: ~0 rows (approximately) +DELETE FROM `users_wardrobes`; +/*!40000 ALTER TABLE `users_wardrobes` DISABLE KEYS */; +/*!40000 ALTER TABLE `users_wardrobes` ENABLE KEYS */; + +-- Dumping structure for table havana.vouchers +CREATE TABLE IF NOT EXISTS `vouchers` ( + `voucher_code` varchar(100) NOT NULL, + `credits` int(11) NOT NULL DEFAULT 0, + `expiry_date` datetime DEFAULT NULL, + `is_single_use` tinyint(11) NOT NULL DEFAULT 1, + `allow_new_users` int(1) NOT NULL DEFAULT 0, + UNIQUE KEY `voucher_code` (`voucher_code`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT; + +-- Dumping data for table havana.vouchers: ~0 rows (approximately) +DELETE FROM `vouchers`; +/*!40000 ALTER TABLE `vouchers` DISABLE KEYS */; +/*!40000 ALTER TABLE `vouchers` ENABLE KEYS */; + +-- Dumping structure for table havana.vouchers_history +CREATE TABLE IF NOT EXISTS `vouchers_history` ( + `voucher_code` varchar(100) NOT NULL, + `user_id` int(11) NOT NULL, + `used_at` datetime NOT NULL DEFAULT current_timestamp(), + `credits_redeemed` int(11) DEFAULT NULL, + `items_redeemed` text DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT; + +-- Dumping data for table havana.vouchers_history: ~0 rows (approximately) +DELETE FROM `vouchers_history`; +/*!40000 ALTER TABLE `vouchers_history` DISABLE KEYS */; +/*!40000 ALTER TABLE `vouchers_history` ENABLE KEYS */; + +-- Dumping structure for table havana.vouchers_items +CREATE TABLE IF NOT EXISTS `vouchers_items` ( + `voucher_code` varchar(100) NOT NULL, + `catalogue_sale_code` varchar(100) NOT NULL, + KEY `voucher_code` (`voucher_code`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT; + +-- Dumping data for table havana.vouchers_items: ~0 rows (approximately) +DELETE FROM `vouchers_items`; +/*!40000 ALTER TABLE `vouchers_items` DISABLE KEYS */; +/*!40000 ALTER TABLE `vouchers_items` ENABLE KEYS */; + +-- Dumping structure for view havana.vw_users_hc_duplicates +-- Creating temporary table to overcome VIEW dependency errors +CREATE TABLE `vw_users_hc_duplicates` ( + `gift_count` BIGINT(21) NOT NULL, + `user_id` INT(11) NOT NULL, + `sprite` VARCHAR(50) NOT NULL COLLATE 'utf8mb4_general_ci', + `date_received` DATETIME NOT NULL +) ENGINE=MyISAM; + +-- Dumping structure for table havana.wordfilter +CREATE TABLE IF NOT EXISTS `wordfilter` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `word` varchar(100) NOT NULL, + `is_bannable` int(11) NOT NULL DEFAULT 0, + `is_filterable` int(11) NOT NULL DEFAULT 1, + PRIMARY KEY (`id`), + UNIQUE KEY `word` (`word`) +) ENGINE=InnoDB AUTO_INCREMENT=131 DEFAULT CHARSET=utf8mb4; + +-- Dumping data for table havana.wordfilter: ~127 rows (approximately) +DELETE FROM `wordfilter`; +/*!40000 ALTER TABLE `wordfilter` DISABLE KEYS */; +INSERT INTO `wordfilter` (`id`, `word`, `is_bannable`, `is_filterable`) VALUES + (1, 'aaron', 0, 1), + (2, 'anal', 0, 1), + (3, 'anus', 0, 1), + (4, 'arse', 0, 1), + (5, 'ass fuck', 0, 1), + (6, 'ass hole', 0, 1), + (7, 'assfucker', 0, 1), + (8, 'asshole', 0, 1), + (9, 'assshole', 0, 1), + (10, 'bastard', 0, 1), + (11, 'bitch', 0, 1), + (12, 'black cock', 0, 1), + (14, 'boong', 0, 1), + (15, 'cockfucker', 0, 1), + (16, 'cocksuck', 0, 1), + (17, 'cocksucker', 0, 1), + (18, 'coon', 0, 1), + (19, 'coonnass', 0, 1), + (20, 'crap', 0, 1), + (21, 'cunt', 0, 0), + (22, 'cyberfuck', 0, 1), + (23, 'dick', 0, 1), + (24, 'douche', 0, 1), + (25, 'erect', 0, 1), + (26, 'erection', 0, 1), + (27, 'erotic', 0, 1), + (28, 'escort', 0, 1), + (29, 'fag', 0, 0), + (30, 'faggot', 0, 0), + (31, 'fuck', 0, 1), + (32, 'Fuck off', 0, 1), + (33, 'fuck you', 0, 1), + (34, 'fuckass', 0, 1), + (35, 'fuckhole', 0, 1), + (36, 'fuckwit', 0, 1), + (37, 'god damn', 0, 1), + (38, 'goddamn', 0, 1), + (39, 'gook', 0, 1), + (40, 'h4bb0 id', 1, 0), + (41, 'h4bb0 ld', 1, 0), + (42, 'h4bb0,id', 1, 0), + (43, 'h4bb0.1d', 1, 0), + (44, 'h4bb0.id', 1, 0), + (45, 'h4bb0.ld', 1, 0), + (46, 'h4bbo 1d', 1, 0), + (47, 'h4bbo id', 1, 0), + (48, 'h4bbo.1d', 1, 0), + (49, 'h4bbo.id', 1, 0), + (50, 'h4bbo.ld', 1, 0), + (51, 'h4bbo:1d', 1, 0), + (52, 'h4bbo:id', 1, 0), + (53, 'habb0 id', 1, 0), + (54, 'habb0 ld', 1, 0), + (55, 'habb0.d', 1, 0), + (56, 'habb0.id', 1, 0), + (57, 'habb0.¡d', 1, 0), + (58, 'habbb0 id', 1, 0), + (59, 'habbb0 ld', 1, 0), + (60, 'habbb0.id', 1, 0), + (61, 'habbbo . ¡d', 1, 0), + (62, 'habbbo .¡d', 1, 0), + (63, 'habbbo id', 1, 0), + (64, 'habbbo.¡d', 1, 0), + (65, 'habbboid', 1, 0), + (66, 'habbbold', 1, 0), + (67, 'habbo .id', 1, 0), + (68, 'habbo 1d', 1, 0), + (69, 'habbo dot id', 1, 0), + (70, 'habbo id', 1, 0), + (71, 'habbo ld', 1, 0), + (72, 'habbo ¡d', 1, 0), + (73, 'habbo(.)id', 1, 0), + (74, 'habbo,id', 1, 0), + (75, 'habbo,ld', 1, 0), + (76, 'habbo. id', 1, 0), + (77, 'habbo.1d', 1, 0), + (78, 'habbo.id', 1, 0), + (79, 'habbo.ld', 1, 0), + (80, 'habbo.¡d', 1, 0), + (81, 'habbo:id', 1, 0), + (82, 'habbo:ld', 1, 0), + (83, 'habboid', 1, 0), + (84, 'habbold', 1, 0), + (85, 'hard core', 0, 1), + (86, 'hardcore', 0, 1), + (87, 'haββo id', 1, 0), + (88, 'haββo,id', 1, 0), + (89, 'haββo.id', 1, 0), + (90, 'haββo:id', 1, 0), + (91, 'haββoid', 1, 0), + (92, 'homoerotic', 0, 1), + (93, 'hore', 0, 1), + (94, 'mother fucker', 0, 1), + (95, 'motherfuck', 0, 1), + (96, 'motherfucker', 0, 1), + (97, 'nigger', 0, 0), + (98, 'orgasim', 0, 1), + (99, 'orgasm', 0, 1), + (100, 'penis', 0, 1), + (101, 'penisfucker', 0, 1), + (102, 'piss', 0, 1), + (103, 'piss off', 0, 1), + (104, 'porn', 0, 1), + (105, 'porno', 0, 1), + (106, 'pornography', 0, 1), + (107, 'pussy', 0, 1), + (108, 'retard', 0, 1), + (109, 'sadist', 0, 1), + (111, 'sexy', 0, 1), + (112, 'shit', 0, 1), + (113, 'slut', 0, 1), + (114, 'sojobo', 0, 1), + (115, 'son of a bitch', 0, 1), + (116, 'tits', 0, 1), + (117, 'viagra', 0, 1), + (118, 'whore', 0, 1), + (119, 'zaphotel', 0, 0), + (120, 'habfun', 1, 0), + (121, 'hretro', 1, 0), + (122, 'habme.net', 1, 0), + (124, 'habm e.net', 1, 0), + (125, '400+ daily players // free hc // free creds+diamonds', 1, 0), + (126, 'h abme.net', 1, 0), + (127, 'ha bme.net', 1, 0), + (128, 'hab me.net', 1, 0), + (129, 'habme. net', 1, 0), + (130, 'habme .net', 1, 0); +/*!40000 ALTER TABLE `wordfilter` ENABLE KEYS */; + +-- Dumping structure for view havana.vw_users_hc_duplicates +-- Removing temporary table and create final VIEW structure +DROP TABLE IF EXISTS `vw_users_hc_duplicates`; +CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `vw_users_hc_duplicates` AS select count(0) AS `gift_count`,`users_club_gifts`.`user_id` AS `user_id`,`users_club_gifts`.`sprite` AS `sprite`,`users_club_gifts`.`date_received` AS `date_received` from `users_club_gifts` group by `users_club_gifts`.`user_id`,`users_club_gifts`.`date_received`,`users_club_gifts`.`sprite` having count(0) > 1 order by count(0) desc ; + +/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */; +/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; diff --git a/tools/snowstorm_maps/arena_1.dat b/tools/snowstorm_maps/arena_1.dat new file mode 100644 index 0000000..1954bad --- /dev/null +++ b/tools/snowstorm_maps/arena_1.dat @@ -0,0 +1 @@ +n280 sw_fence 28 0 100000 2 n281 sw_fence 28 1 100000 2 n282 sw_fence 28 2 100000 2 g223 sw_tree1 22 3 0 1 n283 sw_fence 28 3 100000 2 n284 sw_fence 28 4 100000 2 j275 sw_tree4 27 5 0 1 n285 sw_fence 28 5 0 2 n286 sw_fence 28 6 0 2 h227 sw_tree2 22 7 0 1 n287 sw_fence 28 7 0 2 n288 sw_fence 28 8 0 2 n289 sw_fence 28 9 0 2 g1610 sw_tree1 16 10 0 1 n2810 sw_fence 28 10 0 2 j3413 sw_tree4 34 13 0 1 n1314 sw_fence 13 14 0 4 n1414 sw_fence 14 14 0 4 n1514 sw_fence 15 14 0 4 n1614 sw_fence 16 14 0 4 n1714 sw_fence 17 14 0 4 n1814 sw_fence 18 14 0 4 n1914 sw_fence 19 14 0 4 n2014 sw_fence 20 14 0 4 n2114 sw_fence 21 14 0 4 n2214 sw_fence 22 14 0 4 h1315 sw_tree2 13 15 0 1 b218 block_basic2 2 18 0 1 b318 block_basic2 3 18 0 1 b418 block_basic2 4 18 0 1 b518 block_basic2 5 18 0 1 b618 block_basic2 6 18 0 1 b718 block_basic2 7 18 0 1 b818 block_basic2 8 18 0 1 b918 block_basic2 9 18 0 1 b1018 block_basic2 10 18 0 1 b1118 block_basic2 11 18 0 1 a1218 block_basic 12 18 0 1 b219 block_basic2 2 19 0 1 v020 sw_backround2 0 20 0 0 b220 block_basic2 2 20 0 1 g620 sw_tree1 6 20 0 1 b3820 block_basic2 38 20 0 1 b3920 block_basic2 39 20 0 1 b4020 block_basic2 40 20 0 1 b4120 block_basic2 41 20 0 1 b4220 block_basic2 42 20 0 1 b4320 block_basic2 43 20 0 1 b221 block_basic2 2 21 0 1 b3821 block_basic2 38 21 0 1 b222 block_basic2 2 22 0 1 b3822 block_basic2 38 22 0 1 b3823 block_basic2 38 23 0 1 h524 sw_tree2 5 24 0 1 b3824 block_basic2 38 24 0 1 g4525 sw_tree1 45 25 0 1 i1026 sw_tree3 10 26 0 1 h4928 sw_tree2 49 28 0 1 i4732 sw_tree3 47 32 0 1 j1534 sw_tree4 15 34 0 1 a3737 block_basic 37 37 0 1 b3837 block_basic2 38 37 0 1 b3937 block_basic2 39 37 0 1 b4037 block_basic2 40 37 0 1 b4137 block_basic2 41 37 0 1 a4237 block_basic 42 37 0 1 b2338 block_basic2 23 38 0 1 n2438 sw_fence 24 38 0 2 g2538 sw_tree1 25 38 0 1 a2339 block_basic 23 39 0 1 n2439 sw_fence 24 39 0 2 b2340 block_basic2 23 40 0 1 n2440 sw_fence 24 40 0 2 h1941 sw_tree2 19 41 0 1 a2341 block_basic 23 41 0 1 n2441 sw_fence 24 41 0 2 b2342 block_basic2 23 42 0 1 n2442 sw_fence 24 42 0 2 a2343 block_basic 23 43 0 1 n2443 sw_fence 24 43 0 2 b2344 block_basic2 23 44 0 1 n2444 sw_fence 24 44 0 2 a2345 block_basic 23 45 0 1 n2445 sw_fence 24 45 0 2 b2346 block_basic2 23 46 100000 1 n2446 sw_fence 24 46 0 2 i2847 sw_tree3 28 47 0 1 h3447 sw_tree2 34 47 100000 1 \ No newline at end of file diff --git a/tools/snowstorm_maps/arena_1_snowmachines.dat b/tools/snowstorm_maps/arena_1_snowmachines.dat new file mode 100644 index 0000000..7ffda70 --- /dev/null +++ b/tools/snowstorm_maps/arena_1_snowmachines.dat @@ -0,0 +1 @@ +25 24 \ No newline at end of file diff --git a/tools/snowstorm_maps/arena_1_spawn_clusters.dat b/tools/snowstorm_maps/arena_1_spawn_clusters.dat new file mode 100644 index 0000000..fbd1616 --- /dev/null +++ b/tools/snowstorm_maps/arena_1_spawn_clusters.dat @@ -0,0 +1 @@ +30 41 8 4|39 33 8 4|39 28 12 4 \ No newline at end of file diff --git a/tools/snowstorm_maps/arena_2.dat b/tools/snowstorm_maps/arena_2.dat new file mode 100644 index 0000000..60ae877 --- /dev/null +++ b/tools/snowstorm_maps/arena_2.dat @@ -0,0 +1 @@ +j233 sw_tree4 23 3 0 1 n283 sw_fence 28 3 100000 2 n284 sw_fence 28 4 100000 2 n285 sw_fence 28 5 0 2 n286 sw_fence 28 6 0 2 n287 sw_fence 28 7 0 2 h297 sw_tree2 29 7 0 1 i198 sw_tree3 19 8 0 1 n288 sw_fence 28 8 0 2 n289 sw_fence 28 9 0 2 n2810 sw_fence 28 10 0 2 g2910 sw_tree1 29 10 0 1 n2811 sw_fence 28 11 0 2 n2812 sw_fence 28 12 0 2 n2813 sw_fence 28 13 0 2 n2814 sw_fence 28 14 0 2 n2815 sw_fence 28 15 0 2 n2816 sw_fence 28 16 0 2 n2817 sw_fence 28 17 0 2 g4018 sw_tree1 40 18 0 1 j319 sw_tree4 3 19 0 1 n719 sw_fence 7 19 0 4 n819 sw_fence 8 19 0 4 n919 sw_fence 9 19 0 4 n1019 sw_fence 10 19 0 4 n1119 sw_fence 11 19 0 4 n1219 sw_fence 12 19 0 4 n1319 sw_fence 13 19 0 4 n1419 sw_fence 14 19 0 4 n1519 sw_fence 15 19 0 4 n1619 sw_fence 16 19 0 4 n1719 sw_fence 17 19 0 4 w020 sw_backround3 0 20 0 0 h620 sw_tree2 6 20 0 1 h2424 sw_tree2 24 24 0 1 i926 sw_tree3 9 26 0 1 i3926 sw_tree3 39 26 0 1 j4627 sw_tree4 46 27 0 1 g2329 sw_tree1 23 29 0 1 a3329 block_basic 33 29 0 1 a3330 block_basic 33 30 0 1 a3331 block_basic 33 31 0 1 a2832 block_basic 28 32 0 1 a2932 block_basic 29 32 0 1 a3032 block_basic 30 32 0 1 h1837 sw_tree2 18 37 0 1 i4238 sw_tree3 42 38 0 1 j3249 sw_tree4 32 49 100000 1 \ No newline at end of file diff --git a/tools/snowstorm_maps/arena_2_snowmachines.dat b/tools/snowstorm_maps/arena_2_snowmachines.dat new file mode 100644 index 0000000..4816452 --- /dev/null +++ b/tools/snowstorm_maps/arena_2_snowmachines.dat @@ -0,0 +1 @@ +26 26 \ No newline at end of file diff --git a/tools/snowstorm_maps/arena_2_spawn_clusters.dat b/tools/snowstorm_maps/arena_2_spawn_clusters.dat new file mode 100644 index 0000000..32d172d --- /dev/null +++ b/tools/snowstorm_maps/arena_2_spawn_clusters.dat @@ -0,0 +1 @@ +33 37 8 4|18 12 8 4|12 26 8 4 \ No newline at end of file diff --git a/tools/snowstorm_maps/arena_3.dat b/tools/snowstorm_maps/arena_3.dat new file mode 100644 index 0000000..a376973 --- /dev/null +++ b/tools/snowstorm_maps/arena_3.dat @@ -0,0 +1 @@ +c230 block_basic3 23 0 0 1 b231 block_basic2 23 1 0 1 c232 block_basic3 23 2 0 1 b233 block_basic2 23 3 0 1 g184 sw_tree1 18 4 0 1 j204 sw_tree4 20 4 0 1 c234 block_basic3 23 4 0 1 h264 sw_tree2 26 4 0 1 b235 block_basic2 23 5 0 1 j255 sw_tree4 25 5 0 1 h186 sw_tree2 18 6 0 1 i226 sw_tree3 22 6 0 1 c236 block_basic3 23 6 0 1 b237 block_basic2 23 7 0 1 c118 block_basic3 11 8 0 1 b128 block_basic2 12 8 0 1 c138 block_basic3 13 8 0 1 b148 block_basic2 14 8 0 1 c158 block_basic3 15 8 0 1 b168 block_basic2 16 8 0 1 c178 block_basic3 17 8 0 1 b188 block_basic2 18 8 0 1 c198 block_basic3 19 8 0 1 b208 block_basic2 20 8 0 1 c218 block_basic3 21 8 0 1 b228 block_basic2 22 8 0 1 o238 block_arch1b 23 8 0 1 g268 sw_tree1 26 8 0 1 c119 block_basic3 11 9 0 1 b1110 block_basic2 11 10 0 1 u2310 block_arch3b 23 10 0 1 c811 block_basic3 8 11 0 1 b911 block_basic2 9 11 0 1 b1011 block_basic2 10 11 0 1 a1111 block_basic 11 11 0 1 a1411 block_basic 14 11 0 1 b1511 block_basic2 15 11 0 1 a1611 block_basic 16 11 0 1 b1711 block_basic2 17 11 0 1 a1811 block_basic 18 11 0 1 q1911 block_ice2 19 11 0 1 p2011 block_ice 20 11 0 1 a2211 block_basic 22 11 0 1 b2311 block_basic2 23 11 0 1 b812 block_basic2 8 12 0 1 b1912 block_basic2 19 12 0 1 a2312 block_basic 23 12 0 1 c813 block_basic3 8 13 0 1 b1913 block_basic2 19 13 0 1 b2313 block_basic2 23 13 0 1 b814 block_basic2 8 14 0 1 a1214 block_basic 12 14 0 1 o1914 block_arch1b 19 14 0 1 a2314 block_basic 23 14 0 1 c815 block_basic3 8 15 0 1 b1215 block_basic2 12 15 0 1 b2315 block_basic2 23 15 0 1 p3415 block_ice 34 15 0 1 b816 block_basic2 8 16 0 1 b1216 block_basic2 12 16 0 1 u1916 block_arch3b 19 16 0 1 a2316 block_basic 23 16 0 1 q3416 block_ice2 34 16 0 1 c817 block_basic3 8 17 0 1 b1217 block_basic2 12 17 0 1 b1917 block_basic2 19 17 0 1 p3417 block_ice 34 17 0 1 i418 sw_tree3 4 18 0 1 b818 block_basic2 8 18 0 1 a1018 block_basic 10 18 0 1 a1218 block_basic 12 18 0 1 a1418 block_basic 14 18 0 1 b1518 block_basic2 15 18 0 1 a1618 block_basic 16 18 0 1 b1718 block_basic2 17 18 0 1 a1818 block_basic 18 18 0 1 q1918 block_ice2 19 18 0 1 p2018 block_ice 20 18 0 1 q3418 block_ice2 34 18 0 1 r019 sw_backround6 0 19 0 0 c819 block_basic3 8 19 0 1 b1919 block_basic2 19 19 0 1 p3419 block_ice 34 19 0 1 b820 block_basic2 8 20 0 1 o1920 block_arch1b 19 20 0 1 c821 block_basic3 8 21 0 1 h622 sw_tree2 6 22 0 1 b822 block_basic2 8 22 0 1 u1922 block_arch3b 19 22 0 1 g423 sw_tree1 4 23 0 1 c823 block_basic3 8 23 0 1 b1923 block_basic2 19 23 0 1 b824 block_basic2 8 24 0 1 b1924 block_basic2 19 24 0 1 j425 sw_tree4 4 25 0 1 c825 block_basic3 8 25 0 1 q925 block_ice2 9 25 0 1 p1025 block_ice 10 25 0 1 p1325 block_ice 13 25 0 1 q1425 block_ice2 14 25 0 1 a1525 block_basic 15 25 0 1 b1625 block_basic2 16 25 0 1 a1725 block_basic 17 25 0 1 b1825 block_basic2 18 25 0 1 c1925 block_basic3 19 25 0 1 q2025 block_ice2 20 25 0 1 p2125 block_ice 21 25 0 1 b826 block_basic2 8 26 0 1 b1926 block_basic2 19 26 0 1 p4026 block_ice 40 26 0 1 c827 block_basic3 8 27 0 1 b1927 block_basic2 19 27 0 1 q4027 block_ice2 40 27 0 1 b828 block_basic2 8 28 0 1 o1928 block_arch1b 19 28 0 1 p4028 block_ice 40 28 0 1 c829 block_basic3 8 29 0 1 q4029 block_ice2 40 29 0 1 b830 block_basic2 8 30 0 1 u1930 block_arch3b 19 30 0 1 p4030 block_ice 40 30 0 1 b1931 block_basic2 19 31 0 1 a1032 block_basic 10 32 0 1 a1232 block_basic 12 32 0 1 a1432 block_basic 14 32 0 1 b1532 block_basic2 15 32 0 1 a1632 block_basic 16 32 0 1 b1732 block_basic2 17 32 0 1 a1832 block_basic 18 32 0 1 q1932 block_ice2 19 32 0 1 p2032 block_ice 20 32 0 1 b1233 block_basic2 12 33 0 1 b1933 block_basic2 19 33 0 1 b1234 block_basic2 12 34 0 1 o1934 block_arch1b 19 34 0 1 a2335 block_basic 23 35 0 1 p3435 block_ice 34 35 0 1 u1936 block_arch3b 19 36 0 1 b2336 block_basic2 23 36 0 1 q3436 block_ice2 34 36 0 1 b1937 block_basic2 19 37 0 1 a2337 block_basic 23 37 0 1 p3437 block_ice 34 37 0 1 b1938 block_basic2 19 38 0 1 b2338 block_basic2 23 38 0 1 q3438 block_ice2 34 38 0 1 b1739 block_basic2 17 39 0 1 a1839 block_basic 18 39 0 1 q1939 block_ice2 19 39 0 1 p2039 block_ice 20 39 0 1 a2239 block_basic 22 39 0 1 a2339 block_basic 23 39 0 1 p3439 block_ice 34 39 0 1 a2340 block_basic 23 40 0 1 a2341 block_basic 23 41 0 1 g2143 sw_tree1 21 43 0 1 a2343 block_basic 23 43 0 1 b2344 block_basic2 23 44 0 1 i3144 sw_tree3 31 44 0 1 c2345 block_basic3 23 45 0 1 g3046 sw_tree1 30 46 0 1 j3246 sw_tree4 32 46 0 1 h3148 sw_tree2 31 48 0 1 \ No newline at end of file diff --git a/tools/snowstorm_maps/arena_3_snowmachines.dat b/tools/snowstorm_maps/arena_3_snowmachines.dat new file mode 100644 index 0000000..c0f8ab2 --- /dev/null +++ b/tools/snowstorm_maps/arena_3_snowmachines.dat @@ -0,0 +1 @@ +36 17 42 28 36 37 \ No newline at end of file diff --git a/tools/snowstorm_maps/arena_3_spawn_clusters.dat b/tools/snowstorm_maps/arena_3_spawn_clusters.dat new file mode 100644 index 0000000..5e9aede --- /dev/null +++ b/tools/snowstorm_maps/arena_3_spawn_clusters.dat @@ -0,0 +1 @@ +14 21 3 1|15 14 3 1|23 19 3 1 \ No newline at end of file diff --git a/tools/snowstorm_maps/arena_4.dat b/tools/snowstorm_maps/arena_4.dat new file mode 100644 index 0000000..b66f94e --- /dev/null +++ b/tools/snowstorm_maps/arena_4.dat @@ -0,0 +1 @@ +h221 sw_tree2 22 1 0 1 h204 sw_tree2 20 4 0 1 g244 sw_tree1 24 4 0 1 g275 sw_tree1 27 5 0 1 i246 sw_tree3 24 6 0 1 j278 sw_tree4 27 8 0 1 j209 sw_tree4 20 9 0 1 h319 sw_tree2 31 9 0 1 h1610 sw_tree2 16 10 0 1 i1013 sw_tree3 10 13 0 1 i2713 sw_tree3 27 13 0 1 g1815 sw_tree1 18 15 0 1 i3916 sw_tree3 39 16 0 1 g1017 sw_tree1 10 17 0 1 h2517 sw_tree2 25 17 0 1 h418 sw_tree2 4 18 0 1 j718 sw_tree4 7 18 0 1 j1519 sw_tree4 15 19 0 1 j3520 sw_tree4 35 20 0 1 j121 sw_tree4 1 21 0 1 i1121 sw_tree3 11 21 0 1 g522 sw_tree1 5 22 0 1 h722 sw_tree2 7 22 0 1 g2223 sw_tree1 22 23 0 1 h4323 sw_tree2 43 23 0 1 h425 sw_tree2 4 25 0 1 g4725 sw_tree1 47 25 0 1 i727 sw_tree3 7 27 0 1 i2030 sw_tree3 20 30 0 1 j3931 sw_tree4 39 31 0 1 g1133 sw_tree1 11 33 0 1 i4734 sw_tree3 47 34 100000 1 j1636 sw_tree4 16 36 0 1 h2937 sw_tree2 29 37 0 1 i2239 sw_tree3 22 39 0 1 i3843 sw_tree3 38 43 100000 1 g2445 sw_tree1 24 45 0 1 j3248 sw_tree4 32 48 0 1 h2749 sw_tree2 27 49 0 1 \ No newline at end of file diff --git a/tools/snowstorm_maps/arena_4_spawn_clusters.dat b/tools/snowstorm_maps/arena_4_spawn_clusters.dat new file mode 100644 index 0000000..9acd398 --- /dev/null +++ b/tools/snowstorm_maps/arena_4_spawn_clusters.dat @@ -0,0 +1 @@ +26 27 50 10| \ No newline at end of file diff --git a/tools/snowstorm_maps/arena_5.dat b/tools/snowstorm_maps/arena_5.dat new file mode 100644 index 0000000..70d391e --- /dev/null +++ b/tools/snowstorm_maps/arena_5.dat @@ -0,0 +1 @@ +i231 sw_tree3 23 1 0 1 h202 sw_tree2 20 2 0 1 j254 sw_tree4 25 4 0 1 g195 sw_tree1 19 5 0 1 a198 block_basic 19 8 0 1 a298 block_basic 29 8 0 1 a308 block_basic 30 8 0 1 a318 block_basic 31 8 0 1 a328 block_basic 32 8 100000 1 a338 block_basic 33 8 100000 1 a348 block_basic 34 8 100000 1 a358 block_basic 35 8 100000 1 a199 block_basic 19 9 0 1 a359 block_basic 35 9 100000 1 a1910 block_basic 19 10 0 1 a2210 block_basic 22 10 0 1 a2310 block_basic 23 10 0 1 a2410 block_basic 24 10 0 1 a2510 block_basic 25 10 0 1 a3510 block_basic 35 10 100000 1 a1011 block_basic 10 11 0 1 a1111 block_basic 11 11 0 1 a1211 block_basic 12 11 0 1 a1311 block_basic 13 11 0 1 a1411 block_basic 14 11 0 1 a1511 block_basic 15 11 0 1 a1611 block_basic 16 11 0 1 a1711 block_basic 17 11 0 1 a1811 block_basic 18 11 0 1 a1911 block_basic 19 11 0 1 a2211 block_basic 22 11 0 1 a2511 block_basic 25 11 0 1 a2811 block_basic 28 11 0 1 a2911 block_basic 29 11 0 1 a3011 block_basic 30 11 0 1 a3111 block_basic 31 11 0 1 a3211 block_basic 32 11 0 1 a3511 block_basic 35 11 100000 1 a1012 block_basic 10 12 0 1 a2212 block_basic 22 12 0 1 a2512 block_basic 25 12 0 1 a2812 block_basic 28 12 0 1 a3212 block_basic 32 12 0 1 a3512 block_basic 35 12 0 1 a1013 block_basic 10 13 0 1 a2213 block_basic 22 13 0 1 a2313 block_basic 23 13 0 1 a2413 block_basic 24 13 0 1 a2513 block_basic 25 13 0 1 a2813 block_basic 28 13 0 1 a3213 block_basic 32 13 0 1 a3513 block_basic 35 13 0 1 a1014 block_basic 10 14 0 1 a1314 block_basic 13 14 0 1 a1414 block_basic 14 14 0 1 a1514 block_basic 15 14 0 1 a1614 block_basic 16 14 0 1 a1914 block_basic 19 14 0 1 a2814 block_basic 28 14 0 1 a2914 block_basic 29 14 0 1 a3014 block_basic 30 14 0 1 a3114 block_basic 31 14 0 1 a3214 block_basic 32 14 0 1 a3514 block_basic 35 14 0 1 a1015 block_basic 10 15 0 1 a1315 block_basic 13 15 0 1 a1915 block_basic 19 15 0 1 a3515 block_basic 35 15 0 1 g716 sw_tree1 7 16 0 1 a1016 block_basic 10 16 0 1 a1316 block_basic 13 16 0 1 a1916 block_basic 19 16 0 1 a2216 block_basic 22 16 0 1 a2516 block_basic 25 16 0 1 a3516 block_basic 35 16 0 1 a1017 block_basic 10 17 0 1 a1317 block_basic 13 17 0 1 a1617 block_basic 16 17 0 1 a1717 block_basic 17 17 0 1 a1817 block_basic 18 17 0 1 a1917 block_basic 19 17 0 1 a2217 block_basic 22 17 0 1 a2517 block_basic 25 17 0 1 a2817 block_basic 28 17 0 1 a2917 block_basic 29 17 0 1 a3017 block_basic 30 17 0 1 a3117 block_basic 31 17 0 1 a3217 block_basic 32 17 0 1 a3517 block_basic 35 17 0 1 a3617 block_basic 36 17 0 1 a3717 block_basic 37 17 0 1 a3817 block_basic 38 17 0 1 a3917 block_basic 39 17 0 1 a4017 block_basic 40 17 0 1 a4117 block_basic 41 17 100000 1 a4217 block_basic 42 17 100000 1 a1018 block_basic 10 18 0 1 a2218 block_basic 22 18 0 1 a2518 block_basic 25 18 0 1 a2818 block_basic 28 18 0 1 a4218 block_basic 42 18 100000 1 h419 sw_tree2 4 19 0 1 a819 block_basic 8 19 0 1 a919 block_basic 9 19 0 1 a1019 block_basic 10 19 0 1 a2219 block_basic 22 19 0 1 a2519 block_basic 25 19 0 1 a2819 block_basic 28 19 0 1 a4219 block_basic 42 19 0 1 a1320 block_basic 13 20 0 1 a1620 block_basic 16 20 0 1 a1720 block_basic 17 20 0 1 a1820 block_basic 18 20 0 1 a1920 block_basic 19 20 0 1 a2220 block_basic 22 20 0 1 a2320 block_basic 23 20 0 1 a2420 block_basic 24 20 0 1 a2520 block_basic 25 20 0 1 a2820 block_basic 28 20 0 1 a2920 block_basic 29 20 0 1 a3020 block_basic 30 20 0 1 a3120 block_basic 31 20 0 1 a3220 block_basic 32 20 0 1 a3320 block_basic 33 20 0 1 a3620 block_basic 36 20 0 1 a3720 block_basic 37 20 0 1 a3820 block_basic 38 20 0 1 a3920 block_basic 39 20 0 1 a4220 block_basic 42 20 0 1 a1321 block_basic 13 21 0 1 a1621 block_basic 16 21 0 1 a1921 block_basic 19 21 0 1 a3321 block_basic 33 21 0 1 a3621 block_basic 36 21 0 1 a4221 block_basic 42 21 0 1 a822 block_basic 8 22 0 1 a922 block_basic 9 22 0 1 a1022 block_basic 10 22 0 1 a1322 block_basic 13 22 0 1 a1922 block_basic 19 22 0 1 a3322 block_basic 33 22 0 1 a3622 block_basic 36 22 0 1 a4222 block_basic 42 22 0 1 a1023 block_basic 10 23 0 1 a1323 block_basic 13 23 0 1 a1923 block_basic 19 23 0 1 a3323 block_basic 33 23 0 1 a3623 block_basic 36 23 0 1 a3923 block_basic 39 23 0 1 a4023 block_basic 40 23 0 1 a4123 block_basic 41 23 0 1 a4223 block_basic 42 23 0 1 i324 sw_tree3 3 24 0 1 a1024 block_basic 10 24 0 1 a1324 block_basic 13 24 0 1 a1624 block_basic 16 24 0 1 a1724 block_basic 17 24 0 1 a1824 block_basic 18 24 0 1 a1924 block_basic 19 24 0 1 a3324 block_basic 33 24 0 1 a3624 block_basic 36 24 0 1 a3924 block_basic 39 24 0 1 a4024 block_basic 40 24 0 1 a4124 block_basic 41 24 0 1 a4224 block_basic 42 24 0 1 a825 block_basic 8 25 0 1 a925 block_basic 9 25 0 1 a1025 block_basic 10 25 0 1 h4926 sw_tree2 49 26 0 1 a1327 block_basic 13 27 0 1 a1627 block_basic 16 27 0 1 a1727 block_basic 17 27 0 1 a1827 block_basic 18 27 0 1 a1927 block_basic 19 27 0 1 a3327 block_basic 33 27 0 1 a3427 block_basic 34 27 0 1 a3527 block_basic 35 27 0 0 a3627 block_basic 36 27 0 1 a3927 block_basic 39 27 0 1 a4027 block_basic 40 27 0 1 a4127 block_basic 41 27 0 1 a4227 block_basic 42 27 0 1 a4327 block_basic 43 27 0 1 a4427 block_basic 44 27 0 1 a828 block_basic 8 28 0 1 a928 block_basic 9 28 0 1 a1028 block_basic 10 28 0 1 a1328 block_basic 13 28 0 1 a1928 block_basic 19 28 0 1 a3328 block_basic 33 28 0 1 a1029 block_basic 10 29 0 1 a1329 block_basic 13 29 0 1 a1929 block_basic 19 29 0 1 a3329 block_basic 33 29 0 1 a1030 block_basic 10 30 0 1 a1330 block_basic 13 30 0 1 a1630 block_basic 16 30 0 1 a1930 block_basic 19 30 0 1 a3330 block_basic 33 30 0 1 a3430 block_basic 34 30 0 1 a3530 block_basic 35 30 0 1 a3630 block_basic 36 30 0 1 a3930 block_basic 39 30 0 1 a4030 block_basic 40 30 0 1 a4130 block_basic 41 30 0 1 a4230 block_basic 42 30 0 1 a4330 block_basic 43 30 0 1 a4430 block_basic 44 30 0 1 a1031 block_basic 10 31 0 1 a1331 block_basic 13 31 0 1 a1631 block_basic 16 31 0 1 a1931 block_basic 19 31 0 1 a1032 block_basic 10 32 0 1 a1332 block_basic 13 32 0 1 a1632 block_basic 16 32 0 1 a1932 block_basic 19 32 0 1 a1033 block_basic 10 33 100000 1 a1333 block_basic 13 33 0 1 a1433 block_basic 14 33 0 1 a1533 block_basic 15 33 0 1 a1633 block_basic 16 33 0 1 a1933 block_basic 19 33 0 1 a2233 block_basic 22 33 0 1 a2333 block_basic 23 33 0 1 a2433 block_basic 24 33 0 1 a2533 block_basic 25 33 0 1 a2633 block_basic 26 33 0 1 a2933 block_basic 29 33 0 1 a3033 block_basic 30 33 0 1 a3133 block_basic 31 33 0 1 a3233 block_basic 32 33 0 1 a3333 block_basic 33 33 0 1 a3433 block_basic 34 33 0 1 a3533 block_basic 35 33 0 1 a3833 block_basic 38 33 0 1 a3933 block_basic 39 33 0 1 a4033 block_basic 40 33 0 1 a4133 block_basic 41 33 0 1 a4233 block_basic 42 33 0 1 a4333 block_basic 43 33 0 1 a1934 block_basic 19 34 0 1 a2234 block_basic 22 34 0 1 a2634 block_basic 26 34 0 1 a2934 block_basic 29 34 0 1 a3834 block_basic 38 34 0 1 a4334 block_basic 43 34 0 1 a1935 block_basic 19 35 0 1 a2235 block_basic 22 35 0 1 a2635 block_basic 26 35 0 1 a2935 block_basic 29 35 0 1 a3835 block_basic 38 35 0 1 a3935 block_basic 39 35 0 1 a4035 block_basic 40 35 0 1 a4135 block_basic 41 35 0 1 a4235 block_basic 42 35 0 1 a4335 block_basic 43 35 0 1 a1636 block_basic 16 36 0 1 a1736 block_basic 17 36 0 1 a1836 block_basic 18 36 0 1 a1936 block_basic 19 36 0 1 a2236 block_basic 22 36 0 1 a2636 block_basic 26 36 0 1 a2936 block_basic 29 36 0 1 a3236 block_basic 32 36 0 1 a3336 block_basic 33 36 0 1 a3436 block_basic 34 36 0 1 a3536 block_basic 35 36 0 1 a2237 block_basic 22 37 0 1 a2337 block_basic 23 37 0 1 a2437 block_basic 24 37 0 1 a2537 block_basic 25 37 0 1 a2637 block_basic 26 37 0 1 a2937 block_basic 29 37 0 1 a3237 block_basic 32 37 0 1 a3337 block_basic 33 37 0 1 a3437 block_basic 34 37 0 1 a3537 block_basic 35 37 0 1 a3838 block_basic 38 38 0 1 a3938 block_basic 39 38 0 1 a4038 block_basic 40 38 0 1 a4138 block_basic 41 38 0 1 a1639 block_basic 16 39 100000 1 a1739 block_basic 17 39 0 1 a1839 block_basic 18 39 0 1 a1939 block_basic 19 39 0 1 a3839 block_basic 38 39 0 1 a4139 block_basic 41 39 0 1 a1940 block_basic 19 40 0 1 a2240 block_basic 22 40 0 1 a2340 block_basic 23 40 0 1 a2440 block_basic 24 40 0 1 a2540 block_basic 25 40 0 1 a2640 block_basic 26 40 0 1 a2940 block_basic 29 40 0 1 a3040 block_basic 30 40 0 1 a3140 block_basic 31 40 0 1 a3240 block_basic 32 40 0 1 a3540 block_basic 35 40 0 1 a3640 block_basic 36 40 0 1 a3740 block_basic 37 40 0 1 a3840 block_basic 38 40 0 1 a4140 block_basic 41 40 100000 1 a1941 block_basic 19 41 0 1 a2241 block_basic 22 41 0 1 a2641 block_basic 26 41 0 1 a2941 block_basic 29 41 0 1 a3241 block_basic 32 41 0 1 a4141 block_basic 41 41 100000 1 a1942 block_basic 19 42 100000 1 a2242 block_basic 22 42 0 1 a2342 block_basic 23 42 0 1 a2442 block_basic 24 42 0 1 a2542 block_basic 25 42 0 1 a2642 block_basic 26 42 0 1 a2942 block_basic 29 42 0 1 a3242 block_basic 32 42 0 1 a4142 block_basic 41 42 100000 1 a2943 block_basic 29 43 0 1 a3243 block_basic 32 43 0 1 a3543 block_basic 35 43 0 1 a3643 block_basic 36 43 0 1 a3743 block_basic 37 43 0 1 a3843 block_basic 38 43 100000 1 a3943 block_basic 39 43 100000 1 a4043 block_basic 40 43 100000 1 a4143 block_basic 41 43 100000 1 a2944 block_basic 29 44 0 1 a3244 block_basic 32 44 0 1 a3544 block_basic 35 44 0 1 a2945 block_basic 29 45 0 1 a3045 block_basic 30 45 0 1 a3145 block_basic 31 45 0 1 a3245 block_basic 32 45 0 1 a3545 block_basic 35 45 0 1 a3546 block_basic 35 46 100000 1 \ No newline at end of file diff --git a/tools/snowstorm_maps/arena_5_spawn_clusters.dat b/tools/snowstorm_maps/arena_5_spawn_clusters.dat new file mode 100644 index 0000000..9551be6 --- /dev/null +++ b/tools/snowstorm_maps/arena_5_spawn_clusters.dat @@ -0,0 +1 @@ +14 14 5 2|26 26 8 3|39 21 5 2| \ No newline at end of file diff --git a/tools/snowstorm_maps/arena_6.dat b/tools/snowstorm_maps/arena_6.dat new file mode 100644 index 0000000..459a40d --- /dev/null +++ b/tools/snowstorm_maps/arena_6.dat @@ -0,0 +1 @@ +g212 sw_tree1 21 2 0 1 h232 sw_tree2 23 2 0 1 i264 sw_tree3 26 4 0 1 j157 sw_tree4 15 7 0 1 b207 block_basic2 20 7 0 1 b208 block_basic2 20 8 0 1 b298 block_basic2 29 8 0 1 b209 block_basic2 20 9 0 1 b299 block_basic2 29 9 0 1 b2010 block_basic2 20 10 0 1 b2910 block_basic2 29 10 0 1 i1511 sw_tree3 15 11 0 1 b2011 block_basic2 20 11 0 1 b2911 block_basic2 29 11 0 1 b2012 block_basic2 20 12 0 1 b2112 block_basic2 21 12 0 1 b2212 block_basic2 22 12 0 1 a2312 block_basic 23 12 0 0 a2612 block_basic 26 12 0 1 b2712 block_basic2 27 12 0 1 b2812 block_basic2 28 12 0 1 b2912 block_basic2 29 12 0 1 h3312 sw_tree2 33 12 0 1 a2313 block_basic 23 13 0 1 a2613 block_basic 26 13 0 1 a1217 block_basic 12 17 0 1 b1218 block_basic2 12 18 0 1 b1219 block_basic2 12 19 0 1 b1220 block_basic2 12 20 0 1 b1221 block_basic2 12 21 0 1 g622 sw_tree1 6 22 0 1 c1222 block_basic3 12 22 0 1 b1322 block_basic2 13 22 0 1 a1422 block_basic 14 22 0 1 g3522 sw_tree1 35 22 0 1 b4122 block_basic2 41 22 0 1 b4222 block_basic2 42 22 0 1 a4322 block_basic 43 22 0 1 c4123 block_basic3 41 23 0 1 h324 sw_tree2 3 24 0 1 c1224 block_basic3 12 24 0 1 b1324 block_basic2 13 24 0 1 a1424 block_basic 14 24 0 1 a2424 block_basic 24 24 0 1 a2524 block_basic 25 24 0 1 a2624 block_basic 26 24 0 1 a2724 block_basic 27 24 0 1 a2824 block_basic 28 24 0 1 b4124 block_basic2 41 24 0 1 b1225 block_basic2 12 25 0 1 a2425 block_basic 24 25 0 1 a2825 block_basic 28 25 0 1 c4125 block_basic3 41 25 0 1 b1226 block_basic2 12 26 0 1 a2426 block_basic 24 26 0 1 k2626 obst_duck 26 26 0 1 a2826 block_basic 28 26 0 1 b4126 block_basic2 41 26 0 1 j527 sw_tree4 5 27 0 1 b1227 block_basic2 12 27 0 1 a2427 block_basic 24 27 0 1 a2827 block_basic 28 27 0 1 c4127 block_basic3 41 27 0 1 b4227 block_basic2 42 27 0 1 a4327 block_basic 43 27 0 1 b1228 block_basic2 12 28 0 1 a2428 block_basic 24 28 0 1 a2528 block_basic 25 28 0 1 a2628 block_basic 26 28 0 1 a2728 block_basic 27 28 0 1 a2828 block_basic 28 28 0 1 b1229 block_basic2 12 29 0 1 a1230 block_basic 12 30 0 1 i1530 sw_tree3 15 30 0 1 c4130 block_basic3 41 30 0 1 b4230 block_basic2 42 30 0 1 a4330 block_basic 43 30 0 1 b4131 block_basic2 41 31 0 1 c4132 block_basic3 41 32 0 1 b4133 block_basic2 41 33 0 1 c4134 block_basic3 41 34 0 1 b4135 block_basic2 41 35 0 1 b4235 block_basic2 42 35 0 1 a4335 block_basic 43 35 0 1 g1638 sw_tree1 16 38 0 1 h2040 sw_tree2 20 40 0 1 b2441 block_basic2 24 41 0 0 b2541 block_basic2 25 41 0 0 c2641 block_basic3 26 41 0 0 b2741 block_basic2 27 41 0 1 d2841 block_arch1 28 41 0 1 f3041 block_arch3 30 41 0 1 b3141 block_basic2 31 41 0 1 c3241 block_basic3 32 41 0 1 b3341 block_basic2 33 41 0 1 b3441 block_basic2 34 41 0 1 b2442 block_basic2 24 42 0 0 b3442 block_basic2 34 42 0 1 j3842 sw_tree4 38 42 0 1 b2443 block_basic2 24 43 0 0 b3443 block_basic2 34 43 0 1 a2444 block_basic 24 44 0 0 b3444 block_basic2 34 44 0 1 a3445 block_basic 34 45 0 1 \ No newline at end of file diff --git a/tools/snowstorm_maps/arena_6_spawn_clusters.dat b/tools/snowstorm_maps/arena_6_spawn_clusters.dat new file mode 100644 index 0000000..04756b1 --- /dev/null +++ b/tools/snowstorm_maps/arena_6_spawn_clusters.dat @@ -0,0 +1 @@ +18 18 8 3|34 34 8 3|24 7 8 3|28 45 8 3|46 27 8 3| \ No newline at end of file diff --git a/tools/snowstorm_maps/arena_7.dat b/tools/snowstorm_maps/arena_7.dat new file mode 100644 index 0000000..e084a34 --- /dev/null +++ b/tools/snowstorm_maps/arena_7.dat @@ -0,0 +1 @@ +i299 sw_tree3 29 9 0 1 h1410 sw_tree2 14 10 0 1 j1214 sw_tree4 12 14 0 1 i1515 sw_tree3 15 15 0 1 s019 sw_backround7 0 19 0 0 a4219 block_basic 42 19 0 1 a4220 block_basic 42 20 0 1 a4221 block_basic 42 21 0 1 g2922 sw_tree1 29 22 0 1 a4222 block_basic 42 22 0 1 j3223 sw_tree4 32 23 0 1 p4225 block_ice 42 25 0 1 a4325 block_basic 43 25 0 1 p4625 block_ice 46 25 0 1 a4725 block_basic 47 25 0 1 p4825 block_ice 48 25 0 1 h2926 sw_tree2 29 26 0 1 b4226 block_basic2 42 26 0 1 q4227 block_ice2 42 27 0 1 b4228 block_basic2 42 28 0 1 p4528 block_ice 45 28 0 1 a4628 block_basic 46 28 0 1 q4229 block_ice2 42 29 0 1 a4529 block_basic 45 29 0 1 i1330 sw_tree3 13 30 0 1 a4230 block_basic 42 30 0 1 g1632 sw_tree1 16 32 0 1 h1233 sw_tree2 12 33 0 1 a3733 block_basic 37 33 0 1 q4233 block_ice2 42 33 0 1 q3734 block_ice2 37 34 0 1 a4234 block_basic 42 34 0 1 c3735 block_basic3 37 35 0 1 p4235 block_ice 42 35 0 1 q3736 block_ice2 37 36 0 1 b4236 block_basic2 42 36 0 1 p4336 block_ice 43 36 0 1 a4436 block_basic 44 36 0 1 p4536 block_ice 45 36 100000 1 a3737 block_basic 37 37 0 1 p3538 block_ice 35 38 0 1 p3638 block_ice 36 38 0 1 p3738 block_ice 37 38 0 1 i2540 sw_tree3 25 40 0 1 p3540 block_ice 35 40 0 1 p3640 block_ice 36 40 0 1 p3740 block_ice 37 40 0 1 p3741 block_ice 37 41 0 1 p3742 block_ice 37 42 0 1 j2643 sw_tree4 26 43 0 1 p3743 block_ice 37 43 0 1 \ No newline at end of file diff --git a/tools/snowstorm_maps/arena_7_spawn_clusters.dat b/tools/snowstorm_maps/arena_7_spawn_clusters.dat new file mode 100644 index 0000000..95760c7 --- /dev/null +++ b/tools/snowstorm_maps/arena_7_spawn_clusters.dat @@ -0,0 +1 @@ +12 12 4 3|29 14 5 3|45 30 5 2|24 41 3 2|18 38 6 3| \ No newline at end of file diff --git a/tools/www-tpl/default/OLD_install_shockwave.tpl b/tools/www-tpl/default/OLD_install_shockwave.tpl new file mode 100644 index 0000000..760fde0 --- /dev/null +++ b/tools/www-tpl/default/OLD_install_shockwave.tpl @@ -0,0 +1,208 @@ + + + + + + {{ site.siteName }}: Shockwave Help + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{% if session.loggedIn == false %} + +{% else %} + +{% endif %} + +{% include "base/header.tpl" %} + +
+ + +
+
+
+
+
+

How to use Shockwave

+
+

In order to load the Shockwave hotel, you must follow these steps and ensure you have the prequisities required.

+

Pale Moon

+

Pale Moon is a necessity to run Shockwave correctly, as it's one of the few browsers that still supports NPAPI plugins correctly.

+

Since Shockwave is quite old, the 32-bit version of Pale Moon is required, here you can download the Portable or the Full version.

+

Shockwave 12

+

You must install the Shockwave 12 MSI first and then proceed to install the Visual Studio 2008 C++ x86 redist.

+

Download list

+

Adobe Shockwave 12.3 MSI: Download

+

Microsoft Visual C++ 2008 Redistributable Package (x86): Download

+

Also please make sure you do not have a browser open when installing the Shockwave MSI, as you will need to start a fresh Windows installation, since the current installation breaks with a browser open.

+

Shockwave 11

+

While Shockwave 11.6 is older than the latest version that is Shockwave 12, the latest version experiences issues with crashing while playing music from the Trax Machine or Jukebox, and also messsages in the instant messenger are always stuck at 12:00.

+

For these reasons, Shockwave 11 is recommended to install instead since these issues are not present in this version.

+

You can download the official Shockwave 11.6 installer MSI here.

+ + +
+
+ +
+ +
+
+

Why should I use Shockwave?

+
+

As of right now there are two clients to play the hotel on, the first is the Shockwave hotel and the second is Flash.

+

It is highly recommended to play the Shockwave version because it's filled with far more features that cannot be experienced on the Flash client.

+

The features that Shockwave contains which are not present in the Flash version are listed below.

+
+
+ +
+
+

BattleBall, Diving, Wobble Squabble, Trax Machines, Jukeboxes, American Idol, Tic Tac Toe, Chess, Battleships, Poker and some nostalgic Habbo components such as the hand and the Room-o-Matic.

+
+
+
+
+
+
+
+
+
+

Prerequisities

+
+
+
+ +
+
+

The following items are required to use Shockwave are listed below.

+

If you fail to meet these requirements, you will only be able to play the Flash version.

+
+
+

Requirements

+

- Microsoft Windows; or

+

- WINE for Linux and macOS (not supported by Classic staff, as may be unreliable)

+

- Shockwave (at least 11.6 or higher)

+

- Pale Moon 32-bit

+
+
+
+
+ + +
+
+
+ {% include "base/ads_container.tpl" %} +
+
+ +
+ +
+
+{% include "base/footer.tpl" %} + + + + + + \ No newline at end of file diff --git a/tools/www-tpl/default/OLD_shockwave_app.tpl b/tools/www-tpl/default/OLD_shockwave_app.tpl new file mode 100644 index 0000000..df53823 --- /dev/null +++ b/tools/www-tpl/default/OLD_shockwave_app.tpl @@ -0,0 +1,299 @@ + + + + + + {{ site.siteName }}: Portable Client + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{% if session.loggedIn == false %} + +{% else %} + +{% endif %} + +{% include "base/header.tpl" %} + +
+ + +
+
+
+
+
+

Portable Shockwave Client

+
+
+
+ +
+
+

As the years go by so do the browser plugins. Shockwave is a browser plugin that is deprecated in most modern browsers, due to this a portable program that runs Shockwave Habbo is avaliable.

+

This is a Macromedia Projector program generated with Director MX 2004. Written in the same language that the Shockwave Habbo client is written in.

+
+
+

How does it work?

+

The program is a simple .exe that sends a login request to our server and then loads the client. You'll need to edit the account.ini file with your login details.

+

The app regardless of download will work with WINE, which is a requirement to play on either macOS and Linux.

+

Why should I use Shockwave?

+

As of right now there are two clients to play the hotel on, the first is the Shockwave hotel and the second is Flash.

+

It is highly recommended to play the Shockwave version because it's filled with far more features that cannot be experienced on the Flash client.

+

Pictures

+

Below are pictures of the program working in action.

+
+
+
+ + +
+
+
+ + +
+
+ +
+ +
+
+

Changelog

+
+
+
+ +
+
+

The program has existed since April 2019 and has had a lot of changes over the course. You may view them below.

+
+
+ Reveal Changelog +
+

Version 0.8

+

- Fixes for Cloudflare changing how requests are sent back.

+
+

Version 0.7

+

- Fixes for updating furniture.

+
+

Version 0.6

+

- Furniture is now stored and loaded from disk to decrease furniture load times.

+

- New furniture will be automatically downloaded when loaded so subsequent loading will be faster.

+
+

Version 0.5

+
+

- Added hotel view support which is an option that can be changed in your Account Settings.

+

- Added always on top feature.

+

- Added login in the client instead, an opt-in if you don't trust login details being stored on text.

+
+

Version 0.4

+

- Added patches for SnowStorm to become playable, without freezing.

+
+

Version 0.3

+

- Fix for working hyperlinks

+

- Fix for the reset tutorial button not properly sending request to server.

+
+

Version 0.2

+

- Fix for miscellaneous symbols not being allowed in passwords.

+

- Add joystick icon created by Copyright.

+
+

Version 0.1

+

- Initial release.

+
+ +
+
+
+
+
+
+
+

Downloads

+
+

There are two versions to download. The standard download and the lite download.

+

Standard version:

+

The standard version contains all the furniture for instant loading. New furniture will be downloaded if the file doesn't exist.

+

- Click here to download (82 MB)

+

Lite version:

+

Contains no furniture. New furniture will be downloaded if the file doesn't exist.

+

- Click here to download (25 MB)

+
+
+
+
+ + +
+
+
+ {% include "base/ads_container.tpl" %} +
+
+ +
+ +
+
+{% include "base/footer.tpl" %} + + + + + + \ No newline at end of file diff --git a/tools/www-tpl/default/account/banned.tpl b/tools/www-tpl/default/account/banned.tpl new file mode 100644 index 0000000..e939c48 --- /dev/null +++ b/tools/www-tpl/default/account/banned.tpl @@ -0,0 +1,108 @@ + + + + + + {{ site.siteName }}: Banned + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + {% include "../base/frontpage_header.tpl" %} +
+ +
+
+
+
{{ bannedMsg }}
+
+ +
+ +
+ + + +
+
+
+
+ +
+ + + + +{% include "../base/footer.tpl" %} + + + + + + \ No newline at end of file diff --git a/tools/www-tpl/default/account/email/account_activated.tpl b/tools/www-tpl/default/account/email/account_activated.tpl new file mode 100644 index 0000000..73ca0b0 --- /dev/null +++ b/tools/www-tpl/default/account/email/account_activated.tpl @@ -0,0 +1,123 @@ + + + + + + {{ site.siteName }}: Email Activation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + {% include "../../base/frontpage_header.tpl" %} +
+ + +
+
+{% if verifySuccess %} +
+

Email link handled successfully

+
+ + Your email address is now verified. +
+ Continue to {{ site.siteName }} front page. +
+
+
+{% else %} +
+

Email link handled unsuccessfully

+
+ + The activation link was invalid. +
+ Continue to {{ site.siteName }} front page. +
+
+
+{% endif %} + +
+ + + + + +{% include "../../base/footer.tpl" %} + + + + + + \ No newline at end of file diff --git a/tools/www-tpl/default/account/email/account_forgot.tpl b/tools/www-tpl/default/account/email/account_forgot.tpl new file mode 100644 index 0000000..87c5493 --- /dev/null +++ b/tools/www-tpl/default/account/email/account_forgot.tpl @@ -0,0 +1,185 @@ + + + + + + {{ site.siteName }}: Forgotten password + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ {% include "../../base/frontpage_header.tpl" %} +
+ + +
+
+
+

Forgotten Your Password?

+
+ {% if invalidForgetPassword %} +
+ Invalid username or e-mail address
+
+
+ {% endif %} + {% if validForgetPassword %} +
+ An email has been sent with recovery details
+
+
+ {% endif %} +

Don't panic! Please enter your account information below and we'll send you an email telling you how to reset your password.

+ +
+ +
+

+ + +

+ +

+ + +

+ +

+ +

+ +
+
+
+ +
+ + +
+ +
+

Forgotten Your Habbo Name?

+
+ {% if invalidForgetName %} +
+ Invalid username or e-mail address
+
+
+ {% endif %} + {% if validForgetName %} +
+ A list of names have been sent to the e-mail address
+
+
+ {% endif %} +

No problem - just enter your email address below and we'll send you a list of your accounts.

+ +
+ +
+

+ + + +

+ +

+ +

+ +
+ +
+
+ +
+

False Alarm!

+
+

If you have remembered your password, or if you just came here by accident, click the link below to return to the homepage.

+

Back to homepage »

+
+
+ +
+ + + + +{% include "../../base/footer.tpl" %} + + + + + + \ No newline at end of file diff --git a/tools/www-tpl/default/account/email/account_recovery.tpl b/tools/www-tpl/default/account/email/account_recovery.tpl new file mode 100644 index 0000000..d4b290c --- /dev/null +++ b/tools/www-tpl/default/account/email/account_recovery.tpl @@ -0,0 +1,140 @@ + + + + + + {{ site.siteName }}: Recovery + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + {% include "../../base/frontpage_header.tpl" %} +
+ +
+ {% if alert.hasAlert %} + + +
+

Account Recovery

+
+

{{ alert.message }}

+
+
+ + {% else %} + + +
+

Account Recovery

+
+

Please enter and confirm your new password below to recover your account.

+
+
+

+ + +

+
+

+ + +

+ +

+ +

+ + +
+ + +
+
+ + + {% endif %} + +
+ + + + + +{% include "../../base/footer.tpl" %} + + + + + + \ No newline at end of file diff --git a/tools/www-tpl/default/account/email/base/email_footer.tpl b/tools/www-tpl/default/account/email/base/email_footer.tpl new file mode 100644 index 0000000..ba23c0b --- /dev/null +++ b/tools/www-tpl/default/account/email/base/email_footer.tpl @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tools/www-tpl/default/account/email/base/email_header.tpl b/tools/www-tpl/default/account/email/base/email_header.tpl new file mode 100644 index 0000000..33b2d72 --- /dev/null +++ b/tools/www-tpl/default/account/email/base/email_header.tpl @@ -0,0 +1,28 @@ + + + + + + + +
+ + + + + + + +
+ Habbo Logo + + + Enter Habbo Hotel button + +
+
+ + +
+ +
\ No newline at end of file diff --git a/tools/www-tpl/default/account/email/email_activate.tpl b/tools/www-tpl/default/account/email/email_activate.tpl new file mode 100644 index 0000000..3b81eac --- /dev/null +++ b/tools/www-tpl/default/account/email/email_activate.tpl @@ -0,0 +1,15 @@ +{% include "base/email_header.tpl" %} +

Email Activation

+

Thanks for activating your email at {{ site.emailHotelName }}.

+

Please activate your account by clicking here.

+

Here are your user details:

+

{{ site.siteName}} name: {{ playerName }}

+

Email: {{ playerEmail }}

+

Keep this information safe, you need your username and email to reset your password if you forget it.
+


+

Here's some other stuff you may want to do:

+ +
  • Change account settings.
  • +
  • Completely delete this email address from your user profile.
  • + +{% include "base/email_footer.tpl" %} \ No newline at end of file diff --git a/tools/www-tpl/default/account/email/email_recovery.tpl b/tools/www-tpl/default/account/email/email_recovery.tpl new file mode 100644 index 0000000..7279c43 --- /dev/null +++ b/tools/www-tpl/default/account/email/email_recovery.tpl @@ -0,0 +1,8 @@ +{% include "base/email_header.tpl" %} +

    Account Recovery

    +

    Hello {{ playerName }},

    +

    Please recover your account by clicking here.

    +

    This link can only be used once and will lead you to a page to set your password. It expires after one day and nothing will happen if it's not used.

    +
    +

    If you did not request an account recovery, you can delete this email.

    +{% include "base/email_footer.tpl" %} \ No newline at end of file diff --git a/tools/www-tpl/default/account/email/email_registered.tpl b/tools/www-tpl/default/account/email/email_registered.tpl new file mode 100644 index 0000000..2a2d659 --- /dev/null +++ b/tools/www-tpl/default/account/email/email_registered.tpl @@ -0,0 +1,15 @@ +{% include "base/email_header.tpl" %} +

    Welcome to {{ site.siteName}}, {{ playerName }}!

    +

    Thanks for registering at {{ site.emailHotelName }}.

    +

    Please activate your account by clicking here.

    +

    Here are your user details:

    +

    {{ site.siteName}} name: {{ playerName }}

    +

    Email: {{ playerEmail }}

    +

    Keep this information safe, you need your username and email to reset your password if you forget it.
    +


    +

    Here's some other stuff you may want to do:

    + +
  • Change account settings.
  • +
  • Completely delete this email address from your user profile.
  • + +{% include "base/email_footer.tpl" %} \ No newline at end of file diff --git a/tools/www-tpl/default/account/email/sent.tpl b/tools/www-tpl/default/account/email/sent.tpl new file mode 100644 index 0000000..0eaddd7 --- /dev/null +++ b/tools/www-tpl/default/account/email/sent.tpl @@ -0,0 +1,97 @@ + + + + + + {{ site.siteName }}: Forgotten password + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +
    + {% include "../../base/frontpage_header.tpl" %} +
    +
    +
    +

    You've got mail!

    +
    +

    E-Mail sent! Check your inbox and spam folders.

    +

    Back to homepage »

    + +
    +
    + + + + +{% include "../../base/footer.tpl" %} + + + + + + \ No newline at end of file diff --git a/tools/www-tpl/default/account/login.tpl b/tools/www-tpl/default/account/login.tpl new file mode 100644 index 0000000..feb00d5 --- /dev/null +++ b/tools/www-tpl/default/account/login.tpl @@ -0,0 +1,168 @@ + + + + + + {{ site.siteName }}: Log in to {{ site.siteName }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +
    + {% include "../base/frontpage_header.tpl" %} +
    +
    +
    + +
    +

    Register for free

    +
    +

    Register for free by clicking the Create Your Habbo -button below. If you have already registered, please sign in on the right.

    + +
    +
    + + + +
    + + +
    +
    + +
    + +
    + +
    +

    Sign in

    +
    + + +
    +
    +
    + + + + +
    + + + +
    + + +{% include "../base/footer.tpl" %} + + + + + + \ No newline at end of file diff --git a/tools/www-tpl/default/account/logout.tpl b/tools/www-tpl/default/account/logout.tpl new file mode 100644 index 0000000..1a18c44 --- /dev/null +++ b/tools/www-tpl/default/account/logout.tpl @@ -0,0 +1,108 @@ + + + + + + {{ site.siteName }}: Home + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +
    + + {% include "../base/frontpage_header.tpl" %} +
    + +
    +
    +
    +
    You have successfully signed out
    +
    + +
    + +
    + + + +
    +
    +
    +
    + +
    + + + + +{% include "../base/footer.tpl" %} + + + + + + \ No newline at end of file diff --git a/tools/www-tpl/default/account/reauthenticate.tpl b/tools/www-tpl/default/account/reauthenticate.tpl new file mode 100644 index 0000000..748b7a8 --- /dev/null +++ b/tools/www-tpl/default/account/reauthenticate.tpl @@ -0,0 +1,143 @@ + + + + + + {{ site.siteName }}: Log in to {{ site.siteName }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +
    + {% include "../base/frontpage_header.tpl" %} +
    +
    +
    +

    Please enter your password

    + +
    +

    You need to enter your password to continue because you have signed in via 'remember-me'.

    +

    If you are not {{ playerDetails.getName() }}, please sign out.

    +

    If you have forgotten your password, please click here.

    +
    + +
    +
    + +
    + + + +{% if alert.hasAlert %} + +
      +
    • {{ alert.message }}
    • +
    + +{% endif %} + +
    +

    Sign in

    + +
    + + +
    +
    +
    + + + + +{% include "../base/footer.tpl" %} + + + + + + \ No newline at end of file diff --git a/tools/www-tpl/default/account/submit.tpl b/tools/www-tpl/default/account/submit.tpl new file mode 100644 index 0000000..b2f0d3e --- /dev/null +++ b/tools/www-tpl/default/account/submit.tpl @@ -0,0 +1,15 @@ + + + Redirecting... + + + + + + + +

    If you are not automatically redirected, please click here

    + + + + diff --git a/tools/www-tpl/default/base/ads_container.tpl b/tools/www-tpl/default/base/ads_container.tpl new file mode 100644 index 0000000..c7b510f --- /dev/null +++ b/tools/www-tpl/default/base/ads_container.tpl @@ -0,0 +1,4 @@ + +

    Keep it (un)real!

    + +
    \ No newline at end of file diff --git a/tools/www-tpl/default/base/flash_check.tpl b/tools/www-tpl/default/base/flash_check.tpl new file mode 100644 index 0000000..bcc0b80 --- /dev/null +++ b/tools/www-tpl/default/base/flash_check.tpl @@ -0,0 +1,33 @@ + \ No newline at end of file diff --git a/tools/www-tpl/default/base/footer.tpl b/tools/www-tpl/default/base/footer.tpl new file mode 100644 index 0000000..7543a66 --- /dev/null +++ b/tools/www-tpl/default/base/footer.tpl @@ -0,0 +1,7 @@ +
    + +
    \ No newline at end of file diff --git a/tools/www-tpl/default/base/frontpage_header.tpl b/tools/www-tpl/default/base/frontpage_header.tpl new file mode 100644 index 0000000..ad50837 --- /dev/null +++ b/tools/www-tpl/default/base/frontpage_header.tpl @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/tools/www-tpl/default/base/hc_status.tpl b/tools/www-tpl/default/base/hc_status.tpl new file mode 100644 index 0000000..96534bd --- /dev/null +++ b/tools/www-tpl/default/base/hc_status.tpl @@ -0,0 +1,48 @@ +{% if session.loggedIn %} + +
    +
    + {% if playerDetails.hasClubSubscription() %} +

    You have {{ hcDays }} {{ site.siteName }} Club day(s) left.

    +

    You have been a member for {{ hcSinceMonths }} month(s)

    + {% else %} +

    You are not a member of {{ site.siteName }} Club

    + {% endif %} +
    +
    +
    + +
    + +
    +
    +{% else %} +
    +Please sign in to see your {{ site.siteName }} Club status
    + +{% endif %} \ No newline at end of file diff --git a/tools/www-tpl/default/base/header.tpl b/tools/www-tpl/default/base/header.tpl new file mode 100644 index 0000000..c65f3d7 --- /dev/null +++ b/tools/www-tpl/default/base/header.tpl @@ -0,0 +1,184 @@ +{% if session.loggedIn == false %} + +
    + +
    + +
    + +{% else %} + +
    +
    + +
    + +{% endif %} diff --git a/tools/www-tpl/default/base/tag_cloud.tpl b/tools/www-tpl/default/base/tag_cloud.tpl new file mode 100644 index 0000000..f682d59 --- /dev/null +++ b/tools/www-tpl/default/base/tag_cloud.tpl @@ -0,0 +1,13 @@ +{% autoescape 'html' %} +{% if tagCloud|length > 0 %} +
      +{% for kvp in tagCloud %} +{% set tag = kvp.getKey() %} +{% set size = kvp.getValue() %} +
    • {{ tag }}
    • +{% endfor %} +
    +{% else %} +No tags to display. +{% endif %} +{% endautoescape %} \ No newline at end of file diff --git a/tools/www-tpl/default/base/tag_search.tpl b/tools/www-tpl/default/base/tag_search.tpl new file mode 100644 index 0000000..60d990f --- /dev/null +++ b/tools/www-tpl/default/base/tag_search.tpl @@ -0,0 +1,87 @@ + +
    + {% if tagList.size() equals 0 %} +

    No results found.

    + {% else %} +

    {{ pageId }} - {{ totalTagUsers|length }} / {{ totalCount }}

    + {% endif %} + {{ tagSearchAdd }} +

    + + + + {% autoescape 'html' %} + {% set num = 0 %} + {% if tagList.size() > 0 %} + {% for habboTag in tagList %} + {% set num = num + 1 %} + {% set tags = habboTag.getTagList() %} + + {% if num % 2 == 0 %} + + {% else %} + + {% endif %} + + {% if habboTag.getUserId() > 0 %} + {% set player = habboTag.getUserData() %} + + + {% endif %} + {% if habboTag.getGroupId() > 0 %} + {% set group = habboTag.getGroupData() %} + + + {% endif %} + + {% endfor %} + {% endif %} + {% endautoescape %} + +
    + + + {{ player.getName() }}
    + {{ player.getMotto }} + + +
    + + + {{ group.getName() }}
    + {{ group.getDescription() }} + + +
    +

    + {% if showFirst %} + << + {% endif %} + {% if showOldest %} + {{ pageId - 2 }} + {% endif %} + {% if showOlder %} + {{ pageId - 1 }} + {% endif %} + {{ pageId }} + {% if showNewer %} + {{ pageId + 1 }} + {% endif %} + {% if showNewest %} + {{ pageId + 2 }} + {% endif %} + {% if showLast %} + >> + {% endif %} +

    \ No newline at end of file diff --git a/tools/www-tpl/default/client.tpl b/tools/www-tpl/default/client.tpl new file mode 100644 index 0000000..24232fc --- /dev/null +++ b/tools/www-tpl/default/client.tpl @@ -0,0 +1,153 @@ + + + + + {{ site.siteName }}: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + +
    + + + + + + \ No newline at end of file diff --git a/tools/www-tpl/default/client_beta.tpl b/tools/www-tpl/default/client_beta.tpl new file mode 100644 index 0000000..9884256 --- /dev/null +++ b/tools/www-tpl/default/client_beta.tpl @@ -0,0 +1,159 @@ + + + + + + + {{ site.siteName }}: Hotel + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +
    +
    +
    +

    Please update your Flash Player to the latest version.

    +
    +

    You can install and download Adobe Flash Player here: Install flash player. More instructions for installation can be found here: More information

    +

    Get Adobe Flash player

    +
    +
    +
    + +
    +
    +
    + + + + + + diff --git a/tools/www-tpl/default/client_connection_failed.tpl b/tools/www-tpl/default/client_connection_failed.tpl new file mode 100644 index 0000000..db37f63 --- /dev/null +++ b/tools/www-tpl/default/client_connection_failed.tpl @@ -0,0 +1,97 @@ + + + + + + {{ site.siteName }}: Connection failed + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    + +

    Connection to {{ site.siteName }} Hotel failed. +

    +
    +

    Unfortunately we are unable to connect you to {{ site.siteName }} Hotel. This could be because your computer is blocking the connections via a firewall. The data relating to this issue has been logged and will be analyzed by our support team. Sorry for the inconvenience.

    +
    + + +
    +
    + + +
    + +
    +
    + + +
    +
    +
    + + + \ No newline at end of file diff --git a/tools/www-tpl/default/client_error.tpl b/tools/www-tpl/default/client_error.tpl new file mode 100644 index 0000000..af59dfc --- /dev/null +++ b/tools/www-tpl/default/client_error.tpl @@ -0,0 +1,133 @@ + + + + + + {{ site.siteName }}: Error + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + +
    +
    + +

    Oops!!

    +
    +
    +

    Oops, the client encountered a technical problem. Not to worry this error has now been recorded to our system and will be investigated by our support team.

    + +

    Please re-open hotel to continue. We are sorry for the inconvenience.

    +
    +
    +
    + +
    +
    + +
    +
    + Enter + +
    +
    +
    + + +
    + + + + + +
    +
    + + + +
    + +
    +
    + +
    +
    +
    + + + + \ No newline at end of file diff --git a/tools/www-tpl/default/client_flash.tpl b/tools/www-tpl/default/client_flash.tpl new file mode 100644 index 0000000..701b6a9 --- /dev/null +++ b/tools/www-tpl/default/client_flash.tpl @@ -0,0 +1,159 @@ + + + + + + + {{ site.siteName }}: Hotel + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +
    +
    +
    +

    Please update your Flash Player to the latest version.

    +
    +

    You can install and download Adobe Flash Player here: Install flash player. More instructions for installation can be found here: More information

    +

    Get Adobe Flash player

    +
    +
    +
    + +
    +
    +
    + + + + + + diff --git a/tools/www-tpl/default/client_install_shockwave.tpl b/tools/www-tpl/default/client_install_shockwave.tpl new file mode 100644 index 0000000..30643ed --- /dev/null +++ b/tools/www-tpl/default/client_install_shockwave.tpl @@ -0,0 +1,115 @@ + + + + + + {{ site.siteName }}: Error + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + +
    +
    + +

    Shockwave detection

    +
    +
    +

    Oops, in order to enter the hotel you need Adobe Shockwave player. Shockwave is free and takes only a minute or two to install.

    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    + + + + +
    +
    + + + +
    + +
    +
    + +
    +
    +
    + + + + \ No newline at end of file diff --git a/tools/www-tpl/default/club.tpl b/tools/www-tpl/default/club.tpl new file mode 100644 index 0000000..e7a117f --- /dev/null +++ b/tools/www-tpl/default/club.tpl @@ -0,0 +1,237 @@ + + + + + + {{ site.siteName }}: Club + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{% if session.loggedIn == false %} + +{% else %} + +{% endif %} + +{% include "base/header.tpl" %} + +
    + +{% if session.currentPage == "credits" %} + +{% endif %} + +{% if session.currentPage == "me" %} + +{% endif %} + +
    +
    +
    + +
    +
    + +

    {{ site.siteName }} Club: become a VIP!

    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    + + +
    +
    + + + + +
    +
    + + +

    Benefits

    +
    +

    {{ site.siteName }} Club is our VIP members-only club - absolutely no riff-raff admitted! Members enjoy a wide range of benefits, including exclusive clothes, free gifts and an extended Friends List. See below for all the sparkly, attractive reasons to join.

    +

    1. Extra Clothes & Accessories

    +

    Show off your new status with a variety of extra clothes and accessories, along with special hairstyles and colors.

    Try out {{ site.siteName }} Club clothes for yourself! + +

    +

    2. Free Furni

    +

    Once a month, every month, you'll get an exclusive piece of {{ site.siteName }} Club furni.

    +

    Important note: club time is cumulative. This means that if you have a break in membership, and then rejoin, you'll start back in the same place you left off.

    +

    3. Exclusive Room Layouts

    +

    Special Guest Room layouts, only for {{ site.siteName }} Club members. Perfect for showing off your new furni!

    +

    + +

    4. Access All Areas

    +

    Jump the annoying queues when rooms are loading. And that's not all - you'll also get access to HC-only Public Rooms.

    +

    5. Homepage Upgrades

    +

    Join {{ site.siteName }} Club and say goodbye to homepage ads! And this means you can make the most of the HC skins and backgrounds too.

    +

    6. More Friends

    +

    600 people! Now that's a lot of buddies however you look at it. More than you can poke with a medium-sized stick, or a big-sized small stick.

    + +

    7. Special Commands

    +

    Use the :chooser command to see a clickable list of all the users in the room. Pretty handy when you want to sit next to your mate, or kick out a troublemaker.

    +
    +

    Use the :furni command to list all the items in a room. Everything is listed, even those sneakily hidden items.

    +
    + + +
    +
    + + +
    +
    + +
    +
    + +

    My Membership

    + + + + {% include "base/hc_status.tpl" %} +
    +
    + + + + +
    +
    + +

    Monthly Gifts +

    + +
    + {% include "habblet/habboclubgift.tpl" %} +
    + + +
    +
    + + + +
    +
    + +
    + +
    + {% include "base/ads_container.tpl" %} +
    +
    + +
    + + +
    +{% include "base/footer.tpl" %} + + + + + + \ No newline at end of file diff --git a/tools/www-tpl/default/club_tryout.tpl b/tools/www-tpl/default/club_tryout.tpl new file mode 100644 index 0000000..4d22a24 --- /dev/null +++ b/tools/www-tpl/default/club_tryout.tpl @@ -0,0 +1,199 @@ + + + + + + {{ site.siteName }}: Club Tryout + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{% if session.loggedIn == false %} + +{% else %} + +{% endif %} + +{% include "base/header.tpl" %} + +
    + + +
    +
    +
    + +
    +
    + +

    {{ site.siteName }} Club Test Wardrobe

    +
    + +
    + +
    + +
    + You need to have a Flash player installed on your computer before being able to edit your {{ site.siteName }} character. You can download the player from here: http://www.adobe.com/go/getflashplayer +
    +
    + + +
    +
    + + + +
    +
    + +
    +
    + +

    My Membership

    + + + + {% include "base/hc_status.tpl" %} +
    +
    + + +
    +
    + +

    What is {{ site.siteName }} Club?

    + +
    +

    {{ site.siteName }} Club is our VIP members-only club - absolutely no riff-raff admitted! Members enjoy a wide range of benefits, including exclusive clothes, free gifts and an extended Friends List. See below for all the sparkly, attractive reasons to join.

    +

    1. Extra Clothes & Accessories

    +

    2. Free Furni

    +

    3. Exclusive Room Layouts

    +

    4. Access All Areas

    + +

    5. Homepage Upgrades

    +

    6. More Friends

    +

    7. Special Commands

    +

    Read more »

    +
    + + +
    +
    + + + +
    + + + +
    +
    +
    + {% include "base/ads_container.tpl" %} +
    +
    + +
    + + +
    +{% include "base/footer.tpl" %} + + + + + + \ No newline at end of file diff --git a/tools/www-tpl/default/collectables.tpl b/tools/www-tpl/default/collectables.tpl new file mode 100644 index 0000000..081d704 --- /dev/null +++ b/tools/www-tpl/default/collectables.tpl @@ -0,0 +1,239 @@ + + + + + + {{ site.siteName }}: Collectables + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{% if session.loggedIn == false %} + +{% else %} + +{% endif %} + +{% include "base/header.tpl" %} + +
    + + +
    +
    +
    +
    +
    + +

    Current Collectable

    + +
    +{% if hasCollectable %} +
    +

    {{ collectableName }}

    +

    March 2019

    +

    {{ collectableDescription }}

    +

    + +{% if session.loggedIn %} + Purchase +{% endif %} + Available Until: +

    +{% else %} +
    +

    No collectable

    +

    March 2019

    +

    There is currently no collectable

    +

    + +

    +{% endif %} +
    + + + +
    +
    + + + +
    +
    + +

    Collectable Showroom

    +
      +{% set num = 0 %} +{% for entry in collectablesShowroom %} + {% if num % 2 == 0 %} +
    • + {% else %} +
    • + {% endif %} + +
      +

      {{ entry.getName() }}

      +

      {{ entry.getDescription() }}

      + +
    • +{% set num = num + 1 %} +{% endfor %} +
    + +{% if hasCollectable %} + +{% endif %} + +
    +
    + + +
    +
    +
    +
    + +

    What are Collectables?

    + +
    + +Collectables are special furniture sold only for a limited and set period of time. Experienced {{ site.siteName }}s would know them as rares. They always cost the same - 200 Credits. +
    + + +
    +
    + + +
    +
    + +

    Invest in Collectables

    + +
    + +

    + + Collect your way to the riches! Collectables not only make a great piece of Furni but also come with an amazing trade value. As collectables will never be sold again for quite a while (that's a promise), the value will keep increasing in time.

    + +

    + +

    + +
    + + +
    +
    + + + +
    + + + + +
    +
    +
    + {% include "base/ads_container.tpl" %} +
    +
    + +
    + + +
    +{% include "base/footer.tpl" %} + + + + + + \ No newline at end of file diff --git a/tools/www-tpl/default/community.tpl b/tools/www-tpl/default/community.tpl new file mode 100644 index 0000000..136284a --- /dev/null +++ b/tools/www-tpl/default/community.tpl @@ -0,0 +1,478 @@ + + + + + + {{ site.siteName }}: Community + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{% if session.loggedIn == false %} + +{% else %} + +{% endif %} + +{% include "base/header.tpl" %} + +
    + + + +
    +
    +
    + +
    +
    + +
    +

    Rooms

    + +
    + +
    + +
    +
      +{% autoescape 'html' %} +{% set num = 0 %} +{% for room in recommendedRooms %} + {% if num % 2 == 0 %} +
    • + {% else %} +
    • + {% endif %} + + {% set occupancyLevel = 0 %} + {% if room.getData().getVisitorsNow() > 0 %} + + {% set percentage = ((room.getData().getVisitorsNow() * 100) / room.getData().getVisitorsMax()) %} + + {% if (percentage >= 99) %} + {% set occupancyLevel = 5 %} + {% elseif (percentage > 65) %} + {% set occupancyLevel = 4 %} + {% elseif (percentage > 32) %} + {% set occupancyLevel = 3 %} + {% elseif (percentage > 0) %} + {% set occupancyLevel = 2 %} + {% endif %} + + {% endif %} + + + Enter {{ site.siteName }} Hotel + {% autoescape 'html' %}{{ room.getData().getName() }}{% endautoescape %} + {% autoescape 'html' %}{{ room.getData().getDescription() }}{% endautoescape %} + Owner: {{ room.getData().getOwnerName() }} + +
    • +{% set num = num + 1 %} +{% endfor %} +
    + + +
    +
    + +
    +
    + + +
    +
    +
    +

    Groups

    + + +
    + +
    + +
      + {% autoescape 'html' %} + {% set num = 1 %} + {% for topic in recentTopics %} + + {% if num % 2 == 0 %} +
    • + {% else %} +
    • + {% endif %} + + + {{ topic.getTopicTitle }} + + +
      + ( + 1 + {% if topic.getRecentPages()|length > 0 %} + ... + {% for page in topic.getRecentPages() %} + {{ page }} + {% endfor %} + {% endif %} + ) +
      +
    • + {% set num = num + 1 %} + {% endfor %} + {% endautoescape %} +
    + + + + +
    + +
    +
    + + +
    +
    + +

    Random {{ site.siteName }}s - Click Us!

    +
    + + +{% set num = 0 %} +{% for habbo in randomHabbos %} +
    +
    + {% if habbo.isOnline() %} +
    {{ habbo.getName() }}
    + {% else %} +
    {{ habbo.getName() }}
    + {% endif %} + + {{ site.siteName }} created on: {{ habbo.getCreatedAt() }} +

    {{ habbo.getMotto() }}

    +
    +
    + + +{% set num = num + 1 %} +{% endfor %} +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + +
    +
    + +
    +
    +
    +
    +
    +

    Latest news

    +

    {% if article1.isPublished() == false %}*{% endif %}{{ article1.title }}

    +

    + {{ article1.shortstory }}

    +

    + Read more » +

    +
    + + + +
    + +
    + +
    + +
    + + +
    +
    +

    Tags

    + {% include "habblet/tagList.tpl" %} +
    +
    + +
    +

    +
    + + +
    + + + + +
    +
    +
    + {% include "base/ads_container.tpl" %} +
    +
    + +
    + + +
    +{% include "base/footer.tpl" %} + + + + \ No newline at end of file diff --git a/tools/www-tpl/default/credits.tpl b/tools/www-tpl/default/credits.tpl new file mode 100644 index 0000000..9427cdb --- /dev/null +++ b/tools/www-tpl/default/credits.tpl @@ -0,0 +1,337 @@ + + + + + + {{ site.siteName }}: Credits + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{% if session.loggedIn == false %} + +{% else %} + +{% endif %} + +{% include "base/header.tpl" %} + +
    + + +
    +
    +
    + +
    +
    + +

    How to get Credits +

    + + +

    +The good thing about this server is that credits a free, yes, free. You won't have to spend a thing to get credits for building your favourite rooms. Just find out by using the methods below to receive credits. +

    +
      +
    • +

      Best Way

      +
        +
      • +
        +

        Be Online

        +

        Just by playing on the server daily you can receive coins!

        + + +
        +
        +

        Receive coins by being online
        You need to be in a room but every day, if you wait 5 minutes, you will recieve 120 credits just by being active.

        +

        This happens once every 24 hours, so if you do the same thing tomorrow, you'll get another 120 credits!

        +
        + +
      • +
      +
    • +
    • +

      Other Ways

      +
        + +
      • +
        +

        Vouchers

        +

        You can get special codes to redeem vouchers

        + + +
        +
        +

        Redeem your voucher code in your hotel purse, or on this page - and you will get your coins right away!

        +
        + +
      • +
      +
    • +
    • +

      Other Ways

      +
        + +
      • +
        +
        + Reset Hand + +
        +

        Reset Hand

        +

        Virtual hand too full of furniture? Click here to reset it.

        + + + {% if session.loggedIn %} + + {% else %} + + {% endif %} +
      • +
      +
    • +
    + + + + +
    + +
    + + + +
    +
    + +
    +
    + +

    Your purse

    + {% if session.loggedIn == false %} +
    You need to sign in to see the purse
    + {% else %} + +
    +
    + +
      +
    • +
      You Currently Have:
      + {{ playerDetails.credits }} Coins + +
    • + +
    • + +
      +
      Enter voucher code (without spaces):
      + + Enter +
      +
    • +
    +
    +
    +
    + {% endif %} + + + + +
    +
    + + +
    +
    + +

    What are {{ site.siteName }} Coins?

    + +
    +
    + +

    {{ site.siteName }} Coins are the Hotel's currency. You can use them to buy all kinds of things, from rubber ducks and sofas, to VIP membership, jukeboxes and teleports.

    +
    +

    All legitimate ways to get {{ site.siteName }} coins are to the left. Remember: {{ site.siteName }} coins are ALWAYS and always will be free.

    +
    + + +
    + +
    + + +
    +
    + +

    Always Ask Permission First! +

    +
    +

    Always ask permission from your parent or guardian before you buy Habbo Coins. If you do not do this and the payment is later canceled or declined, you will be permanently banned.

    +

    Uh-oh!

    +
    + + +
    +
    + + +
    + +
    +
    + +
    + {% include "base/ads_container.tpl" %} +
    +
    + +
    + + +
    +{% include "base/footer.tpl" %} + + + + + + \ No newline at end of file diff --git a/tools/www-tpl/default/credits_history.tpl b/tools/www-tpl/default/credits_history.tpl new file mode 100644 index 0000000..6a6f47c --- /dev/null +++ b/tools/www-tpl/default/credits_history.tpl @@ -0,0 +1,241 @@ + + + + + + {{ site.siteName }}: Credits + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{% if session.loggedIn == false %} + +{% else %} + +{% endif %} + +{% include "base/header.tpl" %} + +
    + + +
    +
    + +
    + +
    +
    + +

    Account transactions

    +
    + +
    +This is an overview of your credit transaction history. They are updated as soon as the transaction is made.
    + +
      + {% if canGoNext %} + + {% else %} + + {% endif %} + + +
    • {{ currentMonth }} {{ currentYear }}
    • +
    + + +

    +{% if transactions|length > 0 %} + + + + + + + + + + +{% autoescape 'html' %} +{% set num = 0 %} +{% for transaction in transactions %} + {% if num % 2 == 0 %} + + {% else %} + + {% endif %} + + + + + + {% set num = num + 1 %} +{% endfor %} +{% endautoescape %} +{% else %} +No transactions found. +{% endif %} + +
    DatePriceDescription
    {{ transaction.getFormattedDate() }}{{ transaction.getCostCoins() }}{{ transaction.getDescription() }}
    +

    + +
    + + +
    +
    + + + + +
    +
    +
    +
    + +

    Your purse

    + {% if session.loggedIn == false %} +
    You need to sign in to see the purse
    + {% else %} + +
    +
    + +
      +
    • +
      You Currently Have:
      + {{ playerDetails.credits }} Coins + +
    • + +
    • + +
      +
      Enter voucher code (without spaces):
      + + Enter +
      +
    • +
    +
    +
    +
    + {% endif %} + + + + +
    +
    + + +
    + + + + +
    +
    +
    + {% include "base/ads_container.tpl" %} +
    +
    + +
    + + +
    + +
    +{% include "base/footer.tpl" %} + + + + + + \ No newline at end of file diff --git a/tools/www-tpl/default/error.tpl b/tools/www-tpl/default/error.tpl new file mode 100644 index 0000000..e69de29 diff --git a/tools/www-tpl/default/faq.tpl b/tools/www-tpl/default/faq.tpl new file mode 100644 index 0000000..e9e9fe8 --- /dev/null +++ b/tools/www-tpl/default/faq.tpl @@ -0,0 +1,120 @@ + + + + + + {{ site.siteName }}: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + +
    +
    +

    +

    How do I contact {{ site.siteName }}?

    +
    +
    Please use the Help Tool to email us!
    +
    + +
    +
    + + +

    Will sending my issue twice get a faster reply?

    +
    +
    Sending more than one email will slow down the Player Support staff as they will have more emails to read through. If you have received no response after a week, check your spam/junk mail folder. If there is still no response, then there must have been a technical glitch and you should send your email again.
    +
    + +
    +
    + + + +
    + +
    + +
    +
    +
    +
    + + + + + \ No newline at end of file diff --git a/tools/www-tpl/default/games.tpl b/tools/www-tpl/default/games.tpl new file mode 100644 index 0000000..61f2d3c --- /dev/null +++ b/tools/www-tpl/default/games.tpl @@ -0,0 +1,217 @@ + + + + + {{ site.siteName }} ~ Games + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{% if session.loggedIn == false %} + +{% else %} + +{% endif %} + +{% include "base/header.tpl" %} +
    + + + +
    +
    +
    +
    +
    + +

    Recommended Games +

    + + + + + +
    +
    + + +
    +
    + +

    High Scores +

    +{% include "habblet/personalhighscores.tpl" %} + + + + +
    +
    + + +
    +
    +
    +
    + +

    Your Ticket To Excitement +

    +
    +
    + Game tickets cost 1 Coin for 2, or you can purchase 20 Tickets for 6 Coins. +
    +
    + + +
    +
    + + +
    +
    +

    Scoring

    +
    +
    +
    + +
    +
    + {% if viewMonthlyScores %} +

    The following results are scores earned month to month.

    +

    To view scores earned all time since game scoring has been collected, please click here.

    + {% else %} +

    The following results are scores earned all time.

    +

    To view scores earned month to month since game scoring has been collected, please click here.

    + {% endif %} +
    +
    +
    +
    +
    + + +
    + +
    +
    +
    + {% include "base/ads_container.tpl" %} +
    +
    + +
    + + +
    +{% include "base/footer.tpl" %} + + + + \ No newline at end of file diff --git a/tools/www-tpl/default/groups.tpl b/tools/www-tpl/default/groups.tpl new file mode 100644 index 0000000..2c78c85 --- /dev/null +++ b/tools/www-tpl/default/groups.tpl @@ -0,0 +1,581 @@ + + + + + + {{ site.siteName }}: Group Home: {% autoescape 'html' %}{{ group.getName }}{% endautoescape %} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{% if editMode %} + + +{% else %} + +{% endif %} + + + + + + + + + + + +{% if session.loggedIn == false %} + +{% else %} + {% if editMode %} + + {% else %} + + {% endif %} +{% endif %} +{% include "base/header.tpl" %} + +
    + +{% if session.currentPage == "games" %} + +{% endif %} + +{% if session.currentPage == "community" %} + +{% endif %} + +
    +
    +
    +
    + {% if editMode %} + + {% else %} + {% if (session.loggedIn) and (group.hasAdministrator(playerDetails.getId())) %} + Edit + {% endif %} +
    + {% if session.loggedIn == false %} + + {% else %} + {% if (group.isPendingMember(playerDetails.getId()) == false) %} + {% if (group.isMember(playerDetails.getId()) == false) %} + {% if group.getGroupType() == 0 or group.getGroupType() == 3 %} + Join + {% elseif group.getGroupType() == 1 %} + Request membership + {% endif %} + + {% else %} + {% if group.getOwnerId() != playerDetails.getId() %} + Leave group + {% endif %} + + {% if groupMember.isFavourite(group.id) %} + Remove favorite + {% else %} + Make favorite + {% endif %} + {% endif %} + {% endif %} + {% endif %} +
    + {% endif %} + +

    + {% autoescape 'html' %} + {{ group.getName }} + {% endautoescape %} + {% if group.getGroupType() == 1 %}Exclusive group{% elseif group.getGroupType() == 2%}myhabbo.headerbar.closed_group{% endif %}

    + +
    +
    + {% if editMode %} + + + + {% endif %} +
    + {% if editMode %} +
    + {% else %} +
    + {% endif %} + + {% for sticker in stickers %} + {% if sticker.getProduct().data == "groupinfowidget" %} + {% include "homes/widget/group_info_widget.tpl" with {"sticker": sticker} %} + {% elseif sticker.getProduct().data == "guestbookwidget" %} + {% include "homes/widget/guestbook_widget.tpl" with {"sticker": sticker} %} + {% elseif sticker.getProduct().data == "stickienote" %} + {% include "homes/widget/note.tpl" with {"sticker": sticker} %} + {% elseif sticker.getProduct().data == "memberwidget" %} + {% include "homes/widget/member_widget.tpl" with {"sticker": sticker} %} + {% elseif sticker.getProduct().data == "traxplayerwidget" %} + {% include "homes/widget/trax_player_widget.tpl" with {"sticker": sticker} %} + {% else %} + {% include "homes/widget/sticker.tpl" with {"sticker": sticker} %} + {% endif %} + {% endfor %} + +
    + {% if editMode %} +
    + {% else %} +
    + {% endif %} + +
    +
    +
    +
    + +{% if editMode %} + + + +
    + +{% include "base/footer.tpl" %} + + + + + + + + + + + + +{% else %} + + + +
    +{% include "base/footer.tpl" %} +
    + +
    + + +
    +

    Edit Guestbook entry

    + + X +
    + +
    +
    +

    + Note: the message length must not exceed 200 characters +

    +
    + + + +
    +
    + + Habbos Rooms Groups
    + + Find +
    + + + +
    +
    + +
    + Cancel + Preview +
    + +
    +
    +
     
    +
    +
    +
    +

    Delete entry

    + + X +
    +
    + + +

    Are you sure you want to delete this entry?

    +

    + Cancel + Delete +

    +
    +
    +
    +
    +
    +
    +

    Edit group

    + +
      + {% if (hasMember and groupMember.getMemberRank().getRankId() >= 2) %} +
    • Modify page
    • + {% endif %} + {% if (hasMember and groupMember.getMemberRank().getRankId() == 3) %} +
    • Settings
    • Badge
    • + {% endif %} + {% if (group.getGroupType() != 3) and (hasMember and groupMember.getMemberRank().getRankId() >= 2) %} +
    • Members
    • + {% endif %} +
    + +
    +
    +
    + +
    + + + + X +
    +

    +
    +
    + +
    + + + + X +
    + +
    + +
    + {% if (hasMember and groupMember.getMemberRank().getRankId() == 3) %} + Give rights + Revoke rights{% endif %} + Remove + Close +
    +
    + +
    +
    + + + + + + + +{% endif %} \ No newline at end of file diff --git a/tools/www-tpl/default/groups/discussion.tpl b/tools/www-tpl/default/groups/discussion.tpl new file mode 100644 index 0000000..491bcba --- /dev/null +++ b/tools/www-tpl/default/groups/discussion.tpl @@ -0,0 +1,384 @@ + + + + + + {{ site.siteName }}: Group Home: {% autoescape 'html' %}{{ group.getName }}{% endautoescape %} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{% if session.loggedIn == false %} + +{% else %} + +{% endif %} +{% include "../base/header.tpl" %} + +
    + + +
    + +
    +
    +
    +
    + {% if editMode %} + + {% else %} + {% if (session.loggedIn) and (group.hasAdministrator(playerDetails.getId())) %} + Edit + {% endif %} +
    + {% if session.loggedIn == false %} + + + {% else %} + {% if (group.isPendingMember(playerDetails.getId()) == false) %} + {% if (group.isMember(playerDetails.getId()) == false) %} + {% if group.getGroupType() == 0 or group.getGroupType() == 3 %} + Join + {% elseif group.getGroupType() == 1 %} + Request membership + {% endif %} + + + {% else %} + {% if group.getOwnerId() != playerDetails.getId() %} + Leave group + {% endif %} + + {% if groupMember.isFavourite(group.id) %} + Remove favorite + {% else %} + Make favorite + {% endif %} + {% endif %} + {% endif %} + {% endif %} +
    + {% endif %} + +

    + {% autoescape 'html' %} + {{ group.getName }} + {% endautoescape %} + {% if group.getGroupType() == 1 %}Exclusive group{% elseif group.getGroupType() == 2%}myhabbo.headerbar.closed_group{% endif %}

    + +
    +
    + + + + + + + +
    +
    +
    + +{% include "groups/discussion_replies.tpl" %} +
    +
    + +
    + + +
    +
    +
    + +
    + + + +
    +{% include "../base/footer.tpl" %} +
    + +
    + + +
    +

    Edit Guestbook entry

    + + X +
    + +
    +
    +

    + Note: the message length must not exceed 200 characters +

    +
    + + + +
    +
    + + Habbos Rooms Groups
    + + Find +
    + + + +
    +
    + +
    + Cancel + Preview +
    + +
    +
    +
     
    +
    +
    +
    +

    Delete entry

    + + X +
    +
    + + +

    Are you sure you want to delete this entry?

    +

    + Cancel + Delete +

    +
    +
    +
    +
    +
    +
    +

    Edit group

    + +
      + {% if (hasMember and groupMember.getMemberRank().getRankId() >= 2) %} +
    • Modify page
    • + {% endif %} + {% if (hasMember and groupMember.getMemberRank().getRankId() == 3) %} +
    • Settings
    • Badge
    • + {% endif %} + {% if (group.getGroupType() != 3) and (hasMember and groupMember.getMemberRank().getRankId() >= 2) %} +
    • Members
    • + {% endif %} +
    + +
    +
    +
    + +
    + + + + X +
    +

    +
    +
    + +
    + + + + X +
    + +
    + +
    + {% if (hasMember and groupMember.getMemberRank().getRankId() == 3) %} + Give rights + Revoke rights{% endif %} + Remove + Close +
    +
    + +
    +
    +
    +

    Confirm email address

    + + + X +
    +

    You need to confirm your email before you can post new messages.

    +

    Activate your email

    +

    + OK +

    + +
    +
    +
    +

    Delete discussion

    + + X +
    +
    + +

    Are you sure you want to delete this post?

    +

    + Cancel + Delete +

    +
    +
    +
    + + + + + + \ No newline at end of file diff --git a/tools/www-tpl/default/groups/discussion_replies.tpl b/tools/www-tpl/default/groups/discussion_replies.tpl new file mode 100644 index 0000000..49b894f --- /dev/null +++ b/tools/www-tpl/default/groups/discussion_replies.tpl @@ -0,0 +1,331 @@ +{% if hasMessage == false %} +
    + {% if discussionTopic.isOpen() == false %} + Closed Thread + {% endif %} + {% if canReplyForum %} + Post Reply + {% endif %} + {% if (session.loggedIn) and ((playerDetails.id == discussionTopic.getCreatorId()) or hasTopicAdmin) %} + Edit Thread » + {% endif %} + + +
    + View page: + {% if currentPage != 1 %} + << + {% endif %} + + {% if previousPage5 != -1 %} + {{ previousPage5 }} + {% endif %} + + {% if previousPage4 != -1 %} + {{ previousPage4 }} + {% endif %} + + {% if previousPage3 != -1 %} + {{ previousPage3 }} + {% endif %} + + {% if previousPage2 != -1 %} + {{ previousPage2 }} + {% endif %} + + {% if previousPage1 != -1 %} + {{ previousPage1 }} + {% endif %} + {{ currentPage }} + {% if nextPage1 != -1 %} + {{ nextPage1 }} + {% endif %} + + {% if nextPage2 != -1 %} + {{ nextPage2 }} + {% endif %} + + {% if nextPage3 != -1 %} + {{ nextPage3 }} + {% endif %} + + {% if nextPage4 != -1 %} + {{ nextPage4 }} + {% endif %} + + {% if nextPage5 != -1 %} + {{ nextPage5 }} + {% endif %} + + {% if pages != currentPage %} + >> + {% endif %} +
    +
    +{% endif %} + +{% if hasMessage %} +
    +
    + +

    Oops!

    + +

    + {{ message }}
    +

    + +
    +
    +{% else %} +{% set num = 0 %} +{% for reply in replyList %} + {% if num % 2 == 0 %} + + {% else %} + + {% endif %} + + + + +{% set num = num + 1 %} +{% endfor %} + + + + + + + + + + +{% endif %} +
    + {{ reply.getUsername() }} + + {% if reply.isOnline() %} + online_anim + {% else %} + online_anim + {% endif %} +
    Messages: {{ reply.getForumMessages() }}
    +
    +
    +
    + {% if reply.hasGroupBadge() %} + + +
    + {% endif %} + {% if reply.hasBadge() %} +
    + +
    + {% endif %} +
    +
    +
    + {% if (session.loggedIn) and + (discussionTopic.isOpen()) and + ((playerDetails.id != reply.getUserId()) or hasTopicAdmin) and + (reply.isDeleted() == false) %} + Quote + {% endif %} + + {% if (session.loggedIn) and + (discussionTopic.isOpen()) and + (playerDetails.id == reply.getUserId()) and + (reply.isDeleted() == false) %} + Edit + {% endif %} + + {% autoescape 'html' %}{% if reply.getId() != firstReply %}RE: {% endif %}{{ discussionTopic.getTopicTitle() }}{% endautoescape %}
    + {{ reply.getCreatedDate('MMM dd, yyyy') }} ({{ reply.getCreatedDate('h:mm a') }}) + {% if reply.isDeleted() == false %} + {% if ((session.loggedIn) and (playerDetails.id != reply.getUserId())) %} +
    + +
    + {% endif %} + + {% if ((session.loggedIn) and (playerDetails.id != reply.getUserId()) or (discussionTopic.isOpen())) or (hasTopicAdmin) %} + {% endif %} + + {% if ((session.loggedIn) and (playerDetails.id == reply.getUserId())) or (hasTopicAdmin) %} +
    + + +
    + {% endif %} + {% endif %} +
    + + {% if reply.isEdited() or reply.isDeleted() %} + Last edited: {{ reply.getEditedDate('MMM dd, yyyy') }} ({{ reply.getEditedDate('h:mm a') }}) +
    + {% endif %} + {%if reply.isDeleted() %}[Post deleted]{% else %}{{ reply.getFormattedMessage() }}{% endif %} +
    +
    +
    + +
    + +
    +
    + {% if hasMessage == false %} + + + + +{% endif %} \ No newline at end of file diff --git a/tools/www-tpl/default/groups/discussions/confirm_delete_topic.tpl b/tools/www-tpl/default/groups/discussions/confirm_delete_topic.tpl new file mode 100644 index 0000000..5dceb51 --- /dev/null +++ b/tools/www-tpl/default/groups/discussions/confirm_delete_topic.tpl @@ -0,0 +1,8 @@ +

    You are about to delete a topic are you sure?

    + +

    +Cancel +Ok +

    + +
    \ No newline at end of file diff --git a/tools/www-tpl/default/groups/discussions/newpost.tpl b/tools/www-tpl/default/groups/discussions/newpost.tpl new file mode 100644 index 0000000..611449d --- /dev/null +++ b/tools/www-tpl/default/groups/discussions/newpost.tpl @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + diff --git a/tools/www-tpl/default/groups/discussions/opentopicsettings.tpl b/tools/www-tpl/default/groups/discussions/opentopicsettings.tpl new file mode 100644 index 0000000..c5989d2 --- /dev/null +++ b/tools/www-tpl/default/groups/discussions/opentopicsettings.tpl @@ -0,0 +1,32 @@ +
    +
    +
    + Topic: (max 32 characters) +
    +
    + +
    +
    +
    +
    +
    +
    + Type: +
    +
    + Open +
    + Normal
    +
    + Closed +
    + Sticky thread
    +
    +
    +
    +
    + Cancel + Delete Ok +
    +
    +
    \ No newline at end of file diff --git a/tools/www-tpl/default/groups/discussions/previewpost.tpl b/tools/www-tpl/default/groups/discussions/previewpost.tpl new file mode 100644 index 0000000..6aef0d8 --- /dev/null +++ b/tools/www-tpl/default/groups/discussions/previewpost.tpl @@ -0,0 +1,44 @@ + + + + + +
    + {{ playerDetails.getName() }} + {% if playerDetails.isOnline %} + online_anim + {% else %} + online_anim + {% endif %} +
    Messages: {{ userReplies }}
    +
    +
    + +
    + {% if hasGroup %} +
    +
    + {% endif %} + {% if hasBadge %} +
    + +
    + {% endif %} +
    +
    + {{ playerDetails.motto }}
    +
    + « Edit + {% autoescape 'html' %}{{ postName }}{% endautoescape %}
    + {{ previewDay }} ({{ previewTime }}) +
    +
    +
    + {{ postMessage }}
    +
    +
    + Cancel + Save +
    +
    +
    \ No newline at end of file diff --git a/tools/www-tpl/default/groups/discussions/previewtopic.tpl b/tools/www-tpl/default/groups/discussions/previewtopic.tpl new file mode 100644 index 0000000..5411895 --- /dev/null +++ b/tools/www-tpl/default/groups/discussions/previewtopic.tpl @@ -0,0 +1,44 @@ + + + + + +
    + {{ playerDetails.getName() }} + {% if playerDetails.isOnline %} + online_anim + {% else %} + online_anim + {% endif %} +
    Messages: {{ userReplies }}
    +
    +
    + +
    + {% if hasGroup %} +
    +
    + {% endif %} + {% if hasBadge %} +
    + +
    + {% endif %} +
    +
    + {{ playerDetails.motto }}
    +
    + « Edit + {% autoescape 'html' %}{{ topicName }}{% endautoescape %}
    + {{ previewDay }} ({{ previewTime }}) +
    +
    +
    + {{ topicMessage }}
    +
    +
    + Cancel + Save +
    +
    +
    \ No newline at end of file diff --git a/tools/www-tpl/default/groups/favourite/confirm_deselect_favourite.tpl b/tools/www-tpl/default/groups/favourite/confirm_deselect_favourite.tpl new file mode 100644 index 0000000..3c4aa62 --- /dev/null +++ b/tools/www-tpl/default/groups/favourite/confirm_deselect_favourite.tpl @@ -0,0 +1,10 @@ +

    +Are you sure you dont want to have this Group as your favorite Group anymore?

    + + +

    +Cancel +Ok +

    + +
    \ No newline at end of file diff --git a/tools/www-tpl/default/groups/favourite/confirm_select_favourite.tpl b/tools/www-tpl/default/groups/favourite/confirm_select_favourite.tpl new file mode 100644 index 0000000..0509ce3 --- /dev/null +++ b/tools/www-tpl/default/groups/favourite/confirm_select_favourite.tpl @@ -0,0 +1,10 @@ +

    +Are you sure you want to have {{ groupName }} as your favorite Group?

    + + +

    +Cancel +Ok +

    + +
    \ No newline at end of file diff --git a/tools/www-tpl/default/groups/habblet/check_group_url.tpl b/tools/www-tpl/default/groups/habblet/check_group_url.tpl new file mode 100644 index 0000000..c23e356 --- /dev/null +++ b/tools/www-tpl/default/groups/habblet/check_group_url.tpl @@ -0,0 +1 @@ +Your group alias will be {{ site.sitePath }}/groups/{{ url }}. You can not alter it later on. \ No newline at end of file diff --git a/tools/www-tpl/default/groups/habblet/confirm_delete_group.tpl b/tools/www-tpl/default/groups/habblet/confirm_delete_group.tpl new file mode 100644 index 0000000..ec43bd3 --- /dev/null +++ b/tools/www-tpl/default/groups/habblet/confirm_delete_group.tpl @@ -0,0 +1,10 @@ +

    +Are you sure you want to delete the group {{ group.getName() }}? +

    + +

    +Cancel +Ok +

    + +
    \ No newline at end of file diff --git a/tools/www-tpl/default/groups/habblet/delete_group.tpl b/tools/www-tpl/default/groups/habblet/delete_group.tpl new file mode 100644 index 0000000..de7700f --- /dev/null +++ b/tools/www-tpl/default/groups/habblet/delete_group.tpl @@ -0,0 +1,7 @@ +

    +The group has been deleted successfully.

    +

    +Ok +

    + +
    \ No newline at end of file diff --git a/tools/www-tpl/default/groups/habblet/group_create_form.tpl b/tools/www-tpl/default/groups/habblet/group_create_form.tpl new file mode 100644 index 0000000..125cbbd --- /dev/null +++ b/tools/www-tpl/default/groups/habblet/group_create_form.tpl @@ -0,0 +1,29 @@ +
    + +
    + +

    +Price: {{ groupCost }} Credits.
    You have: {{ playerDetails.credits }} Credits. +

    + +
    + +
    +
    + +
    +
    + +
    +
    + + +
    + +
    +
    + + diff --git a/tools/www-tpl/default/groups/habblet/group_settings.tpl b/tools/www-tpl/default/groups/habblet/group_settings.tpl new file mode 100644 index 0000000..990430a --- /dev/null +++ b/tools/www-tpl/default/groups/habblet/group_settings.tpl @@ -0,0 +1,182 @@ +
    + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    + + {% if group.getAlias() == "" %} +
    + + {% else %} + /groups/{{ group.getAlias() }}
    + + + {% endif %} + +
    +
    + +
    +
    + + + + + + +
    +
    +
    + {% if group.getGroupType() == 3 %} + + +
    +
    Regular
    +

    Anyone can join. 5000 member limit.

    +
    + +
    +
    Exclusive
    +

    Group Admin controls who can join.

    +
    + +
    +
    Private
    +

    No one can join.

    +
    + +
    +
    Unlimited
    +

    Anyone can join. No membership limit. Unable to browse members.

    +

    Note: If you choose this option you can't change it later!

    +
    + + {% else %} + + +
    +
    Regular
    +

    Anyone can join. 5000 member limit.

    +
    + +
    +
    Exclusive
    +

    Group Admin controls who can join.

    +
    + +
    +
    Private
    +

    No one can join.

    +
    + +
    +
    Unlimited
    +

    Anyone can join. No membership limit. Unable to browse members.

    +

    Note: If you choose this option you can't change it later!

    +
    + + {% endif %} +
    +
    + + + + + + + + +
    + + +
    + + diff --git a/tools/www-tpl/default/groups/habblet/listgrouptags.tpl b/tools/www-tpl/default/groups/habblet/listgrouptags.tpl new file mode 100644 index 0000000..bb05a44 --- /dev/null +++ b/tools/www-tpl/default/groups/habblet/listgrouptags.tpl @@ -0,0 +1,31 @@ +
    +{% if (tags|length) == 0 %} +No tags. +{% else %} + {% for tag in tags %} + + {% autoescape 'html' %} + {{ tag }} + {% endautoescape %} + {% if (session.loggedIn) and (group.getOwnerId() == playerDetails.id) %} + + {% else %} + + {% endif %} + + {% endfor %} +{% endif %} +
    + +{% if session.loggedIn %} + {% if group.getOwnerId() == playerDetails.getId() %} + + {% endif %} +{% endif %} \ No newline at end of file diff --git a/tools/www-tpl/default/groups/habblet/purchase_ajax.tpl b/tools/www-tpl/default/groups/habblet/purchase_ajax.tpl new file mode 100644 index 0000000..f31e298 --- /dev/null +++ b/tools/www-tpl/default/groups/habblet/purchase_ajax.tpl @@ -0,0 +1,20 @@ + + +

    +Congratulations: You are the proud owner of {{ groupName }} +

    + +

    + +

    + +

    + + \ No newline at end of file diff --git a/tools/www-tpl/default/groups/habblet/purchase_confirmation.tpl b/tools/www-tpl/default/groups/habblet/purchase_confirmation.tpl new file mode 100644 index 0000000..3d344ab --- /dev/null +++ b/tools/www-tpl/default/groups/habblet/purchase_confirmation.tpl @@ -0,0 +1,16 @@ + + + + +

    +Group name: {{ groupName }}.
    Price: {{ groupCost }} Credits.
    You have: {{ playerDetails.credits }} Credits. +

    + +
    + +
    \ No newline at end of file diff --git a/tools/www-tpl/default/groups/habblet/purchase_result_error.tpl b/tools/www-tpl/default/groups/habblet/purchase_result_error.tpl new file mode 100644 index 0000000..7e0739d --- /dev/null +++ b/tools/www-tpl/default/groups/habblet/purchase_result_error.tpl @@ -0,0 +1,12 @@ +

    Purchase of a Group failed. Please try again later

    +
    +

    + You don't have enough Credits.
    +

    +
    + +

    +Done +

    + +
    \ No newline at end of file diff --git a/tools/www-tpl/default/groups/habblet/show_badge_editor.tpl b/tools/www-tpl/default/groups/habblet/show_badge_editor.tpl new file mode 100644 index 0000000..2233b8f --- /dev/null +++ b/tools/www-tpl/default/groups/habblet/show_badge_editor.tpl @@ -0,0 +1,17 @@ +
    +

    Adobe Flash player is required.

    +

    Click here to install Adobe Flash player.

    +
    + \ No newline at end of file diff --git a/tools/www-tpl/default/groups/habblet/update_group_settings.tpl b/tools/www-tpl/default/groups/habblet/update_group_settings.tpl new file mode 100644 index 0000000..fce6895 --- /dev/null +++ b/tools/www-tpl/default/groups/habblet/update_group_settings.tpl @@ -0,0 +1,6 @@ +{{ message }} +

    +Done +

    + +
    \ No newline at end of file diff --git a/tools/www-tpl/default/groups/member/confirm_accept.tpl b/tools/www-tpl/default/groups/member/confirm_accept.tpl new file mode 100644 index 0000000..a398b5d --- /dev/null +++ b/tools/www-tpl/default/groups/member/confirm_accept.tpl @@ -0,0 +1,9 @@ +

    +Accept new members into: {{ groupName }}

    + +

    +Cancel +Ok +

    + +
    \ No newline at end of file diff --git a/tools/www-tpl/default/groups/member/confirm_decline.tpl b/tools/www-tpl/default/groups/member/confirm_decline.tpl new file mode 100644 index 0000000..a225a5e --- /dev/null +++ b/tools/www-tpl/default/groups/member/confirm_decline.tpl @@ -0,0 +1,9 @@ +

    +Are you sure you want to reject the member requests of the selected {{ targetIds }} {{ site.siteName}}(s)?

    + +

    +Cancel +Ok +

    + +
    \ No newline at end of file diff --git a/tools/www-tpl/default/groups/member/confirm_give_rights.tpl b/tools/www-tpl/default/groups/member/confirm_give_rights.tpl new file mode 100644 index 0000000..fdb30ad --- /dev/null +++ b/tools/www-tpl/default/groups/member/confirm_give_rights.tpl @@ -0,0 +1,9 @@ +

    +Are you sure you want to give admin rights to the selected {{ targetIds }} member(s)?

    + +

    +Cancel +Ok +

    + +
    \ No newline at end of file diff --git a/tools/www-tpl/default/groups/member/confirm_leave.tpl b/tools/www-tpl/default/groups/member/confirm_leave.tpl new file mode 100644 index 0000000..d380f44 --- /dev/null +++ b/tools/www-tpl/default/groups/member/confirm_leave.tpl @@ -0,0 +1,10 @@ +

    +Are you sure you want to leave this group?

    + + +

    +Cancel +Ok +

    + +
    \ No newline at end of file diff --git a/tools/www-tpl/default/groups/member/confirm_remove.tpl b/tools/www-tpl/default/groups/member/confirm_remove.tpl new file mode 100644 index 0000000..0aee794 --- /dev/null +++ b/tools/www-tpl/default/groups/member/confirm_remove.tpl @@ -0,0 +1,9 @@ +

    +Are you sure you want to remove the selected {{ targetIds }} member(s)?

    + +

    +Cancel +Ok +

    + +
    \ No newline at end of file diff --git a/tools/www-tpl/default/groups/member/confirm_revoke_rights.tpl b/tools/www-tpl/default/groups/member/confirm_revoke_rights.tpl new file mode 100644 index 0000000..f6b5fc1 --- /dev/null +++ b/tools/www-tpl/default/groups/member/confirm_revoke_rights.tpl @@ -0,0 +1,9 @@ +

    +Are you sure you want to remove admin rights from the selected {{ targetIds }}

    + +

    +Cancel +Ok +

    + +
    \ No newline at end of file diff --git a/tools/www-tpl/default/groups/member/leave.tpl b/tools/www-tpl/default/groups/member/leave.tpl new file mode 100644 index 0000000..b430a4c --- /dev/null +++ b/tools/www-tpl/default/groups/member/leave.tpl @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/tools/www-tpl/default/groups/member/member_added.tpl b/tools/www-tpl/default/groups/member/member_added.tpl new file mode 100644 index 0000000..5fa25da --- /dev/null +++ b/tools/www-tpl/default/groups/member/member_added.tpl @@ -0,0 +1,8 @@ +

    +You have now joined this group

    + +

    +Ok +

    + +
    \ No newline at end of file diff --git a/tools/www-tpl/default/groups/member/member_added_request.tpl b/tools/www-tpl/default/groups/member/member_added_request.tpl new file mode 100644 index 0000000..9a46da2 --- /dev/null +++ b/tools/www-tpl/default/groups/member/member_added_request.tpl @@ -0,0 +1,8 @@ +

    +Your membership request has been sent.

    + +

    +Ok +

    + +
    \ No newline at end of file diff --git a/tools/www-tpl/default/groups/memberlist.tpl b/tools/www-tpl/default/groups/memberlist.tpl new file mode 100644 index 0000000..a5e37d6 --- /dev/null +++ b/tools/www-tpl/default/groups/memberlist.tpl @@ -0,0 +1,97 @@ +
    + +
    +
      + +{% set firstPage = -1 %} +{% set previousPage = -1 %} +{% set nextPage = -1 %} +{% set lastPage = -1 %} + +{% if currentPage >= 2 %} + {% set firstPage = 1 %} +{% endif %} + +{% if currentPage > 1 %} + {% set previousPage = 1 %} +{% endif %} + +{% if pages >= (currentPage + 1) %} + {% set nextPage = 1 %} +{% endif %} + +{% if pages >= (currentPage + 2) %} + {% set lastPage = 1 %} +{% endif %} + +{% set position = "right" %} + +{% set i = 0 %} +{% set lefts = 0 %} +{% set rights = 0 %} +{% for member in memberList %} + {% if i % 2 == 0 %} + {% set position = "right" %} + {% set rights = rights + 1 %} + {% else %} + {% set position = "left" %} + {% set lefts = lefts + 1 %} + {% endif %} + + {% if lefts % 2 == 0 %} + {% set status = "even" %} + {% else %} + {% set status = "odd" %} + {% endif %} + +
    • +
      +
      + {% if member.getMemberRank().getRankId() == 3 %} + + {% endif %} + {% if member.getMemberRank().getRankId() == 2 %} + Administrator + {% endif %} +
      + {% if (selfMember.getMemberRank().getRankId() <= member.getMemberRank().getRankId()) and (selfMember.getMemberRank().getRankId() >= 2) %} + + {% else %} + {% if member.getMemberRank().getRankId() == 2 %} + + {% elseif member.getMemberRank().getRankId() == 1 %} + + {% endif %} + {% endif %} + + {{ member.getUser().getName() }} +
      +
    • + + {% set i = i + 1 %} +{% endfor %} + +
    + +
    +
    +{{ memberList|length }} - {{ currentPage }} / {{ pages }} +
    +
    + {% if (firstPage != -1) or (previousPage != -1) %} + First | + << | + {% else %} + First | << | + {% endif %} + + {% if (lastPage != -1) or (nextPage != -1) %} + >> | + Last + {% else %} + >> | Last + {% endif %} + + +
    +
    \ No newline at end of file diff --git a/tools/www-tpl/default/groups/view_discussions.tpl b/tools/www-tpl/default/groups/view_discussions.tpl new file mode 100644 index 0000000..7d2cf3e --- /dev/null +++ b/tools/www-tpl/default/groups/view_discussions.tpl @@ -0,0 +1,537 @@ + + + + + + {{ site.siteName }}: Group Home: {% autoescape 'html' %}{{ group.getName }}{% endautoescape %} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{% if session.loggedIn == false %} + +{% else %} + +{% endif %} +{% include "../base/header.tpl" %} + +
    + + + +
    +
    +
    +
    + {% if editMode %} + + {% else %} + {% if (session.loggedIn) and (group.hasAdministrator(playerDetails.getId())) %} + Edit + {% endif %} +
    + {% if session.loggedIn == false %} + + {% else %} + {% if (group.isPendingMember(playerDetails.getId()) == false) %} + {% if (group.isMember(playerDetails.getId()) == false) %} + {% if group.getGroupType() == 0 or group.getGroupType() == 3 %} + Join + {% elseif group.getGroupType() == 1 %} + Request membership + {% endif %} + + {% else %} + {% if group.getOwnerId() != playerDetails.getId() %} + Leave group + {% endif %} + + {% if groupMember.isFavourite(group.id) %} + Remove favorite + {% else %} + Make favorite + {% endif %} + {% endif %} + {% endif %} + {% endif %} +
    + {% endif %} + +

    + {% autoescape 'html' %} + {{ group.getName }} + {% endautoescape %} + {% if group.getGroupType() == 1 %}Exclusive group{% elseif group.getGroupType() == 2%}myhabbo.headerbar.closed_group{% endif %}

    + +
    +
    + + + + + + +
    +
    + {% if (canViewForum == false) %} +
    + +

    Oops!

    + +

    + View forums denied. Please check that you are logged in and have the appropriate rights to view the forums. If you are logged in and still can't view the forums, the group may be private. If so, you need to join the group in order to view the forums. +
    +

    + +
    +{% else %} + +
    + +
    + {% if session.loggedIn == false %} + Please sign in to post new threads + {% elseif canPostForum %} + + New Thread + {% endif %} +
    + View page: +{% if currentPage != 1 %} +<< +{% endif %} + +{% if previousPage5 != -1 %} +{{ previousPage5 }} +{% endif %} + +{% if previousPage4 != -1 %} +{{ previousPage4 }} +{% endif %} + +{% if previousPage3 != -1 %} +{{ previousPage3 }} +{% endif %} + +{% if previousPage2 != -1 %} +{{ previousPage2 }} +{% endif %} + +{% if previousPage1 != -1 %} +{{ previousPage1 }} +{% endif %} +{{ currentPage }} +{% if nextPage1 != -1 %} +{{ nextPage1 }} +{% endif %} + +{% if nextPage2 != -1 %} +{{ nextPage2 }} +{% endif %} + +{% if nextPage3 != -1 %} +{{ nextPage3 }} +{% endif %} + +{% if nextPage4 != -1 %} +{{ nextPage4 }} +{% endif %} + +{% if nextPage5 != -1 %} +{{ nextPage5 }} +{% endif %} + +{% if pages != currentPage %} +>> +{% endif %} +
    +
    + + + + + + + +{% set num = 0 %} +{% for topic in discussionTopics %} + {% if num % 2 == 0 %} + + {% else %} + + {% endif %} + + + + + + {% set num = num + 1 %} +{% endfor %} +
    Thread and First PosterLast PostRepliesViews
    +
    + + {% autoescape 'html' %}{{ topic.getTopicTitle }}{% endautoescape %} + + {% if topic.isOpen() == false %} + Closed Thread + {% endif %} + + (page + 1 + {% if topic.getRecentPages()|length > 0 %} + ... + {% endif %} + {% for page in topic.getRecentPages() %} + {{ page }} + {% endfor %}) +
    + {{ topic.getCreatorName() }} + + {{ topic.getCreatedDate('MMM dd, yyyy') }} + ({{ topic.getCreatedDate('h:mm a') }}) + {% if (session.loggedIn) and (topic.isNew()) %} + NEW NEW{% endif %}
    + + +
    + + {{ topic.getLastMessage('MMM dd, yyyy') }} + ({{ topic.getLastMessage('h:mm a') }})
    + by: {{ topic.getLastReplyName() }} + +
    {{ topic.getReplyCount() - 1 }}{{ topic.getViews() }}
    + +
    + + +{% endif %} +
    + +
    + + +
    +
    +
    +
    +
    + + + +
    +{% include "../base/footer.tpl" %} +
    + +
    + + +
    +

    Edit Guestbook entry

    + + X +
    + +
    +
    +

    + Note: the message length must not exceed 200 characters +

    +
    + + + +
    +
    + + Habbos Rooms Groups
    + + Find +
    + + + +
    +
    + +
    + Cancel + Preview +
    + +
    +
    +
     
    +
    +
    +
    +

    Delete entry

    + + X +
    +
    + + +

    Are you sure you want to delete this entry?

    +

    + Cancel + Delete +

    +
    +
    +
    +
    +
    +
    +

    Edit group

    + +
      + {% if (hasMember and groupMember.getMemberRank().getRankId() >= 2) %} +
    • Modify page
    • + {% endif %} + {% if (hasMember and groupMember.getMemberRank().getRankId() == 3) %} +
    • Settings
    • Badge
    • + {% endif %} + {% if (group.getGroupType() != 3) and (hasMember and groupMember.getMemberRank().getRankId() >= 2) %} +
    • Members
    • + {% endif %} +
    + +
    +
    +
    + +
    + + + + X +
    +

    +
    +
    + +
    + + + + X +
    + +
    + +
    + {% if (hasMember and groupMember.getMemberRank().getRankId() == 3) %} + Give rights + Revoke rights{% endif %} + Remove + Close +
    +
    + +
    +
    + + + + + + diff --git a/tools/www-tpl/default/habblet/collectiblesConfirm.tpl b/tools/www-tpl/default/habblet/collectiblesConfirm.tpl new file mode 100644 index 0000000..79b93ef --- /dev/null +++ b/tools/www-tpl/default/habblet/collectiblesConfirm.tpl @@ -0,0 +1,8 @@ +

    +Are you sure you want to purchase {{ collectableName }}? It will cost {{ collectableCost }} credits. +

    + +

    +Purchase +Close +

    \ No newline at end of file diff --git a/tools/www-tpl/default/habblet/collectiblesPurchase.tpl b/tools/www-tpl/default/habblet/collectiblesPurchase.tpl new file mode 100644 index 0000000..9f07f56 --- /dev/null +++ b/tools/www-tpl/default/habblet/collectiblesPurchase.tpl @@ -0,0 +1,8 @@ +

    +{{ message }}. +

    + + +

    +OK +

    \ No newline at end of file diff --git a/tools/www-tpl/default/habblet/community_hot_groups.tpl b/tools/www-tpl/default/habblet/community_hot_groups.tpl new file mode 100644 index 0000000..88e26d7 --- /dev/null +++ b/tools/www-tpl/default/habblet/community_hot_groups.tpl @@ -0,0 +1,62 @@ + + + +
    +
      + {% set position = "right" %} + + {% set i = 0 %} + {% set lefts = 0 %} + {% set rights = 0 %} + {% for group in hotGroups %} + {% if i % 2 == 0 %} + {% set position = "right" %} + {% set rights = rights + 1 %} + {% else %} + {% set position = "left" %} + {% set lefts = lefts + 1 %} + {% endif %} + + {% if lefts % 2 == 0 %} + {% set status = "odd" %} + {% else %} + {% set status = "even" %} + {% endif %} +
    • + {{ i + 1}}. {% autoescape 'html' %}{{ group.name }}{% endautoescape %} +
    • + {% set i = i + 1 %} + {% endfor %} +
    + + + +
    diff --git a/tools/www-tpl/default/habblet/habboClubConfirm.tpl b/tools/www-tpl/default/habblet/habboClubConfirm.tpl new file mode 100644 index 0000000..eac02fb --- /dev/null +++ b/tools/www-tpl/default/habblet/habboClubConfirm.tpl @@ -0,0 +1,16 @@ +
    + + +

    Confirmation

    +

    {{ clubMonths }} {{ site.siteName }} Club month ({{ clubDays }} days) costs {{ clubCredits }} Coins. You Currently Have: {{ playerDetails.credits }} Coins.

    + +

    + +Cancel + +Ok +

    + +
    + +
    \ No newline at end of file diff --git a/tools/www-tpl/default/habblet/habboClubEnddate.tpl b/tools/www-tpl/default/habblet/habboClubEnddate.tpl new file mode 100644 index 0000000..c4df7b2 --- /dev/null +++ b/tools/www-tpl/default/habblet/habboClubEnddate.tpl @@ -0,0 +1,12 @@ +{% if session.loggedIn %} + +

    +{% if playerDetails.hasClubSubscription() %} +You have {{ hcDays }} {{ site.siteName }} Club day(s) left. +{% else %} +You are not a member of {{ site.siteName }} Club + +{% endif %} +

    + +{% endif %} \ No newline at end of file diff --git a/tools/www-tpl/default/habblet/habboClubSubscribe.tpl b/tools/www-tpl/default/habblet/habboClubSubscribe.tpl new file mode 100644 index 0000000..f4901dd --- /dev/null +++ b/tools/www-tpl/default/habblet/habboClubSubscribe.tpl @@ -0,0 +1,14 @@ +
    + + +

    Subscribe

    +

    {{ subscribeMsg }}

    + +

    + +Ok +

    + +
    + +
    \ No newline at end of file diff --git a/tools/www-tpl/default/habblet/habboclubgift.tpl b/tools/www-tpl/default/habblet/habboclubgift.tpl new file mode 100644 index 0000000..93c6086 --- /dev/null +++ b/tools/www-tpl/default/habblet/habboclubgift.tpl @@ -0,0 +1,67 @@ +
    +
    + {% if currentPage != 1 %} +
    + << +
    + {% else %} +
    + << +
    + {% endif %} + + {% if currentPage != 1 %} +
    + Previous +
    + {% else %} +
    + Previous +
    + {% endif %} + + {% for page in pages %} + {% if page == currentPage %} +
    + {{ currentPage }} +
    + + {% else %} + + {% endif %} + {% endfor %} + + {% if currentPage != lastPage %} +
    + Next +
    + {% else %} +
    + Next +
    + {% endif %} + + {% if currentPage == lastPage %} + >> + {% else %} +
    + >> +
    + {% endif %} +
    +
    +
    +
    + #{{ currentPage }} +
    +
    +
    + {{ item.getName() }} +
    +
    +
    + {{ item.getName() }} +
    +
    \ No newline at end of file diff --git a/tools/www-tpl/default/habblet/hot_groups.tpl b/tools/www-tpl/default/habblet/hot_groups.tpl new file mode 100644 index 0000000..2d4b89d --- /dev/null +++ b/tools/www-tpl/default/habblet/hot_groups.tpl @@ -0,0 +1,45 @@ +
    + + +
      + {% set position = "right" %} + + {% set i = 0 %} + {% set lefts = 0 %} + {% set rights = 0 %} + {% for group in groups %} + {% if i % 2 == 0 %} + {% set position = "right" %} + {% set rights = rights + 1 %} + {% else %} + {% set position = "left" %} + {% set lefts = lefts + 1 %} + {% endif %} + + {% if lefts % 2 == 0 %} + {% set status = "odd" %} + {% else %} + {% set status = "even" %} + {% endif %} +
    • + {% autoescape 'html' %}{{ group.name }}{% endautoescape %} +
    • + {% set i = i + 1 %} + {% endfor %} +
    + + +
    + +
    + + + + + + + +
    diff --git a/tools/www-tpl/default/habblet/invite_addFriend.tpl b/tools/www-tpl/default/habblet/invite_addFriend.tpl new file mode 100644 index 0000000..314caf2 --- /dev/null +++ b/tools/www-tpl/default/habblet/invite_addFriend.tpl @@ -0,0 +1,8 @@ +
      +
    • {{ message }}
    • +
    + + +

    +Done +

    \ No newline at end of file diff --git a/tools/www-tpl/default/habblet/invite_confirmAddFriend.tpl b/tools/www-tpl/default/habblet/invite_confirmAddFriend.tpl new file mode 100644 index 0000000..0d2a8b4 --- /dev/null +++ b/tools/www-tpl/default/habblet/invite_confirmAddFriend.tpl @@ -0,0 +1,6 @@ +

    +Are you sure you want to add {{ username }} to your friend list?

    + +

    +Cancel +Continue

    \ No newline at end of file diff --git a/tools/www-tpl/default/habblet/invite_referralLink.tpl b/tools/www-tpl/default/habblet/invite_referralLink.tpl new file mode 100644 index 0000000..e19fb1d --- /dev/null +++ b/tools/www-tpl/default/habblet/invite_referralLink.tpl @@ -0,0 +1,9 @@ +

    Enjoy {{ site.siteName }} more with real life friends!

    + +
    + +

    Send this link to your friend via email or chat. If they are using {{ site.siteName }} in active way you get rewarded with a badge.

    + + + +
    \ No newline at end of file diff --git a/tools/www-tpl/default/habblet/invite_searchContent.tpl b/tools/www-tpl/default/habblet/invite_searchContent.tpl new file mode 100644 index 0000000..1b412a5 --- /dev/null +++ b/tools/www-tpl/default/habblet/invite_searchContent.tpl @@ -0,0 +1,42 @@ + {% if searchResults|length > 0 %} +
      + {% set num = 0 %} + {% for details in searchResults %} + {% if num % 2 == 0 %}
    • +
      + {{ details.getName() }}
      + +
      + +
      + Last visit
      + {{ details.getFormattedLastOnline().toUpperCase() }} +
      +
      + {% if messenger.hasFriend(details.id) == false %} + + {% endif %} +
      +
      +
    • + {% set num = num + 1 %} + {% endfor %} +
    +
    +

    + « + {% if previousPageId > 0 %} + {{ previousPageId }} + {% endif %} + {{ currentPage }} + {% if nextPageId > 0 %} + {{ nextPageId }} + {% endif %} + » +

    + + +
    + {% else %} +
    {{ site.siteName }} not found. Please make sure you have typed his or her name correctly and try again.
    + {% endif %} \ No newline at end of file diff --git a/tools/www-tpl/default/habblet/load_events.tpl b/tools/www-tpl/default/habblet/load_events.tpl new file mode 100644 index 0000000..8ffafb4 --- /dev/null +++ b/tools/www-tpl/default/habblet/load_events.tpl @@ -0,0 +1,42 @@ +
      +{% set num = 0 %} +{% for event in events %} + {% set listClass = "" %} + + {% if num % 2 == 0 %} + {% set listClass = "even" %} + {% else %} + {% set listClass = "odd" %} + {% endif %} + + {% set roomData = event.getRoomData() %} + {% set creator = event.getUserInfo().getName() %} + + {% set occupancyLevel = 1 %} + {% if roomData.getVisitorsNow() > 0 %} + + {% set percentage = ((roomData.getVisitorsNow() / roomData.getVisitorsMax()) * 100) %} + + {% if (percentage >= 99) %} + {% set occupancyLevel = 5 %} + {% elseif (percentage > 65) %} + {% set occupancyLevel = 4 %} + {% elseif (percentage > 32) %} + {% set occupancyLevel = 3 %} + {% elseif (percentage > 0) %} + {% set occupancyLevel = 2 %} + {% endif %} + + {% endif %} + + {% autoescape 'html' %}
    • +
      + {{ event.getName() }} + by {{ creator }} +

      {{ event.getDescription() }} ({{ event.getFriendlyDate() }})

      +
      +
    • {% endautoescape %} + {% set num = num + 1 %} +{% endfor %} + +
    \ No newline at end of file diff --git a/tools/www-tpl/default/habblet/minimail.tpl b/tools/www-tpl/default/habblet/minimail.tpl new file mode 100644 index 0000000..f10ca27 --- /dev/null +++ b/tools/www-tpl/default/habblet/minimail.tpl @@ -0,0 +1,44 @@ +
    +
    +
    +

    Minimail +

    + + + +
    +
    +{% include "habblet/minimail/minimail_messages.tpl" %} + +
    +
    + +
    + + +
    +
    +
    + + \ No newline at end of file diff --git a/tools/www-tpl/default/habblet/minimail/minimail_load_message.tpl b/tools/www-tpl/default/habblet/minimail/minimail_load_message.tpl new file mode 100644 index 0000000..bf55493 --- /dev/null +++ b/tools/www-tpl/default/habblet/minimail/minimail_load_message.tpl @@ -0,0 +1,34 @@ +
      +
    • +
    • Subject: {{ minimailMessage.getFormattedSubject() }}
    • +
    • From: {{ minimailMessage.getAuthor().getName() }}
    • +
    • To: {{ minimailMessage.getTarget().getName() }}
    • + +
    +
    {{ minimailMessage.getFormattedMessage() }}
    +
    +
    +
    + {% if minimailMessage.getConversationId() > 0 %} + + {% endif %} + {% if (minimailLabel == "inbox") or (minimailLabel == "sent") %} + Delete + Reply + {% endif %} + {% if minimailLabel == "trash" %} + Undelete + Delete + {% endif %} +
    +
    +
    +
    +
    + Cancel + Preview + + Send +
    +
    +
    \ No newline at end of file diff --git a/tools/www-tpl/default/habblet/minimail/minimail_messages.tpl b/tools/www-tpl/default/habblet/minimail/minimail_messages.tpl new file mode 100644 index 0000000..1b1c318 --- /dev/null +++ b/tools/www-tpl/default/habblet/minimail/minimail_messages.tpl @@ -0,0 +1,88 @@ + {% if minimailClient == false %}Compose{% endif %} +
    + + +
    +
    +
    + +
    + +
    + {% if minimailLabel == "conversation" %} +
    + You are reading a conversation. Click the tabs above to go back to your folders. +
    + {% endif %} + {% if minimailLabel == "trash" %} + {% if minimailMessages|length > 0 %} +
    Messages in this folder that are older than 30 days are deleted automatically. Empty trash
    + {% endif %} + {% endif %} + + {% if minimailMessages|length > 0 %} + {% for minimailMessage in minimailMessages %} +
    +
    + + + {{ minimailMessage.getDate() }} + + + {% if minimailLabel == "sent" %} + To: {{ minimailMessage.getTarget().getName() }} + {% elseif minimailLabel == "inbox" %} + {{ minimailMessage.getAuthor().getName() }} + {% endif %} + + “{{ minimailMessage.getFormattedSubject() }}” +
    + +
    + {% endfor %} + {% endif %} + + +
    \ No newline at end of file diff --git a/tools/www-tpl/default/habblet/myTagList.tpl b/tools/www-tpl/default/habblet/myTagList.tpl new file mode 100644 index 0000000..a71271b --- /dev/null +++ b/tools/www-tpl/default/habblet/myTagList.tpl @@ -0,0 +1,32 @@ +{% autoescape 'html' %} +
    +
      + +{% if tags|length > 0 %} + {% for tag in tags %} +
    • {{ tag }} +
    • + {% endfor %} +{% endif %} +
    + +
    +
    + Add tag + + {{ tagRandomQuestion }} +
    +
    +
    + +
    + + +{% endautoescape %} diff --git a/tools/www-tpl/default/habblet/news_sidebar.tpl b/tools/www-tpl/default/habblet/news_sidebar.tpl new file mode 100644 index 0000000..2036750 --- /dev/null +++ b/tools/www-tpl/default/habblet/news_sidebar.tpl @@ -0,0 +1,20 @@ +{% if articles|length > 0 %} +

    {{ header }}

    + +{% endif %} \ No newline at end of file diff --git a/tools/www-tpl/default/habblet/nextgift.tpl b/tools/www-tpl/default/habblet/nextgift.tpl new file mode 100644 index 0000000..968c9b4 --- /dev/null +++ b/tools/www-tpl/default/habblet/nextgift.tpl @@ -0,0 +1,55 @@ + {% if newbieNextGift < 3 %} +
    + {% if newbieNextGift == 1 %} + My first starter stool + {% elseif newbieNextGift == 2 %} + My first plant + {% endif %} +
    +
    +

    + {% if newbieNextGift == 1 %} + Your next piece of free furniture will be STARTER STOOL + {% elseif newbieNextGift == 2 %} + Your next piece of free furniture will be LUCKY BAMBOO PLANT + {% endif %} +

    +

    + Time left: + +

    +

    + Go to your room >> +

    +
    +
    + + {% else %} +

    + How do you get more furniture into Your room? +

    +

    + You could buy a set of furniture for just 3 credits including a lamp, mat, and two armchairs. How do you do that? +

    +
      +
    • 1. Buy some credits from the credits section
    • +
    • 2. Open the catalogue from the Hotel toolbar (Chair icon)
    • +
    • 3. Open the deals section
    • +
    • 4. Pick up the furni set You want
    • +
    • 5. Thank You for shopping!
    • +
    +

    + +

    +

    + Go to your room >> +

    + + {% endif %} \ No newline at end of file diff --git a/tools/www-tpl/default/habblet/personalhighscores.tpl b/tools/www-tpl/default/habblet/personalhighscores.tpl new file mode 100644 index 0000000..fc0ed15 --- /dev/null +++ b/tools/www-tpl/default/habblet/personalhighscores.tpl @@ -0,0 +1,59 @@ +
    + + + + + + + {% if scoreEntries|length > 0 %} + + + + {% endif %} + + + +{% if scoreEntries|length == 0 %} +
    +There are no scores recorded for this game! +
    +{% else %} +{% set num = 1 %} +{% for scoreEntry in scoreEntries %} + {% if num % 2 == 0 %} + + {% else %} + + {% endif %} + + + + + + +{% set num = num + 1 %} +{% endfor %} +{% endif %} + +
    Score
    {{ scoreEntry.getPosition() }}.{{ scoreEntry.getPlayerName() }}{{ scoreEntry.getScore() }}
    + +
    + {% if hasNextPage %} + + {% endif %} + + {% if pageNumber > 1 %} + + {% endif %} +
    + + + + +
    \ No newline at end of file diff --git a/tools/www-tpl/default/habblet/redeemvoucher.tpl b/tools/www-tpl/default/habblet/redeemvoucher.tpl new file mode 100644 index 0000000..1744fd5 --- /dev/null +++ b/tools/www-tpl/default/habblet/redeemvoucher.tpl @@ -0,0 +1,39 @@ +
      + +
    • +
      You Currently Have:
      + {{ playerDetails.credits }} Coins + +
    • + +
    • +
      + +
      Enter voucher code (without spaces):
      + + Enter +
      +
    • +
    +
      +
      + {% if voucherResult == 'error' %} +
      +
      + Your redeem code could not be found. Please try again. +
      +
      + {% elseif voucherResult == 'too_new' %} +
      +
      + Sorry, your account is too new and cannot redeeem this voucher. +
      +
      + {% else %} +
      +
      + Voucher redemption success +
      +
      + {% endif %} +
      \ No newline at end of file diff --git a/tools/www-tpl/default/habblet/roomselectionConfirm.tpl b/tools/www-tpl/default/habblet/roomselectionConfirm.tpl new file mode 100644 index 0000000..8b01558 --- /dev/null +++ b/tools/www-tpl/default/habblet/roomselectionConfirm.tpl @@ -0,0 +1,6 @@ +

      Are you sure you want to close the room selector? If you close it, you won't get your free gifts!

      +

      + Cancel + Yes, hide it! +

      +
      \ No newline at end of file diff --git a/tools/www-tpl/default/habblet/showMoreRooms.tpl b/tools/www-tpl/default/habblet/showMoreRooms.tpl new file mode 100644 index 0000000..edf010e --- /dev/null +++ b/tools/www-tpl/default/habblet/showMoreRooms.tpl @@ -0,0 +1,88 @@ + + + + +
      +
        + +{% set num = 0 %} +{% for room in highestRatedRooms %} + {% if num % 2 == 0 %} +
      • + {% else %} +
      • + {% endif %} + + {% set occupancyLevel = 0 %} + {% if room.getData().getVisitorsNow() > 0 %} + + {% set percentage = ((room.getData().getVisitorsNow() * 100) / room.getData().getVisitorsMax()) %} + + {% if (percentage >= 99) %} + {% set occupancyLevel = 5 %} + {% elseif (percentage > 65) %} + {% set occupancyLevel = 4 %} + {% elseif (percentage > 32) %} + {% set occupancyLevel = 3 %} + {% elseif (percentage > 0) %} + {% set occupancyLevel = 2 %} + {% endif %} + + {% endif %} + + + Enter {{ site.siteName }} Hotel + {{ room.getData().getName() }} + {{ room.getData().getDescription() }} + Owner: {{ room.getData().getOwnerName() }} + +
      • +{% set num = num + 1 %} +{% endfor %} +
      + + +
      + diff --git a/tools/www-tpl/default/habblet/tagFightResult.tpl b/tools/www-tpl/default/habblet/tagFightResult.tpl new file mode 100644 index 0000000..28df6e8 --- /dev/null +++ b/tools/www-tpl/default/habblet/tagFightResult.tpl @@ -0,0 +1,15 @@ +{% autoescape 'html' %} +
      + {{ result }}
      + {{ resultTag1 }} +({{ resultHits1 }}) hits +
      + {{ resultTag2 }} +({{ resultHits2 }}) hits +
      +
      + + New Fight + +
      +{% endautoescape %} \ No newline at end of file diff --git a/tools/www-tpl/default/habblet/tagList.tpl b/tools/www-tpl/default/habblet/tagList.tpl new file mode 100644 index 0000000..f86cd27 --- /dev/null +++ b/tools/www-tpl/default/habblet/tagList.tpl @@ -0,0 +1,21 @@ +{% autoescape 'html' %} +
      +{% if tagCloud|length > 0 %} +
        + {% for kvp in tagCloud %} + {% set tag = kvp.getKey() %} + {% set size = kvp.getValue() %} +
      • {{ tag }} + {% endfor %} +
      +{% else %} +No tags to display. +{% endif %} +
      +
      +
      +{% endautoescape %} + diff --git a/tools/www-tpl/default/habblet/tagMatch.tpl b/tools/www-tpl/default/habblet/tagMatch.tpl new file mode 100644 index 0000000..ef6ef62 --- /dev/null +++ b/tools/www-tpl/default/habblet/tagMatch.tpl @@ -0,0 +1,9 @@ +{% autoescape 'html' %} +{% if errorMsg != "" %} +
      + {{ errorMsg }} +
      +{% else %} +Coming soon. +{% endif %} +{% endautoescape %} diff --git a/tools/www-tpl/default/home.tpl b/tools/www-tpl/default/home.tpl new file mode 100644 index 0000000..fcf79b2 --- /dev/null +++ b/tools/www-tpl/default/home.tpl @@ -0,0 +1,680 @@ + + + + + + {{ site.siteName }}: {{ user.getName() }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{% if editMode %} + +{% endif %} + + + + + + + + + + + + + + +{% if session.loggedIn == false %} + +{% else %} + {% if editMode %} + + {% else %} + + {% endif %} +{% endif %} +{% include "base/header.tpl" %} + +
      + +{% if session.loggedIn %} +{% if user.id == playerDetails.id %} + +{% else %} + +{% endif %} +{% endif %} + +
      +
      +
      +
      + {% if session.loggedIn %} + {% if user.id == playerDetails.id %} + {% if editMode == false %} + Edit + {% endif %} + {% endif %} + {% endif %} +
      +
      + +

      {{ user.getName() }}

      +
        +
        +
        + +{% if editMode %} + + + + +{% endif %} + + + {% if user.getName() == "Abigail.Ryan" %} +
        +
        + + + + +
        +
        +
        +

        +
        +
        +
        +
        +

        I am the malady, I am the pain...

        + +
        +
        +
        +
        + + + + +
        +
        +
        +

        +
        +
        +
        +
        +

        ...I am the death that never dies....

        + +
        +
        +
        +
        + + + + +
        +
        +
        +

        +
        +
        +
        +
        +

        ...on Halloween day I shall come to play...

        + +
        +
        +
        +
        + + + + +
        +
        +
        +

        +
        +
        +
        +
        +

        ...my life was lost in the Virus rain...

        + +
        +
        +
        +
        + + + + +
        +
        +
        +

        +
        +
        +
        +
        +

        ...I am the poor one who cries...

        + +
        +
        +
        +
        + + + + +
        +
        +
        +

        +
        +
        +
        +
        +
        +
        + +
        + +
        +
        +
        +
        +
        +
        +
        +
        +
        +
        +
        +
        +
        + +
        +
        +
        + +
        +
        +
        +
        + {% else %} +
        + {% if editMode %} +
        + {% else %} +
        + {% endif %} + + {% for sticker in stickers %} + {% if sticker.getProduct().getData() == "groupinfowidget" %} + {% include "homes/widget/group_info_widget.tpl" %} + {% elseif sticker.getProduct().getData() == "guestbookwidget" %} + {% include "homes/widget/guestbook_widget.tpl" %} + {% elseif sticker.getProduct().getData() == "stickienote" %} + {% include "homes/widget/note.tpl" %} + {% elseif sticker.getProduct().getData() == "memberwidget" %} + {% include "homes/widget/member_widget.tpl" %} + {% elseif sticker.getProduct().getData() == "traxplayerwidget" %} + {% include "homes/widget/trax_player_widget.tpl" %} + {% elseif sticker.getProduct().getData() == "profilewidget" %} + {% include "homes/widget/profile_widget.tpl" %} + {% elseif sticker.getProduct().getData() == "roomswidget" %} + {% include "homes/widget/rooms_widget.tpl" %} + {% elseif sticker.getProduct().getData() == "highscoreswidget" %} + {% include "homes/widget/highscores_widget.tpl" %} + {% elseif sticker.getProduct().getData() == "badgeswidget" %} + {% include "homes/widget/badges_widget.tpl" %} + {% elseif sticker.getProduct().getData() == "ratingwidget" %} + {% include "homes/widget/rating_widget.tpl" %} + {% elseif sticker.getProduct().getData() == "friendswidget" %} + {% include "homes/widget/friends_widget.tpl" %} + {% elseif sticker.getProduct().getData() == "groupswidget" %} + {% include "homes/widget/groups_widget.tpl" %} + {% else %} + {% include "homes/widget/sticker.tpl" %} + {% endif %} + {% endfor %} + +
        + {% if editMode %} +
        + {% else %} +
        + {% endif %} +
        +
        + {% if (user.hasClubSubscription() == false) %} + {% if (editMode == true) %} + hc habbohome banner holo + {% else %} + hc habbohome banner holo + {% endif %} + {% endif %} +
        +
        +
        +
        + {% endif %} +
        +
        + + + + +
        +
        +
        +{% if editMode %} +
      {% endif %} +{% include "base/footer.tpl" %} + +{% if editMode %} + + + + + +{% else %} + +
      +

      Edit Guestbook entry

      + + X +
      + +
      +
      +

      + Note: the message length must not exceed 200 characters +

      +
      + + + +
      +
      + + Habbos Rooms Groups
      + + Find +
      + + + +
      +
      + +
      + Cancel + Preview +
      + +
      +
      +
       
      +
      +
      +
      +

      Delete entry

      + + X +
      +
      + + +

      Are you sure you want to delete this entry?

      +

      + Cancel + Delete +

      +
      +
      +
      + +
      + + + + X +
      +

      +
      +
      + +
      + + + + X +
      + +
      + +
      + +
      +
      + + +{% endif %} + + + + + + + + \ No newline at end of file diff --git a/tools/www-tpl/default/homes/editor/noteeditor.tpl b/tools/www-tpl/default/homes/editor/noteeditor.tpl new file mode 100644 index 0000000..d34bcb6 --- /dev/null +++ b/tools/www-tpl/default/homes/editor/noteeditor.tpl @@ -0,0 +1,63 @@ +
      + + + +
      500
      + +

      + +

      + +

      Note! The text is not editable after you place the note to your page.

      + +
      + + +
      +
      + + Habbos Rooms Groups
      + + Find +
      + + +
      +
      + +
      + +

      +Cancel +Continue +

      + +
      \ No newline at end of file diff --git a/tools/www-tpl/default/homes/editor/preview.tpl b/tools/www-tpl/default/homes/editor/preview.tpl new file mode 100644 index 0000000..9f11bf2 --- /dev/null +++ b/tools/www-tpl/default/homes/editor/preview.tpl @@ -0,0 +1,32 @@ +
      + +
      +
      +
      +

      + + +

      +
      +
      +
      +
      +
      {{ noteText }}
      + +
      +
      +
      +
      +
      + +

      Note! The text is not editable after you place the note to your page.

      + +

      +Go back to edit +Add note to page +

      + +
      \ No newline at end of file diff --git a/tools/www-tpl/default/homes/editor/search.tpl b/tools/www-tpl/default/homes/editor/search.tpl new file mode 100644 index 0000000..27c31db --- /dev/null +++ b/tools/www-tpl/default/homes/editor/search.tpl @@ -0,0 +1,14 @@ +
        +
      • Click on link below to insert it into the document
      • + + {% for kvp in querySearch %} + {% set key = kvp.getKey() %} + {% set value = kvp.getValue() %} + +
      • {{ key }}
      • + + {% endfor %} + + +
      \ No newline at end of file diff --git a/tools/www-tpl/default/homes/inventory/inventory.tpl b/tools/www-tpl/default/homes/inventory/inventory.tpl new file mode 100644 index 0000000..7173182 --- /dev/null +++ b/tools/www-tpl/default/homes/inventory/inventory.tpl @@ -0,0 +1,168 @@ +
      +
      +

      Categories:

      +
      +
        +
      • +
        Stickers
        +
          + {% set num = 0 %} + {% for category in stickerCategories %} + {% if num == 0 %}
        • {% else %}
        • {% endif %} +
          {{ category.getName() }}
          +
        • + + {% set num = num + 1 %} + {% endfor %} + +
        +
      • +
      • +
        Backgrounds
        +
          + + {% for category in backgroundCategories %} +
        • +
          {{ category.getName() }}
          +
        • + {% endfor %} + +
        +
      • +
      • +
        Notes
        +
          + +
        • +
          29
          +
        • + +
        +
      • +
      + +
      +
      + +
      +
      +

      Select an item by clicking it

      +
        +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      +
      +
      +
      +
      +
      +
      + +
      +

      Categories:

      +
      +
        +
      • +
        Stickers
        +
      • +
      • +
        Backgrounds
        +
      • +
      • +
        Widgets
        +
      • +
      • +
        Notes
        +
      • +
      + +
      +
      + +
      +
      +

      Select an item by clicking it

      +
      + + {% if widgets|length == 0 %} +
      +
      +
      + +

      Your inventory for this category is completely empty!

      +

      To be able to purchase stickers, backgrounds and notes, click on Web Store tab and select a category and a product, then click Purchase.

      + +
      +
      +
      +
      +
      + +
      +
      +
      +
      +{% endif%} + +
        + +{% for widget in widgets %} +
      • +
        +
        + {% if widget.getAmount() > 1 %} +
        x{{ widget.getAmount() }}
        + {% endif %}
        +
        +
      • +{% endfor %} + +{% for box in emptyBoxes %} +
      • +{% endfor %} + +
      +
      +
      + +
      +
      +
      +

       

      + +
      + + {% if widgets.length != 0 %} +
      +
      + Place +
      +
      +{% endif %} + +
      +
      +
      + +
      + +
      +
      \ No newline at end of file diff --git a/tools/www-tpl/default/homes/inventory/inventory_items.tpl b/tools/www-tpl/default/homes/inventory/inventory_items.tpl new file mode 100644 index 0000000..202b358 --- /dev/null +++ b/tools/www-tpl/default/homes/inventory/inventory_items.tpl @@ -0,0 +1,47 @@ +{% if widgets.length == 0 %} +
      +
      +
      + +

      Your inventory for this category is completely empty!

      +

      To be able to purchase stickers, backgrounds and notes, click on Web Store tab and select a category and a product, then click Purchase.

      + +
      +
      +
      +
      +
      + +
      +
      +
      +
      +{% endif%} + +
        + +{% for widget in widgets %} +
      • +
        +
        + {% if widget.getAmount() > 1 %} +
        x{{ widget.getAmount() }}
        + {% endif %} +
        +
        + {% if widgetMode %} +
        +

        {{ widget.getProduct().getName() }}

        +

        {{ widget.getProduct().getDescription() }}

        +
        + {% endif %} +
      • +{% endfor %} + +{% if emptyBoxes|length > 0 %} +{% for box in emptyBoxes %} +
      • +{% endfor %} +{% endif %} + +
      diff --git a/tools/www-tpl/default/homes/inventory/inventory_preview.tpl b/tools/www-tpl/default/homes/inventory/inventory_preview.tpl new file mode 100644 index 0000000..adf3c44 --- /dev/null +++ b/tools/www-tpl/default/homes/inventory/inventory_preview.tpl @@ -0,0 +1,9 @@ +

       

      + +
      + +
      +
      + Place +
      +
      \ No newline at end of file diff --git a/tools/www-tpl/default/homes/store/background_warning.tpl b/tools/www-tpl/default/homes/store/background_warning.tpl new file mode 100644 index 0000000..cd33261 --- /dev/null +++ b/tools/www-tpl/default/homes/store/background_warning.tpl @@ -0,0 +1,8 @@ +

      +The image you selected will stay as the page background until you select another image or close the web store. If you want to keep it as your background image, you have to purchase it and select it in your inventory.

      + +

      +Ok +

      + +
      \ No newline at end of file diff --git a/tools/www-tpl/default/homes/store/items.tpl b/tools/www-tpl/default/homes/store/items.tpl new file mode 100644 index 0000000..66f9529 --- /dev/null +++ b/tools/www-tpl/default/homes/store/items.tpl @@ -0,0 +1,18 @@ +
        + +{% for product in products %} +
      • +
        +
        + {% if product.getAmount() > 1 %}
        x{{ product.getAmount() }}
        {% endif %} +
        +
        +
      • +{% endfor %} + +{% for i in [1..emptyProducts] %} +
      • +{% endfor %} + + +
      \ No newline at end of file diff --git a/tools/www-tpl/default/homes/store/main.tpl b/tools/www-tpl/default/homes/store/main.tpl new file mode 100644 index 0000000..ce7c29f --- /dev/null +++ b/tools/www-tpl/default/homes/store/main.tpl @@ -0,0 +1,167 @@ +
      +
      +

      Categories:

      +
      +
        +
      • +
        Stickers
        +
          + {% set num = 0 %} + {% for category in stickerCategories %} + {% if num == 0 %}
        • {% else %}
        • {% endif %} +
          {{ category.getName() }}
          +
        • + + {% set num = num + 1 %} + {% endfor %} + +
        +
      • +
      • +
        Backgrounds
        +
          + + {% for category in backgroundCategories %} +
        • +
          {{ category.getName() }}
          +
        • + {% endfor %} + +
        +
      • +
      • +
        Notes
        +
          + +
        • +
          29
          +
        • + +
        +
      • +
      + +
      +
      + + +
      +
      +

      Select an item by clicking it

      +
      +
        + +{% for product in products %} +
      • +
        +
        + {% if product.getAmount() > 1 %}
        x{{ product.getAmount() }}
        {% endif %} +
        +
        +
      • +{% endfor %} + +{% for box in emptyBoxes %} +
      • +{% endfor %} + + +
      +
      +
      +
      +
      + +

      + +
      + +
      +Price:
      + {% if product.getPrice() > 1 %}{{ product.getPrice() }} credits{% else %}{{ product.getPrice() }} credit{% endif %} + +
      + +
      +{% if playerDetails.credits > 1 %}You have:
      {{ playerDetails.credits }} credits
      {% else %}You have:
      {{ playerDetails.credits }} credit
      {% endif %} +Get Credits +
      + +
      +
      + Purchase +
      +
      + + +
      +
      +
      + +
      +

      Categories:

      +
      +
        +
      • +
        Stickers
        +
      • +
      • +
        Backgrounds
        +
      • +
      • +
        Widgets
        +
      • +
      • +
        Notes
        +
      • +
      + +
      +
      + +
      +
      +

      Select an item by clicking it

      +
        +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      +
      +
      +
      +

       

      + +
      + +
      +
      + +
      +
      + +
      +
      +
      + +
      + +
      +
      diff --git a/tools/www-tpl/default/homes/store/preview.tpl b/tools/www-tpl/default/homes/store/preview.tpl new file mode 100644 index 0000000..d1efd1f --- /dev/null +++ b/tools/www-tpl/default/homes/store/preview.tpl @@ -0,0 +1,22 @@ +

      + +
      + +
      +Price:
      + {% if product.getPrice() > 1 %}{{ product.getPrice() }} credits{% else %}{{ product.getPrice() }} credit{% endif %} + +
      + +
      +{% if playerDetails.credits > 1 %}You have:
      {{ playerDetails.credits }} credits
      {% else %}You have:
      {{ playerDetails.credits }} credit
      {% endif %} +Get Credits +
      + +
      +
      + Purchase +
      +
      + + \ No newline at end of file diff --git a/tools/www-tpl/default/homes/store/purchase_confirm.tpl b/tools/www-tpl/default/homes/store/purchase_confirm.tpl new file mode 100644 index 0000000..5ce98d3 --- /dev/null +++ b/tools/www-tpl/default/homes/store/purchase_confirm.tpl @@ -0,0 +1,22 @@ +
      +
      + +
      +
      + +{% if noCredits %} +

      +You do not have enough credits to purchase this

      + +
      +{% else %} +

      +Are you sure you want to purchase this product?

      + +

      +Cancel +Continue +

      + +
      +{% endif %} \ No newline at end of file diff --git a/tools/www-tpl/default/homes/widget/badges_widget.tpl b/tools/www-tpl/default/homes/widget/badges_widget.tpl new file mode 100644 index 0000000..694f19f --- /dev/null +++ b/tools/www-tpl/default/homes/widget/badges_widget.tpl @@ -0,0 +1,30 @@ +{% set badgeList = sticker.getFirstBadges() %} +{% set pages = sticker.getBadgeList().size() %} + +{% set currentPage = 1 %} +{% set showLast = false %} + +{% if pages > 1 %} + {% set showLast = true %} +{% endif %} + +
      +
      +
      +

      +{% if editMode %} + + +{% endif %} +  Badges & Achievements 

      +
      +
      +
      +
      + {% include "homes/widget/habblet/badgepaging.tpl" %} +
      +
      +
      +
      diff --git a/tools/www-tpl/default/homes/widget/friends_widget.tpl b/tools/www-tpl/default/homes/widget/friends_widget.tpl new file mode 100644 index 0000000..b573d45 --- /dev/null +++ b/tools/www-tpl/default/homes/widget/friends_widget.tpl @@ -0,0 +1,31 @@ +{% set friendsList = sticker.getFirstFriendsList() %} +{% set friends = sticker.getFriendsAmount() %} +{% set pages = sticker.getFriendsPages() %} +{% set currentPage = 1 %} + +
      +
      +
      +

      +{% if editMode %} + + +{% endif %} +  My Friends ({{ friends }}) 

      +
      +
      +
      +
      + +
      + {% include "homes/widget/habblet/friendsearchpaging.tpl" %} +
      +
      +
      +
      diff --git a/tools/www-tpl/default/homes/widget/group_info_widget.tpl b/tools/www-tpl/default/homes/widget/group_info_widget.tpl new file mode 100644 index 0000000..79f8dbe --- /dev/null +++ b/tools/www-tpl/default/homes/widget/group_info_widget.tpl @@ -0,0 +1,73 @@ +
      +
      +
      +

      + + {% if editMode %} + + + {% endif %} + + Group info 

      +
      +
      +
      +
      + {% autoescape 'html' %} +
      + +

      {{ group.getName() }}

      + +

      Group created: {{ group.getCreatedDate() }}

      +

      {{ sticker.getMembersAmount() }} members

      +{% if group.getRoomId() > 0 %}

      {% autoescape 'html' %}{{ room.getData().getName() }}{% endautoescape %}

      {% endif %} +
      {{ group.getDescription() }}
      + + +
      +
      + {% include "../../groups/habblet/listgrouptags.tpl" %} +
      + {% if session.loggedIn %} +{% if group.getOwnerId() == playerDetails.getId() %} +
      +
      +
      +
      + The limit is 20 tags! + Invalid tag. +
      +
      +
      +
      +
      +
      +
      +
      + Add tag +
      {% endif %}{% endif %} +
      + + + + + + +
      + {% endautoescape %} +
      +
      +
      +
      \ No newline at end of file diff --git a/tools/www-tpl/default/homes/widget/groups_widget.tpl b/tools/www-tpl/default/homes/widget/groups_widget.tpl new file mode 100644 index 0000000..c2332d4 --- /dev/null +++ b/tools/www-tpl/default/homes/widget/groups_widget.tpl @@ -0,0 +1,69 @@ +{% set groupsList = sticker.getOwnerGroups() %} + +
      +
      +
      +

      +{% if editMode %} + + +{% endif %} +  My Groups ({{ groupsList|length }}) 

      +
      +
      +
      +
      + + {% if groupsList|length == 0 %} +
      +You are not a member of any Groups
      + {% else %} +
      +
        + +{% for group in groupsList %} +
      • +
        +
        +

        + {% autoescape 'html' %} + {{ group.getName() }} +

        +

        + Group created:
        + {{ group.getCreatedDate() }} + {% set member = group.getMember(user.id) %} + + {% if member.isFavourite(group.id) %} + Favorite + {% endif %} + {% if member.getMemberRank().getRankId() == 3 %} + Owner + {% endif %} + {% if member.getMemberRank().getRankId() == 2 %} + Admin + {% endif %} +

        +
        + {% endautoescape %} +
      • +{% endfor %} + +
      + {% endif %} +

      +
      + +
      +
      +
      +
      +
      + + diff --git a/tools/www-tpl/default/homes/widget/guestbook/add.tpl b/tools/www-tpl/default/homes/widget/guestbook/add.tpl new file mode 100644 index 0000000..27aa5ec --- /dev/null +++ b/tools/www-tpl/default/homes/widget/guestbook/add.tpl @@ -0,0 +1,29 @@ +{% if session.loggedIn %} +{% if hasDeletePermission == false %} + {% set hasDeletePermission = entry.getUser().getId() == playerDetails.id %} +{% endif %} +{% endif %} + +
    • +
      + Alex +
      + {% if hasDeletePermission %} +
      + +
      +
      + {% endif %} +
      + {% if entry.getUser().isOnline() and entry.getUser().isProfileVisible() %} +
      + {% else %} + +

      {{ entry.getMessage() }}

      +
      +
       
      + +
    • \ No newline at end of file diff --git a/tools/www-tpl/default/homes/widget/guestbook/preview.tpl b/tools/www-tpl/default/homes/widget/guestbook/preview.tpl new file mode 100644 index 0000000..5de0e27 --- /dev/null +++ b/tools/www-tpl/default/homes/widget/guestbook/preview.tpl @@ -0,0 +1,20 @@ + + + \ No newline at end of file diff --git a/tools/www-tpl/default/homes/widget/guestbook_widget.tpl b/tools/www-tpl/default/homes/widget/guestbook_widget.tpl new file mode 100644 index 0000000..f5f3c57 --- /dev/null +++ b/tools/www-tpl/default/homes/widget/guestbook_widget.tpl @@ -0,0 +1,59 @@ +{% set entries = sticker.getGuestbookEntries() %} +{% set hasDeletePermission = false %} + +{% if session.loggedIn %} +{% set hasDeletePermission = sticker.canDeleteEntries(playerDetails.id) %} +{% endif %} + +
      +
      +
      +

      + + {% if editMode %} + + + {% endif %} + +  My Guestbook({{ entries|length }}) myhabbo.guestbook.unknown.private 

      +
      +
      +
      +
      +
      +
        + + {% if entries|length == 0 %} +
        This guestbook has no entries.
        + {% else %} + {% for entry in entries %} + {% include "homes/widget/guestbook/add.tpl" with {"entry": entry} %} + {% endfor %} + {% endif %} +
      +{% if session.loggedIn and sticker.isPostingAllowed(playerDetails.id) %} + {% if editMode == false %} + +{% endif %} +{% endif %} + + +
      +
      +
      +
      +
      \ No newline at end of file diff --git a/tools/www-tpl/default/homes/widget/habblet/avatarinfo.tpl b/tools/www-tpl/default/homes/widget/habblet/avatarinfo.tpl new file mode 100644 index 0000000..eb807c8 --- /dev/null +++ b/tools/www-tpl/default/homes/widget/habblet/avatarinfo.tpl @@ -0,0 +1,21 @@ + \ No newline at end of file diff --git a/tools/www-tpl/default/homes/widget/habblet/badgepaging.tpl b/tools/www-tpl/default/homes/widget/habblet/badgepaging.tpl new file mode 100644 index 0000000..6f0c41f --- /dev/null +++ b/tools/www-tpl/default/homes/widget/habblet/badgepaging.tpl @@ -0,0 +1,34 @@ +
      +
        + {% for badge in badgeList %} +
      • + {% endfor %} +
      + + +
      + {{ badgeList|length }} - {{ currentPage }} / {{ pages }}
      + + {% if currentPage != 1 %} + First | + << | + {% else %} + First | << | + {% endif %} + + {% if showLast %} + >> | + Last + {% else %} + >> | Last + {% endif %} + + + +
      +
      +
      diff --git a/tools/www-tpl/default/homes/widget/habblet/friendsearchpaging.tpl b/tools/www-tpl/default/homes/widget/habblet/friendsearchpaging.tpl new file mode 100644 index 0000000..c6e9c20 --- /dev/null +++ b/tools/www-tpl/default/homes/widget/habblet/friendsearchpaging.tpl @@ -0,0 +1,81 @@ +{% set firstPage = -1 %} +{% set previousPage = -1 %} +{% set nextPage = -1 %} +{% set lastPage = -1 %} + +{% if currentPage >= 2 %} + {% set firstPage = 1 %} +{% endif %} + +{% if currentPage > 1 %} + {% set previousPage = 1 %} +{% endif %} + +{% if pages >= (currentPage + 1) %} + {% set nextPage = 1 %} +{% endif %} + +{% if pages >= (currentPage + 2) %} + {% set lastPage = 1 %} +{% endif %} + +
      + +
      +
        + +{% if friends > 0 %} + {% for friend in friendsList %} +
      • +
        +

        {{ friend.getUsername() }}

        +

        {{ friend.getFormatLastOnline("dd-MM-yyyy") }}

        +

        + +

      • + {% endfor %} +{% else %} +You don't have any friends :( +{% endif %} +
      + +
      + +
      +
      +
      + +
      + +
      + {% if friends > 0 %} + {{ currentPage }} - {{ friendsList|length }} / {{ pages }} +
      + + {% if (firstPage != -1) or (previousPage != -1) %} + First | + << | + {% else %} + First | << | + {% endif %} + + {% if (lastPage != -1) or (nextPage != -1) %} + >> | + Last + {% else %} + >> | Last + {% endif %} + {% else %} + 0 - 0 + {% endif %} + + +
      + + +
      +
      \ No newline at end of file diff --git a/tools/www-tpl/default/homes/widget/habblet/groupinfo.tpl b/tools/www-tpl/default/homes/widget/habblet/groupinfo.tpl new file mode 100644 index 0000000..2417495 --- /dev/null +++ b/tools/www-tpl/default/homes/widget/habblet/groupinfo.tpl @@ -0,0 +1,21 @@ +
      +
      + +
      +

      + +{% autoescape 'html' %} +

      {{ group.getName() }}

      +

      Group created:
      +{{ group.getCreatedDate() }} +

      +
      {{ group.getDescription() }}
      + +
      +{% endautoescape %} \ No newline at end of file diff --git a/tools/www-tpl/default/homes/widget/habblet/membersearchpaging.tpl b/tools/www-tpl/default/homes/widget/habblet/membersearchpaging.tpl new file mode 100644 index 0000000..f6cb520 --- /dev/null +++ b/tools/www-tpl/default/homes/widget/habblet/membersearchpaging.tpl @@ -0,0 +1,85 @@ +{% set firstPage = -1 %} +{% set previousPage = -1 %} +{% set nextPage = -1 %} +{% set lastPage = -1 %} + +{% if currentPage >= 2 %} + {% set firstPage = 1 %} +{% endif %} + +{% if currentPage > 1 %} + {% set previousPage = 1 %} +{% endif %} + +{% if pages >= (currentPage + 1) %} + {% set nextPage = 1 %} +{% endif %} + +{% if pages >= (currentPage + 2) %} + {% set lastPage = 1 %} +{% endif %} + +
      +
      +
        + {% if members > 0 %} + {% for member in membersList %} +
      • +
        +

        {{ member.getUser().getName() }}

        +

        {{ member.getUser().getCreatedAt() }}

        + + {% if member.getMemberRank().getRankId() == 3 %} +

        + {% endif %} + {% if member.getMemberRank().getRankId() == 2 %} +

        + {% endif %} + {% if member.isFavourite(group.id) %} + + {% endif %} +

        +
      • + {% endfor %} + {% else %} + You don't have any members :( + {% endif %} +
      +
      +
      + +
      +
      +
      +
      +
      + {% if members > 0 %} + {{ currentPage }} - {{ membersList|length }} / {{ pages }} +
      + + {% if (firstPage != -1) or (previousPage != -1) %} + First | + << | + {% else %} + First | << | + {% endif %} + + {% if (lastPage != -1) or (nextPage != -1) %} + >> | + Last + {% else %} + >> | Last + {% endif %} + {% else %} + 0 - 0 + {% endif %} + + +
      + + +
      \ No newline at end of file diff --git a/tools/www-tpl/default/homes/widget/habblet/rate.tpl b/tools/www-tpl/default/homes/widget/habblet/rate.tpl new file mode 100644 index 0000000..4f6683c --- /dev/null +++ b/tools/www-tpl/default/homes/widget/habblet/rate.tpl @@ -0,0 +1,20 @@ +{% set average = sticker.getAverageRating() %} +{% set px = sticker.getRatingPixels() %} + +
      + Average rating: {{ average }}
      +
      +
        +
      • + +
      +
      + {{ sticker.getVoteCount() }} votes total +
      + ({{ sticker.getHighVoteCount() }} users voted 4 or better) +
      \ No newline at end of file diff --git a/tools/www-tpl/default/homes/widget/habblet/taglist.tpl b/tools/www-tpl/default/homes/widget/habblet/taglist.tpl new file mode 100644 index 0000000..eb47e42 --- /dev/null +++ b/tools/www-tpl/default/homes/widget/habblet/taglist.tpl @@ -0,0 +1,28 @@ +
      +{% if (tags|length) == 0 %} +No tags. +{% else %} + {% for tag in tags %} + + {% autoescape 'html' %} + {{ tag }} + {% endautoescape %} + {% if (session.loggedIn) and (user.id == playerDetails.id) %} + + {% else %} + + {% endif %} + + {% endfor %} + +{% endif %} +
      + + \ No newline at end of file diff --git a/tools/www-tpl/default/homes/widget/habblet/trax_song.tpl b/tools/www-tpl/default/homes/widget/habblet/trax_song.tpl new file mode 100644 index 0000000..06b6bc3 --- /dev/null +++ b/tools/www-tpl/default/homes/widget/habblet/trax_song.tpl @@ -0,0 +1,10 @@ +{% if sticker.hasSong() %} +{% set song = sticker.getSong() %} + +{% else %} +
      +{% endif %} \ No newline at end of file diff --git a/tools/www-tpl/default/homes/widget/highscores_widget.tpl b/tools/www-tpl/default/homes/widget/highscores_widget.tpl new file mode 100644 index 0000000..604ab16 --- /dev/null +++ b/tools/www-tpl/default/homes/widget/highscores_widget.tpl @@ -0,0 +1,25 @@ +
      +
      +
      +

      +{% if editMode %} + + +{% endif %} +  HIGH SCORES 

      +
      +
      +
      +
      + + + + +
      You do not have any high scores.
      +
      +
      +
      +
      +
      \ No newline at end of file diff --git a/tools/www-tpl/default/homes/widget/member_widget.tpl b/tools/www-tpl/default/homes/widget/member_widget.tpl new file mode 100644 index 0000000..0600438 --- /dev/null +++ b/tools/www-tpl/default/homes/widget/member_widget.tpl @@ -0,0 +1,31 @@ +{% set membersList = sticker.getFirstMembersList() %} +{% set members = sticker.getMembersAmount() %} +{% set pages = sticker.getMembersPages() %} +{% set currentPage = 1 %} + +
      +
      +
      +

      + {% if editMode %} + + + {% endif %} +  Members of this group ({{ members }}) 

      +
      +
      +
      +
      + +
      + {% include "homes/widget/habblet/membersearchpaging.tpl" %} +
      +
      +
      +
      +
      diff --git a/tools/www-tpl/default/homes/widget/note.tpl b/tools/www-tpl/default/homes/widget/note.tpl new file mode 100644 index 0000000..1153a7e --- /dev/null +++ b/tools/www-tpl/default/homes/widget/note.tpl @@ -0,0 +1,24 @@ + + +
      +
      +
      +

      + {% if editMode %} + + +{% endif %} +

      +
      +
      +
      +
      +
      {{ sticker.getFormattedText() }}
      + +
      +
      +
      +
      diff --git a/tools/www-tpl/default/homes/widget/profile_widget.tpl b/tools/www-tpl/default/homes/widget/profile_widget.tpl new file mode 100644 index 0000000..2aeef4e --- /dev/null +++ b/tools/www-tpl/default/homes/widget/profile_widget.tpl @@ -0,0 +1,109 @@ +{% autoescape 'html' %} + +
      +
      +
      +

      +{% if editMode %} + + +{% endif %} +  MY PROFILE 

      +
      +
      +
      +
      +
      + {% autoescape 'html' %} +
      + {{ user.getName() }} + +
      + +
      + + {% if user.isOnline() and user.isProfileVisible() %} + online + {% else %} + online + {% endif %} +
      + Created on: +
      +
      + {{ user.getCreatedAt() }}
      + +
      + {% if hasFavouriteGroup %} + + {% endif %} + + {% if hasBadge %} + + {% endif %} +
      + {% endautoescape %} +
      +
      + {{ user.getName() }} +
      + {% autoescape 'html' %} +
      + {{ user.motto }} +
      +
      + {% endautoescape %} + {% if canAddFriend %} + + {% endif %} +
      +
      +{% include "homes/widget/habblet/taglist.tpl" %} + +
      +
      +
      +
      +
      + The limit is 8 tags! + Invalid tag. +
      +
      +
      +
      +
      +
      +
      {% if editMode == false %}{% if session.loggedIn and user.id == playerDetails.id %}
      +
      + Add tag +
      {% endif %}{% endif %} +
      + {% if session.loggedIn %} + + {% endif %} +
      +
      +
      +
      +
      +{% endautoescape %} \ No newline at end of file diff --git a/tools/www-tpl/default/homes/widget/rating_widget.tpl b/tools/www-tpl/default/homes/widget/rating_widget.tpl new file mode 100644 index 0000000..6cbe22f --- /dev/null +++ b/tools/www-tpl/default/homes/widget/rating_widget.tpl @@ -0,0 +1,58 @@ +
      +
      +
      +

      +{% if editMode %} + + + +{% endif %} +  My Rating 

      +
      +
      +
      +
      +
      + +{% set average = sticker.getAverageRating() %} +{% set px = sticker.getRatingPixels() %} +{% set canRate = ((session.loggedIn == true) and (editMode == false) and (user.getId() != playerDetails.getId()) and (sticker.hasRated(playerDetails.getId()) == false)) %} + +
      + Average rating: {{ average }}
      +
      +
        +
      • + {% if canRate %} +
      • 1
      • +
      • 2
      • +
      • 3
      • +
      • 4
      • +
      • 5
      • + {% endif %} +
      +
      + {{ sticker.getVoteCount() }} votes total +
      + ({{ sticker.getHighVoteCount() }} users voted 4 or better) +
      +
      +
      +
      +
      +
      +
      diff --git a/tools/www-tpl/default/homes/widget/rooms_widget.tpl b/tools/www-tpl/default/homes/widget/rooms_widget.tpl new file mode 100644 index 0000000..d8049a4 --- /dev/null +++ b/tools/www-tpl/default/homes/widget/rooms_widget.tpl @@ -0,0 +1,65 @@ +{% set rooms = sticker.getOwnerRooms() %} +{% autoescape 'html' %} + +
      +
      +
      +

      +{% if editMode %} + + +{% endif %} +  MY ROOMS 

      +
      +
      +
      +
      + {% if rooms|length == 0 %} + You do not have any rooms yet + {% else %} +
      + + +{% for room in rooms %} + {% set openState = "room_icon_open" %} + + {% if room.getData().getAccessTypeId() == 1 %} + {% set openState = "room_icon_locked" %} + {% endif %} + + {% if room.getData().getAccessTypeId() == 2 %} + {% set openState = "room_icon_password" %} + {% endif %} + + + + + +{% endfor %} +
      +
      + +
      +
      +
      +
      + {% autoescape 'html' %}{{ room.getData().getName() }}{% endautoescape %}
      +
      +
      {% autoescape 'html' %}{{ room.getData().getDescription() }}{% endautoescape %}
      + enter room
      +
      + +
      +
      +{% endif %} +
      +
      +
      +
      +
      +{% endautoescape %} \ No newline at end of file diff --git a/tools/www-tpl/default/homes/widget/sticker.tpl b/tools/www-tpl/default/homes/widget/sticker.tpl new file mode 100644 index 0000000..274a1e5 --- /dev/null +++ b/tools/www-tpl/default/homes/widget/sticker.tpl @@ -0,0 +1,8 @@ +
      +{% if editMode %} + + +{% endif %} +
      \ No newline at end of file diff --git a/tools/www-tpl/default/homes/widget/trax_player_widget.tpl b/tools/www-tpl/default/homes/widget/trax_player_widget.tpl new file mode 100644 index 0000000..2761eef --- /dev/null +++ b/tools/www-tpl/default/homes/widget/trax_player_widget.tpl @@ -0,0 +1,38 @@ +
      +
      +
      +

      + +{% if editMode %} + + +{% endif %} + +  TRAXPLAYER 

      +
      +
      +
      +
      + {% if (sticker.hasSong() == false) or (editMode == true) %} +
      + {% else %} +
      + {% include "homes/widget/habblet/trax_song.tpl" %} + {% endif %} +{% if editMode %} + +{% endif %} +
      +
      +
      +
      +
      diff --git a/tools/www-tpl/default/housekeeping/articles.tpl b/tools/www-tpl/default/housekeeping/articles.tpl new file mode 100644 index 0000000..95d6066 --- /dev/null +++ b/tools/www-tpl/default/housekeeping/articles.tpl @@ -0,0 +1,49 @@ +{% include "housekeeping/base/header.tpl" %} + + {% set articlesActive = " active " %} + {% include "housekeeping/base/navigation.tpl" %} +

      Posted Articles

      + {% include "housekeeping/base/alert.tpl" %} +

      This includes the most recent articles posted on the site, you may edit or delete them if you wish.

      +

      New News Article

      +
      + + + + + + + + + + + + + {% for article in articles %} + + + + + + + + + {% endfor %} + +
      NameAuthorShort StoryDateViews
      {{ article.title }}{{ article.author }}{{ article.shortstory }}{{ article.getDate() }}{{ article.views }} + Edit + Delete +
      +
      +
      +
      + + + + + \ No newline at end of file diff --git a/tools/www-tpl/default/housekeeping/articles_create.tpl b/tools/www-tpl/default/housekeeping/articles_create.tpl new file mode 100644 index 0000000..6b639af --- /dev/null +++ b/tools/www-tpl/default/housekeeping/articles_create.tpl @@ -0,0 +1,137 @@ +{% include "housekeeping/base/header.tpl" %} + + {% set createArticlesActive = " active " %} + {% include "housekeeping/base/navigation.tpl" %} + +
      +
      +

      Create Article

      + {% include "housekeeping/base/alert.tpl" %} +

      Create a news article, once posted, it will be immediately live on the site.

      +
      +
      + + +
      +
      +
      + +
      +
      + + +
      +
      + +

      + +

      +
      +
      + +

      + +

      +
      +
      + + +
      +
      + +
      +
      + +
      + + +
      +
      + + +
      +
      + +

      (Leave alone for current article publish time)

      + +
      +
      + +
      +
      + + +
      +
      + +
      +
      +
      +
      +

      Create Article

      +

      Preview news here...

      +
      +
      + + + + + + +{% include "housekeeping/base/footer.tpl" %} \ No newline at end of file diff --git a/tools/www-tpl/default/housekeeping/articles_edit.tpl b/tools/www-tpl/default/housekeeping/articles_edit.tpl new file mode 100644 index 0000000..7e08999 --- /dev/null +++ b/tools/www-tpl/default/housekeeping/articles_edit.tpl @@ -0,0 +1,135 @@ +{% include "housekeeping/base/header.tpl" %} + + {% autoescape 'html' %} + {% include "housekeeping/base/navigation.tpl" %} + +
      +
      +

      Edit Article

      + {% include "housekeeping/base/alert.tpl" %} +

      Edit an existing news article that has already been posted on the website.

      +
      +
      + + +
      +
      +
      + +
      +
      + + +
      +
      + +

      + +

      +
      +
      + +

      + +

      +
      +
      + + +
      +
      + +
      +
      +
      + + +
      +
      + + +
      +
      + +

      (Leave alone for current article publish time)

      + +
      +
      + +
      +
      + + +
      +
      + +
      +
      +
      + {% endautoescape %} +
      +

      Edit Article

      +

      {{ article.getEscapedStory() }}

      +
      +
      + + + + + \ No newline at end of file diff --git a/tools/www-tpl/default/housekeeping/base/alert.tpl b/tools/www-tpl/default/housekeeping/base/alert.tpl new file mode 100644 index 0000000..61c0483 --- /dev/null +++ b/tools/www-tpl/default/housekeeping/base/alert.tpl @@ -0,0 +1,8 @@ +{% if alert.hasAlert %} + +
      + {{ alert.message }} +
      + + +{% endif %} \ No newline at end of file diff --git a/tools/www-tpl/default/housekeeping/base/footer.tpl b/tools/www-tpl/default/housekeeping/base/footer.tpl new file mode 100644 index 0000000..e69de29 diff --git a/tools/www-tpl/default/housekeeping/base/header.tpl b/tools/www-tpl/default/housekeeping/base/header.tpl new file mode 100644 index 0000000..34ac923 --- /dev/null +++ b/tools/www-tpl/default/housekeeping/base/header.tpl @@ -0,0 +1,14 @@ + + + + + + + + {{ site.siteName }}: {{ pageName }} + + + + + + \ No newline at end of file diff --git a/tools/www-tpl/default/housekeeping/base/navigation.tpl b/tools/www-tpl/default/housekeeping/base/navigation.tpl new file mode 100644 index 0000000..f7d9e8a --- /dev/null +++ b/tools/www-tpl/default/housekeeping/base/navigation.tpl @@ -0,0 +1,83 @@ +
      + +
      + + + +
      diff --git a/tools/www-tpl/default/housekeeping/catalogue_frontpage.tpl b/tools/www-tpl/default/housekeeping/catalogue_frontpage.tpl new file mode 100644 index 0000000..0b1754f --- /dev/null +++ b/tools/www-tpl/default/housekeeping/catalogue_frontpage.tpl @@ -0,0 +1,55 @@ +{% include "housekeeping/base/header.tpl" %} + + {% set editCatalogueFrontPage = " active " %} + {% include "housekeeping/base/navigation.tpl" %} + +

      Edit Catalogue Page

      + {% include "housekeeping/base/alert.tpl" %} +

      Edit the catalogue front page data.

      +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + +

      + +

      +
      +
      + +
      +
      + +
      + +
      +
      +
      + + + + + + +{% include "housekeeping/base/footer.tpl" %} \ No newline at end of file diff --git a/tools/www-tpl/default/housekeeping/configurations.tpl b/tools/www-tpl/default/housekeeping/configurations.tpl new file mode 100644 index 0000000..65dc9a2 --- /dev/null +++ b/tools/www-tpl/default/housekeeping/configurations.tpl @@ -0,0 +1,45 @@ +{% include "housekeeping/base/header.tpl" %} + + {% set configurationsActive = " active" %} + {% include "housekeeping/base/navigation.tpl" %} +

      Edit Configurations

      + {% include "housekeeping/base/alert.tpl" %} +

      Edit all the configuration that is on the hotel.

      +
      + + + + + + + + + + + {% for config in configs %} + + + + + {% endfor %} + +
      NameValue
      {{ config.getKey() }} + +
      +
      + +
      + +
      +
      +
      + + + + + \ No newline at end of file diff --git a/tools/www-tpl/default/housekeeping/dashboard.tpl b/tools/www-tpl/default/housekeeping/dashboard.tpl new file mode 100644 index 0000000..79296a9 --- /dev/null +++ b/tools/www-tpl/default/housekeeping/dashboard.tpl @@ -0,0 +1,117 @@ +{% include "housekeeping/base/header.tpl" %} + + {% set dashboardActive = " active " %} + {% include "housekeeping/base/navigation.tpl" %} +

      Hotel Statistics

      +

      Welcome to the housekeeping for {{ site.siteName }} Hotel, here you can manage a lot of things at once, such as users, news, site content and view the statistics of the hotel.

      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Havana Web Version1.0
      Users{{ stats.userCount }}
      Room Items{{ stats.roomItemCount }}
      Inventory Items{{ stats.inventoryItemsCount }}
      Groups{{ stats.groupCount }}
      Pets{{ stats.petCount }}
      Photos{{ stats.photoCount }}
      +
      +

      Newest Players

      +

      The recently joined player list is seen below

      +
      + {% set zeroCoinsValue = '' %} + {% if zeroCoinsFlag %} + {% set zeroCoinsValue = '&zerocoins' %} + {% endif %} + + {% if nextPlayers|length > 0 %} + {% set ourNextPage = page + 1 %} + + {% endif %} + {% if previousPlayers|length > 0 %} + {% set ourNextPage = page - 1 %} + + {% endif %} + + {% if zeroCoinsFlag %} + + {% else %} + + {% endif %} +
      +
      + + + + + + + + + + + + + + + + + {% set num = 1 %} + {% for player in players %} + + + + + + + + + + + + + {% set num = num + 1 %} + {% endfor %} + +
      IDNameEmailLookMottoCreditsPixelsLast onlineDate joined
      {{ player.id }}{{ player.name }} - Transactons{{ player.email }}{{ player.motto }}{{ player.credits }}{{ player.pixels }}{{ player.formatLastOnline("dd-MM-yyyy HH:mm:ss") }}{{ player.formatJoinDate("dd-MM-yyyy HH:mm:ss") }}
      +
      +
      +
      + + + + + \ No newline at end of file diff --git a/tools/www-tpl/default/housekeeping/infobus_polls.tpl b/tools/www-tpl/default/housekeeping/infobus_polls.tpl new file mode 100644 index 0000000..17d2857 --- /dev/null +++ b/tools/www-tpl/default/housekeeping/infobus_polls.tpl @@ -0,0 +1,61 @@ +{% include "housekeeping/base/header.tpl" %} + + {% set infobusPollsActive = " active " %} + {% include "housekeeping/base/navigation.tpl" %} +

      Infobus Polls

      + {% include "housekeeping/base/alert.tpl" %} +

      This lists all infobus polls that have been created and used.

      +

      New Poll

      +

      + Open Infobus Doors +

      +

      + Close Infobus Doors +

      +

      + End Event +

      +
      + + + + + + + + + + + + + {% for infobusPoll in infobusPolls %} + + + + + + + + + {% endfor %} + +
      QuestionCreated ByCreated At
      View Results{{ infobusPoll.getPollData().getQuestion() }}{{ infobusPoll.getCreator() }}{{ infobusPoll.getCreatedAtFormatted() }} + Edit + Delete + Clear Results + + Send Poll +
      +
      +
      +
      + + + + + \ No newline at end of file diff --git a/tools/www-tpl/default/housekeeping/infobus_polls_create.tpl b/tools/www-tpl/default/housekeeping/infobus_polls_create.tpl new file mode 100644 index 0000000..045c12f --- /dev/null +++ b/tools/www-tpl/default/housekeeping/infobus_polls_create.tpl @@ -0,0 +1,65 @@ +{% include "housekeeping/base/header.tpl" %} + + {% set infobusPollsCreateActive = " active " %} + {% include "housekeeping/base/navigation.tpl" %} + + +

      Create Infobus Poll

      + {% include "housekeeping/base/alert.tpl" %} +

      Create an infobus poll for people to answer.

      +
      +
      + + +
      + +
      + + +
      + +

      +

      + +
      + + +
      +
      +
      +
      +
      + + + + + \ No newline at end of file diff --git a/tools/www-tpl/default/housekeeping/infobus_polls_edit.tpl b/tools/www-tpl/default/housekeeping/infobus_polls_edit.tpl new file mode 100644 index 0000000..e86a089 --- /dev/null +++ b/tools/www-tpl/default/housekeeping/infobus_polls_edit.tpl @@ -0,0 +1,68 @@ +{% include "housekeeping/base/header.tpl" %} + + {% set infobusPollsCreateActive = " active " %} + {% include "housekeeping/base/navigation.tpl" %} + + +

      Edit Infobus Poll

      + {% include "housekeeping/base/alert.tpl" %} +

      Edit an infobus poll

      +
      +
      + + +
      + {% set answerCount = 1 %} + {% for answer in poll.getPollData().getAnswers() %} +
      + + +
      + {% set answerCount = answerCount + 1 %} + {% endfor %} + +

      +

      + +
      + + +
      +
      +
      +
      +
      + + + + + \ No newline at end of file diff --git a/tools/www-tpl/default/housekeeping/infobus_polls_view.tpl b/tools/www-tpl/default/housekeeping/infobus_polls_view.tpl new file mode 100644 index 0000000..40f9503 --- /dev/null +++ b/tools/www-tpl/default/housekeeping/infobus_polls_view.tpl @@ -0,0 +1,25 @@ +{% include "housekeeping/base/header.tpl" %} + + {% include "housekeeping/base/navigation.tpl" %} +

      Edit Infobus Poll

      + {% include "housekeeping/base/alert.tpl" %} +

      View Infobus Poll Results

      + + {% if noAnswers %} +

      There are no answers to this poll yet

      + {% else %} +

      + {% endif %} +
      +
      +
      + + + + + \ No newline at end of file diff --git a/tools/www-tpl/default/housekeeping/login.tpl b/tools/www-tpl/default/housekeeping/login.tpl new file mode 100644 index 0000000..2cec47b --- /dev/null +++ b/tools/www-tpl/default/housekeeping/login.tpl @@ -0,0 +1,45 @@ + + + + + + + + + {{ site.siteName }}: Housekeeping + + + + + + +
      +
      +

      Housekeeping

      +
      + {% include "housekeeping/base/alert.tpl" %} + +
      +
      +
      + © Copyright 2018 - Alex Miller +
      +
      + + + diff --git a/tools/www-tpl/default/housekeeping/room_ads.tpl b/tools/www-tpl/default/housekeeping/room_ads.tpl new file mode 100644 index 0000000..8460715 --- /dev/null +++ b/tools/www-tpl/default/housekeeping/room_ads.tpl @@ -0,0 +1,66 @@ +{% include "housekeeping/base/header.tpl" %} + + {% set roomAdsActive = " active" %} + {% include "housekeeping/base/navigation.tpl" %} +

      Edit Room Ads

      + {% include "housekeeping/base/alert.tpl" %} +

      Edit all the room ads that display as billboards from within the hotel.

      +

      New Ad

      +
      +
      + + + + + + + + + + + + + {% for advertisement in roomAds %} + + + + + + + + + + {% endfor %} + +
      Is Loading AdRoom IDURLImageEnabled
      + + + + + + + + + + + Delete +
      +
      + +
      +
      +
      +
      +
      + + + + + + +{% include "housekeeping/base/footer.tpl" %} \ No newline at end of file diff --git a/tools/www-tpl/default/housekeeping/room_ads_create.tpl b/tools/www-tpl/default/housekeeping/room_ads_create.tpl new file mode 100644 index 0000000..37b5a48 --- /dev/null +++ b/tools/www-tpl/default/housekeeping/room_ads_create.tpl @@ -0,0 +1,47 @@ +{% include "housekeeping/base/header.tpl" %} + + {% set roomCreateAdsActive = " active" %} + {% include "housekeeping/base/navigation.tpl" %} +

      Create Ad

      + {% include "housekeeping/base/alert.tpl" %} +

      Create a room ad that will display as a billboards from within the hotel.

      +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + +
      +
      +
      +
      +
      + + + + + + +{% include "housekeeping/base/footer.tpl" %} \ No newline at end of file diff --git a/tools/www-tpl/default/housekeeping/room_badges.tpl b/tools/www-tpl/default/housekeeping/room_badges.tpl new file mode 100644 index 0000000..a0e74b6 --- /dev/null +++ b/tools/www-tpl/default/housekeeping/room_badges.tpl @@ -0,0 +1,66 @@ +{% include "housekeeping/base/header.tpl" %} + + {% set roomBadgesActive = " active" %} + {% include "housekeeping/base/navigation.tpl" %} +

      Edit Room Badges

      + {% include "housekeeping/base/alert.tpl" %} +

      Edit all the room badges that are given when entering the room.

      +

      New Badge

      +
      +
      + + + + + + + + + + + + {% for badgeData in roomBadges.entrySet() %} + {% for badge in badgeData.getValue() %} + {% set id = (badgeData.getKey()) + ('_') + (badge) %} + + + + + + + + + + {% endfor %} + {% endfor %} + +
      Room IDBadge CodePreviewRoom Name
      + + + + + + +

      {{ util.getRoomName(badgeData.getKey()) }}

      +
      + Delete +
      +
      + +
      +
      +
      +
      +
      + + + + + + +{% include "housekeeping/base/footer.tpl" %} \ No newline at end of file diff --git a/tools/www-tpl/default/housekeeping/room_badges_create.tpl b/tools/www-tpl/default/housekeeping/room_badges_create.tpl new file mode 100644 index 0000000..760c869 --- /dev/null +++ b/tools/www-tpl/default/housekeeping/room_badges_create.tpl @@ -0,0 +1,35 @@ +{% include "housekeeping/base/header.tpl" %} + + {% set roomCreateBadgesActive = " active" %} + {% include "housekeeping/base/navigation.tpl" %} +

      Create Room Badge

      + {% include "housekeeping/base/alert.tpl" %} +

      Create a room entry badge that will be given to the user as soon as they enter the room.

      +
      +
      + + +
      +
      + + +
      +
      + +
      +
      +
      +
      +
      + + + + + + +{% include "housekeeping/base/footer.tpl" %} \ No newline at end of file diff --git a/tools/www-tpl/default/housekeeping/transaction/search_results.tpl b/tools/www-tpl/default/housekeeping/transaction/search_results.tpl new file mode 100644 index 0000000..5dd0214 --- /dev/null +++ b/tools/www-tpl/default/housekeeping/transaction/search_results.tpl @@ -0,0 +1,33 @@ +{% if transactions|length > 0 %} +

      Search Results

      +
      + + + + + + + + + + + + + + {% set num = 1 %} + {% for transaction in transactions %} + + + + + + + + + + {% set num = num + 1 %} + {% endfor %} + +
      Item IDDescriptionCoinsPixelsAmountCreated At
      Track this item{{ transaction.getItemId() }}{{ transaction.description }}{{ transaction.costCoins }}{{ transaction.costPixels }}{{ transaction.amount }}{{ transaction.getFormattedDate() }}
      +
      + {% endif %} \ No newline at end of file diff --git a/tools/www-tpl/default/housekeeping/transaction_item_lookup.tpl b/tools/www-tpl/default/housekeeping/transaction_item_lookup.tpl new file mode 100644 index 0000000..b6c8e03 --- /dev/null +++ b/tools/www-tpl/default/housekeeping/transaction_item_lookup.tpl @@ -0,0 +1,23 @@ +{% include "housekeeping/base/header.tpl" %} + + {% set searchUsersActive = " active " %} + {% include "housekeeping/base/navigation.tpl" %} +

      Transaction Item Lookup

      + {% include "housekeeping/base/alert.tpl" %} +
      + {% include "housekeeping/transaction/search_results.tpl" %} +
      + + + + + + + + +{% include "housekeeping/base/footer.tpl" %} \ No newline at end of file diff --git a/tools/www-tpl/default/housekeeping/transaction_lookup.tpl b/tools/www-tpl/default/housekeeping/transaction_lookup.tpl new file mode 100644 index 0000000..3e75126 --- /dev/null +++ b/tools/www-tpl/default/housekeeping/transaction_lookup.tpl @@ -0,0 +1,31 @@ +{% include "housekeeping/base/header.tpl" %} + + {% set searchTransactionsActive = " active " %} + {% include "housekeeping/base/navigation.tpl" %} +

      Transaction Lookup

      + {% include "housekeeping/base/alert.tpl" %} +

      Lookup transaction by a specific user, either enter their user ID or username. Will display all transaction in the past month.

      +
      +
      + + +
      + +
      +
      + {% include "housekeeping/transaction/search_results.tpl" %} + + + + + + + + + +{% include "housekeeping/base/footer.tpl" %} \ No newline at end of file diff --git a/tools/www-tpl/default/housekeeping/users_bans.tpl b/tools/www-tpl/default/housekeeping/users_bans.tpl new file mode 100644 index 0000000..9e00c89 --- /dev/null +++ b/tools/www-tpl/default/housekeeping/users_bans.tpl @@ -0,0 +1,78 @@ +{% include "housekeeping/base/header.tpl" %} + + {% set bansActive = " active" %} + {% include "housekeeping/base/navigation.tpl" %} +

      View and manage bans

      + {% include "housekeeping/base/alert.tpl" %} +

      Manage all currently active bans on the hotel

      +
      +
      + + + + + + + + + + + + + {% for ban in bans %} + + + + + + + + + {% endfor %} + +
      TypeValueMessageBanned UtilBanned AtBanned By
      + {% if (ban.getBanType().name() == 'MACHINE_ID') %} + Machine + {% endif %} + {% if (ban.getBanType().name() == 'USER_ID') %} + User + {% endif %} + + {% if (ban.getBanType().name() == 'MACHINE_ID') %} + {% set bannedName = ban.getName() %} + {{ ban.getValue() }} + {% if bannedName != "" %} +  - {{ bannedName }} + {% endif %} + {% endif %} + {% if (ban.getBanType().name() == 'USER_ID') %} + {% set bannedName = ban.getName() %} + {% if bannedName != "" %} + {{ bannedName }} + {% endif %} + {% endif %} + + {{ ban.getMessage() }} + + {{ ban.getBannedUtil() }} + + {{ ban.getBannedAt() }} + + {{ ban.getBannedBy() }} +
      +
      +
      + + + + + + + + +{% include "housekeeping/base/footer.tpl" %} \ No newline at end of file diff --git a/tools/www-tpl/default/housekeeping/users_create.tpl b/tools/www-tpl/default/housekeeping/users_create.tpl new file mode 100644 index 0000000..4e29abc --- /dev/null +++ b/tools/www-tpl/default/housekeeping/users_create.tpl @@ -0,0 +1,51 @@ +{% include "housekeeping/base/header.tpl" %} + + {% set createUserActive = " active " %} + {% include "housekeeping/base/navigation.tpl" %} +

      Create User

      + {% include "housekeeping/base/alert.tpl" %} +

      Enter the details to create a new user.

      +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + +
      +
      + + + + + + + + + +{% include "housekeeping/base/footer.tpl" %} \ No newline at end of file diff --git a/tools/www-tpl/default/housekeeping/users_edit.tpl b/tools/www-tpl/default/housekeeping/users_edit.tpl new file mode 100644 index 0000000..d24df50 --- /dev/null +++ b/tools/www-tpl/default/housekeeping/users_edit.tpl @@ -0,0 +1,51 @@ +{% include "housekeeping/base/header.tpl" %} + + {% include "housekeeping/base/navigation.tpl" %} +

      Edit User

      + {% include "housekeeping/base/alert.tpl" %} +

      Here you can edit user details.

      +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + + + + + + + + +{% include "housekeeping/base/footer.tpl" %} \ No newline at end of file diff --git a/tools/www-tpl/default/housekeeping/users_search.tpl b/tools/www-tpl/default/housekeeping/users_search.tpl new file mode 100644 index 0000000..67412cb --- /dev/null +++ b/tools/www-tpl/default/housekeeping/users_search.tpl @@ -0,0 +1,86 @@ +{% include "housekeeping/base/header.tpl" %} + + {% set searchUsersActive = " active " %} + {% include "housekeeping/base/navigation.tpl" %} +

      Search Users

      + {% include "housekeeping/base/alert.tpl" %} +

      Here you can search users by the field of your choice, and the requested input by you

      +
      +
      + + +
      +
      + + +
      +
      + + +
      + +
      +
      + {% if players|length > 0 %} +

      Search Results

      +
      + + + + + + + + + + + + + + + + {% set num = 1 %} + {% for player in players %} + + + + + + + + + + + + {% set num = num + 1 %} + {% endfor %} + +
      IDNameEmailLookMissionCreditsDucketsLast onlineDate joined
      {{ player.id }}{{ player.name }}{{ player.email }}{{ player.mission }}{{ player.credits }}{{ player.pixels }}{{ player.getReadableLastOnline() }}{{ player.getReadableJoinDate() }}
      +
      + {% endif %} + + + + + + + + + +{% include "housekeeping/base/footer.tpl" %} \ No newline at end of file diff --git a/tools/www-tpl/default/index.tpl b/tools/www-tpl/default/index.tpl new file mode 100644 index 0000000..c0470bb --- /dev/null +++ b/tools/www-tpl/default/index.tpl @@ -0,0 +1,222 @@ + + + + + + {{ site.siteName }} ~ Home + + + + + + + + + + + + + + + + +
      + +
      +
      +
      +
      + {% if alert.hasAlert %} +
      +
      +
        +
      • {{ alert.message }}
      • +
      +
      +
      + {% endif %} +
      +

      Sign in

      +
      + +
      +
      +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + + + + {% set indexClass = " class=\"copyright\"" %} + {% include "base/footer.tpl" %} + + + + + + + + + + + \ No newline at end of file diff --git a/tools/www-tpl/default/index_chromide.tpl b/tools/www-tpl/default/index_chromide.tpl new file mode 100644 index 0000000..c0470bb --- /dev/null +++ b/tools/www-tpl/default/index_chromide.tpl @@ -0,0 +1,222 @@ + + + + + + {{ site.siteName }} ~ Home + + + + + + + + + + + + + + + + +
      + +
      +
      +
      +
      + {% if alert.hasAlert %} +
      +
      +
        +
      • {{ alert.message }}
      • +
      +
      +
      + {% endif %} +
      +

      Sign in

      +
      + +
      +
      +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + + + + {% set indexClass = " class=\"copyright\"" %} + {% include "base/footer.tpl" %} + + + + + + + + + + + \ No newline at end of file diff --git a/tools/www-tpl/default/index_old.tpl b/tools/www-tpl/default/index_old.tpl new file mode 100644 index 0000000..ac95835 --- /dev/null +++ b/tools/www-tpl/default/index_old.tpl @@ -0,0 +1,257 @@ + + + + + + {{ site.siteName }}: Home + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +
      +
      +
      + {% include "base/frontpage_header.tpl" %} +
      +
      + +
      + + {% if isValentinesMonth %} +
      +
      +
      Valentine's Day
      + {% if randomValentinesImage == "valentines_2_ultra.png" %} +
      Find your partner...
      +
      ...and make new friends :)
      + {% else %} +
      Find your partner...
      +
      ...and make new friends :)
      + {% endif %} + +
      Habbo is a virtual world where you can meet and find your true love.
      +
      +
      + {% else %} +
      +
      +
      Virtual world, real fun
      +
      Create your Habbo...
      +
      ...and make new friends :)
      + +
      Habbo is a virtual world where you can meet and make friends.
      +
      +
      + {% endif %} +
      + + + +
      + + + +
      +
      +
      + {% if alert.hasAlert %} +
      +
      +
        +
      • {{ alert.message }}
      • +
      +
      +
      + {% endif %} +
      +

      Sign in

      + +
      + + +
      +
      + + + + + +
      + + +
      + +
      + +
      + + + +
      + + +
      + + + + + +
      + + +
      + +
      + + + +
      + + + +
      + + + +
      +
      +
      +